diff --git a/googleapis/ads/googleads/v3/common/ad_asset.pb.go b/googleapis/ads/googleads/v3/common/ad_asset.pb.go
new file mode 100644
index 0000000..f880759
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/ad_asset.pb.go
@@ -0,0 +1,241 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/ad_asset.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A text asset used inside an ad.
+type AdTextAsset struct {
+	// Asset text.
+	Text *wrappers.StringValue `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	// The pinned field of the asset. This restricts the asset to only serve
+	// within this field. Multiple assets can be pinned to the same field. An
+	// asset that is unpinned or pinned to a different field will not serve in a
+	// field where some other asset has been pinned.
+	PinnedField          enums.ServedAssetFieldTypeEnum_ServedAssetFieldType `protobuf:"varint,2,opt,name=pinned_field,json=pinnedField,proto3,enum=google.ads.googleads.v3.enums.ServedAssetFieldTypeEnum_ServedAssetFieldType" json:"pinned_field,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
+	XXX_unrecognized     []byte                                              `json:"-"`
+	XXX_sizecache        int32                                               `json:"-"`
+}
+
+func (m *AdTextAsset) Reset()         { *m = AdTextAsset{} }
+func (m *AdTextAsset) String() string { return proto.CompactTextString(m) }
+func (*AdTextAsset) ProtoMessage()    {}
+func (*AdTextAsset) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0fa6efb5f889d94f, []int{0}
+}
+
+func (m *AdTextAsset) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdTextAsset.Unmarshal(m, b)
+}
+func (m *AdTextAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdTextAsset.Marshal(b, m, deterministic)
+}
+func (m *AdTextAsset) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdTextAsset.Merge(m, src)
+}
+func (m *AdTextAsset) XXX_Size() int {
+	return xxx_messageInfo_AdTextAsset.Size(m)
+}
+func (m *AdTextAsset) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdTextAsset.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdTextAsset proto.InternalMessageInfo
+
+func (m *AdTextAsset) GetText() *wrappers.StringValue {
+	if m != nil {
+		return m.Text
+	}
+	return nil
+}
+
+func (m *AdTextAsset) GetPinnedField() enums.ServedAssetFieldTypeEnum_ServedAssetFieldType {
+	if m != nil {
+		return m.PinnedField
+	}
+	return enums.ServedAssetFieldTypeEnum_UNSPECIFIED
+}
+
+// An image asset used inside an ad.
+type AdImageAsset struct {
+	// The Asset resource name of this image.
+	Asset                *wrappers.StringValue `protobuf:"bytes,1,opt,name=asset,proto3" json:"asset,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AdImageAsset) Reset()         { *m = AdImageAsset{} }
+func (m *AdImageAsset) String() string { return proto.CompactTextString(m) }
+func (*AdImageAsset) ProtoMessage()    {}
+func (*AdImageAsset) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0fa6efb5f889d94f, []int{1}
+}
+
+func (m *AdImageAsset) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdImageAsset.Unmarshal(m, b)
+}
+func (m *AdImageAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdImageAsset.Marshal(b, m, deterministic)
+}
+func (m *AdImageAsset) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdImageAsset.Merge(m, src)
+}
+func (m *AdImageAsset) XXX_Size() int {
+	return xxx_messageInfo_AdImageAsset.Size(m)
+}
+func (m *AdImageAsset) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdImageAsset.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdImageAsset proto.InternalMessageInfo
+
+func (m *AdImageAsset) GetAsset() *wrappers.StringValue {
+	if m != nil {
+		return m.Asset
+	}
+	return nil
+}
+
+// A video asset used inside an ad.
+type AdVideoAsset struct {
+	// The Asset resource name of this video.
+	Asset                *wrappers.StringValue `protobuf:"bytes,1,opt,name=asset,proto3" json:"asset,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AdVideoAsset) Reset()         { *m = AdVideoAsset{} }
+func (m *AdVideoAsset) String() string { return proto.CompactTextString(m) }
+func (*AdVideoAsset) ProtoMessage()    {}
+func (*AdVideoAsset) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0fa6efb5f889d94f, []int{2}
+}
+
+func (m *AdVideoAsset) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdVideoAsset.Unmarshal(m, b)
+}
+func (m *AdVideoAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdVideoAsset.Marshal(b, m, deterministic)
+}
+func (m *AdVideoAsset) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdVideoAsset.Merge(m, src)
+}
+func (m *AdVideoAsset) XXX_Size() int {
+	return xxx_messageInfo_AdVideoAsset.Size(m)
+}
+func (m *AdVideoAsset) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdVideoAsset.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdVideoAsset proto.InternalMessageInfo
+
+func (m *AdVideoAsset) GetAsset() *wrappers.StringValue {
+	if m != nil {
+		return m.Asset
+	}
+	return nil
+}
+
+// A media bundle asset used inside an ad.
+type AdMediaBundleAsset struct {
+	// The Asset resource name of this media bundle.
+	Asset                *wrappers.StringValue `protobuf:"bytes,1,opt,name=asset,proto3" json:"asset,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AdMediaBundleAsset) Reset()         { *m = AdMediaBundleAsset{} }
+func (m *AdMediaBundleAsset) String() string { return proto.CompactTextString(m) }
+func (*AdMediaBundleAsset) ProtoMessage()    {}
+func (*AdMediaBundleAsset) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0fa6efb5f889d94f, []int{3}
+}
+
+func (m *AdMediaBundleAsset) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdMediaBundleAsset.Unmarshal(m, b)
+}
+func (m *AdMediaBundleAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdMediaBundleAsset.Marshal(b, m, deterministic)
+}
+func (m *AdMediaBundleAsset) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdMediaBundleAsset.Merge(m, src)
+}
+func (m *AdMediaBundleAsset) XXX_Size() int {
+	return xxx_messageInfo_AdMediaBundleAsset.Size(m)
+}
+func (m *AdMediaBundleAsset) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdMediaBundleAsset.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdMediaBundleAsset proto.InternalMessageInfo
+
+func (m *AdMediaBundleAsset) GetAsset() *wrappers.StringValue {
+	if m != nil {
+		return m.Asset
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AdTextAsset)(nil), "google.ads.googleads.v3.common.AdTextAsset")
+	proto.RegisterType((*AdImageAsset)(nil), "google.ads.googleads.v3.common.AdImageAsset")
+	proto.RegisterType((*AdVideoAsset)(nil), "google.ads.googleads.v3.common.AdVideoAsset")
+	proto.RegisterType((*AdMediaBundleAsset)(nil), "google.ads.googleads.v3.common.AdMediaBundleAsset")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/ad_asset.proto", fileDescriptor_0fa6efb5f889d94f)
+}
+
+var fileDescriptor_0fa6efb5f889d94f = []byte{
+	// 400 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xcd, 0x6a, 0xdc, 0x30,
+	0x10, 0xc7, 0xf1, 0xf6, 0xe3, 0xa0, 0x5d, 0x7a, 0xf0, 0x29, 0x84, 0x10, 0x82, 0x4f, 0xb9, 0x54,
+	0x2a, 0xeb, 0x9b, 0x72, 0x92, 0xfb, 0x91, 0x16, 0x5a, 0x08, 0x49, 0xf0, 0xa1, 0x18, 0x16, 0x25,
+	0x9a, 0x08, 0x81, 0x2d, 0x09, 0x4b, 0xde, 0x26, 0xaf, 0xd3, 0x63, 0x4f, 0x7d, 0x8e, 0xbe, 0x48,
+	0xa1, 0x4f, 0x51, 0xac, 0xb1, 0xf7, 0xd4, 0x2d, 0x21, 0xa7, 0x9d, 0x95, 0x7e, 0xfe, 0xcd, 0x7f,
+	0xc4, 0x90, 0xd7, 0xda, 0x39, 0xdd, 0x02, 0x93, 0x2a, 0x30, 0x2c, 0xc7, 0x6a, 0x5b, 0xb2, 0x5b,
+	0xd7, 0x75, 0xce, 0x32, 0xa9, 0x36, 0x32, 0x04, 0x88, 0xd4, 0xf7, 0x2e, 0xba, 0xfc, 0x18, 0x19,
+	0x2a, 0x55, 0xa0, 0x3b, 0x9c, 0x6e, 0x4b, 0x8a, 0xf8, 0xe1, 0xd9, 0x3e, 0x1d, 0xd8, 0xa1, 0x0b,
+	0x2c, 0x40, 0xbf, 0x85, 0xc9, 0xb8, 0xb9, 0x33, 0xd0, 0xaa, 0x4d, 0x7c, 0xf0, 0x80, 0xf2, 0xc3,
+	0x49, 0xce, 0xd2, 0xbf, 0x9b, 0xe1, 0x8e, 0x7d, 0xeb, 0xa5, 0xf7, 0xd0, 0x87, 0xe9, 0xfe, 0x68,
+	0x96, 0x7b, 0xc3, 0xa4, 0xb5, 0x2e, 0xca, 0x68, 0x9c, 0x9d, 0x6e, 0x8b, 0x9f, 0x19, 0x59, 0x0a,
+	0x75, 0x0d, 0xf7, 0x51, 0x8c, 0xfa, 0xfc, 0x0d, 0x79, 0x1e, 0xe1, 0x3e, 0x1e, 0x64, 0x27, 0xd9,
+	0xe9, 0x72, 0x7d, 0x34, 0xc5, 0xa5, 0xb3, 0x9c, 0x5e, 0xc5, 0xde, 0x58, 0x5d, 0xcb, 0x76, 0x80,
+	0xcb, 0x44, 0xe6, 0x8e, 0xac, 0xbc, 0xb1, 0x16, 0x14, 0x46, 0x3b, 0x58, 0x9c, 0x64, 0xa7, 0xaf,
+	0xd6, 0x9f, 0xe9, 0xbe, 0x99, 0xd3, 0x4c, 0xf4, 0x2a, 0xcd, 0x94, 0x7a, 0x7e, 0x18, 0x3f, 0xbb,
+	0x7e, 0xf0, 0xf0, 0xde, 0x0e, 0xdd, 0x3f, 0x2f, 0x2e, 0x97, 0xd8, 0x21, 0x1d, 0x14, 0x15, 0x59,
+	0x09, 0xf5, 0xa9, 0x93, 0x1a, 0x30, 0xf2, 0x9a, 0xbc, 0x48, 0x4f, 0xf3, 0xa8, 0xcc, 0x88, 0xa2,
+	0xa3, 0x36, 0x0a, 0xdc, 0xd3, 0x1d, 0x1f, 0x49, 0x2e, 0xd4, 0x17, 0x50, 0x46, 0x56, 0x83, 0x55,
+	0xed, 0xd3, 0xd3, 0x54, 0xbf, 0x33, 0x52, 0xdc, 0xba, 0x8e, 0xfe, 0x7f, 0x4d, 0xaa, 0x95, 0xc0,
+	0x77, 0xb9, 0x18, 0x55, 0x17, 0xd9, 0xd7, 0x77, 0x13, 0xaf, 0x5d, 0x2b, 0xad, 0xa6, 0xae, 0xd7,
+	0x4c, 0x83, 0x4d, 0x8d, 0xe6, 0x35, 0xf2, 0x26, 0xec, 0x5b, 0xd2, 0x33, 0xfc, 0xf9, 0xbe, 0x78,
+	0x76, 0x2e, 0xc4, 0x8f, 0xc5, 0xf1, 0x39, 0xca, 0x84, 0x0a, 0x14, 0xcb, 0xb1, 0xaa, 0x4b, 0xfa,
+	0x36, 0x61, 0xbf, 0x66, 0xa0, 0x11, 0x2a, 0x34, 0x3b, 0xa0, 0xa9, 0xcb, 0x06, 0x81, 0x3f, 0x8b,
+	0x02, 0x4f, 0x39, 0x17, 0x2a, 0x70, 0xbe, 0x43, 0x38, 0xaf, 0x4b, 0xce, 0x11, 0xba, 0x79, 0x99,
+	0xd2, 0x95, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xd3, 0x61, 0x48, 0xbb, 0x41, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/ad_type_infos.pb.go b/googleapis/ads/googleads/v3/common/ad_type_infos.pb.go
new file mode 100644
index 0000000..55f3be7
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/ad_type_infos.pb.go
@@ -0,0 +1,2393 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/ad_type_infos.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A text ad.
+type TextAdInfo struct {
+	// The headline of the ad.
+	Headline *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline,proto3" json:"headline,omitempty"`
+	// The first line of the ad's description.
+	Description1 *wrappers.StringValue `protobuf:"bytes,2,opt,name=description1,proto3" json:"description1,omitempty"`
+	// The second line of the ad's description.
+	Description2         *wrappers.StringValue `protobuf:"bytes,3,opt,name=description2,proto3" json:"description2,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *TextAdInfo) Reset()         { *m = TextAdInfo{} }
+func (m *TextAdInfo) String() string { return proto.CompactTextString(m) }
+func (*TextAdInfo) ProtoMessage()    {}
+func (*TextAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{0}
+}
+
+func (m *TextAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TextAdInfo.Unmarshal(m, b)
+}
+func (m *TextAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TextAdInfo.Marshal(b, m, deterministic)
+}
+func (m *TextAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TextAdInfo.Merge(m, src)
+}
+func (m *TextAdInfo) XXX_Size() int {
+	return xxx_messageInfo_TextAdInfo.Size(m)
+}
+func (m *TextAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_TextAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TextAdInfo proto.InternalMessageInfo
+
+func (m *TextAdInfo) GetHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.Headline
+	}
+	return nil
+}
+
+func (m *TextAdInfo) GetDescription1() *wrappers.StringValue {
+	if m != nil {
+		return m.Description1
+	}
+	return nil
+}
+
+func (m *TextAdInfo) GetDescription2() *wrappers.StringValue {
+	if m != nil {
+		return m.Description2
+	}
+	return nil
+}
+
+// An expanded text ad.
+type ExpandedTextAdInfo struct {
+	// The first part of the ad's headline.
+	HeadlinePart1 *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline_part1,json=headlinePart1,proto3" json:"headline_part1,omitempty"`
+	// The second part of the ad's headline.
+	HeadlinePart2 *wrappers.StringValue `protobuf:"bytes,2,opt,name=headline_part2,json=headlinePart2,proto3" json:"headline_part2,omitempty"`
+	// The third part of the ad's headline.
+	HeadlinePart3 *wrappers.StringValue `protobuf:"bytes,6,opt,name=headline_part3,json=headlinePart3,proto3" json:"headline_part3,omitempty"`
+	// The description of the ad.
+	Description *wrappers.StringValue `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
+	// The second description of the ad.
+	Description2 *wrappers.StringValue `protobuf:"bytes,7,opt,name=description2,proto3" json:"description2,omitempty"`
+	// The text that can appear alongside the ad's displayed URL.
+	Path1 *wrappers.StringValue `protobuf:"bytes,4,opt,name=path1,proto3" json:"path1,omitempty"`
+	// Additional text that can appear alongside the ad's displayed URL.
+	Path2                *wrappers.StringValue `protobuf:"bytes,5,opt,name=path2,proto3" json:"path2,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ExpandedTextAdInfo) Reset()         { *m = ExpandedTextAdInfo{} }
+func (m *ExpandedTextAdInfo) String() string { return proto.CompactTextString(m) }
+func (*ExpandedTextAdInfo) ProtoMessage()    {}
+func (*ExpandedTextAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{1}
+}
+
+func (m *ExpandedTextAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExpandedTextAdInfo.Unmarshal(m, b)
+}
+func (m *ExpandedTextAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExpandedTextAdInfo.Marshal(b, m, deterministic)
+}
+func (m *ExpandedTextAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExpandedTextAdInfo.Merge(m, src)
+}
+func (m *ExpandedTextAdInfo) XXX_Size() int {
+	return xxx_messageInfo_ExpandedTextAdInfo.Size(m)
+}
+func (m *ExpandedTextAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExpandedTextAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExpandedTextAdInfo proto.InternalMessageInfo
+
+func (m *ExpandedTextAdInfo) GetHeadlinePart1() *wrappers.StringValue {
+	if m != nil {
+		return m.HeadlinePart1
+	}
+	return nil
+}
+
+func (m *ExpandedTextAdInfo) GetHeadlinePart2() *wrappers.StringValue {
+	if m != nil {
+		return m.HeadlinePart2
+	}
+	return nil
+}
+
+func (m *ExpandedTextAdInfo) GetHeadlinePart3() *wrappers.StringValue {
+	if m != nil {
+		return m.HeadlinePart3
+	}
+	return nil
+}
+
+func (m *ExpandedTextAdInfo) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *ExpandedTextAdInfo) GetDescription2() *wrappers.StringValue {
+	if m != nil {
+		return m.Description2
+	}
+	return nil
+}
+
+func (m *ExpandedTextAdInfo) GetPath1() *wrappers.StringValue {
+	if m != nil {
+		return m.Path1
+	}
+	return nil
+}
+
+func (m *ExpandedTextAdInfo) GetPath2() *wrappers.StringValue {
+	if m != nil {
+		return m.Path2
+	}
+	return nil
+}
+
+// A call-only ad.
+type CallOnlyAdInfo struct {
+	// The country code in the ad.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,1,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// The phone number in the ad.
+	PhoneNumber *wrappers.StringValue `protobuf:"bytes,2,opt,name=phone_number,json=phoneNumber,proto3" json:"phone_number,omitempty"`
+	// The business name in the ad.
+	BusinessName *wrappers.StringValue `protobuf:"bytes,3,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
+	// First headline in the ad.
+	Headline1 *wrappers.StringValue `protobuf:"bytes,11,opt,name=headline1,proto3" json:"headline1,omitempty"`
+	// Second headline in the ad.
+	Headline2 *wrappers.StringValue `protobuf:"bytes,12,opt,name=headline2,proto3" json:"headline2,omitempty"`
+	// The first line of the ad's description.
+	Description1 *wrappers.StringValue `protobuf:"bytes,4,opt,name=description1,proto3" json:"description1,omitempty"`
+	// The second line of the ad's description.
+	Description2 *wrappers.StringValue `protobuf:"bytes,5,opt,name=description2,proto3" json:"description2,omitempty"`
+	// Whether to enable call tracking for the creative. Enabling call
+	// tracking also enables call conversions.
+	CallTracked *wrappers.BoolValue `protobuf:"bytes,6,opt,name=call_tracked,json=callTracked,proto3" json:"call_tracked,omitempty"`
+	// Whether to disable call conversion for the creative.
+	// If set to `true`, disables call conversions even when `call_tracked` is
+	// `true`.
+	// If `call_tracked` is `false`, this field is ignored.
+	DisableCallConversion *wrappers.BoolValue `protobuf:"bytes,7,opt,name=disable_call_conversion,json=disableCallConversion,proto3" json:"disable_call_conversion,omitempty"`
+	// The URL to be used for phone number verification.
+	PhoneNumberVerificationUrl *wrappers.StringValue `protobuf:"bytes,8,opt,name=phone_number_verification_url,json=phoneNumberVerificationUrl,proto3" json:"phone_number_verification_url,omitempty"`
+	// The conversion action to attribute a call conversion to. If not set a
+	// default conversion action is used. This field only has effect if
+	// call_tracked is set to true. Otherwise this field is ignored.
+	ConversionAction *wrappers.StringValue `protobuf:"bytes,9,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
+	// The call conversion behavior of this call only ad. It can use its own call
+	// conversion setting, inherit the account level setting, or be disabled.
+	ConversionReportingState enums.CallConversionReportingStateEnum_CallConversionReportingState `protobuf:"varint,10,opt,name=conversion_reporting_state,json=conversionReportingState,proto3,enum=google.ads.googleads.v3.enums.CallConversionReportingStateEnum_CallConversionReportingState" json:"conversion_reporting_state,omitempty"`
+	XXX_NoUnkeyedLiteral     struct{}                                                            `json:"-"`
+	XXX_unrecognized         []byte                                                              `json:"-"`
+	XXX_sizecache            int32                                                               `json:"-"`
+}
+
+func (m *CallOnlyAdInfo) Reset()         { *m = CallOnlyAdInfo{} }
+func (m *CallOnlyAdInfo) String() string { return proto.CompactTextString(m) }
+func (*CallOnlyAdInfo) ProtoMessage()    {}
+func (*CallOnlyAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{2}
+}
+
+func (m *CallOnlyAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CallOnlyAdInfo.Unmarshal(m, b)
+}
+func (m *CallOnlyAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CallOnlyAdInfo.Marshal(b, m, deterministic)
+}
+func (m *CallOnlyAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CallOnlyAdInfo.Merge(m, src)
+}
+func (m *CallOnlyAdInfo) XXX_Size() int {
+	return xxx_messageInfo_CallOnlyAdInfo.Size(m)
+}
+func (m *CallOnlyAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_CallOnlyAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CallOnlyAdInfo proto.InternalMessageInfo
+
+func (m *CallOnlyAdInfo) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetPhoneNumber() *wrappers.StringValue {
+	if m != nil {
+		return m.PhoneNumber
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetBusinessName() *wrappers.StringValue {
+	if m != nil {
+		return m.BusinessName
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetHeadline1() *wrappers.StringValue {
+	if m != nil {
+		return m.Headline1
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetHeadline2() *wrappers.StringValue {
+	if m != nil {
+		return m.Headline2
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetDescription1() *wrappers.StringValue {
+	if m != nil {
+		return m.Description1
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetDescription2() *wrappers.StringValue {
+	if m != nil {
+		return m.Description2
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetCallTracked() *wrappers.BoolValue {
+	if m != nil {
+		return m.CallTracked
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetDisableCallConversion() *wrappers.BoolValue {
+	if m != nil {
+		return m.DisableCallConversion
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetPhoneNumberVerificationUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.PhoneNumberVerificationUrl
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionAction
+	}
+	return nil
+}
+
+func (m *CallOnlyAdInfo) GetConversionReportingState() enums.CallConversionReportingStateEnum_CallConversionReportingState {
+	if m != nil {
+		return m.ConversionReportingState
+	}
+	return enums.CallConversionReportingStateEnum_UNSPECIFIED
+}
+
+// An expanded dynamic search ad.
+type ExpandedDynamicSearchAdInfo struct {
+	// The description of the ad.
+	Description *wrappers.StringValue `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
+	// The second description of the ad.
+	Description2         *wrappers.StringValue `protobuf:"bytes,2,opt,name=description2,proto3" json:"description2,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ExpandedDynamicSearchAdInfo) Reset()         { *m = ExpandedDynamicSearchAdInfo{} }
+func (m *ExpandedDynamicSearchAdInfo) String() string { return proto.CompactTextString(m) }
+func (*ExpandedDynamicSearchAdInfo) ProtoMessage()    {}
+func (*ExpandedDynamicSearchAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{3}
+}
+
+func (m *ExpandedDynamicSearchAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExpandedDynamicSearchAdInfo.Unmarshal(m, b)
+}
+func (m *ExpandedDynamicSearchAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExpandedDynamicSearchAdInfo.Marshal(b, m, deterministic)
+}
+func (m *ExpandedDynamicSearchAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExpandedDynamicSearchAdInfo.Merge(m, src)
+}
+func (m *ExpandedDynamicSearchAdInfo) XXX_Size() int {
+	return xxx_messageInfo_ExpandedDynamicSearchAdInfo.Size(m)
+}
+func (m *ExpandedDynamicSearchAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExpandedDynamicSearchAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExpandedDynamicSearchAdInfo proto.InternalMessageInfo
+
+func (m *ExpandedDynamicSearchAdInfo) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *ExpandedDynamicSearchAdInfo) GetDescription2() *wrappers.StringValue {
+	if m != nil {
+		return m.Description2
+	}
+	return nil
+}
+
+// A hotel ad.
+type HotelAdInfo struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HotelAdInfo) Reset()         { *m = HotelAdInfo{} }
+func (m *HotelAdInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelAdInfo) ProtoMessage()    {}
+func (*HotelAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{4}
+}
+
+func (m *HotelAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelAdInfo.Unmarshal(m, b)
+}
+func (m *HotelAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelAdInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelAdInfo.Merge(m, src)
+}
+func (m *HotelAdInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelAdInfo.Size(m)
+}
+func (m *HotelAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelAdInfo proto.InternalMessageInfo
+
+// A Smart Shopping ad.
+type ShoppingSmartAdInfo struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ShoppingSmartAdInfo) Reset()         { *m = ShoppingSmartAdInfo{} }
+func (m *ShoppingSmartAdInfo) String() string { return proto.CompactTextString(m) }
+func (*ShoppingSmartAdInfo) ProtoMessage()    {}
+func (*ShoppingSmartAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{5}
+}
+
+func (m *ShoppingSmartAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ShoppingSmartAdInfo.Unmarshal(m, b)
+}
+func (m *ShoppingSmartAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ShoppingSmartAdInfo.Marshal(b, m, deterministic)
+}
+func (m *ShoppingSmartAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ShoppingSmartAdInfo.Merge(m, src)
+}
+func (m *ShoppingSmartAdInfo) XXX_Size() int {
+	return xxx_messageInfo_ShoppingSmartAdInfo.Size(m)
+}
+func (m *ShoppingSmartAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ShoppingSmartAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ShoppingSmartAdInfo proto.InternalMessageInfo
+
+// A standard Shopping ad.
+type ShoppingProductAdInfo struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ShoppingProductAdInfo) Reset()         { *m = ShoppingProductAdInfo{} }
+func (m *ShoppingProductAdInfo) String() string { return proto.CompactTextString(m) }
+func (*ShoppingProductAdInfo) ProtoMessage()    {}
+func (*ShoppingProductAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{6}
+}
+
+func (m *ShoppingProductAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ShoppingProductAdInfo.Unmarshal(m, b)
+}
+func (m *ShoppingProductAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ShoppingProductAdInfo.Marshal(b, m, deterministic)
+}
+func (m *ShoppingProductAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ShoppingProductAdInfo.Merge(m, src)
+}
+func (m *ShoppingProductAdInfo) XXX_Size() int {
+	return xxx_messageInfo_ShoppingProductAdInfo.Size(m)
+}
+func (m *ShoppingProductAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ShoppingProductAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ShoppingProductAdInfo proto.InternalMessageInfo
+
+// A Shopping Comparison Listing ad.
+type ShoppingComparisonListingAdInfo struct {
+	// Headline of the ad. This field is required. Allowed length is between 25
+	// and 45 characters.
+	Headline             *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline,proto3" json:"headline,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ShoppingComparisonListingAdInfo) Reset()         { *m = ShoppingComparisonListingAdInfo{} }
+func (m *ShoppingComparisonListingAdInfo) String() string { return proto.CompactTextString(m) }
+func (*ShoppingComparisonListingAdInfo) ProtoMessage()    {}
+func (*ShoppingComparisonListingAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{7}
+}
+
+func (m *ShoppingComparisonListingAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ShoppingComparisonListingAdInfo.Unmarshal(m, b)
+}
+func (m *ShoppingComparisonListingAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ShoppingComparisonListingAdInfo.Marshal(b, m, deterministic)
+}
+func (m *ShoppingComparisonListingAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ShoppingComparisonListingAdInfo.Merge(m, src)
+}
+func (m *ShoppingComparisonListingAdInfo) XXX_Size() int {
+	return xxx_messageInfo_ShoppingComparisonListingAdInfo.Size(m)
+}
+func (m *ShoppingComparisonListingAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ShoppingComparisonListingAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ShoppingComparisonListingAdInfo proto.InternalMessageInfo
+
+func (m *ShoppingComparisonListingAdInfo) GetHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.Headline
+	}
+	return nil
+}
+
+// A Gmail ad.
+type GmailAdInfo struct {
+	// The Gmail teaser.
+	Teaser *GmailTeaser `protobuf:"bytes,1,opt,name=teaser,proto3" json:"teaser,omitempty"`
+	// The MediaFile resource name of the header image. Valid image types are GIF,
+	// JPEG and PNG. The minimum size is 300x100 pixels and the aspect ratio must
+	// be between 3:1 and 5:1 (+-1%).
+	HeaderImage *wrappers.StringValue `protobuf:"bytes,2,opt,name=header_image,json=headerImage,proto3" json:"header_image,omitempty"`
+	// The MediaFile resource name of the marketing image. Valid image types are
+	// GIF, JPEG and PNG. The image must either be landscape with a minimum size
+	// of 600x314 pixels and aspect ratio of 600:314 (+-1%) or square with a
+	// minimum size of 300x300 pixels and aspect ratio of 1:1 (+-1%)
+	MarketingImage *wrappers.StringValue `protobuf:"bytes,3,opt,name=marketing_image,json=marketingImage,proto3" json:"marketing_image,omitempty"`
+	// Headline of the marketing image.
+	MarketingImageHeadline *wrappers.StringValue `protobuf:"bytes,4,opt,name=marketing_image_headline,json=marketingImageHeadline,proto3" json:"marketing_image_headline,omitempty"`
+	// Description of the marketing image.
+	MarketingImageDescription *wrappers.StringValue `protobuf:"bytes,5,opt,name=marketing_image_description,json=marketingImageDescription,proto3" json:"marketing_image_description,omitempty"`
+	// Display-call-to-action of the marketing image.
+	MarketingImageDisplayCallToAction *DisplayCallToAction `protobuf:"bytes,6,opt,name=marketing_image_display_call_to_action,json=marketingImageDisplayCallToAction,proto3" json:"marketing_image_display_call_to_action,omitempty"`
+	// Product images. Up to 15 images are supported.
+	ProductImages []*ProductImage `protobuf:"bytes,7,rep,name=product_images,json=productImages,proto3" json:"product_images,omitempty"`
+	// Product videos. Up to 7 videos are supported. At least one product video
+	// or a marketing image must be specified.
+	ProductVideos        []*ProductVideo `protobuf:"bytes,8,rep,name=product_videos,json=productVideos,proto3" json:"product_videos,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *GmailAdInfo) Reset()         { *m = GmailAdInfo{} }
+func (m *GmailAdInfo) String() string { return proto.CompactTextString(m) }
+func (*GmailAdInfo) ProtoMessage()    {}
+func (*GmailAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{8}
+}
+
+func (m *GmailAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GmailAdInfo.Unmarshal(m, b)
+}
+func (m *GmailAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GmailAdInfo.Marshal(b, m, deterministic)
+}
+func (m *GmailAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GmailAdInfo.Merge(m, src)
+}
+func (m *GmailAdInfo) XXX_Size() int {
+	return xxx_messageInfo_GmailAdInfo.Size(m)
+}
+func (m *GmailAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_GmailAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GmailAdInfo proto.InternalMessageInfo
+
+func (m *GmailAdInfo) GetTeaser() *GmailTeaser {
+	if m != nil {
+		return m.Teaser
+	}
+	return nil
+}
+
+func (m *GmailAdInfo) GetHeaderImage() *wrappers.StringValue {
+	if m != nil {
+		return m.HeaderImage
+	}
+	return nil
+}
+
+func (m *GmailAdInfo) GetMarketingImage() *wrappers.StringValue {
+	if m != nil {
+		return m.MarketingImage
+	}
+	return nil
+}
+
+func (m *GmailAdInfo) GetMarketingImageHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.MarketingImageHeadline
+	}
+	return nil
+}
+
+func (m *GmailAdInfo) GetMarketingImageDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.MarketingImageDescription
+	}
+	return nil
+}
+
+func (m *GmailAdInfo) GetMarketingImageDisplayCallToAction() *DisplayCallToAction {
+	if m != nil {
+		return m.MarketingImageDisplayCallToAction
+	}
+	return nil
+}
+
+func (m *GmailAdInfo) GetProductImages() []*ProductImage {
+	if m != nil {
+		return m.ProductImages
+	}
+	return nil
+}
+
+func (m *GmailAdInfo) GetProductVideos() []*ProductVideo {
+	if m != nil {
+		return m.ProductVideos
+	}
+	return nil
+}
+
+// Gmail teaser data. The teaser is a small header that acts as an invitation
+// to view the rest of the ad (the body).
+type GmailTeaser struct {
+	// Headline of the teaser.
+	Headline *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline,proto3" json:"headline,omitempty"`
+	// Description of the teaser.
+	Description *wrappers.StringValue `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	// Business name of the advertiser.
+	BusinessName *wrappers.StringValue `protobuf:"bytes,3,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
+	// The MediaFile resource name of the logo image. Valid image types are GIF,
+	// JPEG and PNG. The minimum size is 144x144 pixels and the aspect ratio must
+	// be 1:1 (+-1%).
+	LogoImage            *wrappers.StringValue `protobuf:"bytes,4,opt,name=logo_image,json=logoImage,proto3" json:"logo_image,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *GmailTeaser) Reset()         { *m = GmailTeaser{} }
+func (m *GmailTeaser) String() string { return proto.CompactTextString(m) }
+func (*GmailTeaser) ProtoMessage()    {}
+func (*GmailTeaser) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{9}
+}
+
+func (m *GmailTeaser) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GmailTeaser.Unmarshal(m, b)
+}
+func (m *GmailTeaser) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GmailTeaser.Marshal(b, m, deterministic)
+}
+func (m *GmailTeaser) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GmailTeaser.Merge(m, src)
+}
+func (m *GmailTeaser) XXX_Size() int {
+	return xxx_messageInfo_GmailTeaser.Size(m)
+}
+func (m *GmailTeaser) XXX_DiscardUnknown() {
+	xxx_messageInfo_GmailTeaser.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GmailTeaser proto.InternalMessageInfo
+
+func (m *GmailTeaser) GetHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.Headline
+	}
+	return nil
+}
+
+func (m *GmailTeaser) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *GmailTeaser) GetBusinessName() *wrappers.StringValue {
+	if m != nil {
+		return m.BusinessName
+	}
+	return nil
+}
+
+func (m *GmailTeaser) GetLogoImage() *wrappers.StringValue {
+	if m != nil {
+		return m.LogoImage
+	}
+	return nil
+}
+
+// Data for display call to action. The call to action is a piece of the ad
+// that prompts the user to do something. Like clicking a link or making a phone
+// call.
+type DisplayCallToAction struct {
+	// Text for the display-call-to-action.
+	Text *wrappers.StringValue `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	// Text color for the display-call-to-action in hexadecimal, e.g. #ffffff for
+	// white.
+	TextColor *wrappers.StringValue `protobuf:"bytes,2,opt,name=text_color,json=textColor,proto3" json:"text_color,omitempty"`
+	// Identifies the url collection in the ad.url_collections field. If not set
+	// the url defaults to final_url.
+	UrlCollectionId      *wrappers.StringValue `protobuf:"bytes,3,opt,name=url_collection_id,json=urlCollectionId,proto3" json:"url_collection_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *DisplayCallToAction) Reset()         { *m = DisplayCallToAction{} }
+func (m *DisplayCallToAction) String() string { return proto.CompactTextString(m) }
+func (*DisplayCallToAction) ProtoMessage()    {}
+func (*DisplayCallToAction) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{10}
+}
+
+func (m *DisplayCallToAction) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DisplayCallToAction.Unmarshal(m, b)
+}
+func (m *DisplayCallToAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DisplayCallToAction.Marshal(b, m, deterministic)
+}
+func (m *DisplayCallToAction) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DisplayCallToAction.Merge(m, src)
+}
+func (m *DisplayCallToAction) XXX_Size() int {
+	return xxx_messageInfo_DisplayCallToAction.Size(m)
+}
+func (m *DisplayCallToAction) XXX_DiscardUnknown() {
+	xxx_messageInfo_DisplayCallToAction.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DisplayCallToAction proto.InternalMessageInfo
+
+func (m *DisplayCallToAction) GetText() *wrappers.StringValue {
+	if m != nil {
+		return m.Text
+	}
+	return nil
+}
+
+func (m *DisplayCallToAction) GetTextColor() *wrappers.StringValue {
+	if m != nil {
+		return m.TextColor
+	}
+	return nil
+}
+
+func (m *DisplayCallToAction) GetUrlCollectionId() *wrappers.StringValue {
+	if m != nil {
+		return m.UrlCollectionId
+	}
+	return nil
+}
+
+// Product image specific data.
+type ProductImage struct {
+	// The MediaFile resource name of the product image. Valid image types are
+	// GIF, JPEG and PNG. The minimum size is 300x300 pixels and the aspect ratio
+	// must be 1:1 (+-1%).
+	ProductImage *wrappers.StringValue `protobuf:"bytes,1,opt,name=product_image,json=productImage,proto3" json:"product_image,omitempty"`
+	// Description of the product.
+	Description *wrappers.StringValue `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	// Display-call-to-action of the product image.
+	DisplayCallToAction  *DisplayCallToAction `protobuf:"bytes,3,opt,name=display_call_to_action,json=displayCallToAction,proto3" json:"display_call_to_action,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *ProductImage) Reset()         { *m = ProductImage{} }
+func (m *ProductImage) String() string { return proto.CompactTextString(m) }
+func (*ProductImage) ProtoMessage()    {}
+func (*ProductImage) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{11}
+}
+
+func (m *ProductImage) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductImage.Unmarshal(m, b)
+}
+func (m *ProductImage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductImage.Marshal(b, m, deterministic)
+}
+func (m *ProductImage) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductImage.Merge(m, src)
+}
+func (m *ProductImage) XXX_Size() int {
+	return xxx_messageInfo_ProductImage.Size(m)
+}
+func (m *ProductImage) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductImage.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductImage proto.InternalMessageInfo
+
+func (m *ProductImage) GetProductImage() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductImage
+	}
+	return nil
+}
+
+func (m *ProductImage) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *ProductImage) GetDisplayCallToAction() *DisplayCallToAction {
+	if m != nil {
+		return m.DisplayCallToAction
+	}
+	return nil
+}
+
+// Product video specific data.
+type ProductVideo struct {
+	// The MediaFile resource name of a video which must be hosted on YouTube.
+	ProductVideo         *wrappers.StringValue `protobuf:"bytes,1,opt,name=product_video,json=productVideo,proto3" json:"product_video,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ProductVideo) Reset()         { *m = ProductVideo{} }
+func (m *ProductVideo) String() string { return proto.CompactTextString(m) }
+func (*ProductVideo) ProtoMessage()    {}
+func (*ProductVideo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{12}
+}
+
+func (m *ProductVideo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductVideo.Unmarshal(m, b)
+}
+func (m *ProductVideo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductVideo.Marshal(b, m, deterministic)
+}
+func (m *ProductVideo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductVideo.Merge(m, src)
+}
+func (m *ProductVideo) XXX_Size() int {
+	return xxx_messageInfo_ProductVideo.Size(m)
+}
+func (m *ProductVideo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductVideo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductVideo proto.InternalMessageInfo
+
+func (m *ProductVideo) GetProductVideo() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductVideo
+	}
+	return nil
+}
+
+// An image ad.
+type ImageAdInfo struct {
+	// Width in pixels of the full size image.
+	PixelWidth *wrappers.Int64Value `protobuf:"bytes,4,opt,name=pixel_width,json=pixelWidth,proto3" json:"pixel_width,omitempty"`
+	// Height in pixels of the full size image.
+	PixelHeight *wrappers.Int64Value `protobuf:"bytes,5,opt,name=pixel_height,json=pixelHeight,proto3" json:"pixel_height,omitempty"`
+	// URL of the full size image.
+	ImageUrl *wrappers.StringValue `protobuf:"bytes,6,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"`
+	// Width in pixels of the preview size image.
+	PreviewPixelWidth *wrappers.Int64Value `protobuf:"bytes,7,opt,name=preview_pixel_width,json=previewPixelWidth,proto3" json:"preview_pixel_width,omitempty"`
+	// Height in pixels of the preview size image.
+	PreviewPixelHeight *wrappers.Int64Value `protobuf:"bytes,8,opt,name=preview_pixel_height,json=previewPixelHeight,proto3" json:"preview_pixel_height,omitempty"`
+	// URL of the preview size image.
+	PreviewImageUrl *wrappers.StringValue `protobuf:"bytes,9,opt,name=preview_image_url,json=previewImageUrl,proto3" json:"preview_image_url,omitempty"`
+	// The mime type of the image.
+	MimeType enums.MimeTypeEnum_MimeType `protobuf:"varint,10,opt,name=mime_type,json=mimeType,proto3,enum=google.ads.googleads.v3.enums.MimeTypeEnum_MimeType" json:"mime_type,omitempty"`
+	// The name of the image. If the image was created from a MediaFile, this is
+	// the MediaFile's name. If the image was created from bytes, this is empty.
+	Name *wrappers.StringValue `protobuf:"bytes,11,opt,name=name,proto3" json:"name,omitempty"`
+	// The image to create the ImageAd from. This can be specified in one of
+	// two ways.
+	// 1. An existing MediaFile resource.
+	// 2. The raw image data as bytes.
+	//
+	// Types that are valid to be assigned to Image:
+	//	*ImageAdInfo_MediaFile
+	//	*ImageAdInfo_Data
+	//	*ImageAdInfo_AdIdToCopyImageFrom
+	Image                isImageAdInfo_Image `protobuf_oneof:"image"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *ImageAdInfo) Reset()         { *m = ImageAdInfo{} }
+func (m *ImageAdInfo) String() string { return proto.CompactTextString(m) }
+func (*ImageAdInfo) ProtoMessage()    {}
+func (*ImageAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{13}
+}
+
+func (m *ImageAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageAdInfo.Unmarshal(m, b)
+}
+func (m *ImageAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageAdInfo.Marshal(b, m, deterministic)
+}
+func (m *ImageAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageAdInfo.Merge(m, src)
+}
+func (m *ImageAdInfo) XXX_Size() int {
+	return xxx_messageInfo_ImageAdInfo.Size(m)
+}
+func (m *ImageAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageAdInfo proto.InternalMessageInfo
+
+func (m *ImageAdInfo) GetPixelWidth() *wrappers.Int64Value {
+	if m != nil {
+		return m.PixelWidth
+	}
+	return nil
+}
+
+func (m *ImageAdInfo) GetPixelHeight() *wrappers.Int64Value {
+	if m != nil {
+		return m.PixelHeight
+	}
+	return nil
+}
+
+func (m *ImageAdInfo) GetImageUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.ImageUrl
+	}
+	return nil
+}
+
+func (m *ImageAdInfo) GetPreviewPixelWidth() *wrappers.Int64Value {
+	if m != nil {
+		return m.PreviewPixelWidth
+	}
+	return nil
+}
+
+func (m *ImageAdInfo) GetPreviewPixelHeight() *wrappers.Int64Value {
+	if m != nil {
+		return m.PreviewPixelHeight
+	}
+	return nil
+}
+
+func (m *ImageAdInfo) GetPreviewImageUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.PreviewImageUrl
+	}
+	return nil
+}
+
+func (m *ImageAdInfo) GetMimeType() enums.MimeTypeEnum_MimeType {
+	if m != nil {
+		return m.MimeType
+	}
+	return enums.MimeTypeEnum_UNSPECIFIED
+}
+
+func (m *ImageAdInfo) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+type isImageAdInfo_Image interface {
+	isImageAdInfo_Image()
+}
+
+type ImageAdInfo_MediaFile struct {
+	MediaFile *wrappers.StringValue `protobuf:"bytes,1,opt,name=media_file,json=mediaFile,proto3,oneof"`
+}
+
+type ImageAdInfo_Data struct {
+	Data *wrappers.BytesValue `protobuf:"bytes,2,opt,name=data,proto3,oneof"`
+}
+
+type ImageAdInfo_AdIdToCopyImageFrom struct {
+	AdIdToCopyImageFrom *wrappers.Int64Value `protobuf:"bytes,3,opt,name=ad_id_to_copy_image_from,json=adIdToCopyImageFrom,proto3,oneof"`
+}
+
+func (*ImageAdInfo_MediaFile) isImageAdInfo_Image() {}
+
+func (*ImageAdInfo_Data) isImageAdInfo_Image() {}
+
+func (*ImageAdInfo_AdIdToCopyImageFrom) isImageAdInfo_Image() {}
+
+func (m *ImageAdInfo) GetImage() isImageAdInfo_Image {
+	if m != nil {
+		return m.Image
+	}
+	return nil
+}
+
+func (m *ImageAdInfo) GetMediaFile() *wrappers.StringValue {
+	if x, ok := m.GetImage().(*ImageAdInfo_MediaFile); ok {
+		return x.MediaFile
+	}
+	return nil
+}
+
+func (m *ImageAdInfo) GetData() *wrappers.BytesValue {
+	if x, ok := m.GetImage().(*ImageAdInfo_Data); ok {
+		return x.Data
+	}
+	return nil
+}
+
+func (m *ImageAdInfo) GetAdIdToCopyImageFrom() *wrappers.Int64Value {
+	if x, ok := m.GetImage().(*ImageAdInfo_AdIdToCopyImageFrom); ok {
+		return x.AdIdToCopyImageFrom
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ImageAdInfo) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ImageAdInfo_MediaFile)(nil),
+		(*ImageAdInfo_Data)(nil),
+		(*ImageAdInfo_AdIdToCopyImageFrom)(nil),
+	}
+}
+
+// Representation of video bumper in-stream ad format (very short in-stream
+// non-skippable video ad).
+type VideoBumperInStreamAdInfo struct {
+	// The MediaFile resource name of the companion banner used with the ad.
+	CompanionBanner      *wrappers.StringValue `protobuf:"bytes,1,opt,name=companion_banner,json=companionBanner,proto3" json:"companion_banner,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *VideoBumperInStreamAdInfo) Reset()         { *m = VideoBumperInStreamAdInfo{} }
+func (m *VideoBumperInStreamAdInfo) String() string { return proto.CompactTextString(m) }
+func (*VideoBumperInStreamAdInfo) ProtoMessage()    {}
+func (*VideoBumperInStreamAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{14}
+}
+
+func (m *VideoBumperInStreamAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_VideoBumperInStreamAdInfo.Unmarshal(m, b)
+}
+func (m *VideoBumperInStreamAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_VideoBumperInStreamAdInfo.Marshal(b, m, deterministic)
+}
+func (m *VideoBumperInStreamAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VideoBumperInStreamAdInfo.Merge(m, src)
+}
+func (m *VideoBumperInStreamAdInfo) XXX_Size() int {
+	return xxx_messageInfo_VideoBumperInStreamAdInfo.Size(m)
+}
+func (m *VideoBumperInStreamAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_VideoBumperInStreamAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VideoBumperInStreamAdInfo proto.InternalMessageInfo
+
+func (m *VideoBumperInStreamAdInfo) GetCompanionBanner() *wrappers.StringValue {
+	if m != nil {
+		return m.CompanionBanner
+	}
+	return nil
+}
+
+// Representation of video non-skippable in-stream ad format (15 second
+// in-stream non-skippable video ad).
+type VideoNonSkippableInStreamAdInfo struct {
+	// The MediaFile resource name of the companion banner used with the ad.
+	CompanionBanner      *wrappers.StringValue `protobuf:"bytes,1,opt,name=companion_banner,json=companionBanner,proto3" json:"companion_banner,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *VideoNonSkippableInStreamAdInfo) Reset()         { *m = VideoNonSkippableInStreamAdInfo{} }
+func (m *VideoNonSkippableInStreamAdInfo) String() string { return proto.CompactTextString(m) }
+func (*VideoNonSkippableInStreamAdInfo) ProtoMessage()    {}
+func (*VideoNonSkippableInStreamAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{15}
+}
+
+func (m *VideoNonSkippableInStreamAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_VideoNonSkippableInStreamAdInfo.Unmarshal(m, b)
+}
+func (m *VideoNonSkippableInStreamAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_VideoNonSkippableInStreamAdInfo.Marshal(b, m, deterministic)
+}
+func (m *VideoNonSkippableInStreamAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VideoNonSkippableInStreamAdInfo.Merge(m, src)
+}
+func (m *VideoNonSkippableInStreamAdInfo) XXX_Size() int {
+	return xxx_messageInfo_VideoNonSkippableInStreamAdInfo.Size(m)
+}
+func (m *VideoNonSkippableInStreamAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_VideoNonSkippableInStreamAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VideoNonSkippableInStreamAdInfo proto.InternalMessageInfo
+
+func (m *VideoNonSkippableInStreamAdInfo) GetCompanionBanner() *wrappers.StringValue {
+	if m != nil {
+		return m.CompanionBanner
+	}
+	return nil
+}
+
+// Representation of video TrueView in-stream ad format (ad shown during video
+// playback, often at beginning, which displays a skip button a few seconds into
+// the video).
+type VideoTrueViewInStreamAdInfo struct {
+	// Label on the CTA (call-to-action) button taking the user to the video ad's
+	// final URL.
+	// Required for TrueView for action campaigns, optional otherwise.
+	ActionButtonLabel *wrappers.StringValue `protobuf:"bytes,1,opt,name=action_button_label,json=actionButtonLabel,proto3" json:"action_button_label,omitempty"`
+	// Additional text displayed with the CTA (call-to-action) button to give
+	// context and encourage clicking on the button.
+	ActionHeadline *wrappers.StringValue `protobuf:"bytes,2,opt,name=action_headline,json=actionHeadline,proto3" json:"action_headline,omitempty"`
+	// The MediaFile resource name of the companion banner used with the ad.
+	CompanionBanner      *wrappers.StringValue `protobuf:"bytes,3,opt,name=companion_banner,json=companionBanner,proto3" json:"companion_banner,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *VideoTrueViewInStreamAdInfo) Reset()         { *m = VideoTrueViewInStreamAdInfo{} }
+func (m *VideoTrueViewInStreamAdInfo) String() string { return proto.CompactTextString(m) }
+func (*VideoTrueViewInStreamAdInfo) ProtoMessage()    {}
+func (*VideoTrueViewInStreamAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{16}
+}
+
+func (m *VideoTrueViewInStreamAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_VideoTrueViewInStreamAdInfo.Unmarshal(m, b)
+}
+func (m *VideoTrueViewInStreamAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_VideoTrueViewInStreamAdInfo.Marshal(b, m, deterministic)
+}
+func (m *VideoTrueViewInStreamAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VideoTrueViewInStreamAdInfo.Merge(m, src)
+}
+func (m *VideoTrueViewInStreamAdInfo) XXX_Size() int {
+	return xxx_messageInfo_VideoTrueViewInStreamAdInfo.Size(m)
+}
+func (m *VideoTrueViewInStreamAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_VideoTrueViewInStreamAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VideoTrueViewInStreamAdInfo proto.InternalMessageInfo
+
+func (m *VideoTrueViewInStreamAdInfo) GetActionButtonLabel() *wrappers.StringValue {
+	if m != nil {
+		return m.ActionButtonLabel
+	}
+	return nil
+}
+
+func (m *VideoTrueViewInStreamAdInfo) GetActionHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.ActionHeadline
+	}
+	return nil
+}
+
+func (m *VideoTrueViewInStreamAdInfo) GetCompanionBanner() *wrappers.StringValue {
+	if m != nil {
+		return m.CompanionBanner
+	}
+	return nil
+}
+
+// Representation of video out-stream ad format (ad shown alongside a feed
+// with automatic playback, without sound).
+type VideoOutstreamAdInfo struct {
+	// The headline of the ad.
+	Headline *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline,proto3" json:"headline,omitempty"`
+	// The description line.
+	Description          *wrappers.StringValue `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *VideoOutstreamAdInfo) Reset()         { *m = VideoOutstreamAdInfo{} }
+func (m *VideoOutstreamAdInfo) String() string { return proto.CompactTextString(m) }
+func (*VideoOutstreamAdInfo) ProtoMessage()    {}
+func (*VideoOutstreamAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{17}
+}
+
+func (m *VideoOutstreamAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_VideoOutstreamAdInfo.Unmarshal(m, b)
+}
+func (m *VideoOutstreamAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_VideoOutstreamAdInfo.Marshal(b, m, deterministic)
+}
+func (m *VideoOutstreamAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VideoOutstreamAdInfo.Merge(m, src)
+}
+func (m *VideoOutstreamAdInfo) XXX_Size() int {
+	return xxx_messageInfo_VideoOutstreamAdInfo.Size(m)
+}
+func (m *VideoOutstreamAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_VideoOutstreamAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VideoOutstreamAdInfo proto.InternalMessageInfo
+
+func (m *VideoOutstreamAdInfo) GetHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.Headline
+	}
+	return nil
+}
+
+func (m *VideoOutstreamAdInfo) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+// Representation of video TrueView discovery ad format.
+type VideoTrueViewDiscoveryAdInfo struct {
+	// The headline of the ad.
+	Headline *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline,proto3" json:"headline,omitempty"`
+	// First text line for a TrueView video discovery ad.
+	Description1 *wrappers.StringValue `protobuf:"bytes,2,opt,name=description1,proto3" json:"description1,omitempty"`
+	// Second text line for a TrueView video discovery ad.
+	Description2         *wrappers.StringValue `protobuf:"bytes,3,opt,name=description2,proto3" json:"description2,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *VideoTrueViewDiscoveryAdInfo) Reset()         { *m = VideoTrueViewDiscoveryAdInfo{} }
+func (m *VideoTrueViewDiscoveryAdInfo) String() string { return proto.CompactTextString(m) }
+func (*VideoTrueViewDiscoveryAdInfo) ProtoMessage()    {}
+func (*VideoTrueViewDiscoveryAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{18}
+}
+
+func (m *VideoTrueViewDiscoveryAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_VideoTrueViewDiscoveryAdInfo.Unmarshal(m, b)
+}
+func (m *VideoTrueViewDiscoveryAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_VideoTrueViewDiscoveryAdInfo.Marshal(b, m, deterministic)
+}
+func (m *VideoTrueViewDiscoveryAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VideoTrueViewDiscoveryAdInfo.Merge(m, src)
+}
+func (m *VideoTrueViewDiscoveryAdInfo) XXX_Size() int {
+	return xxx_messageInfo_VideoTrueViewDiscoveryAdInfo.Size(m)
+}
+func (m *VideoTrueViewDiscoveryAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_VideoTrueViewDiscoveryAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VideoTrueViewDiscoveryAdInfo proto.InternalMessageInfo
+
+func (m *VideoTrueViewDiscoveryAdInfo) GetHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.Headline
+	}
+	return nil
+}
+
+func (m *VideoTrueViewDiscoveryAdInfo) GetDescription1() *wrappers.StringValue {
+	if m != nil {
+		return m.Description1
+	}
+	return nil
+}
+
+func (m *VideoTrueViewDiscoveryAdInfo) GetDescription2() *wrappers.StringValue {
+	if m != nil {
+		return m.Description2
+	}
+	return nil
+}
+
+// A video ad.
+type VideoAdInfo struct {
+	// The MediaFile resource to use for the video.
+	MediaFile *wrappers.StringValue `protobuf:"bytes,1,opt,name=media_file,json=mediaFile,proto3" json:"media_file,omitempty"`
+	// Format-specific schema for the different video formats.
+	//
+	// Types that are valid to be assigned to Format:
+	//	*VideoAdInfo_InStream
+	//	*VideoAdInfo_Bumper
+	//	*VideoAdInfo_OutStream
+	//	*VideoAdInfo_NonSkippable
+	//	*VideoAdInfo_Discovery
+	Format               isVideoAdInfo_Format `protobuf_oneof:"format"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *VideoAdInfo) Reset()         { *m = VideoAdInfo{} }
+func (m *VideoAdInfo) String() string { return proto.CompactTextString(m) }
+func (*VideoAdInfo) ProtoMessage()    {}
+func (*VideoAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{19}
+}
+
+func (m *VideoAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_VideoAdInfo.Unmarshal(m, b)
+}
+func (m *VideoAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_VideoAdInfo.Marshal(b, m, deterministic)
+}
+func (m *VideoAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VideoAdInfo.Merge(m, src)
+}
+func (m *VideoAdInfo) XXX_Size() int {
+	return xxx_messageInfo_VideoAdInfo.Size(m)
+}
+func (m *VideoAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_VideoAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VideoAdInfo proto.InternalMessageInfo
+
+func (m *VideoAdInfo) GetMediaFile() *wrappers.StringValue {
+	if m != nil {
+		return m.MediaFile
+	}
+	return nil
+}
+
+type isVideoAdInfo_Format interface {
+	isVideoAdInfo_Format()
+}
+
+type VideoAdInfo_InStream struct {
+	InStream *VideoTrueViewInStreamAdInfo `protobuf:"bytes,2,opt,name=in_stream,json=inStream,proto3,oneof"`
+}
+
+type VideoAdInfo_Bumper struct {
+	Bumper *VideoBumperInStreamAdInfo `protobuf:"bytes,3,opt,name=bumper,proto3,oneof"`
+}
+
+type VideoAdInfo_OutStream struct {
+	OutStream *VideoOutstreamAdInfo `protobuf:"bytes,4,opt,name=out_stream,json=outStream,proto3,oneof"`
+}
+
+type VideoAdInfo_NonSkippable struct {
+	NonSkippable *VideoNonSkippableInStreamAdInfo `protobuf:"bytes,5,opt,name=non_skippable,json=nonSkippable,proto3,oneof"`
+}
+
+type VideoAdInfo_Discovery struct {
+	Discovery *VideoTrueViewDiscoveryAdInfo `protobuf:"bytes,6,opt,name=discovery,proto3,oneof"`
+}
+
+func (*VideoAdInfo_InStream) isVideoAdInfo_Format() {}
+
+func (*VideoAdInfo_Bumper) isVideoAdInfo_Format() {}
+
+func (*VideoAdInfo_OutStream) isVideoAdInfo_Format() {}
+
+func (*VideoAdInfo_NonSkippable) isVideoAdInfo_Format() {}
+
+func (*VideoAdInfo_Discovery) isVideoAdInfo_Format() {}
+
+func (m *VideoAdInfo) GetFormat() isVideoAdInfo_Format {
+	if m != nil {
+		return m.Format
+	}
+	return nil
+}
+
+func (m *VideoAdInfo) GetInStream() *VideoTrueViewInStreamAdInfo {
+	if x, ok := m.GetFormat().(*VideoAdInfo_InStream); ok {
+		return x.InStream
+	}
+	return nil
+}
+
+func (m *VideoAdInfo) GetBumper() *VideoBumperInStreamAdInfo {
+	if x, ok := m.GetFormat().(*VideoAdInfo_Bumper); ok {
+		return x.Bumper
+	}
+	return nil
+}
+
+func (m *VideoAdInfo) GetOutStream() *VideoOutstreamAdInfo {
+	if x, ok := m.GetFormat().(*VideoAdInfo_OutStream); ok {
+		return x.OutStream
+	}
+	return nil
+}
+
+func (m *VideoAdInfo) GetNonSkippable() *VideoNonSkippableInStreamAdInfo {
+	if x, ok := m.GetFormat().(*VideoAdInfo_NonSkippable); ok {
+		return x.NonSkippable
+	}
+	return nil
+}
+
+func (m *VideoAdInfo) GetDiscovery() *VideoTrueViewDiscoveryAdInfo {
+	if x, ok := m.GetFormat().(*VideoAdInfo_Discovery); ok {
+		return x.Discovery
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*VideoAdInfo) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*VideoAdInfo_InStream)(nil),
+		(*VideoAdInfo_Bumper)(nil),
+		(*VideoAdInfo_OutStream)(nil),
+		(*VideoAdInfo_NonSkippable)(nil),
+		(*VideoAdInfo_Discovery)(nil),
+	}
+}
+
+// A responsive search ad.
+//
+// Responsive search ads let you create an ad that adapts to show more text, and
+// more relevant messages, to your customers. Enter multiple headlines and
+// descriptions when creating a responsive search ad, and over time, Google Ads
+// will automatically test different combinations and learn which combinations
+// perform best. By adapting your ad's content to more closely match potential
+// customers' search terms, responsive search ads may improve your campaign's
+// performance.
+//
+// More information at https://support.google.com/google-ads/answer/7684791
+type ResponsiveSearchAdInfo struct {
+	// List of text assets for headlines. When the ad serves the headlines will
+	// be selected from this list.
+	Headlines []*AdTextAsset `protobuf:"bytes,1,rep,name=headlines,proto3" json:"headlines,omitempty"`
+	// List of text assets for descriptions. When the ad serves the descriptions
+	// will be selected from this list.
+	Descriptions []*AdTextAsset `protobuf:"bytes,2,rep,name=descriptions,proto3" json:"descriptions,omitempty"`
+	// First part of text that may appear appended to the url displayed in the ad.
+	Path1 *wrappers.StringValue `protobuf:"bytes,3,opt,name=path1,proto3" json:"path1,omitempty"`
+	// Second part of text that may appear appended to the url displayed in the
+	// ad. This field can only be set when path1 is also set.
+	Path2                *wrappers.StringValue `protobuf:"bytes,4,opt,name=path2,proto3" json:"path2,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ResponsiveSearchAdInfo) Reset()         { *m = ResponsiveSearchAdInfo{} }
+func (m *ResponsiveSearchAdInfo) String() string { return proto.CompactTextString(m) }
+func (*ResponsiveSearchAdInfo) ProtoMessage()    {}
+func (*ResponsiveSearchAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{20}
+}
+
+func (m *ResponsiveSearchAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResponsiveSearchAdInfo.Unmarshal(m, b)
+}
+func (m *ResponsiveSearchAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResponsiveSearchAdInfo.Marshal(b, m, deterministic)
+}
+func (m *ResponsiveSearchAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResponsiveSearchAdInfo.Merge(m, src)
+}
+func (m *ResponsiveSearchAdInfo) XXX_Size() int {
+	return xxx_messageInfo_ResponsiveSearchAdInfo.Size(m)
+}
+func (m *ResponsiveSearchAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResponsiveSearchAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResponsiveSearchAdInfo proto.InternalMessageInfo
+
+func (m *ResponsiveSearchAdInfo) GetHeadlines() []*AdTextAsset {
+	if m != nil {
+		return m.Headlines
+	}
+	return nil
+}
+
+func (m *ResponsiveSearchAdInfo) GetDescriptions() []*AdTextAsset {
+	if m != nil {
+		return m.Descriptions
+	}
+	return nil
+}
+
+func (m *ResponsiveSearchAdInfo) GetPath1() *wrappers.StringValue {
+	if m != nil {
+		return m.Path1
+	}
+	return nil
+}
+
+func (m *ResponsiveSearchAdInfo) GetPath2() *wrappers.StringValue {
+	if m != nil {
+		return m.Path2
+	}
+	return nil
+}
+
+// A legacy responsive display ad. Ads of this type are labeled 'Responsive ads'
+// in the Google Ads UI.
+type LegacyResponsiveDisplayAdInfo struct {
+	// The short version of the ad's headline.
+	ShortHeadline *wrappers.StringValue `protobuf:"bytes,1,opt,name=short_headline,json=shortHeadline,proto3" json:"short_headline,omitempty"`
+	// The long version of the ad's headline.
+	LongHeadline *wrappers.StringValue `protobuf:"bytes,2,opt,name=long_headline,json=longHeadline,proto3" json:"long_headline,omitempty"`
+	// The description of the ad.
+	Description *wrappers.StringValue `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
+	// The business name in the ad.
+	BusinessName *wrappers.StringValue `protobuf:"bytes,4,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
+	// Advertiser's consent to allow flexible color. When true, the ad may be
+	// served with different color if necessary. When false, the ad will be served
+	// with the specified colors or a neutral color.
+	// The default value is true.
+	// Must be true if main_color and accent_color are not set.
+	AllowFlexibleColor *wrappers.BoolValue `protobuf:"bytes,5,opt,name=allow_flexible_color,json=allowFlexibleColor,proto3" json:"allow_flexible_color,omitempty"`
+	// The accent color of the ad in hexadecimal, e.g. #ffffff for white.
+	// If one of main_color and accent_color is set, the other is required as
+	// well.
+	AccentColor *wrappers.StringValue `protobuf:"bytes,6,opt,name=accent_color,json=accentColor,proto3" json:"accent_color,omitempty"`
+	// The main color of the ad in hexadecimal, e.g. #ffffff for white.
+	// If one of main_color and accent_color is set, the other is required as
+	// well.
+	MainColor *wrappers.StringValue `protobuf:"bytes,7,opt,name=main_color,json=mainColor,proto3" json:"main_color,omitempty"`
+	// The call-to-action text for the ad.
+	CallToActionText *wrappers.StringValue `protobuf:"bytes,8,opt,name=call_to_action_text,json=callToActionText,proto3" json:"call_to_action_text,omitempty"`
+	// The MediaFile resource name of the logo image used in the ad.
+	LogoImage *wrappers.StringValue `protobuf:"bytes,9,opt,name=logo_image,json=logoImage,proto3" json:"logo_image,omitempty"`
+	// The MediaFile resource name of the square logo image used in the ad.
+	SquareLogoImage *wrappers.StringValue `protobuf:"bytes,10,opt,name=square_logo_image,json=squareLogoImage,proto3" json:"square_logo_image,omitempty"`
+	// The MediaFile resource name of the marketing image used in the ad.
+	MarketingImage *wrappers.StringValue `protobuf:"bytes,11,opt,name=marketing_image,json=marketingImage,proto3" json:"marketing_image,omitempty"`
+	// The MediaFile resource name of the square marketing image used in the ad.
+	SquareMarketingImage *wrappers.StringValue `protobuf:"bytes,12,opt,name=square_marketing_image,json=squareMarketingImage,proto3" json:"square_marketing_image,omitempty"`
+	// Specifies which format the ad will be served in. Default is ALL_FORMATS.
+	FormatSetting enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting `protobuf:"varint,13,opt,name=format_setting,json=formatSetting,proto3,enum=google.ads.googleads.v3.enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting" json:"format_setting,omitempty"`
+	// Prefix before price. E.g. 'as low as'.
+	PricePrefix *wrappers.StringValue `protobuf:"bytes,14,opt,name=price_prefix,json=pricePrefix,proto3" json:"price_prefix,omitempty"`
+	// Promotion text used for dyanmic formats of responsive ads. For example
+	// 'Free two-day shipping'.
+	PromoText            *wrappers.StringValue `protobuf:"bytes,15,opt,name=promo_text,json=promoText,proto3" json:"promo_text,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) Reset()         { *m = LegacyResponsiveDisplayAdInfo{} }
+func (m *LegacyResponsiveDisplayAdInfo) String() string { return proto.CompactTextString(m) }
+func (*LegacyResponsiveDisplayAdInfo) ProtoMessage()    {}
+func (*LegacyResponsiveDisplayAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{21}
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LegacyResponsiveDisplayAdInfo.Unmarshal(m, b)
+}
+func (m *LegacyResponsiveDisplayAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LegacyResponsiveDisplayAdInfo.Marshal(b, m, deterministic)
+}
+func (m *LegacyResponsiveDisplayAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LegacyResponsiveDisplayAdInfo.Merge(m, src)
+}
+func (m *LegacyResponsiveDisplayAdInfo) XXX_Size() int {
+	return xxx_messageInfo_LegacyResponsiveDisplayAdInfo.Size(m)
+}
+func (m *LegacyResponsiveDisplayAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_LegacyResponsiveDisplayAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LegacyResponsiveDisplayAdInfo proto.InternalMessageInfo
+
+func (m *LegacyResponsiveDisplayAdInfo) GetShortHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.ShortHeadline
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetLongHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.LongHeadline
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetBusinessName() *wrappers.StringValue {
+	if m != nil {
+		return m.BusinessName
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetAllowFlexibleColor() *wrappers.BoolValue {
+	if m != nil {
+		return m.AllowFlexibleColor
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetAccentColor() *wrappers.StringValue {
+	if m != nil {
+		return m.AccentColor
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetMainColor() *wrappers.StringValue {
+	if m != nil {
+		return m.MainColor
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetCallToActionText() *wrappers.StringValue {
+	if m != nil {
+		return m.CallToActionText
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetLogoImage() *wrappers.StringValue {
+	if m != nil {
+		return m.LogoImage
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetSquareLogoImage() *wrappers.StringValue {
+	if m != nil {
+		return m.SquareLogoImage
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetMarketingImage() *wrappers.StringValue {
+	if m != nil {
+		return m.MarketingImage
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetSquareMarketingImage() *wrappers.StringValue {
+	if m != nil {
+		return m.SquareMarketingImage
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetFormatSetting() enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting {
+	if m != nil {
+		return m.FormatSetting
+	}
+	return enums.DisplayAdFormatSettingEnum_UNSPECIFIED
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetPricePrefix() *wrappers.StringValue {
+	if m != nil {
+		return m.PricePrefix
+	}
+	return nil
+}
+
+func (m *LegacyResponsiveDisplayAdInfo) GetPromoText() *wrappers.StringValue {
+	if m != nil {
+		return m.PromoText
+	}
+	return nil
+}
+
+// An app ad.
+type AppAdInfo struct {
+	// An optional text asset that, if specified, must always be displayed when
+	// the ad is served.
+	MandatoryAdText *AdTextAsset `protobuf:"bytes,1,opt,name=mandatory_ad_text,json=mandatoryAdText,proto3" json:"mandatory_ad_text,omitempty"`
+	// List of text assets for headlines. When the ad serves the headlines will
+	// be selected from this list.
+	Headlines []*AdTextAsset `protobuf:"bytes,2,rep,name=headlines,proto3" json:"headlines,omitempty"`
+	// List of text assets for descriptions. When the ad serves the descriptions
+	// will be selected from this list.
+	Descriptions []*AdTextAsset `protobuf:"bytes,3,rep,name=descriptions,proto3" json:"descriptions,omitempty"`
+	// List of image assets that may be displayed with the ad.
+	Images []*AdImageAsset `protobuf:"bytes,4,rep,name=images,proto3" json:"images,omitempty"`
+	// List of YouTube video assets that may be displayed with the ad.
+	YoutubeVideos []*AdVideoAsset `protobuf:"bytes,5,rep,name=youtube_videos,json=youtubeVideos,proto3" json:"youtube_videos,omitempty"`
+	// List of media bundle assets that may be used with the ad.
+	Html5MediaBundles    []*AdMediaBundleAsset `protobuf:"bytes,6,rep,name=html5_media_bundles,json=html5MediaBundles,proto3" json:"html5_media_bundles,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AppAdInfo) Reset()         { *m = AppAdInfo{} }
+func (m *AppAdInfo) String() string { return proto.CompactTextString(m) }
+func (*AppAdInfo) ProtoMessage()    {}
+func (*AppAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{22}
+}
+
+func (m *AppAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppAdInfo.Unmarshal(m, b)
+}
+func (m *AppAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppAdInfo.Marshal(b, m, deterministic)
+}
+func (m *AppAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppAdInfo.Merge(m, src)
+}
+func (m *AppAdInfo) XXX_Size() int {
+	return xxx_messageInfo_AppAdInfo.Size(m)
+}
+func (m *AppAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppAdInfo proto.InternalMessageInfo
+
+func (m *AppAdInfo) GetMandatoryAdText() *AdTextAsset {
+	if m != nil {
+		return m.MandatoryAdText
+	}
+	return nil
+}
+
+func (m *AppAdInfo) GetHeadlines() []*AdTextAsset {
+	if m != nil {
+		return m.Headlines
+	}
+	return nil
+}
+
+func (m *AppAdInfo) GetDescriptions() []*AdTextAsset {
+	if m != nil {
+		return m.Descriptions
+	}
+	return nil
+}
+
+func (m *AppAdInfo) GetImages() []*AdImageAsset {
+	if m != nil {
+		return m.Images
+	}
+	return nil
+}
+
+func (m *AppAdInfo) GetYoutubeVideos() []*AdVideoAsset {
+	if m != nil {
+		return m.YoutubeVideos
+	}
+	return nil
+}
+
+func (m *AppAdInfo) GetHtml5MediaBundles() []*AdMediaBundleAsset {
+	if m != nil {
+		return m.Html5MediaBundles
+	}
+	return nil
+}
+
+// App engagement ads allow you to write text encouraging a specific action in
+// the app, like checking in, making a purchase, or booking a flight.
+// They allow you to send users to a specific part of your app where they can
+// find what they're looking for easier and faster.
+type AppEngagementAdInfo struct {
+	// List of text assets for headlines. When the ad serves the headlines will
+	// be selected from this list.
+	Headlines []*AdTextAsset `protobuf:"bytes,1,rep,name=headlines,proto3" json:"headlines,omitempty"`
+	// List of text assets for descriptions. When the ad serves the descriptions
+	// will be selected from this list.
+	Descriptions []*AdTextAsset `protobuf:"bytes,2,rep,name=descriptions,proto3" json:"descriptions,omitempty"`
+	// List of image assets that may be displayed with the ad.
+	Images []*AdImageAsset `protobuf:"bytes,3,rep,name=images,proto3" json:"images,omitempty"`
+	// List of video assets that may be displayed with the ad.
+	Videos               []*AdVideoAsset `protobuf:"bytes,4,rep,name=videos,proto3" json:"videos,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *AppEngagementAdInfo) Reset()         { *m = AppEngagementAdInfo{} }
+func (m *AppEngagementAdInfo) String() string { return proto.CompactTextString(m) }
+func (*AppEngagementAdInfo) ProtoMessage()    {}
+func (*AppEngagementAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{23}
+}
+
+func (m *AppEngagementAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppEngagementAdInfo.Unmarshal(m, b)
+}
+func (m *AppEngagementAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppEngagementAdInfo.Marshal(b, m, deterministic)
+}
+func (m *AppEngagementAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppEngagementAdInfo.Merge(m, src)
+}
+func (m *AppEngagementAdInfo) XXX_Size() int {
+	return xxx_messageInfo_AppEngagementAdInfo.Size(m)
+}
+func (m *AppEngagementAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppEngagementAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppEngagementAdInfo proto.InternalMessageInfo
+
+func (m *AppEngagementAdInfo) GetHeadlines() []*AdTextAsset {
+	if m != nil {
+		return m.Headlines
+	}
+	return nil
+}
+
+func (m *AppEngagementAdInfo) GetDescriptions() []*AdTextAsset {
+	if m != nil {
+		return m.Descriptions
+	}
+	return nil
+}
+
+func (m *AppEngagementAdInfo) GetImages() []*AdImageAsset {
+	if m != nil {
+		return m.Images
+	}
+	return nil
+}
+
+func (m *AppEngagementAdInfo) GetVideos() []*AdVideoAsset {
+	if m != nil {
+		return m.Videos
+	}
+	return nil
+}
+
+// A legacy app install ad that only can be used by a few select customers.
+type LegacyAppInstallAdInfo struct {
+	// The id of the mobile app.
+	AppId *wrappers.StringValue `protobuf:"bytes,1,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
+	// The app store the mobile app is available in.
+	AppStore enums.LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore `protobuf:"varint,2,opt,name=app_store,json=appStore,proto3,enum=google.ads.googleads.v3.enums.LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore" json:"app_store,omitempty"`
+	// The headline of the ad.
+	Headline *wrappers.StringValue `protobuf:"bytes,3,opt,name=headline,proto3" json:"headline,omitempty"`
+	// The first description line of the ad.
+	Description1 *wrappers.StringValue `protobuf:"bytes,4,opt,name=description1,proto3" json:"description1,omitempty"`
+	// The second description line of the ad.
+	Description2         *wrappers.StringValue `protobuf:"bytes,5,opt,name=description2,proto3" json:"description2,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *LegacyAppInstallAdInfo) Reset()         { *m = LegacyAppInstallAdInfo{} }
+func (m *LegacyAppInstallAdInfo) String() string { return proto.CompactTextString(m) }
+func (*LegacyAppInstallAdInfo) ProtoMessage()    {}
+func (*LegacyAppInstallAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{24}
+}
+
+func (m *LegacyAppInstallAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LegacyAppInstallAdInfo.Unmarshal(m, b)
+}
+func (m *LegacyAppInstallAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LegacyAppInstallAdInfo.Marshal(b, m, deterministic)
+}
+func (m *LegacyAppInstallAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LegacyAppInstallAdInfo.Merge(m, src)
+}
+func (m *LegacyAppInstallAdInfo) XXX_Size() int {
+	return xxx_messageInfo_LegacyAppInstallAdInfo.Size(m)
+}
+func (m *LegacyAppInstallAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_LegacyAppInstallAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LegacyAppInstallAdInfo proto.InternalMessageInfo
+
+func (m *LegacyAppInstallAdInfo) GetAppId() *wrappers.StringValue {
+	if m != nil {
+		return m.AppId
+	}
+	return nil
+}
+
+func (m *LegacyAppInstallAdInfo) GetAppStore() enums.LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore {
+	if m != nil {
+		return m.AppStore
+	}
+	return enums.LegacyAppInstallAdAppStoreEnum_UNSPECIFIED
+}
+
+func (m *LegacyAppInstallAdInfo) GetHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.Headline
+	}
+	return nil
+}
+
+func (m *LegacyAppInstallAdInfo) GetDescription1() *wrappers.StringValue {
+	if m != nil {
+		return m.Description1
+	}
+	return nil
+}
+
+func (m *LegacyAppInstallAdInfo) GetDescription2() *wrappers.StringValue {
+	if m != nil {
+		return m.Description2
+	}
+	return nil
+}
+
+// A responsive display ad.
+type ResponsiveDisplayAdInfo struct {
+	// Marketing images to be used in the ad. Valid image types are GIF,
+	// JPEG, and PNG. The minimum size is 600x314 and the aspect ratio must
+	// be 1.91:1 (+-1%). At least one marketing_image is required. Combined with
+	// square_marketing_images the maximum is 15.
+	MarketingImages []*AdImageAsset `protobuf:"bytes,1,rep,name=marketing_images,json=marketingImages,proto3" json:"marketing_images,omitempty"`
+	// Square marketing images to be used in the ad. Valid image types are GIF,
+	// JPEG, and PNG. The minimum size is 300x300 and the aspect ratio must
+	// be 1:1 (+-1%). At least one square marketing_image is required. Combined
+	// with marketing_images the maximum is 15.
+	SquareMarketingImages []*AdImageAsset `protobuf:"bytes,2,rep,name=square_marketing_images,json=squareMarketingImages,proto3" json:"square_marketing_images,omitempty"`
+	// Logo images to be used in the ad. Valid image types are GIF,
+	// JPEG, and PNG. The minimum size is 512x128 and the aspect ratio must
+	// be 4:1 (+-1%). Combined with square_logo_images the maximum is 5.
+	LogoImages []*AdImageAsset `protobuf:"bytes,3,rep,name=logo_images,json=logoImages,proto3" json:"logo_images,omitempty"`
+	// Square logo images to be used in the ad. Valid image types are GIF,
+	// JPEG, and PNG. The minimum size is 128x128 and the aspect ratio must
+	// be 1:1 (+-1%). Combined with square_logo_images the maximum is 5.
+	SquareLogoImages []*AdImageAsset `protobuf:"bytes,4,rep,name=square_logo_images,json=squareLogoImages,proto3" json:"square_logo_images,omitempty"`
+	// Short format headlines for the ad. The maximum length is 30 characters.
+	// At least 1 and max 5 headlines can be specified.
+	Headlines []*AdTextAsset `protobuf:"bytes,5,rep,name=headlines,proto3" json:"headlines,omitempty"`
+	// A required long format headline. The maximum length is 90 characters.
+	LongHeadline *AdTextAsset `protobuf:"bytes,6,opt,name=long_headline,json=longHeadline,proto3" json:"long_headline,omitempty"`
+	// Descriptive texts for the ad. The maximum length is 90 characters. At
+	// least 1 and max 5 headlines can be specified.
+	Descriptions []*AdTextAsset `protobuf:"bytes,7,rep,name=descriptions,proto3" json:"descriptions,omitempty"`
+	// Optional YouTube videos for the ad. A maximum of 5 videos can be specified.
+	YoutubeVideos []*AdVideoAsset `protobuf:"bytes,8,rep,name=youtube_videos,json=youtubeVideos,proto3" json:"youtube_videos,omitempty"`
+	// The advertiser/brand name. Maximum display width is 25.
+	BusinessName *wrappers.StringValue `protobuf:"bytes,9,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
+	// The main color of the ad in hexadecimal, e.g. #ffffff for white.
+	// If one of main_color and accent_color is set, the other is required as
+	// well.
+	MainColor *wrappers.StringValue `protobuf:"bytes,10,opt,name=main_color,json=mainColor,proto3" json:"main_color,omitempty"`
+	// The accent color of the ad in hexadecimal, e.g. #ffffff for white.
+	// If one of main_color and accent_color is set, the other is required as
+	// well.
+	AccentColor *wrappers.StringValue `protobuf:"bytes,11,opt,name=accent_color,json=accentColor,proto3" json:"accent_color,omitempty"`
+	// Advertiser's consent to allow flexible color. When true, the ad may be
+	// served with different color if necessary. When false, the ad will be served
+	// with the specified colors or a neutral color.
+	// The default value is true.
+	// Must be true if main_color and accent_color are not set.
+	AllowFlexibleColor *wrappers.BoolValue `protobuf:"bytes,12,opt,name=allow_flexible_color,json=allowFlexibleColor,proto3" json:"allow_flexible_color,omitempty"`
+	// The call-to-action text for the ad. Maximum display width is 30.
+	CallToActionText *wrappers.StringValue `protobuf:"bytes,13,opt,name=call_to_action_text,json=callToActionText,proto3" json:"call_to_action_text,omitempty"`
+	// Prefix before price. E.g. 'as low as'.
+	PricePrefix *wrappers.StringValue `protobuf:"bytes,14,opt,name=price_prefix,json=pricePrefix,proto3" json:"price_prefix,omitempty"`
+	// Promotion text used for dyanmic formats of responsive ads. For example
+	// 'Free two-day shipping'.
+	PromoText *wrappers.StringValue `protobuf:"bytes,15,opt,name=promo_text,json=promoText,proto3" json:"promo_text,omitempty"`
+	// Specifies which format the ad will be served in. Default is ALL_FORMATS.
+	FormatSetting        enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting `protobuf:"varint,16,opt,name=format_setting,json=formatSetting,proto3,enum=google.ads.googleads.v3.enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting" json:"format_setting,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                `json:"-"`
+	XXX_unrecognized     []byte                                                  `json:"-"`
+	XXX_sizecache        int32                                                   `json:"-"`
+}
+
+func (m *ResponsiveDisplayAdInfo) Reset()         { *m = ResponsiveDisplayAdInfo{} }
+func (m *ResponsiveDisplayAdInfo) String() string { return proto.CompactTextString(m) }
+func (*ResponsiveDisplayAdInfo) ProtoMessage()    {}
+func (*ResponsiveDisplayAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{25}
+}
+
+func (m *ResponsiveDisplayAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResponsiveDisplayAdInfo.Unmarshal(m, b)
+}
+func (m *ResponsiveDisplayAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResponsiveDisplayAdInfo.Marshal(b, m, deterministic)
+}
+func (m *ResponsiveDisplayAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResponsiveDisplayAdInfo.Merge(m, src)
+}
+func (m *ResponsiveDisplayAdInfo) XXX_Size() int {
+	return xxx_messageInfo_ResponsiveDisplayAdInfo.Size(m)
+}
+func (m *ResponsiveDisplayAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResponsiveDisplayAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResponsiveDisplayAdInfo proto.InternalMessageInfo
+
+func (m *ResponsiveDisplayAdInfo) GetMarketingImages() []*AdImageAsset {
+	if m != nil {
+		return m.MarketingImages
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetSquareMarketingImages() []*AdImageAsset {
+	if m != nil {
+		return m.SquareMarketingImages
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetLogoImages() []*AdImageAsset {
+	if m != nil {
+		return m.LogoImages
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetSquareLogoImages() []*AdImageAsset {
+	if m != nil {
+		return m.SquareLogoImages
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetHeadlines() []*AdTextAsset {
+	if m != nil {
+		return m.Headlines
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetLongHeadline() *AdTextAsset {
+	if m != nil {
+		return m.LongHeadline
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetDescriptions() []*AdTextAsset {
+	if m != nil {
+		return m.Descriptions
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetYoutubeVideos() []*AdVideoAsset {
+	if m != nil {
+		return m.YoutubeVideos
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetBusinessName() *wrappers.StringValue {
+	if m != nil {
+		return m.BusinessName
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetMainColor() *wrappers.StringValue {
+	if m != nil {
+		return m.MainColor
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetAccentColor() *wrappers.StringValue {
+	if m != nil {
+		return m.AccentColor
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetAllowFlexibleColor() *wrappers.BoolValue {
+	if m != nil {
+		return m.AllowFlexibleColor
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetCallToActionText() *wrappers.StringValue {
+	if m != nil {
+		return m.CallToActionText
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetPricePrefix() *wrappers.StringValue {
+	if m != nil {
+		return m.PricePrefix
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetPromoText() *wrappers.StringValue {
+	if m != nil {
+		return m.PromoText
+	}
+	return nil
+}
+
+func (m *ResponsiveDisplayAdInfo) GetFormatSetting() enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting {
+	if m != nil {
+		return m.FormatSetting
+	}
+	return enums.DisplayAdFormatSettingEnum_UNSPECIFIED
+}
+
+// A generic type of display ad. The exact ad format is controlled by the
+// display_upload_product_type field, which determines what kinds of data
+// need to be included with the ad.
+type DisplayUploadAdInfo struct {
+	// The product type of this ad. See comments on the enum for details.
+	DisplayUploadProductType enums.DisplayUploadProductTypeEnum_DisplayUploadProductType `protobuf:"varint,1,opt,name=display_upload_product_type,json=displayUploadProductType,proto3,enum=google.ads.googleads.v3.enums.DisplayUploadProductTypeEnum_DisplayUploadProductType" json:"display_upload_product_type,omitempty"`
+	// The asset data that makes up the ad.
+	//
+	// Types that are valid to be assigned to MediaAsset:
+	//	*DisplayUploadAdInfo_MediaBundle
+	MediaAsset           isDisplayUploadAdInfo_MediaAsset `protobuf_oneof:"media_asset"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *DisplayUploadAdInfo) Reset()         { *m = DisplayUploadAdInfo{} }
+func (m *DisplayUploadAdInfo) String() string { return proto.CompactTextString(m) }
+func (*DisplayUploadAdInfo) ProtoMessage()    {}
+func (*DisplayUploadAdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b3dd1fef8feae128, []int{26}
+}
+
+func (m *DisplayUploadAdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DisplayUploadAdInfo.Unmarshal(m, b)
+}
+func (m *DisplayUploadAdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DisplayUploadAdInfo.Marshal(b, m, deterministic)
+}
+func (m *DisplayUploadAdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DisplayUploadAdInfo.Merge(m, src)
+}
+func (m *DisplayUploadAdInfo) XXX_Size() int {
+	return xxx_messageInfo_DisplayUploadAdInfo.Size(m)
+}
+func (m *DisplayUploadAdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_DisplayUploadAdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DisplayUploadAdInfo proto.InternalMessageInfo
+
+func (m *DisplayUploadAdInfo) GetDisplayUploadProductType() enums.DisplayUploadProductTypeEnum_DisplayUploadProductType {
+	if m != nil {
+		return m.DisplayUploadProductType
+	}
+	return enums.DisplayUploadProductTypeEnum_UNSPECIFIED
+}
+
+type isDisplayUploadAdInfo_MediaAsset interface {
+	isDisplayUploadAdInfo_MediaAsset()
+}
+
+type DisplayUploadAdInfo_MediaBundle struct {
+	MediaBundle *AdMediaBundleAsset `protobuf:"bytes,2,opt,name=media_bundle,json=mediaBundle,proto3,oneof"`
+}
+
+func (*DisplayUploadAdInfo_MediaBundle) isDisplayUploadAdInfo_MediaAsset() {}
+
+func (m *DisplayUploadAdInfo) GetMediaAsset() isDisplayUploadAdInfo_MediaAsset {
+	if m != nil {
+		return m.MediaAsset
+	}
+	return nil
+}
+
+func (m *DisplayUploadAdInfo) GetMediaBundle() *AdMediaBundleAsset {
+	if x, ok := m.GetMediaAsset().(*DisplayUploadAdInfo_MediaBundle); ok {
+		return x.MediaBundle
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*DisplayUploadAdInfo) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*DisplayUploadAdInfo_MediaBundle)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*TextAdInfo)(nil), "google.ads.googleads.v3.common.TextAdInfo")
+	proto.RegisterType((*ExpandedTextAdInfo)(nil), "google.ads.googleads.v3.common.ExpandedTextAdInfo")
+	proto.RegisterType((*CallOnlyAdInfo)(nil), "google.ads.googleads.v3.common.CallOnlyAdInfo")
+	proto.RegisterType((*ExpandedDynamicSearchAdInfo)(nil), "google.ads.googleads.v3.common.ExpandedDynamicSearchAdInfo")
+	proto.RegisterType((*HotelAdInfo)(nil), "google.ads.googleads.v3.common.HotelAdInfo")
+	proto.RegisterType((*ShoppingSmartAdInfo)(nil), "google.ads.googleads.v3.common.ShoppingSmartAdInfo")
+	proto.RegisterType((*ShoppingProductAdInfo)(nil), "google.ads.googleads.v3.common.ShoppingProductAdInfo")
+	proto.RegisterType((*ShoppingComparisonListingAdInfo)(nil), "google.ads.googleads.v3.common.ShoppingComparisonListingAdInfo")
+	proto.RegisterType((*GmailAdInfo)(nil), "google.ads.googleads.v3.common.GmailAdInfo")
+	proto.RegisterType((*GmailTeaser)(nil), "google.ads.googleads.v3.common.GmailTeaser")
+	proto.RegisterType((*DisplayCallToAction)(nil), "google.ads.googleads.v3.common.DisplayCallToAction")
+	proto.RegisterType((*ProductImage)(nil), "google.ads.googleads.v3.common.ProductImage")
+	proto.RegisterType((*ProductVideo)(nil), "google.ads.googleads.v3.common.ProductVideo")
+	proto.RegisterType((*ImageAdInfo)(nil), "google.ads.googleads.v3.common.ImageAdInfo")
+	proto.RegisterType((*VideoBumperInStreamAdInfo)(nil), "google.ads.googleads.v3.common.VideoBumperInStreamAdInfo")
+	proto.RegisterType((*VideoNonSkippableInStreamAdInfo)(nil), "google.ads.googleads.v3.common.VideoNonSkippableInStreamAdInfo")
+	proto.RegisterType((*VideoTrueViewInStreamAdInfo)(nil), "google.ads.googleads.v3.common.VideoTrueViewInStreamAdInfo")
+	proto.RegisterType((*VideoOutstreamAdInfo)(nil), "google.ads.googleads.v3.common.VideoOutstreamAdInfo")
+	proto.RegisterType((*VideoTrueViewDiscoveryAdInfo)(nil), "google.ads.googleads.v3.common.VideoTrueViewDiscoveryAdInfo")
+	proto.RegisterType((*VideoAdInfo)(nil), "google.ads.googleads.v3.common.VideoAdInfo")
+	proto.RegisterType((*ResponsiveSearchAdInfo)(nil), "google.ads.googleads.v3.common.ResponsiveSearchAdInfo")
+	proto.RegisterType((*LegacyResponsiveDisplayAdInfo)(nil), "google.ads.googleads.v3.common.LegacyResponsiveDisplayAdInfo")
+	proto.RegisterType((*AppAdInfo)(nil), "google.ads.googleads.v3.common.AppAdInfo")
+	proto.RegisterType((*AppEngagementAdInfo)(nil), "google.ads.googleads.v3.common.AppEngagementAdInfo")
+	proto.RegisterType((*LegacyAppInstallAdInfo)(nil), "google.ads.googleads.v3.common.LegacyAppInstallAdInfo")
+	proto.RegisterType((*ResponsiveDisplayAdInfo)(nil), "google.ads.googleads.v3.common.ResponsiveDisplayAdInfo")
+	proto.RegisterType((*DisplayUploadAdInfo)(nil), "google.ads.googleads.v3.common.DisplayUploadAdInfo")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/ad_type_infos.proto", fileDescriptor_b3dd1fef8feae128)
+}
+
+var fileDescriptor_b3dd1fef8feae128 = []byte{
+	// 2433 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5a, 0xdd, 0x6e, 0xdb, 0xc8,
+	0x15, 0xb6, 0x24, 0xff, 0x48, 0x47, 0x92, 0x7f, 0xe8, 0xfc, 0x68, 0x9d, 0xec, 0x6e, 0xca, 0x8b,
+	0x22, 0x40, 0xbb, 0x72, 0x23, 0xa7, 0x45, 0xd7, 0xd9, 0x6c, 0x2a, 0xdb, 0x49, 0x64, 0xac, 0x93,
+	0x78, 0x65, 0xc7, 0x29, 0x52, 0x03, 0xc4, 0x48, 0x1c, 0xcb, 0x6c, 0xc8, 0x19, 0x96, 0x43, 0x3a,
+	0xd6, 0xed, 0x5e, 0xb4, 0xb7, 0x05, 0xf6, 0xaa, 0x45, 0x81, 0x02, 0x7b, 0x59, 0xa0, 0x8f, 0xd0,
+	0xab, 0xde, 0x2d, 0xd0, 0x3e, 0xc1, 0x3e, 0x41, 0xfb, 0x08, 0x7b, 0xd1, 0x62, 0x7e, 0x48, 0x51,
+	0x92, 0x65, 0x8d, 0xac, 0x6d, 0x83, 0xf6, 0x4a, 0x12, 0x79, 0xbe, 0x8f, 0x73, 0x66, 0xce, 0x7c,
+	0xe7, 0xcc, 0xa1, 0xa0, 0xd6, 0xa1, 0xb4, 0xe3, 0xe2, 0x75, 0x64, 0xb3, 0x75, 0xf9, 0x95, 0x7f,
+	0x3b, 0xdb, 0x58, 0x6f, 0x53, 0xcf, 0xa3, 0x64, 0x1d, 0xd9, 0x56, 0xd8, 0xf5, 0xb1, 0xe5, 0x90,
+	0x13, 0xca, 0xaa, 0x7e, 0x40, 0x43, 0x6a, 0x7c, 0x20, 0x0d, 0xab, 0xc8, 0x66, 0xd5, 0x04, 0x53,
+	0x3d, 0xdb, 0xa8, 0x4a, 0xcc, 0xda, 0x47, 0xe3, 0x39, 0x11, 0x63, 0x38, 0x94, 0x74, 0x6b, 0xdb,
+	0xa3, 0xcc, 0x31, 0x89, 0x3c, 0xb6, 0xde, 0x46, 0xae, 0x6b, 0xb5, 0x29, 0x39, 0xc3, 0x01, 0x73,
+	0x28, 0xb1, 0x02, 0xec, 0xd3, 0x20, 0x74, 0x48, 0xc7, 0x62, 0x21, 0x0a, 0xb1, 0x22, 0x79, 0x78,
+	0x39, 0x89, 0xed, 0x30, 0xdf, 0x45, 0x5d, 0x0b, 0xd9, 0xd6, 0x09, 0x0d, 0x3c, 0x14, 0x5a, 0x0c,
+	0x87, 0x9c, 0x44, 0xc1, 0x1f, 0xe9, 0xc1, 0x23, 0xdf, 0xa5, 0xc8, 0xb6, 0xfc, 0x80, 0xda, 0x51,
+	0x3b, 0x14, 0x33, 0xa3, 0xe7, 0x84, 0x8b, 0x3b, 0xa8, 0xdd, 0xb5, 0x90, 0xef, 0x5b, 0x0e, 0x61,
+	0x21, 0x77, 0x89, 0xcf, 0x82, 0xef, 0x5b, 0x2c, 0xa4, 0x41, 0x4c, 0xf2, 0xd1, 0xe5, 0x24, 0x9e,
+	0xe3, 0xe1, 0xf4, 0x33, 0xd5, 0x3a, 0xac, 0x8b, 0x5f, 0xad, 0xe8, 0x64, 0xfd, 0x6d, 0x80, 0x7c,
+	0x1f, 0x07, 0x6a, 0x9d, 0xd6, 0x6e, 0xc7, 0x74, 0xbe, 0xb3, 0x8e, 0x08, 0xa1, 0x21, 0x0a, 0x1d,
+	0x4a, 0xd4, 0x5d, 0xf3, 0xeb, 0x0c, 0xc0, 0x21, 0x3e, 0x0f, 0xeb, 0xf6, 0x2e, 0x39, 0xa1, 0xc6,
+	0x4f, 0x21, 0x7f, 0x8a, 0x91, 0xed, 0x3a, 0x04, 0x57, 0x32, 0x77, 0x32, 0x77, 0x8b, 0xb5, 0xdb,
+	0x6a, 0x71, 0xab, 0x31, 0x7f, 0xf5, 0x20, 0x0c, 0x1c, 0xd2, 0x39, 0x42, 0x6e, 0x84, 0x9b, 0x89,
+	0xb5, 0xf1, 0x33, 0x28, 0xd9, 0x98, 0xb5, 0x03, 0xc7, 0xe7, 0xf4, 0xf7, 0x2a, 0x59, 0x0d, 0x74,
+	0x1f, 0x62, 0x80, 0xa1, 0x56, 0xc9, 0x4d, 0xc8, 0x50, 0x33, 0xff, 0x96, 0x03, 0xe3, 0xf1, 0xb9,
+	0x8f, 0x88, 0x8d, 0xed, 0x94, 0x53, 0xdb, 0xb0, 0x18, 0x0f, 0xd3, 0xf2, 0x51, 0x10, 0xde, 0xd3,
+	0x72, 0xad, 0x1c, 0x63, 0xf6, 0x39, 0x64, 0x88, 0xa4, 0xa6, 0xe5, 0x61, 0x1f, 0x49, 0x6d, 0x88,
+	0x64, 0xa3, 0x32, 0x3f, 0x29, 0xc9, 0x86, 0xf1, 0x29, 0x14, 0x53, 0x5e, 0x6b, 0x4d, 0x53, 0x1a,
+	0x30, 0x34, 0xcf, 0x0b, 0x93, 0xce, 0xb3, 0x51, 0x83, 0x39, 0x1f, 0x85, 0xa7, 0xf7, 0x2a, 0xb3,
+	0x1a, 0x50, 0x69, 0x1a, 0x63, 0x6a, 0x95, 0x39, 0x5d, 0x4c, 0xcd, 0xfc, 0xf3, 0x02, 0x2c, 0x6e,
+	0x23, 0xd7, 0x7d, 0x41, 0xdc, 0xae, 0x5a, 0xcb, 0x47, 0x50, 0x6a, 0xd3, 0x88, 0x84, 0x41, 0xd7,
+	0x6a, 0x53, 0x5b, 0x2f, 0x48, 0x8b, 0x0a, 0xb1, 0x4d, 0x6d, 0xcc, 0x09, 0xfc, 0x53, 0x4a, 0xb0,
+	0x45, 0x22, 0xaf, 0x85, 0x03, 0xad, 0x55, 0x2c, 0x0a, 0xc4, 0x73, 0x01, 0x30, 0xea, 0x50, 0x6e,
+	0x45, 0xcc, 0x21, 0x98, 0x31, 0x8b, 0x20, 0x0f, 0xeb, 0xc5, 0x69, 0x0c, 0x79, 0x8e, 0x3c, 0x6c,
+	0x6c, 0x42, 0x21, 0x5e, 0xd2, 0x7b, 0x95, 0xa2, 0x06, 0xbc, 0x67, 0x9e, 0xc6, 0xd6, 0x2a, 0xa5,
+	0x49, 0xb0, 0xb5, 0xa1, 0x3d, 0x3a, 0x3b, 0xf5, 0x1e, 0x9d, 0x9b, 0x38, 0x76, 0x1e, 0x42, 0x49,
+	0x68, 0x79, 0x18, 0xa0, 0xf6, 0x1b, 0x6c, 0xab, 0x0d, 0xb0, 0x36, 0xc4, 0xb0, 0x45, 0xa9, 0x1b,
+	0x2f, 0x1f, 0x72, 0xdd, 0x43, 0x69, 0x6e, 0x34, 0xe1, 0xa6, 0xed, 0x30, 0xd4, 0x72, 0xb1, 0x35,
+	0x90, 0x12, 0x54, 0x1c, 0x5f, 0xc6, 0x74, 0x5d, 0x41, 0x79, 0x4c, 0x6d, 0x27, 0x40, 0xc3, 0x82,
+	0xf7, 0xd3, 0x21, 0x61, 0x9d, 0xe1, 0xc0, 0x39, 0x71, 0xda, 0x42, 0x27, 0xad, 0x28, 0x70, 0x2b,
+	0x79, 0x0d, 0x2f, 0xd7, 0x52, 0x31, 0x72, 0x94, 0x22, 0x78, 0x19, 0xb8, 0xc6, 0x2e, 0xac, 0xa4,
+	0x52, 0x17, 0x6a, 0x8b, 0x7d, 0x5b, 0xd0, 0x20, 0x5d, 0xee, 0xc1, 0xea, 0x02, 0x65, 0xfc, 0x3e,
+	0x03, 0x6b, 0xa3, 0xd3, 0x60, 0x05, 0xee, 0x64, 0xee, 0x2e, 0xd6, 0x8e, 0xab, 0xa3, 0x72, 0xb3,
+	0x48, 0x21, 0xd5, 0x7e, 0xff, 0x9b, 0x31, 0xc7, 0x01, 0xa7, 0x78, 0x4c, 0x22, 0xef, 0x52, 0x83,
+	0x66, 0xa5, 0x3d, 0xe2, 0x8e, 0xf9, 0xc7, 0x0c, 0xdc, 0x8a, 0xf5, 0x77, 0xa7, 0x4b, 0x90, 0xe7,
+	0xb4, 0x0f, 0x30, 0x0a, 0xda, 0xa7, 0x6a, 0xf3, 0x0e, 0x28, 0x57, 0x66, 0x5a, 0xe5, 0xca, 0x4e,
+	0x9c, 0x21, 0xca, 0x50, 0x6c, 0xd0, 0x10, 0xbb, 0x72, 0x40, 0xe6, 0x75, 0x58, 0x3d, 0x38, 0xa5,
+	0xbe, 0xcf, 0x3d, 0xf0, 0x50, 0xa0, 0x12, 0x86, 0x79, 0x13, 0xae, 0xc7, 0x97, 0xf7, 0x65, 0x92,
+	0x57, 0x37, 0x7e, 0x01, 0x1f, 0xc6, 0x37, 0xb6, 0xa9, 0xe7, 0xa3, 0xc0, 0x61, 0x94, 0xec, 0x39,
+	0x8c, 0x4f, 0xc1, 0xb4, 0x19, 0xd4, 0xfc, 0xeb, 0x1c, 0x14, 0x9f, 0x7a, 0xc8, 0x71, 0x93, 0xb4,
+	0x35, 0x1f, 0x62, 0xc4, 0x70, 0xa0, 0x78, 0x7e, 0x50, 0xbd, 0xbc, 0xe2, 0xaa, 0x0a, 0xf0, 0xa1,
+	0x80, 0x34, 0x15, 0x94, 0xcb, 0x1d, 0x7f, 0x00, 0x0e, 0x2c, 0xc7, 0x43, 0x1d, 0xac, 0x27, 0x77,
+	0x12, 0xb1, 0xcb, 0x01, 0xc6, 0x63, 0x58, 0xf2, 0x50, 0xf0, 0x06, 0x8b, 0x20, 0x93, 0x1c, 0x3a,
+	0x82, 0xb7, 0x98, 0x80, 0x24, 0xcd, 0x11, 0x54, 0x06, 0x68, 0xac, 0x64, 0x9a, 0x74, 0x64, 0xe8,
+	0x46, 0x3f, 0x5f, 0x23, 0x2e, 0x3b, 0x8e, 0xe1, 0xd6, 0x20, 0x6f, 0x3a, 0xc4, 0x74, 0xf4, 0xe9,
+	0xbd, 0x7e, 0xea, 0x9d, 0x54, 0xc0, 0xfd, 0x3a, 0x03, 0xdf, 0x1f, 0xa2, 0x57, 0x55, 0xa0, 0x54,
+	0x31, 0x1a, 0x6f, 0x67, 0xa9, 0x63, 0x1b, 0xe3, 0xd6, 0x68, 0x47, 0xa2, 0xf9, 0x06, 0x3b, 0xa4,
+	0x72, 0x4f, 0x37, 0xbf, 0x37, 0x30, 0x80, 0x61, 0x13, 0xe3, 0x00, 0x16, 0xe3, 0x72, 0x53, 0x8c,
+	0x82, 0x55, 0x16, 0xee, 0xe4, 0xee, 0x16, 0x6b, 0x3f, 0x1c, 0xf7, 0x3c, 0x15, 0xbf, 0x82, 0xb8,
+	0x59, 0xf6, 0x53, 0xbf, 0x58, 0x9a, 0xf4, 0xcc, 0xb1, 0x31, 0x65, 0x95, 0xfc, 0x44, 0xa4, 0x47,
+	0x1c, 0x94, 0x90, 0x8a, 0x5f, 0xcc, 0xfc, 0x4d, 0x56, 0x45, 0xb1, 0x0c, 0xc4, 0x29, 0x2a, 0xca,
+	0x01, 0xb5, 0xc8, 0x4e, 0xaa, 0x16, 0xdf, 0x41, 0xa2, 0x7e, 0x00, 0xe0, 0xd2, 0x0e, 0x55, 0x71,
+	0xaf, 0x13, 0xa7, 0x05, 0x6e, 0x2f, 0xe6, 0xd7, 0xfc, 0x7b, 0x06, 0x56, 0x2f, 0x5a, 0xcb, 0x1f,
+	0xc1, 0x6c, 0x88, 0xcf, 0x43, 0xad, 0xd9, 0x10, 0x96, 0x7c, 0x18, 0xfc, 0xd3, 0x6a, 0x53, 0x97,
+	0xea, 0x55, 0x2c, 0x05, 0x6e, 0xbf, 0xcd, 0xcd, 0x8d, 0x06, 0xac, 0x44, 0x01, 0x4f, 0x94, 0xae,
+	0x8b, 0xc5, 0x00, 0x2c, 0xc7, 0xd6, 0x9a, 0x8a, 0xa5, 0x28, 0x70, 0xb7, 0x13, 0xd4, 0xae, 0x6d,
+	0x7e, 0x9b, 0x81, 0x52, 0x3a, 0x9e, 0xf8, 0x0c, 0xf7, 0x45, 0xa5, 0x96, 0x4b, 0xa5, 0x74, 0x10,
+	0x4e, 0xbd, 0xc8, 0xa7, 0x70, 0x63, 0xc4, 0x86, 0xcc, 0x5d, 0x7d, 0x43, 0xae, 0xda, 0xc3, 0x17,
+	0xcd, 0xcf, 0x13, 0xe7, 0x45, 0xa4, 0xa7, 0x9d, 0x17, 0xbb, 0x67, 0x22, 0xe7, 0x05, 0x85, 0xf9,
+	0xc5, 0x3c, 0x14, 0xc5, 0x34, 0x28, 0xc5, 0xff, 0x04, 0x8a, 0xbe, 0x73, 0x8e, 0x5d, 0xeb, 0xad,
+	0x63, 0x87, 0xa7, 0x2a, 0xde, 0x6e, 0x0d, 0x11, 0xee, 0x92, 0xf0, 0x27, 0xf7, 0x25, 0x1f, 0x08,
+	0xfb, 0x57, 0xdc, 0xdc, 0xf8, 0x14, 0x4a, 0x12, 0x7d, 0x8a, 0x9d, 0xce, 0x69, 0xa8, 0xb4, 0xef,
+	0x52, 0xb8, 0x7c, 0x5c, 0x43, 0xd8, 0x1b, 0x1f, 0x43, 0x41, 0x2a, 0x1c, 0x2f, 0x79, 0x74, 0xce,
+	0x25, 0x79, 0x61, 0xce, 0x0b, 0x9c, 0xcf, 0x60, 0xd5, 0x0f, 0xf0, 0x99, 0x83, 0xdf, 0x5a, 0x69,
+	0x07, 0x16, 0xc6, 0x8f, 0x60, 0x45, 0xe1, 0xf6, 0x7b, 0x7e, 0x3c, 0x83, 0x6b, 0xfd, 0x64, 0xca,
+	0x9f, 0xfc, 0x78, 0x36, 0x23, 0xcd, 0xa6, 0xdc, 0x6a, 0x40, 0xfc, 0x0c, 0xab, 0xe7, 0x9e, 0x4e,
+	0xf1, 0xb5, 0xa4, 0x60, 0xbb, 0xb1, 0x97, 0x9f, 0x43, 0x21, 0x39, 0x7c, 0xab, 0x4a, 0xeb, 0xfe,
+	0x98, 0x4a, 0xeb, 0x99, 0xe3, 0xe1, 0xc3, 0xae, 0x2f, 0xab, 0xaa, 0xf8, 0x47, 0x33, 0xef, 0xa9,
+	0x6f, 0x5c, 0x0b, 0x84, 0x34, 0xe9, 0x1c, 0x02, 0x84, 0xa5, 0xf1, 0x10, 0xc0, 0xc3, 0xb6, 0x83,
+	0xac, 0x13, 0xc7, 0xd5, 0xda, 0x70, 0x8d, 0x99, 0x66, 0x41, 0x20, 0x9e, 0x38, 0x2e, 0x36, 0xee,
+	0xc1, 0xac, 0x8d, 0x42, 0xa4, 0x36, 0xda, 0xf0, 0x64, 0x6e, 0x75, 0x43, 0xcc, 0x62, 0x9c, 0x30,
+	0x35, 0x0e, 0xa1, 0x82, 0x6c, 0xcb, 0xb1, 0xf9, 0xde, 0x6a, 0x53, 0xbf, 0xab, 0xa6, 0xf1, 0x24,
+	0xa0, 0x9e, 0xda, 0x64, 0x97, 0xad, 0x49, 0x63, 0xa6, 0xb9, 0x8a, 0xec, 0x5d, 0xfb, 0x90, 0x6e,
+	0x53, 0xbf, 0x2b, 0xe6, 0xf2, 0x49, 0x40, 0xbd, 0xad, 0x05, 0x98, 0x13, 0x3c, 0xa6, 0x0d, 0xef,
+	0x89, 0xdd, 0xb0, 0x15, 0x79, 0x3e, 0x0e, 0x76, 0xc9, 0x41, 0x18, 0x60, 0xe4, 0xa9, 0x1d, 0xf1,
+	0x14, 0x96, 0xdb, 0xbc, 0xd0, 0x22, 0x5c, 0xb7, 0x5a, 0x88, 0x90, 0xa4, 0x1a, 0x1a, 0xb3, 0x76,
+	0x09, 0x6a, 0x4b, 0x80, 0xcc, 0x5f, 0xc2, 0x87, 0xe2, 0x29, 0xcf, 0x29, 0x39, 0x78, 0xe3, 0xf8,
+	0x3e, 0x3f, 0x06, 0xfc, 0xa7, 0x9e, 0xf5, 0x6d, 0x06, 0x6e, 0x89, 0x87, 0x1d, 0x06, 0x11, 0x3e,
+	0xe2, 0x11, 0xd4, 0xff, 0xa0, 0x3d, 0x58, 0x95, 0x1a, 0x65, 0xb5, 0xa2, 0x30, 0xa4, 0xc4, 0x72,
+	0x51, 0x0b, 0xbb, 0x5a, 0xcf, 0x5a, 0x91, 0xc0, 0x2d, 0x81, 0xdb, 0xe3, 0x30, 0x5e, 0xa0, 0x29,
+	0xb6, 0x24, 0xcf, 0xea, 0xa8, 0xe8, 0xa2, 0x04, 0x25, 0x85, 0xd4, 0x45, 0xde, 0xe7, 0xae, 0xe2,
+	0xfd, 0x6f, 0x33, 0x70, 0x4d, 0x78, 0xff, 0x22, 0x0a, 0x59, 0xda, 0xed, 0x77, 0x56, 0x09, 0x98,
+	0xdf, 0x64, 0xe0, 0x76, 0xdf, 0x82, 0xec, 0x38, 0xac, 0x4d, 0xcf, 0x70, 0xd0, 0xfd, 0xbf, 0x68,
+	0x7b, 0x7d, 0x35, 0x0b, 0x45, 0xe1, 0x9e, 0xf2, 0xe6, 0xc1, 0xa4, 0x12, 0x91, 0x16, 0x88, 0xd7,
+	0x50, 0x70, 0x88, 0x25, 0x17, 0x4e, 0x79, 0xf3, 0x60, 0x5c, 0x0e, 0xbd, 0x24, 0xd8, 0x1b, 0x33,
+	0xcd, 0xbc, 0xa3, 0xae, 0x18, 0x07, 0x30, 0xdf, 0x12, 0xbb, 0x5c, 0x39, 0xf9, 0xb1, 0x16, 0xf1,
+	0x45, 0xc2, 0xd0, 0x98, 0x69, 0x2a, 0x2a, 0xe3, 0x25, 0x00, 0x8d, 0xc2, 0x78, 0xc4, 0x32, 0x67,
+	0xde, 0xd7, 0x22, 0x1e, 0x08, 0x50, 0x2e, 0x94, 0x34, 0x0a, 0xd5, 0x58, 0x4f, 0xa0, 0x4c, 0x28,
+	0xb1, 0x58, 0x2c, 0x16, 0x2a, 0x9d, 0x3e, 0xd2, 0x62, 0x1e, 0xad, 0x32, 0x8d, 0x99, 0x66, 0x89,
+	0xa4, 0xee, 0x1a, 0xc7, 0x50, 0xb0, 0xe3, 0x68, 0x54, 0x59, 0xf7, 0x93, 0x89, 0xe6, 0x7b, 0x20,
+	0x96, 0xb9, 0x17, 0x09, 0xe1, 0x56, 0x1e, 0xe6, 0x65, 0xa7, 0xdb, 0xfc, 0x43, 0x16, 0x6e, 0x34,
+	0x31, 0xf3, 0x29, 0x61, 0xce, 0x19, 0xee, 0x3b, 0x96, 0xef, 0xf6, 0x5a, 0x4a, 0xac, 0x92, 0x11,
+	0x47, 0x80, 0xb1, 0x67, 0xcd, 0xba, 0x6c, 0xb0, 0x32, 0x86, 0xc3, 0x5e, 0x87, 0x89, 0x19, 0x2f,
+	0xfa, 0x82, 0x99, 0x55, 0xb2, 0x93, 0xb3, 0xf5, 0x11, 0xf4, 0x5a, 0x8d, 0xb9, 0x2b, 0xb4, 0x1a,
+	0x67, 0xf5, 0x5b, 0x8d, 0xdf, 0xe4, 0xe1, 0xfd, 0x3d, 0xd1, 0x9e, 0xef, 0x4d, 0x92, 0x2a, 0x0d,
+	0x7b, 0x5d, 0x64, 0x76, 0x4a, 0x83, 0xd0, 0x9a, 0x48, 0x29, 0xca, 0x02, 0x93, 0xa8, 0x6c, 0x1d,
+	0xca, 0x2e, 0x25, 0x9d, 0xc9, 0xa4, 0xba, 0xc4, 0x21, 0x8d, 0x11, 0x62, 0x98, 0x9b, 0xfa, 0x58,
+	0x34, 0x3b, 0xf1, 0xb1, 0x68, 0x0f, 0xae, 0x21, 0xd7, 0xa5, 0x6f, 0xad, 0x13, 0x17, 0x9f, 0x3b,
+	0xa2, 0x17, 0x27, 0x4e, 0x26, 0x73, 0x63, 0x3b, 0x70, 0x86, 0xc0, 0x3d, 0x51, 0x30, 0x79, 0x40,
+	0x79, 0x04, 0x25, 0xd4, 0x6e, 0x63, 0x12, 0x9f, 0x6f, 0x74, 0x4a, 0xcf, 0xa2, 0x44, 0x48, 0x02,
+	0xae, 0x77, 0xc8, 0x21, 0x0a, 0xbe, 0xa0, 0xa5, 0x77, 0xc8, 0x21, 0x12, 0xfc, 0x19, 0xac, 0xf6,
+	0x1f, 0x1c, 0x2c, 0x71, 0x38, 0xcb, 0x6b, 0x75, 0xe7, 0x52, 0xe7, 0x83, 0x43, 0x75, 0x50, 0x4b,
+	0x9d, 0x17, 0x0b, 0x13, 0x9d, 0x17, 0x79, 0xa1, 0xca, 0x7e, 0x15, 0xa1, 0x00, 0x5b, 0x29, 0x0e,
+	0xd0, 0x49, 0xc1, 0x12, 0xb6, 0x97, 0x30, 0x5d, 0xd0, 0xb3, 0x29, 0x5e, 0xa1, 0x67, 0xd3, 0x84,
+	0x1b, 0x6a, 0x40, 0x83, 0x6c, 0x3a, 0x7d, 0xe7, 0x6b, 0x12, 0xfb, 0xac, 0x9f, 0xf3, 0x2d, 0x2c,
+	0xf6, 0xbf, 0x7a, 0xab, 0x94, 0x45, 0x21, 0xbd, 0x3f, 0xa6, 0x90, 0x4e, 0xf6, 0xe2, 0x13, 0x81,
+	0x3e, 0x90, 0x60, 0x51, 0x56, 0x5f, 0x7c, 0xab, 0x59, 0x3e, 0x49, 0xff, 0x14, 0x7d, 0xff, 0xc0,
+	0x69, 0x63, 0xcb, 0x0f, 0xf0, 0x89, 0x73, 0x5e, 0x59, 0xd4, 0xea, 0xfb, 0x73, 0xc4, 0xbe, 0x00,
+	0xf0, 0xb5, 0xf5, 0x03, 0xea, 0x51, 0x19, 0x1f, 0x4b, 0x3a, 0x6b, 0x2b, 0xec, 0x79, 0x60, 0x98,
+	0xff, 0xca, 0x41, 0xa1, 0xee, 0xfb, 0x4a, 0x4a, 0x5e, 0xc1, 0x8a, 0x87, 0x88, 0x8d, 0x42, 0x1a,
+	0x88, 0x97, 0x91, 0xa9, 0x76, 0xc0, 0x44, 0x52, 0xb9, 0x94, 0xb0, 0xc8, 0xab, 0xfd, 0x4a, 0x9e,
+	0xfd, 0x4e, 0x95, 0x3c, 0x37, 0xad, 0x92, 0xef, 0xc0, 0xbc, 0x6a, 0x5d, 0xcd, 0xea, 0x75, 0x99,
+	0xea, 0xb6, 0x3c, 0x1b, 0x0b, 0x2e, 0x85, 0x35, 0x0e, 0x60, 0xb1, 0x4b, 0xa3, 0x30, 0x6a, 0xe1,
+	0xb8, 0x67, 0x35, 0xa7, 0xcb, 0x26, 0x4b, 0x24, 0xc1, 0x56, 0x56, 0x1c, 0xb2, 0x67, 0x65, 0xb4,
+	0x60, 0xf5, 0x34, 0xf4, 0xdc, 0x1f, 0x5b, 0xb2, 0x6c, 0x6a, 0x45, 0xc4, 0x76, 0x31, 0xab, 0xcc,
+	0x0b, 0xe6, 0xda, 0x78, 0xe6, 0x67, 0x1c, 0xb6, 0x25, 0x50, 0x92, 0x7f, 0x45, 0xd0, 0xa5, 0x2e,
+	0x33, 0xf3, 0x2f, 0x59, 0x58, 0xad, 0xfb, 0xfe, 0x63, 0xd2, 0x41, 0x1d, 0xec, 0x61, 0x12, 0xfe,
+	0x0f, 0x24, 0xdf, 0xde, 0x92, 0xe5, 0xa6, 0x58, 0xb2, 0x1d, 0x98, 0x57, 0x4b, 0x35, 0x7b, 0x85,
+	0xa5, 0x52, 0x58, 0xf3, 0x8b, 0x1c, 0xdc, 0x90, 0x09, 0xba, 0xee, 0xfb, 0xbb, 0xf2, 0xed, 0xb9,
+	0x9a, 0xc2, 0x0d, 0x98, 0x17, 0xaf, 0xd4, 0x6d, 0xad, 0x8c, 0x3c, 0x87, 0x7c, 0x7f, 0xd7, 0x36,
+	0x22, 0x28, 0x24, 0x2f, 0xde, 0x45, 0x16, 0x5e, 0xac, 0xfd, 0x7c, 0x8c, 0x06, 0x0d, 0x3f, 0xbe,
+	0xee, 0xfb, 0x07, 0x9c, 0x40, 0xe8, 0xd0, 0xe8, 0xdb, 0xcd, 0x3c, 0x52, 0xdf, 0xfa, 0x4e, 0x1a,
+	0xb9, 0xa9, 0x4e, 0x1a, 0xef, 0xe0, 0xe5, 0x9d, 0xf9, 0x3b, 0x80, 0x9b, 0xa3, 0xea, 0xa3, 0x57,
+	0xb0, 0x3c, 0x90, 0x26, 0xe2, 0x78, 0x9e, 0x2c, 0x6c, 0x96, 0xfa, 0xb3, 0x10, 0x33, 0x6c, 0xb8,
+	0x79, 0x71, 0x1a, 0x8a, 0x23, 0x7c, 0x32, 0xfe, 0xeb, 0x17, 0xe5, 0x25, 0x66, 0x3c, 0x83, 0x62,
+	0x2f, 0xed, 0x5e, 0x2d, 0xe0, 0x21, 0xc9, 0xe5, 0xcc, 0x78, 0x0d, 0xc6, 0x50, 0x32, 0xbf, 0x9a,
+	0xf2, 0x2d, 0x0f, 0x64, 0x77, 0xd6, 0x2f, 0x19, 0x73, 0x53, 0x49, 0xc6, 0xfe, 0x60, 0x3d, 0x3a,
+	0x3f, 0x79, 0x16, 0xea, 0x2f, 0x4f, 0x07, 0x45, 0x68, 0x61, 0x5a, 0x11, 0x1a, 0x56, 0xfc, 0xfc,
+	0xf4, 0x8a, 0x3f, 0x54, 0x04, 0x17, 0xae, 0xf2, 0x6e, 0x20, 0x55, 0x75, 0xc2, 0x64, 0x55, 0xe7,
+	0x60, 0xcd, 0x5b, 0x9c, 0xb4, 0xe6, 0x1d, 0x55, 0x82, 0x97, 0xae, 0x54, 0x82, 0x8f, 0x28, 0x82,
+	0xcb, 0x57, 0x2a, 0x82, 0xdf, 0x69, 0xa5, 0x75, 0x41, 0x81, 0xb9, 0xfc, 0x5f, 0x29, 0x30, 0xcd,
+	0x2f, 0xb3, 0xc9, 0xeb, 0x9e, 0x97, 0xe2, 0x0f, 0x62, 0x4a, 0x17, 0xbf, 0xcc, 0xc0, 0xad, 0x4b,
+	0xfe, 0x39, 0x26, 0x72, 0xd6, 0x62, 0xed, 0x50, 0x6f, 0x78, 0x92, 0x59, 0xbd, 0x87, 0x48, 0x1a,
+	0xcb, 0xa3, 0x6e, 0x36, 0x2b, 0xf6, 0x88, 0x3b, 0xc6, 0x2b, 0x28, 0xa5, 0x8b, 0x1d, 0x75, 0x0e,
+	0xbd, 0x42, 0xad, 0xd3, 0x98, 0x69, 0x16, 0xbd, 0xde, 0xb5, 0xad, 0x32, 0xc8, 0x9f, 0xf2, 0xcf,
+	0x7d, 0x5b, 0xff, 0xcc, 0x80, 0xd9, 0xa6, 0xde, 0x18, 0xde, 0xad, 0xe5, 0xba, 0xcd, 0x87, 0xc5,
+	0x27, 0x8c, 0xed, 0xf3, 0x15, 0xde, 0xcf, 0xbc, 0xde, 0x51, 0x98, 0x0e, 0x75, 0x11, 0xe9, 0x54,
+	0x69, 0xd0, 0x59, 0xef, 0x60, 0x22, 0xd6, 0x3f, 0xfe, 0x5f, 0x9c, 0xef, 0xb0, 0x51, 0xff, 0x2f,
+	0x7c, 0x20, 0x3f, 0xbe, 0xca, 0xe6, 0x9e, 0xd6, 0xeb, 0x7f, 0xca, 0x7e, 0xf0, 0x54, 0x92, 0xd5,
+	0x6d, 0x56, 0x95, 0x5f, 0xf9, 0xb7, 0xa3, 0x8d, 0xea, 0xb6, 0x30, 0xfb, 0x3a, 0x36, 0x38, 0xae,
+	0xdb, 0xec, 0x38, 0x31, 0x38, 0x3e, 0xda, 0x38, 0x96, 0x06, 0xff, 0xc8, 0x9a, 0xf2, 0xea, 0xe6,
+	0x66, 0xdd, 0x66, 0x9b, 0x9b, 0x89, 0xc9, 0xe6, 0xe6, 0xd1, 0xc6, 0xe6, 0xa6, 0x34, 0x6a, 0xcd,
+	0x8b, 0xd1, 0x6d, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xe2, 0x9b, 0x33, 0x5b, 0x50, 0x29, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/asset_types.pb.go b/googleapis/ads/googleads/v3/common/asset_types.pb.go
new file mode 100644
index 0000000..3eebfe9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/asset_types.pb.go
@@ -0,0 +1,329 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/asset_types.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A YouTube asset.
+type YoutubeVideoAsset struct {
+	// YouTube video id. This is the 11 character string value used in the
+	// YouTube video URL.
+	YoutubeVideoId       *wrappers.StringValue `protobuf:"bytes,1,opt,name=youtube_video_id,json=youtubeVideoId,proto3" json:"youtube_video_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *YoutubeVideoAsset) Reset()         { *m = YoutubeVideoAsset{} }
+func (m *YoutubeVideoAsset) String() string { return proto.CompactTextString(m) }
+func (*YoutubeVideoAsset) ProtoMessage()    {}
+func (*YoutubeVideoAsset) Descriptor() ([]byte, []int) {
+	return fileDescriptor_07f28a97711f0ef9, []int{0}
+}
+
+func (m *YoutubeVideoAsset) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_YoutubeVideoAsset.Unmarshal(m, b)
+}
+func (m *YoutubeVideoAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_YoutubeVideoAsset.Marshal(b, m, deterministic)
+}
+func (m *YoutubeVideoAsset) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_YoutubeVideoAsset.Merge(m, src)
+}
+func (m *YoutubeVideoAsset) XXX_Size() int {
+	return xxx_messageInfo_YoutubeVideoAsset.Size(m)
+}
+func (m *YoutubeVideoAsset) XXX_DiscardUnknown() {
+	xxx_messageInfo_YoutubeVideoAsset.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_YoutubeVideoAsset proto.InternalMessageInfo
+
+func (m *YoutubeVideoAsset) GetYoutubeVideoId() *wrappers.StringValue {
+	if m != nil {
+		return m.YoutubeVideoId
+	}
+	return nil
+}
+
+// A MediaBundle asset.
+type MediaBundleAsset struct {
+	// Media bundle (ZIP file) asset data. The format of the uploaded ZIP file
+	// depends on the ad field where it will be used. For more information on the
+	// format, see the documentation of the ad field where you plan on using the
+	// MediaBundleAsset. This field is mutate only.
+	Data                 *wrappers.BytesValue `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *MediaBundleAsset) Reset()         { *m = MediaBundleAsset{} }
+func (m *MediaBundleAsset) String() string { return proto.CompactTextString(m) }
+func (*MediaBundleAsset) ProtoMessage()    {}
+func (*MediaBundleAsset) Descriptor() ([]byte, []int) {
+	return fileDescriptor_07f28a97711f0ef9, []int{1}
+}
+
+func (m *MediaBundleAsset) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaBundleAsset.Unmarshal(m, b)
+}
+func (m *MediaBundleAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaBundleAsset.Marshal(b, m, deterministic)
+}
+func (m *MediaBundleAsset) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaBundleAsset.Merge(m, src)
+}
+func (m *MediaBundleAsset) XXX_Size() int {
+	return xxx_messageInfo_MediaBundleAsset.Size(m)
+}
+func (m *MediaBundleAsset) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaBundleAsset.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaBundleAsset proto.InternalMessageInfo
+
+func (m *MediaBundleAsset) GetData() *wrappers.BytesValue {
+	if m != nil {
+		return m.Data
+	}
+	return nil
+}
+
+// An Image asset.
+type ImageAsset struct {
+	// The raw bytes data of an image. This field is mutate only.
+	Data *wrappers.BytesValue `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
+	// File size of the image asset in bytes.
+	FileSize *wrappers.Int64Value `protobuf:"bytes,2,opt,name=file_size,json=fileSize,proto3" json:"file_size,omitempty"`
+	// MIME type of the image asset.
+	MimeType enums.MimeTypeEnum_MimeType `protobuf:"varint,3,opt,name=mime_type,json=mimeType,proto3,enum=google.ads.googleads.v3.enums.MimeTypeEnum_MimeType" json:"mime_type,omitempty"`
+	// Metadata for this image at its original size.
+	FullSize             *ImageDimension `protobuf:"bytes,4,opt,name=full_size,json=fullSize,proto3" json:"full_size,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *ImageAsset) Reset()         { *m = ImageAsset{} }
+func (m *ImageAsset) String() string { return proto.CompactTextString(m) }
+func (*ImageAsset) ProtoMessage()    {}
+func (*ImageAsset) Descriptor() ([]byte, []int) {
+	return fileDescriptor_07f28a97711f0ef9, []int{2}
+}
+
+func (m *ImageAsset) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageAsset.Unmarshal(m, b)
+}
+func (m *ImageAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageAsset.Marshal(b, m, deterministic)
+}
+func (m *ImageAsset) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageAsset.Merge(m, src)
+}
+func (m *ImageAsset) XXX_Size() int {
+	return xxx_messageInfo_ImageAsset.Size(m)
+}
+func (m *ImageAsset) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageAsset.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageAsset proto.InternalMessageInfo
+
+func (m *ImageAsset) GetData() *wrappers.BytesValue {
+	if m != nil {
+		return m.Data
+	}
+	return nil
+}
+
+func (m *ImageAsset) GetFileSize() *wrappers.Int64Value {
+	if m != nil {
+		return m.FileSize
+	}
+	return nil
+}
+
+func (m *ImageAsset) GetMimeType() enums.MimeTypeEnum_MimeType {
+	if m != nil {
+		return m.MimeType
+	}
+	return enums.MimeTypeEnum_UNSPECIFIED
+}
+
+func (m *ImageAsset) GetFullSize() *ImageDimension {
+	if m != nil {
+		return m.FullSize
+	}
+	return nil
+}
+
+// Metadata for an image at a certain size, either original or resized.
+type ImageDimension struct {
+	// Height of the image.
+	HeightPixels *wrappers.Int64Value `protobuf:"bytes,1,opt,name=height_pixels,json=heightPixels,proto3" json:"height_pixels,omitempty"`
+	// Width of the image.
+	WidthPixels *wrappers.Int64Value `protobuf:"bytes,2,opt,name=width_pixels,json=widthPixels,proto3" json:"width_pixels,omitempty"`
+	// A URL that returns the image with this height and width.
+	Url                  *wrappers.StringValue `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ImageDimension) Reset()         { *m = ImageDimension{} }
+func (m *ImageDimension) String() string { return proto.CompactTextString(m) }
+func (*ImageDimension) ProtoMessage()    {}
+func (*ImageDimension) Descriptor() ([]byte, []int) {
+	return fileDescriptor_07f28a97711f0ef9, []int{3}
+}
+
+func (m *ImageDimension) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageDimension.Unmarshal(m, b)
+}
+func (m *ImageDimension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageDimension.Marshal(b, m, deterministic)
+}
+func (m *ImageDimension) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageDimension.Merge(m, src)
+}
+func (m *ImageDimension) XXX_Size() int {
+	return xxx_messageInfo_ImageDimension.Size(m)
+}
+func (m *ImageDimension) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageDimension.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageDimension proto.InternalMessageInfo
+
+func (m *ImageDimension) GetHeightPixels() *wrappers.Int64Value {
+	if m != nil {
+		return m.HeightPixels
+	}
+	return nil
+}
+
+func (m *ImageDimension) GetWidthPixels() *wrappers.Int64Value {
+	if m != nil {
+		return m.WidthPixels
+	}
+	return nil
+}
+
+func (m *ImageDimension) GetUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.Url
+	}
+	return nil
+}
+
+// A Text asset.
+type TextAsset struct {
+	// Text content of the text asset.
+	Text                 *wrappers.StringValue `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *TextAsset) Reset()         { *m = TextAsset{} }
+func (m *TextAsset) String() string { return proto.CompactTextString(m) }
+func (*TextAsset) ProtoMessage()    {}
+func (*TextAsset) Descriptor() ([]byte, []int) {
+	return fileDescriptor_07f28a97711f0ef9, []int{4}
+}
+
+func (m *TextAsset) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TextAsset.Unmarshal(m, b)
+}
+func (m *TextAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TextAsset.Marshal(b, m, deterministic)
+}
+func (m *TextAsset) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TextAsset.Merge(m, src)
+}
+func (m *TextAsset) XXX_Size() int {
+	return xxx_messageInfo_TextAsset.Size(m)
+}
+func (m *TextAsset) XXX_DiscardUnknown() {
+	xxx_messageInfo_TextAsset.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TextAsset proto.InternalMessageInfo
+
+func (m *TextAsset) GetText() *wrappers.StringValue {
+	if m != nil {
+		return m.Text
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*YoutubeVideoAsset)(nil), "google.ads.googleads.v3.common.YoutubeVideoAsset")
+	proto.RegisterType((*MediaBundleAsset)(nil), "google.ads.googleads.v3.common.MediaBundleAsset")
+	proto.RegisterType((*ImageAsset)(nil), "google.ads.googleads.v3.common.ImageAsset")
+	proto.RegisterType((*ImageDimension)(nil), "google.ads.googleads.v3.common.ImageDimension")
+	proto.RegisterType((*TextAsset)(nil), "google.ads.googleads.v3.common.TextAsset")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/asset_types.proto", fileDescriptor_07f28a97711f0ef9)
+}
+
+var fileDescriptor_07f28a97711f0ef9 = []byte{
+	// 537 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0x41, 0x6b, 0xdb, 0x30,
+	0x14, 0xc7, 0x71, 0x12, 0x46, 0xa2, 0x76, 0x59, 0xe7, 0x53, 0xc8, 0x4a, 0x29, 0x3e, 0xf5, 0x32,
+	0xb9, 0xd4, 0x65, 0x0c, 0x8f, 0x8d, 0x39, 0xed, 0x56, 0xc2, 0x28, 0x64, 0x69, 0x09, 0x6c, 0x0b,
+	0x04, 0xa5, 0x7a, 0x71, 0x04, 0x96, 0x64, 0x2c, 0x39, 0x4d, 0xfa, 0x45, 0x76, 0xdf, 0x71, 0x1f,
+	0x63, 0xc7, 0x7d, 0x94, 0x7e, 0x8a, 0x61, 0xc9, 0x09, 0x1d, 0xc3, 0x6b, 0xe9, 0xc9, 0xcf, 0xd2,
+	0xff, 0xff, 0xd3, 0xd3, 0x7b, 0x4f, 0xe8, 0x30, 0x96, 0x32, 0x4e, 0xc0, 0x27, 0x54, 0xf9, 0x36,
+	0x2c, 0xa2, 0x45, 0xe0, 0x5f, 0x49, 0xce, 0xa5, 0xf0, 0x89, 0x52, 0xa0, 0x27, 0x7a, 0x95, 0x82,
+	0xc2, 0x69, 0x26, 0xb5, 0x74, 0xf7, 0xac, 0x0c, 0x13, 0xaa, 0xf0, 0xc6, 0x81, 0x17, 0x01, 0xb6,
+	0x8e, 0xee, 0xcb, 0x2a, 0x22, 0x88, 0x9c, 0x2b, 0x9f, 0x33, 0x0e, 0x86, 0x67, 0x71, 0xdd, 0x12,
+	0xe7, 0x9b, 0xbf, 0x69, 0x3e, 0xf3, 0xaf, 0x33, 0x92, 0xa6, 0x90, 0x95, 0xc7, 0x75, 0x77, 0xd7,
+	0xb8, 0x94, 0xf9, 0x44, 0x08, 0xa9, 0x89, 0x66, 0x52, 0x94, 0xbb, 0xde, 0x37, 0xf4, 0xfc, 0x8b,
+	0xcc, 0x75, 0x3e, 0x85, 0x11, 0xa3, 0x20, 0xa3, 0x22, 0x5b, 0xf7, 0x23, 0xda, 0x59, 0xd9, 0xc5,
+	0xc9, 0xa2, 0x58, 0x9d, 0x30, 0xda, 0x71, 0xf6, 0x9d, 0x83, 0xad, 0xa3, 0xdd, 0x32, 0x63, 0xbc,
+	0x3e, 0x0d, 0x5f, 0xe8, 0x8c, 0x89, 0x78, 0x44, 0x92, 0x1c, 0x86, 0xed, 0xd5, 0x1d, 0x54, 0x9f,
+	0x7a, 0x27, 0x68, 0xe7, 0x1c, 0x28, 0x23, 0xbd, 0x5c, 0xd0, 0x04, 0x2c, 0xdb, 0x47, 0x0d, 0x4a,
+	0x34, 0x29, 0x79, 0x2f, 0xfe, 0xe1, 0xf5, 0x56, 0x1a, 0x94, 0xc5, 0x19, 0xa1, 0xf7, 0xbd, 0x86,
+	0x50, 0x9f, 0x93, 0xf8, 0x91, 0x7e, 0xf7, 0x35, 0x6a, 0xcd, 0x58, 0x02, 0x13, 0xc5, 0x6e, 0xa0,
+	0x53, 0xab, 0x70, 0xf5, 0x85, 0x7e, 0x75, 0x6c, 0x5d, 0xcd, 0x42, 0x7d, 0xc1, 0x6e, 0xc0, 0xfd,
+	0x8c, 0x5a, 0x9b, 0x62, 0x77, 0xea, 0xfb, 0xce, 0x41, 0xfb, 0xe8, 0x18, 0x57, 0x35, 0xcf, 0x34,
+	0x07, 0x9f, 0x33, 0x0e, 0x97, 0xab, 0x14, 0x3e, 0x88, 0x9c, 0x6f, 0x7e, 0x86, 0x4d, 0x5e, 0x46,
+	0xee, 0x27, 0xd4, 0x9a, 0xe5, 0x49, 0x62, 0x93, 0x69, 0x98, 0x64, 0x30, 0xfe, 0xff, 0x3c, 0x60,
+	0x73, 0xf9, 0x53, 0xc6, 0x41, 0x28, 0x26, 0xc5, 0xb0, 0x59, 0x00, 0x8a, 0xfc, 0xbc, 0x5f, 0x0e,
+	0x6a, 0xff, 0xbd, 0xe9, 0xbe, 0x47, 0x4f, 0xe7, 0xc0, 0xe2, 0xb9, 0x9e, 0xa4, 0x6c, 0x09, 0x89,
+	0xaa, 0x2c, 0xd3, 0x9d, 0x0b, 0x6f, 0x5b, 0xc7, 0xc0, 0x18, 0xdc, 0x77, 0x68, 0xfb, 0x9a, 0x51,
+	0x3d, 0x5f, 0x03, 0x1e, 0x50, 0xb1, 0x2d, 0x63, 0x28, 0xfd, 0x18, 0xd5, 0xf3, 0x2c, 0x31, 0xe5,
+	0xba, 0x6f, 0x5c, 0x0a, 0xa1, 0xf7, 0x16, 0xb5, 0x2e, 0x61, 0xa9, 0x6d, 0x73, 0x0f, 0x51, 0x43,
+	0xc3, 0x52, 0x3f, 0x68, 0xd8, 0x8c, 0xb2, 0x77, 0xeb, 0x20, 0xef, 0x4a, 0xf2, 0x7b, 0x6a, 0xd8,
+	0x7b, 0x66, 0xf8, 0x45, 0x0b, 0xd4, 0xa0, 0x80, 0x0d, 0x9c, 0xaf, 0xa7, 0xa5, 0x25, 0x96, 0x09,
+	0x11, 0x31, 0x96, 0x59, 0xec, 0xc7, 0x20, 0xcc, 0x51, 0xeb, 0x67, 0x97, 0x32, 0x55, 0xf5, 0xae,
+	0xdf, 0xd8, 0xcf, 0x8f, 0x5a, 0xfd, 0x2c, 0x8a, 0x7e, 0xd6, 0xf6, 0xce, 0x2c, 0x2c, 0xa2, 0x0a,
+	0xdb, 0xb0, 0x88, 0x46, 0x01, 0x3e, 0x31, 0xb2, 0xdf, 0x6b, 0xc1, 0x38, 0xa2, 0x6a, 0xbc, 0x11,
+	0x8c, 0x47, 0xc1, 0xd8, 0x0a, 0x6e, 0x6b, 0x9e, 0x5d, 0x0d, 0xc3, 0x88, 0xaa, 0x30, 0xdc, 0x48,
+	0xc2, 0x70, 0x14, 0x84, 0xa1, 0x15, 0x4d, 0x9f, 0x98, 0xec, 0x82, 0x3f, 0x01, 0x00, 0x00, 0xff,
+	0xff, 0xe2, 0xdf, 0xa9, 0x26, 0x74, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/bidding.pb.go b/googleapis/ads/googleads/v3/common/bidding.pb.go
new file mode 100644
index 0000000..d27185b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/bidding.pb.go
@@ -0,0 +1,691 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/bidding.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Commission is an automatic bidding strategy in which the advertiser pays a
+// certain portion of the conversion value.
+type Commission struct {
+	// Commission rate defines the portion of the conversion value that the
+	// advertiser will be billed. A commission rate of x should be passed into
+	// this field as (x * 1,000,000). For example, 106,000 represents a commission
+	// rate of 0.106 (10.6%).
+	CommissionRateMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=commission_rate_micros,json=commissionRateMicros,proto3" json:"commission_rate_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *Commission) Reset()         { *m = Commission{} }
+func (m *Commission) String() string { return proto.CompactTextString(m) }
+func (*Commission) ProtoMessage()    {}
+func (*Commission) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{0}
+}
+
+func (m *Commission) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Commission.Unmarshal(m, b)
+}
+func (m *Commission) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Commission.Marshal(b, m, deterministic)
+}
+func (m *Commission) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Commission.Merge(m, src)
+}
+func (m *Commission) XXX_Size() int {
+	return xxx_messageInfo_Commission.Size(m)
+}
+func (m *Commission) XXX_DiscardUnknown() {
+	xxx_messageInfo_Commission.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Commission proto.InternalMessageInfo
+
+func (m *Commission) GetCommissionRateMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CommissionRateMicros
+	}
+	return nil
+}
+
+// An automated bidding strategy that raises bids for clicks
+// that seem more likely to lead to a conversion and lowers
+// them for clicks where they seem less likely.
+type EnhancedCpc struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EnhancedCpc) Reset()         { *m = EnhancedCpc{} }
+func (m *EnhancedCpc) String() string { return proto.CompactTextString(m) }
+func (*EnhancedCpc) ProtoMessage()    {}
+func (*EnhancedCpc) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{1}
+}
+
+func (m *EnhancedCpc) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EnhancedCpc.Unmarshal(m, b)
+}
+func (m *EnhancedCpc) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EnhancedCpc.Marshal(b, m, deterministic)
+}
+func (m *EnhancedCpc) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EnhancedCpc.Merge(m, src)
+}
+func (m *EnhancedCpc) XXX_Size() int {
+	return xxx_messageInfo_EnhancedCpc.Size(m)
+}
+func (m *EnhancedCpc) XXX_DiscardUnknown() {
+	xxx_messageInfo_EnhancedCpc.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EnhancedCpc proto.InternalMessageInfo
+
+// Manual click-based bidding where user pays per click.
+type ManualCpc struct {
+	// Whether bids are to be enhanced based on conversion optimizer data.
+	EnhancedCpcEnabled   *wrappers.BoolValue `protobuf:"bytes,1,opt,name=enhanced_cpc_enabled,json=enhancedCpcEnabled,proto3" json:"enhanced_cpc_enabled,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *ManualCpc) Reset()         { *m = ManualCpc{} }
+func (m *ManualCpc) String() string { return proto.CompactTextString(m) }
+func (*ManualCpc) ProtoMessage()    {}
+func (*ManualCpc) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{2}
+}
+
+func (m *ManualCpc) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ManualCpc.Unmarshal(m, b)
+}
+func (m *ManualCpc) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ManualCpc.Marshal(b, m, deterministic)
+}
+func (m *ManualCpc) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ManualCpc.Merge(m, src)
+}
+func (m *ManualCpc) XXX_Size() int {
+	return xxx_messageInfo_ManualCpc.Size(m)
+}
+func (m *ManualCpc) XXX_DiscardUnknown() {
+	xxx_messageInfo_ManualCpc.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ManualCpc proto.InternalMessageInfo
+
+func (m *ManualCpc) GetEnhancedCpcEnabled() *wrappers.BoolValue {
+	if m != nil {
+		return m.EnhancedCpcEnabled
+	}
+	return nil
+}
+
+// Manual impression-based bidding where user pays per thousand impressions.
+type ManualCpm struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ManualCpm) Reset()         { *m = ManualCpm{} }
+func (m *ManualCpm) String() string { return proto.CompactTextString(m) }
+func (*ManualCpm) ProtoMessage()    {}
+func (*ManualCpm) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{3}
+}
+
+func (m *ManualCpm) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ManualCpm.Unmarshal(m, b)
+}
+func (m *ManualCpm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ManualCpm.Marshal(b, m, deterministic)
+}
+func (m *ManualCpm) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ManualCpm.Merge(m, src)
+}
+func (m *ManualCpm) XXX_Size() int {
+	return xxx_messageInfo_ManualCpm.Size(m)
+}
+func (m *ManualCpm) XXX_DiscardUnknown() {
+	xxx_messageInfo_ManualCpm.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ManualCpm proto.InternalMessageInfo
+
+// View based bidding where user pays per video view.
+type ManualCpv struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ManualCpv) Reset()         { *m = ManualCpv{} }
+func (m *ManualCpv) String() string { return proto.CompactTextString(m) }
+func (*ManualCpv) ProtoMessage()    {}
+func (*ManualCpv) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{4}
+}
+
+func (m *ManualCpv) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ManualCpv.Unmarshal(m, b)
+}
+func (m *ManualCpv) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ManualCpv.Marshal(b, m, deterministic)
+}
+func (m *ManualCpv) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ManualCpv.Merge(m, src)
+}
+func (m *ManualCpv) XXX_Size() int {
+	return xxx_messageInfo_ManualCpv.Size(m)
+}
+func (m *ManualCpv) XXX_DiscardUnknown() {
+	xxx_messageInfo_ManualCpv.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ManualCpv proto.InternalMessageInfo
+
+// An automated bidding strategy that sets bids to help get the most conversions
+// for your campaign while spending your budget.
+type MaximizeConversions struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MaximizeConversions) Reset()         { *m = MaximizeConversions{} }
+func (m *MaximizeConversions) String() string { return proto.CompactTextString(m) }
+func (*MaximizeConversions) ProtoMessage()    {}
+func (*MaximizeConversions) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{5}
+}
+
+func (m *MaximizeConversions) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaximizeConversions.Unmarshal(m, b)
+}
+func (m *MaximizeConversions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaximizeConversions.Marshal(b, m, deterministic)
+}
+func (m *MaximizeConversions) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaximizeConversions.Merge(m, src)
+}
+func (m *MaximizeConversions) XXX_Size() int {
+	return xxx_messageInfo_MaximizeConversions.Size(m)
+}
+func (m *MaximizeConversions) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaximizeConversions.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaximizeConversions proto.InternalMessageInfo
+
+// An automated bidding strategy which tries to maximize conversion value
+// given a daily budget.
+type MaximizeConversionValue struct {
+	// The target return on ad spend (ROAS) option. If set, the bid strategy will
+	// maximize revenue while averaging the target return on ad spend. If the
+	// target ROAS is high, the bid strategy may not be able to spend the full
+	// budget. If the target ROAS is not set, the bid strategy will aim to
+	// achieve the highest possible ROAS for the budget.
+	TargetRoas           *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=target_roas,json=targetRoas,proto3" json:"target_roas,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *MaximizeConversionValue) Reset()         { *m = MaximizeConversionValue{} }
+func (m *MaximizeConversionValue) String() string { return proto.CompactTextString(m) }
+func (*MaximizeConversionValue) ProtoMessage()    {}
+func (*MaximizeConversionValue) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{6}
+}
+
+func (m *MaximizeConversionValue) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaximizeConversionValue.Unmarshal(m, b)
+}
+func (m *MaximizeConversionValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaximizeConversionValue.Marshal(b, m, deterministic)
+}
+func (m *MaximizeConversionValue) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaximizeConversionValue.Merge(m, src)
+}
+func (m *MaximizeConversionValue) XXX_Size() int {
+	return xxx_messageInfo_MaximizeConversionValue.Size(m)
+}
+func (m *MaximizeConversionValue) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaximizeConversionValue.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaximizeConversionValue proto.InternalMessageInfo
+
+func (m *MaximizeConversionValue) GetTargetRoas() *wrappers.DoubleValue {
+	if m != nil {
+		return m.TargetRoas
+	}
+	return nil
+}
+
+// An automated bid strategy that sets bids to help get as many conversions as
+// possible at the target cost-per-acquisition (CPA) you set.
+type TargetCpa struct {
+	// Average CPA target.
+	// This target should be greater than or equal to minimum billable unit based
+	// on the currency for the account.
+	TargetCpaMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=target_cpa_micros,json=targetCpaMicros,proto3" json:"target_cpa_micros,omitempty"`
+	// Maximum bid limit that can be set by the bid strategy.
+	// The limit applies to all keywords managed by the strategy.
+	CpcBidCeilingMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=cpc_bid_ceiling_micros,json=cpcBidCeilingMicros,proto3" json:"cpc_bid_ceiling_micros,omitempty"`
+	// Minimum bid limit that can be set by the bid strategy.
+	// The limit applies to all keywords managed by the strategy.
+	CpcBidFloorMicros    *wrappers.Int64Value `protobuf:"bytes,3,opt,name=cpc_bid_floor_micros,json=cpcBidFloorMicros,proto3" json:"cpc_bid_floor_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *TargetCpa) Reset()         { *m = TargetCpa{} }
+func (m *TargetCpa) String() string { return proto.CompactTextString(m) }
+func (*TargetCpa) ProtoMessage()    {}
+func (*TargetCpa) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{7}
+}
+
+func (m *TargetCpa) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetCpa.Unmarshal(m, b)
+}
+func (m *TargetCpa) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetCpa.Marshal(b, m, deterministic)
+}
+func (m *TargetCpa) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetCpa.Merge(m, src)
+}
+func (m *TargetCpa) XXX_Size() int {
+	return xxx_messageInfo_TargetCpa.Size(m)
+}
+func (m *TargetCpa) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetCpa.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetCpa proto.InternalMessageInfo
+
+func (m *TargetCpa) GetTargetCpaMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TargetCpaMicros
+	}
+	return nil
+}
+
+func (m *TargetCpa) GetCpcBidCeilingMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidCeilingMicros
+	}
+	return nil
+}
+
+func (m *TargetCpa) GetCpcBidFloorMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidFloorMicros
+	}
+	return nil
+}
+
+// Target CPM (cost per thousand impressions) is an automated bidding strategy
+// that sets bids to optimize performance given the target CPM you set.
+type TargetCpm struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TargetCpm) Reset()         { *m = TargetCpm{} }
+func (m *TargetCpm) String() string { return proto.CompactTextString(m) }
+func (*TargetCpm) ProtoMessage()    {}
+func (*TargetCpm) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{8}
+}
+
+func (m *TargetCpm) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetCpm.Unmarshal(m, b)
+}
+func (m *TargetCpm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetCpm.Marshal(b, m, deterministic)
+}
+func (m *TargetCpm) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetCpm.Merge(m, src)
+}
+func (m *TargetCpm) XXX_Size() int {
+	return xxx_messageInfo_TargetCpm.Size(m)
+}
+func (m *TargetCpm) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetCpm.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetCpm proto.InternalMessageInfo
+
+// An automated bidding strategy that sets bids so that a certain percentage of
+// search ads are shown at the top of the first page (or other targeted
+// location).
+// Next Id = 4
+type TargetImpressionShare struct {
+	// The targeted location on the search results page.
+	Location enums.TargetImpressionShareLocationEnum_TargetImpressionShareLocation `protobuf:"varint,1,opt,name=location,proto3,enum=google.ads.googleads.v3.enums.TargetImpressionShareLocationEnum_TargetImpressionShareLocation" json:"location,omitempty"`
+	// The desired fraction of ads to be shown in the targeted location in micros.
+	// E.g. 1% equals 10,000.
+	LocationFractionMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=location_fraction_micros,json=locationFractionMicros,proto3" json:"location_fraction_micros,omitempty"`
+	// The highest CPC bid the automated bidding system is permitted to specify.
+	// This is a required field entered by the advertiser that sets the ceiling
+	// and specified in local micros.
+	CpcBidCeilingMicros  *wrappers.Int64Value `protobuf:"bytes,3,opt,name=cpc_bid_ceiling_micros,json=cpcBidCeilingMicros,proto3" json:"cpc_bid_ceiling_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *TargetImpressionShare) Reset()         { *m = TargetImpressionShare{} }
+func (m *TargetImpressionShare) String() string { return proto.CompactTextString(m) }
+func (*TargetImpressionShare) ProtoMessage()    {}
+func (*TargetImpressionShare) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{9}
+}
+
+func (m *TargetImpressionShare) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetImpressionShare.Unmarshal(m, b)
+}
+func (m *TargetImpressionShare) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetImpressionShare.Marshal(b, m, deterministic)
+}
+func (m *TargetImpressionShare) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetImpressionShare.Merge(m, src)
+}
+func (m *TargetImpressionShare) XXX_Size() int {
+	return xxx_messageInfo_TargetImpressionShare.Size(m)
+}
+func (m *TargetImpressionShare) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetImpressionShare.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetImpressionShare proto.InternalMessageInfo
+
+func (m *TargetImpressionShare) GetLocation() enums.TargetImpressionShareLocationEnum_TargetImpressionShareLocation {
+	if m != nil {
+		return m.Location
+	}
+	return enums.TargetImpressionShareLocationEnum_UNSPECIFIED
+}
+
+func (m *TargetImpressionShare) GetLocationFractionMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.LocationFractionMicros
+	}
+	return nil
+}
+
+func (m *TargetImpressionShare) GetCpcBidCeilingMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidCeilingMicros
+	}
+	return nil
+}
+
+// An automated bidding strategy that helps you maximize revenue while
+// averaging a specific target return on ad spend (ROAS).
+type TargetRoas struct {
+	// Required. The desired revenue (based on conversion data) per unit of spend.
+	// Value must be between 0.01 and 1000.0, inclusive.
+	TargetRoas *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=target_roas,json=targetRoas,proto3" json:"target_roas,omitempty"`
+	// Maximum bid limit that can be set by the bid strategy.
+	// The limit applies to all keywords managed by the strategy.
+	CpcBidCeilingMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=cpc_bid_ceiling_micros,json=cpcBidCeilingMicros,proto3" json:"cpc_bid_ceiling_micros,omitempty"`
+	// Minimum bid limit that can be set by the bid strategy.
+	// The limit applies to all keywords managed by the strategy.
+	CpcBidFloorMicros    *wrappers.Int64Value `protobuf:"bytes,3,opt,name=cpc_bid_floor_micros,json=cpcBidFloorMicros,proto3" json:"cpc_bid_floor_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *TargetRoas) Reset()         { *m = TargetRoas{} }
+func (m *TargetRoas) String() string { return proto.CompactTextString(m) }
+func (*TargetRoas) ProtoMessage()    {}
+func (*TargetRoas) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{10}
+}
+
+func (m *TargetRoas) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetRoas.Unmarshal(m, b)
+}
+func (m *TargetRoas) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetRoas.Marshal(b, m, deterministic)
+}
+func (m *TargetRoas) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetRoas.Merge(m, src)
+}
+func (m *TargetRoas) XXX_Size() int {
+	return xxx_messageInfo_TargetRoas.Size(m)
+}
+func (m *TargetRoas) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetRoas.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetRoas proto.InternalMessageInfo
+
+func (m *TargetRoas) GetTargetRoas() *wrappers.DoubleValue {
+	if m != nil {
+		return m.TargetRoas
+	}
+	return nil
+}
+
+func (m *TargetRoas) GetCpcBidCeilingMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidCeilingMicros
+	}
+	return nil
+}
+
+func (m *TargetRoas) GetCpcBidFloorMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidFloorMicros
+	}
+	return nil
+}
+
+// An automated bid strategy that sets your bids to help get as many clicks
+// as possible within your budget.
+type TargetSpend struct {
+	// The spend target under which to maximize clicks.
+	// A TargetSpend bidder will attempt to spend the smaller of this value
+	// or the natural throttling spend amount.
+	// If not specified, the budget is used as the spend target.
+	TargetSpendMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=target_spend_micros,json=targetSpendMicros,proto3" json:"target_spend_micros,omitempty"`
+	// Maximum bid limit that can be set by the bid strategy.
+	// The limit applies to all keywords managed by the strategy.
+	CpcBidCeilingMicros  *wrappers.Int64Value `protobuf:"bytes,2,opt,name=cpc_bid_ceiling_micros,json=cpcBidCeilingMicros,proto3" json:"cpc_bid_ceiling_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *TargetSpend) Reset()         { *m = TargetSpend{} }
+func (m *TargetSpend) String() string { return proto.CompactTextString(m) }
+func (*TargetSpend) ProtoMessage()    {}
+func (*TargetSpend) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{11}
+}
+
+func (m *TargetSpend) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetSpend.Unmarshal(m, b)
+}
+func (m *TargetSpend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetSpend.Marshal(b, m, deterministic)
+}
+func (m *TargetSpend) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetSpend.Merge(m, src)
+}
+func (m *TargetSpend) XXX_Size() int {
+	return xxx_messageInfo_TargetSpend.Size(m)
+}
+func (m *TargetSpend) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetSpend.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetSpend proto.InternalMessageInfo
+
+func (m *TargetSpend) GetTargetSpendMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TargetSpendMicros
+	}
+	return nil
+}
+
+func (m *TargetSpend) GetCpcBidCeilingMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidCeilingMicros
+	}
+	return nil
+}
+
+// A bidding strategy where bids are a fraction of the advertised price for
+// some good or service.
+type PercentCpc struct {
+	// Maximum bid limit that can be set by the bid strategy. This is
+	// an optional field entered by the advertiser and specified in local micros.
+	// Note: A zero value is interpreted in the same way as having bid_ceiling
+	// undefined.
+	CpcBidCeilingMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=cpc_bid_ceiling_micros,json=cpcBidCeilingMicros,proto3" json:"cpc_bid_ceiling_micros,omitempty"`
+	// Adjusts the bid for each auction upward or downward, depending on the
+	// likelihood of a conversion. Individual bids may exceed
+	// cpc_bid_ceiling_micros, but the average bid amount for a campaign should
+	// not.
+	EnhancedCpcEnabled   *wrappers.BoolValue `protobuf:"bytes,2,opt,name=enhanced_cpc_enabled,json=enhancedCpcEnabled,proto3" json:"enhanced_cpc_enabled,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *PercentCpc) Reset()         { *m = PercentCpc{} }
+func (m *PercentCpc) String() string { return proto.CompactTextString(m) }
+func (*PercentCpc) ProtoMessage()    {}
+func (*PercentCpc) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8dc66e731ec0522, []int{12}
+}
+
+func (m *PercentCpc) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PercentCpc.Unmarshal(m, b)
+}
+func (m *PercentCpc) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PercentCpc.Marshal(b, m, deterministic)
+}
+func (m *PercentCpc) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PercentCpc.Merge(m, src)
+}
+func (m *PercentCpc) XXX_Size() int {
+	return xxx_messageInfo_PercentCpc.Size(m)
+}
+func (m *PercentCpc) XXX_DiscardUnknown() {
+	xxx_messageInfo_PercentCpc.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PercentCpc proto.InternalMessageInfo
+
+func (m *PercentCpc) GetCpcBidCeilingMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidCeilingMicros
+	}
+	return nil
+}
+
+func (m *PercentCpc) GetEnhancedCpcEnabled() *wrappers.BoolValue {
+	if m != nil {
+		return m.EnhancedCpcEnabled
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Commission)(nil), "google.ads.googleads.v3.common.Commission")
+	proto.RegisterType((*EnhancedCpc)(nil), "google.ads.googleads.v3.common.EnhancedCpc")
+	proto.RegisterType((*ManualCpc)(nil), "google.ads.googleads.v3.common.ManualCpc")
+	proto.RegisterType((*ManualCpm)(nil), "google.ads.googleads.v3.common.ManualCpm")
+	proto.RegisterType((*ManualCpv)(nil), "google.ads.googleads.v3.common.ManualCpv")
+	proto.RegisterType((*MaximizeConversions)(nil), "google.ads.googleads.v3.common.MaximizeConversions")
+	proto.RegisterType((*MaximizeConversionValue)(nil), "google.ads.googleads.v3.common.MaximizeConversionValue")
+	proto.RegisterType((*TargetCpa)(nil), "google.ads.googleads.v3.common.TargetCpa")
+	proto.RegisterType((*TargetCpm)(nil), "google.ads.googleads.v3.common.TargetCpm")
+	proto.RegisterType((*TargetImpressionShare)(nil), "google.ads.googleads.v3.common.TargetImpressionShare")
+	proto.RegisterType((*TargetRoas)(nil), "google.ads.googleads.v3.common.TargetRoas")
+	proto.RegisterType((*TargetSpend)(nil), "google.ads.googleads.v3.common.TargetSpend")
+	proto.RegisterType((*PercentCpc)(nil), "google.ads.googleads.v3.common.PercentCpc")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/bidding.proto", fileDescriptor_c8dc66e731ec0522)
+}
+
+var fileDescriptor_c8dc66e731ec0522 = []byte{
+	// 667 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x55, 0xdd, 0x6a, 0xd4, 0x4e,
+	0x14, 0x27, 0x5b, 0xf8, 0xf3, 0xef, 0xac, 0x1f, 0x34, 0xfd, 0xb0, 0xd4, 0x52, 0x24, 0x57, 0x5e,
+	0xc8, 0x04, 0xba, 0xe2, 0x45, 0xc4, 0x8b, 0xdd, 0xf4, 0x83, 0x62, 0x0b, 0xeb, 0xb6, 0x2e, 0x2a,
+	0x8b, 0x61, 0x76, 0x32, 0x4d, 0x07, 0x92, 0x99, 0x61, 0x26, 0x59, 0xa5, 0x8f, 0xe3, 0xa5, 0xf8,
+	0x08, 0x3e, 0x81, 0x2f, 0x22, 0xe8, 0xad, 0x0f, 0x20, 0x99, 0x8f, 0xac, 0xd0, 0x6e, 0x6b, 0x57,
+	0x04, 0xaf, 0x72, 0x4e, 0xe6, 0x77, 0x7e, 0xbf, 0x99, 0x33, 0xe7, 0xcc, 0x01, 0x8f, 0x32, 0xce,
+	0xb3, 0x9c, 0x84, 0x28, 0x55, 0xa1, 0x31, 0x6b, 0x6b, 0xd2, 0x09, 0x31, 0x2f, 0x0a, 0xce, 0xc2,
+	0x31, 0x4d, 0x53, 0xca, 0x32, 0x28, 0x24, 0x2f, 0xb9, 0xbf, 0x65, 0x20, 0x10, 0xa5, 0x0a, 0x36,
+	0x68, 0x38, 0xe9, 0x40, 0x83, 0xde, 0xd8, 0x99, 0xc5, 0x46, 0x58, 0x55, 0xa8, 0xb0, 0x44, 0x32,
+	0x23, 0x65, 0x42, 0x0b, 0x21, 0x89, 0x52, 0x94, 0xb3, 0x44, 0x9d, 0x21, 0x49, 0x92, 0x9c, 0x63,
+	0x54, 0x52, 0xce, 0x8c, 0xca, 0x86, 0x55, 0x09, 0xb5, 0x37, 0xae, 0x4e, 0xc3, 0x77, 0x12, 0x09,
+	0x41, 0xa4, 0xb2, 0xeb, 0x9b, 0x4e, 0x45, 0xd0, 0x10, 0x31, 0xc6, 0x4b, 0x1d, 0x6c, 0x57, 0x83,
+	0x04, 0x80, 0x98, 0x17, 0x05, 0xd5, 0x02, 0xfe, 0x0b, 0xb0, 0x86, 0x1b, 0x2f, 0x91, 0xa8, 0x24,
+	0x49, 0x41, 0xb1, 0xe4, 0x6a, 0xdd, 0x7b, 0xe0, 0x3d, 0x6c, 0x6f, 0xdf, 0xb7, 0xe7, 0x80, 0x4e,
+	0x0c, 0x1e, 0xb0, 0xf2, 0xc9, 0xe3, 0x21, 0xca, 0x2b, 0x32, 0x58, 0x99, 0x86, 0x0e, 0x50, 0x49,
+	0x8e, 0x74, 0x60, 0x70, 0x1b, 0xb4, 0x77, 0xd9, 0x19, 0x62, 0x98, 0xa4, 0xb1, 0xc0, 0xc1, 0x6b,
+	0xb0, 0x78, 0x84, 0x58, 0x85, 0xf2, 0x58, 0x60, 0xff, 0x10, 0xac, 0x10, 0xbb, 0x96, 0x60, 0x81,
+	0x13, 0xc2, 0xd0, 0x38, 0x27, 0xa9, 0x15, 0xdb, 0xb8, 0x20, 0xd6, 0xe3, 0x3c, 0x37, 0x5a, 0x3e,
+	0x99, 0x72, 0xee, 0x9a, 0xa8, 0xa0, 0x3d, 0xa5, 0x2e, 0x7e, 0x75, 0x26, 0xc1, 0x2a, 0x58, 0x3e,
+	0x42, 0xef, 0x69, 0x41, 0xcf, 0x49, 0xcc, 0xd9, 0x84, 0xc8, 0x7a, 0x8f, 0x2a, 0x78, 0x05, 0xee,
+	0x5d, 0xfc, 0xad, 0xf9, 0xfd, 0x67, 0xa0, 0x6d, 0xd3, 0x2f, 0x39, 0x72, 0xa7, 0xdf, 0xbc, 0xb0,
+	0xa1, 0x1d, 0x5e, 0x8d, 0x73, 0x62, 0xb6, 0x04, 0x4c, 0xc0, 0x80, 0x23, 0x15, 0xfc, 0xf0, 0xc0,
+	0xe2, 0x89, 0x76, 0x63, 0x81, 0xfc, 0x7d, 0xb0, 0x64, 0xc9, 0xb0, 0x40, 0x37, 0x48, 0xe8, 0xdd,
+	0xd2, 0x51, 0x98, 0x5c, 0xfa, 0x7d, 0xb0, 0x56, 0xa7, 0x69, 0x4c, 0xd3, 0x04, 0x13, 0x9a, 0x53,
+	0x96, 0x39, 0xb6, 0xd6, 0xf5, 0x6c, 0xcb, 0x58, 0xe0, 0x1e, 0x4d, 0x63, 0x13, 0x68, 0x19, 0x0f,
+	0xc1, 0x8a, 0x63, 0x3c, 0xcd, 0x39, 0x97, 0x8e, 0x6f, 0xe1, 0x7a, 0xbe, 0x25, 0xc3, 0xb7, 0x57,
+	0x87, 0xd9, 0xbb, 0x6e, 0x4f, 0x4f, 0x5d, 0x04, 0x9f, 0x5b, 0x60, 0xd5, 0x78, 0x07, 0x4d, 0x05,
+	0x1f, 0xd7, 0x05, 0xec, 0x9f, 0x83, 0xff, 0x5d, 0x0d, 0xeb, 0x34, 0xdc, 0xd9, 0x7e, 0x0b, 0x67,
+	0xb5, 0x8a, 0x6e, 0x05, 0x78, 0x29, 0xcf, 0xa1, 0xe5, 0xd8, 0x65, 0x55, 0x71, 0x35, 0x62, 0xd0,
+	0xe8, 0xf9, 0x2f, 0xc1, 0xba, 0xb3, 0x93, 0x53, 0x89, 0xb0, 0x36, 0x7e, 0x3f, 0x89, 0x6b, 0x2e,
+	0x78, 0xcf, 0xc6, 0x5e, 0x7b, 0x33, 0x0b, 0xf3, 0xdd, 0x4c, 0xf0, 0xdd, 0x03, 0xe0, 0xa4, 0xa9,
+	0xa8, 0x3f, 0x2c, 0xc8, 0x7f, 0xbe, 0x72, 0x3e, 0x79, 0xa0, 0x6d, 0x4e, 0x7b, 0x2c, 0x08, 0x4b,
+	0xfd, 0xe7, 0x60, 0xd9, 0x1e, 0x57, 0xd5, 0xfe, 0x0d, 0x9a, 0xc6, 0xb6, 0x9a, 0xa6, 0xf9, 0x5b,
+	0x6d, 0x53, 0x6f, 0x17, 0xf4, 0x89, 0xc4, 0x84, 0x95, 0xf5, 0x3b, 0x36, 0x5b, 0xc0, 0x9b, 0x3f,
+	0xbb, 0x97, 0xbe, 0x8c, 0xad, 0x79, 0x5e, 0xc6, 0xde, 0x57, 0x0f, 0x04, 0x98, 0x17, 0xf0, 0xea,
+	0x79, 0xd4, 0xbb, 0xd5, 0x33, 0xe3, 0xab, 0x5f, 0xb3, 0xf6, 0xbd, 0x37, 0x76, 0x3e, 0xc1, 0x8c,
+	0xe7, 0x88, 0x65, 0x90, 0xcb, 0x2c, 0xcc, 0x08, 0xd3, 0x9a, 0x6e, 0x5e, 0x09, 0xaa, 0x66, 0x0d,
+	0xc3, 0xa7, 0xe6, 0xf3, 0xa1, 0xb5, 0xb0, 0xdf, 0xed, 0x7e, 0x6c, 0x6d, 0xed, 0x1b, 0xb2, 0x6e,
+	0xaa, 0xa0, 0x31, 0x6b, 0x6b, 0xd8, 0x81, 0xb1, 0x86, 0x7d, 0x71, 0x80, 0x51, 0x37, 0x55, 0xa3,
+	0x06, 0x30, 0x1a, 0x76, 0x46, 0x06, 0xf0, 0xad, 0x15, 0x98, 0xbf, 0x51, 0xd4, 0x4d, 0x55, 0x14,
+	0x35, 0x90, 0x28, 0x1a, 0x76, 0xa2, 0xc8, 0x80, 0xc6, 0xff, 0xe9, 0xdd, 0x75, 0x7e, 0x06, 0x00,
+	0x00, 0xff, 0xff, 0xa4, 0x8e, 0xbe, 0xfa, 0xa9, 0x07, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/click_location.pb.go b/googleapis/ads/googleads/v3/common/click_location.pb.go
new file mode 100644
index 0000000..a99e8c2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/click_location.pb.go
@@ -0,0 +1,135 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/click_location.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Location criteria associated with a click.
+type ClickLocation struct {
+	// The city location criterion associated with the impression.
+	City *wrappers.StringValue `protobuf:"bytes,1,opt,name=city,proto3" json:"city,omitempty"`
+	// The country location criterion associated with the impression.
+	Country *wrappers.StringValue `protobuf:"bytes,2,opt,name=country,proto3" json:"country,omitempty"`
+	// The metro location criterion associated with the impression.
+	Metro *wrappers.StringValue `protobuf:"bytes,3,opt,name=metro,proto3" json:"metro,omitempty"`
+	// The most specific location criterion associated with the impression.
+	MostSpecific *wrappers.StringValue `protobuf:"bytes,4,opt,name=most_specific,json=mostSpecific,proto3" json:"most_specific,omitempty"`
+	// The region location criterion associated with the impression.
+	Region               *wrappers.StringValue `protobuf:"bytes,5,opt,name=region,proto3" json:"region,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ClickLocation) Reset()         { *m = ClickLocation{} }
+func (m *ClickLocation) String() string { return proto.CompactTextString(m) }
+func (*ClickLocation) ProtoMessage()    {}
+func (*ClickLocation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_24c993db9da99d67, []int{0}
+}
+
+func (m *ClickLocation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ClickLocation.Unmarshal(m, b)
+}
+func (m *ClickLocation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ClickLocation.Marshal(b, m, deterministic)
+}
+func (m *ClickLocation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ClickLocation.Merge(m, src)
+}
+func (m *ClickLocation) XXX_Size() int {
+	return xxx_messageInfo_ClickLocation.Size(m)
+}
+func (m *ClickLocation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ClickLocation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClickLocation proto.InternalMessageInfo
+
+func (m *ClickLocation) GetCity() *wrappers.StringValue {
+	if m != nil {
+		return m.City
+	}
+	return nil
+}
+
+func (m *ClickLocation) GetCountry() *wrappers.StringValue {
+	if m != nil {
+		return m.Country
+	}
+	return nil
+}
+
+func (m *ClickLocation) GetMetro() *wrappers.StringValue {
+	if m != nil {
+		return m.Metro
+	}
+	return nil
+}
+
+func (m *ClickLocation) GetMostSpecific() *wrappers.StringValue {
+	if m != nil {
+		return m.MostSpecific
+	}
+	return nil
+}
+
+func (m *ClickLocation) GetRegion() *wrappers.StringValue {
+	if m != nil {
+		return m.Region
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ClickLocation)(nil), "google.ads.googleads.v3.common.ClickLocation")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/click_location.proto", fileDescriptor_24c993db9da99d67)
+}
+
+var fileDescriptor_24c993db9da99d67 = []byte{
+	// 352 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xbd, 0x6a, 0xf3, 0x30,
+	0x14, 0x86, 0xb1, 0xf3, 0xf3, 0x81, 0xbe, 0x66, 0xf1, 0x64, 0x42, 0x08, 0x25, 0x53, 0x27, 0xa9,
+	0xc4, 0xa5, 0x83, 0x3a, 0x39, 0x29, 0x64, 0xe9, 0x10, 0x1a, 0xf0, 0x50, 0x0c, 0xc1, 0x91, 0x1d,
+	0x21, 0x6a, 0xeb, 0x18, 0x49, 0x49, 0xc9, 0xed, 0x74, 0xe8, 0xd0, 0x4b, 0xe9, 0xa5, 0x14, 0x7a,
+	0x0f, 0xc5, 0x96, 0x1d, 0xe8, 0xd0, 0xe2, 0xc9, 0x07, 0xeb, 0x79, 0xde, 0xd7, 0x58, 0x07, 0x05,
+	0x1c, 0x80, 0xe7, 0x19, 0x49, 0x52, 0x4d, 0xec, 0x58, 0x4d, 0xc7, 0x80, 0x30, 0x28, 0x0a, 0x90,
+	0x84, 0xe5, 0x82, 0x3d, 0x6f, 0x73, 0x60, 0x89, 0x11, 0x20, 0x71, 0xa9, 0xc0, 0x80, 0x37, 0xb5,
+	0x24, 0x4e, 0x52, 0x8d, 0xcf, 0x12, 0x3e, 0x06, 0xd8, 0x4a, 0xe3, 0xe6, 0x9c, 0xd4, 0xf4, 0xee,
+	0xb0, 0x27, 0x2f, 0x2a, 0x29, 0xcb, 0x4c, 0x69, 0xeb, 0x8f, 0x27, 0x6d, 0x69, 0x29, 0x48, 0x22,
+	0x25, 0x98, 0x3a, 0xbc, 0x39, 0x9d, 0xbd, 0xb9, 0x68, 0xb4, 0xac, 0x6a, 0x1f, 0x9a, 0x56, 0xef,
+	0x1a, 0xf5, 0x99, 0x30, 0x27, 0xdf, 0xb9, 0x74, 0xae, 0xfe, 0xcf, 0x27, 0x4d, 0x27, 0x6e, 0xe3,
+	0xf1, 0xc6, 0x28, 0x21, 0x79, 0x94, 0xe4, 0x87, 0xec, 0xb1, 0x26, 0xbd, 0x5b, 0xf4, 0x8f, 0xc1,
+	0x41, 0x1a, 0x75, 0xf2, 0xdd, 0x0e, 0x52, 0x0b, 0x7b, 0x73, 0x34, 0x28, 0x32, 0xa3, 0xc0, 0xef,
+	0x75, 0xb0, 0x2c, 0xea, 0x85, 0x68, 0x54, 0x80, 0x36, 0x5b, 0x5d, 0x66, 0x4c, 0xec, 0x05, 0xf3,
+	0xfb, 0x1d, 0xdc, 0x8b, 0x4a, 0xd9, 0x34, 0x86, 0x77, 0x83, 0x86, 0x2a, 0xe3, 0x02, 0xa4, 0x3f,
+	0xe8, 0xe0, 0x36, 0xec, 0xe2, 0xcb, 0x41, 0x33, 0x06, 0x05, 0xfe, 0xfb, 0x36, 0x16, 0xde, 0x8f,
+	0x9f, 0xb9, 0xae, 0x12, 0xd7, 0xce, 0xd3, 0x7d, 0x63, 0x71, 0xc8, 0x13, 0xc9, 0x31, 0x28, 0x4e,
+	0x78, 0x26, 0xeb, 0xbe, 0x76, 0x11, 0x4a, 0xa1, 0x7f, 0xdb, 0x8b, 0x3b, 0xfb, 0x78, 0x75, 0x7b,
+	0xab, 0x30, 0x7c, 0x77, 0xa7, 0x2b, 0x1b, 0x16, 0xa6, 0x1a, 0xdb, 0xb1, 0x9a, 0xa2, 0x00, 0x2f,
+	0x6b, 0xec, 0xa3, 0x05, 0xe2, 0x30, 0xd5, 0xf1, 0x19, 0x88, 0xa3, 0x20, 0xb6, 0xc0, 0xa7, 0x3b,
+	0xb3, 0x6f, 0x29, 0x0d, 0x53, 0x4d, 0xe9, 0x19, 0xa1, 0x34, 0x0a, 0x28, 0xb5, 0xd0, 0x6e, 0x58,
+	0x7f, 0x5d, 0xf0, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x3c, 0xd9, 0xfd, 0x93, 0xb4, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/criteria.pb.go b/googleapis/ads/googleads/v3/common/criteria.pb.go
new file mode 100644
index 0000000..8ff25ae
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/criteria.pb.go
@@ -0,0 +1,3050 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/criteria.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A keyword criterion.
+type KeywordInfo struct {
+	// The text of the keyword (at most 80 characters and 10 words).
+	Text *wrappers.StringValue `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	// The match type of the keyword.
+	MatchType            enums.KeywordMatchTypeEnum_KeywordMatchType `protobuf:"varint,2,opt,name=match_type,json=matchType,proto3,enum=google.ads.googleads.v3.enums.KeywordMatchTypeEnum_KeywordMatchType" json:"match_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *KeywordInfo) Reset()         { *m = KeywordInfo{} }
+func (m *KeywordInfo) String() string { return proto.CompactTextString(m) }
+func (*KeywordInfo) ProtoMessage()    {}
+func (*KeywordInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{0}
+}
+
+func (m *KeywordInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordInfo.Unmarshal(m, b)
+}
+func (m *KeywordInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordInfo.Marshal(b, m, deterministic)
+}
+func (m *KeywordInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordInfo.Merge(m, src)
+}
+func (m *KeywordInfo) XXX_Size() int {
+	return xxx_messageInfo_KeywordInfo.Size(m)
+}
+func (m *KeywordInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordInfo proto.InternalMessageInfo
+
+func (m *KeywordInfo) GetText() *wrappers.StringValue {
+	if m != nil {
+		return m.Text
+	}
+	return nil
+}
+
+func (m *KeywordInfo) GetMatchType() enums.KeywordMatchTypeEnum_KeywordMatchType {
+	if m != nil {
+		return m.MatchType
+	}
+	return enums.KeywordMatchTypeEnum_UNSPECIFIED
+}
+
+// A placement criterion. This can be used to modify bids for sites when
+// targeting the content network.
+type PlacementInfo struct {
+	// URL of the placement.
+	//
+	// For example, "http://www.domain.com".
+	Url                  *wrappers.StringValue `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *PlacementInfo) Reset()         { *m = PlacementInfo{} }
+func (m *PlacementInfo) String() string { return proto.CompactTextString(m) }
+func (*PlacementInfo) ProtoMessage()    {}
+func (*PlacementInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{1}
+}
+
+func (m *PlacementInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PlacementInfo.Unmarshal(m, b)
+}
+func (m *PlacementInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PlacementInfo.Marshal(b, m, deterministic)
+}
+func (m *PlacementInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PlacementInfo.Merge(m, src)
+}
+func (m *PlacementInfo) XXX_Size() int {
+	return xxx_messageInfo_PlacementInfo.Size(m)
+}
+func (m *PlacementInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_PlacementInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PlacementInfo proto.InternalMessageInfo
+
+func (m *PlacementInfo) GetUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.Url
+	}
+	return nil
+}
+
+// A mobile app category criterion.
+type MobileAppCategoryInfo struct {
+	// The mobile app category constant resource name.
+	MobileAppCategoryConstant *wrappers.StringValue `protobuf:"bytes,1,opt,name=mobile_app_category_constant,json=mobileAppCategoryConstant,proto3" json:"mobile_app_category_constant,omitempty"`
+	XXX_NoUnkeyedLiteral      struct{}              `json:"-"`
+	XXX_unrecognized          []byte                `json:"-"`
+	XXX_sizecache             int32                 `json:"-"`
+}
+
+func (m *MobileAppCategoryInfo) Reset()         { *m = MobileAppCategoryInfo{} }
+func (m *MobileAppCategoryInfo) String() string { return proto.CompactTextString(m) }
+func (*MobileAppCategoryInfo) ProtoMessage()    {}
+func (*MobileAppCategoryInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{2}
+}
+
+func (m *MobileAppCategoryInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MobileAppCategoryInfo.Unmarshal(m, b)
+}
+func (m *MobileAppCategoryInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MobileAppCategoryInfo.Marshal(b, m, deterministic)
+}
+func (m *MobileAppCategoryInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MobileAppCategoryInfo.Merge(m, src)
+}
+func (m *MobileAppCategoryInfo) XXX_Size() int {
+	return xxx_messageInfo_MobileAppCategoryInfo.Size(m)
+}
+func (m *MobileAppCategoryInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_MobileAppCategoryInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MobileAppCategoryInfo proto.InternalMessageInfo
+
+func (m *MobileAppCategoryInfo) GetMobileAppCategoryConstant() *wrappers.StringValue {
+	if m != nil {
+		return m.MobileAppCategoryConstant
+	}
+	return nil
+}
+
+// A mobile application criterion.
+type MobileApplicationInfo struct {
+	// A string that uniquely identifies a mobile application to Google Ads API.
+	// The format of this string is "{platform}-{platform_native_id}", where
+	// platform is "1" for iOS apps and "2" for Android apps, and where
+	// platform_native_id is the mobile application identifier native to the
+	// corresponding platform.
+	// For iOS, this native identifier is the 9 digit string that appears at the
+	// end of an App Store URL (e.g., "476943146" for "Flood-It! 2" whose App
+	// Store link is "http://itunes.apple.com/us/app/flood-it!-2/id476943146").
+	// For Android, this native identifier is the application's package name
+	// (e.g., "com.labpixies.colordrips" for "Color Drips" given Google Play link
+	// "https://play.google.com/store/apps/details?id=com.labpixies.colordrips").
+	// A well formed app id for Google Ads API would thus be "1-476943146" for iOS
+	// and "2-com.labpixies.colordrips" for Android.
+	// This field is required and must be set in CREATE operations.
+	AppId *wrappers.StringValue `protobuf:"bytes,2,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
+	// Name of this mobile application.
+	Name                 *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *MobileApplicationInfo) Reset()         { *m = MobileApplicationInfo{} }
+func (m *MobileApplicationInfo) String() string { return proto.CompactTextString(m) }
+func (*MobileApplicationInfo) ProtoMessage()    {}
+func (*MobileApplicationInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{3}
+}
+
+func (m *MobileApplicationInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MobileApplicationInfo.Unmarshal(m, b)
+}
+func (m *MobileApplicationInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MobileApplicationInfo.Marshal(b, m, deterministic)
+}
+func (m *MobileApplicationInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MobileApplicationInfo.Merge(m, src)
+}
+func (m *MobileApplicationInfo) XXX_Size() int {
+	return xxx_messageInfo_MobileApplicationInfo.Size(m)
+}
+func (m *MobileApplicationInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_MobileApplicationInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MobileApplicationInfo proto.InternalMessageInfo
+
+func (m *MobileApplicationInfo) GetAppId() *wrappers.StringValue {
+	if m != nil {
+		return m.AppId
+	}
+	return nil
+}
+
+func (m *MobileApplicationInfo) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+// A location criterion.
+type LocationInfo struct {
+	// The geo target constant resource name.
+	GeoTargetConstant    *wrappers.StringValue `protobuf:"bytes,1,opt,name=geo_target_constant,json=geoTargetConstant,proto3" json:"geo_target_constant,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *LocationInfo) Reset()         { *m = LocationInfo{} }
+func (m *LocationInfo) String() string { return proto.CompactTextString(m) }
+func (*LocationInfo) ProtoMessage()    {}
+func (*LocationInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{4}
+}
+
+func (m *LocationInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LocationInfo.Unmarshal(m, b)
+}
+func (m *LocationInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LocationInfo.Marshal(b, m, deterministic)
+}
+func (m *LocationInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LocationInfo.Merge(m, src)
+}
+func (m *LocationInfo) XXX_Size() int {
+	return xxx_messageInfo_LocationInfo.Size(m)
+}
+func (m *LocationInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_LocationInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LocationInfo proto.InternalMessageInfo
+
+func (m *LocationInfo) GetGeoTargetConstant() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetConstant
+	}
+	return nil
+}
+
+// A device criterion.
+type DeviceInfo struct {
+	// Type of the device.
+	Type                 enums.DeviceEnum_Device `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.DeviceEnum_Device" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *DeviceInfo) Reset()         { *m = DeviceInfo{} }
+func (m *DeviceInfo) String() string { return proto.CompactTextString(m) }
+func (*DeviceInfo) ProtoMessage()    {}
+func (*DeviceInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{5}
+}
+
+func (m *DeviceInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeviceInfo.Unmarshal(m, b)
+}
+func (m *DeviceInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeviceInfo.Marshal(b, m, deterministic)
+}
+func (m *DeviceInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeviceInfo.Merge(m, src)
+}
+func (m *DeviceInfo) XXX_Size() int {
+	return xxx_messageInfo_DeviceInfo.Size(m)
+}
+func (m *DeviceInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeviceInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeviceInfo proto.InternalMessageInfo
+
+func (m *DeviceInfo) GetType() enums.DeviceEnum_Device {
+	if m != nil {
+		return m.Type
+	}
+	return enums.DeviceEnum_UNSPECIFIED
+}
+
+// A preferred content criterion.
+type PreferredContentInfo struct {
+	// Type of the preferred content.
+	Type                 enums.PreferredContentTypeEnum_PreferredContentType `protobuf:"varint,2,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.PreferredContentTypeEnum_PreferredContentType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
+	XXX_unrecognized     []byte                                              `json:"-"`
+	XXX_sizecache        int32                                               `json:"-"`
+}
+
+func (m *PreferredContentInfo) Reset()         { *m = PreferredContentInfo{} }
+func (m *PreferredContentInfo) String() string { return proto.CompactTextString(m) }
+func (*PreferredContentInfo) ProtoMessage()    {}
+func (*PreferredContentInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{6}
+}
+
+func (m *PreferredContentInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PreferredContentInfo.Unmarshal(m, b)
+}
+func (m *PreferredContentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PreferredContentInfo.Marshal(b, m, deterministic)
+}
+func (m *PreferredContentInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PreferredContentInfo.Merge(m, src)
+}
+func (m *PreferredContentInfo) XXX_Size() int {
+	return xxx_messageInfo_PreferredContentInfo.Size(m)
+}
+func (m *PreferredContentInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_PreferredContentInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PreferredContentInfo proto.InternalMessageInfo
+
+func (m *PreferredContentInfo) GetType() enums.PreferredContentTypeEnum_PreferredContentType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.PreferredContentTypeEnum_UNSPECIFIED
+}
+
+// A listing group criterion.
+type ListingGroupInfo struct {
+	// Type of the listing group.
+	Type enums.ListingGroupTypeEnum_ListingGroupType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.ListingGroupTypeEnum_ListingGroupType" json:"type,omitempty"`
+	// Dimension value with which this listing group is refining its parent.
+	// Undefined for the root group.
+	CaseValue *ListingDimensionInfo `protobuf:"bytes,2,opt,name=case_value,json=caseValue,proto3" json:"case_value,omitempty"`
+	// Resource name of ad group criterion which is the parent listing group
+	// subdivision. Null for the root group.
+	ParentAdGroupCriterion *wrappers.StringValue `protobuf:"bytes,3,opt,name=parent_ad_group_criterion,json=parentAdGroupCriterion,proto3" json:"parent_ad_group_criterion,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{}              `json:"-"`
+	XXX_unrecognized       []byte                `json:"-"`
+	XXX_sizecache          int32                 `json:"-"`
+}
+
+func (m *ListingGroupInfo) Reset()         { *m = ListingGroupInfo{} }
+func (m *ListingGroupInfo) String() string { return proto.CompactTextString(m) }
+func (*ListingGroupInfo) ProtoMessage()    {}
+func (*ListingGroupInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{7}
+}
+
+func (m *ListingGroupInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListingGroupInfo.Unmarshal(m, b)
+}
+func (m *ListingGroupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListingGroupInfo.Marshal(b, m, deterministic)
+}
+func (m *ListingGroupInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListingGroupInfo.Merge(m, src)
+}
+func (m *ListingGroupInfo) XXX_Size() int {
+	return xxx_messageInfo_ListingGroupInfo.Size(m)
+}
+func (m *ListingGroupInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListingGroupInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListingGroupInfo proto.InternalMessageInfo
+
+func (m *ListingGroupInfo) GetType() enums.ListingGroupTypeEnum_ListingGroupType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.ListingGroupTypeEnum_UNSPECIFIED
+}
+
+func (m *ListingGroupInfo) GetCaseValue() *ListingDimensionInfo {
+	if m != nil {
+		return m.CaseValue
+	}
+	return nil
+}
+
+func (m *ListingGroupInfo) GetParentAdGroupCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.ParentAdGroupCriterion
+	}
+	return nil
+}
+
+// A listing scope criterion.
+type ListingScopeInfo struct {
+	// Scope of the campaign criterion.
+	Dimensions           []*ListingDimensionInfo `protobuf:"bytes,2,rep,name=dimensions,proto3" json:"dimensions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *ListingScopeInfo) Reset()         { *m = ListingScopeInfo{} }
+func (m *ListingScopeInfo) String() string { return proto.CompactTextString(m) }
+func (*ListingScopeInfo) ProtoMessage()    {}
+func (*ListingScopeInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{8}
+}
+
+func (m *ListingScopeInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListingScopeInfo.Unmarshal(m, b)
+}
+func (m *ListingScopeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListingScopeInfo.Marshal(b, m, deterministic)
+}
+func (m *ListingScopeInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListingScopeInfo.Merge(m, src)
+}
+func (m *ListingScopeInfo) XXX_Size() int {
+	return xxx_messageInfo_ListingScopeInfo.Size(m)
+}
+func (m *ListingScopeInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListingScopeInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListingScopeInfo proto.InternalMessageInfo
+
+func (m *ListingScopeInfo) GetDimensions() []*ListingDimensionInfo {
+	if m != nil {
+		return m.Dimensions
+	}
+	return nil
+}
+
+// Listing dimensions for listing group criterion.
+type ListingDimensionInfo struct {
+	// Dimension of one of the types below is always present.
+	//
+	// Types that are valid to be assigned to Dimension:
+	//	*ListingDimensionInfo_HotelId
+	//	*ListingDimensionInfo_HotelClass
+	//	*ListingDimensionInfo_HotelCountryRegion
+	//	*ListingDimensionInfo_HotelState
+	//	*ListingDimensionInfo_HotelCity
+	//	*ListingDimensionInfo_ProductBiddingCategory
+	//	*ListingDimensionInfo_ProductBrand
+	//	*ListingDimensionInfo_ProductChannel
+	//	*ListingDimensionInfo_ProductChannelExclusivity
+	//	*ListingDimensionInfo_ProductCondition
+	//	*ListingDimensionInfo_ProductCustomAttribute
+	//	*ListingDimensionInfo_ProductItemId
+	//	*ListingDimensionInfo_ProductType
+	//	*ListingDimensionInfo_UnknownListingDimension
+	Dimension            isListingDimensionInfo_Dimension `protobuf_oneof:"dimension"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *ListingDimensionInfo) Reset()         { *m = ListingDimensionInfo{} }
+func (m *ListingDimensionInfo) String() string { return proto.CompactTextString(m) }
+func (*ListingDimensionInfo) ProtoMessage()    {}
+func (*ListingDimensionInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{9}
+}
+
+func (m *ListingDimensionInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListingDimensionInfo.Unmarshal(m, b)
+}
+func (m *ListingDimensionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListingDimensionInfo.Marshal(b, m, deterministic)
+}
+func (m *ListingDimensionInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListingDimensionInfo.Merge(m, src)
+}
+func (m *ListingDimensionInfo) XXX_Size() int {
+	return xxx_messageInfo_ListingDimensionInfo.Size(m)
+}
+func (m *ListingDimensionInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListingDimensionInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListingDimensionInfo proto.InternalMessageInfo
+
+type isListingDimensionInfo_Dimension interface {
+	isListingDimensionInfo_Dimension()
+}
+
+type ListingDimensionInfo_HotelId struct {
+	HotelId *HotelIdInfo `protobuf:"bytes,2,opt,name=hotel_id,json=hotelId,proto3,oneof"`
+}
+
+type ListingDimensionInfo_HotelClass struct {
+	HotelClass *HotelClassInfo `protobuf:"bytes,3,opt,name=hotel_class,json=hotelClass,proto3,oneof"`
+}
+
+type ListingDimensionInfo_HotelCountryRegion struct {
+	HotelCountryRegion *HotelCountryRegionInfo `protobuf:"bytes,4,opt,name=hotel_country_region,json=hotelCountryRegion,proto3,oneof"`
+}
+
+type ListingDimensionInfo_HotelState struct {
+	HotelState *HotelStateInfo `protobuf:"bytes,5,opt,name=hotel_state,json=hotelState,proto3,oneof"`
+}
+
+type ListingDimensionInfo_HotelCity struct {
+	HotelCity *HotelCityInfo `protobuf:"bytes,6,opt,name=hotel_city,json=hotelCity,proto3,oneof"`
+}
+
+type ListingDimensionInfo_ProductBiddingCategory struct {
+	ProductBiddingCategory *ProductBiddingCategoryInfo `protobuf:"bytes,13,opt,name=product_bidding_category,json=productBiddingCategory,proto3,oneof"`
+}
+
+type ListingDimensionInfo_ProductBrand struct {
+	ProductBrand *ProductBrandInfo `protobuf:"bytes,15,opt,name=product_brand,json=productBrand,proto3,oneof"`
+}
+
+type ListingDimensionInfo_ProductChannel struct {
+	ProductChannel *ProductChannelInfo `protobuf:"bytes,8,opt,name=product_channel,json=productChannel,proto3,oneof"`
+}
+
+type ListingDimensionInfo_ProductChannelExclusivity struct {
+	ProductChannelExclusivity *ProductChannelExclusivityInfo `protobuf:"bytes,9,opt,name=product_channel_exclusivity,json=productChannelExclusivity,proto3,oneof"`
+}
+
+type ListingDimensionInfo_ProductCondition struct {
+	ProductCondition *ProductConditionInfo `protobuf:"bytes,10,opt,name=product_condition,json=productCondition,proto3,oneof"`
+}
+
+type ListingDimensionInfo_ProductCustomAttribute struct {
+	ProductCustomAttribute *ProductCustomAttributeInfo `protobuf:"bytes,16,opt,name=product_custom_attribute,json=productCustomAttribute,proto3,oneof"`
+}
+
+type ListingDimensionInfo_ProductItemId struct {
+	ProductItemId *ProductItemIdInfo `protobuf:"bytes,11,opt,name=product_item_id,json=productItemId,proto3,oneof"`
+}
+
+type ListingDimensionInfo_ProductType struct {
+	ProductType *ProductTypeInfo `protobuf:"bytes,12,opt,name=product_type,json=productType,proto3,oneof"`
+}
+
+type ListingDimensionInfo_UnknownListingDimension struct {
+	UnknownListingDimension *UnknownListingDimensionInfo `protobuf:"bytes,14,opt,name=unknown_listing_dimension,json=unknownListingDimension,proto3,oneof"`
+}
+
+func (*ListingDimensionInfo_HotelId) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_HotelClass) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_HotelCountryRegion) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_HotelState) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_HotelCity) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_ProductBiddingCategory) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_ProductBrand) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_ProductChannel) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_ProductChannelExclusivity) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_ProductCondition) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_ProductCustomAttribute) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_ProductItemId) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_ProductType) isListingDimensionInfo_Dimension() {}
+
+func (*ListingDimensionInfo_UnknownListingDimension) isListingDimensionInfo_Dimension() {}
+
+func (m *ListingDimensionInfo) GetDimension() isListingDimensionInfo_Dimension {
+	if m != nil {
+		return m.Dimension
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetHotelId() *HotelIdInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_HotelId); ok {
+		return x.HotelId
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetHotelClass() *HotelClassInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_HotelClass); ok {
+		return x.HotelClass
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetHotelCountryRegion() *HotelCountryRegionInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_HotelCountryRegion); ok {
+		return x.HotelCountryRegion
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetHotelState() *HotelStateInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_HotelState); ok {
+		return x.HotelState
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetHotelCity() *HotelCityInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_HotelCity); ok {
+		return x.HotelCity
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetProductBiddingCategory() *ProductBiddingCategoryInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_ProductBiddingCategory); ok {
+		return x.ProductBiddingCategory
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetProductBrand() *ProductBrandInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_ProductBrand); ok {
+		return x.ProductBrand
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetProductChannel() *ProductChannelInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_ProductChannel); ok {
+		return x.ProductChannel
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetProductChannelExclusivity() *ProductChannelExclusivityInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_ProductChannelExclusivity); ok {
+		return x.ProductChannelExclusivity
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetProductCondition() *ProductConditionInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_ProductCondition); ok {
+		return x.ProductCondition
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetProductCustomAttribute() *ProductCustomAttributeInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_ProductCustomAttribute); ok {
+		return x.ProductCustomAttribute
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetProductItemId() *ProductItemIdInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_ProductItemId); ok {
+		return x.ProductItemId
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetProductType() *ProductTypeInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_ProductType); ok {
+		return x.ProductType
+	}
+	return nil
+}
+
+func (m *ListingDimensionInfo) GetUnknownListingDimension() *UnknownListingDimensionInfo {
+	if x, ok := m.GetDimension().(*ListingDimensionInfo_UnknownListingDimension); ok {
+		return x.UnknownListingDimension
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ListingDimensionInfo) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ListingDimensionInfo_HotelId)(nil),
+		(*ListingDimensionInfo_HotelClass)(nil),
+		(*ListingDimensionInfo_HotelCountryRegion)(nil),
+		(*ListingDimensionInfo_HotelState)(nil),
+		(*ListingDimensionInfo_HotelCity)(nil),
+		(*ListingDimensionInfo_ProductBiddingCategory)(nil),
+		(*ListingDimensionInfo_ProductBrand)(nil),
+		(*ListingDimensionInfo_ProductChannel)(nil),
+		(*ListingDimensionInfo_ProductChannelExclusivity)(nil),
+		(*ListingDimensionInfo_ProductCondition)(nil),
+		(*ListingDimensionInfo_ProductCustomAttribute)(nil),
+		(*ListingDimensionInfo_ProductItemId)(nil),
+		(*ListingDimensionInfo_ProductType)(nil),
+		(*ListingDimensionInfo_UnknownListingDimension)(nil),
+	}
+}
+
+// Advertiser-specific hotel ID.
+type HotelIdInfo struct {
+	// String value of the hotel ID.
+	Value                *wrappers.StringValue `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *HotelIdInfo) Reset()         { *m = HotelIdInfo{} }
+func (m *HotelIdInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelIdInfo) ProtoMessage()    {}
+func (*HotelIdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{10}
+}
+
+func (m *HotelIdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelIdInfo.Unmarshal(m, b)
+}
+func (m *HotelIdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelIdInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelIdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelIdInfo.Merge(m, src)
+}
+func (m *HotelIdInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelIdInfo.Size(m)
+}
+func (m *HotelIdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelIdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelIdInfo proto.InternalMessageInfo
+
+func (m *HotelIdInfo) GetValue() *wrappers.StringValue {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+// Class of the hotel as a number of stars 1 to 5.
+type HotelClassInfo struct {
+	// Long value of the hotel class.
+	Value                *wrappers.Int64Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *HotelClassInfo) Reset()         { *m = HotelClassInfo{} }
+func (m *HotelClassInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelClassInfo) ProtoMessage()    {}
+func (*HotelClassInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{11}
+}
+
+func (m *HotelClassInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelClassInfo.Unmarshal(m, b)
+}
+func (m *HotelClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelClassInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelClassInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelClassInfo.Merge(m, src)
+}
+func (m *HotelClassInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelClassInfo.Size(m)
+}
+func (m *HotelClassInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelClassInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelClassInfo proto.InternalMessageInfo
+
+func (m *HotelClassInfo) GetValue() *wrappers.Int64Value {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+// Country or Region the hotel is located in.
+type HotelCountryRegionInfo struct {
+	// The Geo Target Constant resource name.
+	CountryRegionCriterion *wrappers.StringValue `protobuf:"bytes,1,opt,name=country_region_criterion,json=countryRegionCriterion,proto3" json:"country_region_criterion,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{}              `json:"-"`
+	XXX_unrecognized       []byte                `json:"-"`
+	XXX_sizecache          int32                 `json:"-"`
+}
+
+func (m *HotelCountryRegionInfo) Reset()         { *m = HotelCountryRegionInfo{} }
+func (m *HotelCountryRegionInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelCountryRegionInfo) ProtoMessage()    {}
+func (*HotelCountryRegionInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{12}
+}
+
+func (m *HotelCountryRegionInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelCountryRegionInfo.Unmarshal(m, b)
+}
+func (m *HotelCountryRegionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelCountryRegionInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelCountryRegionInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelCountryRegionInfo.Merge(m, src)
+}
+func (m *HotelCountryRegionInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelCountryRegionInfo.Size(m)
+}
+func (m *HotelCountryRegionInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelCountryRegionInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelCountryRegionInfo proto.InternalMessageInfo
+
+func (m *HotelCountryRegionInfo) GetCountryRegionCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryRegionCriterion
+	}
+	return nil
+}
+
+// State the hotel is located in.
+type HotelStateInfo struct {
+	// The Geo Target Constant resource name.
+	StateCriterion       *wrappers.StringValue `protobuf:"bytes,1,opt,name=state_criterion,json=stateCriterion,proto3" json:"state_criterion,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *HotelStateInfo) Reset()         { *m = HotelStateInfo{} }
+func (m *HotelStateInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelStateInfo) ProtoMessage()    {}
+func (*HotelStateInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{13}
+}
+
+func (m *HotelStateInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelStateInfo.Unmarshal(m, b)
+}
+func (m *HotelStateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelStateInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelStateInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelStateInfo.Merge(m, src)
+}
+func (m *HotelStateInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelStateInfo.Size(m)
+}
+func (m *HotelStateInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelStateInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelStateInfo proto.InternalMessageInfo
+
+func (m *HotelStateInfo) GetStateCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.StateCriterion
+	}
+	return nil
+}
+
+// City the hotel is located in.
+type HotelCityInfo struct {
+	// The Geo Target Constant resource name.
+	CityCriterion        *wrappers.StringValue `protobuf:"bytes,1,opt,name=city_criterion,json=cityCriterion,proto3" json:"city_criterion,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *HotelCityInfo) Reset()         { *m = HotelCityInfo{} }
+func (m *HotelCityInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelCityInfo) ProtoMessage()    {}
+func (*HotelCityInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{14}
+}
+
+func (m *HotelCityInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelCityInfo.Unmarshal(m, b)
+}
+func (m *HotelCityInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelCityInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelCityInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelCityInfo.Merge(m, src)
+}
+func (m *HotelCityInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelCityInfo.Size(m)
+}
+func (m *HotelCityInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelCityInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelCityInfo proto.InternalMessageInfo
+
+func (m *HotelCityInfo) GetCityCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.CityCriterion
+	}
+	return nil
+}
+
+// Bidding category of a product offer.
+type ProductBiddingCategoryInfo struct {
+	// ID of the product bidding category.
+	//
+	// This ID is equivalent to the google_product_category ID as described in
+	// this article: https://support.google.com/merchants/answer/6324436
+	Id *wrappers.Int64Value `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	// Two-letter upper-case country code of the product bidding category. It must
+	// match the campaign.shopping_setting.sales_country field.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,2,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// Level of the product bidding category.
+	Level                enums.ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel `protobuf:"varint,3,opt,name=level,proto3,enum=google.ads.googleads.v3.enums.ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel" json:"level,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                          `json:"-"`
+	XXX_unrecognized     []byte                                                            `json:"-"`
+	XXX_sizecache        int32                                                             `json:"-"`
+}
+
+func (m *ProductBiddingCategoryInfo) Reset()         { *m = ProductBiddingCategoryInfo{} }
+func (m *ProductBiddingCategoryInfo) String() string { return proto.CompactTextString(m) }
+func (*ProductBiddingCategoryInfo) ProtoMessage()    {}
+func (*ProductBiddingCategoryInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{15}
+}
+
+func (m *ProductBiddingCategoryInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductBiddingCategoryInfo.Unmarshal(m, b)
+}
+func (m *ProductBiddingCategoryInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductBiddingCategoryInfo.Marshal(b, m, deterministic)
+}
+func (m *ProductBiddingCategoryInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductBiddingCategoryInfo.Merge(m, src)
+}
+func (m *ProductBiddingCategoryInfo) XXX_Size() int {
+	return xxx_messageInfo_ProductBiddingCategoryInfo.Size(m)
+}
+func (m *ProductBiddingCategoryInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductBiddingCategoryInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductBiddingCategoryInfo proto.InternalMessageInfo
+
+func (m *ProductBiddingCategoryInfo) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *ProductBiddingCategoryInfo) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *ProductBiddingCategoryInfo) GetLevel() enums.ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel {
+	if m != nil {
+		return m.Level
+	}
+	return enums.ProductBiddingCategoryLevelEnum_UNSPECIFIED
+}
+
+// Brand of the product.
+type ProductBrandInfo struct {
+	// String value of the product brand.
+	Value                *wrappers.StringValue `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ProductBrandInfo) Reset()         { *m = ProductBrandInfo{} }
+func (m *ProductBrandInfo) String() string { return proto.CompactTextString(m) }
+func (*ProductBrandInfo) ProtoMessage()    {}
+func (*ProductBrandInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{16}
+}
+
+func (m *ProductBrandInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductBrandInfo.Unmarshal(m, b)
+}
+func (m *ProductBrandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductBrandInfo.Marshal(b, m, deterministic)
+}
+func (m *ProductBrandInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductBrandInfo.Merge(m, src)
+}
+func (m *ProductBrandInfo) XXX_Size() int {
+	return xxx_messageInfo_ProductBrandInfo.Size(m)
+}
+func (m *ProductBrandInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductBrandInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductBrandInfo proto.InternalMessageInfo
+
+func (m *ProductBrandInfo) GetValue() *wrappers.StringValue {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+// Locality of a product offer.
+type ProductChannelInfo struct {
+	// Value of the locality.
+	Channel              enums.ProductChannelEnum_ProductChannel `protobuf:"varint,1,opt,name=channel,proto3,enum=google.ads.googleads.v3.enums.ProductChannelEnum_ProductChannel" json:"channel,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *ProductChannelInfo) Reset()         { *m = ProductChannelInfo{} }
+func (m *ProductChannelInfo) String() string { return proto.CompactTextString(m) }
+func (*ProductChannelInfo) ProtoMessage()    {}
+func (*ProductChannelInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{17}
+}
+
+func (m *ProductChannelInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductChannelInfo.Unmarshal(m, b)
+}
+func (m *ProductChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductChannelInfo.Marshal(b, m, deterministic)
+}
+func (m *ProductChannelInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductChannelInfo.Merge(m, src)
+}
+func (m *ProductChannelInfo) XXX_Size() int {
+	return xxx_messageInfo_ProductChannelInfo.Size(m)
+}
+func (m *ProductChannelInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductChannelInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductChannelInfo proto.InternalMessageInfo
+
+func (m *ProductChannelInfo) GetChannel() enums.ProductChannelEnum_ProductChannel {
+	if m != nil {
+		return m.Channel
+	}
+	return enums.ProductChannelEnum_UNSPECIFIED
+}
+
+// Availability of a product offer.
+type ProductChannelExclusivityInfo struct {
+	// Value of the availability.
+	ChannelExclusivity   enums.ProductChannelExclusivityEnum_ProductChannelExclusivity `protobuf:"varint,1,opt,name=channel_exclusivity,json=channelExclusivity,proto3,enum=google.ads.googleads.v3.enums.ProductChannelExclusivityEnum_ProductChannelExclusivity" json:"channel_exclusivity,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                      `json:"-"`
+	XXX_unrecognized     []byte                                                        `json:"-"`
+	XXX_sizecache        int32                                                         `json:"-"`
+}
+
+func (m *ProductChannelExclusivityInfo) Reset()         { *m = ProductChannelExclusivityInfo{} }
+func (m *ProductChannelExclusivityInfo) String() string { return proto.CompactTextString(m) }
+func (*ProductChannelExclusivityInfo) ProtoMessage()    {}
+func (*ProductChannelExclusivityInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{18}
+}
+
+func (m *ProductChannelExclusivityInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductChannelExclusivityInfo.Unmarshal(m, b)
+}
+func (m *ProductChannelExclusivityInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductChannelExclusivityInfo.Marshal(b, m, deterministic)
+}
+func (m *ProductChannelExclusivityInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductChannelExclusivityInfo.Merge(m, src)
+}
+func (m *ProductChannelExclusivityInfo) XXX_Size() int {
+	return xxx_messageInfo_ProductChannelExclusivityInfo.Size(m)
+}
+func (m *ProductChannelExclusivityInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductChannelExclusivityInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductChannelExclusivityInfo proto.InternalMessageInfo
+
+func (m *ProductChannelExclusivityInfo) GetChannelExclusivity() enums.ProductChannelExclusivityEnum_ProductChannelExclusivity {
+	if m != nil {
+		return m.ChannelExclusivity
+	}
+	return enums.ProductChannelExclusivityEnum_UNSPECIFIED
+}
+
+// Condition of a product offer.
+type ProductConditionInfo struct {
+	// Value of the condition.
+	Condition            enums.ProductConditionEnum_ProductCondition `protobuf:"varint,1,opt,name=condition,proto3,enum=google.ads.googleads.v3.enums.ProductConditionEnum_ProductCondition" json:"condition,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *ProductConditionInfo) Reset()         { *m = ProductConditionInfo{} }
+func (m *ProductConditionInfo) String() string { return proto.CompactTextString(m) }
+func (*ProductConditionInfo) ProtoMessage()    {}
+func (*ProductConditionInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{19}
+}
+
+func (m *ProductConditionInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductConditionInfo.Unmarshal(m, b)
+}
+func (m *ProductConditionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductConditionInfo.Marshal(b, m, deterministic)
+}
+func (m *ProductConditionInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductConditionInfo.Merge(m, src)
+}
+func (m *ProductConditionInfo) XXX_Size() int {
+	return xxx_messageInfo_ProductConditionInfo.Size(m)
+}
+func (m *ProductConditionInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductConditionInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductConditionInfo proto.InternalMessageInfo
+
+func (m *ProductConditionInfo) GetCondition() enums.ProductConditionEnum_ProductCondition {
+	if m != nil {
+		return m.Condition
+	}
+	return enums.ProductConditionEnum_UNSPECIFIED
+}
+
+// Custom attribute of a product offer.
+type ProductCustomAttributeInfo struct {
+	// String value of the product custom attribute.
+	Value *wrappers.StringValue `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	// Indicates the index of the custom attribute.
+	Index                enums.ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex `protobuf:"varint,2,opt,name=index,proto3,enum=google.ads.googleads.v3.enums.ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex" json:"index,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                          `json:"-"`
+	XXX_unrecognized     []byte                                                            `json:"-"`
+	XXX_sizecache        int32                                                             `json:"-"`
+}
+
+func (m *ProductCustomAttributeInfo) Reset()         { *m = ProductCustomAttributeInfo{} }
+func (m *ProductCustomAttributeInfo) String() string { return proto.CompactTextString(m) }
+func (*ProductCustomAttributeInfo) ProtoMessage()    {}
+func (*ProductCustomAttributeInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{20}
+}
+
+func (m *ProductCustomAttributeInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductCustomAttributeInfo.Unmarshal(m, b)
+}
+func (m *ProductCustomAttributeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductCustomAttributeInfo.Marshal(b, m, deterministic)
+}
+func (m *ProductCustomAttributeInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductCustomAttributeInfo.Merge(m, src)
+}
+func (m *ProductCustomAttributeInfo) XXX_Size() int {
+	return xxx_messageInfo_ProductCustomAttributeInfo.Size(m)
+}
+func (m *ProductCustomAttributeInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductCustomAttributeInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductCustomAttributeInfo proto.InternalMessageInfo
+
+func (m *ProductCustomAttributeInfo) GetValue() *wrappers.StringValue {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *ProductCustomAttributeInfo) GetIndex() enums.ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex {
+	if m != nil {
+		return m.Index
+	}
+	return enums.ProductCustomAttributeIndexEnum_UNSPECIFIED
+}
+
+// Item id of a product offer.
+type ProductItemIdInfo struct {
+	// Value of the id.
+	Value                *wrappers.StringValue `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ProductItemIdInfo) Reset()         { *m = ProductItemIdInfo{} }
+func (m *ProductItemIdInfo) String() string { return proto.CompactTextString(m) }
+func (*ProductItemIdInfo) ProtoMessage()    {}
+func (*ProductItemIdInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{21}
+}
+
+func (m *ProductItemIdInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductItemIdInfo.Unmarshal(m, b)
+}
+func (m *ProductItemIdInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductItemIdInfo.Marshal(b, m, deterministic)
+}
+func (m *ProductItemIdInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductItemIdInfo.Merge(m, src)
+}
+func (m *ProductItemIdInfo) XXX_Size() int {
+	return xxx_messageInfo_ProductItemIdInfo.Size(m)
+}
+func (m *ProductItemIdInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductItemIdInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductItemIdInfo proto.InternalMessageInfo
+
+func (m *ProductItemIdInfo) GetValue() *wrappers.StringValue {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+// Type of a product offer.
+type ProductTypeInfo struct {
+	// Value of the type.
+	Value *wrappers.StringValue `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	// Level of the type.
+	Level                enums.ProductTypeLevelEnum_ProductTypeLevel `protobuf:"varint,2,opt,name=level,proto3,enum=google.ads.googleads.v3.enums.ProductTypeLevelEnum_ProductTypeLevel" json:"level,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *ProductTypeInfo) Reset()         { *m = ProductTypeInfo{} }
+func (m *ProductTypeInfo) String() string { return proto.CompactTextString(m) }
+func (*ProductTypeInfo) ProtoMessage()    {}
+func (*ProductTypeInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{22}
+}
+
+func (m *ProductTypeInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductTypeInfo.Unmarshal(m, b)
+}
+func (m *ProductTypeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductTypeInfo.Marshal(b, m, deterministic)
+}
+func (m *ProductTypeInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductTypeInfo.Merge(m, src)
+}
+func (m *ProductTypeInfo) XXX_Size() int {
+	return xxx_messageInfo_ProductTypeInfo.Size(m)
+}
+func (m *ProductTypeInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductTypeInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductTypeInfo proto.InternalMessageInfo
+
+func (m *ProductTypeInfo) GetValue() *wrappers.StringValue {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *ProductTypeInfo) GetLevel() enums.ProductTypeLevelEnum_ProductTypeLevel {
+	if m != nil {
+		return m.Level
+	}
+	return enums.ProductTypeLevelEnum_UNSPECIFIED
+}
+
+// Unknown listing dimension.
+type UnknownListingDimensionInfo struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UnknownListingDimensionInfo) Reset()         { *m = UnknownListingDimensionInfo{} }
+func (m *UnknownListingDimensionInfo) String() string { return proto.CompactTextString(m) }
+func (*UnknownListingDimensionInfo) ProtoMessage()    {}
+func (*UnknownListingDimensionInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{23}
+}
+
+func (m *UnknownListingDimensionInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UnknownListingDimensionInfo.Unmarshal(m, b)
+}
+func (m *UnknownListingDimensionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UnknownListingDimensionInfo.Marshal(b, m, deterministic)
+}
+func (m *UnknownListingDimensionInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UnknownListingDimensionInfo.Merge(m, src)
+}
+func (m *UnknownListingDimensionInfo) XXX_Size() int {
+	return xxx_messageInfo_UnknownListingDimensionInfo.Size(m)
+}
+func (m *UnknownListingDimensionInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UnknownListingDimensionInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UnknownListingDimensionInfo proto.InternalMessageInfo
+
+// Criterion for hotel date selection (default dates vs. user selected).
+type HotelDateSelectionTypeInfo struct {
+	// Type of the hotel date selection
+	Type                 enums.HotelDateSelectionTypeEnum_HotelDateSelectionType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.HotelDateSelectionTypeEnum_HotelDateSelectionType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                `json:"-"`
+	XXX_unrecognized     []byte                                                  `json:"-"`
+	XXX_sizecache        int32                                                   `json:"-"`
+}
+
+func (m *HotelDateSelectionTypeInfo) Reset()         { *m = HotelDateSelectionTypeInfo{} }
+func (m *HotelDateSelectionTypeInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelDateSelectionTypeInfo) ProtoMessage()    {}
+func (*HotelDateSelectionTypeInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{24}
+}
+
+func (m *HotelDateSelectionTypeInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelDateSelectionTypeInfo.Unmarshal(m, b)
+}
+func (m *HotelDateSelectionTypeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelDateSelectionTypeInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelDateSelectionTypeInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelDateSelectionTypeInfo.Merge(m, src)
+}
+func (m *HotelDateSelectionTypeInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelDateSelectionTypeInfo.Size(m)
+}
+func (m *HotelDateSelectionTypeInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelDateSelectionTypeInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelDateSelectionTypeInfo proto.InternalMessageInfo
+
+func (m *HotelDateSelectionTypeInfo) GetType() enums.HotelDateSelectionTypeEnum_HotelDateSelectionType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.HotelDateSelectionTypeEnum_UNSPECIFIED
+}
+
+// Criterion for number of days prior to the stay the booking is being made.
+type HotelAdvanceBookingWindowInfo struct {
+	// Low end of the number of days prior to the stay.
+	MinDays *wrappers.Int64Value `protobuf:"bytes,1,opt,name=min_days,json=minDays,proto3" json:"min_days,omitempty"`
+	// High end of the number of days prior to the stay.
+	MaxDays              *wrappers.Int64Value `protobuf:"bytes,2,opt,name=max_days,json=maxDays,proto3" json:"max_days,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *HotelAdvanceBookingWindowInfo) Reset()         { *m = HotelAdvanceBookingWindowInfo{} }
+func (m *HotelAdvanceBookingWindowInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelAdvanceBookingWindowInfo) ProtoMessage()    {}
+func (*HotelAdvanceBookingWindowInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{25}
+}
+
+func (m *HotelAdvanceBookingWindowInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelAdvanceBookingWindowInfo.Unmarshal(m, b)
+}
+func (m *HotelAdvanceBookingWindowInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelAdvanceBookingWindowInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelAdvanceBookingWindowInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelAdvanceBookingWindowInfo.Merge(m, src)
+}
+func (m *HotelAdvanceBookingWindowInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelAdvanceBookingWindowInfo.Size(m)
+}
+func (m *HotelAdvanceBookingWindowInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelAdvanceBookingWindowInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelAdvanceBookingWindowInfo proto.InternalMessageInfo
+
+func (m *HotelAdvanceBookingWindowInfo) GetMinDays() *wrappers.Int64Value {
+	if m != nil {
+		return m.MinDays
+	}
+	return nil
+}
+
+func (m *HotelAdvanceBookingWindowInfo) GetMaxDays() *wrappers.Int64Value {
+	if m != nil {
+		return m.MaxDays
+	}
+	return nil
+}
+
+// Criterion for length of hotel stay in nights.
+type HotelLengthOfStayInfo struct {
+	// Low end of the number of nights in the stay.
+	MinNights *wrappers.Int64Value `protobuf:"bytes,1,opt,name=min_nights,json=minNights,proto3" json:"min_nights,omitempty"`
+	// High end of the number of nights in the stay.
+	MaxNights            *wrappers.Int64Value `protobuf:"bytes,2,opt,name=max_nights,json=maxNights,proto3" json:"max_nights,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *HotelLengthOfStayInfo) Reset()         { *m = HotelLengthOfStayInfo{} }
+func (m *HotelLengthOfStayInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelLengthOfStayInfo) ProtoMessage()    {}
+func (*HotelLengthOfStayInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{26}
+}
+
+func (m *HotelLengthOfStayInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelLengthOfStayInfo.Unmarshal(m, b)
+}
+func (m *HotelLengthOfStayInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelLengthOfStayInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelLengthOfStayInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelLengthOfStayInfo.Merge(m, src)
+}
+func (m *HotelLengthOfStayInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelLengthOfStayInfo.Size(m)
+}
+func (m *HotelLengthOfStayInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelLengthOfStayInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelLengthOfStayInfo proto.InternalMessageInfo
+
+func (m *HotelLengthOfStayInfo) GetMinNights() *wrappers.Int64Value {
+	if m != nil {
+		return m.MinNights
+	}
+	return nil
+}
+
+func (m *HotelLengthOfStayInfo) GetMaxNights() *wrappers.Int64Value {
+	if m != nil {
+		return m.MaxNights
+	}
+	return nil
+}
+
+// Criterion for day of the week the booking is for.
+type HotelCheckInDayInfo struct {
+	// The day of the week.
+	DayOfWeek            enums.DayOfWeekEnum_DayOfWeek `protobuf:"varint,1,opt,name=day_of_week,json=dayOfWeek,proto3,enum=google.ads.googleads.v3.enums.DayOfWeekEnum_DayOfWeek" json:"day_of_week,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *HotelCheckInDayInfo) Reset()         { *m = HotelCheckInDayInfo{} }
+func (m *HotelCheckInDayInfo) String() string { return proto.CompactTextString(m) }
+func (*HotelCheckInDayInfo) ProtoMessage()    {}
+func (*HotelCheckInDayInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{27}
+}
+
+func (m *HotelCheckInDayInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelCheckInDayInfo.Unmarshal(m, b)
+}
+func (m *HotelCheckInDayInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelCheckInDayInfo.Marshal(b, m, deterministic)
+}
+func (m *HotelCheckInDayInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelCheckInDayInfo.Merge(m, src)
+}
+func (m *HotelCheckInDayInfo) XXX_Size() int {
+	return xxx_messageInfo_HotelCheckInDayInfo.Size(m)
+}
+func (m *HotelCheckInDayInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelCheckInDayInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelCheckInDayInfo proto.InternalMessageInfo
+
+func (m *HotelCheckInDayInfo) GetDayOfWeek() enums.DayOfWeekEnum_DayOfWeek {
+	if m != nil {
+		return m.DayOfWeek
+	}
+	return enums.DayOfWeekEnum_UNSPECIFIED
+}
+
+// Criterion for Interaction Type.
+type InteractionTypeInfo struct {
+	// The interaction type.
+	Type                 enums.InteractionTypeEnum_InteractionType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.InteractionTypeEnum_InteractionType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
+	XXX_unrecognized     []byte                                    `json:"-"`
+	XXX_sizecache        int32                                     `json:"-"`
+}
+
+func (m *InteractionTypeInfo) Reset()         { *m = InteractionTypeInfo{} }
+func (m *InteractionTypeInfo) String() string { return proto.CompactTextString(m) }
+func (*InteractionTypeInfo) ProtoMessage()    {}
+func (*InteractionTypeInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{28}
+}
+
+func (m *InteractionTypeInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_InteractionTypeInfo.Unmarshal(m, b)
+}
+func (m *InteractionTypeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_InteractionTypeInfo.Marshal(b, m, deterministic)
+}
+func (m *InteractionTypeInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_InteractionTypeInfo.Merge(m, src)
+}
+func (m *InteractionTypeInfo) XXX_Size() int {
+	return xxx_messageInfo_InteractionTypeInfo.Size(m)
+}
+func (m *InteractionTypeInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_InteractionTypeInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_InteractionTypeInfo proto.InternalMessageInfo
+
+func (m *InteractionTypeInfo) GetType() enums.InteractionTypeEnum_InteractionType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.InteractionTypeEnum_UNSPECIFIED
+}
+
+// Represents an AdSchedule criterion.
+//
+// AdSchedule is specified as the day of the week and a time interval
+// within which ads will be shown.
+//
+// No more than six AdSchedules can be added for the same day.
+type AdScheduleInfo struct {
+	// Minutes after the start hour at which this schedule starts.
+	//
+	// This field is required for CREATE operations and is prohibited on UPDATE
+	// operations.
+	StartMinute enums.MinuteOfHourEnum_MinuteOfHour `protobuf:"varint,1,opt,name=start_minute,json=startMinute,proto3,enum=google.ads.googleads.v3.enums.MinuteOfHourEnum_MinuteOfHour" json:"start_minute,omitempty"`
+	// Minutes after the end hour at which this schedule ends. The schedule is
+	// exclusive of the end minute.
+	//
+	// This field is required for CREATE operations and is prohibited on UPDATE
+	// operations.
+	EndMinute enums.MinuteOfHourEnum_MinuteOfHour `protobuf:"varint,2,opt,name=end_minute,json=endMinute,proto3,enum=google.ads.googleads.v3.enums.MinuteOfHourEnum_MinuteOfHour" json:"end_minute,omitempty"`
+	// Starting hour in 24 hour time.
+	// This field must be between 0 and 23, inclusive.
+	//
+	// This field is required for CREATE operations and is prohibited on UPDATE
+	// operations.
+	StartHour *wrappers.Int32Value `protobuf:"bytes,3,opt,name=start_hour,json=startHour,proto3" json:"start_hour,omitempty"`
+	// Ending hour in 24 hour time; 24 signifies end of the day.
+	// This field must be between 0 and 24, inclusive.
+	//
+	// This field is required for CREATE operations and is prohibited on UPDATE
+	// operations.
+	EndHour *wrappers.Int32Value `protobuf:"bytes,4,opt,name=end_hour,json=endHour,proto3" json:"end_hour,omitempty"`
+	// Day of the week the schedule applies to.
+	//
+	// This field is required for CREATE operations and is prohibited on UPDATE
+	// operations.
+	DayOfWeek            enums.DayOfWeekEnum_DayOfWeek `protobuf:"varint,5,opt,name=day_of_week,json=dayOfWeek,proto3,enum=google.ads.googleads.v3.enums.DayOfWeekEnum_DayOfWeek" json:"day_of_week,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *AdScheduleInfo) Reset()         { *m = AdScheduleInfo{} }
+func (m *AdScheduleInfo) String() string { return proto.CompactTextString(m) }
+func (*AdScheduleInfo) ProtoMessage()    {}
+func (*AdScheduleInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{29}
+}
+
+func (m *AdScheduleInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdScheduleInfo.Unmarshal(m, b)
+}
+func (m *AdScheduleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdScheduleInfo.Marshal(b, m, deterministic)
+}
+func (m *AdScheduleInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdScheduleInfo.Merge(m, src)
+}
+func (m *AdScheduleInfo) XXX_Size() int {
+	return xxx_messageInfo_AdScheduleInfo.Size(m)
+}
+func (m *AdScheduleInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdScheduleInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdScheduleInfo proto.InternalMessageInfo
+
+func (m *AdScheduleInfo) GetStartMinute() enums.MinuteOfHourEnum_MinuteOfHour {
+	if m != nil {
+		return m.StartMinute
+	}
+	return enums.MinuteOfHourEnum_UNSPECIFIED
+}
+
+func (m *AdScheduleInfo) GetEndMinute() enums.MinuteOfHourEnum_MinuteOfHour {
+	if m != nil {
+		return m.EndMinute
+	}
+	return enums.MinuteOfHourEnum_UNSPECIFIED
+}
+
+func (m *AdScheduleInfo) GetStartHour() *wrappers.Int32Value {
+	if m != nil {
+		return m.StartHour
+	}
+	return nil
+}
+
+func (m *AdScheduleInfo) GetEndHour() *wrappers.Int32Value {
+	if m != nil {
+		return m.EndHour
+	}
+	return nil
+}
+
+func (m *AdScheduleInfo) GetDayOfWeek() enums.DayOfWeekEnum_DayOfWeek {
+	if m != nil {
+		return m.DayOfWeek
+	}
+	return enums.DayOfWeekEnum_UNSPECIFIED
+}
+
+// An age range criterion.
+type AgeRangeInfo struct {
+	// Type of the age range.
+	Type                 enums.AgeRangeTypeEnum_AgeRangeType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.AgeRangeTypeEnum_AgeRangeType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
+	XXX_unrecognized     []byte                              `json:"-"`
+	XXX_sizecache        int32                               `json:"-"`
+}
+
+func (m *AgeRangeInfo) Reset()         { *m = AgeRangeInfo{} }
+func (m *AgeRangeInfo) String() string { return proto.CompactTextString(m) }
+func (*AgeRangeInfo) ProtoMessage()    {}
+func (*AgeRangeInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{30}
+}
+
+func (m *AgeRangeInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AgeRangeInfo.Unmarshal(m, b)
+}
+func (m *AgeRangeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AgeRangeInfo.Marshal(b, m, deterministic)
+}
+func (m *AgeRangeInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AgeRangeInfo.Merge(m, src)
+}
+func (m *AgeRangeInfo) XXX_Size() int {
+	return xxx_messageInfo_AgeRangeInfo.Size(m)
+}
+func (m *AgeRangeInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_AgeRangeInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AgeRangeInfo proto.InternalMessageInfo
+
+func (m *AgeRangeInfo) GetType() enums.AgeRangeTypeEnum_AgeRangeType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.AgeRangeTypeEnum_UNSPECIFIED
+}
+
+// A gender criterion.
+type GenderInfo struct {
+	// Type of the gender.
+	Type                 enums.GenderTypeEnum_GenderType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.GenderTypeEnum_GenderType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *GenderInfo) Reset()         { *m = GenderInfo{} }
+func (m *GenderInfo) String() string { return proto.CompactTextString(m) }
+func (*GenderInfo) ProtoMessage()    {}
+func (*GenderInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{31}
+}
+
+func (m *GenderInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenderInfo.Unmarshal(m, b)
+}
+func (m *GenderInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenderInfo.Marshal(b, m, deterministic)
+}
+func (m *GenderInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenderInfo.Merge(m, src)
+}
+func (m *GenderInfo) XXX_Size() int {
+	return xxx_messageInfo_GenderInfo.Size(m)
+}
+func (m *GenderInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenderInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenderInfo proto.InternalMessageInfo
+
+func (m *GenderInfo) GetType() enums.GenderTypeEnum_GenderType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.GenderTypeEnum_UNSPECIFIED
+}
+
+// An income range criterion.
+type IncomeRangeInfo struct {
+	// Type of the income range.
+	Type                 enums.IncomeRangeTypeEnum_IncomeRangeType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.IncomeRangeTypeEnum_IncomeRangeType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
+	XXX_unrecognized     []byte                                    `json:"-"`
+	XXX_sizecache        int32                                     `json:"-"`
+}
+
+func (m *IncomeRangeInfo) Reset()         { *m = IncomeRangeInfo{} }
+func (m *IncomeRangeInfo) String() string { return proto.CompactTextString(m) }
+func (*IncomeRangeInfo) ProtoMessage()    {}
+func (*IncomeRangeInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{32}
+}
+
+func (m *IncomeRangeInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_IncomeRangeInfo.Unmarshal(m, b)
+}
+func (m *IncomeRangeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_IncomeRangeInfo.Marshal(b, m, deterministic)
+}
+func (m *IncomeRangeInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_IncomeRangeInfo.Merge(m, src)
+}
+func (m *IncomeRangeInfo) XXX_Size() int {
+	return xxx_messageInfo_IncomeRangeInfo.Size(m)
+}
+func (m *IncomeRangeInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_IncomeRangeInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_IncomeRangeInfo proto.InternalMessageInfo
+
+func (m *IncomeRangeInfo) GetType() enums.IncomeRangeTypeEnum_IncomeRangeType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.IncomeRangeTypeEnum_UNSPECIFIED
+}
+
+// A parental status criterion.
+type ParentalStatusInfo struct {
+	// Type of the parental status.
+	Type                 enums.ParentalStatusTypeEnum_ParentalStatusType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.ParentalStatusTypeEnum_ParentalStatusType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                        `json:"-"`
+	XXX_unrecognized     []byte                                          `json:"-"`
+	XXX_sizecache        int32                                           `json:"-"`
+}
+
+func (m *ParentalStatusInfo) Reset()         { *m = ParentalStatusInfo{} }
+func (m *ParentalStatusInfo) String() string { return proto.CompactTextString(m) }
+func (*ParentalStatusInfo) ProtoMessage()    {}
+func (*ParentalStatusInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{33}
+}
+
+func (m *ParentalStatusInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ParentalStatusInfo.Unmarshal(m, b)
+}
+func (m *ParentalStatusInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ParentalStatusInfo.Marshal(b, m, deterministic)
+}
+func (m *ParentalStatusInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ParentalStatusInfo.Merge(m, src)
+}
+func (m *ParentalStatusInfo) XXX_Size() int {
+	return xxx_messageInfo_ParentalStatusInfo.Size(m)
+}
+func (m *ParentalStatusInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ParentalStatusInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ParentalStatusInfo proto.InternalMessageInfo
+
+func (m *ParentalStatusInfo) GetType() enums.ParentalStatusTypeEnum_ParentalStatusType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.ParentalStatusTypeEnum_UNSPECIFIED
+}
+
+// A YouTube Video criterion.
+type YouTubeVideoInfo struct {
+	// YouTube video id as it appears on the YouTube watch page.
+	VideoId              *wrappers.StringValue `protobuf:"bytes,1,opt,name=video_id,json=videoId,proto3" json:"video_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *YouTubeVideoInfo) Reset()         { *m = YouTubeVideoInfo{} }
+func (m *YouTubeVideoInfo) String() string { return proto.CompactTextString(m) }
+func (*YouTubeVideoInfo) ProtoMessage()    {}
+func (*YouTubeVideoInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{34}
+}
+
+func (m *YouTubeVideoInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_YouTubeVideoInfo.Unmarshal(m, b)
+}
+func (m *YouTubeVideoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_YouTubeVideoInfo.Marshal(b, m, deterministic)
+}
+func (m *YouTubeVideoInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_YouTubeVideoInfo.Merge(m, src)
+}
+func (m *YouTubeVideoInfo) XXX_Size() int {
+	return xxx_messageInfo_YouTubeVideoInfo.Size(m)
+}
+func (m *YouTubeVideoInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_YouTubeVideoInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_YouTubeVideoInfo proto.InternalMessageInfo
+
+func (m *YouTubeVideoInfo) GetVideoId() *wrappers.StringValue {
+	if m != nil {
+		return m.VideoId
+	}
+	return nil
+}
+
+// A YouTube Channel criterion.
+type YouTubeChannelInfo struct {
+	// The YouTube uploader channel id or the channel code of a YouTube channel.
+	ChannelId            *wrappers.StringValue `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *YouTubeChannelInfo) Reset()         { *m = YouTubeChannelInfo{} }
+func (m *YouTubeChannelInfo) String() string { return proto.CompactTextString(m) }
+func (*YouTubeChannelInfo) ProtoMessage()    {}
+func (*YouTubeChannelInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{35}
+}
+
+func (m *YouTubeChannelInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_YouTubeChannelInfo.Unmarshal(m, b)
+}
+func (m *YouTubeChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_YouTubeChannelInfo.Marshal(b, m, deterministic)
+}
+func (m *YouTubeChannelInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_YouTubeChannelInfo.Merge(m, src)
+}
+func (m *YouTubeChannelInfo) XXX_Size() int {
+	return xxx_messageInfo_YouTubeChannelInfo.Size(m)
+}
+func (m *YouTubeChannelInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_YouTubeChannelInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_YouTubeChannelInfo proto.InternalMessageInfo
+
+func (m *YouTubeChannelInfo) GetChannelId() *wrappers.StringValue {
+	if m != nil {
+		return m.ChannelId
+	}
+	return nil
+}
+
+// A User List criterion. Represents a user list that is defined by the
+// advertiser to be targeted.
+type UserListInfo struct {
+	// The User List resource name.
+	UserList             *wrappers.StringValue `protobuf:"bytes,1,opt,name=user_list,json=userList,proto3" json:"user_list,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UserListInfo) Reset()         { *m = UserListInfo{} }
+func (m *UserListInfo) String() string { return proto.CompactTextString(m) }
+func (*UserListInfo) ProtoMessage()    {}
+func (*UserListInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{36}
+}
+
+func (m *UserListInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListInfo.Unmarshal(m, b)
+}
+func (m *UserListInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListInfo.Marshal(b, m, deterministic)
+}
+func (m *UserListInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListInfo.Merge(m, src)
+}
+func (m *UserListInfo) XXX_Size() int {
+	return xxx_messageInfo_UserListInfo.Size(m)
+}
+func (m *UserListInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListInfo proto.InternalMessageInfo
+
+func (m *UserListInfo) GetUserList() *wrappers.StringValue {
+	if m != nil {
+		return m.UserList
+	}
+	return nil
+}
+
+// A Proximity criterion. The geo point and radius determine what geographical
+// area is included. The address is a description of the geo point that does
+// not affect ad serving.
+//
+// There are two ways to create a proximity. First, by setting an address
+// and radius. The geo point will be automatically computed. Second, by
+// setting a geo point and radius. The address is an optional label that won't
+// be validated.
+type ProximityInfo struct {
+	// Latitude and longitude.
+	GeoPoint *GeoPointInfo `protobuf:"bytes,1,opt,name=geo_point,json=geoPoint,proto3" json:"geo_point,omitempty"`
+	// The radius of the proximity.
+	Radius *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=radius,proto3" json:"radius,omitempty"`
+	// The unit of measurement of the radius. Default is KILOMETERS.
+	RadiusUnits enums.ProximityRadiusUnitsEnum_ProximityRadiusUnits `protobuf:"varint,3,opt,name=radius_units,json=radiusUnits,proto3,enum=google.ads.googleads.v3.enums.ProximityRadiusUnitsEnum_ProximityRadiusUnits" json:"radius_units,omitempty"`
+	// Full address.
+	Address              *AddressInfo `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *ProximityInfo) Reset()         { *m = ProximityInfo{} }
+func (m *ProximityInfo) String() string { return proto.CompactTextString(m) }
+func (*ProximityInfo) ProtoMessage()    {}
+func (*ProximityInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{37}
+}
+
+func (m *ProximityInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProximityInfo.Unmarshal(m, b)
+}
+func (m *ProximityInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProximityInfo.Marshal(b, m, deterministic)
+}
+func (m *ProximityInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProximityInfo.Merge(m, src)
+}
+func (m *ProximityInfo) XXX_Size() int {
+	return xxx_messageInfo_ProximityInfo.Size(m)
+}
+func (m *ProximityInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProximityInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProximityInfo proto.InternalMessageInfo
+
+func (m *ProximityInfo) GetGeoPoint() *GeoPointInfo {
+	if m != nil {
+		return m.GeoPoint
+	}
+	return nil
+}
+
+func (m *ProximityInfo) GetRadius() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Radius
+	}
+	return nil
+}
+
+func (m *ProximityInfo) GetRadiusUnits() enums.ProximityRadiusUnitsEnum_ProximityRadiusUnits {
+	if m != nil {
+		return m.RadiusUnits
+	}
+	return enums.ProximityRadiusUnitsEnum_UNSPECIFIED
+}
+
+func (m *ProximityInfo) GetAddress() *AddressInfo {
+	if m != nil {
+		return m.Address
+	}
+	return nil
+}
+
+// Geo point for proximity criterion.
+type GeoPointInfo struct {
+	// Micro degrees for the longitude.
+	LongitudeInMicroDegrees *wrappers.Int32Value `protobuf:"bytes,1,opt,name=longitude_in_micro_degrees,json=longitudeInMicroDegrees,proto3" json:"longitude_in_micro_degrees,omitempty"`
+	// Micro degrees for the latitude.
+	LatitudeInMicroDegrees *wrappers.Int32Value `protobuf:"bytes,2,opt,name=latitude_in_micro_degrees,json=latitudeInMicroDegrees,proto3" json:"latitude_in_micro_degrees,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{}             `json:"-"`
+	XXX_unrecognized       []byte               `json:"-"`
+	XXX_sizecache          int32                `json:"-"`
+}
+
+func (m *GeoPointInfo) Reset()         { *m = GeoPointInfo{} }
+func (m *GeoPointInfo) String() string { return proto.CompactTextString(m) }
+func (*GeoPointInfo) ProtoMessage()    {}
+func (*GeoPointInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{38}
+}
+
+func (m *GeoPointInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GeoPointInfo.Unmarshal(m, b)
+}
+func (m *GeoPointInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GeoPointInfo.Marshal(b, m, deterministic)
+}
+func (m *GeoPointInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GeoPointInfo.Merge(m, src)
+}
+func (m *GeoPointInfo) XXX_Size() int {
+	return xxx_messageInfo_GeoPointInfo.Size(m)
+}
+func (m *GeoPointInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_GeoPointInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GeoPointInfo proto.InternalMessageInfo
+
+func (m *GeoPointInfo) GetLongitudeInMicroDegrees() *wrappers.Int32Value {
+	if m != nil {
+		return m.LongitudeInMicroDegrees
+	}
+	return nil
+}
+
+func (m *GeoPointInfo) GetLatitudeInMicroDegrees() *wrappers.Int32Value {
+	if m != nil {
+		return m.LatitudeInMicroDegrees
+	}
+	return nil
+}
+
+// Address for proximity criterion.
+type AddressInfo struct {
+	// Postal code.
+	PostalCode *wrappers.StringValue `protobuf:"bytes,1,opt,name=postal_code,json=postalCode,proto3" json:"postal_code,omitempty"`
+	// Province or state code.
+	ProvinceCode *wrappers.StringValue `protobuf:"bytes,2,opt,name=province_code,json=provinceCode,proto3" json:"province_code,omitempty"`
+	// Country code.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,3,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// Province or state name.
+	ProvinceName *wrappers.StringValue `protobuf:"bytes,4,opt,name=province_name,json=provinceName,proto3" json:"province_name,omitempty"`
+	// Street address line 1.
+	StreetAddress *wrappers.StringValue `protobuf:"bytes,5,opt,name=street_address,json=streetAddress,proto3" json:"street_address,omitempty"`
+	// Street address line 2. This field is write-only. It is only used for
+	// calculating the longitude and latitude of an address when geo_point is
+	// empty.
+	StreetAddress2 *wrappers.StringValue `protobuf:"bytes,6,opt,name=street_address2,json=streetAddress2,proto3" json:"street_address2,omitempty"`
+	// Name of the city.
+	CityName             *wrappers.StringValue `protobuf:"bytes,7,opt,name=city_name,json=cityName,proto3" json:"city_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AddressInfo) Reset()         { *m = AddressInfo{} }
+func (m *AddressInfo) String() string { return proto.CompactTextString(m) }
+func (*AddressInfo) ProtoMessage()    {}
+func (*AddressInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{39}
+}
+
+func (m *AddressInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AddressInfo.Unmarshal(m, b)
+}
+func (m *AddressInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AddressInfo.Marshal(b, m, deterministic)
+}
+func (m *AddressInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AddressInfo.Merge(m, src)
+}
+func (m *AddressInfo) XXX_Size() int {
+	return xxx_messageInfo_AddressInfo.Size(m)
+}
+func (m *AddressInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_AddressInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AddressInfo proto.InternalMessageInfo
+
+func (m *AddressInfo) GetPostalCode() *wrappers.StringValue {
+	if m != nil {
+		return m.PostalCode
+	}
+	return nil
+}
+
+func (m *AddressInfo) GetProvinceCode() *wrappers.StringValue {
+	if m != nil {
+		return m.ProvinceCode
+	}
+	return nil
+}
+
+func (m *AddressInfo) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *AddressInfo) GetProvinceName() *wrappers.StringValue {
+	if m != nil {
+		return m.ProvinceName
+	}
+	return nil
+}
+
+func (m *AddressInfo) GetStreetAddress() *wrappers.StringValue {
+	if m != nil {
+		return m.StreetAddress
+	}
+	return nil
+}
+
+func (m *AddressInfo) GetStreetAddress2() *wrappers.StringValue {
+	if m != nil {
+		return m.StreetAddress2
+	}
+	return nil
+}
+
+func (m *AddressInfo) GetCityName() *wrappers.StringValue {
+	if m != nil {
+		return m.CityName
+	}
+	return nil
+}
+
+// A topic criterion. Use topics to target or exclude placements in the
+// Google Display Network based on the category into which the placement falls
+// (for example, "Pets & Animals/Pets/Dogs").
+type TopicInfo struct {
+	// The Topic Constant resource name.
+	TopicConstant *wrappers.StringValue `protobuf:"bytes,1,opt,name=topic_constant,json=topicConstant,proto3" json:"topic_constant,omitempty"`
+	// The category to target or exclude. Each subsequent element in the array
+	// describes a more specific sub-category. For example,
+	// "Pets & Animals", "Pets", "Dogs" represents the "Pets & Animals/Pets/Dogs"
+	// category.
+	Path                 []*wrappers.StringValue `protobuf:"bytes,2,rep,name=path,proto3" json:"path,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *TopicInfo) Reset()         { *m = TopicInfo{} }
+func (m *TopicInfo) String() string { return proto.CompactTextString(m) }
+func (*TopicInfo) ProtoMessage()    {}
+func (*TopicInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{40}
+}
+
+func (m *TopicInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TopicInfo.Unmarshal(m, b)
+}
+func (m *TopicInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TopicInfo.Marshal(b, m, deterministic)
+}
+func (m *TopicInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TopicInfo.Merge(m, src)
+}
+func (m *TopicInfo) XXX_Size() int {
+	return xxx_messageInfo_TopicInfo.Size(m)
+}
+func (m *TopicInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_TopicInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TopicInfo proto.InternalMessageInfo
+
+func (m *TopicInfo) GetTopicConstant() *wrappers.StringValue {
+	if m != nil {
+		return m.TopicConstant
+	}
+	return nil
+}
+
+func (m *TopicInfo) GetPath() []*wrappers.StringValue {
+	if m != nil {
+		return m.Path
+	}
+	return nil
+}
+
+// A language criterion.
+type LanguageInfo struct {
+	// The language constant resource name.
+	LanguageConstant     *wrappers.StringValue `protobuf:"bytes,1,opt,name=language_constant,json=languageConstant,proto3" json:"language_constant,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *LanguageInfo) Reset()         { *m = LanguageInfo{} }
+func (m *LanguageInfo) String() string { return proto.CompactTextString(m) }
+func (*LanguageInfo) ProtoMessage()    {}
+func (*LanguageInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{41}
+}
+
+func (m *LanguageInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LanguageInfo.Unmarshal(m, b)
+}
+func (m *LanguageInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LanguageInfo.Marshal(b, m, deterministic)
+}
+func (m *LanguageInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LanguageInfo.Merge(m, src)
+}
+func (m *LanguageInfo) XXX_Size() int {
+	return xxx_messageInfo_LanguageInfo.Size(m)
+}
+func (m *LanguageInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_LanguageInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LanguageInfo proto.InternalMessageInfo
+
+func (m *LanguageInfo) GetLanguageConstant() *wrappers.StringValue {
+	if m != nil {
+		return m.LanguageConstant
+	}
+	return nil
+}
+
+// An IpBlock criterion used for IP exclusions. We allow:
+//  - IPv4 and IPv6 addresses
+//  - individual addresses (192.168.0.1)
+//  - masks for individual addresses (192.168.0.1/32)
+//  - masks for Class C networks (192.168.0.1/24)
+type IpBlockInfo struct {
+	// The IP address of this IP block.
+	IpAddress            *wrappers.StringValue `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *IpBlockInfo) Reset()         { *m = IpBlockInfo{} }
+func (m *IpBlockInfo) String() string { return proto.CompactTextString(m) }
+func (*IpBlockInfo) ProtoMessage()    {}
+func (*IpBlockInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{42}
+}
+
+func (m *IpBlockInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_IpBlockInfo.Unmarshal(m, b)
+}
+func (m *IpBlockInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_IpBlockInfo.Marshal(b, m, deterministic)
+}
+func (m *IpBlockInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_IpBlockInfo.Merge(m, src)
+}
+func (m *IpBlockInfo) XXX_Size() int {
+	return xxx_messageInfo_IpBlockInfo.Size(m)
+}
+func (m *IpBlockInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_IpBlockInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_IpBlockInfo proto.InternalMessageInfo
+
+func (m *IpBlockInfo) GetIpAddress() *wrappers.StringValue {
+	if m != nil {
+		return m.IpAddress
+	}
+	return nil
+}
+
+// Content Label for category exclusion.
+type ContentLabelInfo struct {
+	// Content label type, required for CREATE operations.
+	Type                 enums.ContentLabelTypeEnum_ContentLabelType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.ContentLabelTypeEnum_ContentLabelType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *ContentLabelInfo) Reset()         { *m = ContentLabelInfo{} }
+func (m *ContentLabelInfo) String() string { return proto.CompactTextString(m) }
+func (*ContentLabelInfo) ProtoMessage()    {}
+func (*ContentLabelInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{43}
+}
+
+func (m *ContentLabelInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ContentLabelInfo.Unmarshal(m, b)
+}
+func (m *ContentLabelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ContentLabelInfo.Marshal(b, m, deterministic)
+}
+func (m *ContentLabelInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ContentLabelInfo.Merge(m, src)
+}
+func (m *ContentLabelInfo) XXX_Size() int {
+	return xxx_messageInfo_ContentLabelInfo.Size(m)
+}
+func (m *ContentLabelInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ContentLabelInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ContentLabelInfo proto.InternalMessageInfo
+
+func (m *ContentLabelInfo) GetType() enums.ContentLabelTypeEnum_ContentLabelType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.ContentLabelTypeEnum_UNSPECIFIED
+}
+
+// Represents a Carrier Criterion.
+type CarrierInfo struct {
+	// The Carrier constant resource name.
+	CarrierConstant      *wrappers.StringValue `protobuf:"bytes,1,opt,name=carrier_constant,json=carrierConstant,proto3" json:"carrier_constant,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CarrierInfo) Reset()         { *m = CarrierInfo{} }
+func (m *CarrierInfo) String() string { return proto.CompactTextString(m) }
+func (*CarrierInfo) ProtoMessage()    {}
+func (*CarrierInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{44}
+}
+
+func (m *CarrierInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CarrierInfo.Unmarshal(m, b)
+}
+func (m *CarrierInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CarrierInfo.Marshal(b, m, deterministic)
+}
+func (m *CarrierInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CarrierInfo.Merge(m, src)
+}
+func (m *CarrierInfo) XXX_Size() int {
+	return xxx_messageInfo_CarrierInfo.Size(m)
+}
+func (m *CarrierInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_CarrierInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CarrierInfo proto.InternalMessageInfo
+
+func (m *CarrierInfo) GetCarrierConstant() *wrappers.StringValue {
+	if m != nil {
+		return m.CarrierConstant
+	}
+	return nil
+}
+
+// Represents a particular interest-based topic to be targeted.
+type UserInterestInfo struct {
+	// The UserInterest resource name.
+	UserInterestCategory *wrappers.StringValue `protobuf:"bytes,1,opt,name=user_interest_category,json=userInterestCategory,proto3" json:"user_interest_category,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UserInterestInfo) Reset()         { *m = UserInterestInfo{} }
+func (m *UserInterestInfo) String() string { return proto.CompactTextString(m) }
+func (*UserInterestInfo) ProtoMessage()    {}
+func (*UserInterestInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{45}
+}
+
+func (m *UserInterestInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserInterestInfo.Unmarshal(m, b)
+}
+func (m *UserInterestInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserInterestInfo.Marshal(b, m, deterministic)
+}
+func (m *UserInterestInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserInterestInfo.Merge(m, src)
+}
+func (m *UserInterestInfo) XXX_Size() int {
+	return xxx_messageInfo_UserInterestInfo.Size(m)
+}
+func (m *UserInterestInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserInterestInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserInterestInfo proto.InternalMessageInfo
+
+func (m *UserInterestInfo) GetUserInterestCategory() *wrappers.StringValue {
+	if m != nil {
+		return m.UserInterestCategory
+	}
+	return nil
+}
+
+// Represents a criterion for targeting webpages of an advertiser's website.
+type WebpageInfo struct {
+	// The name of the criterion that is defined by this parameter. The name value
+	// will be used for identifying, sorting and filtering criteria with this type
+	// of parameters.
+	//
+	// This field is required for CREATE operations and is prohibited on UPDATE
+	// operations.
+	CriterionName *wrappers.StringValue `protobuf:"bytes,1,opt,name=criterion_name,json=criterionName,proto3" json:"criterion_name,omitempty"`
+	// Conditions, or logical expressions, for webpage targeting. The list of
+	// webpage targeting conditions are and-ed together when evaluated
+	// for targeting.
+	//
+	// This field is required for CREATE operations and is prohibited on UPDATE
+	// operations.
+	Conditions           []*WebpageConditionInfo `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *WebpageInfo) Reset()         { *m = WebpageInfo{} }
+func (m *WebpageInfo) String() string { return proto.CompactTextString(m) }
+func (*WebpageInfo) ProtoMessage()    {}
+func (*WebpageInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{46}
+}
+
+func (m *WebpageInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WebpageInfo.Unmarshal(m, b)
+}
+func (m *WebpageInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WebpageInfo.Marshal(b, m, deterministic)
+}
+func (m *WebpageInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WebpageInfo.Merge(m, src)
+}
+func (m *WebpageInfo) XXX_Size() int {
+	return xxx_messageInfo_WebpageInfo.Size(m)
+}
+func (m *WebpageInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_WebpageInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WebpageInfo proto.InternalMessageInfo
+
+func (m *WebpageInfo) GetCriterionName() *wrappers.StringValue {
+	if m != nil {
+		return m.CriterionName
+	}
+	return nil
+}
+
+func (m *WebpageInfo) GetConditions() []*WebpageConditionInfo {
+	if m != nil {
+		return m.Conditions
+	}
+	return nil
+}
+
+// Logical expression for targeting webpages of an advertiser's website.
+type WebpageConditionInfo struct {
+	// Operand of webpage targeting condition.
+	Operand enums.WebpageConditionOperandEnum_WebpageConditionOperand `protobuf:"varint,1,opt,name=operand,proto3,enum=google.ads.googleads.v3.enums.WebpageConditionOperandEnum_WebpageConditionOperand" json:"operand,omitempty"`
+	// Operator of webpage targeting condition.
+	Operator enums.WebpageConditionOperatorEnum_WebpageConditionOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=google.ads.googleads.v3.enums.WebpageConditionOperatorEnum_WebpageConditionOperator" json:"operator,omitempty"`
+	// Argument of webpage targeting condition.
+	Argument             *wrappers.StringValue `protobuf:"bytes,3,opt,name=argument,proto3" json:"argument,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *WebpageConditionInfo) Reset()         { *m = WebpageConditionInfo{} }
+func (m *WebpageConditionInfo) String() string { return proto.CompactTextString(m) }
+func (*WebpageConditionInfo) ProtoMessage()    {}
+func (*WebpageConditionInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{47}
+}
+
+func (m *WebpageConditionInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WebpageConditionInfo.Unmarshal(m, b)
+}
+func (m *WebpageConditionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WebpageConditionInfo.Marshal(b, m, deterministic)
+}
+func (m *WebpageConditionInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WebpageConditionInfo.Merge(m, src)
+}
+func (m *WebpageConditionInfo) XXX_Size() int {
+	return xxx_messageInfo_WebpageConditionInfo.Size(m)
+}
+func (m *WebpageConditionInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_WebpageConditionInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WebpageConditionInfo proto.InternalMessageInfo
+
+func (m *WebpageConditionInfo) GetOperand() enums.WebpageConditionOperandEnum_WebpageConditionOperand {
+	if m != nil {
+		return m.Operand
+	}
+	return enums.WebpageConditionOperandEnum_UNSPECIFIED
+}
+
+func (m *WebpageConditionInfo) GetOperator() enums.WebpageConditionOperatorEnum_WebpageConditionOperator {
+	if m != nil {
+		return m.Operator
+	}
+	return enums.WebpageConditionOperatorEnum_UNSPECIFIED
+}
+
+func (m *WebpageConditionInfo) GetArgument() *wrappers.StringValue {
+	if m != nil {
+		return m.Argument
+	}
+	return nil
+}
+
+// Represents an operating system version to be targeted.
+type OperatingSystemVersionInfo struct {
+	// The operating system version constant resource name.
+	OperatingSystemVersionConstant *wrappers.StringValue `protobuf:"bytes,1,opt,name=operating_system_version_constant,json=operatingSystemVersionConstant,proto3" json:"operating_system_version_constant,omitempty"`
+	XXX_NoUnkeyedLiteral           struct{}              `json:"-"`
+	XXX_unrecognized               []byte                `json:"-"`
+	XXX_sizecache                  int32                 `json:"-"`
+}
+
+func (m *OperatingSystemVersionInfo) Reset()         { *m = OperatingSystemVersionInfo{} }
+func (m *OperatingSystemVersionInfo) String() string { return proto.CompactTextString(m) }
+func (*OperatingSystemVersionInfo) ProtoMessage()    {}
+func (*OperatingSystemVersionInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{48}
+}
+
+func (m *OperatingSystemVersionInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OperatingSystemVersionInfo.Unmarshal(m, b)
+}
+func (m *OperatingSystemVersionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OperatingSystemVersionInfo.Marshal(b, m, deterministic)
+}
+func (m *OperatingSystemVersionInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OperatingSystemVersionInfo.Merge(m, src)
+}
+func (m *OperatingSystemVersionInfo) XXX_Size() int {
+	return xxx_messageInfo_OperatingSystemVersionInfo.Size(m)
+}
+func (m *OperatingSystemVersionInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_OperatingSystemVersionInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OperatingSystemVersionInfo proto.InternalMessageInfo
+
+func (m *OperatingSystemVersionInfo) GetOperatingSystemVersionConstant() *wrappers.StringValue {
+	if m != nil {
+		return m.OperatingSystemVersionConstant
+	}
+	return nil
+}
+
+// An app payment model criterion.
+type AppPaymentModelInfo struct {
+	// Type of the app payment model.
+	Type                 enums.AppPaymentModelTypeEnum_AppPaymentModelType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.AppPaymentModelTypeEnum_AppPaymentModelType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                          `json:"-"`
+	XXX_unrecognized     []byte                                            `json:"-"`
+	XXX_sizecache        int32                                             `json:"-"`
+}
+
+func (m *AppPaymentModelInfo) Reset()         { *m = AppPaymentModelInfo{} }
+func (m *AppPaymentModelInfo) String() string { return proto.CompactTextString(m) }
+func (*AppPaymentModelInfo) ProtoMessage()    {}
+func (*AppPaymentModelInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{49}
+}
+
+func (m *AppPaymentModelInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppPaymentModelInfo.Unmarshal(m, b)
+}
+func (m *AppPaymentModelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppPaymentModelInfo.Marshal(b, m, deterministic)
+}
+func (m *AppPaymentModelInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppPaymentModelInfo.Merge(m, src)
+}
+func (m *AppPaymentModelInfo) XXX_Size() int {
+	return xxx_messageInfo_AppPaymentModelInfo.Size(m)
+}
+func (m *AppPaymentModelInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppPaymentModelInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppPaymentModelInfo proto.InternalMessageInfo
+
+func (m *AppPaymentModelInfo) GetType() enums.AppPaymentModelTypeEnum_AppPaymentModelType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.AppPaymentModelTypeEnum_UNSPECIFIED
+}
+
+// A mobile device criterion.
+type MobileDeviceInfo struct {
+	// The mobile device constant resource name.
+	MobileDeviceConstant *wrappers.StringValue `protobuf:"bytes,1,opt,name=mobile_device_constant,json=mobileDeviceConstant,proto3" json:"mobile_device_constant,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *MobileDeviceInfo) Reset()         { *m = MobileDeviceInfo{} }
+func (m *MobileDeviceInfo) String() string { return proto.CompactTextString(m) }
+func (*MobileDeviceInfo) ProtoMessage()    {}
+func (*MobileDeviceInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{50}
+}
+
+func (m *MobileDeviceInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MobileDeviceInfo.Unmarshal(m, b)
+}
+func (m *MobileDeviceInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MobileDeviceInfo.Marshal(b, m, deterministic)
+}
+func (m *MobileDeviceInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MobileDeviceInfo.Merge(m, src)
+}
+func (m *MobileDeviceInfo) XXX_Size() int {
+	return xxx_messageInfo_MobileDeviceInfo.Size(m)
+}
+func (m *MobileDeviceInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_MobileDeviceInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MobileDeviceInfo proto.InternalMessageInfo
+
+func (m *MobileDeviceInfo) GetMobileDeviceConstant() *wrappers.StringValue {
+	if m != nil {
+		return m.MobileDeviceConstant
+	}
+	return nil
+}
+
+// A custom affinity criterion.
+// A criterion of this type is only targetable.
+type CustomAffinityInfo struct {
+	// The CustomInterest resource name.
+	CustomAffinity       *wrappers.StringValue `protobuf:"bytes,1,opt,name=custom_affinity,json=customAffinity,proto3" json:"custom_affinity,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CustomAffinityInfo) Reset()         { *m = CustomAffinityInfo{} }
+func (m *CustomAffinityInfo) String() string { return proto.CompactTextString(m) }
+func (*CustomAffinityInfo) ProtoMessage()    {}
+func (*CustomAffinityInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{51}
+}
+
+func (m *CustomAffinityInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomAffinityInfo.Unmarshal(m, b)
+}
+func (m *CustomAffinityInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomAffinityInfo.Marshal(b, m, deterministic)
+}
+func (m *CustomAffinityInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomAffinityInfo.Merge(m, src)
+}
+func (m *CustomAffinityInfo) XXX_Size() int {
+	return xxx_messageInfo_CustomAffinityInfo.Size(m)
+}
+func (m *CustomAffinityInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomAffinityInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomAffinityInfo proto.InternalMessageInfo
+
+func (m *CustomAffinityInfo) GetCustomAffinity() *wrappers.StringValue {
+	if m != nil {
+		return m.CustomAffinity
+	}
+	return nil
+}
+
+// A custom intent criterion.
+// A criterion of this type is only targetable.
+type CustomIntentInfo struct {
+	// The CustomInterest resource name.
+	CustomIntent         *wrappers.StringValue `protobuf:"bytes,1,opt,name=custom_intent,json=customIntent,proto3" json:"custom_intent,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CustomIntentInfo) Reset()         { *m = CustomIntentInfo{} }
+func (m *CustomIntentInfo) String() string { return proto.CompactTextString(m) }
+func (*CustomIntentInfo) ProtoMessage()    {}
+func (*CustomIntentInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{52}
+}
+
+func (m *CustomIntentInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomIntentInfo.Unmarshal(m, b)
+}
+func (m *CustomIntentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomIntentInfo.Marshal(b, m, deterministic)
+}
+func (m *CustomIntentInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomIntentInfo.Merge(m, src)
+}
+func (m *CustomIntentInfo) XXX_Size() int {
+	return xxx_messageInfo_CustomIntentInfo.Size(m)
+}
+func (m *CustomIntentInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomIntentInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomIntentInfo proto.InternalMessageInfo
+
+func (m *CustomIntentInfo) GetCustomIntent() *wrappers.StringValue {
+	if m != nil {
+		return m.CustomIntent
+	}
+	return nil
+}
+
+// A radius around a list of locations specified via a feed.
+type LocationGroupInfo struct {
+	// Feed specifying locations for targeting.
+	// This is required and must be set in CREATE operations.
+	Feed *wrappers.StringValue `protobuf:"bytes,1,opt,name=feed,proto3" json:"feed,omitempty"`
+	// Geo target constant(s) restricting the scope of the geographic area within
+	// the feed. Currently only one geo target constant is allowed.
+	GeoTargetConstants []*wrappers.StringValue `protobuf:"bytes,2,rep,name=geo_target_constants,json=geoTargetConstants,proto3" json:"geo_target_constants,omitempty"`
+	// Distance in units specifying the radius around targeted locations.
+	// This is required and must be set in CREATE operations.
+	Radius *wrappers.Int64Value `protobuf:"bytes,3,opt,name=radius,proto3" json:"radius,omitempty"`
+	// Unit of the radius, miles and meters supported currently.
+	// This is required and must be set in CREATE operations.
+	RadiusUnits          enums.LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits `protobuf:"varint,4,opt,name=radius_units,json=radiusUnits,proto3,enum=google.ads.googleads.v3.enums.LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits" json:"radius_units,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                    `json:"-"`
+	XXX_unrecognized     []byte                                                      `json:"-"`
+	XXX_sizecache        int32                                                       `json:"-"`
+}
+
+func (m *LocationGroupInfo) Reset()         { *m = LocationGroupInfo{} }
+func (m *LocationGroupInfo) String() string { return proto.CompactTextString(m) }
+func (*LocationGroupInfo) ProtoMessage()    {}
+func (*LocationGroupInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1e7892fe3678dd0, []int{53}
+}
+
+func (m *LocationGroupInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LocationGroupInfo.Unmarshal(m, b)
+}
+func (m *LocationGroupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LocationGroupInfo.Marshal(b, m, deterministic)
+}
+func (m *LocationGroupInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LocationGroupInfo.Merge(m, src)
+}
+func (m *LocationGroupInfo) XXX_Size() int {
+	return xxx_messageInfo_LocationGroupInfo.Size(m)
+}
+func (m *LocationGroupInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_LocationGroupInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LocationGroupInfo proto.InternalMessageInfo
+
+func (m *LocationGroupInfo) GetFeed() *wrappers.StringValue {
+	if m != nil {
+		return m.Feed
+	}
+	return nil
+}
+
+func (m *LocationGroupInfo) GetGeoTargetConstants() []*wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetConstants
+	}
+	return nil
+}
+
+func (m *LocationGroupInfo) GetRadius() *wrappers.Int64Value {
+	if m != nil {
+		return m.Radius
+	}
+	return nil
+}
+
+func (m *LocationGroupInfo) GetRadiusUnits() enums.LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits {
+	if m != nil {
+		return m.RadiusUnits
+	}
+	return enums.LocationGroupRadiusUnitsEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*KeywordInfo)(nil), "google.ads.googleads.v3.common.KeywordInfo")
+	proto.RegisterType((*PlacementInfo)(nil), "google.ads.googleads.v3.common.PlacementInfo")
+	proto.RegisterType((*MobileAppCategoryInfo)(nil), "google.ads.googleads.v3.common.MobileAppCategoryInfo")
+	proto.RegisterType((*MobileApplicationInfo)(nil), "google.ads.googleads.v3.common.MobileApplicationInfo")
+	proto.RegisterType((*LocationInfo)(nil), "google.ads.googleads.v3.common.LocationInfo")
+	proto.RegisterType((*DeviceInfo)(nil), "google.ads.googleads.v3.common.DeviceInfo")
+	proto.RegisterType((*PreferredContentInfo)(nil), "google.ads.googleads.v3.common.PreferredContentInfo")
+	proto.RegisterType((*ListingGroupInfo)(nil), "google.ads.googleads.v3.common.ListingGroupInfo")
+	proto.RegisterType((*ListingScopeInfo)(nil), "google.ads.googleads.v3.common.ListingScopeInfo")
+	proto.RegisterType((*ListingDimensionInfo)(nil), "google.ads.googleads.v3.common.ListingDimensionInfo")
+	proto.RegisterType((*HotelIdInfo)(nil), "google.ads.googleads.v3.common.HotelIdInfo")
+	proto.RegisterType((*HotelClassInfo)(nil), "google.ads.googleads.v3.common.HotelClassInfo")
+	proto.RegisterType((*HotelCountryRegionInfo)(nil), "google.ads.googleads.v3.common.HotelCountryRegionInfo")
+	proto.RegisterType((*HotelStateInfo)(nil), "google.ads.googleads.v3.common.HotelStateInfo")
+	proto.RegisterType((*HotelCityInfo)(nil), "google.ads.googleads.v3.common.HotelCityInfo")
+	proto.RegisterType((*ProductBiddingCategoryInfo)(nil), "google.ads.googleads.v3.common.ProductBiddingCategoryInfo")
+	proto.RegisterType((*ProductBrandInfo)(nil), "google.ads.googleads.v3.common.ProductBrandInfo")
+	proto.RegisterType((*ProductChannelInfo)(nil), "google.ads.googleads.v3.common.ProductChannelInfo")
+	proto.RegisterType((*ProductChannelExclusivityInfo)(nil), "google.ads.googleads.v3.common.ProductChannelExclusivityInfo")
+	proto.RegisterType((*ProductConditionInfo)(nil), "google.ads.googleads.v3.common.ProductConditionInfo")
+	proto.RegisterType((*ProductCustomAttributeInfo)(nil), "google.ads.googleads.v3.common.ProductCustomAttributeInfo")
+	proto.RegisterType((*ProductItemIdInfo)(nil), "google.ads.googleads.v3.common.ProductItemIdInfo")
+	proto.RegisterType((*ProductTypeInfo)(nil), "google.ads.googleads.v3.common.ProductTypeInfo")
+	proto.RegisterType((*UnknownListingDimensionInfo)(nil), "google.ads.googleads.v3.common.UnknownListingDimensionInfo")
+	proto.RegisterType((*HotelDateSelectionTypeInfo)(nil), "google.ads.googleads.v3.common.HotelDateSelectionTypeInfo")
+	proto.RegisterType((*HotelAdvanceBookingWindowInfo)(nil), "google.ads.googleads.v3.common.HotelAdvanceBookingWindowInfo")
+	proto.RegisterType((*HotelLengthOfStayInfo)(nil), "google.ads.googleads.v3.common.HotelLengthOfStayInfo")
+	proto.RegisterType((*HotelCheckInDayInfo)(nil), "google.ads.googleads.v3.common.HotelCheckInDayInfo")
+	proto.RegisterType((*InteractionTypeInfo)(nil), "google.ads.googleads.v3.common.InteractionTypeInfo")
+	proto.RegisterType((*AdScheduleInfo)(nil), "google.ads.googleads.v3.common.AdScheduleInfo")
+	proto.RegisterType((*AgeRangeInfo)(nil), "google.ads.googleads.v3.common.AgeRangeInfo")
+	proto.RegisterType((*GenderInfo)(nil), "google.ads.googleads.v3.common.GenderInfo")
+	proto.RegisterType((*IncomeRangeInfo)(nil), "google.ads.googleads.v3.common.IncomeRangeInfo")
+	proto.RegisterType((*ParentalStatusInfo)(nil), "google.ads.googleads.v3.common.ParentalStatusInfo")
+	proto.RegisterType((*YouTubeVideoInfo)(nil), "google.ads.googleads.v3.common.YouTubeVideoInfo")
+	proto.RegisterType((*YouTubeChannelInfo)(nil), "google.ads.googleads.v3.common.YouTubeChannelInfo")
+	proto.RegisterType((*UserListInfo)(nil), "google.ads.googleads.v3.common.UserListInfo")
+	proto.RegisterType((*ProximityInfo)(nil), "google.ads.googleads.v3.common.ProximityInfo")
+	proto.RegisterType((*GeoPointInfo)(nil), "google.ads.googleads.v3.common.GeoPointInfo")
+	proto.RegisterType((*AddressInfo)(nil), "google.ads.googleads.v3.common.AddressInfo")
+	proto.RegisterType((*TopicInfo)(nil), "google.ads.googleads.v3.common.TopicInfo")
+	proto.RegisterType((*LanguageInfo)(nil), "google.ads.googleads.v3.common.LanguageInfo")
+	proto.RegisterType((*IpBlockInfo)(nil), "google.ads.googleads.v3.common.IpBlockInfo")
+	proto.RegisterType((*ContentLabelInfo)(nil), "google.ads.googleads.v3.common.ContentLabelInfo")
+	proto.RegisterType((*CarrierInfo)(nil), "google.ads.googleads.v3.common.CarrierInfo")
+	proto.RegisterType((*UserInterestInfo)(nil), "google.ads.googleads.v3.common.UserInterestInfo")
+	proto.RegisterType((*WebpageInfo)(nil), "google.ads.googleads.v3.common.WebpageInfo")
+	proto.RegisterType((*WebpageConditionInfo)(nil), "google.ads.googleads.v3.common.WebpageConditionInfo")
+	proto.RegisterType((*OperatingSystemVersionInfo)(nil), "google.ads.googleads.v3.common.OperatingSystemVersionInfo")
+	proto.RegisterType((*AppPaymentModelInfo)(nil), "google.ads.googleads.v3.common.AppPaymentModelInfo")
+	proto.RegisterType((*MobileDeviceInfo)(nil), "google.ads.googleads.v3.common.MobileDeviceInfo")
+	proto.RegisterType((*CustomAffinityInfo)(nil), "google.ads.googleads.v3.common.CustomAffinityInfo")
+	proto.RegisterType((*CustomIntentInfo)(nil), "google.ads.googleads.v3.common.CustomIntentInfo")
+	proto.RegisterType((*LocationGroupInfo)(nil), "google.ads.googleads.v3.common.LocationGroupInfo")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/criteria.proto", fileDescriptor_f1e7892fe3678dd0)
+}
+
+var fileDescriptor_f1e7892fe3678dd0 = []byte{
+	// 2777 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x5a, 0x4d, 0x73, 0xdc, 0xc6,
+	0xd1, 0xf6, 0x2e, 0x29, 0x91, 0xdb, 0xbb, 0xfc, 0x10, 0x44, 0xd3, 0x2b, 0xf9, 0xa3, 0xfc, 0xe2,
+	0xe4, 0x7a, 0xfd, 0x7a, 0x29, 0x93, 0x7a, 0x15, 0x87, 0x8e, 0xa3, 0x2c, 0x49, 0x85, 0x5c, 0x9b,
+	0x92, 0x68, 0x90, 0xa2, 0x6c, 0x59, 0x0e, 0x3c, 0x04, 0x86, 0xd8, 0x89, 0x16, 0x33, 0x28, 0x60,
+	0x40, 0x72, 0x73, 0x48, 0xaa, 0x52, 0x95, 0xca, 0x21, 0x87, 0xdc, 0x73, 0x4b, 0x2a, 0x87, 0x24,
+	0xa7, 0xfc, 0x84, 0x54, 0x72, 0x49, 0xe5, 0x27, 0xe4, 0x17, 0xa4, 0xf2, 0x1b, 0x72, 0x48, 0xcd,
+	0x17, 0x16, 0xfb, 0x41, 0x02, 0xcb, 0xf2, 0x89, 0x8b, 0x99, 0x7e, 0x9e, 0xee, 0x99, 0xe9, 0xe9,
+	0xee, 0x99, 0x21, 0x7c, 0x10, 0x30, 0x16, 0xf4, 0xf0, 0x1a, 0xf2, 0x93, 0x35, 0xf5, 0x53, 0xfc,
+	0x3a, 0xdb, 0x58, 0xf3, 0x58, 0x18, 0x32, 0xba, 0xe6, 0xc5, 0x84, 0xe3, 0x98, 0xa0, 0x56, 0x14,
+	0x33, 0xce, 0xac, 0x77, 0x94, 0x4c, 0x0b, 0xf9, 0x49, 0x2b, 0x13, 0x6f, 0x9d, 0x6d, 0xb4, 0x94,
+	0xf8, 0xdd, 0xf5, 0xcb, 0xe8, 0x30, 0x4d, 0xc3, 0x64, 0x0d, 0x05, 0xd8, 0x8d, 0x11, 0x0d, 0xb0,
+	0xcb, 0xfb, 0x11, 0x56, 0x9c, 0x77, 0x37, 0x0b, 0x30, 0x51, 0xe4, 0x46, 0xa8, 0x1f, 0x62, 0xca,
+	0xdd, 0x90, 0xf9, 0xb8, 0x97, 0xc7, 0x3e, 0xb8, 0x1a, 0xeb, 0x31, 0xca, 0x05, 0xae, 0x87, 0x4e,
+	0x86, 0x71, 0x6b, 0x57, 0xe3, 0x7c, 0xd4, 0x77, 0xd9, 0xa9, 0x7b, 0x8e, 0xf1, 0x2b, 0x0d, 0xf8,
+	0xdf, 0x02, 0x00, 0x3e, 0x23, 0x5e, 0x49, 0xf2, 0x00, 0x53, 0x1f, 0xc7, 0x79, 0x6b, 0x3e, 0xb9,
+	0x1a, 0xd0, 0x65, 0x1c, 0xf7, 0x5c, 0x1f, 0x71, 0xec, 0x26, 0xb8, 0x87, 0x3d, 0x4e, 0x18, 0xcd,
+	0xc3, 0xff, 0xff, 0x6a, 0x38, 0xa1, 0x1e, 0x0b, 0x27, 0xcc, 0xfb, 0xfd, 0x22, 0x18, 0xc7, 0x31,
+	0x1a, 0x53, 0x56, 0x30, 0xe3, 0xaf, 0x70, 0xff, 0x9c, 0xc5, 0xbe, 0x1b, 0x22, 0xee, 0x75, 0xa7,
+	0xc0, 0xf5, 0x48, 0xc2, 0x09, 0x0d, 0xdc, 0x20, 0x66, 0x69, 0x94, 0xc7, 0x3d, 0x2c, 0xc0, 0x31,
+	0x0f, 0x49, 0x13, 0x15, 0x30, 0x46, 0x3e, 0x49, 0x13, 0x37, 0xa5, 0x84, 0x27, 0x9a, 0xa0, 0xc0,
+	0x25, 0x43, 0x42, 0x53, 0x8e, 0xc5, 0x6a, 0x77, 0x59, 0x1a, 0x6b, 0xcc, 0x47, 0x57, 0x63, 0x22,
+	0x14, 0x63, 0xca, 0x51, 0xcf, 0x4d, 0x38, 0xe2, 0x69, 0x32, 0x85, 0x33, 0x47, 0x31, 0x3e, 0xc5,
+	0x71, 0x8c, 0x7d, 0xd7, 0xb8, 0x66, 0x0e, 0xbb, 0x55, 0x84, 0x65, 0x7e, 0xea, 0x71, 0xf7, 0x84,
+	0xf8, 0xbe, 0x98, 0x2a, 0x0f, 0x71, 0x1c, 0xb0, 0xb8, 0xef, 0xf6, 0xf0, 0x19, 0xee, 0x69, 0x8e,
+	0x8d, 0x72, 0x1c, 0x5e, 0x17, 0x51, 0x9a, 0x81, 0x1e, 0x4e, 0x05, 0x72, 0xf1, 0x85, 0xd7, 0x4b,
+	0x13, 0x72, 0x46, 0x78, 0xbf, 0x9c, 0x07, 0x66, 0x04, 0x8c, 0xfa, 0x44, 0xac, 0xd6, 0x74, 0x03,
+	0xf6, 0xd2, 0x84, 0xb3, 0xd0, 0x45, 0x9c, 0xc7, 0xe4, 0x44, 0x2c, 0x16, 0xa1, 0x3e, 0xbe, 0x28,
+	0xe7, 0x57, 0x86, 0x43, 0x4c, 0xf3, 0xd0, 0x44, 0x15, 0x2e, 0x14, 0xbb, 0x20, 0x21, 0xe1, 0xfd,
+	0x49, 0x2e, 0x55, 0xb0, 0x5f, 0xcf, 0xf1, 0x49, 0x24, 0x22, 0x5d, 0x36, 0x5c, 0x97, 0x45, 0x38,
+	0x46, 0xd4, 0xd7, 0xf0, 0xef, 0x5f, 0x0b, 0xce, 0x99, 0xf1, 0x4e, 0x1d, 0x84, 0xd7, 0xe4, 0xd7,
+	0x49, 0x7a, 0xba, 0x76, 0x1e, 0xa3, 0x28, 0xc2, 0xb1, 0x31, 0xef, 0x2d, 0xc3, 0x1f, 0x91, 0x35,
+	0x44, 0x29, 0xe3, 0x72, 0x87, 0xe8, 0x5e, 0xfb, 0xf7, 0x15, 0xa8, 0x7f, 0xa6, 0x76, 0x69, 0x87,
+	0x9e, 0x32, 0xeb, 0x1e, 0xcc, 0x72, 0x7c, 0xc1, 0x9b, 0x95, 0x77, 0x2b, 0xef, 0xd5, 0xd7, 0xdf,
+	0xd2, 0x61, 0xbd, 0x65, 0xc8, 0x5b, 0x87, 0x3c, 0x26, 0x34, 0x38, 0x46, 0xbd, 0x14, 0x3b, 0x52,
+	0xd2, 0xf2, 0x00, 0x06, 0xdb, 0xbb, 0x59, 0x7d, 0xb7, 0xf2, 0xde, 0xe2, 0xfa, 0x4e, 0xeb, 0xb2,
+	0xcc, 0x20, 0x07, 0xd5, 0xd2, 0x1a, 0x1f, 0x0b, 0xdc, 0x51, 0x3f, 0xc2, 0x8f, 0x68, 0x1a, 0x8e,
+	0x35, 0x3a, 0xb5, 0xd0, 0xfc, 0xb4, 0x1f, 0xc2, 0xc2, 0x41, 0x0f, 0x79, 0x58, 0xc4, 0x7d, 0x69,
+	0x67, 0x0b, 0x66, 0xd2, 0xb8, 0x57, 0xca, 0x4c, 0x21, 0x68, 0x9f, 0xc1, 0xeb, 0x8f, 0xd9, 0x09,
+	0xe9, 0xe1, 0x76, 0x14, 0x6d, 0xeb, 0xad, 0x22, 0x89, 0xbe, 0x86, 0xb7, 0x42, 0xd9, 0xe1, 0x8a,
+	0xd4, 0x92, 0xed, 0x22, 0x8f, 0xd1, 0x84, 0x23, 0x5a, 0x6e, 0x22, 0xee, 0x84, 0xa3, 0xd4, 0xdb,
+	0x1a, 0x6e, 0xff, 0x34, 0xa7, 0xb7, 0x47, 0x54, 0x74, 0x92, 0x7a, 0x37, 0xe0, 0xa6, 0x50, 0x48,
+	0x7c, 0x39, 0x65, 0x45, 0x1a, 0x6e, 0xa0, 0x28, 0xea, 0xf8, 0x62, 0x75, 0x28, 0x0a, 0x71, 0x73,
+	0xa6, 0xcc, 0xea, 0x08, 0x49, 0xfb, 0x25, 0x34, 0xf6, 0x59, 0x4e, 0xed, 0x3e, 0xdc, 0x0e, 0x30,
+	0x73, 0x39, 0x8a, 0x03, 0xcc, 0xa7, 0x1b, 0xe5, 0xad, 0x00, 0xb3, 0x23, 0x89, 0xcb, 0x46, 0xe7,
+	0x00, 0xec, 0xc8, 0x5c, 0x27, 0xb9, 0x77, 0x60, 0x56, 0xfa, 0x40, 0x45, 0xfa, 0xc0, 0xbd, 0x02,
+	0x1f, 0x50, 0x40, 0xb9, 0xf2, 0xea, 0xa7, 0x23, 0xd1, 0xf6, 0x05, 0xac, 0x1c, 0x98, 0xb8, 0xb8,
+	0xad, 0xc2, 0xa2, 0x64, 0xff, 0x46, 0xb3, 0x2b, 0x0f, 0xdb, 0x2f, 0x60, 0x1f, 0xa5, 0xc8, 0xbc,
+	0x6c, 0x52, 0x87, 0xd6, 0xfc, 0x9b, 0x2a, 0x2c, 0xef, 0xab, 0xcc, 0xb3, 0x2b, 0xf2, 0x87, 0x54,
+	0xfb, 0xc5, 0xd0, 0xa0, 0x8a, 0x1c, 0x3b, 0x0f, 0xcf, 0x54, 0x8e, 0x36, 0x2a, 0x75, 0xd6, 0x21,
+	0x80, 0x87, 0x12, 0xec, 0x9e, 0x89, 0xd9, 0xd5, 0x5e, 0x70, 0xbf, 0x75, 0x75, 0x49, 0x65, 0xb8,
+	0x76, 0x48, 0x88, 0x69, 0xa2, 0x17, 0xd5, 0xa9, 0x09, 0x1e, 0xb9, 0x48, 0xd6, 0x73, 0xb8, 0xa3,
+	0xf2, 0x91, 0x8b, 0x7c, 0x9d, 0x05, 0x75, 0xd1, 0xc6, 0x68, 0x29, 0xb7, 0x59, 0x55, 0xf0, 0xb6,
+	0x2f, 0xcd, 0xdd, 0x36, 0x58, 0xbb, 0x9b, 0xcd, 0xcd, 0xa1, 0xc7, 0x22, 0xb5, 0xe0, 0x47, 0x00,
+	0xbe, 0x31, 0x24, 0x69, 0x56, 0xdf, 0x9d, 0xb9, 0xf6, 0x08, 0x72, 0x3c, 0xf6, 0xaf, 0xea, 0xb0,
+	0x32, 0x49, 0xc8, 0xda, 0x83, 0x79, 0x55, 0xfc, 0x64, 0x9b, 0xe6, 0xfd, 0x22, 0x65, 0x7b, 0x42,
+	0xbe, 0x23, 0x43, 0xdb, 0xde, 0x6b, 0xce, 0x5c, 0x57, 0x7d, 0x5a, 0x9f, 0x43, 0x5d, 0x31, 0x79,
+	0x3d, 0x94, 0x24, 0x7a, 0x5e, 0x5a, 0xa5, 0xc8, 0xb6, 0x05, 0x42, 0xf3, 0x41, 0x37, 0x6b, 0xb1,
+	0x7e, 0x0c, 0x2b, 0x9a, 0x92, 0xa5, 0x94, 0xc7, 0x7d, 0x37, 0xc6, 0x81, 0x98, 0xf3, 0x59, 0xc9,
+	0xfd, 0xa0, 0x1c, 0xb7, 0x82, 0x3a, 0x12, 0xa9, 0x75, 0x58, 0xdd, 0xb1, 0x9e, 0x81, 0xf9, 0xa2,
+	0xe2, 0xc0, 0xcd, 0x1b, 0x53, 0x98, 0x7f, 0x28, 0x10, 0x43, 0xe6, 0xcb, 0x16, 0xeb, 0x09, 0x80,
+	0x36, 0x9f, 0xf0, 0x7e, 0xf3, 0xa6, 0x64, 0xfc, 0xa0, 0x9c, 0xd1, 0x84, 0xf7, 0x35, 0x61, 0xad,
+	0x6b, 0x1a, 0xac, 0x33, 0x68, 0x5e, 0x56, 0xa1, 0x34, 0x17, 0x24, 0xfb, 0x66, 0x11, 0xfb, 0x81,
+	0xc2, 0x6f, 0x29, 0x78, 0x3e, 0x68, 0xef, 0xbd, 0xe6, 0xac, 0x46, 0x13, 0x7b, 0xad, 0xe7, 0xb0,
+	0x90, 0xe9, 0x15, 0x49, 0xb6, 0xb9, 0x24, 0x95, 0xdd, 0x2b, 0xab, 0x4c, 0x60, 0xb4, 0x8a, 0x46,
+	0x94, 0x6b, 0xb3, 0xbe, 0x86, 0xa5, 0x91, 0xca, 0xa7, 0x39, 0x2f, 0xa9, 0xd7, 0x4b, 0x52, 0x6f,
+	0x2b, 0x94, 0x26, 0x5f, 0x8c, 0x86, 0x5a, 0xad, 0x9f, 0xc1, 0x9b, 0x57, 0x14, 0x56, 0xcd, 0x9a,
+	0x54, 0xf5, 0xc9, 0x74, 0xaa, 0x1e, 0x0d, 0x08, 0xb4, 0xd6, 0x3b, 0xd1, 0x65, 0x02, 0x96, 0x07,
+	0xb7, 0xc6, 0x0a, 0xb3, 0x26, 0x94, 0x0b, 0x4a, 0x46, 0xad, 0xc1, 0x69, 0x6d, 0xcb, 0xd1, 0x48,
+	0x7b, 0xde, 0x2b, 0x46, 0xcb, 0xb8, 0xe6, 0xf2, 0x54, 0x5e, 0xb1, 0x2d, 0xe1, 0x6d, 0x83, 0x1e,
+	0xf1, 0x8a, 0x91, 0x5e, 0xeb, 0xab, 0xc1, 0xe2, 0x11, 0x8e, 0x43, 0x11, 0x40, 0xea, 0x52, 0xdd,
+	0x87, 0x25, 0xd5, 0x75, 0x38, 0x0e, 0xb3, 0x30, 0x62, 0x3c, 0x4c, 0x35, 0x5a, 0x47, 0xd0, 0xc8,
+	0xd7, 0x95, 0xcd, 0x86, 0x64, 0x5e, 0x2b, 0xc9, 0x2c, 0x12, 0x82, 0xe6, 0xad, 0x47, 0x83, 0x26,
+	0xab, 0x0f, 0x77, 0x52, 0xfa, 0x8a, 0xb2, 0x73, 0xea, 0x9a, 0xd3, 0x50, 0x16, 0x23, 0x9b, 0x8b,
+	0x52, 0xc5, 0xc7, 0x45, 0x2a, 0x9e, 0x29, 0x82, 0x49, 0xc1, 0x74, 0xef, 0x35, 0xe7, 0x8d, 0x74,
+	0x72, 0xf7, 0x56, 0x1d, 0x6a, 0x99, 0x2a, 0xbb, 0x0d, 0xf5, 0x5c, 0x10, 0xb5, 0xd6, 0xe1, 0x86,
+	0xca, 0x57, 0x65, 0x2a, 0x06, 0x25, 0x6a, 0x6f, 0xc3, 0xe2, 0x70, 0xe8, 0xb4, 0x3e, 0x1c, 0x66,
+	0x79, 0x73, 0x8c, 0xa5, 0x43, 0xf9, 0x83, 0xfb, 0x43, 0x24, 0x11, 0xac, 0x4e, 0x8e, 0x91, 0xd6,
+	0x31, 0x34, 0x87, 0x63, 0x6e, 0x2e, 0xe3, 0x95, 0xb1, 0x72, 0xd5, 0xcb, 0x53, 0x0e, 0x32, 0xde,
+	0x73, 0x6d, 0x76, 0x16, 0x32, 0xad, 0x47, 0xb0, 0x24, 0x23, 0xee, 0x94, 0x0a, 0x16, 0x25, 0x68,
+	0x40, 0x7c, 0x04, 0x0b, 0x43, 0x91, 0xd3, 0xda, 0x86, 0x45, 0x11, 0x76, 0xa7, 0xa4, 0x5d, 0x10,
+	0x98, 0x01, 0xeb, 0x7f, 0x2a, 0x70, 0xf7, 0xf2, 0x90, 0x69, 0xbd, 0x0f, 0x55, 0xe2, 0x97, 0x99,
+	0xef, 0x2a, 0xf1, 0xad, 0x87, 0xd0, 0x30, 0x53, 0xea, 0x31, 0x1f, 0x97, 0x2a, 0x51, 0xeb, 0x1a,
+	0xb1, 0xcd, 0x7c, 0x6c, 0x45, 0x70, 0x43, 0x1e, 0xaf, 0x64, 0x6a, 0x5d, 0x5c, 0x7f, 0x51, 0x58,
+	0xad, 0x4d, 0xb2, 0x7b, 0x5f, 0x30, 0xe8, 0xa2, 0xed, 0xd2, 0x7e, 0x47, 0x29, 0xb2, 0x7f, 0x08,
+	0xcb, 0xa3, 0x31, 0xfc, 0x5a, 0xce, 0x1a, 0x81, 0x35, 0x1e, 0xb0, 0xad, 0x17, 0x30, 0x67, 0xa2,
+	0xbe, 0x2a, 0x04, 0x7f, 0x50, 0x6e, 0x44, 0x26, 0xd0, 0xe6, 0x06, 0xa1, 0x9b, 0x1c, 0x43, 0x68,
+	0xff, 0xb1, 0x02, 0x6f, 0x5f, 0x19, 0xb8, 0xad, 0x5f, 0x56, 0xe0, 0xf6, 0xa4, 0xac, 0xa0, 0x4c,
+	0x39, 0x9e, 0xce, 0x94, 0x01, 0x7e, 0x82, 0x55, 0xb9, 0x5e, 0xc7, 0xf2, 0xc6, 0xda, 0xec, 0x9f,
+	0x88, 0xe2, 0x7c, 0x3c, 0xd8, 0x5b, 0x27, 0x50, 0x1b, 0x64, 0x8d, 0x72, 0xa5, 0xf2, 0x28, 0xcf,
+	0x90, 0x35, 0xa6, 0xd1, 0x19, 0xd0, 0xda, 0x7f, 0x1d, 0x38, 0xf8, 0x84, 0xe8, 0x7f, 0x9d, 0xc5,
+	0x16, 0x6e, 0x2a, 0x6f, 0x0f, 0xf4, 0xa1, 0xa2, 0xa4, 0x9b, 0x8e, 0x69, 0xf7, 0xf1, 0xc5, 0x90,
+	0xf5, 0x13, 0xfa, 0x1d, 0xa5, 0xc8, 0xde, 0x85, 0x5b, 0x63, 0x29, 0xe5, 0x5a, 0x7e, 0xfa, 0xdb,
+	0x0a, 0x2c, 0x8d, 0xa4, 0x90, 0x6b, 0x4d, 0xc1, 0x0b, 0xb3, 0x53, 0xab, 0xd3, 0xac, 0x9a, 0x50,
+	0x39, 0xb6, 0x3d, 0xb3, 0x46, 0xb3, 0x27, 0xdf, 0x86, 0x37, 0xaf, 0x48, 0x41, 0xf6, 0xcf, 0x2b,
+	0x70, 0x57, 0x06, 0xc2, 0x1d, 0xc4, 0xf1, 0xa1, 0xb9, 0xcb, 0xcc, 0x46, 0xe3, 0x0f, 0x9d, 0xbc,
+	0x0e, 0x0a, 0x0c, 0x9b, 0x4c, 0x24, 0xcd, 0x9b, 0xdc, 0xa5, 0x0f, 0x7d, 0xbf, 0xae, 0xc0, 0xdb,
+	0x52, 0xa0, 0xed, 0x9f, 0x21, 0xea, 0xe1, 0x2d, 0xc6, 0x5e, 0x11, 0x1a, 0x3c, 0x27, 0xd4, 0x67,
+	0xe7, 0xd2, 0x8e, 0x07, 0x30, 0x1f, 0x12, 0xea, 0xfa, 0xa8, 0x9f, 0x94, 0x89, 0x9f, 0x73, 0x21,
+	0xa1, 0x3b, 0xa8, 0x9f, 0x48, 0x1c, 0xba, 0x50, 0xb8, 0x6a, 0x19, 0x1c, 0xba, 0x10, 0x38, 0x61,
+	0xd1, 0xeb, 0xd2, 0xa2, 0x7d, 0x4c, 0x03, 0xde, 0x7d, 0x7a, 0x7a, 0xc8, 0x91, 0x8a, 0x03, 0x9b,
+	0x00, 0xc2, 0x12, 0x4a, 0x82, 0x2e, 0x2f, 0x65, 0x4b, 0x2d, 0x24, 0xf4, 0x89, 0x94, 0x96, 0x58,
+	0x74, 0x61, 0xb0, 0xd5, 0x32, 0x58, 0x74, 0xa1, 0xb0, 0x76, 0x08, 0xb7, 0x55, 0xc2, 0xea, 0x62,
+	0xef, 0x55, 0x47, 0x8c, 0x4e, 0x27, 0xde, 0x7a, 0xee, 0x6a, 0x5c, 0xaf, 0xd3, 0x83, 0xa2, 0x63,
+	0x3f, 0xea, 0x3f, 0x3d, 0x7d, 0x8e, 0xf1, 0x2b, 0x75, 0xf2, 0x37, 0x5f, 0x4e, 0xcd, 0x37, 0x3f,
+	0x85, 0xba, 0xce, 0xe0, 0xba, 0x39, 0xf3, 0x87, 0xe3, 0x21, 0x7f, 0xd8, 0x2a, 0xd0, 0x33, 0xc2,
+	0x20, 0xb5, 0x8d, 0xb4, 0x99, 0x63, 0xff, 0x0c, 0x2c, 0xb6, 0xfd, 0x43, 0xaf, 0x8b, 0xfd, 0xb4,
+	0xa7, 0x54, 0xb9, 0xd0, 0x48, 0x38, 0x8a, 0xb9, 0xab, 0xee, 0x83, 0xb5, 0xca, 0xef, 0x15, 0xa8,
+	0x7c, 0x2c, 0x85, 0x9f, 0x9e, 0xee, 0xb1, 0x34, 0x96, 0xfa, 0xf2, 0x0d, 0x4e, 0x5d, 0x32, 0xaa,
+	0x26, 0xeb, 0x2b, 0x00, 0x4c, 0x7d, 0x43, 0x5f, 0xfd, 0x16, 0xe8, 0x6b, 0x98, 0xfa, 0x9a, 0x7c,
+	0x13, 0x40, 0x59, 0xdf, 0x65, 0x69, 0xac, 0x0f, 0xb7, 0x13, 0x97, 0x7a, 0x63, 0x5d, 0x2f, 0xb5,
+	0x14, 0x17, 0x34, 0xc2, 0x69, 0x85, 0x61, 0x12, 0x39, 0x5b, 0x8c, 0x9c, 0xc3, 0xd4, 0x97, 0xb8,
+	0x11, 0x5f, 0xb8, 0xf1, 0x6d, 0xf9, 0xc2, 0x37, 0xd0, 0x68, 0x07, 0xd8, 0x41, 0x34, 0x50, 0x2b,
+	0x73, 0x30, 0xe4, 0x04, 0x45, 0x53, 0x66, 0xa0, 0x99, 0x07, 0xe4, 0x1b, 0xf4, 0xf2, 0xbf, 0x00,
+	0xd8, 0x95, 0x6f, 0x30, 0xfa, 0x7e, 0x2c, 0xcf, 0xff, 0x51, 0x01, 0xbf, 0x02, 0x66, 0xec, 0x83,
+	0x4f, 0xcd, 0x4d, 0x60, 0xa9, 0x23, 0xdf, 0x5b, 0x06, 0x03, 0x98, 0xd6, 0x8b, 0x33, 0x74, 0xce,
+	0x8b, 0x87, 0xda, 0xb4, 0xaa, 0x18, 0xac, 0x03, 0xfd, 0x10, 0x71, 0x28, 0xdf, 0x21, 0xa4, 0xb6,
+	0x97, 0x43, 0xda, 0xf6, 0x8a, 0x82, 0xfb, 0x10, 0xc1, 0xe0, 0xca, 0x6c, 0xac, 0x59, 0xeb, 0xfc,
+	0x0c, 0x96, 0xbf, 0x64, 0xe9, 0x51, 0x7a, 0x82, 0x8f, 0x89, 0x8f, 0x99, 0xd4, 0xf8, 0x1d, 0x98,
+	0x3f, 0x13, 0x1f, 0x6e, 0x56, 0x6d, 0x5e, 0x9d, 0x86, 0xe6, 0xa4, 0x74, 0xc7, 0xb7, 0x3f, 0x07,
+	0x4b, 0x93, 0xe5, 0x0b, 0xaf, 0x8f, 0x01, 0x4c, 0xe5, 0x53, 0x92, 0xb0, 0xa6, 0xe5, 0x3b, 0xbe,
+	0xdd, 0x81, 0xc6, 0xb3, 0x04, 0xc7, 0x22, 0xf9, 0x48, 0xb2, 0xef, 0x42, 0x2d, 0x4d, 0x70, 0x2c,
+	0x0f, 0x54, 0xa5, 0xb8, 0xe6, 0x53, 0x0d, 0xb7, 0xff, 0x5e, 0x85, 0x85, 0x03, 0xf3, 0x0a, 0x20,
+	0xc9, 0x3a, 0x50, 0x0b, 0x30, 0x73, 0x23, 0x46, 0xb2, 0xfb, 0xd3, 0xff, 0x2b, 0x3a, 0x90, 0xed,
+	0x62, 0x76, 0x20, 0xe4, 0xe5, 0x9d, 0xd7, 0x7c, 0xa0, 0xbf, 0xac, 0xfb, 0x70, 0x53, 0xbd, 0x2b,
+	0x5c, 0x5a, 0x68, 0xef, 0xb0, 0xf4, 0xa4, 0xa7, 0xae, 0xf8, 0x1c, 0x2d, 0x6b, 0x31, 0x68, 0xe4,
+	0x5f, 0x23, 0x74, 0xa9, 0x5d, 0x7c, 0x31, 0xaa, 0x07, 0xe1, 0x48, 0xec, 0x33, 0x01, 0x35, 0x49,
+	0x7c, 0xac, 0xc3, 0xa9, 0xc7, 0x83, 0x0f, 0xeb, 0x11, 0xcc, 0x21, 0xdf, 0x8f, 0x71, 0x92, 0xe8,
+	0xd0, 0x50, 0x78, 0xfd, 0xd6, 0x56, 0xe2, 0x72, 0xb8, 0x06, 0x6b, 0xff, 0xa5, 0x02, 0x8d, 0xfc,
+	0x44, 0x58, 0x5f, 0xc0, 0xdd, 0x1e, 0xa3, 0x01, 0xe1, 0xa9, 0x8f, 0x5d, 0x42, 0xdd, 0x90, 0x78,
+	0x31, 0x73, 0x7d, 0x1c, 0xc4, 0x18, 0x5f, 0x99, 0xe6, 0x4c, 0x14, 0x7a, 0x23, 0x83, 0x77, 0xe8,
+	0x63, 0x01, 0xde, 0x51, 0x58, 0xeb, 0x18, 0xee, 0xf4, 0x10, 0xbf, 0x84, 0xb8, 0x5a, 0x4c, 0xbc,
+	0x6a, 0xd0, 0xc3, 0xbc, 0xf6, 0x3f, 0x67, 0xa0, 0x9e, 0x1b, 0x9b, 0xf5, 0x09, 0xd4, 0x23, 0x96,
+	0x70, 0xd4, 0x53, 0xc7, 0xa5, 0x32, 0xae, 0x05, 0x0a, 0x20, 0x4f, 0x4b, 0x6d, 0x79, 0x69, 0x75,
+	0x46, 0xa8, 0x87, 0xcb, 0x9f, 0xb7, 0x1a, 0x06, 0x22, 0x29, 0x46, 0x4f, 0x6c, 0x33, 0xd3, 0x9e,
+	0xd8, 0xf2, 0x36, 0xc8, 0x37, 0x86, 0xd9, 0x69, 0x6c, 0x78, 0x82, 0x42, 0x2c, 0x8e, 0xb1, 0x09,
+	0x8f, 0x31, 0xe6, 0xae, 0x71, 0x93, 0x1b, 0x65, 0x8e, 0xb1, 0x0a, 0xa3, 0xa7, 0x53, 0x9d, 0xb1,
+	0xf3, 0x24, 0xeb, 0xfa, 0x36, 0xb2, 0xf0, 0x8c, 0x9d, 0x63, 0x59, 0x17, 0x5b, 0x5d, 0x1e, 0xa9,
+	0xe5, 0x50, 0xe6, 0xca, 0x6c, 0x75, 0x21, 0x2e, 0x86, 0x21, 0xca, 0xd2, 0xda, 0x11, 0x8b, 0x88,
+	0x67, 0xce, 0xe6, 0x5c, 0x7c, 0x4c, 0xf7, 0x56, 0xb2, 0x20, 0x31, 0xe6, 0x9d, 0xc4, 0xba, 0x07,
+	0xb3, 0x11, 0xe2, 0x5d, 0x7d, 0x45, 0x5e, 0xf0, 0x6e, 0x23, 0x24, 0xed, 0x2f, 0xa1, 0xb1, 0x8f,
+	0x68, 0x90, 0x22, 0x9d, 0x36, 0x3a, 0x70, 0xab, 0xa7, 0xbf, 0xa7, 0xb3, 0x64, 0xd9, 0xc0, 0xb2,
+	0x47, 0x9b, 0x4f, 0xa1, 0xde, 0x89, 0xb6, 0x7a, 0x4c, 0x94, 0x72, 0x2a, 0xc2, 0x92, 0x28, 0x5b,
+	0xb1, 0x52, 0x11, 0x96, 0x44, 0x7a, 0x9e, 0xed, 0x1e, 0x2c, 0xeb, 0x77, 0x94, 0x7d, 0x74, 0xa2,
+	0x43, 0xf6, 0x74, 0x2f, 0x26, 0x79, 0x78, 0x96, 0x71, 0x46, 0x1b, 0x75, 0xbe, 0x39, 0x86, 0xfa,
+	0x36, 0x8a, 0x63, 0xa2, 0x73, 0xf5, 0x2e, 0x2c, 0x7b, 0xea, 0x73, 0xba, 0x29, 0x59, 0xd2, 0xa8,
+	0x6c, 0x46, 0x4e, 0x61, 0x59, 0xe4, 0x09, 0x59, 0x1e, 0x62, 0x9d, 0x2b, 0x1c, 0x58, 0x95, 0xb9,
+	0x82, 0xe8, 0xc6, 0xc1, 0xf5, 0x75, 0x19, 0x15, 0x2b, 0x69, 0x8e, 0xcf, 0xdc, 0x57, 0xd8, 0x7f,
+	0xa8, 0x40, 0xfd, 0xb9, 0x7a, 0xcf, 0xcd, 0xee, 0x7d, 0xcc, 0xfd, 0x8d, 0xf2, 0xd4, 0x72, 0xf7,
+	0x3e, 0x06, 0x23, 0x77, 0xdd, 0x11, 0x40, 0x76, 0x46, 0x2e, 0xfd, 0x08, 0xa3, 0xad, 0x18, 0x3a,
+	0xc4, 0x3b, 0x39, 0x1e, 0xfb, 0xcf, 0x55, 0x58, 0x99, 0x24, 0x64, 0xf5, 0x60, 0x4e, 0xbf, 0x5f,
+	0xeb, 0x05, 0x76, 0x0a, 0x16, 0x78, 0x94, 0xe5, 0xa9, 0x42, 0xcb, 0x75, 0xbe, 0xa4, 0xcf, 0x31,
+	0x2a, 0xac, 0x08, 0xe6, 0xcd, 0x73, 0xb7, 0xae, 0x92, 0x8f, 0xae, 0xa3, 0x8e, 0xb3, 0xf8, 0x72,
+	0x7d, 0x9c, 0xc5, 0x4e, 0xa6, 0xc5, 0xfa, 0x08, 0xe6, 0x51, 0x1c, 0xa4, 0x21, 0xa6, 0xbc, 0x54,
+	0x10, 0xcd, 0xa4, 0xed, 0x5f, 0x54, 0xe0, 0xae, 0x22, 0x24, 0x34, 0x38, 0xec, 0x27, 0x1c, 0x87,
+	0xc7, 0x38, 0xce, 0x5e, 0xaf, 0x02, 0xf8, 0x1f, 0x66, 0x7a, 0xdd, 0x44, 0x76, 0xbb, 0x67, 0xaa,
+	0x7f, 0x3a, 0xf7, 0x7d, 0x87, 0x4d, 0x54, 0x92, 0x79, 0x73, 0x0a, 0xb7, 0xdb, 0x51, 0x74, 0xa0,
+	0xfe, 0x49, 0xea, 0x31, 0xf3, 0xf5, 0xb6, 0xfc, 0xd1, 0xd0, 0xb6, 0xfc, 0xb4, 0xa8, 0x72, 0x1e,
+	0x66, 0x18, 0x14, 0xd0, 0xe3, 0xed, 0x7a, 0x73, 0x9e, 0xc2, 0xb2, 0x7a, 0xe9, 0xce, 0xbd, 0x08,
+	0x3b, 0xb0, 0xaa, 0x1f, 0xd7, 0xd5, 0xbf, 0x44, 0x4d, 0x37, 0xd0, 0x95, 0x30, 0xc7, 0x97, 0x0d,
+	0xef, 0x2b, 0xb0, 0xf4, 0x05, 0xcb, 0xe9, 0x29, 0xa1, 0xa6, 0x1a, 0x7b, 0x04, 0x4b, 0xe6, 0x45,
+	0x41, 0x37, 0x97, 0xbb, 0x9a, 0xf5, 0x86, 0xa8, 0xec, 0x67, 0xb0, 0xac, 0xc8, 0x3b, 0x83, 0x87,
+	0xe7, 0x36, 0x2c, 0x68, 0x6a, 0x22, 0x1b, 0x4b, 0x11, 0x37, 0xbc, 0x1c, 0x8d, 0xfd, 0xb7, 0x2a,
+	0xdc, 0x32, 0xcf, 0xf0, 0x83, 0xa7, 0xe5, 0x7b, 0x30, 0x7b, 0x8a, 0x71, 0xb9, 0xaa, 0x56, 0x4a,
+	0x5a, 0x4f, 0x60, 0x65, 0xc2, 0xeb, 0x7d, 0x52, 0x2a, 0xaf, 0x58, 0x63, 0xcf, 0xf7, 0x89, 0xb5,
+	0x91, 0x15, 0x9e, 0x33, 0xc5, 0x17, 0x02, 0xa6, 0xee, 0x3c, 0x1f, 0xa9, 0x3b, 0x67, 0x4b, 0xed,
+	0xcb, 0xa1, 0xe1, 0x8f, 0xd6, 0x9e, 0x97, 0x75, 0x0e, 0xd5, 0x9f, 0x5b, 0xff, 0xaa, 0x80, 0xed,
+	0xb1, 0xb0, 0x20, 0xb6, 0x6d, 0x2d, 0xe8, 0x3b, 0x71, 0x74, 0x20, 0x06, 0x71, 0x50, 0x79, 0xb1,
+	0xa3, 0x01, 0x01, 0x13, 0xb9, 0xb0, 0xc5, 0xe2, 0x60, 0x2d, 0xc0, 0x54, 0x0e, 0xd1, 0xfc, 0xc7,
+	0x4d, 0x44, 0x92, 0xcb, 0xfe, 0xe9, 0xf1, 0x63, 0xf5, 0xe7, 0x77, 0xd5, 0x99, 0xdd, 0x76, 0xfb,
+	0x4f, 0xd5, 0x77, 0x76, 0x15, 0x59, 0xdb, 0x4f, 0x5a, 0xea, 0xa7, 0xf8, 0x75, 0xbc, 0xd1, 0xda,
+	0x96, 0x62, 0xff, 0x30, 0x02, 0x2f, 0xdb, 0x7e, 0xf2, 0x32, 0x13, 0x78, 0x79, 0xbc, 0xf1, 0x52,
+	0x09, 0xfc, 0xbb, 0x6a, 0xab, 0xd6, 0xcd, 0xcd, 0xb6, 0x9f, 0x6c, 0x6e, 0x66, 0x22, 0x9b, 0x9b,
+	0xc7, 0x1b, 0x9b, 0x9b, 0x4a, 0xe8, 0xe4, 0xa6, 0xb4, 0x6e, 0xe3, 0xbf, 0x01, 0x00, 0x00, 0xff,
+	0xff, 0xd8, 0x7b, 0xbf, 0x87, 0x91, 0x29, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/criterion_category_availability.pb.go b/googleapis/ads/googleads/v3/common/criterion_category_availability.pb.go
new file mode 100644
index 0000000..6ebdf45
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/criterion_category_availability.pb.go
@@ -0,0 +1,266 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/criterion_category_availability.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Information of category availability, per advertising channel.
+type CriterionCategoryAvailability struct {
+	// Channel types and subtypes that are available to the category.
+	Channel *CriterionCategoryChannelAvailability `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
+	// Locales that are available to the category for the channel.
+	Locale               []*CriterionCategoryLocaleAvailability `protobuf:"bytes,2,rep,name=locale,proto3" json:"locale,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *CriterionCategoryAvailability) Reset()         { *m = CriterionCategoryAvailability{} }
+func (m *CriterionCategoryAvailability) String() string { return proto.CompactTextString(m) }
+func (*CriterionCategoryAvailability) ProtoMessage()    {}
+func (*CriterionCategoryAvailability) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bcf6cc5448fcd127, []int{0}
+}
+
+func (m *CriterionCategoryAvailability) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CriterionCategoryAvailability.Unmarshal(m, b)
+}
+func (m *CriterionCategoryAvailability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CriterionCategoryAvailability.Marshal(b, m, deterministic)
+}
+func (m *CriterionCategoryAvailability) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CriterionCategoryAvailability.Merge(m, src)
+}
+func (m *CriterionCategoryAvailability) XXX_Size() int {
+	return xxx_messageInfo_CriterionCategoryAvailability.Size(m)
+}
+func (m *CriterionCategoryAvailability) XXX_DiscardUnknown() {
+	xxx_messageInfo_CriterionCategoryAvailability.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CriterionCategoryAvailability proto.InternalMessageInfo
+
+func (m *CriterionCategoryAvailability) GetChannel() *CriterionCategoryChannelAvailability {
+	if m != nil {
+		return m.Channel
+	}
+	return nil
+}
+
+func (m *CriterionCategoryAvailability) GetLocale() []*CriterionCategoryLocaleAvailability {
+	if m != nil {
+		return m.Locale
+	}
+	return nil
+}
+
+// Information of advertising channel type and subtypes a category is available
+// in.
+type CriterionCategoryChannelAvailability struct {
+	// Format of the channel availability. Can be ALL_CHANNELS (the rest of the
+	// fields will not be set), CHANNEL_TYPE (only advertising_channel_type type
+	// will be set, the category is available to all sub types under it) or
+	// CHANNEL_TYPE_AND_SUBTYPES (advertising_channel_type,
+	// advertising_channel_sub_type, and include_default_channel_sub_type will all
+	// be set).
+	AvailabilityMode enums.CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode `protobuf:"varint,1,opt,name=availability_mode,json=availabilityMode,proto3,enum=google.ads.googleads.v3.enums.CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode" json:"availability_mode,omitempty"`
+	// Channel type the category is available to.
+	AdvertisingChannelType enums.AdvertisingChannelTypeEnum_AdvertisingChannelType `protobuf:"varint,2,opt,name=advertising_channel_type,json=advertisingChannelType,proto3,enum=google.ads.googleads.v3.enums.AdvertisingChannelTypeEnum_AdvertisingChannelType" json:"advertising_channel_type,omitempty"`
+	// Channel subtypes under the channel type the category is available to.
+	AdvertisingChannelSubType []enums.AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType `protobuf:"varint,3,rep,packed,name=advertising_channel_sub_type,json=advertisingChannelSubType,proto3,enum=google.ads.googleads.v3.enums.AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType" json:"advertising_channel_sub_type,omitempty"`
+	// Whether default channel sub type is included. For example,
+	// advertising_channel_type being DISPLAY and include_default_channel_sub_type
+	// being false means that the default display campaign where channel sub type
+	// is not set is not included in this availability configuration.
+	IncludeDefaultChannelSubType *wrappers.BoolValue `protobuf:"bytes,4,opt,name=include_default_channel_sub_type,json=includeDefaultChannelSubType,proto3" json:"include_default_channel_sub_type,omitempty"`
+	XXX_NoUnkeyedLiteral         struct{}            `json:"-"`
+	XXX_unrecognized             []byte              `json:"-"`
+	XXX_sizecache                int32               `json:"-"`
+}
+
+func (m *CriterionCategoryChannelAvailability) Reset()         { *m = CriterionCategoryChannelAvailability{} }
+func (m *CriterionCategoryChannelAvailability) String() string { return proto.CompactTextString(m) }
+func (*CriterionCategoryChannelAvailability) ProtoMessage()    {}
+func (*CriterionCategoryChannelAvailability) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bcf6cc5448fcd127, []int{1}
+}
+
+func (m *CriterionCategoryChannelAvailability) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CriterionCategoryChannelAvailability.Unmarshal(m, b)
+}
+func (m *CriterionCategoryChannelAvailability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CriterionCategoryChannelAvailability.Marshal(b, m, deterministic)
+}
+func (m *CriterionCategoryChannelAvailability) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CriterionCategoryChannelAvailability.Merge(m, src)
+}
+func (m *CriterionCategoryChannelAvailability) XXX_Size() int {
+	return xxx_messageInfo_CriterionCategoryChannelAvailability.Size(m)
+}
+func (m *CriterionCategoryChannelAvailability) XXX_DiscardUnknown() {
+	xxx_messageInfo_CriterionCategoryChannelAvailability.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CriterionCategoryChannelAvailability proto.InternalMessageInfo
+
+func (m *CriterionCategoryChannelAvailability) GetAvailabilityMode() enums.CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode {
+	if m != nil {
+		return m.AvailabilityMode
+	}
+	return enums.CriterionCategoryChannelAvailabilityModeEnum_UNSPECIFIED
+}
+
+func (m *CriterionCategoryChannelAvailability) GetAdvertisingChannelType() enums.AdvertisingChannelTypeEnum_AdvertisingChannelType {
+	if m != nil {
+		return m.AdvertisingChannelType
+	}
+	return enums.AdvertisingChannelTypeEnum_UNSPECIFIED
+}
+
+func (m *CriterionCategoryChannelAvailability) GetAdvertisingChannelSubType() []enums.AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType {
+	if m != nil {
+		return m.AdvertisingChannelSubType
+	}
+	return nil
+}
+
+func (m *CriterionCategoryChannelAvailability) GetIncludeDefaultChannelSubType() *wrappers.BoolValue {
+	if m != nil {
+		return m.IncludeDefaultChannelSubType
+	}
+	return nil
+}
+
+// Information about which locales a category is available in.
+type CriterionCategoryLocaleAvailability struct {
+	// Format of the locale availability. Can be LAUNCHED_TO_ALL (both country and
+	// language will be empty), COUNTRY (only country will be set), LANGUAGE (only
+	// language wil be set), COUNTRY_AND_LANGUAGE (both country and language will
+	// be set).
+	AvailabilityMode enums.CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode `protobuf:"varint,1,opt,name=availability_mode,json=availabilityMode,proto3,enum=google.ads.googleads.v3.enums.CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode" json:"availability_mode,omitempty"`
+	// Code of the country.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,2,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// Code of the language.
+	LanguageCode         *wrappers.StringValue `protobuf:"bytes,3,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CriterionCategoryLocaleAvailability) Reset()         { *m = CriterionCategoryLocaleAvailability{} }
+func (m *CriterionCategoryLocaleAvailability) String() string { return proto.CompactTextString(m) }
+func (*CriterionCategoryLocaleAvailability) ProtoMessage()    {}
+func (*CriterionCategoryLocaleAvailability) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bcf6cc5448fcd127, []int{2}
+}
+
+func (m *CriterionCategoryLocaleAvailability) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CriterionCategoryLocaleAvailability.Unmarshal(m, b)
+}
+func (m *CriterionCategoryLocaleAvailability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CriterionCategoryLocaleAvailability.Marshal(b, m, deterministic)
+}
+func (m *CriterionCategoryLocaleAvailability) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CriterionCategoryLocaleAvailability.Merge(m, src)
+}
+func (m *CriterionCategoryLocaleAvailability) XXX_Size() int {
+	return xxx_messageInfo_CriterionCategoryLocaleAvailability.Size(m)
+}
+func (m *CriterionCategoryLocaleAvailability) XXX_DiscardUnknown() {
+	xxx_messageInfo_CriterionCategoryLocaleAvailability.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CriterionCategoryLocaleAvailability proto.InternalMessageInfo
+
+func (m *CriterionCategoryLocaleAvailability) GetAvailabilityMode() enums.CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode {
+	if m != nil {
+		return m.AvailabilityMode
+	}
+	return enums.CriterionCategoryLocaleAvailabilityModeEnum_UNSPECIFIED
+}
+
+func (m *CriterionCategoryLocaleAvailability) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *CriterionCategoryLocaleAvailability) GetLanguageCode() *wrappers.StringValue {
+	if m != nil {
+		return m.LanguageCode
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CriterionCategoryAvailability)(nil), "google.ads.googleads.v3.common.CriterionCategoryAvailability")
+	proto.RegisterType((*CriterionCategoryChannelAvailability)(nil), "google.ads.googleads.v3.common.CriterionCategoryChannelAvailability")
+	proto.RegisterType((*CriterionCategoryLocaleAvailability)(nil), "google.ads.googleads.v3.common.CriterionCategoryLocaleAvailability")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/criterion_category_availability.proto", fileDescriptor_bcf6cc5448fcd127)
+}
+
+var fileDescriptor_bcf6cc5448fcd127 = []byte{
+	// 608 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x95, 0x41, 0x8e, 0xd3, 0x30,
+	0x14, 0x86, 0x95, 0x74, 0x34, 0x48, 0x9e, 0x61, 0x04, 0x59, 0xa0, 0x52, 0x95, 0x51, 0x15, 0x58,
+	0x74, 0xe5, 0x48, 0xcd, 0x2e, 0x20, 0x41, 0x9a, 0xa2, 0xd9, 0x80, 0xa8, 0x3a, 0xa8, 0x0b, 0xa8,
+	0x88, 0x9c, 0xc4, 0x13, 0x2c, 0x39, 0x76, 0x94, 0x38, 0x45, 0xbd, 0x02, 0x17, 0x60, 0x89, 0x60,
+	0xc9, 0x51, 0x60, 0xcd, 0x8e, 0x13, 0x70, 0x07, 0x24, 0x94, 0xd8, 0x29, 0x1d, 0xda, 0x64, 0xda,
+	0x55, 0xdd, 0xf8, 0xbd, 0xef, 0xff, 0xdf, 0xcb, 0xb3, 0x03, 0x26, 0x31, 0xe7, 0x31, 0xc5, 0x16,
+	0x8a, 0x72, 0x4b, 0x2e, 0xcb, 0xd5, 0xd2, 0xb6, 0x42, 0x9e, 0x24, 0x9c, 0x59, 0x61, 0x46, 0x04,
+	0xce, 0x08, 0x67, 0x7e, 0x88, 0x04, 0x8e, 0x79, 0xb6, 0xf2, 0xd1, 0x12, 0x11, 0x8a, 0x02, 0x42,
+	0x89, 0x58, 0xc1, 0x34, 0xe3, 0x82, 0x1b, 0xe7, 0x32, 0x15, 0xa2, 0x28, 0x87, 0x6b, 0x0a, 0x5c,
+	0xda, 0x50, 0x52, 0x7a, 0xcf, 0x9a, 0x54, 0x30, 0x2b, 0x92, 0xdc, 0x42, 0xd1, 0x12, 0x67, 0x82,
+	0xe4, 0x84, 0xc5, 0x7e, 0xf8, 0x1e, 0x31, 0x86, 0xa9, 0x9f, 0x17, 0x81, 0x2f, 0x56, 0x29, 0x96,
+	0x0a, 0xbd, 0x27, 0x87, 0x13, 0x36, 0xb2, 0xa7, 0xed, 0xd9, 0x3b, 0x8a, 0xac, 0x21, 0x9b, 0xc5,
+	0xfa, 0x09, 0x8f, 0x6a, 0xe2, 0xab, 0x83, 0x89, 0x94, 0x87, 0x88, 0xe2, 0x46, 0xa0, 0x6a, 0xa1,
+	0x55, 0xfd, 0x0b, 0x8a, 0x2b, 0xeb, 0x43, 0x86, 0xd2, 0x14, 0x67, 0xb9, 0xda, 0xef, 0xd7, 0x82,
+	0x29, 0xb1, 0x10, 0x63, 0x5c, 0x20, 0x41, 0x38, 0x53, 0xbb, 0xe6, 0x2f, 0x0d, 0x3c, 0xf0, 0x6a,
+	0x4d, 0x4f, 0x49, 0xba, 0x1b, 0x52, 0xc6, 0x3b, 0x70, 0x4b, 0xd5, 0xd4, 0xd5, 0x06, 0xda, 0xf0,
+	0x64, 0x34, 0x81, 0xed, 0x2f, 0x0d, 0x6e, 0xf1, 0x3c, 0x99, 0xbf, 0x89, 0x9d, 0xd5, 0x50, 0xe3,
+	0x2d, 0x38, 0x96, 0x15, 0x76, 0xf5, 0x41, 0x67, 0x78, 0x32, 0xf2, 0x0e, 0xc6, 0xbf, 0xa8, 0xd2,
+	0xaf, 0xd1, 0x15, 0xd2, 0xfc, 0x79, 0x04, 0x1e, 0xed, 0x63, 0xc7, 0xf8, 0xa2, 0x81, 0xbb, 0x5b,
+	0x1d, 0xae, 0x0a, 0x3e, 0x1b, 0x89, 0x46, 0x47, 0xd5, 0x3b, 0xdb, 0xab, 0xde, 0x97, 0x3c, 0xc2,
+	0xcf, 0x59, 0x91, 0xec, 0x1d, 0x3c, 0xbb, 0x83, 0xfe, 0x7b, 0x62, 0x7c, 0xd4, 0x40, 0xb7, 0x69,
+	0x5e, 0xbb, 0x7a, 0x65, 0x75, 0x7a, 0x83, 0x55, 0xf7, 0x5f, 0xba, 0xd2, 0x7d, 0xbd, 0x4a, 0xa5,
+	0xb1, 0xdd, 0x5b, 0xb3, 0x7b, 0x68, 0xe7, 0x73, 0xe3, 0x93, 0x06, 0xfa, 0x6d, 0xc7, 0xaf, 0xdb,
+	0x19, 0x74, 0x86, 0x67, 0xa3, 0xf9, 0xc1, 0x86, 0x2e, 0x8b, 0xa0, 0xc5, 0x93, 0xda, 0x9d, 0xdd,
+	0x47, 0x4d, 0x5b, 0x46, 0x00, 0x06, 0x84, 0x85, 0xb4, 0x88, 0xb0, 0x1f, 0xe1, 0x2b, 0x54, 0x50,
+	0xb1, 0x6d, 0xee, 0xa8, 0x9a, 0xe4, 0x5e, 0x6d, 0xae, 0x3e, 0x3b, 0x70, 0xcc, 0x39, 0x9d, 0x23,
+	0x5a, 0xe0, 0x59, 0x5f, 0x31, 0x26, 0x12, 0x71, 0x5d, 0xc3, 0xfc, 0xa1, 0x83, 0x87, 0x7b, 0xcc,
+	0xa1, 0xf1, 0xb9, 0x65, 0xac, 0xb2, 0x43, 0xc7, 0x6a, 0x9b, 0xdf, 0x3c, 0x55, 0xbb, 0x63, 0x77,
+	0x0c, 0xd5, 0x53, 0x70, 0x1a, 0xf2, 0x82, 0x89, 0xf2, 0xea, 0x2a, 0xbd, 0xe9, 0x55, 0x67, 0xfa,
+	0x5b, 0x9d, 0xb9, 0x14, 0x19, 0x61, 0xb1, 0xec, 0xcd, 0x89, 0xca, 0xf0, 0x4a, 0x80, 0x0b, 0x6e,
+	0x53, 0xc4, 0xe2, 0x02, 0xc5, 0x58, 0x12, 0x3a, 0x7b, 0x10, 0x4e, 0xeb, 0x94, 0x12, 0x31, 0xfe,
+	0xa3, 0x01, 0x33, 0xe4, 0xc9, 0x0d, 0x07, 0x7f, 0x6c, 0xb6, 0x5e, 0x54, 0xd3, 0x52, 0x67, 0xaa,
+	0xbd, 0x51, 0x1f, 0x26, 0x18, 0xf3, 0x52, 0x03, 0xf2, 0x2c, 0xb6, 0x62, 0xcc, 0x2a, 0x17, 0xf5,
+	0x85, 0x9b, 0x92, 0xbc, 0xe9, 0xbb, 0xf5, 0x58, 0xfe, 0x7c, 0xd5, 0x3b, 0x17, 0xae, 0xfb, 0x4d,
+	0x3f, 0xbf, 0x90, 0x30, 0x37, 0xca, 0xa1, 0x5c, 0x96, 0xab, 0xb9, 0x0d, 0xbd, 0x2a, 0xec, 0x7b,
+	0x1d, 0xb0, 0x70, 0xa3, 0x7c, 0xb1, 0x0e, 0x58, 0xcc, 0xed, 0x85, 0x0c, 0xf8, 0xad, 0x9b, 0xf2,
+	0xa9, 0xe3, 0xb8, 0x51, 0xee, 0x38, 0xeb, 0x10, 0xc7, 0x99, 0xdb, 0x8e, 0x23, 0x83, 0x82, 0xe3,
+	0xca, 0x9d, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, 0x38, 0xfc, 0xef, 0xb7, 0x54, 0x07, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/custom_parameter.pb.go b/googleapis/ads/googleads/v3/common/custom_parameter.pb.go
new file mode 100644
index 0000000..9ca0dbb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/custom_parameter.pb.go
@@ -0,0 +1,106 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/custom_parameter.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A mapping that can be used by custom parameter tags in a
+// `tracking_url_template`, `final_urls`, or `mobile_final_urls`.
+type CustomParameter struct {
+	// The key matching the parameter tag name.
+	Key *wrappers.StringValue `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	// The value to be substituted.
+	Value                *wrappers.StringValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CustomParameter) Reset()         { *m = CustomParameter{} }
+func (m *CustomParameter) String() string { return proto.CompactTextString(m) }
+func (*CustomParameter) ProtoMessage()    {}
+func (*CustomParameter) Descriptor() ([]byte, []int) {
+	return fileDescriptor_cab50381e27619f9, []int{0}
+}
+
+func (m *CustomParameter) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomParameter.Unmarshal(m, b)
+}
+func (m *CustomParameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomParameter.Marshal(b, m, deterministic)
+}
+func (m *CustomParameter) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomParameter.Merge(m, src)
+}
+func (m *CustomParameter) XXX_Size() int {
+	return xxx_messageInfo_CustomParameter.Size(m)
+}
+func (m *CustomParameter) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomParameter.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomParameter proto.InternalMessageInfo
+
+func (m *CustomParameter) GetKey() *wrappers.StringValue {
+	if m != nil {
+		return m.Key
+	}
+	return nil
+}
+
+func (m *CustomParameter) GetValue() *wrappers.StringValue {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CustomParameter)(nil), "google.ads.googleads.v3.common.CustomParameter")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/custom_parameter.proto", fileDescriptor_cab50381e27619f9)
+}
+
+var fileDescriptor_cab50381e27619f9 = []byte{
+	// 300 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0xc1, 0x4a, 0xc4, 0x30,
+	0x10, 0x86, 0x69, 0x17, 0x3d, 0xd4, 0x83, 0xb0, 0x78, 0x58, 0x96, 0x65, 0x91, 0x3d, 0x79, 0x9a,
+	0xc0, 0x06, 0x2f, 0xf1, 0xd4, 0x5d, 0x61, 0xaf, 0x45, 0xa1, 0x07, 0x29, 0x48, 0xb6, 0x8d, 0xa1,
+	0xd8, 0x66, 0x42, 0x92, 0x56, 0x7c, 0x1d, 0x8f, 0x3e, 0x8a, 0x8f, 0xe2, 0xc5, 0x57, 0x90, 0x36,
+	0x6d, 0x0f, 0x82, 0xe2, 0x29, 0x7f, 0x32, 0xdf, 0x3f, 0xff, 0x64, 0xa2, 0x6b, 0x89, 0x28, 0x2b,
+	0x41, 0x78, 0x61, 0x89, 0x97, 0x9d, 0x6a, 0x29, 0xc9, 0xb1, 0xae, 0x51, 0x91, 0xbc, 0xb1, 0x0e,
+	0xeb, 0x47, 0xcd, 0x0d, 0xaf, 0x85, 0x13, 0x06, 0xb4, 0x41, 0x87, 0xf3, 0xb5, 0x67, 0x81, 0x17,
+	0x16, 0x26, 0x1b, 0xb4, 0x14, 0xbc, 0x6d, 0x39, 0xd4, 0x49, 0x4f, 0x1f, 0x9b, 0x27, 0xf2, 0x62,
+	0xb8, 0xd6, 0xc2, 0x58, 0xef, 0x5f, 0xae, 0xc6, 0x58, 0x5d, 0x12, 0xae, 0x14, 0x3a, 0xee, 0x4a,
+	0x54, 0x43, 0x75, 0xd3, 0x44, 0xe7, 0xfb, 0x3e, 0x37, 0x19, 0x63, 0xe7, 0x10, 0xcd, 0x9e, 0xc5,
+	0xeb, 0x22, 0xb8, 0x0c, 0xae, 0xce, 0xb6, 0xab, 0x21, 0x13, 0xc6, 0xf6, 0x70, 0xef, 0x4c, 0xa9,
+	0x64, 0xca, 0xab, 0x46, 0xdc, 0x75, 0xe0, 0x7c, 0x1b, 0x9d, 0xb4, 0xdd, 0x6d, 0x11, 0xfe, 0xc3,
+	0xe1, 0xd1, 0xdd, 0x57, 0x10, 0x6d, 0x72, 0xac, 0xe1, 0xef, 0xbf, 0xed, 0x2e, 0x7e, 0xcc, 0x96,
+	0x74, 0x2d, 0x93, 0xe0, 0xe1, 0x76, 0xf0, 0x49, 0xac, 0xb8, 0x92, 0x80, 0x46, 0x12, 0x29, 0x54,
+	0x1f, 0x38, 0xae, 0x56, 0x97, 0xf6, 0xb7, 0x4d, 0xdf, 0xf8, 0xe3, 0x2d, 0x9c, 0x1d, 0xe2, 0xf8,
+	0x3d, 0x5c, 0x1f, 0x7c, 0xb3, 0xb8, 0xb0, 0xe0, 0x65, 0xa7, 0x52, 0x0a, 0xfb, 0x1e, 0xfb, 0x18,
+	0x81, 0x2c, 0x2e, 0x6c, 0x36, 0x01, 0x59, 0x4a, 0x33, 0x0f, 0x7c, 0x86, 0x1b, 0xff, 0xca, 0x58,
+	0x5c, 0x58, 0xc6, 0x26, 0x84, 0xb1, 0x94, 0x32, 0xe6, 0xa1, 0xe3, 0x69, 0x3f, 0x1d, 0xfd, 0x0e,
+	0x00, 0x00, 0xff, 0xff, 0x1c, 0xe6, 0xc6, 0xe8, 0x06, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/dates.pb.go b/googleapis/ads/googleads/v3/common/dates.pb.go
new file mode 100644
index 0000000..cd2aec9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/dates.pb.go
@@ -0,0 +1,105 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/dates.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A date range.
+type DateRange struct {
+	// The start date, in yyyy-mm-dd format. This date is inclusive.
+	StartDate *wrappers.StringValue `protobuf:"bytes,1,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"`
+	// The end date, in yyyy-mm-dd format. This date is inclusive.
+	EndDate              *wrappers.StringValue `protobuf:"bytes,2,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *DateRange) Reset()         { *m = DateRange{} }
+func (m *DateRange) String() string { return proto.CompactTextString(m) }
+func (*DateRange) ProtoMessage()    {}
+func (*DateRange) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3aa948608f84b748, []int{0}
+}
+
+func (m *DateRange) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DateRange.Unmarshal(m, b)
+}
+func (m *DateRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DateRange.Marshal(b, m, deterministic)
+}
+func (m *DateRange) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DateRange.Merge(m, src)
+}
+func (m *DateRange) XXX_Size() int {
+	return xxx_messageInfo_DateRange.Size(m)
+}
+func (m *DateRange) XXX_DiscardUnknown() {
+	xxx_messageInfo_DateRange.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DateRange proto.InternalMessageInfo
+
+func (m *DateRange) GetStartDate() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDate
+	}
+	return nil
+}
+
+func (m *DateRange) GetEndDate() *wrappers.StringValue {
+	if m != nil {
+		return m.EndDate
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*DateRange)(nil), "google.ads.googleads.v3.common.DateRange")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/dates.proto", fileDescriptor_3aa948608f84b748)
+}
+
+var fileDescriptor_3aa948608f84b748 = []byte{
+	// 302 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0xb1, 0x6a, 0xf3, 0x30,
+	0x14, 0x85, 0xb1, 0x7f, 0xf8, 0xdb, 0xa8, 0x5b, 0xa6, 0x12, 0x42, 0x28, 0x9e, 0x4a, 0x07, 0x09,
+	0xaa, 0xa1, 0xa0, 0x4c, 0x4e, 0x03, 0x59, 0x43, 0x0a, 0x1e, 0x8a, 0xa1, 0xdc, 0x44, 0xaa, 0x30,
+	0xd8, 0xba, 0x46, 0x52, 0xd2, 0xb9, 0xaf, 0xd2, 0xb1, 0x8f, 0xd2, 0xf7, 0xe8, 0xd2, 0xa7, 0x28,
+	0xb2, 0x6c, 0x6f, 0x2d, 0x9d, 0x7c, 0xf0, 0xfd, 0xce, 0x39, 0x57, 0x97, 0xdc, 0x68, 0x44, 0x5d,
+	0x2b, 0x06, 0xd2, 0xb1, 0x28, 0x83, 0x3a, 0x71, 0x76, 0xc0, 0xa6, 0x41, 0xc3, 0x24, 0x78, 0xe5,
+	0x68, 0x6b, 0xd1, 0xe3, 0x74, 0x11, 0x01, 0x0a, 0xd2, 0xd1, 0x91, 0xa5, 0x27, 0x4e, 0x23, 0x3b,
+	0xeb, 0xe7, 0xac, 0xa3, 0xf7, 0xc7, 0x67, 0xf6, 0x62, 0xa1, 0x6d, 0x95, 0xed, 0xfd, 0xb3, 0xf9,
+	0xd0, 0xd5, 0x56, 0x0c, 0x8c, 0x41, 0x0f, 0xbe, 0x42, 0xd3, 0x4f, 0xb3, 0xd7, 0x84, 0x4c, 0xd6,
+	0xe0, 0xd5, 0x0e, 0x8c, 0x56, 0xd3, 0x25, 0x21, 0xce, 0x83, 0xf5, 0x4f, 0x61, 0x81, 0xcb, 0xe4,
+	0x2a, 0xb9, 0xbe, 0xb8, 0x9d, 0xf7, 0xad, 0x74, 0x28, 0xa0, 0x0f, 0xde, 0x56, 0x46, 0x17, 0x50,
+	0x1f, 0xd5, 0x6e, 0xd2, 0xf1, 0x21, 0x61, 0x7a, 0x47, 0xce, 0x95, 0x91, 0xd1, 0x9a, 0xfe, 0xc1,
+	0x7a, 0xa6, 0x8c, 0x0c, 0xc6, 0xd5, 0x67, 0x42, 0xb2, 0x03, 0x36, 0xf4, 0xf7, 0x87, 0xae, 0x48,
+	0x80, 0xdd, 0x36, 0x44, 0x6d, 0x93, 0xc7, 0x75, 0x4f, 0x6b, 0xac, 0xc1, 0x68, 0x8a, 0x56, 0x33,
+	0xad, 0x4c, 0x57, 0x34, 0x9c, 0xb4, 0xad, 0xdc, 0x4f, 0x17, 0x5e, 0xc6, 0xcf, 0x5b, 0xfa, 0x6f,
+	0x93, 0xe7, 0xef, 0xe9, 0x62, 0x13, 0xc3, 0x72, 0xe9, 0x68, 0x94, 0x41, 0x15, 0x9c, 0xde, 0x77,
+	0xd8, 0xc7, 0x00, 0x94, 0xb9, 0x74, 0xe5, 0x08, 0x94, 0x05, 0x2f, 0x23, 0xf0, 0x95, 0x66, 0xf1,
+	0xaf, 0x10, 0xb9, 0x74, 0x42, 0x8c, 0x88, 0x10, 0x05, 0x17, 0x22, 0x42, 0xfb, 0xff, 0xdd, 0x76,
+	0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x30, 0x9a, 0x13, 0xbc, 0xfe, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/explorer_auto_optimizer_setting.pb.go b/googleapis/ads/googleads/v3/common/explorer_auto_optimizer_setting.pb.go
new file mode 100644
index 0000000..1eab953
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/explorer_auto_optimizer_setting.pb.go
@@ -0,0 +1,99 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/explorer_auto_optimizer_setting.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Settings for the Display Campaign Optimizer, initially named "Explorer".
+// Learn more about
+// [automatic targeting](https://support.google.com/google-ads/answer/190596).
+type ExplorerAutoOptimizerSetting struct {
+	// Indicates whether the optimizer is turned on.
+	OptIn                *wrappers.BoolValue `protobuf:"bytes,1,opt,name=opt_in,json=optIn,proto3" json:"opt_in,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *ExplorerAutoOptimizerSetting) Reset()         { *m = ExplorerAutoOptimizerSetting{} }
+func (m *ExplorerAutoOptimizerSetting) String() string { return proto.CompactTextString(m) }
+func (*ExplorerAutoOptimizerSetting) ProtoMessage()    {}
+func (*ExplorerAutoOptimizerSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6617ac5cefce7126, []int{0}
+}
+
+func (m *ExplorerAutoOptimizerSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExplorerAutoOptimizerSetting.Unmarshal(m, b)
+}
+func (m *ExplorerAutoOptimizerSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExplorerAutoOptimizerSetting.Marshal(b, m, deterministic)
+}
+func (m *ExplorerAutoOptimizerSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExplorerAutoOptimizerSetting.Merge(m, src)
+}
+func (m *ExplorerAutoOptimizerSetting) XXX_Size() int {
+	return xxx_messageInfo_ExplorerAutoOptimizerSetting.Size(m)
+}
+func (m *ExplorerAutoOptimizerSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExplorerAutoOptimizerSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExplorerAutoOptimizerSetting proto.InternalMessageInfo
+
+func (m *ExplorerAutoOptimizerSetting) GetOptIn() *wrappers.BoolValue {
+	if m != nil {
+		return m.OptIn
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ExplorerAutoOptimizerSetting)(nil), "google.ads.googleads.v3.common.ExplorerAutoOptimizerSetting")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/explorer_auto_optimizer_setting.proto", fileDescriptor_6617ac5cefce7126)
+}
+
+var fileDescriptor_6617ac5cefce7126 = []byte{
+	// 306 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xb1, 0x4e, 0xc3, 0x30,
+	0x10, 0x86, 0x95, 0x22, 0x3a, 0x84, 0xad, 0x13, 0xaa, 0xaa, 0x0a, 0x3a, 0x31, 0x9d, 0x05, 0xde,
+	0xcc, 0xe4, 0x02, 0xaa, 0x98, 0x28, 0x20, 0x65, 0x40, 0x91, 0x22, 0xb7, 0x31, 0x96, 0xa5, 0xc4,
+	0x67, 0xd9, 0x4e, 0x41, 0x3c, 0x0e, 0x23, 0x8f, 0xc2, 0xa3, 0xf0, 0x0c, 0x0c, 0xa8, 0x71, 0x92,
+	0x8d, 0x4e, 0xf9, 0x15, 0x7f, 0xf7, 0xdf, 0xa7, 0x4b, 0x6f, 0x15, 0xa2, 0xaa, 0x24, 0x11, 0xa5,
+	0x27, 0x31, 0xee, 0xd3, 0x8e, 0x92, 0x2d, 0xd6, 0x35, 0x1a, 0x22, 0xdf, 0x6d, 0x85, 0x4e, 0xba,
+	0x42, 0x34, 0x01, 0x0b, 0xb4, 0x41, 0xd7, 0xfa, 0x43, 0xba, 0xc2, 0xcb, 0x10, 0xb4, 0x51, 0x60,
+	0x1d, 0x06, 0x9c, 0xcc, 0xe3, 0x28, 0x88, 0xd2, 0xc3, 0xd0, 0x02, 0x3b, 0x0a, 0xb1, 0x65, 0xda,
+	0xbd, 0x93, 0x96, 0xde, 0x34, 0xaf, 0xe4, 0xcd, 0x09, 0x6b, 0xa5, 0xf3, 0x71, 0x7e, 0x3a, 0xeb,
+	0x2d, 0xac, 0x26, 0xc2, 0x18, 0x0c, 0x22, 0x68, 0x34, 0xdd, 0xeb, 0xe2, 0x31, 0x9d, 0xdd, 0x75,
+	0x1a, 0xbc, 0x09, 0xf8, 0xd0, 0x4b, 0x3c, 0x47, 0x87, 0xc9, 0x65, 0x3a, 0x46, 0x1b, 0x0a, 0x6d,
+	0x4e, 0x93, 0xb3, 0xe4, 0xe2, 0xe4, 0x6a, 0xda, 0x39, 0x40, 0xbf, 0x0e, 0x96, 0x88, 0x55, 0x26,
+	0xaa, 0x46, 0x3e, 0x1d, 0xa3, 0x0d, 0xf7, 0x66, 0xf9, 0x9b, 0xa4, 0x8b, 0x2d, 0xd6, 0x70, 0xd8,
+	0x7b, 0x79, 0x7e, 0x68, 0xef, 0x7a, 0xdf, 0xbe, 0x4e, 0x5e, 0xba, 0x13, 0x82, 0xc2, 0x4a, 0x18,
+	0x05, 0xe8, 0x14, 0x51, 0xd2, 0xb4, 0xbb, 0xfb, 0x93, 0x5a, 0xed, 0xff, 0xbb, 0xf0, 0x75, 0xfc,
+	0x7c, 0x8e, 0x8e, 0x56, 0x9c, 0x7f, 0x8d, 0xe6, 0xab, 0x58, 0xc6, 0x4b, 0x0f, 0x31, 0xee, 0x53,
+	0x46, 0xe1, 0xa6, 0xc5, 0xbe, 0x7b, 0x20, 0xe7, 0xa5, 0xcf, 0x07, 0x20, 0xcf, 0x68, 0x1e, 0x81,
+	0x9f, 0xd1, 0x22, 0xfe, 0x65, 0x8c, 0x97, 0x9e, 0xb1, 0x01, 0x61, 0x2c, 0xa3, 0x8c, 0x45, 0x68,
+	0x33, 0x6e, 0xed, 0xe8, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x57, 0x3e, 0xe1, 0xfe, 0x01,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/extensions.pb.go b/googleapis/ads/googleads/v3/common/extensions.pb.go
new file mode 100644
index 0000000..97da100
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/extensions.pb.go
@@ -0,0 +1,1325 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/extensions.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Represents an App extension.
+type AppFeedItem struct {
+	// The visible text displayed when the link is rendered in an ad.
+	// This string must not be empty, and the length of this string should
+	// be between 1 and 25, inclusive.
+	LinkText *wrappers.StringValue `protobuf:"bytes,1,opt,name=link_text,json=linkText,proto3" json:"link_text,omitempty"`
+	// The store-specific ID for the target application.
+	// This string must not be empty.
+	AppId *wrappers.StringValue `protobuf:"bytes,2,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
+	// The application store that the target application belongs to.
+	// This field is required.
+	AppStore enums.AppStoreEnum_AppStore `protobuf:"varint,3,opt,name=app_store,json=appStore,proto3,enum=google.ads.googleads.v3.enums.AppStoreEnum_AppStore" json:"app_store,omitempty"`
+	// A list of possible final URLs after all cross domain redirects.
+	// This list must not be empty.
+	FinalUrls []*wrappers.StringValue `protobuf:"bytes,4,rep,name=final_urls,json=finalUrls,proto3" json:"final_urls,omitempty"`
+	// A list of possible final mobile URLs after all cross domain redirects.
+	FinalMobileUrls []*wrappers.StringValue `protobuf:"bytes,5,rep,name=final_mobile_urls,json=finalMobileUrls,proto3" json:"final_mobile_urls,omitempty"`
+	// URL template for constructing a tracking URL. Default value is "{lpurl}".
+	TrackingUrlTemplate *wrappers.StringValue `protobuf:"bytes,6,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	// A list of mappings to be used for substituting URL custom parameter tags in
+	// the tracking_url_template, final_urls, and/or final_mobile_urls.
+	UrlCustomParameters []*CustomParameter `protobuf:"bytes,7,rep,name=url_custom_parameters,json=urlCustomParameters,proto3" json:"url_custom_parameters,omitempty"`
+	// URL template for appending params to landing page URLs served with parallel
+	// tracking.
+	FinalUrlSuffix       *wrappers.StringValue `protobuf:"bytes,8,opt,name=final_url_suffix,json=finalUrlSuffix,proto3" json:"final_url_suffix,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AppFeedItem) Reset()         { *m = AppFeedItem{} }
+func (m *AppFeedItem) String() string { return proto.CompactTextString(m) }
+func (*AppFeedItem) ProtoMessage()    {}
+func (*AppFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{0}
+}
+
+func (m *AppFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppFeedItem.Unmarshal(m, b)
+}
+func (m *AppFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppFeedItem.Marshal(b, m, deterministic)
+}
+func (m *AppFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppFeedItem.Merge(m, src)
+}
+func (m *AppFeedItem) XXX_Size() int {
+	return xxx_messageInfo_AppFeedItem.Size(m)
+}
+func (m *AppFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppFeedItem proto.InternalMessageInfo
+
+func (m *AppFeedItem) GetLinkText() *wrappers.StringValue {
+	if m != nil {
+		return m.LinkText
+	}
+	return nil
+}
+
+func (m *AppFeedItem) GetAppId() *wrappers.StringValue {
+	if m != nil {
+		return m.AppId
+	}
+	return nil
+}
+
+func (m *AppFeedItem) GetAppStore() enums.AppStoreEnum_AppStore {
+	if m != nil {
+		return m.AppStore
+	}
+	return enums.AppStoreEnum_UNSPECIFIED
+}
+
+func (m *AppFeedItem) GetFinalUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrls
+	}
+	return nil
+}
+
+func (m *AppFeedItem) GetFinalMobileUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalMobileUrls
+	}
+	return nil
+}
+
+func (m *AppFeedItem) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func (m *AppFeedItem) GetUrlCustomParameters() []*CustomParameter {
+	if m != nil {
+		return m.UrlCustomParameters
+	}
+	return nil
+}
+
+func (m *AppFeedItem) GetFinalUrlSuffix() *wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrlSuffix
+	}
+	return nil
+}
+
+// Represents a Call extension.
+type CallFeedItem struct {
+	// The advertiser's phone number to append to the ad.
+	// This string must not be empty.
+	PhoneNumber *wrappers.StringValue `protobuf:"bytes,1,opt,name=phone_number,json=phoneNumber,proto3" json:"phone_number,omitempty"`
+	// Uppercase two-letter country code of the advertiser's phone number.
+	// This string must not be empty.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,2,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// Indicates whether call tracking is enabled. By default, call tracking is
+	// not enabled.
+	CallTrackingEnabled *wrappers.BoolValue `protobuf:"bytes,3,opt,name=call_tracking_enabled,json=callTrackingEnabled,proto3" json:"call_tracking_enabled,omitempty"`
+	// The conversion action to attribute a call conversion to. If not set a
+	// default conversion action is used. This field only has effect if
+	// call_tracking_enabled is set to true. Otherwise this field is ignored.
+	CallConversionAction *wrappers.StringValue `protobuf:"bytes,4,opt,name=call_conversion_action,json=callConversionAction,proto3" json:"call_conversion_action,omitempty"`
+	// If true, disable call conversion tracking. call_conversion_action should
+	// not be set if this is true. Optional.
+	CallConversionTrackingDisabled *wrappers.BoolValue `protobuf:"bytes,5,opt,name=call_conversion_tracking_disabled,json=callConversionTrackingDisabled,proto3" json:"call_conversion_tracking_disabled,omitempty"`
+	// Enum value that indicates whether this call extension uses its own call
+	// conversion setting (or just have call conversion disabled), or following
+	// the account level setting.
+	CallConversionReportingState enums.CallConversionReportingStateEnum_CallConversionReportingState `protobuf:"varint,6,opt,name=call_conversion_reporting_state,json=callConversionReportingState,proto3,enum=google.ads.googleads.v3.enums.CallConversionReportingStateEnum_CallConversionReportingState" json:"call_conversion_reporting_state,omitempty"`
+	XXX_NoUnkeyedLiteral         struct{}                                                            `json:"-"`
+	XXX_unrecognized             []byte                                                              `json:"-"`
+	XXX_sizecache                int32                                                               `json:"-"`
+}
+
+func (m *CallFeedItem) Reset()         { *m = CallFeedItem{} }
+func (m *CallFeedItem) String() string { return proto.CompactTextString(m) }
+func (*CallFeedItem) ProtoMessage()    {}
+func (*CallFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{1}
+}
+
+func (m *CallFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CallFeedItem.Unmarshal(m, b)
+}
+func (m *CallFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CallFeedItem.Marshal(b, m, deterministic)
+}
+func (m *CallFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CallFeedItem.Merge(m, src)
+}
+func (m *CallFeedItem) XXX_Size() int {
+	return xxx_messageInfo_CallFeedItem.Size(m)
+}
+func (m *CallFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_CallFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CallFeedItem proto.InternalMessageInfo
+
+func (m *CallFeedItem) GetPhoneNumber() *wrappers.StringValue {
+	if m != nil {
+		return m.PhoneNumber
+	}
+	return nil
+}
+
+func (m *CallFeedItem) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *CallFeedItem) GetCallTrackingEnabled() *wrappers.BoolValue {
+	if m != nil {
+		return m.CallTrackingEnabled
+	}
+	return nil
+}
+
+func (m *CallFeedItem) GetCallConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.CallConversionAction
+	}
+	return nil
+}
+
+func (m *CallFeedItem) GetCallConversionTrackingDisabled() *wrappers.BoolValue {
+	if m != nil {
+		return m.CallConversionTrackingDisabled
+	}
+	return nil
+}
+
+func (m *CallFeedItem) GetCallConversionReportingState() enums.CallConversionReportingStateEnum_CallConversionReportingState {
+	if m != nil {
+		return m.CallConversionReportingState
+	}
+	return enums.CallConversionReportingStateEnum_UNSPECIFIED
+}
+
+// Represents a callout extension.
+type CalloutFeedItem struct {
+	// The callout text.
+	// The length of this string should be between 1 and 25, inclusive.
+	CalloutText          *wrappers.StringValue `protobuf:"bytes,1,opt,name=callout_text,json=calloutText,proto3" json:"callout_text,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CalloutFeedItem) Reset()         { *m = CalloutFeedItem{} }
+func (m *CalloutFeedItem) String() string { return proto.CompactTextString(m) }
+func (*CalloutFeedItem) ProtoMessage()    {}
+func (*CalloutFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{2}
+}
+
+func (m *CalloutFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CalloutFeedItem.Unmarshal(m, b)
+}
+func (m *CalloutFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CalloutFeedItem.Marshal(b, m, deterministic)
+}
+func (m *CalloutFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CalloutFeedItem.Merge(m, src)
+}
+func (m *CalloutFeedItem) XXX_Size() int {
+	return xxx_messageInfo_CalloutFeedItem.Size(m)
+}
+func (m *CalloutFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_CalloutFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CalloutFeedItem proto.InternalMessageInfo
+
+func (m *CalloutFeedItem) GetCalloutText() *wrappers.StringValue {
+	if m != nil {
+		return m.CalloutText
+	}
+	return nil
+}
+
+// Represents a location extension.
+type LocationFeedItem struct {
+	// The name of the business.
+	BusinessName *wrappers.StringValue `protobuf:"bytes,1,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
+	// Line 1 of the business address.
+	AddressLine_1 *wrappers.StringValue `protobuf:"bytes,2,opt,name=address_line_1,json=addressLine1,proto3" json:"address_line_1,omitempty"`
+	// Line 2 of the business address.
+	AddressLine_2 *wrappers.StringValue `protobuf:"bytes,3,opt,name=address_line_2,json=addressLine2,proto3" json:"address_line_2,omitempty"`
+	// City of the business address.
+	City *wrappers.StringValue `protobuf:"bytes,4,opt,name=city,proto3" json:"city,omitempty"`
+	// Province of the business address.
+	Province *wrappers.StringValue `protobuf:"bytes,5,opt,name=province,proto3" json:"province,omitempty"`
+	// Postal code of the business address.
+	PostalCode *wrappers.StringValue `protobuf:"bytes,6,opt,name=postal_code,json=postalCode,proto3" json:"postal_code,omitempty"`
+	// Country code of the business address.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,7,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// Phone number of the business.
+	PhoneNumber          *wrappers.StringValue `protobuf:"bytes,8,opt,name=phone_number,json=phoneNumber,proto3" json:"phone_number,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *LocationFeedItem) Reset()         { *m = LocationFeedItem{} }
+func (m *LocationFeedItem) String() string { return proto.CompactTextString(m) }
+func (*LocationFeedItem) ProtoMessage()    {}
+func (*LocationFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{3}
+}
+
+func (m *LocationFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LocationFeedItem.Unmarshal(m, b)
+}
+func (m *LocationFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LocationFeedItem.Marshal(b, m, deterministic)
+}
+func (m *LocationFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LocationFeedItem.Merge(m, src)
+}
+func (m *LocationFeedItem) XXX_Size() int {
+	return xxx_messageInfo_LocationFeedItem.Size(m)
+}
+func (m *LocationFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_LocationFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LocationFeedItem proto.InternalMessageInfo
+
+func (m *LocationFeedItem) GetBusinessName() *wrappers.StringValue {
+	if m != nil {
+		return m.BusinessName
+	}
+	return nil
+}
+
+func (m *LocationFeedItem) GetAddressLine_1() *wrappers.StringValue {
+	if m != nil {
+		return m.AddressLine_1
+	}
+	return nil
+}
+
+func (m *LocationFeedItem) GetAddressLine_2() *wrappers.StringValue {
+	if m != nil {
+		return m.AddressLine_2
+	}
+	return nil
+}
+
+func (m *LocationFeedItem) GetCity() *wrappers.StringValue {
+	if m != nil {
+		return m.City
+	}
+	return nil
+}
+
+func (m *LocationFeedItem) GetProvince() *wrappers.StringValue {
+	if m != nil {
+		return m.Province
+	}
+	return nil
+}
+
+func (m *LocationFeedItem) GetPostalCode() *wrappers.StringValue {
+	if m != nil {
+		return m.PostalCode
+	}
+	return nil
+}
+
+func (m *LocationFeedItem) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *LocationFeedItem) GetPhoneNumber() *wrappers.StringValue {
+	if m != nil {
+		return m.PhoneNumber
+	}
+	return nil
+}
+
+// Represents an affiliate location extension.
+type AffiliateLocationFeedItem struct {
+	// The name of the business.
+	BusinessName *wrappers.StringValue `protobuf:"bytes,1,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
+	// Line 1 of the business address.
+	AddressLine_1 *wrappers.StringValue `protobuf:"bytes,2,opt,name=address_line_1,json=addressLine1,proto3" json:"address_line_1,omitempty"`
+	// Line 2 of the business address.
+	AddressLine_2 *wrappers.StringValue `protobuf:"bytes,3,opt,name=address_line_2,json=addressLine2,proto3" json:"address_line_2,omitempty"`
+	// City of the business address.
+	City *wrappers.StringValue `protobuf:"bytes,4,opt,name=city,proto3" json:"city,omitempty"`
+	// Province of the business address.
+	Province *wrappers.StringValue `protobuf:"bytes,5,opt,name=province,proto3" json:"province,omitempty"`
+	// Postal code of the business address.
+	PostalCode *wrappers.StringValue `protobuf:"bytes,6,opt,name=postal_code,json=postalCode,proto3" json:"postal_code,omitempty"`
+	// Country code of the business address.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,7,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// Phone number of the business.
+	PhoneNumber *wrappers.StringValue `protobuf:"bytes,8,opt,name=phone_number,json=phoneNumber,proto3" json:"phone_number,omitempty"`
+	// Id of the retail chain that is advertised as a seller of your product.
+	ChainId *wrappers.Int64Value `protobuf:"bytes,9,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"`
+	// Name of chain.
+	ChainName            *wrappers.StringValue `protobuf:"bytes,10,opt,name=chain_name,json=chainName,proto3" json:"chain_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AffiliateLocationFeedItem) Reset()         { *m = AffiliateLocationFeedItem{} }
+func (m *AffiliateLocationFeedItem) String() string { return proto.CompactTextString(m) }
+func (*AffiliateLocationFeedItem) ProtoMessage()    {}
+func (*AffiliateLocationFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{4}
+}
+
+func (m *AffiliateLocationFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AffiliateLocationFeedItem.Unmarshal(m, b)
+}
+func (m *AffiliateLocationFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AffiliateLocationFeedItem.Marshal(b, m, deterministic)
+}
+func (m *AffiliateLocationFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AffiliateLocationFeedItem.Merge(m, src)
+}
+func (m *AffiliateLocationFeedItem) XXX_Size() int {
+	return xxx_messageInfo_AffiliateLocationFeedItem.Size(m)
+}
+func (m *AffiliateLocationFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_AffiliateLocationFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AffiliateLocationFeedItem proto.InternalMessageInfo
+
+func (m *AffiliateLocationFeedItem) GetBusinessName() *wrappers.StringValue {
+	if m != nil {
+		return m.BusinessName
+	}
+	return nil
+}
+
+func (m *AffiliateLocationFeedItem) GetAddressLine_1() *wrappers.StringValue {
+	if m != nil {
+		return m.AddressLine_1
+	}
+	return nil
+}
+
+func (m *AffiliateLocationFeedItem) GetAddressLine_2() *wrappers.StringValue {
+	if m != nil {
+		return m.AddressLine_2
+	}
+	return nil
+}
+
+func (m *AffiliateLocationFeedItem) GetCity() *wrappers.StringValue {
+	if m != nil {
+		return m.City
+	}
+	return nil
+}
+
+func (m *AffiliateLocationFeedItem) GetProvince() *wrappers.StringValue {
+	if m != nil {
+		return m.Province
+	}
+	return nil
+}
+
+func (m *AffiliateLocationFeedItem) GetPostalCode() *wrappers.StringValue {
+	if m != nil {
+		return m.PostalCode
+	}
+	return nil
+}
+
+func (m *AffiliateLocationFeedItem) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *AffiliateLocationFeedItem) GetPhoneNumber() *wrappers.StringValue {
+	if m != nil {
+		return m.PhoneNumber
+	}
+	return nil
+}
+
+func (m *AffiliateLocationFeedItem) GetChainId() *wrappers.Int64Value {
+	if m != nil {
+		return m.ChainId
+	}
+	return nil
+}
+
+func (m *AffiliateLocationFeedItem) GetChainName() *wrappers.StringValue {
+	if m != nil {
+		return m.ChainName
+	}
+	return nil
+}
+
+// An extension that users can click on to send a text message to the
+// advertiser.
+type TextMessageFeedItem struct {
+	// The business name to prepend to the message text.
+	// This field is required.
+	BusinessName *wrappers.StringValue `protobuf:"bytes,1,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
+	// Uppercase two-letter country code of the advertiser's phone number.
+	// This field is required.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,2,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// The advertiser's phone number the message will be sent to. Required.
+	PhoneNumber *wrappers.StringValue `protobuf:"bytes,3,opt,name=phone_number,json=phoneNumber,proto3" json:"phone_number,omitempty"`
+	// The text to show in the ad.
+	// This field is required.
+	Text *wrappers.StringValue `protobuf:"bytes,4,opt,name=text,proto3" json:"text,omitempty"`
+	// The message text populated in the messaging app.
+	ExtensionText        *wrappers.StringValue `protobuf:"bytes,5,opt,name=extension_text,json=extensionText,proto3" json:"extension_text,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *TextMessageFeedItem) Reset()         { *m = TextMessageFeedItem{} }
+func (m *TextMessageFeedItem) String() string { return proto.CompactTextString(m) }
+func (*TextMessageFeedItem) ProtoMessage()    {}
+func (*TextMessageFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{5}
+}
+
+func (m *TextMessageFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TextMessageFeedItem.Unmarshal(m, b)
+}
+func (m *TextMessageFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TextMessageFeedItem.Marshal(b, m, deterministic)
+}
+func (m *TextMessageFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TextMessageFeedItem.Merge(m, src)
+}
+func (m *TextMessageFeedItem) XXX_Size() int {
+	return xxx_messageInfo_TextMessageFeedItem.Size(m)
+}
+func (m *TextMessageFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_TextMessageFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TextMessageFeedItem proto.InternalMessageInfo
+
+func (m *TextMessageFeedItem) GetBusinessName() *wrappers.StringValue {
+	if m != nil {
+		return m.BusinessName
+	}
+	return nil
+}
+
+func (m *TextMessageFeedItem) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *TextMessageFeedItem) GetPhoneNumber() *wrappers.StringValue {
+	if m != nil {
+		return m.PhoneNumber
+	}
+	return nil
+}
+
+func (m *TextMessageFeedItem) GetText() *wrappers.StringValue {
+	if m != nil {
+		return m.Text
+	}
+	return nil
+}
+
+func (m *TextMessageFeedItem) GetExtensionText() *wrappers.StringValue {
+	if m != nil {
+		return m.ExtensionText
+	}
+	return nil
+}
+
+// Represents a Price extension.
+type PriceFeedItem struct {
+	// Price extension type of this extension.
+	Type enums.PriceExtensionTypeEnum_PriceExtensionType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.PriceExtensionTypeEnum_PriceExtensionType" json:"type,omitempty"`
+	// Price qualifier for all offers of this price extension.
+	PriceQualifier enums.PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier `protobuf:"varint,2,opt,name=price_qualifier,json=priceQualifier,proto3,enum=google.ads.googleads.v3.enums.PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier" json:"price_qualifier,omitempty"`
+	// Tracking URL template for all offers of this price extension.
+	TrackingUrlTemplate *wrappers.StringValue `protobuf:"bytes,3,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	// The code of the language used for this price extension.
+	LanguageCode *wrappers.StringValue `protobuf:"bytes,4,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
+	// The price offerings in this price extension.
+	PriceOfferings []*PriceOffer `protobuf:"bytes,5,rep,name=price_offerings,json=priceOfferings,proto3" json:"price_offerings,omitempty"`
+	// URL template for appending params to landing page URLs served with parallel
+	// tracking.
+	FinalUrlSuffix       *wrappers.StringValue `protobuf:"bytes,6,opt,name=final_url_suffix,json=finalUrlSuffix,proto3" json:"final_url_suffix,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *PriceFeedItem) Reset()         { *m = PriceFeedItem{} }
+func (m *PriceFeedItem) String() string { return proto.CompactTextString(m) }
+func (*PriceFeedItem) ProtoMessage()    {}
+func (*PriceFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{6}
+}
+
+func (m *PriceFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PriceFeedItem.Unmarshal(m, b)
+}
+func (m *PriceFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PriceFeedItem.Marshal(b, m, deterministic)
+}
+func (m *PriceFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PriceFeedItem.Merge(m, src)
+}
+func (m *PriceFeedItem) XXX_Size() int {
+	return xxx_messageInfo_PriceFeedItem.Size(m)
+}
+func (m *PriceFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_PriceFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PriceFeedItem proto.InternalMessageInfo
+
+func (m *PriceFeedItem) GetType() enums.PriceExtensionTypeEnum_PriceExtensionType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.PriceExtensionTypeEnum_UNSPECIFIED
+}
+
+func (m *PriceFeedItem) GetPriceQualifier() enums.PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier {
+	if m != nil {
+		return m.PriceQualifier
+	}
+	return enums.PriceExtensionPriceQualifierEnum_UNSPECIFIED
+}
+
+func (m *PriceFeedItem) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func (m *PriceFeedItem) GetLanguageCode() *wrappers.StringValue {
+	if m != nil {
+		return m.LanguageCode
+	}
+	return nil
+}
+
+func (m *PriceFeedItem) GetPriceOfferings() []*PriceOffer {
+	if m != nil {
+		return m.PriceOfferings
+	}
+	return nil
+}
+
+func (m *PriceFeedItem) GetFinalUrlSuffix() *wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrlSuffix
+	}
+	return nil
+}
+
+// Represents one price offer in a price extension.
+type PriceOffer struct {
+	// Header text of this offer.
+	Header *wrappers.StringValue `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
+	// Description text of this offer.
+	Description *wrappers.StringValue `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	// Price value of this offer.
+	Price *Money `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
+	// Price unit for this offer.
+	Unit enums.PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit `protobuf:"varint,4,opt,name=unit,proto3,enum=google.ads.googleads.v3.enums.PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit" json:"unit,omitempty"`
+	// A list of possible final URLs after all cross domain redirects.
+	FinalUrls []*wrappers.StringValue `protobuf:"bytes,5,rep,name=final_urls,json=finalUrls,proto3" json:"final_urls,omitempty"`
+	// A list of possible final mobile URLs after all cross domain redirects.
+	FinalMobileUrls      []*wrappers.StringValue `protobuf:"bytes,6,rep,name=final_mobile_urls,json=finalMobileUrls,proto3" json:"final_mobile_urls,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *PriceOffer) Reset()         { *m = PriceOffer{} }
+func (m *PriceOffer) String() string { return proto.CompactTextString(m) }
+func (*PriceOffer) ProtoMessage()    {}
+func (*PriceOffer) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{7}
+}
+
+func (m *PriceOffer) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PriceOffer.Unmarshal(m, b)
+}
+func (m *PriceOffer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PriceOffer.Marshal(b, m, deterministic)
+}
+func (m *PriceOffer) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PriceOffer.Merge(m, src)
+}
+func (m *PriceOffer) XXX_Size() int {
+	return xxx_messageInfo_PriceOffer.Size(m)
+}
+func (m *PriceOffer) XXX_DiscardUnknown() {
+	xxx_messageInfo_PriceOffer.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PriceOffer proto.InternalMessageInfo
+
+func (m *PriceOffer) GetHeader() *wrappers.StringValue {
+	if m != nil {
+		return m.Header
+	}
+	return nil
+}
+
+func (m *PriceOffer) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *PriceOffer) GetPrice() *Money {
+	if m != nil {
+		return m.Price
+	}
+	return nil
+}
+
+func (m *PriceOffer) GetUnit() enums.PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit {
+	if m != nil {
+		return m.Unit
+	}
+	return enums.PriceExtensionPriceUnitEnum_UNSPECIFIED
+}
+
+func (m *PriceOffer) GetFinalUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrls
+	}
+	return nil
+}
+
+func (m *PriceOffer) GetFinalMobileUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalMobileUrls
+	}
+	return nil
+}
+
+// Represents a Promotion extension.
+type PromotionFeedItem struct {
+	// A freeform description of what the promotion is targeting.
+	// This field is required.
+	PromotionTarget *wrappers.StringValue `protobuf:"bytes,1,opt,name=promotion_target,json=promotionTarget,proto3" json:"promotion_target,omitempty"`
+	// Enum that modifies the qualification of the discount.
+	DiscountModifier enums.PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier `protobuf:"varint,2,opt,name=discount_modifier,json=discountModifier,proto3,enum=google.ads.googleads.v3.enums.PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier" json:"discount_modifier,omitempty"`
+	// Start date of when the promotion is eligible to be redeemed.
+	PromotionStartDate *wrappers.StringValue `protobuf:"bytes,7,opt,name=promotion_start_date,json=promotionStartDate,proto3" json:"promotion_start_date,omitempty"`
+	// End date of when the promotion is eligible to be redeemed.
+	PromotionEndDate *wrappers.StringValue `protobuf:"bytes,8,opt,name=promotion_end_date,json=promotionEndDate,proto3" json:"promotion_end_date,omitempty"`
+	// The occasion the promotion was intended for.
+	// If an occasion is set, the redemption window will need to fall within
+	// the date range associated with the occasion.
+	Occasion enums.PromotionExtensionOccasionEnum_PromotionExtensionOccasion `protobuf:"varint,9,opt,name=occasion,proto3,enum=google.ads.googleads.v3.enums.PromotionExtensionOccasionEnum_PromotionExtensionOccasion" json:"occasion,omitempty"`
+	// A list of possible final URLs after all cross domain redirects.
+	// This field is required.
+	FinalUrls []*wrappers.StringValue `protobuf:"bytes,10,rep,name=final_urls,json=finalUrls,proto3" json:"final_urls,omitempty"`
+	// A list of possible final mobile URLs after all cross domain redirects.
+	FinalMobileUrls []*wrappers.StringValue `protobuf:"bytes,11,rep,name=final_mobile_urls,json=finalMobileUrls,proto3" json:"final_mobile_urls,omitempty"`
+	// URL template for constructing a tracking URL.
+	TrackingUrlTemplate *wrappers.StringValue `protobuf:"bytes,12,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	// A list of mappings to be used for substituting URL custom parameter tags in
+	// the tracking_url_template, final_urls, and/or final_mobile_urls.
+	UrlCustomParameters []*CustomParameter `protobuf:"bytes,13,rep,name=url_custom_parameters,json=urlCustomParameters,proto3" json:"url_custom_parameters,omitempty"`
+	// URL template for appending params to landing page URLs served with parallel
+	// tracking.
+	FinalUrlSuffix *wrappers.StringValue `protobuf:"bytes,14,opt,name=final_url_suffix,json=finalUrlSuffix,proto3" json:"final_url_suffix,omitempty"`
+	// The language of the promotion.
+	// Represented as BCP 47 language tag.
+	LanguageCode *wrappers.StringValue `protobuf:"bytes,15,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
+	// Discount type, can be percentage off or amount off.
+	//
+	// Types that are valid to be assigned to DiscountType:
+	//	*PromotionFeedItem_PercentOff
+	//	*PromotionFeedItem_MoneyAmountOff
+	DiscountType isPromotionFeedItem_DiscountType `protobuf_oneof:"discount_type"`
+	// Promotion trigger. Can be by promotion code or promo by eligible order
+	// amount.
+	//
+	// Types that are valid to be assigned to PromotionTrigger:
+	//	*PromotionFeedItem_PromotionCode
+	//	*PromotionFeedItem_OrdersOverAmount
+	PromotionTrigger     isPromotionFeedItem_PromotionTrigger `protobuf_oneof:"promotion_trigger"`
+	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
+	XXX_unrecognized     []byte                               `json:"-"`
+	XXX_sizecache        int32                                `json:"-"`
+}
+
+func (m *PromotionFeedItem) Reset()         { *m = PromotionFeedItem{} }
+func (m *PromotionFeedItem) String() string { return proto.CompactTextString(m) }
+func (*PromotionFeedItem) ProtoMessage()    {}
+func (*PromotionFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{8}
+}
+
+func (m *PromotionFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PromotionFeedItem.Unmarshal(m, b)
+}
+func (m *PromotionFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PromotionFeedItem.Marshal(b, m, deterministic)
+}
+func (m *PromotionFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PromotionFeedItem.Merge(m, src)
+}
+func (m *PromotionFeedItem) XXX_Size() int {
+	return xxx_messageInfo_PromotionFeedItem.Size(m)
+}
+func (m *PromotionFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_PromotionFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PromotionFeedItem proto.InternalMessageInfo
+
+func (m *PromotionFeedItem) GetPromotionTarget() *wrappers.StringValue {
+	if m != nil {
+		return m.PromotionTarget
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetDiscountModifier() enums.PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier {
+	if m != nil {
+		return m.DiscountModifier
+	}
+	return enums.PromotionExtensionDiscountModifierEnum_UNSPECIFIED
+}
+
+func (m *PromotionFeedItem) GetPromotionStartDate() *wrappers.StringValue {
+	if m != nil {
+		return m.PromotionStartDate
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetPromotionEndDate() *wrappers.StringValue {
+	if m != nil {
+		return m.PromotionEndDate
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetOccasion() enums.PromotionExtensionOccasionEnum_PromotionExtensionOccasion {
+	if m != nil {
+		return m.Occasion
+	}
+	return enums.PromotionExtensionOccasionEnum_UNSPECIFIED
+}
+
+func (m *PromotionFeedItem) GetFinalUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrls
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetFinalMobileUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalMobileUrls
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetUrlCustomParameters() []*CustomParameter {
+	if m != nil {
+		return m.UrlCustomParameters
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetFinalUrlSuffix() *wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrlSuffix
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetLanguageCode() *wrappers.StringValue {
+	if m != nil {
+		return m.LanguageCode
+	}
+	return nil
+}
+
+type isPromotionFeedItem_DiscountType interface {
+	isPromotionFeedItem_DiscountType()
+}
+
+type PromotionFeedItem_PercentOff struct {
+	PercentOff *wrappers.Int64Value `protobuf:"bytes,3,opt,name=percent_off,json=percentOff,proto3,oneof"`
+}
+
+type PromotionFeedItem_MoneyAmountOff struct {
+	MoneyAmountOff *Money `protobuf:"bytes,4,opt,name=money_amount_off,json=moneyAmountOff,proto3,oneof"`
+}
+
+func (*PromotionFeedItem_PercentOff) isPromotionFeedItem_DiscountType() {}
+
+func (*PromotionFeedItem_MoneyAmountOff) isPromotionFeedItem_DiscountType() {}
+
+func (m *PromotionFeedItem) GetDiscountType() isPromotionFeedItem_DiscountType {
+	if m != nil {
+		return m.DiscountType
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetPercentOff() *wrappers.Int64Value {
+	if x, ok := m.GetDiscountType().(*PromotionFeedItem_PercentOff); ok {
+		return x.PercentOff
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetMoneyAmountOff() *Money {
+	if x, ok := m.GetDiscountType().(*PromotionFeedItem_MoneyAmountOff); ok {
+		return x.MoneyAmountOff
+	}
+	return nil
+}
+
+type isPromotionFeedItem_PromotionTrigger interface {
+	isPromotionFeedItem_PromotionTrigger()
+}
+
+type PromotionFeedItem_PromotionCode struct {
+	PromotionCode *wrappers.StringValue `protobuf:"bytes,5,opt,name=promotion_code,json=promotionCode,proto3,oneof"`
+}
+
+type PromotionFeedItem_OrdersOverAmount struct {
+	OrdersOverAmount *Money `protobuf:"bytes,6,opt,name=orders_over_amount,json=ordersOverAmount,proto3,oneof"`
+}
+
+func (*PromotionFeedItem_PromotionCode) isPromotionFeedItem_PromotionTrigger() {}
+
+func (*PromotionFeedItem_OrdersOverAmount) isPromotionFeedItem_PromotionTrigger() {}
+
+func (m *PromotionFeedItem) GetPromotionTrigger() isPromotionFeedItem_PromotionTrigger {
+	if m != nil {
+		return m.PromotionTrigger
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetPromotionCode() *wrappers.StringValue {
+	if x, ok := m.GetPromotionTrigger().(*PromotionFeedItem_PromotionCode); ok {
+		return x.PromotionCode
+	}
+	return nil
+}
+
+func (m *PromotionFeedItem) GetOrdersOverAmount() *Money {
+	if x, ok := m.GetPromotionTrigger().(*PromotionFeedItem_OrdersOverAmount); ok {
+		return x.OrdersOverAmount
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*PromotionFeedItem) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*PromotionFeedItem_PercentOff)(nil),
+		(*PromotionFeedItem_MoneyAmountOff)(nil),
+		(*PromotionFeedItem_PromotionCode)(nil),
+		(*PromotionFeedItem_OrdersOverAmount)(nil),
+	}
+}
+
+// Represents a structured snippet extension.
+type StructuredSnippetFeedItem struct {
+	// The header of the snippet.
+	// This string must not be empty.
+	Header *wrappers.StringValue `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
+	// The values in the snippet.
+	// The maximum size of this collection is 10.
+	Values               []*wrappers.StringValue `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *StructuredSnippetFeedItem) Reset()         { *m = StructuredSnippetFeedItem{} }
+func (m *StructuredSnippetFeedItem) String() string { return proto.CompactTextString(m) }
+func (*StructuredSnippetFeedItem) ProtoMessage()    {}
+func (*StructuredSnippetFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{9}
+}
+
+func (m *StructuredSnippetFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StructuredSnippetFeedItem.Unmarshal(m, b)
+}
+func (m *StructuredSnippetFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StructuredSnippetFeedItem.Marshal(b, m, deterministic)
+}
+func (m *StructuredSnippetFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StructuredSnippetFeedItem.Merge(m, src)
+}
+func (m *StructuredSnippetFeedItem) XXX_Size() int {
+	return xxx_messageInfo_StructuredSnippetFeedItem.Size(m)
+}
+func (m *StructuredSnippetFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_StructuredSnippetFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StructuredSnippetFeedItem proto.InternalMessageInfo
+
+func (m *StructuredSnippetFeedItem) GetHeader() *wrappers.StringValue {
+	if m != nil {
+		return m.Header
+	}
+	return nil
+}
+
+func (m *StructuredSnippetFeedItem) GetValues() []*wrappers.StringValue {
+	if m != nil {
+		return m.Values
+	}
+	return nil
+}
+
+// Represents a sitelink extension.
+type SitelinkFeedItem struct {
+	// URL display text for the sitelink.
+	// The length of this string should be between 1 and 25, inclusive.
+	LinkText *wrappers.StringValue `protobuf:"bytes,1,opt,name=link_text,json=linkText,proto3" json:"link_text,omitempty"`
+	// First line of the description for the sitelink.
+	// If this value is set, line2 must also be set.
+	// The length of this string should be between 0 and 35, inclusive.
+	Line1 *wrappers.StringValue `protobuf:"bytes,2,opt,name=line1,proto3" json:"line1,omitempty"`
+	// Second line of the description for the sitelink.
+	// If this value is set, line1 must also be set.
+	// The length of this string should be between 0 and 35, inclusive.
+	Line2 *wrappers.StringValue `protobuf:"bytes,3,opt,name=line2,proto3" json:"line2,omitempty"`
+	// A list of possible final URLs after all cross domain redirects.
+	FinalUrls []*wrappers.StringValue `protobuf:"bytes,4,rep,name=final_urls,json=finalUrls,proto3" json:"final_urls,omitempty"`
+	// A list of possible final mobile URLs after all cross domain redirects.
+	FinalMobileUrls []*wrappers.StringValue `protobuf:"bytes,5,rep,name=final_mobile_urls,json=finalMobileUrls,proto3" json:"final_mobile_urls,omitempty"`
+	// URL template for constructing a tracking URL.
+	TrackingUrlTemplate *wrappers.StringValue `protobuf:"bytes,6,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	// A list of mappings to be used for substituting URL custom parameter tags in
+	// the tracking_url_template, final_urls, and/or final_mobile_urls.
+	UrlCustomParameters []*CustomParameter `protobuf:"bytes,7,rep,name=url_custom_parameters,json=urlCustomParameters,proto3" json:"url_custom_parameters,omitempty"`
+	// Final URL suffix to be appended to landing page URLs served with
+	// parallel tracking.
+	FinalUrlSuffix       *wrappers.StringValue `protobuf:"bytes,8,opt,name=final_url_suffix,json=finalUrlSuffix,proto3" json:"final_url_suffix,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *SitelinkFeedItem) Reset()         { *m = SitelinkFeedItem{} }
+func (m *SitelinkFeedItem) String() string { return proto.CompactTextString(m) }
+func (*SitelinkFeedItem) ProtoMessage()    {}
+func (*SitelinkFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{10}
+}
+
+func (m *SitelinkFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SitelinkFeedItem.Unmarshal(m, b)
+}
+func (m *SitelinkFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SitelinkFeedItem.Marshal(b, m, deterministic)
+}
+func (m *SitelinkFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SitelinkFeedItem.Merge(m, src)
+}
+func (m *SitelinkFeedItem) XXX_Size() int {
+	return xxx_messageInfo_SitelinkFeedItem.Size(m)
+}
+func (m *SitelinkFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_SitelinkFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SitelinkFeedItem proto.InternalMessageInfo
+
+func (m *SitelinkFeedItem) GetLinkText() *wrappers.StringValue {
+	if m != nil {
+		return m.LinkText
+	}
+	return nil
+}
+
+func (m *SitelinkFeedItem) GetLine1() *wrappers.StringValue {
+	if m != nil {
+		return m.Line1
+	}
+	return nil
+}
+
+func (m *SitelinkFeedItem) GetLine2() *wrappers.StringValue {
+	if m != nil {
+		return m.Line2
+	}
+	return nil
+}
+
+func (m *SitelinkFeedItem) GetFinalUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrls
+	}
+	return nil
+}
+
+func (m *SitelinkFeedItem) GetFinalMobileUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalMobileUrls
+	}
+	return nil
+}
+
+func (m *SitelinkFeedItem) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func (m *SitelinkFeedItem) GetUrlCustomParameters() []*CustomParameter {
+	if m != nil {
+		return m.UrlCustomParameters
+	}
+	return nil
+}
+
+func (m *SitelinkFeedItem) GetFinalUrlSuffix() *wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrlSuffix
+	}
+	return nil
+}
+
+// Represents a hotel callout extension.
+type HotelCalloutFeedItem struct {
+	// The callout text.
+	// The length of this string should be between 1 and 25, inclusive.
+	Text *wrappers.StringValue `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	// The language of the hotel callout text.
+	// IETF BCP 47 compliant language code.
+	LanguageCode         *wrappers.StringValue `protobuf:"bytes,2,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *HotelCalloutFeedItem) Reset()         { *m = HotelCalloutFeedItem{} }
+func (m *HotelCalloutFeedItem) String() string { return proto.CompactTextString(m) }
+func (*HotelCalloutFeedItem) ProtoMessage()    {}
+func (*HotelCalloutFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee3820afd9e47aba, []int{11}
+}
+
+func (m *HotelCalloutFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelCalloutFeedItem.Unmarshal(m, b)
+}
+func (m *HotelCalloutFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelCalloutFeedItem.Marshal(b, m, deterministic)
+}
+func (m *HotelCalloutFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelCalloutFeedItem.Merge(m, src)
+}
+func (m *HotelCalloutFeedItem) XXX_Size() int {
+	return xxx_messageInfo_HotelCalloutFeedItem.Size(m)
+}
+func (m *HotelCalloutFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelCalloutFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelCalloutFeedItem proto.InternalMessageInfo
+
+func (m *HotelCalloutFeedItem) GetText() *wrappers.StringValue {
+	if m != nil {
+		return m.Text
+	}
+	return nil
+}
+
+func (m *HotelCalloutFeedItem) GetLanguageCode() *wrappers.StringValue {
+	if m != nil {
+		return m.LanguageCode
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AppFeedItem)(nil), "google.ads.googleads.v3.common.AppFeedItem")
+	proto.RegisterType((*CallFeedItem)(nil), "google.ads.googleads.v3.common.CallFeedItem")
+	proto.RegisterType((*CalloutFeedItem)(nil), "google.ads.googleads.v3.common.CalloutFeedItem")
+	proto.RegisterType((*LocationFeedItem)(nil), "google.ads.googleads.v3.common.LocationFeedItem")
+	proto.RegisterType((*AffiliateLocationFeedItem)(nil), "google.ads.googleads.v3.common.AffiliateLocationFeedItem")
+	proto.RegisterType((*TextMessageFeedItem)(nil), "google.ads.googleads.v3.common.TextMessageFeedItem")
+	proto.RegisterType((*PriceFeedItem)(nil), "google.ads.googleads.v3.common.PriceFeedItem")
+	proto.RegisterType((*PriceOffer)(nil), "google.ads.googleads.v3.common.PriceOffer")
+	proto.RegisterType((*PromotionFeedItem)(nil), "google.ads.googleads.v3.common.PromotionFeedItem")
+	proto.RegisterType((*StructuredSnippetFeedItem)(nil), "google.ads.googleads.v3.common.StructuredSnippetFeedItem")
+	proto.RegisterType((*SitelinkFeedItem)(nil), "google.ads.googleads.v3.common.SitelinkFeedItem")
+	proto.RegisterType((*HotelCalloutFeedItem)(nil), "google.ads.googleads.v3.common.HotelCalloutFeedItem")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/extensions.proto", fileDescriptor_ee3820afd9e47aba)
+}
+
+var fileDescriptor_ee3820afd9e47aba = []byte{
+	// 1599 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xdf, 0x4e, 0x1b, 0xc7,
+	0x1a, 0x8f, 0xc1, 0x10, 0xf8, 0x0c, 0x06, 0x96, 0xe4, 0xc8, 0xe1, 0x44, 0x39, 0x39, 0x96, 0x8e,
+	0x14, 0x1d, 0xe9, 0xd8, 0x89, 0xe1, 0x44, 0xa9, 0xa3, 0xa6, 0x35, 0x86, 0x04, 0xaa, 0xf0, 0x27,
+	0x6b, 0x40, 0x55, 0x85, 0xb4, 0x1a, 0x76, 0xc7, 0x66, 0x94, 0xdd, 0x99, 0xed, 0xcc, 0x2c, 0x85,
+	0x07, 0xa8, 0x5a, 0xb5, 0xd7, 0x7d, 0x81, 0x56, 0x6a, 0xa5, 0x5e, 0xf4, 0x05, 0x7a, 0xd5, 0xdb,
+	0xde, 0xf5, 0xa6, 0x0f, 0x91, 0xa7, 0xa8, 0x66, 0x76, 0x76, 0x0d, 0x26, 0xb0, 0x6b, 0x4a, 0xa5,
+	0x5e, 0xe4, 0x8a, 0xdd, 0xf5, 0xf7, 0xfb, 0xcd, 0xcc, 0xb7, 0xbf, 0xef, 0xdf, 0x02, 0xf5, 0x1e,
+	0x63, 0x3d, 0x1f, 0xd7, 0x91, 0x27, 0xcc, 0xa5, 0xba, 0x3a, 0x5a, 0xac, 0xbb, 0x2c, 0x08, 0x18,
+	0xad, 0xe3, 0x63, 0x89, 0xa9, 0x20, 0x8c, 0x8a, 0x5a, 0xc8, 0x99, 0x64, 0xd6, 0xbd, 0xd8, 0xaa,
+	0x86, 0x3c, 0x51, 0x4b, 0x01, 0xb5, 0xa3, 0xc5, 0x5a, 0x0c, 0x58, 0xf8, 0x7f, 0x06, 0xa1, 0x1b,
+	0x09, 0xc9, 0x02, 0x27, 0x44, 0x1c, 0x05, 0x58, 0x62, 0x1e, 0xd3, 0x2e, 0x3c, 0xcc, 0x80, 0x75,
+	0x31, 0xf6, 0x9c, 0xf8, 0xda, 0x20, 0xfe, 0x77, 0x11, 0x02, 0xd3, 0x28, 0x10, 0x75, 0x14, 0x86,
+	0x8e, 0x90, 0x8c, 0x63, 0x63, 0xde, 0xbe, 0xdc, 0xdc, 0x45, 0xbe, 0xef, 0xb8, 0x8c, 0x1e, 0x61,
+	0xae, 0x4e, 0xeb, 0x70, 0x1c, 0x32, 0x2e, 0x09, 0xed, 0x39, 0x42, 0x22, 0x99, 0x93, 0x24, 0xe4,
+	0xc4, 0xc5, 0x4e, 0xea, 0x32, 0x27, 0xbe, 0xff, 0x34, 0x42, 0x3e, 0xe9, 0x92, 0xf4, 0xa8, 0xcf,
+	0xae, 0x42, 0x12, 0x51, 0x22, 0x0d, 0xfe, 0xc9, 0x70, 0x78, 0x79, 0x12, 0x26, 0xdb, 0x5f, 0xcf,
+	0x42, 0xb2, 0x80, 0x49, 0x85, 0xe9, 0xa3, 0x3d, 0x22, 0x5c, 0x16, 0x51, 0xe9, 0x04, 0xcc, 0x3b,
+	0x7d, 0x88, 0x0f, 0x87, 0xa7, 0x62, 0xae, 0x8b, 0xd4, 0x85, 0x61, 0x30, 0x42, 0xaa, 0xeb, 0xbb,
+	0x83, 0xa8, 0x5b, 0xff, 0x8c, 0xa3, 0x30, 0xc4, 0xdc, 0x08, 0x6d, 0xe1, 0x6e, 0xb2, 0x42, 0x48,
+	0xea, 0x88, 0x52, 0x26, 0x91, 0xec, 0xcb, 0xb0, 0xfa, 0x7b, 0x11, 0x4a, 0xad, 0x30, 0x7c, 0x8e,
+	0xb1, 0xb7, 0x2e, 0x71, 0x60, 0xbd, 0x07, 0x93, 0x3e, 0xa1, 0xaf, 0x1d, 0x89, 0x8f, 0x65, 0xa5,
+	0x70, 0xbf, 0xf0, 0xa0, 0xd4, 0xb8, 0x6b, 0xf4, 0x59, 0x4b, 0x56, 0xa8, 0x75, 0x24, 0x27, 0xb4,
+	0xb7, 0x87, 0xfc, 0x08, 0xdb, 0x13, 0xca, 0x7c, 0x07, 0x1f, 0x4b, 0x6b, 0x11, 0xc6, 0x95, 0x58,
+	0x88, 0x57, 0x19, 0xc9, 0x81, 0x1b, 0x43, 0x61, 0xb8, 0xee, 0x59, 0xaf, 0x60, 0x32, 0x55, 0x58,
+	0x65, 0xf4, 0x7e, 0xe1, 0x41, 0xb9, 0xb1, 0x54, 0xbb, 0x28, 0x34, 0xb4, 0x4f, 0x6a, 0xad, 0x30,
+	0xec, 0x28, 0xf3, 0x55, 0x1a, 0x05, 0xe9, 0x8d, 0x3d, 0x81, 0xcc, 0x95, 0xf5, 0x14, 0xa0, 0x4b,
+	0x28, 0xf2, 0x9d, 0x88, 0xfb, 0xa2, 0x52, 0xbc, 0x3f, 0x9a, 0xb9, 0x97, 0x49, 0x6d, 0xbf, 0xcb,
+	0x7d, 0x61, 0xad, 0xc1, 0x5c, 0x0c, 0x0e, 0xd8, 0x01, 0xf1, 0x71, 0xcc, 0x31, 0x96, 0x83, 0x63,
+	0x46, 0xc3, 0x36, 0x34, 0x4a, 0x33, 0x6d, 0xc3, 0x6d, 0xc9, 0x91, 0xfb, 0x5a, 0x69, 0x3f, 0xe2,
+	0xbe, 0x23, 0x71, 0x10, 0xfa, 0x48, 0xe2, 0xca, 0x78, 0x0e, 0xef, 0xcc, 0x27, 0xd0, 0x5d, 0xee,
+	0xef, 0x18, 0xa0, 0xe5, 0xc2, 0x6d, 0x45, 0x34, 0x18, 0xf9, 0xa2, 0x72, 0x53, 0xef, 0xaf, 0x5e,
+	0xbb, 0x3c, 0xa5, 0xd4, 0xda, 0x1a, 0xb8, 0x9d, 0xe0, 0xec, 0xf9, 0x88, 0xfb, 0x03, 0xcf, 0x84,
+	0xf5, 0x1c, 0x66, 0x53, 0xef, 0x39, 0x22, 0xea, 0x76, 0xc9, 0x71, 0x65, 0x22, 0xc7, 0x8e, 0xcb,
+	0x89, 0x0f, 0x3b, 0x1a, 0x53, 0xfd, 0xa5, 0x08, 0x53, 0x6d, 0xe4, 0xfb, 0xa9, 0xb2, 0x3e, 0x80,
+	0xa9, 0xf0, 0x90, 0x51, 0xec, 0xd0, 0x28, 0x38, 0xc0, 0x3c, 0x97, 0xb8, 0x4a, 0x1a, 0xb1, 0xa9,
+	0x01, 0x8a, 0x40, 0x87, 0x10, 0x3f, 0x71, 0x5c, 0xe6, 0xe1, 0x5c, 0x2a, 0x2b, 0x19, 0x44, 0x9b,
+	0x79, 0xd8, 0xda, 0x84, 0xdb, 0x3a, 0x3d, 0xa5, 0xaf, 0x05, 0x53, 0x74, 0xe0, 0x63, 0x4f, 0xeb,
+	0xae, 0xd4, 0x58, 0x38, 0xc7, 0xb4, 0xcc, 0x98, 0x6f, 0xde, 0x87, 0x02, 0xee, 0x18, 0xdc, 0x6a,
+	0x0c, 0xb3, 0x6c, 0xf8, 0xc7, 0x60, 0xba, 0x43, 0xae, 0x0a, 0xae, 0x4a, 0x31, 0xc7, 0xd6, 0x6e,
+	0x29, 0x6c, 0x3b, 0x85, 0xb6, 0x34, 0xd2, 0xc2, 0xf0, 0xef, 0x41, 0xce, 0x74, 0xbb, 0x1e, 0x11,
+	0xf1, 0x7e, 0xc7, 0x32, 0xf7, 0x7b, 0xef, 0x2c, 0x79, 0xb2, 0xf3, 0x15, 0xc3, 0x60, 0x7d, 0x57,
+	0x80, 0x7f, 0x65, 0xa4, 0x6a, 0xad, 0xd3, 0x72, 0x63, 0x3f, 0x23, 0x1a, 0xdb, 0x67, 0x16, 0xb2,
+	0x13, 0x8e, 0x8e, 0xa2, 0xd0, 0x11, 0x7a, 0x99, 0x81, 0x7d, 0xd7, 0xbd, 0xe4, 0xd7, 0xaa, 0x0d,
+	0x33, 0x0a, 0xcd, 0x22, 0x79, 0x5a, 0x45, 0x6e, 0xfc, 0x28, 0x7f, 0x8a, 0x2a, 0x19, 0x84, 0xca,
+	0x52, 0xd5, 0xaf, 0x8a, 0x30, 0xfb, 0x92, 0xb9, 0x3a, 0x09, 0xa6, 0xac, 0x2d, 0x98, 0x3e, 0x88,
+	0x04, 0xa1, 0x58, 0x08, 0x87, 0xa2, 0x00, 0xe7, 0xa2, 0x9d, 0x4a, 0x20, 0x9b, 0x28, 0xc0, 0xd6,
+	0x32, 0x94, 0x91, 0xe7, 0x71, 0xc5, 0xe0, 0x13, 0x8a, 0x9d, 0x47, 0xb9, 0xf4, 0x39, 0x65, 0x30,
+	0x2f, 0x09, 0xc5, 0x8f, 0xce, 0x71, 0x34, 0x8c, 0x32, 0xf3, 0x73, 0x34, 0xac, 0x87, 0x50, 0x74,
+	0x89, 0x3c, 0xc9, 0x25, 0x41, 0x6d, 0x69, 0x3d, 0x81, 0x89, 0x90, 0xb3, 0x23, 0x42, 0x5d, 0x6c,
+	0x94, 0x95, 0x91, 0xf1, 0x13, 0x6b, 0xeb, 0x7d, 0x28, 0x85, 0x4c, 0x48, 0xe4, 0xc7, 0x01, 0x99,
+	0x27, 0xb1, 0x41, 0x0c, 0xd0, 0xf1, 0x38, 0x18, 0xd0, 0x37, 0x87, 0x0d, 0xe8, 0xc1, 0x94, 0x32,
+	0x31, 0x64, 0x4a, 0xa9, 0x7e, 0x39, 0x06, 0x77, 0x5a, 0xdd, 0x2e, 0xf1, 0x09, 0x92, 0xf8, 0x9d,
+	0x2a, 0xde, 0xa9, 0x42, 0x17, 0x9a, 0xc7, 0x30, 0xe1, 0x1e, 0x22, 0x42, 0x55, 0x2b, 0x33, 0xa9,
+	0xc1, 0xff, 0x3c, 0x07, 0x5e, 0xa7, 0xf2, 0xf1, 0x52, 0x8c, 0xbd, 0xa9, 0x8d, 0xd7, 0x3d, 0xd5,
+	0x78, 0xc4, 0x38, 0x2d, 0x16, 0xc8, 0xb1, 0xec, 0xa4, 0xb6, 0x57, 0x4a, 0xa9, 0xfe, 0x36, 0x02,
+	0xf3, 0x2a, 0x41, 0x6d, 0x60, 0x21, 0x50, 0x0f, 0x5f, 0xa7, 0x08, 0xff, 0x74, 0xe1, 0x1c, 0xf4,
+	0xe8, 0xe8, 0xb0, 0x1e, 0x7d, 0x08, 0x45, 0x9d, 0xad, 0x73, 0xc9, 0x4f, 0x59, 0x5a, 0x6d, 0x28,
+	0x9f, 0x6a, 0xbd, 0x15, 0x36, 0x8f, 0x08, 0xa7, 0x53, 0x8c, 0xce, 0xf5, 0x3f, 0x14, 0x61, 0x7a,
+	0x5b, 0xb5, 0xf1, 0xa9, 0x37, 0xf7, 0xa1, 0xa8, 0xfa, 0x78, 0xed, 0xc4, 0x72, 0x63, 0x2d, 0xa3,
+	0xb6, 0x69, 0xec, 0x6a, 0x4a, 0x79, 0x12, 0xc6, 0x15, 0xed, 0xfc, 0x63, 0x5b, 0xb3, 0x5a, 0x9f,
+	0x17, 0x60, 0x66, 0x60, 0x56, 0xd1, 0xce, 0xce, 0xae, 0xa2, 0x67, 0x29, 0xf5, 0xdd, 0xab, 0x84,
+	0xe2, 0x2d, 0x6b, 0x9e, 0x35, 0xb0, 0xcb, 0xe1, 0x99, 0xfb, 0x8b, 0x5b, 0xcf, 0xd1, 0xab, 0xb6,
+	0x9e, 0x2d, 0x98, 0xf6, 0x11, 0xed, 0x45, 0xa8, 0x87, 0x63, 0x0d, 0xe5, 0x79, 0x93, 0x53, 0x09,
+	0x44, 0x8b, 0xa8, 0x93, 0xf8, 0x86, 0x75, 0xbb, 0x58, 0x19, 0x25, 0x7d, 0xf5, 0x7f, 0xb3, 0xfa,
+	0x56, 0x7d, 0xda, 0x2d, 0x85, 0x32, 0x27, 0xdd, 0x4a, 0x18, 0xde, 0xda, 0xad, 0x8e, 0x5f, 0xa1,
+	0x5b, 0xfd, 0x69, 0x14, 0xa0, 0xbf, 0x8c, 0xb5, 0x04, 0xe3, 0x87, 0x18, 0x79, 0x39, 0xbb, 0x54,
+	0x63, 0x6b, 0x3d, 0x83, 0x92, 0x87, 0x85, 0xcb, 0x49, 0xa8, 0x9b, 0xc0, 0x5c, 0x61, 0x76, 0x0a,
+	0x60, 0x3d, 0x85, 0x31, 0x7d, 0x3c, 0xf3, 0x9a, 0xfe, 0x93, 0xe5, 0x97, 0x0d, 0x46, 0xf1, 0x89,
+	0x1d, 0x63, 0xac, 0x2e, 0x14, 0xd5, 0x6c, 0xab, 0x5f, 0x4c, 0xb9, 0x61, 0x0f, 0xaf, 0xb7, 0x5d,
+	0x4a, 0xe4, 0x45, 0x52, 0x53, 0xbf, 0xd9, 0x9a, 0x7f, 0x60, 0xba, 0x1a, 0xbb, 0x86, 0xe9, 0x6a,
+	0xfc, 0x0a, 0xd3, 0x55, 0xf5, 0x7b, 0x80, 0xb9, 0xed, 0x64, 0x38, 0x4e, 0xc3, 0xfb, 0x05, 0xcc,
+	0xf6, 0x27, 0x66, 0x89, 0x78, 0x0f, 0xe7, 0xeb, 0x10, 0x67, 0x52, 0xd4, 0x8e, 0x06, 0x59, 0xdf,
+	0x14, 0x60, 0xee, 0xdc, 0xc8, 0x6e, 0x62, 0xf9, 0x30, 0xd3, 0xb7, 0x86, 0x2b, 0xf5, 0xe1, 0x8a,
+	0x61, 0xda, 0x30, 0x44, 0xc6, 0xcd, 0x59, 0x66, 0xf6, 0xac, 0x37, 0xf0, 0xc4, 0xda, 0x84, 0x5b,
+	0xfd, 0x03, 0x0a, 0x89, 0xb8, 0x74, 0x3c, 0x15, 0xd8, 0x79, 0x8a, 0xa4, 0x95, 0x22, 0x3b, 0x0a,
+	0xb8, 0xa2, 0xe2, 0xfa, 0x23, 0xb0, 0x4e, 0x7d, 0x62, 0xa0, 0x5e, 0xcc, 0x96, 0xa7, 0x62, 0xf6,
+	0x1d, 0xbd, 0x4a, 0x3d, 0xcd, 0x25, 0x61, 0x22, 0xf9, 0x34, 0xa1, 0xcb, 0x66, 0xb9, 0xf1, 0xf1,
+	0xd0, 0x9e, 0xda, 0x32, 0x04, 0x17, 0x78, 0x28, 0xf9, 0xd9, 0x4e, 0x57, 0x1a, 0xd0, 0x23, 0x5c,
+	0x83, 0x1e, 0x4b, 0xd7, 0x3a, 0xed, 0x4f, 0x5d, 0xfb, 0xb4, 0x3f, 0xfd, 0x17, 0x4f, 0xfb, 0xe5,
+	0xe1, 0xf3, 0xe7, 0xf9, 0xfa, 0x30, 0x33, 0x74, 0x7d, 0x78, 0x06, 0xa5, 0x10, 0x73, 0x17, 0x53,
+	0xa9, 0x2a, 0x84, 0xc9, 0x81, 0x97, 0x35, 0x5e, 0x6b, 0x37, 0x6c, 0x30, 0x88, 0xad, 0x6e, 0xd7,
+	0x7a, 0x05, 0xb3, 0x81, 0x4a, 0x88, 0x0e, 0x0a, 0x74, 0xd4, 0x2a, 0x92, 0xe2, 0x10, 0x89, 0x74,
+	0xed, 0x86, 0x5d, 0xd6, 0x04, 0x2d, 0x8d, 0x57, 0x94, 0xab, 0x50, 0xee, 0x47, 0x87, 0x3e, 0x56,
+	0x8e, 0x26, 0x64, 0xad, 0x60, 0x4f, 0xa7, 0x28, 0x7d, 0xb2, 0x5d, 0xb0, 0x18, 0xf7, 0x30, 0x17,
+	0x0e, 0x3b, 0xc2, 0xdc, 0xec, 0xcf, 0x94, 0xa9, 0x9c, 0x7b, 0x2b, 0xd8, 0xb3, 0x31, 0xc5, 0xd6,
+	0x11, 0xe6, 0xf1, 0x06, 0x97, 0x67, 0x60, 0x3a, 0x4d, 0x51, 0xaa, 0xfd, 0x58, 0x9e, 0x87, 0xb9,
+	0x53, 0xd9, 0x8f, 0x93, 0x5e, 0x0f, 0xf3, 0xea, 0x17, 0x05, 0xb8, 0xd3, 0x91, 0x3c, 0x72, 0x65,
+	0xc4, 0xb1, 0xd7, 0xa1, 0x24, 0x0c, 0x71, 0x7f, 0x9c, 0xbe, 0x5a, 0xa1, 0x5b, 0x82, 0xf1, 0x23,
+	0xf5, 0x40, 0x54, 0x46, 0x72, 0xc4, 0x8a, 0xb1, 0xad, 0xfe, 0x5c, 0x84, 0xd9, 0x0e, 0x91, 0xd8,
+	0x27, 0xf4, 0xf5, 0x75, 0x7c, 0x6f, 0x6c, 0xc0, 0x98, 0x9a, 0x87, 0xf2, 0x8d, 0x54, 0xb1, 0x69,
+	0x82, 0xc9, 0x37, 0x42, 0xc5, 0xa6, 0xef, 0xbe, 0x27, 0xfe, 0x2d, 0xbe, 0x27, 0x7e, 0x5d, 0x80,
+	0x5b, 0x6b, 0x4c, 0x62, 0x7f, 0xf0, 0x8b, 0x50, 0x32, 0x5b, 0x14, 0x72, 0xcf, 0x16, 0xe7, 0x92,
+	0xd5, 0xc8, 0xb0, 0xc9, 0x6a, 0xf9, 0x4d, 0x01, 0xaa, 0x2e, 0x0b, 0x32, 0x3c, 0xb4, 0x3c, 0x93,
+	0x56, 0x2e, 0xb1, 0xad, 0x48, 0xb7, 0x0b, 0x9f, 0xac, 0x18, 0x48, 0x8f, 0x29, 0xc2, 0x1a, 0xe3,
+	0xbd, 0x7a, 0x0f, 0x53, 0xbd, 0x64, 0xf2, 0x0f, 0x80, 0x90, 0x88, 0x8b, 0xfe, 0x7f, 0xf3, 0x34,
+	0xfe, 0xf3, 0xed, 0xc8, 0xe8, 0x8b, 0x56, 0xeb, 0xc7, 0x91, 0x7b, 0x2f, 0x62, 0xb2, 0x96, 0x27,
+	0x6a, 0xf1, 0xa5, 0xba, 0xda, 0x5b, 0xac, 0xb5, 0xb5, 0xd9, 0xaf, 0x89, 0xc1, 0x7e, 0xcb, 0x13,
+	0xfb, 0xa9, 0xc1, 0xfe, 0xde, 0xe2, 0x7e, 0x6c, 0xf0, 0x66, 0xa4, 0x1a, 0x3f, 0x6d, 0x36, 0x5b,
+	0x9e, 0x68, 0x36, 0x53, 0x93, 0x66, 0x73, 0x6f, 0xb1, 0xd9, 0x8c, 0x8d, 0x0e, 0xc6, 0xf5, 0xee,
+	0x16, 0xff, 0x08, 0x00, 0x00, 0xff, 0xff, 0xa0, 0x64, 0x95, 0xad, 0xe4, 0x1a, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/feed_common.pb.go b/googleapis/ads/googleads/v3/common/feed_common.pb.go
new file mode 100644
index 0000000..2184377
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/feed_common.pb.go
@@ -0,0 +1,107 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/feed_common.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Represents a price in a particular currency.
+type Money struct {
+	// Three-character ISO 4217 currency code.
+	CurrencyCode *wrappers.StringValue `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	// Amount in micros. One million is equivalent to one unit.
+	AmountMicros         *wrappers.Int64Value `protobuf:"bytes,2,opt,name=amount_micros,json=amountMicros,proto3" json:"amount_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *Money) Reset()         { *m = Money{} }
+func (m *Money) String() string { return proto.CompactTextString(m) }
+func (*Money) ProtoMessage()    {}
+func (*Money) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a474332def9e8093, []int{0}
+}
+
+func (m *Money) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Money.Unmarshal(m, b)
+}
+func (m *Money) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Money.Marshal(b, m, deterministic)
+}
+func (m *Money) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Money.Merge(m, src)
+}
+func (m *Money) XXX_Size() int {
+	return xxx_messageInfo_Money.Size(m)
+}
+func (m *Money) XXX_DiscardUnknown() {
+	xxx_messageInfo_Money.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Money proto.InternalMessageInfo
+
+func (m *Money) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+func (m *Money) GetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.AmountMicros
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Money)(nil), "google.ads.googleads.v3.common.Money")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/feed_common.proto", fileDescriptor_a474332def9e8093)
+}
+
+var fileDescriptor_a474332def9e8093 = []byte{
+	// 326 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4a, 0xc3, 0x40,
+	0x14, 0x86, 0x49, 0x44, 0x17, 0xd1, 0x22, 0x74, 0x55, 0x6a, 0x29, 0xd2, 0x95, 0xab, 0x19, 0x31,
+	0xe2, 0x62, 0xdc, 0x98, 0x56, 0x2c, 0x2e, 0x0a, 0x45, 0x21, 0x0b, 0x09, 0x94, 0x69, 0xe6, 0x75,
+	0x08, 0x34, 0xf3, 0xc2, 0x4c, 0x52, 0xe9, 0x1d, 0x3c, 0x85, 0x4b, 0x8f, 0xe2, 0x51, 0x7a, 0x0a,
+	0x69, 0x5e, 0xd2, 0x8d, 0xe8, 0x6a, 0x7e, 0xe6, 0x7d, 0xff, 0xff, 0xcf, 0xbc, 0xe0, 0x5a, 0x23,
+	0xea, 0x35, 0x70, 0xa9, 0x1c, 0x27, 0xb9, 0x57, 0x9b, 0x90, 0xa7, 0x98, 0xe7, 0x68, 0xf8, 0x0a,
+	0x40, 0x2d, 0x48, 0xb3, 0xc2, 0x62, 0x89, 0xdd, 0x21, 0x61, 0x4c, 0x2a, 0xc7, 0x0e, 0x0e, 0xb6,
+	0x09, 0x19, 0x51, 0xfd, 0x66, 0xce, 0x6b, 0x7a, 0x59, 0xad, 0xf8, 0xbb, 0x95, 0x45, 0x01, 0xd6,
+	0x91, 0xbf, 0x3f, 0x68, 0x1b, 0x8b, 0x8c, 0x4b, 0x63, 0xb0, 0x94, 0x65, 0x86, 0xa6, 0x99, 0x8e,
+	0x3e, 0xbc, 0xe0, 0x78, 0x86, 0x06, 0xb6, 0xdd, 0x28, 0xe8, 0xa4, 0x95, 0xb5, 0x60, 0xd2, 0xed,
+	0x22, 0x45, 0x05, 0x3d, 0xef, 0xd2, 0xbb, 0x3a, 0xbd, 0x19, 0x34, 0xa5, 0xac, 0xcd, 0x67, 0xaf,
+	0xa5, 0xcd, 0x8c, 0x8e, 0xe5, 0xba, 0x82, 0x97, 0xb3, 0xd6, 0x32, 0x41, 0x05, 0xdd, 0x87, 0xa0,
+	0x23, 0x73, 0xac, 0x4c, 0xb9, 0xc8, 0xb3, 0xd4, 0xa2, 0xeb, 0xf9, 0x75, 0xc4, 0xc5, 0xaf, 0x88,
+	0x67, 0x53, 0xde, 0xdd, 0x36, 0x09, 0xe4, 0x98, 0xd5, 0x86, 0xf1, 0xce, 0x0b, 0x46, 0x29, 0xe6,
+	0xec, 0xff, 0x3f, 0x8f, 0xcf, 0x9f, 0x00, 0xd4, 0xa4, 0xd6, 0xf3, 0x7d, 0xe6, 0xdc, 0x7b, 0x7b,
+	0x6c, 0x2c, 0x1a, 0xd7, 0xd2, 0x68, 0x86, 0x56, 0x73, 0x0d, 0xa6, 0x6e, 0x6c, 0x17, 0x5d, 0x64,
+	0xee, 0xaf, 0xbd, 0xdf, 0xd3, 0xf1, 0xe9, 0x1f, 0x4d, 0xa3, 0xe8, 0xcb, 0x1f, 0x4e, 0x29, 0x2c,
+	0x52, 0x8e, 0x91, 0xdc, 0xab, 0x38, 0x64, 0xd4, 0xf9, 0xdd, 0x02, 0x49, 0xa4, 0x5c, 0x72, 0x00,
+	0x92, 0x38, 0x4c, 0x08, 0xd8, 0xf9, 0x23, 0xba, 0x15, 0x22, 0x52, 0x4e, 0x88, 0x03, 0x22, 0x44,
+	0x1c, 0x0a, 0x41, 0xd0, 0xf2, 0xa4, 0x7e, 0x5d, 0xf8, 0x13, 0x00, 0x00, 0xff, 0xff, 0x1a, 0x8a,
+	0x12, 0xa4, 0x14, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/final_app_url.pb.go b/googleapis/ads/googleads/v3/common/final_app_url.pb.go
new file mode 100644
index 0000000..337976c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/final_app_url.pb.go
@@ -0,0 +1,116 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/final_app_url.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A URL for deep linking into an app for the given operating system.
+type FinalAppUrl struct {
+	// The operating system targeted by this URL. Required.
+	OsType enums.AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType `protobuf:"varint,1,opt,name=os_type,json=osType,proto3,enum=google.ads.googleads.v3.enums.AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType" json:"os_type,omitempty"`
+	// The app deep link URL. Deep links specify a location in an app that
+	// corresponds to the content you'd like to show, and should be of the form
+	// {scheme}://{host_path}
+	// The scheme identifies which app to open. For your app, you can use a custom
+	// scheme that starts with the app's name. The host and path specify the
+	// unique location in the app where your content exists.
+	// Example: "exampleapp://productid_1234". Required.
+	Url                  *wrappers.StringValue `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *FinalAppUrl) Reset()         { *m = FinalAppUrl{} }
+func (m *FinalAppUrl) String() string { return proto.CompactTextString(m) }
+func (*FinalAppUrl) ProtoMessage()    {}
+func (*FinalAppUrl) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5a155cdeb995ff55, []int{0}
+}
+
+func (m *FinalAppUrl) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FinalAppUrl.Unmarshal(m, b)
+}
+func (m *FinalAppUrl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FinalAppUrl.Marshal(b, m, deterministic)
+}
+func (m *FinalAppUrl) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FinalAppUrl.Merge(m, src)
+}
+func (m *FinalAppUrl) XXX_Size() int {
+	return xxx_messageInfo_FinalAppUrl.Size(m)
+}
+func (m *FinalAppUrl) XXX_DiscardUnknown() {
+	xxx_messageInfo_FinalAppUrl.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FinalAppUrl proto.InternalMessageInfo
+
+func (m *FinalAppUrl) GetOsType() enums.AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType {
+	if m != nil {
+		return m.OsType
+	}
+	return enums.AppUrlOperatingSystemTypeEnum_UNSPECIFIED
+}
+
+func (m *FinalAppUrl) GetUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.Url
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*FinalAppUrl)(nil), "google.ads.googleads.v3.common.FinalAppUrl")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/final_app_url.proto", fileDescriptor_5a155cdeb995ff55)
+}
+
+var fileDescriptor_5a155cdeb995ff55 = []byte{
+	// 355 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xbf, 0x6a, 0xc3, 0x30,
+	0x10, 0xc6, 0xb1, 0x03, 0x29, 0x38, 0x50, 0x4a, 0xa6, 0x10, 0x42, 0x08, 0x99, 0x32, 0x49, 0x10,
+	0x6f, 0xea, 0xe4, 0xf4, 0x4f, 0xc6, 0x86, 0xa4, 0xf5, 0x50, 0x0c, 0x46, 0x89, 0x15, 0x61, 0xb0,
+	0x75, 0x42, 0x92, 0x53, 0xf2, 0x3a, 0x1d, 0x3b, 0xf4, 0x41, 0xfa, 0x28, 0xed, 0x4b, 0x14, 0x4b,
+	0x76, 0xe8, 0xe2, 0x4e, 0x3a, 0xfb, 0x7e, 0xf7, 0x7d, 0xdf, 0x49, 0xc1, 0x92, 0x03, 0xf0, 0x82,
+	0x61, 0x9a, 0x69, 0xec, 0xca, 0xba, 0x3a, 0x85, 0xf8, 0x00, 0x65, 0x09, 0x02, 0x1f, 0x73, 0x41,
+	0x8b, 0x94, 0x4a, 0x99, 0x56, 0xaa, 0x40, 0x52, 0x81, 0x81, 0xe1, 0xd4, 0x81, 0x88, 0x66, 0x1a,
+	0x5d, 0x66, 0xd0, 0x29, 0x44, 0x6e, 0x66, 0x1c, 0x75, 0x69, 0x32, 0x51, 0x95, 0x1a, 0x37, 0x62,
+	0x29, 0x48, 0xa6, 0xa8, 0xc9, 0x05, 0x4f, 0xf5, 0x59, 0x1b, 0x56, 0xa6, 0xe6, 0x2c, 0x99, 0xb3,
+	0x18, 0x37, 0x16, 0xd8, 0x7e, 0xed, 0xab, 0x23, 0x7e, 0x53, 0x54, 0x4a, 0xa6, 0x74, 0xd3, 0x9f,
+	0xb4, 0x16, 0x32, 0xc7, 0x54, 0x08, 0x30, 0xd4, 0xe4, 0x20, 0x9a, 0xee, 0xfc, 0xd3, 0x0b, 0x06,
+	0x8f, 0x75, 0xf0, 0x48, 0xca, 0x17, 0x55, 0x0c, 0x21, 0xb8, 0x02, 0x6d, 0xe5, 0x47, 0xde, 0xcc,
+	0x5b, 0x5c, 0x2f, 0x63, 0xd4, 0xb5, 0x82, 0x8d, 0x88, 0xdc, 0xdc, 0x53, 0x1b, 0x70, 0x67, 0xf3,
+	0x3d, 0x9f, 0x25, 0x7b, 0x10, 0x55, 0xd9, 0xdd, 0xdd, 0xf6, 0x41, 0xd7, 0xe7, 0x10, 0x05, 0xbd,
+	0x4a, 0x15, 0x23, 0x7f, 0xe6, 0x2d, 0x06, 0xcb, 0x49, 0x6b, 0xd6, 0x2e, 0x83, 0x76, 0x46, 0xe5,
+	0x82, 0xc7, 0xb4, 0xa8, 0xd8, 0xb6, 0x06, 0x57, 0x3f, 0x5e, 0x30, 0x3f, 0x40, 0x89, 0xfe, 0xbf,
+	0xd8, 0xd5, 0xcd, 0x9f, 0xa5, 0x36, 0xb5, 0xd8, 0xc6, 0x7b, 0xbd, 0x6f, 0x66, 0x38, 0x14, 0x54,
+	0x70, 0x04, 0x8a, 0x63, 0xce, 0x84, 0xb5, 0x6a, 0x2f, 0x5f, 0xe6, 0xba, 0xeb, 0x7d, 0x6f, 0xdd,
+	0xf1, 0xee, 0xf7, 0xd6, 0x51, 0xf4, 0xe1, 0x4f, 0xd7, 0x4e, 0x2c, 0xca, 0x34, 0x72, 0x65, 0x5d,
+	0xc5, 0x21, 0xba, 0xb3, 0xd8, 0x57, 0x0b, 0x24, 0x51, 0xa6, 0x93, 0x0b, 0x90, 0xc4, 0x61, 0xe2,
+	0x80, 0x6f, 0x7f, 0xee, 0xfe, 0x12, 0x12, 0x65, 0x9a, 0x90, 0x0b, 0x42, 0x48, 0x1c, 0x12, 0xe2,
+	0xa0, 0x7d, 0xdf, 0xa6, 0x0b, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x93, 0x6b, 0x2a, 0xe5, 0x7c,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/frequency_cap.pb.go b/googleapis/ads/googleads/v3/common/frequency_cap.pb.go
new file mode 100644
index 0000000..49b94dc
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/frequency_cap.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/frequency_cap.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A rule specifying the maximum number of times an ad (or some set of ads) can
+// be shown to a user over a particular time period.
+type FrequencyCapEntry struct {
+	// The key of a particular frequency cap. There can be no more
+	// than one frequency cap with the same key.
+	Key *FrequencyCapKey `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	// Maximum number of events allowed during the time range by this cap.
+	Cap                  *wrappers.Int32Value `protobuf:"bytes,2,opt,name=cap,proto3" json:"cap,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *FrequencyCapEntry) Reset()         { *m = FrequencyCapEntry{} }
+func (m *FrequencyCapEntry) String() string { return proto.CompactTextString(m) }
+func (*FrequencyCapEntry) ProtoMessage()    {}
+func (*FrequencyCapEntry) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9d5d792890a02906, []int{0}
+}
+
+func (m *FrequencyCapEntry) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FrequencyCapEntry.Unmarshal(m, b)
+}
+func (m *FrequencyCapEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FrequencyCapEntry.Marshal(b, m, deterministic)
+}
+func (m *FrequencyCapEntry) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FrequencyCapEntry.Merge(m, src)
+}
+func (m *FrequencyCapEntry) XXX_Size() int {
+	return xxx_messageInfo_FrequencyCapEntry.Size(m)
+}
+func (m *FrequencyCapEntry) XXX_DiscardUnknown() {
+	xxx_messageInfo_FrequencyCapEntry.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FrequencyCapEntry proto.InternalMessageInfo
+
+func (m *FrequencyCapEntry) GetKey() *FrequencyCapKey {
+	if m != nil {
+		return m.Key
+	}
+	return nil
+}
+
+func (m *FrequencyCapEntry) GetCap() *wrappers.Int32Value {
+	if m != nil {
+		return m.Cap
+	}
+	return nil
+}
+
+// A group of fields used as keys for a frequency cap.
+// There can be no more than one frequency cap with the same key.
+type FrequencyCapKey struct {
+	// The level on which the cap is to be applied (e.g. ad group ad, ad group).
+	// The cap is applied to all the entities of this level.
+	Level enums.FrequencyCapLevelEnum_FrequencyCapLevel `protobuf:"varint,1,opt,name=level,proto3,enum=google.ads.googleads.v3.enums.FrequencyCapLevelEnum_FrequencyCapLevel" json:"level,omitempty"`
+	// The type of event that the cap applies to (e.g. impression).
+	EventType enums.FrequencyCapEventTypeEnum_FrequencyCapEventType `protobuf:"varint,3,opt,name=event_type,json=eventType,proto3,enum=google.ads.googleads.v3.enums.FrequencyCapEventTypeEnum_FrequencyCapEventType" json:"event_type,omitempty"`
+	// Unit of time the cap is defined at (e.g. day, week).
+	TimeUnit enums.FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit `protobuf:"varint,2,opt,name=time_unit,json=timeUnit,proto3,enum=google.ads.googleads.v3.enums.FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit" json:"time_unit,omitempty"`
+	// Number of time units the cap lasts.
+	TimeLength           *wrappers.Int32Value `protobuf:"bytes,4,opt,name=time_length,json=timeLength,proto3" json:"time_length,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *FrequencyCapKey) Reset()         { *m = FrequencyCapKey{} }
+func (m *FrequencyCapKey) String() string { return proto.CompactTextString(m) }
+func (*FrequencyCapKey) ProtoMessage()    {}
+func (*FrequencyCapKey) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9d5d792890a02906, []int{1}
+}
+
+func (m *FrequencyCapKey) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FrequencyCapKey.Unmarshal(m, b)
+}
+func (m *FrequencyCapKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FrequencyCapKey.Marshal(b, m, deterministic)
+}
+func (m *FrequencyCapKey) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FrequencyCapKey.Merge(m, src)
+}
+func (m *FrequencyCapKey) XXX_Size() int {
+	return xxx_messageInfo_FrequencyCapKey.Size(m)
+}
+func (m *FrequencyCapKey) XXX_DiscardUnknown() {
+	xxx_messageInfo_FrequencyCapKey.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FrequencyCapKey proto.InternalMessageInfo
+
+func (m *FrequencyCapKey) GetLevel() enums.FrequencyCapLevelEnum_FrequencyCapLevel {
+	if m != nil {
+		return m.Level
+	}
+	return enums.FrequencyCapLevelEnum_UNSPECIFIED
+}
+
+func (m *FrequencyCapKey) GetEventType() enums.FrequencyCapEventTypeEnum_FrequencyCapEventType {
+	if m != nil {
+		return m.EventType
+	}
+	return enums.FrequencyCapEventTypeEnum_UNSPECIFIED
+}
+
+func (m *FrequencyCapKey) GetTimeUnit() enums.FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit {
+	if m != nil {
+		return m.TimeUnit
+	}
+	return enums.FrequencyCapTimeUnitEnum_UNSPECIFIED
+}
+
+func (m *FrequencyCapKey) GetTimeLength() *wrappers.Int32Value {
+	if m != nil {
+		return m.TimeLength
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*FrequencyCapEntry)(nil), "google.ads.googleads.v3.common.FrequencyCapEntry")
+	proto.RegisterType((*FrequencyCapKey)(nil), "google.ads.googleads.v3.common.FrequencyCapKey")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/frequency_cap.proto", fileDescriptor_9d5d792890a02906)
+}
+
+var fileDescriptor_9d5d792890a02906 = []byte{
+	// 466 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcf, 0x6a, 0xd4, 0x40,
+	0x18, 0x27, 0x1b, 0x15, 0x3b, 0x85, 0x8a, 0x39, 0x2d, 0x55, 0x8a, 0xec, 0xc9, 0x8b, 0x33, 0x90,
+	0x1c, 0x84, 0xb4, 0x97, 0xb4, 0x6e, 0x8b, 0xb8, 0x48, 0x09, 0x75, 0x0f, 0x12, 0x58, 0xa6, 0xc9,
+	0xd7, 0x18, 0x4c, 0x66, 0xc6, 0x64, 0xb2, 0x92, 0x07, 0x10, 0xdf, 0xc3, 0xa3, 0x8f, 0xe2, 0xa3,
+	0x88, 0x0f, 0x21, 0x33, 0x93, 0x89, 0xae, 0xcb, 0xba, 0xe4, 0x94, 0x5f, 0xe6, 0xfb, 0xfd, 0xf9,
+	0xf2, 0x7d, 0x13, 0xe4, 0xe7, 0x9c, 0xe7, 0x25, 0x10, 0x9a, 0x35, 0xc4, 0x40, 0x85, 0xd6, 0x01,
+	0x49, 0x79, 0x55, 0x71, 0x46, 0xee, 0x6a, 0xf8, 0xd4, 0x02, 0x4b, 0xbb, 0x55, 0x4a, 0x05, 0x16,
+	0x35, 0x97, 0xdc, 0x3b, 0x31, 0x44, 0x4c, 0xb3, 0x06, 0x0f, 0x1a, 0xbc, 0x0e, 0xb0, 0xd1, 0x1c,
+	0x9f, 0xed, 0xf2, 0x04, 0xd6, 0x56, 0xcd, 0xa6, 0xe5, 0x0a, 0xd6, 0xc0, 0xe4, 0x4a, 0x76, 0x02,
+	0x8c, 0xfb, 0xf1, 0xcb, 0x31, 0xea, 0x12, 0xd6, 0x50, 0xf6, 0xc2, 0xd3, 0x31, 0x42, 0x59, 0x54,
+	0xb0, 0x6a, 0x59, 0x21, 0x7b, 0x71, 0xff, 0x4d, 0x44, 0xbf, 0xdd, 0xb6, 0x77, 0xe4, 0x73, 0x4d,
+	0x85, 0x80, 0xba, 0xe9, 0xeb, 0x4f, 0xad, 0xb9, 0x28, 0x08, 0x65, 0x8c, 0x4b, 0x2a, 0x0b, 0xce,
+	0xfa, 0xea, 0xec, 0x8b, 0x83, 0x1e, 0x5f, 0x5a, 0xff, 0x0b, 0x2a, 0xe6, 0x4c, 0xd6, 0x9d, 0x17,
+	0x21, 0xf7, 0x23, 0x74, 0x53, 0xe7, 0x99, 0xf3, 0xfc, 0xd0, 0x27, 0xf8, 0xff, 0x53, 0xc3, 0x7f,
+	0xeb, 0xdf, 0x40, 0x17, 0x2b, 0xad, 0xf7, 0x02, 0xb9, 0x29, 0x15, 0xd3, 0x89, 0xb6, 0x78, 0x62,
+	0x2d, 0x6c, 0x93, 0xf8, 0x35, 0x93, 0x81, 0xbf, 0xa4, 0x65, 0x0b, 0xb1, 0xe2, 0xcd, 0xbe, 0xba,
+	0xe8, 0xd1, 0x3f, 0x3e, 0x5e, 0x82, 0xee, 0xeb, 0x29, 0xe9, 0x3e, 0x8e, 0xfc, 0xcb, 0x9d, 0x7d,
+	0xe8, 0x31, 0x6d, 0xb4, 0xb1, 0x50, 0xba, 0x39, 0x6b, 0xab, 0xed, 0xd3, 0xd8, 0x98, 0x7a, 0x15,
+	0x42, 0x7f, 0x36, 0x38, 0x75, 0x75, 0xc4, 0xdb, 0x11, 0x11, 0x73, 0x25, 0xbe, 0xe9, 0x04, 0x6c,
+	0xc5, 0x0c, 0x95, 0xf8, 0x00, 0x2c, 0xf4, 0x0a, 0x74, 0x30, 0x6c, 0x4e, 0x4f, 0xe5, 0xc8, 0x5f,
+	0x8c, 0x48, 0xbb, 0x29, 0x2a, 0x78, 0xc7, 0x0a, 0xb9, 0x15, 0x66, 0x0b, 0xf1, 0x43, 0xd9, 0x23,
+	0xef, 0x0c, 0x1d, 0xea, 0xa8, 0x12, 0x58, 0x2e, 0x3f, 0x4c, 0xef, 0xed, 0x5f, 0x01, 0x52, 0xfc,
+	0x85, 0xa6, 0x9f, 0xff, 0x72, 0xd0, 0x2c, 0xe5, 0xd5, 0x9e, 0xa5, 0x9f, 0x6f, 0xdc, 0x9a, 0x6b,
+	0xe5, 0x79, 0xed, 0xbc, 0x7f, 0xd5, 0x8b, 0x72, 0x5e, 0x52, 0x96, 0x63, 0x5e, 0xe7, 0x24, 0x07,
+	0xa6, 0x13, 0xed, 0xc5, 0x16, 0x45, 0xb3, 0xeb, 0x97, 0x3d, 0x35, 0x8f, 0x6f, 0x13, 0xf7, 0x2a,
+	0x8a, 0xbe, 0x4f, 0x4e, 0xae, 0x8c, 0x59, 0x94, 0x35, 0xd8, 0x40, 0x85, 0x96, 0x01, 0xbe, 0xd0,
+	0xb4, 0x1f, 0x96, 0x90, 0x44, 0x59, 0x93, 0x0c, 0x84, 0x64, 0x19, 0x24, 0x86, 0xf0, 0x73, 0x32,
+	0x33, 0xa7, 0x61, 0x18, 0x65, 0x4d, 0x18, 0x0e, 0x94, 0x30, 0x5c, 0x06, 0x61, 0x68, 0x48, 0xb7,
+	0x0f, 0x74, 0x77, 0xc1, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x73, 0x8d, 0xaf, 0xa2, 0x4f, 0x04,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/keyword_plan_common.pb.go b/googleapis/ads/googleads/v3/common/keyword_plan_common.pb.go
new file mode 100644
index 0000000..e600e39
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/keyword_plan_common.pb.go
@@ -0,0 +1,112 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/keyword_plan_common.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Historical metrics.
+type KeywordPlanHistoricalMetrics struct {
+	// Average monthly searches for the past 12 months.
+	AvgMonthlySearches *wrappers.Int64Value `protobuf:"bytes,1,opt,name=avg_monthly_searches,json=avgMonthlySearches,proto3" json:"avg_monthly_searches,omitempty"`
+	// The competition level for the query.
+	Competition          enums.KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel `protobuf:"varint,2,opt,name=competition,proto3,enum=google.ads.googleads.v3.enums.KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel" json:"competition,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                          `json:"-"`
+	XXX_unrecognized     []byte                                                            `json:"-"`
+	XXX_sizecache        int32                                                             `json:"-"`
+}
+
+func (m *KeywordPlanHistoricalMetrics) Reset()         { *m = KeywordPlanHistoricalMetrics{} }
+func (m *KeywordPlanHistoricalMetrics) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanHistoricalMetrics) ProtoMessage()    {}
+func (*KeywordPlanHistoricalMetrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f1a30a3ce87da9fb, []int{0}
+}
+
+func (m *KeywordPlanHistoricalMetrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanHistoricalMetrics.Unmarshal(m, b)
+}
+func (m *KeywordPlanHistoricalMetrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanHistoricalMetrics.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanHistoricalMetrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanHistoricalMetrics.Merge(m, src)
+}
+func (m *KeywordPlanHistoricalMetrics) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanHistoricalMetrics.Size(m)
+}
+func (m *KeywordPlanHistoricalMetrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanHistoricalMetrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanHistoricalMetrics proto.InternalMessageInfo
+
+func (m *KeywordPlanHistoricalMetrics) GetAvgMonthlySearches() *wrappers.Int64Value {
+	if m != nil {
+		return m.AvgMonthlySearches
+	}
+	return nil
+}
+
+func (m *KeywordPlanHistoricalMetrics) GetCompetition() enums.KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel {
+	if m != nil {
+		return m.Competition
+	}
+	return enums.KeywordPlanCompetitionLevelEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*KeywordPlanHistoricalMetrics)(nil), "google.ads.googleads.v3.common.KeywordPlanHistoricalMetrics")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/keyword_plan_common.proto", fileDescriptor_f1a30a3ce87da9fb)
+}
+
+var fileDescriptor_f1a30a3ce87da9fb = []byte{
+	// 387 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0x4d, 0x6a, 0xe3, 0x30,
+	0x14, 0xc6, 0x1e, 0x98, 0x85, 0x03, 0xb3, 0x30, 0xc3, 0x10, 0x32, 0x21, 0x84, 0xac, 0xb2, 0x92,
+	0x20, 0x1e, 0x86, 0x41, 0xb3, 0x72, 0xda, 0x92, 0x96, 0x36, 0x10, 0x52, 0xf0, 0x22, 0x18, 0x8c,
+	0x62, 0xab, 0x8a, 0xa9, 0x2c, 0x19, 0x49, 0x76, 0x08, 0xf4, 0x34, 0x5d, 0xf6, 0x28, 0x3d, 0x4a,
+	0xbb, 0xea, 0x0d, 0x8a, 0x2d, 0x3b, 0x4d, 0x29, 0xc9, 0xca, 0xcf, 0x7a, 0xdf, 0x8f, 0xbe, 0xf7,
+	0xe4, 0xfc, 0xa3, 0x42, 0x50, 0x46, 0x20, 0x4e, 0x14, 0x34, 0x65, 0x55, 0x95, 0x1e, 0x8c, 0x45,
+	0x96, 0x09, 0x0e, 0xef, 0xc9, 0x6e, 0x2b, 0x64, 0x12, 0xe5, 0x0c, 0xf3, 0xc8, 0x9c, 0x81, 0x5c,
+	0x0a, 0x2d, 0xdc, 0x81, 0x81, 0x03, 0x9c, 0x28, 0xb0, 0x67, 0x82, 0xd2, 0x03, 0x06, 0xd5, 0x9b,
+	0x1e, 0x53, 0x26, 0xbc, 0xc8, 0xd4, 0x17, 0xe1, 0x9c, 0xe8, 0x54, 0xa7, 0x82, 0x47, 0x8c, 0x94,
+	0x84, 0x19, 0x8f, 0x5e, 0xe3, 0x01, 0xeb, 0xbf, 0x75, 0x71, 0x07, 0xb7, 0x12, 0xe7, 0x39, 0x91,
+	0xaa, 0xe9, 0xf7, 0x5b, 0x8f, 0x3c, 0x85, 0x98, 0x73, 0xa1, 0x71, 0x25, 0xd1, 0x74, 0x47, 0xaf,
+	0x96, 0xd3, 0xbf, 0x36, 0x36, 0x0b, 0x86, 0xf9, 0x65, 0xaa, 0xb4, 0x90, 0x69, 0x8c, 0xd9, 0x9c,
+	0x68, 0x99, 0xc6, 0xca, 0x9d, 0x3b, 0x3f, 0x71, 0x49, 0xa3, 0x4c, 0x70, 0xbd, 0x61, 0xbb, 0x48,
+	0x11, 0x2c, 0xe3, 0x0d, 0x51, 0x5d, 0x6b, 0x68, 0x8d, 0x3b, 0x93, 0xdf, 0x4d, 0x2c, 0xd0, 0xba,
+	0x83, 0x2b, 0xae, 0xff, 0xfe, 0x09, 0x30, 0x2b, 0xc8, 0xd2, 0xc5, 0x25, 0x9d, 0x1b, 0xde, 0x6d,
+	0x43, 0x73, 0x1f, 0x9c, 0xce, 0x41, 0x90, 0xae, 0x3d, 0xb4, 0xc6, 0x3f, 0x26, 0x2b, 0x70, 0x6c,
+	0x4e, 0xf5, 0x1c, 0xc0, 0xc1, 0x05, 0xcf, 0x3e, 0xc8, 0x37, 0xd5, 0x10, 0x2e, 0x78, 0x91, 0x9d,
+	0xea, 0x2f, 0x0f, 0xed, 0xa6, 0x6f, 0x96, 0x33, 0x8a, 0x45, 0x06, 0x4e, 0xaf, 0x65, 0xfa, 0xeb,
+	0xb3, 0x60, 0x26, 0xf8, 0xa2, 0x8a, 0xb7, 0xb0, 0x56, 0xe7, 0x0d, 0x93, 0x0a, 0x86, 0x39, 0x05,
+	0x42, 0x52, 0x48, 0x09, 0xaf, 0xc3, 0xb7, 0x0b, 0xcc, 0x53, 0x75, 0xec, 0xa5, 0xfc, 0x37, 0x9f,
+	0x47, 0xfb, 0xdb, 0xcc, 0xf7, 0x9f, 0xec, 0xc1, 0xcc, 0x88, 0xf9, 0x89, 0x02, 0xa6, 0xac, 0xaa,
+	0xc0, 0x03, 0xc6, 0xf3, 0xb9, 0x05, 0x84, 0x7e, 0xa2, 0xc2, 0x3d, 0x20, 0x0c, 0xbc, 0xd0, 0x00,
+	0x5e, 0xec, 0x91, 0x39, 0x45, 0xc8, 0x4f, 0x14, 0x42, 0x7b, 0x08, 0x42, 0x81, 0x87, 0x90, 0x01,
+	0xad, 0xbf, 0xd7, 0xb7, 0xf3, 0xde, 0x03, 0x00, 0x00, 0xff, 0xff, 0x5a, 0x88, 0x0d, 0x87, 0xc6,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/matching_function.pb.go b/googleapis/ads/googleads/v3/common/matching_function.pb.go
new file mode 100644
index 0000000..0596bc9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/matching_function.pb.go
@@ -0,0 +1,536 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/matching_function.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Matching function associated with a
+// CustomerFeed, CampaignFeed, or AdGroupFeed. The matching function is used
+// to filter the set of feed items selected.
+type MatchingFunction struct {
+	// String representation of the Function.
+	//
+	// Examples:
+	//
+	// 1. IDENTITY(true) or IDENTITY(false). All or no feed items served.
+	// 2. EQUALS(CONTEXT.DEVICE,"Mobile")
+	// 3. IN(FEED_ITEM_ID,{1000001,1000002,1000003})
+	// 4. CONTAINS_ANY(FeedAttribute[12345678,0],{"Mars cruise","Venus cruise"})
+	// 5. AND(IN(FEED_ITEM_ID,{10001,10002}),EQUALS(CONTEXT.DEVICE,"Mobile"))
+	//
+	// For more details, visit
+	// https://developers.google.com/adwords/api/docs/guides/feed-matching-functions
+	//
+	// Note that because multiple strings may represent the same underlying
+	// function (whitespace and single versus double quotation marks, for
+	// example), the value returned may not be identical to the string sent in a
+	// mutate request.
+	FunctionString *wrappers.StringValue `protobuf:"bytes,1,opt,name=function_string,json=functionString,proto3" json:"function_string,omitempty"`
+	// Operator for a function.
+	Operator enums.MatchingFunctionOperatorEnum_MatchingFunctionOperator `protobuf:"varint,4,opt,name=operator,proto3,enum=google.ads.googleads.v3.enums.MatchingFunctionOperatorEnum_MatchingFunctionOperator" json:"operator,omitempty"`
+	// The operands on the left hand side of the equation. This is also the
+	// operand to be used for single operand expressions such as NOT.
+	LeftOperands []*Operand `protobuf:"bytes,2,rep,name=left_operands,json=leftOperands,proto3" json:"left_operands,omitempty"`
+	// The operands on the right hand side of the equation.
+	RightOperands        []*Operand `protobuf:"bytes,3,rep,name=right_operands,json=rightOperands,proto3" json:"right_operands,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *MatchingFunction) Reset()         { *m = MatchingFunction{} }
+func (m *MatchingFunction) String() string { return proto.CompactTextString(m) }
+func (*MatchingFunction) ProtoMessage()    {}
+func (*MatchingFunction) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73413c68281034a, []int{0}
+}
+
+func (m *MatchingFunction) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MatchingFunction.Unmarshal(m, b)
+}
+func (m *MatchingFunction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MatchingFunction.Marshal(b, m, deterministic)
+}
+func (m *MatchingFunction) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MatchingFunction.Merge(m, src)
+}
+func (m *MatchingFunction) XXX_Size() int {
+	return xxx_messageInfo_MatchingFunction.Size(m)
+}
+func (m *MatchingFunction) XXX_DiscardUnknown() {
+	xxx_messageInfo_MatchingFunction.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MatchingFunction proto.InternalMessageInfo
+
+func (m *MatchingFunction) GetFunctionString() *wrappers.StringValue {
+	if m != nil {
+		return m.FunctionString
+	}
+	return nil
+}
+
+func (m *MatchingFunction) GetOperator() enums.MatchingFunctionOperatorEnum_MatchingFunctionOperator {
+	if m != nil {
+		return m.Operator
+	}
+	return enums.MatchingFunctionOperatorEnum_UNSPECIFIED
+}
+
+func (m *MatchingFunction) GetLeftOperands() []*Operand {
+	if m != nil {
+		return m.LeftOperands
+	}
+	return nil
+}
+
+func (m *MatchingFunction) GetRightOperands() []*Operand {
+	if m != nil {
+		return m.RightOperands
+	}
+	return nil
+}
+
+// An operand in a matching function.
+type Operand struct {
+	// Different operands that can be used in a matching function. Required.
+	//
+	// Types that are valid to be assigned to FunctionArgumentOperand:
+	//	*Operand_ConstantOperand_
+	//	*Operand_FeedAttributeOperand_
+	//	*Operand_FunctionOperand_
+	//	*Operand_RequestContextOperand_
+	FunctionArgumentOperand isOperand_FunctionArgumentOperand `protobuf_oneof:"function_argument_operand"`
+	XXX_NoUnkeyedLiteral    struct{}                          `json:"-"`
+	XXX_unrecognized        []byte                            `json:"-"`
+	XXX_sizecache           int32                             `json:"-"`
+}
+
+func (m *Operand) Reset()         { *m = Operand{} }
+func (m *Operand) String() string { return proto.CompactTextString(m) }
+func (*Operand) ProtoMessage()    {}
+func (*Operand) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73413c68281034a, []int{1}
+}
+
+func (m *Operand) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Operand.Unmarshal(m, b)
+}
+func (m *Operand) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Operand.Marshal(b, m, deterministic)
+}
+func (m *Operand) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Operand.Merge(m, src)
+}
+func (m *Operand) XXX_Size() int {
+	return xxx_messageInfo_Operand.Size(m)
+}
+func (m *Operand) XXX_DiscardUnknown() {
+	xxx_messageInfo_Operand.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Operand proto.InternalMessageInfo
+
+type isOperand_FunctionArgumentOperand interface {
+	isOperand_FunctionArgumentOperand()
+}
+
+type Operand_ConstantOperand_ struct {
+	ConstantOperand *Operand_ConstantOperand `protobuf:"bytes,1,opt,name=constant_operand,json=constantOperand,proto3,oneof"`
+}
+
+type Operand_FeedAttributeOperand_ struct {
+	FeedAttributeOperand *Operand_FeedAttributeOperand `protobuf:"bytes,2,opt,name=feed_attribute_operand,json=feedAttributeOperand,proto3,oneof"`
+}
+
+type Operand_FunctionOperand_ struct {
+	FunctionOperand *Operand_FunctionOperand `protobuf:"bytes,3,opt,name=function_operand,json=functionOperand,proto3,oneof"`
+}
+
+type Operand_RequestContextOperand_ struct {
+	RequestContextOperand *Operand_RequestContextOperand `protobuf:"bytes,4,opt,name=request_context_operand,json=requestContextOperand,proto3,oneof"`
+}
+
+func (*Operand_ConstantOperand_) isOperand_FunctionArgumentOperand() {}
+
+func (*Operand_FeedAttributeOperand_) isOperand_FunctionArgumentOperand() {}
+
+func (*Operand_FunctionOperand_) isOperand_FunctionArgumentOperand() {}
+
+func (*Operand_RequestContextOperand_) isOperand_FunctionArgumentOperand() {}
+
+func (m *Operand) GetFunctionArgumentOperand() isOperand_FunctionArgumentOperand {
+	if m != nil {
+		return m.FunctionArgumentOperand
+	}
+	return nil
+}
+
+func (m *Operand) GetConstantOperand() *Operand_ConstantOperand {
+	if x, ok := m.GetFunctionArgumentOperand().(*Operand_ConstantOperand_); ok {
+		return x.ConstantOperand
+	}
+	return nil
+}
+
+func (m *Operand) GetFeedAttributeOperand() *Operand_FeedAttributeOperand {
+	if x, ok := m.GetFunctionArgumentOperand().(*Operand_FeedAttributeOperand_); ok {
+		return x.FeedAttributeOperand
+	}
+	return nil
+}
+
+func (m *Operand) GetFunctionOperand() *Operand_FunctionOperand {
+	if x, ok := m.GetFunctionArgumentOperand().(*Operand_FunctionOperand_); ok {
+		return x.FunctionOperand
+	}
+	return nil
+}
+
+func (m *Operand) GetRequestContextOperand() *Operand_RequestContextOperand {
+	if x, ok := m.GetFunctionArgumentOperand().(*Operand_RequestContextOperand_); ok {
+		return x.RequestContextOperand
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Operand) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Operand_ConstantOperand_)(nil),
+		(*Operand_FeedAttributeOperand_)(nil),
+		(*Operand_FunctionOperand_)(nil),
+		(*Operand_RequestContextOperand_)(nil),
+	}
+}
+
+// A constant operand in a matching function.
+type Operand_ConstantOperand struct {
+	// Constant operand values. Required.
+	//
+	// Types that are valid to be assigned to ConstantOperandValue:
+	//	*Operand_ConstantOperand_StringValue
+	//	*Operand_ConstantOperand_LongValue
+	//	*Operand_ConstantOperand_BooleanValue
+	//	*Operand_ConstantOperand_DoubleValue
+	ConstantOperandValue isOperand_ConstantOperand_ConstantOperandValue `protobuf_oneof:"constant_operand_value"`
+	XXX_NoUnkeyedLiteral struct{}                                       `json:"-"`
+	XXX_unrecognized     []byte                                         `json:"-"`
+	XXX_sizecache        int32                                          `json:"-"`
+}
+
+func (m *Operand_ConstantOperand) Reset()         { *m = Operand_ConstantOperand{} }
+func (m *Operand_ConstantOperand) String() string { return proto.CompactTextString(m) }
+func (*Operand_ConstantOperand) ProtoMessage()    {}
+func (*Operand_ConstantOperand) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73413c68281034a, []int{1, 0}
+}
+
+func (m *Operand_ConstantOperand) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Operand_ConstantOperand.Unmarshal(m, b)
+}
+func (m *Operand_ConstantOperand) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Operand_ConstantOperand.Marshal(b, m, deterministic)
+}
+func (m *Operand_ConstantOperand) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Operand_ConstantOperand.Merge(m, src)
+}
+func (m *Operand_ConstantOperand) XXX_Size() int {
+	return xxx_messageInfo_Operand_ConstantOperand.Size(m)
+}
+func (m *Operand_ConstantOperand) XXX_DiscardUnknown() {
+	xxx_messageInfo_Operand_ConstantOperand.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Operand_ConstantOperand proto.InternalMessageInfo
+
+type isOperand_ConstantOperand_ConstantOperandValue interface {
+	isOperand_ConstantOperand_ConstantOperandValue()
+}
+
+type Operand_ConstantOperand_StringValue struct {
+	StringValue *wrappers.StringValue `protobuf:"bytes,1,opt,name=string_value,json=stringValue,proto3,oneof"`
+}
+
+type Operand_ConstantOperand_LongValue struct {
+	LongValue *wrappers.Int64Value `protobuf:"bytes,2,opt,name=long_value,json=longValue,proto3,oneof"`
+}
+
+type Operand_ConstantOperand_BooleanValue struct {
+	BooleanValue *wrappers.BoolValue `protobuf:"bytes,3,opt,name=boolean_value,json=booleanValue,proto3,oneof"`
+}
+
+type Operand_ConstantOperand_DoubleValue struct {
+	DoubleValue *wrappers.DoubleValue `protobuf:"bytes,4,opt,name=double_value,json=doubleValue,proto3,oneof"`
+}
+
+func (*Operand_ConstantOperand_StringValue) isOperand_ConstantOperand_ConstantOperandValue() {}
+
+func (*Operand_ConstantOperand_LongValue) isOperand_ConstantOperand_ConstantOperandValue() {}
+
+func (*Operand_ConstantOperand_BooleanValue) isOperand_ConstantOperand_ConstantOperandValue() {}
+
+func (*Operand_ConstantOperand_DoubleValue) isOperand_ConstantOperand_ConstantOperandValue() {}
+
+func (m *Operand_ConstantOperand) GetConstantOperandValue() isOperand_ConstantOperand_ConstantOperandValue {
+	if m != nil {
+		return m.ConstantOperandValue
+	}
+	return nil
+}
+
+func (m *Operand_ConstantOperand) GetStringValue() *wrappers.StringValue {
+	if x, ok := m.GetConstantOperandValue().(*Operand_ConstantOperand_StringValue); ok {
+		return x.StringValue
+	}
+	return nil
+}
+
+func (m *Operand_ConstantOperand) GetLongValue() *wrappers.Int64Value {
+	if x, ok := m.GetConstantOperandValue().(*Operand_ConstantOperand_LongValue); ok {
+		return x.LongValue
+	}
+	return nil
+}
+
+func (m *Operand_ConstantOperand) GetBooleanValue() *wrappers.BoolValue {
+	if x, ok := m.GetConstantOperandValue().(*Operand_ConstantOperand_BooleanValue); ok {
+		return x.BooleanValue
+	}
+	return nil
+}
+
+func (m *Operand_ConstantOperand) GetDoubleValue() *wrappers.DoubleValue {
+	if x, ok := m.GetConstantOperandValue().(*Operand_ConstantOperand_DoubleValue); ok {
+		return x.DoubleValue
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Operand_ConstantOperand) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Operand_ConstantOperand_StringValue)(nil),
+		(*Operand_ConstantOperand_LongValue)(nil),
+		(*Operand_ConstantOperand_BooleanValue)(nil),
+		(*Operand_ConstantOperand_DoubleValue)(nil),
+	}
+}
+
+// A feed attribute operand in a matching function.
+// Used to represent a feed attribute in feed.
+type Operand_FeedAttributeOperand struct {
+	// The associated feed. Required.
+	FeedId *wrappers.Int64Value `protobuf:"bytes,1,opt,name=feed_id,json=feedId,proto3" json:"feed_id,omitempty"`
+	// Id of the referenced feed attribute. Required.
+	FeedAttributeId      *wrappers.Int64Value `protobuf:"bytes,2,opt,name=feed_attribute_id,json=feedAttributeId,proto3" json:"feed_attribute_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *Operand_FeedAttributeOperand) Reset()         { *m = Operand_FeedAttributeOperand{} }
+func (m *Operand_FeedAttributeOperand) String() string { return proto.CompactTextString(m) }
+func (*Operand_FeedAttributeOperand) ProtoMessage()    {}
+func (*Operand_FeedAttributeOperand) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73413c68281034a, []int{1, 1}
+}
+
+func (m *Operand_FeedAttributeOperand) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Operand_FeedAttributeOperand.Unmarshal(m, b)
+}
+func (m *Operand_FeedAttributeOperand) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Operand_FeedAttributeOperand.Marshal(b, m, deterministic)
+}
+func (m *Operand_FeedAttributeOperand) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Operand_FeedAttributeOperand.Merge(m, src)
+}
+func (m *Operand_FeedAttributeOperand) XXX_Size() int {
+	return xxx_messageInfo_Operand_FeedAttributeOperand.Size(m)
+}
+func (m *Operand_FeedAttributeOperand) XXX_DiscardUnknown() {
+	xxx_messageInfo_Operand_FeedAttributeOperand.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Operand_FeedAttributeOperand proto.InternalMessageInfo
+
+func (m *Operand_FeedAttributeOperand) GetFeedId() *wrappers.Int64Value {
+	if m != nil {
+		return m.FeedId
+	}
+	return nil
+}
+
+func (m *Operand_FeedAttributeOperand) GetFeedAttributeId() *wrappers.Int64Value {
+	if m != nil {
+		return m.FeedAttributeId
+	}
+	return nil
+}
+
+// A function operand in a matching function.
+// Used to represent nested functions.
+type Operand_FunctionOperand struct {
+	// The matching function held in this operand.
+	MatchingFunction     *MatchingFunction `protobuf:"bytes,1,opt,name=matching_function,json=matchingFunction,proto3" json:"matching_function,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *Operand_FunctionOperand) Reset()         { *m = Operand_FunctionOperand{} }
+func (m *Operand_FunctionOperand) String() string { return proto.CompactTextString(m) }
+func (*Operand_FunctionOperand) ProtoMessage()    {}
+func (*Operand_FunctionOperand) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73413c68281034a, []int{1, 2}
+}
+
+func (m *Operand_FunctionOperand) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Operand_FunctionOperand.Unmarshal(m, b)
+}
+func (m *Operand_FunctionOperand) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Operand_FunctionOperand.Marshal(b, m, deterministic)
+}
+func (m *Operand_FunctionOperand) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Operand_FunctionOperand.Merge(m, src)
+}
+func (m *Operand_FunctionOperand) XXX_Size() int {
+	return xxx_messageInfo_Operand_FunctionOperand.Size(m)
+}
+func (m *Operand_FunctionOperand) XXX_DiscardUnknown() {
+	xxx_messageInfo_Operand_FunctionOperand.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Operand_FunctionOperand proto.InternalMessageInfo
+
+func (m *Operand_FunctionOperand) GetMatchingFunction() *MatchingFunction {
+	if m != nil {
+		return m.MatchingFunction
+	}
+	return nil
+}
+
+// An operand in a function referring to a value in the request context.
+type Operand_RequestContextOperand struct {
+	// Type of value to be referred in the request context.
+	ContextType          enums.MatchingFunctionContextTypeEnum_MatchingFunctionContextType `protobuf:"varint,1,opt,name=context_type,json=contextType,proto3,enum=google.ads.googleads.v3.enums.MatchingFunctionContextTypeEnum_MatchingFunctionContextType" json:"context_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                          `json:"-"`
+	XXX_unrecognized     []byte                                                            `json:"-"`
+	XXX_sizecache        int32                                                             `json:"-"`
+}
+
+func (m *Operand_RequestContextOperand) Reset()         { *m = Operand_RequestContextOperand{} }
+func (m *Operand_RequestContextOperand) String() string { return proto.CompactTextString(m) }
+func (*Operand_RequestContextOperand) ProtoMessage()    {}
+func (*Operand_RequestContextOperand) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73413c68281034a, []int{1, 3}
+}
+
+func (m *Operand_RequestContextOperand) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Operand_RequestContextOperand.Unmarshal(m, b)
+}
+func (m *Operand_RequestContextOperand) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Operand_RequestContextOperand.Marshal(b, m, deterministic)
+}
+func (m *Operand_RequestContextOperand) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Operand_RequestContextOperand.Merge(m, src)
+}
+func (m *Operand_RequestContextOperand) XXX_Size() int {
+	return xxx_messageInfo_Operand_RequestContextOperand.Size(m)
+}
+func (m *Operand_RequestContextOperand) XXX_DiscardUnknown() {
+	xxx_messageInfo_Operand_RequestContextOperand.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Operand_RequestContextOperand proto.InternalMessageInfo
+
+func (m *Operand_RequestContextOperand) GetContextType() enums.MatchingFunctionContextTypeEnum_MatchingFunctionContextType {
+	if m != nil {
+		return m.ContextType
+	}
+	return enums.MatchingFunctionContextTypeEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*MatchingFunction)(nil), "google.ads.googleads.v3.common.MatchingFunction")
+	proto.RegisterType((*Operand)(nil), "google.ads.googleads.v3.common.Operand")
+	proto.RegisterType((*Operand_ConstantOperand)(nil), "google.ads.googleads.v3.common.Operand.ConstantOperand")
+	proto.RegisterType((*Operand_FeedAttributeOperand)(nil), "google.ads.googleads.v3.common.Operand.FeedAttributeOperand")
+	proto.RegisterType((*Operand_FunctionOperand)(nil), "google.ads.googleads.v3.common.Operand.FunctionOperand")
+	proto.RegisterType((*Operand_RequestContextOperand)(nil), "google.ads.googleads.v3.common.Operand.RequestContextOperand")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/matching_function.proto", fileDescriptor_a73413c68281034a)
+}
+
+var fileDescriptor_a73413c68281034a = []byte{
+	// 749 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xcd, 0x4e, 0xdb, 0x4a,
+	0x14, 0x26, 0x09, 0x82, 0xcb, 0x24, 0x24, 0x60, 0x01, 0x37, 0x37, 0x20, 0x84, 0xb2, 0xb9, 0xac,
+	0xc6, 0x55, 0x82, 0xa8, 0xe4, 0xd2, 0x4a, 0x0e, 0xff, 0x52, 0x5b, 0x90, 0x8b, 0xb2, 0x40, 0xa9,
+	0x22, 0xc7, 0x33, 0x31, 0x96, 0xec, 0x19, 0xd7, 0x33, 0x86, 0xb2, 0xe8, 0x63, 0xb4, 0x0f, 0xd0,
+	0x65, 0x97, 0xdd, 0xf5, 0x15, 0xfa, 0x26, 0xed, 0xaa, 0x8f, 0x50, 0xd9, 0x33, 0x76, 0x88, 0x93,
+	0x40, 0xb2, 0xf2, 0x9c, 0x39, 0xe7, 0xfb, 0xbe, 0x39, 0x3f, 0x33, 0x06, 0xfb, 0x36, 0xa5, 0xb6,
+	0x8b, 0x55, 0x13, 0x31, 0x55, 0x2c, 0xa3, 0xd5, 0x6d, 0x53, 0xb5, 0xa8, 0xe7, 0x51, 0xa2, 0x7a,
+	0x26, 0xb7, 0x6e, 0x1c, 0x62, 0x77, 0xfb, 0x21, 0xb1, 0xb8, 0x43, 0x09, 0xf4, 0x03, 0xca, 0xa9,
+	0xb2, 0x2d, 0x82, 0xa1, 0x89, 0x18, 0x4c, 0x71, 0xf0, 0xb6, 0x09, 0x05, 0xae, 0xd6, 0x9a, 0xc4,
+	0x8b, 0x49, 0xe8, 0xb1, 0x51, 0xda, 0xae, 0x45, 0x09, 0xc7, 0x1f, 0x79, 0x97, 0xdf, 0xfb, 0x58,
+	0x68, 0xd4, 0x5e, 0xcd, 0xca, 0x41, 0x7d, 0x1c, 0x98, 0x9c, 0x06, 0x12, 0x2f, 0xcf, 0xa8, 0xc6,
+	0x56, 0x2f, 0xec, 0xab, 0x77, 0x81, 0xe9, 0xfb, 0x38, 0x60, 0xd2, 0xbf, 0x95, 0xf0, 0xfb, 0x8e,
+	0x6a, 0x12, 0x42, 0xb9, 0x19, 0xb1, 0x48, 0x6f, 0xfd, 0x57, 0x1e, 0xac, 0xbc, 0x91, 0x12, 0x27,
+	0x52, 0x41, 0x39, 0x06, 0x95, 0x54, 0x8d, 0xf1, 0xc0, 0x21, 0x76, 0x35, 0xb7, 0x93, 0xdb, 0x2d,
+	0x36, 0xb6, 0x64, 0x15, 0x60, 0x22, 0x06, 0xdf, 0xc5, 0xee, 0xb6, 0xe9, 0x86, 0xd8, 0x28, 0x27,
+	0x20, 0xb1, 0xa9, 0xf8, 0xe0, 0x9f, 0xe4, 0xac, 0xd5, 0xf9, 0x9d, 0xdc, 0x6e, 0xb9, 0x71, 0x05,
+	0x27, 0x15, 0x34, 0x4e, 0x16, 0x66, 0x4f, 0x72, 0x21, 0xe1, 0xc7, 0x24, 0xf4, 0x26, 0x3a, 0x8d,
+	0x54, 0x45, 0x79, 0x0d, 0x96, 0x5d, 0xdc, 0xe7, 0xa2, 0x44, 0x04, 0xb1, 0x6a, 0x7e, 0xa7, 0xb0,
+	0x5b, 0x6c, 0xfc, 0x0f, 0x1f, 0xef, 0x23, 0xbc, 0x10, 0xf1, 0x46, 0x29, 0x42, 0x4b, 0x83, 0x29,
+	0x6f, 0x41, 0x39, 0x70, 0xec, 0x9b, 0x07, 0x74, 0x85, 0xd9, 0xe8, 0x96, 0x63, 0x78, 0xc2, 0x57,
+	0xff, 0xb1, 0x04, 0x16, 0xa5, 0xa1, 0x20, 0xb0, 0x62, 0x51, 0xc2, 0xb8, 0x49, 0x52, 0x7a, 0x59,
+	0xe3, 0xe7, 0x53, 0xb2, 0xc3, 0x43, 0x89, 0x97, 0xf6, 0xd9, 0x9c, 0x51, 0xb1, 0x86, 0xb7, 0x14,
+	0x0e, 0x36, 0xfa, 0x18, 0xa3, 0xae, 0xc9, 0x79, 0xe0, 0xf4, 0x42, 0x8e, 0x53, 0xad, 0x7c, 0xac,
+	0x75, 0x30, 0xad, 0xd6, 0x09, 0xc6, 0x48, 0x4f, 0x48, 0x06, 0x82, 0x6b, 0xfd, 0x31, 0xfb, 0x51,
+	0x6e, 0xc3, 0xc3, 0x4a, 0x50, 0xb5, 0x30, 0x5b, 0x6e, 0x43, 0x3d, 0x16, 0xb9, 0xf5, 0x87, 0xb7,
+	0x94, 0x3b, 0xf0, 0x6f, 0x80, 0x3f, 0x84, 0x98, 0xf1, 0xf4, 0x56, 0x25, 0x62, 0xf3, 0xb1, 0xd8,
+	0xcb, 0x69, 0xc5, 0x0c, 0x41, 0x73, 0x28, 0x58, 0x06, 0x92, 0xeb, 0xc1, 0x38, 0x47, 0xed, 0x7b,
+	0x1e, 0x54, 0x32, 0xb5, 0x57, 0x74, 0x50, 0x12, 0x17, 0xa5, 0x7b, 0x1b, 0x5d, 0x85, 0x69, 0xae,
+	0xcb, 0xd9, 0x9c, 0x51, 0x64, 0x03, 0x53, 0x39, 0x00, 0xc0, 0xa5, 0x29, 0x81, 0xe8, 0xcf, 0xe6,
+	0x08, 0xc1, 0x39, 0xe1, 0xfb, 0x7b, 0x09, 0x7e, 0x29, 0x02, 0x08, 0xb4, 0x0e, 0x96, 0x7b, 0x94,
+	0xba, 0xd8, 0x24, 0x92, 0x40, 0x14, 0xbc, 0x36, 0x42, 0xd0, 0xa2, 0xd4, 0x4d, 0xf0, 0x25, 0x09,
+	0x49, 0x28, 0x4a, 0x88, 0x86, 0x3d, 0x17, 0x4b, 0x86, 0xf9, 0x09, 0x39, 0x1c, 0xc5, 0x41, 0x69,
+	0x0e, 0x68, 0x60, 0xb6, 0xaa, 0x60, 0x23, 0x3b, 0xd5, 0x82, 0xac, 0xf6, 0x39, 0x07, 0xd6, 0xc6,
+	0x0d, 0x91, 0xb2, 0x07, 0x16, 0xe3, 0x11, 0x75, 0x92, 0xf9, 0x7f, 0x2c, 0x67, 0x63, 0x21, 0x8a,
+	0x3d, 0x47, 0xca, 0x29, 0x58, 0xcd, 0x0c, 0xb6, 0x83, 0xa6, 0xa8, 0x99, 0x51, 0x19, 0x1a, 0xd8,
+	0x73, 0x54, 0xf3, 0x41, 0x25, 0x33, 0x6b, 0xca, 0x7b, 0xb0, 0x3a, 0xf2, 0xe8, 0xca, 0xb3, 0x3d,
+	0x7b, 0x6a, 0xa4, 0xb2, 0x6f, 0x94, 0xb1, 0xe2, 0x65, 0x76, 0x6a, 0x5f, 0x72, 0x60, 0x7d, 0xec,
+	0xc4, 0x29, 0x9f, 0x40, 0xe9, 0xe1, 0xff, 0x21, 0xd6, 0x2c, 0x37, 0xae, 0x67, 0x7c, 0x33, 0x25,
+	0xe9, 0xd5, 0xbd, 0x8f, 0xc7, 0x3e, 0x9b, 0x0f, 0xfc, 0x46, 0xd1, 0x1a, 0x18, 0xad, 0x4d, 0xf0,
+	0x5f, 0x7a, 0x6d, 0xcd, 0xc0, 0x0e, 0x3d, 0x3c, 0xe8, 0x62, 0xeb, 0x4f, 0x0e, 0xd4, 0x2d, 0xea,
+	0x3d, 0x91, 0x7f, 0x6b, 0x3d, 0xab, 0x76, 0x19, 0x35, 0xe1, 0x32, 0x77, 0x7d, 0x24, 0x81, 0x36,
+	0x75, 0x4d, 0x62, 0x43, 0x1a, 0xd8, 0xaa, 0x8d, 0x49, 0xdc, 0xa2, 0xe4, 0xaf, 0xe7, 0x3b, 0x6c,
+	0xd2, 0x0f, 0xfa, 0x85, 0xf8, 0x7c, 0xcd, 0x17, 0x4e, 0x75, 0xfd, 0x5b, 0x7e, 0xfb, 0x54, 0x90,
+	0xe9, 0x88, 0x41, 0xb1, 0x8c, 0x56, 0xed, 0x26, 0x3c, 0x8c, 0xc3, 0x7e, 0x26, 0x01, 0x1d, 0x1d,
+	0xb1, 0x4e, 0x1a, 0xd0, 0x69, 0x37, 0x3b, 0x22, 0xe0, 0x77, 0xbe, 0x2e, 0x76, 0x35, 0x4d, 0x47,
+	0x4c, 0xd3, 0xd2, 0x10, 0x4d, 0x6b, 0x37, 0x35, 0x4d, 0x04, 0xf5, 0x16, 0xe2, 0xd3, 0x35, 0xff,
+	0x06, 0x00, 0x00, 0xff, 0xff, 0x29, 0xdc, 0x21, 0x0f, 0x3d, 0x08, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/metrics.pb.go b/googleapis/ads/googleads/v3/common/metrics.pb.go
new file mode 100644
index 0000000..c8bac59
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/metrics.pb.go
@@ -0,0 +1,1394 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/metrics.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Metrics data.
+type Metrics struct {
+	// The percent of your ad impressions that are shown as the very first ad
+	// above the organic search results.
+	AbsoluteTopImpressionPercentage *wrappers.DoubleValue `protobuf:"bytes,95,opt,name=absolute_top_impression_percentage,json=absoluteTopImpressionPercentage,proto3" json:"absolute_top_impression_percentage,omitempty"`
+	// Average cost of viewable impressions (`active_view_impressions`).
+	ActiveViewCpm *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=active_view_cpm,json=activeViewCpm,proto3" json:"active_view_cpm,omitempty"`
+	// Active view measurable clicks divided by active view viewable impressions.
+	// This metric is reported only for display network.
+	ActiveViewCtr *wrappers.DoubleValue `protobuf:"bytes,79,opt,name=active_view_ctr,json=activeViewCtr,proto3" json:"active_view_ctr,omitempty"`
+	// A measurement of how often your ad has become viewable on a Display
+	// Network site.
+	ActiveViewImpressions *wrappers.Int64Value `protobuf:"bytes,2,opt,name=active_view_impressions,json=activeViewImpressions,proto3" json:"active_view_impressions,omitempty"`
+	// The ratio of impressions that could be measured by Active View over the
+	// number of served impressions.
+	ActiveViewMeasurability *wrappers.DoubleValue `protobuf:"bytes,96,opt,name=active_view_measurability,json=activeViewMeasurability,proto3" json:"active_view_measurability,omitempty"`
+	// The cost of the impressions you received that were measurable by Active
+	// View.
+	ActiveViewMeasurableCostMicros *wrappers.Int64Value `protobuf:"bytes,3,opt,name=active_view_measurable_cost_micros,json=activeViewMeasurableCostMicros,proto3" json:"active_view_measurable_cost_micros,omitempty"`
+	// The number of times your ads are appearing on placements in positions
+	// where they can be seen.
+	ActiveViewMeasurableImpressions *wrappers.Int64Value `protobuf:"bytes,4,opt,name=active_view_measurable_impressions,json=activeViewMeasurableImpressions,proto3" json:"active_view_measurable_impressions,omitempty"`
+	// The percentage of time when your ad appeared on an Active View enabled site
+	// (measurable impressions) and was viewable (viewable impressions).
+	ActiveViewViewability *wrappers.DoubleValue `protobuf:"bytes,97,opt,name=active_view_viewability,json=activeViewViewability,proto3" json:"active_view_viewability,omitempty"`
+	// All conversions from interactions (as oppose to view through conversions)
+	// divided by the number of ad interactions.
+	AllConversionsFromInteractionsRate *wrappers.DoubleValue `protobuf:"bytes,65,opt,name=all_conversions_from_interactions_rate,json=allConversionsFromInteractionsRate,proto3" json:"all_conversions_from_interactions_rate,omitempty"`
+	// The total value of all conversions.
+	AllConversionsValue *wrappers.DoubleValue `protobuf:"bytes,66,opt,name=all_conversions_value,json=allConversionsValue,proto3" json:"all_conversions_value,omitempty"`
+	// The total number of conversions. This only includes conversion actions
+	// which include_in_conversions_metric attribute is set to true.
+	AllConversions *wrappers.DoubleValue `protobuf:"bytes,7,opt,name=all_conversions,json=allConversions,proto3" json:"all_conversions,omitempty"`
+	// The value of all conversions divided by the total cost of ad interactions
+	// (such as clicks for text ads or views for video ads).
+	AllConversionsValuePerCost *wrappers.DoubleValue `protobuf:"bytes,62,opt,name=all_conversions_value_per_cost,json=allConversionsValuePerCost,proto3" json:"all_conversions_value_per_cost,omitempty"`
+	// The number of times people clicked the "Call" button to call a store during
+	// or after clicking an ad. This number doesn't include whether or not calls
+	// were connected, or the duration of any calls.
+	// This metric applies to feed items only.
+	AllConversionsFromClickToCall *wrappers.DoubleValue `protobuf:"bytes,118,opt,name=all_conversions_from_click_to_call,json=allConversionsFromClickToCall,proto3" json:"all_conversions_from_click_to_call,omitempty"`
+	// The number of times people clicked a "Get directions" button to navigate to
+	// a store after clicking an ad.
+	// This metric applies to feed items only.
+	AllConversionsFromDirections *wrappers.DoubleValue `protobuf:"bytes,119,opt,name=all_conversions_from_directions,json=allConversionsFromDirections,proto3" json:"all_conversions_from_directions,omitempty"`
+	// The value of all conversions from interactions divided by the total number
+	// of interactions.
+	AllConversionsFromInteractionsValuePerInteraction *wrappers.DoubleValue `protobuf:"bytes,67,opt,name=all_conversions_from_interactions_value_per_interaction,json=allConversionsFromInteractionsValuePerInteraction,proto3" json:"all_conversions_from_interactions_value_per_interaction,omitempty"`
+	// The number of times people clicked a link to view a store's menu after
+	// clicking an ad.
+	// This metric applies to feed items only.
+	AllConversionsFromMenu *wrappers.DoubleValue `protobuf:"bytes,120,opt,name=all_conversions_from_menu,json=allConversionsFromMenu,proto3" json:"all_conversions_from_menu,omitempty"`
+	// The number of times people placed an order at a store after clicking an ad.
+	// This metric applies to feed items only.
+	AllConversionsFromOrder *wrappers.DoubleValue `protobuf:"bytes,121,opt,name=all_conversions_from_order,json=allConversionsFromOrder,proto3" json:"all_conversions_from_order,omitempty"`
+	// The number of other conversions (for example, posting a review or saving a
+	// location for a store) that occurred after people clicked an ad.
+	// This metric applies to feed items only.
+	AllConversionsFromOtherEngagement *wrappers.DoubleValue `protobuf:"bytes,122,opt,name=all_conversions_from_other_engagement,json=allConversionsFromOtherEngagement,proto3" json:"all_conversions_from_other_engagement,omitempty"`
+	// Estimated number of times people visited a store after clicking an ad.
+	// This metric applies to feed items only.
+	AllConversionsFromStoreVisit *wrappers.DoubleValue `protobuf:"bytes,123,opt,name=all_conversions_from_store_visit,json=allConversionsFromStoreVisit,proto3" json:"all_conversions_from_store_visit,omitempty"`
+	// The number of times that people were taken to a store's URL after clicking
+	// an ad.
+	// This metric applies to feed items only.
+	AllConversionsFromStoreWebsite *wrappers.DoubleValue `protobuf:"bytes,124,opt,name=all_conversions_from_store_website,json=allConversionsFromStoreWebsite,proto3" json:"all_conversions_from_store_website,omitempty"`
+	// The average amount you pay per interaction. This amount is the total cost
+	// of your ads divided by the total number of interactions.
+	AverageCost *wrappers.DoubleValue `protobuf:"bytes,8,opt,name=average_cost,json=averageCost,proto3" json:"average_cost,omitempty"`
+	// The total cost of all clicks divided by the total number of clicks
+	// received.
+	AverageCpc *wrappers.DoubleValue `protobuf:"bytes,9,opt,name=average_cpc,json=averageCpc,proto3" json:"average_cpc,omitempty"`
+	// The average amount that you've been charged for an ad engagement. This
+	// amount is the total cost of all ad engagements divided by the total number
+	// of ad engagements.
+	AverageCpe *wrappers.DoubleValue `protobuf:"bytes,98,opt,name=average_cpe,json=averageCpe,proto3" json:"average_cpe,omitempty"`
+	// Average cost-per-thousand impressions (CPM).
+	AverageCpm *wrappers.DoubleValue `protobuf:"bytes,10,opt,name=average_cpm,json=averageCpm,proto3" json:"average_cpm,omitempty"`
+	// The average amount you pay each time someone views your ad.
+	// The average CPV is defined by the total cost of all ad views divided by
+	// the number of views.
+	AverageCpv *wrappers.DoubleValue `protobuf:"bytes,11,opt,name=average_cpv,json=averageCpv,proto3" json:"average_cpv,omitempty"`
+	// Average number of pages viewed per session.
+	AveragePageViews *wrappers.DoubleValue `protobuf:"bytes,99,opt,name=average_page_views,json=averagePageViews,proto3" json:"average_page_views,omitempty"`
+	// Total duration of all sessions (in seconds) / number of sessions. Imported
+	// from Google Analytics.
+	AverageTimeOnSite *wrappers.DoubleValue `protobuf:"bytes,84,opt,name=average_time_on_site,json=averageTimeOnSite,proto3" json:"average_time_on_site,omitempty"`
+	// An indication of how other advertisers are bidding on similar products.
+	BenchmarkAverageMaxCpc *wrappers.DoubleValue `protobuf:"bytes,14,opt,name=benchmark_average_max_cpc,json=benchmarkAverageMaxCpc,proto3" json:"benchmark_average_max_cpc,omitempty"`
+	// An indication on how other advertisers' Shopping ads for similar products
+	// are performing based on how often people who see their ad click on it.
+	BenchmarkCtr *wrappers.DoubleValue `protobuf:"bytes,77,opt,name=benchmark_ctr,json=benchmarkCtr,proto3" json:"benchmark_ctr,omitempty"`
+	// Percentage of clicks where the user only visited a single page on your
+	// site. Imported from Google Analytics.
+	BounceRate *wrappers.DoubleValue `protobuf:"bytes,15,opt,name=bounce_rate,json=bounceRate,proto3" json:"bounce_rate,omitempty"`
+	// The number of clicks.
+	Clicks *wrappers.Int64Value `protobuf:"bytes,19,opt,name=clicks,proto3" json:"clicks,omitempty"`
+	// The number of times your ad or your site's listing in the unpaid
+	// results was clicked. See the help page at
+	// https://support.google.com/google-ads/answer/3097241 for details.
+	CombinedClicks *wrappers.Int64Value `protobuf:"bytes,115,opt,name=combined_clicks,json=combinedClicks,proto3" json:"combined_clicks,omitempty"`
+	// The number of times your ad or your site's listing in the unpaid
+	// results was clicked (combined_clicks) divided by combined_queries. See the
+	// help page at https://support.google.com/google-ads/answer/3097241 for
+	// details.
+	CombinedClicksPerQuery *wrappers.DoubleValue `protobuf:"bytes,116,opt,name=combined_clicks_per_query,json=combinedClicksPerQuery,proto3" json:"combined_clicks_per_query,omitempty"`
+	// The number of searches that returned pages from your site in the unpaid
+	// results or showed one of your text ads. See the help page at
+	// https://support.google.com/google-ads/answer/3097241 for details.
+	CombinedQueries *wrappers.Int64Value `protobuf:"bytes,117,opt,name=combined_queries,json=combinedQueries,proto3" json:"combined_queries,omitempty"`
+	// The estimated percent of times that your ad was eligible to show
+	// on the Display Network but didn't because your budget was too low.
+	// Note: Content budget lost impression share is reported in the range of 0
+	// to 0.9. Any value above 0.9 is reported as 0.9001.
+	ContentBudgetLostImpressionShare *wrappers.DoubleValue `protobuf:"bytes,20,opt,name=content_budget_lost_impression_share,json=contentBudgetLostImpressionShare,proto3" json:"content_budget_lost_impression_share,omitempty"`
+	// The impressions you've received on the Display Network divided
+	// by the estimated number of impressions you were eligible to receive.
+	// Note: Content impression share is reported in the range of 0.1 to 1. Any
+	// value below 0.1 is reported as 0.0999.
+	ContentImpressionShare *wrappers.DoubleValue `protobuf:"bytes,21,opt,name=content_impression_share,json=contentImpressionShare,proto3" json:"content_impression_share,omitempty"`
+	// The last date/time a conversion tag for this conversion action successfully
+	// fired and was seen by Google Ads. This firing event may not have been the
+	// result of an attributable conversion (e.g. because the tag was fired from a
+	// browser that did not previously click an ad from an appropriate
+	// advertiser). The date/time is in the customer's time zone.
+	ConversionLastReceivedRequestDateTime *wrappers.StringValue `protobuf:"bytes,73,opt,name=conversion_last_received_request_date_time,json=conversionLastReceivedRequestDateTime,proto3" json:"conversion_last_received_request_date_time,omitempty"`
+	// The date of the most recent conversion for this conversion action. The date
+	// is in the customer's time zone.
+	ConversionLastConversionDate *wrappers.StringValue `protobuf:"bytes,74,opt,name=conversion_last_conversion_date,json=conversionLastConversionDate,proto3" json:"conversion_last_conversion_date,omitempty"`
+	// The estimated percentage of impressions on the Display Network
+	// that your ads didn't receive due to poor Ad Rank.
+	// Note: Content rank lost impression share is reported in the range of 0
+	// to 0.9. Any value above 0.9 is reported as 0.9001.
+	ContentRankLostImpressionShare *wrappers.DoubleValue `protobuf:"bytes,22,opt,name=content_rank_lost_impression_share,json=contentRankLostImpressionShare,proto3" json:"content_rank_lost_impression_share,omitempty"`
+	// Conversions from interactions divided by the number of ad interactions
+	// (such as clicks for text ads or views for video ads). This only includes
+	// conversion actions which include_in_conversions_metric attribute is set to
+	// true.
+	ConversionsFromInteractionsRate *wrappers.DoubleValue `protobuf:"bytes,69,opt,name=conversions_from_interactions_rate,json=conversionsFromInteractionsRate,proto3" json:"conversions_from_interactions_rate,omitempty"`
+	// The total value of conversions. This only includes conversion actions which
+	// include_in_conversions_metric attribute is set to true.
+	ConversionsValue *wrappers.DoubleValue `protobuf:"bytes,70,opt,name=conversions_value,json=conversionsValue,proto3" json:"conversions_value,omitempty"`
+	// The value of conversions divided by the cost of ad interactions. This only
+	// includes conversion actions which include_in_conversions_metric attribute
+	// is set to true.
+	ConversionsValuePerCost *wrappers.DoubleValue `protobuf:"bytes,71,opt,name=conversions_value_per_cost,json=conversionsValuePerCost,proto3" json:"conversions_value_per_cost,omitempty"`
+	// The value of conversions from interactions divided by the number of ad
+	// interactions. This only includes conversion actions which
+	// include_in_conversions_metric attribute is set to true.
+	ConversionsFromInteractionsValuePerInteraction *wrappers.DoubleValue `protobuf:"bytes,72,opt,name=conversions_from_interactions_value_per_interaction,json=conversionsFromInteractionsValuePerInteraction,proto3" json:"conversions_from_interactions_value_per_interaction,omitempty"`
+	// The number of conversions. This only includes conversion actions which
+	// include_in_conversions_metric attribute is set to true.
+	Conversions *wrappers.DoubleValue `protobuf:"bytes,25,opt,name=conversions,proto3" json:"conversions,omitempty"`
+	// The sum of your cost-per-click (CPC) and cost-per-thousand impressions
+	// (CPM) costs during this period.
+	CostMicros *wrappers.Int64Value `protobuf:"bytes,26,opt,name=cost_micros,json=costMicros,proto3" json:"cost_micros,omitempty"`
+	// The cost of ad interactions divided by all conversions.
+	CostPerAllConversions *wrappers.DoubleValue `protobuf:"bytes,68,opt,name=cost_per_all_conversions,json=costPerAllConversions,proto3" json:"cost_per_all_conversions,omitempty"`
+	// The cost of ad interactions divided by conversions. This only includes
+	// conversion actions which include_in_conversions_metric attribute is set to
+	// true.
+	CostPerConversion *wrappers.DoubleValue `protobuf:"bytes,28,opt,name=cost_per_conversion,json=costPerConversion,proto3" json:"cost_per_conversion,omitempty"`
+	// The cost of ad interactions divided by current model attributed
+	// conversions. This only includes conversion actions which
+	// include_in_conversions_metric attribute is set to true.
+	CostPerCurrentModelAttributedConversion *wrappers.DoubleValue `protobuf:"bytes,106,opt,name=cost_per_current_model_attributed_conversion,json=costPerCurrentModelAttributedConversion,proto3" json:"cost_per_current_model_attributed_conversion,omitempty"`
+	// Conversions from when a customer clicks on a Google Ads ad on one device,
+	// then converts on a different device or browser.
+	// Cross-device conversions are already included in all_conversions.
+	CrossDeviceConversions *wrappers.DoubleValue `protobuf:"bytes,29,opt,name=cross_device_conversions,json=crossDeviceConversions,proto3" json:"cross_device_conversions,omitempty"`
+	// The number of clicks your ad receives (Clicks) divided by the number
+	// of times your ad is shown (Impressions).
+	Ctr *wrappers.DoubleValue `protobuf:"bytes,30,opt,name=ctr,proto3" json:"ctr,omitempty"`
+	// Shows how your historic conversions data would look under the attribution
+	// model you've currently selected. This only includes conversion actions
+	// which include_in_conversions_metric attribute is set to true.
+	CurrentModelAttributedConversions *wrappers.DoubleValue `protobuf:"bytes,101,opt,name=current_model_attributed_conversions,json=currentModelAttributedConversions,proto3" json:"current_model_attributed_conversions,omitempty"`
+	// Current model attributed conversions from interactions divided by the
+	// number of ad interactions (such as clicks for text ads or views for video
+	// ads). This only includes conversion actions which
+	// include_in_conversions_metric attribute is set to true.
+	CurrentModelAttributedConversionsFromInteractionsRate *wrappers.DoubleValue `protobuf:"bytes,102,opt,name=current_model_attributed_conversions_from_interactions_rate,json=currentModelAttributedConversionsFromInteractionsRate,proto3" json:"current_model_attributed_conversions_from_interactions_rate,omitempty"`
+	// The value of current model attributed conversions from interactions divided
+	// by the number of ad interactions. This only includes conversion actions
+	// which include_in_conversions_metric attribute is set to true.
+	CurrentModelAttributedConversionsFromInteractionsValuePerInteraction *wrappers.DoubleValue `protobuf:"bytes,103,opt,name=current_model_attributed_conversions_from_interactions_value_per_interaction,json=currentModelAttributedConversionsFromInteractionsValuePerInteraction,proto3" json:"current_model_attributed_conversions_from_interactions_value_per_interaction,omitempty"`
+	// The total value of current model attributed conversions. This only includes
+	// conversion actions which include_in_conversions_metric attribute is set to
+	// true.
+	CurrentModelAttributedConversionsValue *wrappers.DoubleValue `protobuf:"bytes,104,opt,name=current_model_attributed_conversions_value,json=currentModelAttributedConversionsValue,proto3" json:"current_model_attributed_conversions_value,omitempty"`
+	// The value of current model attributed conversions divided by the cost of ad
+	// interactions. This only includes conversion actions which
+	// include_in_conversions_metric attribute is set to true.
+	CurrentModelAttributedConversionsValuePerCost *wrappers.DoubleValue `protobuf:"bytes,105,opt,name=current_model_attributed_conversions_value_per_cost,json=currentModelAttributedConversionsValuePerCost,proto3" json:"current_model_attributed_conversions_value_per_cost,omitempty"`
+	// How often people engage with your ad after it's shown to them. This is the
+	// number of ad expansions divided by the number of times your ad is shown.
+	EngagementRate *wrappers.DoubleValue `protobuf:"bytes,31,opt,name=engagement_rate,json=engagementRate,proto3" json:"engagement_rate,omitempty"`
+	// The number of engagements.
+	// An engagement occurs when a viewer expands your Lightbox ad. Also, in the
+	// future, other ad types may support engagement metrics.
+	Engagements *wrappers.Int64Value `protobuf:"bytes,32,opt,name=engagements,proto3" json:"engagements,omitempty"`
+	// Average lead value of hotel.
+	HotelAverageLeadValueMicros *wrappers.DoubleValue `protobuf:"bytes,75,opt,name=hotel_average_lead_value_micros,json=hotelAverageLeadValueMicros,proto3" json:"hotel_average_lead_value_micros,omitempty"`
+	// The average price difference between the price offered by reporting hotel
+	// advertiser and the cheapest price offered by the competing advertiser.
+	HotelPriceDifferencePercentage *wrappers.DoubleValue `protobuf:"bytes,129,opt,name=hotel_price_difference_percentage,json=hotelPriceDifferencePercentage,proto3" json:"hotel_price_difference_percentage,omitempty"`
+	// The creative historical quality score.
+	HistoricalCreativeQualityScore enums.QualityScoreBucketEnum_QualityScoreBucket `protobuf:"varint,80,opt,name=historical_creative_quality_score,json=historicalCreativeQualityScore,proto3,enum=google.ads.googleads.v3.enums.QualityScoreBucketEnum_QualityScoreBucket" json:"historical_creative_quality_score,omitempty"`
+	// The quality of historical landing page experience.
+	HistoricalLandingPageQualityScore enums.QualityScoreBucketEnum_QualityScoreBucket `protobuf:"varint,81,opt,name=historical_landing_page_quality_score,json=historicalLandingPageQualityScore,proto3,enum=google.ads.googleads.v3.enums.QualityScoreBucketEnum_QualityScoreBucket" json:"historical_landing_page_quality_score,omitempty"`
+	// The historical quality score.
+	HistoricalQualityScore *wrappers.Int64Value `protobuf:"bytes,82,opt,name=historical_quality_score,json=historicalQualityScore,proto3" json:"historical_quality_score,omitempty"`
+	// The historical search predicted click through rate (CTR).
+	HistoricalSearchPredictedCtr enums.QualityScoreBucketEnum_QualityScoreBucket `protobuf:"varint,83,opt,name=historical_search_predicted_ctr,json=historicalSearchPredictedCtr,proto3,enum=google.ads.googleads.v3.enums.QualityScoreBucketEnum_QualityScoreBucket" json:"historical_search_predicted_ctr,omitempty"`
+	// The number of times the ad was forwarded to someone else as a message.
+	GmailForwards *wrappers.Int64Value `protobuf:"bytes,85,opt,name=gmail_forwards,json=gmailForwards,proto3" json:"gmail_forwards,omitempty"`
+	// The number of times someone has saved your Gmail ad to their inbox as a
+	// message.
+	GmailSaves *wrappers.Int64Value `protobuf:"bytes,86,opt,name=gmail_saves,json=gmailSaves,proto3" json:"gmail_saves,omitempty"`
+	// The number of clicks to the landing page on the expanded state of Gmail
+	// ads.
+	GmailSecondaryClicks *wrappers.Int64Value `protobuf:"bytes,87,opt,name=gmail_secondary_clicks,json=gmailSecondaryClicks,proto3" json:"gmail_secondary_clicks,omitempty"`
+	// The number of times a store's location-based ad was shown.
+	// This metric applies to feed items only.
+	ImpressionsFromStoreReach *wrappers.Int64Value `protobuf:"bytes,125,opt,name=impressions_from_store_reach,json=impressionsFromStoreReach,proto3" json:"impressions_from_store_reach,omitempty"`
+	// Count of how often your ad has appeared on a search results page or
+	// website on the Google Network.
+	Impressions *wrappers.Int64Value `protobuf:"bytes,37,opt,name=impressions,proto3" json:"impressions,omitempty"`
+	// How often people interact with your ad after it is shown to them.
+	// This is the number of interactions divided by the number of times your ad
+	// is shown.
+	InteractionRate *wrappers.DoubleValue `protobuf:"bytes,38,opt,name=interaction_rate,json=interactionRate,proto3" json:"interaction_rate,omitempty"`
+	// The number of interactions.
+	// An interaction is the main user action associated with an ad format-clicks
+	// for text and shopping ads, views for video ads, and so on.
+	Interactions *wrappers.Int64Value `protobuf:"bytes,39,opt,name=interactions,proto3" json:"interactions,omitempty"`
+	// The types of payable and free interactions.
+	InteractionEventTypes []enums.InteractionEventTypeEnum_InteractionEventType `protobuf:"varint,100,rep,packed,name=interaction_event_types,json=interactionEventTypes,proto3,enum=google.ads.googleads.v3.enums.InteractionEventTypeEnum_InteractionEventType" json:"interaction_event_types,omitempty"`
+	// The percentage of clicks filtered out of your total number of clicks
+	// (filtered + non-filtered clicks) during the reporting period.
+	InvalidClickRate *wrappers.DoubleValue `protobuf:"bytes,40,opt,name=invalid_click_rate,json=invalidClickRate,proto3" json:"invalid_click_rate,omitempty"`
+	// Number of clicks Google considers illegitimate and doesn't charge you for.
+	InvalidClicks *wrappers.Int64Value `protobuf:"bytes,41,opt,name=invalid_clicks,json=invalidClicks,proto3" json:"invalid_clicks,omitempty"`
+	// Number of message chats initiated for Click To Message impressions that
+	// were message tracking eligible.
+	MessageChats *wrappers.Int64Value `protobuf:"bytes,126,opt,name=message_chats,json=messageChats,proto3" json:"message_chats,omitempty"`
+	// Number of Click To Message impressions that were message tracking eligible.
+	MessageImpressions *wrappers.Int64Value `protobuf:"bytes,127,opt,name=message_impressions,json=messageImpressions,proto3" json:"message_impressions,omitempty"`
+	// Number of message chats initiated (message_chats) divided by the number
+	// of message impressions (message_impressions).
+	// Rate at which a user initiates a message chat from an ad impression with
+	// a messaging option and message tracking enabled.
+	// Note that this rate can be more than 1.0 for a given message impression.
+	MessageChatRate *wrappers.DoubleValue `protobuf:"bytes,128,opt,name=message_chat_rate,json=messageChatRate,proto3" json:"message_chat_rate,omitempty"`
+	// The percentage of mobile clicks that go to a mobile-friendly page.
+	MobileFriendlyClicksPercentage *wrappers.DoubleValue `protobuf:"bytes,109,opt,name=mobile_friendly_clicks_percentage,json=mobileFriendlyClicksPercentage,proto3" json:"mobile_friendly_clicks_percentage,omitempty"`
+	// The number of times someone clicked your site's listing in the unpaid
+	// results for a particular query. See the help page at
+	// https://support.google.com/google-ads/answer/3097241 for details.
+	OrganicClicks *wrappers.Int64Value `protobuf:"bytes,110,opt,name=organic_clicks,json=organicClicks,proto3" json:"organic_clicks,omitempty"`
+	// The number of times someone clicked your site's listing in the unpaid
+	// results (organic_clicks) divided by the total number of searches that
+	// returned pages from your site (organic_queries). See the help page at
+	// https://support.google.com/google-ads/answer/3097241 for details.
+	OrganicClicksPerQuery *wrappers.DoubleValue `protobuf:"bytes,111,opt,name=organic_clicks_per_query,json=organicClicksPerQuery,proto3" json:"organic_clicks_per_query,omitempty"`
+	// The number of listings for your site in the unpaid search results. See the
+	// help page at https://support.google.com/google-ads/answer/3097241 for
+	// details.
+	OrganicImpressions *wrappers.Int64Value `protobuf:"bytes,112,opt,name=organic_impressions,json=organicImpressions,proto3" json:"organic_impressions,omitempty"`
+	// The number of times a page from your site was listed in the unpaid search
+	// results (organic_impressions) divided by the number of searches returning
+	// your site's listing in the unpaid results (organic_queries). See the help
+	// page at https://support.google.com/google-ads/answer/3097241 for details.
+	OrganicImpressionsPerQuery *wrappers.DoubleValue `protobuf:"bytes,113,opt,name=organic_impressions_per_query,json=organicImpressionsPerQuery,proto3" json:"organic_impressions_per_query,omitempty"`
+	// The total number of searches that returned your site's listing in the
+	// unpaid results. See the help page at
+	// https://support.google.com/google-ads/answer/3097241 for details.
+	OrganicQueries *wrappers.Int64Value `protobuf:"bytes,114,opt,name=organic_queries,json=organicQueries,proto3" json:"organic_queries,omitempty"`
+	// Percentage of first-time sessions (from people who had never visited your
+	// site before). Imported from Google Analytics.
+	PercentNewVisitors *wrappers.DoubleValue `protobuf:"bytes,42,opt,name=percent_new_visitors,json=percentNewVisitors,proto3" json:"percent_new_visitors,omitempty"`
+	// Number of offline phone calls.
+	PhoneCalls *wrappers.Int64Value `protobuf:"bytes,43,opt,name=phone_calls,json=phoneCalls,proto3" json:"phone_calls,omitempty"`
+	// Number of offline phone impressions.
+	PhoneImpressions *wrappers.Int64Value `protobuf:"bytes,44,opt,name=phone_impressions,json=phoneImpressions,proto3" json:"phone_impressions,omitempty"`
+	// Number of phone calls received (phone_calls) divided by the number of
+	// times your phone number is shown (phone_impressions).
+	PhoneThroughRate *wrappers.DoubleValue `protobuf:"bytes,45,opt,name=phone_through_rate,json=phoneThroughRate,proto3" json:"phone_through_rate,omitempty"`
+	// Your clickthrough rate (Ctr) divided by the average clickthrough rate of
+	// all advertisers on the websites that show your ads. Measures how your ads
+	// perform on Display Network sites compared to other ads on the same sites.
+	RelativeCtr *wrappers.DoubleValue `protobuf:"bytes,46,opt,name=relative_ctr,json=relativeCtr,proto3" json:"relative_ctr,omitempty"`
+	// The percentage of the customer's Shopping or Search ad impressions that are
+	// shown in the most prominent Shopping position. See
+	// https://support.google.com/google-ads/answer/7501826
+	// for details. Any value below 0.1 is reported as 0.0999.
+	SearchAbsoluteTopImpressionShare *wrappers.DoubleValue `protobuf:"bytes,78,opt,name=search_absolute_top_impression_share,json=searchAbsoluteTopImpressionShare,proto3" json:"search_absolute_top_impression_share,omitempty"`
+	// The number estimating how often your ad wasn't the very first ad above the
+	// organic search results due to a low budget. Note: Search
+	// budget lost absolute top impression share is reported in the range of 0 to
+	// 0.9. Any value above 0.9 is reported as 0.9001.
+	SearchBudgetLostAbsoluteTopImpressionShare *wrappers.DoubleValue `protobuf:"bytes,88,opt,name=search_budget_lost_absolute_top_impression_share,json=searchBudgetLostAbsoluteTopImpressionShare,proto3" json:"search_budget_lost_absolute_top_impression_share,omitempty"`
+	// The estimated percent of times that your ad was eligible to show on the
+	// Search Network but didn't because your budget was too low. Note: Search
+	// budget lost impression share is reported in the range of 0 to 0.9. Any
+	// value above 0.9 is reported as 0.9001.
+	SearchBudgetLostImpressionShare *wrappers.DoubleValue `protobuf:"bytes,47,opt,name=search_budget_lost_impression_share,json=searchBudgetLostImpressionShare,proto3" json:"search_budget_lost_impression_share,omitempty"`
+	// The number estimating how often your ad didn't show anywhere above the
+	// organic search results due to a low budget. Note: Search
+	// budget lost top impression share is reported in the range of 0 to 0.9. Any
+	// value above 0.9 is reported as 0.9001.
+	SearchBudgetLostTopImpressionShare *wrappers.DoubleValue `protobuf:"bytes,89,opt,name=search_budget_lost_top_impression_share,json=searchBudgetLostTopImpressionShare,proto3" json:"search_budget_lost_top_impression_share,omitempty"`
+	// The number of clicks you've received on the Search Network
+	// divided by the estimated number of clicks you were eligible to receive.
+	// Note: Search click share is reported in the range of 0.1 to 1. Any value
+	// below 0.1 is reported as 0.0999.
+	SearchClickShare *wrappers.DoubleValue `protobuf:"bytes,48,opt,name=search_click_share,json=searchClickShare,proto3" json:"search_click_share,omitempty"`
+	// The impressions you've received divided by the estimated number of
+	// impressions you were eligible to receive on the Search Network for search
+	// terms that matched your keywords exactly (or were close variants of your
+	// keyword), regardless of your keyword match types. Note: Search exact match
+	// impression share is reported in the range of 0.1 to 1. Any value below 0.1
+	// is reported as 0.0999.
+	SearchExactMatchImpressionShare *wrappers.DoubleValue `protobuf:"bytes,49,opt,name=search_exact_match_impression_share,json=searchExactMatchImpressionShare,proto3" json:"search_exact_match_impression_share,omitempty"`
+	// The impressions you've received on the Search Network divided
+	// by the estimated number of impressions you were eligible to receive.
+	// Note: Search impression share is reported in the range of 0.1 to 1. Any
+	// value below 0.1 is reported as 0.0999.
+	SearchImpressionShare *wrappers.DoubleValue `protobuf:"bytes,50,opt,name=search_impression_share,json=searchImpressionShare,proto3" json:"search_impression_share,omitempty"`
+	// The number estimating how often your ad wasn't the very first ad above the
+	// organic search results due to poor Ad Rank.
+	// Note: Search rank lost absolute top impression share is reported in the
+	// range of 0 to 0.9. Any value above 0.9 is reported as 0.9001.
+	SearchRankLostAbsoluteTopImpressionShare *wrappers.DoubleValue `protobuf:"bytes,90,opt,name=search_rank_lost_absolute_top_impression_share,json=searchRankLostAbsoluteTopImpressionShare,proto3" json:"search_rank_lost_absolute_top_impression_share,omitempty"`
+	// The estimated percentage of impressions on the Search Network
+	// that your ads didn't receive due to poor Ad Rank.
+	// Note: Search rank lost impression share is reported in the range of 0 to
+	// 0.9. Any value above 0.9 is reported as 0.9001.
+	SearchRankLostImpressionShare *wrappers.DoubleValue `protobuf:"bytes,51,opt,name=search_rank_lost_impression_share,json=searchRankLostImpressionShare,proto3" json:"search_rank_lost_impression_share,omitempty"`
+	// The number estimating how often your ad didn't show anywhere above the
+	// organic search results due to poor Ad Rank.
+	// Note: Search rank lost top impression share is reported in the range of 0
+	// to 0.9. Any value above 0.9 is reported as 0.9001.
+	SearchRankLostTopImpressionShare *wrappers.DoubleValue `protobuf:"bytes,91,opt,name=search_rank_lost_top_impression_share,json=searchRankLostTopImpressionShare,proto3" json:"search_rank_lost_top_impression_share,omitempty"`
+	// The impressions you've received in the top location (anywhere above the
+	// organic search results) compared to the estimated number of impressions you
+	// were eligible to receive in the top location.
+	// Note: Search top impression share is reported in the range of 0.1 to 1. Any
+	// value below 0.1 is reported as 0.0999.
+	SearchTopImpressionShare *wrappers.DoubleValue `protobuf:"bytes,92,opt,name=search_top_impression_share,json=searchTopImpressionShare,proto3" json:"search_top_impression_share,omitempty"`
+	// A measure of how quickly your page loads after clicks on your mobile ads.
+	// The score is a range from 1 to 10, 10 being the fastest.
+	SpeedScore *wrappers.Int64Value `protobuf:"bytes,107,opt,name=speed_score,json=speedScore,proto3" json:"speed_score,omitempty"`
+	// The percent of your ad impressions that are shown anywhere above the
+	// organic search results.
+	TopImpressionPercentage *wrappers.DoubleValue `protobuf:"bytes,93,opt,name=top_impression_percentage,json=topImpressionPercentage,proto3" json:"top_impression_percentage,omitempty"`
+	// The percentage of ad clicks to Accelerated Mobile Pages (AMP) landing pages
+	// that reach a valid AMP page.
+	ValidAcceleratedMobilePagesClicksPercentage *wrappers.DoubleValue `protobuf:"bytes,108,opt,name=valid_accelerated_mobile_pages_clicks_percentage,json=validAcceleratedMobilePagesClicksPercentage,proto3" json:"valid_accelerated_mobile_pages_clicks_percentage,omitempty"`
+	// The value of all conversions divided by the number of all conversions.
+	ValuePerAllConversions *wrappers.DoubleValue `protobuf:"bytes,52,opt,name=value_per_all_conversions,json=valuePerAllConversions,proto3" json:"value_per_all_conversions,omitempty"`
+	// The value of conversions divided by the number of conversions. This only
+	// includes conversion actions which include_in_conversions_metric attribute
+	// is set to true.
+	ValuePerConversion *wrappers.DoubleValue `protobuf:"bytes,53,opt,name=value_per_conversion,json=valuePerConversion,proto3" json:"value_per_conversion,omitempty"`
+	// The value of current model attributed conversions divided by the number of
+	// the conversions. This only includes conversion actions which
+	// include_in_conversions_metric attribute is set to true.
+	ValuePerCurrentModelAttributedConversion *wrappers.DoubleValue `protobuf:"bytes,94,opt,name=value_per_current_model_attributed_conversion,json=valuePerCurrentModelAttributedConversion,proto3" json:"value_per_current_model_attributed_conversion,omitempty"`
+	// Percentage of impressions where the viewer watched all of your video.
+	VideoQuartile_100Rate *wrappers.DoubleValue `protobuf:"bytes,54,opt,name=video_quartile_100_rate,json=videoQuartile100Rate,proto3" json:"video_quartile_100_rate,omitempty"`
+	// Percentage of impressions where the viewer watched 25% of your video.
+	VideoQuartile_25Rate *wrappers.DoubleValue `protobuf:"bytes,55,opt,name=video_quartile_25_rate,json=videoQuartile25Rate,proto3" json:"video_quartile_25_rate,omitempty"`
+	// Percentage of impressions where the viewer watched 50% of your video.
+	VideoQuartile_50Rate *wrappers.DoubleValue `protobuf:"bytes,56,opt,name=video_quartile_50_rate,json=videoQuartile50Rate,proto3" json:"video_quartile_50_rate,omitempty"`
+	// Percentage of impressions where the viewer watched 75% of your video.
+	VideoQuartile_75Rate *wrappers.DoubleValue `protobuf:"bytes,57,opt,name=video_quartile_75_rate,json=videoQuartile75Rate,proto3" json:"video_quartile_75_rate,omitempty"`
+	// The number of views your TrueView video ad receives divided by its number
+	// of impressions, including thumbnail impressions for TrueView in-display
+	// ads.
+	VideoViewRate *wrappers.DoubleValue `protobuf:"bytes,58,opt,name=video_view_rate,json=videoViewRate,proto3" json:"video_view_rate,omitempty"`
+	// The number of times your video ads were viewed.
+	VideoViews *wrappers.Int64Value `protobuf:"bytes,59,opt,name=video_views,json=videoViews,proto3" json:"video_views,omitempty"`
+	// The total number of view-through conversions.
+	// These happen when a customer sees an image or rich media ad, then later
+	// completes a conversion on your site without interacting with (e.g.,
+	// clicking on) another ad.
+	ViewThroughConversions *wrappers.Int64Value `protobuf:"bytes,60,opt,name=view_through_conversions,json=viewThroughConversions,proto3" json:"view_through_conversions,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{}             `json:"-"`
+	XXX_unrecognized       []byte               `json:"-"`
+	XXX_sizecache          int32                `json:"-"`
+}
+
+func (m *Metrics) Reset()         { *m = Metrics{} }
+func (m *Metrics) String() string { return proto.CompactTextString(m) }
+func (*Metrics) ProtoMessage()    {}
+func (*Metrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f3faaf084afc72bb, []int{0}
+}
+
+func (m *Metrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Metrics.Unmarshal(m, b)
+}
+func (m *Metrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Metrics.Marshal(b, m, deterministic)
+}
+func (m *Metrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Metrics.Merge(m, src)
+}
+func (m *Metrics) XXX_Size() int {
+	return xxx_messageInfo_Metrics.Size(m)
+}
+func (m *Metrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_Metrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Metrics proto.InternalMessageInfo
+
+func (m *Metrics) GetAbsoluteTopImpressionPercentage() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AbsoluteTopImpressionPercentage
+	}
+	return nil
+}
+
+func (m *Metrics) GetActiveViewCpm() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ActiveViewCpm
+	}
+	return nil
+}
+
+func (m *Metrics) GetActiveViewCtr() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ActiveViewCtr
+	}
+	return nil
+}
+
+func (m *Metrics) GetActiveViewImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.ActiveViewImpressions
+	}
+	return nil
+}
+
+func (m *Metrics) GetActiveViewMeasurability() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ActiveViewMeasurability
+	}
+	return nil
+}
+
+func (m *Metrics) GetActiveViewMeasurableCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.ActiveViewMeasurableCostMicros
+	}
+	return nil
+}
+
+func (m *Metrics) GetActiveViewMeasurableImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.ActiveViewMeasurableImpressions
+	}
+	return nil
+}
+
+func (m *Metrics) GetActiveViewViewability() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ActiveViewViewability
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsFromInteractionsRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsFromInteractionsRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsValue
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversions
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsValuePerCost() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsValuePerCost
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsFromClickToCall() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsFromClickToCall
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsFromDirections() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsFromDirections
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsFromInteractionsValuePerInteraction() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsFromInteractionsValuePerInteraction
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsFromMenu() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsFromMenu
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsFromOrder() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsFromOrder
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsFromOtherEngagement() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsFromOtherEngagement
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsFromStoreVisit() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsFromStoreVisit
+	}
+	return nil
+}
+
+func (m *Metrics) GetAllConversionsFromStoreWebsite() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AllConversionsFromStoreWebsite
+	}
+	return nil
+}
+
+func (m *Metrics) GetAverageCost() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AverageCost
+	}
+	return nil
+}
+
+func (m *Metrics) GetAverageCpc() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AverageCpc
+	}
+	return nil
+}
+
+func (m *Metrics) GetAverageCpe() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AverageCpe
+	}
+	return nil
+}
+
+func (m *Metrics) GetAverageCpm() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AverageCpm
+	}
+	return nil
+}
+
+func (m *Metrics) GetAverageCpv() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AverageCpv
+	}
+	return nil
+}
+
+func (m *Metrics) GetAveragePageViews() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AveragePageViews
+	}
+	return nil
+}
+
+func (m *Metrics) GetAverageTimeOnSite() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AverageTimeOnSite
+	}
+	return nil
+}
+
+func (m *Metrics) GetBenchmarkAverageMaxCpc() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BenchmarkAverageMaxCpc
+	}
+	return nil
+}
+
+func (m *Metrics) GetBenchmarkCtr() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BenchmarkCtr
+	}
+	return nil
+}
+
+func (m *Metrics) GetBounceRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BounceRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.Clicks
+	}
+	return nil
+}
+
+func (m *Metrics) GetCombinedClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.CombinedClicks
+	}
+	return nil
+}
+
+func (m *Metrics) GetCombinedClicksPerQuery() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CombinedClicksPerQuery
+	}
+	return nil
+}
+
+func (m *Metrics) GetCombinedQueries() *wrappers.Int64Value {
+	if m != nil {
+		return m.CombinedQueries
+	}
+	return nil
+}
+
+func (m *Metrics) GetContentBudgetLostImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ContentBudgetLostImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetContentImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ContentImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetConversionLastReceivedRequestDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionLastReceivedRequestDateTime
+	}
+	return nil
+}
+
+func (m *Metrics) GetConversionLastConversionDate() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionLastConversionDate
+	}
+	return nil
+}
+
+func (m *Metrics) GetContentRankLostImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ContentRankLostImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetConversionsFromInteractionsRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ConversionsFromInteractionsRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetConversionsValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ConversionsValue
+	}
+	return nil
+}
+
+func (m *Metrics) GetConversionsValuePerCost() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ConversionsValuePerCost
+	}
+	return nil
+}
+
+func (m *Metrics) GetConversionsFromInteractionsValuePerInteraction() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ConversionsFromInteractionsValuePerInteraction
+	}
+	return nil
+}
+
+func (m *Metrics) GetConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Conversions
+	}
+	return nil
+}
+
+func (m *Metrics) GetCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CostMicros
+	}
+	return nil
+}
+
+func (m *Metrics) GetCostPerAllConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CostPerAllConversions
+	}
+	return nil
+}
+
+func (m *Metrics) GetCostPerConversion() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CostPerConversion
+	}
+	return nil
+}
+
+func (m *Metrics) GetCostPerCurrentModelAttributedConversion() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CostPerCurrentModelAttributedConversion
+	}
+	return nil
+}
+
+func (m *Metrics) GetCrossDeviceConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CrossDeviceConversions
+	}
+	return nil
+}
+
+func (m *Metrics) GetCtr() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Ctr
+	}
+	return nil
+}
+
+func (m *Metrics) GetCurrentModelAttributedConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CurrentModelAttributedConversions
+	}
+	return nil
+}
+
+func (m *Metrics) GetCurrentModelAttributedConversionsFromInteractionsRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CurrentModelAttributedConversionsFromInteractionsRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetCurrentModelAttributedConversionsFromInteractionsValuePerInteraction() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CurrentModelAttributedConversionsFromInteractionsValuePerInteraction
+	}
+	return nil
+}
+
+func (m *Metrics) GetCurrentModelAttributedConversionsValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CurrentModelAttributedConversionsValue
+	}
+	return nil
+}
+
+func (m *Metrics) GetCurrentModelAttributedConversionsValuePerCost() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CurrentModelAttributedConversionsValuePerCost
+	}
+	return nil
+}
+
+func (m *Metrics) GetEngagementRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.EngagementRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetEngagements() *wrappers.Int64Value {
+	if m != nil {
+		return m.Engagements
+	}
+	return nil
+}
+
+func (m *Metrics) GetHotelAverageLeadValueMicros() *wrappers.DoubleValue {
+	if m != nil {
+		return m.HotelAverageLeadValueMicros
+	}
+	return nil
+}
+
+func (m *Metrics) GetHotelPriceDifferencePercentage() *wrappers.DoubleValue {
+	if m != nil {
+		return m.HotelPriceDifferencePercentage
+	}
+	return nil
+}
+
+func (m *Metrics) GetHistoricalCreativeQualityScore() enums.QualityScoreBucketEnum_QualityScoreBucket {
+	if m != nil {
+		return m.HistoricalCreativeQualityScore
+	}
+	return enums.QualityScoreBucketEnum_UNSPECIFIED
+}
+
+func (m *Metrics) GetHistoricalLandingPageQualityScore() enums.QualityScoreBucketEnum_QualityScoreBucket {
+	if m != nil {
+		return m.HistoricalLandingPageQualityScore
+	}
+	return enums.QualityScoreBucketEnum_UNSPECIFIED
+}
+
+func (m *Metrics) GetHistoricalQualityScore() *wrappers.Int64Value {
+	if m != nil {
+		return m.HistoricalQualityScore
+	}
+	return nil
+}
+
+func (m *Metrics) GetHistoricalSearchPredictedCtr() enums.QualityScoreBucketEnum_QualityScoreBucket {
+	if m != nil {
+		return m.HistoricalSearchPredictedCtr
+	}
+	return enums.QualityScoreBucketEnum_UNSPECIFIED
+}
+
+func (m *Metrics) GetGmailForwards() *wrappers.Int64Value {
+	if m != nil {
+		return m.GmailForwards
+	}
+	return nil
+}
+
+func (m *Metrics) GetGmailSaves() *wrappers.Int64Value {
+	if m != nil {
+		return m.GmailSaves
+	}
+	return nil
+}
+
+func (m *Metrics) GetGmailSecondaryClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.GmailSecondaryClicks
+	}
+	return nil
+}
+
+func (m *Metrics) GetImpressionsFromStoreReach() *wrappers.Int64Value {
+	if m != nil {
+		return m.ImpressionsFromStoreReach
+	}
+	return nil
+}
+
+func (m *Metrics) GetImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.Impressions
+	}
+	return nil
+}
+
+func (m *Metrics) GetInteractionRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.InteractionRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetInteractions() *wrappers.Int64Value {
+	if m != nil {
+		return m.Interactions
+	}
+	return nil
+}
+
+func (m *Metrics) GetInteractionEventTypes() []enums.InteractionEventTypeEnum_InteractionEventType {
+	if m != nil {
+		return m.InteractionEventTypes
+	}
+	return nil
+}
+
+func (m *Metrics) GetInvalidClickRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.InvalidClickRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetInvalidClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.InvalidClicks
+	}
+	return nil
+}
+
+func (m *Metrics) GetMessageChats() *wrappers.Int64Value {
+	if m != nil {
+		return m.MessageChats
+	}
+	return nil
+}
+
+func (m *Metrics) GetMessageImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.MessageImpressions
+	}
+	return nil
+}
+
+func (m *Metrics) GetMessageChatRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.MessageChatRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetMobileFriendlyClicksPercentage() *wrappers.DoubleValue {
+	if m != nil {
+		return m.MobileFriendlyClicksPercentage
+	}
+	return nil
+}
+
+func (m *Metrics) GetOrganicClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.OrganicClicks
+	}
+	return nil
+}
+
+func (m *Metrics) GetOrganicClicksPerQuery() *wrappers.DoubleValue {
+	if m != nil {
+		return m.OrganicClicksPerQuery
+	}
+	return nil
+}
+
+func (m *Metrics) GetOrganicImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.OrganicImpressions
+	}
+	return nil
+}
+
+func (m *Metrics) GetOrganicImpressionsPerQuery() *wrappers.DoubleValue {
+	if m != nil {
+		return m.OrganicImpressionsPerQuery
+	}
+	return nil
+}
+
+func (m *Metrics) GetOrganicQueries() *wrappers.Int64Value {
+	if m != nil {
+		return m.OrganicQueries
+	}
+	return nil
+}
+
+func (m *Metrics) GetPercentNewVisitors() *wrappers.DoubleValue {
+	if m != nil {
+		return m.PercentNewVisitors
+	}
+	return nil
+}
+
+func (m *Metrics) GetPhoneCalls() *wrappers.Int64Value {
+	if m != nil {
+		return m.PhoneCalls
+	}
+	return nil
+}
+
+func (m *Metrics) GetPhoneImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.PhoneImpressions
+	}
+	return nil
+}
+
+func (m *Metrics) GetPhoneThroughRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.PhoneThroughRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetRelativeCtr() *wrappers.DoubleValue {
+	if m != nil {
+		return m.RelativeCtr
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchAbsoluteTopImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchAbsoluteTopImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchBudgetLostAbsoluteTopImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchBudgetLostAbsoluteTopImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchBudgetLostImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchBudgetLostImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchBudgetLostTopImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchBudgetLostTopImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchClickShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchClickShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchExactMatchImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchExactMatchImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchRankLostAbsoluteTopImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchRankLostAbsoluteTopImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchRankLostImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchRankLostImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchRankLostTopImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchRankLostTopImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSearchTopImpressionShare() *wrappers.DoubleValue {
+	if m != nil {
+		return m.SearchTopImpressionShare
+	}
+	return nil
+}
+
+func (m *Metrics) GetSpeedScore() *wrappers.Int64Value {
+	if m != nil {
+		return m.SpeedScore
+	}
+	return nil
+}
+
+func (m *Metrics) GetTopImpressionPercentage() *wrappers.DoubleValue {
+	if m != nil {
+		return m.TopImpressionPercentage
+	}
+	return nil
+}
+
+func (m *Metrics) GetValidAcceleratedMobilePagesClicksPercentage() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ValidAcceleratedMobilePagesClicksPercentage
+	}
+	return nil
+}
+
+func (m *Metrics) GetValuePerAllConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ValuePerAllConversions
+	}
+	return nil
+}
+
+func (m *Metrics) GetValuePerConversion() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ValuePerConversion
+	}
+	return nil
+}
+
+func (m *Metrics) GetValuePerCurrentModelAttributedConversion() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ValuePerCurrentModelAttributedConversion
+	}
+	return nil
+}
+
+func (m *Metrics) GetVideoQuartile_100Rate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.VideoQuartile_100Rate
+	}
+	return nil
+}
+
+func (m *Metrics) GetVideoQuartile_25Rate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.VideoQuartile_25Rate
+	}
+	return nil
+}
+
+func (m *Metrics) GetVideoQuartile_50Rate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.VideoQuartile_50Rate
+	}
+	return nil
+}
+
+func (m *Metrics) GetVideoQuartile_75Rate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.VideoQuartile_75Rate
+	}
+	return nil
+}
+
+func (m *Metrics) GetVideoViewRate() *wrappers.DoubleValue {
+	if m != nil {
+		return m.VideoViewRate
+	}
+	return nil
+}
+
+func (m *Metrics) GetVideoViews() *wrappers.Int64Value {
+	if m != nil {
+		return m.VideoViews
+	}
+	return nil
+}
+
+func (m *Metrics) GetViewThroughConversions() *wrappers.Int64Value {
+	if m != nil {
+		return m.ViewThroughConversions
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Metrics)(nil), "google.ads.googleads.v3.common.Metrics")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/metrics.proto", fileDescriptor_f3faaf084afc72bb)
+}
+
+var fileDescriptor_f3faaf084afc72bb = []byte{
+	// 2592 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x9a, 0x5b, 0x73, 0x14, 0xc7,
+	0xd9, 0xc7, 0x6b, 0xe1, 0x2d, 0xfb, 0xcd, 0x23, 0x90, 0x60, 0x10, 0xd0, 0x92, 0x65, 0x49, 0x28,
+	0xc6, 0x10, 0x0c, 0x2b, 0x21, 0x59, 0xc6, 0x11, 0x60, 0x67, 0x75, 0x00, 0x44, 0x24, 0xd0, 0x09,
+	0x09, 0x6c, 0x25, 0xe3, 0xde, 0x99, 0xd6, 0xee, 0x58, 0x73, 0x58, 0xba, 0x7b, 0x57, 0x28, 0x8e,
+	0x9d, 0xe3, 0x45, 0x72, 0x95, 0x54, 0xe5, 0x26, 0x95, 0xcb, 0x5c, 0xe6, 0x13, 0xe4, 0x0b, 0xe4,
+	0x26, 0x5f, 0x24, 0x55, 0xf9, 0x14, 0xa9, 0x3e, 0xcc, 0x4c, 0xef, 0xee, 0xac, 0xb6, 0x45, 0xf9,
+	0x06, 0x96, 0xa1, 0xff, 0xbf, 0xff, 0x33, 0xdd, 0x3d, 0x4f, 0x77, 0x3f, 0x33, 0x70, 0xbb, 0x96,
+	0x24, 0xb5, 0x90, 0x4c, 0x63, 0x9f, 0x4d, 0xab, 0x9f, 0xe2, 0x57, 0x6b, 0x6e, 0xda, 0x4b, 0xa2,
+	0x28, 0x89, 0xa7, 0x23, 0xc2, 0x69, 0xe0, 0xb1, 0x72, 0x83, 0x26, 0x3c, 0x71, 0xc6, 0x55, 0x93,
+	0x32, 0xf6, 0x59, 0x39, 0x6b, 0x5d, 0x6e, 0xcd, 0x95, 0x55, 0xeb, 0xd1, 0x85, 0x5e, 0x34, 0x12,
+	0x37, 0x23, 0x36, 0x1d, 0xc4, 0x9c, 0x50, 0xec, 0xf1, 0x20, 0x89, 0x5d, 0xd2, 0x22, 0x31, 0x77,
+	0xf9, 0x71, 0x83, 0x28, 0xf6, 0xe8, 0xa7, 0x27, 0x6b, 0x5f, 0x37, 0x71, 0x18, 0xf0, 0x63, 0x97,
+	0x79, 0x09, 0x25, 0x6e, 0xb5, 0xe9, 0x1d, 0x12, 0xae, 0x95, 0x3a, 0xaa, 0x69, 0xf9, 0xaf, 0x6a,
+	0xf3, 0x60, 0xfa, 0x88, 0xe2, 0x46, 0x83, 0x50, 0x1d, 0xf5, 0xe8, 0x58, 0x4a, 0x6e, 0x04, 0xd3,
+	0x38, 0x8e, 0x13, 0x8e, 0x45, 0x04, 0xfa, 0x7f, 0xa7, 0xfe, 0xf5, 0x1c, 0xde, 0x5d, 0x57, 0x77,
+	0xe9, 0x04, 0x30, 0x85, 0xab, 0x2c, 0x09, 0x9b, 0x9c, 0xb8, 0x3c, 0x69, 0xb8, 0x41, 0xd4, 0xa0,
+	0x84, 0x31, 0x11, 0x6f, 0x83, 0x50, 0x8f, 0xc4, 0x1c, 0xd7, 0x08, 0x72, 0x27, 0x4b, 0x37, 0x07,
+	0x66, 0xc7, 0x74, 0x0f, 0x94, 0x53, 0xdb, 0xf2, 0x72, 0xd2, 0xac, 0x86, 0x64, 0x17, 0x87, 0x4d,
+	0xb2, 0x35, 0x91, 0x72, 0x76, 0x92, 0xc6, 0x6a, 0x46, 0xd9, 0xc8, 0x20, 0xce, 0x32, 0x0c, 0x89,
+	0x9e, 0x68, 0x11, 0xb7, 0x15, 0x90, 0x23, 0xd7, 0x6b, 0x44, 0xa8, 0x64, 0xc1, 0x3d, 0xaf, 0x44,
+	0xbb, 0x01, 0x39, 0x5a, 0x6a, 0x44, 0x5d, 0x14, 0x4e, 0xd1, 0xf3, 0x53, 0x52, 0x38, 0x75, 0xb6,
+	0xe1, 0xaa, 0x49, 0xc9, 0xef, 0x9a, 0xa1, 0x33, 0x92, 0xf6, 0x5e, 0x17, 0x6d, 0x35, 0xe6, 0x9f,
+	0x7c, 0xac, 0x60, 0x97, 0x73, 0x58, 0x7e, 0xa7, 0xcc, 0x79, 0x09, 0x23, 0x26, 0x34, 0x22, 0x98,
+	0x35, 0x29, 0xae, 0x06, 0x62, 0x14, 0xd1, 0x57, 0x16, 0x41, 0x5e, 0xcd, 0xb9, 0xeb, 0xa6, 0xd8,
+	0xa9, 0xc1, 0x54, 0x11, 0x39, 0x24, 0xae, 0x97, 0x30, 0xee, 0x46, 0x81, 0x47, 0x13, 0x86, 0xce,
+	0xf6, 0x8f, 0x7c, 0xbc, 0xdb, 0x21, 0x24, 0x4b, 0x09, 0xe3, 0xeb, 0x12, 0xe1, 0xd4, 0x7b, 0x1a,
+	0x99, 0x5d, 0xf4, 0x7f, 0xfd, 0x8d, 0x26, 0x8a, 0x8c, 0xcc, 0xce, 0xda, 0x69, 0x1f, 0x01, 0xf1,
+	0x47, 0xda, 0x55, 0xd8, 0xa2, 0xab, 0x8c, 0x21, 0xd8, 0xcd, 0xa5, 0x4e, 0x03, 0x3e, 0xc4, 0x61,
+	0xe8, 0x7a, 0x49, 0xdc, 0x22, 0x54, 0x1a, 0xb9, 0x07, 0x34, 0x89, 0x5c, 0xe3, 0x39, 0x64, 0x2e,
+	0xc5, 0x9c, 0xa0, 0x8a, 0x85, 0xc9, 0x14, 0x0e, 0xc3, 0xa5, 0x1c, 0xf5, 0x88, 0x26, 0xd1, 0xaa,
+	0x01, 0xda, 0xc2, 0x9c, 0x38, 0x1b, 0x70, 0xb9, 0xd3, 0xb1, 0x25, 0xc4, 0x68, 0xd1, 0xc2, 0xe0,
+	0x52, 0xbb, 0x81, 0xbc, 0xe8, 0xac, 0xc0, 0x50, 0x07, 0x11, 0xbd, 0x6b, 0xc1, 0x1a, 0x6c, 0x67,
+	0x39, 0x5f, 0xc1, 0x78, 0x61, 0x60, 0xe2, 0xb9, 0x96, 0xd3, 0x06, 0x7d, 0x66, 0x41, 0x1d, 0x2d,
+	0x88, 0x70, 0x83, 0x50, 0x31, 0x65, 0xe4, 0xac, 0x2c, 0xea, 0x6c, 0x2f, 0x0c, 0xbc, 0x43, 0x97,
+	0x27, 0xae, 0x87, 0xc3, 0x10, 0xb5, 0x2c, 0x5c, 0xde, 0xef, 0xee, 0xe8, 0x25, 0x01, 0xd9, 0x49,
+	0x96, 0x70, 0x18, 0x3a, 0x1e, 0x4c, 0x14, 0x1a, 0xf9, 0x01, 0x25, 0x6a, 0x28, 0xd0, 0x91, 0x85,
+	0xcb, 0x58, 0xb7, 0xcb, 0x72, 0x46, 0x70, 0xfe, 0x5c, 0x82, 0x7b, 0xfd, 0xe7, 0x4e, 0xde, 0x85,
+	0xc6, 0x65, 0xb4, 0x64, 0xe1, 0x7e, 0xf7, 0xe4, 0xc9, 0x94, 0xf6, 0xac, 0x71, 0xcd, 0xd9, 0x83,
+	0x91, 0xc2, 0x88, 0x22, 0x12, 0x37, 0xd1, 0x1b, 0x0b, 0xcf, 0x2b, 0xdd, 0x9e, 0xeb, 0x24, 0x6e,
+	0x3a, 0xaf, 0x60, 0xb4, 0x10, 0x9c, 0x50, 0x9f, 0x50, 0x74, 0x6c, 0x95, 0xaa, 0xba, 0xc8, 0xcf,
+	0x85, 0xd8, 0x89, 0xe1, 0x7a, 0x31, 0x9a, 0xd7, 0x09, 0x75, 0x49, 0x5c, 0xc3, 0x35, 0x12, 0x91,
+	0x98, 0xa3, 0x5f, 0x58, 0xb8, 0x5c, 0x2b, 0x70, 0x11, 0x9c, 0x95, 0x0c, 0xe3, 0xf8, 0x30, 0x59,
+	0xe8, 0xc7, 0xb8, 0x58, 0x35, 0x5b, 0x01, 0x0b, 0x38, 0xfa, 0xe6, 0xed, 0x26, 0xc7, 0xb6, 0x40,
+	0xec, 0x0a, 0x82, 0xcc, 0x8b, 0xbd, 0x5d, 0x8e, 0x48, 0x95, 0x05, 0x9c, 0xa0, 0x5f, 0x5a, 0xf8,
+	0x8c, 0xf7, 0xf0, 0xd9, 0x53, 0x0c, 0xe7, 0x73, 0x38, 0x87, 0x5b, 0x84, 0xe2, 0x9a, 0xca, 0xed,
+	0xe8, 0xff, 0x2d, 0x98, 0x03, 0x5a, 0x21, 0x9f, 0xca, 0x87, 0x30, 0x90, 0x01, 0x1a, 0x1e, 0xfa,
+	0x81, 0x85, 0x1e, 0x52, 0x7d, 0xc3, 0x6b, 0x97, 0x13, 0x54, 0x3d, 0x95, 0x9c, 0xb4, 0xcb, 0x23,
+	0x04, 0xa7, 0x92, 0x47, 0xed, 0xf2, 0x16, 0x1a, 0x38, 0x95, 0xbc, 0xe5, 0x3c, 0x05, 0x27, 0x95,
+	0x37, 0xc4, 0x1f, 0x62, 0x55, 0x61, 0xc8, 0xb3, 0xa0, 0x5c, 0xd0, 0xba, 0x0d, 0x5c, 0x93, 0x8b,
+	0x0a, 0x73, 0xd6, 0x61, 0x38, 0x65, 0xf1, 0x20, 0x22, 0x6e, 0x12, 0xbb, 0x72, 0x90, 0x77, 0x2c,
+	0x68, 0x17, 0xb5, 0x72, 0x27, 0x88, 0xc8, 0xf3, 0x78, 0x5b, 0x8c, 0xeb, 0x1e, 0x8c, 0x54, 0x49,
+	0xec, 0xd5, 0x23, 0x4c, 0x0f, 0xdd, 0x14, 0x1c, 0xe1, 0x37, 0x72, 0x90, 0x06, 0x6d, 0x9e, 0xe5,
+	0x4c, 0x5e, 0x51, 0xea, 0x75, 0xfc, 0x46, 0x0c, 0x58, 0x05, 0xce, 0xe7, 0x60, 0xb1, 0x1d, 0x5a,
+	0xb7, 0x80, 0x9d, 0xcb, 0x24, 0x62, 0x37, 0xf4, 0x10, 0x06, 0xaa, 0x49, 0x33, 0xf6, 0x88, 0x5a,
+	0x1a, 0x87, 0x6c, 0x7a, 0x5d, 0x09, 0xe4, 0x12, 0x38, 0x07, 0xef, 0xc8, 0x94, 0xcf, 0xd0, 0xa5,
+	0xfe, 0x1b, 0x03, 0xdd, 0x54, 0xec, 0xe3, 0xbc, 0x24, 0xaa, 0x06, 0x31, 0xf1, 0x5d, 0xad, 0x66,
+	0xfd, 0xd5, 0x83, 0xa9, 0x66, 0x49, 0x51, 0xf6, 0x60, 0xa4, 0x83, 0x22, 0x73, 0xf3, 0xeb, 0x26,
+	0xa1, 0xc7, 0x88, 0xdb, 0xf4, 0x6a, 0x3b, 0x70, 0x83, 0xd0, 0x4d, 0xa1, 0x75, 0x1e, 0xc1, 0x85,
+	0x0c, 0x2c, 0x68, 0x01, 0x61, 0xa8, 0xd9, 0x3f, 0xbe, 0xec, 0x9e, 0x36, 0x95, 0xc6, 0x09, 0xe1,
+	0x03, 0x2f, 0x89, 0xb9, 0xd8, 0xf9, 0x57, 0x9b, 0x7e, 0x8d, 0x70, 0x37, 0x14, 0x3b, 0x36, 0x63,
+	0x9b, 0xcd, 0xea, 0x98, 0x12, 0x34, 0x6c, 0x11, 0xeb, 0xa4, 0x26, 0x2d, 0x4a, 0xd0, 0x5a, 0xc2,
+	0x78, 0xbe, 0xa1, 0xda, 0x16, 0x14, 0x67, 0x17, 0x50, 0xea, 0xd6, 0xe5, 0x70, 0xd9, 0xae, 0x37,
+	0xa4, 0xba, 0x93, 0x7b, 0x04, 0xb7, 0xf2, 0xd4, 0xe7, 0x86, 0x98, 0x71, 0x97, 0x12, 0x8f, 0x04,
+	0x2d, 0xe2, 0xbb, 0x94, 0xbc, 0x6e, 0x12, 0xc6, 0x5d, 0x1f, 0x73, 0xf5, 0xa4, 0xa0, 0xd5, 0x1e,
+	0x4e, 0xdb, 0x9c, 0x06, 0x71, 0x4d, 0x39, 0x5d, 0xcf, 0x79, 0x6b, 0x98, 0xf1, 0x2d, 0x4d, 0xdb,
+	0x52, 0xb0, 0x65, 0xcc, 0xe5, 0xb3, 0x23, 0x56, 0xfe, 0x4e, 0x63, 0xe3, 0xdf, 0xc2, 0x12, 0x3d,
+	0xb5, 0x70, 0x1b, 0x6b, 0x77, 0xcb, 0xf3, 0xaf, 0x30, 0x12, 0xc9, 0x3d, 0xed, 0x35, 0x8a, 0xe3,
+	0xc3, 0x1e, 0x23, 0x74, 0xc5, 0x26, 0xb9, 0x6b, 0xce, 0x16, 0x8e, 0x0f, 0x8b, 0xc6, 0x27, 0x90,
+	0x4e, 0xfd, 0xb6, 0xa6, 0x2b, 0x36, 0xa7, 0x2d, 0xaf, 0xcf, 0xbe, 0x74, 0x15, 0x2e, 0x76, 0xef,
+	0x49, 0x1f, 0xd9, 0x64, 0x42, 0xaf, 0x73, 0x43, 0xfa, 0x0a, 0x46, 0x4f, 0xd8, 0x45, 0x3e, 0xb6,
+	0xd9, 0x2d, 0x78, 0x3d, 0xb6, 0x90, 0x7f, 0x2c, 0xc1, 0xdc, 0xdb, 0x6c, 0xb8, 0x9e, 0x58, 0x98,
+	0x96, 0xbd, 0xd3, 0xed, 0xb6, 0x3e, 0x83, 0x01, 0x73, 0xcf, 0x3d, 0x62, 0xb3, 0xf0, 0x1a, 0x02,
+	0xe7, 0x81, 0xd0, 0xe7, 0xa7, 0xb1, 0xd1, 0xfe, 0xd9, 0x02, 0xbc, 0xfc, 0xe4, 0xf5, 0x42, 0x3c,
+	0xba, 0x8c, 0xcb, 0x3b, 0xed, 0xdc, 0xfe, 0x2f, 0xdb, 0x1c, 0x88, 0x84, 0x7a, 0x83, 0xd0, 0x4a,
+	0xfb, 0x29, 0x60, 0x0d, 0x2e, 0x65, 0xd8, 0x1c, 0x89, 0xc6, 0x6c, 0x16, 0x31, 0x4d, 0xcc, 0x71,
+	0xce, 0x37, 0x70, 0x3b, 0xa7, 0x35, 0x29, 0x15, 0x8f, 0x4c, 0x94, 0xf8, 0x24, 0x74, 0x31, 0xe7,
+	0x34, 0xa8, 0x36, 0xb9, 0xc8, 0xc3, 0xb9, 0xcd, 0xd7, 0x16, 0x36, 0x37, 0x52, 0x1b, 0xc5, 0x5b,
+	0x17, 0xb8, 0x4a, 0x46, 0x33, 0xcc, 0x45, 0x72, 0xa3, 0x09, 0x63, 0xae, 0x4f, 0x5a, 0x81, 0x47,
+	0xda, 0x7a, 0xe8, 0x7d, 0xab, 0xe4, 0x26, 0xd4, 0xcb, 0x52, 0x6c, 0x76, 0x51, 0x19, 0xce, 0x8a,
+	0x65, 0x73, 0xdc, 0x02, 0x21, 0x1a, 0x3a, 0x11, 0x7c, 0x60, 0x71, 0xef, 0x0c, 0x11, 0x9b, 0x0d,
+	0xae, 0xd7, 0xe7, 0xae, 0x99, 0xf3, 0xd7, 0x12, 0xdc, 0xb7, 0xf1, 0xeb, 0x95, 0x4d, 0x0e, 0x2c,
+	0xc2, 0x98, 0xef, 0x1b, 0x46, 0x61, 0x8e, 0xf9, 0x67, 0x09, 0xd6, 0xde, 0x32, 0xb4, 0xe2, 0xc7,
+	0xba, 0x66, 0x11, 0xeb, 0xf2, 0xa9, 0x63, 0x2d, 0x7a, 0xd8, 0xdf, 0xc0, 0x2d, 0xab, 0xc8, 0x55,
+	0xde, 0xac, 0x5b, 0xc4, 0xf5, 0x61, 0xdf, 0xb8, 0x54, 0x36, 0xfd, 0x83, 0x48, 0x79, 0xd6, 0xd6,
+	0x79, 0x9e, 0x0d, 0x2c, 0x62, 0xb8, 0x63, 0x17, 0x43, 0x9a, 0x7d, 0x57, 0x60, 0x28, 0x3f, 0x90,
+	0xa9, 0xd9, 0x32, 0x61, 0x53, 0x69, 0xc8, 0x45, 0x72, 0x1a, 0x3c, 0x84, 0x81, 0xfc, 0x0a, 0x43,
+	0x93, 0xfd, 0x13, 0x9f, 0xd9, 0xde, 0xa9, 0xc2, 0x44, 0x3d, 0xe1, 0xa2, 0x1f, 0xf4, 0xae, 0x38,
+	0x24, 0xd8, 0xd7, 0x77, 0xaf, 0x73, 0xe9, 0x4f, 0x2d, 0xa2, 0x7a, 0x4f, 0x42, 0xf4, 0xde, 0x78,
+	0x8d, 0x60, 0x5f, 0x5e, 0xce, 0xea, 0x5a, 0xd7, 0x94, 0x47, 0x83, 0x8a, 0xd4, 0xe1, 0x07, 0x07,
+	0x07, 0x84, 0x12, 0xb1, 0xe3, 0x35, 0xaa, 0x9c, 0xbf, 0xb1, 0x29, 0x47, 0x8e, 0x4b, 0xce, 0x86,
+	0xc0, 0x2c, 0x67, 0x14, 0xa3, 0xca, 0xf9, 0x97, 0x12, 0x5c, 0xab, 0x07, 0xe2, 0x5c, 0x18, 0x78,
+	0x38, 0x74, 0x3d, 0x4a, 0xb0, 0xac, 0x72, 0xb5, 0x55, 0x73, 0xd1, 0xc6, 0x64, 0xe9, 0xe6, 0xe0,
+	0xec, 0x93, 0x72, 0xaf, 0xea, 0xb2, 0xac, 0x00, 0x97, 0x37, 0x95, 0x66, 0x5b, 0x48, 0x16, 0x65,
+	0xfd, 0x77, 0x25, 0x6e, 0x46, 0x05, 0x97, 0xb7, 0xc6, 0x73, 0xcb, 0x25, 0xed, 0x68, 0xb6, 0x72,
+	0xfe, 0x56, 0x82, 0xeb, 0x46, 0x54, 0x21, 0x8e, 0xfd, 0x20, 0xae, 0xa9, 0x43, 0x52, 0x7b, 0x64,
+	0x9b, 0xdf, 0x73, 0x64, 0x46, 0x67, 0xac, 0x29, 0x57, 0x71, 0xc4, 0x6a, 0x0b, 0xee, 0x05, 0x20,
+	0x23, 0xb6, 0xf6, 0x70, 0xb6, 0xfa, 0x4f, 0xa6, 0x2b, 0xb9, 0xb8, 0x0d, 0xfb, 0xa7, 0x12, 0x4c,
+	0x18, 0x5c, 0x46, 0x30, 0xf5, 0xea, 0x6e, 0x83, 0x12, 0x3f, 0xf0, 0xe4, 0xb3, 0xc6, 0x29, 0xda,
+	0xfe, 0x9e, 0xef, 0x76, 0x2c, 0x37, 0xdc, 0x96, 0x7e, 0x1b, 0xa9, 0x9d, 0x38, 0x67, 0x2d, 0xc2,
+	0x60, 0x2d, 0xc2, 0x41, 0xe8, 0x1e, 0x24, 0xf4, 0x08, 0x53, 0x9f, 0xa1, 0x17, 0xfd, 0x6f, 0xef,
+	0xbc, 0x94, 0x3c, 0xd2, 0x0a, 0xb1, 0xcb, 0x50, 0x0c, 0x86, 0x5b, 0x84, 0xa1, 0x5d, 0x8b, 0x5d,
+	0x86, 0x6c, 0xbf, 0x2d, 0x9a, 0x3b, 0x9b, 0x70, 0x45, 0xab, 0x89, 0x97, 0xc4, 0x3e, 0xa6, 0xc7,
+	0xe9, 0xe1, 0x6b, 0xaf, 0x3f, 0x68, 0x58, 0x81, 0x52, 0xa5, 0x3e, 0x82, 0xed, 0xc3, 0x98, 0x51,
+	0x1b, 0x36, 0xcb, 0x22, 0x94, 0x60, 0xaf, 0x8e, 0xbe, 0xed, 0x0f, 0x1e, 0x31, 0x00, 0x59, 0x41,
+	0x64, 0x4b, 0xa8, 0x45, 0x6e, 0x31, 0x2b, 0xcf, 0xd7, 0x2d, 0x72, 0x8b, 0xd1, 0xde, 0x79, 0x0c,
+	0x17, 0xcc, 0x57, 0x30, 0x32, 0xc5, 0x7d, 0x68, 0xf1, 0x94, 0x0f, 0x19, 0x2a, 0x99, 0xe3, 0x3e,
+	0x87, 0x73, 0xe6, 0xfa, 0x85, 0x6e, 0xf4, 0x0f, 0xa4, 0x4d, 0xe0, 0xfc, 0xbe, 0x04, 0x57, 0x8b,
+	0xdf, 0x06, 0x31, 0xe4, 0x4f, 0x9e, 0xbd, 0x39, 0x38, 0xbb, 0xd6, 0x67, 0x16, 0x1a, 0xcb, 0xd7,
+	0x8a, 0x10, 0xef, 0x1c, 0x37, 0x88, 0x9c, 0x87, 0x45, 0xff, 0xb1, 0x75, 0x39, 0x28, 0xb8, 0xca,
+	0x9c, 0xa7, 0xe0, 0x04, 0x71, 0x0b, 0x87, 0x81, 0x3e, 0x2f, 0xab, 0x2e, 0xb9, 0x69, 0x73, 0x2e,
+	0xd0, 0x3a, 0x39, 0xec, 0xb2, 0x4f, 0x16, 0x61, 0xb0, 0x8d, 0xc5, 0xd0, 0x8f, 0x2c, 0xa6, 0xb3,
+	0x89, 0x61, 0xce, 0x4f, 0xe0, 0x7c, 0x44, 0x18, 0x93, 0x05, 0x9f, 0x3a, 0xe6, 0x0c, 0x7d, 0x67,
+	0xd1, 0xb1, 0x5a, 0xb1, 0x24, 0x04, 0x62, 0x87, 0x9b, 0x12, 0xcc, 0x99, 0xf2, 0xab, 0xfe, 0x1c,
+	0x47, 0xeb, 0xcc, 0xd7, 0x12, 0xab, 0x70, 0xd1, 0x8c, 0x47, 0x75, 0xcf, 0xaf, 0x6d, 0x16, 0x86,
+	0x21, 0x23, 0x2a, 0xd9, 0x3d, 0x35, 0xb8, 0x16, 0x25, 0xd5, 0x20, 0x24, 0xee, 0x01, 0x0d, 0x48,
+	0xec, 0x87, 0xc7, 0x46, 0x89, 0x22, 0x5d, 0x73, 0x22, 0x9b, 0x25, 0x47, 0x61, 0x1e, 0x69, 0x4a,
+	0x56, 0xa9, 0x48, 0x97, 0x9c, 0x45, 0x18, 0x4c, 0x68, 0x0d, 0xc7, 0x81, 0x97, 0x8e, 0x43, 0x6c,
+	0x31, 0x0e, 0x5a, 0xa2, 0xc7, 0xe1, 0x05, 0xa0, 0x76, 0x86, 0x51, 0x47, 0x49, 0x6c, 0x8e, 0x1f,
+	0x6d, 0xb8, 0xac, 0x8c, 0xb2, 0x06, 0x97, 0x52, 0xac, 0x39, 0x38, 0x0d, 0x8b, 0xc1, 0xd1, 0x3a,
+	0x73, 0x70, 0x5c, 0x78, 0xbf, 0x80, 0x66, 0x44, 0xfa, 0xda, 0xe6, 0x8d, 0x46, 0x37, 0x38, 0x0b,
+	0x77, 0x19, 0x86, 0x52, 0x83, 0xb4, 0xe8, 0x43, 0x2d, 0x8a, 0x52, 0x5a, 0x93, 0xd6, 0x7c, 0x9e,
+	0xc1, 0xb0, 0x1e, 0x61, 0x37, 0x96, 0xaf, 0xb6, 0x58, 0xc0, 0x13, 0xca, 0xd0, 0x2d, 0x8b, 0xe8,
+	0x1c, 0xad, 0x7c, 0x46, 0x8e, 0x76, 0xb5, 0x4e, 0xa4, 0xfc, 0x46, 0x3d, 0x89, 0x89, 0x7c, 0x9f,
+	0xc2, 0xd0, 0x47, 0x16, 0x29, 0x5f, 0xb6, 0x5f, 0x12, 0xcd, 0x9d, 0x27, 0x70, 0x51, 0xa9, 0xcd,
+	0x01, 0xb8, 0xdd, 0x9f, 0x71, 0x41, 0xaa, 0xcc, 0xee, 0x7f, 0x0a, 0x8e, 0x22, 0xf1, 0x3a, 0x4d,
+	0x9a, 0xb5, 0xba, 0x7a, 0x38, 0xee, 0xd8, 0xe4, 0x0e, 0xa9, 0xdb, 0x51, 0xb2, 0x34, 0x9f, 0x52,
+	0x12, 0xaa, 0xad, 0x91, 0x58, 0x88, 0xcb, 0x36, 0xa7, 0xed, 0x54, 0x21, 0xd6, 0xd2, 0x10, 0x3e,
+	0xd0, 0x2b, 0x7a, 0xaf, 0xf7, 0xd7, 0xaa, 0x6c, 0xf3, 0xcc, 0xa6, 0xb0, 0xa6, 0x48, 0x95, 0xa2,
+	0x17, 0xd8, 0xaa, 0x70, 0xf3, 0xdb, 0x12, 0xcc, 0x68, 0x3b, 0xb3, 0x8c, 0x77, 0xb2, 0xf5, 0x4b,
+	0x0b, 0xeb, 0x5b, 0x8a, 0x9a, 0x97, 0xf4, 0x4e, 0x08, 0xe2, 0x6b, 0xf8, 0x61, 0x41, 0x0c, 0x5d,
+	0xb6, 0xd3, 0x36, 0xe5, 0xa3, 0x4e, 0xdb, 0x4e, 0xaf, 0xd7, 0x70, 0xa3, 0xc0, 0xab, 0xf0, 0x36,
+	0x5f, 0xd9, 0xbc, 0x49, 0xed, 0xf4, 0x2b, 0xb8, 0xbd, 0xa7, 0xe0, 0x68, 0x4b, 0xb5, 0x32, 0x29,
+	0xfa, 0x8c, 0xcd, 0xf4, 0x52, 0x3a, 0x99, 0x7b, 0x3a, 0xbb, 0x8a, 0xbc, 0xc1, 0x1e, 0x77, 0x23,
+	0xcc, 0xbd, 0x7a, 0x77, 0xe8, 0x77, 0xed, 0xbb, 0x6a, 0x45, 0x70, 0xd6, 0x05, 0xa6, 0x33, 0xee,
+	0x1d, 0xb8, 0xaa, 0xbd, 0xba, 0xf8, 0xb3, 0x36, 0x99, 0x53, 0x89, 0x3b, 0xa9, 0xdf, 0x41, 0x59,
+	0x53, 0xf3, 0x9a, 0xe4, 0xc9, 0xd3, 0xed, 0x0b, 0x0b, 0xb3, 0x9b, 0x8a, 0x99, 0xd6, 0x27, 0x4f,
+	0x98, 0x6c, 0x07, 0x70, 0xad, 0xcb, 0xbf, 0xcb, 0x72, 0xce, 0xe6, 0xdd, 0x6e, 0xbb, 0x65, 0xa7,
+	0x4f, 0x04, 0xd7, 0xbb, 0x7c, 0x0a, 0x6f, 0xef, 0x4b, 0xfb, 0x07, 0x39, 0xf5, 0x2a, 0xb8, 0xad,
+	0x2f, 0xe1, 0x3d, 0x6d, 0x57, 0x68, 0xb2, 0x6f, 0x61, 0x82, 0x14, 0xa0, 0x00, 0xfe, 0x00, 0x06,
+	0x58, 0x83, 0x10, 0x5f, 0x9f, 0x5d, 0x0e, 0x2d, 0x12, 0xb5, 0x6c, 0xaf, 0xce, 0x2b, 0x2f, 0x61,
+	0xa4, 0xf7, 0x17, 0x38, 0x3f, 0xb3, 0xa9, 0xb2, 0xf2, 0x1e, 0x5f, 0xde, 0xfc, 0xae, 0x04, 0x33,
+	0x6a, 0x9f, 0x86, 0x3d, 0x8f, 0x84, 0x44, 0xe4, 0x6d, 0xdf, 0xd5, 0x9b, 0x13, 0x71, 0x06, 0x64,
+	0x05, 0x3b, 0x93, 0xd0, 0xc2, 0xf1, 0x23, 0x49, 0xad, 0xe4, 0xd0, 0x75, 0xc9, 0x14, 0x27, 0x3c,
+	0xd6, 0xb5, 0x4d, 0xd9, 0x83, 0x91, 0xbc, 0xa4, 0xd1, 0x59, 0xe2, 0xfc, 0xd8, 0xa6, 0x80, 0xd7,
+	0xd2, 0xc5, 0x8b, 0x8e, 0x1a, 0xe7, 0x33, 0x18, 0x36, 0x6b, 0x25, 0x59, 0xf5, 0x71, 0xde, 0x66,
+	0xbd, 0x6d, 0x65, 0x05, 0x91, 0xac, 0xd0, 0xf8, 0x2d, 0xdc, 0x31, 0x78, 0x16, 0x65, 0xce, 0x9f,
+	0xdb, 0x3c, 0x79, 0x99, 0x51, 0xbf, 0x3a, 0xe7, 0x36, 0x5c, 0x6d, 0x05, 0x3e, 0x49, 0xc4, 0x49,
+	0x98, 0x72, 0x31, 0x44, 0x77, 0x67, 0x66, 0xd4, 0x5a, 0xfb, 0x89, 0x85, 0xd1, 0xb0, 0x14, 0x6f,
+	0x6a, 0xed, 0xdd, 0x99, 0x19, 0xb9, 0xde, 0x6e, 0xc2, 0x95, 0x0e, 0xe8, 0xec, 0xbc, 0x62, 0xde,
+	0xb3, 0xf9, 0x4e, 0xa5, 0x8d, 0x39, 0x3b, 0xdf, 0x03, 0x39, 0xaf, 0xc3, 0xfc, 0xf4, 0xd4, 0xc8,
+	0xf9, 0x5e, 0x51, 0xde, 0xd3, 0x51, 0xfe, 0xf8, 0xd4, 0xc8, 0x7b, 0x2a, 0xca, 0x65, 0x18, 0x52,
+	0x48, 0xf9, 0x99, 0x91, 0x64, 0x2d, 0xd8, 0x7c, 0x2f, 0x26, 0x45, 0xbb, 0x01, 0x39, 0x92, 0x94,
+	0x07, 0x30, 0x90, 0x53, 0x18, 0xba, 0x6f, 0xf1, 0x64, 0x67, 0x00, 0xb9, 0xb9, 0x96, 0xee, 0xe9,
+	0xbe, 0xc9, 0x9c, 0xf8, 0x0f, 0x2c, 0x0a, 0x1c, 0x42, 0xac, 0x37, 0x4f, 0xc6, 0xbc, 0x5f, 0xfc,
+	0x4f, 0x09, 0xa6, 0xbc, 0x24, 0x2a, 0x9f, 0xfc, 0x89, 0xe2, 0xe2, 0x39, 0xfd, 0xad, 0xdf, 0x86,
+	0x40, 0x6f, 0x94, 0xbe, 0x58, 0xd6, 0xed, 0x6b, 0x49, 0x88, 0xe3, 0x5a, 0x39, 0xa1, 0xb5, 0xe9,
+	0x1a, 0x89, 0xa5, 0x71, 0xfa, 0x19, 0x62, 0x23, 0x60, 0xbd, 0xbe, 0x8f, 0xbc, 0xaf, 0xfe, 0xfa,
+	0xfb, 0x99, 0xb3, 0x8f, 0x2b, 0x95, 0x7f, 0x9c, 0x19, 0x7f, 0xac, 0x60, 0x15, 0x9f, 0x95, 0xd5,
+	0x4f, 0xf1, 0x6b, 0x77, 0xae, 0xbc, 0x24, 0x9b, 0xfd, 0x3b, 0x6d, 0xb0, 0x5f, 0xf1, 0xd9, 0x7e,
+	0xd6, 0x60, 0x7f, 0x77, 0x6e, 0x5f, 0x35, 0xf8, 0xef, 0x99, 0x29, 0x75, 0x75, 0x61, 0xa1, 0xe2,
+	0xb3, 0x85, 0x85, 0xac, 0xc9, 0xc2, 0xc2, 0xee, 0xdc, 0xc2, 0x82, 0x6a, 0x54, 0x7d, 0x47, 0x46,
+	0x37, 0xf7, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x63, 0xf0, 0x3b, 0xe1, 0xbc, 0x29, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/policy.pb.go b/googleapis/ads/googleads/v3/common/policy.pb.go
new file mode 100644
index 0000000..911f063
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/policy.pb.go
@@ -0,0 +1,1007 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/policy.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Key of the violation. The key is used for referring to a violation
+// when filing an exemption request.
+type PolicyViolationKey struct {
+	// Unique ID of the violated policy.
+	PolicyName *wrappers.StringValue `protobuf:"bytes,1,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"`
+	// The text that violates the policy if specified.
+	// Otherwise, refers to the policy in general
+	// (e.g., when requesting to be exempt from the whole policy).
+	// If not specified for criterion exemptions, the whole policy is implied.
+	// Must be specified for ad exemptions.
+	ViolatingText        *wrappers.StringValue `protobuf:"bytes,2,opt,name=violating_text,json=violatingText,proto3" json:"violating_text,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *PolicyViolationKey) Reset()         { *m = PolicyViolationKey{} }
+func (m *PolicyViolationKey) String() string { return proto.CompactTextString(m) }
+func (*PolicyViolationKey) ProtoMessage()    {}
+func (*PolicyViolationKey) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{0}
+}
+
+func (m *PolicyViolationKey) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyViolationKey.Unmarshal(m, b)
+}
+func (m *PolicyViolationKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyViolationKey.Marshal(b, m, deterministic)
+}
+func (m *PolicyViolationKey) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyViolationKey.Merge(m, src)
+}
+func (m *PolicyViolationKey) XXX_Size() int {
+	return xxx_messageInfo_PolicyViolationKey.Size(m)
+}
+func (m *PolicyViolationKey) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyViolationKey.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyViolationKey proto.InternalMessageInfo
+
+func (m *PolicyViolationKey) GetPolicyName() *wrappers.StringValue {
+	if m != nil {
+		return m.PolicyName
+	}
+	return nil
+}
+
+func (m *PolicyViolationKey) GetViolatingText() *wrappers.StringValue {
+	if m != nil {
+		return m.ViolatingText
+	}
+	return nil
+}
+
+// Parameter for controlling how policy exemption is done. Ignorable policy
+// topics are only usable with expanded text ads and responsive search ads. All
+// other ad types must use policy violation keys.
+type PolicyValidationParameter struct {
+	// The list of policy topics that should not cause a PolicyFindingError to
+	// be reported. This field is currently only compatible with Enhanced Text Ad.
+	// It corresponds to the PolicyTopicEntry.topic field.
+	//
+	// Resources violating these policies will be saved, but will not be eligible
+	// to serve. They may begin serving at a later time due to a change in
+	// policies, re-review of the resource, or a change in advertiser
+	// certificates.
+	IgnorablePolicyTopics []*wrappers.StringValue `protobuf:"bytes,1,rep,name=ignorable_policy_topics,json=ignorablePolicyTopics,proto3" json:"ignorable_policy_topics,omitempty"`
+	// The list of policy violation keys that should not cause a
+	// PolicyViolationError to be reported. Not all policy violations are
+	// exemptable, please refer to the is_exemptible field in the returned
+	// PolicyViolationError.
+	//
+	// Resources violating these polices will be saved, but will not be eligible
+	// to serve. They may begin serving at a later time due to a change in
+	// policies, re-review of the resource, or a change in advertiser
+	// certificates.
+	ExemptPolicyViolationKeys []*PolicyViolationKey `protobuf:"bytes,2,rep,name=exempt_policy_violation_keys,json=exemptPolicyViolationKeys,proto3" json:"exempt_policy_violation_keys,omitempty"`
+	XXX_NoUnkeyedLiteral      struct{}              `json:"-"`
+	XXX_unrecognized          []byte                `json:"-"`
+	XXX_sizecache             int32                 `json:"-"`
+}
+
+func (m *PolicyValidationParameter) Reset()         { *m = PolicyValidationParameter{} }
+func (m *PolicyValidationParameter) String() string { return proto.CompactTextString(m) }
+func (*PolicyValidationParameter) ProtoMessage()    {}
+func (*PolicyValidationParameter) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{1}
+}
+
+func (m *PolicyValidationParameter) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyValidationParameter.Unmarshal(m, b)
+}
+func (m *PolicyValidationParameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyValidationParameter.Marshal(b, m, deterministic)
+}
+func (m *PolicyValidationParameter) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyValidationParameter.Merge(m, src)
+}
+func (m *PolicyValidationParameter) XXX_Size() int {
+	return xxx_messageInfo_PolicyValidationParameter.Size(m)
+}
+func (m *PolicyValidationParameter) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyValidationParameter.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyValidationParameter proto.InternalMessageInfo
+
+func (m *PolicyValidationParameter) GetIgnorablePolicyTopics() []*wrappers.StringValue {
+	if m != nil {
+		return m.IgnorablePolicyTopics
+	}
+	return nil
+}
+
+func (m *PolicyValidationParameter) GetExemptPolicyViolationKeys() []*PolicyViolationKey {
+	if m != nil {
+		return m.ExemptPolicyViolationKeys
+	}
+	return nil
+}
+
+// Policy finding attached to a resource (e.g. alcohol policy associated with
+// a site that sells alcohol).
+//
+// Each PolicyTopicEntry has a topic that indicates the specific ads policy
+// the entry is about and a type to indicate the effect that the entry will have
+// on serving. It may optionally have one or more evidences that indicate the
+// reason for the finding. It may also optionally have one or more constraints
+// that provide details about how serving may be restricted.
+type PolicyTopicEntry struct {
+	// Policy topic this finding refers to. For example, "ALCOHOL",
+	// "TRADEMARKS_IN_AD_TEXT", or "DESTINATION_NOT_WORKING". The set of possible
+	// policy topics is not fixed for a particular API version and may change
+	// at any time.
+	Topic *wrappers.StringValue `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"`
+	// Describes the negative or positive effect this policy will have on serving.
+	Type enums.PolicyTopicEntryTypeEnum_PolicyTopicEntryType `protobuf:"varint,2,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.PolicyTopicEntryTypeEnum_PolicyTopicEntryType" json:"type,omitempty"`
+	// Additional information that explains policy finding
+	// (e.g. the brand name for a trademark finding).
+	Evidences []*PolicyTopicEvidence `protobuf:"bytes,3,rep,name=evidences,proto3" json:"evidences,omitempty"`
+	// Indicates how serving of this resource may be affected (e.g. not serving
+	// in a country).
+	Constraints          []*PolicyTopicConstraint `protobuf:"bytes,4,rep,name=constraints,proto3" json:"constraints,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *PolicyTopicEntry) Reset()         { *m = PolicyTopicEntry{} }
+func (m *PolicyTopicEntry) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicEntry) ProtoMessage()    {}
+func (*PolicyTopicEntry) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{2}
+}
+
+func (m *PolicyTopicEntry) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEntry.Unmarshal(m, b)
+}
+func (m *PolicyTopicEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEntry.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEntry) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEntry.Merge(m, src)
+}
+func (m *PolicyTopicEntry) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEntry.Size(m)
+}
+func (m *PolicyTopicEntry) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEntry.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEntry proto.InternalMessageInfo
+
+func (m *PolicyTopicEntry) GetTopic() *wrappers.StringValue {
+	if m != nil {
+		return m.Topic
+	}
+	return nil
+}
+
+func (m *PolicyTopicEntry) GetType() enums.PolicyTopicEntryTypeEnum_PolicyTopicEntryType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.PolicyTopicEntryTypeEnum_UNSPECIFIED
+}
+
+func (m *PolicyTopicEntry) GetEvidences() []*PolicyTopicEvidence {
+	if m != nil {
+		return m.Evidences
+	}
+	return nil
+}
+
+func (m *PolicyTopicEntry) GetConstraints() []*PolicyTopicConstraint {
+	if m != nil {
+		return m.Constraints
+	}
+	return nil
+}
+
+// Additional information that explains a policy finding.
+type PolicyTopicEvidence struct {
+	// Specific evidence information depending on the evidence type.
+	//
+	// Types that are valid to be assigned to Value:
+	//	*PolicyTopicEvidence_WebsiteList_
+	//	*PolicyTopicEvidence_TextList_
+	//	*PolicyTopicEvidence_LanguageCode
+	//	*PolicyTopicEvidence_DestinationTextList_
+	//	*PolicyTopicEvidence_DestinationMismatch_
+	//	*PolicyTopicEvidence_DestinationNotWorking_
+	Value                isPolicyTopicEvidence_Value `protobuf_oneof:"value"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *PolicyTopicEvidence) Reset()         { *m = PolicyTopicEvidence{} }
+func (m *PolicyTopicEvidence) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicEvidence) ProtoMessage()    {}
+func (*PolicyTopicEvidence) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{3}
+}
+
+func (m *PolicyTopicEvidence) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEvidence.Unmarshal(m, b)
+}
+func (m *PolicyTopicEvidence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEvidence.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEvidence) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEvidence.Merge(m, src)
+}
+func (m *PolicyTopicEvidence) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEvidence.Size(m)
+}
+func (m *PolicyTopicEvidence) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEvidence.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEvidence proto.InternalMessageInfo
+
+type isPolicyTopicEvidence_Value interface {
+	isPolicyTopicEvidence_Value()
+}
+
+type PolicyTopicEvidence_WebsiteList_ struct {
+	WebsiteList *PolicyTopicEvidence_WebsiteList `protobuf:"bytes,3,opt,name=website_list,json=websiteList,proto3,oneof"`
+}
+
+type PolicyTopicEvidence_TextList_ struct {
+	TextList *PolicyTopicEvidence_TextList `protobuf:"bytes,4,opt,name=text_list,json=textList,proto3,oneof"`
+}
+
+type PolicyTopicEvidence_LanguageCode struct {
+	LanguageCode *wrappers.StringValue `protobuf:"bytes,5,opt,name=language_code,json=languageCode,proto3,oneof"`
+}
+
+type PolicyTopicEvidence_DestinationTextList_ struct {
+	DestinationTextList *PolicyTopicEvidence_DestinationTextList `protobuf:"bytes,6,opt,name=destination_text_list,json=destinationTextList,proto3,oneof"`
+}
+
+type PolicyTopicEvidence_DestinationMismatch_ struct {
+	DestinationMismatch *PolicyTopicEvidence_DestinationMismatch `protobuf:"bytes,7,opt,name=destination_mismatch,json=destinationMismatch,proto3,oneof"`
+}
+
+type PolicyTopicEvidence_DestinationNotWorking_ struct {
+	DestinationNotWorking *PolicyTopicEvidence_DestinationNotWorking `protobuf:"bytes,8,opt,name=destination_not_working,json=destinationNotWorking,proto3,oneof"`
+}
+
+func (*PolicyTopicEvidence_WebsiteList_) isPolicyTopicEvidence_Value() {}
+
+func (*PolicyTopicEvidence_TextList_) isPolicyTopicEvidence_Value() {}
+
+func (*PolicyTopicEvidence_LanguageCode) isPolicyTopicEvidence_Value() {}
+
+func (*PolicyTopicEvidence_DestinationTextList_) isPolicyTopicEvidence_Value() {}
+
+func (*PolicyTopicEvidence_DestinationMismatch_) isPolicyTopicEvidence_Value() {}
+
+func (*PolicyTopicEvidence_DestinationNotWorking_) isPolicyTopicEvidence_Value() {}
+
+func (m *PolicyTopicEvidence) GetValue() isPolicyTopicEvidence_Value {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *PolicyTopicEvidence) GetWebsiteList() *PolicyTopicEvidence_WebsiteList {
+	if x, ok := m.GetValue().(*PolicyTopicEvidence_WebsiteList_); ok {
+		return x.WebsiteList
+	}
+	return nil
+}
+
+func (m *PolicyTopicEvidence) GetTextList() *PolicyTopicEvidence_TextList {
+	if x, ok := m.GetValue().(*PolicyTopicEvidence_TextList_); ok {
+		return x.TextList
+	}
+	return nil
+}
+
+func (m *PolicyTopicEvidence) GetLanguageCode() *wrappers.StringValue {
+	if x, ok := m.GetValue().(*PolicyTopicEvidence_LanguageCode); ok {
+		return x.LanguageCode
+	}
+	return nil
+}
+
+func (m *PolicyTopicEvidence) GetDestinationTextList() *PolicyTopicEvidence_DestinationTextList {
+	if x, ok := m.GetValue().(*PolicyTopicEvidence_DestinationTextList_); ok {
+		return x.DestinationTextList
+	}
+	return nil
+}
+
+func (m *PolicyTopicEvidence) GetDestinationMismatch() *PolicyTopicEvidence_DestinationMismatch {
+	if x, ok := m.GetValue().(*PolicyTopicEvidence_DestinationMismatch_); ok {
+		return x.DestinationMismatch
+	}
+	return nil
+}
+
+func (m *PolicyTopicEvidence) GetDestinationNotWorking() *PolicyTopicEvidence_DestinationNotWorking {
+	if x, ok := m.GetValue().(*PolicyTopicEvidence_DestinationNotWorking_); ok {
+		return x.DestinationNotWorking
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*PolicyTopicEvidence) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*PolicyTopicEvidence_WebsiteList_)(nil),
+		(*PolicyTopicEvidence_TextList_)(nil),
+		(*PolicyTopicEvidence_LanguageCode)(nil),
+		(*PolicyTopicEvidence_DestinationTextList_)(nil),
+		(*PolicyTopicEvidence_DestinationMismatch_)(nil),
+		(*PolicyTopicEvidence_DestinationNotWorking_)(nil),
+	}
+}
+
+// A list of fragments of text that violated a policy.
+type PolicyTopicEvidence_TextList struct {
+	// The fragments of text from the resource that caused the policy finding.
+	Texts                []*wrappers.StringValue `protobuf:"bytes,1,rep,name=texts,proto3" json:"texts,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *PolicyTopicEvidence_TextList) Reset()         { *m = PolicyTopicEvidence_TextList{} }
+func (m *PolicyTopicEvidence_TextList) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicEvidence_TextList) ProtoMessage()    {}
+func (*PolicyTopicEvidence_TextList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{3, 0}
+}
+
+func (m *PolicyTopicEvidence_TextList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEvidence_TextList.Unmarshal(m, b)
+}
+func (m *PolicyTopicEvidence_TextList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEvidence_TextList.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEvidence_TextList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEvidence_TextList.Merge(m, src)
+}
+func (m *PolicyTopicEvidence_TextList) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEvidence_TextList.Size(m)
+}
+func (m *PolicyTopicEvidence_TextList) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEvidence_TextList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEvidence_TextList proto.InternalMessageInfo
+
+func (m *PolicyTopicEvidence_TextList) GetTexts() []*wrappers.StringValue {
+	if m != nil {
+		return m.Texts
+	}
+	return nil
+}
+
+// A list of websites that caused a policy finding. Used for
+// ONE_WEBSITE_PER_AD_GROUP policy topic, for example. In case there are more
+// than five websites, only the top five (those that appear in resources the
+// most) will be listed here.
+type PolicyTopicEvidence_WebsiteList struct {
+	// Websites that caused the policy finding.
+	Websites             []*wrappers.StringValue `protobuf:"bytes,1,rep,name=websites,proto3" json:"websites,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *PolicyTopicEvidence_WebsiteList) Reset()         { *m = PolicyTopicEvidence_WebsiteList{} }
+func (m *PolicyTopicEvidence_WebsiteList) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicEvidence_WebsiteList) ProtoMessage()    {}
+func (*PolicyTopicEvidence_WebsiteList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{3, 1}
+}
+
+func (m *PolicyTopicEvidence_WebsiteList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEvidence_WebsiteList.Unmarshal(m, b)
+}
+func (m *PolicyTopicEvidence_WebsiteList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEvidence_WebsiteList.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEvidence_WebsiteList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEvidence_WebsiteList.Merge(m, src)
+}
+func (m *PolicyTopicEvidence_WebsiteList) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEvidence_WebsiteList.Size(m)
+}
+func (m *PolicyTopicEvidence_WebsiteList) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEvidence_WebsiteList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEvidence_WebsiteList proto.InternalMessageInfo
+
+func (m *PolicyTopicEvidence_WebsiteList) GetWebsites() []*wrappers.StringValue {
+	if m != nil {
+		return m.Websites
+	}
+	return nil
+}
+
+// A list of strings found in a destination page that caused a policy
+// finding.
+type PolicyTopicEvidence_DestinationTextList struct {
+	// List of text found in the resource's destination page.
+	DestinationTexts     []*wrappers.StringValue `protobuf:"bytes,1,rep,name=destination_texts,json=destinationTexts,proto3" json:"destination_texts,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *PolicyTopicEvidence_DestinationTextList) Reset() {
+	*m = PolicyTopicEvidence_DestinationTextList{}
+}
+func (m *PolicyTopicEvidence_DestinationTextList) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicEvidence_DestinationTextList) ProtoMessage()    {}
+func (*PolicyTopicEvidence_DestinationTextList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{3, 2}
+}
+
+func (m *PolicyTopicEvidence_DestinationTextList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEvidence_DestinationTextList.Unmarshal(m, b)
+}
+func (m *PolicyTopicEvidence_DestinationTextList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEvidence_DestinationTextList.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEvidence_DestinationTextList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEvidence_DestinationTextList.Merge(m, src)
+}
+func (m *PolicyTopicEvidence_DestinationTextList) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEvidence_DestinationTextList.Size(m)
+}
+func (m *PolicyTopicEvidence_DestinationTextList) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEvidence_DestinationTextList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEvidence_DestinationTextList proto.InternalMessageInfo
+
+func (m *PolicyTopicEvidence_DestinationTextList) GetDestinationTexts() []*wrappers.StringValue {
+	if m != nil {
+		return m.DestinationTexts
+	}
+	return nil
+}
+
+// Evidence of mismatches between the URLs of a resource.
+type PolicyTopicEvidence_DestinationMismatch struct {
+	// The set of URLs that did not match each other.
+	UrlTypes             []enums.PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType `protobuf:"varint,1,rep,packed,name=url_types,json=urlTypes,proto3,enum=google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType" json:"url_types,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                                                                `json:"-"`
+	XXX_unrecognized     []byte                                                                                                  `json:"-"`
+	XXX_sizecache        int32                                                                                                   `json:"-"`
+}
+
+func (m *PolicyTopicEvidence_DestinationMismatch) Reset() {
+	*m = PolicyTopicEvidence_DestinationMismatch{}
+}
+func (m *PolicyTopicEvidence_DestinationMismatch) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicEvidence_DestinationMismatch) ProtoMessage()    {}
+func (*PolicyTopicEvidence_DestinationMismatch) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{3, 3}
+}
+
+func (m *PolicyTopicEvidence_DestinationMismatch) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEvidence_DestinationMismatch.Unmarshal(m, b)
+}
+func (m *PolicyTopicEvidence_DestinationMismatch) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEvidence_DestinationMismatch.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEvidence_DestinationMismatch) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEvidence_DestinationMismatch.Merge(m, src)
+}
+func (m *PolicyTopicEvidence_DestinationMismatch) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEvidence_DestinationMismatch.Size(m)
+}
+func (m *PolicyTopicEvidence_DestinationMismatch) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEvidence_DestinationMismatch.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEvidence_DestinationMismatch proto.InternalMessageInfo
+
+func (m *PolicyTopicEvidence_DestinationMismatch) GetUrlTypes() []enums.PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType {
+	if m != nil {
+		return m.UrlTypes
+	}
+	return nil
+}
+
+// Evidence details when the destination is returning an HTTP error
+// code or isn't functional in all locations for commonly used devices.
+type PolicyTopicEvidence_DestinationNotWorking struct {
+	// The full URL that didn't work.
+	ExpandedUrl *wrappers.StringValue `protobuf:"bytes,3,opt,name=expanded_url,json=expandedUrl,proto3" json:"expanded_url,omitempty"`
+	// The type of device that failed to load the URL.
+	Device enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice `protobuf:"varint,4,opt,name=device,proto3,enum=google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice" json:"device,omitempty"`
+	// The time the URL was last checked.
+	// The format is "YYYY-MM-DD HH:MM:SS".
+	// Examples: "2018-03-05 09:15:00" or "2018-02-01 14:34:30"
+	LastCheckedDateTime *wrappers.StringValue `protobuf:"bytes,5,opt,name=last_checked_date_time,json=lastCheckedDateTime,proto3" json:"last_checked_date_time,omitempty"`
+	// Indicates the reason of the DESTINATION_NOT_WORKING policy finding.
+	//
+	// Types that are valid to be assigned to Reason:
+	//	*PolicyTopicEvidence_DestinationNotWorking_DnsErrorType
+	//	*PolicyTopicEvidence_DestinationNotWorking_HttpErrorCode
+	Reason               isPolicyTopicEvidence_DestinationNotWorking_Reason `protobuf_oneof:"reason"`
+	XXX_NoUnkeyedLiteral struct{}                                           `json:"-"`
+	XXX_unrecognized     []byte                                             `json:"-"`
+	XXX_sizecache        int32                                              `json:"-"`
+}
+
+func (m *PolicyTopicEvidence_DestinationNotWorking) Reset() {
+	*m = PolicyTopicEvidence_DestinationNotWorking{}
+}
+func (m *PolicyTopicEvidence_DestinationNotWorking) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicEvidence_DestinationNotWorking) ProtoMessage()    {}
+func (*PolicyTopicEvidence_DestinationNotWorking) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{3, 4}
+}
+
+func (m *PolicyTopicEvidence_DestinationNotWorking) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEvidence_DestinationNotWorking.Unmarshal(m, b)
+}
+func (m *PolicyTopicEvidence_DestinationNotWorking) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEvidence_DestinationNotWorking.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEvidence_DestinationNotWorking) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEvidence_DestinationNotWorking.Merge(m, src)
+}
+func (m *PolicyTopicEvidence_DestinationNotWorking) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEvidence_DestinationNotWorking.Size(m)
+}
+func (m *PolicyTopicEvidence_DestinationNotWorking) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEvidence_DestinationNotWorking.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEvidence_DestinationNotWorking proto.InternalMessageInfo
+
+func (m *PolicyTopicEvidence_DestinationNotWorking) GetExpandedUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.ExpandedUrl
+	}
+	return nil
+}
+
+func (m *PolicyTopicEvidence_DestinationNotWorking) GetDevice() enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice {
+	if m != nil {
+		return m.Device
+	}
+	return enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_UNSPECIFIED
+}
+
+func (m *PolicyTopicEvidence_DestinationNotWorking) GetLastCheckedDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.LastCheckedDateTime
+	}
+	return nil
+}
+
+type isPolicyTopicEvidence_DestinationNotWorking_Reason interface {
+	isPolicyTopicEvidence_DestinationNotWorking_Reason()
+}
+
+type PolicyTopicEvidence_DestinationNotWorking_DnsErrorType struct {
+	DnsErrorType enums.PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType `protobuf:"varint,1,opt,name=dns_error_type,json=dnsErrorType,proto3,enum=google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType,oneof"`
+}
+
+type PolicyTopicEvidence_DestinationNotWorking_HttpErrorCode struct {
+	HttpErrorCode *wrappers.Int64Value `protobuf:"bytes,2,opt,name=http_error_code,json=httpErrorCode,proto3,oneof"`
+}
+
+func (*PolicyTopicEvidence_DestinationNotWorking_DnsErrorType) isPolicyTopicEvidence_DestinationNotWorking_Reason() {
+}
+
+func (*PolicyTopicEvidence_DestinationNotWorking_HttpErrorCode) isPolicyTopicEvidence_DestinationNotWorking_Reason() {
+}
+
+func (m *PolicyTopicEvidence_DestinationNotWorking) GetReason() isPolicyTopicEvidence_DestinationNotWorking_Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return nil
+}
+
+func (m *PolicyTopicEvidence_DestinationNotWorking) GetDnsErrorType() enums.PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType {
+	if x, ok := m.GetReason().(*PolicyTopicEvidence_DestinationNotWorking_DnsErrorType); ok {
+		return x.DnsErrorType
+	}
+	return enums.PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_UNSPECIFIED
+}
+
+func (m *PolicyTopicEvidence_DestinationNotWorking) GetHttpErrorCode() *wrappers.Int64Value {
+	if x, ok := m.GetReason().(*PolicyTopicEvidence_DestinationNotWorking_HttpErrorCode); ok {
+		return x.HttpErrorCode
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*PolicyTopicEvidence_DestinationNotWorking) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*PolicyTopicEvidence_DestinationNotWorking_DnsErrorType)(nil),
+		(*PolicyTopicEvidence_DestinationNotWorking_HttpErrorCode)(nil),
+	}
+}
+
+// Describes the effect on serving that a policy topic entry will have.
+type PolicyTopicConstraint struct {
+	// Specific information about the constraint.
+	//
+	// Types that are valid to be assigned to Value:
+	//	*PolicyTopicConstraint_CountryConstraintList_
+	//	*PolicyTopicConstraint_ResellerConstraint_
+	//	*PolicyTopicConstraint_CertificateMissingInCountryList
+	//	*PolicyTopicConstraint_CertificateDomainMismatchInCountryList
+	Value                isPolicyTopicConstraint_Value `protobuf_oneof:"value"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *PolicyTopicConstraint) Reset()         { *m = PolicyTopicConstraint{} }
+func (m *PolicyTopicConstraint) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicConstraint) ProtoMessage()    {}
+func (*PolicyTopicConstraint) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{4}
+}
+
+func (m *PolicyTopicConstraint) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicConstraint.Unmarshal(m, b)
+}
+func (m *PolicyTopicConstraint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicConstraint.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicConstraint) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicConstraint.Merge(m, src)
+}
+func (m *PolicyTopicConstraint) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicConstraint.Size(m)
+}
+func (m *PolicyTopicConstraint) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicConstraint.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicConstraint proto.InternalMessageInfo
+
+type isPolicyTopicConstraint_Value interface {
+	isPolicyTopicConstraint_Value()
+}
+
+type PolicyTopicConstraint_CountryConstraintList_ struct {
+	CountryConstraintList *PolicyTopicConstraint_CountryConstraintList `protobuf:"bytes,1,opt,name=country_constraint_list,json=countryConstraintList,proto3,oneof"`
+}
+
+type PolicyTopicConstraint_ResellerConstraint_ struct {
+	ResellerConstraint *PolicyTopicConstraint_ResellerConstraint `protobuf:"bytes,2,opt,name=reseller_constraint,json=resellerConstraint,proto3,oneof"`
+}
+
+type PolicyTopicConstraint_CertificateMissingInCountryList struct {
+	CertificateMissingInCountryList *PolicyTopicConstraint_CountryConstraintList `protobuf:"bytes,3,opt,name=certificate_missing_in_country_list,json=certificateMissingInCountryList,proto3,oneof"`
+}
+
+type PolicyTopicConstraint_CertificateDomainMismatchInCountryList struct {
+	CertificateDomainMismatchInCountryList *PolicyTopicConstraint_CountryConstraintList `protobuf:"bytes,4,opt,name=certificate_domain_mismatch_in_country_list,json=certificateDomainMismatchInCountryList,proto3,oneof"`
+}
+
+func (*PolicyTopicConstraint_CountryConstraintList_) isPolicyTopicConstraint_Value() {}
+
+func (*PolicyTopicConstraint_ResellerConstraint_) isPolicyTopicConstraint_Value() {}
+
+func (*PolicyTopicConstraint_CertificateMissingInCountryList) isPolicyTopicConstraint_Value() {}
+
+func (*PolicyTopicConstraint_CertificateDomainMismatchInCountryList) isPolicyTopicConstraint_Value() {}
+
+func (m *PolicyTopicConstraint) GetValue() isPolicyTopicConstraint_Value {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *PolicyTopicConstraint) GetCountryConstraintList() *PolicyTopicConstraint_CountryConstraintList {
+	if x, ok := m.GetValue().(*PolicyTopicConstraint_CountryConstraintList_); ok {
+		return x.CountryConstraintList
+	}
+	return nil
+}
+
+func (m *PolicyTopicConstraint) GetResellerConstraint() *PolicyTopicConstraint_ResellerConstraint {
+	if x, ok := m.GetValue().(*PolicyTopicConstraint_ResellerConstraint_); ok {
+		return x.ResellerConstraint
+	}
+	return nil
+}
+
+func (m *PolicyTopicConstraint) GetCertificateMissingInCountryList() *PolicyTopicConstraint_CountryConstraintList {
+	if x, ok := m.GetValue().(*PolicyTopicConstraint_CertificateMissingInCountryList); ok {
+		return x.CertificateMissingInCountryList
+	}
+	return nil
+}
+
+func (m *PolicyTopicConstraint) GetCertificateDomainMismatchInCountryList() *PolicyTopicConstraint_CountryConstraintList {
+	if x, ok := m.GetValue().(*PolicyTopicConstraint_CertificateDomainMismatchInCountryList); ok {
+		return x.CertificateDomainMismatchInCountryList
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*PolicyTopicConstraint) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*PolicyTopicConstraint_CountryConstraintList_)(nil),
+		(*PolicyTopicConstraint_ResellerConstraint_)(nil),
+		(*PolicyTopicConstraint_CertificateMissingInCountryList)(nil),
+		(*PolicyTopicConstraint_CertificateDomainMismatchInCountryList)(nil),
+	}
+}
+
+// A list of countries where a resource's serving is constrained.
+type PolicyTopicConstraint_CountryConstraintList struct {
+	// Total number of countries targeted by the resource.
+	TotalTargetedCountries *wrappers.Int32Value `protobuf:"bytes,1,opt,name=total_targeted_countries,json=totalTargetedCountries,proto3" json:"total_targeted_countries,omitempty"`
+	// Countries in which serving is restricted.
+	Countries            []*PolicyTopicConstraint_CountryConstraint `protobuf:"bytes,2,rep,name=countries,proto3" json:"countries,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
+	XXX_unrecognized     []byte                                     `json:"-"`
+	XXX_sizecache        int32                                      `json:"-"`
+}
+
+func (m *PolicyTopicConstraint_CountryConstraintList) Reset() {
+	*m = PolicyTopicConstraint_CountryConstraintList{}
+}
+func (m *PolicyTopicConstraint_CountryConstraintList) String() string {
+	return proto.CompactTextString(m)
+}
+func (*PolicyTopicConstraint_CountryConstraintList) ProtoMessage() {}
+func (*PolicyTopicConstraint_CountryConstraintList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{4, 0}
+}
+
+func (m *PolicyTopicConstraint_CountryConstraintList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicConstraint_CountryConstraintList.Unmarshal(m, b)
+}
+func (m *PolicyTopicConstraint_CountryConstraintList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicConstraint_CountryConstraintList.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicConstraint_CountryConstraintList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicConstraint_CountryConstraintList.Merge(m, src)
+}
+func (m *PolicyTopicConstraint_CountryConstraintList) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicConstraint_CountryConstraintList.Size(m)
+}
+func (m *PolicyTopicConstraint_CountryConstraintList) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicConstraint_CountryConstraintList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicConstraint_CountryConstraintList proto.InternalMessageInfo
+
+func (m *PolicyTopicConstraint_CountryConstraintList) GetTotalTargetedCountries() *wrappers.Int32Value {
+	if m != nil {
+		return m.TotalTargetedCountries
+	}
+	return nil
+}
+
+func (m *PolicyTopicConstraint_CountryConstraintList) GetCountries() []*PolicyTopicConstraint_CountryConstraint {
+	if m != nil {
+		return m.Countries
+	}
+	return nil
+}
+
+// Indicates that a policy topic was constrained due to disapproval of the
+// website for reseller purposes.
+type PolicyTopicConstraint_ResellerConstraint struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyTopicConstraint_ResellerConstraint) Reset() {
+	*m = PolicyTopicConstraint_ResellerConstraint{}
+}
+func (m *PolicyTopicConstraint_ResellerConstraint) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicConstraint_ResellerConstraint) ProtoMessage()    {}
+func (*PolicyTopicConstraint_ResellerConstraint) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{4, 1}
+}
+
+func (m *PolicyTopicConstraint_ResellerConstraint) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicConstraint_ResellerConstraint.Unmarshal(m, b)
+}
+func (m *PolicyTopicConstraint_ResellerConstraint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicConstraint_ResellerConstraint.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicConstraint_ResellerConstraint) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicConstraint_ResellerConstraint.Merge(m, src)
+}
+func (m *PolicyTopicConstraint_ResellerConstraint) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicConstraint_ResellerConstraint.Size(m)
+}
+func (m *PolicyTopicConstraint_ResellerConstraint) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicConstraint_ResellerConstraint.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicConstraint_ResellerConstraint proto.InternalMessageInfo
+
+// Indicates that a resource's ability to serve in a particular country is
+// constrained.
+type PolicyTopicConstraint_CountryConstraint struct {
+	// Geo target constant resource name of the country in which serving is
+	// constrained.
+	CountryCriterion     *wrappers.StringValue `protobuf:"bytes,1,opt,name=country_criterion,json=countryCriterion,proto3" json:"country_criterion,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *PolicyTopicConstraint_CountryConstraint) Reset() {
+	*m = PolicyTopicConstraint_CountryConstraint{}
+}
+func (m *PolicyTopicConstraint_CountryConstraint) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicConstraint_CountryConstraint) ProtoMessage()    {}
+func (*PolicyTopicConstraint_CountryConstraint) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f2474dd6f17cdcd0, []int{4, 2}
+}
+
+func (m *PolicyTopicConstraint_CountryConstraint) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicConstraint_CountryConstraint.Unmarshal(m, b)
+}
+func (m *PolicyTopicConstraint_CountryConstraint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicConstraint_CountryConstraint.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicConstraint_CountryConstraint) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicConstraint_CountryConstraint.Merge(m, src)
+}
+func (m *PolicyTopicConstraint_CountryConstraint) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicConstraint_CountryConstraint.Size(m)
+}
+func (m *PolicyTopicConstraint_CountryConstraint) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicConstraint_CountryConstraint.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicConstraint_CountryConstraint proto.InternalMessageInfo
+
+func (m *PolicyTopicConstraint_CountryConstraint) GetCountryCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCriterion
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*PolicyViolationKey)(nil), "google.ads.googleads.v3.common.PolicyViolationKey")
+	proto.RegisterType((*PolicyValidationParameter)(nil), "google.ads.googleads.v3.common.PolicyValidationParameter")
+	proto.RegisterType((*PolicyTopicEntry)(nil), "google.ads.googleads.v3.common.PolicyTopicEntry")
+	proto.RegisterType((*PolicyTopicEvidence)(nil), "google.ads.googleads.v3.common.PolicyTopicEvidence")
+	proto.RegisterType((*PolicyTopicEvidence_TextList)(nil), "google.ads.googleads.v3.common.PolicyTopicEvidence.TextList")
+	proto.RegisterType((*PolicyTopicEvidence_WebsiteList)(nil), "google.ads.googleads.v3.common.PolicyTopicEvidence.WebsiteList")
+	proto.RegisterType((*PolicyTopicEvidence_DestinationTextList)(nil), "google.ads.googleads.v3.common.PolicyTopicEvidence.DestinationTextList")
+	proto.RegisterType((*PolicyTopicEvidence_DestinationMismatch)(nil), "google.ads.googleads.v3.common.PolicyTopicEvidence.DestinationMismatch")
+	proto.RegisterType((*PolicyTopicEvidence_DestinationNotWorking)(nil), "google.ads.googleads.v3.common.PolicyTopicEvidence.DestinationNotWorking")
+	proto.RegisterType((*PolicyTopicConstraint)(nil), "google.ads.googleads.v3.common.PolicyTopicConstraint")
+	proto.RegisterType((*PolicyTopicConstraint_CountryConstraintList)(nil), "google.ads.googleads.v3.common.PolicyTopicConstraint.CountryConstraintList")
+	proto.RegisterType((*PolicyTopicConstraint_ResellerConstraint)(nil), "google.ads.googleads.v3.common.PolicyTopicConstraint.ResellerConstraint")
+	proto.RegisterType((*PolicyTopicConstraint_CountryConstraint)(nil), "google.ads.googleads.v3.common.PolicyTopicConstraint.CountryConstraint")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/policy.proto", fileDescriptor_f2474dd6f17cdcd0)
+}
+
+var fileDescriptor_f2474dd6f17cdcd0 = []byte{
+	// 1229 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x5d, 0x6f, 0x1b, 0x45,
+	0x17, 0xce, 0x3a, 0x69, 0xea, 0x8c, 0x1b, 0xbf, 0xed, 0xa4, 0x6e, 0x5d, 0xbf, 0x55, 0xa9, 0x8c,
+	0x84, 0x90, 0x2a, 0xad, 0x25, 0x1b, 0x10, 0x72, 0x81, 0x2a, 0x71, 0xa2, 0x24, 0xea, 0x87, 0xd2,
+	0xc5, 0x49, 0x10, 0x44, 0x6c, 0x26, 0xbb, 0xd3, 0xcd, 0x28, 0xbb, 0x33, 0xab, 0x99, 0xb1, 0x13,
+	0x8b, 0x0f, 0x21, 0x21, 0xee, 0xf8, 0x01, 0x20, 0xc4, 0x0d, 0x97, 0xbd, 0x45, 0xdc, 0xf2, 0x03,
+	0xb8, 0xe2, 0x02, 0xfe, 0x42, 0x2f, 0xf8, 0x15, 0x68, 0x67, 0x66, 0xed, 0x8d, 0xed, 0x34, 0xce,
+	0x07, 0x57, 0x1e, 0xcf, 0x9c, 0xe7, 0x39, 0xcf, 0x9c, 0x39, 0x73, 0xe6, 0x2c, 0x78, 0x10, 0x30,
+	0x16, 0x84, 0xb8, 0x86, 0x7c, 0x51, 0xd3, 0xc3, 0x64, 0xd4, 0x6d, 0xd4, 0x3c, 0x16, 0x45, 0x8c,
+	0xd6, 0x62, 0x16, 0x12, 0xaf, 0x67, 0xc7, 0x9c, 0x49, 0x06, 0xef, 0x69, 0x0b, 0x1b, 0xf9, 0xc2,
+	0xee, 0x1b, 0xdb, 0xdd, 0x86, 0xad, 0x8d, 0x2b, 0x0f, 0x4f, 0x22, 0xc3, 0xb4, 0x13, 0x09, 0xc3,
+	0xe5, 0x4a, 0x16, 0x13, 0xcf, 0xc5, 0x54, 0xf2, 0x9e, 0x2b, 0x7b, 0x31, 0xd6, 0xe4, 0x95, 0xed,
+	0xb3, 0x80, 0xbb, 0xc4, 0xc7, 0xd4, 0xc3, 0xae, 0x8f, 0x85, 0x24, 0x14, 0x49, 0xc2, 0xa8, 0x1b,
+	0x11, 0x11, 0x21, 0xe9, 0xed, 0xbb, 0x1d, 0x1e, 0x66, 0x89, 0x3f, 0xb9, 0x28, 0x31, 0x65, 0xd2,
+	0x3d, 0x64, 0xfc, 0x80, 0xd0, 0xc0, 0xf5, 0x71, 0x97, 0x78, 0x29, 0xf3, 0xee, 0xa5, 0x32, 0x53,
+	0xe1, 0x62, 0xce, 0x19, 0xcf, 0x6a, 0x37, 0x11, 0xaf, 0xa9, 0x7f, 0x7b, 0x9d, 0x17, 0xb5, 0x43,
+	0x8e, 0xe2, 0x18, 0x73, 0x61, 0xd6, 0xef, 0xa6, 0x0a, 0x62, 0x52, 0x43, 0x94, 0x32, 0xa9, 0x78,
+	0xcd, 0x6a, 0xf5, 0x07, 0x0b, 0xc0, 0x0d, 0x25, 0x62, 0x8b, 0xb0, 0x50, 0x2d, 0x3d, 0xc6, 0x3d,
+	0xf8, 0x21, 0x28, 0x18, 0x69, 0x14, 0x45, 0xb8, 0x6c, 0xdd, 0xb7, 0xde, 0x2e, 0xd4, 0xef, 0x9a,
+	0x13, 0xb5, 0x53, 0x57, 0xf6, 0xc7, 0x92, 0x13, 0x1a, 0x6c, 0xa1, 0xb0, 0x83, 0x1d, 0xa0, 0x01,
+	0xcf, 0x50, 0x84, 0x61, 0x0b, 0x14, 0xbb, 0x9a, 0x8e, 0x06, 0xae, 0xc4, 0x47, 0xb2, 0x9c, 0x9b,
+	0x80, 0x61, 0xbe, 0x8f, 0x69, 0xe3, 0x23, 0x59, 0x7d, 0x65, 0x81, 0x3b, 0x46, 0x1a, 0x0a, 0x89,
+	0xaf, 0xb4, 0x6d, 0x20, 0x8e, 0x22, 0x2c, 0x31, 0x87, 0x6d, 0x70, 0x9b, 0x04, 0x94, 0x71, 0xb4,
+	0x17, 0x62, 0x37, 0x1b, 0x46, 0x51, 0xb6, 0xee, 0x4f, 0x9f, 0xea, 0xab, 0xd4, 0x07, 0x6b, 0x17,
+	0x6d, 0x05, 0x85, 0x02, 0xdc, 0xc5, 0x47, 0x38, 0x8a, 0x65, 0x4a, 0xd9, 0x4d, 0xa3, 0xe2, 0x1e,
+	0xe0, 0x9e, 0x28, 0xe7, 0x14, 0x75, 0xdd, 0x7e, 0x7d, 0x96, 0xdb, 0xa3, 0x11, 0x75, 0xee, 0x68,
+	0xde, 0xd1, 0x15, 0x51, 0xfd, 0x2b, 0x07, 0xae, 0x67, 0x54, 0xac, 0x24, 0x69, 0x0f, 0xeb, 0xe0,
+	0x8a, 0xda, 0xce, 0x44, 0xb1, 0xd7, 0xa6, 0x70, 0x17, 0xcc, 0x24, 0x89, 0xa1, 0x82, 0x5d, 0xac,
+	0x3f, 0x39, 0x51, 0xa5, 0xca, 0x3d, 0x7b, 0xd8, 0x65, 0xbb, 0x17, 0xe3, 0x15, 0xda, 0x89, 0xc6,
+	0x2e, 0x38, 0x8a, 0x19, 0x3e, 0x07, 0x73, 0x69, 0x96, 0x8a, 0xf2, 0xb4, 0x0a, 0x46, 0x63, 0xb2,
+	0x60, 0x68, 0x3a, 0x83, 0x75, 0x06, 0x2c, 0x70, 0x1b, 0x14, 0x3c, 0x46, 0x85, 0xe4, 0x88, 0x50,
+	0x29, 0xca, 0x33, 0x8a, 0xf4, 0xdd, 0x33, 0x90, 0xb6, 0xfa, 0x68, 0x27, 0xcb, 0x54, 0xfd, 0x79,
+	0x1e, 0x2c, 0x8c, 0xf1, 0x0d, 0x7d, 0x70, 0xed, 0x10, 0xef, 0x09, 0x22, 0xb1, 0x1b, 0x12, 0x21,
+	0xcb, 0xd3, 0x2a, 0xc0, 0x8f, 0xce, 0xb1, 0x0d, 0x7b, 0x5b, 0xf3, 0x3c, 0x21, 0x42, 0xae, 0x4d,
+	0x39, 0x85, 0xc3, 0xc1, 0x5f, 0xf8, 0x19, 0x98, 0x4b, 0x12, 0x5f, 0xbb, 0x98, 0x51, 0x2e, 0x3e,
+	0x38, 0x8f, 0x8b, 0xe4, 0x2a, 0x18, 0xfe, 0xbc, 0x34, 0x63, 0xd8, 0x02, 0xf3, 0x21, 0xa2, 0x41,
+	0x07, 0x05, 0xd8, 0xf5, 0x98, 0x8f, 0xcb, 0x57, 0x4e, 0x4f, 0x92, 0xb5, 0x29, 0xe7, 0x5a, 0x0a,
+	0x6a, 0x31, 0x1f, 0xc3, 0xaf, 0x40, 0x29, 0x5b, 0x68, 0x06, 0x6a, 0x67, 0x15, 0xd9, 0xea, 0x79,
+	0xd4, 0x2e, 0x0f, 0x08, 0x33, 0xc2, 0x17, 0xfc, 0xd1, 0x69, 0xf8, 0x25, 0xb8, 0x39, 0xae, 0x34,
+	0x97, 0xaf, 0x5e, 0x8a, 0xf7, 0xa7, 0x86, 0x6e, 0xc8, 0x7b, 0x3a, 0x0d, 0xbf, 0xb5, 0xc0, 0xed,
+	0x13, 0xca, 0x6c, 0x39, 0xaf, 0x14, 0xac, 0x5f, 0x50, 0xc1, 0x33, 0x26, 0xb7, 0x35, 0xe1, 0xda,
+	0x94, 0x93, 0x8d, 0xf4, 0x60, 0xa1, 0xf2, 0x11, 0xc8, 0xf7, 0xe3, 0x91, 0x5c, 0x78, 0x7c, 0x24,
+	0x27, 0x2b, 0x5f, 0xda, 0xb4, 0xb2, 0x0a, 0x0a, 0x99, 0x14, 0x84, 0xef, 0x83, 0xbc, 0x49, 0xc1,
+	0xc9, 0x58, 0xfa, 0xd6, 0x95, 0x5d, 0xb0, 0x30, 0xe6, 0xe8, 0xe0, 0x3a, 0xb8, 0x31, 0x9c, 0x22,
+	0x93, 0x31, 0x5f, 0x1f, 0x3a, 0x71, 0x51, 0xf9, 0xd5, 0x3a, 0xe6, 0xa2, 0x7f, 0x10, 0x3f, 0x59,
+	0x60, 0x2e, 0x7d, 0x8d, 0x35, 0x77, 0xb1, 0xfe, 0xf5, 0x19, 0x2a, 0x97, 0x89, 0xfc, 0x18, 0xea,
+	0x4d, 0x1e, 0x8e, 0x2d, 0x69, 0xa7, 0x22, 0x9c, 0x7c, 0x47, 0x0f, 0x44, 0xe5, 0xcf, 0x19, 0x50,
+	0x1a, 0x7b, 0xa6, 0xf0, 0x11, 0xb8, 0x86, 0x8f, 0x62, 0x44, 0x7d, 0xec, 0x27, 0xdd, 0x84, 0xa9,
+	0x22, 0xaf, 0x8f, 0x4a, 0x21, 0x45, 0x6c, 0xf2, 0x10, 0xfe, 0x68, 0x81, 0x59, 0xdd, 0x2a, 0xa8,
+	0xf2, 0x50, 0xac, 0x7f, 0x63, 0x5d, 0x68, 0xdb, 0x03, 0x6d, 0xcb, 0x8a, 0x75, 0x82, 0x7d, 0x0f,
+	0x43, 0x1c, 0x23, 0x08, 0x3e, 0x07, 0xb7, 0x42, 0x24, 0xa4, 0xeb, 0xed, 0x63, 0xef, 0x00, 0xfb,
+	0xae, 0x8f, 0x24, 0x76, 0x25, 0x89, 0x26, 0x2a, 0x34, 0xce, 0x42, 0x82, 0x6d, 0x69, 0xe8, 0x32,
+	0x92, 0xb8, 0x4d, 0x22, 0x0c, 0x7f, 0xb3, 0x40, 0xf1, 0x78, 0xff, 0xa2, 0x5e, 0xb6, 0x62, 0xfd,
+	0xfb, 0x4b, 0xdb, 0x36, 0x15, 0x2b, 0x09, 0xf9, 0x84, 0x87, 0x3e, 0x1e, 0x98, 0x54, 0x49, 0x3f,
+	0xf3, 0x1f, 0xae, 0x80, 0xff, 0xed, 0x4b, 0x19, 0x1b, 0xdd, 0xaa, 0xd8, 0xea, 0x5e, 0xe6, 0xff,
+	0x23, 0x31, 0x58, 0xa7, 0xf2, 0xbd, 0x77, 0xd2, 0x5a, 0x3b, 0x9f, 0xa0, 0x14, 0x4d, 0x52, 0x6c,
+	0x97, 0xf2, 0x60, 0x96, 0x63, 0x24, 0x18, 0x5d, 0xba, 0x0a, 0xae, 0x74, 0x13, 0x9b, 0xea, 0xef,
+	0x57, 0x41, 0x69, 0xec, 0x33, 0x06, 0xbf, 0xb3, 0xc0, 0x6d, 0x8f, 0x75, 0x54, 0xfb, 0x3b, 0x78,
+	0xd1, 0x74, 0x71, 0xd6, 0xed, 0xc0, 0xe3, 0x73, 0xbd, 0x8f, 0x76, 0x4b, 0x93, 0x0e, 0x66, 0x4c,
+	0x81, 0x2e, 0x79, 0xe3, 0x16, 0xe0, 0x17, 0x60, 0x81, 0x63, 0x81, 0xc3, 0x10, 0xf3, 0x8c, 0x0e,
+	0xb3, 0xff, 0xb5, 0xf3, 0x49, 0x70, 0x0c, 0xe1, 0x60, 0x6a, 0x6d, 0xca, 0x81, 0x7c, 0x64, 0x36,
+	0x29, 0x0c, 0x6f, 0x7a, 0x98, 0x4b, 0xf2, 0x82, 0x78, 0x49, 0xfa, 0x45, 0x44, 0x88, 0xa4, 0x9d,
+	0x24, 0xd4, 0x4d, 0x63, 0x93, 0x79, 0xbe, 0x2f, 0x39, 0x20, 0x6f, 0x64, 0x3c, 0x3f, 0xd5, 0x8e,
+	0xd7, 0xa9, 0x31, 0x56, 0xa1, 0x79, 0x69, 0x81, 0x07, 0x59, 0x75, 0x3e, 0x8b, 0x10, 0xc9, 0x7c,
+	0x60, 0x0c, 0xab, 0x9c, 0xf9, 0x2f, 0x54, 0xbe, 0x95, 0x51, 0xb0, 0xac, 0x04, 0xa4, 0x95, 0xec,
+	0x98, 0xd8, 0xca, 0xdf, 0x16, 0x28, 0x8d, 0xe5, 0x80, 0x9b, 0xa0, 0x2c, 0x99, 0x44, 0xa1, 0x2b,
+	0x11, 0x0f, 0xb0, 0xc4, 0xbe, 0x51, 0x4d, 0x54, 0x2d, 0x3e, 0x31, 0xcd, 0x1b, 0x75, 0x7d, 0xd3,
+	0x6f, 0x29, 0x70, 0xdb, 0x60, 0x5b, 0x29, 0x14, 0x62, 0x30, 0x37, 0xe0, 0xd1, 0x3d, 0xf3, 0xea,
+	0x25, 0x6d, 0xdd, 0x19, 0x30, 0x57, 0x6e, 0x02, 0x38, 0x9a, 0x4e, 0x95, 0xcf, 0xc1, 0x8d, 0x11,
+	0x54, 0xf2, 0x92, 0xf5, 0x6f, 0x14, 0x27, 0x12, 0x73, 0xc2, 0xe8, 0x44, 0xad, 0xf5, 0xf5, 0xf4,
+	0x6a, 0xa4, 0xa8, 0xfe, 0x05, 0x5e, 0x7a, 0x65, 0x81, 0xaa, 0xc7, 0xa2, 0x53, 0x36, 0xb6, 0x54,
+	0xd0, 0x3b, 0xdb, 0x48, 0xd8, 0x37, 0xac, 0x4f, 0x97, 0x8d, 0x79, 0xc0, 0x92, 0x6e, 0xcc, 0x66,
+	0x3c, 0xa8, 0x05, 0x98, 0x2a, 0xdf, 0xe9, 0x17, 0x62, 0x4c, 0xc4, 0x49, 0x5f, 0xdb, 0x0f, 0xf5,
+	0xcf, 0x2f, 0xb9, 0xe9, 0xd5, 0xc5, 0xc5, 0x97, 0xb9, 0x7b, 0xab, 0x9a, 0x6c, 0xd1, 0x17, 0xb6,
+	0x1e, 0x26, 0xa3, 0xad, 0x86, 0xdd, 0x52, 0x66, 0x7f, 0xa4, 0x06, 0x3b, 0x8b, 0xbe, 0xd8, 0xe9,
+	0x1b, 0xec, 0x6c, 0x35, 0x76, 0xb4, 0xc1, 0x3f, 0xb9, 0xaa, 0x9e, 0x6d, 0x36, 0x17, 0x7d, 0xd1,
+	0x6c, 0xf6, 0x4d, 0x9a, 0xcd, 0xad, 0x46, 0xb3, 0xa9, 0x8d, 0xf6, 0x66, 0x95, 0xba, 0xc6, 0xbf,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0xbd, 0xe6, 0xe1, 0x9d, 0x0a, 0x10, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/real_time_bidding_setting.pb.go b/googleapis/ads/googleads/v3/common/real_time_bidding_setting.pb.go
new file mode 100644
index 0000000..bee5a39
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/real_time_bidding_setting.pb.go
@@ -0,0 +1,97 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/real_time_bidding_setting.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Settings for Real-Time Bidding, a feature only available for campaigns
+// targeting the Ad Exchange network.
+type RealTimeBiddingSetting struct {
+	// Whether the campaign is opted in to real-time bidding.
+	OptIn                *wrappers.BoolValue `protobuf:"bytes,1,opt,name=opt_in,json=optIn,proto3" json:"opt_in,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *RealTimeBiddingSetting) Reset()         { *m = RealTimeBiddingSetting{} }
+func (m *RealTimeBiddingSetting) String() string { return proto.CompactTextString(m) }
+func (*RealTimeBiddingSetting) ProtoMessage()    {}
+func (*RealTimeBiddingSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_575472eed6650645, []int{0}
+}
+
+func (m *RealTimeBiddingSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RealTimeBiddingSetting.Unmarshal(m, b)
+}
+func (m *RealTimeBiddingSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RealTimeBiddingSetting.Marshal(b, m, deterministic)
+}
+func (m *RealTimeBiddingSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RealTimeBiddingSetting.Merge(m, src)
+}
+func (m *RealTimeBiddingSetting) XXX_Size() int {
+	return xxx_messageInfo_RealTimeBiddingSetting.Size(m)
+}
+func (m *RealTimeBiddingSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_RealTimeBiddingSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RealTimeBiddingSetting proto.InternalMessageInfo
+
+func (m *RealTimeBiddingSetting) GetOptIn() *wrappers.BoolValue {
+	if m != nil {
+		return m.OptIn
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*RealTimeBiddingSetting)(nil), "google.ads.googleads.v3.common.RealTimeBiddingSetting")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/real_time_bidding_setting.proto", fileDescriptor_575472eed6650645)
+}
+
+var fileDescriptor_575472eed6650645 = []byte{
+	// 303 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xec, 0x30,
+	0x14, 0x86, 0xe9, 0x5c, 0xee, 0x2c, 0xea, 0x6e, 0x16, 0x22, 0xa3, 0x0c, 0x32, 0x2b, 0x57, 0x09,
+	0x9a, 0x5d, 0x04, 0xa1, 0x55, 0x18, 0xc4, 0xcd, 0x30, 0x4a, 0x17, 0x52, 0x28, 0x99, 0x49, 0x0c,
+	0x81, 0x34, 0x27, 0x34, 0x99, 0xf1, 0x7d, 0x5c, 0xfa, 0x28, 0x3e, 0x8a, 0x0f, 0xe0, 0x5a, 0xda,
+	0xd3, 0x76, 0xa5, 0xae, 0xfa, 0xd3, 0x7c, 0xff, 0xf9, 0x0e, 0x27, 0xbd, 0xd1, 0x00, 0xda, 0x2a,
+	0x2a, 0x64, 0xa0, 0x18, 0xdb, 0x74, 0x60, 0x74, 0x07, 0x75, 0x0d, 0x8e, 0x36, 0x4a, 0xd8, 0x2a,
+	0x9a, 0x5a, 0x55, 0x5b, 0x23, 0xa5, 0x71, 0xba, 0x0a, 0x2a, 0x46, 0xe3, 0x34, 0xf1, 0x0d, 0x44,
+	0x98, 0x2d, 0xb0, 0x44, 0x84, 0x0c, 0x64, 0xec, 0x93, 0x03, 0x23, 0xd8, 0x9f, 0xf7, 0xef, 0xb4,
+	0xa3, 0xb7, 0xfb, 0x17, 0xfa, 0xda, 0x08, 0xef, 0x55, 0x13, 0xb0, 0x3f, 0x3f, 0x1b, 0xfc, 0xde,
+	0x50, 0xe1, 0x1c, 0x44, 0x11, 0x0d, 0xb8, 0xfe, 0x75, 0xf9, 0x90, 0x1e, 0x6f, 0x94, 0xb0, 0x4f,
+	0xa6, 0x56, 0x39, 0xea, 0x1f, 0xd1, 0x3e, 0xbb, 0x4c, 0xa7, 0xe0, 0x63, 0x65, 0xdc, 0x49, 0x72,
+	0x9e, 0x5c, 0x1c, 0x5d, 0xcd, 0x7b, 0x3b, 0x19, 0x44, 0x24, 0x07, 0xb0, 0x85, 0xb0, 0x7b, 0xb5,
+	0xf9, 0x0f, 0x3e, 0xde, 0xbb, 0xfc, 0x2b, 0x49, 0x97, 0x3b, 0xa8, 0xc9, 0xdf, 0x1b, 0xe7, 0xa7,
+	0x3f, 0x1b, 0xd7, 0xed, 0xdc, 0x75, 0xf2, 0x7c, 0xd7, 0xd7, 0x35, 0x58, 0xe1, 0x34, 0x81, 0x46,
+	0x53, 0xad, 0x5c, 0x67, 0x1d, 0x0e, 0xe8, 0x4d, 0xf8, 0xed, 0x9e, 0xd7, 0xf8, 0x79, 0x9b, 0xfc,
+	0x5b, 0x65, 0xd9, 0xfb, 0x64, 0xb1, 0xc2, 0x61, 0x99, 0x0c, 0x04, 0x63, 0x9b, 0x0a, 0x46, 0x6e,
+	0x3b, 0xec, 0x63, 0x00, 0xca, 0x4c, 0x86, 0x72, 0x04, 0xca, 0x82, 0x95, 0x08, 0x7c, 0x4e, 0x96,
+	0xf8, 0x97, 0xf3, 0x4c, 0x06, 0xce, 0x47, 0x84, 0xf3, 0x82, 0x71, 0x8e, 0xd0, 0x76, 0xda, 0x6d,
+	0xc7, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x5c, 0xb0, 0x50, 0xec, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/segments.pb.go b/googleapis/ads/googleads/v3/common/segments.pb.go
new file mode 100644
index 0000000..5e12ccc
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/segments.pb.go
@@ -0,0 +1,972 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/segments.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Segment only fields.
+type Segments struct {
+	// Ad network type.
+	AdNetworkType enums.AdNetworkTypeEnum_AdNetworkType `protobuf:"varint,3,opt,name=ad_network_type,json=adNetworkType,proto3,enum=google.ads.googleads.v3.enums.AdNetworkTypeEnum_AdNetworkType" json:"ad_network_type,omitempty"`
+	// Click type.
+	ClickType enums.ClickTypeEnum_ClickType `protobuf:"varint,26,opt,name=click_type,json=clickType,proto3,enum=google.ads.googleads.v3.enums.ClickTypeEnum_ClickType" json:"click_type,omitempty"`
+	// Resource name of the conversion action.
+	ConversionAction *wrappers.StringValue `protobuf:"bytes,52,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
+	// Conversion action category.
+	ConversionActionCategory enums.ConversionActionCategoryEnum_ConversionActionCategory `protobuf:"varint,53,opt,name=conversion_action_category,json=conversionActionCategory,proto3,enum=google.ads.googleads.v3.enums.ConversionActionCategoryEnum_ConversionActionCategory" json:"conversion_action_category,omitempty"`
+	// Conversion action name.
+	ConversionActionName *wrappers.StringValue `protobuf:"bytes,54,opt,name=conversion_action_name,json=conversionActionName,proto3" json:"conversion_action_name,omitempty"`
+	// This segments your conversion columns by the original conversion and
+	// conversion value vs. the delta if conversions were adjusted. False row has
+	// the data as originally stated; While true row has the delta between data
+	// now and the data as originally stated. Summing the two together results
+	// post-adjustment data.
+	ConversionAdjustment *wrappers.BoolValue `protobuf:"bytes,27,opt,name=conversion_adjustment,json=conversionAdjustment,proto3" json:"conversion_adjustment,omitempty"`
+	// Conversion attribution event type.
+	ConversionAttributionEventType enums.ConversionAttributionEventTypeEnum_ConversionAttributionEventType `protobuf:"varint,2,opt,name=conversion_attribution_event_type,json=conversionAttributionEventType,proto3,enum=google.ads.googleads.v3.enums.ConversionAttributionEventTypeEnum_ConversionAttributionEventType" json:"conversion_attribution_event_type,omitempty"`
+	// An enum value representing the number of days between the impression and
+	// the conversion.
+	ConversionLagBucket enums.ConversionLagBucketEnum_ConversionLagBucket `protobuf:"varint,50,opt,name=conversion_lag_bucket,json=conversionLagBucket,proto3,enum=google.ads.googleads.v3.enums.ConversionLagBucketEnum_ConversionLagBucket" json:"conversion_lag_bucket,omitempty"`
+	// An enum value representing the number of days between the impression and
+	// the conversion or between the impression and adjustments to the conversion.
+	ConversionOrAdjustmentLagBucket enums.ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket `protobuf:"varint,51,opt,name=conversion_or_adjustment_lag_bucket,json=conversionOrAdjustmentLagBucket,proto3,enum=google.ads.googleads.v3.enums.ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket" json:"conversion_or_adjustment_lag_bucket,omitempty"`
+	// Date to which metrics apply.
+	// yyyy-MM-dd format, e.g., 2018-04-17.
+	Date *wrappers.StringValue `protobuf:"bytes,4,opt,name=date,proto3" json:"date,omitempty"`
+	// Day of the week, e.g., MONDAY.
+	DayOfWeek enums.DayOfWeekEnum_DayOfWeek `protobuf:"varint,5,opt,name=day_of_week,json=dayOfWeek,proto3,enum=google.ads.googleads.v3.enums.DayOfWeekEnum_DayOfWeek" json:"day_of_week,omitempty"`
+	// Device to which metrics apply.
+	Device enums.DeviceEnum_Device `protobuf:"varint,1,opt,name=device,proto3,enum=google.ads.googleads.v3.enums.DeviceEnum_Device" json:"device,omitempty"`
+	// External conversion source.
+	ExternalConversionSource enums.ExternalConversionSourceEnum_ExternalConversionSource `protobuf:"varint,55,opt,name=external_conversion_source,json=externalConversionSource,proto3,enum=google.ads.googleads.v3.enums.ExternalConversionSourceEnum_ExternalConversionSource" json:"external_conversion_source,omitempty"`
+	// Resource name of the geo target constant that represents an airport.
+	GeoTargetAirport *wrappers.StringValue `protobuf:"bytes,65,opt,name=geo_target_airport,json=geoTargetAirport,proto3" json:"geo_target_airport,omitempty"`
+	// Resource name of the geo target constant that represents a canton.
+	GeoTargetCanton *wrappers.StringValue `protobuf:"bytes,76,opt,name=geo_target_canton,json=geoTargetCanton,proto3" json:"geo_target_canton,omitempty"`
+	// Resource name of the geo target constant that represents a city.
+	GeoTargetCity *wrappers.StringValue `protobuf:"bytes,62,opt,name=geo_target_city,json=geoTargetCity,proto3" json:"geo_target_city,omitempty"`
+	// Resource name of the geo target constant that represents a country.
+	GeoTargetCountry *wrappers.StringValue `protobuf:"bytes,77,opt,name=geo_target_country,json=geoTargetCountry,proto3" json:"geo_target_country,omitempty"`
+	// Resource name of the geo target constant that represents a county.
+	GeoTargetCounty *wrappers.StringValue `protobuf:"bytes,68,opt,name=geo_target_county,json=geoTargetCounty,proto3" json:"geo_target_county,omitempty"`
+	// Resource name of the geo target constant that represents a district.
+	GeoTargetDistrict *wrappers.StringValue `protobuf:"bytes,69,opt,name=geo_target_district,json=geoTargetDistrict,proto3" json:"geo_target_district,omitempty"`
+	// Resource name of the geo target constant that represents a metro.
+	GeoTargetMetro *wrappers.StringValue `protobuf:"bytes,63,opt,name=geo_target_metro,json=geoTargetMetro,proto3" json:"geo_target_metro,omitempty"`
+	// Resource name of the geo target constant that represents the most
+	// specific location.
+	GeoTargetMostSpecificLocation *wrappers.StringValue `protobuf:"bytes,72,opt,name=geo_target_most_specific_location,json=geoTargetMostSpecificLocation,proto3" json:"geo_target_most_specific_location,omitempty"`
+	// Resource name of the geo target constant that represents a postal code.
+	GeoTargetPostalCode *wrappers.StringValue `protobuf:"bytes,71,opt,name=geo_target_postal_code,json=geoTargetPostalCode,proto3" json:"geo_target_postal_code,omitempty"`
+	// Resource name of the geo target constant that represents a province.
+	GeoTargetProvince *wrappers.StringValue `protobuf:"bytes,75,opt,name=geo_target_province,json=geoTargetProvince,proto3" json:"geo_target_province,omitempty"`
+	// Resource name of the geo target constant that represents a region.
+	GeoTargetRegion *wrappers.StringValue `protobuf:"bytes,64,opt,name=geo_target_region,json=geoTargetRegion,proto3" json:"geo_target_region,omitempty"`
+	// Resource name of the geo target constant that represents a state.
+	GeoTargetState *wrappers.StringValue `protobuf:"bytes,67,opt,name=geo_target_state,json=geoTargetState,proto3" json:"geo_target_state,omitempty"`
+	// Hotel booking window in days.
+	HotelBookingWindowDays *wrappers.Int64Value `protobuf:"bytes,6,opt,name=hotel_booking_window_days,json=hotelBookingWindowDays,proto3" json:"hotel_booking_window_days,omitempty"`
+	// Hotel center ID.
+	HotelCenterId *wrappers.Int64Value `protobuf:"bytes,7,opt,name=hotel_center_id,json=hotelCenterId,proto3" json:"hotel_center_id,omitempty"`
+	// Hotel check-in date. Formatted as yyyy-MM-dd.
+	HotelCheckInDate *wrappers.StringValue `protobuf:"bytes,8,opt,name=hotel_check_in_date,json=hotelCheckInDate,proto3" json:"hotel_check_in_date,omitempty"`
+	// Hotel check-in day of week.
+	HotelCheckInDayOfWeek enums.DayOfWeekEnum_DayOfWeek `protobuf:"varint,9,opt,name=hotel_check_in_day_of_week,json=hotelCheckInDayOfWeek,proto3,enum=google.ads.googleads.v3.enums.DayOfWeekEnum_DayOfWeek" json:"hotel_check_in_day_of_week,omitempty"`
+	// Hotel city.
+	HotelCity *wrappers.StringValue `protobuf:"bytes,10,opt,name=hotel_city,json=hotelCity,proto3" json:"hotel_city,omitempty"`
+	// Hotel class.
+	HotelClass *wrappers.Int32Value `protobuf:"bytes,11,opt,name=hotel_class,json=hotelClass,proto3" json:"hotel_class,omitempty"`
+	// Hotel country.
+	HotelCountry *wrappers.StringValue `protobuf:"bytes,12,opt,name=hotel_country,json=hotelCountry,proto3" json:"hotel_country,omitempty"`
+	// Hotel date selection type.
+	HotelDateSelectionType enums.HotelDateSelectionTypeEnum_HotelDateSelectionType `protobuf:"varint,13,opt,name=hotel_date_selection_type,json=hotelDateSelectionType,proto3,enum=google.ads.googleads.v3.enums.HotelDateSelectionTypeEnum_HotelDateSelectionType" json:"hotel_date_selection_type,omitempty"`
+	// Hotel length of stay.
+	HotelLengthOfStay *wrappers.Int32Value `protobuf:"bytes,14,opt,name=hotel_length_of_stay,json=hotelLengthOfStay,proto3" json:"hotel_length_of_stay,omitempty"`
+	// Hotel rate rule ID.
+	HotelRateRuleId *wrappers.StringValue `protobuf:"bytes,73,opt,name=hotel_rate_rule_id,json=hotelRateRuleId,proto3" json:"hotel_rate_rule_id,omitempty"`
+	// Hotel rate type.
+	HotelRateType enums.HotelRateTypeEnum_HotelRateType `protobuf:"varint,74,opt,name=hotel_rate_type,json=hotelRateType,proto3,enum=google.ads.googleads.v3.enums.HotelRateTypeEnum_HotelRateType" json:"hotel_rate_type,omitempty"`
+	// Hotel price bucket.
+	HotelPriceBucket enums.HotelPriceBucketEnum_HotelPriceBucket `protobuf:"varint,78,opt,name=hotel_price_bucket,json=hotelPriceBucket,proto3,enum=google.ads.googleads.v3.enums.HotelPriceBucketEnum_HotelPriceBucket" json:"hotel_price_bucket,omitempty"`
+	// Hotel state.
+	HotelState *wrappers.StringValue `protobuf:"bytes,15,opt,name=hotel_state,json=hotelState,proto3" json:"hotel_state,omitempty"`
+	// Hour of day as a number between 0 and 23, inclusive.
+	Hour *wrappers.Int32Value `protobuf:"bytes,16,opt,name=hour,proto3" json:"hour,omitempty"`
+	// Only used with feed item metrics.
+	// Indicates whether the interaction metrics occurred on the feed item itself
+	// or a different extension or ad unit.
+	InteractionOnThisExtension *wrappers.BoolValue `protobuf:"bytes,49,opt,name=interaction_on_this_extension,json=interactionOnThisExtension,proto3" json:"interaction_on_this_extension,omitempty"`
+	// Keyword criterion.
+	Keyword *Keyword `protobuf:"bytes,61,opt,name=keyword,proto3" json:"keyword,omitempty"`
+	// Month as represented by the date of the first day of a month. Formatted as
+	// yyyy-MM-dd.
+	Month *wrappers.StringValue `protobuf:"bytes,17,opt,name=month,proto3" json:"month,omitempty"`
+	// Month of the year, e.g., January.
+	MonthOfYear enums.MonthOfYearEnum_MonthOfYear `protobuf:"varint,18,opt,name=month_of_year,json=monthOfYear,proto3,enum=google.ads.googleads.v3.enums.MonthOfYearEnum_MonthOfYear" json:"month_of_year,omitempty"`
+	// Partner hotel ID.
+	PartnerHotelId *wrappers.StringValue `protobuf:"bytes,19,opt,name=partner_hotel_id,json=partnerHotelId,proto3" json:"partner_hotel_id,omitempty"`
+	// Placeholder type. This is only used with feed item metrics.
+	PlaceholderType enums.PlaceholderTypeEnum_PlaceholderType `protobuf:"varint,20,opt,name=placeholder_type,json=placeholderType,proto3,enum=google.ads.googleads.v3.enums.PlaceholderTypeEnum_PlaceholderType" json:"placeholder_type,omitempty"`
+	// Aggregator ID of the product.
+	ProductAggregatorId *wrappers.UInt64Value `protobuf:"bytes,28,opt,name=product_aggregator_id,json=productAggregatorId,proto3" json:"product_aggregator_id,omitempty"`
+	// Bidding category (level 1) of the product.
+	ProductBiddingCategoryLevel1 *wrappers.StringValue `protobuf:"bytes,56,opt,name=product_bidding_category_level1,json=productBiddingCategoryLevel1,proto3" json:"product_bidding_category_level1,omitempty"`
+	// Bidding category (level 2) of the product.
+	ProductBiddingCategoryLevel2 *wrappers.StringValue `protobuf:"bytes,57,opt,name=product_bidding_category_level2,json=productBiddingCategoryLevel2,proto3" json:"product_bidding_category_level2,omitempty"`
+	// Bidding category (level 3) of the product.
+	ProductBiddingCategoryLevel3 *wrappers.StringValue `protobuf:"bytes,58,opt,name=product_bidding_category_level3,json=productBiddingCategoryLevel3,proto3" json:"product_bidding_category_level3,omitempty"`
+	// Bidding category (level 4) of the product.
+	ProductBiddingCategoryLevel4 *wrappers.StringValue `protobuf:"bytes,59,opt,name=product_bidding_category_level4,json=productBiddingCategoryLevel4,proto3" json:"product_bidding_category_level4,omitempty"`
+	// Bidding category (level 5) of the product.
+	ProductBiddingCategoryLevel5 *wrappers.StringValue `protobuf:"bytes,60,opt,name=product_bidding_category_level5,json=productBiddingCategoryLevel5,proto3" json:"product_bidding_category_level5,omitempty"`
+	// Brand of the product.
+	ProductBrand *wrappers.StringValue `protobuf:"bytes,29,opt,name=product_brand,json=productBrand,proto3" json:"product_brand,omitempty"`
+	// Channel of the product.
+	ProductChannel enums.ProductChannelEnum_ProductChannel `protobuf:"varint,30,opt,name=product_channel,json=productChannel,proto3,enum=google.ads.googleads.v3.enums.ProductChannelEnum_ProductChannel" json:"product_channel,omitempty"`
+	// Channel exclusivity of the product.
+	ProductChannelExclusivity enums.ProductChannelExclusivityEnum_ProductChannelExclusivity `protobuf:"varint,31,opt,name=product_channel_exclusivity,json=productChannelExclusivity,proto3,enum=google.ads.googleads.v3.enums.ProductChannelExclusivityEnum_ProductChannelExclusivity" json:"product_channel_exclusivity,omitempty"`
+	// Condition of the product.
+	ProductCondition enums.ProductConditionEnum_ProductCondition `protobuf:"varint,32,opt,name=product_condition,json=productCondition,proto3,enum=google.ads.googleads.v3.enums.ProductConditionEnum_ProductCondition" json:"product_condition,omitempty"`
+	// Resource name of the geo target constant for the country of sale of the
+	// product.
+	ProductCountry *wrappers.StringValue `protobuf:"bytes,33,opt,name=product_country,json=productCountry,proto3" json:"product_country,omitempty"`
+	// Custom attribute 0 of the product.
+	ProductCustomAttribute0 *wrappers.StringValue `protobuf:"bytes,34,opt,name=product_custom_attribute0,json=productCustomAttribute0,proto3" json:"product_custom_attribute0,omitempty"`
+	// Custom attribute 1 of the product.
+	ProductCustomAttribute1 *wrappers.StringValue `protobuf:"bytes,35,opt,name=product_custom_attribute1,json=productCustomAttribute1,proto3" json:"product_custom_attribute1,omitempty"`
+	// Custom attribute 2 of the product.
+	ProductCustomAttribute2 *wrappers.StringValue `protobuf:"bytes,36,opt,name=product_custom_attribute2,json=productCustomAttribute2,proto3" json:"product_custom_attribute2,omitempty"`
+	// Custom attribute 3 of the product.
+	ProductCustomAttribute3 *wrappers.StringValue `protobuf:"bytes,37,opt,name=product_custom_attribute3,json=productCustomAttribute3,proto3" json:"product_custom_attribute3,omitempty"`
+	// Custom attribute 4 of the product.
+	ProductCustomAttribute4 *wrappers.StringValue `protobuf:"bytes,38,opt,name=product_custom_attribute4,json=productCustomAttribute4,proto3" json:"product_custom_attribute4,omitempty"`
+	// Item ID of the product.
+	ProductItemId *wrappers.StringValue `protobuf:"bytes,39,opt,name=product_item_id,json=productItemId,proto3" json:"product_item_id,omitempty"`
+	// Resource name of the language constant for the language of the product.
+	ProductLanguage *wrappers.StringValue `protobuf:"bytes,40,opt,name=product_language,json=productLanguage,proto3" json:"product_language,omitempty"`
+	// Merchant ID of the product.
+	ProductMerchantId *wrappers.UInt64Value `protobuf:"bytes,41,opt,name=product_merchant_id,json=productMerchantId,proto3" json:"product_merchant_id,omitempty"`
+	// Store ID of the product.
+	ProductStoreId *wrappers.StringValue `protobuf:"bytes,42,opt,name=product_store_id,json=productStoreId,proto3" json:"product_store_id,omitempty"`
+	// Title of the product.
+	ProductTitle *wrappers.StringValue `protobuf:"bytes,43,opt,name=product_title,json=productTitle,proto3" json:"product_title,omitempty"`
+	// Type (level 1) of the product.
+	ProductTypeL1 *wrappers.StringValue `protobuf:"bytes,44,opt,name=product_type_l1,json=productTypeL1,proto3" json:"product_type_l1,omitempty"`
+	// Type (level 2) of the product.
+	ProductTypeL2 *wrappers.StringValue `protobuf:"bytes,45,opt,name=product_type_l2,json=productTypeL2,proto3" json:"product_type_l2,omitempty"`
+	// Type (level 3) of the product.
+	ProductTypeL3 *wrappers.StringValue `protobuf:"bytes,46,opt,name=product_type_l3,json=productTypeL3,proto3" json:"product_type_l3,omitempty"`
+	// Type (level 4) of the product.
+	ProductTypeL4 *wrappers.StringValue `protobuf:"bytes,47,opt,name=product_type_l4,json=productTypeL4,proto3" json:"product_type_l4,omitempty"`
+	// Type (level 5) of the product.
+	ProductTypeL5 *wrappers.StringValue `protobuf:"bytes,48,opt,name=product_type_l5,json=productTypeL5,proto3" json:"product_type_l5,omitempty"`
+	// Quarter as represented by the date of the first day of a quarter.
+	// Uses the calendar year for quarters, e.g., the second quarter of 2018
+	// starts on 2018-04-01. Formatted as yyyy-MM-dd.
+	Quarter *wrappers.StringValue `protobuf:"bytes,21,opt,name=quarter,proto3" json:"quarter,omitempty"`
+	// Type of the search engine results page.
+	SearchEngineResultsPageType enums.SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType `protobuf:"varint,70,opt,name=search_engine_results_page_type,json=searchEngineResultsPageType,proto3,enum=google.ads.googleads.v3.enums.SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType" json:"search_engine_results_page_type,omitempty"`
+	// Match type of the keyword that triggered the ad, including variants.
+	SearchTermMatchType enums.SearchTermMatchTypeEnum_SearchTermMatchType `protobuf:"varint,22,opt,name=search_term_match_type,json=searchTermMatchType,proto3,enum=google.ads.googleads.v3.enums.SearchTermMatchTypeEnum_SearchTermMatchType" json:"search_term_match_type,omitempty"`
+	// Position of the ad.
+	Slot enums.SlotEnum_Slot `protobuf:"varint,23,opt,name=slot,proto3,enum=google.ads.googleads.v3.enums.SlotEnum_Slot" json:"slot,omitempty"`
+	// Resource name of the ad group criterion that represents webpage criterion.
+	Webpage *wrappers.StringValue `protobuf:"bytes,66,opt,name=webpage,proto3" json:"webpage,omitempty"`
+	// Week as defined as Monday through Sunday, and represented by the date of
+	// Monday. Formatted as yyyy-MM-dd.
+	Week *wrappers.StringValue `protobuf:"bytes,24,opt,name=week,proto3" json:"week,omitempty"`
+	// Year, formatted as yyyy.
+	Year                 *wrappers.Int32Value `protobuf:"bytes,25,opt,name=year,proto3" json:"year,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *Segments) Reset()         { *m = Segments{} }
+func (m *Segments) String() string { return proto.CompactTextString(m) }
+func (*Segments) ProtoMessage()    {}
+func (*Segments) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aeb1e0d15c8aadb4, []int{0}
+}
+
+func (m *Segments) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Segments.Unmarshal(m, b)
+}
+func (m *Segments) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Segments.Marshal(b, m, deterministic)
+}
+func (m *Segments) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Segments.Merge(m, src)
+}
+func (m *Segments) XXX_Size() int {
+	return xxx_messageInfo_Segments.Size(m)
+}
+func (m *Segments) XXX_DiscardUnknown() {
+	xxx_messageInfo_Segments.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Segments proto.InternalMessageInfo
+
+func (m *Segments) GetAdNetworkType() enums.AdNetworkTypeEnum_AdNetworkType {
+	if m != nil {
+		return m.AdNetworkType
+	}
+	return enums.AdNetworkTypeEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetClickType() enums.ClickTypeEnum_ClickType {
+	if m != nil {
+		return m.ClickType
+	}
+	return enums.ClickTypeEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionAction
+	}
+	return nil
+}
+
+func (m *Segments) GetConversionActionCategory() enums.ConversionActionCategoryEnum_ConversionActionCategory {
+	if m != nil {
+		return m.ConversionActionCategory
+	}
+	return enums.ConversionActionCategoryEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetConversionActionName() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionActionName
+	}
+	return nil
+}
+
+func (m *Segments) GetConversionAdjustment() *wrappers.BoolValue {
+	if m != nil {
+		return m.ConversionAdjustment
+	}
+	return nil
+}
+
+func (m *Segments) GetConversionAttributionEventType() enums.ConversionAttributionEventTypeEnum_ConversionAttributionEventType {
+	if m != nil {
+		return m.ConversionAttributionEventType
+	}
+	return enums.ConversionAttributionEventTypeEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetConversionLagBucket() enums.ConversionLagBucketEnum_ConversionLagBucket {
+	if m != nil {
+		return m.ConversionLagBucket
+	}
+	return enums.ConversionLagBucketEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetConversionOrAdjustmentLagBucket() enums.ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket {
+	if m != nil {
+		return m.ConversionOrAdjustmentLagBucket
+	}
+	return enums.ConversionOrAdjustmentLagBucketEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetDate() *wrappers.StringValue {
+	if m != nil {
+		return m.Date
+	}
+	return nil
+}
+
+func (m *Segments) GetDayOfWeek() enums.DayOfWeekEnum_DayOfWeek {
+	if m != nil {
+		return m.DayOfWeek
+	}
+	return enums.DayOfWeekEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetDevice() enums.DeviceEnum_Device {
+	if m != nil {
+		return m.Device
+	}
+	return enums.DeviceEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetExternalConversionSource() enums.ExternalConversionSourceEnum_ExternalConversionSource {
+	if m != nil {
+		return m.ExternalConversionSource
+	}
+	return enums.ExternalConversionSourceEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetGeoTargetAirport() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetAirport
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetCanton() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetCanton
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetCity() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetCity
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetCountry() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetCountry
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetCounty() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetCounty
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetDistrict() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetDistrict
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetMetro() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetMetro
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetMostSpecificLocation() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetMostSpecificLocation
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetPostalCode() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetPostalCode
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetProvince() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetProvince
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetRegion() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetRegion
+	}
+	return nil
+}
+
+func (m *Segments) GetGeoTargetState() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetState
+	}
+	return nil
+}
+
+func (m *Segments) GetHotelBookingWindowDays() *wrappers.Int64Value {
+	if m != nil {
+		return m.HotelBookingWindowDays
+	}
+	return nil
+}
+
+func (m *Segments) GetHotelCenterId() *wrappers.Int64Value {
+	if m != nil {
+		return m.HotelCenterId
+	}
+	return nil
+}
+
+func (m *Segments) GetHotelCheckInDate() *wrappers.StringValue {
+	if m != nil {
+		return m.HotelCheckInDate
+	}
+	return nil
+}
+
+func (m *Segments) GetHotelCheckInDayOfWeek() enums.DayOfWeekEnum_DayOfWeek {
+	if m != nil {
+		return m.HotelCheckInDayOfWeek
+	}
+	return enums.DayOfWeekEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetHotelCity() *wrappers.StringValue {
+	if m != nil {
+		return m.HotelCity
+	}
+	return nil
+}
+
+func (m *Segments) GetHotelClass() *wrappers.Int32Value {
+	if m != nil {
+		return m.HotelClass
+	}
+	return nil
+}
+
+func (m *Segments) GetHotelCountry() *wrappers.StringValue {
+	if m != nil {
+		return m.HotelCountry
+	}
+	return nil
+}
+
+func (m *Segments) GetHotelDateSelectionType() enums.HotelDateSelectionTypeEnum_HotelDateSelectionType {
+	if m != nil {
+		return m.HotelDateSelectionType
+	}
+	return enums.HotelDateSelectionTypeEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetHotelLengthOfStay() *wrappers.Int32Value {
+	if m != nil {
+		return m.HotelLengthOfStay
+	}
+	return nil
+}
+
+func (m *Segments) GetHotelRateRuleId() *wrappers.StringValue {
+	if m != nil {
+		return m.HotelRateRuleId
+	}
+	return nil
+}
+
+func (m *Segments) GetHotelRateType() enums.HotelRateTypeEnum_HotelRateType {
+	if m != nil {
+		return m.HotelRateType
+	}
+	return enums.HotelRateTypeEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetHotelPriceBucket() enums.HotelPriceBucketEnum_HotelPriceBucket {
+	if m != nil {
+		return m.HotelPriceBucket
+	}
+	return enums.HotelPriceBucketEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetHotelState() *wrappers.StringValue {
+	if m != nil {
+		return m.HotelState
+	}
+	return nil
+}
+
+func (m *Segments) GetHour() *wrappers.Int32Value {
+	if m != nil {
+		return m.Hour
+	}
+	return nil
+}
+
+func (m *Segments) GetInteractionOnThisExtension() *wrappers.BoolValue {
+	if m != nil {
+		return m.InteractionOnThisExtension
+	}
+	return nil
+}
+
+func (m *Segments) GetKeyword() *Keyword {
+	if m != nil {
+		return m.Keyword
+	}
+	return nil
+}
+
+func (m *Segments) GetMonth() *wrappers.StringValue {
+	if m != nil {
+		return m.Month
+	}
+	return nil
+}
+
+func (m *Segments) GetMonthOfYear() enums.MonthOfYearEnum_MonthOfYear {
+	if m != nil {
+		return m.MonthOfYear
+	}
+	return enums.MonthOfYearEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetPartnerHotelId() *wrappers.StringValue {
+	if m != nil {
+		return m.PartnerHotelId
+	}
+	return nil
+}
+
+func (m *Segments) GetPlaceholderType() enums.PlaceholderTypeEnum_PlaceholderType {
+	if m != nil {
+		return m.PlaceholderType
+	}
+	return enums.PlaceholderTypeEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetProductAggregatorId() *wrappers.UInt64Value {
+	if m != nil {
+		return m.ProductAggregatorId
+	}
+	return nil
+}
+
+func (m *Segments) GetProductBiddingCategoryLevel1() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductBiddingCategoryLevel1
+	}
+	return nil
+}
+
+func (m *Segments) GetProductBiddingCategoryLevel2() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductBiddingCategoryLevel2
+	}
+	return nil
+}
+
+func (m *Segments) GetProductBiddingCategoryLevel3() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductBiddingCategoryLevel3
+	}
+	return nil
+}
+
+func (m *Segments) GetProductBiddingCategoryLevel4() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductBiddingCategoryLevel4
+	}
+	return nil
+}
+
+func (m *Segments) GetProductBiddingCategoryLevel5() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductBiddingCategoryLevel5
+	}
+	return nil
+}
+
+func (m *Segments) GetProductBrand() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductBrand
+	}
+	return nil
+}
+
+func (m *Segments) GetProductChannel() enums.ProductChannelEnum_ProductChannel {
+	if m != nil {
+		return m.ProductChannel
+	}
+	return enums.ProductChannelEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetProductChannelExclusivity() enums.ProductChannelExclusivityEnum_ProductChannelExclusivity {
+	if m != nil {
+		return m.ProductChannelExclusivity
+	}
+	return enums.ProductChannelExclusivityEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetProductCondition() enums.ProductConditionEnum_ProductCondition {
+	if m != nil {
+		return m.ProductCondition
+	}
+	return enums.ProductConditionEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetProductCountry() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductCountry
+	}
+	return nil
+}
+
+func (m *Segments) GetProductCustomAttribute0() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductCustomAttribute0
+	}
+	return nil
+}
+
+func (m *Segments) GetProductCustomAttribute1() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductCustomAttribute1
+	}
+	return nil
+}
+
+func (m *Segments) GetProductCustomAttribute2() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductCustomAttribute2
+	}
+	return nil
+}
+
+func (m *Segments) GetProductCustomAttribute3() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductCustomAttribute3
+	}
+	return nil
+}
+
+func (m *Segments) GetProductCustomAttribute4() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductCustomAttribute4
+	}
+	return nil
+}
+
+func (m *Segments) GetProductItemId() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductItemId
+	}
+	return nil
+}
+
+func (m *Segments) GetProductLanguage() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductLanguage
+	}
+	return nil
+}
+
+func (m *Segments) GetProductMerchantId() *wrappers.UInt64Value {
+	if m != nil {
+		return m.ProductMerchantId
+	}
+	return nil
+}
+
+func (m *Segments) GetProductStoreId() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductStoreId
+	}
+	return nil
+}
+
+func (m *Segments) GetProductTitle() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductTitle
+	}
+	return nil
+}
+
+func (m *Segments) GetProductTypeL1() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductTypeL1
+	}
+	return nil
+}
+
+func (m *Segments) GetProductTypeL2() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductTypeL2
+	}
+	return nil
+}
+
+func (m *Segments) GetProductTypeL3() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductTypeL3
+	}
+	return nil
+}
+
+func (m *Segments) GetProductTypeL4() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductTypeL4
+	}
+	return nil
+}
+
+func (m *Segments) GetProductTypeL5() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductTypeL5
+	}
+	return nil
+}
+
+func (m *Segments) GetQuarter() *wrappers.StringValue {
+	if m != nil {
+		return m.Quarter
+	}
+	return nil
+}
+
+func (m *Segments) GetSearchEngineResultsPageType() enums.SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType {
+	if m != nil {
+		return m.SearchEngineResultsPageType
+	}
+	return enums.SearchEngineResultsPageTypeEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetSearchTermMatchType() enums.SearchTermMatchTypeEnum_SearchTermMatchType {
+	if m != nil {
+		return m.SearchTermMatchType
+	}
+	return enums.SearchTermMatchTypeEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetSlot() enums.SlotEnum_Slot {
+	if m != nil {
+		return m.Slot
+	}
+	return enums.SlotEnum_UNSPECIFIED
+}
+
+func (m *Segments) GetWebpage() *wrappers.StringValue {
+	if m != nil {
+		return m.Webpage
+	}
+	return nil
+}
+
+func (m *Segments) GetWeek() *wrappers.StringValue {
+	if m != nil {
+		return m.Week
+	}
+	return nil
+}
+
+func (m *Segments) GetYear() *wrappers.Int32Value {
+	if m != nil {
+		return m.Year
+	}
+	return nil
+}
+
+// A Keyword criterion segment.
+type Keyword struct {
+	// The AdGroupCriterion resource name.
+	AdGroupCriterion *wrappers.StringValue `protobuf:"bytes,1,opt,name=ad_group_criterion,json=adGroupCriterion,proto3" json:"ad_group_criterion,omitempty"`
+	// Keyword info.
+	Info                 *KeywordInfo `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *Keyword) Reset()         { *m = Keyword{} }
+func (m *Keyword) String() string { return proto.CompactTextString(m) }
+func (*Keyword) ProtoMessage()    {}
+func (*Keyword) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aeb1e0d15c8aadb4, []int{1}
+}
+
+func (m *Keyword) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Keyword.Unmarshal(m, b)
+}
+func (m *Keyword) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Keyword.Marshal(b, m, deterministic)
+}
+func (m *Keyword) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Keyword.Merge(m, src)
+}
+func (m *Keyword) XXX_Size() int {
+	return xxx_messageInfo_Keyword.Size(m)
+}
+func (m *Keyword) XXX_DiscardUnknown() {
+	xxx_messageInfo_Keyword.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Keyword proto.InternalMessageInfo
+
+func (m *Keyword) GetAdGroupCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupCriterion
+	}
+	return nil
+}
+
+func (m *Keyword) GetInfo() *KeywordInfo {
+	if m != nil {
+		return m.Info
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Segments)(nil), "google.ads.googleads.v3.common.Segments")
+	proto.RegisterType((*Keyword)(nil), "google.ads.googleads.v3.common.Keyword")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/segments.proto", fileDescriptor_aeb1e0d15c8aadb4)
+}
+
+var fileDescriptor_aeb1e0d15c8aadb4 = []byte{
+	// 2157 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9a, 0x5b, 0x5b, 0xdb, 0xc8,
+	0x19, 0xc7, 0x1f, 0x67, 0xd9, 0x64, 0x33, 0x2c, 0x01, 0x86, 0x84, 0x9d, 0x90, 0x33, 0xdb, 0x76,
+	0xd3, 0x3d, 0xd8, 0x60, 0x03, 0xed, 0x3a, 0x9b, 0x83, 0x31, 0x2c, 0x38, 0x81, 0x40, 0x05, 0xcb,
+	0xb6, 0xfb, 0xa4, 0x55, 0x07, 0x69, 0x2c, 0x54, 0x64, 0x8d, 0x32, 0x1a, 0xc3, 0xfa, 0xa6, 0xfd,
+	0x00, 0xbd, 0xeb, 0x45, 0xae, 0xfb, 0xf4, 0xb2, 0xbd, 0xe9, 0x77, 0xe8, 0x5d, 0x3f, 0x49, 0x9f,
+	0x7e, 0x8a, 0x7d, 0xe6, 0x20, 0x59, 0xb6, 0xb1, 0x35, 0x0e, 0x57, 0x48, 0xa3, 0xf7, 0xff, 0x7b,
+	0x5f, 0xbd, 0x33, 0x7a, 0xe7, 0x60, 0xc0, 0x57, 0x1e, 0xa5, 0x5e, 0x40, 0x4a, 0xd8, 0x8d, 0x4b,
+	0xea, 0x52, 0x5c, 0x9d, 0x55, 0x4a, 0x0e, 0x6d, 0xb5, 0x68, 0x58, 0x8a, 0x89, 0xd7, 0x22, 0x21,
+	0x8f, 0x8b, 0x11, 0xa3, 0x9c, 0xc2, 0xfb, 0xca, 0xa6, 0x88, 0xdd, 0xb8, 0x98, 0x9a, 0x17, 0xcf,
+	0x2a, 0x45, 0x65, 0xbe, 0x90, 0x87, 0x73, 0x98, 0xcf, 0x09, 0xf3, 0xb1, 0xc2, 0x2d, 0x54, 0x86,
+	0x99, 0x93, 0xb0, 0xdd, 0x8a, 0x4b, 0xd8, 0xb5, 0x43, 0xc2, 0xcf, 0x29, 0x3b, 0xb5, 0x79, 0x27,
+	0x22, 0x5a, 0x54, 0x1c, 0x2d, 0x72, 0x02, 0xdf, 0xe9, 0xb1, 0x7f, 0x96, 0x63, 0x4f, 0xc3, 0x33,
+	0xc2, 0x62, 0x9f, 0x86, 0x36, 0x76, 0xb8, 0xf8, 0xe3, 0x60, 0x4e, 0x3c, 0xca, 0x3a, 0x5a, 0xbf,
+	0x69, 0xae, 0xe7, 0x9c, 0xf9, 0xc7, 0x6d, 0x09, 0x21, 0x67, 0x24, 0xe4, 0xd9, 0x30, 0xbe, 0x36,
+	0xc6, 0x04, 0xd8, 0xb3, 0x8f, 0xdb, 0xce, 0x29, 0xe1, 0x5a, 0xba, 0x65, 0x2c, 0xa5, 0xcc, 0xc6,
+	0xee, 0x9f, 0xda, 0x31, 0x17, 0x9d, 0x36, 0x08, 0x2a, 0x8d, 0x06, 0xb9, 0xb8, 0x63, 0xd3, 0xa6,
+	0x7d, 0x4e, 0xc8, 0xa9, 0x16, 0x7c, 0x9e, 0x23, 0x20, 0x67, 0xbe, 0x63, 0x98, 0x67, 0xf2, 0x23,
+	0x27, 0x2c, 0xc4, 0x81, 0x9d, 0x09, 0x37, 0xa6, 0x6d, 0x96, 0xea, 0x9f, 0x8e, 0xd6, 0x9f, 0x50,
+	0x4e, 0x02, 0xdb, 0xc5, 0x9c, 0xd8, 0x31, 0x09, 0x88, 0xea, 0xaa, 0x4c, 0x7e, 0xd7, 0x4c, 0xe4,
+	0x11, 0xf3, 0x1d, 0xd2, 0x9b, 0x93, 0x8a, 0x89, 0x8e, 0x09, 0xb7, 0x19, 0x67, 0xcb, 0xa3, 0x45,
+	0x2d, 0x1a, 0xf2, 0x13, 0x91, 0xca, 0x0e, 0xc1, 0x4c, 0x4b, 0x56, 0x46, 0x4b, 0xa2, 0x00, 0x3b,
+	0xe4, 0x84, 0x06, 0x2e, 0x61, 0x59, 0x47, 0x39, 0xd1, 0x45, 0x8c, 0xba, 0x6d, 0x87, 0xdb, 0xce,
+	0x09, 0x0e, 0x43, 0x12, 0x68, 0xd1, 0xf3, 0xb1, 0x44, 0x36, 0xf9, 0xd1, 0x09, 0xda, 0xb1, 0x7f,
+	0xe6, 0xf3, 0x64, 0xc8, 0xaf, 0x1a, 0x02, 0x68, 0xe8, 0xfa, 0xa2, 0x1f, 0xb4, 0xac, 0x3e, 0x5a,
+	0x16, 0x13, 0xcc, 0x9c, 0x13, 0x9b, 0x84, 0x9e, 0x1f, 0x12, 0x9b, 0x91, 0xb8, 0x1d, 0xf0, 0xd8,
+	0x8e, 0xb0, 0xd7, 0x93, 0xda, 0xaa, 0x11, 0x84, 0x13, 0xd6, 0xb2, 0x5b, 0x98, 0x8b, 0xcb, 0xae,
+	0xf6, 0x71, 0x8e, 0x36, 0xa0, 0x49, 0xaf, 0xeb, 0x42, 0x56, 0x92, 0x77, 0xc7, 0xed, 0x66, 0xe9,
+	0x9c, 0xe1, 0x28, 0x22, 0x4c, 0x17, 0xba, 0x85, 0xbb, 0x09, 0x29, 0xf2, 0x4b, 0x38, 0x0c, 0x29,
+	0xc7, 0xe2, 0x3d, 0xf5, 0xd3, 0xc5, 0xff, 0xac, 0x82, 0x8f, 0x0e, 0x74, 0x65, 0x84, 0x4d, 0x30,
+	0xdd, 0x57, 0xa8, 0xd0, 0x07, 0x0f, 0x0b, 0x8f, 0x6f, 0x94, 0x9f, 0x15, 0x87, 0x55, 0x4b, 0x19,
+	0x4e, 0xb1, 0xe6, 0xbe, 0x56, 0xa2, 0xc3, 0x4e, 0x44, 0x36, 0xc3, 0x76, 0xab, 0xb7, 0xc5, 0x9a,
+	0xc2, 0xd9, 0x5b, 0xf8, 0x1d, 0x00, 0xdd, 0xda, 0x86, 0x16, 0xa4, 0x8b, 0xb5, 0x1c, 0x17, 0x75,
+	0x21, 0x48, 0xf1, 0xe9, 0x9d, 0x75, 0xdd, 0x49, 0x2e, 0x61, 0x03, 0xcc, 0x0e, 0x94, 0x40, 0xb4,
+	0xf2, 0xb0, 0xf0, 0x78, 0xb2, 0x7c, 0x37, 0xa1, 0x27, 0x59, 0x2a, 0x1e, 0x70, 0xe6, 0x87, 0xde,
+	0x11, 0x0e, 0xda, 0xc4, 0x9a, 0xe9, 0xca, 0x6a, 0x52, 0x05, 0xff, 0x56, 0x00, 0x0b, 0xc3, 0xcb,
+	0x29, 0x5a, 0x95, 0x21, 0x1f, 0xe6, 0x85, 0xdc, 0x47, 0xad, 0x6b, 0xb9, 0x7a, 0x83, 0x21, 0x0f,
+	0x2d, 0xe4, 0x0c, 0x79, 0x02, 0x2d, 0x30, 0x3f, 0x18, 0x53, 0x88, 0x5b, 0x04, 0xad, 0x19, 0xbc,
+	0xe4, 0xcd, 0x7e, 0xee, 0x6b, 0xdc, 0x22, 0x70, 0x0f, 0xdc, 0xca, 0x32, 0xd3, 0x8a, 0x8b, 0xee,
+	0x48, 0xe4, 0xc2, 0x00, 0x72, 0x9d, 0xd2, 0x60, 0x10, 0x98, 0xea, 0xe0, 0xbf, 0x0a, 0xe0, 0x51,
+	0xee, 0x44, 0x82, 0xae, 0xc8, 0x04, 0xfe, 0xd1, 0x3c, 0x81, 0x5d, 0xcc, 0xa6, 0xa0, 0x74, 0x07,
+	0xc2, 0x48, 0x13, 0xeb, 0xbe, 0x33, 0xf2, 0x39, 0xfc, 0x73, 0xcf, 0xeb, 0x77, 0x67, 0x19, 0x54,
+	0x96, 0x01, 0xbe, 0x34, 0x0e, 0x70, 0x07, 0x7b, 0xeb, 0x52, 0xd9, 0x17, 0x55, 0xda, 0x6e, 0xcd,
+	0x39, 0x83, 0x8d, 0xf0, 0xdf, 0x05, 0xf0, 0xa9, 0xc1, 0xa4, 0x87, 0x2a, 0x32, 0x9c, 0x63, 0xe3,
+	0x70, 0xf6, 0x58, 0xb7, 0x4b, 0x86, 0x85, 0x76, 0xa1, 0x8d, 0xf5, 0xc0, 0x19, 0x6d, 0x00, 0x97,
+	0xc0, 0x84, 0x98, 0xba, 0xd0, 0x84, 0xc1, 0x98, 0x93, 0x96, 0xf0, 0x08, 0x4c, 0x66, 0xe6, 0x63,
+	0xf4, 0xa1, 0xd1, 0xf7, 0xbe, 0x81, 0x3b, 0x7b, 0xcd, 0xef, 0x09, 0x39, 0x95, 0x51, 0xa7, 0x77,
+	0xd6, 0x75, 0x37, 0xb9, 0x84, 0xdb, 0xe0, 0xaa, 0x9a, 0xb6, 0x51, 0x41, 0x22, 0x97, 0xf2, 0x90,
+	0xd2, 0x58, 0xf1, 0xe4, 0xa5, 0xa5, 0xf5, 0xf2, 0x73, 0x1f, 0x3e, 0xab, 0xa3, 0x5f, 0x19, 0x7d,
+	0xee, 0x9b, 0x1a, 0xd0, 0xcd, 0xf0, 0x81, 0x94, 0x4b, 0x87, 0xc3, 0x1e, 0x5a, 0x88, 0x0c, 0x79,
+	0x02, 0x5f, 0x02, 0xe8, 0x11, 0x6a, 0x73, 0xcc, 0x3c, 0xc2, 0x6d, 0xec, 0xb3, 0x88, 0x32, 0x8e,
+	0x6a, 0x26, 0xf5, 0xcc, 0x23, 0xf4, 0x50, 0xca, 0x6a, 0x4a, 0x05, 0xb7, 0xc1, 0x6c, 0x86, 0xe5,
+	0xe0, 0x90, 0xd3, 0x10, 0xed, 0x18, 0xa0, 0xa6, 0x53, 0x54, 0x5d, 0x8a, 0xe0, 0x06, 0x98, 0xce,
+	0x92, 0x7c, 0xde, 0x41, 0xcf, 0x0c, 0x38, 0x53, 0x5d, 0x8e, 0xcf, 0x3b, 0x7d, 0xef, 0xe6, 0xd0,
+	0x76, 0xc8, 0x59, 0x07, 0xed, 0x8e, 0xf5, 0x6e, 0x75, 0xa5, 0xea, 0x7f, 0x37, 0xd1, 0xda, 0x41,
+	0x1b, 0xe3, 0xbd, 0x9b, 0x14, 0xc1, 0x1d, 0x30, 0x97, 0x21, 0xb9, 0x7e, 0xcc, 0x99, 0xef, 0x70,
+	0xb4, 0x69, 0xc0, 0x9a, 0x4d, 0x59, 0x1b, 0x5a, 0x06, 0xbf, 0x05, 0x33, 0x19, 0x5a, 0x8b, 0x70,
+	0x46, 0xd1, 0x73, 0x03, 0xd4, 0x8d, 0x14, 0xb5, 0x2b, 0x34, 0xb0, 0x09, 0x1e, 0x65, 0x39, 0x34,
+	0xe6, 0x76, 0x1c, 0x11, 0xc7, 0x6f, 0xfa, 0x8e, 0x1d, 0x50, 0x47, 0x4e, 0xe7, 0x68, 0xdb, 0x00,
+	0x7c, 0xaf, 0x0b, 0xa6, 0x31, 0x3f, 0xd0, 0x8c, 0x1d, 0x8d, 0x80, 0xbf, 0x01, 0xf3, 0x19, 0x3f,
+	0x11, 0x8d, 0xb9, 0xfc, 0x18, 0x5c, 0x82, 0xb6, 0x0c, 0xe0, 0x73, 0x29, 0x7c, 0x5f, 0x2a, 0xeb,
+	0xd4, 0x25, 0x7d, 0x09, 0x8d, 0x18, 0x3d, 0xf3, 0x43, 0x87, 0xa0, 0x57, 0x63, 0x25, 0x74, 0x5f,
+	0xcb, 0xfa, 0x3a, 0x9a, 0x11, 0x4f, 0xbc, 0xf8, 0x8b, 0xb1, 0x3a, 0xda, 0x92, 0xa2, 0xbe, 0xae,
+	0x89, 0xb9, 0xa8, 0x67, 0xf5, 0xb1, 0xba, 0xe6, 0x80, 0xab, 0xca, 0x76, 0x5b, 0xad, 0xaa, 0x8f,
+	0x29, 0x3d, 0xf5, 0x43, 0xcf, 0x3e, 0xf7, 0x43, 0x97, 0x9e, 0xdb, 0x2e, 0xee, 0xc4, 0xe8, 0xaa,
+	0x04, 0xde, 0x19, 0x00, 0x36, 0x42, 0xbe, 0xb6, 0xa2, 0x78, 0xf3, 0x52, 0xbd, 0xae, 0xc4, 0xdf,
+	0x4b, 0xed, 0x06, 0xee, 0xc4, 0xb0, 0x0e, 0xa6, 0x15, 0xd7, 0x21, 0x21, 0x27, 0xcc, 0xf6, 0x5d,
+	0x74, 0x2d, 0x9f, 0x36, 0x25, 0x35, 0x75, 0x29, 0x69, 0xb8, 0xf0, 0x15, 0x98, 0xd3, 0x90, 0x13,
+	0xe2, 0x9c, 0xda, 0x7e, 0x28, 0xb7, 0x1c, 0xe8, 0x23, 0x93, 0x8f, 0x4c, 0x91, 0x84, 0xae, 0x11,
+	0x6e, 0x88, 0x37, 0x7d, 0x0b, 0x16, 0x06, 0x60, 0xdd, 0x92, 0x7e, 0xfd, 0x52, 0x25, 0xfd, 0x56,
+	0xaf, 0xb7, 0xa4, 0xbc, 0x3f, 0x01, 0x40, 0xbb, 0x14, 0x45, 0x06, 0x18, 0x84, 0x7d, 0x5d, 0x81,
+	0x44, 0x81, 0xf9, 0x06, 0x4c, 0x6a, 0x71, 0x80, 0xe3, 0x18, 0x4d, 0x0e, 0xcf, 0x5e, 0xa5, 0xac,
+	0xc4, 0xca, 0x59, 0x5d, 0x98, 0xc3, 0x1a, 0x98, 0xd2, 0x6a, 0x5d, 0x99, 0x3e, 0x36, 0xf0, 0xfe,
+	0xb1, 0x02, 0xe8, 0xaa, 0xf4, 0xd7, 0x42, 0x32, 0x36, 0x2e, 0xd8, 0xe8, 0xa1, 0x29, 0x99, 0xb0,
+	0xfd, 0x9c, 0x84, 0x6d, 0x0b, 0xbd, 0x48, 0xff, 0x41, 0xa2, 0x4e, 0xd7, 0x3d, 0x17, 0x3f, 0xd2,
+	0x03, 0x6a, 0xa0, 0x1d, 0xee, 0x80, 0x9b, 0x2a, 0x98, 0x80, 0x84, 0x9e, 0xda, 0xd0, 0xc5, 0x1c,
+	0x77, 0xd0, 0x8d, 0xfc, 0xbc, 0xcc, 0x4a, 0xe1, 0x8e, 0xd4, 0xed, 0x35, 0x0f, 0x38, 0xee, 0xc0,
+	0x06, 0x80, 0x99, 0xcd, 0x24, 0x6b, 0x07, 0x44, 0x8c, 0xd0, 0x86, 0xc9, 0x97, 0x28, 0x75, 0x16,
+	0xe6, 0xc4, 0x6a, 0x07, 0xa4, 0xe1, 0x8a, 0x2d, 0x47, 0xdf, 0xbe, 0x14, 0xbd, 0x34, 0xda, 0x72,
+	0x6c, 0x27, 0xa0, 0xde, 0x94, 0x24, 0x2d, 0xfa, 0x63, 0x48, 0x6e, 0x21, 0x4b, 0x42, 0xce, 0xee,
+	0x9b, 0xd1, 0x6b, 0xe9, 0x6a, 0xc3, 0xc4, 0xd5, 0xbe, 0xd0, 0x65, 0xd6, 0x51, 0xfd, 0x8d, 0xfa,
+	0x9b, 0xc9, 0xb4, 0xc0, 0xa7, 0xc9, 0x18, 0x54, 0x05, 0x66, 0xda, 0x20, 0x3f, 0x6a, 0x10, 0xaa,
+	0xe2, 0x52, 0x02, 0x13, 0x27, 0xb4, 0xcd, 0xd0, 0x4c, 0x7e, 0x1f, 0x49, 0x43, 0xf8, 0x7b, 0x70,
+	0xcf, 0x17, 0xdf, 0xbe, 0xde, 0x19, 0x88, 0xb1, 0x76, 0xe2, 0xc7, 0xb6, 0x58, 0x60, 0x84, 0x62,
+	0x5d, 0x81, 0x96, 0x73, 0xd7, 0xf4, 0x0b, 0x19, 0xc0, 0x5e, 0x78, 0x78, 0xe2, 0xc7, 0x9b, 0x89,
+	0x1a, 0xd6, 0xc0, 0xb5, 0x53, 0xd2, 0x39, 0xa7, 0xcc, 0x45, 0x4f, 0x25, 0xe8, 0xb3, 0xe2, 0xe8,
+	0x33, 0xb4, 0xe2, 0x2b, 0x65, 0x6e, 0x25, 0x3a, 0x58, 0x06, 0x1f, 0xca, 0x03, 0x05, 0x34, 0x6b,
+	0x90, 0x0b, 0x65, 0x0a, 0xff, 0x00, 0xa6, 0x7a, 0x0e, 0x21, 0x10, 0x94, 0x9d, 0x56, 0xcd, 0xe9,
+	0xb4, 0x5d, 0xa1, 0xd9, 0x6b, 0xfe, 0x8e, 0x60, 0x26, 0xfb, 0x2b, 0x73, 0x6f, 0x4d, 0xb6, 0xba,
+	0x37, 0x62, 0x2e, 0x88, 0x30, 0xe3, 0x21, 0x61, 0xb6, 0xea, 0x2d, 0xdf, 0x45, 0x73, 0x26, 0x73,
+	0x81, 0x56, 0xc9, 0x81, 0xd0, 0x70, 0x61, 0x0b, 0xcc, 0xf4, 0x9f, 0x7c, 0xa0, 0x9b, 0x32, 0xd4,
+	0xf5, 0x9c, 0x50, 0xf7, 0xbb, 0xb2, 0x74, 0x30, 0xf7, 0xb5, 0x59, 0xd3, 0x51, 0x6f, 0x03, 0xdc,
+	0x07, 0xb7, 0x92, 0xc3, 0x0b, 0xec, 0x79, 0x8c, 0x78, 0x98, 0x53, 0x39, 0x51, 0xdc, 0x1d, 0x12,
+	0xfb, 0x77, 0x99, 0x99, 0x62, 0x4e, 0x4b, 0x6b, 0xa9, 0xb2, 0xe1, 0x42, 0x07, 0x3c, 0x48, 0x88,
+	0xc7, 0xbe, 0xeb, 0x8a, 0xe9, 0x2c, 0xd9, 0xf0, 0xda, 0x01, 0x39, 0x23, 0xc1, 0x32, 0xfa, 0xb5,
+	0x41, 0x5e, 0xee, 0x6a, 0xc8, 0xba, 0x62, 0x24, 0xbb, 0xd7, 0x1d, 0x49, 0xc8, 0x77, 0x52, 0x46,
+	0x5f, 0x5f, 0xd2, 0x49, 0x39, 0xdf, 0x49, 0x05, 0x55, 0x2f, 0xe9, 0xa4, 0x92, 0xef, 0x64, 0x05,
+	0x3d, 0xb9, 0xa4, 0x93, 0x95, 0x7c, 0x27, 0xab, 0xe8, 0x9b, 0x4b, 0x3a, 0x59, 0x15, 0xb3, 0x5d,
+	0xea, 0x84, 0xe1, 0xd0, 0x45, 0xf7, 0x4c, 0x66, 0xbb, 0x04, 0x29, 0x14, 0xd0, 0x07, 0xd3, 0x7d,
+	0x67, 0x71, 0xe8, 0xbe, 0x1c, 0xfb, 0x2f, 0xf2, 0xc6, 0xbe, 0x52, 0xd5, 0x95, 0x48, 0x0d, 0xfd,
+	0x9e, 0x26, 0xeb, 0x46, 0xd4, 0x73, 0x0f, 0xdf, 0x15, 0xc0, 0x9d, 0x11, 0xe7, 0x7e, 0xe8, 0x81,
+	0xf4, 0x7b, 0x34, 0x9e, 0xdf, 0xae, 0xfe, 0x82, 0x10, 0x32, 0x4f, 0xad, 0xdb, 0xd1, 0xb0, 0x47,
+	0xf0, 0x2d, 0x98, 0x1d, 0x38, 0x4e, 0x44, 0x0f, 0x8d, 0x66, 0x98, 0xc4, 0x5f, 0x22, 0xeb, 0x09,
+	0x22, 0x69, 0xb4, 0x66, 0xa2, 0xbe, 0x16, 0xb8, 0x99, 0x49, 0xbb, 0x5e, 0xa9, 0x3c, 0x32, 0x2a,
+	0x5d, 0x09, 0x48, 0xad, 0x55, 0x7e, 0x0b, 0x6e, 0xa7, 0x98, 0x76, 0xcc, 0x69, 0x2b, 0x3d, 0xb6,
+	0x21, 0x4b, 0x68, 0xd1, 0x00, 0xf8, 0x49, 0x02, 0x94, 0xea, 0x5a, 0x2a, 0x1e, 0x45, 0x5e, 0x46,
+	0x9f, 0xbe, 0x3f, 0x79, 0x79, 0x14, 0xb9, 0x8c, 0x7e, 0xf6, 0xfe, 0xe4, 0xf2, 0x28, 0x72, 0x05,
+	0xfd, 0xfc, 0xfd, 0xc9, 0x95, 0x51, 0xe4, 0x15, 0xf4, 0x8b, 0xf7, 0x27, 0xaf, 0x88, 0x5d, 0x79,
+	0x42, 0xf6, 0x39, 0x69, 0x89, 0x79, 0xe0, 0x33, 0x93, 0x5d, 0xb9, 0x16, 0x35, 0x38, 0x69, 0x35,
+	0x5c, 0xb8, 0x05, 0x92, 0x21, 0x66, 0x07, 0x38, 0xf4, 0xda, 0xd8, 0x23, 0xe8, 0xb1, 0xc9, 0xaa,
+	0x4e, 0xab, 0x76, 0xb4, 0x48, 0xec, 0xfb, 0x12, 0x50, 0x8b, 0x30, 0xf1, 0x95, 0x72, 0x11, 0xd2,
+	0x2f, 0x0d, 0xa6, 0xa6, 0xe4, 0x1b, 0xda, 0xd5, 0xba, 0x86, 0x2b, 0x67, 0x68, 0x4d, 0x8b, 0x39,
+	0x65, 0x72, 0xb1, 0xf9, 0xf9, 0x18, 0xc3, 0xfc, 0x40, 0x88, 0x1a, 0x6e, 0xb6, 0xce, 0x71, 0x9f,
+	0x07, 0x04, 0x7d, 0x31, 0x46, 0x9d, 0x3b, 0x14, 0x8a, 0x6c, 0x9e, 0xc5, 0x04, 0x6f, 0x07, 0xcb,
+	0xe8, 0xcb, 0x31, 0xf2, 0x2c, 0x66, 0xee, 0x9d, 0xe5, 0x41, 0x4a, 0x19, 0x7d, 0x35, 0x2e, 0xa5,
+	0x3c, 0x48, 0xa9, 0xa0, 0xe2, 0xb8, 0x94, 0xca, 0x20, 0x65, 0x05, 0x95, 0xc6, 0xa5, 0xac, 0x0c,
+	0x52, 0x56, 0xd1, 0xd2, 0xb8, 0x94, 0x55, 0xb8, 0x06, 0xae, 0xbd, 0x6d, 0x63, 0xc6, 0x09, 0x43,
+	0xb7, 0x0c, 0xd4, 0x89, 0x31, 0xfc, 0x7b, 0x01, 0x3c, 0xc8, 0xf9, 0x49, 0x06, 0x7d, 0x2b, 0x0b,
+	0xf1, 0x0f, 0x39, 0x85, 0xf8, 0x40, 0x52, 0x36, 0x25, 0xc4, 0x52, 0x8c, 0x7d, 0xec, 0x75, 0xf7,
+	0x18, 0x23, 0x9e, 0x5b, 0x77, 0xe2, 0xe1, 0x0f, 0xe1, 0x5f, 0xc0, 0xfc, 0xc5, 0xbf, 0xf7, 0xa0,
+	0x79, 0xa3, 0x93, 0x66, 0xe5, 0xf8, 0x90, 0xb0, 0xd6, 0xae, 0x90, 0xf6, 0x05, 0xd4, 0xd3, 0x6e,
+	0xcd, 0xc5, 0x83, 0x8d, 0xf0, 0x05, 0x98, 0x88, 0x03, 0xca, 0xd1, 0x27, 0xd2, 0xdd, 0x97, 0x79,
+	0xee, 0x02, 0xaa, 0xb6, 0x39, 0xe2, 0xc2, 0x92, 0x4a, 0xd1, 0x3b, 0xe7, 0xe4, 0x58, 0x64, 0x14,
+	0xad, 0x9b, 0xf4, 0x8e, 0x36, 0x86, 0x4b, 0x60, 0x42, 0x1e, 0x12, 0x20, 0x93, 0x03, 0x63, 0x61,
+	0x29, 0x76, 0x3e, 0x72, 0xa5, 0x7f, 0xdb, 0x60, 0xe7, 0x23, 0x0c, 0x17, 0xdf, 0x15, 0xc0, 0x35,
+	0xbd, 0xd9, 0x80, 0x2f, 0x01, 0xc4, 0xae, 0xed, 0x31, 0xda, 0x8e, 0x6c, 0xfd, 0x23, 0x3d, 0x0d,
+	0xe5, 0x09, 0x71, 0xee, 0xa9, 0x07, 0x76, 0xb7, 0x84, 0xac, 0x9e, 0xa8, 0xe0, 0x73, 0x30, 0xe1,
+	0x87, 0x4d, 0x2a, 0x7f, 0xae, 0x98, 0x2c, 0x7f, 0x61, 0xb8, 0xdf, 0x69, 0x84, 0x4d, 0x6a, 0x49,
+	0xe1, 0xfa, 0xff, 0x0a, 0x60, 0xd1, 0xa1, 0xad, 0x1c, 0xe1, 0xfa, 0x54, 0xf2, 0x13, 0xdc, 0xbe,
+	0x88, 0x6b, 0xbf, 0xf0, 0xc3, 0x86, 0x16, 0x78, 0x54, 0x14, 0xe2, 0x22, 0x65, 0x5e, 0xc9, 0x23,
+	0xa1, 0x8c, 0x3a, 0xf9, 0x39, 0x30, 0xf2, 0xe3, 0x61, 0xff, 0x9c, 0xf0, 0x44, 0xfd, 0xf9, 0xc7,
+	0x95, 0x0f, 0xb6, 0x6a, 0xb5, 0x7f, 0x5e, 0xb9, 0xbf, 0xa5, 0x60, 0x35, 0x37, 0x2e, 0xaa, 0x4b,
+	0x71, 0x75, 0x54, 0x29, 0xd6, 0xa5, 0xd9, 0x7f, 0x13, 0x83, 0x37, 0x35, 0x37, 0x7e, 0x93, 0x1a,
+	0xbc, 0x39, 0xaa, 0xbc, 0x51, 0x06, 0xff, 0xbf, 0xb2, 0xa8, 0x5a, 0xab, 0xd5, 0x9a, 0x1b, 0x57,
+	0xab, 0xa9, 0x49, 0xb5, 0x7a, 0x54, 0xa9, 0x56, 0x95, 0xd1, 0xf1, 0x55, 0x19, 0x5d, 0xe5, 0xa7,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0xec, 0x3e, 0x44, 0x5d, 0x88, 0x21, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/simulation.pb.go b/googleapis/ads/googleads/v3/common/simulation.pb.go
new file mode 100644
index 0000000..37d9f33
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/simulation.pb.go
@@ -0,0 +1,679 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/simulation.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A container for simulation points for simulations of type BID_MODIFIER.
+type BidModifierSimulationPointList struct {
+	// Projected metrics for a series of bid modifier amounts.
+	Points               []*BidModifierSimulationPoint `protobuf:"bytes,1,rep,name=points,proto3" json:"points,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *BidModifierSimulationPointList) Reset()         { *m = BidModifierSimulationPointList{} }
+func (m *BidModifierSimulationPointList) String() string { return proto.CompactTextString(m) }
+func (*BidModifierSimulationPointList) ProtoMessage()    {}
+func (*BidModifierSimulationPointList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5ab119bcaf279127, []int{0}
+}
+
+func (m *BidModifierSimulationPointList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BidModifierSimulationPointList.Unmarshal(m, b)
+}
+func (m *BidModifierSimulationPointList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BidModifierSimulationPointList.Marshal(b, m, deterministic)
+}
+func (m *BidModifierSimulationPointList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BidModifierSimulationPointList.Merge(m, src)
+}
+func (m *BidModifierSimulationPointList) XXX_Size() int {
+	return xxx_messageInfo_BidModifierSimulationPointList.Size(m)
+}
+func (m *BidModifierSimulationPointList) XXX_DiscardUnknown() {
+	xxx_messageInfo_BidModifierSimulationPointList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BidModifierSimulationPointList proto.InternalMessageInfo
+
+func (m *BidModifierSimulationPointList) GetPoints() []*BidModifierSimulationPoint {
+	if m != nil {
+		return m.Points
+	}
+	return nil
+}
+
+// A container for simulation points for simulations of type CPC_BID.
+type CpcBidSimulationPointList struct {
+	// Projected metrics for a series of CPC bid amounts.
+	Points               []*CpcBidSimulationPoint `protobuf:"bytes,1,rep,name=points,proto3" json:"points,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *CpcBidSimulationPointList) Reset()         { *m = CpcBidSimulationPointList{} }
+func (m *CpcBidSimulationPointList) String() string { return proto.CompactTextString(m) }
+func (*CpcBidSimulationPointList) ProtoMessage()    {}
+func (*CpcBidSimulationPointList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5ab119bcaf279127, []int{1}
+}
+
+func (m *CpcBidSimulationPointList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CpcBidSimulationPointList.Unmarshal(m, b)
+}
+func (m *CpcBidSimulationPointList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CpcBidSimulationPointList.Marshal(b, m, deterministic)
+}
+func (m *CpcBidSimulationPointList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CpcBidSimulationPointList.Merge(m, src)
+}
+func (m *CpcBidSimulationPointList) XXX_Size() int {
+	return xxx_messageInfo_CpcBidSimulationPointList.Size(m)
+}
+func (m *CpcBidSimulationPointList) XXX_DiscardUnknown() {
+	xxx_messageInfo_CpcBidSimulationPointList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CpcBidSimulationPointList proto.InternalMessageInfo
+
+func (m *CpcBidSimulationPointList) GetPoints() []*CpcBidSimulationPoint {
+	if m != nil {
+		return m.Points
+	}
+	return nil
+}
+
+// A container for simulation points for simulations of type CPV_BID.
+type CpvBidSimulationPointList struct {
+	// Projected metrics for a series of CPV bid amounts.
+	Points               []*CpvBidSimulationPoint `protobuf:"bytes,1,rep,name=points,proto3" json:"points,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *CpvBidSimulationPointList) Reset()         { *m = CpvBidSimulationPointList{} }
+func (m *CpvBidSimulationPointList) String() string { return proto.CompactTextString(m) }
+func (*CpvBidSimulationPointList) ProtoMessage()    {}
+func (*CpvBidSimulationPointList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5ab119bcaf279127, []int{2}
+}
+
+func (m *CpvBidSimulationPointList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CpvBidSimulationPointList.Unmarshal(m, b)
+}
+func (m *CpvBidSimulationPointList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CpvBidSimulationPointList.Marshal(b, m, deterministic)
+}
+func (m *CpvBidSimulationPointList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CpvBidSimulationPointList.Merge(m, src)
+}
+func (m *CpvBidSimulationPointList) XXX_Size() int {
+	return xxx_messageInfo_CpvBidSimulationPointList.Size(m)
+}
+func (m *CpvBidSimulationPointList) XXX_DiscardUnknown() {
+	xxx_messageInfo_CpvBidSimulationPointList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CpvBidSimulationPointList proto.InternalMessageInfo
+
+func (m *CpvBidSimulationPointList) GetPoints() []*CpvBidSimulationPoint {
+	if m != nil {
+		return m.Points
+	}
+	return nil
+}
+
+// A container for simulation points for simulations of type TARGET_CPA.
+type TargetCpaSimulationPointList struct {
+	// Projected metrics for a series of target CPA amounts.
+	Points               []*TargetCpaSimulationPoint `protobuf:"bytes,1,rep,name=points,proto3" json:"points,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *TargetCpaSimulationPointList) Reset()         { *m = TargetCpaSimulationPointList{} }
+func (m *TargetCpaSimulationPointList) String() string { return proto.CompactTextString(m) }
+func (*TargetCpaSimulationPointList) ProtoMessage()    {}
+func (*TargetCpaSimulationPointList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5ab119bcaf279127, []int{3}
+}
+
+func (m *TargetCpaSimulationPointList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetCpaSimulationPointList.Unmarshal(m, b)
+}
+func (m *TargetCpaSimulationPointList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetCpaSimulationPointList.Marshal(b, m, deterministic)
+}
+func (m *TargetCpaSimulationPointList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetCpaSimulationPointList.Merge(m, src)
+}
+func (m *TargetCpaSimulationPointList) XXX_Size() int {
+	return xxx_messageInfo_TargetCpaSimulationPointList.Size(m)
+}
+func (m *TargetCpaSimulationPointList) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetCpaSimulationPointList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetCpaSimulationPointList proto.InternalMessageInfo
+
+func (m *TargetCpaSimulationPointList) GetPoints() []*TargetCpaSimulationPoint {
+	if m != nil {
+		return m.Points
+	}
+	return nil
+}
+
+// Projected metrics for a specific bid modifier amount.
+type BidModifierSimulationPoint struct {
+	// The simulated bid modifier upon which projected metrics are based.
+	BidModifier *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=bid_modifier,json=bidModifier,proto3" json:"bid_modifier,omitempty"`
+	// Projected number of biddable conversions.
+	// Only search advertising channel type supports this field.
+	BiddableConversions *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=biddable_conversions,json=biddableConversions,proto3" json:"biddable_conversions,omitempty"`
+	// Projected total value of biddable conversions.
+	// Only search advertising channel type supports this field.
+	BiddableConversionsValue *wrappers.DoubleValue `protobuf:"bytes,3,opt,name=biddable_conversions_value,json=biddableConversionsValue,proto3" json:"biddable_conversions_value,omitempty"`
+	// Projected number of clicks.
+	Clicks *wrappers.Int64Value `protobuf:"bytes,4,opt,name=clicks,proto3" json:"clicks,omitempty"`
+	// Projected cost in micros.
+	CostMicros *wrappers.Int64Value `protobuf:"bytes,5,opt,name=cost_micros,json=costMicros,proto3" json:"cost_micros,omitempty"`
+	// Projected number of impressions.
+	Impressions *wrappers.Int64Value `protobuf:"bytes,6,opt,name=impressions,proto3" json:"impressions,omitempty"`
+	// Projected number of top slot impressions.
+	// Only search advertising channel type supports this field.
+	TopSlotImpressions *wrappers.Int64Value `protobuf:"bytes,7,opt,name=top_slot_impressions,json=topSlotImpressions,proto3" json:"top_slot_impressions,omitempty"`
+	// Projected number of biddable conversions for the parent resource.
+	// Only search advertising channel type supports this field.
+	ParentBiddableConversions *wrappers.DoubleValue `protobuf:"bytes,8,opt,name=parent_biddable_conversions,json=parentBiddableConversions,proto3" json:"parent_biddable_conversions,omitempty"`
+	// Projected total value of biddable conversions for the parent resource.
+	// Only search advertising channel type supports this field.
+	ParentBiddableConversionsValue *wrappers.DoubleValue `protobuf:"bytes,9,opt,name=parent_biddable_conversions_value,json=parentBiddableConversionsValue,proto3" json:"parent_biddable_conversions_value,omitempty"`
+	// Projected number of clicks for the parent resource.
+	ParentClicks *wrappers.Int64Value `protobuf:"bytes,10,opt,name=parent_clicks,json=parentClicks,proto3" json:"parent_clicks,omitempty"`
+	// Projected cost in micros for the parent resource.
+	ParentCostMicros *wrappers.Int64Value `protobuf:"bytes,11,opt,name=parent_cost_micros,json=parentCostMicros,proto3" json:"parent_cost_micros,omitempty"`
+	// Projected number of impressions for the parent resource.
+	ParentImpressions *wrappers.Int64Value `protobuf:"bytes,12,opt,name=parent_impressions,json=parentImpressions,proto3" json:"parent_impressions,omitempty"`
+	// Projected number of top slot impressions for the parent resource.
+	// Only search advertising channel type supports this field.
+	ParentTopSlotImpressions *wrappers.Int64Value `protobuf:"bytes,13,opt,name=parent_top_slot_impressions,json=parentTopSlotImpressions,proto3" json:"parent_top_slot_impressions,omitempty"`
+	// Projected minimum daily budget that must be available to the parent
+	// resource to realize this simulation.
+	ParentRequiredBudgetMicros *wrappers.Int64Value `protobuf:"bytes,14,opt,name=parent_required_budget_micros,json=parentRequiredBudgetMicros,proto3" json:"parent_required_budget_micros,omitempty"`
+	XXX_NoUnkeyedLiteral       struct{}             `json:"-"`
+	XXX_unrecognized           []byte               `json:"-"`
+	XXX_sizecache              int32                `json:"-"`
+}
+
+func (m *BidModifierSimulationPoint) Reset()         { *m = BidModifierSimulationPoint{} }
+func (m *BidModifierSimulationPoint) String() string { return proto.CompactTextString(m) }
+func (*BidModifierSimulationPoint) ProtoMessage()    {}
+func (*BidModifierSimulationPoint) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5ab119bcaf279127, []int{4}
+}
+
+func (m *BidModifierSimulationPoint) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BidModifierSimulationPoint.Unmarshal(m, b)
+}
+func (m *BidModifierSimulationPoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BidModifierSimulationPoint.Marshal(b, m, deterministic)
+}
+func (m *BidModifierSimulationPoint) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BidModifierSimulationPoint.Merge(m, src)
+}
+func (m *BidModifierSimulationPoint) XXX_Size() int {
+	return xxx_messageInfo_BidModifierSimulationPoint.Size(m)
+}
+func (m *BidModifierSimulationPoint) XXX_DiscardUnknown() {
+	xxx_messageInfo_BidModifierSimulationPoint.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BidModifierSimulationPoint proto.InternalMessageInfo
+
+func (m *BidModifierSimulationPoint) GetBidModifier() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BidModifier
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetBiddableConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BiddableConversions
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetBiddableConversionsValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BiddableConversionsValue
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.Clicks
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CostMicros
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.Impressions
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetTopSlotImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.TopSlotImpressions
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetParentBiddableConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ParentBiddableConversions
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetParentBiddableConversionsValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ParentBiddableConversionsValue
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetParentClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.ParentClicks
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetParentCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.ParentCostMicros
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetParentImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.ParentImpressions
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetParentTopSlotImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.ParentTopSlotImpressions
+	}
+	return nil
+}
+
+func (m *BidModifierSimulationPoint) GetParentRequiredBudgetMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.ParentRequiredBudgetMicros
+	}
+	return nil
+}
+
+// Projected metrics for a specific CPC bid amount.
+type CpcBidSimulationPoint struct {
+	// The simulated CPC bid upon which projected metrics are based.
+	CpcBidMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
+	// Projected number of biddable conversions.
+	BiddableConversions *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=biddable_conversions,json=biddableConversions,proto3" json:"biddable_conversions,omitempty"`
+	// Projected total value of biddable conversions.
+	BiddableConversionsValue *wrappers.DoubleValue `protobuf:"bytes,3,opt,name=biddable_conversions_value,json=biddableConversionsValue,proto3" json:"biddable_conversions_value,omitempty"`
+	// Projected number of clicks.
+	Clicks *wrappers.Int64Value `protobuf:"bytes,4,opt,name=clicks,proto3" json:"clicks,omitempty"`
+	// Projected cost in micros.
+	CostMicros *wrappers.Int64Value `protobuf:"bytes,5,opt,name=cost_micros,json=costMicros,proto3" json:"cost_micros,omitempty"`
+	// Projected number of impressions.
+	Impressions *wrappers.Int64Value `protobuf:"bytes,6,opt,name=impressions,proto3" json:"impressions,omitempty"`
+	// Projected number of top slot impressions.
+	// Only search advertising channel type supports this field.
+	TopSlotImpressions   *wrappers.Int64Value `protobuf:"bytes,7,opt,name=top_slot_impressions,json=topSlotImpressions,proto3" json:"top_slot_impressions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *CpcBidSimulationPoint) Reset()         { *m = CpcBidSimulationPoint{} }
+func (m *CpcBidSimulationPoint) String() string { return proto.CompactTextString(m) }
+func (*CpcBidSimulationPoint) ProtoMessage()    {}
+func (*CpcBidSimulationPoint) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5ab119bcaf279127, []int{5}
+}
+
+func (m *CpcBidSimulationPoint) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CpcBidSimulationPoint.Unmarshal(m, b)
+}
+func (m *CpcBidSimulationPoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CpcBidSimulationPoint.Marshal(b, m, deterministic)
+}
+func (m *CpcBidSimulationPoint) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CpcBidSimulationPoint.Merge(m, src)
+}
+func (m *CpcBidSimulationPoint) XXX_Size() int {
+	return xxx_messageInfo_CpcBidSimulationPoint.Size(m)
+}
+func (m *CpcBidSimulationPoint) XXX_DiscardUnknown() {
+	xxx_messageInfo_CpcBidSimulationPoint.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CpcBidSimulationPoint proto.InternalMessageInfo
+
+func (m *CpcBidSimulationPoint) GetCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidMicros
+	}
+	return nil
+}
+
+func (m *CpcBidSimulationPoint) GetBiddableConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BiddableConversions
+	}
+	return nil
+}
+
+func (m *CpcBidSimulationPoint) GetBiddableConversionsValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BiddableConversionsValue
+	}
+	return nil
+}
+
+func (m *CpcBidSimulationPoint) GetClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.Clicks
+	}
+	return nil
+}
+
+func (m *CpcBidSimulationPoint) GetCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CostMicros
+	}
+	return nil
+}
+
+func (m *CpcBidSimulationPoint) GetImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.Impressions
+	}
+	return nil
+}
+
+func (m *CpcBidSimulationPoint) GetTopSlotImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.TopSlotImpressions
+	}
+	return nil
+}
+
+// Projected metrics for a specific CPV bid amount.
+type CpvBidSimulationPoint struct {
+	// The simulated CPV bid upon which projected metrics are based.
+	CpvBidMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=cpv_bid_micros,json=cpvBidMicros,proto3" json:"cpv_bid_micros,omitempty"`
+	// Projected cost in micros.
+	CostMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=cost_micros,json=costMicros,proto3" json:"cost_micros,omitempty"`
+	// Projected number of impressions.
+	Impressions *wrappers.Int64Value `protobuf:"bytes,3,opt,name=impressions,proto3" json:"impressions,omitempty"`
+	// Projected number of views.
+	Views                *wrappers.Int64Value `protobuf:"bytes,4,opt,name=views,proto3" json:"views,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *CpvBidSimulationPoint) Reset()         { *m = CpvBidSimulationPoint{} }
+func (m *CpvBidSimulationPoint) String() string { return proto.CompactTextString(m) }
+func (*CpvBidSimulationPoint) ProtoMessage()    {}
+func (*CpvBidSimulationPoint) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5ab119bcaf279127, []int{6}
+}
+
+func (m *CpvBidSimulationPoint) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CpvBidSimulationPoint.Unmarshal(m, b)
+}
+func (m *CpvBidSimulationPoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CpvBidSimulationPoint.Marshal(b, m, deterministic)
+}
+func (m *CpvBidSimulationPoint) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CpvBidSimulationPoint.Merge(m, src)
+}
+func (m *CpvBidSimulationPoint) XXX_Size() int {
+	return xxx_messageInfo_CpvBidSimulationPoint.Size(m)
+}
+func (m *CpvBidSimulationPoint) XXX_DiscardUnknown() {
+	xxx_messageInfo_CpvBidSimulationPoint.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CpvBidSimulationPoint proto.InternalMessageInfo
+
+func (m *CpvBidSimulationPoint) GetCpvBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpvBidMicros
+	}
+	return nil
+}
+
+func (m *CpvBidSimulationPoint) GetCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CostMicros
+	}
+	return nil
+}
+
+func (m *CpvBidSimulationPoint) GetImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.Impressions
+	}
+	return nil
+}
+
+func (m *CpvBidSimulationPoint) GetViews() *wrappers.Int64Value {
+	if m != nil {
+		return m.Views
+	}
+	return nil
+}
+
+// Projected metrics for a specific target CPA amount.
+type TargetCpaSimulationPoint struct {
+	// The simulated target CPA upon which projected metrics are based.
+	TargetCpaMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=target_cpa_micros,json=targetCpaMicros,proto3" json:"target_cpa_micros,omitempty"`
+	// Projected number of biddable conversions.
+	BiddableConversions *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=biddable_conversions,json=biddableConversions,proto3" json:"biddable_conversions,omitempty"`
+	// Projected total value of biddable conversions.
+	BiddableConversionsValue *wrappers.DoubleValue `protobuf:"bytes,3,opt,name=biddable_conversions_value,json=biddableConversionsValue,proto3" json:"biddable_conversions_value,omitempty"`
+	// Projected number of clicks.
+	Clicks *wrappers.Int64Value `protobuf:"bytes,4,opt,name=clicks,proto3" json:"clicks,omitempty"`
+	// Projected cost in micros.
+	CostMicros *wrappers.Int64Value `protobuf:"bytes,5,opt,name=cost_micros,json=costMicros,proto3" json:"cost_micros,omitempty"`
+	// Projected number of impressions.
+	Impressions *wrappers.Int64Value `protobuf:"bytes,6,opt,name=impressions,proto3" json:"impressions,omitempty"`
+	// Projected number of top slot impressions.
+	// Only search advertising channel type supports this field.
+	TopSlotImpressions   *wrappers.Int64Value `protobuf:"bytes,7,opt,name=top_slot_impressions,json=topSlotImpressions,proto3" json:"top_slot_impressions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *TargetCpaSimulationPoint) Reset()         { *m = TargetCpaSimulationPoint{} }
+func (m *TargetCpaSimulationPoint) String() string { return proto.CompactTextString(m) }
+func (*TargetCpaSimulationPoint) ProtoMessage()    {}
+func (*TargetCpaSimulationPoint) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5ab119bcaf279127, []int{7}
+}
+
+func (m *TargetCpaSimulationPoint) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetCpaSimulationPoint.Unmarshal(m, b)
+}
+func (m *TargetCpaSimulationPoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetCpaSimulationPoint.Marshal(b, m, deterministic)
+}
+func (m *TargetCpaSimulationPoint) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetCpaSimulationPoint.Merge(m, src)
+}
+func (m *TargetCpaSimulationPoint) XXX_Size() int {
+	return xxx_messageInfo_TargetCpaSimulationPoint.Size(m)
+}
+func (m *TargetCpaSimulationPoint) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetCpaSimulationPoint.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetCpaSimulationPoint proto.InternalMessageInfo
+
+func (m *TargetCpaSimulationPoint) GetTargetCpaMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TargetCpaMicros
+	}
+	return nil
+}
+
+func (m *TargetCpaSimulationPoint) GetBiddableConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BiddableConversions
+	}
+	return nil
+}
+
+func (m *TargetCpaSimulationPoint) GetBiddableConversionsValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BiddableConversionsValue
+	}
+	return nil
+}
+
+func (m *TargetCpaSimulationPoint) GetClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.Clicks
+	}
+	return nil
+}
+
+func (m *TargetCpaSimulationPoint) GetCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CostMicros
+	}
+	return nil
+}
+
+func (m *TargetCpaSimulationPoint) GetImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.Impressions
+	}
+	return nil
+}
+
+func (m *TargetCpaSimulationPoint) GetTopSlotImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.TopSlotImpressions
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*BidModifierSimulationPointList)(nil), "google.ads.googleads.v3.common.BidModifierSimulationPointList")
+	proto.RegisterType((*CpcBidSimulationPointList)(nil), "google.ads.googleads.v3.common.CpcBidSimulationPointList")
+	proto.RegisterType((*CpvBidSimulationPointList)(nil), "google.ads.googleads.v3.common.CpvBidSimulationPointList")
+	proto.RegisterType((*TargetCpaSimulationPointList)(nil), "google.ads.googleads.v3.common.TargetCpaSimulationPointList")
+	proto.RegisterType((*BidModifierSimulationPoint)(nil), "google.ads.googleads.v3.common.BidModifierSimulationPoint")
+	proto.RegisterType((*CpcBidSimulationPoint)(nil), "google.ads.googleads.v3.common.CpcBidSimulationPoint")
+	proto.RegisterType((*CpvBidSimulationPoint)(nil), "google.ads.googleads.v3.common.CpvBidSimulationPoint")
+	proto.RegisterType((*TargetCpaSimulationPoint)(nil), "google.ads.googleads.v3.common.TargetCpaSimulationPoint")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/simulation.proto", fileDescriptor_5ab119bcaf279127)
+}
+
+var fileDescriptor_5ab119bcaf279127 = []byte{
+	// 741 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x97, 0xcd, 0x6e, 0xd3, 0x4e,
+	0x14, 0xc5, 0x95, 0xa4, 0xcd, 0xbf, 0xff, 0x49, 0x3f, 0xa8, 0x29, 0x92, 0x9b, 0x96, 0xa8, 0x64,
+	0xd5, 0x95, 0x2d, 0x6a, 0x40, 0xc8, 0x80, 0x20, 0x49, 0xa5, 0xaa, 0x88, 0x88, 0x2a, 0xad, 0xb2,
+	0xa8, 0x22, 0x2c, 0x7f, 0x4c, 0xad, 0x01, 0xdb, 0x33, 0x78, 0x26, 0xee, 0x2b, 0x20, 0x76, 0xbc,
+	0x02, 0x4b, 0x1e, 0x85, 0x17, 0x41, 0xea, 0x53, 0x20, 0x7b, 0xc6, 0x8e, 0x69, 0xed, 0x3a, 0x15,
+	0x6c, 0x2a, 0x75, 0x95, 0x49, 0xe6, 0x9e, 0xdf, 0x71, 0xee, 0xb9, 0x9e, 0xc4, 0x40, 0x75, 0x31,
+	0x76, 0x3d, 0xa8, 0x9a, 0x0e, 0x15, 0xcb, 0x78, 0x15, 0x69, 0xaa, 0x8d, 0x7d, 0x1f, 0x07, 0x2a,
+	0x45, 0xfe, 0xd4, 0x33, 0x19, 0xc2, 0x81, 0x42, 0x42, 0xcc, 0xb0, 0xd4, 0xe1, 0x55, 0x8a, 0xe9,
+	0x50, 0x25, 0x13, 0x28, 0x91, 0xa6, 0x70, 0x41, 0x5b, 0xec, 0xab, 0x49, 0xb5, 0x35, 0x3d, 0x53,
+	0xcf, 0x43, 0x93, 0x10, 0x18, 0x52, 0xae, 0x6f, 0x6f, 0xa7, 0x86, 0x04, 0xa9, 0x66, 0x10, 0x60,
+	0x96, 0xc0, 0xc5, 0x6e, 0x97, 0x81, 0x4e, 0x1f, 0x39, 0x43, 0xec, 0xa0, 0x33, 0x04, 0xc3, 0xe3,
+	0xcc, 0xfc, 0x08, 0xa3, 0x80, 0xbd, 0x43, 0x94, 0x49, 0x23, 0xd0, 0x24, 0xf1, 0x1b, 0x2a, 0xd7,
+	0x76, 0x1a, 0xbb, 0xad, 0x3d, 0x5d, 0xb9, 0xfe, 0x82, 0x94, 0x72, 0xde, 0x48, 0x90, 0xba, 0x1f,
+	0xc1, 0xe6, 0x80, 0xd8, 0x7d, 0xe4, 0x14, 0x19, 0x0e, 0x2f, 0x19, 0x3e, 0xad, 0x32, 0x2c, 0x44,
+	0xfd, 0xe9, 0x15, 0xfd, 0x3b, 0xaf, 0xe8, 0x1a, 0x2f, 0x02, 0xb6, 0x4f, 0xcc, 0xd0, 0x85, 0x6c,
+	0x40, 0xcc, 0x22, 0xbb, 0xa3, 0x4b, 0x76, 0xcf, 0xab, 0xec, 0xca, 0x68, 0x99, 0xe3, 0xaf, 0x25,
+	0xd0, 0x2e, 0x6f, 0xb8, 0xf4, 0x1a, 0x2c, 0x5b, 0xc8, 0x31, 0x7c, 0xb1, 0x2d, 0xd7, 0x76, 0x6a,
+	0xbb, 0xad, 0xbd, 0xed, 0xd4, 0x36, 0x9d, 0x19, 0x65, 0x1f, 0x4f, 0x2d, 0x0f, 0x8e, 0x4d, 0x6f,
+	0x0a, 0x47, 0x2d, 0x6b, 0xc6, 0x93, 0xde, 0x83, 0x0d, 0x0b, 0x39, 0x8e, 0x69, 0x79, 0xd0, 0xb0,
+	0x71, 0x10, 0xc1, 0x90, 0xc6, 0xd3, 0x23, 0xd7, 0xe7, 0x00, 0xdd, 0x4f, 0x95, 0x83, 0x99, 0x50,
+	0x3a, 0x05, 0xed, 0x22, 0xa0, 0x11, 0xc5, 0x12, 0xb9, 0x31, 0x07, 0x56, 0x2e, 0xc0, 0x26, 0x3b,
+	0x92, 0x06, 0x9a, 0xb6, 0x87, 0xec, 0x4f, 0x54, 0x5e, 0x48, 0x38, 0x5b, 0x57, 0x38, 0x87, 0x01,
+	0x7b, 0xf6, 0x84, 0x63, 0x44, 0xa9, 0xf4, 0x12, 0xb4, 0x6c, 0x4c, 0x99, 0xe1, 0x23, 0x3b, 0xc4,
+	0x54, 0x5e, 0xac, 0x56, 0x82, 0xb8, 0x7e, 0x98, 0x94, 0x4b, 0xaf, 0x40, 0x0b, 0xf9, 0x24, 0x84,
+	0x94, 0xb7, 0xa5, 0x59, 0xad, 0xce, 0xd7, 0x4b, 0x43, 0xb0, 0xc1, 0x30, 0x31, 0xa8, 0x87, 0x99,
+	0x91, 0xe7, 0xfc, 0x57, 0xcd, 0x91, 0x18, 0x26, 0xc7, 0x1e, 0x66, 0x87, 0x39, 0xdc, 0x04, 0x6c,
+	0x11, 0x33, 0x84, 0x01, 0x33, 0x0a, 0x43, 0x5b, 0x9a, 0xa3, 0xbb, 0x9b, 0x1c, 0xd0, 0x2f, 0x88,
+	0xce, 0x05, 0x8f, 0xae, 0xa1, 0x8b, 0x04, 0xff, 0x9f, 0xc3, 0xa3, 0x53, 0xea, 0xc1, 0x73, 0x7c,
+	0x03, 0x56, 0x84, 0x91, 0x88, 0x13, 0x54, 0xb7, 0x63, 0x99, 0x2b, 0x06, 0x3c, 0xd4, 0x43, 0x20,
+	0xa5, 0x84, 0x5c, 0xb6, 0xad, 0x6a, 0xcc, 0x3d, 0x81, 0x99, 0x25, 0xfc, 0x36, 0x43, 0xe5, 0x03,
+	0x5a, 0xae, 0x46, 0xad, 0x73, 0x59, 0x3e, 0x9f, 0xd3, 0x2c, 0x9f, 0xc2, 0xd4, 0x57, 0xaa, 0xa1,
+	0x32, 0xd7, 0x9f, 0x5c, 0xcd, 0xfe, 0x03, 0x78, 0x28, 0xd8, 0x21, 0xfc, 0x3c, 0x45, 0x21, 0x74,
+	0x0c, 0x6b, 0xea, 0xb8, 0x30, 0xfb, 0xf6, 0xab, 0xd5, 0xf4, 0x36, 0x27, 0x8c, 0x04, 0xa0, 0x9f,
+	0xe8, 0x79, 0x1f, 0xba, 0x5f, 0x16, 0xc0, 0x83, 0xc2, 0x93, 0x56, 0xea, 0x81, 0x55, 0x9b, 0xd8,
+	0x46, 0x72, 0xd0, 0x70, 0xab, 0xda, 0x1c, 0x79, 0xd9, 0x09, 0x4b, 0x34, 0xf9, 0xee, 0x98, 0xb9,
+	0x45, 0xc7, 0x4c, 0xf7, 0x6b, 0x3d, 0x1e, 0x85, 0xa8, 0x6c, 0x14, 0xa2, 0x9b, 0x8f, 0x42, 0x34,
+	0x1b, 0x85, 0x4b, 0x8d, 0xaa, 0xff, 0x55, 0xa3, 0x1a, 0x37, 0x6c, 0xd4, 0x63, 0xb0, 0x18, 0x21,
+	0x78, 0x3e, 0x57, 0xb2, 0xbc, 0xb2, 0xfb, 0x6d, 0x01, 0xc8, 0x65, 0x3f, 0xd3, 0xd2, 0x01, 0x58,
+	0x67, 0xc9, 0x9e, 0x61, 0x13, 0xf3, 0x06, 0x2d, 0x59, 0x63, 0x29, 0xf1, 0xee, 0x06, 0xb9, 0x7d,
+	0x37, 0x48, 0xff, 0xa2, 0x06, 0xba, 0x36, 0xf6, 0x2b, 0xfe, 0xdd, 0xf5, 0xd7, 0x72, 0xe3, 0x12,
+	0x93, 0x8f, 0x6a, 0xa7, 0xfb, 0x42, 0xe2, 0x62, 0xcf, 0x0c, 0x5c, 0x05, 0x87, 0xae, 0xea, 0xc2,
+	0x20, 0xf1, 0x4d, 0x1f, 0x17, 0x08, 0xa2, 0x65, 0x4f, 0x0f, 0x2f, 0xf8, 0xcb, 0xf7, 0x7a, 0xe3,
+	0xa0, 0xd7, 0xfb, 0x51, 0xef, 0x1c, 0x70, 0x58, 0xcf, 0xa1, 0x0a, 0x5f, 0xc6, 0xab, 0xb1, 0xa6,
+	0x0c, 0x92, 0xb2, 0x9f, 0x69, 0xc1, 0xa4, 0xe7, 0xd0, 0x49, 0x56, 0x30, 0x19, 0x6b, 0x13, 0x5e,
+	0x70, 0x51, 0xef, 0xf2, 0x4f, 0x75, 0xbd, 0xe7, 0x50, 0x5d, 0xcf, 0x4a, 0x74, 0x7d, 0xac, 0xe9,
+	0x3a, 0x2f, 0xb2, 0x9a, 0xc9, 0xd5, 0x69, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x53, 0x82, 0xf1,
+	0xae, 0xda, 0x0c, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/tag_snippet.pb.go b/googleapis/ads/googleads/v3/common/tag_snippet.pb.go
new file mode 100644
index 0000000..b566729
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/tag_snippet.pb.go
@@ -0,0 +1,135 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/tag_snippet.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The site tag and event snippet pair for a TrackingCodeType.
+type TagSnippet struct {
+	// The type of the generated tag snippets for tracking conversions.
+	Type enums.TrackingCodeTypeEnum_TrackingCodeType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.TrackingCodeTypeEnum_TrackingCodeType" json:"type,omitempty"`
+	// The format of the web page where the tracking tag and snippet will be
+	// installed, e.g. HTML.
+	PageFormat enums.TrackingCodePageFormatEnum_TrackingCodePageFormat `protobuf:"varint,2,opt,name=page_format,json=pageFormat,proto3,enum=google.ads.googleads.v3.enums.TrackingCodePageFormatEnum_TrackingCodePageFormat" json:"page_format,omitempty"`
+	// The site tag that adds visitors to your basic remarketing lists and sets
+	// new cookies on your domain.
+	GlobalSiteTag *wrappers.StringValue `protobuf:"bytes,3,opt,name=global_site_tag,json=globalSiteTag,proto3" json:"global_site_tag,omitempty"`
+	// The event snippet that works with the site tag to track actions that
+	// should be counted as conversions.
+	EventSnippet         *wrappers.StringValue `protobuf:"bytes,4,opt,name=event_snippet,json=eventSnippet,proto3" json:"event_snippet,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *TagSnippet) Reset()         { *m = TagSnippet{} }
+func (m *TagSnippet) String() string { return proto.CompactTextString(m) }
+func (*TagSnippet) ProtoMessage()    {}
+func (*TagSnippet) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3d82c3f30f27f01d, []int{0}
+}
+
+func (m *TagSnippet) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TagSnippet.Unmarshal(m, b)
+}
+func (m *TagSnippet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TagSnippet.Marshal(b, m, deterministic)
+}
+func (m *TagSnippet) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TagSnippet.Merge(m, src)
+}
+func (m *TagSnippet) XXX_Size() int {
+	return xxx_messageInfo_TagSnippet.Size(m)
+}
+func (m *TagSnippet) XXX_DiscardUnknown() {
+	xxx_messageInfo_TagSnippet.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TagSnippet proto.InternalMessageInfo
+
+func (m *TagSnippet) GetType() enums.TrackingCodeTypeEnum_TrackingCodeType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.TrackingCodeTypeEnum_UNSPECIFIED
+}
+
+func (m *TagSnippet) GetPageFormat() enums.TrackingCodePageFormatEnum_TrackingCodePageFormat {
+	if m != nil {
+		return m.PageFormat
+	}
+	return enums.TrackingCodePageFormatEnum_UNSPECIFIED
+}
+
+func (m *TagSnippet) GetGlobalSiteTag() *wrappers.StringValue {
+	if m != nil {
+		return m.GlobalSiteTag
+	}
+	return nil
+}
+
+func (m *TagSnippet) GetEventSnippet() *wrappers.StringValue {
+	if m != nil {
+		return m.EventSnippet
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*TagSnippet)(nil), "google.ads.googleads.v3.common.TagSnippet")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/tag_snippet.proto", fileDescriptor_3d82c3f30f27f01d)
+}
+
+var fileDescriptor_3d82c3f30f27f01d = []byte{
+	// 420 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x4f, 0x6b, 0xdb, 0x30,
+	0x14, 0xc7, 0x6e, 0xd9, 0x41, 0x5d, 0x57, 0xf0, 0x29, 0x94, 0x52, 0x4a, 0x4e, 0x3d, 0x49, 0xa3,
+	0x86, 0x1d, 0x34, 0x76, 0x70, 0x9b, 0xad, 0xd7, 0x90, 0x84, 0x30, 0x46, 0xc0, 0xbc, 0xc4, 0xaf,
+	0x42, 0xcc, 0x96, 0x34, 0x4b, 0xc9, 0xe8, 0xd7, 0xd9, 0x71, 0x1f, 0x65, 0x1f, 0x63, 0xc7, 0x7e,
+	0x8a, 0x61, 0x49, 0x76, 0x07, 0x25, 0x63, 0x39, 0xf9, 0x67, 0xbd, 0xdf, 0x9f, 0xf7, 0xa4, 0x47,
+	0xde, 0x0a, 0xad, 0x45, 0x8d, 0x0c, 0x2a, 0xcb, 0x02, 0xec, 0xd0, 0x2e, 0x67, 0x1b, 0xdd, 0x34,
+	0x5a, 0x31, 0x07, 0xa2, 0xb4, 0x4a, 0x1a, 0x83, 0x8e, 0x9a, 0x56, 0x3b, 0x9d, 0x5d, 0x06, 0x1a,
+	0x85, 0xca, 0xd2, 0x41, 0x41, 0x77, 0x39, 0x0d, 0x8a, 0xf3, 0x0f, 0xfb, 0x1c, 0x51, 0x6d, 0x1b,
+	0xcb, 0x5c, 0x0b, 0x9b, 0xaf, 0x52, 0x89, 0x72, 0xa3, 0x2b, 0x2c, 0x0d, 0x08, 0x2c, 0x1f, 0x74,
+	0xdb, 0x40, 0xb4, 0x3f, 0x7f, 0x77, 0x88, 0xdc, 0x3d, 0x1a, 0x8c, 0xba, 0xd8, 0x16, 0xf3, 0x7f,
+	0xeb, 0xed, 0x03, 0xfb, 0xde, 0x82, 0x31, 0xd8, 0xda, 0x58, 0xbf, 0xe8, 0x7d, 0x8d, 0x64, 0xa0,
+	0x94, 0x76, 0xe0, 0xa4, 0x56, 0xb1, 0x3a, 0xfe, 0x9d, 0x12, 0xb2, 0x00, 0x31, 0x0f, 0x93, 0x66,
+	0x9f, 0xc9, 0x71, 0x67, 0x3d, 0x4a, 0xae, 0x92, 0xeb, 0x37, 0x37, 0x13, 0xba, 0x6f, 0x64, 0xdf,
+	0x13, 0x5d, 0xc4, 0x9e, 0xee, 0x74, 0x85, 0x8b, 0x47, 0x83, 0x1f, 0xd5, 0xb6, 0x79, 0x71, 0x38,
+	0xf3, 0x8e, 0xd9, 0x37, 0x72, 0xf2, 0xd7, 0xcc, 0xa3, 0xd4, 0x07, 0x4c, 0x0f, 0x08, 0x98, 0x82,
+	0xc0, 0x4f, 0x5e, 0xfc, 0x22, 0xe6, 0xb9, 0x34, 0x23, 0x66, 0xc0, 0xd9, 0x84, 0x9c, 0x89, 0x5a,
+	0xaf, 0xa1, 0x2e, 0xad, 0x74, 0x58, 0x3a, 0x10, 0xa3, 0xa3, 0xab, 0xe4, 0xfa, 0xe4, 0xe6, 0xa2,
+	0x8f, 0xed, 0xef, 0x8c, 0xce, 0x5d, 0x2b, 0x95, 0x58, 0x42, 0xbd, 0xc5, 0xd9, 0x69, 0x10, 0xcd,
+	0xa5, 0xc3, 0x05, 0x88, 0xac, 0x20, 0xa7, 0xb8, 0x43, 0xe5, 0xfa, 0x6d, 0x18, 0x1d, 0xff, 0x87,
+	0xc7, 0x6b, 0x2f, 0x89, 0xb7, 0x7a, 0xfb, 0x94, 0x90, 0xf1, 0x46, 0x37, 0xf4, 0xdf, 0x0b, 0x74,
+	0x7b, 0xf6, 0xfc, 0x10, 0xd3, 0xce, 0x74, 0x9a, 0x7c, 0x99, 0x44, 0x89, 0xd0, 0x35, 0x28, 0x41,
+	0x75, 0x2b, 0x98, 0x40, 0xe5, 0x23, 0xfb, 0x25, 0x31, 0xd2, 0xee, 0x5b, 0xe2, 0xf7, 0xe1, 0xf3,
+	0x23, 0x3d, 0xba, 0x2f, 0x8a, 0x9f, 0xe9, 0xe5, 0x7d, 0x30, 0x2b, 0x2a, 0x4b, 0x03, 0xec, 0xd0,
+	0x32, 0xa7, 0x77, 0x9e, 0xf6, 0xab, 0x27, 0xac, 0x8a, 0xca, 0xae, 0x06, 0xc2, 0x6a, 0x99, 0xaf,
+	0x02, 0xe1, 0x29, 0x1d, 0x87, 0x53, 0xce, 0x8b, 0xca, 0x72, 0x3e, 0x50, 0x38, 0x5f, 0xe6, 0x9c,
+	0x07, 0xd2, 0xfa, 0x95, 0xef, 0x2e, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x72, 0x4c, 0x99, 0x8f,
+	0x61, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/targeting_setting.pb.go b/googleapis/ads/googleads/v3/common/targeting_setting.pb.go
new file mode 100644
index 0000000..a38b90b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/targeting_setting.pb.go
@@ -0,0 +1,271 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/targeting_setting.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The operator.
+type TargetRestrictionOperation_Operator int32
+
+const (
+	// Unspecified.
+	TargetRestrictionOperation_UNSPECIFIED TargetRestrictionOperation_Operator = 0
+	// Used for return value only. Represents value unknown in this version.
+	TargetRestrictionOperation_UNKNOWN TargetRestrictionOperation_Operator = 1
+	// Add the restriction to the existing restrictions.
+	TargetRestrictionOperation_ADD TargetRestrictionOperation_Operator = 2
+	// Remove the restriction from the existing restrictions.
+	TargetRestrictionOperation_REMOVE TargetRestrictionOperation_Operator = 3
+)
+
+var TargetRestrictionOperation_Operator_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ADD",
+	3: "REMOVE",
+}
+
+var TargetRestrictionOperation_Operator_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ADD":         2,
+	"REMOVE":      3,
+}
+
+func (x TargetRestrictionOperation_Operator) String() string {
+	return proto.EnumName(TargetRestrictionOperation_Operator_name, int32(x))
+}
+
+func (TargetRestrictionOperation_Operator) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fa7d412c2ce6d703, []int{2, 0}
+}
+
+// Settings for the targeting-related features, at the campaign and ad group
+// levels. For more details about the targeting setting, visit
+// https://support.google.com/google-ads/answer/7365594
+type TargetingSetting struct {
+	// The per-targeting-dimension setting to restrict the reach of your campaign
+	// or ad group.
+	TargetRestrictions []*TargetRestriction `protobuf:"bytes,1,rep,name=target_restrictions,json=targetRestrictions,proto3" json:"target_restrictions,omitempty"`
+	// The list of operations changing the target restrictions.
+	//
+	// Adding a target restriction with a targeting dimension that already exists
+	// causes the existing target restriction to be replaced with the new value.
+	TargetRestrictionOperations []*TargetRestrictionOperation `protobuf:"bytes,2,rep,name=target_restriction_operations,json=targetRestrictionOperations,proto3" json:"target_restriction_operations,omitempty"`
+	XXX_NoUnkeyedLiteral        struct{}                      `json:"-"`
+	XXX_unrecognized            []byte                        `json:"-"`
+	XXX_sizecache               int32                         `json:"-"`
+}
+
+func (m *TargetingSetting) Reset()         { *m = TargetingSetting{} }
+func (m *TargetingSetting) String() string { return proto.CompactTextString(m) }
+func (*TargetingSetting) ProtoMessage()    {}
+func (*TargetingSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fa7d412c2ce6d703, []int{0}
+}
+
+func (m *TargetingSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetingSetting.Unmarshal(m, b)
+}
+func (m *TargetingSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetingSetting.Marshal(b, m, deterministic)
+}
+func (m *TargetingSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetingSetting.Merge(m, src)
+}
+func (m *TargetingSetting) XXX_Size() int {
+	return xxx_messageInfo_TargetingSetting.Size(m)
+}
+func (m *TargetingSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetingSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetingSetting proto.InternalMessageInfo
+
+func (m *TargetingSetting) GetTargetRestrictions() []*TargetRestriction {
+	if m != nil {
+		return m.TargetRestrictions
+	}
+	return nil
+}
+
+func (m *TargetingSetting) GetTargetRestrictionOperations() []*TargetRestrictionOperation {
+	if m != nil {
+		return m.TargetRestrictionOperations
+	}
+	return nil
+}
+
+// The list of per-targeting-dimension targeting settings.
+type TargetRestriction struct {
+	// The targeting dimension that these settings apply to.
+	TargetingDimension enums.TargetingDimensionEnum_TargetingDimension `protobuf:"varint,1,opt,name=targeting_dimension,json=targetingDimension,proto3,enum=google.ads.googleads.v3.enums.TargetingDimensionEnum_TargetingDimension" json:"targeting_dimension,omitempty"`
+	// Indicates whether to restrict your ads to show only for the criteria you
+	// have selected for this targeting_dimension, or to target all values for
+	// this targeting_dimension and show ads based on your targeting in other
+	// TargetingDimensions. A value of `true` means that these criteria will only
+	// apply bid modifiers, and not affect targeting. A value of `false` means
+	// that these criteria will restrict targeting as well as applying bid
+	// modifiers.
+	BidOnly              *wrappers.BoolValue `protobuf:"bytes,2,opt,name=bid_only,json=bidOnly,proto3" json:"bid_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *TargetRestriction) Reset()         { *m = TargetRestriction{} }
+func (m *TargetRestriction) String() string { return proto.CompactTextString(m) }
+func (*TargetRestriction) ProtoMessage()    {}
+func (*TargetRestriction) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fa7d412c2ce6d703, []int{1}
+}
+
+func (m *TargetRestriction) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetRestriction.Unmarshal(m, b)
+}
+func (m *TargetRestriction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetRestriction.Marshal(b, m, deterministic)
+}
+func (m *TargetRestriction) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetRestriction.Merge(m, src)
+}
+func (m *TargetRestriction) XXX_Size() int {
+	return xxx_messageInfo_TargetRestriction.Size(m)
+}
+func (m *TargetRestriction) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetRestriction.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetRestriction proto.InternalMessageInfo
+
+func (m *TargetRestriction) GetTargetingDimension() enums.TargetingDimensionEnum_TargetingDimension {
+	if m != nil {
+		return m.TargetingDimension
+	}
+	return enums.TargetingDimensionEnum_UNSPECIFIED
+}
+
+func (m *TargetRestriction) GetBidOnly() *wrappers.BoolValue {
+	if m != nil {
+		return m.BidOnly
+	}
+	return nil
+}
+
+// Operation to be performed on a target restriction list in a mutate.
+type TargetRestrictionOperation struct {
+	// Type of list operation to perform.
+	Operator TargetRestrictionOperation_Operator `protobuf:"varint,1,opt,name=operator,proto3,enum=google.ads.googleads.v3.common.TargetRestrictionOperation_Operator" json:"operator,omitempty"`
+	// The target restriction being added to or removed from the list.
+	Value                *TargetRestriction `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
+	XXX_unrecognized     []byte             `json:"-"`
+	XXX_sizecache        int32              `json:"-"`
+}
+
+func (m *TargetRestrictionOperation) Reset()         { *m = TargetRestrictionOperation{} }
+func (m *TargetRestrictionOperation) String() string { return proto.CompactTextString(m) }
+func (*TargetRestrictionOperation) ProtoMessage()    {}
+func (*TargetRestrictionOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fa7d412c2ce6d703, []int{2}
+}
+
+func (m *TargetRestrictionOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetRestrictionOperation.Unmarshal(m, b)
+}
+func (m *TargetRestrictionOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetRestrictionOperation.Marshal(b, m, deterministic)
+}
+func (m *TargetRestrictionOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetRestrictionOperation.Merge(m, src)
+}
+func (m *TargetRestrictionOperation) XXX_Size() int {
+	return xxx_messageInfo_TargetRestrictionOperation.Size(m)
+}
+func (m *TargetRestrictionOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetRestrictionOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetRestrictionOperation proto.InternalMessageInfo
+
+func (m *TargetRestrictionOperation) GetOperator() TargetRestrictionOperation_Operator {
+	if m != nil {
+		return m.Operator
+	}
+	return TargetRestrictionOperation_UNSPECIFIED
+}
+
+func (m *TargetRestrictionOperation) GetValue() *TargetRestriction {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.common.TargetRestrictionOperation_Operator", TargetRestrictionOperation_Operator_name, TargetRestrictionOperation_Operator_value)
+	proto.RegisterType((*TargetingSetting)(nil), "google.ads.googleads.v3.common.TargetingSetting")
+	proto.RegisterType((*TargetRestriction)(nil), "google.ads.googleads.v3.common.TargetRestriction")
+	proto.RegisterType((*TargetRestrictionOperation)(nil), "google.ads.googleads.v3.common.TargetRestrictionOperation")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/targeting_setting.proto", fileDescriptor_fa7d412c2ce6d703)
+}
+
+var fileDescriptor_fa7d412c2ce6d703 = []byte{
+	// 515 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x53, 0x41, 0x8f, 0x93, 0x40,
+	0x18, 0x15, 0x1a, 0xb7, 0xcd, 0x34, 0x51, 0x1c, 0x63, 0xd2, 0x54, 0xdd, 0x34, 0x9c, 0x7a, 0x1a,
+	0x62, 0x89, 0x9a, 0x60, 0x3c, 0xd0, 0x82, 0x75, 0x63, 0x2c, 0x0d, 0xeb, 0x62, 0x62, 0x9a, 0x10,
+	0x28, 0x23, 0x21, 0x81, 0x19, 0xc2, 0xd0, 0x9a, 0x5e, 0xbc, 0xf9, 0x47, 0x3c, 0xfa, 0x3f, 0xbc,
+	0xf8, 0x53, 0x3c, 0x79, 0xf2, 0x6c, 0x60, 0x18, 0x5c, 0x77, 0x45, 0xb3, 0x7b, 0xe2, 0xe3, 0x9b,
+	0xf7, 0xde, 0xf7, 0xe6, 0xcd, 0x0c, 0x78, 0x12, 0x53, 0x1a, 0xa7, 0x58, 0x0b, 0x22, 0xa6, 0xf1,
+	0xb2, 0xaa, 0xf6, 0xba, 0xb6, 0xa5, 0x59, 0x46, 0x89, 0x56, 0x06, 0x45, 0x8c, 0xcb, 0x84, 0xc4,
+	0x3e, 0xc3, 0x65, 0xf5, 0x45, 0x79, 0x41, 0x4b, 0x0a, 0x8f, 0x39, 0x18, 0x05, 0x11, 0x43, 0x2d,
+	0x0f, 0xed, 0x75, 0xc4, 0x79, 0xe3, 0xa7, 0x5d, 0xba, 0x98, 0xec, 0x32, 0x76, 0x4e, 0x36, 0x4a,
+	0x32, 0x4c, 0x58, 0x42, 0x09, 0x17, 0x1e, 0x37, 0xc2, 0x5a, 0xfd, 0x17, 0xee, 0xde, 0x6b, 0x1f,
+	0x8a, 0x20, 0xcf, 0x71, 0xc1, 0x9a, 0xf5, 0x07, 0x42, 0x38, 0x4f, 0xb4, 0x80, 0x10, 0x5a, 0x06,
+	0x65, 0x42, 0x49, 0xb3, 0xaa, 0xfe, 0x94, 0x80, 0xf2, 0x46, 0x68, 0x9f, 0x72, 0xc7, 0x30, 0x04,
+	0x77, 0xf9, 0x3c, 0xbf, 0xc0, 0xac, 0x2c, 0x92, 0x6d, 0xcd, 0x18, 0x49, 0x93, 0xde, 0x74, 0x38,
+	0x7b, 0x84, 0xfe, 0xbd, 0x13, 0xc4, 0xe5, 0xdc, 0xdf, 0x4c, 0x17, 0x96, 0x17, 0x5b, 0x0c, 0x7e,
+	0x04, 0x0f, 0x2f, 0xcf, 0xf0, 0x69, 0x8e, 0x0b, 0xee, 0x6f, 0x24, 0xd7, 0xd3, 0x8c, 0x2b, 0x4f,
+	0x73, 0x84, 0x84, 0x7b, 0xbf, 0xec, 0x5c, 0x63, 0xea, 0x57, 0x09, 0xdc, 0xb9, 0xc4, 0x85, 0x07,
+	0xb1, 0xf3, 0x3f, 0x92, 0x1e, 0x49, 0x13, 0x69, 0x7a, 0x6b, 0xf6, 0xb2, 0xd3, 0x4b, 0x7d, 0x46,
+	0xa8, 0xcd, 0xd1, 0x12, 0x44, 0x9b, 0xec, 0xb2, 0xbf, 0xb4, 0x45, 0x20, 0xe7, 0x7b, 0xf0, 0x31,
+	0x18, 0x84, 0x49, 0xe4, 0x53, 0x92, 0x1e, 0x46, 0xf2, 0x44, 0x9a, 0x0e, 0x67, 0x63, 0x31, 0x4f,
+	0x1c, 0x2d, 0x9a, 0x53, 0x9a, 0x7a, 0x41, 0xba, 0xc3, 0x6e, 0x3f, 0x4c, 0x22, 0x87, 0xa4, 0x07,
+	0xf5, 0x93, 0x0c, 0xc6, 0xdd, 0x19, 0x40, 0x1f, 0x0c, 0x78, 0xa6, 0xb4, 0x68, 0x76, 0xb1, 0xb8,
+	0x7e, 0xa2, 0xc8, 0x69, 0xa4, 0xdc, 0x56, 0x14, 0x2e, 0xc1, 0xcd, 0x7d, 0xe5, 0xa8, 0xf1, 0x7c,
+	0x8d, 0xdb, 0xc1, 0xf9, 0xea, 0x73, 0x30, 0x10, 0xf2, 0xf0, 0x36, 0x18, 0x9e, 0xad, 0x4e, 0xd7,
+	0xf6, 0xe2, 0xe4, 0xc5, 0x89, 0x6d, 0x29, 0x37, 0xe0, 0x10, 0xf4, 0xcf, 0x56, 0xaf, 0x56, 0xce,
+	0xdb, 0x95, 0x22, 0xc1, 0x3e, 0xe8, 0x99, 0x96, 0xa5, 0xc8, 0x10, 0x80, 0x23, 0xd7, 0x7e, 0xed,
+	0x78, 0xb6, 0xd2, 0x9b, 0xff, 0x90, 0x80, 0xba, 0xa5, 0xd9, 0x7f, 0xc6, 0xcf, 0xef, 0x5d, 0xbc,
+	0xec, 0xeb, 0x2a, 0xdb, 0xb5, 0xf4, 0xce, 0x6a, 0x88, 0x31, 0x4d, 0x03, 0x12, 0x23, 0x5a, 0xc4,
+	0x5a, 0x8c, 0x49, 0x9d, 0xbc, 0x78, 0x8f, 0x79, 0xc2, 0xba, 0x9e, 0xfd, 0x33, 0xfe, 0xf9, 0x2c,
+	0xf7, 0x96, 0xa6, 0xf9, 0x45, 0x3e, 0x5e, 0x72, 0x31, 0x33, 0x62, 0x88, 0x97, 0x55, 0xe5, 0xe9,
+	0x68, 0x51, 0xc3, 0xbe, 0x09, 0xc0, 0xc6, 0x8c, 0xd8, 0xa6, 0x05, 0x6c, 0x3c, 0x7d, 0xc3, 0x01,
+	0xdf, 0x65, 0x95, 0x77, 0x0d, 0xc3, 0x8c, 0x98, 0x61, 0xb4, 0x10, 0xc3, 0xf0, 0x74, 0xc3, 0xe0,
+	0xa0, 0xf0, 0xa8, 0x76, 0xa7, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x05, 0xf9, 0xc5, 0xc5, 0x93,
+	0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/text_label.pb.go b/googleapis/ads/googleads/v3/common/text_label.pb.go
new file mode 100644
index 0000000..b104d5b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/text_label.pb.go
@@ -0,0 +1,109 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/text_label.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A type of label displaying text on a colored background.
+type TextLabel struct {
+	// Background color of the label in RGB format. This string must match the
+	// regular expression '^\#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$'.
+	// Note: The background color may not be visible for manager accounts.
+	BackgroundColor *wrappers.StringValue `protobuf:"bytes,1,opt,name=background_color,json=backgroundColor,proto3" json:"background_color,omitempty"`
+	// A short description of the label. The length must be no more than 200
+	// characters.
+	Description          *wrappers.StringValue `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *TextLabel) Reset()         { *m = TextLabel{} }
+func (m *TextLabel) String() string { return proto.CompactTextString(m) }
+func (*TextLabel) ProtoMessage()    {}
+func (*TextLabel) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9cba9b2419deeefc, []int{0}
+}
+
+func (m *TextLabel) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TextLabel.Unmarshal(m, b)
+}
+func (m *TextLabel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TextLabel.Marshal(b, m, deterministic)
+}
+func (m *TextLabel) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TextLabel.Merge(m, src)
+}
+func (m *TextLabel) XXX_Size() int {
+	return xxx_messageInfo_TextLabel.Size(m)
+}
+func (m *TextLabel) XXX_DiscardUnknown() {
+	xxx_messageInfo_TextLabel.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TextLabel proto.InternalMessageInfo
+
+func (m *TextLabel) GetBackgroundColor() *wrappers.StringValue {
+	if m != nil {
+		return m.BackgroundColor
+	}
+	return nil
+}
+
+func (m *TextLabel) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*TextLabel)(nil), "google.ads.googleads.v3.common.TextLabel")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/text_label.proto", fileDescriptor_9cba9b2419deeefc)
+}
+
+var fileDescriptor_9cba9b2419deeefc = []byte{
+	// 315 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x18, 0xc7, 0x69, 0x05, 0xc1, 0x0e, 0x54, 0x76, 0x1a, 0x63, 0x0c, 0xd9, 0xc9, 0x53, 0x02, 0xf6,
+	0x16, 0x41, 0xe8, 0x26, 0xec, 0xe2, 0x61, 0xa8, 0xf4, 0x20, 0x85, 0x91, 0x36, 0x31, 0x14, 0xb3,
+	0x7c, 0x21, 0xc9, 0xe6, 0x1e, 0xc4, 0x27, 0xf0, 0xe8, 0xa3, 0xf8, 0x26, 0xfa, 0x14, 0x92, 0xa6,
+	0xad, 0x5e, 0x14, 0x4f, 0xfd, 0xd3, 0xfc, 0x7e, 0xdf, 0x3f, 0xf9, 0x12, 0x2c, 0x00, 0x84, 0xe4,
+	0x98, 0x32, 0xdb, 0x46, 0x9f, 0x76, 0x29, 0xae, 0x60, 0xb3, 0x01, 0x85, 0x1d, 0xdf, 0xbb, 0xb5,
+	0xa4, 0x25, 0x97, 0x48, 0x1b, 0x70, 0x30, 0x9c, 0x06, 0x0a, 0x51, 0x66, 0x51, 0x2f, 0xa0, 0x5d,
+	0x8a, 0x82, 0x30, 0x6e, 0xcf, 0x71, 0x43, 0x97, 0xdb, 0x47, 0xfc, 0x6c, 0xa8, 0xd6, 0xdc, 0xd8,
+	0xe0, 0x8f, 0x27, 0x5d, 0xa1, 0xae, 0x31, 0x55, 0x0a, 0x1c, 0x75, 0x35, 0xa8, 0xf6, 0x74, 0xf6,
+	0x12, 0x25, 0x47, 0xf7, 0x7c, 0xef, 0x6e, 0x7c, 0xe3, 0x70, 0x99, 0x9c, 0x96, 0xb4, 0x7a, 0x12,
+	0x06, 0xb6, 0x8a, 0xad, 0x2b, 0x90, 0x60, 0x46, 0xd1, 0x59, 0x74, 0x3e, 0xb8, 0x98, 0xb4, 0xdd,
+	0xa8, 0xab, 0x41, 0x77, 0xce, 0xd4, 0x4a, 0xe4, 0x54, 0x6e, 0xf9, 0xed, 0xc9, 0xb7, 0xb5, 0xf0,
+	0xd2, 0xf0, 0x2a, 0x19, 0x30, 0x6e, 0x2b, 0x53, 0x6b, 0x5f, 0x36, 0x8a, 0xff, 0x31, 0xe3, 0xa7,
+	0x30, 0xff, 0x88, 0x92, 0x59, 0x05, 0x1b, 0xf4, 0xf7, 0xdb, 0xe7, 0xc7, 0xfd, 0xd5, 0x57, 0x7e,
+	0xe4, 0x2a, 0x7a, 0xb8, 0x6e, 0x0d, 0x01, 0x92, 0x2a, 0x81, 0xc0, 0x08, 0x2c, 0xb8, 0x6a, 0x0a,
+	0xbb, 0x75, 0xeb, 0xda, 0xfe, 0xb6, 0xfd, 0xcb, 0xf0, 0x79, 0x8d, 0x0f, 0x96, 0x59, 0xf6, 0x16,
+	0x4f, 0x97, 0x61, 0x58, 0xc6, 0x2c, 0x0a, 0xd1, 0xa7, 0x3c, 0x45, 0x8b, 0x06, 0x7b, 0xef, 0x80,
+	0x22, 0x63, 0xb6, 0xe8, 0x81, 0x22, 0x4f, 0x8b, 0x00, 0x7c, 0xc6, 0xb3, 0xf0, 0x97, 0x90, 0x8c,
+	0x59, 0x42, 0x7a, 0x84, 0x90, 0x3c, 0x25, 0x24, 0x40, 0xe5, 0x61, 0x73, 0xbb, 0xf4, 0x2b, 0x00,
+	0x00, 0xff, 0xff, 0xf9, 0xac, 0xc1, 0x18, 0x1a, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/url_collection.pb.go b/googleapis/ads/googleads/v3/common/url_collection.pb.go
new file mode 100644
index 0000000..ebdf205
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/url_collection.pb.go
@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/url_collection.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Collection of urls that is tagged with a unique identifier.
+type UrlCollection struct {
+	// Unique identifier for this UrlCollection instance.
+	UrlCollectionId *wrappers.StringValue `protobuf:"bytes,1,opt,name=url_collection_id,json=urlCollectionId,proto3" json:"url_collection_id,omitempty"`
+	// A list of possible final URLs.
+	FinalUrls []*wrappers.StringValue `protobuf:"bytes,2,rep,name=final_urls,json=finalUrls,proto3" json:"final_urls,omitempty"`
+	// A list of possible final mobile URLs.
+	FinalMobileUrls []*wrappers.StringValue `protobuf:"bytes,3,rep,name=final_mobile_urls,json=finalMobileUrls,proto3" json:"final_mobile_urls,omitempty"`
+	// URL template for constructing a tracking URL.
+	TrackingUrlTemplate  *wrappers.StringValue `protobuf:"bytes,4,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UrlCollection) Reset()         { *m = UrlCollection{} }
+func (m *UrlCollection) String() string { return proto.CompactTextString(m) }
+func (*UrlCollection) ProtoMessage()    {}
+func (*UrlCollection) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0a1d955dae37e0d9, []int{0}
+}
+
+func (m *UrlCollection) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UrlCollection.Unmarshal(m, b)
+}
+func (m *UrlCollection) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UrlCollection.Marshal(b, m, deterministic)
+}
+func (m *UrlCollection) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UrlCollection.Merge(m, src)
+}
+func (m *UrlCollection) XXX_Size() int {
+	return xxx_messageInfo_UrlCollection.Size(m)
+}
+func (m *UrlCollection) XXX_DiscardUnknown() {
+	xxx_messageInfo_UrlCollection.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UrlCollection proto.InternalMessageInfo
+
+func (m *UrlCollection) GetUrlCollectionId() *wrappers.StringValue {
+	if m != nil {
+		return m.UrlCollectionId
+	}
+	return nil
+}
+
+func (m *UrlCollection) GetFinalUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrls
+	}
+	return nil
+}
+
+func (m *UrlCollection) GetFinalMobileUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalMobileUrls
+	}
+	return nil
+}
+
+func (m *UrlCollection) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*UrlCollection)(nil), "google.ads.googleads.v3.common.UrlCollection")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/url_collection.proto", fileDescriptor_0a1d955dae37e0d9)
+}
+
+var fileDescriptor_0a1d955dae37e0d9 = []byte{
+	// 368 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x4b, 0xf3, 0x30,
+	0x18, 0xc7, 0x69, 0xf7, 0xf2, 0x82, 0x15, 0x19, 0x56, 0x84, 0x31, 0xc6, 0x18, 0x3b, 0x79, 0x4a,
+	0xc0, 0xde, 0xb2, 0x53, 0x37, 0x61, 0x7a, 0x10, 0x86, 0xba, 0x1e, 0xa4, 0x50, 0xb2, 0x36, 0x0b,
+	0xc1, 0x34, 0x29, 0x49, 0x3b, 0xbf, 0x8f, 0x47, 0x8f, 0x7e, 0x0c, 0x3f, 0x8a, 0xe0, 0x77, 0x90,
+	0x26, 0x6d, 0x71, 0x07, 0x75, 0xa7, 0x3e, 0x34, 0xff, 0xdf, 0xef, 0x79, 0xda, 0x3c, 0x5e, 0x40,
+	0xa5, 0xa4, 0x9c, 0x40, 0x9c, 0x69, 0x68, 0xcb, 0xba, 0xda, 0x05, 0x30, 0x95, 0x79, 0x2e, 0x05,
+	0xac, 0x14, 0x4f, 0x52, 0xc9, 0x39, 0x49, 0x4b, 0x26, 0x05, 0x28, 0x94, 0x2c, 0xa5, 0x3f, 0xb6,
+	0x49, 0x80, 0x33, 0x0d, 0x3a, 0x08, 0xec, 0x02, 0x60, 0xa1, 0x61, 0x73, 0x0e, 0x4d, 0x7a, 0x53,
+	0x6d, 0xe1, 0xb3, 0xc2, 0x45, 0x41, 0x94, 0xb6, 0xfc, 0x70, 0xd4, 0x36, 0x2d, 0x18, 0xc4, 0x42,
+	0xc8, 0x12, 0xd7, 0xf2, 0xe6, 0x74, 0xfa, 0xe6, 0x7a, 0x27, 0x6b, 0xc5, 0x17, 0x5d, 0x57, 0xff,
+	0xda, 0x3b, 0xdd, 0x9f, 0x23, 0x61, 0xd9, 0xc0, 0x99, 0x38, 0x17, 0xc7, 0x97, 0xa3, 0x66, 0x00,
+	0xd0, 0xf6, 0x02, 0xf7, 0xa5, 0x62, 0x82, 0x46, 0x98, 0x57, 0xe4, 0xae, 0x5f, 0x7d, 0xf7, 0xdc,
+	0x64, 0xfe, 0xcc, 0xf3, 0xb6, 0x4c, 0x60, 0x9e, 0x54, 0x8a, 0xeb, 0x81, 0x3b, 0xe9, 0xfd, 0xa9,
+	0x38, 0x32, 0xf9, 0xb5, 0xe2, 0xba, 0x1e, 0xc3, 0xc2, 0xb9, 0xdc, 0x30, 0x4e, 0xac, 0xa3, 0x77,
+	0x80, 0xa3, 0x6f, 0xb0, 0x5b, 0x43, 0x19, 0xd3, 0xca, 0x3b, 0x2f, 0x15, 0x4e, 0x9f, 0x98, 0xa0,
+	0xb5, 0x25, 0x29, 0x49, 0x5e, 0x70, 0x5c, 0x92, 0xc1, 0xbf, 0x03, 0x3e, 0xea, 0xac, 0x45, 0xd7,
+	0x8a, 0x3f, 0x34, 0xe0, 0xfc, 0xd3, 0xf1, 0xa6, 0xa9, 0xcc, 0xc1, 0xef, 0x37, 0x33, 0xf7, 0xf7,
+	0x7e, 0xec, 0xaa, 0xd6, 0xaf, 0x9c, 0xc7, 0xab, 0x86, 0xa2, 0x92, 0x63, 0x41, 0x81, 0x54, 0x14,
+	0x52, 0x22, 0x4c, 0xf3, 0x76, 0x29, 0x0a, 0xa6, 0x7f, 0xda, 0x91, 0x99, 0x7d, 0xbc, 0xb8, 0xbd,
+	0x65, 0x18, 0xbe, 0xba, 0xe3, 0xa5, 0x95, 0x85, 0x99, 0x06, 0xb6, 0xac, 0xab, 0x28, 0x00, 0x0b,
+	0x13, 0x7b, 0x6f, 0x03, 0x71, 0x98, 0xe9, 0xb8, 0x0b, 0xc4, 0x51, 0x10, 0xdb, 0xc0, 0x87, 0x3b,
+	0xb5, 0x6f, 0x11, 0x0a, 0x33, 0x8d, 0x50, 0x17, 0x41, 0x28, 0x0a, 0x10, 0xb2, 0xa1, 0xcd, 0x7f,
+	0x33, 0x5d, 0xf0, 0x15, 0x00, 0x00, 0xff, 0xff, 0xec, 0x05, 0x93, 0xfe, 0xc0, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/user_lists.pb.go b/googleapis/ads/googleads/v3/common/user_lists.pb.go
new file mode 100644
index 0000000..de6c309
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/user_lists.pb.go
@@ -0,0 +1,1191 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/user_lists.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// SimilarUserList is a list of users which are similar to users from another
+// UserList. These lists are read-only and automatically created by Google.
+type SimilarUserListInfo struct {
+	// Seed UserList from which this list is derived.
+	SeedUserList         *wrappers.StringValue `protobuf:"bytes,1,opt,name=seed_user_list,json=seedUserList,proto3" json:"seed_user_list,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *SimilarUserListInfo) Reset()         { *m = SimilarUserListInfo{} }
+func (m *SimilarUserListInfo) String() string { return proto.CompactTextString(m) }
+func (*SimilarUserListInfo) ProtoMessage()    {}
+func (*SimilarUserListInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{0}
+}
+
+func (m *SimilarUserListInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SimilarUserListInfo.Unmarshal(m, b)
+}
+func (m *SimilarUserListInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SimilarUserListInfo.Marshal(b, m, deterministic)
+}
+func (m *SimilarUserListInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SimilarUserListInfo.Merge(m, src)
+}
+func (m *SimilarUserListInfo) XXX_Size() int {
+	return xxx_messageInfo_SimilarUserListInfo.Size(m)
+}
+func (m *SimilarUserListInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_SimilarUserListInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SimilarUserListInfo proto.InternalMessageInfo
+
+func (m *SimilarUserListInfo) GetSeedUserList() *wrappers.StringValue {
+	if m != nil {
+		return m.SeedUserList
+	}
+	return nil
+}
+
+// UserList of CRM users provided by the advertiser.
+type CrmBasedUserListInfo struct {
+	// A string that uniquely identifies a mobile application from which the data
+	// was collected to the Google Ads API.
+	// For iOS, the ID string is the 9 digit string that appears at the end of an
+	// App Store URL (e.g., "476943146" for "Flood-It! 2" whose App Store link is
+	// http://itunes.apple.com/us/app/flood-it!-2/id476943146).
+	// For Android, the ID string is the application's package name
+	// (e.g., "com.labpixies.colordrips" for "Color Drips" given Google Play link
+	// https://play.google.com/store/apps/details?id=com.labpixies.colordrips).
+	// Required when creating CrmBasedUserList for uploading mobile advertising
+	// IDs.
+	AppId *wrappers.StringValue `protobuf:"bytes,1,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
+	// Matching key type of the list.
+	// Mixed data types are not allowed on the same list.
+	// This field is required for an ADD operation.
+	UploadKeyType enums.CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType `protobuf:"varint,2,opt,name=upload_key_type,json=uploadKeyType,proto3,enum=google.ads.googleads.v3.enums.CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType" json:"upload_key_type,omitempty"`
+	// Data source of the list. Default value is FIRST_PARTY.
+	// Only whitelisted customers can create third-party sourced CRM lists.
+	DataSourceType       enums.UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType `protobuf:"varint,3,opt,name=data_source_type,json=dataSourceType,proto3,enum=google.ads.googleads.v3.enums.UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType" json:"data_source_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                      `json:"-"`
+	XXX_unrecognized     []byte                                                        `json:"-"`
+	XXX_sizecache        int32                                                         `json:"-"`
+}
+
+func (m *CrmBasedUserListInfo) Reset()         { *m = CrmBasedUserListInfo{} }
+func (m *CrmBasedUserListInfo) String() string { return proto.CompactTextString(m) }
+func (*CrmBasedUserListInfo) ProtoMessage()    {}
+func (*CrmBasedUserListInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{1}
+}
+
+func (m *CrmBasedUserListInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CrmBasedUserListInfo.Unmarshal(m, b)
+}
+func (m *CrmBasedUserListInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CrmBasedUserListInfo.Marshal(b, m, deterministic)
+}
+func (m *CrmBasedUserListInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CrmBasedUserListInfo.Merge(m, src)
+}
+func (m *CrmBasedUserListInfo) XXX_Size() int {
+	return xxx_messageInfo_CrmBasedUserListInfo.Size(m)
+}
+func (m *CrmBasedUserListInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_CrmBasedUserListInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CrmBasedUserListInfo proto.InternalMessageInfo
+
+func (m *CrmBasedUserListInfo) GetAppId() *wrappers.StringValue {
+	if m != nil {
+		return m.AppId
+	}
+	return nil
+}
+
+func (m *CrmBasedUserListInfo) GetUploadKeyType() enums.CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType {
+	if m != nil {
+		return m.UploadKeyType
+	}
+	return enums.CustomerMatchUploadKeyTypeEnum_UNSPECIFIED
+}
+
+func (m *CrmBasedUserListInfo) GetDataSourceType() enums.UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType {
+	if m != nil {
+		return m.DataSourceType
+	}
+	return enums.UserListCrmDataSourceTypeEnum_UNSPECIFIED
+}
+
+// A client defined rule based on custom parameters sent by web sites or
+// uploaded by the advertiser.
+type UserListRuleInfo struct {
+	// Rule type is used to determine how to group rule items.
+	//
+	// The default is OR of ANDs (disjunctive normal form).
+	// That is, rule items will be ANDed together within rule item groups and the
+	// groups themselves will be ORed together.
+	//
+	// Currently AND of ORs (conjunctive normal form) is only supported for
+	// ExpressionRuleUserList.
+	RuleType enums.UserListRuleTypeEnum_UserListRuleType `protobuf:"varint,1,opt,name=rule_type,json=ruleType,proto3,enum=google.ads.googleads.v3.enums.UserListRuleTypeEnum_UserListRuleType" json:"rule_type,omitempty"`
+	// List of rule item groups that defines this rule.
+	// Rule item groups are grouped together based on rule_type.
+	RuleItemGroups       []*UserListRuleItemGroupInfo `protobuf:"bytes,2,rep,name=rule_item_groups,json=ruleItemGroups,proto3" json:"rule_item_groups,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *UserListRuleInfo) Reset()         { *m = UserListRuleInfo{} }
+func (m *UserListRuleInfo) String() string { return proto.CompactTextString(m) }
+func (*UserListRuleInfo) ProtoMessage()    {}
+func (*UserListRuleInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{2}
+}
+
+func (m *UserListRuleInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListRuleInfo.Unmarshal(m, b)
+}
+func (m *UserListRuleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListRuleInfo.Marshal(b, m, deterministic)
+}
+func (m *UserListRuleInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListRuleInfo.Merge(m, src)
+}
+func (m *UserListRuleInfo) XXX_Size() int {
+	return xxx_messageInfo_UserListRuleInfo.Size(m)
+}
+func (m *UserListRuleInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListRuleInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListRuleInfo proto.InternalMessageInfo
+
+func (m *UserListRuleInfo) GetRuleType() enums.UserListRuleTypeEnum_UserListRuleType {
+	if m != nil {
+		return m.RuleType
+	}
+	return enums.UserListRuleTypeEnum_UNSPECIFIED
+}
+
+func (m *UserListRuleInfo) GetRuleItemGroups() []*UserListRuleItemGroupInfo {
+	if m != nil {
+		return m.RuleItemGroups
+	}
+	return nil
+}
+
+// A group of rule items.
+type UserListRuleItemGroupInfo struct {
+	// Rule items that will be grouped together based on rule_type.
+	RuleItems            []*UserListRuleItemInfo `protobuf:"bytes,1,rep,name=rule_items,json=ruleItems,proto3" json:"rule_items,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *UserListRuleItemGroupInfo) Reset()         { *m = UserListRuleItemGroupInfo{} }
+func (m *UserListRuleItemGroupInfo) String() string { return proto.CompactTextString(m) }
+func (*UserListRuleItemGroupInfo) ProtoMessage()    {}
+func (*UserListRuleItemGroupInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{3}
+}
+
+func (m *UserListRuleItemGroupInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListRuleItemGroupInfo.Unmarshal(m, b)
+}
+func (m *UserListRuleItemGroupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListRuleItemGroupInfo.Marshal(b, m, deterministic)
+}
+func (m *UserListRuleItemGroupInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListRuleItemGroupInfo.Merge(m, src)
+}
+func (m *UserListRuleItemGroupInfo) XXX_Size() int {
+	return xxx_messageInfo_UserListRuleItemGroupInfo.Size(m)
+}
+func (m *UserListRuleItemGroupInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListRuleItemGroupInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListRuleItemGroupInfo proto.InternalMessageInfo
+
+func (m *UserListRuleItemGroupInfo) GetRuleItems() []*UserListRuleItemInfo {
+	if m != nil {
+		return m.RuleItems
+	}
+	return nil
+}
+
+// An atomic rule fragment.
+type UserListRuleItemInfo struct {
+	// Rule variable name. It should match the corresponding key name fired
+	// by the pixel.
+	// A name must begin with US-ascii letters or underscore or UTF8 code that is
+	// greater than 127 and consist of US-ascii letters or digits or underscore or
+	// UTF8 code that is greater than 127.
+	// For websites, there are two built-in variable URL (name = 'url__') and
+	// referrer URL (name = 'ref_url__').
+	// This field must be populated when creating a new rule item.
+	Name *wrappers.StringValue `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// An atomic rule fragment.
+	//
+	// Types that are valid to be assigned to RuleItem:
+	//	*UserListRuleItemInfo_NumberRuleItem
+	//	*UserListRuleItemInfo_StringRuleItem
+	//	*UserListRuleItemInfo_DateRuleItem
+	RuleItem             isUserListRuleItemInfo_RuleItem `protobuf_oneof:"rule_item"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *UserListRuleItemInfo) Reset()         { *m = UserListRuleItemInfo{} }
+func (m *UserListRuleItemInfo) String() string { return proto.CompactTextString(m) }
+func (*UserListRuleItemInfo) ProtoMessage()    {}
+func (*UserListRuleItemInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{4}
+}
+
+func (m *UserListRuleItemInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListRuleItemInfo.Unmarshal(m, b)
+}
+func (m *UserListRuleItemInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListRuleItemInfo.Marshal(b, m, deterministic)
+}
+func (m *UserListRuleItemInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListRuleItemInfo.Merge(m, src)
+}
+func (m *UserListRuleItemInfo) XXX_Size() int {
+	return xxx_messageInfo_UserListRuleItemInfo.Size(m)
+}
+func (m *UserListRuleItemInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListRuleItemInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListRuleItemInfo proto.InternalMessageInfo
+
+func (m *UserListRuleItemInfo) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+type isUserListRuleItemInfo_RuleItem interface {
+	isUserListRuleItemInfo_RuleItem()
+}
+
+type UserListRuleItemInfo_NumberRuleItem struct {
+	NumberRuleItem *UserListNumberRuleItemInfo `protobuf:"bytes,2,opt,name=number_rule_item,json=numberRuleItem,proto3,oneof"`
+}
+
+type UserListRuleItemInfo_StringRuleItem struct {
+	StringRuleItem *UserListStringRuleItemInfo `protobuf:"bytes,3,opt,name=string_rule_item,json=stringRuleItem,proto3,oneof"`
+}
+
+type UserListRuleItemInfo_DateRuleItem struct {
+	DateRuleItem *UserListDateRuleItemInfo `protobuf:"bytes,4,opt,name=date_rule_item,json=dateRuleItem,proto3,oneof"`
+}
+
+func (*UserListRuleItemInfo_NumberRuleItem) isUserListRuleItemInfo_RuleItem() {}
+
+func (*UserListRuleItemInfo_StringRuleItem) isUserListRuleItemInfo_RuleItem() {}
+
+func (*UserListRuleItemInfo_DateRuleItem) isUserListRuleItemInfo_RuleItem() {}
+
+func (m *UserListRuleItemInfo) GetRuleItem() isUserListRuleItemInfo_RuleItem {
+	if m != nil {
+		return m.RuleItem
+	}
+	return nil
+}
+
+func (m *UserListRuleItemInfo) GetNumberRuleItem() *UserListNumberRuleItemInfo {
+	if x, ok := m.GetRuleItem().(*UserListRuleItemInfo_NumberRuleItem); ok {
+		return x.NumberRuleItem
+	}
+	return nil
+}
+
+func (m *UserListRuleItemInfo) GetStringRuleItem() *UserListStringRuleItemInfo {
+	if x, ok := m.GetRuleItem().(*UserListRuleItemInfo_StringRuleItem); ok {
+		return x.StringRuleItem
+	}
+	return nil
+}
+
+func (m *UserListRuleItemInfo) GetDateRuleItem() *UserListDateRuleItemInfo {
+	if x, ok := m.GetRuleItem().(*UserListRuleItemInfo_DateRuleItem); ok {
+		return x.DateRuleItem
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*UserListRuleItemInfo) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*UserListRuleItemInfo_NumberRuleItem)(nil),
+		(*UserListRuleItemInfo_StringRuleItem)(nil),
+		(*UserListRuleItemInfo_DateRuleItem)(nil),
+	}
+}
+
+// A rule item composed of date operation.
+type UserListDateRuleItemInfo struct {
+	// Date comparison operator.
+	// This field is required and must be populated when creating new date
+	// rule item.
+	Operator enums.UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator `protobuf:"varint,1,opt,name=operator,proto3,enum=google.ads.googleads.v3.enums.UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator" json:"operator,omitempty"`
+	// String representing date value to be compared with the rule variable.
+	// Supported date format is YYYY-MM-DD.
+	// Times are reported in the customer's time zone.
+	Value *wrappers.StringValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	// The relative date value of the right hand side denoted by number of days
+	// offset from now. The value field will override this field when both are
+	// present.
+	OffsetInDays         *wrappers.Int64Value `protobuf:"bytes,3,opt,name=offset_in_days,json=offsetInDays,proto3" json:"offset_in_days,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *UserListDateRuleItemInfo) Reset()         { *m = UserListDateRuleItemInfo{} }
+func (m *UserListDateRuleItemInfo) String() string { return proto.CompactTextString(m) }
+func (*UserListDateRuleItemInfo) ProtoMessage()    {}
+func (*UserListDateRuleItemInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{5}
+}
+
+func (m *UserListDateRuleItemInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListDateRuleItemInfo.Unmarshal(m, b)
+}
+func (m *UserListDateRuleItemInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListDateRuleItemInfo.Marshal(b, m, deterministic)
+}
+func (m *UserListDateRuleItemInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListDateRuleItemInfo.Merge(m, src)
+}
+func (m *UserListDateRuleItemInfo) XXX_Size() int {
+	return xxx_messageInfo_UserListDateRuleItemInfo.Size(m)
+}
+func (m *UserListDateRuleItemInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListDateRuleItemInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListDateRuleItemInfo proto.InternalMessageInfo
+
+func (m *UserListDateRuleItemInfo) GetOperator() enums.UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator {
+	if m != nil {
+		return m.Operator
+	}
+	return enums.UserListDateRuleItemOperatorEnum_UNSPECIFIED
+}
+
+func (m *UserListDateRuleItemInfo) GetValue() *wrappers.StringValue {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *UserListDateRuleItemInfo) GetOffsetInDays() *wrappers.Int64Value {
+	if m != nil {
+		return m.OffsetInDays
+	}
+	return nil
+}
+
+// A rule item composed of number operation.
+type UserListNumberRuleItemInfo struct {
+	// Number comparison operator.
+	// This field is required and must be populated when creating a new number
+	// rule item.
+	Operator enums.UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator `protobuf:"varint,1,opt,name=operator,proto3,enum=google.ads.googleads.v3.enums.UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator" json:"operator,omitempty"`
+	// Number value to be compared with the variable.
+	// This field is required and must be populated when creating a new number
+	// rule item.
+	Value                *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UserListNumberRuleItemInfo) Reset()         { *m = UserListNumberRuleItemInfo{} }
+func (m *UserListNumberRuleItemInfo) String() string { return proto.CompactTextString(m) }
+func (*UserListNumberRuleItemInfo) ProtoMessage()    {}
+func (*UserListNumberRuleItemInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{6}
+}
+
+func (m *UserListNumberRuleItemInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListNumberRuleItemInfo.Unmarshal(m, b)
+}
+func (m *UserListNumberRuleItemInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListNumberRuleItemInfo.Marshal(b, m, deterministic)
+}
+func (m *UserListNumberRuleItemInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListNumberRuleItemInfo.Merge(m, src)
+}
+func (m *UserListNumberRuleItemInfo) XXX_Size() int {
+	return xxx_messageInfo_UserListNumberRuleItemInfo.Size(m)
+}
+func (m *UserListNumberRuleItemInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListNumberRuleItemInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListNumberRuleItemInfo proto.InternalMessageInfo
+
+func (m *UserListNumberRuleItemInfo) GetOperator() enums.UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator {
+	if m != nil {
+		return m.Operator
+	}
+	return enums.UserListNumberRuleItemOperatorEnum_UNSPECIFIED
+}
+
+func (m *UserListNumberRuleItemInfo) GetValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+// A rule item fragment composed of date operation.
+type UserListStringRuleItemInfo struct {
+	// String comparison operator.
+	// This field is required and must be populated when creating a new string
+	// rule item.
+	Operator enums.UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator `protobuf:"varint,1,opt,name=operator,proto3,enum=google.ads.googleads.v3.enums.UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator" json:"operator,omitempty"`
+	// The right hand side of the string rule item. For URLs or referrer URLs,
+	// the value can not contain illegal URL chars such as newlines, quotes,
+	// tabs, or parentheses. This field is required and must be populated when
+	// creating a new string rule item.
+	Value                *wrappers.StringValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UserListStringRuleItemInfo) Reset()         { *m = UserListStringRuleItemInfo{} }
+func (m *UserListStringRuleItemInfo) String() string { return proto.CompactTextString(m) }
+func (*UserListStringRuleItemInfo) ProtoMessage()    {}
+func (*UserListStringRuleItemInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{7}
+}
+
+func (m *UserListStringRuleItemInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListStringRuleItemInfo.Unmarshal(m, b)
+}
+func (m *UserListStringRuleItemInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListStringRuleItemInfo.Marshal(b, m, deterministic)
+}
+func (m *UserListStringRuleItemInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListStringRuleItemInfo.Merge(m, src)
+}
+func (m *UserListStringRuleItemInfo) XXX_Size() int {
+	return xxx_messageInfo_UserListStringRuleItemInfo.Size(m)
+}
+func (m *UserListStringRuleItemInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListStringRuleItemInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListStringRuleItemInfo proto.InternalMessageInfo
+
+func (m *UserListStringRuleItemInfo) GetOperator() enums.UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator {
+	if m != nil {
+		return m.Operator
+	}
+	return enums.UserListStringRuleItemOperatorEnum_UNSPECIFIED
+}
+
+func (m *UserListStringRuleItemInfo) GetValue() *wrappers.StringValue {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+// User lists defined by combining two rules, left operand and right operand.
+// There are two operators: AND where left operand and right operand have to be
+// true; AND_NOT where left operand is true but right operand is false.
+type CombinedRuleUserListInfo struct {
+	// Left operand of the combined rule.
+	// This field is required and must be populated when creating new combined
+	// rule based user list.
+	LeftOperand *UserListRuleInfo `protobuf:"bytes,1,opt,name=left_operand,json=leftOperand,proto3" json:"left_operand,omitempty"`
+	// Right operand of the combined rule.
+	// This field is required and must be populated when creating new combined
+	// rule based user list.
+	RightOperand *UserListRuleInfo `protobuf:"bytes,2,opt,name=right_operand,json=rightOperand,proto3" json:"right_operand,omitempty"`
+	// Operator to connect the two operands.
+	//
+	// Required for creating a combined rule user list.
+	RuleOperator         enums.UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator `protobuf:"varint,3,opt,name=rule_operator,json=ruleOperator,proto3,enum=google.ads.googleads.v3.enums.UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator" json:"rule_operator,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                            `json:"-"`
+	XXX_unrecognized     []byte                                                              `json:"-"`
+	XXX_sizecache        int32                                                               `json:"-"`
+}
+
+func (m *CombinedRuleUserListInfo) Reset()         { *m = CombinedRuleUserListInfo{} }
+func (m *CombinedRuleUserListInfo) String() string { return proto.CompactTextString(m) }
+func (*CombinedRuleUserListInfo) ProtoMessage()    {}
+func (*CombinedRuleUserListInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{8}
+}
+
+func (m *CombinedRuleUserListInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CombinedRuleUserListInfo.Unmarshal(m, b)
+}
+func (m *CombinedRuleUserListInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CombinedRuleUserListInfo.Marshal(b, m, deterministic)
+}
+func (m *CombinedRuleUserListInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CombinedRuleUserListInfo.Merge(m, src)
+}
+func (m *CombinedRuleUserListInfo) XXX_Size() int {
+	return xxx_messageInfo_CombinedRuleUserListInfo.Size(m)
+}
+func (m *CombinedRuleUserListInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_CombinedRuleUserListInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CombinedRuleUserListInfo proto.InternalMessageInfo
+
+func (m *CombinedRuleUserListInfo) GetLeftOperand() *UserListRuleInfo {
+	if m != nil {
+		return m.LeftOperand
+	}
+	return nil
+}
+
+func (m *CombinedRuleUserListInfo) GetRightOperand() *UserListRuleInfo {
+	if m != nil {
+		return m.RightOperand
+	}
+	return nil
+}
+
+func (m *CombinedRuleUserListInfo) GetRuleOperator() enums.UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator {
+	if m != nil {
+		return m.RuleOperator
+	}
+	return enums.UserListCombinedRuleOperatorEnum_UNSPECIFIED
+}
+
+// Visitors of a page during specific dates.
+type DateSpecificRuleUserListInfo struct {
+	// Boolean rule that defines visitor of a page.
+	//
+	// Required for creating a date specific rule user list.
+	Rule *UserListRuleInfo `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"`
+	// Start date of users visit. If set to 2000-01-01, then the list includes all
+	// users before end_date. The date's format should be YYYY-MM-DD.
+	//
+	// Required for creating a data specific rule user list.
+	StartDate *wrappers.StringValue `protobuf:"bytes,2,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"`
+	// End date of users visit. If set to 2037-12-30, then the list includes all
+	// users after start_date. The date's format should be YYYY-MM-DD.
+	//
+	// Required for creating a data specific rule user list.
+	EndDate              *wrappers.StringValue `protobuf:"bytes,3,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *DateSpecificRuleUserListInfo) Reset()         { *m = DateSpecificRuleUserListInfo{} }
+func (m *DateSpecificRuleUserListInfo) String() string { return proto.CompactTextString(m) }
+func (*DateSpecificRuleUserListInfo) ProtoMessage()    {}
+func (*DateSpecificRuleUserListInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{9}
+}
+
+func (m *DateSpecificRuleUserListInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DateSpecificRuleUserListInfo.Unmarshal(m, b)
+}
+func (m *DateSpecificRuleUserListInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DateSpecificRuleUserListInfo.Marshal(b, m, deterministic)
+}
+func (m *DateSpecificRuleUserListInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DateSpecificRuleUserListInfo.Merge(m, src)
+}
+func (m *DateSpecificRuleUserListInfo) XXX_Size() int {
+	return xxx_messageInfo_DateSpecificRuleUserListInfo.Size(m)
+}
+func (m *DateSpecificRuleUserListInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_DateSpecificRuleUserListInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DateSpecificRuleUserListInfo proto.InternalMessageInfo
+
+func (m *DateSpecificRuleUserListInfo) GetRule() *UserListRuleInfo {
+	if m != nil {
+		return m.Rule
+	}
+	return nil
+}
+
+func (m *DateSpecificRuleUserListInfo) GetStartDate() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDate
+	}
+	return nil
+}
+
+func (m *DateSpecificRuleUserListInfo) GetEndDate() *wrappers.StringValue {
+	if m != nil {
+		return m.EndDate
+	}
+	return nil
+}
+
+// Visitors of a page. The page visit is defined by one boolean rule expression.
+type ExpressionRuleUserListInfo struct {
+	// Boolean rule that defines this user list. The rule consists of a list of
+	// rule item groups and each rule item group consists of a list of rule items.
+	// All the rule item groups are ORed or ANDed together for evaluation based on
+	// rule.rule_type.
+	//
+	// Required for creating an expression rule user list.
+	Rule                 *UserListRuleInfo `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *ExpressionRuleUserListInfo) Reset()         { *m = ExpressionRuleUserListInfo{} }
+func (m *ExpressionRuleUserListInfo) String() string { return proto.CompactTextString(m) }
+func (*ExpressionRuleUserListInfo) ProtoMessage()    {}
+func (*ExpressionRuleUserListInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{10}
+}
+
+func (m *ExpressionRuleUserListInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExpressionRuleUserListInfo.Unmarshal(m, b)
+}
+func (m *ExpressionRuleUserListInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExpressionRuleUserListInfo.Marshal(b, m, deterministic)
+}
+func (m *ExpressionRuleUserListInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExpressionRuleUserListInfo.Merge(m, src)
+}
+func (m *ExpressionRuleUserListInfo) XXX_Size() int {
+	return xxx_messageInfo_ExpressionRuleUserListInfo.Size(m)
+}
+func (m *ExpressionRuleUserListInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExpressionRuleUserListInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExpressionRuleUserListInfo proto.InternalMessageInfo
+
+func (m *ExpressionRuleUserListInfo) GetRule() *UserListRuleInfo {
+	if m != nil {
+		return m.Rule
+	}
+	return nil
+}
+
+// Representation of a userlist that is generated by a rule.
+type RuleBasedUserListInfo struct {
+	// The status of pre-population. The field is default to NONE if not set which
+	// means the previous users will not be considered. If set to REQUESTED, past
+	// site visitors or app users who match the list definition will be included
+	// in the list (works on the Display Network only). This will only
+	// add past users from within the last 30 days, depending on the
+	// list's membership duration and the date when the remarketing tag is added.
+	// The status will be updated to FINISHED once request is processed, or FAILED
+	// if the request fails.
+	PrepopulationStatus enums.UserListPrepopulationStatusEnum_UserListPrepopulationStatus `protobuf:"varint,1,opt,name=prepopulation_status,json=prepopulationStatus,proto3,enum=google.ads.googleads.v3.enums.UserListPrepopulationStatusEnum_UserListPrepopulationStatus" json:"prepopulation_status,omitempty"`
+	// Subtypes of rule based user lists.
+	//
+	// Types that are valid to be assigned to RuleBasedUserList:
+	//	*RuleBasedUserListInfo_CombinedRuleUserList
+	//	*RuleBasedUserListInfo_DateSpecificRuleUserList
+	//	*RuleBasedUserListInfo_ExpressionRuleUserList
+	RuleBasedUserList    isRuleBasedUserListInfo_RuleBasedUserList `protobuf_oneof:"rule_based_user_list"`
+	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
+	XXX_unrecognized     []byte                                    `json:"-"`
+	XXX_sizecache        int32                                     `json:"-"`
+}
+
+func (m *RuleBasedUserListInfo) Reset()         { *m = RuleBasedUserListInfo{} }
+func (m *RuleBasedUserListInfo) String() string { return proto.CompactTextString(m) }
+func (*RuleBasedUserListInfo) ProtoMessage()    {}
+func (*RuleBasedUserListInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{11}
+}
+
+func (m *RuleBasedUserListInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RuleBasedUserListInfo.Unmarshal(m, b)
+}
+func (m *RuleBasedUserListInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RuleBasedUserListInfo.Marshal(b, m, deterministic)
+}
+func (m *RuleBasedUserListInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RuleBasedUserListInfo.Merge(m, src)
+}
+func (m *RuleBasedUserListInfo) XXX_Size() int {
+	return xxx_messageInfo_RuleBasedUserListInfo.Size(m)
+}
+func (m *RuleBasedUserListInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_RuleBasedUserListInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RuleBasedUserListInfo proto.InternalMessageInfo
+
+func (m *RuleBasedUserListInfo) GetPrepopulationStatus() enums.UserListPrepopulationStatusEnum_UserListPrepopulationStatus {
+	if m != nil {
+		return m.PrepopulationStatus
+	}
+	return enums.UserListPrepopulationStatusEnum_UNSPECIFIED
+}
+
+type isRuleBasedUserListInfo_RuleBasedUserList interface {
+	isRuleBasedUserListInfo_RuleBasedUserList()
+}
+
+type RuleBasedUserListInfo_CombinedRuleUserList struct {
+	CombinedRuleUserList *CombinedRuleUserListInfo `protobuf:"bytes,2,opt,name=combined_rule_user_list,json=combinedRuleUserList,proto3,oneof"`
+}
+
+type RuleBasedUserListInfo_DateSpecificRuleUserList struct {
+	DateSpecificRuleUserList *DateSpecificRuleUserListInfo `protobuf:"bytes,3,opt,name=date_specific_rule_user_list,json=dateSpecificRuleUserList,proto3,oneof"`
+}
+
+type RuleBasedUserListInfo_ExpressionRuleUserList struct {
+	ExpressionRuleUserList *ExpressionRuleUserListInfo `protobuf:"bytes,4,opt,name=expression_rule_user_list,json=expressionRuleUserList,proto3,oneof"`
+}
+
+func (*RuleBasedUserListInfo_CombinedRuleUserList) isRuleBasedUserListInfo_RuleBasedUserList() {}
+
+func (*RuleBasedUserListInfo_DateSpecificRuleUserList) isRuleBasedUserListInfo_RuleBasedUserList() {}
+
+func (*RuleBasedUserListInfo_ExpressionRuleUserList) isRuleBasedUserListInfo_RuleBasedUserList() {}
+
+func (m *RuleBasedUserListInfo) GetRuleBasedUserList() isRuleBasedUserListInfo_RuleBasedUserList {
+	if m != nil {
+		return m.RuleBasedUserList
+	}
+	return nil
+}
+
+func (m *RuleBasedUserListInfo) GetCombinedRuleUserList() *CombinedRuleUserListInfo {
+	if x, ok := m.GetRuleBasedUserList().(*RuleBasedUserListInfo_CombinedRuleUserList); ok {
+		return x.CombinedRuleUserList
+	}
+	return nil
+}
+
+func (m *RuleBasedUserListInfo) GetDateSpecificRuleUserList() *DateSpecificRuleUserListInfo {
+	if x, ok := m.GetRuleBasedUserList().(*RuleBasedUserListInfo_DateSpecificRuleUserList); ok {
+		return x.DateSpecificRuleUserList
+	}
+	return nil
+}
+
+func (m *RuleBasedUserListInfo) GetExpressionRuleUserList() *ExpressionRuleUserListInfo {
+	if x, ok := m.GetRuleBasedUserList().(*RuleBasedUserListInfo_ExpressionRuleUserList); ok {
+		return x.ExpressionRuleUserList
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*RuleBasedUserListInfo) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*RuleBasedUserListInfo_CombinedRuleUserList)(nil),
+		(*RuleBasedUserListInfo_DateSpecificRuleUserList)(nil),
+		(*RuleBasedUserListInfo_ExpressionRuleUserList)(nil),
+	}
+}
+
+// Represents a user list that is a custom combination of user lists.
+type LogicalUserListInfo struct {
+	// Logical list rules that define this user list. The rules are defined as a
+	// logical operator (ALL/ANY/NONE) and a list of user lists. All the rules are
+	// ANDed when they are evaluated.
+	//
+	// Required for creating a logical user list.
+	Rules                []*UserListLogicalRuleInfo `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *LogicalUserListInfo) Reset()         { *m = LogicalUserListInfo{} }
+func (m *LogicalUserListInfo) String() string { return proto.CompactTextString(m) }
+func (*LogicalUserListInfo) ProtoMessage()    {}
+func (*LogicalUserListInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{12}
+}
+
+func (m *LogicalUserListInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LogicalUserListInfo.Unmarshal(m, b)
+}
+func (m *LogicalUserListInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LogicalUserListInfo.Marshal(b, m, deterministic)
+}
+func (m *LogicalUserListInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LogicalUserListInfo.Merge(m, src)
+}
+func (m *LogicalUserListInfo) XXX_Size() int {
+	return xxx_messageInfo_LogicalUserListInfo.Size(m)
+}
+func (m *LogicalUserListInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_LogicalUserListInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LogicalUserListInfo proto.InternalMessageInfo
+
+func (m *LogicalUserListInfo) GetRules() []*UserListLogicalRuleInfo {
+	if m != nil {
+		return m.Rules
+	}
+	return nil
+}
+
+// A user list logical rule. A rule has a logical operator (and/or/not) and a
+// list of user lists as operands.
+type UserListLogicalRuleInfo struct {
+	// The logical operator of the rule.
+	Operator enums.UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator `protobuf:"varint,1,opt,name=operator,proto3,enum=google.ads.googleads.v3.enums.UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator" json:"operator,omitempty"`
+	// The list of operands of the rule.
+	RuleOperands         []*LogicalUserListOperandInfo `protobuf:"bytes,2,rep,name=rule_operands,json=ruleOperands,proto3" json:"rule_operands,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *UserListLogicalRuleInfo) Reset()         { *m = UserListLogicalRuleInfo{} }
+func (m *UserListLogicalRuleInfo) String() string { return proto.CompactTextString(m) }
+func (*UserListLogicalRuleInfo) ProtoMessage()    {}
+func (*UserListLogicalRuleInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{13}
+}
+
+func (m *UserListLogicalRuleInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListLogicalRuleInfo.Unmarshal(m, b)
+}
+func (m *UserListLogicalRuleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListLogicalRuleInfo.Marshal(b, m, deterministic)
+}
+func (m *UserListLogicalRuleInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListLogicalRuleInfo.Merge(m, src)
+}
+func (m *UserListLogicalRuleInfo) XXX_Size() int {
+	return xxx_messageInfo_UserListLogicalRuleInfo.Size(m)
+}
+func (m *UserListLogicalRuleInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListLogicalRuleInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListLogicalRuleInfo proto.InternalMessageInfo
+
+func (m *UserListLogicalRuleInfo) GetOperator() enums.UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator {
+	if m != nil {
+		return m.Operator
+	}
+	return enums.UserListLogicalRuleOperatorEnum_UNSPECIFIED
+}
+
+func (m *UserListLogicalRuleInfo) GetRuleOperands() []*LogicalUserListOperandInfo {
+	if m != nil {
+		return m.RuleOperands
+	}
+	return nil
+}
+
+// Operand of logical user list that consists of a user list.
+type LogicalUserListOperandInfo struct {
+	// Resource name of a user list as an operand.
+	UserList             *wrappers.StringValue `protobuf:"bytes,1,opt,name=user_list,json=userList,proto3" json:"user_list,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *LogicalUserListOperandInfo) Reset()         { *m = LogicalUserListOperandInfo{} }
+func (m *LogicalUserListOperandInfo) String() string { return proto.CompactTextString(m) }
+func (*LogicalUserListOperandInfo) ProtoMessage()    {}
+func (*LogicalUserListOperandInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{14}
+}
+
+func (m *LogicalUserListOperandInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LogicalUserListOperandInfo.Unmarshal(m, b)
+}
+func (m *LogicalUserListOperandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LogicalUserListOperandInfo.Marshal(b, m, deterministic)
+}
+func (m *LogicalUserListOperandInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LogicalUserListOperandInfo.Merge(m, src)
+}
+func (m *LogicalUserListOperandInfo) XXX_Size() int {
+	return xxx_messageInfo_LogicalUserListOperandInfo.Size(m)
+}
+func (m *LogicalUserListOperandInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_LogicalUserListOperandInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LogicalUserListOperandInfo proto.InternalMessageInfo
+
+func (m *LogicalUserListOperandInfo) GetUserList() *wrappers.StringValue {
+	if m != nil {
+		return m.UserList
+	}
+	return nil
+}
+
+// User list targeting as a collection of conversions or remarketing actions.
+type BasicUserListInfo struct {
+	// Actions associated with this user list.
+	Actions              []*UserListActionInfo `protobuf:"bytes,1,rep,name=actions,proto3" json:"actions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *BasicUserListInfo) Reset()         { *m = BasicUserListInfo{} }
+func (m *BasicUserListInfo) String() string { return proto.CompactTextString(m) }
+func (*BasicUserListInfo) ProtoMessage()    {}
+func (*BasicUserListInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{15}
+}
+
+func (m *BasicUserListInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BasicUserListInfo.Unmarshal(m, b)
+}
+func (m *BasicUserListInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BasicUserListInfo.Marshal(b, m, deterministic)
+}
+func (m *BasicUserListInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BasicUserListInfo.Merge(m, src)
+}
+func (m *BasicUserListInfo) XXX_Size() int {
+	return xxx_messageInfo_BasicUserListInfo.Size(m)
+}
+func (m *BasicUserListInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_BasicUserListInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BasicUserListInfo proto.InternalMessageInfo
+
+func (m *BasicUserListInfo) GetActions() []*UserListActionInfo {
+	if m != nil {
+		return m.Actions
+	}
+	return nil
+}
+
+// Represents an action type used for building remarketing user lists.
+type UserListActionInfo struct {
+	// Subtypes of user list action.
+	//
+	// Types that are valid to be assigned to UserListAction:
+	//	*UserListActionInfo_ConversionAction
+	//	*UserListActionInfo_RemarketingAction
+	UserListAction       isUserListActionInfo_UserListAction `protobuf_oneof:"user_list_action"`
+	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
+	XXX_unrecognized     []byte                              `json:"-"`
+	XXX_sizecache        int32                               `json:"-"`
+}
+
+func (m *UserListActionInfo) Reset()         { *m = UserListActionInfo{} }
+func (m *UserListActionInfo) String() string { return proto.CompactTextString(m) }
+func (*UserListActionInfo) ProtoMessage()    {}
+func (*UserListActionInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b84b419434fa1b22, []int{16}
+}
+
+func (m *UserListActionInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListActionInfo.Unmarshal(m, b)
+}
+func (m *UserListActionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListActionInfo.Marshal(b, m, deterministic)
+}
+func (m *UserListActionInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListActionInfo.Merge(m, src)
+}
+func (m *UserListActionInfo) XXX_Size() int {
+	return xxx_messageInfo_UserListActionInfo.Size(m)
+}
+func (m *UserListActionInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListActionInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListActionInfo proto.InternalMessageInfo
+
+type isUserListActionInfo_UserListAction interface {
+	isUserListActionInfo_UserListAction()
+}
+
+type UserListActionInfo_ConversionAction struct {
+	ConversionAction *wrappers.StringValue `protobuf:"bytes,1,opt,name=conversion_action,json=conversionAction,proto3,oneof"`
+}
+
+type UserListActionInfo_RemarketingAction struct {
+	RemarketingAction *wrappers.StringValue `protobuf:"bytes,2,opt,name=remarketing_action,json=remarketingAction,proto3,oneof"`
+}
+
+func (*UserListActionInfo_ConversionAction) isUserListActionInfo_UserListAction() {}
+
+func (*UserListActionInfo_RemarketingAction) isUserListActionInfo_UserListAction() {}
+
+func (m *UserListActionInfo) GetUserListAction() isUserListActionInfo_UserListAction {
+	if m != nil {
+		return m.UserListAction
+	}
+	return nil
+}
+
+func (m *UserListActionInfo) GetConversionAction() *wrappers.StringValue {
+	if x, ok := m.GetUserListAction().(*UserListActionInfo_ConversionAction); ok {
+		return x.ConversionAction
+	}
+	return nil
+}
+
+func (m *UserListActionInfo) GetRemarketingAction() *wrappers.StringValue {
+	if x, ok := m.GetUserListAction().(*UserListActionInfo_RemarketingAction); ok {
+		return x.RemarketingAction
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*UserListActionInfo) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*UserListActionInfo_ConversionAction)(nil),
+		(*UserListActionInfo_RemarketingAction)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*SimilarUserListInfo)(nil), "google.ads.googleads.v3.common.SimilarUserListInfo")
+	proto.RegisterType((*CrmBasedUserListInfo)(nil), "google.ads.googleads.v3.common.CrmBasedUserListInfo")
+	proto.RegisterType((*UserListRuleInfo)(nil), "google.ads.googleads.v3.common.UserListRuleInfo")
+	proto.RegisterType((*UserListRuleItemGroupInfo)(nil), "google.ads.googleads.v3.common.UserListRuleItemGroupInfo")
+	proto.RegisterType((*UserListRuleItemInfo)(nil), "google.ads.googleads.v3.common.UserListRuleItemInfo")
+	proto.RegisterType((*UserListDateRuleItemInfo)(nil), "google.ads.googleads.v3.common.UserListDateRuleItemInfo")
+	proto.RegisterType((*UserListNumberRuleItemInfo)(nil), "google.ads.googleads.v3.common.UserListNumberRuleItemInfo")
+	proto.RegisterType((*UserListStringRuleItemInfo)(nil), "google.ads.googleads.v3.common.UserListStringRuleItemInfo")
+	proto.RegisterType((*CombinedRuleUserListInfo)(nil), "google.ads.googleads.v3.common.CombinedRuleUserListInfo")
+	proto.RegisterType((*DateSpecificRuleUserListInfo)(nil), "google.ads.googleads.v3.common.DateSpecificRuleUserListInfo")
+	proto.RegisterType((*ExpressionRuleUserListInfo)(nil), "google.ads.googleads.v3.common.ExpressionRuleUserListInfo")
+	proto.RegisterType((*RuleBasedUserListInfo)(nil), "google.ads.googleads.v3.common.RuleBasedUserListInfo")
+	proto.RegisterType((*LogicalUserListInfo)(nil), "google.ads.googleads.v3.common.LogicalUserListInfo")
+	proto.RegisterType((*UserListLogicalRuleInfo)(nil), "google.ads.googleads.v3.common.UserListLogicalRuleInfo")
+	proto.RegisterType((*LogicalUserListOperandInfo)(nil), "google.ads.googleads.v3.common.LogicalUserListOperandInfo")
+	proto.RegisterType((*BasicUserListInfo)(nil), "google.ads.googleads.v3.common.BasicUserListInfo")
+	proto.RegisterType((*UserListActionInfo)(nil), "google.ads.googleads.v3.common.UserListActionInfo")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/user_lists.proto", fileDescriptor_b84b419434fa1b22)
+}
+
+var fileDescriptor_b84b419434fa1b22 = []byte{
+	// 1305 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x41, 0x6f, 0xdb, 0xb6,
+	0x17, 0x8f, 0x9c, 0xb4, 0x4d, 0x98, 0xd4, 0xff, 0x94, 0xcd, 0xbf, 0x75, 0xbd, 0xa0, 0x28, 0x74,
+	0xea, 0x49, 0x2e, 0xec, 0x62, 0x5d, 0xdd, 0x5d, 0xec, 0xb8, 0x48, 0x82, 0xb6, 0x6b, 0x21, 0xaf,
+	0xd9, 0x56, 0x04, 0x50, 0x69, 0x89, 0x76, 0x85, 0x4a, 0xa4, 0x46, 0x4a, 0x69, 0x0d, 0x0c, 0xc3,
+	0x76, 0xda, 0x61, 0xd8, 0x97, 0xd8, 0x71, 0xfb, 0x1a, 0x3b, 0xf5, 0x30, 0x60, 0xd7, 0x7d, 0x83,
+	0xed, 0xb8, 0x4f, 0x30, 0x90, 0xa2, 0x6c, 0xc9, 0x96, 0x12, 0xa6, 0xc5, 0x4e, 0xa6, 0xc8, 0xf7,
+	0x7e, 0xef, 0xc7, 0xc7, 0x1f, 0x1f, 0x49, 0x83, 0xd6, 0x84, 0xd2, 0x49, 0x80, 0x5b, 0xc8, 0xe3,
+	0xaa, 0x29, 0x5a, 0x27, 0x9d, 0x96, 0x4b, 0xc3, 0x90, 0x92, 0x56, 0xc2, 0x31, 0x73, 0x02, 0x9f,
+	0xc7, 0xdc, 0x8a, 0x18, 0x8d, 0x29, 0xbc, 0x99, 0x5a, 0x59, 0xc8, 0xe3, 0xd6, 0xcc, 0xc1, 0x3a,
+	0xe9, 0x58, 0xa9, 0x43, 0xb3, 0x5f, 0x05, 0x88, 0x49, 0x12, 0xf2, 0x96, 0x9b, 0xf0, 0x98, 0x86,
+	0x98, 0x39, 0x21, 0x8a, 0xdd, 0x57, 0x4e, 0x12, 0x05, 0x14, 0x79, 0xce, 0x6b, 0x3c, 0x75, 0xe2,
+	0x69, 0x84, 0xd3, 0x18, 0xcd, 0xc1, 0xe9, 0x18, 0x33, 0x4e, 0x8e, 0x4b, 0xc3, 0x91, 0x4f, 0xb0,
+	0xe7, 0xb0, 0x24, 0xc0, 0x0e, 0x8d, 0x30, 0x43, 0x31, 0x65, 0x0a, 0xa5, 0xaf, 0x8d, 0xc2, 0x42,
+	0xc7, 0x43, 0x31, 0x72, 0x38, 0x4d, 0x98, 0x8b, 0xf3, 0x4c, 0x1e, 0xea, 0x62, 0x78, 0x28, 0xc6,
+	0x29, 0x0b, 0x3f, 0xc6, 0xe1, 0x22, 0x95, 0x3d, 0x5d, 0x98, 0x80, 0x4e, 0x7c, 0x17, 0x05, 0xa5,
+	0xf3, 0xd9, 0xd7, 0x05, 0x21, 0x49, 0x38, 0xc2, 0xac, 0x9a, 0x8d, 0x76, 0x62, 0x22, 0x86, 0x23,
+	0x1a, 0x25, 0x01, 0x8a, 0x7d, 0x4a, 0x1c, 0x1e, 0xa3, 0x38, 0x51, 0x32, 0x68, 0xde, 0xd3, 0xc5,
+	0x90, 0x2c, 0x72, 0x19, 0xd5, 0x9e, 0x05, 0x8f, 0x99, 0x4f, 0x26, 0xd5, 0xb3, 0x50, 0x42, 0x6c,
+	0xc9, 0xaf, 0x51, 0x32, 0x6e, 0xbd, 0x61, 0x28, 0x8a, 0x30, 0xcb, 0x18, 0xee, 0x66, 0x81, 0x22,
+	0xbf, 0x85, 0x08, 0xa1, 0xb1, 0x9c, 0x85, 0x1a, 0x35, 0xbf, 0x02, 0x57, 0x87, 0x7e, 0xe8, 0x07,
+	0x88, 0x3d, 0xe7, 0x98, 0x3d, 0xf6, 0x79, 0x7c, 0x48, 0xc6, 0x14, 0xf6, 0x41, 0x9d, 0x63, 0xec,
+	0x39, 0x33, 0x1a, 0x0d, 0xe3, 0x96, 0x71, 0x7b, 0xb3, 0xbd, 0xab, 0xb4, 0x6e, 0x65, 0xd1, 0xac,
+	0xa1, 0xa4, 0x77, 0x84, 0x82, 0x04, 0xdb, 0x5b, 0xc2, 0x27, 0xc3, 0x31, 0xff, 0xa8, 0x81, 0x9d,
+	0x3d, 0x16, 0xf6, 0x11, 0x9f, 0x77, 0x4a, 0xf0, 0x0e, 0xb8, 0x88, 0xa2, 0xc8, 0xf1, 0x3d, 0x2d,
+	0xd0, 0x0b, 0x28, 0x8a, 0x0e, 0x3d, 0xf8, 0x9d, 0x01, 0xfe, 0xb7, 0xb0, 0x4b, 0x1a, 0xb5, 0x5b,
+	0xc6, 0xed, 0x7a, 0xfb, 0x4b, 0xab, 0x6a, 0x2b, 0xca, 0x54, 0x5a, 0x7b, 0x6a, 0xab, 0x3d, 0x11,
+	0x3b, 0xed, 0xb9, 0x84, 0x78, 0x84, 0xa7, 0x9f, 0x4f, 0x23, 0xfc, 0x90, 0x24, 0xe1, 0x29, 0xc3,
+	0xf6, 0xe5, 0x24, 0xff, 0x29, 0x28, 0x6c, 0x2f, 0xee, 0x8f, 0xc6, 0xaa, 0xe4, 0x70, 0x74, 0x06,
+	0x87, 0x6c, 0xfe, 0x7b, 0x2c, 0x1c, 0xa0, 0x18, 0x0d, 0x25, 0xc0, 0x8c, 0x42, 0xe5, 0xa8, 0x5d,
+	0xf7, 0x0a, 0xdf, 0xe6, 0x9f, 0x06, 0xd8, 0xce, 0xac, 0xed, 0x24, 0xc0, 0x32, 0x9f, 0x08, 0x6c,
+	0xcc, 0xd4, 0x25, 0x53, 0x5a, 0x6f, 0x0f, 0x34, 0xf9, 0x08, 0x8c, 0x25, 0x1a, 0x59, 0xa7, 0xbd,
+	0xce, 0x54, 0x0b, 0xba, 0x60, 0x7b, 0x2e, 0xc0, 0x09, 0xa3, 0x49, 0xc4, 0x1b, 0xb5, 0x5b, 0xab,
+	0xb7, 0x37, 0xdb, 0xf7, 0xad, 0xd3, 0x0b, 0x61, 0x01, 0xf5, 0x30, 0xc6, 0xe1, 0xbe, 0xf0, 0x16,
+	0xbc, 0xed, 0x3a, 0xcb, 0x77, 0x71, 0x33, 0x02, 0x37, 0x2a, 0x8d, 0xe1, 0x10, 0x80, 0x19, 0x03,
+	0xde, 0x30, 0x64, 0xec, 0xbb, 0xe7, 0x8d, 0x2d, 0xc3, 0x6e, 0x64, 0x61, 0xb9, 0xf9, 0xc3, 0x2a,
+	0xd8, 0x29, 0xb3, 0x81, 0x77, 0xc0, 0x1a, 0x41, 0x21, 0xd6, 0x12, 0xa8, 0xb4, 0x84, 0x63, 0xb0,
+	0xbd, 0x58, 0x6f, 0xa4, 0x3e, 0x37, 0xdb, 0x5d, 0x5d, 0x96, 0x9f, 0x49, 0xff, 0x3c, 0x8f, 0x83,
+	0x15, 0xbb, 0x4e, 0x0a, 0xbd, 0x22, 0xce, 0x62, 0x45, 0x90, 0x1a, 0x3c, 0x47, 0x9c, 0x94, 0xfc,
+	0x62, 0x1c, 0x5e, 0xe8, 0x85, 0x2f, 0x41, 0xbd, 0x58, 0xcb, 0x1b, 0x6b, 0x32, 0xca, 0x27, 0xba,
+	0x51, 0x06, 0x28, 0xc6, 0x0b, 0x31, 0xb6, 0xbc, 0x5c, 0x5f, 0x7f, 0x53, 0xc9, 0x56, 0x80, 0x9b,
+	0x3f, 0xd6, 0x40, 0xa3, 0xca, 0x13, 0xbe, 0x05, 0xeb, 0x59, 0xd1, 0x53, 0xfa, 0x3e, 0xd6, 0xd4,
+	0x77, 0x1e, 0xea, 0xa9, 0x82, 0x28, 0x68, 0xbd, 0xcc, 0xc0, 0x9e, 0x45, 0x83, 0x6d, 0x70, 0xe1,
+	0x44, 0x2c, 0xb2, 0x5a, 0xca, 0x33, 0x2a, 0x95, 0x34, 0x85, 0x3d, 0x50, 0xa7, 0xe3, 0x31, 0xc7,
+	0xb1, 0xe3, 0x13, 0xc7, 0x43, 0x53, 0xae, 0xd6, 0xe7, 0xa3, 0x25, 0xe7, 0x43, 0x12, 0x7f, 0x7c,
+	0x57, 0x95, 0xce, 0xd4, 0xe5, 0x90, 0x0c, 0xd0, 0x94, 0x9b, 0xbf, 0x1b, 0xa0, 0x59, 0xad, 0x0a,
+	0xf8, 0xcd, 0x52, 0x3e, 0x5e, 0x6a, 0xe6, 0xa3, 0x08, 0x56, 0x9a, 0x91, 0x72, 0x93, 0xf3, 0xe4,
+	0x64, 0x40, 0x93, 0x51, 0x80, 0xf3, 0x39, 0x29, 0x4c, 0x68, 0x59, 0x7e, 0x1f, 0x30, 0xa1, 0x22,
+	0x58, 0xe9, 0x84, 0xca, 0x4d, 0x3e, 0x6c, 0x91, 0xcd, 0x77, 0x35, 0xd0, 0xd8, 0x53, 0xb7, 0x2e,
+	0x01, 0x5d, 0x38, 0xe0, 0x86, 0x60, 0x2b, 0xc0, 0xe3, 0x38, 0x3d, 0xa9, 0x49, 0x76, 0xcc, 0xdd,
+	0x39, 0x57, 0xb5, 0x12, 0x95, 0x6a, 0x53, 0xa0, 0x3c, 0x4d, 0x41, 0xe0, 0x73, 0x70, 0x99, 0xf9,
+	0x93, 0x57, 0x73, 0xd4, 0xda, 0x7b, 0xa2, 0x6e, 0x49, 0x98, 0x0c, 0xf6, 0x7b, 0x03, 0x5c, 0x2e,
+	0xdc, 0xb2, 0xd4, 0x89, 0xa6, 0xbb, 0xc3, 0xf2, 0x49, 0x28, 0x4d, 0x7f, 0x99, 0x81, 0xbd, 0xc5,
+	0x72, 0x5f, 0xe2, 0x54, 0xdb, 0x15, 0x1b, 0x71, 0x18, 0x61, 0xd7, 0x1f, 0xfb, 0xee, 0x52, 0x42,
+	0x07, 0x60, 0x4d, 0x38, 0xbc, 0x77, 0x22, 0xa5, 0x37, 0x7c, 0x00, 0x00, 0x8f, 0x11, 0x4b, 0x2f,
+	0xa9, 0x5a, 0x8b, 0xbd, 0x21, 0xed, 0x05, 0x35, 0x78, 0x0f, 0xac, 0x63, 0xe2, 0xa5, 0xae, 0xab,
+	0x1a, 0xae, 0x97, 0x30, 0xf1, 0x84, 0xa3, 0x39, 0x02, 0xcd, 0x87, 0x6f, 0x23, 0x86, 0x39, 0xf7,
+	0x29, 0xf9, 0x6f, 0x66, 0x66, 0xfe, 0xba, 0x06, 0xfe, 0x2f, 0xba, 0x96, 0xef, 0x5a, 0x3f, 0x19,
+	0x60, 0xa7, 0xec, 0xfa, 0xaa, 0xb6, 0xd9, 0x0b, 0xcd, 0x55, 0x7e, 0x96, 0x87, 0x18, 0x4a, 0x84,
+	0xc2, 0x22, 0x97, 0x8c, 0xdb, 0x57, 0xa3, 0xe5, 0x4e, 0xf8, 0x35, 0xb8, 0x5e, 0x7c, 0xac, 0xcc,
+	0x6f, 0x98, 0x35, 0xbd, 0xf3, 0xa5, 0x6a, 0xd7, 0x1d, 0xac, 0xd8, 0x3b, 0x6e, 0xc9, 0x18, 0xfc,
+	0x16, 0xec, 0xca, 0x93, 0x8c, 0x2b, 0x75, 0x2d, 0xc6, 0x4d, 0x57, 0xf3, 0xd3, 0xb3, 0xe2, 0x9e,
+	0x26, 0xd0, 0x83, 0x15, 0xbb, 0xe1, 0x55, 0x8c, 0xc3, 0x37, 0xe0, 0x06, 0x9e, 0x09, 0x60, 0x31,
+	0xf8, 0x9a, 0xde, 0xd1, 0x5d, 0xad, 0xa0, 0x83, 0x15, 0xfb, 0x1a, 0x2e, 0x1d, 0xed, 0x5f, 0x03,
+	0x3b, 0x32, 0xda, 0x48, 0xa8, 0x62, 0x1e, 0xd3, 0xf4, 0xc0, 0xd5, 0xc7, 0xe9, 0xfb, 0xaa, 0x20,
+	0x95, 0x27, 0xe0, 0x82, 0x30, 0xcf, 0x2e, 0x57, 0xf7, 0x74, 0xb5, 0xa8, 0xb0, 0x66, 0x92, 0x4c,
+	0x51, 0xcc, 0x7f, 0x0c, 0x70, 0xbd, 0xc2, 0x04, 0x9e, 0x2c, 0xd5, 0x7b, 0x5d, 0x21, 0xe6, 0x90,
+	0x4a, 0xab, 0x4d, 0xc9, 0x78, 0xae, 0xd2, 0x3b, 0xf9, 0x5a, 0x47, 0xbc, 0xec, 0x0e, 0x7b, 0x66,
+	0xfa, 0x17, 0xd2, 0xa5, 0x6a, 0xa7, 0xaa, 0xa6, 0x59, 0x28, 0xe2, 0x71, 0xf3, 0x0b, 0xd0, 0xac,
+	0xb6, 0x85, 0xf7, 0xc1, 0xc6, 0xf9, 0x1e, 0x54, 0xeb, 0x49, 0xf6, 0x98, 0x42, 0xe0, 0x4a, 0x1f,
+	0x71, 0xdf, 0x2d, 0xac, 0xd8, 0x63, 0x70, 0x09, 0xb9, 0xf2, 0x35, 0xa7, 0xd6, 0xac, 0xad, 0xbb,
+	0x66, 0x3d, 0xe9, 0x26, 0x27, 0x90, 0x41, 0x98, 0xbf, 0x19, 0x00, 0x2e, 0x8f, 0xc3, 0x47, 0xe0,
+	0x8a, 0x4b, 0xc9, 0x09, 0x66, 0x52, 0xbe, 0xa9, 0xb1, 0x0e, 0xf9, 0x83, 0x15, 0x7b, 0x7b, 0xee,
+	0x98, 0x02, 0xc2, 0x27, 0x00, 0x32, 0x1c, 0x22, 0xf6, 0x1a, 0xc7, 0xe2, 0x0a, 0xab, 0xd0, 0x6a,
+	0x5a, 0x68, 0x57, 0x72, 0x9e, 0x29, 0x5c, 0x1f, 0x82, 0xed, 0xf9, 0x43, 0x39, 0x05, 0xeb, 0xff,
+	0x65, 0x00, 0xd3, 0xa5, 0xe1, 0x19, 0x99, 0xe8, 0xd7, 0xb3, 0xa9, 0xf2, 0x67, 0x22, 0xdc, 0x33,
+	0xe3, 0x85, 0xfa, 0xb7, 0xc5, 0x9a, 0xd0, 0x00, 0x91, 0x89, 0x45, 0xd9, 0xa4, 0x35, 0xc1, 0x44,
+	0x92, 0xc9, 0x5e, 0xe8, 0x91, 0xcf, 0xab, 0xfe, 0x21, 0x7a, 0x90, 0xfe, 0xfc, 0x5c, 0x5b, 0xdd,
+	0xef, 0xf5, 0x7e, 0xa9, 0xdd, 0xdc, 0x4f, 0xc1, 0x7a, 0x1e, 0xb7, 0xd2, 0xa6, 0x68, 0x1d, 0x75,
+	0x44, 0xf9, 0x0a, 0x29, 0x79, 0x97, 0x19, 0x1c, 0xf7, 0x3c, 0x7e, 0x3c, 0x33, 0x38, 0x3e, 0xea,
+	0x1c, 0xa7, 0x06, 0x7f, 0xd7, 0xcc, 0xb4, 0xb7, 0xdb, 0xed, 0x79, 0xbc, 0xdb, 0x9d, 0x99, 0x74,
+	0xbb, 0x47, 0x9d, 0x6e, 0x37, 0x35, 0x1a, 0x5d, 0x94, 0xec, 0x3a, 0xff, 0x06, 0x00, 0x00, 0xff,
+	0xff, 0x32, 0xc1, 0x74, 0x46, 0xbe, 0x12, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/common/value.pb.go b/googleapis/ads/googleads/v3/common/value.pb.go
new file mode 100644
index 0000000..03efc4e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/common/value.pb.go
@@ -0,0 +1,184 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/common/value.proto
+
+package common
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A generic data container.
+type Value struct {
+	// A value.
+	//
+	// Types that are valid to be assigned to Value:
+	//	*Value_BooleanValue
+	//	*Value_Int64Value
+	//	*Value_FloatValue
+	//	*Value_DoubleValue
+	//	*Value_StringValue
+	Value                isValue_Value `protobuf_oneof:"value"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *Value) Reset()         { *m = Value{} }
+func (m *Value) String() string { return proto.CompactTextString(m) }
+func (*Value) ProtoMessage()    {}
+func (*Value) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73d72db515a577a, []int{0}
+}
+
+func (m *Value) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Value.Unmarshal(m, b)
+}
+func (m *Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Value.Marshal(b, m, deterministic)
+}
+func (m *Value) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Value.Merge(m, src)
+}
+func (m *Value) XXX_Size() int {
+	return xxx_messageInfo_Value.Size(m)
+}
+func (m *Value) XXX_DiscardUnknown() {
+	xxx_messageInfo_Value.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Value proto.InternalMessageInfo
+
+type isValue_Value interface {
+	isValue_Value()
+}
+
+type Value_BooleanValue struct {
+	BooleanValue bool `protobuf:"varint,1,opt,name=boolean_value,json=booleanValue,proto3,oneof"`
+}
+
+type Value_Int64Value struct {
+	Int64Value int64 `protobuf:"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof"`
+}
+
+type Value_FloatValue struct {
+	FloatValue float32 `protobuf:"fixed32,3,opt,name=float_value,json=floatValue,proto3,oneof"`
+}
+
+type Value_DoubleValue struct {
+	DoubleValue float64 `protobuf:"fixed64,4,opt,name=double_value,json=doubleValue,proto3,oneof"`
+}
+
+type Value_StringValue struct {
+	StringValue string `protobuf:"bytes,5,opt,name=string_value,json=stringValue,proto3,oneof"`
+}
+
+func (*Value_BooleanValue) isValue_Value() {}
+
+func (*Value_Int64Value) isValue_Value() {}
+
+func (*Value_FloatValue) isValue_Value() {}
+
+func (*Value_DoubleValue) isValue_Value() {}
+
+func (*Value_StringValue) isValue_Value() {}
+
+func (m *Value) GetValue() isValue_Value {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *Value) GetBooleanValue() bool {
+	if x, ok := m.GetValue().(*Value_BooleanValue); ok {
+		return x.BooleanValue
+	}
+	return false
+}
+
+func (m *Value) GetInt64Value() int64 {
+	if x, ok := m.GetValue().(*Value_Int64Value); ok {
+		return x.Int64Value
+	}
+	return 0
+}
+
+func (m *Value) GetFloatValue() float32 {
+	if x, ok := m.GetValue().(*Value_FloatValue); ok {
+		return x.FloatValue
+	}
+	return 0
+}
+
+func (m *Value) GetDoubleValue() float64 {
+	if x, ok := m.GetValue().(*Value_DoubleValue); ok {
+		return x.DoubleValue
+	}
+	return 0
+}
+
+func (m *Value) GetStringValue() string {
+	if x, ok := m.GetValue().(*Value_StringValue); ok {
+		return x.StringValue
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Value) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Value_BooleanValue)(nil),
+		(*Value_Int64Value)(nil),
+		(*Value_FloatValue)(nil),
+		(*Value_DoubleValue)(nil),
+		(*Value_StringValue)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*Value)(nil), "google.ads.googleads.v3.common.Value")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/common/value.proto", fileDescriptor_a73d72db515a577a)
+}
+
+var fileDescriptor_a73d72db515a577a = []byte{
+	// 328 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0xd1, 0x4f, 0x4b, 0xc3, 0x30,
+	0x18, 0x06, 0xf0, 0xa5, 0x73, 0xfe, 0xc9, 0xe6, 0x65, 0x27, 0x11, 0x19, 0x75, 0x22, 0x14, 0x0f,
+	0xe9, 0xa1, 0xe2, 0x21, 0x9e, 0x3a, 0x85, 0xed, 0x38, 0x76, 0xe8, 0x41, 0x0a, 0x92, 0xad, 0x35,
+	0x14, 0xb2, 0xbc, 0x63, 0xc9, 0xf6, 0x81, 0x3c, 0xfa, 0x45, 0x04, 0xbf, 0x87, 0x17, 0x3f, 0x85,
+	0x24, 0x6f, 0xd6, 0x9b, 0x9e, 0xfa, 0xf2, 0xf4, 0x97, 0x87, 0xf6, 0x0d, 0xbd, 0x93, 0x00, 0x52,
+	0xd5, 0xa9, 0xa8, 0x4c, 0x8a, 0xa3, 0x9b, 0xf6, 0x59, 0xba, 0x82, 0xf5, 0x1a, 0x74, 0xba, 0x17,
+	0x6a, 0x57, 0xb3, 0xcd, 0x16, 0x2c, 0x0c, 0x47, 0x08, 0x98, 0xa8, 0x0c, 0x6b, 0x2d, 0xdb, 0x67,
+	0x0c, 0xed, 0xe5, 0xd5, 0xa1, 0x6b, 0xd3, 0xa4, 0x42, 0x6b, 0xb0, 0xc2, 0x36, 0xa0, 0x0d, 0x9e,
+	0x1e, 0x7f, 0x12, 0xda, 0x2b, 0x5c, 0xdb, 0xf0, 0x96, 0x9e, 0x2f, 0x01, 0x54, 0x2d, 0xf4, 0xab,
+	0xaf, 0xbf, 0x20, 0x31, 0x49, 0x4e, 0x67, 0x9d, 0xc5, 0x20, 0xc4, 0xc8, 0xae, 0x69, 0xbf, 0xd1,
+	0xf6, 0xe1, 0x3e, 0xa0, 0x28, 0x26, 0x49, 0x77, 0xd6, 0x59, 0x50, 0x1f, 0xb6, 0xe4, 0x4d, 0x81,
+	0xb0, 0x81, 0x74, 0x63, 0x92, 0x44, 0x8e, 0xf8, 0x10, 0xc9, 0x0d, 0x1d, 0x54, 0xb0, 0x5b, 0xaa,
+	0x3a, 0x98, 0xa3, 0x98, 0x24, 0x64, 0xd6, 0x59, 0xf4, 0x31, 0x6d, 0x91, 0xb1, 0xdb, 0x46, 0xcb,
+	0x80, 0x7a, 0x31, 0x49, 0xce, 0x1c, 0xc2, 0xd4, 0xa3, 0xc9, 0x09, 0xed, 0xf9, 0xb7, 0x93, 0x6f,
+	0x42, 0xc7, 0x2b, 0x58, 0xb3, 0xff, 0xd7, 0x31, 0xa1, 0xfe, 0xd8, 0xdc, 0xfd, 0xfc, 0x9c, 0xbc,
+	0x3c, 0x07, 0x2d, 0x41, 0x09, 0x2d, 0x19, 0x6c, 0x65, 0x2a, 0x6b, 0xed, 0x57, 0x73, 0x58, 0xfc,
+	0xa6, 0x31, 0x7f, 0xdd, 0xc3, 0x23, 0x3e, 0xde, 0xa3, 0xee, 0x34, 0xcf, 0x3f, 0xa2, 0xd1, 0x14,
+	0xcb, 0xf2, 0xca, 0x30, 0x1c, 0xdd, 0x54, 0x64, 0xec, 0xc9, 0xb3, 0xaf, 0x03, 0x28, 0xf3, 0xca,
+	0x94, 0x2d, 0x28, 0x8b, 0xac, 0x44, 0xf0, 0x13, 0x8d, 0x31, 0xe5, 0x3c, 0xaf, 0x0c, 0xe7, 0x2d,
+	0xe1, 0xbc, 0xc8, 0x38, 0x47, 0xb4, 0x3c, 0xf6, 0x5f, 0x97, 0xfd, 0x06, 0x00, 0x00, 0xff, 0xff,
+	0x12, 0x9e, 0x55, 0x7b, 0x24, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/access_reason.pb.go b/googleapis/ads/googleads/v3/enums/access_reason.pb.go
new file mode 100644
index 0000000..d7bc880
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/access_reason.pb.go
@@ -0,0 +1,137 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/access_reason.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible access reasons.
+type AccessReasonEnum_AccessReason int32
+
+const (
+	// Not specified.
+	AccessReasonEnum_UNSPECIFIED AccessReasonEnum_AccessReason = 0
+	// Used for return value only. Represents value unknown in this version.
+	AccessReasonEnum_UNKNOWN AccessReasonEnum_AccessReason = 1
+	// The resource is owned by the user.
+	AccessReasonEnum_OWNED AccessReasonEnum_AccessReason = 2
+	// The resource is shared to the user.
+	AccessReasonEnum_SHARED AccessReasonEnum_AccessReason = 3
+	// The resource is licensed to the user.
+	AccessReasonEnum_LICENSED AccessReasonEnum_AccessReason = 4
+	// The user subscribed to the resource.
+	AccessReasonEnum_SUBSCRIBED AccessReasonEnum_AccessReason = 5
+	// The resource is accessible to the user.
+	AccessReasonEnum_AFFILIATED AccessReasonEnum_AccessReason = 6
+)
+
+var AccessReasonEnum_AccessReason_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "OWNED",
+	3: "SHARED",
+	4: "LICENSED",
+	5: "SUBSCRIBED",
+	6: "AFFILIATED",
+}
+
+var AccessReasonEnum_AccessReason_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"OWNED":       2,
+	"SHARED":      3,
+	"LICENSED":    4,
+	"SUBSCRIBED":  5,
+	"AFFILIATED":  6,
+}
+
+func (x AccessReasonEnum_AccessReason) String() string {
+	return proto.EnumName(AccessReasonEnum_AccessReason_name, int32(x))
+}
+
+func (AccessReasonEnum_AccessReason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6898016474772933, []int{0, 0}
+}
+
+// Indicates the way the resource such as user list is related to a user.
+type AccessReasonEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AccessReasonEnum) Reset()         { *m = AccessReasonEnum{} }
+func (m *AccessReasonEnum) String() string { return proto.CompactTextString(m) }
+func (*AccessReasonEnum) ProtoMessage()    {}
+func (*AccessReasonEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6898016474772933, []int{0}
+}
+
+func (m *AccessReasonEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccessReasonEnum.Unmarshal(m, b)
+}
+func (m *AccessReasonEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccessReasonEnum.Marshal(b, m, deterministic)
+}
+func (m *AccessReasonEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccessReasonEnum.Merge(m, src)
+}
+func (m *AccessReasonEnum) XXX_Size() int {
+	return xxx_messageInfo_AccessReasonEnum.Size(m)
+}
+func (m *AccessReasonEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccessReasonEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccessReasonEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AccessReasonEnum_AccessReason", AccessReasonEnum_AccessReason_name, AccessReasonEnum_AccessReason_value)
+	proto.RegisterType((*AccessReasonEnum)(nil), "google.ads.googleads.v3.enums.AccessReasonEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/access_reason.proto", fileDescriptor_6898016474772933)
+}
+
+var fileDescriptor_6898016474772933 = []byte{
+	// 336 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xd1, 0x4e, 0xf2, 0x30,
+	0x18, 0xfd, 0x37, 0x7e, 0x50, 0x0b, 0xd1, 0xda, 0x4b, 0x23, 0x17, 0xf0, 0x00, 0x5d, 0xcc, 0xee,
+	0xea, 0x55, 0xc7, 0x0a, 0x2e, 0x92, 0x41, 0x98, 0x40, 0x62, 0x96, 0x98, 0xca, 0x96, 0x85, 0x04,
+	0x5a, 0xe4, 0x03, 0xde, 0xc0, 0x17, 0xf1, 0xd2, 0x47, 0xf1, 0x41, 0xbc, 0xf0, 0x29, 0xcc, 0x5a,
+	0x21, 0xdc, 0xe8, 0x4d, 0x73, 0xfa, 0x7d, 0xe7, 0x9c, 0x7c, 0xe7, 0xa0, 0x9b, 0x42, 0xeb, 0x62,
+	0x91, 0x7b, 0x32, 0x03, 0xcf, 0xc2, 0x12, 0xed, 0x7c, 0x2f, 0x57, 0xdb, 0x25, 0x78, 0x72, 0x36,
+	0xcb, 0x01, 0x9e, 0xd6, 0xb9, 0x04, 0xad, 0xe8, 0x6a, 0xad, 0x37, 0x9a, 0x34, 0x2d, 0x8f, 0xca,
+	0x0c, 0xe8, 0x41, 0x42, 0x77, 0x3e, 0x35, 0x92, 0xab, 0xeb, 0xbd, 0xe3, 0x6a, 0xee, 0x49, 0xa5,
+	0xf4, 0x46, 0x6e, 0xe6, 0x5a, 0x81, 0x15, 0xb7, 0x5f, 0x1d, 0x84, 0xb9, 0x31, 0x1d, 0x19, 0x4f,
+	0xa1, 0xb6, 0xcb, 0xf6, 0x0b, 0x6a, 0x1c, 0xcf, 0xc8, 0x05, 0xaa, 0x8f, 0xe3, 0x64, 0x28, 0x3a,
+	0x51, 0x37, 0x12, 0x21, 0xfe, 0x47, 0xea, 0xe8, 0x64, 0x1c, 0xdf, 0xc7, 0x83, 0x69, 0x8c, 0x1d,
+	0x72, 0x86, 0xaa, 0x83, 0x69, 0x2c, 0x42, 0xec, 0x12, 0x84, 0x6a, 0xc9, 0x1d, 0x1f, 0x89, 0x10,
+	0x57, 0x48, 0x03, 0x9d, 0xf6, 0xa3, 0x8e, 0x88, 0x13, 0x11, 0xe2, 0xff, 0xe4, 0x1c, 0xa1, 0x64,
+	0x1c, 0x24, 0x9d, 0x51, 0x14, 0x88, 0x10, 0x57, 0xcb, 0x3f, 0xef, 0x76, 0xa3, 0x7e, 0xc4, 0x1f,
+	0x44, 0x88, 0x6b, 0xc1, 0xa7, 0x83, 0x5a, 0x33, 0xbd, 0xa4, 0x7f, 0x66, 0x09, 0x2e, 0x8f, 0xcf,
+	0x1a, 0x96, 0x01, 0x86, 0xce, 0x63, 0xf0, 0xa3, 0x29, 0xf4, 0x42, 0xaa, 0x82, 0xea, 0x75, 0xe1,
+	0x15, 0xb9, 0x32, 0xf1, 0xf6, 0x15, 0xae, 0xe6, 0xf0, 0x4b, 0xa3, 0xb7, 0xe6, 0x7d, 0x73, 0x2b,
+	0x3d, 0xce, 0xdf, 0xdd, 0x66, 0xcf, 0x5a, 0xf1, 0x0c, 0xa8, 0x85, 0x25, 0x9a, 0xf8, 0xb4, 0xac,
+	0x05, 0x3e, 0xf6, 0xfb, 0x94, 0x67, 0x90, 0x1e, 0xf6, 0xe9, 0xc4, 0x4f, 0xcd, 0xfe, 0xcb, 0x6d,
+	0xd9, 0x21, 0x63, 0x3c, 0x03, 0xc6, 0x0e, 0x0c, 0xc6, 0x26, 0x3e, 0x63, 0x86, 0xf3, 0x5c, 0x33,
+	0x87, 0xf9, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x6d, 0xce, 0xd8, 0xe9, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/access_role.pb.go b/googleapis/ads/googleads/v3/enums/access_role.pb.go
new file mode 100644
index 0000000..29c0fc3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/access_role.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/access_role.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible access role of a user.
+type AccessRoleEnum_AccessRole int32
+
+const (
+	// Not specified.
+	AccessRoleEnum_UNSPECIFIED AccessRoleEnum_AccessRole = 0
+	// Used for return value only. Represents value unknown in this version.
+	AccessRoleEnum_UNKNOWN AccessRoleEnum_AccessRole = 1
+	// Owns its account and can control the addition of other users.
+	AccessRoleEnum_ADMIN AccessRoleEnum_AccessRole = 2
+	// Can modify campaigns, but can't affect other users.
+	AccessRoleEnum_STANDARD AccessRoleEnum_AccessRole = 3
+	// Can view campaigns and account changes, but cannot make edits.
+	AccessRoleEnum_READ_ONLY AccessRoleEnum_AccessRole = 4
+)
+
+var AccessRoleEnum_AccessRole_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ADMIN",
+	3: "STANDARD",
+	4: "READ_ONLY",
+}
+
+var AccessRoleEnum_AccessRole_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ADMIN":       2,
+	"STANDARD":    3,
+	"READ_ONLY":   4,
+}
+
+func (x AccessRoleEnum_AccessRole) String() string {
+	return proto.EnumName(AccessRoleEnum_AccessRole_name, int32(x))
+}
+
+func (AccessRoleEnum_AccessRole) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ea219286496feae1, []int{0, 0}
+}
+
+// Container for enum describing possible access role for user.
+type AccessRoleEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AccessRoleEnum) Reset()         { *m = AccessRoleEnum{} }
+func (m *AccessRoleEnum) String() string { return proto.CompactTextString(m) }
+func (*AccessRoleEnum) ProtoMessage()    {}
+func (*AccessRoleEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ea219286496feae1, []int{0}
+}
+
+func (m *AccessRoleEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccessRoleEnum.Unmarshal(m, b)
+}
+func (m *AccessRoleEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccessRoleEnum.Marshal(b, m, deterministic)
+}
+func (m *AccessRoleEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccessRoleEnum.Merge(m, src)
+}
+func (m *AccessRoleEnum) XXX_Size() int {
+	return xxx_messageInfo_AccessRoleEnum.Size(m)
+}
+func (m *AccessRoleEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccessRoleEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccessRoleEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AccessRoleEnum_AccessRole", AccessRoleEnum_AccessRole_name, AccessRoleEnum_AccessRole_value)
+	proto.RegisterType((*AccessRoleEnum)(nil), "google.ads.googleads.v3.enums.AccessRoleEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/access_role.proto", fileDescriptor_ea219286496feae1)
+}
+
+var fileDescriptor_ea219286496feae1 = []byte{
+	// 307 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0x02, 0x31,
+	0x14, 0x96, 0xc1, 0x3f, 0x8a, 0xca, 0xa4, 0x4b, 0x23, 0x0b, 0x38, 0x40, 0xbb, 0xe8, 0xae, 0xae,
+	0x8a, 0x33, 0x12, 0xa2, 0x16, 0x32, 0x08, 0x46, 0x33, 0x09, 0xa9, 0xb4, 0x69, 0x48, 0x86, 0x96,
+	0x50, 0xe0, 0x40, 0x2e, 0x3d, 0x8a, 0xe7, 0x70, 0xe5, 0x29, 0xcc, 0x74, 0x98, 0x61, 0xa5, 0x9b,
+	0xe6, 0xcb, 0xfb, 0x7e, 0xfa, 0xbd, 0x07, 0xb0, 0xb6, 0x56, 0x67, 0x0a, 0x0b, 0xe9, 0xf6, 0x30,
+	0x47, 0x3b, 0x82, 0x95, 0xd9, 0x2e, 0x1d, 0x16, 0xf3, 0xb9, 0x72, 0x6e, 0xb6, 0xb6, 0x99, 0x42,
+	0xab, 0xb5, 0xdd, 0x58, 0xd8, 0x2e, 0x54, 0x48, 0x48, 0x87, 0x2a, 0x03, 0xda, 0x11, 0xe4, 0x0d,
+	0xd7, 0x37, 0x65, 0xde, 0x6a, 0x81, 0x85, 0x31, 0x76, 0x23, 0x36, 0x0b, 0x6b, 0x5c, 0x61, 0xee,
+	0x4a, 0x70, 0xc5, 0x7c, 0x62, 0x62, 0x33, 0x15, 0x9b, 0xed, 0xb2, 0x9b, 0x00, 0x70, 0x98, 0xc0,
+	0x16, 0x68, 0x4e, 0xf8, 0x78, 0x14, 0xdf, 0x0d, 0xee, 0x07, 0x71, 0x14, 0x1e, 0xc1, 0x26, 0x38,
+	0x9b, 0xf0, 0x07, 0x3e, 0x7c, 0xe1, 0x61, 0x0d, 0x36, 0xc0, 0x09, 0x8b, 0x9e, 0x06, 0x3c, 0x0c,
+	0xe0, 0x05, 0x38, 0x1f, 0x3f, 0x33, 0x1e, 0xb1, 0x24, 0x0a, 0xeb, 0xf0, 0x12, 0x34, 0x92, 0x98,
+	0x45, 0xb3, 0x21, 0x7f, 0x7c, 0x0d, 0x8f, 0x7b, 0xdf, 0x35, 0xd0, 0x99, 0xdb, 0x25, 0xfa, 0xb7,
+	0x69, 0xaf, 0x75, 0xf8, 0x77, 0x94, 0x97, 0x1b, 0xd5, 0xde, 0x7a, 0x7b, 0x87, 0xb6, 0x99, 0x30,
+	0x1a, 0xd9, 0xb5, 0xc6, 0x5a, 0x19, 0x5f, 0xbd, 0x3c, 0xce, 0x6a, 0xe1, 0xfe, 0xb8, 0xd5, 0xad,
+	0x7f, 0x3f, 0x82, 0x7a, 0x9f, 0xb1, 0xcf, 0xa0, 0xdd, 0x2f, 0xa2, 0x98, 0x74, 0xa8, 0x80, 0x39,
+	0x9a, 0x12, 0x94, 0x6f, 0xed, 0xbe, 0x4a, 0x3e, 0x65, 0xd2, 0xa5, 0x15, 0x9f, 0x4e, 0x49, 0xea,
+	0xf9, 0x9f, 0xa0, 0x53, 0x0c, 0x29, 0x65, 0xd2, 0x51, 0x5a, 0x29, 0x28, 0x9d, 0x12, 0x4a, 0xbd,
+	0xe6, 0xfd, 0xd4, 0x17, 0x23, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x16, 0xb4, 0x06, 0xdb, 0xc3,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/account_budget_proposal_status.pb.go b/googleapis/ads/googleads/v3/enums/account_budget_proposal_status.pb.go
new file mode 100644
index 0000000..a0c3144
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/account_budget_proposal_status.pb.go
@@ -0,0 +1,143 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/account_budget_proposal_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible statuses of an AccountBudgetProposal.
+type AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus int32
+
+const (
+	// Not specified.
+	AccountBudgetProposalStatusEnum_UNSPECIFIED AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	AccountBudgetProposalStatusEnum_UNKNOWN AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus = 1
+	// The proposal is pending approval.
+	AccountBudgetProposalStatusEnum_PENDING AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus = 2
+	// The proposal has been approved but the corresponding billing setup
+	// has not.  This can occur for proposals that set up the first budget
+	// when signing up for billing or when performing a change of bill-to
+	// operation.
+	AccountBudgetProposalStatusEnum_APPROVED_HELD AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus = 3
+	// The proposal has been approved.
+	AccountBudgetProposalStatusEnum_APPROVED AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus = 4
+	// The proposal has been cancelled by the user.
+	AccountBudgetProposalStatusEnum_CANCELLED AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus = 5
+	// The proposal has been rejected by the user, e.g. by rejecting an
+	// acceptance email.
+	AccountBudgetProposalStatusEnum_REJECTED AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus = 6
+)
+
+var AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PENDING",
+	3: "APPROVED_HELD",
+	4: "APPROVED",
+	5: "CANCELLED",
+	6: "REJECTED",
+}
+
+var AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"PENDING":       2,
+	"APPROVED_HELD": 3,
+	"APPROVED":      4,
+	"CANCELLED":     5,
+	"REJECTED":      6,
+}
+
+func (x AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus) String() string {
+	return proto.EnumName(AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus_name, int32(x))
+}
+
+func (AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0efe433c1cc6a5f9, []int{0, 0}
+}
+
+// Message describing AccountBudgetProposal statuses.
+type AccountBudgetProposalStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AccountBudgetProposalStatusEnum) Reset()         { *m = AccountBudgetProposalStatusEnum{} }
+func (m *AccountBudgetProposalStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*AccountBudgetProposalStatusEnum) ProtoMessage()    {}
+func (*AccountBudgetProposalStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0efe433c1cc6a5f9, []int{0}
+}
+
+func (m *AccountBudgetProposalStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccountBudgetProposalStatusEnum.Unmarshal(m, b)
+}
+func (m *AccountBudgetProposalStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccountBudgetProposalStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *AccountBudgetProposalStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccountBudgetProposalStatusEnum.Merge(m, src)
+}
+func (m *AccountBudgetProposalStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_AccountBudgetProposalStatusEnum.Size(m)
+}
+func (m *AccountBudgetProposalStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccountBudgetProposalStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccountBudgetProposalStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus", AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus_name, AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus_value)
+	proto.RegisterType((*AccountBudgetProposalStatusEnum)(nil), "google.ads.googleads.v3.enums.AccountBudgetProposalStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/account_budget_proposal_status.proto", fileDescriptor_0efe433c1cc6a5f9)
+}
+
+var fileDescriptor_0efe433c1cc6a5f9 = []byte{
+	// 356 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0x6e, 0xe2, 0x30,
+	0x10, 0xdd, 0x84, 0x5d, 0x76, 0xd7, 0x14, 0x35, 0xcd, 0xb1, 0x2d, 0x6a, 0xe1, 0x03, 0x9c, 0x43,
+	0x6e, 0xee, 0xc9, 0x49, 0x5c, 0x4a, 0x8b, 0x42, 0x04, 0x25, 0x95, 0xaa, 0x48, 0x91, 0x21, 0x91,
+	0x85, 0x04, 0x76, 0x84, 0x1d, 0x3e, 0xa1, 0x1f, 0xd2, 0x23, 0x9f, 0xd2, 0x4f, 0xe9, 0xbd, 0xf7,
+	0x2a, 0x0e, 0xe1, 0x56, 0x2e, 0xd6, 0xf3, 0xbc, 0x99, 0x79, 0x33, 0x6f, 0x80, 0xc7, 0x84, 0x60,
+	0xeb, 0xdc, 0xa1, 0x99, 0x74, 0x6a, 0x58, 0xa1, 0x9d, 0xeb, 0xe4, 0xbc, 0xdc, 0x48, 0x87, 0x2e,
+	0x97, 0xa2, 0xe4, 0x2a, 0x5d, 0x94, 0x19, 0xcb, 0x55, 0x5a, 0x6c, 0x45, 0x21, 0x24, 0x5d, 0xa7,
+	0x52, 0x51, 0x55, 0x4a, 0x58, 0x6c, 0x85, 0x12, 0x76, 0xaf, 0x2e, 0x84, 0x34, 0x93, 0xf0, 0xd8,
+	0x03, 0xee, 0x5c, 0xa8, 0x7b, 0x5c, 0x5e, 0x37, 0x12, 0xc5, 0xca, 0xa1, 0x9c, 0x0b, 0x45, 0xd5,
+	0x4a, 0xf0, 0x43, 0xf1, 0x60, 0x6f, 0x80, 0x1b, 0x5c, 0xab, 0x78, 0x5a, 0x24, 0x3a, 0x68, 0xcc,
+	0xb4, 0x04, 0xe1, 0xe5, 0x66, 0xf0, 0x66, 0x80, 0xab, 0x13, 0x39, 0xf6, 0x39, 0xe8, 0xcc, 0xc3,
+	0x59, 0x44, 0xfc, 0xd1, 0xfd, 0x88, 0x04, 0xd6, 0x2f, 0xbb, 0x03, 0xfe, 0xce, 0xc3, 0xa7, 0x70,
+	0xf2, 0x12, 0x5a, 0x46, 0xf5, 0x89, 0x48, 0x18, 0x8c, 0xc2, 0xa1, 0x65, 0xda, 0x17, 0xa0, 0x8b,
+	0xa3, 0x68, 0x3a, 0x89, 0x49, 0x90, 0x3e, 0x90, 0x71, 0x60, 0xb5, 0xec, 0x33, 0xf0, 0xaf, 0x09,
+	0x59, 0xbf, 0xed, 0x2e, 0xf8, 0xef, 0xe3, 0xd0, 0x27, 0xe3, 0x31, 0x09, 0xac, 0x3f, 0x15, 0x39,
+	0x25, 0x8f, 0xc4, 0x7f, 0x26, 0x81, 0xd5, 0xf6, 0xbe, 0x0c, 0xd0, 0x5f, 0x8a, 0x0d, 0x3c, 0xb9,
+	0xb0, 0x77, 0x7b, 0x62, 0xd6, 0xa8, 0x5a, 0x3a, 0x32, 0x5e, 0x0f, 0xbe, 0x43, 0x26, 0xd6, 0x94,
+	0x33, 0x28, 0xb6, 0xcc, 0x61, 0x39, 0xd7, 0x96, 0x34, 0x77, 0x28, 0x56, 0xf2, 0x87, 0xb3, 0xdc,
+	0xe9, 0xf7, 0xdd, 0x6c, 0x0d, 0x31, 0xde, 0x9b, 0xbd, 0x61, 0xdd, 0x0a, 0x67, 0x12, 0xd6, 0xb0,
+	0x42, 0xb1, 0x0b, 0x2b, 0xef, 0xe4, 0x47, 0xc3, 0x27, 0x38, 0x93, 0xc9, 0x91, 0x4f, 0x62, 0x37,
+	0xd1, 0xfc, 0xa7, 0xd9, 0xaf, 0x83, 0x08, 0xe1, 0x4c, 0x22, 0x74, 0xcc, 0x40, 0x28, 0x76, 0x11,
+	0xd2, 0x39, 0x8b, 0xb6, 0x1e, 0xcc, 0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x9c, 0x74, 0x91,
+	0x2e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/account_budget_proposal_type.pb.go b/googleapis/ads/googleads/v3/enums/account_budget_proposal_type.pb.go
new file mode 100644
index 0000000..7118a91
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/account_budget_proposal_type.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/account_budget_proposal_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible types of an AccountBudgetProposal.
+type AccountBudgetProposalTypeEnum_AccountBudgetProposalType int32
+
+const (
+	// Not specified.
+	AccountBudgetProposalTypeEnum_UNSPECIFIED AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 0
+	// Used for return value only. Represents value unknown in this version.
+	AccountBudgetProposalTypeEnum_UNKNOWN AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 1
+	// Identifies a request to create a new budget.
+	AccountBudgetProposalTypeEnum_CREATE AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 2
+	// Identifies a request to edit an existing budget.
+	AccountBudgetProposalTypeEnum_UPDATE AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 3
+	// Identifies a request to end a budget that has already started.
+	AccountBudgetProposalTypeEnum_END AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 4
+	// Identifies a request to remove a budget that hasn't started yet.
+	AccountBudgetProposalTypeEnum_REMOVE AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 5
+)
+
+var AccountBudgetProposalTypeEnum_AccountBudgetProposalType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CREATE",
+	3: "UPDATE",
+	4: "END",
+	5: "REMOVE",
+}
+
+var AccountBudgetProposalTypeEnum_AccountBudgetProposalType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CREATE":      2,
+	"UPDATE":      3,
+	"END":         4,
+	"REMOVE":      5,
+}
+
+func (x AccountBudgetProposalTypeEnum_AccountBudgetProposalType) String() string {
+	return proto.EnumName(AccountBudgetProposalTypeEnum_AccountBudgetProposalType_name, int32(x))
+}
+
+func (AccountBudgetProposalTypeEnum_AccountBudgetProposalType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_23d72264051de41b, []int{0, 0}
+}
+
+// Message describing AccountBudgetProposal types.
+type AccountBudgetProposalTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AccountBudgetProposalTypeEnum) Reset()         { *m = AccountBudgetProposalTypeEnum{} }
+func (m *AccountBudgetProposalTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AccountBudgetProposalTypeEnum) ProtoMessage()    {}
+func (*AccountBudgetProposalTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_23d72264051de41b, []int{0}
+}
+
+func (m *AccountBudgetProposalTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccountBudgetProposalTypeEnum.Unmarshal(m, b)
+}
+func (m *AccountBudgetProposalTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccountBudgetProposalTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AccountBudgetProposalTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccountBudgetProposalTypeEnum.Merge(m, src)
+}
+func (m *AccountBudgetProposalTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AccountBudgetProposalTypeEnum.Size(m)
+}
+func (m *AccountBudgetProposalTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccountBudgetProposalTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccountBudgetProposalTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType", AccountBudgetProposalTypeEnum_AccountBudgetProposalType_name, AccountBudgetProposalTypeEnum_AccountBudgetProposalType_value)
+	proto.RegisterType((*AccountBudgetProposalTypeEnum)(nil), "google.ads.googleads.v3.enums.AccountBudgetProposalTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/account_budget_proposal_type.proto", fileDescriptor_23d72264051de41b)
+}
+
+var fileDescriptor_23d72264051de41b = []byte{
+	// 334 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x6a, 0x3a, 0x31,
+	0x14, 0xc6, 0xff, 0x33, 0xfe, 0xab, 0x10, 0x17, 0x1d, 0x66, 0xd7, 0x52, 0x0b, 0x7a, 0x80, 0xcc,
+	0x62, 0x76, 0xe9, 0xa6, 0x19, 0x4d, 0x45, 0x4a, 0xc7, 0xc1, 0xea, 0x14, 0xca, 0x80, 0x44, 0x67,
+	0x1a, 0x04, 0x4d, 0x82, 0xc9, 0x08, 0x9e, 0xa0, 0xf7, 0xe8, 0xb2, 0x47, 0xe9, 0x51, 0xba, 0xed,
+	0x05, 0x4a, 0x12, 0x75, 0x67, 0x37, 0xe1, 0x47, 0xde, 0x7b, 0xdf, 0xf7, 0xde, 0x07, 0xee, 0x99,
+	0x10, 0x6c, 0x5d, 0x45, 0xb4, 0x54, 0x91, 0x43, 0x43, 0xbb, 0x38, 0xaa, 0x78, 0xbd, 0x51, 0x11,
+	0x5d, 0x2e, 0x45, 0xcd, 0xf5, 0x7c, 0x51, 0x97, 0xac, 0xd2, 0x73, 0xb9, 0x15, 0x52, 0x28, 0xba,
+	0x9e, 0xeb, 0xbd, 0xac, 0xa0, 0xdc, 0x0a, 0x2d, 0xc2, 0x8e, 0x1b, 0x83, 0xb4, 0x54, 0xf0, 0xa4,
+	0x00, 0x77, 0x31, 0xb4, 0x0a, 0xd7, 0x37, 0x47, 0x03, 0xb9, 0x8a, 0x28, 0xe7, 0x42, 0x53, 0xbd,
+	0x12, 0x5c, 0xb9, 0xe1, 0xde, 0xbb, 0x07, 0x3a, 0xd8, 0x79, 0x24, 0xd6, 0x22, 0x3b, 0x38, 0x4c,
+	0xf7, 0xb2, 0x22, 0xbc, 0xde, 0xf4, 0xde, 0xc0, 0xd5, 0xd9, 0x86, 0xf0, 0x12, 0xb4, 0x67, 0xe9,
+	0x73, 0x46, 0xfa, 0xa3, 0x87, 0x11, 0x19, 0x04, 0xff, 0xc2, 0x36, 0x68, 0xcd, 0xd2, 0xc7, 0x74,
+	0xfc, 0x92, 0x06, 0x5e, 0x08, 0x40, 0xb3, 0x3f, 0x21, 0x78, 0x4a, 0x02, 0xdf, 0xf0, 0x2c, 0x1b,
+	0x18, 0x6e, 0x84, 0x2d, 0xd0, 0x20, 0xe9, 0x20, 0xf8, 0x6f, 0x3e, 0x27, 0xe4, 0x69, 0x9c, 0x93,
+	0xe0, 0x22, 0xf9, 0xf1, 0x40, 0x77, 0x29, 0x36, 0xf0, 0xcf, 0x6b, 0x92, 0xdb, 0xb3, 0xbb, 0x64,
+	0xe6, 0x9e, 0xcc, 0x7b, 0x4d, 0x0e, 0x02, 0x4c, 0xac, 0x29, 0x67, 0x50, 0x6c, 0x59, 0xc4, 0x2a,
+	0x6e, 0xaf, 0x3d, 0x06, 0x2c, 0x57, 0xea, 0x4c, 0xde, 0x77, 0xf6, 0xfd, 0xf0, 0x1b, 0x43, 0x8c,
+	0x3f, 0xfd, 0xce, 0xd0, 0x49, 0xe1, 0x52, 0x41, 0x87, 0x86, 0xf2, 0x18, 0x9a, 0x60, 0xd4, 0xd7,
+	0xb1, 0x5e, 0xe0, 0x52, 0x15, 0xa7, 0x7a, 0x91, 0xc7, 0x85, 0xad, 0x7f, 0xfb, 0x5d, 0xf7, 0x89,
+	0x10, 0x2e, 0x15, 0x42, 0xa7, 0x0e, 0x84, 0xf2, 0x18, 0x21, 0xdb, 0xb3, 0x68, 0xda, 0xc5, 0xe2,
+	0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x56, 0xef, 0x9a, 0xc5, 0x07, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/account_budget_status.pb.go b/googleapis/ads/googleads/v3/enums/account_budget_status.pb.go
new file mode 100644
index 0000000..5b8b55d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/account_budget_status.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/account_budget_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible statuses of an AccountBudget.
+type AccountBudgetStatusEnum_AccountBudgetStatus int32
+
+const (
+	// Not specified.
+	AccountBudgetStatusEnum_UNSPECIFIED AccountBudgetStatusEnum_AccountBudgetStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	AccountBudgetStatusEnum_UNKNOWN AccountBudgetStatusEnum_AccountBudgetStatus = 1
+	// The account budget is pending approval.
+	AccountBudgetStatusEnum_PENDING AccountBudgetStatusEnum_AccountBudgetStatus = 2
+	// The account budget has been approved.
+	AccountBudgetStatusEnum_APPROVED AccountBudgetStatusEnum_AccountBudgetStatus = 3
+	// The account budget has been cancelled by the user.
+	AccountBudgetStatusEnum_CANCELLED AccountBudgetStatusEnum_AccountBudgetStatus = 4
+)
+
+var AccountBudgetStatusEnum_AccountBudgetStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PENDING",
+	3: "APPROVED",
+	4: "CANCELLED",
+}
+
+var AccountBudgetStatusEnum_AccountBudgetStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"PENDING":     2,
+	"APPROVED":    3,
+	"CANCELLED":   4,
+}
+
+func (x AccountBudgetStatusEnum_AccountBudgetStatus) String() string {
+	return proto.EnumName(AccountBudgetStatusEnum_AccountBudgetStatus_name, int32(x))
+}
+
+func (AccountBudgetStatusEnum_AccountBudgetStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7b869fdf507ee832, []int{0, 0}
+}
+
+// Message describing AccountBudget statuses.
+type AccountBudgetStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AccountBudgetStatusEnum) Reset()         { *m = AccountBudgetStatusEnum{} }
+func (m *AccountBudgetStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*AccountBudgetStatusEnum) ProtoMessage()    {}
+func (*AccountBudgetStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7b869fdf507ee832, []int{0}
+}
+
+func (m *AccountBudgetStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccountBudgetStatusEnum.Unmarshal(m, b)
+}
+func (m *AccountBudgetStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccountBudgetStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *AccountBudgetStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccountBudgetStatusEnum.Merge(m, src)
+}
+func (m *AccountBudgetStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_AccountBudgetStatusEnum.Size(m)
+}
+func (m *AccountBudgetStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccountBudgetStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccountBudgetStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AccountBudgetStatusEnum_AccountBudgetStatus", AccountBudgetStatusEnum_AccountBudgetStatus_name, AccountBudgetStatusEnum_AccountBudgetStatus_value)
+	proto.RegisterType((*AccountBudgetStatusEnum)(nil), "google.ads.googleads.v3.enums.AccountBudgetStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/account_budget_status.proto", fileDescriptor_7b869fdf507ee832)
+}
+
+var fileDescriptor_7b869fdf507ee832 = []byte{
+	// 320 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xfb, 0x30,
+	0x00, 0xfe, 0xad, 0xfb, 0xe1, 0x9f, 0x4c, 0xb1, 0xd4, 0x83, 0x22, 0xee, 0xb0, 0x3d, 0x40, 0x7a,
+	0xe8, 0xc9, 0x78, 0x4a, 0xd7, 0x38, 0x86, 0x23, 0x2b, 0x8e, 0x55, 0x90, 0xca, 0xc8, 0x96, 0x12,
+	0x06, 0x5b, 0x32, 0x96, 0x74, 0xf8, 0x3c, 0x1e, 0x7d, 0x14, 0x1f, 0x45, 0xf0, 0x1d, 0xa4, 0xc9,
+	0xd6, 0xd3, 0xf4, 0x12, 0xbe, 0xe4, 0xfb, 0xc3, 0x97, 0x0f, 0xdc, 0x09, 0xa5, 0xc4, 0xb2, 0x08,
+	0x19, 0xd7, 0xa1, 0x83, 0x15, 0xda, 0x46, 0x61, 0x21, 0xcb, 0x95, 0x0e, 0xd9, 0x7c, 0xae, 0x4a,
+	0x69, 0xa6, 0xb3, 0x92, 0x8b, 0xc2, 0x4c, 0xb5, 0x61, 0xa6, 0xd4, 0x70, 0xbd, 0x51, 0x46, 0x05,
+	0x6d, 0xa7, 0x87, 0x8c, 0x6b, 0x58, 0x5b, 0xe1, 0x36, 0x82, 0xd6, 0x7a, 0x73, 0xbb, 0x4f, 0x5e,
+	0x2f, 0x42, 0x26, 0xa5, 0x32, 0xcc, 0x2c, 0x94, 0xdc, 0x99, 0xbb, 0x6f, 0xe0, 0x0a, 0xbb, 0xec,
+	0xd8, 0x46, 0x8f, 0x6d, 0x32, 0x91, 0xe5, 0xaa, 0xfb, 0x0a, 0x2e, 0x0f, 0x50, 0xc1, 0x05, 0x68,
+	0x4d, 0xe8, 0x38, 0x25, 0xbd, 0xc1, 0xc3, 0x80, 0x24, 0xfe, 0xbf, 0xa0, 0x05, 0x8e, 0x27, 0xf4,
+	0x91, 0x8e, 0x9e, 0xa9, 0xdf, 0xa8, 0x2e, 0x29, 0xa1, 0xc9, 0x80, 0xf6, 0x7d, 0x2f, 0x38, 0x03,
+	0x27, 0x38, 0x4d, 0x9f, 0x46, 0x19, 0x49, 0xfc, 0x66, 0x70, 0x0e, 0x4e, 0x7b, 0x98, 0xf6, 0xc8,
+	0x70, 0x48, 0x12, 0xff, 0x7f, 0xfc, 0xdd, 0x00, 0x9d, 0xb9, 0x5a, 0xc1, 0x3f, 0xdb, 0xc7, 0xd7,
+	0x07, 0x2a, 0xa4, 0x55, 0xf3, 0xb4, 0xf1, 0x12, 0xef, 0xac, 0x42, 0x2d, 0x99, 0x14, 0x50, 0x6d,
+	0x44, 0x28, 0x0a, 0x69, 0xff, 0xb5, 0xdf, 0x70, 0xbd, 0xd0, 0xbf, 0x4c, 0x7a, 0x6f, 0xcf, 0x77,
+	0xaf, 0xd9, 0xc7, 0xf8, 0xc3, 0x6b, 0xf7, 0x5d, 0x14, 0xe6, 0x1a, 0x3a, 0x58, 0xa1, 0x2c, 0x82,
+	0xd5, 0x12, 0xfa, 0x73, 0xcf, 0xe7, 0x98, 0xeb, 0xbc, 0xe6, 0xf3, 0x2c, 0xca, 0x2d, 0xff, 0xe5,
+	0x75, 0xdc, 0x23, 0x42, 0x98, 0x6b, 0x84, 0x6a, 0x05, 0x42, 0x59, 0x84, 0x90, 0xd5, 0xcc, 0x8e,
+	0x6c, 0xb1, 0xe8, 0x27, 0x00, 0x00, 0xff, 0xff, 0x17, 0x24, 0xba, 0xc5, 0xea, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_customizer_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/ad_customizer_placeholder_field.pb.go
new file mode 100644
index 0000000..1d84546
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_customizer_placeholder_field.pb.go
@@ -0,0 +1,134 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_customizer_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Ad Customizers placeholder fields.
+type AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField int32
+
+const (
+	// Not specified.
+	AdCustomizerPlaceholderFieldEnum_UNSPECIFIED AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	AdCustomizerPlaceholderFieldEnum_UNKNOWN AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 1
+	// Data Type: INT64. Integer value to be inserted.
+	AdCustomizerPlaceholderFieldEnum_INTEGER AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 2
+	// Data Type: STRING. Price value to be inserted.
+	AdCustomizerPlaceholderFieldEnum_PRICE AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 3
+	// Data Type: DATE_TIME. Date value to be inserted.
+	AdCustomizerPlaceholderFieldEnum_DATE AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 4
+	// Data Type: STRING. String value to be inserted.
+	AdCustomizerPlaceholderFieldEnum_STRING AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 5
+)
+
+var AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INTEGER",
+	3: "PRICE",
+	4: "DATE",
+	5: "STRING",
+}
+
+var AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"INTEGER":     2,
+	"PRICE":       3,
+	"DATE":        4,
+	"STRING":      5,
+}
+
+func (x AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField) String() string {
+	return proto.EnumName(AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_name, int32(x))
+}
+
+func (AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_af5941c12bdd346d, []int{0, 0}
+}
+
+// Values for Ad Customizer placeholder fields.
+type AdCustomizerPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdCustomizerPlaceholderFieldEnum) Reset()         { *m = AdCustomizerPlaceholderFieldEnum{} }
+func (m *AdCustomizerPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*AdCustomizerPlaceholderFieldEnum) ProtoMessage()    {}
+func (*AdCustomizerPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_af5941c12bdd346d, []int{0}
+}
+
+func (m *AdCustomizerPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdCustomizerPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *AdCustomizerPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdCustomizerPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *AdCustomizerPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdCustomizerPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *AdCustomizerPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_AdCustomizerPlaceholderFieldEnum.Size(m)
+}
+func (m *AdCustomizerPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdCustomizerPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdCustomizerPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField", AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_name, AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_value)
+	proto.RegisterType((*AdCustomizerPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.AdCustomizerPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_customizer_placeholder_field.proto", fileDescriptor_af5941c12bdd346d)
+}
+
+var fileDescriptor_af5941c12bdd346d = []byte{
+	// 339 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0xf3, 0x30,
+	0x14, 0xfc, 0x92, 0xfe, 0x7c, 0xe0, 0x2e, 0x88, 0xb2, 0x44, 0xad, 0x44, 0x7b, 0x00, 0x67, 0x91,
+	0x9d, 0x59, 0xb9, 0xa9, 0x1b, 0x45, 0x48, 0x21, 0xea, 0x1f, 0x12, 0x8a, 0x54, 0x99, 0xda, 0x84,
+	0xa0, 0xc4, 0x8e, 0xe2, 0xb4, 0x0b, 0x0e, 0xc1, 0x21, 0x58, 0x72, 0x14, 0x8e, 0xc2, 0x01, 0x58,
+	0xa3, 0xc4, 0x34, 0xac, 0xe8, 0x26, 0x9a, 0xf8, 0xcd, 0x9b, 0x79, 0x33, 0xc0, 0x4b, 0xa4, 0x4c,
+	0x32, 0xee, 0x50, 0xa6, 0x1c, 0x0d, 0x6b, 0x74, 0x70, 0x1d, 0x2e, 0xf6, 0xb9, 0x72, 0x28, 0xdb,
+	0xee, 0xf6, 0xaa, 0x92, 0x79, 0xfa, 0xc2, 0xcb, 0x6d, 0x91, 0xd1, 0x1d, 0x7f, 0x92, 0x19, 0xe3,
+	0xe5, 0xf6, 0x31, 0xe5, 0x19, 0x83, 0x45, 0x29, 0x2b, 0x69, 0x8f, 0xf4, 0x26, 0xa4, 0x4c, 0xc1,
+	0x56, 0x04, 0x1e, 0x5c, 0xd8, 0x88, 0x5c, 0x0e, 0x8f, 0x1e, 0x45, 0xea, 0x50, 0x21, 0x64, 0x45,
+	0xab, 0x54, 0x0a, 0xa5, 0x97, 0x27, 0xaf, 0x06, 0xb8, 0xc2, 0xcc, 0x6b, 0x5d, 0xa2, 0x5f, 0x93,
+	0x79, 0xed, 0x41, 0xc4, 0x3e, 0x9f, 0x3c, 0x83, 0xe1, 0x29, 0x8e, 0x7d, 0x01, 0x06, 0xeb, 0x70,
+	0x19, 0x11, 0x2f, 0x98, 0x07, 0x64, 0x66, 0xfd, 0xb3, 0x07, 0xe0, 0xff, 0x3a, 0xbc, 0x09, 0x6f,
+	0xef, 0x42, 0xcb, 0xa8, 0x7f, 0x82, 0x70, 0x45, 0x7c, 0xb2, 0xb0, 0x4c, 0xfb, 0x1c, 0xf4, 0xa2,
+	0x45, 0xe0, 0x11, 0xab, 0x63, 0x9f, 0x81, 0xee, 0x0c, 0xaf, 0x88, 0xd5, 0xb5, 0x01, 0xe8, 0x2f,
+	0x57, 0x8b, 0x20, 0xf4, 0xad, 0xde, 0xf4, 0xcb, 0x00, 0xe3, 0x9d, 0xcc, 0xe1, 0xc9, 0x50, 0xd3,
+	0xf1, 0xa9, 0x7b, 0xa2, 0x3a, 0x59, 0x64, 0xdc, 0x4f, 0x7f, 0x34, 0x12, 0x99, 0x51, 0x91, 0x40,
+	0x59, 0x26, 0x4e, 0xc2, 0x45, 0x93, 0xfb, 0xd8, 0x76, 0x91, 0xaa, 0x3f, 0xca, 0xbf, 0x6e, 0xbe,
+	0x6f, 0x66, 0xc7, 0xc7, 0xf8, 0xdd, 0x1c, 0xf9, 0x5a, 0x0a, 0x33, 0x05, 0x35, 0xac, 0xd1, 0xc6,
+	0x85, 0x75, 0x3f, 0xea, 0xe3, 0x38, 0x8f, 0x31, 0x53, 0x71, 0x3b, 0x8f, 0x37, 0x6e, 0xdc, 0xcc,
+	0x3f, 0xcd, 0xb1, 0x7e, 0x44, 0x08, 0x33, 0x85, 0x50, 0xcb, 0x40, 0x68, 0xe3, 0x22, 0xd4, 0x70,
+	0x1e, 0xfa, 0xcd, 0x61, 0xee, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x68, 0x85, 0xbb, 0x81, 0x14,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_group_ad_rotation_mode.pb.go b/googleapis/ads/googleads/v3/enums/ad_group_ad_rotation_mode.pb.go
new file mode 100644
index 0000000..aa6ef6d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_group_ad_rotation_mode.pb.go
@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_group_ad_rotation_mode.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible ad rotation modes of an ad group.
+type AdGroupAdRotationModeEnum_AdGroupAdRotationMode int32
+
+const (
+	// The ad rotation mode has not been specified.
+	AdGroupAdRotationModeEnum_UNSPECIFIED AdGroupAdRotationModeEnum_AdGroupAdRotationMode = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	AdGroupAdRotationModeEnum_UNKNOWN AdGroupAdRotationModeEnum_AdGroupAdRotationMode = 1
+	// Optimize ad group ads based on clicks or conversions.
+	AdGroupAdRotationModeEnum_OPTIMIZE AdGroupAdRotationModeEnum_AdGroupAdRotationMode = 2
+	// Rotate evenly forever.
+	AdGroupAdRotationModeEnum_ROTATE_FOREVER AdGroupAdRotationModeEnum_AdGroupAdRotationMode = 3
+)
+
+var AdGroupAdRotationModeEnum_AdGroupAdRotationMode_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "OPTIMIZE",
+	3: "ROTATE_FOREVER",
+}
+
+var AdGroupAdRotationModeEnum_AdGroupAdRotationMode_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"OPTIMIZE":       2,
+	"ROTATE_FOREVER": 3,
+}
+
+func (x AdGroupAdRotationModeEnum_AdGroupAdRotationMode) String() string {
+	return proto.EnumName(AdGroupAdRotationModeEnum_AdGroupAdRotationMode_name, int32(x))
+}
+
+func (AdGroupAdRotationModeEnum_AdGroupAdRotationMode) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2286469973ba5e1d, []int{0, 0}
+}
+
+// Container for enum describing possible ad rotation modes of ads within an
+// ad group.
+type AdGroupAdRotationModeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupAdRotationModeEnum) Reset()         { *m = AdGroupAdRotationModeEnum{} }
+func (m *AdGroupAdRotationModeEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAdRotationModeEnum) ProtoMessage()    {}
+func (*AdGroupAdRotationModeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2286469973ba5e1d, []int{0}
+}
+
+func (m *AdGroupAdRotationModeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAdRotationModeEnum.Unmarshal(m, b)
+}
+func (m *AdGroupAdRotationModeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAdRotationModeEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAdRotationModeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAdRotationModeEnum.Merge(m, src)
+}
+func (m *AdGroupAdRotationModeEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAdRotationModeEnum.Size(m)
+}
+func (m *AdGroupAdRotationModeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAdRotationModeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAdRotationModeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdGroupAdRotationModeEnum_AdGroupAdRotationMode", AdGroupAdRotationModeEnum_AdGroupAdRotationMode_name, AdGroupAdRotationModeEnum_AdGroupAdRotationMode_value)
+	proto.RegisterType((*AdGroupAdRotationModeEnum)(nil), "google.ads.googleads.v3.enums.AdGroupAdRotationModeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_group_ad_rotation_mode.proto", fileDescriptor_2286469973ba5e1d)
+}
+
+var fileDescriptor_2286469973ba5e1d = []byte{
+	// 319 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0x5d, 0x07, 0x2a, 0x99, 0x68, 0x29, 0x78, 0x70, 0xb8, 0xc3, 0xf6, 0x00, 0xe9, 0xa1,
+	0xb7, 0x88, 0x87, 0x4c, 0xb3, 0x51, 0x64, 0x6d, 0xa9, 0x5b, 0x07, 0xa3, 0x50, 0xa2, 0x29, 0x61,
+	0xb0, 0xe6, 0x5f, 0x9a, 0x6e, 0x0f, 0xe4, 0xd1, 0x47, 0xf1, 0x51, 0xbc, 0xf8, 0x0a, 0xd2, 0x66,
+	0xdb, 0x69, 0x7a, 0x09, 0x1f, 0xf9, 0xfe, 0xbf, 0x2f, 0xff, 0x7c, 0xe8, 0x51, 0x02, 0xc8, 0x4d,
+	0xee, 0x72, 0xa1, 0x5d, 0x23, 0x1b, 0xb5, 0xf3, 0xdc, 0x5c, 0x6d, 0x0b, 0xed, 0x72, 0x91, 0xc9,
+	0x0a, 0xb6, 0x65, 0xc6, 0x45, 0x56, 0x41, 0xcd, 0xeb, 0x35, 0xa8, 0xac, 0x00, 0x91, 0xe3, 0xb2,
+	0x82, 0x1a, 0x9c, 0x81, 0x61, 0x30, 0x17, 0x1a, 0x1f, 0x71, 0xbc, 0xf3, 0x70, 0x8b, 0xf7, 0xef,
+	0x0f, 0xe9, 0xe5, 0xda, 0xe5, 0x4a, 0xed, 0x03, 0xb4, 0x81, 0x47, 0x35, 0xba, 0xa3, 0x62, 0xda,
+	0xc4, 0x53, 0x11, 0xef, 0xbd, 0x19, 0x88, 0x9c, 0xa9, 0x6d, 0x31, 0x5a, 0xa2, 0xdb, 0x93, 0xa6,
+	0x73, 0x83, 0x7a, 0x8b, 0xe0, 0x35, 0x62, 0x4f, 0xfe, 0xc4, 0x67, 0xcf, 0xf6, 0x99, 0xd3, 0x43,
+	0x17, 0x8b, 0xe0, 0x25, 0x08, 0x97, 0x81, 0xdd, 0x71, 0xae, 0xd0, 0x65, 0x18, 0xcd, 0xfd, 0x99,
+	0xbf, 0x62, 0xb6, 0xe5, 0x38, 0xe8, 0x3a, 0x0e, 0xe7, 0x74, 0xce, 0xb2, 0x49, 0x18, 0xb3, 0x84,
+	0xc5, 0x76, 0x77, 0xfc, 0xd3, 0x41, 0xc3, 0x77, 0x28, 0xf0, 0xbf, 0x9b, 0x8f, 0xfb, 0x27, 0x1f,
+	0x8f, 0x9a, 0xbd, 0xa3, 0xce, 0x6a, 0xbc, 0x87, 0x25, 0x6c, 0xb8, 0x92, 0x18, 0x2a, 0xe9, 0xca,
+	0x5c, 0xb5, 0xbf, 0x3a, 0xb4, 0x58, 0xae, 0xf5, 0x1f, 0xa5, 0x3e, 0xb4, 0xe7, 0x87, 0xd5, 0x9d,
+	0x52, 0xfa, 0x69, 0x0d, 0xa6, 0x26, 0x8a, 0x0a, 0x8d, 0x8d, 0x6c, 0x54, 0xe2, 0xe1, 0xa6, 0x05,
+	0xfd, 0x75, 0xf0, 0x53, 0x2a, 0x74, 0x7a, 0xf4, 0xd3, 0xc4, 0x4b, 0x5b, 0xff, 0xdb, 0x1a, 0x9a,
+	0x4b, 0x42, 0xa8, 0xd0, 0x84, 0x1c, 0x27, 0x08, 0x49, 0x3c, 0x42, 0xda, 0x99, 0xb7, 0xf3, 0x76,
+	0x31, 0xef, 0x37, 0x00, 0x00, 0xff, 0xff, 0xa1, 0x79, 0x2f, 0xf6, 0xec, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_group_ad_status.pb.go b/googleapis/ads/googleads/v3/enums/ad_group_ad_status.pb.go
new file mode 100644
index 0000000..8b25754
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_group_ad_status.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_group_ad_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible statuses of an AdGroupAd.
+type AdGroupAdStatusEnum_AdGroupAdStatus int32
+
+const (
+	// No value has been specified.
+	AdGroupAdStatusEnum_UNSPECIFIED AdGroupAdStatusEnum_AdGroupAdStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	AdGroupAdStatusEnum_UNKNOWN AdGroupAdStatusEnum_AdGroupAdStatus = 1
+	// The ad group ad is enabled.
+	AdGroupAdStatusEnum_ENABLED AdGroupAdStatusEnum_AdGroupAdStatus = 2
+	// The ad group ad is paused.
+	AdGroupAdStatusEnum_PAUSED AdGroupAdStatusEnum_AdGroupAdStatus = 3
+	// The ad group ad is removed.
+	AdGroupAdStatusEnum_REMOVED AdGroupAdStatusEnum_AdGroupAdStatus = 4
+)
+
+var AdGroupAdStatusEnum_AdGroupAdStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "PAUSED",
+	4: "REMOVED",
+}
+
+var AdGroupAdStatusEnum_AdGroupAdStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"PAUSED":      3,
+	"REMOVED":     4,
+}
+
+func (x AdGroupAdStatusEnum_AdGroupAdStatus) String() string {
+	return proto.EnumName(AdGroupAdStatusEnum_AdGroupAdStatus_name, int32(x))
+}
+
+func (AdGroupAdStatusEnum_AdGroupAdStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_469b781fb0018c61, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of an AdGroupAd.
+type AdGroupAdStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupAdStatusEnum) Reset()         { *m = AdGroupAdStatusEnum{} }
+func (m *AdGroupAdStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAdStatusEnum) ProtoMessage()    {}
+func (*AdGroupAdStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_469b781fb0018c61, []int{0}
+}
+
+func (m *AdGroupAdStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAdStatusEnum.Unmarshal(m, b)
+}
+func (m *AdGroupAdStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAdStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAdStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAdStatusEnum.Merge(m, src)
+}
+func (m *AdGroupAdStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAdStatusEnum.Size(m)
+}
+func (m *AdGroupAdStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAdStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAdStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdGroupAdStatusEnum_AdGroupAdStatus", AdGroupAdStatusEnum_AdGroupAdStatus_name, AdGroupAdStatusEnum_AdGroupAdStatus_value)
+	proto.RegisterType((*AdGroupAdStatusEnum)(nil), "google.ads.googleads.v3.enums.AdGroupAdStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_group_ad_status.proto", fileDescriptor_469b781fb0018c61)
+}
+
+var fileDescriptor_469b781fb0018c61 = []byte{
+	// 312 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4b, 0xfb, 0x30,
+	0x18, 0xfe, 0xad, 0xfb, 0x31, 0x21, 0x3b, 0xac, 0x54, 0x4f, 0xe2, 0x0e, 0xdb, 0x07, 0x48, 0x0e,
+	0x01, 0x0f, 0xf1, 0x94, 0xda, 0x38, 0x86, 0xda, 0x15, 0x47, 0x2b, 0x48, 0x61, 0x44, 0x33, 0xc2,
+	0x60, 0x4d, 0x4a, 0xd3, 0xee, 0x03, 0x79, 0xf4, 0xa3, 0xf8, 0x4d, 0xf4, 0x53, 0x48, 0xd2, 0xb5,
+	0x87, 0x81, 0x5e, 0xca, 0xd3, 0xf7, 0xf9, 0x93, 0xe7, 0x7d, 0xc1, 0xb5, 0xd4, 0x5a, 0xee, 0xb7,
+	0x88, 0x0b, 0x83, 0x5a, 0x68, 0xd1, 0x01, 0xa3, 0xad, 0x6a, 0x0a, 0x83, 0xb8, 0xd8, 0xc8, 0x4a,
+	0x37, 0xe5, 0x86, 0x8b, 0x8d, 0xa9, 0x79, 0xdd, 0x18, 0x58, 0x56, 0xba, 0xd6, 0xc1, 0xb4, 0x15,
+	0x43, 0x2e, 0x0c, 0xec, 0x7d, 0xf0, 0x80, 0xa1, 0xf3, 0x5d, 0x5e, 0x75, 0xb1, 0xe5, 0x0e, 0x71,
+	0xa5, 0x74, 0xcd, 0xeb, 0x9d, 0x56, 0x47, 0xf3, 0x7c, 0x0f, 0xce, 0xa9, 0x58, 0xd8, 0x5c, 0x2a,
+	0xd6, 0x2e, 0x95, 0xa9, 0xa6, 0x98, 0xa7, 0x60, 0x72, 0x32, 0x0e, 0x26, 0x60, 0x9c, 0xc6, 0xeb,
+	0x84, 0xdd, 0x2e, 0xef, 0x96, 0x2c, 0xf2, 0xff, 0x05, 0x63, 0x70, 0x96, 0xc6, 0xf7, 0xf1, 0xea,
+	0x39, 0xf6, 0x07, 0xf6, 0x87, 0xc5, 0x34, 0x7c, 0x60, 0x91, 0xef, 0x05, 0x00, 0x8c, 0x12, 0x9a,
+	0xae, 0x59, 0xe4, 0x0f, 0x2d, 0xf1, 0xc4, 0x1e, 0x57, 0x19, 0x8b, 0xfc, 0xff, 0xe1, 0xd7, 0x00,
+	0xcc, 0xde, 0x74, 0x01, 0xff, 0x6c, 0x1c, 0x5e, 0x9c, 0x3c, 0x9d, 0xd8, 0xa6, 0xc9, 0xe0, 0x25,
+	0x3c, 0xda, 0xa4, 0xde, 0x73, 0x25, 0xa1, 0xae, 0x24, 0x92, 0x5b, 0xe5, 0xf6, 0xe8, 0x0e, 0x56,
+	0xee, 0xcc, 0x2f, 0xf7, 0xbb, 0x71, 0xdf, 0x77, 0x6f, 0xb8, 0xa0, 0xf4, 0xc3, 0x9b, 0x2e, 0xda,
+	0x28, 0x2a, 0x0c, 0x6c, 0xa1, 0x45, 0x19, 0x86, 0x76, 0x7b, 0xf3, 0xd9, 0xf1, 0x39, 0x15, 0x26,
+	0xef, 0xf9, 0x3c, 0xc3, 0xb9, 0xe3, 0xbf, 0xbd, 0x59, 0x3b, 0x24, 0x84, 0x0a, 0x43, 0x48, 0xaf,
+	0x20, 0x24, 0xc3, 0x84, 0x38, 0xcd, 0xeb, 0xc8, 0x15, 0xc3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0x9e, 0xcd, 0x77, 0xa8, 0xd7, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_group_criterion_approval_status.pb.go b/googleapis/ads/googleads/v3/enums/ad_group_criterion_approval_status.pb.go
new file mode 100644
index 0000000..c20e343
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_group_criterion_approval_status.pb.go
@@ -0,0 +1,134 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_group_criterion_approval_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates AdGroupCriterion approval statuses.
+type AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus int32
+
+const (
+	// Not specified.
+	AdGroupCriterionApprovalStatusEnum_UNSPECIFIED AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 0
+	// The value is unknown in this version.
+	AdGroupCriterionApprovalStatusEnum_UNKNOWN AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 1
+	// Approved.
+	AdGroupCriterionApprovalStatusEnum_APPROVED AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 2
+	// Disapproved.
+	AdGroupCriterionApprovalStatusEnum_DISAPPROVED AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 3
+	// Pending Review.
+	AdGroupCriterionApprovalStatusEnum_PENDING_REVIEW AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 4
+	// Under review.
+	AdGroupCriterionApprovalStatusEnum_UNDER_REVIEW AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 5
+)
+
+var AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "APPROVED",
+	3: "DISAPPROVED",
+	4: "PENDING_REVIEW",
+	5: "UNDER_REVIEW",
+}
+
+var AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"APPROVED":       2,
+	"DISAPPROVED":    3,
+	"PENDING_REVIEW": 4,
+	"UNDER_REVIEW":   5,
+}
+
+func (x AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus) String() string {
+	return proto.EnumName(AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus_name, int32(x))
+}
+
+func (AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2a16f79d7ca5aed0, []int{0, 0}
+}
+
+// Container for enum describing possible AdGroupCriterion approval statuses.
+type AdGroupCriterionApprovalStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupCriterionApprovalStatusEnum) Reset()         { *m = AdGroupCriterionApprovalStatusEnum{} }
+func (m *AdGroupCriterionApprovalStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterionApprovalStatusEnum) ProtoMessage()    {}
+func (*AdGroupCriterionApprovalStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2a16f79d7ca5aed0, []int{0}
+}
+
+func (m *AdGroupCriterionApprovalStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterionApprovalStatusEnum.Unmarshal(m, b)
+}
+func (m *AdGroupCriterionApprovalStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterionApprovalStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterionApprovalStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterionApprovalStatusEnum.Merge(m, src)
+}
+func (m *AdGroupCriterionApprovalStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterionApprovalStatusEnum.Size(m)
+}
+func (m *AdGroupCriterionApprovalStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterionApprovalStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterionApprovalStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus", AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus_name, AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus_value)
+	proto.RegisterType((*AdGroupCriterionApprovalStatusEnum)(nil), "google.ads.googleads.v3.enums.AdGroupCriterionApprovalStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_group_criterion_approval_status.proto", fileDescriptor_2a16f79d7ca5aed0)
+}
+
+var fileDescriptor_2a16f79d7ca5aed0 = []byte{
+	// 348 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xcb, 0x6a, 0xb3, 0x40,
+	0x18, 0xfd, 0x35, 0x7f, 0x2f, 0x4c, 0x42, 0x2b, 0x2e, 0x4b, 0x53, 0x48, 0xba, 0x1f, 0x17, 0xee,
+	0xa6, 0xab, 0x49, 0x9c, 0x88, 0x14, 0x8c, 0x24, 0xc4, 0x40, 0x11, 0x64, 0x9a, 0x91, 0x41, 0x48,
+	0x66, 0xc4, 0xd1, 0xbc, 0x40, 0xdf, 0xa4, 0xcb, 0x3c, 0x4a, 0x1f, 0xa5, 0x4f, 0xd0, 0x65, 0x71,
+	0x8c, 0xee, 0x9a, 0xcd, 0x70, 0xf8, 0xce, 0x99, 0x73, 0xbe, 0x0b, 0x58, 0x70, 0x29, 0xf9, 0x3e,
+	0x73, 0x28, 0x53, 0x4e, 0x0b, 0x1b, 0x74, 0x74, 0x9d, 0x4c, 0xd4, 0x07, 0xe5, 0x50, 0x96, 0xf2,
+	0x52, 0xd6, 0x45, 0xba, 0x2b, 0xf3, 0x2a, 0x2b, 0x73, 0x29, 0x52, 0x5a, 0x14, 0xa5, 0x3c, 0xd2,
+	0x7d, 0xaa, 0x2a, 0x5a, 0xd5, 0x0a, 0x16, 0xa5, 0xac, 0xa4, 0x3d, 0x6e, 0x3f, 0x43, 0xca, 0x14,
+	0xec, 0x7d, 0xe0, 0xd1, 0x85, 0xda, 0xe7, 0xe1, 0xb1, 0x8b, 0x29, 0x72, 0x87, 0x0a, 0x21, 0x2b,
+	0x5a, 0xe5, 0x52, 0x9c, 0x3f, 0x4f, 0x4f, 0x06, 0x98, 0x62, 0xe6, 0x37, 0x41, 0xf3, 0x2e, 0x07,
+	0x9f, 0x63, 0xd6, 0x3a, 0x85, 0x88, 0xfa, 0x30, 0xfd, 0x30, 0xc0, 0xd3, 0x65, 0x99, 0x7d, 0x0f,
+	0x86, 0x9b, 0x70, 0x1d, 0x91, 0x79, 0xb0, 0x08, 0x88, 0x67, 0xfd, 0xb3, 0x87, 0xe0, 0x66, 0x13,
+	0xbe, 0x86, 0xcb, 0x6d, 0x68, 0x19, 0xf6, 0x08, 0xdc, 0xe2, 0x28, 0x5a, 0x2d, 0x63, 0xe2, 0x59,
+	0x66, 0xa3, 0xf5, 0x82, 0x75, 0x5f, 0x18, 0xd8, 0x36, 0xb8, 0x8b, 0x48, 0xe8, 0x05, 0xa1, 0x9f,
+	0xae, 0x48, 0x1c, 0x90, 0xad, 0xf5, 0xdf, 0xb6, 0xc0, 0x68, 0x13, 0x7a, 0x64, 0xd5, 0x55, 0xae,
+	0x66, 0x3f, 0x06, 0x98, 0xec, 0xe4, 0x01, 0x5e, 0x1c, 0x78, 0xf6, 0x7c, 0xb9, 0xd1, 0xa8, 0x99,
+	0x3b, 0x32, 0xde, 0x66, 0x67, 0x17, 0x2e, 0xf7, 0x54, 0x70, 0x28, 0x4b, 0xee, 0xf0, 0x4c, 0xe8,
+	0xad, 0x74, 0xe7, 0x28, 0x72, 0xf5, 0xc7, 0x75, 0x5e, 0xf4, 0xfb, 0x69, 0x0e, 0x7c, 0x8c, 0x4f,
+	0xe6, 0xd8, 0x6f, 0xad, 0x30, 0x53, 0xb0, 0x85, 0x0d, 0x8a, 0x5d, 0xd8, 0xec, 0x4e, 0x7d, 0x75,
+	0x7c, 0x82, 0x99, 0x4a, 0x7a, 0x3e, 0x89, 0xdd, 0x44, 0xf3, 0xdf, 0xe6, 0xa4, 0x2d, 0x22, 0x84,
+	0x99, 0x42, 0xa8, 0x57, 0x20, 0x14, 0xbb, 0x08, 0x69, 0xcd, 0xfb, 0xb5, 0x6e, 0xcc, 0xfd, 0x0d,
+	0x00, 0x00, 0xff, 0xff, 0x21, 0x40, 0xe3, 0x45, 0x35, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_group_criterion_status.pb.go b/googleapis/ads/googleads/v3/enums/ad_group_criterion_status.pb.go
new file mode 100644
index 0000000..7f8f1c0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_group_criterion_status.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_group_criterion_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible statuses of an AdGroupCriterion.
+type AdGroupCriterionStatusEnum_AdGroupCriterionStatus int32
+
+const (
+	// No value has been specified.
+	AdGroupCriterionStatusEnum_UNSPECIFIED AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	AdGroupCriterionStatusEnum_UNKNOWN AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 1
+	// The ad group criterion is enabled.
+	AdGroupCriterionStatusEnum_ENABLED AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 2
+	// The ad group criterion is paused.
+	AdGroupCriterionStatusEnum_PAUSED AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 3
+	// The ad group criterion is removed.
+	AdGroupCriterionStatusEnum_REMOVED AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 4
+)
+
+var AdGroupCriterionStatusEnum_AdGroupCriterionStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "PAUSED",
+	4: "REMOVED",
+}
+
+var AdGroupCriterionStatusEnum_AdGroupCriterionStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"PAUSED":      3,
+	"REMOVED":     4,
+}
+
+func (x AdGroupCriterionStatusEnum_AdGroupCriterionStatus) String() string {
+	return proto.EnumName(AdGroupCriterionStatusEnum_AdGroupCriterionStatus_name, int32(x))
+}
+
+func (AdGroupCriterionStatusEnum_AdGroupCriterionStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_319f05083d11848f, []int{0, 0}
+}
+
+// Message describing AdGroupCriterion statuses.
+type AdGroupCriterionStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupCriterionStatusEnum) Reset()         { *m = AdGroupCriterionStatusEnum{} }
+func (m *AdGroupCriterionStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterionStatusEnum) ProtoMessage()    {}
+func (*AdGroupCriterionStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_319f05083d11848f, []int{0}
+}
+
+func (m *AdGroupCriterionStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterionStatusEnum.Unmarshal(m, b)
+}
+func (m *AdGroupCriterionStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterionStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterionStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterionStatusEnum.Merge(m, src)
+}
+func (m *AdGroupCriterionStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterionStatusEnum.Size(m)
+}
+func (m *AdGroupCriterionStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterionStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterionStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdGroupCriterionStatusEnum_AdGroupCriterionStatus", AdGroupCriterionStatusEnum_AdGroupCriterionStatus_name, AdGroupCriterionStatusEnum_AdGroupCriterionStatus_value)
+	proto.RegisterType((*AdGroupCriterionStatusEnum)(nil), "google.ads.googleads.v3.enums.AdGroupCriterionStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_group_criterion_status.proto", fileDescriptor_319f05083d11848f)
+}
+
+var fileDescriptor_319f05083d11848f = []byte{
+	// 320 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x31, 0x4e, 0xc3, 0x30,
+	0x18, 0x85, 0x69, 0x8a, 0x8a, 0xe4, 0x0e, 0x44, 0x19, 0x18, 0x0a, 0x1d, 0xda, 0x03, 0x38, 0x43,
+	0x36, 0x23, 0x06, 0xa7, 0x31, 0x55, 0x05, 0xa4, 0x11, 0x55, 0x83, 0x84, 0x22, 0x55, 0xa6, 0x8e,
+	0xac, 0x48, 0xad, 0x1d, 0xc5, 0x4e, 0x07, 0x8e, 0xc3, 0xc8, 0x51, 0x38, 0x0a, 0x13, 0x47, 0x40,
+	0x76, 0x9a, 0x4c, 0x85, 0xc5, 0x7a, 0xf6, 0xfb, 0xdf, 0xa7, 0xe7, 0x1f, 0xdc, 0x71, 0x29, 0xf9,
+	0x2e, 0xf7, 0x29, 0x53, 0x7e, 0x23, 0x8d, 0x3a, 0x04, 0x7e, 0x2e, 0xea, 0xbd, 0xf2, 0x29, 0xdb,
+	0xf0, 0x4a, 0xd6, 0xe5, 0x66, 0x5b, 0x15, 0x3a, 0xaf, 0x0a, 0x29, 0x36, 0x4a, 0x53, 0x5d, 0x2b,
+	0x58, 0x56, 0x52, 0x4b, 0x6f, 0xdc, 0x64, 0x20, 0x65, 0x0a, 0x76, 0x71, 0x78, 0x08, 0xa0, 0x8d,
+	0x8f, 0x6e, 0x5a, 0x7a, 0x59, 0xf8, 0x54, 0x08, 0xa9, 0xa9, 0x2e, 0xa4, 0x38, 0x86, 0xa7, 0xef,
+	0x60, 0x84, 0xd9, 0xdc, 0xe0, 0x67, 0x2d, 0x7d, 0x65, 0xe1, 0x44, 0xd4, 0xfb, 0x69, 0x06, 0xae,
+	0x4e, 0xbb, 0xde, 0x25, 0x18, 0xae, 0xe3, 0x55, 0x42, 0x66, 0x8b, 0xfb, 0x05, 0x89, 0xdc, 0x33,
+	0x6f, 0x08, 0x2e, 0xd6, 0xf1, 0x43, 0xbc, 0x7c, 0x89, 0xdd, 0x9e, 0xb9, 0x90, 0x18, 0x87, 0x8f,
+	0x24, 0x72, 0x1d, 0x0f, 0x80, 0x41, 0x82, 0xd7, 0x2b, 0x12, 0xb9, 0x7d, 0x63, 0x3c, 0x93, 0xa7,
+	0x65, 0x4a, 0x22, 0xf7, 0x3c, 0xfc, 0xe9, 0x81, 0xc9, 0x56, 0xee, 0xe1, 0xbf, 0xfd, 0xc3, 0xeb,
+	0xd3, 0x0d, 0x12, 0x53, 0x3f, 0xe9, 0xbd, 0x86, 0xc7, 0x34, 0x97, 0x3b, 0x2a, 0x38, 0x94, 0x15,
+	0xf7, 0x79, 0x2e, 0xec, 0xe7, 0xda, 0x65, 0x96, 0x85, 0xfa, 0x63, 0xb7, 0xb7, 0xf6, 0xfc, 0x70,
+	0xfa, 0x73, 0x8c, 0x3f, 0x9d, 0xf1, 0xbc, 0x41, 0x61, 0xa6, 0x60, 0x23, 0x8d, 0x4a, 0x03, 0x68,
+	0x76, 0xa1, 0xbe, 0x5a, 0x3f, 0xc3, 0x4c, 0x65, 0x9d, 0x9f, 0xa5, 0x41, 0x66, 0xfd, 0x6f, 0x67,
+	0xd2, 0x3c, 0x22, 0x84, 0x99, 0x42, 0xa8, 0x9b, 0x40, 0x28, 0x0d, 0x10, 0xb2, 0x33, 0x6f, 0x03,
+	0x5b, 0x2c, 0xf8, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x0e, 0xf9, 0x4a, 0xf3, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_group_status.pb.go b/googleapis/ads/googleads/v3/enums/ad_group_status.pb.go
new file mode 100644
index 0000000..10dc7bb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_group_status.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_group_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible statuses of an ad group.
+type AdGroupStatusEnum_AdGroupStatus int32
+
+const (
+	// The status has not been specified.
+	AdGroupStatusEnum_UNSPECIFIED AdGroupStatusEnum_AdGroupStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	AdGroupStatusEnum_UNKNOWN AdGroupStatusEnum_AdGroupStatus = 1
+	// The ad group is enabled.
+	AdGroupStatusEnum_ENABLED AdGroupStatusEnum_AdGroupStatus = 2
+	// The ad group is paused.
+	AdGroupStatusEnum_PAUSED AdGroupStatusEnum_AdGroupStatus = 3
+	// The ad group is removed.
+	AdGroupStatusEnum_REMOVED AdGroupStatusEnum_AdGroupStatus = 4
+)
+
+var AdGroupStatusEnum_AdGroupStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "PAUSED",
+	4: "REMOVED",
+}
+
+var AdGroupStatusEnum_AdGroupStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"PAUSED":      3,
+	"REMOVED":     4,
+}
+
+func (x AdGroupStatusEnum_AdGroupStatus) String() string {
+	return proto.EnumName(AdGroupStatusEnum_AdGroupStatus_name, int32(x))
+}
+
+func (AdGroupStatusEnum_AdGroupStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ec520dd54d7ad64c, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of an ad group.
+type AdGroupStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupStatusEnum) Reset()         { *m = AdGroupStatusEnum{} }
+func (m *AdGroupStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupStatusEnum) ProtoMessage()    {}
+func (*AdGroupStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ec520dd54d7ad64c, []int{0}
+}
+
+func (m *AdGroupStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupStatusEnum.Unmarshal(m, b)
+}
+func (m *AdGroupStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupStatusEnum.Merge(m, src)
+}
+func (m *AdGroupStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupStatusEnum.Size(m)
+}
+func (m *AdGroupStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdGroupStatusEnum_AdGroupStatus", AdGroupStatusEnum_AdGroupStatus_name, AdGroupStatusEnum_AdGroupStatus_value)
+	proto.RegisterType((*AdGroupStatusEnum)(nil), "google.ads.googleads.v3.enums.AdGroupStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_group_status.proto", fileDescriptor_ec520dd54d7ad64c)
+}
+
+var fileDescriptor_ec520dd54d7ad64c = []byte{
+	// 305 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x18, 0x77, 0x9d, 0x4c, 0xc8, 0x10, 0x6b, 0x8f, 0xe2, 0x0e, 0xdb, 0x03, 0x24, 0x87, 0xdc, 0xe2,
+	0x29, 0xb5, 0x71, 0x0c, 0xb5, 0x2b, 0x96, 0x55, 0x90, 0xc2, 0x88, 0x66, 0xc4, 0xc1, 0x9a, 0x94,
+	0xa6, 0xdd, 0x03, 0x79, 0xf4, 0x51, 0x7c, 0x11, 0xc1, 0xa7, 0x90, 0xa4, 0x6b, 0x61, 0x07, 0xbd,
+	0x94, 0x5f, 0xbf, 0xdf, 0x9f, 0xfc, 0xbe, 0x0f, 0x60, 0xa9, 0xb5, 0xdc, 0x6d, 0x10, 0x17, 0x06,
+	0xb5, 0xd0, 0xa2, 0x3d, 0x46, 0x1b, 0xd5, 0x14, 0x06, 0x71, 0xb1, 0x96, 0x95, 0x6e, 0xca, 0xb5,
+	0xa9, 0x79, 0xdd, 0x18, 0x58, 0x56, 0xba, 0xd6, 0xc1, 0xa4, 0x55, 0x42, 0x2e, 0x0c, 0xec, 0x4d,
+	0x70, 0x8f, 0xa1, 0x33, 0x5d, 0x5d, 0x77, 0x99, 0xe5, 0x16, 0x71, 0xa5, 0x74, 0xcd, 0xeb, 0xad,
+	0x56, 0x07, 0xf3, 0xec, 0x1d, 0x5c, 0x52, 0x31, 0xb7, 0xa1, 0xa9, 0xcb, 0x64, 0xaa, 0x29, 0x66,
+	0x29, 0x38, 0x3f, 0x1a, 0x06, 0x17, 0x60, 0xbc, 0x8a, 0xd3, 0x84, 0xdd, 0x2e, 0xee, 0x16, 0x2c,
+	0xf2, 0x4f, 0x82, 0x31, 0x38, 0x5b, 0xc5, 0xf7, 0xf1, 0xf2, 0x39, 0xf6, 0x07, 0xf6, 0x87, 0xc5,
+	0x34, 0x7c, 0x60, 0x91, 0xef, 0x05, 0x00, 0x8c, 0x12, 0xba, 0x4a, 0x59, 0xe4, 0x0f, 0x2d, 0xf1,
+	0xc4, 0x1e, 0x97, 0x19, 0x8b, 0xfc, 0xd3, 0xf0, 0x7b, 0x00, 0xa6, 0x6f, 0xba, 0x80, 0xff, 0xb6,
+	0x0d, 0x83, 0xa3, 0x87, 0x13, 0xdb, 0x31, 0x19, 0xbc, 0x84, 0x07, 0x93, 0xd4, 0x3b, 0xae, 0x24,
+	0xd4, 0x95, 0x44, 0x72, 0xa3, 0xdc, 0x06, 0xdd, 0x9d, 0xca, 0xad, 0xf9, 0xe3, 0x6c, 0x37, 0xee,
+	0xfb, 0xe1, 0x0d, 0xe7, 0x94, 0x7e, 0x7a, 0x93, 0x79, 0x1b, 0x45, 0x85, 0x81, 0x2d, 0xb4, 0x28,
+	0xc3, 0xd0, 0x6e, 0x6e, 0xbe, 0x3a, 0x3e, 0xa7, 0xc2, 0xe4, 0x3d, 0x9f, 0x67, 0x38, 0x77, 0xfc,
+	0x8f, 0x37, 0x6d, 0x87, 0x84, 0x50, 0x61, 0x08, 0xe9, 0x15, 0x84, 0x64, 0x98, 0x10, 0xa7, 0x79,
+	0x1d, 0xb9, 0x62, 0xf8, 0x37, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x15, 0x6f, 0x49, 0xce, 0x01, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_group_type.pb.go b/googleapis/ads/googleads/v3/enums/ad_group_type.pb.go
new file mode 100644
index 0000000..bb1a35b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_group_type.pb.go
@@ -0,0 +1,182 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_group_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum listing the possible types of an ad group.
+type AdGroupTypeEnum_AdGroupType int32
+
+const (
+	// The type has not been specified.
+	AdGroupTypeEnum_UNSPECIFIED AdGroupTypeEnum_AdGroupType = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	AdGroupTypeEnum_UNKNOWN AdGroupTypeEnum_AdGroupType = 1
+	// The default ad group type for Search campaigns.
+	AdGroupTypeEnum_SEARCH_STANDARD AdGroupTypeEnum_AdGroupType = 2
+	// The default ad group type for Display campaigns.
+	AdGroupTypeEnum_DISPLAY_STANDARD AdGroupTypeEnum_AdGroupType = 3
+	// The ad group type for Shopping campaigns serving standard product ads.
+	AdGroupTypeEnum_SHOPPING_PRODUCT_ADS AdGroupTypeEnum_AdGroupType = 4
+	// The default ad group type for Hotel campaigns.
+	AdGroupTypeEnum_HOTEL_ADS AdGroupTypeEnum_AdGroupType = 6
+	// The type for ad groups in Smart Shopping campaigns.
+	AdGroupTypeEnum_SHOPPING_SMART_ADS AdGroupTypeEnum_AdGroupType = 7
+	// Short unskippable in-stream video ads.
+	AdGroupTypeEnum_VIDEO_BUMPER AdGroupTypeEnum_AdGroupType = 8
+	// TrueView (skippable) in-stream video ads.
+	AdGroupTypeEnum_VIDEO_TRUE_VIEW_IN_STREAM AdGroupTypeEnum_AdGroupType = 9
+	// TrueView in-display video ads.
+	AdGroupTypeEnum_VIDEO_TRUE_VIEW_IN_DISPLAY AdGroupTypeEnum_AdGroupType = 10
+	// Unskippable in-stream video ads.
+	AdGroupTypeEnum_VIDEO_NON_SKIPPABLE_IN_STREAM AdGroupTypeEnum_AdGroupType = 11
+	// Outstream video ads.
+	AdGroupTypeEnum_VIDEO_OUTSTREAM AdGroupTypeEnum_AdGroupType = 12
+	// Ad group type for Dynamic Search Ads ad groups.
+	AdGroupTypeEnum_SEARCH_DYNAMIC_ADS AdGroupTypeEnum_AdGroupType = 13
+	// The type for ad groups in Shopping Comparison Listing campaigns.
+	AdGroupTypeEnum_SHOPPING_COMPARISON_LISTING_ADS AdGroupTypeEnum_AdGroupType = 14
+	// The ad group type for Promoted Hotel ad groups.
+	AdGroupTypeEnum_PROMOTED_HOTEL_ADS AdGroupTypeEnum_AdGroupType = 15
+)
+
+var AdGroupTypeEnum_AdGroupType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "SEARCH_STANDARD",
+	3:  "DISPLAY_STANDARD",
+	4:  "SHOPPING_PRODUCT_ADS",
+	6:  "HOTEL_ADS",
+	7:  "SHOPPING_SMART_ADS",
+	8:  "VIDEO_BUMPER",
+	9:  "VIDEO_TRUE_VIEW_IN_STREAM",
+	10: "VIDEO_TRUE_VIEW_IN_DISPLAY",
+	11: "VIDEO_NON_SKIPPABLE_IN_STREAM",
+	12: "VIDEO_OUTSTREAM",
+	13: "SEARCH_DYNAMIC_ADS",
+	14: "SHOPPING_COMPARISON_LISTING_ADS",
+	15: "PROMOTED_HOTEL_ADS",
+}
+
+var AdGroupTypeEnum_AdGroupType_value = map[string]int32{
+	"UNSPECIFIED":                     0,
+	"UNKNOWN":                         1,
+	"SEARCH_STANDARD":                 2,
+	"DISPLAY_STANDARD":                3,
+	"SHOPPING_PRODUCT_ADS":            4,
+	"HOTEL_ADS":                       6,
+	"SHOPPING_SMART_ADS":              7,
+	"VIDEO_BUMPER":                    8,
+	"VIDEO_TRUE_VIEW_IN_STREAM":       9,
+	"VIDEO_TRUE_VIEW_IN_DISPLAY":      10,
+	"VIDEO_NON_SKIPPABLE_IN_STREAM":   11,
+	"VIDEO_OUTSTREAM":                 12,
+	"SEARCH_DYNAMIC_ADS":              13,
+	"SHOPPING_COMPARISON_LISTING_ADS": 14,
+	"PROMOTED_HOTEL_ADS":              15,
+}
+
+func (x AdGroupTypeEnum_AdGroupType) String() string {
+	return proto.EnumName(AdGroupTypeEnum_AdGroupType_name, int32(x))
+}
+
+func (AdGroupTypeEnum_AdGroupType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_caa3c10e4a74e367, []int{0, 0}
+}
+
+// Defines types of an ad group, specific to a particular campaign channel
+// type. This type drives validations that restrict which entities can be
+// added to the ad group.
+type AdGroupTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupTypeEnum) Reset()         { *m = AdGroupTypeEnum{} }
+func (m *AdGroupTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupTypeEnum) ProtoMessage()    {}
+func (*AdGroupTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_caa3c10e4a74e367, []int{0}
+}
+
+func (m *AdGroupTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupTypeEnum.Unmarshal(m, b)
+}
+func (m *AdGroupTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupTypeEnum.Merge(m, src)
+}
+func (m *AdGroupTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupTypeEnum.Size(m)
+}
+func (m *AdGroupTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdGroupTypeEnum_AdGroupType", AdGroupTypeEnum_AdGroupType_name, AdGroupTypeEnum_AdGroupType_value)
+	proto.RegisterType((*AdGroupTypeEnum)(nil), "google.ads.googleads.v3.enums.AdGroupTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_group_type.proto", fileDescriptor_caa3c10e4a74e367)
+}
+
+var fileDescriptor_caa3c10e4a74e367 = []byte{
+	// 478 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0x4f, 0x6f, 0xd3, 0x30,
+	0x14, 0xa7, 0x2d, 0xda, 0x98, 0xbb, 0x51, 0xcb, 0x4c, 0x08, 0x26, 0x0a, 0xea, 0xb8, 0x27, 0x42,
+	0xb9, 0x85, 0x93, 0xdb, 0x98, 0xd6, 0x5a, 0x63, 0x5b, 0x71, 0x92, 0x69, 0xa8, 0x92, 0x15, 0x48,
+	0x14, 0x55, 0x5a, 0xe3, 0xa8, 0x69, 0x27, 0xed, 0x23, 0xf0, 0x35, 0x38, 0xf2, 0x51, 0xf8, 0x1e,
+	0x5c, 0xb8, 0x73, 0x47, 0x89, 0xdb, 0xac, 0x07, 0xd8, 0xc5, 0x7a, 0xfe, 0xfd, 0x79, 0xfa, 0x3d,
+	0xbd, 0x07, 0x3e, 0xe4, 0x5a, 0xe7, 0xb7, 0x99, 0x9d, 0xa4, 0x95, 0x6d, 0xca, 0xba, 0xba, 0x73,
+	0xec, 0xac, 0xd8, 0xae, 0x2a, 0x3b, 0x49, 0x55, 0xbe, 0xd6, 0xdb, 0x52, 0x6d, 0xee, 0xcb, 0xcc,
+	0x2a, 0xd7, 0x7a, 0xa3, 0xd1, 0xd0, 0xe8, 0xac, 0x24, 0xad, 0xac, 0xd6, 0x62, 0xdd, 0x39, 0x56,
+	0x63, 0xb9, 0x78, 0xb3, 0xef, 0x58, 0x2e, 0xed, 0xa4, 0x28, 0xf4, 0x26, 0xd9, 0x2c, 0x75, 0x51,
+	0x19, 0xf3, 0xe5, 0xb7, 0x1e, 0x18, 0xe0, 0x74, 0x5a, 0xf7, 0x0c, 0xef, 0xcb, 0x8c, 0x14, 0xdb,
+	0xd5, 0xe5, 0x9f, 0x2e, 0xe8, 0x1f, 0x60, 0x68, 0x00, 0xfa, 0x11, 0x93, 0x82, 0x4c, 0xe8, 0x27,
+	0x4a, 0x3c, 0xf8, 0x04, 0xf5, 0xc1, 0x71, 0xc4, 0xae, 0x18, 0xbf, 0x66, 0xb0, 0x83, 0x5e, 0x80,
+	0x81, 0x24, 0x38, 0x98, 0xcc, 0x94, 0x0c, 0x31, 0xf3, 0x70, 0xe0, 0xc1, 0x2e, 0x3a, 0x07, 0xd0,
+	0xa3, 0x52, 0xcc, 0xf1, 0xcd, 0x03, 0xda, 0x43, 0xaf, 0xc0, 0xb9, 0x9c, 0x71, 0x21, 0x28, 0x9b,
+	0x2a, 0x11, 0x70, 0x2f, 0x9a, 0x84, 0x0a, 0x7b, 0x12, 0x3e, 0x45, 0x67, 0xe0, 0x64, 0xc6, 0x43,
+	0x32, 0x6f, 0xbe, 0x47, 0xe8, 0x25, 0x40, 0xad, 0x50, 0xfa, 0x38, 0x30, 0xb2, 0x63, 0x04, 0xc1,
+	0x69, 0x4c, 0x3d, 0xc2, 0xd5, 0x38, 0xf2, 0x05, 0x09, 0xe0, 0x33, 0x34, 0x04, 0xaf, 0x0d, 0x12,
+	0x06, 0x11, 0x51, 0x31, 0x25, 0xd7, 0x8a, 0x32, 0x25, 0xc3, 0x80, 0x60, 0x1f, 0x9e, 0xa0, 0xb7,
+	0xe0, 0xe2, 0x1f, 0xf4, 0x2e, 0x1a, 0x04, 0x68, 0x04, 0x86, 0x86, 0x67, 0x9c, 0x29, 0x79, 0x45,
+	0x85, 0xc0, 0xe3, 0x39, 0x39, 0x68, 0xd1, 0xaf, 0xe7, 0x33, 0x12, 0x1e, 0x85, 0x3b, 0xf0, 0xb4,
+	0x09, 0x68, 0x86, 0xf6, 0x6e, 0x18, 0xf6, 0xe9, 0xa4, 0x09, 0x78, 0x86, 0xde, 0x83, 0x77, 0x6d,
+	0xf0, 0x09, 0xf7, 0x05, 0x0e, 0xa8, 0xe4, 0x4c, 0xcd, 0xa9, 0x0c, 0x6b, 0xa8, 0x16, 0x3d, 0xaf,
+	0xcd, 0x22, 0xe0, 0x3e, 0x0f, 0x89, 0xa7, 0x1e, 0xa6, 0x1e, 0x8c, 0x7f, 0x75, 0xc0, 0xe8, 0xab,
+	0x5e, 0x59, 0x8f, 0xee, 0x73, 0x0c, 0x0f, 0x56, 0x23, 0xea, 0x1d, 0x8a, 0xce, 0xe7, 0xf1, 0xce,
+	0x92, 0xeb, 0xdb, 0xa4, 0xc8, 0x2d, 0xbd, 0xce, 0xed, 0x3c, 0x2b, 0x9a, 0x0d, 0xef, 0xaf, 0xa8,
+	0x5c, 0x56, 0xff, 0x39, 0xaa, 0x8f, 0xcd, 0xfb, 0xbd, 0xdb, 0x9b, 0x62, 0xfc, 0xa3, 0x3b, 0x9c,
+	0x9a, 0x56, 0x38, 0xad, 0x2c, 0x53, 0xd6, 0x55, 0xec, 0x58, 0xf5, 0x69, 0x54, 0x3f, 0xf7, 0xfc,
+	0x02, 0xa7, 0xd5, 0xa2, 0xe5, 0x17, 0xb1, 0xb3, 0x68, 0xf8, 0xdf, 0xdd, 0x91, 0x01, 0x5d, 0x17,
+	0xa7, 0x95, 0xeb, 0xb6, 0x0a, 0xd7, 0x8d, 0x1d, 0xd7, 0x6d, 0x34, 0x5f, 0x8e, 0x9a, 0x60, 0xce,
+	0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x33, 0x28, 0xb8, 0x91, 0xec, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_network_type.pb.go b/googleapis/ads/googleads/v3/enums/ad_network_type.pb.go
new file mode 100644
index 0000000..6f2193e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_network_type.pb.go
@@ -0,0 +1,143 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_network_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates Google Ads network types.
+type AdNetworkTypeEnum_AdNetworkType int32
+
+const (
+	// Not specified.
+	AdNetworkTypeEnum_UNSPECIFIED AdNetworkTypeEnum_AdNetworkType = 0
+	// The value is unknown in this version.
+	AdNetworkTypeEnum_UNKNOWN AdNetworkTypeEnum_AdNetworkType = 1
+	// Google search.
+	AdNetworkTypeEnum_SEARCH AdNetworkTypeEnum_AdNetworkType = 2
+	// Search partners.
+	AdNetworkTypeEnum_SEARCH_PARTNERS AdNetworkTypeEnum_AdNetworkType = 3
+	// Display Network.
+	AdNetworkTypeEnum_CONTENT AdNetworkTypeEnum_AdNetworkType = 4
+	// YouTube Search.
+	AdNetworkTypeEnum_YOUTUBE_SEARCH AdNetworkTypeEnum_AdNetworkType = 5
+	// YouTube Videos
+	AdNetworkTypeEnum_YOUTUBE_WATCH AdNetworkTypeEnum_AdNetworkType = 6
+	// Cross-network.
+	AdNetworkTypeEnum_MIXED AdNetworkTypeEnum_AdNetworkType = 7
+)
+
+var AdNetworkTypeEnum_AdNetworkType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "SEARCH",
+	3: "SEARCH_PARTNERS",
+	4: "CONTENT",
+	5: "YOUTUBE_SEARCH",
+	6: "YOUTUBE_WATCH",
+	7: "MIXED",
+}
+
+var AdNetworkTypeEnum_AdNetworkType_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"SEARCH":          2,
+	"SEARCH_PARTNERS": 3,
+	"CONTENT":         4,
+	"YOUTUBE_SEARCH":  5,
+	"YOUTUBE_WATCH":   6,
+	"MIXED":           7,
+}
+
+func (x AdNetworkTypeEnum_AdNetworkType) String() string {
+	return proto.EnumName(AdNetworkTypeEnum_AdNetworkType_name, int32(x))
+}
+
+func (AdNetworkTypeEnum_AdNetworkType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a418102a00fe2b95, []int{0, 0}
+}
+
+// Container for enumeration of Google Ads network types.
+type AdNetworkTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdNetworkTypeEnum) Reset()         { *m = AdNetworkTypeEnum{} }
+func (m *AdNetworkTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AdNetworkTypeEnum) ProtoMessage()    {}
+func (*AdNetworkTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a418102a00fe2b95, []int{0}
+}
+
+func (m *AdNetworkTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdNetworkTypeEnum.Unmarshal(m, b)
+}
+func (m *AdNetworkTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdNetworkTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AdNetworkTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdNetworkTypeEnum.Merge(m, src)
+}
+func (m *AdNetworkTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AdNetworkTypeEnum.Size(m)
+}
+func (m *AdNetworkTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdNetworkTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdNetworkTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdNetworkTypeEnum_AdNetworkType", AdNetworkTypeEnum_AdNetworkType_name, AdNetworkTypeEnum_AdNetworkType_value)
+	proto.RegisterType((*AdNetworkTypeEnum)(nil), "google.ads.googleads.v3.enums.AdNetworkTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_network_type.proto", fileDescriptor_a418102a00fe2b95)
+}
+
+var fileDescriptor_a418102a00fe2b95 = []byte{
+	// 354 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x6e, 0xe2, 0x30,
+	0x18, 0x9d, 0x84, 0x01, 0x34, 0x46, 0x0c, 0xc1, 0xb3, 0x1b, 0x0d, 0x0b, 0x38, 0x80, 0xb3, 0xc8,
+	0xce, 0xb3, 0x72, 0x82, 0x0b, 0xa8, 0xaa, 0x89, 0x20, 0x81, 0xb6, 0x8a, 0x14, 0xa5, 0x4d, 0x14,
+	0xa1, 0x82, 0x1d, 0xe1, 0x40, 0xc5, 0x21, 0x7a, 0x89, 0x76, 0xd7, 0xa3, 0xf4, 0x22, 0x95, 0x7a,
+	0x8a, 0x2a, 0x31, 0x41, 0x62, 0xd1, 0x6e, 0xac, 0xa7, 0xef, 0xfd, 0xc8, 0xef, 0x01, 0x2b, 0x15,
+	0x22, 0x5d, 0x27, 0x66, 0x14, 0x4b, 0x53, 0xc1, 0x02, 0xed, 0x2d, 0x33, 0xe1, 0xbb, 0x8d, 0x34,
+	0xa3, 0x38, 0xe4, 0x49, 0xfe, 0x28, 0xb6, 0x0f, 0x61, 0x7e, 0xc8, 0x12, 0x94, 0x6d, 0x45, 0x2e,
+	0x60, 0x4f, 0x29, 0x51, 0x14, 0x4b, 0x74, 0x32, 0xa1, 0xbd, 0x85, 0x4a, 0xd3, 0xdf, 0x7f, 0x55,
+	0x66, 0xb6, 0x32, 0x23, 0xce, 0x45, 0x1e, 0xe5, 0x2b, 0xc1, 0xa5, 0x32, 0x0f, 0x5e, 0x34, 0xd0,
+	0x25, 0x31, 0x53, 0xa9, 0xde, 0x21, 0x4b, 0x28, 0xdf, 0x6d, 0x06, 0x4f, 0x1a, 0x68, 0x9f, 0x5d,
+	0x61, 0x07, 0xb4, 0x7c, 0x36, 0x77, 0xa9, 0x33, 0xb9, 0x98, 0xd0, 0xa1, 0xf1, 0x03, 0xb6, 0x40,
+	0xd3, 0x67, 0x97, 0x6c, 0xba, 0x64, 0x86, 0x06, 0x01, 0x68, 0xcc, 0x29, 0x99, 0x39, 0x63, 0x43,
+	0x87, 0x7f, 0x40, 0x47, 0xe1, 0xd0, 0x25, 0x33, 0x8f, 0xd1, 0xd9, 0xdc, 0xa8, 0x15, 0x6a, 0x67,
+	0xca, 0x3c, 0xca, 0x3c, 0xe3, 0x27, 0x84, 0xe0, 0xf7, 0xcd, 0xd4, 0xf7, 0x7c, 0x9b, 0x86, 0x47,
+	0x57, 0x1d, 0x76, 0x41, 0xbb, 0xba, 0x2d, 0x89, 0xe7, 0x8c, 0x8d, 0x06, 0xfc, 0x05, 0xea, 0x57,
+	0x93, 0x6b, 0x3a, 0x34, 0x9a, 0xf6, 0xbb, 0x06, 0xfa, 0xf7, 0x62, 0x83, 0xbe, 0x6d, 0x6a, 0xc3,
+	0xb3, 0x2f, 0xbb, 0x45, 0x3f, 0x57, 0xbb, 0xb5, 0x8f, 0xa6, 0x54, 0xac, 0x23, 0x9e, 0x22, 0xb1,
+	0x4d, 0xcd, 0x34, 0xe1, 0x65, 0xfb, 0x6a, 0xe3, 0x6c, 0x25, 0xbf, 0x98, 0xfc, 0x7f, 0xf9, 0x3e,
+	0xeb, 0xb5, 0x11, 0x21, 0xaf, 0x7a, 0x6f, 0xa4, 0xa2, 0x48, 0x2c, 0x91, 0x82, 0x05, 0x5a, 0x58,
+	0xa8, 0x18, 0x4d, 0xbe, 0x55, 0x7c, 0x40, 0x62, 0x19, 0x9c, 0xf8, 0x60, 0x61, 0x05, 0x25, 0xff,
+	0xa1, 0xf7, 0xd5, 0x11, 0x63, 0x12, 0x4b, 0x8c, 0x4f, 0x0a, 0x8c, 0x17, 0x16, 0xc6, 0xa5, 0xe6,
+	0xae, 0x51, 0x7e, 0xcc, 0xfa, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xda, 0xad, 0xab, 0x55, 0x0a, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_serving_optimization_status.pb.go b/googleapis/ads/googleads/v3/enums/ad_serving_optimization_status.pb.go
new file mode 100644
index 0000000..0e00365
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_serving_optimization_status.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_serving_optimization_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible serving statuses.
+type AdServingOptimizationStatusEnum_AdServingOptimizationStatus int32
+
+const (
+	// No value has been specified.
+	AdServingOptimizationStatusEnum_UNSPECIFIED AdServingOptimizationStatusEnum_AdServingOptimizationStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	AdServingOptimizationStatusEnum_UNKNOWN AdServingOptimizationStatusEnum_AdServingOptimizationStatus = 1
+	// Ad serving is optimized based on CTR for the campaign.
+	AdServingOptimizationStatusEnum_OPTIMIZE AdServingOptimizationStatusEnum_AdServingOptimizationStatus = 2
+	// Ad serving is optimized based on CTR * Conversion for the campaign. If
+	// the campaign is not in the conversion optimizer bidding strategy, it will
+	// default to OPTIMIZED.
+	AdServingOptimizationStatusEnum_CONVERSION_OPTIMIZE AdServingOptimizationStatusEnum_AdServingOptimizationStatus = 3
+	// Ads are rotated evenly for 90 days, then optimized for clicks.
+	AdServingOptimizationStatusEnum_ROTATE AdServingOptimizationStatusEnum_AdServingOptimizationStatus = 4
+	// Show lower performing ads more evenly with higher performing ads, and do
+	// not optimize.
+	AdServingOptimizationStatusEnum_ROTATE_INDEFINITELY AdServingOptimizationStatusEnum_AdServingOptimizationStatus = 5
+	// Ad serving optimization status is not available.
+	AdServingOptimizationStatusEnum_UNAVAILABLE AdServingOptimizationStatusEnum_AdServingOptimizationStatus = 6
+)
+
+var AdServingOptimizationStatusEnum_AdServingOptimizationStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "OPTIMIZE",
+	3: "CONVERSION_OPTIMIZE",
+	4: "ROTATE",
+	5: "ROTATE_INDEFINITELY",
+	6: "UNAVAILABLE",
+}
+
+var AdServingOptimizationStatusEnum_AdServingOptimizationStatus_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"OPTIMIZE":            2,
+	"CONVERSION_OPTIMIZE": 3,
+	"ROTATE":              4,
+	"ROTATE_INDEFINITELY": 5,
+	"UNAVAILABLE":         6,
+}
+
+func (x AdServingOptimizationStatusEnum_AdServingOptimizationStatus) String() string {
+	return proto.EnumName(AdServingOptimizationStatusEnum_AdServingOptimizationStatus_name, int32(x))
+}
+
+func (AdServingOptimizationStatusEnum_AdServingOptimizationStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_68f0c6c0e1ebc7e3, []int{0, 0}
+}
+
+// Possible ad serving statuses of a campaign.
+type AdServingOptimizationStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdServingOptimizationStatusEnum) Reset()         { *m = AdServingOptimizationStatusEnum{} }
+func (m *AdServingOptimizationStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*AdServingOptimizationStatusEnum) ProtoMessage()    {}
+func (*AdServingOptimizationStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_68f0c6c0e1ebc7e3, []int{0}
+}
+
+func (m *AdServingOptimizationStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdServingOptimizationStatusEnum.Unmarshal(m, b)
+}
+func (m *AdServingOptimizationStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdServingOptimizationStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *AdServingOptimizationStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdServingOptimizationStatusEnum.Merge(m, src)
+}
+func (m *AdServingOptimizationStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_AdServingOptimizationStatusEnum.Size(m)
+}
+func (m *AdServingOptimizationStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdServingOptimizationStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdServingOptimizationStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdServingOptimizationStatusEnum_AdServingOptimizationStatus", AdServingOptimizationStatusEnum_AdServingOptimizationStatus_name, AdServingOptimizationStatusEnum_AdServingOptimizationStatus_value)
+	proto.RegisterType((*AdServingOptimizationStatusEnum)(nil), "google.ads.googleads.v3.enums.AdServingOptimizationStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_serving_optimization_status.proto", fileDescriptor_68f0c6c0e1ebc7e3)
+}
+
+var fileDescriptor_68f0c6c0e1ebc7e3 = []byte{
+	// 367 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0x8a, 0xdb, 0x30,
+	0x14, 0xac, 0x9d, 0x36, 0x2d, 0x4a, 0xa1, 0xc6, 0x3d, 0x14, 0xda, 0x86, 0x36, 0xf9, 0x00, 0xf9,
+	0xe0, 0x9b, 0x7a, 0x92, 0x13, 0x25, 0x88, 0xa6, 0xb2, 0x89, 0x1d, 0x97, 0x06, 0x83, 0x71, 0xd7,
+	0xc6, 0x18, 0x62, 0xc9, 0x44, 0x4e, 0x0e, 0xfb, 0x25, 0x7b, 0xde, 0xe3, 0x7e, 0xc3, 0x7e, 0xc1,
+	0x7e, 0xca, 0xde, 0xf7, 0xbe, 0x58, 0x4a, 0xcc, 0x5e, 0x36, 0x17, 0x31, 0x68, 0xe6, 0xcd, 0x3c,
+	0xe6, 0x01, 0xaf, 0x14, 0xa2, 0xdc, 0x15, 0x4e, 0x96, 0x4b, 0x47, 0xc3, 0x0e, 0x1d, 0x5d, 0xa7,
+	0xe0, 0x87, 0x5a, 0x3a, 0x59, 0x9e, 0xca, 0x62, 0x7f, 0xac, 0x78, 0x99, 0x8a, 0xa6, 0xad, 0xea,
+	0xea, 0x3a, 0x6b, 0x2b, 0xc1, 0x53, 0xd9, 0x66, 0xed, 0x41, 0xc2, 0x66, 0x2f, 0x5a, 0x61, 0x8f,
+	0xf5, 0x20, 0xcc, 0x72, 0x09, 0x7b, 0x0f, 0x78, 0x74, 0xa1, 0xf2, 0xf8, 0xfa, 0xfd, 0x1c, 0xd1,
+	0x54, 0x4e, 0xc6, 0xb9, 0x68, 0x95, 0xc5, 0x69, 0x78, 0x7a, 0x6f, 0x80, 0x1f, 0x38, 0x0f, 0x75,
+	0x88, 0xff, 0x22, 0x23, 0x54, 0x11, 0x84, 0x1f, 0xea, 0xe9, 0x8d, 0x01, 0xbe, 0x5d, 0xd0, 0xd8,
+	0x9f, 0xc0, 0x68, 0xc3, 0xc2, 0x80, 0xcc, 0xe8, 0x82, 0x92, 0xb9, 0xf5, 0xc6, 0x1e, 0x81, 0xf7,
+	0x1b, 0xf6, 0x9b, 0xf9, 0x7f, 0x99, 0x65, 0xd8, 0x1f, 0xc1, 0x07, 0x3f, 0x88, 0xe8, 0x1f, 0xba,
+	0x25, 0x96, 0x69, 0x7f, 0x01, 0x9f, 0x67, 0x3e, 0x8b, 0xc9, 0x3a, 0xa4, 0x3e, 0x4b, 0x7b, 0x62,
+	0x60, 0x03, 0x30, 0x5c, 0xfb, 0x11, 0x8e, 0x88, 0xf5, 0xb6, 0x13, 0x69, 0x9c, 0x52, 0x36, 0x27,
+	0x0b, 0xca, 0x68, 0x44, 0x56, 0xff, 0xac, 0x77, 0x3a, 0x09, 0xc7, 0x98, 0xae, 0xb0, 0xb7, 0x22,
+	0xd6, 0xd0, 0x7b, 0x32, 0xc0, 0xe4, 0x4a, 0xd4, 0xf0, 0x62, 0x05, 0xde, 0xcf, 0x0b, 0xdb, 0x07,
+	0x5d, 0x0d, 0x81, 0xb1, 0x3d, 0x5d, 0x02, 0x96, 0x62, 0x97, 0xf1, 0x12, 0x8a, 0x7d, 0xe9, 0x94,
+	0x05, 0x57, 0x25, 0x9d, 0x2f, 0xd3, 0x54, 0xf2, 0x95, 0x43, 0xfd, 0x52, 0xef, 0xad, 0x39, 0x58,
+	0x62, 0x7c, 0x67, 0x8e, 0x97, 0xda, 0x0a, 0xe7, 0x12, 0x6a, 0xd8, 0xa1, 0xd8, 0x85, 0x5d, 0x9b,
+	0xf2, 0xe1, 0xcc, 0x27, 0x38, 0x97, 0x49, 0xcf, 0x27, 0xb1, 0x9b, 0x28, 0xfe, 0xd1, 0x9c, 0xe8,
+	0x4f, 0x84, 0x70, 0x2e, 0x11, 0xea, 0x15, 0x08, 0xc5, 0x2e, 0x42, 0x4a, 0xf3, 0x7f, 0xa8, 0x16,
+	0x73, 0x9f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x79, 0x51, 0xc9, 0x40, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_strength.pb.go b/googleapis/ads/googleads/v3/enums/ad_strength.pb.go
new file mode 100644
index 0000000..3f9c8ec
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_strength.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_strength.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum listing the possible ad strengths.
+type AdStrengthEnum_AdStrength int32
+
+const (
+	// Not specified.
+	AdStrengthEnum_UNSPECIFIED AdStrengthEnum_AdStrength = 0
+	// Used for return value only. Represents value unknown in this version.
+	AdStrengthEnum_UNKNOWN AdStrengthEnum_AdStrength = 1
+	// The ad strength is currently pending.
+	AdStrengthEnum_PENDING AdStrengthEnum_AdStrength = 2
+	// No ads could be generated.
+	AdStrengthEnum_NO_ADS AdStrengthEnum_AdStrength = 3
+	// Poor strength.
+	AdStrengthEnum_POOR AdStrengthEnum_AdStrength = 4
+	// Average strength.
+	AdStrengthEnum_AVERAGE AdStrengthEnum_AdStrength = 5
+	// Good strength.
+	AdStrengthEnum_GOOD AdStrengthEnum_AdStrength = 6
+	// Excellent strength.
+	AdStrengthEnum_EXCELLENT AdStrengthEnum_AdStrength = 7
+)
+
+var AdStrengthEnum_AdStrength_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PENDING",
+	3: "NO_ADS",
+	4: "POOR",
+	5: "AVERAGE",
+	6: "GOOD",
+	7: "EXCELLENT",
+}
+
+var AdStrengthEnum_AdStrength_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"PENDING":     2,
+	"NO_ADS":      3,
+	"POOR":        4,
+	"AVERAGE":     5,
+	"GOOD":        6,
+	"EXCELLENT":   7,
+}
+
+func (x AdStrengthEnum_AdStrength) String() string {
+	return proto.EnumName(AdStrengthEnum_AdStrength_name, int32(x))
+}
+
+func (AdStrengthEnum_AdStrength) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3eea2cf3af8be160, []int{0, 0}
+}
+
+// Container for enum describing possible ad strengths.
+type AdStrengthEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdStrengthEnum) Reset()         { *m = AdStrengthEnum{} }
+func (m *AdStrengthEnum) String() string { return proto.CompactTextString(m) }
+func (*AdStrengthEnum) ProtoMessage()    {}
+func (*AdStrengthEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3eea2cf3af8be160, []int{0}
+}
+
+func (m *AdStrengthEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdStrengthEnum.Unmarshal(m, b)
+}
+func (m *AdStrengthEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdStrengthEnum.Marshal(b, m, deterministic)
+}
+func (m *AdStrengthEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdStrengthEnum.Merge(m, src)
+}
+func (m *AdStrengthEnum) XXX_Size() int {
+	return xxx_messageInfo_AdStrengthEnum.Size(m)
+}
+func (m *AdStrengthEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdStrengthEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdStrengthEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdStrengthEnum_AdStrength", AdStrengthEnum_AdStrength_name, AdStrengthEnum_AdStrength_value)
+	proto.RegisterType((*AdStrengthEnum)(nil), "google.ads.googleads.v3.enums.AdStrengthEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_strength.proto", fileDescriptor_3eea2cf3af8be160)
+}
+
+var fileDescriptor_3eea2cf3af8be160 = []byte{
+	// 331 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x6e, 0xea, 0x30,
+	0x14, 0xfc, 0x09, 0x7c, 0x68, 0x8d, 0x5a, 0xac, 0x2c, 0xab, 0xb2, 0x80, 0x03, 0x38, 0x8b, 0xec,
+	0xdc, 0x95, 0x21, 0x6e, 0x84, 0x8a, 0x9c, 0x08, 0x4a, 0x5a, 0x55, 0x91, 0x50, 0x5a, 0x47, 0x2e,
+	0x12, 0xd8, 0x08, 0x07, 0x6e, 0xd0, 0x8b, 0x74, 0xd9, 0xa3, 0xf4, 0x1c, 0x5d, 0xf5, 0x14, 0x95,
+	0x1d, 0x08, 0xab, 0x76, 0x63, 0x8d, 0xdf, 0x9b, 0x19, 0xcd, 0x1b, 0xe0, 0x0b, 0xa5, 0xc4, 0xaa,
+	0xf0, 0x73, 0xae, 0x0f, 0xd0, 0xa0, 0x7d, 0xe0, 0x17, 0x72, 0xb7, 0xd6, 0x7e, 0xce, 0x17, 0xba,
+	0xdc, 0x16, 0x52, 0x94, 0xaf, 0x68, 0xb3, 0x55, 0xa5, 0xf2, 0x7a, 0x15, 0x0b, 0xe5, 0x5c, 0xa3,
+	0x5a, 0x80, 0xf6, 0x01, 0xb2, 0x82, 0xab, 0xeb, 0xa3, 0xdf, 0x66, 0xe9, 0xe7, 0x52, 0xaa, 0x32,
+	0x2f, 0x97, 0x4a, 0xea, 0x4a, 0x3c, 0x78, 0x73, 0xc0, 0x25, 0xe1, 0xb3, 0x83, 0x23, 0x95, 0xbb,
+	0xf5, 0x40, 0x03, 0x70, 0x9a, 0x78, 0x5d, 0xd0, 0x99, 0xb3, 0x59, 0x42, 0x47, 0xe3, 0xdb, 0x31,
+	0x0d, 0xe1, 0x3f, 0xaf, 0x03, 0xda, 0x73, 0x76, 0xc7, 0xe2, 0x07, 0x06, 0x1d, 0xf3, 0x49, 0x28,
+	0x0b, 0xc7, 0x2c, 0x82, 0xae, 0x07, 0x40, 0x8b, 0xc5, 0x0b, 0x12, 0xce, 0x60, 0xc3, 0x3b, 0x03,
+	0xcd, 0x24, 0x8e, 0xa7, 0xb0, 0x69, 0x28, 0x24, 0xa5, 0x53, 0x12, 0x51, 0xf8, 0xdf, 0x8c, 0xa3,
+	0x38, 0x0e, 0x61, 0xcb, 0xbb, 0x00, 0xe7, 0xf4, 0x71, 0x44, 0x27, 0x13, 0xca, 0xee, 0x61, 0x7b,
+	0xf8, 0xe5, 0x80, 0xfe, 0x8b, 0x5a, 0xa3, 0x3f, 0x6f, 0x19, 0x76, 0x4f, 0xc1, 0x12, 0x13, 0x3f,
+	0x71, 0x9e, 0x86, 0x07, 0x85, 0x50, 0xab, 0x5c, 0x0a, 0xa4, 0xb6, 0xc2, 0x17, 0x85, 0xb4, 0xc7,
+	0x1d, 0xeb, 0xdb, 0x2c, 0xf5, 0x2f, 0x6d, 0xde, 0xd8, 0xf7, 0xdd, 0x6d, 0x44, 0x84, 0x7c, 0xb8,
+	0xbd, 0xa8, 0xb2, 0x22, 0x5c, 0xa3, 0x0a, 0x1a, 0x94, 0x06, 0xc8, 0xd4, 0xa2, 0x3f, 0x8f, 0xfb,
+	0x8c, 0x70, 0x9d, 0xd5, 0xfb, 0x2c, 0x0d, 0x32, 0xbb, 0xff, 0x76, 0xfb, 0xd5, 0x10, 0x63, 0xc2,
+	0x35, 0xc6, 0x35, 0x03, 0xe3, 0x34, 0xc0, 0xd8, 0x72, 0x9e, 0x5b, 0x36, 0x58, 0xf0, 0x13, 0x00,
+	0x00, 0xff, 0xff, 0x86, 0x7e, 0x00, 0xb0, 0xe5, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/ad_type.pb.go b/googleapis/ads/googleads/v3/enums/ad_type.pb.go
new file mode 100644
index 0000000..f45dd3f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/ad_type.pb.go
@@ -0,0 +1,208 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/ad_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible types of an ad.
+type AdTypeEnum_AdType int32
+
+const (
+	// No value has been specified.
+	AdTypeEnum_UNSPECIFIED AdTypeEnum_AdType = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	AdTypeEnum_UNKNOWN AdTypeEnum_AdType = 1
+	// The ad is a text ad.
+	AdTypeEnum_TEXT_AD AdTypeEnum_AdType = 2
+	// The ad is an expanded text ad.
+	AdTypeEnum_EXPANDED_TEXT_AD AdTypeEnum_AdType = 3
+	// The ad is a call only ad.
+	AdTypeEnum_CALL_ONLY_AD AdTypeEnum_AdType = 6
+	// The ad is an expanded dynamic search ad.
+	AdTypeEnum_EXPANDED_DYNAMIC_SEARCH_AD AdTypeEnum_AdType = 7
+	// The ad is a hotel ad.
+	AdTypeEnum_HOTEL_AD AdTypeEnum_AdType = 8
+	// The ad is a Smart Shopping ad.
+	AdTypeEnum_SHOPPING_SMART_AD AdTypeEnum_AdType = 9
+	// The ad is a standard Shopping ad.
+	AdTypeEnum_SHOPPING_PRODUCT_AD AdTypeEnum_AdType = 10
+	// The ad is a video ad.
+	AdTypeEnum_VIDEO_AD AdTypeEnum_AdType = 12
+	// This ad is a Gmail ad.
+	AdTypeEnum_GMAIL_AD AdTypeEnum_AdType = 13
+	// This ad is an Image ad.
+	AdTypeEnum_IMAGE_AD AdTypeEnum_AdType = 14
+	// The ad is a responsive search ad.
+	AdTypeEnum_RESPONSIVE_SEARCH_AD AdTypeEnum_AdType = 15
+	// The ad is a legacy responsive display ad.
+	AdTypeEnum_LEGACY_RESPONSIVE_DISPLAY_AD AdTypeEnum_AdType = 16
+	// The ad is an app ad.
+	AdTypeEnum_APP_AD AdTypeEnum_AdType = 17
+	// The ad is a legacy app install ad.
+	AdTypeEnum_LEGACY_APP_INSTALL_AD AdTypeEnum_AdType = 18
+	// The ad is a responsive display ad.
+	AdTypeEnum_RESPONSIVE_DISPLAY_AD AdTypeEnum_AdType = 19
+	// The ad is a display upload ad with the HTML5_UPLOAD_AD product type.
+	AdTypeEnum_HTML5_UPLOAD_AD AdTypeEnum_AdType = 21
+	// The ad is a display upload ad with one of the DYNAMIC_HTML5_* product
+	// types.
+	AdTypeEnum_DYNAMIC_HTML5_AD AdTypeEnum_AdType = 22
+	// The ad is an app engagement ad.
+	AdTypeEnum_APP_ENGAGEMENT_AD AdTypeEnum_AdType = 23
+	// The ad is a Shopping Comparison Listing ad.
+	AdTypeEnum_SHOPPING_COMPARISON_LISTING_AD AdTypeEnum_AdType = 24
+)
+
+var AdTypeEnum_AdType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "TEXT_AD",
+	3:  "EXPANDED_TEXT_AD",
+	6:  "CALL_ONLY_AD",
+	7:  "EXPANDED_DYNAMIC_SEARCH_AD",
+	8:  "HOTEL_AD",
+	9:  "SHOPPING_SMART_AD",
+	10: "SHOPPING_PRODUCT_AD",
+	12: "VIDEO_AD",
+	13: "GMAIL_AD",
+	14: "IMAGE_AD",
+	15: "RESPONSIVE_SEARCH_AD",
+	16: "LEGACY_RESPONSIVE_DISPLAY_AD",
+	17: "APP_AD",
+	18: "LEGACY_APP_INSTALL_AD",
+	19: "RESPONSIVE_DISPLAY_AD",
+	21: "HTML5_UPLOAD_AD",
+	22: "DYNAMIC_HTML5_AD",
+	23: "APP_ENGAGEMENT_AD",
+	24: "SHOPPING_COMPARISON_LISTING_AD",
+}
+
+var AdTypeEnum_AdType_value = map[string]int32{
+	"UNSPECIFIED":                    0,
+	"UNKNOWN":                        1,
+	"TEXT_AD":                        2,
+	"EXPANDED_TEXT_AD":               3,
+	"CALL_ONLY_AD":                   6,
+	"EXPANDED_DYNAMIC_SEARCH_AD":     7,
+	"HOTEL_AD":                       8,
+	"SHOPPING_SMART_AD":              9,
+	"SHOPPING_PRODUCT_AD":            10,
+	"VIDEO_AD":                       12,
+	"GMAIL_AD":                       13,
+	"IMAGE_AD":                       14,
+	"RESPONSIVE_SEARCH_AD":           15,
+	"LEGACY_RESPONSIVE_DISPLAY_AD":   16,
+	"APP_AD":                         17,
+	"LEGACY_APP_INSTALL_AD":          18,
+	"RESPONSIVE_DISPLAY_AD":          19,
+	"HTML5_UPLOAD_AD":                21,
+	"DYNAMIC_HTML5_AD":               22,
+	"APP_ENGAGEMENT_AD":              23,
+	"SHOPPING_COMPARISON_LISTING_AD": 24,
+}
+
+func (x AdTypeEnum_AdType) String() string {
+	return proto.EnumName(AdTypeEnum_AdType_name, int32(x))
+}
+
+func (AdTypeEnum_AdType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2322810cfdc14ea3, []int{0, 0}
+}
+
+// Container for enum describing possible types of an ad.
+type AdTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdTypeEnum) Reset()         { *m = AdTypeEnum{} }
+func (m *AdTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AdTypeEnum) ProtoMessage()    {}
+func (*AdTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2322810cfdc14ea3, []int{0}
+}
+
+func (m *AdTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdTypeEnum.Unmarshal(m, b)
+}
+func (m *AdTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AdTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdTypeEnum.Merge(m, src)
+}
+func (m *AdTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AdTypeEnum.Size(m)
+}
+func (m *AdTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdTypeEnum_AdType", AdTypeEnum_AdType_name, AdTypeEnum_AdType_value)
+	proto.RegisterType((*AdTypeEnum)(nil), "google.ads.googleads.v3.enums.AdTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/ad_type.proto", fileDescriptor_2322810cfdc14ea3)
+}
+
+var fileDescriptor_2322810cfdc14ea3 = []byte{
+	// 517 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xcd, 0x6a, 0xdb, 0x4c,
+	0x14, 0xfd, 0x62, 0x83, 0x93, 0x6f, 0xe2, 0xd6, 0xca, 0x38, 0x6e, 0xd2, 0x90, 0x84, 0xc6, 0xdb,
+	0x82, 0xb4, 0x10, 0xdd, 0xa8, 0xab, 0x6b, 0xcd, 0x54, 0x1e, 0x2a, 0x8d, 0x06, 0x4b, 0x76, 0xe3,
+	0x62, 0x10, 0x6a, 0x65, 0x84, 0x21, 0x96, 0x4c, 0xe4, 0x04, 0xf2, 0x3a, 0x5d, 0xf6, 0x45, 0x0a,
+	0x7d, 0x80, 0xae, 0xbb, 0xee, 0x53, 0x94, 0x3b, 0x8a, 0x45, 0x16, 0x6d, 0x37, 0xe2, 0x9e, 0x9f,
+	0x39, 0xcc, 0x5c, 0x1d, 0xf2, 0x3a, 0x2f, 0xcb, 0xfc, 0x66, 0x69, 0xa5, 0x59, 0x65, 0xd5, 0x23,
+	0x4e, 0xf7, 0xb6, 0xb5, 0x2c, 0xee, 0xd6, 0x95, 0x95, 0x66, 0xc9, 0xf6, 0x61, 0xb3, 0x34, 0x37,
+	0xb7, 0xe5, 0xb6, 0xa4, 0x17, 0xb5, 0xc3, 0x4c, 0xb3, 0xca, 0x6c, 0xcc, 0xe6, 0xbd, 0x6d, 0x6a,
+	0xf3, 0xd9, 0xf9, 0x2e, 0x6b, 0xb3, 0xb2, 0xd2, 0xa2, 0x28, 0xb7, 0xe9, 0x76, 0x55, 0x16, 0x55,
+	0x7d, 0x78, 0xf8, 0xa3, 0x4d, 0x08, 0x64, 0xf1, 0xc3, 0x66, 0xc9, 0x8b, 0xbb, 0xf5, 0xf0, 0x5b,
+	0x9b, 0x74, 0x6a, 0x48, 0x7b, 0xe4, 0x70, 0x2a, 0x23, 0xc5, 0x5d, 0xf1, 0x4e, 0x70, 0x66, 0xfc,
+	0x47, 0x0f, 0xc9, 0xfe, 0x54, 0xbe, 0x97, 0xe1, 0x07, 0x69, 0xec, 0x21, 0x88, 0xf9, 0x75, 0x9c,
+	0x00, 0x33, 0x5a, 0xf4, 0x98, 0x18, 0xfc, 0x5a, 0x81, 0x64, 0x9c, 0x25, 0x3b, 0xb6, 0x4d, 0x0d,
+	0xd2, 0x75, 0xc1, 0xf7, 0x93, 0x50, 0xfa, 0x73, 0x64, 0x3a, 0xf4, 0x92, 0x9c, 0x35, 0x3e, 0x36,
+	0x97, 0x10, 0x08, 0x37, 0x89, 0x38, 0x4c, 0xdc, 0x31, 0xea, 0xfb, 0xb4, 0x4b, 0x0e, 0xc6, 0x61,
+	0xcc, 0x7d, 0x44, 0x07, 0x74, 0x40, 0x8e, 0xa2, 0x71, 0xa8, 0x94, 0x90, 0x5e, 0x12, 0x05, 0x30,
+	0xd1, 0xb1, 0xff, 0xd3, 0x13, 0xd2, 0x6f, 0x68, 0x35, 0x09, 0xd9, 0xd4, 0xd5, 0x02, 0xc1, 0xd3,
+	0x33, 0xc1, 0x78, 0x88, 0xa8, 0x8b, 0xc8, 0x0b, 0x40, 0xe8, 0xac, 0x67, 0x88, 0x44, 0x00, 0x1e,
+	0x47, 0xf4, 0x9c, 0x9e, 0x92, 0xe3, 0x09, 0x8f, 0x54, 0x28, 0x23, 0x31, 0xe3, 0x4f, 0x6e, 0xd0,
+	0xa3, 0xaf, 0xc8, 0xb9, 0xcf, 0x3d, 0x70, 0xe7, 0xc9, 0x13, 0x03, 0x13, 0x91, 0xf2, 0x41, 0xbf,
+	0xc1, 0xa0, 0x84, 0x74, 0x40, 0x29, 0x9c, 0x8f, 0xe8, 0x4b, 0x32, 0x78, 0x74, 0x23, 0x25, 0x64,
+	0x14, 0xe3, 0x7b, 0x81, 0x19, 0x14, 0xa5, 0x3f, 0x27, 0xf4, 0x69, 0x9f, 0xf4, 0xc6, 0x71, 0xe0,
+	0xbf, 0x49, 0xa6, 0xca, 0x0f, 0x81, 0x21, 0x39, 0xc0, 0x15, 0xee, 0x36, 0x52, 0x8b, 0xc0, 0x8c,
+	0x17, 0xb8, 0x02, 0x4c, 0xe6, 0xd2, 0x03, 0x8f, 0x07, 0x5c, 0xea, 0x97, 0x9e, 0xd0, 0x21, 0xb9,
+	0x6c, 0x56, 0xe0, 0x86, 0x81, 0x82, 0x89, 0x88, 0x42, 0x99, 0xf8, 0x22, 0x8a, 0x91, 0x02, 0x66,
+	0x9c, 0x8e, 0x7e, 0xee, 0x91, 0xab, 0xcf, 0xe5, 0xda, 0xfc, 0x67, 0x39, 0x46, 0x87, 0xf5, 0xcf,
+	0x56, 0xd8, 0x05, 0xb5, 0xf7, 0x71, 0xf4, 0xe8, 0xce, 0xcb, 0x9b, 0xb4, 0xc8, 0xcd, 0xf2, 0x36,
+	0xb7, 0xf2, 0x65, 0xa1, 0x9b, 0xb2, 0xeb, 0xe1, 0x66, 0x55, 0xfd, 0xa5, 0x96, 0x6f, 0xf5, 0xf7,
+	0x4b, 0xab, 0xed, 0x01, 0x7c, 0x6d, 0x5d, 0x78, 0x75, 0x14, 0x64, 0x95, 0x59, 0x8f, 0x38, 0xcd,
+	0x6c, 0x13, 0x7b, 0x56, 0x7d, 0xdf, 0xe9, 0x0b, 0xc8, 0xaa, 0x45, 0xa3, 0x2f, 0x66, 0xf6, 0x42,
+	0xeb, 0xbf, 0x5a, 0x57, 0x35, 0xe9, 0x38, 0x90, 0x55, 0x8e, 0xd3, 0x38, 0x1c, 0x67, 0x66, 0x3b,
+	0x8e, 0xf6, 0x7c, 0xea, 0xe8, 0x8b, 0xd9, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x8d, 0xc5, 0x68,
+	0x27, 0x2e, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/advertising_channel_sub_type.pb.go b/googleapis/ads/googleads/v3/enums/advertising_channel_sub_type.pb.go
new file mode 100644
index 0000000..cb9d674
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/advertising_channel_sub_type.pb.go
@@ -0,0 +1,183 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/advertising_channel_sub_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the different channel subtypes.
+type AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType int32
+
+const (
+	// Not specified.
+	AdvertisingChannelSubTypeEnum_UNSPECIFIED AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 0
+	// Used as a return value only. Represents value unknown in this version.
+	AdvertisingChannelSubTypeEnum_UNKNOWN AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 1
+	// Mobile app campaigns for Search.
+	AdvertisingChannelSubTypeEnum_SEARCH_MOBILE_APP AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 2
+	// Mobile app campaigns for Display.
+	AdvertisingChannelSubTypeEnum_DISPLAY_MOBILE_APP AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 3
+	// AdWords express campaigns for search.
+	AdvertisingChannelSubTypeEnum_SEARCH_EXPRESS AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 4
+	// AdWords Express campaigns for display.
+	AdvertisingChannelSubTypeEnum_DISPLAY_EXPRESS AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 5
+	// Smart Shopping campaigns.
+	AdvertisingChannelSubTypeEnum_SHOPPING_SMART_ADS AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 6
+	// Gmail Ad campaigns.
+	AdvertisingChannelSubTypeEnum_DISPLAY_GMAIL_AD AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 7
+	// Smart display campaigns.
+	AdvertisingChannelSubTypeEnum_DISPLAY_SMART_CAMPAIGN AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 8
+	// Video Outstream campaigns.
+	AdvertisingChannelSubTypeEnum_VIDEO_OUTSTREAM AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 9
+	// Video TrueView for Action campaigns.
+	AdvertisingChannelSubTypeEnum_VIDEO_ACTION AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 10
+	// Video campaigns with non-skippable video ads.
+	AdvertisingChannelSubTypeEnum_VIDEO_NON_SKIPPABLE AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 11
+	// App Campaign that allows you to easily promote your Android or iOS app
+	// across Google's top properties including Search, Play, YouTube, and the
+	// Google Display Network.
+	AdvertisingChannelSubTypeEnum_APP_CAMPAIGN AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 12
+	// App Campaign for engagement, focused on driving re-engagement with the
+	// app across several of Google’s top properties including Search, YouTube,
+	// and the Google Display Network.
+	AdvertisingChannelSubTypeEnum_APP_CAMPAIGN_FOR_ENGAGEMENT AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 13
+	// Shopping Comparison Listing campaigns.
+	AdvertisingChannelSubTypeEnum_SHOPPING_COMPARISON_LISTING_ADS AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType = 15
+)
+
+var AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "SEARCH_MOBILE_APP",
+	3:  "DISPLAY_MOBILE_APP",
+	4:  "SEARCH_EXPRESS",
+	5:  "DISPLAY_EXPRESS",
+	6:  "SHOPPING_SMART_ADS",
+	7:  "DISPLAY_GMAIL_AD",
+	8:  "DISPLAY_SMART_CAMPAIGN",
+	9:  "VIDEO_OUTSTREAM",
+	10: "VIDEO_ACTION",
+	11: "VIDEO_NON_SKIPPABLE",
+	12: "APP_CAMPAIGN",
+	13: "APP_CAMPAIGN_FOR_ENGAGEMENT",
+	15: "SHOPPING_COMPARISON_LISTING_ADS",
+}
+
+var AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType_value = map[string]int32{
+	"UNSPECIFIED":                     0,
+	"UNKNOWN":                         1,
+	"SEARCH_MOBILE_APP":               2,
+	"DISPLAY_MOBILE_APP":              3,
+	"SEARCH_EXPRESS":                  4,
+	"DISPLAY_EXPRESS":                 5,
+	"SHOPPING_SMART_ADS":              6,
+	"DISPLAY_GMAIL_AD":                7,
+	"DISPLAY_SMART_CAMPAIGN":          8,
+	"VIDEO_OUTSTREAM":                 9,
+	"VIDEO_ACTION":                    10,
+	"VIDEO_NON_SKIPPABLE":             11,
+	"APP_CAMPAIGN":                    12,
+	"APP_CAMPAIGN_FOR_ENGAGEMENT":     13,
+	"SHOPPING_COMPARISON_LISTING_ADS": 15,
+}
+
+func (x AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType) String() string {
+	return proto.EnumName(AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType_name, int32(x))
+}
+
+func (AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_007989ef93506f12, []int{0, 0}
+}
+
+// An immutable specialization of an Advertising Channel.
+type AdvertisingChannelSubTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdvertisingChannelSubTypeEnum) Reset()         { *m = AdvertisingChannelSubTypeEnum{} }
+func (m *AdvertisingChannelSubTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AdvertisingChannelSubTypeEnum) ProtoMessage()    {}
+func (*AdvertisingChannelSubTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_007989ef93506f12, []int{0}
+}
+
+func (m *AdvertisingChannelSubTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdvertisingChannelSubTypeEnum.Unmarshal(m, b)
+}
+func (m *AdvertisingChannelSubTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdvertisingChannelSubTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AdvertisingChannelSubTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdvertisingChannelSubTypeEnum.Merge(m, src)
+}
+func (m *AdvertisingChannelSubTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AdvertisingChannelSubTypeEnum.Size(m)
+}
+func (m *AdvertisingChannelSubTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdvertisingChannelSubTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdvertisingChannelSubTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType", AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType_name, AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType_value)
+	proto.RegisterType((*AdvertisingChannelSubTypeEnum)(nil), "google.ads.googleads.v3.enums.AdvertisingChannelSubTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/advertising_channel_sub_type.proto", fileDescriptor_007989ef93506f12)
+}
+
+var fileDescriptor_007989ef93506f12 = []byte{
+	// 494 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xcf, 0x6e, 0xd3, 0x40,
+	0x10, 0xc6, 0x69, 0x02, 0x2d, 0x6c, 0x0a, 0x59, 0xb6, 0x50, 0x44, 0x21, 0x54, 0x2d, 0x77, 0xfb,
+	0xe0, 0x9b, 0xb9, 0x30, 0x71, 0xb6, 0xee, 0xaa, 0xf1, 0x7a, 0xe5, 0x75, 0xc2, 0x1f, 0x45, 0x5a,
+	0x39, 0xb5, 0x65, 0x22, 0x25, 0x76, 0x94, 0x75, 0x22, 0xf5, 0x41, 0x78, 0x01, 0x8e, 0x3c, 0x0a,
+	0x8f, 0xc2, 0xb5, 0x2f, 0x80, 0x6c, 0xd7, 0x69, 0x2f, 0xe1, 0x62, 0x8d, 0xbe, 0xf9, 0xed, 0x37,
+	0x63, 0x7d, 0x83, 0x3e, 0xa7, 0x79, 0x9e, 0xce, 0x13, 0x33, 0x8a, 0xb5, 0x59, 0x97, 0x65, 0xb5,
+	0xb1, 0xcc, 0x24, 0x5b, 0x2f, 0xb4, 0x19, 0xc5, 0x9b, 0x64, 0x55, 0xcc, 0xf4, 0x2c, 0x4b, 0xd5,
+	0xf5, 0x8f, 0x28, 0xcb, 0x92, 0xb9, 0xd2, 0xeb, 0xa9, 0x2a, 0x6e, 0x96, 0x89, 0xb1, 0x5c, 0xe5,
+	0x45, 0x4e, 0x7a, 0xf5, 0x33, 0x23, 0x8a, 0xb5, 0xb1, 0x75, 0x30, 0x36, 0x96, 0x51, 0x39, 0x9c,
+	0xbc, 0x6f, 0x06, 0x2c, 0x67, 0x66, 0x94, 0x65, 0x79, 0x11, 0x15, 0xb3, 0x3c, 0xd3, 0xf5, 0xe3,
+	0xf3, 0x9f, 0x6d, 0xd4, 0x83, 0xfb, 0x19, 0x4e, 0x3d, 0x42, 0xae, 0xa7, 0xe1, 0xcd, 0x32, 0xa1,
+	0xd9, 0x7a, 0x71, 0x7e, 0xdb, 0x42, 0x6f, 0x77, 0x12, 0xa4, 0x8b, 0x3a, 0x23, 0x2e, 0x05, 0x75,
+	0xd8, 0x05, 0xa3, 0x03, 0xfc, 0x88, 0x74, 0xd0, 0xc1, 0x88, 0x5f, 0x71, 0xff, 0x0b, 0xc7, 0x7b,
+	0xe4, 0x35, 0x7a, 0x29, 0x29, 0x04, 0xce, 0xa5, 0xf2, 0xfc, 0x3e, 0x1b, 0x52, 0x05, 0x42, 0xe0,
+	0x16, 0x39, 0x46, 0x64, 0xc0, 0xa4, 0x18, 0xc2, 0xb7, 0x87, 0x7a, 0x9b, 0x10, 0xf4, 0xe2, 0x0e,
+	0xa7, 0x5f, 0x45, 0x40, 0xa5, 0xc4, 0x8f, 0xc9, 0x11, 0xea, 0x36, 0x6c, 0x23, 0x3e, 0x29, 0x0d,
+	0xe4, 0xa5, 0x2f, 0x04, 0xe3, 0xae, 0x92, 0x1e, 0x04, 0xa1, 0x82, 0x81, 0xc4, 0xfb, 0xe4, 0x15,
+	0xc2, 0x0d, 0xec, 0x7a, 0xc0, 0x86, 0x0a, 0x06, 0xf8, 0x80, 0x9c, 0xa0, 0xe3, 0x46, 0xad, 0x61,
+	0x07, 0x3c, 0x01, 0xcc, 0xe5, 0xf8, 0x69, 0x69, 0x3f, 0x66, 0x03, 0xea, 0x2b, 0x7f, 0x14, 0xca,
+	0x30, 0xa0, 0xe0, 0xe1, 0x67, 0x04, 0xa3, 0xc3, 0x5a, 0x04, 0x27, 0x64, 0x3e, 0xc7, 0x88, 0xbc,
+	0x41, 0x47, 0xb5, 0xc2, 0x7d, 0xae, 0xe4, 0x15, 0x13, 0x02, 0xfa, 0x43, 0x8a, 0x3b, 0x25, 0x0a,
+	0x42, 0xdc, 0x3b, 0x1e, 0x92, 0x53, 0xf4, 0xee, 0xa1, 0xa2, 0x2e, 0xfc, 0x40, 0x51, 0xee, 0x82,
+	0x4b, 0x3d, 0xca, 0x43, 0xfc, 0x9c, 0x7c, 0x44, 0xa7, 0xdb, 0xe5, 0x1d, 0xdf, 0x13, 0x10, 0x30,
+	0xe9, 0x73, 0x35, 0x64, 0x32, 0x2c, 0xa5, 0xf2, 0x4f, 0xba, 0xfd, 0xdb, 0x3d, 0x74, 0x76, 0x9d,
+	0x2f, 0x8c, 0xff, 0x66, 0xdb, 0xff, 0xb0, 0x33, 0x18, 0x51, 0xa6, 0x2b, 0xf6, 0xbe, 0xf7, 0xef,
+	0x0c, 0xd2, 0x7c, 0x1e, 0x65, 0xa9, 0x91, 0xaf, 0x52, 0x33, 0x4d, 0xb2, 0x2a, 0xfb, 0xe6, 0xdc,
+	0x96, 0x33, 0xbd, 0xe3, 0xfa, 0x3e, 0x55, 0xdf, 0x5f, 0xad, 0xb6, 0x0b, 0xf0, 0xbb, 0xd5, 0x73,
+	0x6b, 0x2b, 0x88, 0xb5, 0x51, 0x97, 0x65, 0x35, 0xb6, 0x8c, 0xf2, 0x4c, 0xf4, 0x9f, 0xa6, 0x3f,
+	0x81, 0x58, 0x4f, 0xb6, 0xfd, 0xc9, 0xd8, 0x9a, 0x54, 0xfd, 0xbf, 0xad, 0xb3, 0x5a, 0xb4, 0x6d,
+	0x88, 0xb5, 0x6d, 0x6f, 0x09, 0xdb, 0x1e, 0x5b, 0xb6, 0x5d, 0x31, 0xd3, 0xfd, 0x6a, 0x31, 0xeb,
+	0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xef, 0xfd, 0xc9, 0x77, 0x15, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/advertising_channel_type.pb.go b/googleapis/ads/googleads/v3/enums/advertising_channel_type.pb.go
new file mode 100644
index 0000000..b49a9de
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/advertising_channel_type.pb.go
@@ -0,0 +1,145 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/advertising_channel_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the various advertising channel types.
+type AdvertisingChannelTypeEnum_AdvertisingChannelType int32
+
+const (
+	// Not specified.
+	AdvertisingChannelTypeEnum_UNSPECIFIED AdvertisingChannelTypeEnum_AdvertisingChannelType = 0
+	// Used for return value only. Represents value unknown in this version.
+	AdvertisingChannelTypeEnum_UNKNOWN AdvertisingChannelTypeEnum_AdvertisingChannelType = 1
+	// Search Network. Includes display bundled, and Search+ campaigns.
+	AdvertisingChannelTypeEnum_SEARCH AdvertisingChannelTypeEnum_AdvertisingChannelType = 2
+	// Google Display Network only.
+	AdvertisingChannelTypeEnum_DISPLAY AdvertisingChannelTypeEnum_AdvertisingChannelType = 3
+	// Shopping campaigns serve on the shopping property
+	// and on google.com search results.
+	AdvertisingChannelTypeEnum_SHOPPING AdvertisingChannelTypeEnum_AdvertisingChannelType = 4
+	// Hotel Ads campaigns.
+	AdvertisingChannelTypeEnum_HOTEL AdvertisingChannelTypeEnum_AdvertisingChannelType = 5
+	// Video campaigns.
+	AdvertisingChannelTypeEnum_VIDEO AdvertisingChannelTypeEnum_AdvertisingChannelType = 6
+	// App Campaigns, and App Campaigns for Engagement, that run
+	// across multiple channels.
+	AdvertisingChannelTypeEnum_MULTI_CHANNEL AdvertisingChannelTypeEnum_AdvertisingChannelType = 7
+)
+
+var AdvertisingChannelTypeEnum_AdvertisingChannelType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "SEARCH",
+	3: "DISPLAY",
+	4: "SHOPPING",
+	5: "HOTEL",
+	6: "VIDEO",
+	7: "MULTI_CHANNEL",
+}
+
+var AdvertisingChannelTypeEnum_AdvertisingChannelType_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"SEARCH":        2,
+	"DISPLAY":       3,
+	"SHOPPING":      4,
+	"HOTEL":         5,
+	"VIDEO":         6,
+	"MULTI_CHANNEL": 7,
+}
+
+func (x AdvertisingChannelTypeEnum_AdvertisingChannelType) String() string {
+	return proto.EnumName(AdvertisingChannelTypeEnum_AdvertisingChannelType_name, int32(x))
+}
+
+func (AdvertisingChannelTypeEnum_AdvertisingChannelType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1a0a613438b3bd04, []int{0, 0}
+}
+
+// The channel type a campaign may target to serve on.
+type AdvertisingChannelTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdvertisingChannelTypeEnum) Reset()         { *m = AdvertisingChannelTypeEnum{} }
+func (m *AdvertisingChannelTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AdvertisingChannelTypeEnum) ProtoMessage()    {}
+func (*AdvertisingChannelTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a0a613438b3bd04, []int{0}
+}
+
+func (m *AdvertisingChannelTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdvertisingChannelTypeEnum.Unmarshal(m, b)
+}
+func (m *AdvertisingChannelTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdvertisingChannelTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AdvertisingChannelTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdvertisingChannelTypeEnum.Merge(m, src)
+}
+func (m *AdvertisingChannelTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AdvertisingChannelTypeEnum.Size(m)
+}
+func (m *AdvertisingChannelTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdvertisingChannelTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdvertisingChannelTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AdvertisingChannelTypeEnum_AdvertisingChannelType", AdvertisingChannelTypeEnum_AdvertisingChannelType_name, AdvertisingChannelTypeEnum_AdvertisingChannelType_value)
+	proto.RegisterType((*AdvertisingChannelTypeEnum)(nil), "google.ads.googleads.v3.enums.AdvertisingChannelTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/advertising_channel_type.proto", fileDescriptor_1a0a613438b3bd04)
+}
+
+var fileDescriptor_1a0a613438b3bd04 = []byte{
+	// 362 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x4e, 0x83, 0x40,
+	0x18, 0x85, 0x85, 0xda, 0x56, 0xa7, 0x1a, 0x47, 0x16, 0x2e, 0xaa, 0x5d, 0xb4, 0x07, 0x18, 0x16,
+	0xec, 0x46, 0x37, 0x53, 0x8a, 0x85, 0x88, 0x40, 0xa4, 0xc5, 0x68, 0x48, 0x1a, 0x2c, 0x04, 0x49,
+	0xda, 0x19, 0xd2, 0xa1, 0x4d, 0x7a, 0x01, 0x0f, 0x62, 0xe2, 0xc6, 0xa3, 0x78, 0x14, 0x57, 0x1e,
+	0xc1, 0xc0, 0xd8, 0xba, 0xa9, 0x6e, 0xc8, 0x0b, 0xef, 0xff, 0x5e, 0xfe, 0xff, 0x0d, 0xb8, 0x4a,
+	0x19, 0x4b, 0x67, 0x89, 0x1a, 0xc5, 0x5c, 0x15, 0xb2, 0x54, 0x2b, 0x4d, 0x4d, 0xe8, 0x72, 0xce,
+	0xd5, 0x28, 0x5e, 0x25, 0x8b, 0x22, 0xe3, 0x19, 0x4d, 0x27, 0xd3, 0xe7, 0x88, 0xd2, 0x64, 0x36,
+	0x29, 0xd6, 0x79, 0x82, 0xf2, 0x05, 0x2b, 0x98, 0xd2, 0x11, 0x08, 0x8a, 0x62, 0x8e, 0xb6, 0x34,
+	0x5a, 0x69, 0xa8, 0xa2, 0xdb, 0x17, 0x9b, 0xf0, 0x3c, 0x53, 0x23, 0x4a, 0x59, 0x11, 0x15, 0x19,
+	0xa3, 0x5c, 0xc0, 0xbd, 0x37, 0x09, 0xb4, 0xc9, 0x6f, 0xbe, 0x2e, 0xe2, 0x47, 0xeb, 0x3c, 0x31,
+	0xe8, 0x72, 0xde, 0x7b, 0x91, 0xc0, 0xd9, 0x6e, 0x5b, 0x39, 0x01, 0xad, 0xb1, 0xe3, 0x7b, 0x86,
+	0x6e, 0x5d, 0x5b, 0xc6, 0x00, 0xee, 0x29, 0x2d, 0xd0, 0x1c, 0x3b, 0x37, 0x8e, 0x7b, 0xef, 0x40,
+	0x49, 0x01, 0xa0, 0xe1, 0x1b, 0xe4, 0x4e, 0x37, 0xa1, 0x5c, 0x1a, 0x03, 0xcb, 0xf7, 0x6c, 0xf2,
+	0x00, 0x6b, 0xca, 0x11, 0x38, 0xf0, 0x4d, 0xd7, 0xf3, 0x2c, 0x67, 0x08, 0xf7, 0x95, 0x43, 0x50,
+	0x37, 0xdd, 0x91, 0x61, 0xc3, 0x7a, 0x29, 0x03, 0x6b, 0x60, 0xb8, 0xb0, 0xa1, 0x9c, 0x82, 0xe3,
+	0xdb, 0xb1, 0x3d, 0xb2, 0x26, 0xba, 0x49, 0x1c, 0xc7, 0xb0, 0x61, 0xb3, 0xff, 0x25, 0x81, 0xee,
+	0x94, 0xcd, 0xd1, 0xbf, 0xb7, 0xf6, 0xcf, 0x77, 0xef, 0xea, 0x95, 0xa7, 0x7a, 0xd2, 0x63, 0xff,
+	0x87, 0x4e, 0xd9, 0x2c, 0xa2, 0x29, 0x62, 0x8b, 0x54, 0x4d, 0x13, 0x5a, 0x15, 0xb1, 0xe9, 0x3d,
+	0xcf, 0xf8, 0x1f, 0xcf, 0x70, 0x59, 0x7d, 0x5f, 0xe5, 0xda, 0x90, 0x90, 0x77, 0xb9, 0x33, 0x14,
+	0x51, 0x24, 0xe6, 0x48, 0xc8, 0x52, 0x05, 0x1a, 0x2a, 0x6b, 0xe3, 0x1f, 0x1b, 0x3f, 0x24, 0x31,
+	0x0f, 0xb7, 0x7e, 0x18, 0x68, 0x61, 0xe5, 0x7f, 0xca, 0x5d, 0xf1, 0x13, 0x63, 0x12, 0x73, 0x8c,
+	0xb7, 0x13, 0x18, 0x07, 0x1a, 0xc6, 0xd5, 0xcc, 0x53, 0xa3, 0x5a, 0x4c, 0xfb, 0x0e, 0x00, 0x00,
+	0xff, 0xff, 0x89, 0xb4, 0xd3, 0x6e, 0x1e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/affiliate_location_feed_relationship_type.pb.go b/googleapis/ads/googleads/v3/enums/affiliate_location_feed_relationship_type.pb.go
new file mode 100644
index 0000000..f1a5d9c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/affiliate_location_feed_relationship_type.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/affiliate_location_feed_relationship_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for a relationship type for an affiliate location feed.
+type AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType int32
+
+const (
+	// Not specified.
+	AffiliateLocationFeedRelationshipTypeEnum_UNSPECIFIED AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType = 0
+	// Used for return value only. Represents value unknown in this version.
+	AffiliateLocationFeedRelationshipTypeEnum_UNKNOWN AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType = 1
+	// General retailer relationship.
+	AffiliateLocationFeedRelationshipTypeEnum_GENERAL_RETAILER AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType = 2
+)
+
+var AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "GENERAL_RETAILER",
+}
+
+var AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType_value = map[string]int32{
+	"UNSPECIFIED":      0,
+	"UNKNOWN":          1,
+	"GENERAL_RETAILER": 2,
+}
+
+func (x AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType) String() string {
+	return proto.EnumName(AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType_name, int32(x))
+}
+
+func (AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_02d1112b0969f917, []int{0, 0}
+}
+
+// Container for enum describing possible values for a relationship type for
+// an affiliate location feed.
+type AffiliateLocationFeedRelationshipTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AffiliateLocationFeedRelationshipTypeEnum) Reset() {
+	*m = AffiliateLocationFeedRelationshipTypeEnum{}
+}
+func (m *AffiliateLocationFeedRelationshipTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AffiliateLocationFeedRelationshipTypeEnum) ProtoMessage()    {}
+func (*AffiliateLocationFeedRelationshipTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_02d1112b0969f917, []int{0}
+}
+
+func (m *AffiliateLocationFeedRelationshipTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AffiliateLocationFeedRelationshipTypeEnum.Unmarshal(m, b)
+}
+func (m *AffiliateLocationFeedRelationshipTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AffiliateLocationFeedRelationshipTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AffiliateLocationFeedRelationshipTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AffiliateLocationFeedRelationshipTypeEnum.Merge(m, src)
+}
+func (m *AffiliateLocationFeedRelationshipTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AffiliateLocationFeedRelationshipTypeEnum.Size(m)
+}
+func (m *AffiliateLocationFeedRelationshipTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AffiliateLocationFeedRelationshipTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AffiliateLocationFeedRelationshipTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType", AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType_name, AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType_value)
+	proto.RegisterType((*AffiliateLocationFeedRelationshipTypeEnum)(nil), "google.ads.googleads.v3.enums.AffiliateLocationFeedRelationshipTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/affiliate_location_feed_relationship_type.proto", fileDescriptor_02d1112b0969f917)
+}
+
+var fileDescriptor_02d1112b0969f917 = []byte{
+	// 333 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0x41, 0x4b, 0xfb, 0x30,
+	0x18, 0xc6, 0xff, 0xed, 0x1f, 0x14, 0xb2, 0x83, 0xa5, 0x78, 0x12, 0x77, 0xd8, 0xc0, 0x83, 0x1e,
+	0xd2, 0x43, 0x6f, 0xf1, 0x94, 0x69, 0x36, 0x86, 0xb3, 0x8e, 0xba, 0x4d, 0xd0, 0x42, 0x89, 0x4b,
+	0x56, 0x0b, 0x5d, 0x12, 0x96, 0x6e, 0xb0, 0x6f, 0xe0, 0xe7, 0xf0, 0xe8, 0x47, 0xf1, 0xa3, 0xf8,
+	0x25, 0x94, 0x26, 0x6b, 0xf1, 0xa2, 0xec, 0x52, 0x9e, 0xe6, 0x7d, 0xf3, 0x7b, 0xde, 0xe7, 0x0d,
+	0xb8, 0xcd, 0xa4, 0xcc, 0x0a, 0x1e, 0x50, 0xa6, 0x03, 0x2b, 0x2b, 0xb5, 0x09, 0x03, 0x2e, 0xd6,
+	0x4b, 0x1d, 0xd0, 0xc5, 0x22, 0x2f, 0x72, 0x5a, 0xf2, 0xb4, 0x90, 0x73, 0x5a, 0xe6, 0x52, 0xa4,
+	0x0b, 0xce, 0x59, 0xba, 0xe2, 0x85, 0xf9, 0xd3, 0x2f, 0xb9, 0x4a, 0xcb, 0xad, 0xe2, 0x50, 0xad,
+	0x64, 0x29, 0xfd, 0xb6, 0x65, 0x40, 0xca, 0x34, 0x6c, 0x70, 0x70, 0x13, 0x42, 0x83, 0x3b, 0x39,
+	0xad, 0xdd, 0x54, 0x1e, 0x50, 0x21, 0x64, 0x69, 0x21, 0xf6, 0x72, 0xf7, 0xd5, 0x01, 0xe7, 0xb8,
+	0x36, 0x1c, 0xed, 0xfc, 0xfa, 0x9c, 0xb3, 0xf8, 0x87, 0xdb, 0x64, 0xab, 0x38, 0x11, 0xeb, 0x65,
+	0xf7, 0x09, 0x9c, 0xed, 0xd5, 0xec, 0x1f, 0x81, 0xd6, 0x34, 0xba, 0x1f, 0x93, 0xab, 0x61, 0x7f,
+	0x48, 0xae, 0xbd, 0x7f, 0x7e, 0x0b, 0x1c, 0x4e, 0xa3, 0x9b, 0xe8, 0xee, 0x21, 0xf2, 0x1c, 0xff,
+	0x18, 0x78, 0x03, 0x12, 0x91, 0x18, 0x8f, 0xd2, 0x98, 0x4c, 0xf0, 0x70, 0x44, 0x62, 0xcf, 0xed,
+	0x7d, 0x39, 0xa0, 0x33, 0x97, 0x4b, 0xf8, 0x67, 0x9c, 0xde, 0xc5, 0x5e, 0x03, 0x8c, 0xab, 0x70,
+	0x63, 0xe7, 0xb1, 0xb7, 0x83, 0x65, 0xb2, 0xa0, 0x22, 0x83, 0x72, 0x95, 0x05, 0x19, 0x17, 0x26,
+	0x7a, 0xbd, 0x7a, 0x95, 0xeb, 0x5f, 0x5e, 0xe2, 0xd2, 0x7c, 0xdf, 0xdc, 0xff, 0x03, 0x8c, 0xdf,
+	0xdd, 0xf6, 0xc0, 0xa2, 0x30, 0xd3, 0xd0, 0xca, 0x4a, 0xcd, 0x42, 0x58, 0x6d, 0x46, 0x7f, 0xd4,
+	0xf5, 0x04, 0x33, 0x9d, 0x34, 0xf5, 0x64, 0x16, 0x26, 0xa6, 0xfe, 0xe9, 0x76, 0xec, 0x21, 0x42,
+	0x98, 0x69, 0x84, 0x9a, 0x0e, 0x84, 0x66, 0x21, 0x42, 0xa6, 0xe7, 0xf9, 0xc0, 0x0c, 0x16, 0x7e,
+	0x07, 0x00, 0x00, 0xff, 0xff, 0x54, 0x92, 0xc9, 0x13, 0x21, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/affiliate_location_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/affiliate_location_placeholder_field.pb.go
new file mode 100644
index 0000000..d362c0d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/affiliate_location_placeholder_field.pb.go
@@ -0,0 +1,167 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/affiliate_location_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Affiliate Location placeholder fields.
+type AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField int32
+
+const (
+	// Not specified.
+	AffiliateLocationPlaceholderFieldEnum_UNSPECIFIED AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	AffiliateLocationPlaceholderFieldEnum_UNKNOWN AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 1
+	// Data Type: STRING. The name of the business.
+	AffiliateLocationPlaceholderFieldEnum_BUSINESS_NAME AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 2
+	// Data Type: STRING. Line 1 of the business address.
+	AffiliateLocationPlaceholderFieldEnum_ADDRESS_LINE_1 AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 3
+	// Data Type: STRING. Line 2 of the business address.
+	AffiliateLocationPlaceholderFieldEnum_ADDRESS_LINE_2 AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 4
+	// Data Type: STRING. City of the business address.
+	AffiliateLocationPlaceholderFieldEnum_CITY AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 5
+	// Data Type: STRING. Province of the business address.
+	AffiliateLocationPlaceholderFieldEnum_PROVINCE AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 6
+	// Data Type: STRING. Postal code of the business address.
+	AffiliateLocationPlaceholderFieldEnum_POSTAL_CODE AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 7
+	// Data Type: STRING. Country code of the business address.
+	AffiliateLocationPlaceholderFieldEnum_COUNTRY_CODE AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 8
+	// Data Type: STRING. Phone number of the business.
+	AffiliateLocationPlaceholderFieldEnum_PHONE_NUMBER AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 9
+	// Data Type: STRING. Language code of the business.
+	AffiliateLocationPlaceholderFieldEnum_LANGUAGE_CODE AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 10
+	// Data Type: INT64. ID of the chain.
+	AffiliateLocationPlaceholderFieldEnum_CHAIN_ID AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 11
+	// Data Type: STRING. Name of the chain.
+	AffiliateLocationPlaceholderFieldEnum_CHAIN_NAME AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField = 12
+)
+
+var AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "BUSINESS_NAME",
+	3:  "ADDRESS_LINE_1",
+	4:  "ADDRESS_LINE_2",
+	5:  "CITY",
+	6:  "PROVINCE",
+	7:  "POSTAL_CODE",
+	8:  "COUNTRY_CODE",
+	9:  "PHONE_NUMBER",
+	10: "LANGUAGE_CODE",
+	11: "CHAIN_ID",
+	12: "CHAIN_NAME",
+}
+
+var AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"BUSINESS_NAME":  2,
+	"ADDRESS_LINE_1": 3,
+	"ADDRESS_LINE_2": 4,
+	"CITY":           5,
+	"PROVINCE":       6,
+	"POSTAL_CODE":    7,
+	"COUNTRY_CODE":   8,
+	"PHONE_NUMBER":   9,
+	"LANGUAGE_CODE":  10,
+	"CHAIN_ID":       11,
+	"CHAIN_NAME":     12,
+}
+
+func (x AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField) String() string {
+	return proto.EnumName(AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField_name, int32(x))
+}
+
+func (AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_86c7ac5a51c3c22b, []int{0, 0}
+}
+
+// Values for Affiliate Location placeholder fields.
+type AffiliateLocationPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AffiliateLocationPlaceholderFieldEnum) Reset()         { *m = AffiliateLocationPlaceholderFieldEnum{} }
+func (m *AffiliateLocationPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*AffiliateLocationPlaceholderFieldEnum) ProtoMessage()    {}
+func (*AffiliateLocationPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86c7ac5a51c3c22b, []int{0}
+}
+
+func (m *AffiliateLocationPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AffiliateLocationPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *AffiliateLocationPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AffiliateLocationPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *AffiliateLocationPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AffiliateLocationPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *AffiliateLocationPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_AffiliateLocationPlaceholderFieldEnum.Size(m)
+}
+func (m *AffiliateLocationPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AffiliateLocationPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AffiliateLocationPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField", AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField_name, AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField_value)
+	proto.RegisterType((*AffiliateLocationPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.AffiliateLocationPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/affiliate_location_placeholder_field.proto", fileDescriptor_86c7ac5a51c3c22b)
+}
+
+var fileDescriptor_86c7ac5a51c3c22b = []byte{
+	// 431 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x8e, 0xd3, 0x30,
+	0x10, 0xa5, 0xd9, 0x65, 0xb7, 0xb8, 0x65, 0x31, 0x3e, 0x22, 0xf6, 0xd0, 0x95, 0xe0, 0xe8, 0x08,
+	0x72, 0x0b, 0x27, 0x27, 0xf1, 0xb6, 0x11, 0x5d, 0x27, 0x6a, 0x9a, 0xa2, 0x45, 0x95, 0x2c, 0xd3,
+	0xa4, 0x21, 0x52, 0x1a, 0x57, 0x75, 0x77, 0x3f, 0x08, 0x71, 0xe2, 0x53, 0xf8, 0x14, 0x3e, 0x01,
+	0x2e, 0xc8, 0xf6, 0xa6, 0x1c, 0x10, 0xf4, 0x12, 0xbd, 0xbc, 0x79, 0x7e, 0x6f, 0x34, 0x33, 0x60,
+	0x52, 0x49, 0x59, 0x35, 0xa5, 0x2b, 0x0a, 0xe5, 0x5a, 0xa8, 0xd1, 0xbd, 0xe7, 0x96, 0xed, 0xdd,
+	0x46, 0xb9, 0x62, 0xbd, 0xae, 0x9b, 0x5a, 0xec, 0x4b, 0xde, 0xc8, 0x95, 0xd8, 0xd7, 0xb2, 0xe5,
+	0xdb, 0x46, 0xac, 0xca, 0xcf, 0xb2, 0x29, 0xca, 0x1d, 0x5f, 0xd7, 0x65, 0x53, 0xe0, 0xed, 0x4e,
+	0xee, 0x25, 0xba, 0xb4, 0xcf, 0xb1, 0x28, 0x14, 0x3e, 0x38, 0xe1, 0x7b, 0x0f, 0x1b, 0xa7, 0x17,
+	0x2f, 0xbb, 0xa0, 0x6d, 0xed, 0x8a, 0xb6, 0x95, 0x7b, 0xe3, 0xa6, 0xec, 0xe3, 0xab, 0xaf, 0x0e,
+	0x78, 0x45, 0xba, 0xac, 0xe9, 0x43, 0x54, 0xfa, 0x27, 0xe9, 0x5a, 0x07, 0xd1, 0xf6, 0x6e, 0x73,
+	0xf5, 0xb3, 0x07, 0x46, 0x47, 0x95, 0xe8, 0x19, 0x18, 0xe4, 0x2c, 0x4b, 0x69, 0x18, 0x5f, 0xc7,
+	0x34, 0x82, 0x8f, 0xd0, 0x00, 0x9c, 0xe7, 0xec, 0x3d, 0x4b, 0x3e, 0x30, 0xd8, 0x43, 0xcf, 0xc1,
+	0xd3, 0x20, 0xcf, 0x62, 0x46, 0xb3, 0x8c, 0x33, 0x72, 0x43, 0xa1, 0x83, 0x10, 0xb8, 0x20, 0x51,
+	0x34, 0xd3, 0xcc, 0x34, 0x66, 0x94, 0xbf, 0x81, 0x27, 0x7f, 0x71, 0x6f, 0xe1, 0x29, 0xea, 0x83,
+	0xd3, 0x30, 0x9e, 0xdf, 0xc2, 0xc7, 0x68, 0x08, 0xfa, 0xe9, 0x2c, 0x59, 0xc4, 0x2c, 0xa4, 0xf0,
+	0x4c, 0x07, 0xa6, 0x49, 0x36, 0x27, 0x53, 0x1e, 0x26, 0x11, 0x85, 0xe7, 0x08, 0x82, 0x61, 0x98,
+	0xe4, 0x6c, 0x3e, 0xbb, 0xb5, 0x4c, 0x5f, 0x33, 0xe9, 0x24, 0x61, 0x94, 0xb3, 0xfc, 0x26, 0xa0,
+	0x33, 0xf8, 0x44, 0xf7, 0x31, 0x25, 0x6c, 0x9c, 0x93, 0x31, 0xb5, 0x22, 0xa0, 0x5d, 0xc3, 0x09,
+	0x89, 0x19, 0x8f, 0x23, 0x38, 0x40, 0x17, 0x00, 0xd8, 0x3f, 0xd3, 0xe5, 0x30, 0xf8, 0xd5, 0x03,
+	0xa3, 0x95, 0xdc, 0xe0, 0xff, 0x8e, 0x3a, 0x78, 0x7d, 0x74, 0x3e, 0xa9, 0x1e, 0x7a, 0xda, 0xfb,
+	0x18, 0x3c, 0x18, 0x55, 0xb2, 0x11, 0x6d, 0x85, 0xe5, 0xae, 0x72, 0xab, 0xb2, 0x35, 0x2b, 0xe9,
+	0xae, 0x61, 0x5b, 0xab, 0x7f, 0x1c, 0xc7, 0x3b, 0xf3, 0xfd, 0xe2, 0x9c, 0x8c, 0x09, 0xf9, 0xe6,
+	0x5c, 0x8e, 0xad, 0x15, 0x29, 0x14, 0xb6, 0x50, 0xa3, 0x85, 0x87, 0xf5, 0xd6, 0xd4, 0xf7, 0xae,
+	0xbe, 0x24, 0x85, 0x5a, 0x1e, 0xea, 0xcb, 0x85, 0xb7, 0x34, 0xf5, 0x1f, 0xce, 0xc8, 0x92, 0xbe,
+	0x4f, 0x0a, 0xe5, 0xfb, 0x07, 0x85, 0xef, 0x2f, 0x3c, 0xdf, 0x37, 0x9a, 0x4f, 0x67, 0xa6, 0x31,
+	0xef, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x65, 0x2c, 0xf3, 0xaf, 0xb4, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/age_range_type.pb.go b/googleapis/ads/googleads/v3/enums/age_range_type.pb.go
new file mode 100644
index 0000000..5853e7c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/age_range_type.pb.go
@@ -0,0 +1,148 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/age_range_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of demographic age ranges (e.g. between 18 and 24 years old).
+type AgeRangeTypeEnum_AgeRangeType int32
+
+const (
+	// Not specified.
+	AgeRangeTypeEnum_UNSPECIFIED AgeRangeTypeEnum_AgeRangeType = 0
+	// Used for return value only. Represents value unknown in this version.
+	AgeRangeTypeEnum_UNKNOWN AgeRangeTypeEnum_AgeRangeType = 1
+	// Between 18 and 24 years old.
+	AgeRangeTypeEnum_AGE_RANGE_18_24 AgeRangeTypeEnum_AgeRangeType = 503001
+	// Between 25 and 34 years old.
+	AgeRangeTypeEnum_AGE_RANGE_25_34 AgeRangeTypeEnum_AgeRangeType = 503002
+	// Between 35 and 44 years old.
+	AgeRangeTypeEnum_AGE_RANGE_35_44 AgeRangeTypeEnum_AgeRangeType = 503003
+	// Between 45 and 54 years old.
+	AgeRangeTypeEnum_AGE_RANGE_45_54 AgeRangeTypeEnum_AgeRangeType = 503004
+	// Between 55 and 64 years old.
+	AgeRangeTypeEnum_AGE_RANGE_55_64 AgeRangeTypeEnum_AgeRangeType = 503005
+	// 65 years old and beyond.
+	AgeRangeTypeEnum_AGE_RANGE_65_UP AgeRangeTypeEnum_AgeRangeType = 503006
+	// Undetermined age range.
+	AgeRangeTypeEnum_AGE_RANGE_UNDETERMINED AgeRangeTypeEnum_AgeRangeType = 503999
+)
+
+var AgeRangeTypeEnum_AgeRangeType_name = map[int32]string{
+	0:      "UNSPECIFIED",
+	1:      "UNKNOWN",
+	503001: "AGE_RANGE_18_24",
+	503002: "AGE_RANGE_25_34",
+	503003: "AGE_RANGE_35_44",
+	503004: "AGE_RANGE_45_54",
+	503005: "AGE_RANGE_55_64",
+	503006: "AGE_RANGE_65_UP",
+	503999: "AGE_RANGE_UNDETERMINED",
+}
+
+var AgeRangeTypeEnum_AgeRangeType_value = map[string]int32{
+	"UNSPECIFIED":            0,
+	"UNKNOWN":                1,
+	"AGE_RANGE_18_24":        503001,
+	"AGE_RANGE_25_34":        503002,
+	"AGE_RANGE_35_44":        503003,
+	"AGE_RANGE_45_54":        503004,
+	"AGE_RANGE_55_64":        503005,
+	"AGE_RANGE_65_UP":        503006,
+	"AGE_RANGE_UNDETERMINED": 503999,
+}
+
+func (x AgeRangeTypeEnum_AgeRangeType) String() string {
+	return proto.EnumName(AgeRangeTypeEnum_AgeRangeType_name, int32(x))
+}
+
+func (AgeRangeTypeEnum_AgeRangeType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c79df600b719b617, []int{0, 0}
+}
+
+// Container for enum describing the type of demographic age ranges.
+type AgeRangeTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AgeRangeTypeEnum) Reset()         { *m = AgeRangeTypeEnum{} }
+func (m *AgeRangeTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AgeRangeTypeEnum) ProtoMessage()    {}
+func (*AgeRangeTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c79df600b719b617, []int{0}
+}
+
+func (m *AgeRangeTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AgeRangeTypeEnum.Unmarshal(m, b)
+}
+func (m *AgeRangeTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AgeRangeTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AgeRangeTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AgeRangeTypeEnum.Merge(m, src)
+}
+func (m *AgeRangeTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AgeRangeTypeEnum.Size(m)
+}
+func (m *AgeRangeTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AgeRangeTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AgeRangeTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AgeRangeTypeEnum_AgeRangeType", AgeRangeTypeEnum_AgeRangeType_name, AgeRangeTypeEnum_AgeRangeType_value)
+	proto.RegisterType((*AgeRangeTypeEnum)(nil), "google.ads.googleads.v3.enums.AgeRangeTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/age_range_type.proto", fileDescriptor_c79df600b719b617)
+}
+
+var fileDescriptor_c79df600b719b617 = []byte{
+	// 378 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x4f, 0x8b, 0xd3, 0x40,
+	0x18, 0xc6, 0x4d, 0x05, 0x85, 0xa9, 0xd0, 0x31, 0xa0, 0x07, 0x69, 0x0b, 0xed, 0x07, 0x98, 0x60,
+	0x27, 0x29, 0x32, 0x9e, 0xa6, 0x76, 0x0c, 0x45, 0x8c, 0xa1, 0x36, 0x15, 0x24, 0x30, 0x44, 0x33,
+	0x0c, 0x85, 0x76, 0x26, 0x74, 0xd2, 0x42, 0xbf, 0x8e, 0x47, 0xbf, 0x84, 0x77, 0xcf, 0x5e, 0xea,
+	0x3f, 0xd8, 0xcb, 0xc2, 0xee, 0xa7, 0x58, 0x92, 0x6c, 0xbb, 0xdd, 0xc0, 0xee, 0x25, 0x3c, 0xfc,
+	0xde, 0xf7, 0x79, 0xc8, 0x3c, 0x2f, 0x18, 0x48, 0xad, 0xe5, 0x52, 0x38, 0x49, 0x6a, 0x9c, 0x4a,
+	0x16, 0x6a, 0x8b, 0x1d, 0xa1, 0x36, 0x2b, 0xe3, 0x24, 0x52, 0xf0, 0x75, 0xa2, 0xa4, 0xe0, 0xf9,
+	0x2e, 0x13, 0x28, 0x5b, 0xeb, 0x5c, 0xdb, 0x9d, 0x6a, 0x11, 0x25, 0xa9, 0x41, 0x47, 0x0f, 0xda,
+	0x62, 0x54, 0x7a, 0x5e, 0xb4, 0x0f, 0x91, 0xd9, 0xc2, 0x49, 0x94, 0xd2, 0x79, 0x92, 0x2f, 0xb4,
+	0x32, 0x95, 0xb9, 0x7f, 0x61, 0x01, 0x48, 0xa5, 0x98, 0x16, 0xa1, 0xb3, 0x5d, 0x26, 0x98, 0xda,
+	0xac, 0xfa, 0xbf, 0x2c, 0xf0, 0xe4, 0x14, 0xda, 0x2d, 0xd0, 0x8c, 0x82, 0x8f, 0x21, 0x7b, 0x33,
+	0x79, 0x3b, 0x61, 0x63, 0xf8, 0xc0, 0x6e, 0x82, 0xc7, 0x51, 0xf0, 0x2e, 0xf8, 0xf0, 0x29, 0x80,
+	0x96, 0xfd, 0x0c, 0xb4, 0xa8, 0xcf, 0xf8, 0x94, 0x06, 0x3e, 0xe3, 0x2f, 0x5f, 0xf1, 0x81, 0x0b,
+	0xf7, 0xfb, 0xee, 0x6d, 0x3c, 0xf0, 0x38, 0x76, 0xe1, 0xef, 0x3a, 0xc6, 0x1e, 0x77, 0x5d, 0xf8,
+	0xa7, 0x8e, 0x5d, 0x8f, 0x7b, 0x2e, 0xfc, 0x5b, 0xc7, 0x9e, 0xc7, 0x87, 0x2e, 0xfc, 0x57, 0xc7,
+	0x43, 0x8f, 0x47, 0x21, 0xfc, 0xbf, 0xef, 0xda, 0x6d, 0xf0, 0xfc, 0x06, 0x47, 0xc1, 0x98, 0xcd,
+	0xd8, 0xf4, 0xfd, 0x24, 0x60, 0x63, 0xf8, 0xe3, 0xac, 0x3b, 0x3a, 0xb7, 0x40, 0xef, 0xab, 0x5e,
+	0xa1, 0x7b, 0xfb, 0x1a, 0x3d, 0x3d, 0x7d, 0x79, 0x58, 0x94, 0x14, 0x5a, 0x9f, 0x47, 0xd7, 0x1e,
+	0xa9, 0x97, 0x89, 0x92, 0x48, 0xaf, 0xa5, 0x23, 0x85, 0x2a, 0x2b, 0x3c, 0xdc, 0x29, 0x5b, 0x98,
+	0x3b, 0xce, 0xf6, 0xba, 0xfc, 0x7e, 0x6b, 0x3c, 0xf4, 0x29, 0xfd, 0xde, 0xe8, 0xf8, 0x55, 0x14,
+	0x4d, 0x0d, 0xaa, 0x64, 0xa1, 0xe6, 0x18, 0x15, 0xd5, 0x9b, 0x9f, 0x87, 0x79, 0x4c, 0x53, 0x13,
+	0x1f, 0xe7, 0xf1, 0x1c, 0xc7, 0xe5, 0xfc, 0xb2, 0xd1, 0xab, 0x20, 0x21, 0x34, 0x35, 0x84, 0x1c,
+	0x37, 0x08, 0x99, 0x63, 0x42, 0xca, 0x9d, 0x2f, 0x8f, 0xca, 0x1f, 0xc3, 0x57, 0x01, 0x00, 0x00,
+	0xff, 0xff, 0x32, 0x0c, 0x38, 0x0c, 0x4e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/app_campaign_app_store.pb.go b/googleapis/ads/googleads/v3/enums/app_campaign_app_store.pb.go
new file mode 100644
index 0000000..f43fec5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/app_campaign_app_store.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/app_campaign_app_store.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing app campaign app store.
+type AppCampaignAppStoreEnum_AppCampaignAppStore int32
+
+const (
+	// Not specified.
+	AppCampaignAppStoreEnum_UNSPECIFIED AppCampaignAppStoreEnum_AppCampaignAppStore = 0
+	// Used for return value only. Represents value unknown in this version.
+	AppCampaignAppStoreEnum_UNKNOWN AppCampaignAppStoreEnum_AppCampaignAppStore = 1
+	// Apple app store.
+	AppCampaignAppStoreEnum_APPLE_APP_STORE AppCampaignAppStoreEnum_AppCampaignAppStore = 2
+	// Google play.
+	AppCampaignAppStoreEnum_GOOGLE_APP_STORE AppCampaignAppStoreEnum_AppCampaignAppStore = 3
+)
+
+var AppCampaignAppStoreEnum_AppCampaignAppStore_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "APPLE_APP_STORE",
+	3: "GOOGLE_APP_STORE",
+}
+
+var AppCampaignAppStoreEnum_AppCampaignAppStore_value = map[string]int32{
+	"UNSPECIFIED":      0,
+	"UNKNOWN":          1,
+	"APPLE_APP_STORE":  2,
+	"GOOGLE_APP_STORE": 3,
+}
+
+func (x AppCampaignAppStoreEnum_AppCampaignAppStore) String() string {
+	return proto.EnumName(AppCampaignAppStoreEnum_AppCampaignAppStore_name, int32(x))
+}
+
+func (AppCampaignAppStoreEnum_AppCampaignAppStore) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_042483d04109fcc0, []int{0, 0}
+}
+
+// The application store that distributes mobile applications.
+type AppCampaignAppStoreEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AppCampaignAppStoreEnum) Reset()         { *m = AppCampaignAppStoreEnum{} }
+func (m *AppCampaignAppStoreEnum) String() string { return proto.CompactTextString(m) }
+func (*AppCampaignAppStoreEnum) ProtoMessage()    {}
+func (*AppCampaignAppStoreEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_042483d04109fcc0, []int{0}
+}
+
+func (m *AppCampaignAppStoreEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppCampaignAppStoreEnum.Unmarshal(m, b)
+}
+func (m *AppCampaignAppStoreEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppCampaignAppStoreEnum.Marshal(b, m, deterministic)
+}
+func (m *AppCampaignAppStoreEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppCampaignAppStoreEnum.Merge(m, src)
+}
+func (m *AppCampaignAppStoreEnum) XXX_Size() int {
+	return xxx_messageInfo_AppCampaignAppStoreEnum.Size(m)
+}
+func (m *AppCampaignAppStoreEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppCampaignAppStoreEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppCampaignAppStoreEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AppCampaignAppStoreEnum_AppCampaignAppStore", AppCampaignAppStoreEnum_AppCampaignAppStore_name, AppCampaignAppStoreEnum_AppCampaignAppStore_value)
+	proto.RegisterType((*AppCampaignAppStoreEnum)(nil), "google.ads.googleads.v3.enums.AppCampaignAppStoreEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/app_campaign_app_store.proto", fileDescriptor_042483d04109fcc0)
+}
+
+var fileDescriptor_042483d04109fcc0 = []byte{
+	// 316 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xd1, 0x4a, 0xf3, 0x30,
+	0x18, 0xfd, 0xd7, 0xc1, 0x2f, 0x64, 0x17, 0x2b, 0x9d, 0xa0, 0x88, 0xbb, 0xd8, 0x1e, 0x20, 0xbd,
+	0xc8, 0x5d, 0xbc, 0xca, 0x66, 0x2d, 0x43, 0x69, 0x83, 0x73, 0x13, 0xa4, 0x58, 0xe2, 0x5a, 0x42,
+	0x61, 0x4d, 0xc2, 0xd2, 0x0d, 0x7c, 0x1d, 0x2f, 0x7d, 0x14, 0x1f, 0x45, 0xf0, 0x1d, 0x24, 0xc9,
+	0x56, 0x10, 0xa6, 0x37, 0xe1, 0xe4, 0x3b, 0xdf, 0x39, 0x9c, 0xef, 0x00, 0xcc, 0xa5, 0xe4, 0xeb,
+	0x32, 0x64, 0x85, 0x0e, 0x1d, 0x34, 0x68, 0x87, 0xc2, 0x52, 0x6c, 0x6b, 0x1d, 0x32, 0xa5, 0xf2,
+	0x15, 0xab, 0x15, 0xab, 0xb8, 0xc8, 0xcd, 0x47, 0x37, 0x72, 0x53, 0x42, 0xb5, 0x91, 0x8d, 0x0c,
+	0x86, 0x4e, 0x00, 0x59, 0xa1, 0x61, 0xab, 0x85, 0x3b, 0x04, 0xad, 0xf6, 0xe2, 0xf2, 0x60, 0xad,
+	0xaa, 0x90, 0x09, 0x21, 0x1b, 0xd6, 0x54, 0x52, 0x68, 0x27, 0x1e, 0xbf, 0x82, 0x33, 0xa2, 0xd4,
+	0x74, 0xef, 0x4d, 0x94, 0x9a, 0x1b, 0xe7, 0x48, 0x6c, 0xeb, 0xf1, 0x33, 0x18, 0x1c, 0xa1, 0x82,
+	0x3e, 0xe8, 0x2d, 0x92, 0x39, 0x8d, 0xa6, 0xb3, 0x9b, 0x59, 0x74, 0xed, 0xff, 0x0b, 0x7a, 0xe0,
+	0x64, 0x91, 0xdc, 0x26, 0xe9, 0x63, 0xe2, 0x77, 0x82, 0x01, 0xe8, 0x13, 0x4a, 0xef, 0xa2, 0x9c,
+	0x50, 0x9a, 0xcf, 0x1f, 0xd2, 0xfb, 0xc8, 0xf7, 0x82, 0x53, 0xe0, 0xc7, 0x69, 0x1a, 0xff, 0x98,
+	0x76, 0x27, 0x5f, 0x1d, 0x30, 0x5a, 0xc9, 0x1a, 0xfe, 0x19, 0x7f, 0x72, 0x7e, 0x24, 0x03, 0x35,
+	0xd1, 0x69, 0xe7, 0x69, 0xb2, 0x97, 0x72, 0xb9, 0x66, 0x82, 0x43, 0xb9, 0xe1, 0x21, 0x2f, 0x85,
+	0x3d, 0xec, 0xd0, 0xa2, 0xaa, 0xf4, 0x2f, 0xa5, 0x5e, 0xd9, 0xf7, 0xcd, 0xeb, 0xc6, 0x84, 0xbc,
+	0x7b, 0xc3, 0xd8, 0x59, 0x91, 0x42, 0x43, 0x07, 0x0d, 0x5a, 0x22, 0x68, 0xaa, 0xd0, 0x1f, 0x07,
+	0x3e, 0x23, 0x85, 0xce, 0x5a, 0x3e, 0x5b, 0xa2, 0xcc, 0xf2, 0x9f, 0xde, 0xc8, 0x0d, 0x31, 0x26,
+	0x85, 0xc6, 0xb8, 0xdd, 0xc0, 0x78, 0x89, 0x30, 0xb6, 0x3b, 0x2f, 0xff, 0x6d, 0x30, 0xf4, 0x1d,
+	0x00, 0x00, 0xff, 0xff, 0x67, 0xd2, 0x06, 0xf6, 0xec, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/app_campaign_bidding_strategy_goal_type.pb.go b/googleapis/ads/googleads/v3/enums/app_campaign_bidding_strategy_goal_type.pb.go
new file mode 100644
index 0000000..06e0f84
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/app_campaign_bidding_strategy_goal_type.pb.go
@@ -0,0 +1,148 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/app_campaign_bidding_strategy_goal_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Goal type of App campaign BiddingStrategy.
+type AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType int32
+
+const (
+	// Not specified.
+	AppCampaignBiddingStrategyGoalTypeEnum_UNSPECIFIED AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 0
+	// Used for return value only. Represents value unknown in this version.
+	AppCampaignBiddingStrategyGoalTypeEnum_UNKNOWN AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 1
+	// Aim to maximize the number of app installs. The cpa bid is the
+	// target cost per install.
+	AppCampaignBiddingStrategyGoalTypeEnum_OPTIMIZE_INSTALLS_TARGET_INSTALL_COST AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 2
+	// Aim to maximize the long term number of selected in-app conversions from
+	// app installs. The cpa bid is the target cost per install.
+	AppCampaignBiddingStrategyGoalTypeEnum_OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 3
+	// Aim to maximize the long term number of selected in-app conversions from
+	// app installs. The cpa bid is the target cost per in-app conversion. Note
+	// that the actual cpa may seem higher than the target cpa at first, since
+	// the long term conversions haven’t happened yet.
+	AppCampaignBiddingStrategyGoalTypeEnum_OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 4
+	// Aim to maximize all conversions' value, i.e. install + selected in-app
+	// conversions while achieving or exceeding target return on advertising
+	// spend.
+	AppCampaignBiddingStrategyGoalTypeEnum_OPTIMIZE_RETURN_ON_ADVERTISING_SPEND AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType = 5
+)
+
+var AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "OPTIMIZE_INSTALLS_TARGET_INSTALL_COST",
+	3: "OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST",
+	4: "OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST",
+	5: "OPTIMIZE_RETURN_ON_ADVERTISING_SPEND",
+}
+
+var AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType_value = map[string]int32{
+	"UNSPECIFIED":                           0,
+	"UNKNOWN":                               1,
+	"OPTIMIZE_INSTALLS_TARGET_INSTALL_COST": 2,
+	"OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST":    3,
+	"OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST": 4,
+	"OPTIMIZE_RETURN_ON_ADVERTISING_SPEND":               5,
+}
+
+func (x AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType) String() string {
+	return proto.EnumName(AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType_name, int32(x))
+}
+
+func (AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e9151c8d2d13e16b, []int{0, 0}
+}
+
+// Container for enum describing goal towards which the bidding strategy of an
+// app campaign should optimize for.
+type AppCampaignBiddingStrategyGoalTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AppCampaignBiddingStrategyGoalTypeEnum) Reset() {
+	*m = AppCampaignBiddingStrategyGoalTypeEnum{}
+}
+func (m *AppCampaignBiddingStrategyGoalTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AppCampaignBiddingStrategyGoalTypeEnum) ProtoMessage()    {}
+func (*AppCampaignBiddingStrategyGoalTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e9151c8d2d13e16b, []int{0}
+}
+
+func (m *AppCampaignBiddingStrategyGoalTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppCampaignBiddingStrategyGoalTypeEnum.Unmarshal(m, b)
+}
+func (m *AppCampaignBiddingStrategyGoalTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppCampaignBiddingStrategyGoalTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AppCampaignBiddingStrategyGoalTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppCampaignBiddingStrategyGoalTypeEnum.Merge(m, src)
+}
+func (m *AppCampaignBiddingStrategyGoalTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AppCampaignBiddingStrategyGoalTypeEnum.Size(m)
+}
+func (m *AppCampaignBiddingStrategyGoalTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppCampaignBiddingStrategyGoalTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppCampaignBiddingStrategyGoalTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType", AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType_name, AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType_value)
+	proto.RegisterType((*AppCampaignBiddingStrategyGoalTypeEnum)(nil), "google.ads.googleads.v3.enums.AppCampaignBiddingStrategyGoalTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/app_campaign_bidding_strategy_goal_type.proto", fileDescriptor_e9151c8d2d13e16b)
+}
+
+var fileDescriptor_e9151c8d2d13e16b = []byte{
+	// 411 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0xcd, 0x8a, 0xdb, 0x30,
+	0x10, 0x6e, 0xbc, 0xfd, 0x01, 0xed, 0xa1, 0xc1, 0xc7, 0xd2, 0x3d, 0x6c, 0xe8, 0xef, 0x45, 0x86,
+	0x1a, 0x7a, 0x50, 0x4f, 0x4a, 0xa2, 0x1a, 0xb1, 0x5b, 0xd9, 0x58, 0x8a, 0x0b, 0x4b, 0x40, 0x68,
+	0xd7, 0x46, 0x18, 0x12, 0x49, 0x44, 0xde, 0x85, 0xdc, 0xfb, 0x24, 0x3d, 0xf6, 0xd2, 0xf7, 0xe8,
+	0xa3, 0xf4, 0x19, 0x7a, 0x28, 0xb1, 0x12, 0xb7, 0x87, 0xb6, 0xe9, 0xc5, 0x7c, 0x9e, 0xf9, 0x7e,
+	0xc4, 0xcc, 0x80, 0x0b, 0x6d, 0xad, 0x5e, 0x35, 0x89, 0xaa, 0x7d, 0x12, 0xe0, 0x0e, 0xdd, 0xa5,
+	0x49, 0x63, 0x6e, 0xd7, 0x3e, 0x51, 0xce, 0xc9, 0x1b, 0xb5, 0x76, 0xaa, 0xd5, 0x46, 0x5e, 0xb7,
+	0x75, 0xdd, 0x1a, 0x2d, 0x7d, 0xb7, 0x51, 0x5d, 0xa3, 0xb7, 0x52, 0x5b, 0xb5, 0x92, 0xdd, 0xd6,
+	0x35, 0xd0, 0x6d, 0x6c, 0x67, 0xe3, 0xb3, 0xe0, 0x00, 0x55, 0xed, 0xe1, 0x60, 0x06, 0xef, 0x52,
+	0xd8, 0x9b, 0x3d, 0x79, 0x7a, 0xc8, 0x72, 0x6d, 0xa2, 0x8c, 0xb1, 0x9d, 0xea, 0x5a, 0x6b, 0x7c,
+	0x10, 0x4f, 0xbe, 0x46, 0xe0, 0x05, 0x76, 0x6e, 0xb6, 0x4f, 0x9b, 0x86, 0x30, 0xbe, 0xcf, 0xca,
+	0xac, 0x5a, 0x89, 0xad, 0x6b, 0x88, 0xb9, 0x5d, 0x4f, 0x3e, 0x45, 0x60, 0x72, 0x9c, 0x1a, 0x3f,
+	0x06, 0xa7, 0x0b, 0xc6, 0x0b, 0x32, 0xa3, 0xef, 0x29, 0x99, 0x8f, 0xef, 0xc5, 0xa7, 0xe0, 0xd1,
+	0x82, 0x5d, 0xb0, 0xfc, 0x23, 0x1b, 0x8f, 0xe2, 0xd7, 0xe0, 0x79, 0x5e, 0x08, 0xfa, 0x81, 0x5e,
+	0x11, 0x49, 0x19, 0x17, 0xf8, 0xf2, 0x92, 0x4b, 0x81, 0xcb, 0x8c, 0x88, 0xc3, 0xbf, 0x9c, 0xe5,
+	0x5c, 0x8c, 0xa3, 0x38, 0x05, 0xc9, 0x6f, 0x54, 0x89, 0x8b, 0x42, 0xce, 0x72, 0x56, 0x91, 0x92,
+	0xd3, 0x9c, 0xfd, 0x59, 0x74, 0x12, 0xbf, 0x05, 0x6f, 0xfe, 0x43, 0xf4, 0xab, 0x14, 0x74, 0xf7,
+	0xe3, 0x57, 0xe0, 0xd9, 0xa0, 0x2b, 0x89, 0x58, 0x94, 0x4c, 0xe6, 0x4c, 0xe2, 0x79, 0x45, 0x4a,
+	0x41, 0x39, 0x65, 0x99, 0xe4, 0x05, 0x61, 0xf3, 0xf1, 0x83, 0xe9, 0x8f, 0x11, 0x38, 0xbf, 0xb1,
+	0x6b, 0xf8, 0xcf, 0xa9, 0x4f, 0x5f, 0x1e, 0x9f, 0x54, 0xb1, 0x5b, 0x40, 0x31, 0xba, 0x9a, 0xee,
+	0x9d, 0xb4, 0x5d, 0x29, 0xa3, 0xa1, 0xdd, 0xe8, 0x44, 0x37, 0xa6, 0x5f, 0xcf, 0xe1, 0x38, 0x5c,
+	0xeb, 0xff, 0x72, 0x2b, 0xef, 0xfa, 0xef, 0xe7, 0xe8, 0x24, 0xc3, 0xf8, 0x4b, 0x74, 0x96, 0x05,
+	0x2b, 0x5c, 0x7b, 0x18, 0xe0, 0x0e, 0x55, 0x29, 0xdc, 0x2d, 0xd0, 0x7f, 0x3b, 0xf4, 0x97, 0xb8,
+	0xf6, 0xcb, 0xa1, 0xbf, 0xac, 0xd2, 0x65, 0xdf, 0xff, 0x1e, 0x9d, 0x87, 0x22, 0x42, 0xb8, 0xf6,
+	0x08, 0x0d, 0x0c, 0x84, 0xaa, 0x14, 0xa1, 0x9e, 0x73, 0xfd, 0xb0, 0x7f, 0x58, 0xfa, 0x33, 0x00,
+	0x00, 0xff, 0xff, 0x7e, 0x89, 0xee, 0x47, 0xc3, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/app_payment_model_type.pb.go b/googleapis/ads/googleads/v3/enums/app_payment_model_type.pb.go
new file mode 100644
index 0000000..4b7e632
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/app_payment_model_type.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/app_payment_model_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible app payment models.
+type AppPaymentModelTypeEnum_AppPaymentModelType int32
+
+const (
+	// Not specified.
+	AppPaymentModelTypeEnum_UNSPECIFIED AppPaymentModelTypeEnum_AppPaymentModelType = 0
+	// Used for return value only. Represents value unknown in this version.
+	AppPaymentModelTypeEnum_UNKNOWN AppPaymentModelTypeEnum_AppPaymentModelType = 1
+	// Represents paid-for apps.
+	AppPaymentModelTypeEnum_PAID AppPaymentModelTypeEnum_AppPaymentModelType = 30
+)
+
+var AppPaymentModelTypeEnum_AppPaymentModelType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	30: "PAID",
+}
+
+var AppPaymentModelTypeEnum_AppPaymentModelType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"PAID":        30,
+}
+
+func (x AppPaymentModelTypeEnum_AppPaymentModelType) String() string {
+	return proto.EnumName(AppPaymentModelTypeEnum_AppPaymentModelType_name, int32(x))
+}
+
+func (AppPaymentModelTypeEnum_AppPaymentModelType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d3e62b72aff6b996, []int{0, 0}
+}
+
+// Represents a criterion for targeting paid apps.
+type AppPaymentModelTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AppPaymentModelTypeEnum) Reset()         { *m = AppPaymentModelTypeEnum{} }
+func (m *AppPaymentModelTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AppPaymentModelTypeEnum) ProtoMessage()    {}
+func (*AppPaymentModelTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d3e62b72aff6b996, []int{0}
+}
+
+func (m *AppPaymentModelTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppPaymentModelTypeEnum.Unmarshal(m, b)
+}
+func (m *AppPaymentModelTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppPaymentModelTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AppPaymentModelTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppPaymentModelTypeEnum.Merge(m, src)
+}
+func (m *AppPaymentModelTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AppPaymentModelTypeEnum.Size(m)
+}
+func (m *AppPaymentModelTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppPaymentModelTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppPaymentModelTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AppPaymentModelTypeEnum_AppPaymentModelType", AppPaymentModelTypeEnum_AppPaymentModelType_name, AppPaymentModelTypeEnum_AppPaymentModelType_value)
+	proto.RegisterType((*AppPaymentModelTypeEnum)(nil), "google.ads.googleads.v3.enums.AppPaymentModelTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/app_payment_model_type.proto", fileDescriptor_d3e62b72aff6b996)
+}
+
+var fileDescriptor_d3e62b72aff6b996 = []byte{
+	// 300 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0xdd, 0x14, 0x95, 0xec, 0xe0, 0xa8, 0x07, 0x45, 0x9c, 0xb0, 0x3d, 0x40, 0x72, 0xc8,
+	0x2d, 0xe2, 0x21, 0x73, 0x73, 0x14, 0xb1, 0x16, 0x74, 0x55, 0xa4, 0x50, 0xa2, 0x09, 0xa1, 0xd0,
+	0x26, 0x61, 0xe9, 0x06, 0x7d, 0x1d, 0x8f, 0x3e, 0x8a, 0x8f, 0x22, 0xf8, 0x0e, 0xd2, 0xc4, 0xf6,
+	0x34, 0xbd, 0x84, 0x8f, 0x7c, 0xff, 0xdf, 0x97, 0x2f, 0x7f, 0x40, 0xa4, 0xd6, 0xb2, 0x10, 0x88,
+	0x71, 0x8b, 0xbc, 0x6c, 0xd4, 0x06, 0x23, 0xa1, 0xd6, 0xa5, 0x45, 0xcc, 0x98, 0xcc, 0xb0, 0xba,
+	0x14, 0xaa, 0xca, 0x4a, 0xcd, 0x45, 0x91, 0x55, 0xb5, 0x11, 0xd0, 0xac, 0x74, 0xa5, 0x83, 0x91,
+	0x07, 0x20, 0xe3, 0x16, 0x76, 0x2c, 0xdc, 0x60, 0xe8, 0xd8, 0xb3, 0xf3, 0x36, 0xda, 0xe4, 0x88,
+	0x29, 0xa5, 0x2b, 0x56, 0xe5, 0x5a, 0x59, 0x0f, 0x4f, 0x9e, 0xc1, 0x09, 0x35, 0x26, 0xf6, 0xd9,
+	0x77, 0x4d, 0xf4, 0x63, 0x6d, 0xc4, 0x5c, 0xad, 0xcb, 0xc9, 0x15, 0x38, 0xde, 0x62, 0x05, 0x47,
+	0x60, 0xb0, 0x8c, 0x1e, 0xe2, 0xf9, 0x75, 0x78, 0x13, 0xce, 0x67, 0xc3, 0x9d, 0x60, 0x00, 0x0e,
+	0x96, 0xd1, 0x6d, 0x74, 0xff, 0x14, 0x0d, 0x7b, 0xc1, 0x21, 0xd8, 0x8b, 0x69, 0x38, 0x1b, 0x5e,
+	0x4c, 0xbf, 0x7b, 0x60, 0xfc, 0xa6, 0x4b, 0xf8, 0x6f, 0xbb, 0xe9, 0xe9, 0x96, 0x27, 0xe2, 0xa6,
+	0x59, 0xdc, 0x7b, 0x99, 0xfe, 0xa2, 0x52, 0x17, 0x4c, 0x49, 0xa8, 0x57, 0x12, 0x49, 0xa1, 0x5c,
+	0xef, 0x76, 0x49, 0x26, 0xb7, 0x7f, 0xec, 0xec, 0xd2, 0x9d, 0xef, 0xfd, 0xdd, 0x05, 0xa5, 0x1f,
+	0xfd, 0xd1, 0xc2, 0x47, 0x51, 0x6e, 0xa1, 0x97, 0x8d, 0x4a, 0x30, 0x6c, 0x7e, 0x6a, 0x3f, 0x5b,
+	0x3f, 0xa5, 0xdc, 0xa6, 0x9d, 0x9f, 0x26, 0x38, 0x75, 0xfe, 0x57, 0x7f, 0xec, 0x2f, 0x09, 0xa1,
+	0xdc, 0x12, 0xd2, 0x4d, 0x10, 0x92, 0x60, 0x42, 0xdc, 0xcc, 0xeb, 0xbe, 0x2b, 0x86, 0x7f, 0x02,
+	0x00, 0x00, 0xff, 0xff, 0xf0, 0x46, 0x27, 0xe2, 0xcb, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/app_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/app_placeholder_field.pb.go
new file mode 100644
index 0000000..e6c0011
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/app_placeholder_field.pb.go
@@ -0,0 +1,159 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/app_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for App placeholder fields.
+type AppPlaceholderFieldEnum_AppPlaceholderField int32
+
+const (
+	// Not specified.
+	AppPlaceholderFieldEnum_UNSPECIFIED AppPlaceholderFieldEnum_AppPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	AppPlaceholderFieldEnum_UNKNOWN AppPlaceholderFieldEnum_AppPlaceholderField = 1
+	// Data Type: INT64. The application store that the target application
+	// belongs to. Valid values are: 1 = Apple iTunes Store; 2 = Google Play
+	// Store.
+	AppPlaceholderFieldEnum_STORE AppPlaceholderFieldEnum_AppPlaceholderField = 2
+	// Data Type: STRING. The store-specific ID for the target application.
+	AppPlaceholderFieldEnum_ID AppPlaceholderFieldEnum_AppPlaceholderField = 3
+	// Data Type: STRING. The visible text displayed when the link is rendered
+	// in an ad.
+	AppPlaceholderFieldEnum_LINK_TEXT AppPlaceholderFieldEnum_AppPlaceholderField = 4
+	// Data Type: STRING. The destination URL of the in-app link.
+	AppPlaceholderFieldEnum_URL AppPlaceholderFieldEnum_AppPlaceholderField = 5
+	// Data Type: URL_LIST. Final URLs for the in-app link when using Upgraded
+	// URLs.
+	AppPlaceholderFieldEnum_FINAL_URLS AppPlaceholderFieldEnum_AppPlaceholderField = 6
+	// Data Type: URL_LIST. Final Mobile URLs for the in-app link when using
+	// Upgraded URLs.
+	AppPlaceholderFieldEnum_FINAL_MOBILE_URLS AppPlaceholderFieldEnum_AppPlaceholderField = 7
+	// Data Type: URL. Tracking template for the in-app link when using Upgraded
+	// URLs.
+	AppPlaceholderFieldEnum_TRACKING_URL AppPlaceholderFieldEnum_AppPlaceholderField = 8
+	// Data Type: STRING. Final URL suffix for the in-app link when using
+	// parallel tracking.
+	AppPlaceholderFieldEnum_FINAL_URL_SUFFIX AppPlaceholderFieldEnum_AppPlaceholderField = 9
+)
+
+var AppPlaceholderFieldEnum_AppPlaceholderField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "STORE",
+	3: "ID",
+	4: "LINK_TEXT",
+	5: "URL",
+	6: "FINAL_URLS",
+	7: "FINAL_MOBILE_URLS",
+	8: "TRACKING_URL",
+	9: "FINAL_URL_SUFFIX",
+}
+
+var AppPlaceholderFieldEnum_AppPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":       0,
+	"UNKNOWN":           1,
+	"STORE":             2,
+	"ID":                3,
+	"LINK_TEXT":         4,
+	"URL":               5,
+	"FINAL_URLS":        6,
+	"FINAL_MOBILE_URLS": 7,
+	"TRACKING_URL":      8,
+	"FINAL_URL_SUFFIX":  9,
+}
+
+func (x AppPlaceholderFieldEnum_AppPlaceholderField) String() string {
+	return proto.EnumName(AppPlaceholderFieldEnum_AppPlaceholderField_name, int32(x))
+}
+
+func (AppPlaceholderFieldEnum_AppPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_60a611ef024f5427, []int{0, 0}
+}
+
+// Values for App placeholder fields.
+type AppPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AppPlaceholderFieldEnum) Reset()         { *m = AppPlaceholderFieldEnum{} }
+func (m *AppPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*AppPlaceholderFieldEnum) ProtoMessage()    {}
+func (*AppPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_60a611ef024f5427, []int{0}
+}
+
+func (m *AppPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *AppPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *AppPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *AppPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_AppPlaceholderFieldEnum.Size(m)
+}
+func (m *AppPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AppPlaceholderFieldEnum_AppPlaceholderField", AppPlaceholderFieldEnum_AppPlaceholderField_name, AppPlaceholderFieldEnum_AppPlaceholderField_value)
+	proto.RegisterType((*AppPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.AppPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/app_placeholder_field.proto", fileDescriptor_60a611ef024f5427)
+}
+
+var fileDescriptor_60a611ef024f5427 = []byte{
+	// 382 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xdd, 0xce, 0x93, 0x30,
+	0x18, 0x16, 0xe6, 0xb7, 0xb9, 0x7e, 0xfe, 0xd4, 0xaa, 0xd1, 0x18, 0x77, 0xb0, 0x5d, 0x40, 0x39,
+	0xe0, 0xc8, 0x7a, 0x54, 0x36, 0x58, 0x9a, 0x21, 0x23, 0xfc, 0xcc, 0xc5, 0x90, 0x10, 0x1c, 0x88,
+	0x24, 0x8c, 0x36, 0xeb, 0xb6, 0x0b, 0xf2, 0xd0, 0xc4, 0x0b, 0xd1, 0x4b, 0x31, 0xf1, 0x1e, 0x0c,
+	0xd4, 0xe1, 0xc9, 0xfc, 0x4e, 0x9a, 0xa7, 0xef, 0xf3, 0x93, 0xf6, 0x79, 0xc1, 0xdb, 0x92, 0xf3,
+	0xb2, 0x2e, 0x8c, 0x2c, 0x97, 0x86, 0x82, 0x2d, 0x3a, 0x9b, 0x46, 0xd1, 0x9c, 0xf6, 0xd2, 0xc8,
+	0x84, 0x48, 0x45, 0x9d, 0xed, 0x8a, 0x2f, 0xbc, 0xce, 0x8b, 0x43, 0xfa, 0xb9, 0x2a, 0xea, 0x1c,
+	0x8b, 0x03, 0x3f, 0x72, 0x34, 0x51, 0x7a, 0x9c, 0xe5, 0x12, 0xf7, 0x56, 0x7c, 0x36, 0x71, 0x67,
+	0x7d, 0xfd, 0xe6, 0x92, 0x2c, 0x2a, 0x23, 0x6b, 0x1a, 0x7e, 0xcc, 0x8e, 0x15, 0x6f, 0xa4, 0x32,
+	0xcf, 0x7e, 0x68, 0xe0, 0x25, 0x15, 0xc2, 0xff, 0x97, 0xed, 0xb4, 0xd1, 0x76, 0x73, 0xda, 0xcf,
+	0xbe, 0x6b, 0xe0, 0xd9, 0x15, 0x0e, 0x3d, 0x01, 0xb7, 0xb1, 0x17, 0xfa, 0xf6, 0x9c, 0x39, 0xcc,
+	0x5e, 0xc0, 0x7b, 0xe8, 0x16, 0x8c, 0x62, 0x6f, 0xe5, 0xad, 0x3f, 0x78, 0x50, 0x43, 0x63, 0x70,
+	0x13, 0x46, 0xeb, 0xc0, 0x86, 0x3a, 0x1a, 0x02, 0x9d, 0x2d, 0xe0, 0x00, 0x3d, 0x02, 0x63, 0x97,
+	0x79, 0xab, 0x34, 0xb2, 0xb7, 0x11, 0xbc, 0x8f, 0x46, 0x60, 0x10, 0x07, 0x2e, 0xbc, 0x41, 0x8f,
+	0x01, 0x70, 0x98, 0x47, 0xdd, 0x34, 0x0e, 0xdc, 0x10, 0x0e, 0xd1, 0x0b, 0xf0, 0x54, 0xdd, 0xdf,
+	0xaf, 0x2d, 0xe6, 0xda, 0x6a, 0x3c, 0x42, 0x10, 0x3c, 0x8c, 0x02, 0x3a, 0x5f, 0x31, 0x6f, 0xd9,
+	0x8e, 0xe0, 0x03, 0xf4, 0x1c, 0xc0, 0xde, 0x98, 0x86, 0xb1, 0xe3, 0xb0, 0x2d, 0x1c, 0x5b, 0xbf,
+	0x35, 0x30, 0xdd, 0xf1, 0x3d, 0xbe, 0xb3, 0x0f, 0xeb, 0xd5, 0x95, 0x2f, 0xf9, 0x6d, 0x17, 0xbe,
+	0xf6, 0xd1, 0xfa, 0x6b, 0x2d, 0x79, 0x9d, 0x35, 0x25, 0xe6, 0x87, 0xd2, 0x28, 0x8b, 0xa6, 0x6b,
+	0xea, 0xb2, 0x15, 0x51, 0xc9, 0xff, 0x2c, 0xe9, 0x5d, 0x77, 0x7e, 0xd5, 0x07, 0x4b, 0x4a, 0xbf,
+	0xe9, 0x93, 0xa5, 0x8a, 0xa2, 0xb9, 0xc4, 0x0a, 0xb6, 0x68, 0x63, 0xe2, 0xb6, 0x5a, 0xf9, 0xf3,
+	0xc2, 0x27, 0x34, 0x97, 0x49, 0xcf, 0x27, 0x1b, 0x33, 0xe9, 0xf8, 0x5f, 0xfa, 0x54, 0x0d, 0x09,
+	0xa1, 0xb9, 0x24, 0xa4, 0x57, 0x10, 0xb2, 0x31, 0x09, 0xe9, 0x34, 0x9f, 0x86, 0xdd, 0xc3, 0xcc,
+	0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xe8, 0xae, 0xdb, 0x3c, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/app_store.pb.go b/googleapis/ads/googleads/v3/enums/app_store.pb.go
new file mode 100644
index 0000000..cb49829
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/app_store.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/app_store.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// App store type in an app extension.
+type AppStoreEnum_AppStore int32
+
+const (
+	// Not specified.
+	AppStoreEnum_UNSPECIFIED AppStoreEnum_AppStore = 0
+	// Used for return value only. Represents value unknown in this version.
+	AppStoreEnum_UNKNOWN AppStoreEnum_AppStore = 1
+	// Apple iTunes.
+	AppStoreEnum_APPLE_ITUNES AppStoreEnum_AppStore = 2
+	// Google Play.
+	AppStoreEnum_GOOGLE_PLAY AppStoreEnum_AppStore = 3
+)
+
+var AppStoreEnum_AppStore_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "APPLE_ITUNES",
+	3: "GOOGLE_PLAY",
+}
+
+var AppStoreEnum_AppStore_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"APPLE_ITUNES": 2,
+	"GOOGLE_PLAY":  3,
+}
+
+func (x AppStoreEnum_AppStore) String() string {
+	return proto.EnumName(AppStoreEnum_AppStore_name, int32(x))
+}
+
+func (AppStoreEnum_AppStore) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fa65b602be71fce1, []int{0, 0}
+}
+
+// Container for enum describing app store type in an app extension.
+type AppStoreEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AppStoreEnum) Reset()         { *m = AppStoreEnum{} }
+func (m *AppStoreEnum) String() string { return proto.CompactTextString(m) }
+func (*AppStoreEnum) ProtoMessage()    {}
+func (*AppStoreEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fa65b602be71fce1, []int{0}
+}
+
+func (m *AppStoreEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppStoreEnum.Unmarshal(m, b)
+}
+func (m *AppStoreEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppStoreEnum.Marshal(b, m, deterministic)
+}
+func (m *AppStoreEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppStoreEnum.Merge(m, src)
+}
+func (m *AppStoreEnum) XXX_Size() int {
+	return xxx_messageInfo_AppStoreEnum.Size(m)
+}
+func (m *AppStoreEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppStoreEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppStoreEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AppStoreEnum_AppStore", AppStoreEnum_AppStore_name, AppStoreEnum_AppStore_value)
+	proto.RegisterType((*AppStoreEnum)(nil), "google.ads.googleads.v3.enums.AppStoreEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/app_store.proto", fileDescriptor_fa65b602be71fce1)
+}
+
+var fileDescriptor_fa65b602be71fce1 = []byte{
+	// 300 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4f, 0xf3, 0x20,
+	0x1c, 0xc6, 0xdf, 0x75, 0xc9, 0xab, 0x61, 0x33, 0x36, 0x3d, 0x1a, 0x77, 0xd8, 0xee, 0xc2, 0x81,
+	0x1b, 0x9e, 0x98, 0x62, 0xb3, 0x6c, 0xe9, 0x48, 0xe6, 0x66, 0xd4, 0x26, 0x0b, 0xda, 0x86, 0x2c,
+	0x59, 0x81, 0x94, 0x6e, 0x1f, 0xc8, 0xa3, 0x1f, 0xc5, 0x8f, 0xe1, 0xd1, 0x4f, 0x61, 0x00, 0xdb,
+	0x9b, 0x5e, 0xc8, 0x03, 0xcf, 0x8f, 0x87, 0x87, 0x3f, 0xb8, 0x92, 0x5a, 0xcb, 0x7d, 0x89, 0x44,
+	0x61, 0x51, 0x90, 0x4e, 0x1d, 0x31, 0x2a, 0xd5, 0xa1, 0xb2, 0x48, 0x18, 0xb3, 0xb5, 0x8d, 0xae,
+	0x4b, 0x68, 0x6a, 0xdd, 0xe8, 0x64, 0x14, 0x18, 0x28, 0x0a, 0x0b, 0x3b, 0x1c, 0x1e, 0x31, 0xf4,
+	0xf8, 0xc5, 0x65, 0x9b, 0x66, 0x76, 0x48, 0x28, 0xa5, 0x1b, 0xd1, 0xec, 0xb4, 0xb2, 0xe1, 0xf2,
+	0xe4, 0x19, 0x0c, 0xa9, 0x31, 0x2b, 0x17, 0xc7, 0xd4, 0xa1, 0x9a, 0xcc, 0xc1, 0x69, 0xbb, 0x4f,
+	0xce, 0xc1, 0x60, 0x9d, 0xad, 0x38, 0xbb, 0x99, 0xdd, 0xcd, 0xd8, 0x6d, 0xfc, 0x2f, 0x19, 0x80,
+	0x93, 0x75, 0x36, 0xcf, 0x96, 0x0f, 0x59, 0xdc, 0x4b, 0x62, 0x30, 0xa4, 0x9c, 0x2f, 0xd8, 0x76,
+	0x76, 0xbf, 0xce, 0xd8, 0x2a, 0x8e, 0x1c, 0x9f, 0x2e, 0x97, 0xe9, 0x82, 0x6d, 0xf9, 0x82, 0x3e,
+	0xc6, 0xfd, 0xe9, 0x67, 0x0f, 0x8c, 0x5f, 0x75, 0x05, 0xff, 0x2c, 0x38, 0x3d, 0x6b, 0x1f, 0xe4,
+	0xae, 0x11, 0xef, 0x3d, 0x4d, 0x7f, 0x78, 0xa9, 0xf7, 0x42, 0x49, 0xa8, 0x6b, 0x89, 0x64, 0xa9,
+	0x7c, 0xdf, 0x76, 0x1e, 0x66, 0x67, 0x7f, 0x19, 0xcf, 0xb5, 0x5f, 0xdf, 0xa2, 0x7e, 0x4a, 0xe9,
+	0x7b, 0x34, 0x4a, 0x43, 0x14, 0x2d, 0x2c, 0x0c, 0xd2, 0xa9, 0x0d, 0x86, 0xee, 0xb3, 0xf6, 0xa3,
+	0xf5, 0x73, 0x5a, 0xd8, 0xbc, 0xf3, 0xf3, 0x0d, 0xce, 0xbd, 0xff, 0x15, 0x8d, 0xc3, 0x21, 0x21,
+	0xb4, 0xb0, 0x84, 0x74, 0x04, 0x21, 0x1b, 0x4c, 0x88, 0x67, 0x5e, 0xfe, 0xfb, 0x62, 0xf8, 0x3b,
+	0x00, 0x00, 0xff, 0xff, 0x25, 0xe8, 0xdf, 0x59, 0xb6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/app_url_operating_system_type.pb.go b/googleapis/ads/googleads/v3/enums/app_url_operating_system_type.pb.go
new file mode 100644
index 0000000..9789c2b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/app_url_operating_system_type.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/app_url_operating_system_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Operating System
+type AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType int32
+
+const (
+	// Not specified.
+	AppUrlOperatingSystemTypeEnum_UNSPECIFIED AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType = 0
+	// Used for return value only. Represents value unknown in this version.
+	AppUrlOperatingSystemTypeEnum_UNKNOWN AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType = 1
+	// The Apple IOS operating system.
+	AppUrlOperatingSystemTypeEnum_IOS AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType = 2
+	// The Android operating system.
+	AppUrlOperatingSystemTypeEnum_ANDROID AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType = 3
+)
+
+var AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "IOS",
+	3: "ANDROID",
+}
+
+var AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"IOS":         2,
+	"ANDROID":     3,
+}
+
+func (x AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType) String() string {
+	return proto.EnumName(AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType_name, int32(x))
+}
+
+func (AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_61db9fcc7d434805, []int{0, 0}
+}
+
+// The possible OS types for a deeplink AppUrl.
+type AppUrlOperatingSystemTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AppUrlOperatingSystemTypeEnum) Reset()         { *m = AppUrlOperatingSystemTypeEnum{} }
+func (m *AppUrlOperatingSystemTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AppUrlOperatingSystemTypeEnum) ProtoMessage()    {}
+func (*AppUrlOperatingSystemTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_61db9fcc7d434805, []int{0}
+}
+
+func (m *AppUrlOperatingSystemTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AppUrlOperatingSystemTypeEnum.Unmarshal(m, b)
+}
+func (m *AppUrlOperatingSystemTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AppUrlOperatingSystemTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AppUrlOperatingSystemTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AppUrlOperatingSystemTypeEnum.Merge(m, src)
+}
+func (m *AppUrlOperatingSystemTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AppUrlOperatingSystemTypeEnum.Size(m)
+}
+func (m *AppUrlOperatingSystemTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AppUrlOperatingSystemTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AppUrlOperatingSystemTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType", AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType_name, AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType_value)
+	proto.RegisterType((*AppUrlOperatingSystemTypeEnum)(nil), "google.ads.googleads.v3.enums.AppUrlOperatingSystemTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/app_url_operating_system_type.proto", fileDescriptor_61db9fcc7d434805)
+}
+
+var fileDescriptor_61db9fcc7d434805 = []byte{
+	// 315 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x6a, 0xeb, 0x30,
+	0x14, 0xfc, 0x71, 0xe0, 0x07, 0x94, 0x45, 0x8d, 0x77, 0x2d, 0x4d, 0x21, 0x39, 0x80, 0xb4, 0xd0,
+	0x4e, 0x5d, 0x29, 0x4d, 0x1a, 0x4c, 0xc1, 0x0e, 0x4d, 0x93, 0x42, 0x31, 0x18, 0xb5, 0x16, 0xc2,
+	0x60, 0x4b, 0xc2, 0x52, 0x02, 0xb9, 0x4e, 0x97, 0x3d, 0x4a, 0x8f, 0xd2, 0x6d, 0x2f, 0x50, 0x2c,
+	0xd5, 0xde, 0xb9, 0x1b, 0x31, 0xbc, 0x37, 0x6f, 0x66, 0x34, 0x80, 0x0a, 0xa5, 0x44, 0xc5, 0x11,
+	0x2b, 0x0c, 0xf2, 0xb0, 0x45, 0x27, 0x8c, 0xb8, 0x3c, 0xd6, 0x06, 0x31, 0xad, 0xf3, 0x63, 0x53,
+	0xe5, 0x4a, 0xf3, 0x86, 0xd9, 0x52, 0x8a, 0xdc, 0x9c, 0x8d, 0xe5, 0x75, 0x6e, 0xcf, 0x9a, 0x43,
+	0xdd, 0x28, 0xab, 0xa2, 0x99, 0xbf, 0x83, 0xac, 0x30, 0xb0, 0x97, 0x80, 0x27, 0x0c, 0x9d, 0xc4,
+	0xd5, 0x75, 0xe7, 0xa0, 0x4b, 0xc4, 0xa4, 0x54, 0x96, 0xd9, 0x52, 0x49, 0xe3, 0x8f, 0x17, 0x1a,
+	0xcc, 0xa8, 0xd6, 0xfb, 0xa6, 0x4a, 0x3b, 0x87, 0x9d, 0x33, 0x78, 0x3a, 0x6b, 0xbe, 0x96, 0xc7,
+	0x7a, 0x91, 0x82, 0xcb, 0x41, 0x42, 0x74, 0x01, 0xa6, 0xfb, 0x64, 0xb7, 0x5d, 0xdf, 0xc5, 0xf7,
+	0xf1, 0x7a, 0x15, 0xfe, 0x8b, 0xa6, 0x60, 0xb2, 0x4f, 0x1e, 0x92, 0xf4, 0x39, 0x09, 0x47, 0xd1,
+	0x04, 0x8c, 0xe3, 0x74, 0x17, 0x06, 0xed, 0x94, 0x26, 0xab, 0xc7, 0x34, 0x5e, 0x85, 0xe3, 0xe5,
+	0xf7, 0x08, 0xcc, 0xdf, 0x54, 0x0d, 0xff, 0x4c, 0xbd, 0xbc, 0x19, 0x34, 0xdd, 0xb6, 0xb9, 0xb7,
+	0xa3, 0x97, 0xe5, 0xaf, 0x80, 0x50, 0x15, 0x93, 0x02, 0xaa, 0x46, 0x20, 0xc1, 0xa5, 0xfb, 0x55,
+	0xd7, 0xa4, 0x2e, 0xcd, 0x40, 0xb1, 0xb7, 0xee, 0x7d, 0x0f, 0xc6, 0x1b, 0x4a, 0x3f, 0x82, 0xd9,
+	0xc6, 0x4b, 0xd1, 0xc2, 0x40, 0x0f, 0x5b, 0x74, 0xc0, 0xb0, 0x6d, 0xc0, 0x7c, 0x76, 0xfb, 0x8c,
+	0x16, 0x26, 0xeb, 0xf7, 0xd9, 0x01, 0x67, 0x6e, 0xff, 0x15, 0xcc, 0xfd, 0x90, 0x10, 0x5a, 0x18,
+	0x42, 0x7a, 0x06, 0x21, 0x07, 0x4c, 0x88, 0xe3, 0xbc, 0xfe, 0x77, 0xc1, 0xf0, 0x4f, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0x03, 0x47, 0xfc, 0x92, 0xf0, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/asset_field_type.pb.go b/googleapis/ads/googleads/v3/enums/asset_field_type.pb.go
new file mode 100644
index 0000000..168ac8a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/asset_field_type.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/asset_field_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the possible placements of an asset.
+type AssetFieldTypeEnum_AssetFieldType int32
+
+const (
+	// Not specified.
+	AssetFieldTypeEnum_UNSPECIFIED AssetFieldTypeEnum_AssetFieldType = 0
+	// Used for return value only. Represents value unknown in this version.
+	AssetFieldTypeEnum_UNKNOWN AssetFieldTypeEnum_AssetFieldType = 1
+	// The asset is linked for use as a headline.
+	AssetFieldTypeEnum_HEADLINE AssetFieldTypeEnum_AssetFieldType = 2
+	// The asset is linked for use as a description.
+	AssetFieldTypeEnum_DESCRIPTION AssetFieldTypeEnum_AssetFieldType = 3
+	// The asset is linked for use as mandatory ad text.
+	AssetFieldTypeEnum_MANDATORY_AD_TEXT AssetFieldTypeEnum_AssetFieldType = 4
+	// The asset is linked for use as a marketing image.
+	AssetFieldTypeEnum_MARKETING_IMAGE AssetFieldTypeEnum_AssetFieldType = 5
+	// The asset is linked for use as a media bundle.
+	AssetFieldTypeEnum_MEDIA_BUNDLE AssetFieldTypeEnum_AssetFieldType = 6
+	// The asset is linked for use as a YouTube video.
+	AssetFieldTypeEnum_YOUTUBE_VIDEO AssetFieldTypeEnum_AssetFieldType = 7
+)
+
+var AssetFieldTypeEnum_AssetFieldType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "HEADLINE",
+	3: "DESCRIPTION",
+	4: "MANDATORY_AD_TEXT",
+	5: "MARKETING_IMAGE",
+	6: "MEDIA_BUNDLE",
+	7: "YOUTUBE_VIDEO",
+}
+
+var AssetFieldTypeEnum_AssetFieldType_value = map[string]int32{
+	"UNSPECIFIED":       0,
+	"UNKNOWN":           1,
+	"HEADLINE":          2,
+	"DESCRIPTION":       3,
+	"MANDATORY_AD_TEXT": 4,
+	"MARKETING_IMAGE":   5,
+	"MEDIA_BUNDLE":      6,
+	"YOUTUBE_VIDEO":     7,
+}
+
+func (x AssetFieldTypeEnum_AssetFieldType) String() string {
+	return proto.EnumName(AssetFieldTypeEnum_AssetFieldType_name, int32(x))
+}
+
+func (AssetFieldTypeEnum_AssetFieldType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1a10068170a3f176, []int{0, 0}
+}
+
+// Container for enum describing the possible placements of an asset.
+type AssetFieldTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AssetFieldTypeEnum) Reset()         { *m = AssetFieldTypeEnum{} }
+func (m *AssetFieldTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AssetFieldTypeEnum) ProtoMessage()    {}
+func (*AssetFieldTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a10068170a3f176, []int{0}
+}
+
+func (m *AssetFieldTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AssetFieldTypeEnum.Unmarshal(m, b)
+}
+func (m *AssetFieldTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AssetFieldTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AssetFieldTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AssetFieldTypeEnum.Merge(m, src)
+}
+func (m *AssetFieldTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AssetFieldTypeEnum.Size(m)
+}
+func (m *AssetFieldTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AssetFieldTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AssetFieldTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AssetFieldTypeEnum_AssetFieldType", AssetFieldTypeEnum_AssetFieldType_name, AssetFieldTypeEnum_AssetFieldType_value)
+	proto.RegisterType((*AssetFieldTypeEnum)(nil), "google.ads.googleads.v3.enums.AssetFieldTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/asset_field_type.proto", fileDescriptor_1a10068170a3f176)
+}
+
+var fileDescriptor_1a10068170a3f176 = []byte{
+	// 382 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xcf, 0x8e, 0x93, 0x40,
+	0x1c, 0x16, 0x56, 0x77, 0xcd, 0xec, 0xea, 0xce, 0xce, 0xc6, 0x8b, 0x71, 0x0f, 0xed, 0x03, 0x0c,
+	0x07, 0x3c, 0x8d, 0xa7, 0xa1, 0x33, 0xc5, 0x49, 0xcb, 0x40, 0x5a, 0x40, 0x6b, 0x48, 0x08, 0x0a,
+	0x12, 0x92, 0x96, 0x21, 0x1d, 0xda, 0xa4, 0x2f, 0xe3, 0xc1, 0xa3, 0x77, 0x5f, 0xc2, 0x27, 0x31,
+	0x3e, 0x85, 0x01, 0x6c, 0x93, 0x1e, 0xdc, 0x0b, 0xf9, 0xf2, 0xfb, 0xfe, 0x84, 0xef, 0x1b, 0xf0,
+	0xb6, 0x54, 0xaa, 0x5c, 0x17, 0x56, 0x96, 0x6b, 0x6b, 0x80, 0x1d, 0xda, 0xdb, 0x56, 0x51, 0xef,
+	0x36, 0xda, 0xca, 0xb4, 0x2e, 0xda, 0xf4, 0x6b, 0x55, 0xac, 0xf3, 0xb4, 0x3d, 0x34, 0x05, 0x6e,
+	0xb6, 0xaa, 0x55, 0xe8, 0x61, 0x90, 0xe2, 0x2c, 0xd7, 0xf8, 0xe4, 0xc2, 0x7b, 0x1b, 0xf7, 0xae,
+	0xd7, 0x6f, 0x8e, 0xa1, 0x4d, 0x65, 0x65, 0x75, 0xad, 0xda, 0xac, 0xad, 0x54, 0xad, 0x07, 0xf3,
+	0xf8, 0xa7, 0x01, 0x10, 0xed, 0x72, 0xa7, 0x5d, 0x6c, 0x78, 0x68, 0x0a, 0x5e, 0xef, 0x36, 0xe3,
+	0x6f, 0x06, 0x78, 0x79, 0x7e, 0x46, 0xb7, 0xe0, 0x3a, 0x92, 0xcb, 0x80, 0x4f, 0xc4, 0x54, 0x70,
+	0x06, 0x9f, 0xa0, 0x6b, 0x70, 0x15, 0xc9, 0x99, 0xf4, 0x3f, 0x48, 0x68, 0xa0, 0x1b, 0xf0, 0xfc,
+	0x3d, 0xa7, 0x6c, 0x2e, 0x24, 0x87, 0x66, 0xa7, 0x65, 0x7c, 0x39, 0x59, 0x88, 0x20, 0x14, 0xbe,
+	0x84, 0x17, 0xe8, 0x15, 0xb8, 0xf3, 0xa8, 0x64, 0x34, 0xf4, 0x17, 0xab, 0x94, 0xb2, 0x34, 0xe4,
+	0x1f, 0x43, 0xf8, 0x14, 0xdd, 0x83, 0x5b, 0x8f, 0x2e, 0x66, 0x3c, 0x14, 0xd2, 0x4d, 0x85, 0x47,
+	0x5d, 0x0e, 0x9f, 0x21, 0x08, 0x6e, 0x3c, 0xce, 0x04, 0x4d, 0x9d, 0x48, 0xb2, 0x39, 0x87, 0x97,
+	0xe8, 0x0e, 0xbc, 0x58, 0xf9, 0x51, 0x18, 0x39, 0x3c, 0x8d, 0x05, 0xe3, 0x3e, 0xbc, 0x72, 0x7e,
+	0x1b, 0x60, 0xf4, 0x45, 0x6d, 0xf0, 0xa3, 0xdd, 0x9d, 0xfb, 0xf3, 0x0e, 0x41, 0x57, 0x39, 0x30,
+	0x3e, 0x39, 0xff, 0x5c, 0xa5, 0x5a, 0x67, 0x75, 0x89, 0xd5, 0xb6, 0xb4, 0xca, 0xa2, 0xee, 0x07,
+	0x39, 0xee, 0xde, 0x54, 0xfa, 0x3f, 0xcf, 0xf0, 0xae, 0xff, 0x7e, 0x37, 0x2f, 0x5c, 0x4a, 0x7f,
+	0x98, 0x0f, 0xee, 0x10, 0x45, 0x73, 0x8d, 0x07, 0xd8, 0xa1, 0xd8, 0xc6, 0xdd, 0x8c, 0xfa, 0xd7,
+	0x91, 0x4f, 0x68, 0xae, 0x93, 0x13, 0x9f, 0xc4, 0x76, 0xd2, 0xf3, 0x7f, 0xcc, 0xd1, 0x70, 0x24,
+	0x84, 0xe6, 0x9a, 0x90, 0x93, 0x82, 0x90, 0xd8, 0x26, 0xa4, 0xd7, 0x7c, 0xbe, 0xec, 0x7f, 0xcc,
+	0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xbe, 0x0e, 0xae, 0x1e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/asset_performance_label.pb.go b/googleapis/ads/googleads/v3/enums/asset_performance_label.pb.go
new file mode 100644
index 0000000..fa94b56
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/asset_performance_label.pb.go
@@ -0,0 +1,140 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/asset_performance_label.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the possible performance labels of an asset, usually
+// computed in the context of a linkage.
+type AssetPerformanceLabelEnum_AssetPerformanceLabel int32
+
+const (
+	// Not specified.
+	AssetPerformanceLabelEnum_UNSPECIFIED AssetPerformanceLabelEnum_AssetPerformanceLabel = 0
+	// Used for return value only. Represents value unknown in this version.
+	AssetPerformanceLabelEnum_UNKNOWN AssetPerformanceLabelEnum_AssetPerformanceLabel = 1
+	// This asset does not yet have any performance informantion. This may be
+	// because it is still under review.
+	AssetPerformanceLabelEnum_PENDING AssetPerformanceLabelEnum_AssetPerformanceLabel = 2
+	// The asset has started getting impressions but the stats are not
+	// statistically significant enough to get an asset performance label.
+	AssetPerformanceLabelEnum_LEARNING AssetPerformanceLabelEnum_AssetPerformanceLabel = 3
+	// Worst performing assets.
+	AssetPerformanceLabelEnum_LOW AssetPerformanceLabelEnum_AssetPerformanceLabel = 4
+	// Good performing assets.
+	AssetPerformanceLabelEnum_GOOD AssetPerformanceLabelEnum_AssetPerformanceLabel = 5
+	// Best performing assets.
+	AssetPerformanceLabelEnum_BEST AssetPerformanceLabelEnum_AssetPerformanceLabel = 6
+)
+
+var AssetPerformanceLabelEnum_AssetPerformanceLabel_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PENDING",
+	3: "LEARNING",
+	4: "LOW",
+	5: "GOOD",
+	6: "BEST",
+}
+
+var AssetPerformanceLabelEnum_AssetPerformanceLabel_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"PENDING":     2,
+	"LEARNING":    3,
+	"LOW":         4,
+	"GOOD":        5,
+	"BEST":        6,
+}
+
+func (x AssetPerformanceLabelEnum_AssetPerformanceLabel) String() string {
+	return proto.EnumName(AssetPerformanceLabelEnum_AssetPerformanceLabel_name, int32(x))
+}
+
+func (AssetPerformanceLabelEnum_AssetPerformanceLabel) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2c0d096edebf114e, []int{0, 0}
+}
+
+// Container for enum describing the performance label of an asset.
+type AssetPerformanceLabelEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AssetPerformanceLabelEnum) Reset()         { *m = AssetPerformanceLabelEnum{} }
+func (m *AssetPerformanceLabelEnum) String() string { return proto.CompactTextString(m) }
+func (*AssetPerformanceLabelEnum) ProtoMessage()    {}
+func (*AssetPerformanceLabelEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2c0d096edebf114e, []int{0}
+}
+
+func (m *AssetPerformanceLabelEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AssetPerformanceLabelEnum.Unmarshal(m, b)
+}
+func (m *AssetPerformanceLabelEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AssetPerformanceLabelEnum.Marshal(b, m, deterministic)
+}
+func (m *AssetPerformanceLabelEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AssetPerformanceLabelEnum.Merge(m, src)
+}
+func (m *AssetPerformanceLabelEnum) XXX_Size() int {
+	return xxx_messageInfo_AssetPerformanceLabelEnum.Size(m)
+}
+func (m *AssetPerformanceLabelEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AssetPerformanceLabelEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AssetPerformanceLabelEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AssetPerformanceLabelEnum_AssetPerformanceLabel", AssetPerformanceLabelEnum_AssetPerformanceLabel_name, AssetPerformanceLabelEnum_AssetPerformanceLabel_value)
+	proto.RegisterType((*AssetPerformanceLabelEnum)(nil), "google.ads.googleads.v3.enums.AssetPerformanceLabelEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/asset_performance_label.proto", fileDescriptor_2c0d096edebf114e)
+}
+
+var fileDescriptor_2c0d096edebf114e = []byte{
+	// 335 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x6e, 0xea, 0x30,
+	0x14, 0xfc, 0x09, 0x7c, 0x40, 0xa6, 0x52, 0xa3, 0x48, 0x5d, 0x14, 0x95, 0x05, 0x1c, 0xc0, 0x59,
+	0x64, 0x67, 0x56, 0x4e, 0x49, 0x23, 0x54, 0xe4, 0x44, 0xa5, 0x80, 0x54, 0x45, 0x42, 0x86, 0xb8,
+	0x11, 0x52, 0x62, 0x47, 0x71, 0xe0, 0x10, 0x3d, 0x46, 0x97, 0x3d, 0x4a, 0x8f, 0xd2, 0x4d, 0xaf,
+	0x50, 0x39, 0x2e, 0xe9, 0x86, 0x76, 0x63, 0xcd, 0xf3, 0xbc, 0x19, 0xbd, 0x19, 0x30, 0x49, 0x85,
+	0x48, 0x33, 0xe6, 0xd0, 0x44, 0x3a, 0x1a, 0x2a, 0x74, 0x74, 0x1d, 0xc6, 0x0f, 0xb9, 0x74, 0xa8,
+	0x94, 0xac, 0xda, 0x14, 0xac, 0x7c, 0x16, 0x65, 0x4e, 0xf9, 0x8e, 0x6d, 0x32, 0xba, 0x65, 0x19,
+	0x2c, 0x4a, 0x51, 0x09, 0x7b, 0xa8, 0x15, 0x90, 0x26, 0x12, 0x36, 0x62, 0x78, 0x74, 0x61, 0x2d,
+	0x1e, 0xdc, 0x9c, 0xbc, 0x8b, 0xbd, 0x43, 0x39, 0x17, 0x15, 0xad, 0xf6, 0x82, 0x4b, 0x2d, 0x1e,
+	0xbf, 0x18, 0xe0, 0x1a, 0x2b, 0xfb, 0xe8, 0xc7, 0x7d, 0xae, 0xcc, 0x7d, 0x7e, 0xc8, 0xc7, 0x39,
+	0xb8, 0x3a, 0x4b, 0xda, 0x97, 0xa0, 0xbf, 0x24, 0x8b, 0xc8, 0xbf, 0x9d, 0xdd, 0xcd, 0xfc, 0xa9,
+	0xf5, 0xcf, 0xee, 0x83, 0xee, 0x92, 0xdc, 0x93, 0x70, 0x4d, 0x2c, 0x43, 0x0d, 0x91, 0x4f, 0xa6,
+	0x33, 0x12, 0x58, 0xa6, 0x7d, 0x01, 0x7a, 0x73, 0x1f, 0x3f, 0x10, 0x35, 0xb5, 0xec, 0x2e, 0x68,
+	0xcd, 0xc3, 0xb5, 0xd5, 0xb6, 0x7b, 0xa0, 0x1d, 0x84, 0xe1, 0xd4, 0xfa, 0xaf, 0x90, 0xe7, 0x2f,
+	0x1e, 0xad, 0x8e, 0xf7, 0x69, 0x80, 0xd1, 0x4e, 0xe4, 0xf0, 0xcf, 0x40, 0xde, 0xe0, 0xec, 0x49,
+	0x91, 0x8a, 0x13, 0x19, 0x4f, 0xde, 0xb7, 0x38, 0x15, 0x19, 0xe5, 0x29, 0x14, 0x65, 0xea, 0xa4,
+	0x8c, 0xd7, 0x61, 0x4f, 0xd5, 0x16, 0x7b, 0xf9, 0x4b, 0xd3, 0x93, 0xfa, 0x7d, 0x35, 0x5b, 0x01,
+	0xc6, 0x6f, 0xe6, 0x30, 0xd0, 0x56, 0x38, 0x91, 0x50, 0x43, 0x85, 0x56, 0x2e, 0x54, 0xdd, 0xc8,
+	0xf7, 0x13, 0x1f, 0xe3, 0x44, 0xc6, 0x0d, 0x1f, 0xaf, 0xdc, 0xb8, 0xe6, 0x3f, 0xcc, 0x91, 0xfe,
+	0x44, 0x08, 0x27, 0x12, 0xa1, 0x66, 0x03, 0xa1, 0x95, 0x8b, 0x50, 0xbd, 0xb3, 0xed, 0xd4, 0x87,
+	0xb9, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe6, 0xc8, 0x63, 0xf0, 0x01, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/asset_type.pb.go b/googleapis/ads/googleads/v3/enums/asset_type.pb.go
new file mode 100644
index 0000000..6952076
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/asset_type.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/asset_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible types of asset.
+type AssetTypeEnum_AssetType int32
+
+const (
+	// Not specified.
+	AssetTypeEnum_UNSPECIFIED AssetTypeEnum_AssetType = 0
+	// Used for return value only. Represents value unknown in this version.
+	AssetTypeEnum_UNKNOWN AssetTypeEnum_AssetType = 1
+	// YouTube video asset.
+	AssetTypeEnum_YOUTUBE_VIDEO AssetTypeEnum_AssetType = 2
+	// Media bundle asset.
+	AssetTypeEnum_MEDIA_BUNDLE AssetTypeEnum_AssetType = 3
+	// Image asset.
+	AssetTypeEnum_IMAGE AssetTypeEnum_AssetType = 4
+	// Text asset.
+	AssetTypeEnum_TEXT AssetTypeEnum_AssetType = 5
+)
+
+var AssetTypeEnum_AssetType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "YOUTUBE_VIDEO",
+	3: "MEDIA_BUNDLE",
+	4: "IMAGE",
+	5: "TEXT",
+}
+
+var AssetTypeEnum_AssetType_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"YOUTUBE_VIDEO": 2,
+	"MEDIA_BUNDLE":  3,
+	"IMAGE":         4,
+	"TEXT":          5,
+}
+
+func (x AssetTypeEnum_AssetType) String() string {
+	return proto.EnumName(AssetTypeEnum_AssetType_name, int32(x))
+}
+
+func (AssetTypeEnum_AssetType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d2719617ac292991, []int{0, 0}
+}
+
+// Container for enum describing the types of asset.
+type AssetTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AssetTypeEnum) Reset()         { *m = AssetTypeEnum{} }
+func (m *AssetTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*AssetTypeEnum) ProtoMessage()    {}
+func (*AssetTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d2719617ac292991, []int{0}
+}
+
+func (m *AssetTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AssetTypeEnum.Unmarshal(m, b)
+}
+func (m *AssetTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AssetTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *AssetTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AssetTypeEnum.Merge(m, src)
+}
+func (m *AssetTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_AssetTypeEnum.Size(m)
+}
+func (m *AssetTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AssetTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AssetTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AssetTypeEnum_AssetType", AssetTypeEnum_AssetType_name, AssetTypeEnum_AssetType_value)
+	proto.RegisterType((*AssetTypeEnum)(nil), "google.ads.googleads.v3.enums.AssetTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/asset_type.proto", fileDescriptor_d2719617ac292991)
+}
+
+var fileDescriptor_d2719617ac292991 = []byte{
+	// 325 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4f, 0xc2, 0x30,
+	0x18, 0xc6, 0x65, 0x80, 0x4a, 0x11, 0xad, 0x3d, 0x1a, 0x39, 0xc0, 0x07, 0xe8, 0x0e, 0xbb, 0xd5,
+	0x53, 0xe7, 0x2a, 0x59, 0x94, 0x41, 0xe2, 0x36, 0xff, 0x64, 0x09, 0x99, 0x6c, 0x59, 0x48, 0xa0,
+	0x5d, 0x68, 0x21, 0xe1, 0xeb, 0x78, 0xf4, 0xa3, 0xf8, 0x35, 0xbc, 0xf9, 0x29, 0xcc, 0x5a, 0xb7,
+	0x9b, 0x5e, 0x9a, 0x27, 0xef, 0xfb, 0x7b, 0x9f, 0x3c, 0x7d, 0x00, 0x2e, 0x84, 0x28, 0xd6, 0xb9,
+	0x9d, 0x66, 0xd2, 0x36, 0xb2, 0x52, 0x7b, 0xc7, 0xce, 0xf9, 0x6e, 0x23, 0xed, 0x54, 0xca, 0x5c,
+	0x2d, 0xd4, 0xa1, 0xcc, 0x71, 0xb9, 0x15, 0x4a, 0xa0, 0xa1, 0x81, 0x70, 0x9a, 0x49, 0xdc, 0xf0,
+	0x78, 0xef, 0x60, 0xcd, 0x5f, 0x5d, 0xd7, 0x76, 0xe5, 0xca, 0x4e, 0x39, 0x17, 0x2a, 0x55, 0x2b,
+	0xc1, 0xa5, 0x39, 0x1e, 0x2b, 0x30, 0xa0, 0x95, 0x61, 0x78, 0x28, 0x73, 0xc6, 0x77, 0x9b, 0xf1,
+	0x12, 0xf4, 0x9a, 0x01, 0xba, 0x00, 0xfd, 0x28, 0x78, 0x9c, 0xb3, 0x5b, 0xff, 0xce, 0x67, 0x1e,
+	0x3c, 0x42, 0x7d, 0x70, 0x12, 0x05, 0xf7, 0xc1, 0xec, 0x29, 0x80, 0x2d, 0x74, 0x09, 0x06, 0x2f,
+	0xb3, 0x28, 0x8c, 0x5c, 0xb6, 0x88, 0x7d, 0x8f, 0xcd, 0xa0, 0x85, 0x20, 0x38, 0x9b, 0x32, 0xcf,
+	0xa7, 0x0b, 0x37, 0x0a, 0xbc, 0x07, 0x06, 0xdb, 0xa8, 0x07, 0xba, 0xfe, 0x94, 0x4e, 0x18, 0xec,
+	0xa0, 0x53, 0xd0, 0x09, 0xd9, 0x73, 0x08, 0xbb, 0xee, 0x57, 0x0b, 0x8c, 0x96, 0x62, 0x83, 0xff,
+	0x4d, 0xee, 0x9e, 0x37, 0x41, 0xe6, 0x55, 0xd6, 0x79, 0xeb, 0xd5, 0xfd, 0x3d, 0x28, 0xc4, 0x3a,
+	0xe5, 0x05, 0x16, 0xdb, 0xc2, 0x2e, 0x72, 0xae, 0x7f, 0x52, 0x57, 0x55, 0xae, 0xe4, 0x1f, 0xcd,
+	0xdd, 0xe8, 0xf7, 0xdd, 0x6a, 0x4f, 0x28, 0xfd, 0xb0, 0x86, 0x13, 0x63, 0x45, 0x33, 0x89, 0x8d,
+	0xac, 0x54, 0xec, 0xe0, 0xaa, 0x05, 0xf9, 0x59, 0xef, 0x13, 0x9a, 0xc9, 0xa4, 0xd9, 0x27, 0xb1,
+	0x93, 0xe8, 0xfd, 0xb7, 0x35, 0x32, 0x43, 0x42, 0x68, 0x26, 0x09, 0x69, 0x08, 0x42, 0x62, 0x87,
+	0x10, 0xcd, 0xbc, 0x1d, 0xeb, 0x60, 0xce, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, 0xed, 0x6d,
+	0xbe, 0xd1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/attribution_model.pb.go b/googleapis/ads/googleads/v3/enums/attribution_model.pb.go
new file mode 100644
index 0000000..1711bf7
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/attribution_model.pb.go
@@ -0,0 +1,159 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/attribution_model.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The attribution model that describes how to distribute credit for a
+// particular conversion across potentially many prior interactions.
+type AttributionModelEnum_AttributionModel int32
+
+const (
+	// Not specified.
+	AttributionModelEnum_UNSPECIFIED AttributionModelEnum_AttributionModel = 0
+	// Used for return value only. Represents value unknown in this version.
+	AttributionModelEnum_UNKNOWN AttributionModelEnum_AttributionModel = 1
+	// Uses external attribution.
+	AttributionModelEnum_EXTERNAL AttributionModelEnum_AttributionModel = 100
+	// Attributes all credit for a conversion to its last click.
+	AttributionModelEnum_GOOGLE_ADS_LAST_CLICK AttributionModelEnum_AttributionModel = 101
+	// Attributes all credit for a conversion to its first click using Google
+	// Search attribution.
+	AttributionModelEnum_GOOGLE_SEARCH_ATTRIBUTION_FIRST_CLICK AttributionModelEnum_AttributionModel = 102
+	// Attributes credit for a conversion equally across all of its clicks using
+	// Google Search attribution.
+	AttributionModelEnum_GOOGLE_SEARCH_ATTRIBUTION_LINEAR AttributionModelEnum_AttributionModel = 103
+	// Attributes exponentially more credit for a conversion to its more recent
+	// clicks using Google Search attribution (half-life is 1 week).
+	AttributionModelEnum_GOOGLE_SEARCH_ATTRIBUTION_TIME_DECAY AttributionModelEnum_AttributionModel = 104
+	// Attributes 40% of the credit for a conversion to its first and last
+	// clicks. Remaining 20% is evenly distributed across all other clicks. This
+	// uses Google Search attribution.
+	AttributionModelEnum_GOOGLE_SEARCH_ATTRIBUTION_POSITION_BASED AttributionModelEnum_AttributionModel = 105
+	// Flexible model that uses machine learning to determine the appropriate
+	// distribution of credit among clicks using Google Search attribution.
+	AttributionModelEnum_GOOGLE_SEARCH_ATTRIBUTION_DATA_DRIVEN AttributionModelEnum_AttributionModel = 106
+)
+
+var AttributionModelEnum_AttributionModel_name = map[int32]string{
+	0:   "UNSPECIFIED",
+	1:   "UNKNOWN",
+	100: "EXTERNAL",
+	101: "GOOGLE_ADS_LAST_CLICK",
+	102: "GOOGLE_SEARCH_ATTRIBUTION_FIRST_CLICK",
+	103: "GOOGLE_SEARCH_ATTRIBUTION_LINEAR",
+	104: "GOOGLE_SEARCH_ATTRIBUTION_TIME_DECAY",
+	105: "GOOGLE_SEARCH_ATTRIBUTION_POSITION_BASED",
+	106: "GOOGLE_SEARCH_ATTRIBUTION_DATA_DRIVEN",
+}
+
+var AttributionModelEnum_AttributionModel_value = map[string]int32{
+	"UNSPECIFIED":                              0,
+	"UNKNOWN":                                  1,
+	"EXTERNAL":                                 100,
+	"GOOGLE_ADS_LAST_CLICK":                    101,
+	"GOOGLE_SEARCH_ATTRIBUTION_FIRST_CLICK":    102,
+	"GOOGLE_SEARCH_ATTRIBUTION_LINEAR":         103,
+	"GOOGLE_SEARCH_ATTRIBUTION_TIME_DECAY":     104,
+	"GOOGLE_SEARCH_ATTRIBUTION_POSITION_BASED": 105,
+	"GOOGLE_SEARCH_ATTRIBUTION_DATA_DRIVEN":    106,
+}
+
+func (x AttributionModelEnum_AttributionModel) String() string {
+	return proto.EnumName(AttributionModelEnum_AttributionModel_name, int32(x))
+}
+
+func (AttributionModelEnum_AttributionModel) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1c756564395f8b71, []int{0, 0}
+}
+
+// Container for enum representing the attribution model that describes how to
+// distribute credit for a particular conversion across potentially many prior
+// interactions.
+type AttributionModelEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AttributionModelEnum) Reset()         { *m = AttributionModelEnum{} }
+func (m *AttributionModelEnum) String() string { return proto.CompactTextString(m) }
+func (*AttributionModelEnum) ProtoMessage()    {}
+func (*AttributionModelEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1c756564395f8b71, []int{0}
+}
+
+func (m *AttributionModelEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AttributionModelEnum.Unmarshal(m, b)
+}
+func (m *AttributionModelEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AttributionModelEnum.Marshal(b, m, deterministic)
+}
+func (m *AttributionModelEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AttributionModelEnum.Merge(m, src)
+}
+func (m *AttributionModelEnum) XXX_Size() int {
+	return xxx_messageInfo_AttributionModelEnum.Size(m)
+}
+func (m *AttributionModelEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AttributionModelEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AttributionModelEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.AttributionModelEnum_AttributionModel", AttributionModelEnum_AttributionModel_name, AttributionModelEnum_AttributionModel_value)
+	proto.RegisterType((*AttributionModelEnum)(nil), "google.ads.googleads.v3.enums.AttributionModelEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/attribution_model.proto", fileDescriptor_1c756564395f8b71)
+}
+
+var fileDescriptor_1c756564395f8b71 = []byte{
+	// 407 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xdd, 0x6a, 0xd4, 0x40,
+	0x1c, 0xc5, 0xdd, 0x08, 0x2a, 0x53, 0xc1, 0x61, 0xb0, 0x17, 0x8a, 0x05, 0x5b, 0x2a, 0x54, 0x90,
+	0xc9, 0x45, 0xf0, 0x66, 0xbc, 0xfa, 0x27, 0x99, 0xae, 0x43, 0xd3, 0xc9, 0x92, 0x64, 0xd7, 0x0f,
+	0x16, 0x86, 0xd4, 0xc4, 0x18, 0xd9, 0x64, 0x96, 0x9d, 0x6c, 0x1f, 0xc8, 0x4b, 0xc1, 0xd7, 0xf0,
+	0xc2, 0x47, 0xe9, 0x53, 0x48, 0x92, 0x6e, 0x0a, 0x85, 0xec, 0x4d, 0x38, 0xe4, 0xfc, 0xce, 0x61,
+	0x98, 0x33, 0xe8, 0x7d, 0xa1, 0x75, 0xb1, 0xca, 0xed, 0x34, 0x33, 0x76, 0x2f, 0x5b, 0x75, 0xed,
+	0xd8, 0x79, 0xbd, 0xad, 0x8c, 0x9d, 0x36, 0xcd, 0xa6, 0xbc, 0xda, 0x36, 0xa5, 0xae, 0x55, 0xa5,
+	0xb3, 0x7c, 0x45, 0xd7, 0x1b, 0xdd, 0x68, 0x72, 0xd4, 0xb3, 0x34, 0xcd, 0x0c, 0x1d, 0x62, 0xf4,
+	0xda, 0xa1, 0x5d, 0xec, 0xe5, 0xab, 0x5d, 0xeb, 0xba, 0xb4, 0xd3, 0xba, 0xd6, 0x4d, 0xda, 0x36,
+	0x98, 0x3e, 0x7c, 0xf2, 0xd7, 0x42, 0xcf, 0xe1, 0xae, 0xf8, 0xb2, 0xed, 0xe5, 0xf5, 0xb6, 0x3a,
+	0xf9, 0x63, 0x21, 0x7c, 0xdf, 0x20, 0xcf, 0xd0, 0xc1, 0x5c, 0xc6, 0x33, 0xee, 0x89, 0x73, 0xc1,
+	0x7d, 0xfc, 0x80, 0x1c, 0xa0, 0xc7, 0x73, 0x79, 0x21, 0xc3, 0x4f, 0x12, 0x4f, 0xc8, 0x53, 0xf4,
+	0x84, 0x7f, 0x4e, 0x78, 0x24, 0x21, 0xc0, 0x19, 0x79, 0x81, 0x0e, 0xa7, 0x61, 0x38, 0x0d, 0xb8,
+	0x02, 0x3f, 0x56, 0x01, 0xc4, 0x89, 0xf2, 0x02, 0xe1, 0x5d, 0xe0, 0x9c, 0xbc, 0x45, 0x6f, 0x6e,
+	0xad, 0x98, 0x43, 0xe4, 0x7d, 0x54, 0x90, 0x24, 0x91, 0x70, 0xe7, 0x89, 0x08, 0xa5, 0x3a, 0x17,
+	0xd1, 0x80, 0x7e, 0x27, 0xa7, 0xe8, 0xf5, 0x38, 0x1a, 0x08, 0xc9, 0x21, 0xc2, 0x05, 0x39, 0x43,
+	0xa7, 0xe3, 0x54, 0x22, 0x2e, 0xb9, 0xf2, 0xb9, 0x07, 0x5f, 0xf0, 0x0f, 0xf2, 0x0e, 0x9d, 0x8d,
+	0x93, 0xb3, 0x30, 0x16, 0x9d, 0x70, 0x21, 0xe6, 0x3e, 0x2e, 0xf7, 0x1f, 0xd4, 0x87, 0x04, 0x94,
+	0x1f, 0x89, 0x05, 0x97, 0xf8, 0xa7, 0x7b, 0x33, 0x41, 0xc7, 0xdf, 0x74, 0x45, 0xf7, 0x8e, 0xe1,
+	0x1e, 0xde, 0xbf, 0xd2, 0x59, 0xbb, 0xc2, 0x6c, 0xf2, 0xd5, 0xbd, 0xcd, 0x15, 0x7a, 0x95, 0xd6,
+	0x05, 0xd5, 0x9b, 0xc2, 0x2e, 0xf2, 0xba, 0xdb, 0x68, 0xf7, 0x16, 0xd6, 0xa5, 0x19, 0x79, 0x1a,
+	0x1f, 0xba, 0xef, 0x2f, 0xeb, 0xe1, 0x14, 0xe0, 0xb7, 0x75, 0x34, 0xed, 0xab, 0x20, 0x33, 0xb4,
+	0x97, 0xad, 0x5a, 0x38, 0xb4, 0xdd, 0xd5, 0xfc, 0xdb, 0xf9, 0x4b, 0xc8, 0xcc, 0x72, 0xf0, 0x97,
+	0x0b, 0x67, 0xd9, 0xf9, 0x37, 0xd6, 0x71, 0xff, 0x93, 0x31, 0xc8, 0x0c, 0x63, 0x03, 0xc1, 0xd8,
+	0xc2, 0x61, 0xac, 0x63, 0xae, 0x1e, 0x75, 0x07, 0x73, 0xfe, 0x07, 0x00, 0x00, 0xff, 0xff, 0xfe,
+	0x05, 0x57, 0x6f, 0xb2, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/bid_modifier_source.pb.go b/googleapis/ads/googleads/v3/enums/bid_modifier_source.pb.go
new file mode 100644
index 0000000..00af05c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/bid_modifier_source.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/bid_modifier_source.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible bid modifier sources.
+type BidModifierSourceEnum_BidModifierSource int32
+
+const (
+	// Not specified.
+	BidModifierSourceEnum_UNSPECIFIED BidModifierSourceEnum_BidModifierSource = 0
+	// Used for return value only. Represents value unknown in this version.
+	BidModifierSourceEnum_UNKNOWN BidModifierSourceEnum_BidModifierSource = 1
+	// The bid modifier is specified at the campaign level, on the campaign
+	// level criterion.
+	BidModifierSourceEnum_CAMPAIGN BidModifierSourceEnum_BidModifierSource = 2
+	// The bid modifier is specified (overridden) at the ad group level.
+	BidModifierSourceEnum_AD_GROUP BidModifierSourceEnum_BidModifierSource = 3
+)
+
+var BidModifierSourceEnum_BidModifierSource_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CAMPAIGN",
+	3: "AD_GROUP",
+}
+
+var BidModifierSourceEnum_BidModifierSource_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CAMPAIGN":    2,
+	"AD_GROUP":    3,
+}
+
+func (x BidModifierSourceEnum_BidModifierSource) String() string {
+	return proto.EnumName(BidModifierSourceEnum_BidModifierSource_name, int32(x))
+}
+
+func (BidModifierSourceEnum_BidModifierSource) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c0b718d07dc79201, []int{0, 0}
+}
+
+// Container for enum describing possible bid modifier sources.
+type BidModifierSourceEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BidModifierSourceEnum) Reset()         { *m = BidModifierSourceEnum{} }
+func (m *BidModifierSourceEnum) String() string { return proto.CompactTextString(m) }
+func (*BidModifierSourceEnum) ProtoMessage()    {}
+func (*BidModifierSourceEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c0b718d07dc79201, []int{0}
+}
+
+func (m *BidModifierSourceEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BidModifierSourceEnum.Unmarshal(m, b)
+}
+func (m *BidModifierSourceEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BidModifierSourceEnum.Marshal(b, m, deterministic)
+}
+func (m *BidModifierSourceEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BidModifierSourceEnum.Merge(m, src)
+}
+func (m *BidModifierSourceEnum) XXX_Size() int {
+	return xxx_messageInfo_BidModifierSourceEnum.Size(m)
+}
+func (m *BidModifierSourceEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BidModifierSourceEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BidModifierSourceEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BidModifierSourceEnum_BidModifierSource", BidModifierSourceEnum_BidModifierSource_name, BidModifierSourceEnum_BidModifierSource_value)
+	proto.RegisterType((*BidModifierSourceEnum)(nil), "google.ads.googleads.v3.enums.BidModifierSourceEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/bid_modifier_source.proto", fileDescriptor_c0b718d07dc79201)
+}
+
+var fileDescriptor_c0b718d07dc79201 = []byte{
+	// 307 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x1c, 0x76, 0x1d, 0xa8, 0x64, 0x82, 0xb5, 0xa0, 0x07, 0x71, 0x87, 0xed, 0x01, 0x92, 0x43, 0x0e,
+	0x42, 0x3c, 0xa5, 0xdb, 0x2c, 0x43, 0xd6, 0x15, 0xc7, 0x26, 0x48, 0x61, 0x74, 0x4b, 0x17, 0x02,
+	0x6b, 0x52, 0x9a, 0x76, 0x0f, 0xe4, 0xd1, 0x47, 0xf1, 0x51, 0xf4, 0x25, 0xa4, 0xc9, 0xda, 0xcb,
+	0xd0, 0x4b, 0xf8, 0x92, 0xef, 0x4f, 0xbe, 0xdf, 0x0f, 0x3c, 0x72, 0xa5, 0xf8, 0x3e, 0x45, 0x09,
+	0xd3, 0xc8, 0xc2, 0x1a, 0x1d, 0x30, 0x4a, 0x65, 0x95, 0x69, 0xb4, 0x11, 0x6c, 0x9d, 0x29, 0x26,
+	0x76, 0x22, 0x2d, 0xd6, 0x5a, 0x55, 0xc5, 0x36, 0x85, 0x79, 0xa1, 0x4a, 0xe5, 0xf5, 0xad, 0x1a,
+	0x26, 0x4c, 0xc3, 0xd6, 0x08, 0x0f, 0x18, 0x1a, 0xe3, 0xfd, 0x43, 0x93, 0x9b, 0x0b, 0x94, 0x48,
+	0xa9, 0xca, 0xa4, 0x14, 0x4a, 0x6a, 0x6b, 0x1e, 0xee, 0xc0, 0xad, 0x2f, 0xd8, 0xec, 0x18, 0xbc,
+	0x30, 0xb9, 0x13, 0x59, 0x65, 0xc3, 0x19, 0xb8, 0x39, 0x21, 0xbc, 0x6b, 0xd0, 0x5b, 0x86, 0x8b,
+	0x68, 0x32, 0x9a, 0x3e, 0x4f, 0x27, 0x63, 0xf7, 0xcc, 0xeb, 0x81, 0x8b, 0x65, 0xf8, 0x12, 0xce,
+	0xdf, 0x42, 0xb7, 0xe3, 0x5d, 0x81, 0xcb, 0x11, 0x9d, 0x45, 0x74, 0x1a, 0x84, 0xae, 0x53, 0xdf,
+	0xe8, 0x78, 0x1d, 0xbc, 0xce, 0x97, 0x91, 0xdb, 0xf5, 0x7f, 0x3a, 0x60, 0xb0, 0x55, 0x19, 0xfc,
+	0xb7, 0xab, 0x7f, 0x77, 0xf2, 0x65, 0x54, 0xb7, 0x8c, 0x3a, 0xef, 0xfe, 0xd1, 0xc8, 0xd5, 0x3e,
+	0x91, 0x1c, 0xaa, 0x82, 0x23, 0x9e, 0x4a, 0x33, 0x43, 0xb3, 0xad, 0x5c, 0xe8, 0x3f, 0x96, 0xf7,
+	0x64, 0xce, 0x0f, 0xa7, 0x1b, 0x50, 0xfa, 0xe9, 0xf4, 0x03, 0x1b, 0x45, 0x99, 0x86, 0x16, 0xd6,
+	0x68, 0x85, 0x61, 0x3d, 0xb7, 0xfe, 0x6a, 0xf8, 0x98, 0x32, 0x1d, 0xb7, 0x7c, 0xbc, 0xc2, 0xb1,
+	0xe1, 0xbf, 0x9d, 0x81, 0x7d, 0x24, 0x84, 0x32, 0x4d, 0x48, 0xab, 0x20, 0x64, 0x85, 0x09, 0x31,
+	0x9a, 0xcd, 0xb9, 0x29, 0x86, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xa0, 0xda, 0xa4, 0xcb, 0xd4,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/bidding_source.pb.go b/googleapis/ads/googleads/v3/enums/bidding_source.pb.go
new file mode 100644
index 0000000..0e5a896
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/bidding_source.pb.go
@@ -0,0 +1,131 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/bidding_source.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Indicates where a bid or target is defined. For example, an ad group
+// criterion may define a cpc bid directly, or it can inherit its cpc bid from
+// the ad group.
+type BiddingSourceEnum_BiddingSource int32
+
+const (
+	// Not specified.
+	BiddingSourceEnum_UNSPECIFIED BiddingSourceEnum_BiddingSource = 0
+	// Used for return value only. Represents value unknown in this version.
+	BiddingSourceEnum_UNKNOWN BiddingSourceEnum_BiddingSource = 1
+	// Effective bid or target is inherited from campaign bidding strategy.
+	BiddingSourceEnum_CAMPAIGN_BIDDING_STRATEGY BiddingSourceEnum_BiddingSource = 5
+	// The bid or target is defined on the ad group.
+	BiddingSourceEnum_AD_GROUP BiddingSourceEnum_BiddingSource = 6
+	// The bid or target is defined on the ad group criterion.
+	BiddingSourceEnum_AD_GROUP_CRITERION BiddingSourceEnum_BiddingSource = 7
+)
+
+var BiddingSourceEnum_BiddingSource_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	5: "CAMPAIGN_BIDDING_STRATEGY",
+	6: "AD_GROUP",
+	7: "AD_GROUP_CRITERION",
+}
+
+var BiddingSourceEnum_BiddingSource_value = map[string]int32{
+	"UNSPECIFIED":               0,
+	"UNKNOWN":                   1,
+	"CAMPAIGN_BIDDING_STRATEGY": 5,
+	"AD_GROUP":                  6,
+	"AD_GROUP_CRITERION":        7,
+}
+
+func (x BiddingSourceEnum_BiddingSource) String() string {
+	return proto.EnumName(BiddingSourceEnum_BiddingSource_name, int32(x))
+}
+
+func (BiddingSourceEnum_BiddingSource) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e6307df4d287cd0d, []int{0, 0}
+}
+
+// Container for enum describing possible bidding sources.
+type BiddingSourceEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BiddingSourceEnum) Reset()         { *m = BiddingSourceEnum{} }
+func (m *BiddingSourceEnum) String() string { return proto.CompactTextString(m) }
+func (*BiddingSourceEnum) ProtoMessage()    {}
+func (*BiddingSourceEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e6307df4d287cd0d, []int{0}
+}
+
+func (m *BiddingSourceEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BiddingSourceEnum.Unmarshal(m, b)
+}
+func (m *BiddingSourceEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BiddingSourceEnum.Marshal(b, m, deterministic)
+}
+func (m *BiddingSourceEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BiddingSourceEnum.Merge(m, src)
+}
+func (m *BiddingSourceEnum) XXX_Size() int {
+	return xxx_messageInfo_BiddingSourceEnum.Size(m)
+}
+func (m *BiddingSourceEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BiddingSourceEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BiddingSourceEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BiddingSourceEnum_BiddingSource", BiddingSourceEnum_BiddingSource_name, BiddingSourceEnum_BiddingSource_value)
+	proto.RegisterType((*BiddingSourceEnum)(nil), "google.ads.googleads.v3.enums.BiddingSourceEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/bidding_source.proto", fileDescriptor_e6307df4d287cd0d)
+}
+
+var fileDescriptor_e6307df4d287cd0d = []byte{
+	// 334 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xdd, 0x4a, 0xc3, 0x30,
+	0x18, 0xb5, 0x13, 0x37, 0xc9, 0x14, 0x6b, 0x2e, 0x04, 0xc5, 0x5d, 0x6c, 0x0f, 0x90, 0x82, 0xbd,
+	0x8b, 0x57, 0xe9, 0x5a, 0x4b, 0x11, 0xb3, 0xd2, 0xfd, 0x88, 0x52, 0x28, 0xdd, 0x52, 0x42, 0x61,
+	0x4b, 0x46, 0xb3, 0xed, 0x15, 0x7c, 0x0f, 0x2f, 0x7d, 0x14, 0x5f, 0x44, 0xf0, 0x29, 0xa4, 0x89,
+	0x1d, 0xec, 0x42, 0x6f, 0xc2, 0xc9, 0xf7, 0x9d, 0x73, 0xf8, 0xce, 0x01, 0x77, 0x5c, 0x4a, 0xbe,
+	0x2c, 0x9c, 0x9c, 0x29, 0xc7, 0xc0, 0x1a, 0xed, 0x5c, 0xa7, 0x10, 0xdb, 0x95, 0x72, 0xe6, 0x25,
+	0x63, 0xa5, 0xe0, 0x99, 0x92, 0xdb, 0x6a, 0x51, 0xa0, 0x75, 0x25, 0x37, 0x12, 0xf6, 0x0c, 0x11,
+	0xe5, 0x4c, 0xa1, 0xbd, 0x06, 0xed, 0x5c, 0xa4, 0x35, 0x37, 0xb7, 0x8d, 0xe5, 0xba, 0x74, 0x72,
+	0x21, 0xe4, 0x26, 0xdf, 0x94, 0x52, 0x28, 0x23, 0x1e, 0xbc, 0x59, 0xe0, 0xd2, 0x33, 0xae, 0x63,
+	0x6d, 0x1a, 0x88, 0xed, 0x6a, 0x50, 0x81, 0xf3, 0x83, 0x21, 0xbc, 0x00, 0xdd, 0x29, 0x1d, 0xc7,
+	0xc1, 0x30, 0x7a, 0x88, 0x02, 0xdf, 0x3e, 0x82, 0x5d, 0xd0, 0x99, 0xd2, 0x47, 0x3a, 0x7a, 0xa6,
+	0xb6, 0x05, 0x7b, 0xe0, 0x7a, 0x48, 0x9e, 0x62, 0x12, 0x85, 0x34, 0xf3, 0x22, 0xdf, 0x8f, 0x68,
+	0x98, 0x8d, 0x27, 0x09, 0x99, 0x04, 0xe1, 0x8b, 0x7d, 0x02, 0xcf, 0xc0, 0x29, 0xf1, 0xb3, 0x30,
+	0x19, 0x4d, 0x63, 0xbb, 0x0d, 0xaf, 0x00, 0x6c, 0x7e, 0xd9, 0x30, 0x89, 0x26, 0x41, 0x12, 0x8d,
+	0xa8, 0xdd, 0xf1, 0xbe, 0x2c, 0xd0, 0x5f, 0xc8, 0x15, 0xfa, 0x37, 0x8d, 0x07, 0x0f, 0xee, 0x8a,
+	0xeb, 0x0c, 0xb1, 0xf5, 0xea, 0xfd, 0x8a, 0xb8, 0x5c, 0xe6, 0x82, 0x23, 0x59, 0x71, 0x87, 0x17,
+	0x42, 0x27, 0x6c, 0x6a, 0x5c, 0x97, 0xea, 0x8f, 0x56, 0xef, 0xf5, 0xfb, 0xde, 0x3a, 0x0e, 0x09,
+	0xf9, 0x68, 0xf5, 0x42, 0x63, 0x45, 0x98, 0x42, 0x06, 0xd6, 0x68, 0xe6, 0xa2, 0xba, 0x18, 0xf5,
+	0xd9, 0xec, 0x53, 0xc2, 0x54, 0xba, 0xdf, 0xa7, 0x33, 0x37, 0xd5, 0xfb, 0xef, 0x56, 0xdf, 0x0c,
+	0x31, 0x26, 0x4c, 0x61, 0xbc, 0x67, 0x60, 0x3c, 0x73, 0x31, 0xd6, 0x9c, 0x79, 0x5b, 0x1f, 0xe6,
+	0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x97, 0x6b, 0xfe, 0x2a, 0xed, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/bidding_strategy_status.pb.go b/googleapis/ads/googleads/v3/enums/bidding_strategy_status.pb.go
new file mode 100644
index 0000000..8e0fa22
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/bidding_strategy_status.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/bidding_strategy_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible statuses of a BiddingStrategy.
+type BiddingStrategyStatusEnum_BiddingStrategyStatus int32
+
+const (
+	// No value has been specified.
+	BiddingStrategyStatusEnum_UNSPECIFIED BiddingStrategyStatusEnum_BiddingStrategyStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	BiddingStrategyStatusEnum_UNKNOWN BiddingStrategyStatusEnum_BiddingStrategyStatus = 1
+	// The bidding strategy is enabled.
+	BiddingStrategyStatusEnum_ENABLED BiddingStrategyStatusEnum_BiddingStrategyStatus = 2
+	// The bidding strategy is removed.
+	BiddingStrategyStatusEnum_REMOVED BiddingStrategyStatusEnum_BiddingStrategyStatus = 4
+)
+
+var BiddingStrategyStatusEnum_BiddingStrategyStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	4: "REMOVED",
+}
+
+var BiddingStrategyStatusEnum_BiddingStrategyStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     4,
+}
+
+func (x BiddingStrategyStatusEnum_BiddingStrategyStatus) String() string {
+	return proto.EnumName(BiddingStrategyStatusEnum_BiddingStrategyStatus_name, int32(x))
+}
+
+func (BiddingStrategyStatusEnum_BiddingStrategyStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_24139d4c475931a6, []int{0, 0}
+}
+
+// Message describing BiddingStrategy statuses.
+type BiddingStrategyStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BiddingStrategyStatusEnum) Reset()         { *m = BiddingStrategyStatusEnum{} }
+func (m *BiddingStrategyStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*BiddingStrategyStatusEnum) ProtoMessage()    {}
+func (*BiddingStrategyStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_24139d4c475931a6, []int{0}
+}
+
+func (m *BiddingStrategyStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BiddingStrategyStatusEnum.Unmarshal(m, b)
+}
+func (m *BiddingStrategyStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BiddingStrategyStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *BiddingStrategyStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BiddingStrategyStatusEnum.Merge(m, src)
+}
+func (m *BiddingStrategyStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_BiddingStrategyStatusEnum.Size(m)
+}
+func (m *BiddingStrategyStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BiddingStrategyStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BiddingStrategyStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BiddingStrategyStatusEnum_BiddingStrategyStatus", BiddingStrategyStatusEnum_BiddingStrategyStatus_name, BiddingStrategyStatusEnum_BiddingStrategyStatus_value)
+	proto.RegisterType((*BiddingStrategyStatusEnum)(nil), "google.ads.googleads.v3.enums.BiddingStrategyStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/bidding_strategy_status.proto", fileDescriptor_24139d4c475931a6)
+}
+
+var fileDescriptor_24139d4c475931a6 = []byte{
+	// 308 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4a, 0x2b, 0x31,
+	0x14, 0x7d, 0x9d, 0x27, 0x0a, 0xe9, 0xc2, 0xa1, 0xe0, 0xc2, 0x62, 0x17, 0xed, 0x07, 0x24, 0x8b,
+	0xec, 0xd2, 0x55, 0xc6, 0xc6, 0x52, 0xd4, 0x69, 0xb1, 0x74, 0x04, 0x19, 0x28, 0xa9, 0x19, 0xc2,
+	0x40, 0x9b, 0x94, 0x26, 0x53, 0xf0, 0x77, 0x5c, 0xfa, 0x29, 0x7e, 0x8a, 0x1b, 0x7f, 0x41, 0x92,
+	0xcc, 0xcc, 0xaa, 0xba, 0x09, 0xe7, 0xe6, 0xdc, 0x73, 0xee, 0xb9, 0x17, 0x8c, 0xa5, 0xd6, 0x72,
+	0x5b, 0x20, 0x2e, 0x0c, 0x0a, 0xd0, 0xa1, 0x23, 0x46, 0x85, 0xaa, 0x76, 0x06, 0x6d, 0x4a, 0x21,
+	0x4a, 0x25, 0xd7, 0xc6, 0x1e, 0xb8, 0x2d, 0xe4, 0xdb, 0xda, 0x58, 0x6e, 0x2b, 0x03, 0xf7, 0x07,
+	0x6d, 0x75, 0x6f, 0x10, 0x14, 0x90, 0x0b, 0x03, 0x5b, 0x31, 0x3c, 0x62, 0xe8, 0xc5, 0xfd, 0x9b,
+	0xc6, 0x7b, 0x5f, 0x22, 0xae, 0x94, 0xb6, 0xdc, 0x96, 0x5a, 0xd5, 0xe2, 0xd1, 0x16, 0x5c, 0x27,
+	0xc1, 0x7d, 0x59, 0x9b, 0x2f, 0xbd, 0x37, 0x53, 0xd5, 0x6e, 0x34, 0x07, 0x57, 0x27, 0xc9, 0xde,
+	0x25, 0xe8, 0xae, 0xd2, 0xe5, 0x82, 0xdd, 0xce, 0xee, 0x66, 0x6c, 0x12, 0xff, 0xeb, 0x75, 0xc1,
+	0xc5, 0x2a, 0xbd, 0x4f, 0xe7, 0xcf, 0x69, 0xdc, 0x71, 0x05, 0x4b, 0x69, 0xf2, 0xc0, 0x26, 0x71,
+	0xe4, 0x8a, 0x27, 0xf6, 0x38, 0xcf, 0xd8, 0x24, 0x3e, 0x4b, 0xbe, 0x3b, 0x60, 0xf8, 0xaa, 0x77,
+	0xf0, 0xcf, 0xc4, 0x49, 0xff, 0xe4, 0xd0, 0x85, 0xcb, 0xbb, 0xe8, 0xbc, 0x24, 0xb5, 0x58, 0xea,
+	0x2d, 0x57, 0x12, 0xea, 0x83, 0x44, 0xb2, 0x50, 0x7e, 0x9b, 0xe6, 0x76, 0xfb, 0xd2, 0xfc, 0x72,
+	0xca, 0xb1, 0x7f, 0xdf, 0xa3, 0xff, 0x53, 0x4a, 0x3f, 0xa2, 0xc1, 0x34, 0x58, 0x51, 0x61, 0x60,
+	0x80, 0x0e, 0x65, 0x18, 0xba, 0xed, 0xcd, 0x67, 0xc3, 0xe7, 0x54, 0x98, 0xbc, 0xe5, 0xf3, 0x0c,
+	0xe7, 0x9e, 0xff, 0x8a, 0x86, 0xe1, 0x93, 0x10, 0x2a, 0x0c, 0x21, 0x6d, 0x07, 0x21, 0x19, 0x26,
+	0xc4, 0xf7, 0x6c, 0xce, 0x7d, 0x30, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0x44, 0x5f, 0x08, 0x27,
+	0xe2, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/bidding_strategy_type.pb.go b/googleapis/ads/googleads/v3/enums/bidding_strategy_type.pb.go
new file mode 100644
index 0000000..65bf9e0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/bidding_strategy_type.pb.go
@@ -0,0 +1,207 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/bidding_strategy_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible bidding strategy types.
+type BiddingStrategyTypeEnum_BiddingStrategyType int32
+
+const (
+	// Not specified.
+	BiddingStrategyTypeEnum_UNSPECIFIED BiddingStrategyTypeEnum_BiddingStrategyType = 0
+	// Used for return value only. Represents value unknown in this version.
+	BiddingStrategyTypeEnum_UNKNOWN BiddingStrategyTypeEnum_BiddingStrategyType = 1
+	// Commission is an automatic bidding strategy in which the advertiser pays
+	// a certain portion of the conversion value.
+	BiddingStrategyTypeEnum_COMMISSION BiddingStrategyTypeEnum_BiddingStrategyType = 16
+	// Enhanced CPC is a bidding strategy that raises bids for clicks
+	// that seem more likely to lead to a conversion and lowers
+	// them for clicks where they seem less likely.
+	BiddingStrategyTypeEnum_ENHANCED_CPC BiddingStrategyTypeEnum_BiddingStrategyType = 2
+	// Manual click based bidding where user pays per click.
+	BiddingStrategyTypeEnum_MANUAL_CPC BiddingStrategyTypeEnum_BiddingStrategyType = 3
+	// Manual impression based bidding
+	// where user pays per thousand impressions.
+	BiddingStrategyTypeEnum_MANUAL_CPM BiddingStrategyTypeEnum_BiddingStrategyType = 4
+	// A bidding strategy that pays a configurable amount per video view.
+	BiddingStrategyTypeEnum_MANUAL_CPV BiddingStrategyTypeEnum_BiddingStrategyType = 13
+	// A bidding strategy that automatically maximizes number of conversions
+	// given a daily budget.
+	BiddingStrategyTypeEnum_MAXIMIZE_CONVERSIONS BiddingStrategyTypeEnum_BiddingStrategyType = 10
+	// An automated bidding strategy that automatically sets bids to maximize
+	// revenue while spending your budget.
+	BiddingStrategyTypeEnum_MAXIMIZE_CONVERSION_VALUE BiddingStrategyTypeEnum_BiddingStrategyType = 11
+	// Page-One Promoted bidding scheme, which sets max cpc bids to
+	// target impressions on page one or page one promoted slots on google.com.
+	// This enum value is deprecated.
+	BiddingStrategyTypeEnum_PAGE_ONE_PROMOTED BiddingStrategyTypeEnum_BiddingStrategyType = 5
+	// Percent Cpc is bidding strategy where bids are a fraction of the
+	// advertised price for some good or service.
+	BiddingStrategyTypeEnum_PERCENT_CPC BiddingStrategyTypeEnum_BiddingStrategyType = 12
+	// Target CPA is an automated bid strategy that sets bids
+	// to help get as many conversions as possible
+	// at the target cost-per-acquisition (CPA) you set.
+	BiddingStrategyTypeEnum_TARGET_CPA BiddingStrategyTypeEnum_BiddingStrategyType = 6
+	// Target CPM is an automated bid strategy that sets bids to help get
+	// as many impressions as possible at the target cost per one thousand
+	// impressions (CPM) you set.
+	BiddingStrategyTypeEnum_TARGET_CPM BiddingStrategyTypeEnum_BiddingStrategyType = 14
+	// An automated bidding strategy that sets bids so that a certain percentage
+	// of search ads are shown at the top of the first page (or other targeted
+	// location).
+	BiddingStrategyTypeEnum_TARGET_IMPRESSION_SHARE BiddingStrategyTypeEnum_BiddingStrategyType = 15
+	// Target Outrank Share is an automated bidding strategy that sets bids
+	// based on the target fraction of auctions where the advertiser
+	// should outrank a specific competitor.
+	// This enum value is deprecated.
+	BiddingStrategyTypeEnum_TARGET_OUTRANK_SHARE BiddingStrategyTypeEnum_BiddingStrategyType = 7
+	// Target ROAS is an automated bidding strategy
+	// that helps you maximize revenue while averaging
+	// a specific target Return On Average Spend (ROAS).
+	BiddingStrategyTypeEnum_TARGET_ROAS BiddingStrategyTypeEnum_BiddingStrategyType = 8
+	// Target Spend is an automated bid strategy that sets your bids
+	// to help get as many clicks as possible within your budget.
+	BiddingStrategyTypeEnum_TARGET_SPEND BiddingStrategyTypeEnum_BiddingStrategyType = 9
+)
+
+var BiddingStrategyTypeEnum_BiddingStrategyType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	16: "COMMISSION",
+	2:  "ENHANCED_CPC",
+	3:  "MANUAL_CPC",
+	4:  "MANUAL_CPM",
+	13: "MANUAL_CPV",
+	10: "MAXIMIZE_CONVERSIONS",
+	11: "MAXIMIZE_CONVERSION_VALUE",
+	5:  "PAGE_ONE_PROMOTED",
+	12: "PERCENT_CPC",
+	6:  "TARGET_CPA",
+	14: "TARGET_CPM",
+	15: "TARGET_IMPRESSION_SHARE",
+	7:  "TARGET_OUTRANK_SHARE",
+	8:  "TARGET_ROAS",
+	9:  "TARGET_SPEND",
+}
+
+var BiddingStrategyTypeEnum_BiddingStrategyType_value = map[string]int32{
+	"UNSPECIFIED":               0,
+	"UNKNOWN":                   1,
+	"COMMISSION":                16,
+	"ENHANCED_CPC":              2,
+	"MANUAL_CPC":                3,
+	"MANUAL_CPM":                4,
+	"MANUAL_CPV":                13,
+	"MAXIMIZE_CONVERSIONS":      10,
+	"MAXIMIZE_CONVERSION_VALUE": 11,
+	"PAGE_ONE_PROMOTED":         5,
+	"PERCENT_CPC":               12,
+	"TARGET_CPA":                6,
+	"TARGET_CPM":                14,
+	"TARGET_IMPRESSION_SHARE":   15,
+	"TARGET_OUTRANK_SHARE":      7,
+	"TARGET_ROAS":               8,
+	"TARGET_SPEND":              9,
+}
+
+func (x BiddingStrategyTypeEnum_BiddingStrategyType) String() string {
+	return proto.EnumName(BiddingStrategyTypeEnum_BiddingStrategyType_name, int32(x))
+}
+
+func (BiddingStrategyTypeEnum_BiddingStrategyType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a3fd4c3a5138f25d, []int{0, 0}
+}
+
+// Container for enum describing possible bidding strategy types.
+type BiddingStrategyTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BiddingStrategyTypeEnum) Reset()         { *m = BiddingStrategyTypeEnum{} }
+func (m *BiddingStrategyTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*BiddingStrategyTypeEnum) ProtoMessage()    {}
+func (*BiddingStrategyTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a3fd4c3a5138f25d, []int{0}
+}
+
+func (m *BiddingStrategyTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BiddingStrategyTypeEnum.Unmarshal(m, b)
+}
+func (m *BiddingStrategyTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BiddingStrategyTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *BiddingStrategyTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BiddingStrategyTypeEnum.Merge(m, src)
+}
+func (m *BiddingStrategyTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_BiddingStrategyTypeEnum.Size(m)
+}
+func (m *BiddingStrategyTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BiddingStrategyTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BiddingStrategyTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BiddingStrategyTypeEnum_BiddingStrategyType", BiddingStrategyTypeEnum_BiddingStrategyType_name, BiddingStrategyTypeEnum_BiddingStrategyType_value)
+	proto.RegisterType((*BiddingStrategyTypeEnum)(nil), "google.ads.googleads.v3.enums.BiddingStrategyTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/bidding_strategy_type.proto", fileDescriptor_a3fd4c3a5138f25d)
+}
+
+var fileDescriptor_a3fd4c3a5138f25d = []byte{
+	// 466 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xcd, 0x6e, 0xd3, 0x40,
+	0x10, 0xc7, 0xa9, 0x0b, 0x2d, 0x6c, 0x4a, 0xbb, 0x18, 0x50, 0xcb, 0x47, 0x0e, 0xed, 0x03, 0xac,
+	0x0f, 0x3e, 0x61, 0x4e, 0x1b, 0x67, 0x49, 0xad, 0x76, 0x3f, 0xe4, 0x2f, 0x50, 0x15, 0xc9, 0x72,
+	0xb1, 0x65, 0x59, 0x6a, 0xbc, 0x56, 0xd6, 0xad, 0x94, 0xd7, 0xe1, 0xc8, 0xa3, 0xf0, 0x14, 0x9c,
+	0x91, 0x78, 0x03, 0x0e, 0x68, 0xd7, 0x4e, 0xa4, 0x48, 0x81, 0x8b, 0x35, 0xff, 0xfd, 0xcd, 0xfc,
+	0x77, 0xbc, 0x33, 0xe0, 0x43, 0x25, 0x65, 0x75, 0x57, 0x3a, 0x79, 0xa1, 0x9c, 0x3e, 0xd4, 0xd1,
+	0x83, 0xeb, 0x94, 0xcd, 0xfd, 0x42, 0x39, 0xb7, 0x75, 0x51, 0xd4, 0x4d, 0x95, 0xa9, 0x6e, 0x99,
+	0x77, 0x65, 0xb5, 0xca, 0xba, 0x55, 0x5b, 0xa2, 0x76, 0x29, 0x3b, 0x69, 0x8f, 0xfb, 0x7c, 0x94,
+	0x17, 0x0a, 0x6d, 0x4a, 0xd1, 0x83, 0x8b, 0x4c, 0xe9, 0xdb, 0xf7, 0x6b, 0xe7, 0xb6, 0x76, 0xf2,
+	0xa6, 0x91, 0x5d, 0xde, 0xd5, 0xb2, 0x51, 0x7d, 0xf1, 0xc5, 0x1f, 0x0b, 0x9c, 0x4e, 0x7a, 0xf3,
+	0x68, 0xf0, 0x8e, 0x57, 0x6d, 0x49, 0x9a, 0xfb, 0xc5, 0xc5, 0x4f, 0x0b, 0xbc, 0xdc, 0xc1, 0xec,
+	0x13, 0x30, 0x4a, 0x58, 0x24, 0x88, 0x1f, 0x7c, 0x0a, 0xc8, 0x14, 0x3e, 0xb2, 0x47, 0xe0, 0x30,
+	0x61, 0x57, 0x8c, 0x7f, 0x66, 0x70, 0xcf, 0x3e, 0x06, 0xc0, 0xe7, 0x94, 0x06, 0x51, 0x14, 0x70,
+	0x06, 0xa1, 0x0d, 0xc1, 0x11, 0x61, 0x97, 0x98, 0xf9, 0x64, 0x9a, 0xf9, 0xc2, 0x87, 0x96, 0xce,
+	0xa0, 0x98, 0x25, 0xf8, 0xda, 0xe8, 0xfd, 0x2d, 0x4d, 0xe1, 0xe3, 0x2d, 0x9d, 0xc2, 0xe7, 0xf6,
+	0x19, 0x78, 0x45, 0xf1, 0x97, 0x80, 0x06, 0x37, 0x24, 0xf3, 0x39, 0x4b, 0x49, 0xa8, 0xad, 0x23,
+	0x08, 0xec, 0x31, 0x78, 0xb3, 0x83, 0x64, 0x29, 0xbe, 0x4e, 0x08, 0x1c, 0xd9, 0xaf, 0xc1, 0x0b,
+	0x81, 0x67, 0x24, 0xe3, 0x8c, 0x64, 0x22, 0xe4, 0x94, 0xc7, 0x64, 0x0a, 0x9f, 0xe8, 0xfe, 0x05,
+	0x09, 0x7d, 0xc2, 0x62, 0xd3, 0xc0, 0x91, 0xbe, 0x30, 0xc6, 0xe1, 0x8c, 0x68, 0x8d, 0xe1, 0xc1,
+	0x96, 0xa6, 0xf0, 0xd8, 0x7e, 0x07, 0x4e, 0x07, 0x1d, 0x50, 0x11, 0x12, 0xf3, 0x67, 0x59, 0x74,
+	0x89, 0x43, 0x02, 0x4f, 0x74, 0x77, 0x03, 0xe4, 0x49, 0x1c, 0x62, 0x76, 0x35, 0x90, 0x43, 0x7d,
+	0xcf, 0x40, 0x42, 0x8e, 0x23, 0xf8, 0x54, 0x3f, 0xc5, 0x70, 0x10, 0x09, 0xc2, 0xa6, 0xf0, 0xd9,
+	0xe4, 0xf7, 0x1e, 0x38, 0xff, 0x2a, 0x17, 0xe8, 0xbf, 0x23, 0x9c, 0x9c, 0xed, 0x98, 0x82, 0xd0,
+	0xe3, 0x13, 0x7b, 0x37, 0x93, 0xa1, 0xb4, 0x92, 0x77, 0x79, 0x53, 0x21, 0xb9, 0xac, 0x9c, 0xaa,
+	0x6c, 0xcc, 0x70, 0xd7, 0x8b, 0xd4, 0xd6, 0xea, 0x1f, 0x7b, 0xf5, 0xd1, 0x7c, 0xbf, 0x59, 0xfb,
+	0x33, 0x8c, 0xbf, 0x5b, 0xe3, 0x59, 0x6f, 0x85, 0x0b, 0x85, 0xfa, 0x50, 0x47, 0xa9, 0x8b, 0xf4,
+	0x36, 0xa8, 0x1f, 0x6b, 0x3e, 0xc7, 0x85, 0x9a, 0x6f, 0xf8, 0x3c, 0x75, 0xe7, 0x86, 0xff, 0xb2,
+	0xce, 0xfb, 0x43, 0xcf, 0xc3, 0x85, 0xf2, 0xbc, 0x4d, 0x86, 0xe7, 0xa5, 0xae, 0xe7, 0x99, 0x9c,
+	0xdb, 0x03, 0xd3, 0x98, 0xfb, 0x37, 0x00, 0x00, 0xff, 0xff, 0x6a, 0xb0, 0x0b, 0xa0, 0xef, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/billing_setup_status.pb.go b/googleapis/ads/googleads/v3/enums/billing_setup_status.pb.go
new file mode 100644
index 0000000..2fcb951
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/billing_setup_status.pb.go
@@ -0,0 +1,135 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/billing_setup_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible statuses of a BillingSetup.
+type BillingSetupStatusEnum_BillingSetupStatus int32
+
+const (
+	// Not specified.
+	BillingSetupStatusEnum_UNSPECIFIED BillingSetupStatusEnum_BillingSetupStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	BillingSetupStatusEnum_UNKNOWN BillingSetupStatusEnum_BillingSetupStatus = 1
+	// The billing setup is pending approval.
+	BillingSetupStatusEnum_PENDING BillingSetupStatusEnum_BillingSetupStatus = 2
+	// The billing setup has been approved but the corresponding first budget
+	// has not.  This can only occur for billing setups configured for monthly
+	// invoicing.
+	BillingSetupStatusEnum_APPROVED_HELD BillingSetupStatusEnum_BillingSetupStatus = 3
+	// The billing setup has been approved.
+	BillingSetupStatusEnum_APPROVED BillingSetupStatusEnum_BillingSetupStatus = 4
+	// The billing setup was cancelled by the user prior to approval.
+	BillingSetupStatusEnum_CANCELLED BillingSetupStatusEnum_BillingSetupStatus = 5
+)
+
+var BillingSetupStatusEnum_BillingSetupStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PENDING",
+	3: "APPROVED_HELD",
+	4: "APPROVED",
+	5: "CANCELLED",
+}
+
+var BillingSetupStatusEnum_BillingSetupStatus_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"PENDING":       2,
+	"APPROVED_HELD": 3,
+	"APPROVED":      4,
+	"CANCELLED":     5,
+}
+
+func (x BillingSetupStatusEnum_BillingSetupStatus) String() string {
+	return proto.EnumName(BillingSetupStatusEnum_BillingSetupStatus_name, int32(x))
+}
+
+func (BillingSetupStatusEnum_BillingSetupStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0274de631061209b, []int{0, 0}
+}
+
+// Message describing BillingSetup statuses.
+type BillingSetupStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BillingSetupStatusEnum) Reset()         { *m = BillingSetupStatusEnum{} }
+func (m *BillingSetupStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*BillingSetupStatusEnum) ProtoMessage()    {}
+func (*BillingSetupStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0274de631061209b, []int{0}
+}
+
+func (m *BillingSetupStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BillingSetupStatusEnum.Unmarshal(m, b)
+}
+func (m *BillingSetupStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BillingSetupStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *BillingSetupStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BillingSetupStatusEnum.Merge(m, src)
+}
+func (m *BillingSetupStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_BillingSetupStatusEnum.Size(m)
+}
+func (m *BillingSetupStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BillingSetupStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BillingSetupStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BillingSetupStatusEnum_BillingSetupStatus", BillingSetupStatusEnum_BillingSetupStatus_name, BillingSetupStatusEnum_BillingSetupStatus_value)
+	proto.RegisterType((*BillingSetupStatusEnum)(nil), "google.ads.googleads.v3.enums.BillingSetupStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/billing_setup_status.proto", fileDescriptor_0274de631061209b)
+}
+
+var fileDescriptor_0274de631061209b = []byte{
+	// 333 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xdd, 0x4a, 0xc3, 0x30,
+	0x18, 0xb5, 0x9d, 0xbf, 0x99, 0xc3, 0x9a, 0x0b, 0x05, 0x71, 0x17, 0xdb, 0x03, 0xa4, 0x17, 0xbd,
+	0x91, 0x78, 0x95, 0xae, 0x71, 0x0e, 0x47, 0x56, 0x1c, 0xab, 0x20, 0x85, 0xd1, 0xd9, 0x12, 0x0a,
+	0x5d, 0x52, 0x96, 0x76, 0xef, 0xe0, 0x6b, 0x78, 0xe9, 0xa3, 0xf8, 0x28, 0xe2, 0x43, 0x48, 0xd3,
+	0xb5, 0x37, 0x43, 0x6f, 0xc2, 0xc9, 0x77, 0xbe, 0x73, 0xf8, 0xce, 0x01, 0x77, 0x5c, 0x4a, 0x9e,
+	0x25, 0x76, 0x14, 0x2b, 0xbb, 0x86, 0x15, 0xda, 0x3a, 0x76, 0x22, 0xca, 0xb5, 0xb2, 0x57, 0x69,
+	0x96, 0xa5, 0x82, 0x2f, 0x55, 0x52, 0x94, 0xf9, 0x52, 0x15, 0x51, 0x51, 0x2a, 0x94, 0x6f, 0x64,
+	0x21, 0x61, 0xbf, 0x5e, 0x47, 0x51, 0xac, 0x50, 0xab, 0x44, 0x5b, 0x07, 0x69, 0xe5, 0xcd, 0x6d,
+	0x63, 0x9c, 0xa7, 0x76, 0x24, 0x84, 0x2c, 0xa2, 0x22, 0x95, 0x62, 0x27, 0x1e, 0xbe, 0x1b, 0xe0,
+	0xca, 0xad, 0xbd, 0xe7, 0x95, 0xf5, 0x5c, 0x3b, 0x53, 0x51, 0xae, 0x87, 0x12, 0xc0, 0x7d, 0x06,
+	0x5e, 0x80, 0xee, 0x82, 0xcd, 0x7d, 0x3a, 0x9a, 0x3c, 0x4c, 0xa8, 0x67, 0x1d, 0xc0, 0x2e, 0x38,
+	0x59, 0xb0, 0x27, 0x36, 0x7b, 0x61, 0x96, 0x51, 0x7d, 0x7c, 0xca, 0xbc, 0x09, 0x1b, 0x5b, 0x26,
+	0xbc, 0x04, 0x3d, 0xe2, 0xfb, 0xcf, 0xb3, 0x80, 0x7a, 0xcb, 0x47, 0x3a, 0xf5, 0xac, 0x0e, 0x3c,
+	0x07, 0xa7, 0xcd, 0xc8, 0x3a, 0x84, 0x3d, 0x70, 0x36, 0x22, 0x6c, 0x44, 0xa7, 0x53, 0xea, 0x59,
+	0x47, 0xee, 0x8f, 0x01, 0x06, 0x6f, 0x72, 0x8d, 0xfe, 0xcd, 0xe3, 0x5e, 0xef, 0x1f, 0xe5, 0x57,
+	0x51, 0x7c, 0xe3, 0xd5, 0xdd, 0x29, 0xb9, 0xcc, 0x22, 0xc1, 0x91, 0xdc, 0x70, 0x9b, 0x27, 0x42,
+	0x07, 0x6d, 0x3a, 0xcd, 0x53, 0xf5, 0x47, 0xc5, 0xf7, 0xfa, 0xfd, 0x30, 0x3b, 0x63, 0x42, 0x3e,
+	0xcd, 0xfe, 0xb8, 0xb6, 0x22, 0xb1, 0x42, 0x35, 0xac, 0x50, 0xe0, 0xa0, 0xaa, 0x1a, 0xf5, 0xd5,
+	0xf0, 0x21, 0x89, 0x55, 0xd8, 0xf2, 0x61, 0xe0, 0x84, 0x9a, 0xff, 0x36, 0x07, 0xf5, 0x10, 0x63,
+	0x12, 0x2b, 0x8c, 0xdb, 0x0d, 0x8c, 0x03, 0x07, 0x63, 0xbd, 0xb3, 0x3a, 0xd6, 0x87, 0x39, 0xbf,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x5e, 0x25, 0x32, 0xfa, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/brand_safety_suitability.pb.go b/googleapis/ads/googleads/v3/enums/brand_safety_suitability.pb.go
new file mode 100644
index 0000000..a2d0edc
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/brand_safety_suitability.pb.go
@@ -0,0 +1,150 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/brand_safety_suitability.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// 3-Tier brand safety suitability control.
+type BrandSafetySuitabilityEnum_BrandSafetySuitability int32
+
+const (
+	// Not specified.
+	BrandSafetySuitabilityEnum_UNSPECIFIED BrandSafetySuitabilityEnum_BrandSafetySuitability = 0
+	// Used for return value only. Represents value unknown in this version.
+	BrandSafetySuitabilityEnum_UNKNOWN BrandSafetySuitabilityEnum_BrandSafetySuitability = 1
+	// This option lets you show ads across all inventory on YouTube and video
+	// partners that meet our standards for monetization. This option may be an
+	// appropriate choice for brands that want maximum access to the full
+	// breadth of videos eligible for ads, including, for example, videos that
+	// have strong profanity in the context of comedy or a documentary, or
+	// excessive violence as featured in video games.
+	BrandSafetySuitabilityEnum_EXPANDED_INVENTORY BrandSafetySuitabilityEnum_BrandSafetySuitability = 2
+	// This option lets you show ads across a wide range of content that's
+	// appropriate for most brands, such as popular music videos, documentaries,
+	// and movie trailers. The content you can show ads on is based on YouTube's
+	// advertiser-friendly content guidelines that take into account, for
+	// example, the strength or frequency of profanity, or the appropriateness
+	// of subject matter like sensitive events. Ads won't show, for example, on
+	// content with repeated strong profanity, strong sexual content, or graphic
+	// violence.
+	BrandSafetySuitabilityEnum_STANDARD_INVENTORY BrandSafetySuitabilityEnum_BrandSafetySuitability = 3
+	// This option lets you show ads on a reduced range of content that's
+	// appropriate for brands with particularly strict guidelines around
+	// inappropriate language and sexual suggestiveness; above and beyond what
+	// YouTube's advertiser-friendly content guidelines address. The videos
+	// accessible in this sensitive category meet heightened requirements,
+	// especially for inappropriate language and sexual suggestiveness. For
+	// example, your ads will be excluded from showing on some of YouTube's most
+	// popular music videos and other pop culture content across YouTube and
+	// Google video partners.
+	BrandSafetySuitabilityEnum_LIMITED_INVENTORY BrandSafetySuitabilityEnum_BrandSafetySuitability = 4
+)
+
+var BrandSafetySuitabilityEnum_BrandSafetySuitability_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "EXPANDED_INVENTORY",
+	3: "STANDARD_INVENTORY",
+	4: "LIMITED_INVENTORY",
+}
+
+var BrandSafetySuitabilityEnum_BrandSafetySuitability_value = map[string]int32{
+	"UNSPECIFIED":        0,
+	"UNKNOWN":            1,
+	"EXPANDED_INVENTORY": 2,
+	"STANDARD_INVENTORY": 3,
+	"LIMITED_INVENTORY":  4,
+}
+
+func (x BrandSafetySuitabilityEnum_BrandSafetySuitability) String() string {
+	return proto.EnumName(BrandSafetySuitabilityEnum_BrandSafetySuitability_name, int32(x))
+}
+
+func (BrandSafetySuitabilityEnum_BrandSafetySuitability) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_86b8ec423673ab58, []int{0, 0}
+}
+
+// Container for enum with 3-Tier brand safety suitability control.
+type BrandSafetySuitabilityEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BrandSafetySuitabilityEnum) Reset()         { *m = BrandSafetySuitabilityEnum{} }
+func (m *BrandSafetySuitabilityEnum) String() string { return proto.CompactTextString(m) }
+func (*BrandSafetySuitabilityEnum) ProtoMessage()    {}
+func (*BrandSafetySuitabilityEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86b8ec423673ab58, []int{0}
+}
+
+func (m *BrandSafetySuitabilityEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BrandSafetySuitabilityEnum.Unmarshal(m, b)
+}
+func (m *BrandSafetySuitabilityEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BrandSafetySuitabilityEnum.Marshal(b, m, deterministic)
+}
+func (m *BrandSafetySuitabilityEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BrandSafetySuitabilityEnum.Merge(m, src)
+}
+func (m *BrandSafetySuitabilityEnum) XXX_Size() int {
+	return xxx_messageInfo_BrandSafetySuitabilityEnum.Size(m)
+}
+func (m *BrandSafetySuitabilityEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BrandSafetySuitabilityEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BrandSafetySuitabilityEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BrandSafetySuitabilityEnum_BrandSafetySuitability", BrandSafetySuitabilityEnum_BrandSafetySuitability_name, BrandSafetySuitabilityEnum_BrandSafetySuitability_value)
+	proto.RegisterType((*BrandSafetySuitabilityEnum)(nil), "google.ads.googleads.v3.enums.BrandSafetySuitabilityEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/brand_safety_suitability.proto", fileDescriptor_86b8ec423673ab58)
+}
+
+var fileDescriptor_86b8ec423673ab58 = []byte{
+	// 337 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4e, 0xc2, 0x30,
+	0x1c, 0x76, 0xc3, 0x68, 0x52, 0x0e, 0xe2, 0x12, 0x39, 0xa0, 0x1c, 0xe0, 0x01, 0xba, 0xc3, 0x6e,
+	0xd5, 0x4b, 0xe7, 0x26, 0x59, 0xd4, 0xb2, 0x30, 0x98, 0x7f, 0xb2, 0x84, 0x14, 0x37, 0x97, 0x25,
+	0xd0, 0x12, 0x3a, 0x48, 0x38, 0xf8, 0x24, 0xde, 0x3c, 0xfa, 0x28, 0x3e, 0x8a, 0x27, 0x1f, 0xc1,
+	0xb4, 0x95, 0xa9, 0x09, 0x7a, 0x69, 0xbe, 0xfc, 0xbe, 0x3f, 0xe9, 0xf7, 0x81, 0xb3, 0x9c, 0xf3,
+	0x7c, 0x9a, 0xd9, 0x34, 0x15, 0xb6, 0x86, 0x12, 0xad, 0x1c, 0x3b, 0x63, 0xcb, 0x99, 0xb0, 0x27,
+	0x0b, 0xca, 0xd2, 0xb1, 0xa0, 0x8f, 0x59, 0xb9, 0x1e, 0x8b, 0x65, 0x51, 0xd2, 0x49, 0x31, 0x2d,
+	0xca, 0x35, 0x9c, 0x2f, 0x78, 0xc9, 0xad, 0xb6, 0xb6, 0x40, 0x9a, 0x0a, 0x58, 0xb9, 0xe1, 0xca,
+	0x81, 0xca, 0xdd, 0x3a, 0xd9, 0x84, 0xcf, 0x0b, 0x9b, 0x32, 0xc6, 0x4b, 0x5a, 0x16, 0x9c, 0x09,
+	0x6d, 0xee, 0x3e, 0x1b, 0xa0, 0xe5, 0xca, 0xfc, 0x48, 0xc5, 0x47, 0xdf, 0xe9, 0x3e, 0x5b, 0xce,
+	0xba, 0x4f, 0xa0, 0xb9, 0x9d, 0xb5, 0x0e, 0x40, 0x7d, 0x44, 0xa2, 0xd0, 0x3f, 0x0f, 0x2e, 0x02,
+	0xdf, 0x6b, 0xec, 0x58, 0x75, 0xb0, 0x3f, 0x22, 0x97, 0xa4, 0x7f, 0x43, 0x1a, 0x86, 0xd5, 0x04,
+	0x96, 0x7f, 0x1b, 0x62, 0xe2, 0xf9, 0xde, 0x38, 0x20, 0xb1, 0x4f, 0x86, 0xfd, 0xc1, 0x5d, 0xc3,
+	0x94, 0xf7, 0x68, 0x88, 0x89, 0x87, 0x07, 0x3f, 0xef, 0x35, 0xeb, 0x08, 0x1c, 0x5e, 0x05, 0xd7,
+	0xc1, 0xf0, 0x97, 0x7c, 0xd7, 0xfd, 0x30, 0x40, 0xe7, 0x81, 0xcf, 0xe0, 0xbf, 0x0d, 0xdd, 0xe3,
+	0xed, 0x5f, 0x0c, 0x65, 0xc1, 0xd0, 0xb8, 0x77, 0xbf, 0xdc, 0x39, 0x9f, 0x52, 0x96, 0x43, 0xbe,
+	0xc8, 0xed, 0x3c, 0x63, 0xaa, 0xfe, 0x66, 0xed, 0x79, 0x21, 0xfe, 0x18, 0xff, 0x54, 0xbd, 0x2f,
+	0x66, 0xad, 0x87, 0xf1, 0xab, 0xd9, 0xee, 0xe9, 0x28, 0x9c, 0x0a, 0xa8, 0xa1, 0x44, 0xb1, 0x03,
+	0xe5, 0x58, 0xe2, 0x6d, 0xc3, 0x27, 0x38, 0x15, 0x49, 0xc5, 0x27, 0xb1, 0x93, 0x28, 0xfe, 0xdd,
+	0xec, 0xe8, 0x23, 0x42, 0x38, 0x15, 0x08, 0x55, 0x0a, 0x84, 0x62, 0x07, 0x21, 0xa5, 0x99, 0xec,
+	0xa9, 0x8f, 0x39, 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x8d, 0x6d, 0x8c, 0x14, 0x02, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/budget_delivery_method.pb.go b/googleapis/ads/googleads/v3/enums/budget_delivery_method.pb.go
new file mode 100644
index 0000000..c92b1a5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/budget_delivery_method.pb.go
@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/budget_delivery_method.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible delivery methods of a Budget.
+type BudgetDeliveryMethodEnum_BudgetDeliveryMethod int32
+
+const (
+	// Not specified.
+	BudgetDeliveryMethodEnum_UNSPECIFIED BudgetDeliveryMethodEnum_BudgetDeliveryMethod = 0
+	// Used for return value only. Represents value unknown in this version.
+	BudgetDeliveryMethodEnum_UNKNOWN BudgetDeliveryMethodEnum_BudgetDeliveryMethod = 1
+	// The budget server will throttle serving evenly across
+	// the entire time period.
+	BudgetDeliveryMethodEnum_STANDARD BudgetDeliveryMethodEnum_BudgetDeliveryMethod = 2
+	// The budget server will not throttle serving,
+	// and ads will serve as fast as possible.
+	BudgetDeliveryMethodEnum_ACCELERATED BudgetDeliveryMethodEnum_BudgetDeliveryMethod = 3
+)
+
+var BudgetDeliveryMethodEnum_BudgetDeliveryMethod_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "STANDARD",
+	3: "ACCELERATED",
+}
+
+var BudgetDeliveryMethodEnum_BudgetDeliveryMethod_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"STANDARD":    2,
+	"ACCELERATED": 3,
+}
+
+func (x BudgetDeliveryMethodEnum_BudgetDeliveryMethod) String() string {
+	return proto.EnumName(BudgetDeliveryMethodEnum_BudgetDeliveryMethod_name, int32(x))
+}
+
+func (BudgetDeliveryMethodEnum_BudgetDeliveryMethod) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_addd9b866c9590d5, []int{0, 0}
+}
+
+// Message describing Budget delivery methods. A delivery method determines the
+// rate at which the Budget is spent.
+type BudgetDeliveryMethodEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BudgetDeliveryMethodEnum) Reset()         { *m = BudgetDeliveryMethodEnum{} }
+func (m *BudgetDeliveryMethodEnum) String() string { return proto.CompactTextString(m) }
+func (*BudgetDeliveryMethodEnum) ProtoMessage()    {}
+func (*BudgetDeliveryMethodEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_addd9b866c9590d5, []int{0}
+}
+
+func (m *BudgetDeliveryMethodEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BudgetDeliveryMethodEnum.Unmarshal(m, b)
+}
+func (m *BudgetDeliveryMethodEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BudgetDeliveryMethodEnum.Marshal(b, m, deterministic)
+}
+func (m *BudgetDeliveryMethodEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BudgetDeliveryMethodEnum.Merge(m, src)
+}
+func (m *BudgetDeliveryMethodEnum) XXX_Size() int {
+	return xxx_messageInfo_BudgetDeliveryMethodEnum.Size(m)
+}
+func (m *BudgetDeliveryMethodEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BudgetDeliveryMethodEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BudgetDeliveryMethodEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BudgetDeliveryMethodEnum_BudgetDeliveryMethod", BudgetDeliveryMethodEnum_BudgetDeliveryMethod_name, BudgetDeliveryMethodEnum_BudgetDeliveryMethod_value)
+	proto.RegisterType((*BudgetDeliveryMethodEnum)(nil), "google.ads.googleads.v3.enums.BudgetDeliveryMethodEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/budget_delivery_method.proto", fileDescriptor_addd9b866c9590d5)
+}
+
+var fileDescriptor_addd9b866c9590d5 = []byte{
+	// 311 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcd, 0x4a, 0xc3, 0x30,
+	0x00, 0x76, 0x1d, 0xa8, 0x64, 0x82, 0xa5, 0x78, 0x50, 0x71, 0x87, 0xed, 0x01, 0x92, 0x43, 0x6e,
+	0xf1, 0x94, 0xae, 0x71, 0x0c, 0xb5, 0x8e, 0xfd, 0x09, 0x52, 0x18, 0x9d, 0x09, 0xb1, 0xb0, 0x26,
+	0x63, 0xe9, 0x0a, 0xbe, 0x8e, 0x47, 0x1f, 0xc5, 0x47, 0xf1, 0xe0, 0x33, 0x48, 0x93, 0xb5, 0xa7,
+	0xe9, 0x25, 0x7c, 0xe4, 0xfb, 0xc9, 0x97, 0x0f, 0x10, 0xa9, 0xb5, 0x5c, 0x0b, 0x94, 0x72, 0x83,
+	0x1c, 0xac, 0x50, 0x89, 0x91, 0x50, 0xbb, 0xdc, 0xa0, 0xd5, 0x8e, 0x4b, 0x51, 0x2c, 0xb9, 0x58,
+	0x67, 0xa5, 0xd8, 0xbe, 0x2f, 0x73, 0x51, 0xbc, 0x69, 0x0e, 0x37, 0x5b, 0x5d, 0xe8, 0xa0, 0xeb,
+	0x0c, 0x30, 0xe5, 0x06, 0x36, 0x5e, 0x58, 0x62, 0x68, 0xbd, 0xd7, 0x37, 0x75, 0xf4, 0x26, 0x43,
+	0xa9, 0x52, 0xba, 0x48, 0x8b, 0x4c, 0x2b, 0xe3, 0xcc, 0x7d, 0x0d, 0x2e, 0x43, 0x1b, 0x1e, 0xed,
+	0xb3, 0x1f, 0x6d, 0x34, 0x53, 0xbb, 0xbc, 0x3f, 0x05, 0x17, 0x87, 0xb8, 0xe0, 0x1c, 0x74, 0xe6,
+	0xf1, 0x74, 0xcc, 0x06, 0xa3, 0xbb, 0x11, 0x8b, 0xfc, 0xa3, 0xa0, 0x03, 0x4e, 0xe6, 0xf1, 0x7d,
+	0xfc, 0xf4, 0x1c, 0xfb, 0xad, 0xe0, 0x0c, 0x9c, 0x4e, 0x67, 0x34, 0x8e, 0xe8, 0x24, 0xf2, 0xbd,
+	0x4a, 0x4b, 0x07, 0x03, 0xf6, 0xc0, 0x26, 0x74, 0xc6, 0x22, 0xbf, 0x1d, 0xfe, 0xb4, 0x40, 0xef,
+	0x55, 0xe7, 0xf0, 0xdf, 0xd2, 0xe1, 0xd5, 0xa1, 0x87, 0xc7, 0x55, 0xe3, 0x71, 0xeb, 0x25, 0xdc,
+	0x7b, 0xa5, 0x5e, 0xa7, 0x4a, 0x42, 0xbd, 0x95, 0x48, 0x0a, 0x65, 0xff, 0x53, 0x8f, 0xb7, 0xc9,
+	0xcc, 0x1f, 0x5b, 0xde, 0xda, 0xf3, 0xc3, 0x6b, 0x0f, 0x29, 0xfd, 0xf4, 0xba, 0x43, 0x17, 0x45,
+	0xb9, 0x81, 0x0e, 0x56, 0x68, 0x81, 0x61, 0x35, 0x80, 0xf9, 0xaa, 0xf9, 0x84, 0x72, 0x93, 0x34,
+	0x7c, 0xb2, 0xc0, 0x89, 0xe5, 0xbf, 0xbd, 0x9e, 0xbb, 0x24, 0x84, 0x72, 0x43, 0x48, 0xa3, 0x20,
+	0x64, 0x81, 0x09, 0xb1, 0x9a, 0xd5, 0xb1, 0x2d, 0x86, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xdb,
+	0xc1, 0xca, 0xdd, 0xe3, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/budget_period.pb.go b/googleapis/ads/googleads/v3/enums/budget_period.pb.go
new file mode 100644
index 0000000..9cc0aef
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/budget_period.pb.go
@@ -0,0 +1,118 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/budget_period.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible period of a Budget.
+type BudgetPeriodEnum_BudgetPeriod int32
+
+const (
+	// Not specified.
+	BudgetPeriodEnum_UNSPECIFIED BudgetPeriodEnum_BudgetPeriod = 0
+	// Used for return value only. Represents value unknown in this version.
+	BudgetPeriodEnum_UNKNOWN BudgetPeriodEnum_BudgetPeriod = 1
+	// Daily budget.
+	BudgetPeriodEnum_DAILY BudgetPeriodEnum_BudgetPeriod = 2
+)
+
+var BudgetPeriodEnum_BudgetPeriod_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DAILY",
+}
+
+var BudgetPeriodEnum_BudgetPeriod_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"DAILY":       2,
+}
+
+func (x BudgetPeriodEnum_BudgetPeriod) String() string {
+	return proto.EnumName(BudgetPeriodEnum_BudgetPeriod_name, int32(x))
+}
+
+func (BudgetPeriodEnum_BudgetPeriod) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_81ebdaeddf717b90, []int{0, 0}
+}
+
+// Message describing Budget period.
+type BudgetPeriodEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BudgetPeriodEnum) Reset()         { *m = BudgetPeriodEnum{} }
+func (m *BudgetPeriodEnum) String() string { return proto.CompactTextString(m) }
+func (*BudgetPeriodEnum) ProtoMessage()    {}
+func (*BudgetPeriodEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_81ebdaeddf717b90, []int{0}
+}
+
+func (m *BudgetPeriodEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BudgetPeriodEnum.Unmarshal(m, b)
+}
+func (m *BudgetPeriodEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BudgetPeriodEnum.Marshal(b, m, deterministic)
+}
+func (m *BudgetPeriodEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BudgetPeriodEnum.Merge(m, src)
+}
+func (m *BudgetPeriodEnum) XXX_Size() int {
+	return xxx_messageInfo_BudgetPeriodEnum.Size(m)
+}
+func (m *BudgetPeriodEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BudgetPeriodEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BudgetPeriodEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BudgetPeriodEnum_BudgetPeriod", BudgetPeriodEnum_BudgetPeriod_name, BudgetPeriodEnum_BudgetPeriod_value)
+	proto.RegisterType((*BudgetPeriodEnum)(nil), "google.ads.googleads.v3.enums.BudgetPeriodEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/budget_period.proto", fileDescriptor_81ebdaeddf717b90)
+}
+
+var fileDescriptor_81ebdaeddf717b90 = []byte{
+	// 288 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x4c, 0xcf, 0xcf, 0x4f,
+	0xcf, 0x49, 0xd5, 0x4f, 0x4c, 0x29, 0xd6, 0x87, 0x30, 0x41, 0xac, 0x32, 0x63, 0xfd, 0xd4, 0xbc,
+	0xd2, 0xdc, 0x62, 0xfd, 0xa4, 0xd2, 0x94, 0xf4, 0xd4, 0x92, 0xf8, 0x82, 0xd4, 0xa2, 0xcc, 0xfc,
+	0x14, 0xbd, 0x82, 0xa2, 0xfc, 0x92, 0x7c, 0x21, 0x59, 0x88, 0x3a, 0xbd, 0xc4, 0x94, 0x62, 0x3d,
+	0xb8, 0x16, 0xbd, 0x32, 0x63, 0x3d, 0xb0, 0x16, 0x29, 0x19, 0x98, 0x89, 0x05, 0x99, 0xfa, 0x89,
+	0x79, 0x79, 0xf9, 0x25, 0x89, 0x25, 0x99, 0xf9, 0x79, 0xc5, 0x10, 0xcd, 0x4a, 0xde, 0x5c, 0x02,
+	0x4e, 0x60, 0x33, 0x03, 0xc0, 0x46, 0xba, 0xe6, 0x95, 0xe6, 0x2a, 0x99, 0x73, 0xf1, 0x20, 0x8b,
+	0x09, 0xf1, 0x73, 0x71, 0x87, 0xfa, 0x05, 0x07, 0xb8, 0x3a, 0x7b, 0xba, 0x79, 0xba, 0xba, 0x08,
+	0x30, 0x08, 0x71, 0x73, 0xb1, 0x87, 0xfa, 0x79, 0xfb, 0xf9, 0x87, 0xfb, 0x09, 0x30, 0x0a, 0x71,
+	0x72, 0xb1, 0xba, 0x38, 0x7a, 0xfa, 0x44, 0x0a, 0x30, 0x39, 0x3d, 0x63, 0xe4, 0x52, 0x4c, 0xce,
+	0xcf, 0xd5, 0xc3, 0xeb, 0x20, 0x27, 0x41, 0x64, 0xc3, 0x03, 0x40, 0xae, 0x08, 0x60, 0x8c, 0x72,
+	0x82, 0xea, 0x49, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0xcb, 0x2f, 0x4a, 0xd7, 0x4f, 0x4f, 0xcd,
+	0x03, 0xbb, 0x11, 0x16, 0x0e, 0x05, 0x99, 0xc5, 0x38, 0x82, 0xc5, 0x1a, 0x4c, 0x2e, 0x62, 0x62,
+	0x76, 0x77, 0x74, 0x5c, 0xc5, 0x24, 0xeb, 0x0e, 0x31, 0xca, 0x31, 0xa5, 0x58, 0x0f, 0xc2, 0x04,
+	0xb1, 0xc2, 0x8c, 0xf5, 0x40, 0x9e, 0x2b, 0x3e, 0x05, 0x93, 0x8f, 0x71, 0x4c, 0x29, 0x8e, 0x81,
+	0xcb, 0xc7, 0x84, 0x19, 0xc7, 0x80, 0xe5, 0x5f, 0x31, 0x29, 0x42, 0x04, 0xad, 0xac, 0x1c, 0x53,
+	0x8a, 0xad, 0xac, 0xe0, 0x2a, 0xac, 0xac, 0xc2, 0x8c, 0xad, 0xac, 0xc0, 0x6a, 0x92, 0xd8, 0xc0,
+	0x0e, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x51, 0xdb, 0x23, 0x98, 0xae, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/budget_status.pb.go b/googleapis/ads/googleads/v3/enums/budget_status.pb.go
new file mode 100644
index 0000000..a9e3dfa
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/budget_status.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/budget_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a Budget.
+type BudgetStatusEnum_BudgetStatus int32
+
+const (
+	// Not specified.
+	BudgetStatusEnum_UNSPECIFIED BudgetStatusEnum_BudgetStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	BudgetStatusEnum_UNKNOWN BudgetStatusEnum_BudgetStatus = 1
+	// Budget is enabled.
+	BudgetStatusEnum_ENABLED BudgetStatusEnum_BudgetStatus = 2
+	// Budget is removed.
+	BudgetStatusEnum_REMOVED BudgetStatusEnum_BudgetStatus = 3
+)
+
+var BudgetStatusEnum_BudgetStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var BudgetStatusEnum_BudgetStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x BudgetStatusEnum_BudgetStatus) String() string {
+	return proto.EnumName(BudgetStatusEnum_BudgetStatus_name, int32(x))
+}
+
+func (BudgetStatusEnum_BudgetStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_10afd99aeed822db, []int{0, 0}
+}
+
+// Message describing a Budget status
+type BudgetStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BudgetStatusEnum) Reset()         { *m = BudgetStatusEnum{} }
+func (m *BudgetStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*BudgetStatusEnum) ProtoMessage()    {}
+func (*BudgetStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_10afd99aeed822db, []int{0}
+}
+
+func (m *BudgetStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BudgetStatusEnum.Unmarshal(m, b)
+}
+func (m *BudgetStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BudgetStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *BudgetStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BudgetStatusEnum.Merge(m, src)
+}
+func (m *BudgetStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_BudgetStatusEnum.Size(m)
+}
+func (m *BudgetStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BudgetStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BudgetStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BudgetStatusEnum_BudgetStatus", BudgetStatusEnum_BudgetStatus_name, BudgetStatusEnum_BudgetStatus_value)
+	proto.RegisterType((*BudgetStatusEnum)(nil), "google.ads.googleads.v3.enums.BudgetStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/budget_status.proto", fileDescriptor_10afd99aeed822db)
+}
+
+var fileDescriptor_10afd99aeed822db = []byte{
+	// 294 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x18, 0x77, 0x1d, 0x28, 0x64, 0x82, 0x75, 0x47, 0x71, 0x87, 0xed, 0x01, 0x12, 0x24, 0xb7, 0x78,
+	0x4a, 0x5d, 0x36, 0x86, 0xda, 0x15, 0xc7, 0x2a, 0x8c, 0x82, 0x64, 0xa6, 0x84, 0xc2, 0x9a, 0x94,
+	0x25, 0xdd, 0x03, 0x79, 0xf4, 0x51, 0x7c, 0x10, 0x0f, 0x3e, 0x85, 0x24, 0x5d, 0xcb, 0x2e, 0x7a,
+	0x29, 0xbf, 0xef, 0xfb, 0xfd, 0xe9, 0x2f, 0x1f, 0xb8, 0x93, 0x5a, 0xcb, 0x5d, 0x8e, 0xb8, 0x30,
+	0xa8, 0x81, 0x0e, 0x1d, 0x30, 0xca, 0x55, 0x5d, 0x1a, 0xb4, 0xad, 0x85, 0xcc, 0xed, 0x9b, 0xb1,
+	0xdc, 0xd6, 0x06, 0x56, 0x7b, 0x6d, 0xf5, 0x70, 0xd4, 0xe8, 0x20, 0x17, 0x06, 0x76, 0x16, 0x78,
+	0xc0, 0xd0, 0x5b, 0x6e, 0x6e, 0xdb, 0xc4, 0xaa, 0x40, 0x5c, 0x29, 0x6d, 0xb9, 0x2d, 0xb4, 0x3a,
+	0x9a, 0x27, 0x1b, 0x10, 0x46, 0x3e, 0x73, 0xe5, 0x23, 0x99, 0xaa, 0xcb, 0xc9, 0x0c, 0x5c, 0x9e,
+	0xee, 0x86, 0x57, 0x60, 0xb0, 0x8e, 0x57, 0x09, 0x7b, 0x58, 0xcc, 0x16, 0x6c, 0x1a, 0x9e, 0x0d,
+	0x07, 0xe0, 0x62, 0x1d, 0x3f, 0xc6, 0xcb, 0xd7, 0x38, 0xec, 0xb9, 0x81, 0xc5, 0x34, 0x7a, 0x62,
+	0xd3, 0x30, 0x70, 0xc3, 0x0b, 0x7b, 0x5e, 0xa6, 0x6c, 0x1a, 0xf6, 0xa3, 0xef, 0x1e, 0x18, 0xbf,
+	0xeb, 0x12, 0xfe, 0xdb, 0x2f, 0xba, 0x3e, 0xfd, 0x57, 0xe2, 0x4a, 0x25, 0xbd, 0x4d, 0x74, 0xf4,
+	0x48, 0xbd, 0xe3, 0x4a, 0x42, 0xbd, 0x97, 0x48, 0xe6, 0xca, 0x57, 0x6e, 0xcf, 0x52, 0x15, 0xe6,
+	0x8f, 0x2b, 0xdd, 0xfb, 0xef, 0x47, 0xd0, 0x9f, 0x53, 0xfa, 0x19, 0x8c, 0xe6, 0x4d, 0x14, 0x15,
+	0x06, 0x36, 0xd0, 0xa1, 0x14, 0x43, 0xf7, 0x56, 0xf3, 0xd5, 0xf2, 0x19, 0x15, 0x26, 0xeb, 0xf8,
+	0x2c, 0xc5, 0x99, 0xe7, 0x7f, 0x82, 0x71, 0xb3, 0x24, 0x84, 0x0a, 0x43, 0x48, 0xa7, 0x20, 0x24,
+	0xc5, 0x84, 0x78, 0xcd, 0xf6, 0xdc, 0x17, 0xc3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1e, 0x77,
+	0x42, 0x51, 0xbd, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/budget_type.pb.go b/googleapis/ads/googleads/v3/enums/budget_type.pb.go
new file mode 100644
index 0000000..4d0104e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/budget_type.pb.go
@@ -0,0 +1,142 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/budget_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible Budget types.
+type BudgetTypeEnum_BudgetType int32
+
+const (
+	// Not specified.
+	BudgetTypeEnum_UNSPECIFIED BudgetTypeEnum_BudgetType = 0
+	// Used for return value only. Represents value unknown in this version.
+	BudgetTypeEnum_UNKNOWN BudgetTypeEnum_BudgetType = 1
+	// Budget type for standard Google Ads usage.
+	// Caps daily spend at two times the specified budget amount.
+	// Full details: https://support.google.com/google-ads/answer/6385083
+	BudgetTypeEnum_STANDARD BudgetTypeEnum_BudgetType = 2
+	// Budget type for Hotels Ads commission program.
+	// Full details: https://support.google.com/google-ads/answer/9243945
+	//
+	// This type is only supported by campaigns with
+	// AdvertisingChannelType.HOTEL, BiddingStrategyType.COMMISSION and
+	// PaymentMode.CONVERSION_VALUE.
+	BudgetTypeEnum_HOTEL_ADS_COMMISSION BudgetTypeEnum_BudgetType = 3
+	// Budget type with a fixed cost-per-acquisition (conversion).
+	// Full details: https://support.google.com/google-ads/answer/7528254
+	//
+	// This type is only supported by campaigns with
+	// AdvertisingChannelType.DISPLAY (excluding
+	// AdvertisingChannelSubType.DISPLAY_GMAIL),
+	// BiddingStrategyType.TARGET_CPA and PaymentMode.CONVERSIONS.
+	BudgetTypeEnum_FIXED_CPA BudgetTypeEnum_BudgetType = 4
+)
+
+var BudgetTypeEnum_BudgetType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "STANDARD",
+	3: "HOTEL_ADS_COMMISSION",
+	4: "FIXED_CPA",
+}
+
+var BudgetTypeEnum_BudgetType_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"STANDARD":             2,
+	"HOTEL_ADS_COMMISSION": 3,
+	"FIXED_CPA":            4,
+}
+
+func (x BudgetTypeEnum_BudgetType) String() string {
+	return proto.EnumName(BudgetTypeEnum_BudgetType_name, int32(x))
+}
+
+func (BudgetTypeEnum_BudgetType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_413da7440d0c3f52, []int{0, 0}
+}
+
+// Describes Budget types.
+type BudgetTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BudgetTypeEnum) Reset()         { *m = BudgetTypeEnum{} }
+func (m *BudgetTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*BudgetTypeEnum) ProtoMessage()    {}
+func (*BudgetTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_413da7440d0c3f52, []int{0}
+}
+
+func (m *BudgetTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BudgetTypeEnum.Unmarshal(m, b)
+}
+func (m *BudgetTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BudgetTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *BudgetTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BudgetTypeEnum.Merge(m, src)
+}
+func (m *BudgetTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_BudgetTypeEnum.Size(m)
+}
+func (m *BudgetTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BudgetTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BudgetTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.BudgetTypeEnum_BudgetType", BudgetTypeEnum_BudgetType_name, BudgetTypeEnum_BudgetType_value)
+	proto.RegisterType((*BudgetTypeEnum)(nil), "google.ads.googleads.v3.enums.BudgetTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/budget_type.proto", fileDescriptor_413da7440d0c3f52)
+}
+
+var fileDescriptor_413da7440d0c3f52 = []byte{
+	// 323 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4e, 0xc2, 0x30,
+	0x1c, 0x96, 0x61, 0xfc, 0x53, 0x54, 0x96, 0xc5, 0x83, 0x31, 0x72, 0x80, 0x07, 0xe8, 0x0e, 0xbb,
+	0xd5, 0x53, 0xc7, 0x06, 0x2e, 0xca, 0xb6, 0x38, 0x40, 0x63, 0x96, 0x2c, 0xc5, 0x36, 0x0d, 0x09,
+	0xb4, 0x0b, 0x1d, 0x24, 0xbc, 0x8e, 0x47, 0x1f, 0xc5, 0xe7, 0xf0, 0xe4, 0x53, 0x98, 0x75, 0x30,
+	0x4e, 0x7a, 0x69, 0xbe, 0xfc, 0xbe, 0x3f, 0xf9, 0xfa, 0x01, 0x9b, 0x4b, 0xc9, 0x17, 0xcc, 0x26,
+	0x54, 0xed, 0x60, 0x89, 0x36, 0x8e, 0xcd, 0xc4, 0x7a, 0xa9, 0xec, 0xd9, 0x9a, 0x72, 0x56, 0x64,
+	0xc5, 0x36, 0x67, 0x30, 0x5f, 0xc9, 0x42, 0x5a, 0x9d, 0x4a, 0x05, 0x09, 0x55, 0xb0, 0x36, 0xc0,
+	0x8d, 0x03, 0xb5, 0xe1, 0xf6, 0x6e, 0x9f, 0x97, 0xcf, 0x6d, 0x22, 0x84, 0x2c, 0x48, 0x31, 0x97,
+	0x42, 0x55, 0xe6, 0x9e, 0x02, 0x57, 0xae, 0x4e, 0x1c, 0x6f, 0x73, 0xe6, 0x8b, 0xf5, 0xb2, 0x47,
+	0x00, 0x38, 0x5c, 0xac, 0x36, 0x68, 0x4d, 0xc2, 0x24, 0xf6, 0xfb, 0xc1, 0x20, 0xf0, 0x3d, 0xf3,
+	0xc8, 0x6a, 0x81, 0xd3, 0x49, 0xf8, 0x18, 0x46, 0x2f, 0xa1, 0xd9, 0xb0, 0x2e, 0xc0, 0x59, 0x32,
+	0xc6, 0xa1, 0x87, 0x9f, 0x3d, 0xd3, 0xb0, 0x6e, 0xc0, 0xf5, 0x43, 0x34, 0xf6, 0x9f, 0x32, 0xec,
+	0x25, 0x59, 0x3f, 0x1a, 0x8d, 0x82, 0x24, 0x09, 0xa2, 0xd0, 0x6c, 0x5a, 0x97, 0xe0, 0x7c, 0x10,
+	0xbc, 0xfa, 0x5e, 0xd6, 0x8f, 0xb1, 0x79, 0xec, 0x7e, 0x37, 0x40, 0xf7, 0x5d, 0x2e, 0xe1, 0xbf,
+	0xc5, 0xdd, 0xf6, 0xa1, 0x46, 0x5c, 0x76, 0x8d, 0x1b, 0x6f, 0xee, 0xce, 0xc1, 0xe5, 0x82, 0x08,
+	0x0e, 0xe5, 0x8a, 0xdb, 0x9c, 0x09, 0xfd, 0x93, 0xfd, 0x56, 0xf9, 0x5c, 0xfd, 0x31, 0xdd, 0xbd,
+	0x7e, 0x3f, 0x8c, 0xe6, 0x10, 0xe3, 0x4f, 0xa3, 0x33, 0xac, 0xa2, 0x30, 0x55, 0xb0, 0x82, 0x25,
+	0x9a, 0x3a, 0xb0, 0x1c, 0x41, 0x7d, 0xed, 0xf9, 0x14, 0x53, 0x95, 0xd6, 0x7c, 0x3a, 0x75, 0x52,
+	0xcd, 0xff, 0x18, 0xdd, 0xea, 0x88, 0x10, 0xa6, 0x0a, 0xa1, 0x5a, 0x81, 0xd0, 0xd4, 0x41, 0x48,
+	0x6b, 0x66, 0x27, 0xba, 0x98, 0xf3, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x1e, 0x8d, 0x09, 0x7d, 0xd2,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/call_conversion_reporting_state.pb.go b/googleapis/ads/googleads/v3/enums/call_conversion_reporting_state.pb.go
new file mode 100644
index 0000000..6c7567c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/call_conversion_reporting_state.pb.go
@@ -0,0 +1,134 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/call_conversion_reporting_state.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible data types for a call conversion action state.
+type CallConversionReportingStateEnum_CallConversionReportingState int32
+
+const (
+	// Not specified.
+	CallConversionReportingStateEnum_UNSPECIFIED CallConversionReportingStateEnum_CallConversionReportingState = 0
+	// Used for return value only. Represents value unknown in this version.
+	CallConversionReportingStateEnum_UNKNOWN CallConversionReportingStateEnum_CallConversionReportingState = 1
+	// Call conversion action is disabled.
+	CallConversionReportingStateEnum_DISABLED CallConversionReportingStateEnum_CallConversionReportingState = 2
+	// Call conversion action will use call conversion type set at the
+	// account level.
+	CallConversionReportingStateEnum_USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION CallConversionReportingStateEnum_CallConversionReportingState = 3
+	// Call conversion action will use call conversion type set at the resource
+	// (call only ads/call extensions) level.
+	CallConversionReportingStateEnum_USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION CallConversionReportingStateEnum_CallConversionReportingState = 4
+)
+
+var CallConversionReportingStateEnum_CallConversionReportingState_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DISABLED",
+	3: "USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION",
+	4: "USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION",
+}
+
+var CallConversionReportingStateEnum_CallConversionReportingState_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"DISABLED":    2,
+	"USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION":  3,
+	"USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION": 4,
+}
+
+func (x CallConversionReportingStateEnum_CallConversionReportingState) String() string {
+	return proto.EnumName(CallConversionReportingStateEnum_CallConversionReportingState_name, int32(x))
+}
+
+func (CallConversionReportingStateEnum_CallConversionReportingState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_9c92a91800d0b626, []int{0, 0}
+}
+
+// Container for enum describing possible data types for call conversion
+// reporting state.
+type CallConversionReportingStateEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CallConversionReportingStateEnum) Reset()         { *m = CallConversionReportingStateEnum{} }
+func (m *CallConversionReportingStateEnum) String() string { return proto.CompactTextString(m) }
+func (*CallConversionReportingStateEnum) ProtoMessage()    {}
+func (*CallConversionReportingStateEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9c92a91800d0b626, []int{0}
+}
+
+func (m *CallConversionReportingStateEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CallConversionReportingStateEnum.Unmarshal(m, b)
+}
+func (m *CallConversionReportingStateEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CallConversionReportingStateEnum.Marshal(b, m, deterministic)
+}
+func (m *CallConversionReportingStateEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CallConversionReportingStateEnum.Merge(m, src)
+}
+func (m *CallConversionReportingStateEnum) XXX_Size() int {
+	return xxx_messageInfo_CallConversionReportingStateEnum.Size(m)
+}
+func (m *CallConversionReportingStateEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CallConversionReportingStateEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CallConversionReportingStateEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CallConversionReportingStateEnum_CallConversionReportingState", CallConversionReportingStateEnum_CallConversionReportingState_name, CallConversionReportingStateEnum_CallConversionReportingState_value)
+	proto.RegisterType((*CallConversionReportingStateEnum)(nil), "google.ads.googleads.v3.enums.CallConversionReportingStateEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/call_conversion_reporting_state.proto", fileDescriptor_9c92a91800d0b626)
+}
+
+var fileDescriptor_9c92a91800d0b626 = []byte{
+	// 365 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0xca, 0x9c, 0x30,
+	0x18, 0xac, 0x6e, 0x69, 0x4b, 0xb6, 0x50, 0xf1, 0x58, 0x76, 0xa1, 0xbb, 0xa7, 0x16, 0xda, 0x78,
+	0xf0, 0x96, 0x9e, 0x62, 0x36, 0x5d, 0xa4, 0x12, 0x17, 0x5d, 0x2d, 0x14, 0x21, 0xa4, 0xab, 0x88,
+	0xe0, 0x26, 0x62, 0xdc, 0x7d, 0xa0, 0x5e, 0x0a, 0x7d, 0x94, 0xd2, 0x27, 0xe9, 0x03, 0xf4, 0xfc,
+	0xa3, 0xfe, 0x7a, 0xfb, 0xbd, 0x84, 0x21, 0x33, 0xdf, 0x4c, 0x32, 0x1f, 0x20, 0xa5, 0x52, 0x65,
+	0x5d, 0x38, 0x22, 0xd7, 0xce, 0x08, 0x7b, 0x74, 0x77, 0x9d, 0x42, 0xde, 0xae, 0xda, 0xb9, 0x88,
+	0xba, 0xe6, 0x17, 0x25, 0xef, 0x45, 0xab, 0x2b, 0x25, 0x79, 0x5b, 0x34, 0xaa, 0xed, 0x2a, 0x59,
+	0x72, 0xdd, 0x89, 0xae, 0x80, 0x4d, 0xab, 0x3a, 0x65, 0x6f, 0xc7, 0x49, 0x28, 0x72, 0x0d, 0x67,
+	0x13, 0x78, 0x77, 0xe1, 0x60, 0xf2, 0x76, 0x33, 0x65, 0x34, 0x95, 0x23, 0xa4, 0x54, 0x9d, 0xe8,
+	0x2a, 0x25, 0xf5, 0x38, 0xbc, 0xff, 0x6b, 0x80, 0x77, 0x44, 0xd4, 0x35, 0x99, 0x53, 0xa2, 0x29,
+	0x24, 0xee, 0x33, 0xa8, 0xbc, 0x5d, 0xf7, 0xbf, 0x0c, 0xb0, 0x59, 0x12, 0xd9, 0x6f, 0xc0, 0x3a,
+	0x61, 0xf1, 0x89, 0x12, 0xff, 0x8b, 0x4f, 0x0f, 0xd6, 0x33, 0x7b, 0x0d, 0x5e, 0x26, 0xec, 0x2b,
+	0x0b, 0xbf, 0x31, 0xcb, 0xb0, 0x5f, 0x83, 0x57, 0x07, 0x3f, 0xc6, 0x5e, 0x40, 0x0f, 0x96, 0x69,
+	0x7f, 0x04, 0xef, 0x93, 0x98, 0x72, 0x4c, 0x48, 0x98, 0xb0, 0x33, 0x0f, 0x68, 0x4a, 0x03, 0x4e,
+	0x70, 0x10, 0x70, 0x12, 0xb2, 0x94, 0x46, 0xb1, 0x1f, 0x32, 0x8e, 0xc9, 0xd9, 0x0f, 0x99, 0xb5,
+	0xb2, 0x3f, 0x81, 0x0f, 0xbd, 0x3a, 0xa2, 0x71, 0x98, 0x44, 0x84, 0x2e, 0xcb, 0x9f, 0x7b, 0xff,
+	0x0d, 0xb0, 0xbb, 0xa8, 0x2b, 0x5c, 0xac, 0xc4, 0xdb, 0x2d, 0x7d, 0xe6, 0xd4, 0xf7, 0x72, 0x32,
+	0xbe, 0x7b, 0x8f, 0x1e, 0xa5, 0xaa, 0x85, 0x2c, 0xa1, 0x6a, 0x4b, 0xa7, 0x2c, 0xe4, 0xd0, 0xda,
+	0xb4, 0xab, 0xa6, 0xd2, 0x4f, 0xac, 0xee, 0xf3, 0x70, 0xfe, 0x34, 0x57, 0x47, 0x8c, 0x7f, 0x9b,
+	0xdb, 0xe3, 0x68, 0x85, 0x73, 0x0d, 0x47, 0xd8, 0xa3, 0xd4, 0x85, 0x7d, 0xbb, 0xfa, 0xcf, 0xc4,
+	0x67, 0x38, 0xd7, 0xd9, 0xcc, 0x67, 0xa9, 0x9b, 0x0d, 0xfc, 0x3f, 0x73, 0x37, 0x5e, 0x22, 0x84,
+	0x73, 0x8d, 0xd0, 0xac, 0x40, 0x28, 0x75, 0x11, 0x1a, 0x34, 0x3f, 0x5e, 0x0c, 0x0f, 0x73, 0x1f,
+	0x02, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x9e, 0x47, 0x5a, 0x52, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/call_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/call_placeholder_field.pb.go
new file mode 100644
index 0000000..b4593de
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/call_placeholder_field.pb.go
@@ -0,0 +1,147 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/call_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Call placeholder fields.
+type CallPlaceholderFieldEnum_CallPlaceholderField int32
+
+const (
+	// Not specified.
+	CallPlaceholderFieldEnum_UNSPECIFIED CallPlaceholderFieldEnum_CallPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	CallPlaceholderFieldEnum_UNKNOWN CallPlaceholderFieldEnum_CallPlaceholderField = 1
+	// Data Type: STRING. The advertiser's phone number to append to the ad.
+	CallPlaceholderFieldEnum_PHONE_NUMBER CallPlaceholderFieldEnum_CallPlaceholderField = 2
+	// Data Type: STRING. Uppercase two-letter country code of the advertiser's
+	// phone number.
+	CallPlaceholderFieldEnum_COUNTRY_CODE CallPlaceholderFieldEnum_CallPlaceholderField = 3
+	// Data Type: BOOLEAN. Indicates whether call tracking is enabled. Default:
+	// true.
+	CallPlaceholderFieldEnum_TRACKED CallPlaceholderFieldEnum_CallPlaceholderField = 4
+	// Data Type: INT64. The ID of an AdCallMetricsConversion object. This
+	// object contains the phoneCallDurationfield which is the minimum duration
+	// (in seconds) of a call to be considered a conversion.
+	CallPlaceholderFieldEnum_CONVERSION_TYPE_ID CallPlaceholderFieldEnum_CallPlaceholderField = 5
+	// Data Type: STRING. Indicates whether this call extension uses its own
+	// call conversion setting or follows the account level setting.
+	// Valid values are: USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION and
+	// USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION.
+	CallPlaceholderFieldEnum_CONVERSION_REPORTING_STATE CallPlaceholderFieldEnum_CallPlaceholderField = 6
+)
+
+var CallPlaceholderFieldEnum_CallPlaceholderField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PHONE_NUMBER",
+	3: "COUNTRY_CODE",
+	4: "TRACKED",
+	5: "CONVERSION_TYPE_ID",
+	6: "CONVERSION_REPORTING_STATE",
+}
+
+var CallPlaceholderFieldEnum_CallPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":                0,
+	"UNKNOWN":                    1,
+	"PHONE_NUMBER":               2,
+	"COUNTRY_CODE":               3,
+	"TRACKED":                    4,
+	"CONVERSION_TYPE_ID":         5,
+	"CONVERSION_REPORTING_STATE": 6,
+}
+
+func (x CallPlaceholderFieldEnum_CallPlaceholderField) String() string {
+	return proto.EnumName(CallPlaceholderFieldEnum_CallPlaceholderField_name, int32(x))
+}
+
+func (CallPlaceholderFieldEnum_CallPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_359d87f272d7bd8f, []int{0, 0}
+}
+
+// Values for Call placeholder fields.
+type CallPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CallPlaceholderFieldEnum) Reset()         { *m = CallPlaceholderFieldEnum{} }
+func (m *CallPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*CallPlaceholderFieldEnum) ProtoMessage()    {}
+func (*CallPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_359d87f272d7bd8f, []int{0}
+}
+
+func (m *CallPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CallPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *CallPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CallPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *CallPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CallPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *CallPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_CallPlaceholderFieldEnum.Size(m)
+}
+func (m *CallPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CallPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CallPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CallPlaceholderFieldEnum_CallPlaceholderField", CallPlaceholderFieldEnum_CallPlaceholderField_name, CallPlaceholderFieldEnum_CallPlaceholderField_value)
+	proto.RegisterType((*CallPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.CallPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/call_placeholder_field.proto", fileDescriptor_359d87f272d7bd8f)
+}
+
+var fileDescriptor_359d87f272d7bd8f = []byte{
+	// 377 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x4f, 0x6a, 0xdb, 0x40,
+	0x14, 0xc6, 0x2b, 0xb9, 0x75, 0x61, 0x5c, 0xe8, 0x20, 0x4a, 0x69, 0x4d, 0x5d, 0xb0, 0x0f, 0x30,
+	0x5a, 0x68, 0x37, 0x5d, 0xe9, 0xcf, 0xd8, 0x15, 0x26, 0x23, 0x21, 0x4b, 0x0a, 0x0e, 0x02, 0x31,
+	0xb1, 0x14, 0x45, 0x30, 0xd6, 0x08, 0x8f, 0xed, 0xdb, 0x64, 0x93, 0x65, 0x8e, 0x90, 0x23, 0xe4,
+	0x28, 0x59, 0xe4, 0x0c, 0x41, 0x52, 0xec, 0x64, 0xe1, 0x64, 0x33, 0x7c, 0xbc, 0xef, 0xfd, 0x3e,
+	0xe6, 0xbd, 0x07, 0x70, 0x21, 0x44, 0xc1, 0x73, 0x9d, 0x65, 0x52, 0xef, 0x64, 0xa3, 0xf6, 0x86,
+	0x9e, 0x57, 0xbb, 0xb5, 0xd4, 0x57, 0x8c, 0xf3, 0xb4, 0xe6, 0x6c, 0x95, 0x5f, 0x0b, 0x9e, 0xe5,
+	0x9b, 0xf4, 0xaa, 0xcc, 0x79, 0x86, 0xea, 0x8d, 0xd8, 0x0a, 0x6d, 0xd4, 0x01, 0x88, 0x65, 0x12,
+	0x1d, 0x59, 0xb4, 0x37, 0x50, 0xcb, 0x0e, 0xff, 0x1c, 0xa2, 0xeb, 0x52, 0x67, 0x55, 0x25, 0xb6,
+	0x6c, 0x5b, 0x8a, 0x4a, 0x76, 0xf0, 0xe4, 0x5e, 0x01, 0xbf, 0x6c, 0xc6, 0xb9, 0xff, 0x1a, 0x3e,
+	0x6d, 0xb2, 0x49, 0xb5, 0x5b, 0x4f, 0x6e, 0x14, 0xf0, 0xe3, 0x94, 0xa9, 0x7d, 0x07, 0x83, 0x88,
+	0x2e, 0x7c, 0x62, 0xbb, 0x53, 0x97, 0x38, 0xf0, 0x93, 0x36, 0x00, 0x5f, 0x23, 0x3a, 0xa7, 0xde,
+	0x39, 0x85, 0x8a, 0x06, 0xc1, 0x37, 0xff, 0xbf, 0x47, 0x49, 0x4a, 0xa3, 0x33, 0x8b, 0x04, 0x50,
+	0x6d, 0x2a, 0xb6, 0x17, 0xd1, 0x30, 0x58, 0xa6, 0xb6, 0xe7, 0x10, 0xd8, 0x6b, 0x80, 0x30, 0x30,
+	0xed, 0x39, 0x71, 0xe0, 0x67, 0xed, 0x27, 0xd0, 0x6c, 0x8f, 0xc6, 0x24, 0x58, 0xb8, 0x1e, 0x4d,
+	0xc3, 0xa5, 0x4f, 0x52, 0xd7, 0x81, 0x5f, 0xb4, 0xbf, 0x60, 0xf8, 0xa6, 0x1e, 0x10, 0xdf, 0x0b,
+	0x42, 0x97, 0xce, 0xd2, 0x45, 0x68, 0x86, 0x04, 0xf6, 0xad, 0x27, 0x05, 0x8c, 0x57, 0x62, 0x8d,
+	0x3e, 0x5c, 0x80, 0xf5, 0xfb, 0xd4, 0x08, 0x7e, 0x33, 0xbd, 0xaf, 0x5c, 0x58, 0x2f, 0x6c, 0x21,
+	0x38, 0xab, 0x0a, 0x24, 0x36, 0x85, 0x5e, 0xe4, 0x55, 0xbb, 0x9b, 0xc3, 0x21, 0xea, 0x52, 0xbe,
+	0x73, 0x97, 0x7f, 0xed, 0x7b, 0xab, 0xf6, 0x66, 0xa6, 0x79, 0xa7, 0x8e, 0x66, 0x5d, 0x94, 0x99,
+	0x49, 0xd4, 0xc9, 0x46, 0xc5, 0x06, 0x6a, 0x76, 0x29, 0x1f, 0x0e, 0x7e, 0x62, 0x66, 0x32, 0x39,
+	0xfa, 0x49, 0x6c, 0x24, 0xad, 0xff, 0xa8, 0x8e, 0xbb, 0x22, 0xc6, 0x66, 0x26, 0x31, 0x3e, 0x76,
+	0x60, 0x1c, 0x1b, 0x18, 0xb7, 0x3d, 0x97, 0xfd, 0xf6, 0x63, 0xc6, 0x73, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0x1f, 0xa6, 0xf0, 0x5c, 0x2f, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/callout_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/callout_placeholder_field.pb.go
new file mode 100644
index 0000000..ebeaef0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/callout_placeholder_field.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/callout_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Callout placeholder fields.
+type CalloutPlaceholderFieldEnum_CalloutPlaceholderField int32
+
+const (
+	// Not specified.
+	CalloutPlaceholderFieldEnum_UNSPECIFIED CalloutPlaceholderFieldEnum_CalloutPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	CalloutPlaceholderFieldEnum_UNKNOWN CalloutPlaceholderFieldEnum_CalloutPlaceholderField = 1
+	// Data Type: STRING. Callout text.
+	CalloutPlaceholderFieldEnum_CALLOUT_TEXT CalloutPlaceholderFieldEnum_CalloutPlaceholderField = 2
+)
+
+var CalloutPlaceholderFieldEnum_CalloutPlaceholderField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CALLOUT_TEXT",
+}
+
+var CalloutPlaceholderFieldEnum_CalloutPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"CALLOUT_TEXT": 2,
+}
+
+func (x CalloutPlaceholderFieldEnum_CalloutPlaceholderField) String() string {
+	return proto.EnumName(CalloutPlaceholderFieldEnum_CalloutPlaceholderField_name, int32(x))
+}
+
+func (CalloutPlaceholderFieldEnum_CalloutPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_cb91159a825d5b02, []int{0, 0}
+}
+
+// Values for Callout placeholder fields.
+type CalloutPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CalloutPlaceholderFieldEnum) Reset()         { *m = CalloutPlaceholderFieldEnum{} }
+func (m *CalloutPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*CalloutPlaceholderFieldEnum) ProtoMessage()    {}
+func (*CalloutPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_cb91159a825d5b02, []int{0}
+}
+
+func (m *CalloutPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CalloutPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *CalloutPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CalloutPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *CalloutPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CalloutPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *CalloutPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_CalloutPlaceholderFieldEnum.Size(m)
+}
+func (m *CalloutPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CalloutPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CalloutPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CalloutPlaceholderFieldEnum_CalloutPlaceholderField", CalloutPlaceholderFieldEnum_CalloutPlaceholderField_name, CalloutPlaceholderFieldEnum_CalloutPlaceholderField_value)
+	proto.RegisterType((*CalloutPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.CalloutPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/callout_placeholder_field.proto", fileDescriptor_cb91159a825d5b02)
+}
+
+var fileDescriptor_cb91159a825d5b02 = []byte{
+	// 308 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0x5d, 0x05, 0x85, 0x4c, 0xb0, 0xf4, 0x22, 0xe8, 0x76, 0xd8, 0x1e, 0x20, 0x39, 0xe4,
+	0x16, 0xf1, 0x90, 0xcd, 0x6e, 0x0c, 0x47, 0x57, 0x70, 0x9b, 0x22, 0x85, 0x11, 0x97, 0x98, 0x15,
+	0xb2, 0xa4, 0x2c, 0xdd, 0x1e, 0xc8, 0xa3, 0x8f, 0xe2, 0xa3, 0x78, 0xf3, 0x0d, 0xa4, 0x89, 0xab,
+	0xa7, 0x7a, 0x29, 0x1f, 0xfd, 0xfe, 0xdf, 0x2f, 0xdf, 0xff, 0x0f, 0xee, 0xa4, 0x31, 0x52, 0x09,
+	0xc4, 0xb8, 0x45, 0x5e, 0x56, 0xea, 0x80, 0x91, 0xd0, 0xfb, 0xad, 0x45, 0x6b, 0xa6, 0x94, 0xd9,
+	0x97, 0xab, 0x42, 0xb1, 0xb5, 0xd8, 0x18, 0xc5, 0xc5, 0x6e, 0xf5, 0x96, 0x0b, 0xc5, 0x61, 0xb1,
+	0x33, 0xa5, 0x89, 0xba, 0x3e, 0x03, 0x19, 0xb7, 0xb0, 0x8e, 0xc3, 0x03, 0x86, 0x2e, 0x7e, 0xdd,
+	0x39, 0xd2, 0x8b, 0x1c, 0x31, 0xad, 0x4d, 0xc9, 0xca, 0xdc, 0x68, 0xeb, 0xc3, 0xfd, 0x0d, 0xb8,
+	0x19, 0x7a, 0x7e, 0xfa, 0x87, 0x1f, 0x55, 0xf4, 0x58, 0xef, 0xb7, 0xfd, 0x09, 0xb8, 0x6a, 0xb0,
+	0xa3, 0x4b, 0xd0, 0x5e, 0x24, 0x8f, 0x69, 0x3c, 0x9c, 0x8c, 0x26, 0xf1, 0x7d, 0x78, 0x12, 0xb5,
+	0xc1, 0xf9, 0x22, 0x79, 0x48, 0x66, 0x4f, 0x49, 0xd8, 0x8a, 0x42, 0x70, 0x31, 0xa4, 0xd3, 0xe9,
+	0x6c, 0x31, 0x5f, 0xcd, 0xe3, 0xe7, 0x79, 0x18, 0x0c, 0xbe, 0x5b, 0xa0, 0xb7, 0x36, 0x5b, 0xf8,
+	0x6f, 0xdb, 0x41, 0xa7, 0xe1, 0xb9, 0xb4, 0x6a, 0x9b, 0xb6, 0x5e, 0x06, 0xbf, 0x71, 0x69, 0x14,
+	0xd3, 0x12, 0x9a, 0x9d, 0x44, 0x52, 0x68, 0xb7, 0xcb, 0xf1, 0x76, 0x45, 0x6e, 0x1b, 0x4e, 0x79,
+	0xeb, 0xbe, 0xef, 0xc1, 0xe9, 0x98, 0xd2, 0x8f, 0xa0, 0x3b, 0xf6, 0x28, 0xca, 0x2d, 0xf4, 0xb2,
+	0x52, 0x4b, 0x0c, 0xab, 0xcd, 0xed, 0xe7, 0xd1, 0xcf, 0x28, 0xb7, 0x59, 0xed, 0x67, 0x4b, 0x9c,
+	0x39, 0xff, 0x2b, 0xe8, 0xf9, 0x9f, 0x84, 0x50, 0x6e, 0x09, 0xa9, 0x27, 0x08, 0x59, 0x62, 0x42,
+	0xdc, 0xcc, 0xeb, 0x99, 0x2b, 0x86, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x3b, 0x7e, 0x6e,
+	0xe2, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/campaign_criterion_status.pb.go b/googleapis/ads/googleads/v3/enums/campaign_criterion_status.pb.go
new file mode 100644
index 0000000..bf6b2cb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/campaign_criterion_status.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/campaign_criterion_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible statuses of a CampaignCriterion.
+type CampaignCriterionStatusEnum_CampaignCriterionStatus int32
+
+const (
+	// No value has been specified.
+	CampaignCriterionStatusEnum_UNSPECIFIED CampaignCriterionStatusEnum_CampaignCriterionStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	CampaignCriterionStatusEnum_UNKNOWN CampaignCriterionStatusEnum_CampaignCriterionStatus = 1
+	// The campaign criterion is enabled.
+	CampaignCriterionStatusEnum_ENABLED CampaignCriterionStatusEnum_CampaignCriterionStatus = 2
+	// The campaign criterion is paused.
+	CampaignCriterionStatusEnum_PAUSED CampaignCriterionStatusEnum_CampaignCriterionStatus = 3
+	// The campaign criterion is removed.
+	CampaignCriterionStatusEnum_REMOVED CampaignCriterionStatusEnum_CampaignCriterionStatus = 4
+)
+
+var CampaignCriterionStatusEnum_CampaignCriterionStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "PAUSED",
+	4: "REMOVED",
+}
+
+var CampaignCriterionStatusEnum_CampaignCriterionStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"PAUSED":      3,
+	"REMOVED":     4,
+}
+
+func (x CampaignCriterionStatusEnum_CampaignCriterionStatus) String() string {
+	return proto.EnumName(CampaignCriterionStatusEnum_CampaignCriterionStatus_name, int32(x))
+}
+
+func (CampaignCriterionStatusEnum_CampaignCriterionStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_cb42476aef577b3f, []int{0, 0}
+}
+
+// Message describing CampaignCriterion statuses.
+type CampaignCriterionStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignCriterionStatusEnum) Reset()         { *m = CampaignCriterionStatusEnum{} }
+func (m *CampaignCriterionStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignCriterionStatusEnum) ProtoMessage()    {}
+func (*CampaignCriterionStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_cb42476aef577b3f, []int{0}
+}
+
+func (m *CampaignCriterionStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignCriterionStatusEnum.Unmarshal(m, b)
+}
+func (m *CampaignCriterionStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignCriterionStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignCriterionStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignCriterionStatusEnum.Merge(m, src)
+}
+func (m *CampaignCriterionStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignCriterionStatusEnum.Size(m)
+}
+func (m *CampaignCriterionStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignCriterionStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignCriterionStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignCriterionStatusEnum_CampaignCriterionStatus", CampaignCriterionStatusEnum_CampaignCriterionStatus_name, CampaignCriterionStatusEnum_CampaignCriterionStatus_value)
+	proto.RegisterType((*CampaignCriterionStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignCriterionStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/campaign_criterion_status.proto", fileDescriptor_cb42476aef577b3f)
+}
+
+var fileDescriptor_cb42476aef577b3f = []byte{
+	// 318 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xb1, 0x4e, 0xc3, 0x30,
+	0x14, 0xa4, 0x29, 0x2a, 0x92, 0x3b, 0x10, 0x65, 0x41, 0x82, 0x76, 0x68, 0x3f, 0xc0, 0x19, 0xb2,
+	0x19, 0x31, 0x38, 0x8d, 0xa9, 0x2a, 0x20, 0x8d, 0xa8, 0x1a, 0x24, 0x14, 0x54, 0x99, 0x26, 0xb2,
+	0x2c, 0x35, 0x76, 0x14, 0xbb, 0x9d, 0xf8, 0x1a, 0x46, 0x3e, 0x85, 0x4f, 0x61, 0xe3, 0x0f, 0x90,
+	0x9d, 0xa6, 0x5b, 0x58, 0xac, 0xf3, 0xbb, 0x77, 0xa7, 0x77, 0x07, 0xee, 0x98, 0x94, 0x6c, 0x57,
+	0xf8, 0x34, 0x57, 0x7e, 0x03, 0x0d, 0x3a, 0x04, 0x7e, 0x21, 0xf6, 0xa5, 0xf2, 0xb7, 0xb4, 0xac,
+	0x28, 0x67, 0x62, 0xb3, 0xad, 0xb9, 0x2e, 0x6a, 0x2e, 0xc5, 0x46, 0x69, 0xaa, 0xf7, 0x0a, 0x56,
+	0xb5, 0xd4, 0xd2, 0x1b, 0x37, 0x1a, 0x48, 0x73, 0x05, 0x4f, 0x72, 0x78, 0x08, 0xa0, 0x95, 0x5f,
+	0x8f, 0x5a, 0xf7, 0x8a, 0xfb, 0x54, 0x08, 0xa9, 0xa9, 0xe6, 0x52, 0x1c, 0xc5, 0xd3, 0x0f, 0x70,
+	0x33, 0x3b, 0xfa, 0xcf, 0x5a, 0xfb, 0x95, 0x75, 0x27, 0x62, 0x5f, 0x4e, 0xdf, 0xc0, 0x55, 0x07,
+	0xed, 0x5d, 0x82, 0xe1, 0x3a, 0x5e, 0x25, 0x64, 0xb6, 0xb8, 0x5f, 0x90, 0xc8, 0x3d, 0xf3, 0x86,
+	0xe0, 0x62, 0x1d, 0x3f, 0xc4, 0xcb, 0x97, 0xd8, 0xed, 0x99, 0x0f, 0x89, 0x71, 0xf8, 0x48, 0x22,
+	0xd7, 0xf1, 0x00, 0x18, 0x24, 0x78, 0xbd, 0x22, 0x91, 0xdb, 0x37, 0xc4, 0x33, 0x79, 0x5a, 0xa6,
+	0x24, 0x72, 0xcf, 0xc3, 0xdf, 0x1e, 0x98, 0x6c, 0x65, 0x09, 0xff, 0x4d, 0x10, 0x8e, 0x3a, 0x4e,
+	0x48, 0x4c, 0x82, 0xa4, 0xf7, 0x1a, 0x1e, 0xe5, 0x4c, 0xee, 0xa8, 0x60, 0x50, 0xd6, 0xcc, 0x67,
+	0x85, 0xb0, 0xf9, 0xda, 0x3e, 0x2b, 0xae, 0x3a, 0xea, 0xbd, 0xb5, 0xef, 0xa7, 0xd3, 0x9f, 0x63,
+	0xfc, 0xe5, 0x8c, 0xe7, 0x8d, 0x15, 0xce, 0x15, 0x6c, 0xa0, 0x41, 0x69, 0x00, 0x4d, 0x1b, 0xea,
+	0xbb, 0xe5, 0x33, 0x9c, 0xab, 0xec, 0xc4, 0x67, 0x69, 0x90, 0x59, 0xfe, 0xc7, 0x99, 0x34, 0x43,
+	0x84, 0x70, 0xae, 0x10, 0x3a, 0x6d, 0x20, 0x94, 0x06, 0x08, 0xd9, 0x9d, 0xf7, 0x81, 0x3d, 0x2c,
+	0xf8, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x5a, 0x6b, 0xa2, 0xf6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/campaign_draft_status.pb.go b/googleapis/ads/googleads/v3/enums/campaign_draft_status.pb.go
new file mode 100644
index 0000000..b294fe8
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/campaign_draft_status.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/campaign_draft_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a campaign draft.
+type CampaignDraftStatusEnum_CampaignDraftStatus int32
+
+const (
+	// The status has not been specified.
+	CampaignDraftStatusEnum_UNSPECIFIED CampaignDraftStatusEnum_CampaignDraftStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	CampaignDraftStatusEnum_UNKNOWN CampaignDraftStatusEnum_CampaignDraftStatus = 1
+	// Initial state of the draft, the advertiser can start adding changes with
+	// no effect on serving.
+	CampaignDraftStatusEnum_PROPOSED CampaignDraftStatusEnum_CampaignDraftStatus = 2
+	// The campaign draft is removed.
+	CampaignDraftStatusEnum_REMOVED CampaignDraftStatusEnum_CampaignDraftStatus = 3
+	// Advertiser requested to promote draft's changes back into the original
+	// campaign. Advertiser can poll the long running operation returned by
+	// the promote action to see the status of the promotion.
+	CampaignDraftStatusEnum_PROMOTING CampaignDraftStatusEnum_CampaignDraftStatus = 5
+	// The process to merge changes in the draft back to the original campaign
+	// has completed successfully.
+	CampaignDraftStatusEnum_PROMOTED CampaignDraftStatusEnum_CampaignDraftStatus = 4
+	// The promotion failed after it was partially applied. Promote cannot be
+	// attempted again safely, so the issue must be corrected in the original
+	// campaign.
+	CampaignDraftStatusEnum_PROMOTE_FAILED CampaignDraftStatusEnum_CampaignDraftStatus = 6
+)
+
+var CampaignDraftStatusEnum_CampaignDraftStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PROPOSED",
+	3: "REMOVED",
+	5: "PROMOTING",
+	4: "PROMOTED",
+	6: "PROMOTE_FAILED",
+}
+
+var CampaignDraftStatusEnum_CampaignDraftStatus_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"PROPOSED":       2,
+	"REMOVED":        3,
+	"PROMOTING":      5,
+	"PROMOTED":       4,
+	"PROMOTE_FAILED": 6,
+}
+
+func (x CampaignDraftStatusEnum_CampaignDraftStatus) String() string {
+	return proto.EnumName(CampaignDraftStatusEnum_CampaignDraftStatus_name, int32(x))
+}
+
+func (CampaignDraftStatusEnum_CampaignDraftStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_70c9d2fa31d31347, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of a campaign draft.
+type CampaignDraftStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignDraftStatusEnum) Reset()         { *m = CampaignDraftStatusEnum{} }
+func (m *CampaignDraftStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignDraftStatusEnum) ProtoMessage()    {}
+func (*CampaignDraftStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_70c9d2fa31d31347, []int{0}
+}
+
+func (m *CampaignDraftStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignDraftStatusEnum.Unmarshal(m, b)
+}
+func (m *CampaignDraftStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignDraftStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignDraftStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignDraftStatusEnum.Merge(m, src)
+}
+func (m *CampaignDraftStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignDraftStatusEnum.Size(m)
+}
+func (m *CampaignDraftStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignDraftStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignDraftStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignDraftStatusEnum_CampaignDraftStatus", CampaignDraftStatusEnum_CampaignDraftStatus_name, CampaignDraftStatusEnum_CampaignDraftStatus_value)
+	proto.RegisterType((*CampaignDraftStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignDraftStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/campaign_draft_status.proto", fileDescriptor_70c9d2fa31d31347)
+}
+
+var fileDescriptor_70c9d2fa31d31347 = []byte{
+	// 347 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0xe3, 0x30,
+	0x18, 0x9d, 0xa4, 0x33, 0x9d, 0x19, 0x97, 0x9f, 0xc8, 0x2c, 0x40, 0x88, 0x2e, 0xda, 0x03, 0x38,
+	0x8b, 0xac, 0x30, 0xab, 0xb4, 0x71, 0xab, 0x08, 0x1a, 0x47, 0xfd, 0x09, 0x12, 0x8a, 0x54, 0x99,
+	0xa6, 0x58, 0x91, 0x1a, 0x3b, 0xaa, 0xd3, 0x6e, 0xb9, 0x07, 0x4b, 0x96, 0x1c, 0x85, 0xa3, 0x20,
+	0x71, 0x07, 0x14, 0x27, 0xed, 0xaa, 0xb0, 0x89, 0x5e, 0xfc, 0x7e, 0xf4, 0xbd, 0x07, 0xae, 0xb9,
+	0x94, 0x7c, 0xb5, 0xb4, 0x59, 0xa2, 0xec, 0x0a, 0x96, 0x68, 0xeb, 0xd8, 0x4b, 0xb1, 0xc9, 0x94,
+	0xbd, 0x60, 0x59, 0xce, 0x52, 0x2e, 0xe6, 0xc9, 0x9a, 0x3d, 0x15, 0x73, 0x55, 0xb0, 0x62, 0xa3,
+	0x50, 0xbe, 0x96, 0x85, 0x84, 0xed, 0x4a, 0x8f, 0x58, 0xa2, 0xd0, 0xde, 0x8a, 0xb6, 0x0e, 0xd2,
+	0xd6, 0xcb, 0xab, 0x5d, 0x72, 0x9e, 0xda, 0x4c, 0x08, 0x59, 0xb0, 0x22, 0x95, 0xa2, 0x36, 0x77,
+	0x5f, 0x0c, 0x70, 0xde, 0xaf, 0xc3, 0xbd, 0x32, 0x7b, 0xa2, 0xa3, 0x89, 0xd8, 0x64, 0xdd, 0x67,
+	0x70, 0x76, 0x80, 0x82, 0xa7, 0xa0, 0x35, 0x0b, 0x26, 0x21, 0xe9, 0xfb, 0x03, 0x9f, 0x78, 0xd6,
+	0x2f, 0xd8, 0x02, 0x7f, 0x67, 0xc1, 0x6d, 0x40, 0xef, 0x03, 0xcb, 0x80, 0x47, 0xe0, 0x5f, 0x38,
+	0xa6, 0x21, 0x9d, 0x10, 0xcf, 0x32, 0x4b, 0x6a, 0x4c, 0x46, 0x34, 0x22, 0x9e, 0xd5, 0x80, 0xc7,
+	0xe0, 0x7f, 0x38, 0xa6, 0x23, 0x3a, 0xf5, 0x83, 0xa1, 0xf5, 0xa7, 0x56, 0x8e, 0xe8, 0x94, 0x78,
+	0xd6, 0x6f, 0x08, 0xc1, 0x49, 0xfd, 0x37, 0x1f, 0xb8, 0xfe, 0x1d, 0xf1, 0xac, 0x66, 0xef, 0xd3,
+	0x00, 0x9d, 0x85, 0xcc, 0xd0, 0x8f, 0x05, 0x7b, 0x17, 0x07, 0x8e, 0x0c, 0xcb, 0x72, 0xa1, 0xf1,
+	0xd0, 0xab, 0xad, 0x5c, 0xae, 0x98, 0xe0, 0x48, 0xae, 0xb9, 0xcd, 0x97, 0x42, 0x57, 0xdf, 0xcd,
+	0x9c, 0xa7, 0xea, 0x9b, 0xd5, 0x6f, 0xf4, 0xf7, 0xd5, 0x6c, 0x0c, 0x5d, 0xf7, 0xcd, 0x6c, 0x0f,
+	0xab, 0x28, 0x37, 0x51, 0xa8, 0x82, 0x25, 0x8a, 0x1c, 0x54, 0x6e, 0xa5, 0xde, 0x77, 0x7c, 0xec,
+	0x26, 0x2a, 0xde, 0xf3, 0x71, 0xe4, 0xc4, 0x9a, 0xff, 0x30, 0x3b, 0xd5, 0x23, 0xc6, 0x6e, 0xa2,
+	0x30, 0xde, 0x2b, 0x30, 0x8e, 0x1c, 0x8c, 0xb5, 0xe6, 0xb1, 0xa9, 0x0f, 0x73, 0xbe, 0x02, 0x00,
+	0x00, 0xff, 0xff, 0x6e, 0x06, 0x85, 0xe8, 0x0d, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/campaign_experiment_status.pb.go b/googleapis/ads/googleads/v3/enums/campaign_experiment_status.pb.go
new file mode 100644
index 0000000..ab4db7d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/campaign_experiment_status.pb.go
@@ -0,0 +1,164 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/campaign_experiment_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a campaign experiment.
+type CampaignExperimentStatusEnum_CampaignExperimentStatus int32
+
+const (
+	// The status has not been specified.
+	CampaignExperimentStatusEnum_UNSPECIFIED CampaignExperimentStatusEnum_CampaignExperimentStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	CampaignExperimentStatusEnum_UNKNOWN CampaignExperimentStatusEnum_CampaignExperimentStatus = 1
+	// The experiment campaign is being initialized.
+	CampaignExperimentStatusEnum_INITIALIZING CampaignExperimentStatusEnum_CampaignExperimentStatus = 2
+	// Initialization of the experiment campaign failed.
+	CampaignExperimentStatusEnum_INITIALIZATION_FAILED CampaignExperimentStatusEnum_CampaignExperimentStatus = 8
+	// The experiment campaign is fully initialized. The experiment is currently
+	// running, scheduled to run in the future or has ended based on its
+	// end date. An experiment with the status INITIALIZING will be updated to
+	// ENABLED when it is fully created.
+	CampaignExperimentStatusEnum_ENABLED CampaignExperimentStatusEnum_CampaignExperimentStatus = 3
+	// The experiment campaign was graduated to a stand-alone
+	// campaign, existing independently of the experiment.
+	CampaignExperimentStatusEnum_GRADUATED CampaignExperimentStatusEnum_CampaignExperimentStatus = 4
+	// The experiment is removed.
+	CampaignExperimentStatusEnum_REMOVED CampaignExperimentStatusEnum_CampaignExperimentStatus = 5
+	// The experiment's changes are being applied to the original campaign.
+	// The long running operation returned by the promote method can be polled
+	// to see the status of the promotion.
+	CampaignExperimentStatusEnum_PROMOTING CampaignExperimentStatusEnum_CampaignExperimentStatus = 6
+	// Promote of the experiment campaign failed.
+	CampaignExperimentStatusEnum_PROMOTION_FAILED CampaignExperimentStatusEnum_CampaignExperimentStatus = 9
+	// The changes of the experiment are promoted to their original campaign.
+	CampaignExperimentStatusEnum_PROMOTED CampaignExperimentStatusEnum_CampaignExperimentStatus = 7
+	// The experiment was ended manually. It did not end based on its end date.
+	CampaignExperimentStatusEnum_ENDED_MANUALLY CampaignExperimentStatusEnum_CampaignExperimentStatus = 10
+)
+
+var CampaignExperimentStatusEnum_CampaignExperimentStatus_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "INITIALIZING",
+	8:  "INITIALIZATION_FAILED",
+	3:  "ENABLED",
+	4:  "GRADUATED",
+	5:  "REMOVED",
+	6:  "PROMOTING",
+	9:  "PROMOTION_FAILED",
+	7:  "PROMOTED",
+	10: "ENDED_MANUALLY",
+}
+
+var CampaignExperimentStatusEnum_CampaignExperimentStatus_value = map[string]int32{
+	"UNSPECIFIED":           0,
+	"UNKNOWN":               1,
+	"INITIALIZING":          2,
+	"INITIALIZATION_FAILED": 8,
+	"ENABLED":               3,
+	"GRADUATED":             4,
+	"REMOVED":               5,
+	"PROMOTING":             6,
+	"PROMOTION_FAILED":      9,
+	"PROMOTED":              7,
+	"ENDED_MANUALLY":        10,
+}
+
+func (x CampaignExperimentStatusEnum_CampaignExperimentStatus) String() string {
+	return proto.EnumName(CampaignExperimentStatusEnum_CampaignExperimentStatus_name, int32(x))
+}
+
+func (CampaignExperimentStatusEnum_CampaignExperimentStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ab93bd5181abeea7, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of a campaign experiment.
+type CampaignExperimentStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignExperimentStatusEnum) Reset()         { *m = CampaignExperimentStatusEnum{} }
+func (m *CampaignExperimentStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignExperimentStatusEnum) ProtoMessage()    {}
+func (*CampaignExperimentStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ab93bd5181abeea7, []int{0}
+}
+
+func (m *CampaignExperimentStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignExperimentStatusEnum.Unmarshal(m, b)
+}
+func (m *CampaignExperimentStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignExperimentStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignExperimentStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignExperimentStatusEnum.Merge(m, src)
+}
+func (m *CampaignExperimentStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignExperimentStatusEnum.Size(m)
+}
+func (m *CampaignExperimentStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignExperimentStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignExperimentStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignExperimentStatusEnum_CampaignExperimentStatus", CampaignExperimentStatusEnum_CampaignExperimentStatus_name, CampaignExperimentStatusEnum_CampaignExperimentStatus_value)
+	proto.RegisterType((*CampaignExperimentStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignExperimentStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/campaign_experiment_status.proto", fileDescriptor_ab93bd5181abeea7)
+}
+
+var fileDescriptor_ab93bd5181abeea7 = []byte{
+	// 403 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0x4d, 0x6f, 0xd4, 0x30,
+	0x10, 0x25, 0x5b, 0xe8, 0x87, 0x5b, 0xc0, 0xb2, 0x40, 0x02, 0xd4, 0x3d, 0xb4, 0x3f, 0xc0, 0x39,
+	0xe4, 0x66, 0x24, 0x24, 0x6f, 0xed, 0xae, 0x2c, 0x76, 0x9d, 0xd5, 0x36, 0x09, 0xa2, 0x8a, 0x14,
+	0x99, 0x26, 0x8a, 0x22, 0x35, 0x76, 0xb4, 0xce, 0xae, 0xf8, 0x3d, 0x1c, 0xf9, 0x29, 0xdc, 0xf9,
+	0x13, 0x1c, 0x39, 0x70, 0x46, 0x4e, 0xb2, 0xe1, 0xb4, 0x5c, 0xa2, 0x37, 0xf3, 0xe6, 0xbd, 0x89,
+	0xe7, 0x81, 0x0f, 0xa5, 0x31, 0xe5, 0x63, 0xe1, 0xab, 0xdc, 0xfa, 0x3d, 0x74, 0x68, 0x17, 0xf8,
+	0x85, 0xde, 0xd6, 0xd6, 0x7f, 0x50, 0x75, 0xa3, 0xaa, 0x52, 0x67, 0xc5, 0xd7, 0xa6, 0xd8, 0x54,
+	0x75, 0xa1, 0xdb, 0xcc, 0xb6, 0xaa, 0xdd, 0x5a, 0xdc, 0x6c, 0x4c, 0x6b, 0xd0, 0xb4, 0x17, 0x61,
+	0x95, 0x5b, 0x3c, 0xea, 0xf1, 0x2e, 0xc0, 0x9d, 0xfe, 0xdd, 0xe5, 0xde, 0xbe, 0xa9, 0x7c, 0xa5,
+	0xb5, 0x69, 0x55, 0x5b, 0x19, 0x3d, 0x88, 0xaf, 0xff, 0x78, 0xe0, 0xf2, 0x66, 0xd8, 0xc0, 0xc7,
+	0x05, 0x77, 0x9d, 0x3f, 0xd7, 0xdb, 0xfa, 0xfa, 0xa7, 0x07, 0xde, 0x1c, 0x1a, 0x40, 0x2f, 0xc1,
+	0x79, 0x2c, 0xef, 0x56, 0xfc, 0x46, 0xdc, 0x0a, 0xce, 0xe0, 0x13, 0x74, 0x0e, 0x4e, 0x62, 0xf9,
+	0x51, 0x86, 0x9f, 0x24, 0xf4, 0x10, 0x04, 0x17, 0x42, 0x8a, 0x48, 0xd0, 0x85, 0xb8, 0x17, 0x72,
+	0x0e, 0x27, 0xe8, 0x2d, 0x78, 0x3d, 0x76, 0x68, 0x24, 0x42, 0x99, 0xdd, 0x52, 0xb1, 0xe0, 0x0c,
+	0x9e, 0x3a, 0x25, 0x97, 0x74, 0xe6, 0x8a, 0x23, 0xf4, 0x1c, 0x9c, 0xcd, 0xd7, 0x94, 0xc5, 0x34,
+	0xe2, 0x0c, 0x3e, 0x75, 0xdc, 0x9a, 0x2f, 0xc3, 0x84, 0x33, 0xf8, 0xcc, 0x71, 0xab, 0x75, 0xb8,
+	0x0c, 0x23, 0x67, 0x79, 0x8c, 0x5e, 0x01, 0x38, 0x94, 0xff, 0xdc, 0xce, 0xd0, 0x05, 0x38, 0xed,
+	0xbb, 0x9c, 0xc1, 0x13, 0x84, 0xc0, 0x0b, 0x2e, 0x19, 0x67, 0xd9, 0x92, 0xca, 0x98, 0x2e, 0x16,
+	0x9f, 0x21, 0x98, 0xfd, 0xf6, 0xc0, 0xd5, 0x83, 0xa9, 0xf1, 0x7f, 0x8f, 0x37, 0x9b, 0x1e, 0x7a,
+	0xfa, 0xca, 0x5d, 0x6f, 0xe5, 0xdd, 0xcf, 0x06, 0x7d, 0x69, 0x1e, 0x95, 0x2e, 0xb1, 0xd9, 0x94,
+	0x7e, 0x59, 0xe8, 0xee, 0xb6, 0xfb, 0x30, 0x9b, 0xca, 0x1e, 0xc8, 0xf6, 0x7d, 0xf7, 0xfd, 0x36,
+	0x39, 0x9a, 0x53, 0xfa, 0x7d, 0x32, 0x9d, 0xf7, 0x56, 0x34, 0xb7, 0xb8, 0x87, 0x0e, 0x25, 0x01,
+	0x76, 0x39, 0xd8, 0x1f, 0x7b, 0x3e, 0xa5, 0xb9, 0x4d, 0x47, 0x3e, 0x4d, 0x82, 0xb4, 0xe3, 0x7f,
+	0x4d, 0xae, 0xfa, 0x26, 0x21, 0x34, 0xb7, 0x84, 0x8c, 0x13, 0x84, 0x24, 0x01, 0x21, 0xdd, 0xcc,
+	0x97, 0xe3, 0xee, 0xc7, 0x82, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x56, 0xaa, 0xdf, 0x02, 0x73,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/campaign_experiment_traffic_split_type.pb.go b/googleapis/ads/googleads/v3/enums/campaign_experiment_traffic_split_type.pb.go
new file mode 100644
index 0000000..96673ff
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/campaign_experiment_traffic_split_type.pb.go
@@ -0,0 +1,131 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/campaign_experiment_traffic_split_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum of strategies for splitting traffic between base and experiment
+// campaigns in campaign experiment.
+type CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType int32
+
+const (
+	// Not specified.
+	CampaignExperimentTrafficSplitTypeEnum_UNSPECIFIED CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType = 0
+	// Used for return value only. Represents value unknown in this version.
+	CampaignExperimentTrafficSplitTypeEnum_UNKNOWN CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType = 1
+	// Traffic is randomly assigned to the base or experiment arm for each
+	// query, independent of previous assignments for the same user.
+	CampaignExperimentTrafficSplitTypeEnum_RANDOM_QUERY CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType = 2
+	// Traffic is split using cookies to keep users in the same arm (base or
+	// experiment) of the experiment.
+	CampaignExperimentTrafficSplitTypeEnum_COOKIE CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType = 3
+)
+
+var CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "RANDOM_QUERY",
+	3: "COOKIE",
+}
+
+var CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"RANDOM_QUERY": 2,
+	"COOKIE":       3,
+}
+
+func (x CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType) String() string {
+	return proto.EnumName(CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_name, int32(x))
+}
+
+func (CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8a5c058d201e2ee9, []int{0, 0}
+}
+
+// Container for enum describing campaign experiment traffic split type.
+type CampaignExperimentTrafficSplitTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignExperimentTrafficSplitTypeEnum) Reset() {
+	*m = CampaignExperimentTrafficSplitTypeEnum{}
+}
+func (m *CampaignExperimentTrafficSplitTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignExperimentTrafficSplitTypeEnum) ProtoMessage()    {}
+func (*CampaignExperimentTrafficSplitTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8a5c058d201e2ee9, []int{0}
+}
+
+func (m *CampaignExperimentTrafficSplitTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignExperimentTrafficSplitTypeEnum.Unmarshal(m, b)
+}
+func (m *CampaignExperimentTrafficSplitTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignExperimentTrafficSplitTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignExperimentTrafficSplitTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignExperimentTrafficSplitTypeEnum.Merge(m, src)
+}
+func (m *CampaignExperimentTrafficSplitTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignExperimentTrafficSplitTypeEnum.Size(m)
+}
+func (m *CampaignExperimentTrafficSplitTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignExperimentTrafficSplitTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignExperimentTrafficSplitTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType", CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_name, CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_value)
+	proto.RegisterType((*CampaignExperimentTrafficSplitTypeEnum)(nil), "google.ads.googleads.v3.enums.CampaignExperimentTrafficSplitTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/campaign_experiment_traffic_split_type.proto", fileDescriptor_8a5c058d201e2ee9)
+}
+
+var fileDescriptor_8a5c058d201e2ee9 = []byte{
+	// 340 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x51, 0xbd, 0x4e, 0xeb, 0x30,
+	0x18, 0xbd, 0x49, 0xa5, 0x5e, 0xc9, 0xbd, 0xd2, 0x8d, 0x32, 0x22, 0x3a, 0xb4, 0x03, 0x6c, 0xce,
+	0x90, 0xcd, 0x4c, 0x69, 0x1b, 0xaa, 0x52, 0x91, 0x94, 0xfe, 0x21, 0x50, 0xa4, 0x60, 0x1a, 0xd7,
+	0xb2, 0xd4, 0xd8, 0x56, 0xec, 0x56, 0xf4, 0x15, 0x78, 0x0c, 0x46, 0x1e, 0x85, 0x47, 0xe1, 0x19,
+	0x18, 0x50, 0xe2, 0x36, 0x1b, 0x74, 0xb1, 0x8e, 0x7c, 0x8e, 0xcf, 0xf9, 0xce, 0x67, 0x70, 0x43,
+	0x85, 0xa0, 0x1b, 0xe2, 0xe1, 0x4c, 0x79, 0x06, 0x96, 0x68, 0xe7, 0x7b, 0x84, 0x6f, 0x73, 0xe5,
+	0xad, 0x70, 0x2e, 0x31, 0xa3, 0x3c, 0x25, 0x2f, 0x92, 0x14, 0x2c, 0x27, 0x5c, 0xa7, 0xba, 0xc0,
+	0xeb, 0x35, 0x5b, 0xa5, 0x4a, 0x6e, 0x98, 0x4e, 0xf5, 0x5e, 0x12, 0x28, 0x0b, 0xa1, 0x85, 0xdb,
+	0x36, 0x06, 0x10, 0x67, 0x0a, 0xd6, 0x5e, 0x70, 0xe7, 0xc3, 0xca, 0xeb, 0xec, 0xfc, 0x18, 0x25,
+	0x99, 0x87, 0x39, 0x17, 0x1a, 0x6b, 0x26, 0xb8, 0x32, 0x8f, 0xbb, 0xaf, 0x16, 0xb8, 0xe8, 0x1f,
+	0xd2, 0xc2, 0x3a, 0x6c, 0x6e, 0xb2, 0x66, 0x65, 0xd4, 0x7c, 0x2f, 0x49, 0xc8, 0xb7, 0x79, 0xf7,
+	0x09, 0x74, 0x4f, 0x2b, 0xdd, 0xff, 0xa0, 0xb5, 0x88, 0x66, 0x93, 0xb0, 0x3f, 0xba, 0x1e, 0x85,
+	0x03, 0xe7, 0x8f, 0xdb, 0x02, 0x7f, 0x17, 0xd1, 0x38, 0x8a, 0xef, 0x23, 0xc7, 0x72, 0x1d, 0xf0,
+	0x6f, 0x1a, 0x44, 0x83, 0xf8, 0x36, 0xbd, 0x5b, 0x84, 0xd3, 0x07, 0xc7, 0x76, 0x01, 0x68, 0xf6,
+	0xe3, 0x78, 0x3c, 0x0a, 0x9d, 0x46, 0xef, 0xcb, 0x02, 0x9d, 0x95, 0xc8, 0xe1, 0xaf, 0x85, 0x7a,
+	0x97, 0xa7, 0xa7, 0x98, 0x94, 0xdd, 0x26, 0xd6, 0x63, 0xef, 0xe0, 0x44, 0xc5, 0x06, 0x73, 0x0a,
+	0x45, 0x41, 0x3d, 0x4a, 0x78, 0xd5, 0xfc, 0xb8, 0x76, 0xc9, 0xd4, 0x0f, 0xbf, 0x70, 0x55, 0x9d,
+	0x6f, 0x76, 0x63, 0x18, 0x04, 0xef, 0x76, 0x7b, 0x68, 0xac, 0x82, 0x4c, 0x41, 0x03, 0x4b, 0xb4,
+	0xf4, 0x61, 0xb9, 0x1b, 0xf5, 0x71, 0xe4, 0x93, 0x20, 0x53, 0x49, 0xcd, 0x27, 0x4b, 0x3f, 0xa9,
+	0xf8, 0x4f, 0xbb, 0x63, 0x2e, 0x11, 0x0a, 0x32, 0x85, 0x50, 0xad, 0x40, 0x68, 0xe9, 0x23, 0x54,
+	0x69, 0x9e, 0x9b, 0xd5, 0x60, 0xfe, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x31, 0x13, 0x45, 0x71,
+	0x1d, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/campaign_experiment_type.pb.go b/googleapis/ads/googleads/v3/enums/campaign_experiment_type.pb.go
new file mode 100644
index 0000000..ab749a5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/campaign_experiment_type.pb.go
@@ -0,0 +1,135 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/campaign_experiment_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Indicates if this campaign is a normal campaign,
+// a draft campaign, or an experiment campaign.
+type CampaignExperimentTypeEnum_CampaignExperimentType int32
+
+const (
+	// Not specified.
+	CampaignExperimentTypeEnum_UNSPECIFIED CampaignExperimentTypeEnum_CampaignExperimentType = 0
+	// Used for return value only. Represents value unknown in this version.
+	CampaignExperimentTypeEnum_UNKNOWN CampaignExperimentTypeEnum_CampaignExperimentType = 1
+	// This is a regular campaign.
+	CampaignExperimentTypeEnum_BASE CampaignExperimentTypeEnum_CampaignExperimentType = 2
+	// This is a draft version of a campaign.
+	// It has some modifications from a base campaign,
+	// but it does not serve or accrue metrics.
+	CampaignExperimentTypeEnum_DRAFT CampaignExperimentTypeEnum_CampaignExperimentType = 3
+	// This is an experiment version of a campaign.
+	// It has some modifications from a base campaign,
+	// and a percentage of traffic is being diverted
+	// from the BASE campaign to this experiment campaign.
+	CampaignExperimentTypeEnum_EXPERIMENT CampaignExperimentTypeEnum_CampaignExperimentType = 4
+)
+
+var CampaignExperimentTypeEnum_CampaignExperimentType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "BASE",
+	3: "DRAFT",
+	4: "EXPERIMENT",
+}
+
+var CampaignExperimentTypeEnum_CampaignExperimentType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"BASE":        2,
+	"DRAFT":       3,
+	"EXPERIMENT":  4,
+}
+
+func (x CampaignExperimentTypeEnum_CampaignExperimentType) String() string {
+	return proto.EnumName(CampaignExperimentTypeEnum_CampaignExperimentType_name, int32(x))
+}
+
+func (CampaignExperimentTypeEnum_CampaignExperimentType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a76efef12348e68b, []int{0, 0}
+}
+
+// Container for enum describing campaign experiment type.
+type CampaignExperimentTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignExperimentTypeEnum) Reset()         { *m = CampaignExperimentTypeEnum{} }
+func (m *CampaignExperimentTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignExperimentTypeEnum) ProtoMessage()    {}
+func (*CampaignExperimentTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a76efef12348e68b, []int{0}
+}
+
+func (m *CampaignExperimentTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignExperimentTypeEnum.Unmarshal(m, b)
+}
+func (m *CampaignExperimentTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignExperimentTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignExperimentTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignExperimentTypeEnum.Merge(m, src)
+}
+func (m *CampaignExperimentTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignExperimentTypeEnum.Size(m)
+}
+func (m *CampaignExperimentTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignExperimentTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignExperimentTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignExperimentTypeEnum_CampaignExperimentType", CampaignExperimentTypeEnum_CampaignExperimentType_name, CampaignExperimentTypeEnum_CampaignExperimentType_value)
+	proto.RegisterType((*CampaignExperimentTypeEnum)(nil), "google.ads.googleads.v3.enums.CampaignExperimentTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/campaign_experiment_type.proto", fileDescriptor_a76efef12348e68b)
+}
+
+var fileDescriptor_a76efef12348e68b = []byte{
+	// 324 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x3d, 0x4e, 0xc3, 0x30,
+	0x1c, 0xc5, 0x69, 0x5a, 0xbe, 0x5c, 0x09, 0xa2, 0x0c, 0x0c, 0x85, 0x0e, 0xed, 0x01, 0x9c, 0x21,
+	0x9b, 0x61, 0x71, 0x5a, 0xb7, 0xaa, 0x10, 0x21, 0xea, 0x17, 0x08, 0x22, 0x55, 0xa6, 0xb1, 0xac,
+	0x48, 0x8d, 0x6d, 0xd5, 0x69, 0x45, 0xaf, 0xc3, 0xc8, 0x51, 0x38, 0x0a, 0x13, 0x47, 0x40, 0x89,
+	0x9b, 0x4c, 0x85, 0x25, 0x7a, 0xca, 0xfb, 0xff, 0x9e, 0x9e, 0x1f, 0xb8, 0xe3, 0x52, 0xf2, 0x15,
+	0x73, 0x69, 0xac, 0x5d, 0x23, 0x73, 0xb5, 0xf5, 0x5c, 0x26, 0x36, 0xa9, 0x76, 0x97, 0x34, 0x55,
+	0x34, 0xe1, 0x62, 0xc1, 0xde, 0x15, 0x5b, 0x27, 0x29, 0x13, 0xd9, 0x22, 0xdb, 0x29, 0x06, 0xd5,
+	0x5a, 0x66, 0xd2, 0x69, 0x1b, 0x04, 0xd2, 0x58, 0xc3, 0x8a, 0x86, 0x5b, 0x0f, 0x16, 0x74, 0xeb,
+	0xa6, 0x0c, 0x57, 0x89, 0x4b, 0x85, 0x90, 0x19, 0xcd, 0x12, 0x29, 0xb4, 0x81, 0xbb, 0x3b, 0xd0,
+	0xea, 0xed, 0xe3, 0x49, 0x95, 0x3e, 0xdd, 0x29, 0x46, 0xc4, 0x26, 0xed, 0xbe, 0x82, 0xab, 0xc3,
+	0xae, 0x73, 0x09, 0x9a, 0xb3, 0x60, 0x12, 0x92, 0xde, 0x68, 0x30, 0x22, 0x7d, 0xfb, 0xc8, 0x69,
+	0x82, 0xd3, 0x59, 0x70, 0x1f, 0x3c, 0x3e, 0x05, 0x76, 0xcd, 0x39, 0x03, 0x0d, 0x1f, 0x4f, 0x88,
+	0x6d, 0x39, 0xe7, 0xe0, 0xb8, 0x3f, 0xc6, 0x83, 0xa9, 0x5d, 0x77, 0x2e, 0x00, 0x20, 0xcf, 0x21,
+	0x19, 0x8f, 0x1e, 0x48, 0x30, 0xb5, 0x1b, 0xfe, 0x4f, 0x0d, 0x74, 0x96, 0x32, 0x85, 0xff, 0xd6,
+	0xf7, 0xaf, 0x0f, 0x17, 0x08, 0xf3, 0xf6, 0x61, 0xed, 0xc5, 0xdf, 0xd3, 0x5c, 0xae, 0xa8, 0xe0,
+	0x50, 0xae, 0xb9, 0xcb, 0x99, 0x28, 0xde, 0x56, 0x4e, 0xa9, 0x12, 0xfd, 0xc7, 0xb2, 0xb7, 0xc5,
+	0xf7, 0xc3, 0xaa, 0x0f, 0x31, 0xfe, 0xb4, 0xda, 0x43, 0x13, 0x85, 0x63, 0x0d, 0x8d, 0xcc, 0xd5,
+	0xdc, 0x83, 0xf9, 0x14, 0xfa, 0xab, 0xf4, 0x23, 0x1c, 0xeb, 0xa8, 0xf2, 0xa3, 0xb9, 0x17, 0x15,
+	0xfe, 0xb7, 0xd5, 0x31, 0x3f, 0x11, 0xc2, 0xb1, 0x46, 0xa8, 0xba, 0x40, 0x68, 0xee, 0x21, 0x54,
+	0xdc, 0xbc, 0x9d, 0x14, 0xc5, 0xbc, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbb, 0x78, 0x05, 0x0e,
+	0xf1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/campaign_serving_status.pb.go b/googleapis/ads/googleads/v3/enums/campaign_serving_status.pb.go
new file mode 100644
index 0000000..b29dd94
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/campaign_serving_status.pb.go
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/campaign_serving_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible serving statuses of a campaign.
+type CampaignServingStatusEnum_CampaignServingStatus int32
+
+const (
+	// No value has been specified.
+	CampaignServingStatusEnum_UNSPECIFIED CampaignServingStatusEnum_CampaignServingStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	CampaignServingStatusEnum_UNKNOWN CampaignServingStatusEnum_CampaignServingStatus = 1
+	// Serving.
+	CampaignServingStatusEnum_SERVING CampaignServingStatusEnum_CampaignServingStatus = 2
+	// None.
+	CampaignServingStatusEnum_NONE CampaignServingStatusEnum_CampaignServingStatus = 3
+	// Ended.
+	CampaignServingStatusEnum_ENDED CampaignServingStatusEnum_CampaignServingStatus = 4
+	// Pending.
+	CampaignServingStatusEnum_PENDING CampaignServingStatusEnum_CampaignServingStatus = 5
+	// Suspended.
+	CampaignServingStatusEnum_SUSPENDED CampaignServingStatusEnum_CampaignServingStatus = 6
+)
+
+var CampaignServingStatusEnum_CampaignServingStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "SERVING",
+	3: "NONE",
+	4: "ENDED",
+	5: "PENDING",
+	6: "SUSPENDED",
+}
+
+var CampaignServingStatusEnum_CampaignServingStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"SERVING":     2,
+	"NONE":        3,
+	"ENDED":       4,
+	"PENDING":     5,
+	"SUSPENDED":   6,
+}
+
+func (x CampaignServingStatusEnum_CampaignServingStatus) String() string {
+	return proto.EnumName(CampaignServingStatusEnum_CampaignServingStatus_name, int32(x))
+}
+
+func (CampaignServingStatusEnum_CampaignServingStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e1dbcad2fedf0161, []int{0, 0}
+}
+
+// Message describing Campaign serving statuses.
+type CampaignServingStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignServingStatusEnum) Reset()         { *m = CampaignServingStatusEnum{} }
+func (m *CampaignServingStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignServingStatusEnum) ProtoMessage()    {}
+func (*CampaignServingStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e1dbcad2fedf0161, []int{0}
+}
+
+func (m *CampaignServingStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignServingStatusEnum.Unmarshal(m, b)
+}
+func (m *CampaignServingStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignServingStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignServingStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignServingStatusEnum.Merge(m, src)
+}
+func (m *CampaignServingStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignServingStatusEnum.Size(m)
+}
+func (m *CampaignServingStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignServingStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignServingStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignServingStatusEnum_CampaignServingStatus", CampaignServingStatusEnum_CampaignServingStatus_name, CampaignServingStatusEnum_CampaignServingStatus_value)
+	proto.RegisterType((*CampaignServingStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignServingStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/campaign_serving_status.proto", fileDescriptor_e1dbcad2fedf0161)
+}
+
+var fileDescriptor_e1dbcad2fedf0161 = []byte{
+	// 333 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xdd, 0x6a, 0xfa, 0x30,
+	0x1c, 0xfd, 0xb7, 0x7e, 0xfc, 0x67, 0x64, 0xac, 0x14, 0x76, 0x31, 0x99, 0x17, 0xfa, 0x00, 0xe9,
+	0x45, 0xef, 0xe2, 0x55, 0xb5, 0x99, 0xc8, 0x20, 0x96, 0x05, 0x3b, 0x18, 0x05, 0xc9, 0x6c, 0x09,
+	0x05, 0x9b, 0x14, 0x53, 0x7d, 0x8e, 0x3d, 0xc3, 0x2e, 0xf7, 0x28, 0x7b, 0x94, 0xdd, 0xec, 0x15,
+	0x46, 0x12, 0xf5, 0xca, 0xed, 0xa6, 0x9c, 0xe6, 0x7c, 0xf0, 0x3b, 0x07, 0x4c, 0xb8, 0x94, 0x7c,
+	0x5b, 0x04, 0x2c, 0x57, 0x81, 0x85, 0x1a, 0x1d, 0xc2, 0xa0, 0x10, 0xfb, 0x4a, 0x05, 0x1b, 0x56,
+	0xd5, 0xac, 0xe4, 0x62, 0xad, 0x8a, 0xdd, 0xa1, 0x14, 0x7c, 0xad, 0x1a, 0xd6, 0xec, 0x15, 0xac,
+	0x77, 0xb2, 0x91, 0xfe, 0xd0, 0x3a, 0x20, 0xcb, 0x15, 0x3c, 0x9b, 0xe1, 0x21, 0x84, 0xc6, 0x3c,
+	0xb8, 0x3f, 0x65, 0xd7, 0x65, 0xc0, 0x84, 0x90, 0x0d, 0x6b, 0x4a, 0x29, 0x8e, 0xe6, 0xf1, 0x9b,
+	0x03, 0xee, 0x66, 0xc7, 0x78, 0x6a, 0xd3, 0xa9, 0x09, 0xc7, 0x62, 0x5f, 0x8d, 0x15, 0xb8, 0xbd,
+	0x48, 0xfa, 0x37, 0xa0, 0xbf, 0x22, 0x34, 0xc1, 0xb3, 0xc5, 0xc3, 0x02, 0xc7, 0xde, 0x3f, 0xbf,
+	0x0f, 0xfe, 0xaf, 0xc8, 0x23, 0x59, 0x3e, 0x13, 0xcf, 0xd1, 0x3f, 0x14, 0x3f, 0xa5, 0x0b, 0x32,
+	0xf7, 0x5c, 0xff, 0x0a, 0xb4, 0xc9, 0x92, 0x60, 0xaf, 0xe5, 0xf7, 0x40, 0x07, 0x93, 0x18, 0xc7,
+	0x5e, 0x5b, 0x2b, 0x12, 0x4c, 0x62, 0xad, 0xe8, 0xf8, 0xd7, 0xa0, 0x47, 0x57, 0x34, 0xb1, 0x5c,
+	0x77, 0xfa, 0xed, 0x80, 0xd1, 0x46, 0x56, 0xf0, 0xcf, 0x5a, 0xd3, 0xc1, 0xc5, 0xc3, 0x12, 0x5d,
+	0x2a, 0x71, 0x5e, 0xa6, 0x47, 0x33, 0x97, 0x5b, 0x26, 0x38, 0x94, 0x3b, 0x1e, 0xf0, 0x42, 0x98,
+	0xca, 0xa7, 0x81, 0xeb, 0x52, 0xfd, 0xb2, 0xf7, 0xc4, 0x7c, 0xdf, 0xdd, 0xd6, 0x3c, 0x8a, 0x3e,
+	0xdc, 0xe1, 0xdc, 0x46, 0x45, 0xb9, 0x82, 0x16, 0x6a, 0x94, 0x86, 0x50, 0x2f, 0xa4, 0x3e, 0x4f,
+	0x7c, 0x16, 0xe5, 0x2a, 0x3b, 0xf3, 0x59, 0x1a, 0x66, 0x86, 0xff, 0x72, 0x47, 0xf6, 0x11, 0xa1,
+	0x28, 0x57, 0x08, 0x9d, 0x15, 0x08, 0xa5, 0x21, 0x42, 0x46, 0xf3, 0xda, 0x35, 0x87, 0x85, 0x3f,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0x81, 0x84, 0x76, 0x33, 0x07, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/campaign_shared_set_status.pb.go b/googleapis/ads/googleads/v3/enums/campaign_shared_set_status.pb.go
new file mode 100644
index 0000000..854954d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/campaign_shared_set_status.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/campaign_shared_set_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum listing the possible campaign shared set statuses.
+type CampaignSharedSetStatusEnum_CampaignSharedSetStatus int32
+
+const (
+	// Not specified.
+	CampaignSharedSetStatusEnum_UNSPECIFIED CampaignSharedSetStatusEnum_CampaignSharedSetStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	CampaignSharedSetStatusEnum_UNKNOWN CampaignSharedSetStatusEnum_CampaignSharedSetStatus = 1
+	// The campaign shared set is enabled.
+	CampaignSharedSetStatusEnum_ENABLED CampaignSharedSetStatusEnum_CampaignSharedSetStatus = 2
+	// The campaign shared set is removed and can no longer be used.
+	CampaignSharedSetStatusEnum_REMOVED CampaignSharedSetStatusEnum_CampaignSharedSetStatus = 3
+)
+
+var CampaignSharedSetStatusEnum_CampaignSharedSetStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var CampaignSharedSetStatusEnum_CampaignSharedSetStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x CampaignSharedSetStatusEnum_CampaignSharedSetStatus) String() string {
+	return proto.EnumName(CampaignSharedSetStatusEnum_CampaignSharedSetStatus_name, int32(x))
+}
+
+func (CampaignSharedSetStatusEnum_CampaignSharedSetStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0c4d96f92ce0bbad, []int{0, 0}
+}
+
+// Container for enum describing types of campaign shared set statuses.
+type CampaignSharedSetStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignSharedSetStatusEnum) Reset()         { *m = CampaignSharedSetStatusEnum{} }
+func (m *CampaignSharedSetStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignSharedSetStatusEnum) ProtoMessage()    {}
+func (*CampaignSharedSetStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0c4d96f92ce0bbad, []int{0}
+}
+
+func (m *CampaignSharedSetStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignSharedSetStatusEnum.Unmarshal(m, b)
+}
+func (m *CampaignSharedSetStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignSharedSetStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignSharedSetStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignSharedSetStatusEnum.Merge(m, src)
+}
+func (m *CampaignSharedSetStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignSharedSetStatusEnum.Size(m)
+}
+func (m *CampaignSharedSetStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignSharedSetStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignSharedSetStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignSharedSetStatusEnum_CampaignSharedSetStatus", CampaignSharedSetStatusEnum_CampaignSharedSetStatus_name, CampaignSharedSetStatusEnum_CampaignSharedSetStatus_value)
+	proto.RegisterType((*CampaignSharedSetStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignSharedSetStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/campaign_shared_set_status.proto", fileDescriptor_0c4d96f92ce0bbad)
+}
+
+var fileDescriptor_0c4d96f92ce0bbad = []byte{
+	// 311 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4b, 0xc3, 0x30,
+	0x18, 0x75, 0x1d, 0x28, 0x74, 0x07, 0xcb, 0x2e, 0x82, 0x6e, 0x87, 0xed, 0x07, 0xa4, 0x87, 0xdc,
+	0x22, 0x08, 0xe9, 0x16, 0xc7, 0x50, 0xbb, 0x69, 0x59, 0x05, 0x29, 0x8c, 0xb8, 0x84, 0x58, 0x58,
+	0x93, 0xb2, 0x2f, 0xdb, 0x0f, 0xf2, 0xe8, 0x4f, 0xf1, 0xa7, 0x78, 0xf3, 0x1f, 0x48, 0xd2, 0x6d,
+	0xb7, 0x79, 0x29, 0xef, 0xeb, 0xfb, 0xde, 0xfb, 0x5e, 0x5e, 0x78, 0xa7, 0x8c, 0x51, 0x6b, 0x19,
+	0x73, 0x01, 0x71, 0x03, 0x1d, 0xda, 0xe1, 0x58, 0xea, 0x6d, 0x05, 0xf1, 0x8a, 0x57, 0x35, 0x2f,
+	0x95, 0x5e, 0xc2, 0x07, 0xdf, 0x48, 0xb1, 0x04, 0x69, 0x97, 0x60, 0xb9, 0xdd, 0x02, 0xaa, 0x37,
+	0xc6, 0x9a, 0x6e, 0xbf, 0x11, 0x21, 0x2e, 0x00, 0x1d, 0xf5, 0x68, 0x87, 0x91, 0xd7, 0x5f, 0xf7,
+	0x0e, 0xf6, 0x75, 0x19, 0x73, 0xad, 0x8d, 0xe5, 0xb6, 0x34, 0x7a, 0x2f, 0x1e, 0xd6, 0xe1, 0xcd,
+	0x68, 0x7f, 0x20, 0xf3, 0xfe, 0x99, 0xb4, 0x99, 0x77, 0x67, 0x7a, 0x5b, 0x0d, 0x9f, 0xc3, 0xab,
+	0x13, 0x74, 0xf7, 0x32, 0xec, 0x2c, 0xd2, 0x6c, 0xce, 0x46, 0xd3, 0xfb, 0x29, 0x1b, 0x47, 0x67,
+	0xdd, 0x4e, 0x78, 0xb1, 0x48, 0x1f, 0xd2, 0xd9, 0x6b, 0x1a, 0xb5, 0xdc, 0xc0, 0x52, 0x9a, 0x3c,
+	0xb2, 0x71, 0x14, 0xb8, 0xe1, 0x85, 0x3d, 0xcd, 0x72, 0x36, 0x8e, 0xda, 0xc9, 0x6f, 0x2b, 0x1c,
+	0xac, 0x4c, 0x85, 0xfe, 0x4d, 0x9d, 0xf4, 0x4e, 0x9c, 0x9d, 0xbb, 0xd4, 0xf3, 0xd6, 0x5b, 0xb2,
+	0x97, 0x2b, 0xb3, 0xe6, 0x5a, 0x21, 0xb3, 0x51, 0xb1, 0x92, 0xda, 0xbf, 0xe9, 0x50, 0x62, 0x5d,
+	0xc2, 0x89, 0x4e, 0x6f, 0xfd, 0xf7, 0x33, 0x68, 0x4f, 0x28, 0xfd, 0x0a, 0xfa, 0x93, 0xc6, 0x8a,
+	0x0a, 0x40, 0x0d, 0x74, 0x28, 0xc7, 0xc8, 0x35, 0x00, 0xdf, 0x07, 0xbe, 0xa0, 0x02, 0x8a, 0x23,
+	0x5f, 0xe4, 0xb8, 0xf0, 0xfc, 0x4f, 0x30, 0x68, 0x7e, 0x12, 0x42, 0x05, 0x10, 0x72, 0xdc, 0x20,
+	0x24, 0xc7, 0x84, 0xf8, 0x9d, 0xf7, 0x73, 0x1f, 0x0c, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x68,
+	0xd2, 0x25, 0x09, 0xeb, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/campaign_status.pb.go b/googleapis/ads/googleads/v3/enums/campaign_status.pb.go
new file mode 100644
index 0000000..a7e8cff
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/campaign_status.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/campaign_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a campaign.
+type CampaignStatusEnum_CampaignStatus int32
+
+const (
+	// Not specified.
+	CampaignStatusEnum_UNSPECIFIED CampaignStatusEnum_CampaignStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	CampaignStatusEnum_UNKNOWN CampaignStatusEnum_CampaignStatus = 1
+	// Campaign is currently serving ads depending on budget information.
+	CampaignStatusEnum_ENABLED CampaignStatusEnum_CampaignStatus = 2
+	// Campaign has been paused by the user.
+	CampaignStatusEnum_PAUSED CampaignStatusEnum_CampaignStatus = 3
+	// Campaign has been removed.
+	CampaignStatusEnum_REMOVED CampaignStatusEnum_CampaignStatus = 4
+)
+
+var CampaignStatusEnum_CampaignStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "PAUSED",
+	4: "REMOVED",
+}
+
+var CampaignStatusEnum_CampaignStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"PAUSED":      3,
+	"REMOVED":     4,
+}
+
+func (x CampaignStatusEnum_CampaignStatus) String() string {
+	return proto.EnumName(CampaignStatusEnum_CampaignStatus_name, int32(x))
+}
+
+func (CampaignStatusEnum_CampaignStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d65eafe20466bcae, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of a campaign.
+type CampaignStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignStatusEnum) Reset()         { *m = CampaignStatusEnum{} }
+func (m *CampaignStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignStatusEnum) ProtoMessage()    {}
+func (*CampaignStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d65eafe20466bcae, []int{0}
+}
+
+func (m *CampaignStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignStatusEnum.Unmarshal(m, b)
+}
+func (m *CampaignStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignStatusEnum.Merge(m, src)
+}
+func (m *CampaignStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignStatusEnum.Size(m)
+}
+func (m *CampaignStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignStatusEnum_CampaignStatus", CampaignStatusEnum_CampaignStatus_name, CampaignStatusEnum_CampaignStatus_value)
+	proto.RegisterType((*CampaignStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/campaign_status.proto", fileDescriptor_d65eafe20466bcae)
+}
+
+var fileDescriptor_d65eafe20466bcae = []byte{
+	// 305 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x18, 0x77, 0x9d, 0x4c, 0xc8, 0x40, 0x4b, 0xbd, 0x89, 0x3b, 0x6c, 0x0f, 0x90, 0x1c, 0x72, 0x8b,
+	0xa7, 0x74, 0x8d, 0x63, 0xa8, 0x5d, 0x71, 0xae, 0x82, 0x14, 0x24, 0xae, 0x25, 0x54, 0xd6, 0xa4,
+	0x2c, 0xed, 0x1e, 0xc8, 0xa3, 0x8f, 0xe2, 0x93, 0x88, 0x4f, 0x21, 0x49, 0xff, 0xc0, 0x0e, 0x7a,
+	0x29, 0xbf, 0x7e, 0xbf, 0x3f, 0xf9, 0x7d, 0x1f, 0xc0, 0x42, 0x29, 0xb1, 0xcb, 0x10, 0x4f, 0x35,
+	0x6a, 0xa0, 0x41, 0x07, 0x8c, 0x32, 0x59, 0x17, 0x1a, 0x6d, 0x79, 0x51, 0xf2, 0x5c, 0xc8, 0x57,
+	0x5d, 0xf1, 0xaa, 0xd6, 0xb0, 0xdc, 0xab, 0x4a, 0x79, 0x93, 0x46, 0x09, 0x79, 0xaa, 0x61, 0x6f,
+	0x82, 0x07, 0x0c, 0xad, 0xe9, 0xea, 0xba, 0xcb, 0x2c, 0x73, 0xc4, 0xa5, 0x54, 0x15, 0xaf, 0x72,
+	0x25, 0x5b, 0xf3, 0xec, 0x1d, 0x78, 0xf3, 0x36, 0x75, 0x6d, 0x43, 0x99, 0xac, 0x8b, 0xd9, 0x13,
+	0x38, 0x3f, 0x9e, 0x7a, 0x17, 0x60, 0xbc, 0x09, 0xd7, 0x11, 0x9b, 0x2f, 0x6f, 0x97, 0x2c, 0x70,
+	0x4f, 0xbc, 0x31, 0x38, 0xdb, 0x84, 0x77, 0xe1, 0xea, 0x39, 0x74, 0x07, 0xe6, 0x87, 0x85, 0xd4,
+	0xbf, 0x67, 0x81, 0xeb, 0x78, 0x00, 0x8c, 0x22, 0xba, 0x59, 0xb3, 0xc0, 0x1d, 0x1a, 0xe2, 0x91,
+	0x3d, 0xac, 0x62, 0x16, 0xb8, 0xa7, 0xfe, 0xf7, 0x00, 0x4c, 0xb7, 0xaa, 0x80, 0xff, 0xf6, 0xf5,
+	0x2f, 0x8f, 0x5f, 0x8e, 0x4c, 0xcd, 0x68, 0xf0, 0xe2, 0xb7, 0x2e, 0xa1, 0x76, 0x5c, 0x0a, 0xa8,
+	0xf6, 0x02, 0x89, 0x4c, 0xda, 0x25, 0xba, 0x53, 0x95, 0xb9, 0xfe, 0xe3, 0x72, 0x37, 0xf6, 0xfb,
+	0xe1, 0x0c, 0x17, 0x94, 0x7e, 0x3a, 0x93, 0x45, 0x13, 0x45, 0x53, 0x0d, 0x1b, 0x68, 0x50, 0x8c,
+	0xa1, 0xd9, 0x5d, 0x7f, 0x75, 0x7c, 0x42, 0x53, 0x9d, 0xf4, 0x7c, 0x12, 0xe3, 0xc4, 0xf2, 0x3f,
+	0xce, 0xb4, 0x19, 0x12, 0x42, 0x53, 0x4d, 0x48, 0xaf, 0x20, 0x24, 0xc6, 0x84, 0x58, 0xcd, 0xdb,
+	0xc8, 0x16, 0xc3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x40, 0xc4, 0x78, 0x9f, 0xd1, 0x01, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/change_status_operation.pb.go b/googleapis/ads/googleads/v3/enums/change_status_operation.pb.go
new file mode 100644
index 0000000..c7f2268
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/change_status_operation.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/change_status_operation.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Status of the changed resource
+type ChangeStatusOperationEnum_ChangeStatusOperation int32
+
+const (
+	// No value has been specified.
+	ChangeStatusOperationEnum_UNSPECIFIED ChangeStatusOperationEnum_ChangeStatusOperation = 0
+	// Used for return value only. Represents an unclassified resource unknown
+	// in this version.
+	ChangeStatusOperationEnum_UNKNOWN ChangeStatusOperationEnum_ChangeStatusOperation = 1
+	// The resource was created.
+	ChangeStatusOperationEnum_ADDED ChangeStatusOperationEnum_ChangeStatusOperation = 2
+	// The resource was modified.
+	ChangeStatusOperationEnum_CHANGED ChangeStatusOperationEnum_ChangeStatusOperation = 3
+	// The resource was removed.
+	ChangeStatusOperationEnum_REMOVED ChangeStatusOperationEnum_ChangeStatusOperation = 4
+)
+
+var ChangeStatusOperationEnum_ChangeStatusOperation_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ADDED",
+	3: "CHANGED",
+	4: "REMOVED",
+}
+
+var ChangeStatusOperationEnum_ChangeStatusOperation_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ADDED":       2,
+	"CHANGED":     3,
+	"REMOVED":     4,
+}
+
+func (x ChangeStatusOperationEnum_ChangeStatusOperation) String() string {
+	return proto.EnumName(ChangeStatusOperationEnum_ChangeStatusOperation_name, int32(x))
+}
+
+func (ChangeStatusOperationEnum_ChangeStatusOperation) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_52f8f4521d0e81d3, []int{0, 0}
+}
+
+// Container for enum describing operations for the ChangeStatus resource.
+type ChangeStatusOperationEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ChangeStatusOperationEnum) Reset()         { *m = ChangeStatusOperationEnum{} }
+func (m *ChangeStatusOperationEnum) String() string { return proto.CompactTextString(m) }
+func (*ChangeStatusOperationEnum) ProtoMessage()    {}
+func (*ChangeStatusOperationEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_52f8f4521d0e81d3, []int{0}
+}
+
+func (m *ChangeStatusOperationEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ChangeStatusOperationEnum.Unmarshal(m, b)
+}
+func (m *ChangeStatusOperationEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ChangeStatusOperationEnum.Marshal(b, m, deterministic)
+}
+func (m *ChangeStatusOperationEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ChangeStatusOperationEnum.Merge(m, src)
+}
+func (m *ChangeStatusOperationEnum) XXX_Size() int {
+	return xxx_messageInfo_ChangeStatusOperationEnum.Size(m)
+}
+func (m *ChangeStatusOperationEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ChangeStatusOperationEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ChangeStatusOperationEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ChangeStatusOperationEnum_ChangeStatusOperation", ChangeStatusOperationEnum_ChangeStatusOperation_name, ChangeStatusOperationEnum_ChangeStatusOperation_value)
+	proto.RegisterType((*ChangeStatusOperationEnum)(nil), "google.ads.googleads.v3.enums.ChangeStatusOperationEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/change_status_operation.proto", fileDescriptor_52f8f4521d0e81d3)
+}
+
+var fileDescriptor_52f8f4521d0e81d3 = []byte{
+	// 316 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4e, 0x02, 0x31,
+	0x14, 0xc6, 0x65, 0xf0, 0x4f, 0x2c, 0x0b, 0x27, 0x93, 0xb8, 0x90, 0xc8, 0x02, 0x0e, 0xd0, 0x2e,
+	0xba, 0x2b, 0xab, 0x42, 0x2b, 0x12, 0xe3, 0x40, 0x24, 0x8c, 0x09, 0x99, 0x84, 0x54, 0x66, 0x52,
+	0x49, 0xa0, 0x9d, 0xd0, 0x01, 0xef, 0xe3, 0xd2, 0xa3, 0x78, 0x14, 0x37, 0x5e, 0xc1, 0xb4, 0x75,
+	0x66, 0x85, 0x6e, 0x9a, 0xaf, 0xef, 0x7b, 0xbf, 0xaf, 0xaf, 0x0f, 0xf4, 0xa5, 0xd6, 0x72, 0x93,
+	0x23, 0x91, 0x19, 0xe4, 0xa5, 0x55, 0x07, 0x8c, 0x72, 0xb5, 0xdf, 0x1a, 0xb4, 0x7a, 0x15, 0x4a,
+	0xe6, 0x4b, 0x53, 0x8a, 0x72, 0x6f, 0x96, 0xba, 0xc8, 0x77, 0xa2, 0x5c, 0x6b, 0x05, 0x8b, 0x9d,
+	0x2e, 0x75, 0xd4, 0xf1, 0x04, 0x14, 0x99, 0x81, 0x35, 0x0c, 0x0f, 0x18, 0x3a, 0xb8, 0x7d, 0x5b,
+	0x65, 0x17, 0x6b, 0x24, 0x94, 0xd2, 0xa5, 0x63, 0x8d, 0x87, 0x7b, 0x6f, 0xe0, 0x66, 0xe8, 0xd2,
+	0x67, 0x2e, 0x7c, 0x52, 0x65, 0x73, 0xb5, 0xdf, 0xf6, 0x16, 0xe0, 0xfa, 0xa8, 0x19, 0x5d, 0x81,
+	0xd6, 0x3c, 0x9e, 0x4d, 0xf9, 0x70, 0x7c, 0x37, 0xe6, 0x2c, 0x3c, 0x89, 0x5a, 0xe0, 0x62, 0x1e,
+	0x3f, 0xc4, 0x93, 0xe7, 0x38, 0x6c, 0x44, 0x97, 0xe0, 0x8c, 0x32, 0xc6, 0x59, 0x18, 0xd8, 0xfa,
+	0xf0, 0x9e, 0xc6, 0x23, 0xce, 0xc2, 0xa6, 0xbd, 0x3c, 0xf1, 0xc7, 0x49, 0xc2, 0x59, 0x78, 0x3a,
+	0xf8, 0x6e, 0x80, 0xee, 0x4a, 0x6f, 0xe1, 0xbf, 0xc3, 0x0f, 0xda, 0x47, 0xdf, 0x9f, 0xda, 0xd1,
+	0xa7, 0x8d, 0xc5, 0xe0, 0x17, 0x96, 0x7a, 0x23, 0x94, 0x84, 0x7a, 0x27, 0x91, 0xcc, 0x95, 0xfb,
+	0x58, 0xb5, 0xc6, 0x62, 0x6d, 0xfe, 0xd8, 0x6a, 0xdf, 0x9d, 0xef, 0x41, 0x73, 0x44, 0xe9, 0x47,
+	0xd0, 0x19, 0xf9, 0x28, 0x9a, 0x19, 0xe8, 0xa5, 0x55, 0x09, 0x86, 0x76, 0x11, 0xe6, 0xb3, 0xf2,
+	0x53, 0x9a, 0x99, 0xb4, 0xf6, 0xd3, 0x04, 0xa7, 0xce, 0xff, 0x0a, 0xba, 0xbe, 0x48, 0x08, 0xcd,
+	0x0c, 0x21, 0x75, 0x07, 0x21, 0x09, 0x26, 0xc4, 0xf5, 0xbc, 0x9c, 0xbb, 0xc1, 0xf0, 0x4f, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0x09, 0x2a, 0x56, 0xb5, 0xed, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/change_status_resource_type.pb.go b/googleapis/ads/googleads/v3/enums/change_status_resource_type.pb.go
new file mode 100644
index 0000000..ed4f9d0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/change_status_resource_type.pb.go
@@ -0,0 +1,164 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/change_status_resource_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum listing the resource types support by the ChangeStatus resource.
+type ChangeStatusResourceTypeEnum_ChangeStatusResourceType int32
+
+const (
+	// No value has been specified.
+	ChangeStatusResourceTypeEnum_UNSPECIFIED ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 0
+	// Used for return value only. Represents an unclassified resource unknown
+	// in this version.
+	ChangeStatusResourceTypeEnum_UNKNOWN ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 1
+	// An AdGroup resource change.
+	ChangeStatusResourceTypeEnum_AD_GROUP ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 3
+	// An AdGroupAd resource change.
+	ChangeStatusResourceTypeEnum_AD_GROUP_AD ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 4
+	// An AdGroupCriterion resource change.
+	ChangeStatusResourceTypeEnum_AD_GROUP_CRITERION ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 5
+	// A Campaign resource change.
+	ChangeStatusResourceTypeEnum_CAMPAIGN ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 6
+	// A CampaignCriterion resource change.
+	ChangeStatusResourceTypeEnum_CAMPAIGN_CRITERION ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 7
+	// A Feed resource change.
+	ChangeStatusResourceTypeEnum_FEED ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 9
+	// A FeedItem resource change.
+	ChangeStatusResourceTypeEnum_FEED_ITEM ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 10
+	// An AdGroupFeed resource change.
+	ChangeStatusResourceTypeEnum_AD_GROUP_FEED ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 11
+	// A CampaignFeed resource change.
+	ChangeStatusResourceTypeEnum_CAMPAIGN_FEED ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 12
+	// An AdGroupBidModifier resource change.
+	ChangeStatusResourceTypeEnum_AD_GROUP_BID_MODIFIER ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 13
+)
+
+var ChangeStatusResourceTypeEnum_ChangeStatusResourceType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	3:  "AD_GROUP",
+	4:  "AD_GROUP_AD",
+	5:  "AD_GROUP_CRITERION",
+	6:  "CAMPAIGN",
+	7:  "CAMPAIGN_CRITERION",
+	9:  "FEED",
+	10: "FEED_ITEM",
+	11: "AD_GROUP_FEED",
+	12: "CAMPAIGN_FEED",
+	13: "AD_GROUP_BID_MODIFIER",
+}
+
+var ChangeStatusResourceTypeEnum_ChangeStatusResourceType_value = map[string]int32{
+	"UNSPECIFIED":           0,
+	"UNKNOWN":               1,
+	"AD_GROUP":              3,
+	"AD_GROUP_AD":           4,
+	"AD_GROUP_CRITERION":    5,
+	"CAMPAIGN":              6,
+	"CAMPAIGN_CRITERION":    7,
+	"FEED":                  9,
+	"FEED_ITEM":             10,
+	"AD_GROUP_FEED":         11,
+	"CAMPAIGN_FEED":         12,
+	"AD_GROUP_BID_MODIFIER": 13,
+}
+
+func (x ChangeStatusResourceTypeEnum_ChangeStatusResourceType) String() string {
+	return proto.EnumName(ChangeStatusResourceTypeEnum_ChangeStatusResourceType_name, int32(x))
+}
+
+func (ChangeStatusResourceTypeEnum_ChangeStatusResourceType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ead06545f0260510, []int{0, 0}
+}
+
+// Container for enum describing supported resource types for the ChangeStatus
+// resource.
+type ChangeStatusResourceTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ChangeStatusResourceTypeEnum) Reset()         { *m = ChangeStatusResourceTypeEnum{} }
+func (m *ChangeStatusResourceTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ChangeStatusResourceTypeEnum) ProtoMessage()    {}
+func (*ChangeStatusResourceTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ead06545f0260510, []int{0}
+}
+
+func (m *ChangeStatusResourceTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ChangeStatusResourceTypeEnum.Unmarshal(m, b)
+}
+func (m *ChangeStatusResourceTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ChangeStatusResourceTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ChangeStatusResourceTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ChangeStatusResourceTypeEnum.Merge(m, src)
+}
+func (m *ChangeStatusResourceTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ChangeStatusResourceTypeEnum.Size(m)
+}
+func (m *ChangeStatusResourceTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ChangeStatusResourceTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ChangeStatusResourceTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ChangeStatusResourceTypeEnum_ChangeStatusResourceType", ChangeStatusResourceTypeEnum_ChangeStatusResourceType_name, ChangeStatusResourceTypeEnum_ChangeStatusResourceType_value)
+	proto.RegisterType((*ChangeStatusResourceTypeEnum)(nil), "google.ads.googleads.v3.enums.ChangeStatusResourceTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/change_status_resource_type.proto", fileDescriptor_ead06545f0260510)
+}
+
+var fileDescriptor_ead06545f0260510 = []byte{
+	// 406 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xcd, 0x8a, 0xd4, 0x40,
+	0x10, 0xc7, 0x4d, 0x76, 0xdd, 0x8f, 0x9e, 0x1d, 0x6c, 0x1b, 0x14, 0x95, 0x9d, 0xc3, 0xee, 0x03,
+	0x74, 0x0e, 0xb9, 0xb5, 0x07, 0xe9, 0x7c, 0x6c, 0x08, 0x32, 0x49, 0xc8, 0x7c, 0x08, 0x12, 0x08,
+	0x71, 0xd2, 0xc4, 0x81, 0x99, 0xee, 0x90, 0x4e, 0x06, 0xe6, 0x2d, 0x7c, 0x06, 0x8f, 0x3e, 0x8a,
+	0x8f, 0xe2, 0x45, 0xf0, 0x09, 0xa4, 0x3b, 0x93, 0xe0, 0x65, 0xbc, 0x84, 0x7f, 0x55, 0xfd, 0xea,
+	0x5f, 0xe9, 0x2a, 0xf0, 0xa1, 0x12, 0xa2, 0xda, 0x31, 0xab, 0x28, 0xa5, 0xd5, 0x4b, 0xa5, 0x0e,
+	0xb6, 0xc5, 0x78, 0xb7, 0x97, 0xd6, 0xe6, 0x6b, 0xc1, 0x2b, 0x96, 0xcb, 0xb6, 0x68, 0x3b, 0x99,
+	0x37, 0x4c, 0x8a, 0xae, 0xd9, 0xb0, 0xbc, 0x3d, 0xd6, 0x0c, 0xd7, 0x8d, 0x68, 0x05, 0x9a, 0xf5,
+	0x5d, 0xb8, 0x28, 0x25, 0x1e, 0x0d, 0xf0, 0xc1, 0xc6, 0xda, 0xe0, 0xdd, 0xfd, 0xe0, 0x5f, 0x6f,
+	0xad, 0x82, 0x73, 0xd1, 0x16, 0xed, 0x56, 0x70, 0xd9, 0x37, 0x3f, 0x7e, 0x33, 0xc1, 0xbd, 0xab,
+	0x47, 0x2c, 0xf4, 0x84, 0xf4, 0x34, 0x60, 0x79, 0xac, 0x99, 0xcf, 0xbb, 0xfd, 0xe3, 0x6f, 0x03,
+	0xbc, 0x39, 0x07, 0xa0, 0x17, 0x60, 0xb2, 0x8a, 0x16, 0x89, 0xef, 0x86, 0x4f, 0xa1, 0xef, 0xc1,
+	0x67, 0x68, 0x02, 0xae, 0x57, 0xd1, 0xc7, 0x28, 0xfe, 0x14, 0x41, 0x03, 0xdd, 0x81, 0x1b, 0xea,
+	0xe5, 0x41, 0x1a, 0xaf, 0x12, 0x78, 0xa1, 0xd8, 0x21, 0xca, 0xa9, 0x07, 0x2f, 0xd1, 0x6b, 0x80,
+	0xc6, 0x84, 0x9b, 0x86, 0x4b, 0x3f, 0x0d, 0xe3, 0x08, 0x3e, 0x57, 0x6d, 0x2e, 0x9d, 0x27, 0x34,
+	0x0c, 0x22, 0x78, 0xa5, 0xa8, 0x21, 0xfa, 0x87, 0xba, 0x46, 0x37, 0xe0, 0xf2, 0xc9, 0xf7, 0x3d,
+	0x78, 0x8b, 0xa6, 0xe0, 0x56, 0xa9, 0x3c, 0x5c, 0xfa, 0x73, 0x08, 0xd0, 0x4b, 0x30, 0x1d, 0x6d,
+	0x35, 0x31, 0x51, 0xa9, 0xd1, 0x43, 0xa7, 0xee, 0xd0, 0x5b, 0xf0, 0x6a, 0xa4, 0x9c, 0xd0, 0xcb,
+	0xe7, 0xb1, 0xa7, 0xde, 0x90, 0xc2, 0xa9, 0xf3, 0xc7, 0x00, 0x0f, 0x1b, 0xb1, 0xc7, 0xff, 0x5d,
+	0xab, 0x33, 0x3b, 0xb7, 0x94, 0x44, 0xed, 0x35, 0x31, 0x3e, 0x3b, 0xa7, 0xfe, 0x4a, 0xec, 0x0a,
+	0x5e, 0x61, 0xd1, 0x54, 0x56, 0xc5, 0xb8, 0xde, 0xfa, 0x70, 0xe7, 0x7a, 0x2b, 0xcf, 0x9c, 0xfd,
+	0xbd, 0xfe, 0x7e, 0x37, 0x2f, 0x02, 0x4a, 0x7f, 0x98, 0xb3, 0xa0, 0xb7, 0xa2, 0xa5, 0xc4, 0xbd,
+	0x54, 0x6a, 0x6d, 0x63, 0x75, 0x21, 0xf9, 0x73, 0xa8, 0x67, 0xb4, 0x94, 0xd9, 0x58, 0xcf, 0xd6,
+	0x76, 0xa6, 0xeb, 0xbf, 0xcc, 0x87, 0x3e, 0x49, 0x08, 0x2d, 0x25, 0x21, 0x23, 0x41, 0xc8, 0xda,
+	0x26, 0x44, 0x33, 0x5f, 0xae, 0xf4, 0x8f, 0xd9, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x24, 0x36,
+	0x02, 0xfd, 0x8e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/click_type.pb.go b/googleapis/ads/googleads/v3/enums/click_type.pb.go
new file mode 100644
index 0000000..740d41e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/click_type.pb.go
@@ -0,0 +1,368 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/click_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates Google Ads click types.
+type ClickTypeEnum_ClickType int32
+
+const (
+	// Not specified.
+	ClickTypeEnum_UNSPECIFIED ClickTypeEnum_ClickType = 0
+	// The value is unknown in this version.
+	ClickTypeEnum_UNKNOWN ClickTypeEnum_ClickType = 1
+	// App engagement ad deep link.
+	ClickTypeEnum_APP_DEEPLINK ClickTypeEnum_ClickType = 2
+	// Breadcrumbs.
+	ClickTypeEnum_BREADCRUMBS ClickTypeEnum_ClickType = 3
+	// Broadband Plan.
+	ClickTypeEnum_BROADBAND_PLAN ClickTypeEnum_ClickType = 4
+	// Manually dialed phone calls.
+	ClickTypeEnum_CALL_TRACKING ClickTypeEnum_ClickType = 5
+	// Phone calls.
+	ClickTypeEnum_CALLS ClickTypeEnum_ClickType = 6
+	// Click on engagement ad.
+	ClickTypeEnum_CLICK_ON_ENGAGEMENT_AD ClickTypeEnum_ClickType = 7
+	// Driving direction.
+	ClickTypeEnum_GET_DIRECTIONS ClickTypeEnum_ClickType = 8
+	// Get location details.
+	ClickTypeEnum_LOCATION_EXPANSION ClickTypeEnum_ClickType = 9
+	// Call.
+	ClickTypeEnum_LOCATION_FORMAT_CALL ClickTypeEnum_ClickType = 10
+	// Directions.
+	ClickTypeEnum_LOCATION_FORMAT_DIRECTIONS ClickTypeEnum_ClickType = 11
+	// Image(s).
+	ClickTypeEnum_LOCATION_FORMAT_IMAGE ClickTypeEnum_ClickType = 12
+	// Go to landing page.
+	ClickTypeEnum_LOCATION_FORMAT_LANDING_PAGE ClickTypeEnum_ClickType = 13
+	// Map.
+	ClickTypeEnum_LOCATION_FORMAT_MAP ClickTypeEnum_ClickType = 14
+	// Go to store info.
+	ClickTypeEnum_LOCATION_FORMAT_STORE_INFO ClickTypeEnum_ClickType = 15
+	// Text.
+	ClickTypeEnum_LOCATION_FORMAT_TEXT ClickTypeEnum_ClickType = 16
+	// Mobile phone calls.
+	ClickTypeEnum_MOBILE_CALL_TRACKING ClickTypeEnum_ClickType = 17
+	// Print offer.
+	ClickTypeEnum_OFFER_PRINTS ClickTypeEnum_ClickType = 18
+	// Other.
+	ClickTypeEnum_OTHER ClickTypeEnum_ClickType = 19
+	// Product plusbox offer.
+	ClickTypeEnum_PRODUCT_EXTENSION_CLICKS ClickTypeEnum_ClickType = 20
+	// Shopping - Product - Online.
+	ClickTypeEnum_PRODUCT_LISTING_AD_CLICKS ClickTypeEnum_ClickType = 21
+	// Sitelink.
+	ClickTypeEnum_SITELINKS ClickTypeEnum_ClickType = 22
+	// Show nearby locations.
+	ClickTypeEnum_STORE_LOCATOR ClickTypeEnum_ClickType = 23
+	// Headline.
+	ClickTypeEnum_URL_CLICKS ClickTypeEnum_ClickType = 25
+	// App store.
+	ClickTypeEnum_VIDEO_APP_STORE_CLICKS ClickTypeEnum_ClickType = 26
+	// Call-to-Action overlay.
+	ClickTypeEnum_VIDEO_CALL_TO_ACTION_CLICKS ClickTypeEnum_ClickType = 27
+	// Cards.
+	ClickTypeEnum_VIDEO_CARD_ACTION_HEADLINE_CLICKS ClickTypeEnum_ClickType = 28
+	// End cap.
+	ClickTypeEnum_VIDEO_END_CAP_CLICKS ClickTypeEnum_ClickType = 29
+	// Website.
+	ClickTypeEnum_VIDEO_WEBSITE_CLICKS ClickTypeEnum_ClickType = 30
+	// Visual Sitelinks.
+	ClickTypeEnum_VISUAL_SITELINKS ClickTypeEnum_ClickType = 31
+	// Wireless Plan.
+	ClickTypeEnum_WIRELESS_PLAN ClickTypeEnum_ClickType = 32
+	// Shopping - Product - Local.
+	ClickTypeEnum_PRODUCT_LISTING_AD_LOCAL ClickTypeEnum_ClickType = 33
+	// Shopping - Product - MultiChannel Local.
+	ClickTypeEnum_PRODUCT_LISTING_AD_MULTICHANNEL_LOCAL ClickTypeEnum_ClickType = 34
+	// Shopping - Product - MultiChannel Online.
+	ClickTypeEnum_PRODUCT_LISTING_AD_MULTICHANNEL_ONLINE ClickTypeEnum_ClickType = 35
+	// Shopping - Product - Coupon.
+	ClickTypeEnum_PRODUCT_LISTING_ADS_COUPON ClickTypeEnum_ClickType = 36
+	// Shopping - Product - Sell on Google.
+	ClickTypeEnum_PRODUCT_LISTING_AD_TRANSACTABLE ClickTypeEnum_ClickType = 37
+	// Shopping - Product - App engagement ad deep link.
+	ClickTypeEnum_PRODUCT_AD_APP_DEEPLINK ClickTypeEnum_ClickType = 38
+	// Shopping - Showcase - Category.
+	ClickTypeEnum_SHOWCASE_AD_CATEGORY_LINK ClickTypeEnum_ClickType = 39
+	// Shopping - Showcase - Local storefront.
+	ClickTypeEnum_SHOWCASE_AD_LOCAL_STOREFRONT_LINK ClickTypeEnum_ClickType = 40
+	// Shopping - Showcase - Online product.
+	ClickTypeEnum_SHOWCASE_AD_ONLINE_PRODUCT_LINK ClickTypeEnum_ClickType = 42
+	// Shopping - Showcase - Local product.
+	ClickTypeEnum_SHOWCASE_AD_LOCAL_PRODUCT_LINK ClickTypeEnum_ClickType = 43
+	// Promotion Extension.
+	ClickTypeEnum_PROMOTION_EXTENSION ClickTypeEnum_ClickType = 44
+	// Ad Headline.
+	ClickTypeEnum_SWIPEABLE_GALLERY_AD_HEADLINE ClickTypeEnum_ClickType = 45
+	// Swipes.
+	ClickTypeEnum_SWIPEABLE_GALLERY_AD_SWIPES ClickTypeEnum_ClickType = 46
+	// See More.
+	ClickTypeEnum_SWIPEABLE_GALLERY_AD_SEE_MORE ClickTypeEnum_ClickType = 47
+	// Sitelink 1.
+	ClickTypeEnum_SWIPEABLE_GALLERY_AD_SITELINK_ONE ClickTypeEnum_ClickType = 48
+	// Sitelink 2.
+	ClickTypeEnum_SWIPEABLE_GALLERY_AD_SITELINK_TWO ClickTypeEnum_ClickType = 49
+	// Sitelink 3.
+	ClickTypeEnum_SWIPEABLE_GALLERY_AD_SITELINK_THREE ClickTypeEnum_ClickType = 50
+	// Sitelink 4.
+	ClickTypeEnum_SWIPEABLE_GALLERY_AD_SITELINK_FOUR ClickTypeEnum_ClickType = 51
+	// Sitelink 5.
+	ClickTypeEnum_SWIPEABLE_GALLERY_AD_SITELINK_FIVE ClickTypeEnum_ClickType = 52
+	// Hotel price.
+	ClickTypeEnum_HOTEL_PRICE ClickTypeEnum_ClickType = 53
+	// Price Extension.
+	ClickTypeEnum_PRICE_EXTENSION ClickTypeEnum_ClickType = 54
+	// Book on Google hotel room selection.
+	ClickTypeEnum_HOTEL_BOOK_ON_GOOGLE_ROOM_SELECTION ClickTypeEnum_ClickType = 55
+	// Shopping - Comparison Listing.
+	ClickTypeEnum_SHOPPING_COMPARISON_LISTING ClickTypeEnum_ClickType = 56
+)
+
+var ClickTypeEnum_ClickType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "APP_DEEPLINK",
+	3:  "BREADCRUMBS",
+	4:  "BROADBAND_PLAN",
+	5:  "CALL_TRACKING",
+	6:  "CALLS",
+	7:  "CLICK_ON_ENGAGEMENT_AD",
+	8:  "GET_DIRECTIONS",
+	9:  "LOCATION_EXPANSION",
+	10: "LOCATION_FORMAT_CALL",
+	11: "LOCATION_FORMAT_DIRECTIONS",
+	12: "LOCATION_FORMAT_IMAGE",
+	13: "LOCATION_FORMAT_LANDING_PAGE",
+	14: "LOCATION_FORMAT_MAP",
+	15: "LOCATION_FORMAT_STORE_INFO",
+	16: "LOCATION_FORMAT_TEXT",
+	17: "MOBILE_CALL_TRACKING",
+	18: "OFFER_PRINTS",
+	19: "OTHER",
+	20: "PRODUCT_EXTENSION_CLICKS",
+	21: "PRODUCT_LISTING_AD_CLICKS",
+	22: "SITELINKS",
+	23: "STORE_LOCATOR",
+	25: "URL_CLICKS",
+	26: "VIDEO_APP_STORE_CLICKS",
+	27: "VIDEO_CALL_TO_ACTION_CLICKS",
+	28: "VIDEO_CARD_ACTION_HEADLINE_CLICKS",
+	29: "VIDEO_END_CAP_CLICKS",
+	30: "VIDEO_WEBSITE_CLICKS",
+	31: "VISUAL_SITELINKS",
+	32: "WIRELESS_PLAN",
+	33: "PRODUCT_LISTING_AD_LOCAL",
+	34: "PRODUCT_LISTING_AD_MULTICHANNEL_LOCAL",
+	35: "PRODUCT_LISTING_AD_MULTICHANNEL_ONLINE",
+	36: "PRODUCT_LISTING_ADS_COUPON",
+	37: "PRODUCT_LISTING_AD_TRANSACTABLE",
+	38: "PRODUCT_AD_APP_DEEPLINK",
+	39: "SHOWCASE_AD_CATEGORY_LINK",
+	40: "SHOWCASE_AD_LOCAL_STOREFRONT_LINK",
+	42: "SHOWCASE_AD_ONLINE_PRODUCT_LINK",
+	43: "SHOWCASE_AD_LOCAL_PRODUCT_LINK",
+	44: "PROMOTION_EXTENSION",
+	45: "SWIPEABLE_GALLERY_AD_HEADLINE",
+	46: "SWIPEABLE_GALLERY_AD_SWIPES",
+	47: "SWIPEABLE_GALLERY_AD_SEE_MORE",
+	48: "SWIPEABLE_GALLERY_AD_SITELINK_ONE",
+	49: "SWIPEABLE_GALLERY_AD_SITELINK_TWO",
+	50: "SWIPEABLE_GALLERY_AD_SITELINK_THREE",
+	51: "SWIPEABLE_GALLERY_AD_SITELINK_FOUR",
+	52: "SWIPEABLE_GALLERY_AD_SITELINK_FIVE",
+	53: "HOTEL_PRICE",
+	54: "PRICE_EXTENSION",
+	55: "HOTEL_BOOK_ON_GOOGLE_ROOM_SELECTION",
+	56: "SHOPPING_COMPARISON_LISTING",
+}
+
+var ClickTypeEnum_ClickType_value = map[string]int32{
+	"UNSPECIFIED":                            0,
+	"UNKNOWN":                                1,
+	"APP_DEEPLINK":                           2,
+	"BREADCRUMBS":                            3,
+	"BROADBAND_PLAN":                         4,
+	"CALL_TRACKING":                          5,
+	"CALLS":                                  6,
+	"CLICK_ON_ENGAGEMENT_AD":                 7,
+	"GET_DIRECTIONS":                         8,
+	"LOCATION_EXPANSION":                     9,
+	"LOCATION_FORMAT_CALL":                   10,
+	"LOCATION_FORMAT_DIRECTIONS":             11,
+	"LOCATION_FORMAT_IMAGE":                  12,
+	"LOCATION_FORMAT_LANDING_PAGE":           13,
+	"LOCATION_FORMAT_MAP":                    14,
+	"LOCATION_FORMAT_STORE_INFO":             15,
+	"LOCATION_FORMAT_TEXT":                   16,
+	"MOBILE_CALL_TRACKING":                   17,
+	"OFFER_PRINTS":                           18,
+	"OTHER":                                  19,
+	"PRODUCT_EXTENSION_CLICKS":               20,
+	"PRODUCT_LISTING_AD_CLICKS":              21,
+	"SITELINKS":                              22,
+	"STORE_LOCATOR":                          23,
+	"URL_CLICKS":                             25,
+	"VIDEO_APP_STORE_CLICKS":                 26,
+	"VIDEO_CALL_TO_ACTION_CLICKS":            27,
+	"VIDEO_CARD_ACTION_HEADLINE_CLICKS":      28,
+	"VIDEO_END_CAP_CLICKS":                   29,
+	"VIDEO_WEBSITE_CLICKS":                   30,
+	"VISUAL_SITELINKS":                       31,
+	"WIRELESS_PLAN":                          32,
+	"PRODUCT_LISTING_AD_LOCAL":               33,
+	"PRODUCT_LISTING_AD_MULTICHANNEL_LOCAL":  34,
+	"PRODUCT_LISTING_AD_MULTICHANNEL_ONLINE": 35,
+	"PRODUCT_LISTING_ADS_COUPON":             36,
+	"PRODUCT_LISTING_AD_TRANSACTABLE":        37,
+	"PRODUCT_AD_APP_DEEPLINK":                38,
+	"SHOWCASE_AD_CATEGORY_LINK":              39,
+	"SHOWCASE_AD_LOCAL_STOREFRONT_LINK":      40,
+	"SHOWCASE_AD_ONLINE_PRODUCT_LINK":        42,
+	"SHOWCASE_AD_LOCAL_PRODUCT_LINK":         43,
+	"PROMOTION_EXTENSION":                    44,
+	"SWIPEABLE_GALLERY_AD_HEADLINE":          45,
+	"SWIPEABLE_GALLERY_AD_SWIPES":            46,
+	"SWIPEABLE_GALLERY_AD_SEE_MORE":          47,
+	"SWIPEABLE_GALLERY_AD_SITELINK_ONE":      48,
+	"SWIPEABLE_GALLERY_AD_SITELINK_TWO":      49,
+	"SWIPEABLE_GALLERY_AD_SITELINK_THREE":    50,
+	"SWIPEABLE_GALLERY_AD_SITELINK_FOUR":     51,
+	"SWIPEABLE_GALLERY_AD_SITELINK_FIVE":     52,
+	"HOTEL_PRICE":                            53,
+	"PRICE_EXTENSION":                        54,
+	"HOTEL_BOOK_ON_GOOGLE_ROOM_SELECTION":    55,
+	"SHOPPING_COMPARISON_LISTING":            56,
+}
+
+func (x ClickTypeEnum_ClickType) String() string {
+	return proto.EnumName(ClickTypeEnum_ClickType_name, int32(x))
+}
+
+func (ClickTypeEnum_ClickType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ca334f107a4ef54e, []int{0, 0}
+}
+
+// Container for enumeration of Google Ads click types.
+type ClickTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ClickTypeEnum) Reset()         { *m = ClickTypeEnum{} }
+func (m *ClickTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ClickTypeEnum) ProtoMessage()    {}
+func (*ClickTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ca334f107a4ef54e, []int{0}
+}
+
+func (m *ClickTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ClickTypeEnum.Unmarshal(m, b)
+}
+func (m *ClickTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ClickTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ClickTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ClickTypeEnum.Merge(m, src)
+}
+func (m *ClickTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ClickTypeEnum.Size(m)
+}
+func (m *ClickTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ClickTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClickTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ClickTypeEnum_ClickType", ClickTypeEnum_ClickType_name, ClickTypeEnum_ClickType_value)
+	proto.RegisterType((*ClickTypeEnum)(nil), "google.ads.googleads.v3.enums.ClickTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/click_type.proto", fileDescriptor_ca334f107a4ef54e)
+}
+
+var fileDescriptor_ca334f107a4ef54e = []byte{
+	// 947 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x95, 0xdd, 0x52, 0x1b, 0x37,
+	0x14, 0xc7, 0x1b, 0xd2, 0x24, 0x45, 0x7c, 0x9d, 0x08, 0x02, 0xe1, 0x3b, 0x40, 0x21, 0x6d, 0xda,
+	0xae, 0xdb, 0xba, 0x5f, 0xe3, 0x5e, 0x69, 0x77, 0x8f, 0xd7, 0x1a, 0xb4, 0xd2, 0x8e, 0x24, 0xdb,
+	0xa4, 0xc3, 0x8c, 0x86, 0x02, 0xe3, 0x61, 0x0a, 0x36, 0x13, 0x93, 0xcc, 0xe4, 0x3d, 0xfa, 0x04,
+	0xbd, 0xe8, 0x45, 0x1f, 0xa5, 0xaf, 0xd1, 0xbb, 0x3e, 0x45, 0x47, 0xbb, 0x5e, 0x63, 0x88, 0x13,
+	0x7a, 0xe3, 0x91, 0xf5, 0xff, 0xe9, 0xec, 0xf9, 0x92, 0x0e, 0x09, 0x3a, 0xbd, 0x5e, 0xe7, 0xfc,
+	0xb4, 0x72, 0x74, 0xd2, 0xaf, 0x14, 0x4b, 0xbf, 0x7a, 0x53, 0xad, 0x9c, 0x76, 0x5f, 0x5f, 0xf4,
+	0x2b, 0xc7, 0xe7, 0x67, 0xc7, 0xbf, 0xb9, 0xab, 0xb7, 0x97, 0xa7, 0xc1, 0xe5, 0xab, 0xde, 0x55,
+	0x8f, 0xae, 0x17, 0x50, 0x70, 0x74, 0xd2, 0x0f, 0x86, 0x7c, 0xf0, 0xa6, 0x1a, 0xe4, 0xfc, 0xca,
+	0x5a, 0x69, 0xee, 0xf2, 0xac, 0x72, 0xd4, 0xed, 0xf6, 0xae, 0x8e, 0xae, 0xce, 0x7a, 0xdd, 0x7e,
+	0x71, 0x78, 0xfb, 0xcf, 0x69, 0x32, 0x13, 0x79, 0x8b, 0xf6, 0xed, 0xe5, 0x29, 0x76, 0x5f, 0x5f,
+	0x6c, 0xff, 0x3e, 0x4d, 0x26, 0x87, 0x3b, 0x74, 0x8e, 0x4c, 0x35, 0xa5, 0xc9, 0x30, 0xe2, 0x75,
+	0x8e, 0x31, 0x7c, 0x44, 0xa7, 0xc8, 0xa3, 0xa6, 0xdc, 0x97, 0xaa, 0x2d, 0xe1, 0x1e, 0x05, 0x32,
+	0xcd, 0xb2, 0xcc, 0xc5, 0x88, 0x99, 0xe0, 0x72, 0x1f, 0x26, 0x3c, 0x1f, 0x6a, 0x64, 0x71, 0xa4,
+	0x9b, 0x69, 0x68, 0xe0, 0x3e, 0xa5, 0x64, 0x36, 0xd4, 0x8a, 0xc5, 0x21, 0x93, 0xb1, 0xcb, 0x04,
+	0x93, 0xf0, 0x31, 0x7d, 0x4c, 0x66, 0x22, 0x26, 0x84, 0xb3, 0x9a, 0x45, 0xfb, 0x5c, 0x26, 0xf0,
+	0x80, 0x4e, 0x92, 0x07, 0x7e, 0xcb, 0xc0, 0x43, 0xba, 0x42, 0x16, 0x23, 0xc1, 0xa3, 0x7d, 0xa7,
+	0xa4, 0x43, 0x99, 0xb0, 0x04, 0x53, 0x94, 0xd6, 0xb1, 0x18, 0x1e, 0x79, 0x6b, 0x09, 0x5a, 0x17,
+	0x73, 0x8d, 0x91, 0xe5, 0x4a, 0x1a, 0xf8, 0x84, 0x2e, 0x12, 0x2a, 0x54, 0xc4, 0xfc, 0x5f, 0x87,
+	0x07, 0x19, 0x93, 0x86, 0x2b, 0x09, 0x93, 0xf4, 0x29, 0x59, 0x18, 0xee, 0xd7, 0x95, 0x4e, 0x99,
+	0x75, 0xfe, 0x13, 0x40, 0xe8, 0x06, 0x59, 0xb9, 0xad, 0x8c, 0x58, 0x9c, 0xa2, 0xcb, 0xe4, 0xc9,
+	0x6d, 0x9d, 0xa7, 0x2c, 0x41, 0x98, 0xa6, 0xcf, 0xc8, 0xda, 0x6d, 0x49, 0x30, 0x19, 0x73, 0x99,
+	0xb8, 0xcc, 0x13, 0x33, 0x74, 0x89, 0xcc, 0xdf, 0x26, 0x52, 0x96, 0xc1, 0xec, 0xb8, 0xaf, 0x1a,
+	0xab, 0x34, 0x3a, 0x2e, 0xeb, 0x0a, 0xe6, 0xc6, 0xf9, 0x6b, 0xf1, 0xc0, 0x02, 0x78, 0x25, 0x55,
+	0x21, 0x17, 0xe8, 0x6e, 0xa6, 0xed, 0xb1, 0x2f, 0x80, 0xaa, 0xd7, 0x51, 0xbb, 0x4c, 0x73, 0x69,
+	0x0d, 0x50, 0x9f, 0x48, 0x65, 0x1b, 0xa8, 0x61, 0x9e, 0xae, 0x91, 0xa7, 0x99, 0x56, 0x71, 0x33,
+	0xb2, 0x0e, 0x0f, 0x2c, 0xe6, 0x79, 0x71, 0x79, 0x6a, 0x0d, 0x2c, 0xd0, 0x75, 0xb2, 0x5c, 0xaa,
+	0x82, 0x1b, 0xeb, 0x23, 0x60, 0x71, 0x29, 0x3f, 0xa1, 0x33, 0x64, 0xd2, 0x70, 0x8b, 0xbe, 0xac,
+	0x06, 0x16, 0x7d, 0xc9, 0x0a, 0x67, 0x73, 0x17, 0x95, 0x86, 0x25, 0x3a, 0x4b, 0x48, 0x53, 0x8b,
+	0xf2, 0xc4, 0xb2, 0xaf, 0x5b, 0x8b, 0xc7, 0xa8, 0x9c, 0x6f, 0x89, 0x02, 0x1e, 0x68, 0x2b, 0x74,
+	0x93, 0xac, 0x16, 0x5a, 0x11, 0x80, 0x72, 0x2c, 0x4f, 0x76, 0x09, 0xac, 0xd2, 0x5d, 0xb2, 0x55,
+	0x02, 0x3a, 0x2e, 0xd5, 0x06, 0xb2, 0x58, 0x70, 0x39, 0xb4, 0xb3, 0xe6, 0x33, 0x51, 0x60, 0x28,
+	0x63, 0x17, 0xb1, 0xac, 0x54, 0xd6, 0xaf, 0x95, 0x36, 0x86, 0xde, 0xf1, 0x52, 0xd9, 0xa0, 0x0b,
+	0x04, 0x5a, 0xdc, 0x34, 0x99, 0x70, 0xd7, 0x01, 0x6d, 0xfa, 0x80, 0xda, 0x5c, 0xa3, 0x40, 0x63,
+	0x8a, 0xb6, 0x7c, 0x36, 0x9a, 0xaf, 0x91, 0x8c, 0xf8, 0x80, 0x05, 0x6c, 0xd1, 0xcf, 0xc9, 0xee,
+	0x18, 0x35, 0x6d, 0x0a, 0xcb, 0xa3, 0x06, 0x93, 0x12, 0xc5, 0x00, 0xdd, 0xa6, 0x2f, 0xc8, 0xde,
+	0x5d, 0xa8, 0x92, 0x3e, 0x30, 0xd8, 0xf1, 0x5d, 0xf1, 0x2e, 0x6b, 0x5c, 0xa4, 0x9a, 0x99, 0x92,
+	0xf0, 0x29, 0xdd, 0x21, 0x9b, 0x63, 0x6c, 0x59, 0xcd, 0xa4, 0x61, 0x91, 0x65, 0xa1, 0x40, 0xd8,
+	0xa5, 0xab, 0x64, 0xa9, 0x84, 0x58, 0xec, 0x6e, 0x5c, 0xc9, 0x3d, 0x5f, 0x68, 0xd3, 0x50, 0xed,
+	0x88, 0x19, 0xcc, 0x2b, 0xcc, 0x2c, 0x26, 0x4a, 0xbf, 0x74, 0xb9, 0xfc, 0xdc, 0x67, 0x7e, 0x54,
+	0xce, 0x63, 0x28, 0xca, 0x57, 0xd7, 0x4a, 0xda, 0x02, 0xfb, 0xcc, 0xfb, 0x31, 0x8a, 0x15, 0xfe,
+	0xbb, 0x6b, 0xd7, 0xe4, 0x3e, 0xbc, 0xa0, 0xdb, 0x64, 0xe3, 0x5d, 0x5b, 0x37, 0x98, 0x2f, 0xfc,
+	0xfd, 0xc8, 0xb4, 0x4a, 0xd5, 0xe0, 0xbe, 0x0e, 0xfa, 0x12, 0xbe, 0xa4, 0x5b, 0x64, 0xdd, 0xb4,
+	0x79, 0x86, 0x3e, 0x26, 0x97, 0x30, 0x21, 0x50, 0xbf, 0xf4, 0x56, 0xca, 0x2e, 0x80, 0xaf, 0x7c,
+	0x1b, 0x8d, 0x45, 0xf2, 0x4d, 0x03, 0xc1, 0x7b, 0x6d, 0x18, 0x44, 0x97, 0x2a, 0x8d, 0x50, 0xc9,
+	0xe3, 0x1d, 0x8b, 0x0c, 0x9a, 0xc3, 0x29, 0x89, 0xf0, 0xf5, 0xdd, 0x98, 0x6d, 0x2b, 0xf8, 0x86,
+	0x3e, 0x27, 0x3b, 0x77, 0x60, 0x0d, 0x8d, 0x08, 0xdf, 0xd2, 0x3d, 0xb2, 0xfd, 0x61, 0xb0, 0xae,
+	0x9a, 0x1a, 0xaa, 0xff, 0x83, 0xe3, 0x2d, 0x84, 0xef, 0xfc, 0x43, 0xdb, 0x50, 0x16, 0x7d, 0x7a,
+	0x79, 0x84, 0xf0, 0x3d, 0x9d, 0x27, 0x73, 0xf9, 0x72, 0x24, 0xa7, 0x3f, 0x78, 0xf7, 0x0a, 0x2a,
+	0x54, 0x2a, 0x7f, 0x50, 0x13, 0xa5, 0x12, 0x81, 0x4e, 0x2b, 0x95, 0x3a, 0x83, 0xa2, 0x78, 0xf3,
+	0xe0, 0xc7, 0x3c, 0xb3, 0x0d, 0x95, 0x65, 0xbe, 0xbf, 0x22, 0x95, 0x66, 0x4c, 0x73, 0xa3, 0x64,
+	0xd9, 0x72, 0xf0, 0x53, 0xf8, 0xcf, 0x3d, 0xb2, 0x75, 0xdc, 0xbb, 0x08, 0x3e, 0x38, 0x6c, 0xc2,
+	0xd9, 0xe1, 0xe4, 0xc8, 0xfc, 0x78, 0xc9, 0xee, 0xfd, 0x12, 0x0e, 0x0e, 0x74, 0x7a, 0xe7, 0x47,
+	0xdd, 0x4e, 0xd0, 0x7b, 0xd5, 0xa9, 0x74, 0x4e, 0xbb, 0xf9, 0xf0, 0x29, 0xa7, 0xdb, 0xe5, 0x59,
+	0xff, 0x3d, 0xc3, 0xee, 0xe7, 0xfc, 0xf7, 0x8f, 0x89, 0xfb, 0x09, 0x63, 0x7f, 0x4d, 0xac, 0x27,
+	0x85, 0x29, 0x76, 0xd2, 0x0f, 0x8a, 0xa5, 0x5f, 0xb5, 0xaa, 0x81, 0x9f, 0x5b, 0xfd, 0xbf, 0x4b,
+	0xfd, 0x90, 0x9d, 0xf4, 0x0f, 0x87, 0xfa, 0x61, 0xab, 0x7a, 0x98, 0xeb, 0xff, 0x4e, 0x6c, 0x15,
+	0x9b, 0xb5, 0x1a, 0x3b, 0xe9, 0xd7, 0x6a, 0x43, 0xa2, 0x56, 0x6b, 0x55, 0x6b, 0xb5, 0x9c, 0xf9,
+	0xf5, 0x61, 0xee, 0x58, 0xf5, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x11, 0x88, 0xfc, 0xd8, 0x84,
+	0x07, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/content_label_type.pb.go b/googleapis/ads/googleads/v3/enums/content_label_type.pb.go
new file mode 100644
index 0000000..ae4f2af
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/content_label_type.pb.go
@@ -0,0 +1,186 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/content_label_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum listing the content label types supported by ContentLabel criterion.
+type ContentLabelTypeEnum_ContentLabelType int32
+
+const (
+	// Not specified.
+	ContentLabelTypeEnum_UNSPECIFIED ContentLabelTypeEnum_ContentLabelType = 0
+	// Used for return value only. Represents value unknown in this version.
+	ContentLabelTypeEnum_UNKNOWN ContentLabelTypeEnum_ContentLabelType = 1
+	// Sexually suggestive content.
+	ContentLabelTypeEnum_SEXUALLY_SUGGESTIVE ContentLabelTypeEnum_ContentLabelType = 2
+	// Below the fold placement.
+	ContentLabelTypeEnum_BELOW_THE_FOLD ContentLabelTypeEnum_ContentLabelType = 3
+	// Parked domain.
+	ContentLabelTypeEnum_PARKED_DOMAIN ContentLabelTypeEnum_ContentLabelType = 4
+	// Juvenile, gross & bizarre content.
+	ContentLabelTypeEnum_JUVENILE ContentLabelTypeEnum_ContentLabelType = 6
+	// Profanity & rough language.
+	ContentLabelTypeEnum_PROFANITY ContentLabelTypeEnum_ContentLabelType = 7
+	// Death & tragedy.
+	ContentLabelTypeEnum_TRAGEDY ContentLabelTypeEnum_ContentLabelType = 8
+	// Video.
+	ContentLabelTypeEnum_VIDEO ContentLabelTypeEnum_ContentLabelType = 9
+	// Content rating: G.
+	ContentLabelTypeEnum_VIDEO_RATING_DV_G ContentLabelTypeEnum_ContentLabelType = 10
+	// Content rating: PG.
+	ContentLabelTypeEnum_VIDEO_RATING_DV_PG ContentLabelTypeEnum_ContentLabelType = 11
+	// Content rating: T.
+	ContentLabelTypeEnum_VIDEO_RATING_DV_T ContentLabelTypeEnum_ContentLabelType = 12
+	// Content rating: MA.
+	ContentLabelTypeEnum_VIDEO_RATING_DV_MA ContentLabelTypeEnum_ContentLabelType = 13
+	// Content rating: not yet rated.
+	ContentLabelTypeEnum_VIDEO_NOT_YET_RATED ContentLabelTypeEnum_ContentLabelType = 14
+	// Embedded video.
+	ContentLabelTypeEnum_EMBEDDED_VIDEO ContentLabelTypeEnum_ContentLabelType = 15
+	// Live streaming video.
+	ContentLabelTypeEnum_LIVE_STREAMING_VIDEO ContentLabelTypeEnum_ContentLabelType = 16
+	// Sensitive social issues.
+	ContentLabelTypeEnum_SOCIAL_ISSUES ContentLabelTypeEnum_ContentLabelType = 17
+)
+
+var ContentLabelTypeEnum_ContentLabelType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "SEXUALLY_SUGGESTIVE",
+	3:  "BELOW_THE_FOLD",
+	4:  "PARKED_DOMAIN",
+	6:  "JUVENILE",
+	7:  "PROFANITY",
+	8:  "TRAGEDY",
+	9:  "VIDEO",
+	10: "VIDEO_RATING_DV_G",
+	11: "VIDEO_RATING_DV_PG",
+	12: "VIDEO_RATING_DV_T",
+	13: "VIDEO_RATING_DV_MA",
+	14: "VIDEO_NOT_YET_RATED",
+	15: "EMBEDDED_VIDEO",
+	16: "LIVE_STREAMING_VIDEO",
+	17: "SOCIAL_ISSUES",
+}
+
+var ContentLabelTypeEnum_ContentLabelType_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"SEXUALLY_SUGGESTIVE":  2,
+	"BELOW_THE_FOLD":       3,
+	"PARKED_DOMAIN":        4,
+	"JUVENILE":             6,
+	"PROFANITY":            7,
+	"TRAGEDY":              8,
+	"VIDEO":                9,
+	"VIDEO_RATING_DV_G":    10,
+	"VIDEO_RATING_DV_PG":   11,
+	"VIDEO_RATING_DV_T":    12,
+	"VIDEO_RATING_DV_MA":   13,
+	"VIDEO_NOT_YET_RATED":  14,
+	"EMBEDDED_VIDEO":       15,
+	"LIVE_STREAMING_VIDEO": 16,
+	"SOCIAL_ISSUES":        17,
+}
+
+func (x ContentLabelTypeEnum_ContentLabelType) String() string {
+	return proto.EnumName(ContentLabelTypeEnum_ContentLabelType_name, int32(x))
+}
+
+func (ContentLabelTypeEnum_ContentLabelType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b519dcc6be978913, []int{0, 0}
+}
+
+// Container for enum describing content label types in ContentLabel.
+type ContentLabelTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ContentLabelTypeEnum) Reset()         { *m = ContentLabelTypeEnum{} }
+func (m *ContentLabelTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ContentLabelTypeEnum) ProtoMessage()    {}
+func (*ContentLabelTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b519dcc6be978913, []int{0}
+}
+
+func (m *ContentLabelTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ContentLabelTypeEnum.Unmarshal(m, b)
+}
+func (m *ContentLabelTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ContentLabelTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ContentLabelTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ContentLabelTypeEnum.Merge(m, src)
+}
+func (m *ContentLabelTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ContentLabelTypeEnum.Size(m)
+}
+func (m *ContentLabelTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ContentLabelTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ContentLabelTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ContentLabelTypeEnum_ContentLabelType", ContentLabelTypeEnum_ContentLabelType_name, ContentLabelTypeEnum_ContentLabelType_value)
+	proto.RegisterType((*ContentLabelTypeEnum)(nil), "google.ads.googleads.v3.enums.ContentLabelTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/content_label_type.proto", fileDescriptor_b519dcc6be978913)
+}
+
+var fileDescriptor_b519dcc6be978913 = []byte{
+	// 479 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0x4d, 0x6e, 0xd3, 0x40,
+	0x14, 0x26, 0x2e, 0xb4, 0xcd, 0xa4, 0x69, 0x27, 0x43, 0x0b, 0x08, 0xd1, 0x45, 0x7b, 0x00, 0x7b,
+	0x61, 0x89, 0x85, 0x59, 0x4d, 0x32, 0x2f, 0x66, 0xa8, 0x63, 0x5b, 0xf1, 0x4f, 0x09, 0x8a, 0x34,
+	0x72, 0x1b, 0xcb, 0x8a, 0x94, 0x78, 0xac, 0xda, 0xad, 0xd4, 0xeb, 0xb0, 0xe4, 0x28, 0xdc, 0x81,
+	0x0b, 0xf4, 0x00, 0xac, 0xd1, 0x78, 0x48, 0x16, 0x51, 0x61, 0x63, 0x7d, 0x7a, 0xdf, 0x8f, 0xe7,
+	0xe9, 0x7b, 0xe8, 0x63, 0x21, 0x65, 0xb1, 0xca, 0xad, 0x6c, 0x51, 0x5b, 0x1a, 0x2a, 0xf4, 0x60,
+	0x5b, 0x79, 0x79, 0xbf, 0xae, 0xad, 0x5b, 0x59, 0x36, 0x79, 0xd9, 0x88, 0x55, 0x76, 0x93, 0xaf,
+	0x44, 0xf3, 0x58, 0xe5, 0x66, 0x75, 0x27, 0x1b, 0x49, 0xce, 0xb5, 0xd8, 0xcc, 0x16, 0xb5, 0xb9,
+	0xf5, 0x99, 0x0f, 0xb6, 0xd9, 0xfa, 0xde, 0x7f, 0xd8, 0xc4, 0x56, 0x4b, 0x2b, 0x2b, 0x4b, 0xd9,
+	0x64, 0xcd, 0x52, 0x96, 0xb5, 0x36, 0x5f, 0xfe, 0x36, 0xd0, 0xe9, 0x48, 0x27, 0x7b, 0x2a, 0x38,
+	0x7e, 0xac, 0x72, 0x28, 0xef, 0xd7, 0x97, 0xbf, 0x0c, 0x84, 0x77, 0x09, 0x72, 0x82, 0x7a, 0x89,
+	0x1f, 0x85, 0x30, 0xe2, 0x63, 0x0e, 0x0c, 0xbf, 0x20, 0x3d, 0x74, 0x90, 0xf8, 0x57, 0x7e, 0x70,
+	0xed, 0xe3, 0x0e, 0x79, 0x8b, 0x5e, 0x47, 0xf0, 0x35, 0xa1, 0x9e, 0x37, 0x13, 0x51, 0xe2, 0xba,
+	0x10, 0xc5, 0x3c, 0x05, 0x6c, 0x10, 0x82, 0x8e, 0x87, 0xe0, 0x05, 0xd7, 0x22, 0xfe, 0x0c, 0x62,
+	0x1c, 0x78, 0x0c, 0xef, 0x91, 0x01, 0xea, 0x87, 0x74, 0x7a, 0x05, 0x4c, 0xb0, 0x60, 0x42, 0xb9,
+	0x8f, 0x5f, 0x92, 0x23, 0x74, 0xf8, 0x25, 0x49, 0xc1, 0xe7, 0x1e, 0xe0, 0x7d, 0xd2, 0x47, 0xdd,
+	0x70, 0x1a, 0x8c, 0xa9, 0xcf, 0xe3, 0x19, 0x3e, 0x50, 0x7f, 0x8a, 0xa7, 0xd4, 0x05, 0x36, 0xc3,
+	0x87, 0xa4, 0x8b, 0x5e, 0xa5, 0x9c, 0x41, 0x80, 0xbb, 0xe4, 0x0c, 0x0d, 0x5a, 0x28, 0xa6, 0x34,
+	0xe6, 0xbe, 0x2b, 0x58, 0x2a, 0x5c, 0x8c, 0xc8, 0x1b, 0x44, 0x76, 0xc7, 0xa1, 0x8b, 0x7b, 0xcf,
+	0xc9, 0x63, 0x7c, 0xf4, 0x9c, 0x7c, 0x42, 0x71, 0x5f, 0xad, 0xa4, 0xe7, 0x7e, 0x10, 0x8b, 0x19,
+	0xc4, 0x8a, 0x07, 0x86, 0x8f, 0xd5, 0x4a, 0x30, 0x19, 0x02, 0x63, 0xc0, 0x84, 0x7e, 0xca, 0x09,
+	0x79, 0x87, 0x4e, 0x3d, 0x9e, 0x82, 0x88, 0xe2, 0x29, 0xd0, 0x89, 0x8a, 0xd1, 0x0c, 0x56, 0xcb,
+	0x46, 0xc1, 0x88, 0x53, 0x4f, 0xf0, 0x28, 0x4a, 0x20, 0xc2, 0x83, 0xe1, 0x53, 0x07, 0x5d, 0xdc,
+	0xca, 0xb5, 0xf9, 0xdf, 0xf2, 0x86, 0x67, 0xbb, 0x15, 0x84, 0xaa, 0xb5, 0xb0, 0xf3, 0x6d, 0xf8,
+	0xd7, 0x57, 0xc8, 0x55, 0x56, 0x16, 0xa6, 0xbc, 0x2b, 0xac, 0x22, 0x2f, 0xdb, 0x4e, 0x37, 0xc7,
+	0x53, 0x2d, 0xeb, 0x7f, 0xdc, 0xd2, 0xa7, 0xf6, 0xfb, 0xdd, 0xd8, 0x73, 0x29, 0xfd, 0x61, 0x9c,
+	0xbb, 0x3a, 0x8a, 0x2e, 0x6a, 0x53, 0x43, 0x85, 0x52, 0xdb, 0x54, 0x77, 0x50, 0xff, 0xdc, 0xf0,
+	0x73, 0xba, 0xa8, 0xe7, 0x5b, 0x7e, 0x9e, 0xda, 0xf3, 0x96, 0x7f, 0x32, 0x2e, 0xf4, 0xd0, 0x71,
+	0xe8, 0xa2, 0x76, 0x9c, 0xad, 0xc2, 0x71, 0x52, 0xdb, 0x71, 0x5a, 0xcd, 0xcd, 0x7e, 0xfb, 0x30,
+	0xfb, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x73, 0x79, 0x58, 0xe3, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/conversion_action_category.pb.go b/googleapis/ads/googleads/v3/enums/conversion_action_category.pb.go
new file mode 100644
index 0000000..3d63282
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/conversion_action_category.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/conversion_action_category.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The category of conversions that are associated with a ConversionAction.
+type ConversionActionCategoryEnum_ConversionActionCategory int32
+
+const (
+	// Not specified.
+	ConversionActionCategoryEnum_UNSPECIFIED ConversionActionCategoryEnum_ConversionActionCategory = 0
+	// Used for return value only. Represents value unknown in this version.
+	ConversionActionCategoryEnum_UNKNOWN ConversionActionCategoryEnum_ConversionActionCategory = 1
+	// Default category.
+	ConversionActionCategoryEnum_DEFAULT ConversionActionCategoryEnum_ConversionActionCategory = 2
+	// User visiting a page.
+	ConversionActionCategoryEnum_PAGE_VIEW ConversionActionCategoryEnum_ConversionActionCategory = 3
+	// Purchase, sales, or "order placed" event.
+	ConversionActionCategoryEnum_PURCHASE ConversionActionCategoryEnum_ConversionActionCategory = 4
+	// Signup user action.
+	ConversionActionCategoryEnum_SIGNUP ConversionActionCategoryEnum_ConversionActionCategory = 5
+	// Lead-generating action.
+	ConversionActionCategoryEnum_LEAD ConversionActionCategoryEnum_ConversionActionCategory = 6
+	// Software download action (as for an app).
+	ConversionActionCategoryEnum_DOWNLOAD ConversionActionCategoryEnum_ConversionActionCategory = 7
+)
+
+var ConversionActionCategoryEnum_ConversionActionCategory_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DEFAULT",
+	3: "PAGE_VIEW",
+	4: "PURCHASE",
+	5: "SIGNUP",
+	6: "LEAD",
+	7: "DOWNLOAD",
+}
+
+var ConversionActionCategoryEnum_ConversionActionCategory_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"DEFAULT":     2,
+	"PAGE_VIEW":   3,
+	"PURCHASE":    4,
+	"SIGNUP":      5,
+	"LEAD":        6,
+	"DOWNLOAD":    7,
+}
+
+func (x ConversionActionCategoryEnum_ConversionActionCategory) String() string {
+	return proto.EnumName(ConversionActionCategoryEnum_ConversionActionCategory_name, int32(x))
+}
+
+func (ConversionActionCategoryEnum_ConversionActionCategory) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1a66d28e731c65ca, []int{0, 0}
+}
+
+// Container for enum describing the category of conversions that are associated
+// with a ConversionAction.
+type ConversionActionCategoryEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionActionCategoryEnum) Reset()         { *m = ConversionActionCategoryEnum{} }
+func (m *ConversionActionCategoryEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionActionCategoryEnum) ProtoMessage()    {}
+func (*ConversionActionCategoryEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a66d28e731c65ca, []int{0}
+}
+
+func (m *ConversionActionCategoryEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionActionCategoryEnum.Unmarshal(m, b)
+}
+func (m *ConversionActionCategoryEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionActionCategoryEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionActionCategoryEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionActionCategoryEnum.Merge(m, src)
+}
+func (m *ConversionActionCategoryEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionActionCategoryEnum.Size(m)
+}
+func (m *ConversionActionCategoryEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionActionCategoryEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionActionCategoryEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ConversionActionCategoryEnum_ConversionActionCategory", ConversionActionCategoryEnum_ConversionActionCategory_name, ConversionActionCategoryEnum_ConversionActionCategory_value)
+	proto.RegisterType((*ConversionActionCategoryEnum)(nil), "google.ads.googleads.v3.enums.ConversionActionCategoryEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/conversion_action_category.proto", fileDescriptor_1a66d28e731c65ca)
+}
+
+var fileDescriptor_1a66d28e731c65ca = []byte{
+	// 359 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0x6a, 0xea, 0x40,
+	0x14, 0x7d, 0x89, 0x3e, 0xf5, 0x8d, 0xaf, 0x74, 0xc8, 0xaa, 0x14, 0x5d, 0xe8, 0x07, 0x4c, 0x16,
+	0xd9, 0x4d, 0xa1, 0x30, 0x26, 0x63, 0x1a, 0x2a, 0x31, 0xd4, 0x26, 0x42, 0x09, 0x48, 0x9a, 0x84,
+	0x20, 0xe8, 0x8c, 0x64, 0xa2, 0xd0, 0x1f, 0xe8, 0x87, 0x74, 0x53, 0xe8, 0xa7, 0xf4, 0x53, 0xba,
+	0xec, 0x17, 0x94, 0x99, 0x68, 0x76, 0x76, 0x93, 0x9c, 0x99, 0x7b, 0xce, 0xb9, 0xf7, 0x9e, 0x01,
+	0xb7, 0x05, 0xe7, 0xc5, 0x26, 0x37, 0x93, 0x4c, 0x98, 0x35, 0x94, 0xe8, 0x60, 0x99, 0x39, 0xdb,
+	0x6f, 0x85, 0x99, 0x72, 0x76, 0xc8, 0x4b, 0xb1, 0xe6, 0x6c, 0x95, 0xa4, 0x95, 0xfc, 0xa5, 0x49,
+	0x95, 0x17, 0xbc, 0x7c, 0x41, 0xbb, 0x92, 0x57, 0xdc, 0x18, 0xd6, 0x22, 0x94, 0x64, 0x02, 0x35,
+	0x7a, 0x74, 0xb0, 0x90, 0xd2, 0x5f, 0x0f, 0x4e, 0xf6, 0xbb, 0xb5, 0x99, 0x30, 0xc6, 0xab, 0x44,
+	0x9a, 0x88, 0x5a, 0x3c, 0x7e, 0xd7, 0xc0, 0xc0, 0x6e, 0x3a, 0x10, 0xd5, 0xc0, 0x3e, 0xfa, 0x53,
+	0xb6, 0xdf, 0x8e, 0x5f, 0x35, 0x70, 0x75, 0x8e, 0x60, 0x5c, 0x82, 0x7e, 0xe8, 0x2f, 0x02, 0x6a,
+	0x7b, 0x53, 0x8f, 0x3a, 0xf0, 0x8f, 0xd1, 0x07, 0xdd, 0xd0, 0xbf, 0xf7, 0xe7, 0x4b, 0x1f, 0x6a,
+	0xf2, 0xe0, 0xd0, 0x29, 0x09, 0x67, 0x8f, 0x50, 0x37, 0x2e, 0xc0, 0xbf, 0x80, 0xb8, 0x74, 0x15,
+	0x79, 0x74, 0x09, 0x5b, 0xc6, 0x7f, 0xd0, 0x0b, 0xc2, 0x07, 0xfb, 0x8e, 0x2c, 0x28, 0x6c, 0x1b,
+	0x00, 0x74, 0x16, 0x9e, 0xeb, 0x87, 0x01, 0xfc, 0x6b, 0xf4, 0x40, 0x7b, 0x46, 0x89, 0x03, 0x3b,
+	0x92, 0xe3, 0xcc, 0x97, 0xfe, 0x6c, 0x4e, 0x1c, 0xd8, 0x9d, 0x7c, 0x6b, 0x60, 0x94, 0xf2, 0x2d,
+	0xfa, 0x75, 0xdb, 0xc9, 0xf0, 0xdc, 0xac, 0x81, 0x5c, 0x37, 0xd0, 0x9e, 0x26, 0x47, 0x7d, 0xc1,
+	0x37, 0x09, 0x2b, 0x10, 0x2f, 0x0b, 0xb3, 0xc8, 0x99, 0x0a, 0xe3, 0x94, 0xfe, 0x6e, 0x2d, 0xce,
+	0x3c, 0xc6, 0x8d, 0xfa, 0xbe, 0xe9, 0x2d, 0x97, 0x90, 0x0f, 0x7d, 0xe8, 0xd6, 0x56, 0x24, 0x13,
+	0xa8, 0x86, 0x12, 0x45, 0x16, 0x92, 0xc1, 0x89, 0xcf, 0x53, 0x3d, 0x26, 0x99, 0x88, 0x9b, 0x7a,
+	0x1c, 0x59, 0xb1, 0xaa, 0x7f, 0xe9, 0xa3, 0xfa, 0x12, 0x63, 0x92, 0x09, 0x8c, 0x1b, 0x06, 0xc6,
+	0x91, 0x85, 0xb1, 0xe2, 0x3c, 0x77, 0xd4, 0x60, 0xd6, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x63,
+	0xf5, 0x85, 0x43, 0x24, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/conversion_action_counting_type.pb.go b/googleapis/ads/googleads/v3/enums/conversion_action_counting_type.pb.go
new file mode 100644
index 0000000..b768405
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/conversion_action_counting_type.pb.go
@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/conversion_action_counting_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Indicates how conversions for this action will be counted. For more
+// information, see https://support.google.com/google-ads/answer/3438531.
+type ConversionActionCountingTypeEnum_ConversionActionCountingType int32
+
+const (
+	// Not specified.
+	ConversionActionCountingTypeEnum_UNSPECIFIED ConversionActionCountingTypeEnum_ConversionActionCountingType = 0
+	// Used for return value only. Represents value unknown in this version.
+	ConversionActionCountingTypeEnum_UNKNOWN ConversionActionCountingTypeEnum_ConversionActionCountingType = 1
+	// Count only one conversion per click.
+	ConversionActionCountingTypeEnum_ONE_PER_CLICK ConversionActionCountingTypeEnum_ConversionActionCountingType = 2
+	// Count all conversions per click.
+	ConversionActionCountingTypeEnum_MANY_PER_CLICK ConversionActionCountingTypeEnum_ConversionActionCountingType = 3
+)
+
+var ConversionActionCountingTypeEnum_ConversionActionCountingType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ONE_PER_CLICK",
+	3: "MANY_PER_CLICK",
+}
+
+var ConversionActionCountingTypeEnum_ConversionActionCountingType_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"ONE_PER_CLICK":  2,
+	"MANY_PER_CLICK": 3,
+}
+
+func (x ConversionActionCountingTypeEnum_ConversionActionCountingType) String() string {
+	return proto.EnumName(ConversionActionCountingTypeEnum_ConversionActionCountingType_name, int32(x))
+}
+
+func (ConversionActionCountingTypeEnum_ConversionActionCountingType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3b999761ccfaadcc, []int{0, 0}
+}
+
+// Container for enum describing the conversion deduplication mode for
+// conversion optimizer.
+type ConversionActionCountingTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionActionCountingTypeEnum) Reset()         { *m = ConversionActionCountingTypeEnum{} }
+func (m *ConversionActionCountingTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionActionCountingTypeEnum) ProtoMessage()    {}
+func (*ConversionActionCountingTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3b999761ccfaadcc, []int{0}
+}
+
+func (m *ConversionActionCountingTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionActionCountingTypeEnum.Unmarshal(m, b)
+}
+func (m *ConversionActionCountingTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionActionCountingTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionActionCountingTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionActionCountingTypeEnum.Merge(m, src)
+}
+func (m *ConversionActionCountingTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionActionCountingTypeEnum.Size(m)
+}
+func (m *ConversionActionCountingTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionActionCountingTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionActionCountingTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ConversionActionCountingTypeEnum_ConversionActionCountingType", ConversionActionCountingTypeEnum_ConversionActionCountingType_name, ConversionActionCountingTypeEnum_ConversionActionCountingType_value)
+	proto.RegisterType((*ConversionActionCountingTypeEnum)(nil), "google.ads.googleads.v3.enums.ConversionActionCountingTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/conversion_action_counting_type.proto", fileDescriptor_3b999761ccfaadcc)
+}
+
+var fileDescriptor_3b999761ccfaadcc = []byte{
+	// 324 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x1c, 0xb6, 0x1d, 0x28, 0x64, 0xa8, 0xb3, 0x47, 0xd9, 0xc0, 0xed, 0x01, 0xd2, 0x43, 0x6f, 0xf1,
+	0x94, 0xc5, 0x3a, 0xc6, 0x34, 0x2b, 0xea, 0x26, 0x4a, 0xa1, 0xc4, 0x36, 0x84, 0xc2, 0x96, 0x94,
+	0xa5, 0x1b, 0xec, 0x09, 0x7c, 0x0f, 0x8f, 0x3e, 0x8a, 0x8f, 0xe2, 0x03, 0x78, 0x96, 0x24, 0x5b,
+	0xf1, 0xe2, 0x2e, 0xc9, 0xc7, 0xef, 0xcf, 0xf7, 0xfd, 0xbe, 0x0f, 0x10, 0xa1, 0x94, 0x58, 0xf0,
+	0x90, 0x15, 0x3a, 0x74, 0xd0, 0xa0, 0x4d, 0x14, 0x72, 0xb9, 0x5e, 0xea, 0x30, 0x57, 0x72, 0xc3,
+	0x57, 0xba, 0x54, 0x32, 0x63, 0x79, 0x6d, 0xbe, 0x5c, 0xad, 0x65, 0x5d, 0x4a, 0x91, 0xd5, 0xdb,
+	0x8a, 0xc3, 0x6a, 0xa5, 0x6a, 0x15, 0xf4, 0xdc, 0x26, 0x64, 0x85, 0x86, 0x0d, 0x09, 0xdc, 0x44,
+	0xd0, 0x92, 0x5c, 0x76, 0xf7, 0x1a, 0x55, 0x19, 0x32, 0x29, 0x55, 0xcd, 0x0c, 0x93, 0x76, 0xcb,
+	0x83, 0x77, 0x0f, 0x5c, 0x91, 0x46, 0x06, 0x5b, 0x15, 0xb2, 0x13, 0x79, 0xda, 0x56, 0x3c, 0x96,
+	0xeb, 0xe5, 0x20, 0x07, 0xdd, 0x43, 0x33, 0xc1, 0x39, 0x68, 0xcf, 0xe8, 0x63, 0x12, 0x93, 0xf1,
+	0xed, 0x38, 0xbe, 0xe9, 0x1c, 0x05, 0x6d, 0x70, 0x32, 0xa3, 0x13, 0x3a, 0x7d, 0xa6, 0x1d, 0x2f,
+	0xb8, 0x00, 0xa7, 0x53, 0x1a, 0x67, 0x49, 0xfc, 0x90, 0x91, 0xbb, 0x31, 0x99, 0x74, 0xfc, 0x20,
+	0x00, 0x67, 0xf7, 0x98, 0xbe, 0xfc, 0xa9, 0xb5, 0x86, 0x3f, 0x1e, 0xe8, 0xe7, 0x6a, 0x09, 0x0f,
+	0xba, 0x19, 0xf6, 0x0f, 0x1d, 0x92, 0x18, 0x4b, 0x89, 0xf7, 0x3a, 0xdc, 0x71, 0x08, 0xb5, 0x60,
+	0x52, 0x40, 0xb5, 0x12, 0xa1, 0xe0, 0xd2, 0x1a, 0xde, 0xc7, 0x5c, 0x95, 0xfa, 0x9f, 0xd4, 0xaf,
+	0xed, 0xfb, 0xe1, 0xb7, 0x46, 0x18, 0x7f, 0xfa, 0xbd, 0x91, 0xa3, 0xc2, 0x85, 0x86, 0x0e, 0x1a,
+	0x34, 0x8f, 0xa0, 0x09, 0x46, 0x7f, 0xed, 0xfb, 0x29, 0x2e, 0x74, 0xda, 0xf4, 0xd3, 0x79, 0x94,
+	0xda, 0xfe, 0xb7, 0xdf, 0x77, 0x45, 0x84, 0x70, 0xa1, 0x11, 0x6a, 0x26, 0x10, 0x9a, 0x47, 0x08,
+	0xd9, 0x99, 0xb7, 0x63, 0x7b, 0x58, 0xf4, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x79, 0x95, 0x05, 0x66,
+	0x0d, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/conversion_action_status.pb.go b/googleapis/ads/googleads/v3/enums/conversion_action_status.pb.go
new file mode 100644
index 0000000..440bb46
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/conversion_action_status.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/conversion_action_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a conversion action.
+type ConversionActionStatusEnum_ConversionActionStatus int32
+
+const (
+	// Not specified.
+	ConversionActionStatusEnum_UNSPECIFIED ConversionActionStatusEnum_ConversionActionStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	ConversionActionStatusEnum_UNKNOWN ConversionActionStatusEnum_ConversionActionStatus = 1
+	// Conversions will be recorded.
+	ConversionActionStatusEnum_ENABLED ConversionActionStatusEnum_ConversionActionStatus = 2
+	// Conversions will not be recorded.
+	ConversionActionStatusEnum_REMOVED ConversionActionStatusEnum_ConversionActionStatus = 3
+	// Conversions will not be recorded and the conversion action will not
+	// appear in the UI.
+	ConversionActionStatusEnum_HIDDEN ConversionActionStatusEnum_ConversionActionStatus = 4
+)
+
+var ConversionActionStatusEnum_ConversionActionStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+	4: "HIDDEN",
+}
+
+var ConversionActionStatusEnum_ConversionActionStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+	"HIDDEN":      4,
+}
+
+func (x ConversionActionStatusEnum_ConversionActionStatus) String() string {
+	return proto.EnumName(ConversionActionStatusEnum_ConversionActionStatus_name, int32(x))
+}
+
+func (ConversionActionStatusEnum_ConversionActionStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8fa0bbddeff25dcf, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of a conversion action.
+type ConversionActionStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionActionStatusEnum) Reset()         { *m = ConversionActionStatusEnum{} }
+func (m *ConversionActionStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionActionStatusEnum) ProtoMessage()    {}
+func (*ConversionActionStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8fa0bbddeff25dcf, []int{0}
+}
+
+func (m *ConversionActionStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionActionStatusEnum.Unmarshal(m, b)
+}
+func (m *ConversionActionStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionActionStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionActionStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionActionStatusEnum.Merge(m, src)
+}
+func (m *ConversionActionStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionActionStatusEnum.Size(m)
+}
+func (m *ConversionActionStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionActionStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionActionStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ConversionActionStatusEnum_ConversionActionStatus", ConversionActionStatusEnum_ConversionActionStatus_name, ConversionActionStatusEnum_ConversionActionStatus_value)
+	proto.RegisterType((*ConversionActionStatusEnum)(nil), "google.ads.googleads.v3.enums.ConversionActionStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/conversion_action_status.proto", fileDescriptor_8fa0bbddeff25dcf)
+}
+
+var fileDescriptor_8fa0bbddeff25dcf = []byte{
+	// 314 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xb1, 0x4e, 0xc3, 0x30,
+	0x14, 0xa4, 0x29, 0x2a, 0x92, 0x3b, 0x10, 0x65, 0x60, 0x28, 0x74, 0x68, 0x3f, 0xc0, 0x1e, 0xbc,
+	0x19, 0x16, 0xa7, 0x31, 0xa5, 0x02, 0xdc, 0x8a, 0xaa, 0x41, 0x42, 0x91, 0x90, 0x69, 0x22, 0xab,
+	0x52, 0x6b, 0x57, 0x71, 0x92, 0x81, 0xcf, 0x61, 0xe4, 0x53, 0xf8, 0x14, 0x26, 0x3e, 0x01, 0xd9,
+	0x69, 0x32, 0x15, 0x16, 0xfb, 0x9e, 0xef, 0xdd, 0xe9, 0x7c, 0xe0, 0x46, 0x6a, 0x2d, 0xb7, 0x19,
+	0x12, 0xa9, 0x41, 0x35, 0xb4, 0xa8, 0xc2, 0x28, 0x53, 0xe5, 0xce, 0xa0, 0xb5, 0x56, 0x55, 0x96,
+	0x9b, 0x8d, 0x56, 0xaf, 0x62, 0x5d, 0xd8, 0xcb, 0x14, 0xa2, 0x28, 0x0d, 0xdc, 0xe7, 0xba, 0xd0,
+	0xc1, 0xb0, 0x96, 0x40, 0x91, 0x1a, 0xd8, 0xaa, 0x61, 0x85, 0xa1, 0x53, 0x0f, 0xae, 0x1a, 0xf3,
+	0xfd, 0x06, 0x09, 0xa5, 0x74, 0x21, 0xac, 0xc5, 0x41, 0x3c, 0x7e, 0x07, 0x83, 0x49, 0x6b, 0x4f,
+	0x9d, 0xfb, 0xd2, 0x99, 0x33, 0x55, 0xee, 0xc6, 0x09, 0xb8, 0x38, 0xce, 0x06, 0xe7, 0xa0, 0xbf,
+	0xe2, 0xcb, 0x05, 0x9b, 0xcc, 0x6e, 0x67, 0x2c, 0xf2, 0x4f, 0x82, 0x3e, 0x38, 0x5b, 0xf1, 0x7b,
+	0x3e, 0x7f, 0xe6, 0x7e, 0xc7, 0x0e, 0x8c, 0xd3, 0xf0, 0x81, 0x45, 0xbe, 0x67, 0x87, 0x27, 0xf6,
+	0x38, 0x8f, 0x59, 0xe4, 0x77, 0x03, 0x00, 0x7a, 0x77, 0xb3, 0x28, 0x62, 0xdc, 0x3f, 0x0d, 0x7f,
+	0x3a, 0x60, 0xb4, 0xd6, 0x3b, 0xf8, 0x6f, 0xfe, 0xf0, 0xf2, 0x78, 0x82, 0x85, 0x8d, 0xbf, 0xe8,
+	0xbc, 0x84, 0x07, 0xb5, 0xd4, 0x5b, 0xa1, 0x24, 0xd4, 0xb9, 0x44, 0x32, 0x53, 0xee, 0x73, 0x4d,
+	0x97, 0xfb, 0x8d, 0xf9, 0xa3, 0xda, 0x6b, 0x77, 0x7e, 0x78, 0xdd, 0x29, 0xa5, 0x9f, 0xde, 0x70,
+	0x5a, 0x5b, 0xd1, 0xd4, 0xc0, 0x1a, 0x5a, 0x14, 0x63, 0x68, 0xbb, 0x30, 0x5f, 0x0d, 0x9f, 0xd0,
+	0xd4, 0x24, 0x2d, 0x9f, 0xc4, 0x38, 0x71, 0xfc, 0xb7, 0x37, 0xaa, 0x1f, 0x09, 0xa1, 0xa9, 0x21,
+	0xa4, 0xdd, 0x20, 0x24, 0xc6, 0x84, 0xb8, 0x9d, 0xb7, 0x9e, 0x0b, 0x86, 0x7f, 0x03, 0x00, 0x00,
+	0xff, 0xff, 0x58, 0x8b, 0xdd, 0x69, 0xf2, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/conversion_action_type.pb.go b/googleapis/ads/googleads/v3/enums/conversion_action_type.pb.go
new file mode 100644
index 0000000..3eeb488
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/conversion_action_type.pb.go
@@ -0,0 +1,158 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/conversion_action_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible types of a conversion action.
+type ConversionActionTypeEnum_ConversionActionType int32
+
+const (
+	// Not specified.
+	ConversionActionTypeEnum_UNSPECIFIED ConversionActionTypeEnum_ConversionActionType = 0
+	// Used for return value only. Represents value unknown in this version.
+	ConversionActionTypeEnum_UNKNOWN ConversionActionTypeEnum_ConversionActionType = 1
+	// Conversions that occur when a user clicks on an ad's call extension.
+	ConversionActionTypeEnum_AD_CALL ConversionActionTypeEnum_ConversionActionType = 2
+	// Conversions that occur when a user on a mobile device clicks a phone
+	// number.
+	ConversionActionTypeEnum_CLICK_TO_CALL ConversionActionTypeEnum_ConversionActionType = 3
+	// Conversions that occur when a user downloads a mobile app from the Google
+	// Play Store.
+	ConversionActionTypeEnum_GOOGLE_PLAY_DOWNLOAD ConversionActionTypeEnum_ConversionActionType = 4
+	// Conversions that occur when a user makes a purchase in an app through
+	// Android billing.
+	ConversionActionTypeEnum_GOOGLE_PLAY_IN_APP_PURCHASE ConversionActionTypeEnum_ConversionActionType = 5
+	// Call conversions that are tracked by the advertiser and uploaded.
+	ConversionActionTypeEnum_UPLOAD_CALLS ConversionActionTypeEnum_ConversionActionType = 6
+	// Conversions that are tracked by the advertiser and uploaded with
+	// attributed clicks.
+	ConversionActionTypeEnum_UPLOAD_CLICKS ConversionActionTypeEnum_ConversionActionType = 7
+	// Conversions that occur on a webpage.
+	ConversionActionTypeEnum_WEBPAGE ConversionActionTypeEnum_ConversionActionType = 8
+	// Conversions that occur when a user calls a dynamically-generated phone
+	// number from an advertiser's website.
+	ConversionActionTypeEnum_WEBSITE_CALL ConversionActionTypeEnum_ConversionActionType = 9
+)
+
+var ConversionActionTypeEnum_ConversionActionType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AD_CALL",
+	3: "CLICK_TO_CALL",
+	4: "GOOGLE_PLAY_DOWNLOAD",
+	5: "GOOGLE_PLAY_IN_APP_PURCHASE",
+	6: "UPLOAD_CALLS",
+	7: "UPLOAD_CLICKS",
+	8: "WEBPAGE",
+	9: "WEBSITE_CALL",
+}
+
+var ConversionActionTypeEnum_ConversionActionType_value = map[string]int32{
+	"UNSPECIFIED":                 0,
+	"UNKNOWN":                     1,
+	"AD_CALL":                     2,
+	"CLICK_TO_CALL":               3,
+	"GOOGLE_PLAY_DOWNLOAD":        4,
+	"GOOGLE_PLAY_IN_APP_PURCHASE": 5,
+	"UPLOAD_CALLS":                6,
+	"UPLOAD_CLICKS":               7,
+	"WEBPAGE":                     8,
+	"WEBSITE_CALL":                9,
+}
+
+func (x ConversionActionTypeEnum_ConversionActionType) String() string {
+	return proto.EnumName(ConversionActionTypeEnum_ConversionActionType_name, int32(x))
+}
+
+func (ConversionActionTypeEnum_ConversionActionType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3050c3c63416f7a0, []int{0, 0}
+}
+
+// Container for enum describing possible types of a conversion action.
+type ConversionActionTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionActionTypeEnum) Reset()         { *m = ConversionActionTypeEnum{} }
+func (m *ConversionActionTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionActionTypeEnum) ProtoMessage()    {}
+func (*ConversionActionTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3050c3c63416f7a0, []int{0}
+}
+
+func (m *ConversionActionTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionActionTypeEnum.Unmarshal(m, b)
+}
+func (m *ConversionActionTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionActionTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionActionTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionActionTypeEnum.Merge(m, src)
+}
+func (m *ConversionActionTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionActionTypeEnum.Size(m)
+}
+func (m *ConversionActionTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionActionTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionActionTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ConversionActionTypeEnum_ConversionActionType", ConversionActionTypeEnum_ConversionActionType_name, ConversionActionTypeEnum_ConversionActionType_value)
+	proto.RegisterType((*ConversionActionTypeEnum)(nil), "google.ads.googleads.v3.enums.ConversionActionTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/conversion_action_type.proto", fileDescriptor_3050c3c63416f7a0)
+}
+
+var fileDescriptor_3050c3c63416f7a0 = []byte{
+	// 397 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xdf, 0x8e, 0x94, 0x30,
+	0x14, 0xc6, 0x85, 0xd5, 0x5d, 0xed, 0x6a, 0xac, 0x64, 0x2f, 0xd6, 0x3f, 0x1b, 0xb3, 0xfb, 0x00,
+	0xe5, 0x82, 0xbb, 0x7a, 0x55, 0xa0, 0x22, 0x59, 0x02, 0x8d, 0x0c, 0x43, 0x34, 0x24, 0x04, 0x07,
+	0x42, 0x26, 0xd9, 0x69, 0xc9, 0x94, 0x99, 0x64, 0x5e, 0xc7, 0x4b, 0x1f, 0xc5, 0x5b, 0xdf, 0xc2,
+	0x0b, 0xe3, 0x23, 0x98, 0xb6, 0x42, 0xbc, 0x18, 0xf7, 0x06, 0x4e, 0xcf, 0x77, 0xbe, 0xdf, 0x69,
+	0xcf, 0x01, 0xb8, 0x17, 0xa2, 0xbf, 0xeb, 0xdc, 0xa6, 0x95, 0xae, 0x09, 0x55, 0xb4, 0xf7, 0xdc,
+	0x8e, 0xef, 0x36, 0xd2, 0x5d, 0x09, 0xbe, 0xef, 0xb6, 0x72, 0x2d, 0x78, 0xdd, 0xac, 0x46, 0xf5,
+	0x1b, 0x0f, 0x43, 0x87, 0x86, 0xad, 0x18, 0x85, 0x73, 0x65, 0x0c, 0xa8, 0x69, 0x25, 0x9a, 0xbd,
+	0x68, 0xef, 0x21, 0xed, 0x7d, 0xf5, 0x66, 0x42, 0x0f, 0x6b, 0xb7, 0xe1, 0x5c, 0x8c, 0x8d, 0x02,
+	0x48, 0x63, 0xbe, 0xf9, 0x6d, 0x81, 0xcb, 0x60, 0xa6, 0x13, 0x0d, 0x5f, 0x1c, 0x86, 0x8e, 0xf2,
+	0xdd, 0xe6, 0xe6, 0x87, 0x05, 0x2e, 0x8e, 0x89, 0xce, 0x73, 0x70, 0x5e, 0xa4, 0x39, 0xa3, 0x41,
+	0xfc, 0x3e, 0xa6, 0x21, 0x7c, 0xe0, 0x9c, 0x83, 0xb3, 0x22, 0xbd, 0x4d, 0xb3, 0x32, 0x85, 0x96,
+	0x3a, 0x90, 0xb0, 0x0e, 0x48, 0x92, 0x40, 0xdb, 0x79, 0x01, 0x9e, 0x05, 0x49, 0x1c, 0xdc, 0xd6,
+	0x8b, 0xcc, 0xa4, 0x4e, 0x9c, 0x4b, 0x70, 0x11, 0x65, 0x59, 0x94, 0xd0, 0x9a, 0x25, 0xe4, 0x53,
+	0x1d, 0x66, 0x65, 0x9a, 0x64, 0x24, 0x84, 0x0f, 0x9d, 0xb7, 0xe0, 0xf5, 0xbf, 0x4a, 0x9c, 0xd6,
+	0x84, 0xb1, 0x9a, 0x15, 0x1f, 0x83, 0x0f, 0x24, 0xa7, 0xf0, 0x91, 0x03, 0xc1, 0xd3, 0x82, 0xa9,
+	0x62, 0xcd, 0xca, 0xe1, 0xa9, 0xe2, 0x4f, 0x19, 0xd5, 0x26, 0x87, 0x67, 0xaa, 0x7f, 0x49, 0x7d,
+	0x46, 0x22, 0x0a, 0x1f, 0x2b, 0x47, 0x49, 0xfd, 0x3c, 0x5e, 0x50, 0xd3, 0xfe, 0x89, 0xff, 0xcb,
+	0x02, 0xd7, 0x2b, 0xb1, 0x41, 0xf7, 0x8e, 0xcd, 0x7f, 0x79, 0xec, 0xe1, 0x4c, 0xcd, 0x8c, 0x59,
+	0x9f, 0xfd, 0xbf, 0xde, 0x5e, 0xdc, 0x35, 0xbc, 0x47, 0x62, 0xdb, 0xbb, 0x7d, 0xc7, 0xf5, 0x44,
+	0xa7, 0xf5, 0x0d, 0x6b, 0xf9, 0x9f, 0x6d, 0xbe, 0xd3, 0xdf, 0xaf, 0xf6, 0x49, 0x44, 0xc8, 0x37,
+	0xfb, 0x2a, 0x32, 0x28, 0xd2, 0x4a, 0x64, 0x42, 0x15, 0x2d, 0x3d, 0xa4, 0x36, 0x20, 0xbf, 0x4f,
+	0x7a, 0x45, 0x5a, 0x59, 0xcd, 0x7a, 0xb5, 0xf4, 0x2a, 0xad, 0xff, 0xb4, 0xaf, 0x4d, 0x12, 0x63,
+	0xd2, 0x4a, 0x8c, 0xe7, 0x0a, 0x8c, 0x97, 0x1e, 0xc6, 0xba, 0xe6, 0xcb, 0xa9, 0xbe, 0x98, 0xf7,
+	0x27, 0x00, 0x00, 0xff, 0xff, 0x91, 0xd6, 0x3d, 0x8e, 0x65, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/conversion_adjustment_type.pb.go b/googleapis/ads/googleads/v3/enums/conversion_adjustment_type.pb.go
new file mode 100644
index 0000000..3b9a543
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/conversion_adjustment_type.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/conversion_adjustment_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The different actions advertisers can take to adjust the conversions that
+// they already reported. Retractions negate a conversion. Restatements change
+// the value of a conversion.
+type ConversionAdjustmentTypeEnum_ConversionAdjustmentType int32
+
+const (
+	// Not specified.
+	ConversionAdjustmentTypeEnum_UNSPECIFIED ConversionAdjustmentTypeEnum_ConversionAdjustmentType = 0
+	// Represents value unknown in this version.
+	ConversionAdjustmentTypeEnum_UNKNOWN ConversionAdjustmentTypeEnum_ConversionAdjustmentType = 1
+	// Negates a conversion so that its total value and count are both zero.
+	ConversionAdjustmentTypeEnum_RETRACTION ConversionAdjustmentTypeEnum_ConversionAdjustmentType = 2
+	// Changes the value of a conversion.
+	ConversionAdjustmentTypeEnum_RESTATEMENT ConversionAdjustmentTypeEnum_ConversionAdjustmentType = 3
+)
+
+var ConversionAdjustmentTypeEnum_ConversionAdjustmentType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "RETRACTION",
+	3: "RESTATEMENT",
+}
+
+var ConversionAdjustmentTypeEnum_ConversionAdjustmentType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"RETRACTION":  2,
+	"RESTATEMENT": 3,
+}
+
+func (x ConversionAdjustmentTypeEnum_ConversionAdjustmentType) String() string {
+	return proto.EnumName(ConversionAdjustmentTypeEnum_ConversionAdjustmentType_name, int32(x))
+}
+
+func (ConversionAdjustmentTypeEnum_ConversionAdjustmentType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_356d233123b32726, []int{0, 0}
+}
+
+// Container for enum describing conversion adjustment types.
+type ConversionAdjustmentTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionAdjustmentTypeEnum) Reset()         { *m = ConversionAdjustmentTypeEnum{} }
+func (m *ConversionAdjustmentTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionAdjustmentTypeEnum) ProtoMessage()    {}
+func (*ConversionAdjustmentTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_356d233123b32726, []int{0}
+}
+
+func (m *ConversionAdjustmentTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionAdjustmentTypeEnum.Unmarshal(m, b)
+}
+func (m *ConversionAdjustmentTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionAdjustmentTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionAdjustmentTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionAdjustmentTypeEnum.Merge(m, src)
+}
+func (m *ConversionAdjustmentTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionAdjustmentTypeEnum.Size(m)
+}
+func (m *ConversionAdjustmentTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionAdjustmentTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionAdjustmentTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ConversionAdjustmentTypeEnum_ConversionAdjustmentType", ConversionAdjustmentTypeEnum_ConversionAdjustmentType_name, ConversionAdjustmentTypeEnum_ConversionAdjustmentType_value)
+	proto.RegisterType((*ConversionAdjustmentTypeEnum)(nil), "google.ads.googleads.v3.enums.ConversionAdjustmentTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/conversion_adjustment_type.proto", fileDescriptor_356d233123b32726)
+}
+
+var fileDescriptor_356d233123b32726 = []byte{
+	// 316 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x1c, 0x76, 0x1d, 0x28, 0x64, 0xa0, 0xa5, 0x27, 0x91, 0xed, 0xb0, 0x3d, 0x40, 0x7a, 0xe8, 0x2d,
+	0x82, 0x90, 0xcd, 0x38, 0x86, 0xd8, 0x8d, 0x2d, 0x9b, 0x28, 0x85, 0x11, 0x97, 0x10, 0x2a, 0x6b,
+	0x52, 0x96, 0x6c, 0xb0, 0xd7, 0xf1, 0xe8, 0xa3, 0xf8, 0x28, 0x1e, 0x7d, 0x02, 0x69, 0xe2, 0x7a,
+	0xab, 0x97, 0xf2, 0xd1, 0xef, 0xcf, 0xef, 0xcb, 0x07, 0xee, 0xa4, 0xd6, 0x72, 0x2b, 0x62, 0xc6,
+	0x4d, 0xec, 0x61, 0x85, 0x0e, 0x49, 0x2c, 0xd4, 0xbe, 0x30, 0xf1, 0x46, 0xab, 0x83, 0xd8, 0x99,
+	0x5c, 0xab, 0x35, 0xe3, 0xef, 0x7b, 0x63, 0x0b, 0xa1, 0xec, 0xda, 0x1e, 0x4b, 0x01, 0xcb, 0x9d,
+	0xb6, 0x3a, 0xea, 0x79, 0x13, 0x64, 0xdc, 0xc0, 0xda, 0x0f, 0x0f, 0x09, 0x74, 0xfe, 0x9b, 0xee,
+	0x29, 0xbe, 0xcc, 0x63, 0xa6, 0x94, 0xb6, 0xcc, 0xe6, 0x5a, 0x19, 0x6f, 0x1e, 0x1c, 0x41, 0x77,
+	0x54, 0x1f, 0xc0, 0x75, 0x3e, 0x3d, 0x96, 0x82, 0xa8, 0x7d, 0x31, 0x78, 0x01, 0xd7, 0x4d, 0x7c,
+	0x74, 0x05, 0x3a, 0xcb, 0x74, 0x31, 0x23, 0xa3, 0xc9, 0xc3, 0x84, 0xdc, 0x87, 0x67, 0x51, 0x07,
+	0x5c, 0x2c, 0xd3, 0xc7, 0x74, 0xfa, 0x9c, 0x86, 0xad, 0xe8, 0x12, 0x80, 0x39, 0xa1, 0x73, 0x3c,
+	0xa2, 0x93, 0x69, 0x1a, 0x06, 0x95, 0x7a, 0x4e, 0x16, 0x14, 0x53, 0xf2, 0x44, 0x52, 0x1a, 0xb6,
+	0x87, 0x3f, 0x2d, 0xd0, 0xdf, 0xe8, 0x02, 0xfe, 0x5b, 0x7f, 0xd8, 0x6b, 0x3a, 0x3f, 0xab, 0xfa,
+	0xcf, 0x5a, 0xaf, 0xc3, 0x3f, 0xbf, 0xd4, 0x5b, 0xa6, 0x24, 0xd4, 0x3b, 0x19, 0x4b, 0xa1, 0xdc,
+	0xeb, 0x4e, 0x73, 0x96, 0xb9, 0x69, 0x58, 0xf7, 0xd6, 0x7d, 0x3f, 0x82, 0xf6, 0x18, 0xe3, 0xcf,
+	0xa0, 0x37, 0xf6, 0x51, 0x98, 0x1b, 0xe8, 0x61, 0x85, 0x56, 0x09, 0xac, 0xa6, 0x30, 0x5f, 0x27,
+	0x3e, 0xc3, 0xdc, 0x64, 0x35, 0x9f, 0xad, 0x92, 0xcc, 0xf1, 0xdf, 0x41, 0xdf, 0xff, 0x44, 0x08,
+	0x73, 0x83, 0x50, 0xad, 0x40, 0x68, 0x95, 0x20, 0xe4, 0x34, 0x6f, 0xe7, 0xae, 0x58, 0xf2, 0x1b,
+	0x00, 0x00, 0xff, 0xff, 0x7f, 0x19, 0xd8, 0x56, 0xf5, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/conversion_attribution_event_type.pb.go b/googleapis/ads/googleads/v3/enums/conversion_attribution_event_type.pb.go
new file mode 100644
index 0000000..5e017e1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/conversion_attribution_event_type.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/conversion_attribution_event_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The event type of conversions that are attributed to.
+type ConversionAttributionEventTypeEnum_ConversionAttributionEventType int32
+
+const (
+	// Not specified.
+	ConversionAttributionEventTypeEnum_UNSPECIFIED ConversionAttributionEventTypeEnum_ConversionAttributionEventType = 0
+	// Represents value unknown in this version.
+	ConversionAttributionEventTypeEnum_UNKNOWN ConversionAttributionEventTypeEnum_ConversionAttributionEventType = 1
+	// The conversion is attributed to an impression.
+	ConversionAttributionEventTypeEnum_IMPRESSION ConversionAttributionEventTypeEnum_ConversionAttributionEventType = 2
+	// The conversion is attributed to an interaction.
+	ConversionAttributionEventTypeEnum_INTERACTION ConversionAttributionEventTypeEnum_ConversionAttributionEventType = 3
+)
+
+var ConversionAttributionEventTypeEnum_ConversionAttributionEventType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "IMPRESSION",
+	3: "INTERACTION",
+}
+
+var ConversionAttributionEventTypeEnum_ConversionAttributionEventType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"IMPRESSION":  2,
+	"INTERACTION": 3,
+}
+
+func (x ConversionAttributionEventTypeEnum_ConversionAttributionEventType) String() string {
+	return proto.EnumName(ConversionAttributionEventTypeEnum_ConversionAttributionEventType_name, int32(x))
+}
+
+func (ConversionAttributionEventTypeEnum_ConversionAttributionEventType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_658026e096ee40da, []int{0, 0}
+}
+
+// Container for enum indicating the event type the conversion is attributed to.
+type ConversionAttributionEventTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionAttributionEventTypeEnum) Reset()         { *m = ConversionAttributionEventTypeEnum{} }
+func (m *ConversionAttributionEventTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionAttributionEventTypeEnum) ProtoMessage()    {}
+func (*ConversionAttributionEventTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_658026e096ee40da, []int{0}
+}
+
+func (m *ConversionAttributionEventTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionAttributionEventTypeEnum.Unmarshal(m, b)
+}
+func (m *ConversionAttributionEventTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionAttributionEventTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionAttributionEventTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionAttributionEventTypeEnum.Merge(m, src)
+}
+func (m *ConversionAttributionEventTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionAttributionEventTypeEnum.Size(m)
+}
+func (m *ConversionAttributionEventTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionAttributionEventTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionAttributionEventTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ConversionAttributionEventTypeEnum_ConversionAttributionEventType", ConversionAttributionEventTypeEnum_ConversionAttributionEventType_name, ConversionAttributionEventTypeEnum_ConversionAttributionEventType_value)
+	proto.RegisterType((*ConversionAttributionEventTypeEnum)(nil), "google.ads.googleads.v3.enums.ConversionAttributionEventTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/conversion_attribution_event_type.proto", fileDescriptor_658026e096ee40da)
+}
+
+var fileDescriptor_658026e096ee40da = []byte{
+	// 323 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4b, 0xc3, 0x30,
+	0x1c, 0xb5, 0x1d, 0x28, 0x64, 0xa0, 0xa3, 0x47, 0x71, 0xc2, 0xe6, 0x3d, 0x3d, 0xf4, 0x16, 0x4f,
+	0xd9, 0x8c, 0xa3, 0x88, 0x5d, 0xd9, 0x3f, 0x41, 0x0a, 0x23, 0x5b, 0x43, 0x28, 0x6c, 0x49, 0x69,
+	0xb2, 0xc2, 0x3e, 0x80, 0x5f, 0xc4, 0xa3, 0x1f, 0xc5, 0x8f, 0xe2, 0x27, 0xf0, 0x28, 0x49, 0x5c,
+	0x3d, 0xd9, 0x4b, 0x78, 0xe4, 0xf7, 0x7e, 0xef, 0xfd, 0xde, 0x03, 0x84, 0x4b, 0xc9, 0x77, 0x2c,
+	0xa4, 0xb9, 0x0a, 0x1d, 0x34, 0xa8, 0x8e, 0x42, 0x26, 0x0e, 0x7b, 0x15, 0x6e, 0xa5, 0xa8, 0x59,
+	0xa5, 0x0a, 0x29, 0xd6, 0x54, 0xeb, 0xaa, 0xd8, 0x1c, 0xb4, 0xc1, 0xac, 0x66, 0x42, 0xaf, 0xf5,
+	0xb1, 0x64, 0xb0, 0xac, 0xa4, 0x96, 0x41, 0xdf, 0xed, 0x42, 0x9a, 0x2b, 0xd8, 0xc8, 0xc0, 0x3a,
+	0x82, 0x56, 0xe6, 0xfa, 0xe6, 0xe4, 0x52, 0x16, 0x21, 0x15, 0x42, 0x6a, 0x6a, 0x64, 0x94, 0x5b,
+	0x1e, 0xbe, 0x79, 0x60, 0x38, 0x6e, 0x8c, 0xf0, 0x9f, 0x0f, 0x31, 0x36, 0x8b, 0x63, 0xc9, 0x88,
+	0x38, 0xec, 0x87, 0x6b, 0x70, 0xdb, 0xce, 0x0a, 0xae, 0x40, 0x77, 0x99, 0xcc, 0x53, 0x32, 0x8e,
+	0x1f, 0x63, 0xf2, 0xd0, 0x3b, 0x0b, 0xba, 0xe0, 0x62, 0x99, 0x3c, 0x25, 0xd3, 0x97, 0xa4, 0xe7,
+	0x05, 0x97, 0x00, 0xc4, 0xcf, 0xe9, 0x8c, 0xcc, 0xe7, 0xf1, 0x34, 0xe9, 0xf9, 0x86, 0x1d, 0x27,
+	0x0b, 0x32, 0xc3, 0xe3, 0x85, 0xf9, 0xe8, 0x8c, 0xbe, 0x3d, 0x30, 0xd8, 0xca, 0x3d, 0x6c, 0xcd,
+	0x32, 0xba, 0x6b, 0x3f, 0x22, 0x35, 0x91, 0x52, 0xef, 0x75, 0xf4, 0xab, 0xc2, 0xe5, 0x8e, 0x0a,
+	0x0e, 0x65, 0xc5, 0x43, 0xce, 0x84, 0x0d, 0x7c, 0x2a, 0xba, 0x2c, 0xd4, 0x3f, 0xbd, 0xdf, 0xdb,
+	0xf7, 0xdd, 0xef, 0x4c, 0x30, 0xfe, 0xf0, 0xfb, 0x13, 0x27, 0x85, 0x73, 0x05, 0x1d, 0x34, 0x68,
+	0x15, 0x41, 0x53, 0x8b, 0xfa, 0x3c, 0xcd, 0x33, 0x9c, 0xab, 0xac, 0x99, 0x67, 0xab, 0x28, 0xb3,
+	0xf3, 0x2f, 0x7f, 0xe0, 0x3e, 0x11, 0xc2, 0xb9, 0x42, 0xa8, 0x61, 0x20, 0xb4, 0x8a, 0x10, 0xb2,
+	0x9c, 0xcd, 0xb9, 0x3d, 0x2c, 0xfa, 0x09, 0x00, 0x00, 0xff, 0xff, 0xcb, 0xa5, 0x4d, 0xf5, 0x0f,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/conversion_lag_bucket.pb.go b/googleapis/ads/googleads/v3/enums/conversion_lag_bucket.pb.go
new file mode 100644
index 0000000..5199621
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/conversion_lag_bucket.pb.go
@@ -0,0 +1,222 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/conversion_lag_bucket.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum representing the number of days between impression and conversion.
+type ConversionLagBucketEnum_ConversionLagBucket int32
+
+const (
+	// Not specified.
+	ConversionLagBucketEnum_UNSPECIFIED ConversionLagBucketEnum_ConversionLagBucket = 0
+	// Used for return value only. Represents value unknown in this version.
+	ConversionLagBucketEnum_UNKNOWN ConversionLagBucketEnum_ConversionLagBucket = 1
+	// Conversion lag bucket from 0 to 1 day. 0 day is included, 1 day is not.
+	ConversionLagBucketEnum_LESS_THAN_ONE_DAY ConversionLagBucketEnum_ConversionLagBucket = 2
+	// Conversion lag bucket from 1 to 2 days. 1 day is included, 2 days is not.
+	ConversionLagBucketEnum_ONE_TO_TWO_DAYS ConversionLagBucketEnum_ConversionLagBucket = 3
+	// Conversion lag bucket from 2 to 3 days. 2 days is included,
+	// 3 days is not.
+	ConversionLagBucketEnum_TWO_TO_THREE_DAYS ConversionLagBucketEnum_ConversionLagBucket = 4
+	// Conversion lag bucket from 3 to 4 days. 3 days is included,
+	// 4 days is not.
+	ConversionLagBucketEnum_THREE_TO_FOUR_DAYS ConversionLagBucketEnum_ConversionLagBucket = 5
+	// Conversion lag bucket from 4 to 5 days. 4 days is included,
+	// 5 days is not.
+	ConversionLagBucketEnum_FOUR_TO_FIVE_DAYS ConversionLagBucketEnum_ConversionLagBucket = 6
+	// Conversion lag bucket from 5 to 6 days. 5 days is included,
+	// 6 days is not.
+	ConversionLagBucketEnum_FIVE_TO_SIX_DAYS ConversionLagBucketEnum_ConversionLagBucket = 7
+	// Conversion lag bucket from 6 to 7 days. 6 days is included,
+	// 7 days is not.
+	ConversionLagBucketEnum_SIX_TO_SEVEN_DAYS ConversionLagBucketEnum_ConversionLagBucket = 8
+	// Conversion lag bucket from 7 to 8 days. 7 days is included,
+	// 8 days is not.
+	ConversionLagBucketEnum_SEVEN_TO_EIGHT_DAYS ConversionLagBucketEnum_ConversionLagBucket = 9
+	// Conversion lag bucket from 8 to 9 days. 8 days is included,
+	// 9 days is not.
+	ConversionLagBucketEnum_EIGHT_TO_NINE_DAYS ConversionLagBucketEnum_ConversionLagBucket = 10
+	// Conversion lag bucket from 9 to 10 days. 9 days is included,
+	// 10 days is not.
+	ConversionLagBucketEnum_NINE_TO_TEN_DAYS ConversionLagBucketEnum_ConversionLagBucket = 11
+	// Conversion lag bucket from 10 to 11 days. 10 days is included,
+	// 11 days is not.
+	ConversionLagBucketEnum_TEN_TO_ELEVEN_DAYS ConversionLagBucketEnum_ConversionLagBucket = 12
+	// Conversion lag bucket from 11 to 12 days. 11 days is included,
+	// 12 days is not.
+	ConversionLagBucketEnum_ELEVEN_TO_TWELVE_DAYS ConversionLagBucketEnum_ConversionLagBucket = 13
+	// Conversion lag bucket from 12 to 13 days. 12 days is included,
+	// 13 days is not.
+	ConversionLagBucketEnum_TWELVE_TO_THIRTEEN_DAYS ConversionLagBucketEnum_ConversionLagBucket = 14
+	// Conversion lag bucket from 13 to 14 days. 13 days is included,
+	// 14 days is not.
+	ConversionLagBucketEnum_THIRTEEN_TO_FOURTEEN_DAYS ConversionLagBucketEnum_ConversionLagBucket = 15
+	// Conversion lag bucket from 14 to 21 days. 14 days is included,
+	// 21 days is not.
+	ConversionLagBucketEnum_FOURTEEN_TO_TWENTY_ONE_DAYS ConversionLagBucketEnum_ConversionLagBucket = 16
+	// Conversion lag bucket from 21 to 30 days. 21 days is included,
+	// 30 days is not.
+	ConversionLagBucketEnum_TWENTY_ONE_TO_THIRTY_DAYS ConversionLagBucketEnum_ConversionLagBucket = 17
+	// Conversion lag bucket from 30 to 45 days. 30 days is included,
+	// 45 days is not.
+	ConversionLagBucketEnum_THIRTY_TO_FORTY_FIVE_DAYS ConversionLagBucketEnum_ConversionLagBucket = 18
+	// Conversion lag bucket from 45 to 60 days. 45 days is included,
+	// 60 days is not.
+	ConversionLagBucketEnum_FORTY_FIVE_TO_SIXTY_DAYS ConversionLagBucketEnum_ConversionLagBucket = 19
+	// Conversion lag bucket from 60 to 90 days. 60 days is included,
+	// 90 days is not.
+	ConversionLagBucketEnum_SIXTY_TO_NINETY_DAYS ConversionLagBucketEnum_ConversionLagBucket = 20
+)
+
+var ConversionLagBucketEnum_ConversionLagBucket_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "LESS_THAN_ONE_DAY",
+	3:  "ONE_TO_TWO_DAYS",
+	4:  "TWO_TO_THREE_DAYS",
+	5:  "THREE_TO_FOUR_DAYS",
+	6:  "FOUR_TO_FIVE_DAYS",
+	7:  "FIVE_TO_SIX_DAYS",
+	8:  "SIX_TO_SEVEN_DAYS",
+	9:  "SEVEN_TO_EIGHT_DAYS",
+	10: "EIGHT_TO_NINE_DAYS",
+	11: "NINE_TO_TEN_DAYS",
+	12: "TEN_TO_ELEVEN_DAYS",
+	13: "ELEVEN_TO_TWELVE_DAYS",
+	14: "TWELVE_TO_THIRTEEN_DAYS",
+	15: "THIRTEEN_TO_FOURTEEN_DAYS",
+	16: "FOURTEEN_TO_TWENTY_ONE_DAYS",
+	17: "TWENTY_ONE_TO_THIRTY_DAYS",
+	18: "THIRTY_TO_FORTY_FIVE_DAYS",
+	19: "FORTY_FIVE_TO_SIXTY_DAYS",
+	20: "SIXTY_TO_NINETY_DAYS",
+}
+
+var ConversionLagBucketEnum_ConversionLagBucket_value = map[string]int32{
+	"UNSPECIFIED":                 0,
+	"UNKNOWN":                     1,
+	"LESS_THAN_ONE_DAY":           2,
+	"ONE_TO_TWO_DAYS":             3,
+	"TWO_TO_THREE_DAYS":           4,
+	"THREE_TO_FOUR_DAYS":          5,
+	"FOUR_TO_FIVE_DAYS":           6,
+	"FIVE_TO_SIX_DAYS":            7,
+	"SIX_TO_SEVEN_DAYS":           8,
+	"SEVEN_TO_EIGHT_DAYS":         9,
+	"EIGHT_TO_NINE_DAYS":          10,
+	"NINE_TO_TEN_DAYS":            11,
+	"TEN_TO_ELEVEN_DAYS":          12,
+	"ELEVEN_TO_TWELVE_DAYS":       13,
+	"TWELVE_TO_THIRTEEN_DAYS":     14,
+	"THIRTEEN_TO_FOURTEEN_DAYS":   15,
+	"FOURTEEN_TO_TWENTY_ONE_DAYS": 16,
+	"TWENTY_ONE_TO_THIRTY_DAYS":   17,
+	"THIRTY_TO_FORTY_FIVE_DAYS":   18,
+	"FORTY_FIVE_TO_SIXTY_DAYS":    19,
+	"SIXTY_TO_NINETY_DAYS":        20,
+}
+
+func (x ConversionLagBucketEnum_ConversionLagBucket) String() string {
+	return proto.EnumName(ConversionLagBucketEnum_ConversionLagBucket_name, int32(x))
+}
+
+func (ConversionLagBucketEnum_ConversionLagBucket) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a86fb4f47a5fd7c6, []int{0, 0}
+}
+
+// Container for enum representing the number of days between impression and
+// conversion.
+type ConversionLagBucketEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionLagBucketEnum) Reset()         { *m = ConversionLagBucketEnum{} }
+func (m *ConversionLagBucketEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionLagBucketEnum) ProtoMessage()    {}
+func (*ConversionLagBucketEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a86fb4f47a5fd7c6, []int{0}
+}
+
+func (m *ConversionLagBucketEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionLagBucketEnum.Unmarshal(m, b)
+}
+func (m *ConversionLagBucketEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionLagBucketEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionLagBucketEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionLagBucketEnum.Merge(m, src)
+}
+func (m *ConversionLagBucketEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionLagBucketEnum.Size(m)
+}
+func (m *ConversionLagBucketEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionLagBucketEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionLagBucketEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ConversionLagBucketEnum_ConversionLagBucket", ConversionLagBucketEnum_ConversionLagBucket_name, ConversionLagBucketEnum_ConversionLagBucket_value)
+	proto.RegisterType((*ConversionLagBucketEnum)(nil), "google.ads.googleads.v3.enums.ConversionLagBucketEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/conversion_lag_bucket.proto", fileDescriptor_a86fb4f47a5fd7c6)
+}
+
+var fileDescriptor_a86fb4f47a5fd7c6 = []byte{
+	// 512 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0xd1, 0x6e, 0xda, 0x30,
+	0x14, 0x86, 0x07, 0x65, 0xed, 0x66, 0xb6, 0x91, 0x1a, 0x3a, 0xe8, 0x5a, 0x34, 0xb5, 0x0f, 0x90,
+	0x5c, 0xe4, 0x6a, 0xd9, 0x55, 0x68, 0x5d, 0x88, 0x86, 0x1c, 0x44, 0x0c, 0x1d, 0x13, 0x92, 0x95,
+	0x42, 0x14, 0xa1, 0x41, 0x8c, 0x30, 0xf0, 0x3a, 0x93, 0x76, 0xb9, 0x57, 0xd8, 0x1b, 0xec, 0x51,
+	0x26, 0xed, 0x1d, 0x26, 0xfb, 0xc4, 0x61, 0x17, 0x5d, 0x6f, 0xa2, 0xf3, 0x7f, 0xe7, 0x9c, 0x3f,
+	0xf6, 0xd1, 0x31, 0xfa, 0x90, 0x0a, 0x91, 0x2e, 0x13, 0x27, 0x9e, 0x4b, 0x07, 0x42, 0x15, 0xed,
+	0x5d, 0x27, 0xc9, 0x76, 0x2b, 0xe9, 0xcc, 0x44, 0xb6, 0x4f, 0x36, 0x72, 0x21, 0x32, 0xbe, 0x8c,
+	0x53, 0xfe, 0xb0, 0x9b, 0x7d, 0x4d, 0xb6, 0xf6, 0x7a, 0x23, 0xb6, 0x02, 0xb7, 0xa1, 0xde, 0x8e,
+	0xe7, 0xd2, 0x2e, 0x5a, 0xed, 0xbd, 0x6b, 0xeb, 0xd6, 0x77, 0x97, 0xc6, 0x79, 0xbd, 0x70, 0xe2,
+	0x2c, 0x13, 0xdb, 0x78, 0xbb, 0x10, 0x99, 0x84, 0xe6, 0xeb, 0x9f, 0x15, 0xd4, 0xbc, 0x29, 0xcc,
+	0xfb, 0x71, 0xda, 0xd1, 0xd6, 0x24, 0xdb, 0xad, 0xae, 0xbf, 0x55, 0x50, 0xfd, 0x91, 0x1c, 0xae,
+	0xa1, 0xea, 0x88, 0x46, 0x03, 0x72, 0x13, 0xdc, 0x05, 0xe4, 0xd6, 0x7a, 0x86, 0xab, 0xe8, 0x64,
+	0x44, 0x3f, 0xd1, 0xf0, 0x9e, 0x5a, 0x25, 0x7c, 0x86, 0x4e, 0xfb, 0x24, 0x8a, 0x38, 0xeb, 0xf9,
+	0x94, 0x87, 0x94, 0xf0, 0x5b, 0x7f, 0x62, 0x95, 0x71, 0x1d, 0xd5, 0x94, 0x60, 0x21, 0x67, 0xf7,
+	0xa1, 0x62, 0x91, 0x75, 0xa4, 0x6a, 0x95, 0x52, 0xb0, 0x37, 0x24, 0x04, 0x70, 0x05, 0xbf, 0x45,
+	0x18, 0x34, 0x0b, 0xf9, 0x5d, 0x38, 0x1a, 0x02, 0x7f, 0xae, 0xca, 0xb5, 0x54, 0x38, 0x18, 0xe7,
+	0xe5, 0xc7, 0xb8, 0x81, 0x2c, 0x2d, 0x59, 0xc8, 0xa3, 0xe0, 0x33, 0xd0, 0x13, 0x55, 0xac, 0x94,
+	0x82, 0x64, 0x4c, 0x28, 0xe0, 0x17, 0xb8, 0x89, 0xea, 0xa0, 0x59, 0xc8, 0x49, 0xd0, 0xed, 0x31,
+	0x48, 0xbc, 0x54, 0x3f, 0x05, 0xcd, 0x42, 0x4e, 0x03, 0x9a, 0xbb, 0x23, 0xe5, 0xae, 0xa5, 0x3a,
+	0xa4, 0xb1, 0xa9, 0xea, 0x23, 0xe6, 0x26, 0xfd, 0x83, 0xfd, 0x2b, 0x7c, 0x8e, 0xce, 0x72, 0xa0,
+	0x6f, 0x4a, 0xfa, 0xe6, 0x98, 0xaf, 0xf1, 0x05, 0x6a, 0xe6, 0x40, 0xdf, 0x37, 0x18, 0x32, 0x62,
+	0xfa, 0xde, 0xe0, 0x36, 0x3a, 0x2f, 0x50, 0x7e, 0xeb, 0x43, 0xba, 0x86, 0xdf, 0xa3, 0x8b, 0x02,
+	0x81, 0x31, 0x65, 0x13, 0x33, 0xdd, 0xc8, 0xb2, 0x74, 0xff, 0x01, 0x9a, 0x1f, 0x4c, 0x20, 0x7d,
+	0x5a, 0xd8, 0x4f, 0xc0, 0x5c, 0x05, 0x87, 0x09, 0x62, 0x7c, 0x89, 0x5a, 0xff, 0x40, 0x98, 0xa3,
+	0x69, 0xae, 0xe3, 0x16, 0x6a, 0x80, 0xce, 0x27, 0x63, 0x32, 0x8d, 0xce, 0x9f, 0x12, 0xba, 0x9a,
+	0x89, 0x95, 0xfd, 0xe4, 0x06, 0x76, 0x5a, 0x8f, 0x2c, 0xd1, 0x40, 0x6d, 0xdf, 0xa0, 0xf4, 0xa5,
+	0x93, 0xb7, 0xa6, 0x62, 0x19, 0x67, 0xa9, 0x2d, 0x36, 0xa9, 0x93, 0x26, 0x99, 0xde, 0x4d, 0xf3,
+	0x0e, 0xd6, 0x0b, 0xf9, 0x9f, 0x67, 0xf1, 0x51, 0x7f, 0xbf, 0x97, 0x8f, 0xba, 0xbe, 0xff, 0xa3,
+	0xdc, 0xee, 0x82, 0x95, 0x3f, 0x97, 0x36, 0x84, 0x2a, 0x1a, 0xbb, 0xb6, 0x5a, 0x66, 0xf9, 0xcb,
+	0xe4, 0xa7, 0xfe, 0x5c, 0x4e, 0x8b, 0xfc, 0x74, 0xec, 0x4e, 0x75, 0xfe, 0x77, 0xf9, 0x0a, 0xa0,
+	0xe7, 0xf9, 0x73, 0xe9, 0x79, 0x45, 0x85, 0xe7, 0x8d, 0x5d, 0xcf, 0xd3, 0x35, 0x0f, 0xc7, 0xfa,
+	0x60, 0xee, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x70, 0xd9, 0x61, 0xcb, 0xae, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/conversion_or_adjustment_lag_bucket.pb.go b/googleapis/ads/googleads/v3/enums/conversion_or_adjustment_lag_bucket.pb.go
new file mode 100644
index 0000000..34c4b19
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/conversion_or_adjustment_lag_bucket.pb.go
@@ -0,0 +1,348 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/conversion_or_adjustment_lag_bucket.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum representing the number of days between the impression and the
+// conversion or between the impression and adjustments to the conversion.
+type ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket int32
+
+const (
+	// Not specified.
+	ConversionOrAdjustmentLagBucketEnum_UNSPECIFIED ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 0
+	// Used for return value only. Represents value unknown in this version.
+	ConversionOrAdjustmentLagBucketEnum_UNKNOWN ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 1
+	// Conversion lag bucket from 0 to 1 day. 0 day is included, 1 day is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_LESS_THAN_ONE_DAY ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 2
+	// Conversion lag bucket from 1 to 2 days. 1 day is included, 2 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_ONE_TO_TWO_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 3
+	// Conversion lag bucket from 2 to 3 days. 2 days is included,
+	// 3 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_TWO_TO_THREE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 4
+	// Conversion lag bucket from 3 to 4 days. 3 days is included,
+	// 4 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_THREE_TO_FOUR_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 5
+	// Conversion lag bucket from 4 to 5 days. 4 days is included,
+	// 5 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_FOUR_TO_FIVE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 6
+	// Conversion lag bucket from 5 to 6 days. 5 days is included,
+	// 6 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_FIVE_TO_SIX_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 7
+	// Conversion lag bucket from 6 to 7 days. 6 days is included,
+	// 7 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_SIX_TO_SEVEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 8
+	// Conversion lag bucket from 7 to 8 days. 7 days is included,
+	// 8 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_SEVEN_TO_EIGHT_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 9
+	// Conversion lag bucket from 8 to 9 days. 8 days is included,
+	// 9 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_EIGHT_TO_NINE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 10
+	// Conversion lag bucket from 9 to 10 days. 9 days is included,
+	// 10 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_NINE_TO_TEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 11
+	// Conversion lag bucket from 10 to 11 days. 10 days is included,
+	// 11 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_TEN_TO_ELEVEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 12
+	// Conversion lag bucket from 11 to 12 days. 11 days is included,
+	// 12 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_ELEVEN_TO_TWELVE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 13
+	// Conversion lag bucket from 12 to 13 days. 12 days is included,
+	// 13 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_TWELVE_TO_THIRTEEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 14
+	// Conversion lag bucket from 13 to 14 days. 13 days is included,
+	// 14 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_THIRTEEN_TO_FOURTEEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 15
+	// Conversion lag bucket from 14 to 21 days. 14 days is included,
+	// 21 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_FOURTEEN_TO_TWENTY_ONE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 16
+	// Conversion lag bucket from 21 to 30 days. 21 days is included,
+	// 30 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_TWENTY_ONE_TO_THIRTY_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 17
+	// Conversion lag bucket from 30 to 45 days. 30 days is included,
+	// 45 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_THIRTY_TO_FORTY_FIVE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 18
+	// Conversion lag bucket from 45 to 60 days. 45 days is included,
+	// 60 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_FORTY_FIVE_TO_SIXTY_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 19
+	// Conversion lag bucket from 60 to 90 days. 60 days is included,
+	// 90 days is not.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_SIXTY_TO_NINETY_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 20
+	// Conversion adjustment lag bucket from 0 to 1 day. 0 day is included,
+	// 1 day is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_LESS_THAN_ONE_DAY ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 21
+	// Conversion adjustment lag bucket from 1 to 2 days. 1 day is included,
+	// 2 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_ONE_TO_TWO_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 22
+	// Conversion adjustment lag bucket from 2 to 3 days. 2 days is included,
+	// 3 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_TWO_TO_THREE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 23
+	// Conversion adjustment lag bucket from 3 to 4 days. 3 days is included,
+	// 4 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_THREE_TO_FOUR_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 24
+	// Conversion adjustment lag bucket from 4 to 5 days. 4 days is included,
+	// 5 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_FOUR_TO_FIVE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 25
+	// Conversion adjustment lag bucket from 5 to 6 days. 5 days is included,
+	// 6 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_FIVE_TO_SIX_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 26
+	// Conversion adjustment lag bucket from 6 to 7 days. 6 days is included,
+	// 7 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_SIX_TO_SEVEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 27
+	// Conversion adjustment lag bucket from 7 to 8 days. 7 days is included,
+	// 8 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_SEVEN_TO_EIGHT_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 28
+	// Conversion adjustment lag bucket from 8 to 9 days. 8 days is included,
+	// 9 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_EIGHT_TO_NINE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 29
+	// Conversion adjustment lag bucket from 9 to 10 days. 9 days is included,
+	// 10 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_NINE_TO_TEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 30
+	// Conversion adjustment lag bucket from 10 to 11 days. 10 days is included,
+	// 11 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_TEN_TO_ELEVEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 31
+	// Conversion adjustment lag bucket from 11 to 12 days. 11 days is included,
+	// 12 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_ELEVEN_TO_TWELVE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 32
+	// Conversion adjustment lag bucket from 12 to 13 days. 12 days is included,
+	// 13 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_TWELVE_TO_THIRTEEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 33
+	// Conversion adjustment lag bucket from 13 to 14 days. 13 days is included,
+	// 14 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_THIRTEEN_TO_FOURTEEN_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 34
+	// Conversion adjustment lag bucket from 14 to 21 days. 14 days is included,
+	// 21 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_FOURTEEN_TO_TWENTY_ONE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 35
+	// Conversion adjustment lag bucket from 21 to 30 days. 21 days is included,
+	// 30 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_TWENTY_ONE_TO_THIRTY_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 36
+	// Conversion adjustment lag bucket from 30 to 45 days. 30 days is included,
+	// 45 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_THIRTY_TO_FORTY_FIVE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 37
+	// Conversion adjustment lag bucket from 45 to 60 days. 45 days is included,
+	// 60 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_FORTY_FIVE_TO_SIXTY_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 38
+	// Conversion adjustment lag bucket from 60 to 90 days. 60 days is included,
+	// 90 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_SIXTY_TO_NINETY_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 39
+	// Conversion adjustment lag bucket from 90 to 145 days. 90 days is
+	// included, 145 days is not.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_NINETY_TO_ONE_HUNDRED_AND_FORTY_FIVE_DAYS ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 40
+	// Conversion lag bucket UNKNOWN. This is for dates before conversion lag
+	// bucket was available in Google Ads.
+	ConversionOrAdjustmentLagBucketEnum_CONVERSION_UNKNOWN ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 41
+	// Conversion adjustment lag bucket UNKNOWN. This is for dates before
+	// conversion adjustment lag bucket was available in Google Ads.
+	ConversionOrAdjustmentLagBucketEnum_ADJUSTMENT_UNKNOWN ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket = 42
+)
+
+var ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "CONVERSION_LESS_THAN_ONE_DAY",
+	3:  "CONVERSION_ONE_TO_TWO_DAYS",
+	4:  "CONVERSION_TWO_TO_THREE_DAYS",
+	5:  "CONVERSION_THREE_TO_FOUR_DAYS",
+	6:  "CONVERSION_FOUR_TO_FIVE_DAYS",
+	7:  "CONVERSION_FIVE_TO_SIX_DAYS",
+	8:  "CONVERSION_SIX_TO_SEVEN_DAYS",
+	9:  "CONVERSION_SEVEN_TO_EIGHT_DAYS",
+	10: "CONVERSION_EIGHT_TO_NINE_DAYS",
+	11: "CONVERSION_NINE_TO_TEN_DAYS",
+	12: "CONVERSION_TEN_TO_ELEVEN_DAYS",
+	13: "CONVERSION_ELEVEN_TO_TWELVE_DAYS",
+	14: "CONVERSION_TWELVE_TO_THIRTEEN_DAYS",
+	15: "CONVERSION_THIRTEEN_TO_FOURTEEN_DAYS",
+	16: "CONVERSION_FOURTEEN_TO_TWENTY_ONE_DAYS",
+	17: "CONVERSION_TWENTY_ONE_TO_THIRTY_DAYS",
+	18: "CONVERSION_THIRTY_TO_FORTY_FIVE_DAYS",
+	19: "CONVERSION_FORTY_FIVE_TO_SIXTY_DAYS",
+	20: "CONVERSION_SIXTY_TO_NINETY_DAYS",
+	21: "ADJUSTMENT_LESS_THAN_ONE_DAY",
+	22: "ADJUSTMENT_ONE_TO_TWO_DAYS",
+	23: "ADJUSTMENT_TWO_TO_THREE_DAYS",
+	24: "ADJUSTMENT_THREE_TO_FOUR_DAYS",
+	25: "ADJUSTMENT_FOUR_TO_FIVE_DAYS",
+	26: "ADJUSTMENT_FIVE_TO_SIX_DAYS",
+	27: "ADJUSTMENT_SIX_TO_SEVEN_DAYS",
+	28: "ADJUSTMENT_SEVEN_TO_EIGHT_DAYS",
+	29: "ADJUSTMENT_EIGHT_TO_NINE_DAYS",
+	30: "ADJUSTMENT_NINE_TO_TEN_DAYS",
+	31: "ADJUSTMENT_TEN_TO_ELEVEN_DAYS",
+	32: "ADJUSTMENT_ELEVEN_TO_TWELVE_DAYS",
+	33: "ADJUSTMENT_TWELVE_TO_THIRTEEN_DAYS",
+	34: "ADJUSTMENT_THIRTEEN_TO_FOURTEEN_DAYS",
+	35: "ADJUSTMENT_FOURTEEN_TO_TWENTY_ONE_DAYS",
+	36: "ADJUSTMENT_TWENTY_ONE_TO_THIRTY_DAYS",
+	37: "ADJUSTMENT_THIRTY_TO_FORTY_FIVE_DAYS",
+	38: "ADJUSTMENT_FORTY_FIVE_TO_SIXTY_DAYS",
+	39: "ADJUSTMENT_SIXTY_TO_NINETY_DAYS",
+	40: "ADJUSTMENT_NINETY_TO_ONE_HUNDRED_AND_FORTY_FIVE_DAYS",
+	41: "CONVERSION_UNKNOWN",
+	42: "ADJUSTMENT_UNKNOWN",
+}
+
+var ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket_value = map[string]int32{
+	"UNSPECIFIED":                                          0,
+	"UNKNOWN":                                              1,
+	"CONVERSION_LESS_THAN_ONE_DAY":                         2,
+	"CONVERSION_ONE_TO_TWO_DAYS":                           3,
+	"CONVERSION_TWO_TO_THREE_DAYS":                         4,
+	"CONVERSION_THREE_TO_FOUR_DAYS":                        5,
+	"CONVERSION_FOUR_TO_FIVE_DAYS":                         6,
+	"CONVERSION_FIVE_TO_SIX_DAYS":                          7,
+	"CONVERSION_SIX_TO_SEVEN_DAYS":                         8,
+	"CONVERSION_SEVEN_TO_EIGHT_DAYS":                       9,
+	"CONVERSION_EIGHT_TO_NINE_DAYS":                        10,
+	"CONVERSION_NINE_TO_TEN_DAYS":                          11,
+	"CONVERSION_TEN_TO_ELEVEN_DAYS":                        12,
+	"CONVERSION_ELEVEN_TO_TWELVE_DAYS":                     13,
+	"CONVERSION_TWELVE_TO_THIRTEEN_DAYS":                   14,
+	"CONVERSION_THIRTEEN_TO_FOURTEEN_DAYS":                 15,
+	"CONVERSION_FOURTEEN_TO_TWENTY_ONE_DAYS":               16,
+	"CONVERSION_TWENTY_ONE_TO_THIRTY_DAYS":                 17,
+	"CONVERSION_THIRTY_TO_FORTY_FIVE_DAYS":                 18,
+	"CONVERSION_FORTY_FIVE_TO_SIXTY_DAYS":                  19,
+	"CONVERSION_SIXTY_TO_NINETY_DAYS":                      20,
+	"ADJUSTMENT_LESS_THAN_ONE_DAY":                         21,
+	"ADJUSTMENT_ONE_TO_TWO_DAYS":                           22,
+	"ADJUSTMENT_TWO_TO_THREE_DAYS":                         23,
+	"ADJUSTMENT_THREE_TO_FOUR_DAYS":                        24,
+	"ADJUSTMENT_FOUR_TO_FIVE_DAYS":                         25,
+	"ADJUSTMENT_FIVE_TO_SIX_DAYS":                          26,
+	"ADJUSTMENT_SIX_TO_SEVEN_DAYS":                         27,
+	"ADJUSTMENT_SEVEN_TO_EIGHT_DAYS":                       28,
+	"ADJUSTMENT_EIGHT_TO_NINE_DAYS":                        29,
+	"ADJUSTMENT_NINE_TO_TEN_DAYS":                          30,
+	"ADJUSTMENT_TEN_TO_ELEVEN_DAYS":                        31,
+	"ADJUSTMENT_ELEVEN_TO_TWELVE_DAYS":                     32,
+	"ADJUSTMENT_TWELVE_TO_THIRTEEN_DAYS":                   33,
+	"ADJUSTMENT_THIRTEEN_TO_FOURTEEN_DAYS":                 34,
+	"ADJUSTMENT_FOURTEEN_TO_TWENTY_ONE_DAYS":               35,
+	"ADJUSTMENT_TWENTY_ONE_TO_THIRTY_DAYS":                 36,
+	"ADJUSTMENT_THIRTY_TO_FORTY_FIVE_DAYS":                 37,
+	"ADJUSTMENT_FORTY_FIVE_TO_SIXTY_DAYS":                  38,
+	"ADJUSTMENT_SIXTY_TO_NINETY_DAYS":                      39,
+	"ADJUSTMENT_NINETY_TO_ONE_HUNDRED_AND_FORTY_FIVE_DAYS": 40,
+	"CONVERSION_UNKNOWN":                                   41,
+	"ADJUSTMENT_UNKNOWN":                                   42,
+}
+
+func (x ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket) String() string {
+	return proto.EnumName(ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket_name, int32(x))
+}
+
+func (ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_bd532e766f172d26, []int{0, 0}
+}
+
+// Container for enum representing the number of days between the impression and
+// the conversion or between the impression and adjustments to the conversion.
+type ConversionOrAdjustmentLagBucketEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionOrAdjustmentLagBucketEnum) Reset()         { *m = ConversionOrAdjustmentLagBucketEnum{} }
+func (m *ConversionOrAdjustmentLagBucketEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionOrAdjustmentLagBucketEnum) ProtoMessage()    {}
+func (*ConversionOrAdjustmentLagBucketEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bd532e766f172d26, []int{0}
+}
+
+func (m *ConversionOrAdjustmentLagBucketEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionOrAdjustmentLagBucketEnum.Unmarshal(m, b)
+}
+func (m *ConversionOrAdjustmentLagBucketEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionOrAdjustmentLagBucketEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionOrAdjustmentLagBucketEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionOrAdjustmentLagBucketEnum.Merge(m, src)
+}
+func (m *ConversionOrAdjustmentLagBucketEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionOrAdjustmentLagBucketEnum.Size(m)
+}
+func (m *ConversionOrAdjustmentLagBucketEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionOrAdjustmentLagBucketEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionOrAdjustmentLagBucketEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket", ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket_name, ConversionOrAdjustmentLagBucketEnum_ConversionOrAdjustmentLagBucket_value)
+	proto.RegisterType((*ConversionOrAdjustmentLagBucketEnum)(nil), "google.ads.googleads.v3.enums.ConversionOrAdjustmentLagBucketEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/conversion_or_adjustment_lag_bucket.proto", fileDescriptor_bd532e766f172d26)
+}
+
+var fileDescriptor_bd532e766f172d26 = []byte{
+	// 741 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x95, 0x5f, 0x73, 0xd2, 0x4c,
+	0x14, 0xc6, 0xdf, 0xd2, 0xd7, 0x56, 0xb7, 0xd5, 0xe2, 0xaa, 0x55, 0xdb, 0x52, 0xca, 0x1f, 0xdb,
+	0xda, 0x8b, 0x70, 0x81, 0x17, 0x4e, 0xbc, 0x0a, 0x65, 0x0b, 0x51, 0xdc, 0x74, 0x48, 0x00, 0x71,
+	0x98, 0xd9, 0x49, 0x0b, 0x93, 0x41, 0x4b, 0xd2, 0x21, 0xc0, 0x07, 0xd2, 0x3b, 0x3f, 0x8a, 0x7e,
+	0x13, 0xbf, 0x81, 0x77, 0xce, 0xc9, 0xb2, 0x90, 0x6c, 0x82, 0xbd, 0xe9, 0xec, 0xe4, 0x79, 0xf2,
+	0x9c, 0x93, 0x73, 0x7e, 0x65, 0x51, 0xcd, 0xf1, 0x3c, 0xe7, 0x66, 0x50, 0xb2, 0xfb, 0x7e, 0x89,
+	0x1f, 0xe1, 0x34, 0x2b, 0x97, 0x06, 0xee, 0x74, 0xe4, 0x97, 0xae, 0x3d, 0x77, 0x36, 0x18, 0xfb,
+	0x43, 0xcf, 0x65, 0xde, 0x98, 0xd9, 0xfd, 0x2f, 0x53, 0x7f, 0x32, 0x1a, 0xb8, 0x13, 0x76, 0x63,
+	0x3b, 0xec, 0x6a, 0x7a, 0xfd, 0x75, 0x30, 0x51, 0x6e, 0xc7, 0xde, 0xc4, 0xc3, 0x19, 0xfe, 0xb6,
+	0x62, 0xf7, 0x7d, 0x65, 0x11, 0xa4, 0xcc, 0xca, 0x4a, 0x10, 0xb4, 0x77, 0x20, 0xea, 0xdc, 0x0e,
+	0x4b, 0xb6, 0xeb, 0x7a, 0x13, 0x7b, 0x32, 0xf4, 0x5c, 0x9f, 0xbf, 0x9c, 0xff, 0xb5, 0x8d, 0x0a,
+	0xe7, 0x8b, 0x52, 0xc6, 0x58, 0x5b, 0x14, 0x6a, 0xd8, 0x4e, 0x25, 0x28, 0x43, 0xdc, 0xe9, 0x28,
+	0xff, 0x7d, 0x1b, 0x65, 0xef, 0xf0, 0xe1, 0x1d, 0xb4, 0xd5, 0xa2, 0xe6, 0x25, 0x39, 0xd7, 0x2f,
+	0x74, 0x52, 0x4d, 0xff, 0x87, 0xb7, 0xd0, 0x66, 0x8b, 0x7e, 0xa0, 0x46, 0x87, 0xa6, 0xd7, 0xf0,
+	0x11, 0x3a, 0x38, 0x37, 0x68, 0x9b, 0x34, 0x4d, 0xdd, 0xa0, 0xac, 0x41, 0x4c, 0x93, 0x59, 0x75,
+	0x8d, 0x32, 0x83, 0x12, 0x56, 0xd5, 0xba, 0xe9, 0x14, 0x3e, 0x44, 0x7b, 0x21, 0x07, 0x3c, 0xb7,
+	0x0c, 0x66, 0x75, 0x0c, 0x90, 0xcd, 0xf4, 0xba, 0x94, 0x00, 0x02, 0xe8, 0xf5, 0x26, 0x21, 0xdc,
+	0xf1, 0x3f, 0xce, 0xa1, 0x4c, 0xd8, 0x11, 0x48, 0x96, 0xc1, 0x2e, 0x8c, 0x56, 0x93, 0x5b, 0xee,
+	0x49, 0x21, 0x81, 0x02, 0x0e, 0xbd, 0x3d, 0x0f, 0xd9, 0xc0, 0x59, 0xb4, 0x1f, 0x76, 0x80, 0x62,
+	0x19, 0xcc, 0xd4, 0x3f, 0x71, 0xc3, 0xa6, 0x14, 0x01, 0x02, 0xe8, 0xa4, 0x4d, 0x28, 0x77, 0xdc,
+	0xc7, 0x79, 0x74, 0x18, 0x76, 0x04, 0x92, 0x65, 0x30, 0xa2, 0xd7, 0xea, 0x16, 0xf7, 0x3c, 0x90,
+	0x7a, 0xe5, 0x92, 0x65, 0x30, 0xaa, 0xd3, 0x79, 0x27, 0x48, 0xea, 0x24, 0x50, 0xe0, 0x8b, 0x45,
+	0x9d, 0x2d, 0xf9, 0x7b, 0xe7, 0x55, 0x1a, 0xcb, 0x56, 0xb6, 0x71, 0x11, 0x1d, 0x85, 0xcb, 0x34,
+	0x44, 0x2f, 0x56, 0x87, 0x34, 0xc4, 0x37, 0x3f, 0xc4, 0xc7, 0x28, 0x1f, 0x19, 0x6d, 0xa0, 0x05,
+	0xd3, 0xd5, 0x9b, 0x16, 0x11, 0x69, 0x8f, 0xf0, 0x29, 0x2a, 0x46, 0x06, 0x3c, 0x57, 0xe7, 0x33,
+	0x5e, 0x3a, 0x77, 0xf0, 0x19, 0x3a, 0x96, 0xe6, 0x2c, 0x9c, 0x56, 0x87, 0x50, 0xab, 0x2b, 0xf6,
+	0x6e, 0xa6, 0xd3, 0x72, 0xea, 0x52, 0x17, 0x1d, 0x74, 0xb9, 0xf3, 0x71, 0x52, 0xfd, 0x2e, 0xaf,
+	0x0e, 0x87, 0xe5, 0x16, 0x31, 0x3e, 0x41, 0x85, 0x48, 0xfd, 0x85, 0xce, 0x77, 0x29, 0x22, 0x9f,
+	0xe0, 0x02, 0xca, 0x46, 0xb7, 0xc9, 0x13, 0x61, 0xda, 0xc2, 0xf4, 0x14, 0x56, 0xae, 0x55, 0xdf,
+	0xb7, 0x4c, 0xeb, 0x23, 0xa1, 0x56, 0x02, 0xbc, 0xcf, 0x00, 0xde, 0x90, 0x43, 0x86, 0x77, 0x57,
+	0x4a, 0x88, 0xc3, 0xfb, 0x1c, 0x96, 0x19, 0x76, 0xc4, 0xe1, 0x7d, 0x21, 0x85, 0xc4, 0xe1, 0x7d,
+	0x09, 0xc8, 0x84, 0x1d, 0x32, 0xbc, 0x7b, 0x52, 0x44, 0x1c, 0xde, 0x7d, 0x80, 0x37, 0xec, 0x48,
+	0x80, 0xf7, 0x40, 0xea, 0x35, 0x01, 0xde, 0x8c, 0xd4, 0x49, 0x0c, 0xde, 0x43, 0xf9, 0x7b, 0xe3,
+	0xf0, 0x66, 0x01, 0xde, 0x70, 0x99, 0x44, 0x78, 0x8f, 0x00, 0xde, 0xc8, 0x68, 0x93, 0xe1, 0xcd,
+	0x01, 0x3c, 0x91, 0x01, 0xaf, 0x82, 0x37, 0x0f, 0xf0, 0x4a, 0x73, 0x5e, 0x05, 0x6f, 0x41, 0x4e,
+	0x5d, 0x09, 0x6f, 0x31, 0xa9, 0x7e, 0x22, 0xbc, 0xaf, 0x00, 0xde, 0x48, 0xfd, 0x15, 0xf0, 0x1e,
+	0x03, 0xbc, 0xd1, 0x6d, 0xc6, 0xe1, 0x3d, 0xc1, 0x6f, 0xd1, 0x1b, 0x69, 0x13, 0xdc, 0x05, 0x4d,
+	0xd6, 0x5b, 0xb4, 0xda, 0x24, 0x55, 0xa6, 0xd1, 0x6a, 0xac, 0x8f, 0x53, 0xbc, 0x8b, 0x70, 0xe8,
+	0x7f, 0x43, 0xfc, 0x96, 0xbf, 0x86, 0xe7, 0xa1, 0x44, 0xf1, 0xfc, 0xac, 0xf2, 0x67, 0x0d, 0xe5,
+	0xae, 0xbd, 0x91, 0xf2, 0xcf, 0x1b, 0xa9, 0x52, 0xbc, 0xe3, 0x22, 0xb9, 0x84, 0x9b, 0xe9, 0x72,
+	0xed, 0x73, 0x65, 0x1e, 0xe3, 0x78, 0x37, 0xb6, 0xeb, 0x28, 0xde, 0xd8, 0x29, 0x39, 0x03, 0x37,
+	0xb8, 0xb7, 0xc4, 0x8d, 0x79, 0x3b, 0xf4, 0x57, 0x5c, 0xa0, 0xef, 0x82, 0xbf, 0xdf, 0x52, 0xeb,
+	0x35, 0x4d, 0xfb, 0x91, 0xca, 0xd4, 0x78, 0x94, 0xd6, 0xf7, 0x15, 0x7e, 0x84, 0x53, 0xbb, 0xac,
+	0xc0, 0xe5, 0xe6, 0xff, 0x14, 0x7a, 0x4f, 0xeb, 0xfb, 0xbd, 0x85, 0xde, 0x6b, 0x97, 0x7b, 0x81,
+	0xfe, 0x3b, 0x95, 0xe3, 0x0f, 0x55, 0x55, 0xeb, 0xfb, 0xaa, 0xba, 0x70, 0xa8, 0x6a, 0xbb, 0xac,
+	0xaa, 0x81, 0xe7, 0x6a, 0x23, 0x68, 0xac, 0xfc, 0x37, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x42, 0x10,
+	0x80, 0xd8, 0x07, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/criterion_category_channel_availability_mode.pb.go b/googleapis/ads/googleads/v3/enums/criterion_category_channel_availability_mode.pb.go
new file mode 100644
index 0000000..7fc0617
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/criterion_category_channel_availability_mode.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/criterion_category_channel_availability_mode.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing the possible CriterionCategoryChannelAvailabilityMode.
+type CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode int32
+
+const (
+	// Not specified.
+	CriterionCategoryChannelAvailabilityModeEnum_UNSPECIFIED CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 0
+	// Used for return value only. Represents value unknown in this version.
+	CriterionCategoryChannelAvailabilityModeEnum_UNKNOWN CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 1
+	// The category is available to campaigns of all channel types and subtypes.
+	CriterionCategoryChannelAvailabilityModeEnum_ALL_CHANNELS CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 2
+	// The category is available to campaigns of a specific channel type,
+	// including all subtypes under it.
+	CriterionCategoryChannelAvailabilityModeEnum_CHANNEL_TYPE_AND_ALL_SUBTYPES CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 3
+	// The category is available to campaigns of a specific channel type and
+	// subtype(s).
+	CriterionCategoryChannelAvailabilityModeEnum_CHANNEL_TYPE_AND_SUBSET_SUBTYPES CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 4
+)
+
+var CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ALL_CHANNELS",
+	3: "CHANNEL_TYPE_AND_ALL_SUBTYPES",
+	4: "CHANNEL_TYPE_AND_SUBSET_SUBTYPES",
+}
+
+var CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode_value = map[string]int32{
+	"UNSPECIFIED":                      0,
+	"UNKNOWN":                          1,
+	"ALL_CHANNELS":                     2,
+	"CHANNEL_TYPE_AND_ALL_SUBTYPES":    3,
+	"CHANNEL_TYPE_AND_SUBSET_SUBTYPES": 4,
+}
+
+func (x CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode) String() string {
+	return proto.EnumName(CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode_name, int32(x))
+}
+
+func (CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_187b80cdb03fe27e, []int{0, 0}
+}
+
+// Describes channel availability mode for a criterion availability - whether
+// the availability is meant to include all advertising channels, or a
+// particular channel with all its channel subtypes, or a channel with a certain
+// subset of channel subtypes.
+type CriterionCategoryChannelAvailabilityModeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CriterionCategoryChannelAvailabilityModeEnum) Reset() {
+	*m = CriterionCategoryChannelAvailabilityModeEnum{}
+}
+func (m *CriterionCategoryChannelAvailabilityModeEnum) String() string {
+	return proto.CompactTextString(m)
+}
+func (*CriterionCategoryChannelAvailabilityModeEnum) ProtoMessage() {}
+func (*CriterionCategoryChannelAvailabilityModeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_187b80cdb03fe27e, []int{0}
+}
+
+func (m *CriterionCategoryChannelAvailabilityModeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CriterionCategoryChannelAvailabilityModeEnum.Unmarshal(m, b)
+}
+func (m *CriterionCategoryChannelAvailabilityModeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CriterionCategoryChannelAvailabilityModeEnum.Marshal(b, m, deterministic)
+}
+func (m *CriterionCategoryChannelAvailabilityModeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CriterionCategoryChannelAvailabilityModeEnum.Merge(m, src)
+}
+func (m *CriterionCategoryChannelAvailabilityModeEnum) XXX_Size() int {
+	return xxx_messageInfo_CriterionCategoryChannelAvailabilityModeEnum.Size(m)
+}
+func (m *CriterionCategoryChannelAvailabilityModeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CriterionCategoryChannelAvailabilityModeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CriterionCategoryChannelAvailabilityModeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode", CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode_name, CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode_value)
+	proto.RegisterType((*CriterionCategoryChannelAvailabilityModeEnum)(nil), "google.ads.googleads.v3.enums.CriterionCategoryChannelAvailabilityModeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/criterion_category_channel_availability_mode.proto", fileDescriptor_187b80cdb03fe27e)
+}
+
+var fileDescriptor_187b80cdb03fe27e = []byte{
+	// 373 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x51, 0xc1, 0x6a, 0xe3, 0x30,
+	0x14, 0x5c, 0x3b, 0xcb, 0x2e, 0x28, 0x0b, 0x6b, 0x7c, 0x5c, 0x36, 0xb0, 0x09, 0x7b, 0xd8, 0xc3,
+	0x56, 0x3e, 0xf8, 0xa6, 0x9e, 0x64, 0xc7, 0x4d, 0x43, 0x53, 0xd7, 0xe0, 0x38, 0xa5, 0xc5, 0x20,
+	0x14, 0x5b, 0xb8, 0x02, 0x5b, 0x0a, 0x96, 0x13, 0xc8, 0xb5, 0x9f, 0xd2, 0xde, 0xfa, 0x29, 0x3d,
+	0xf7, 0x2b, 0xfa, 0x15, 0xc5, 0x76, 0x9c, 0x16, 0x4a, 0x4b, 0x2e, 0x62, 0x9e, 0xde, 0xbc, 0x19,
+	0x69, 0x1e, 0x08, 0x32, 0x29, 0xb3, 0x9c, 0x59, 0x34, 0x55, 0x56, 0x0b, 0x6b, 0xb4, 0xb1, 0x2d,
+	0x26, 0xd6, 0x85, 0xb2, 0x92, 0x92, 0x57, 0xac, 0xe4, 0x52, 0x90, 0x84, 0x56, 0x2c, 0x93, 0xe5,
+	0x96, 0x24, 0x37, 0x54, 0x08, 0x96, 0x13, 0xba, 0xa1, 0x3c, 0xa7, 0x4b, 0x9e, 0xf3, 0x6a, 0x4b,
+	0x0a, 0x99, 0x32, 0xb8, 0x2a, 0x65, 0x25, 0xcd, 0x41, 0x2b, 0x03, 0x69, 0xaa, 0xe0, 0x5e, 0x11,
+	0x6e, 0x6c, 0xd8, 0x28, 0xfe, 0xfa, 0xdd, 0x19, 0xae, 0xb8, 0x45, 0x85, 0x90, 0x15, 0xad, 0xb8,
+	0x14, 0xaa, 0x1d, 0x1e, 0x3d, 0x69, 0xe0, 0xbf, 0xdb, 0x79, 0xba, 0x3b, 0x4b, 0xb7, 0x75, 0xc4,
+	0x6f, 0x0c, 0xcf, 0x65, 0xca, 0x3c, 0xb1, 0x2e, 0x46, 0xf7, 0x1a, 0xf8, 0x77, 0xe8, 0x80, 0xf9,
+	0x13, 0xf4, 0x23, 0x3f, 0x0c, 0x3c, 0x77, 0x7a, 0x32, 0xf5, 0xc6, 0xc6, 0x17, 0xb3, 0x0f, 0xbe,
+	0x47, 0xfe, 0x99, 0x7f, 0x71, 0xe9, 0x1b, 0x9a, 0x69, 0x80, 0x1f, 0x78, 0x36, 0x23, 0xee, 0x29,
+	0xf6, 0x7d, 0x6f, 0x16, 0x1a, 0xba, 0x39, 0x04, 0x83, 0x5d, 0x45, 0xe6, 0x57, 0x81, 0x47, 0xb0,
+	0x3f, 0x26, 0x35, 0x25, 0x8c, 0x9c, 0xba, 0x0e, 0x8d, 0x9e, 0xf9, 0x17, 0xfc, 0x79, 0x47, 0x09,
+	0x23, 0x27, 0xf4, 0xe6, 0xaf, 0xac, 0xaf, 0xce, 0xad, 0x0e, 0x86, 0x89, 0x2c, 0xe0, 0xa7, 0xd1,
+	0x38, 0x47, 0x87, 0x7e, 0x24, 0xa8, 0xb3, 0x0a, 0xb4, 0x6b, 0x67, 0xa7, 0x97, 0xc9, 0x9c, 0x8a,
+	0x0c, 0xca, 0x32, 0xb3, 0x32, 0x26, 0x9a, 0x24, 0xbb, 0x65, 0xae, 0xb8, 0xfa, 0x60, 0xb7, 0xc7,
+	0xcd, 0x79, 0xa7, 0xf7, 0x26, 0x18, 0x3f, 0xe8, 0x83, 0x49, 0x2b, 0x85, 0x53, 0x05, 0x5b, 0x58,
+	0xa3, 0x85, 0x0d, 0xeb, 0x94, 0xd5, 0x63, 0xd7, 0x8f, 0x71, 0xaa, 0xe2, 0x7d, 0x3f, 0x5e, 0xd8,
+	0x71, 0xd3, 0x7f, 0xd6, 0x87, 0xed, 0x25, 0x42, 0x38, 0x55, 0x08, 0xed, 0x19, 0x08, 0x2d, 0x6c,
+	0x84, 0x1a, 0xce, 0xf2, 0x5b, 0xf3, 0x30, 0xfb, 0x25, 0x00, 0x00, 0xff, 0xff, 0xe7, 0x59, 0xb9,
+	0x5c, 0x73, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/criterion_category_locale_availability_mode.pb.go b/googleapis/ads/googleads/v3/enums/criterion_category_locale_availability_mode.pb.go
new file mode 100644
index 0000000..9efd289
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/criterion_category_locale_availability_mode.pb.go
@@ -0,0 +1,145 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/criterion_category_locale_availability_mode.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing the possible CriterionCategoryLocaleAvailabilityMode.
+type CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode int32
+
+const (
+	// Not specified.
+	CriterionCategoryLocaleAvailabilityModeEnum_UNSPECIFIED CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode = 0
+	// Used for return value only. Represents value unknown in this version.
+	CriterionCategoryLocaleAvailabilityModeEnum_UNKNOWN CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode = 1
+	// The category is available to campaigns of all locales.
+	CriterionCategoryLocaleAvailabilityModeEnum_ALL_LOCALES CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode = 2
+	// The category is available to campaigns within a list of countries,
+	// regardless of language.
+	CriterionCategoryLocaleAvailabilityModeEnum_COUNTRY_AND_ALL_LANGUAGES CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode = 3
+	// The category is available to campaigns within a list of languages,
+	// regardless of country.
+	CriterionCategoryLocaleAvailabilityModeEnum_LANGUAGE_AND_ALL_COUNTRIES CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode = 4
+	// The category is available to campaigns within a list of country, language
+	// pairs.
+	CriterionCategoryLocaleAvailabilityModeEnum_COUNTRY_AND_LANGUAGE CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode = 5
+)
+
+var CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ALL_LOCALES",
+	3: "COUNTRY_AND_ALL_LANGUAGES",
+	4: "LANGUAGE_AND_ALL_COUNTRIES",
+	5: "COUNTRY_AND_LANGUAGE",
+}
+
+var CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode_value = map[string]int32{
+	"UNSPECIFIED":                0,
+	"UNKNOWN":                    1,
+	"ALL_LOCALES":                2,
+	"COUNTRY_AND_ALL_LANGUAGES":  3,
+	"LANGUAGE_AND_ALL_COUNTRIES": 4,
+	"COUNTRY_AND_LANGUAGE":       5,
+}
+
+func (x CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode) String() string {
+	return proto.EnumName(CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode_name, int32(x))
+}
+
+func (CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8b49eae87de90e5a, []int{0, 0}
+}
+
+// Describes locale availability mode for a criterion availability - whether
+// it's available globally, or a particular country with all languages, or a
+// particular language with all countries, or a country-language pair.
+type CriterionCategoryLocaleAvailabilityModeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CriterionCategoryLocaleAvailabilityModeEnum) Reset() {
+	*m = CriterionCategoryLocaleAvailabilityModeEnum{}
+}
+func (m *CriterionCategoryLocaleAvailabilityModeEnum) String() string {
+	return proto.CompactTextString(m)
+}
+func (*CriterionCategoryLocaleAvailabilityModeEnum) ProtoMessage() {}
+func (*CriterionCategoryLocaleAvailabilityModeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8b49eae87de90e5a, []int{0}
+}
+
+func (m *CriterionCategoryLocaleAvailabilityModeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CriterionCategoryLocaleAvailabilityModeEnum.Unmarshal(m, b)
+}
+func (m *CriterionCategoryLocaleAvailabilityModeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CriterionCategoryLocaleAvailabilityModeEnum.Marshal(b, m, deterministic)
+}
+func (m *CriterionCategoryLocaleAvailabilityModeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CriterionCategoryLocaleAvailabilityModeEnum.Merge(m, src)
+}
+func (m *CriterionCategoryLocaleAvailabilityModeEnum) XXX_Size() int {
+	return xxx_messageInfo_CriterionCategoryLocaleAvailabilityModeEnum.Size(m)
+}
+func (m *CriterionCategoryLocaleAvailabilityModeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CriterionCategoryLocaleAvailabilityModeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CriterionCategoryLocaleAvailabilityModeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode", CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode_name, CriterionCategoryLocaleAvailabilityModeEnum_CriterionCategoryLocaleAvailabilityMode_value)
+	proto.RegisterType((*CriterionCategoryLocaleAvailabilityModeEnum)(nil), "google.ads.googleads.v3.enums.CriterionCategoryLocaleAvailabilityModeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/criterion_category_locale_availability_mode.proto", fileDescriptor_8b49eae87de90e5a)
+}
+
+var fileDescriptor_8b49eae87de90e5a = []byte{
+	// 381 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x51, 0x4f, 0x8b, 0x9b, 0x40,
+	0x1c, 0xad, 0xa6, 0x7f, 0x60, 0x72, 0xa8, 0x48, 0x0f, 0x6d, 0x68, 0x0a, 0xc9, 0xa5, 0x87, 0x96,
+	0xf1, 0xe0, 0x6d, 0x7a, 0x9a, 0x18, 0x2b, 0xa1, 0x56, 0x43, 0xad, 0x29, 0x5d, 0x04, 0x99, 0xe8,
+	0x20, 0x03, 0x3a, 0x13, 0x1c, 0x13, 0xc8, 0x71, 0xbf, 0xca, 0x1e, 0xf7, 0xb6, 0x5f, 0x63, 0xbf,
+	0xc5, 0x5e, 0xf7, 0x53, 0x2c, 0x8e, 0x51, 0x72, 0xd9, 0x25, 0x17, 0x79, 0xce, 0x7b, 0xbf, 0xf7,
+	0x66, 0xde, 0x0f, 0x84, 0x85, 0x10, 0x45, 0x49, 0x2d, 0x92, 0x4b, 0xab, 0x83, 0x2d, 0x3a, 0xd8,
+	0x16, 0xe5, 0xfb, 0x4a, 0x5a, 0x59, 0xcd, 0x1a, 0x5a, 0x33, 0xc1, 0xd3, 0x8c, 0x34, 0xb4, 0x10,
+	0xf5, 0x31, 0x2d, 0x45, 0x46, 0x4a, 0x9a, 0x92, 0x03, 0x61, 0x25, 0xd9, 0xb2, 0x92, 0x35, 0xc7,
+	0xb4, 0x12, 0x39, 0x85, 0xbb, 0x5a, 0x34, 0xc2, 0x9c, 0x76, 0x2e, 0x90, 0xe4, 0x12, 0x0e, 0x86,
+	0xf0, 0x60, 0x43, 0x65, 0x38, 0xf9, 0xdc, 0xe7, 0xed, 0x98, 0x45, 0x38, 0x17, 0x0d, 0x69, 0x98,
+	0xe0, 0xb2, 0x1b, 0x9e, 0x3f, 0x68, 0xe0, 0x9b, 0xd3, 0x47, 0x3a, 0xa7, 0x44, 0x5f, 0x05, 0xe2,
+	0xb3, 0xbc, 0xdf, 0x22, 0xa7, 0x2e, 0xdf, 0x57, 0xf3, 0x3b, 0x0d, 0x7c, 0xbd, 0x50, 0x6f, 0xbe,
+	0x07, 0xe3, 0x38, 0x88, 0xd6, 0xae, 0xb3, 0xfa, 0xb9, 0x72, 0x97, 0xc6, 0x2b, 0x73, 0x0c, 0xde,
+	0xc5, 0xc1, 0xaf, 0x20, 0xfc, 0x17, 0x18, 0x5a, 0xcb, 0x62, 0xdf, 0x4f, 0xfd, 0xd0, 0xc1, 0xbe,
+	0x1b, 0x19, 0xba, 0x39, 0x05, 0x9f, 0x9c, 0x30, 0x0e, 0xfe, 0xfe, 0xf9, 0x9f, 0xe2, 0x60, 0x99,
+	0x2a, 0x12, 0x07, 0x5e, 0x8c, 0x3d, 0x37, 0x32, 0x46, 0xe6, 0x17, 0x30, 0xe9, 0x7f, 0x07, 0xbe,
+	0xd3, 0xaf, 0xdc, 0xc8, 0x78, 0x6d, 0x7e, 0x04, 0x1f, 0xce, 0xc7, 0x7b, 0xad, 0xf1, 0x66, 0x71,
+	0xad, 0x83, 0x59, 0x26, 0x2a, 0xf8, 0x62, 0x4f, 0x8b, 0xef, 0x17, 0x3e, 0x6b, 0xdd, 0xf6, 0xb6,
+	0xd6, 0xae, 0x16, 0x27, 0xbb, 0x42, 0x94, 0x84, 0x17, 0x50, 0xd4, 0x85, 0x55, 0x50, 0xae, 0x5a,
+	0xed, 0xf7, 0xba, 0x63, 0xf2, 0x99, 0x35, 0xff, 0x50, 0xdf, 0x1b, 0x7d, 0xe4, 0x61, 0x7c, 0xab,
+	0x4f, 0xbd, 0xce, 0x0a, 0xe7, 0x12, 0x76, 0xb0, 0x45, 0x1b, 0x1b, 0xb6, 0x95, 0xcb, 0xfb, 0x9e,
+	0x4f, 0x70, 0x2e, 0x93, 0x81, 0x4f, 0x36, 0x76, 0xa2, 0xf8, 0x47, 0x7d, 0xd6, 0x1d, 0x22, 0x84,
+	0x73, 0x89, 0xd0, 0xa0, 0x40, 0x68, 0x63, 0x23, 0xa4, 0x34, 0xdb, 0xb7, 0xea, 0x62, 0xf6, 0x53,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x8d, 0xfe, 0x83, 0x7e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/criterion_system_serving_status.pb.go b/googleapis/ads/googleads/v3/enums/criterion_system_serving_status.pb.go
new file mode 100644
index 0000000..c40017a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/criterion_system_serving_status.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/criterion_system_serving_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates criterion system serving statuses.
+type CriterionSystemServingStatusEnum_CriterionSystemServingStatus int32
+
+const (
+	// Not specified.
+	CriterionSystemServingStatusEnum_UNSPECIFIED CriterionSystemServingStatusEnum_CriterionSystemServingStatus = 0
+	// The value is unknown in this version.
+	CriterionSystemServingStatusEnum_UNKNOWN CriterionSystemServingStatusEnum_CriterionSystemServingStatus = 1
+	// Eligible.
+	CriterionSystemServingStatusEnum_ELIGIBLE CriterionSystemServingStatusEnum_CriterionSystemServingStatus = 2
+	// Low search volume.
+	CriterionSystemServingStatusEnum_RARELY_SERVED CriterionSystemServingStatusEnum_CriterionSystemServingStatus = 3
+)
+
+var CriterionSystemServingStatusEnum_CriterionSystemServingStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ELIGIBLE",
+	3: "RARELY_SERVED",
+}
+
+var CriterionSystemServingStatusEnum_CriterionSystemServingStatus_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"ELIGIBLE":      2,
+	"RARELY_SERVED": 3,
+}
+
+func (x CriterionSystemServingStatusEnum_CriterionSystemServingStatus) String() string {
+	return proto.EnumName(CriterionSystemServingStatusEnum_CriterionSystemServingStatus_name, int32(x))
+}
+
+func (CriterionSystemServingStatusEnum_CriterionSystemServingStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3daf1ed16767b341, []int{0, 0}
+}
+
+// Container for enum describing possible criterion system serving statuses.
+type CriterionSystemServingStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CriterionSystemServingStatusEnum) Reset()         { *m = CriterionSystemServingStatusEnum{} }
+func (m *CriterionSystemServingStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*CriterionSystemServingStatusEnum) ProtoMessage()    {}
+func (*CriterionSystemServingStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3daf1ed16767b341, []int{0}
+}
+
+func (m *CriterionSystemServingStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CriterionSystemServingStatusEnum.Unmarshal(m, b)
+}
+func (m *CriterionSystemServingStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CriterionSystemServingStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *CriterionSystemServingStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CriterionSystemServingStatusEnum.Merge(m, src)
+}
+func (m *CriterionSystemServingStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_CriterionSystemServingStatusEnum.Size(m)
+}
+func (m *CriterionSystemServingStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CriterionSystemServingStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CriterionSystemServingStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CriterionSystemServingStatusEnum_CriterionSystemServingStatus", CriterionSystemServingStatusEnum_CriterionSystemServingStatus_name, CriterionSystemServingStatusEnum_CriterionSystemServingStatus_value)
+	proto.RegisterType((*CriterionSystemServingStatusEnum)(nil), "google.ads.googleads.v3.enums.CriterionSystemServingStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/criterion_system_serving_status.proto", fileDescriptor_3daf1ed16767b341)
+}
+
+var fileDescriptor_3daf1ed16767b341 = []byte{
+	// 326 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4a, 0xc3, 0x40,
+	0x14, 0x34, 0x29, 0xa8, 0x6c, 0x15, 0x63, 0x8e, 0xd2, 0x82, 0xed, 0x07, 0x6c, 0x0e, 0xb9, 0xad,
+	0xa7, 0xa4, 0x5d, 0x4b, 0xb0, 0xc4, 0xd2, 0xd0, 0x88, 0x12, 0x09, 0xb1, 0x09, 0x4b, 0xa0, 0xd9,
+	0x2d, 0x79, 0xdb, 0x82, 0x47, 0x7f, 0xc5, 0xa3, 0x9f, 0xe2, 0xa7, 0xf8, 0x01, 0x9e, 0x25, 0xbb,
+	0x4d, 0x6f, 0xe6, 0xb2, 0x0c, 0xfb, 0xe6, 0xcd, 0xbc, 0x19, 0x34, 0x61, 0x42, 0xb0, 0x4d, 0xe1,
+	0x64, 0x39, 0x38, 0x1a, 0x36, 0x68, 0xef, 0x3a, 0x05, 0xdf, 0x55, 0xe0, 0xac, 0xeb, 0x52, 0x16,
+	0x75, 0x29, 0x78, 0x0a, 0xef, 0x20, 0x8b, 0x2a, 0x85, 0xa2, 0xde, 0x97, 0x9c, 0xa5, 0x20, 0x33,
+	0xb9, 0x03, 0xbc, 0xad, 0x85, 0x14, 0xf6, 0x50, 0x6f, 0xe2, 0x2c, 0x07, 0x7c, 0x14, 0xc1, 0x7b,
+	0x17, 0x2b, 0x91, 0x9b, 0x41, 0xeb, 0xb1, 0x2d, 0x9d, 0x8c, 0x73, 0x21, 0x33, 0x59, 0x0a, 0x7e,
+	0x58, 0x1e, 0x7f, 0x18, 0xe8, 0x76, 0xd2, 0xda, 0x44, 0xca, 0x25, 0xd2, 0x26, 0x91, 0xf2, 0xa0,
+	0x7c, 0x57, 0x8d, 0x5f, 0xd1, 0xa0, 0x8b, 0x63, 0x5f, 0xa1, 0xfe, 0x2a, 0x8c, 0x16, 0x74, 0x12,
+	0xdc, 0x07, 0x74, 0x6a, 0x9d, 0xd8, 0x7d, 0x74, 0xb6, 0x0a, 0x1f, 0xc2, 0xc7, 0xa7, 0xd0, 0x32,
+	0xec, 0x0b, 0x74, 0x4e, 0xe7, 0xc1, 0x2c, 0xf0, 0xe7, 0xd4, 0x32, 0xed, 0x6b, 0x74, 0xb9, 0xf4,
+	0x96, 0x74, 0xfe, 0x9c, 0x46, 0x74, 0x19, 0xd3, 0xa9, 0xd5, 0xf3, 0x7f, 0x0d, 0x34, 0x5a, 0x8b,
+	0x0a, 0x77, 0xe6, 0xf0, 0x47, 0x5d, 0x27, 0x2c, 0x9a, 0x30, 0x0b, 0xe3, 0xc5, 0x3f, 0x68, 0x30,
+	0xb1, 0xc9, 0x38, 0xc3, 0xa2, 0x66, 0x0e, 0x2b, 0xb8, 0x8a, 0xda, 0x16, 0xbc, 0x2d, 0xe1, 0x9f,
+	0xbe, 0xef, 0xd4, 0xfb, 0x69, 0xf6, 0x66, 0x9e, 0xf7, 0x65, 0x0e, 0x67, 0x5a, 0xca, 0xcb, 0x01,
+	0x6b, 0xd8, 0xa0, 0xd8, 0xc5, 0x4d, 0x25, 0xf0, 0xdd, 0xce, 0x13, 0x2f, 0x87, 0xe4, 0x38, 0x4f,
+	0x62, 0x37, 0x51, 0xf3, 0x1f, 0x73, 0xa4, 0x3f, 0x09, 0xf1, 0x72, 0x20, 0xe4, 0xc8, 0x20, 0x24,
+	0x76, 0x09, 0x51, 0x9c, 0xb7, 0x53, 0x75, 0x98, 0xfb, 0x17, 0x00, 0x00, 0xff, 0xff, 0x67, 0xec,
+	0x1f, 0x3c, 0x07, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/criterion_type.pb.go b/googleapis/ads/googleads/v3/enums/criterion_type.pb.go
new file mode 100644
index 0000000..e81b051
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/criterion_type.pb.go
@@ -0,0 +1,255 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/criterion_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible criterion types.
+type CriterionTypeEnum_CriterionType int32
+
+const (
+	// Not specified.
+	CriterionTypeEnum_UNSPECIFIED CriterionTypeEnum_CriterionType = 0
+	// Used for return value only. Represents value unknown in this version.
+	CriterionTypeEnum_UNKNOWN CriterionTypeEnum_CriterionType = 1
+	// Keyword. e.g. 'mars cruise'.
+	CriterionTypeEnum_KEYWORD CriterionTypeEnum_CriterionType = 2
+	// Placement, aka Website. e.g. 'www.flowers4sale.com'
+	CriterionTypeEnum_PLACEMENT CriterionTypeEnum_CriterionType = 3
+	// Mobile application categories to target.
+	CriterionTypeEnum_MOBILE_APP_CATEGORY CriterionTypeEnum_CriterionType = 4
+	// Mobile applications to target.
+	CriterionTypeEnum_MOBILE_APPLICATION CriterionTypeEnum_CriterionType = 5
+	// Devices to target.
+	CriterionTypeEnum_DEVICE CriterionTypeEnum_CriterionType = 6
+	// Locations to target.
+	CriterionTypeEnum_LOCATION CriterionTypeEnum_CriterionType = 7
+	// Listing groups to target.
+	CriterionTypeEnum_LISTING_GROUP CriterionTypeEnum_CriterionType = 8
+	// Ad Schedule.
+	CriterionTypeEnum_AD_SCHEDULE CriterionTypeEnum_CriterionType = 9
+	// Age range.
+	CriterionTypeEnum_AGE_RANGE CriterionTypeEnum_CriterionType = 10
+	// Gender.
+	CriterionTypeEnum_GENDER CriterionTypeEnum_CriterionType = 11
+	// Income Range.
+	CriterionTypeEnum_INCOME_RANGE CriterionTypeEnum_CriterionType = 12
+	// Parental status.
+	CriterionTypeEnum_PARENTAL_STATUS CriterionTypeEnum_CriterionType = 13
+	// YouTube Video.
+	CriterionTypeEnum_YOUTUBE_VIDEO CriterionTypeEnum_CriterionType = 14
+	// YouTube Channel.
+	CriterionTypeEnum_YOUTUBE_CHANNEL CriterionTypeEnum_CriterionType = 15
+	// User list.
+	CriterionTypeEnum_USER_LIST CriterionTypeEnum_CriterionType = 16
+	// Proximity.
+	CriterionTypeEnum_PROXIMITY CriterionTypeEnum_CriterionType = 17
+	// A topic target on the display network (e.g. "Pets & Animals").
+	CriterionTypeEnum_TOPIC CriterionTypeEnum_CriterionType = 18
+	// Listing scope to target.
+	CriterionTypeEnum_LISTING_SCOPE CriterionTypeEnum_CriterionType = 19
+	// Language.
+	CriterionTypeEnum_LANGUAGE CriterionTypeEnum_CriterionType = 20
+	// IpBlock.
+	CriterionTypeEnum_IP_BLOCK CriterionTypeEnum_CriterionType = 21
+	// Content Label for category exclusion.
+	CriterionTypeEnum_CONTENT_LABEL CriterionTypeEnum_CriterionType = 22
+	// Carrier.
+	CriterionTypeEnum_CARRIER CriterionTypeEnum_CriterionType = 23
+	// A category the user is interested in.
+	CriterionTypeEnum_USER_INTEREST CriterionTypeEnum_CriterionType = 24
+	// Webpage criterion for dynamic search ads.
+	CriterionTypeEnum_WEBPAGE CriterionTypeEnum_CriterionType = 25
+	// Operating system version.
+	CriterionTypeEnum_OPERATING_SYSTEM_VERSION CriterionTypeEnum_CriterionType = 26
+	// App payment model.
+	CriterionTypeEnum_APP_PAYMENT_MODEL CriterionTypeEnum_CriterionType = 27
+	// Mobile device.
+	CriterionTypeEnum_MOBILE_DEVICE CriterionTypeEnum_CriterionType = 28
+	// Custom affinity.
+	CriterionTypeEnum_CUSTOM_AFFINITY CriterionTypeEnum_CriterionType = 29
+	// Custom intent.
+	CriterionTypeEnum_CUSTOM_INTENT CriterionTypeEnum_CriterionType = 30
+	// Location group.
+	CriterionTypeEnum_LOCATION_GROUP CriterionTypeEnum_CriterionType = 31
+)
+
+var CriterionTypeEnum_CriterionType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "KEYWORD",
+	3:  "PLACEMENT",
+	4:  "MOBILE_APP_CATEGORY",
+	5:  "MOBILE_APPLICATION",
+	6:  "DEVICE",
+	7:  "LOCATION",
+	8:  "LISTING_GROUP",
+	9:  "AD_SCHEDULE",
+	10: "AGE_RANGE",
+	11: "GENDER",
+	12: "INCOME_RANGE",
+	13: "PARENTAL_STATUS",
+	14: "YOUTUBE_VIDEO",
+	15: "YOUTUBE_CHANNEL",
+	16: "USER_LIST",
+	17: "PROXIMITY",
+	18: "TOPIC",
+	19: "LISTING_SCOPE",
+	20: "LANGUAGE",
+	21: "IP_BLOCK",
+	22: "CONTENT_LABEL",
+	23: "CARRIER",
+	24: "USER_INTEREST",
+	25: "WEBPAGE",
+	26: "OPERATING_SYSTEM_VERSION",
+	27: "APP_PAYMENT_MODEL",
+	28: "MOBILE_DEVICE",
+	29: "CUSTOM_AFFINITY",
+	30: "CUSTOM_INTENT",
+	31: "LOCATION_GROUP",
+}
+
+var CriterionTypeEnum_CriterionType_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"KEYWORD":                  2,
+	"PLACEMENT":                3,
+	"MOBILE_APP_CATEGORY":      4,
+	"MOBILE_APPLICATION":       5,
+	"DEVICE":                   6,
+	"LOCATION":                 7,
+	"LISTING_GROUP":            8,
+	"AD_SCHEDULE":              9,
+	"AGE_RANGE":                10,
+	"GENDER":                   11,
+	"INCOME_RANGE":             12,
+	"PARENTAL_STATUS":          13,
+	"YOUTUBE_VIDEO":            14,
+	"YOUTUBE_CHANNEL":          15,
+	"USER_LIST":                16,
+	"PROXIMITY":                17,
+	"TOPIC":                    18,
+	"LISTING_SCOPE":            19,
+	"LANGUAGE":                 20,
+	"IP_BLOCK":                 21,
+	"CONTENT_LABEL":            22,
+	"CARRIER":                  23,
+	"USER_INTEREST":            24,
+	"WEBPAGE":                  25,
+	"OPERATING_SYSTEM_VERSION": 26,
+	"APP_PAYMENT_MODEL":        27,
+	"MOBILE_DEVICE":            28,
+	"CUSTOM_AFFINITY":          29,
+	"CUSTOM_INTENT":            30,
+	"LOCATION_GROUP":           31,
+}
+
+func (x CriterionTypeEnum_CriterionType) String() string {
+	return proto.EnumName(CriterionTypeEnum_CriterionType_name, int32(x))
+}
+
+func (CriterionTypeEnum_CriterionType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_72b4b59f943d7aa1, []int{0, 0}
+}
+
+// The possible types of a criterion.
+type CriterionTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CriterionTypeEnum) Reset()         { *m = CriterionTypeEnum{} }
+func (m *CriterionTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*CriterionTypeEnum) ProtoMessage()    {}
+func (*CriterionTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_72b4b59f943d7aa1, []int{0}
+}
+
+func (m *CriterionTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CriterionTypeEnum.Unmarshal(m, b)
+}
+func (m *CriterionTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CriterionTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *CriterionTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CriterionTypeEnum.Merge(m, src)
+}
+func (m *CriterionTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_CriterionTypeEnum.Size(m)
+}
+func (m *CriterionTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CriterionTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CriterionTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CriterionTypeEnum_CriterionType", CriterionTypeEnum_CriterionType_name, CriterionTypeEnum_CriterionType_value)
+	proto.RegisterType((*CriterionTypeEnum)(nil), "google.ads.googleads.v3.enums.CriterionTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/criterion_type.proto", fileDescriptor_72b4b59f943d7aa1)
+}
+
+var fileDescriptor_72b4b59f943d7aa1 = []byte{
+	// 623 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0x4d, 0x6e, 0xdb, 0x3a,
+	0x10, 0x7e, 0x71, 0xfe, 0x99, 0x38, 0xa1, 0x99, 0x97, 0x9f, 0x97, 0x97, 0xbc, 0x87, 0xe4, 0x00,
+	0x32, 0x50, 0xef, 0xd4, 0x15, 0x45, 0x4d, 0x14, 0x22, 0x32, 0x49, 0x50, 0x94, 0x53, 0x17, 0x06,
+	0x08, 0x37, 0x36, 0x0c, 0x03, 0x89, 0x64, 0x58, 0x4e, 0x80, 0x5c, 0xa7, 0xcb, 0x1e, 0xa2, 0x07,
+	0xe8, 0xba, 0x77, 0x28, 0xd0, 0x53, 0x14, 0x94, 0xac, 0xb4, 0x59, 0xb4, 0x1b, 0x61, 0x34, 0xdf,
+	0xcc, 0x37, 0xdf, 0xfc, 0x10, 0xbd, 0x99, 0xe4, 0xf9, 0xe4, 0x7e, 0xdc, 0x1e, 0x8e, 0x8a, 0x76,
+	0x65, 0x3a, 0xeb, 0xa9, 0xd3, 0x1e, 0x67, 0x8f, 0x0f, 0x45, 0xfb, 0x6e, 0x3e, 0x5d, 0x8c, 0xe7,
+	0xd3, 0x3c, 0xb3, 0x8b, 0xe7, 0xd9, 0xd8, 0x9b, 0xcd, 0xf3, 0x45, 0x4e, 0xce, 0xab, 0x40, 0x6f,
+	0x38, 0x2a, 0xbc, 0x97, 0x1c, 0xef, 0xa9, 0xe3, 0x95, 0x39, 0xa7, 0x67, 0x35, 0xe5, 0x6c, 0xda,
+	0x1e, 0x66, 0x59, 0xbe, 0x18, 0x2e, 0xa6, 0x79, 0x56, 0x54, 0xc9, 0x97, 0x5f, 0xd7, 0x50, 0x8b,
+	0xd5, 0xac, 0xe6, 0x79, 0x36, 0x86, 0xec, 0xf1, 0xe1, 0xf2, 0xf3, 0x1a, 0x6a, 0xbe, 0xf2, 0x92,
+	0x7d, 0xb4, 0x93, 0x8a, 0x44, 0x01, 0xe3, 0x57, 0x1c, 0x42, 0xfc, 0x17, 0xd9, 0x41, 0x9b, 0xa9,
+	0xb8, 0x11, 0xf2, 0x56, 0xe0, 0x15, 0xf7, 0x73, 0x03, 0xfd, 0x5b, 0xa9, 0x43, 0xdc, 0x20, 0x4d,
+	0xb4, 0xad, 0x62, 0xca, 0xa0, 0x0b, 0xc2, 0xe0, 0x55, 0x72, 0x8c, 0x0e, 0xba, 0x32, 0xe0, 0x31,
+	0x58, 0xaa, 0x94, 0x65, 0xd4, 0x40, 0x24, 0x75, 0x1f, 0xaf, 0x91, 0x23, 0x44, 0x7e, 0x02, 0x31,
+	0x67, 0xd4, 0x70, 0x29, 0xf0, 0x3a, 0x41, 0x68, 0x23, 0x84, 0x1e, 0x67, 0x80, 0x37, 0xc8, 0x2e,
+	0xda, 0x8a, 0xe5, 0x12, 0xd9, 0x24, 0x2d, 0xd4, 0x8c, 0x79, 0x62, 0xb8, 0x88, 0x6c, 0xa4, 0x65,
+	0xaa, 0xf0, 0x96, 0xd3, 0x45, 0x43, 0x9b, 0xb0, 0x6b, 0x08, 0xd3, 0x18, 0xf0, 0xb6, 0xab, 0x4e,
+	0x23, 0xb0, 0x9a, 0x8a, 0x08, 0x30, 0x72, 0x64, 0x11, 0x88, 0x10, 0x34, 0xde, 0x21, 0x18, 0xed,
+	0x72, 0xc1, 0x64, 0xb7, 0x46, 0x77, 0xc9, 0x01, 0xda, 0x57, 0x54, 0x83, 0x30, 0x34, 0xb6, 0x89,
+	0xa1, 0x26, 0x4d, 0x70, 0xd3, 0x55, 0xe9, 0xcb, 0xd4, 0xa4, 0x01, 0xd8, 0x1e, 0x0f, 0x41, 0xe2,
+	0x3d, 0x17, 0x57, 0xbb, 0xd8, 0x35, 0x15, 0x02, 0x62, 0xbc, 0xef, 0x2a, 0xa5, 0x09, 0x68, 0xeb,
+	0x24, 0x61, 0x5c, 0xb6, 0xad, 0xe5, 0x3b, 0xde, 0xe5, 0xa6, 0x8f, 0x5b, 0x64, 0x1b, 0xad, 0x1b,
+	0xa9, 0x38, 0xc3, 0xe4, 0x57, 0xd9, 0x09, 0x93, 0x0a, 0xf0, 0x41, 0xd9, 0x17, 0x15, 0x51, 0x4a,
+	0x23, 0xc0, 0x7f, 0xbb, 0x3f, 0xae, 0x6c, 0x10, 0x4b, 0x76, 0x83, 0x0f, 0x5d, 0x38, 0x93, 0xc2,
+	0x80, 0x30, 0x36, 0xa6, 0x01, 0xc4, 0xf8, 0xc8, 0xcd, 0x97, 0x51, 0xad, 0x39, 0x68, 0x7c, 0xec,
+	0xf0, 0xb2, 0x2e, 0x17, 0x06, 0x34, 0x24, 0x06, 0x9f, 0x38, 0xfc, 0x16, 0x02, 0xe5, 0xd8, 0xfe,
+	0x21, 0x67, 0xe8, 0x44, 0x2a, 0xd0, 0xb4, 0x2a, 0xd8, 0x4f, 0x0c, 0x74, 0x6d, 0x0f, 0x74, 0xe2,
+	0x66, 0x78, 0x4a, 0x0e, 0x51, 0xcb, 0xed, 0x41, 0xd1, 0xbe, 0xdb, 0x8f, 0xed, 0xca, 0x10, 0x62,
+	0xfc, 0xaf, 0x23, 0x5d, 0x2e, 0x63, 0x39, 0xfb, 0x33, 0xd7, 0x34, 0x4b, 0x13, 0x23, 0xbb, 0x96,
+	0x5e, 0x5d, 0x71, 0xe1, 0xda, 0x3a, 0x2f, 0xc5, 0x55, 0x4e, 0x5e, 0x4a, 0xc4, 0xff, 0x11, 0x82,
+	0xf6, 0xea, 0x1d, 0x2d, 0xd7, 0xf2, 0x7f, 0xf0, 0x6d, 0x05, 0x5d, 0xdc, 0xe5, 0x0f, 0xde, 0x1f,
+	0x4f, 0x33, 0x20, 0xaf, 0x6e, 0x4c, 0xb9, 0x83, 0x54, 0x2b, 0xef, 0x83, 0x65, 0xd2, 0x24, 0xbf,
+	0x1f, 0x66, 0x13, 0x2f, 0x9f, 0x4f, 0xda, 0x93, 0x71, 0x56, 0x9e, 0x6b, 0xfd, 0x26, 0x66, 0xd3,
+	0xe2, 0x37, 0x4f, 0xe4, 0x6d, 0xf9, 0xfd, 0xd8, 0x58, 0x8d, 0x28, 0xfd, 0xd4, 0x38, 0x8f, 0x2a,
+	0x2a, 0x3a, 0x2a, 0xbc, 0xca, 0x74, 0x56, 0xaf, 0xe3, 0xb9, 0x2b, 0x2f, 0xbe, 0xd4, 0xf8, 0x80,
+	0x8e, 0x8a, 0xc1, 0x0b, 0x3e, 0xe8, 0x75, 0x06, 0x25, 0xfe, 0xbd, 0x71, 0x51, 0x39, 0x7d, 0x9f,
+	0x8e, 0x0a, 0xdf, 0x7f, 0x89, 0xf0, 0xfd, 0x5e, 0xc7, 0xf7, 0xcb, 0x98, 0x0f, 0x1b, 0xa5, 0xb0,
+	0xce, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x1c, 0x45, 0x45, 0xba, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/custom_interest_member_type.pb.go b/googleapis/ads/googleads/v3/enums/custom_interest_member_type.pb.go
new file mode 100644
index 0000000..cb4fff2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/custom_interest_member_type.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/custom_interest_member_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing possible custom interest member types.
+type CustomInterestMemberTypeEnum_CustomInterestMemberType int32
+
+const (
+	// Not specified.
+	CustomInterestMemberTypeEnum_UNSPECIFIED CustomInterestMemberTypeEnum_CustomInterestMemberType = 0
+	// Used for return value only. Represents value unknown in this version.
+	CustomInterestMemberTypeEnum_UNKNOWN CustomInterestMemberTypeEnum_CustomInterestMemberType = 1
+	// Custom interest member type KEYWORD.
+	CustomInterestMemberTypeEnum_KEYWORD CustomInterestMemberTypeEnum_CustomInterestMemberType = 2
+	// Custom interest member type URL.
+	CustomInterestMemberTypeEnum_URL CustomInterestMemberTypeEnum_CustomInterestMemberType = 3
+)
+
+var CustomInterestMemberTypeEnum_CustomInterestMemberType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "KEYWORD",
+	3: "URL",
+}
+
+var CustomInterestMemberTypeEnum_CustomInterestMemberType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"KEYWORD":     2,
+	"URL":         3,
+}
+
+func (x CustomInterestMemberTypeEnum_CustomInterestMemberType) String() string {
+	return proto.EnumName(CustomInterestMemberTypeEnum_CustomInterestMemberType_name, int32(x))
+}
+
+func (CustomInterestMemberTypeEnum_CustomInterestMemberType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1e2f9e6f3d781c9a, []int{0, 0}
+}
+
+// The types of custom interest member, either KEYWORD or URL.
+type CustomInterestMemberTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomInterestMemberTypeEnum) Reset()         { *m = CustomInterestMemberTypeEnum{} }
+func (m *CustomInterestMemberTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomInterestMemberTypeEnum) ProtoMessage()    {}
+func (*CustomInterestMemberTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1e2f9e6f3d781c9a, []int{0}
+}
+
+func (m *CustomInterestMemberTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomInterestMemberTypeEnum.Unmarshal(m, b)
+}
+func (m *CustomInterestMemberTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomInterestMemberTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomInterestMemberTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomInterestMemberTypeEnum.Merge(m, src)
+}
+func (m *CustomInterestMemberTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomInterestMemberTypeEnum.Size(m)
+}
+func (m *CustomInterestMemberTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomInterestMemberTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomInterestMemberTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CustomInterestMemberTypeEnum_CustomInterestMemberType", CustomInterestMemberTypeEnum_CustomInterestMemberType_name, CustomInterestMemberTypeEnum_CustomInterestMemberType_value)
+	proto.RegisterType((*CustomInterestMemberTypeEnum)(nil), "google.ads.googleads.v3.enums.CustomInterestMemberTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/custom_interest_member_type.proto", fileDescriptor_1e2f9e6f3d781c9a)
+}
+
+var fileDescriptor_1e2f9e6f3d781c9a = []byte{
+	// 314 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x6b, 0xfa, 0x30,
+	0x18, 0xfe, 0x59, 0xe1, 0x27, 0xc4, 0xc3, 0x4a, 0x4f, 0x63, 0xe8, 0x41, 0x3f, 0x40, 0x72, 0xc8,
+	0x2d, 0x3b, 0x8c, 0xaa, 0x9d, 0x88, 0x5b, 0x15, 0x37, 0x95, 0x8d, 0x42, 0xa9, 0x36, 0x84, 0x82,
+	0x49, 0x4a, 0x93, 0x0a, 0x7e, 0x9d, 0x1d, 0xf7, 0x51, 0xf6, 0x51, 0x76, 0xdc, 0x27, 0x18, 0x4d,
+	0x6c, 0x6f, 0xdd, 0xa5, 0x3c, 0xcd, 0xf3, 0x3e, 0x7f, 0xde, 0x17, 0x3c, 0x30, 0x29, 0xd9, 0x89,
+	0xa2, 0x24, 0x55, 0xc8, 0xc2, 0x0a, 0x9d, 0x31, 0xa2, 0xa2, 0xe4, 0x0a, 0x1d, 0x4b, 0xa5, 0x25,
+	0x8f, 0x33, 0xa1, 0x69, 0x41, 0x95, 0x8e, 0x39, 0xe5, 0x07, 0x5a, 0xc4, 0xfa, 0x92, 0x53, 0x98,
+	0x17, 0x52, 0x4b, 0x6f, 0x68, 0x55, 0x30, 0x49, 0x15, 0x6c, 0x0c, 0xe0, 0x19, 0x43, 0x63, 0x70,
+	0x37, 0xa8, 0xfd, 0xf3, 0x0c, 0x25, 0x42, 0x48, 0x9d, 0xe8, 0x4c, 0x0a, 0x65, 0xc5, 0x63, 0x01,
+	0x06, 0x53, 0x93, 0xb0, 0xb8, 0x06, 0x3c, 0x1b, 0xff, 0xd7, 0x4b, 0x4e, 0x03, 0x51, 0xf2, 0x71,
+	0x08, 0x6e, 0xdb, 0x78, 0xef, 0x06, 0xf4, 0xb7, 0xe1, 0xcb, 0x3a, 0x98, 0x2e, 0x1e, 0x17, 0xc1,
+	0xcc, 0xfd, 0xe7, 0xf5, 0x41, 0x6f, 0x1b, 0x2e, 0xc3, 0xd5, 0x3e, 0x74, 0x3b, 0xd5, 0xcf, 0x32,
+	0x78, 0xdb, 0xaf, 0x36, 0x33, 0xd7, 0xf1, 0x7a, 0xa0, 0xbb, 0xdd, 0x3c, 0xb9, 0xdd, 0xc9, 0x4f,
+	0x07, 0x8c, 0x8e, 0x92, 0xc3, 0x3f, 0x3b, 0x4f, 0x86, 0x6d, 0x99, 0xeb, 0xaa, 0xf4, 0xba, 0xf3,
+	0x3e, 0xb9, 0xea, 0x99, 0x3c, 0x25, 0x82, 0x41, 0x59, 0x30, 0xc4, 0xa8, 0x30, 0x2b, 0xd5, 0x47,
+	0xcc, 0x33, 0xd5, 0x72, 0xd3, 0x7b, 0xf3, 0xfd, 0x70, 0xba, 0x73, 0xdf, 0xff, 0x74, 0x86, 0x73,
+	0x6b, 0xe5, 0xa7, 0x0a, 0x5a, 0x58, 0xa1, 0x1d, 0x86, 0xd5, 0xfe, 0xea, 0xab, 0xe6, 0x23, 0x3f,
+	0x55, 0x51, 0xc3, 0x47, 0x3b, 0x1c, 0x19, 0xfe, 0xdb, 0x19, 0xd9, 0x47, 0x42, 0xfc, 0x54, 0x11,
+	0xd2, 0x4c, 0x10, 0xb2, 0xc3, 0x84, 0x98, 0x99, 0xc3, 0x7f, 0x53, 0x0c, 0xff, 0x06, 0x00, 0x00,
+	0xff, 0xff, 0x87, 0x00, 0x9b, 0xbb, 0xeb, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/custom_interest_status.pb.go b/googleapis/ads/googleads/v3/enums/custom_interest_status.pb.go
new file mode 100644
index 0000000..62e9b5e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/custom_interest_status.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/custom_interest_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing possible custom interest types.
+type CustomInterestStatusEnum_CustomInterestStatus int32
+
+const (
+	// Not specified.
+	CustomInterestStatusEnum_UNSPECIFIED CustomInterestStatusEnum_CustomInterestStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	CustomInterestStatusEnum_UNKNOWN CustomInterestStatusEnum_CustomInterestStatus = 1
+	// Enabled status - custom interest is enabled and can be targeted to.
+	CustomInterestStatusEnum_ENABLED CustomInterestStatusEnum_CustomInterestStatus = 2
+	// Removed status - custom interest is removed and cannot be used for
+	// targeting.
+	CustomInterestStatusEnum_REMOVED CustomInterestStatusEnum_CustomInterestStatus = 3
+)
+
+var CustomInterestStatusEnum_CustomInterestStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var CustomInterestStatusEnum_CustomInterestStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x CustomInterestStatusEnum_CustomInterestStatus) String() string {
+	return proto.EnumName(CustomInterestStatusEnum_CustomInterestStatus_name, int32(x))
+}
+
+func (CustomInterestStatusEnum_CustomInterestStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c4d0aee2218e339a, []int{0, 0}
+}
+
+// The status of custom interest.
+type CustomInterestStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomInterestStatusEnum) Reset()         { *m = CustomInterestStatusEnum{} }
+func (m *CustomInterestStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomInterestStatusEnum) ProtoMessage()    {}
+func (*CustomInterestStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4d0aee2218e339a, []int{0}
+}
+
+func (m *CustomInterestStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomInterestStatusEnum.Unmarshal(m, b)
+}
+func (m *CustomInterestStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomInterestStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomInterestStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomInterestStatusEnum.Merge(m, src)
+}
+func (m *CustomInterestStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomInterestStatusEnum.Size(m)
+}
+func (m *CustomInterestStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomInterestStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomInterestStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CustomInterestStatusEnum_CustomInterestStatus", CustomInterestStatusEnum_CustomInterestStatus_name, CustomInterestStatusEnum_CustomInterestStatus_value)
+	proto.RegisterType((*CustomInterestStatusEnum)(nil), "google.ads.googleads.v3.enums.CustomInterestStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/custom_interest_status.proto", fileDescriptor_c4d0aee2218e339a)
+}
+
+var fileDescriptor_c4d0aee2218e339a = []byte{
+	// 306 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4e, 0x2a, 0x31,
+	0x14, 0x7d, 0x0c, 0xc9, 0x33, 0x29, 0x0b, 0x27, 0xc4, 0x85, 0x1a, 0x59, 0xc0, 0x07, 0xb4, 0x8b,
+	0xee, 0xea, 0xaa, 0x03, 0x95, 0x10, 0xb5, 0x10, 0x09, 0x63, 0x62, 0x26, 0x21, 0x95, 0x99, 0x34,
+	0x63, 0x98, 0x96, 0x70, 0x3b, 0x7c, 0x90, 0x4b, 0x3f, 0xc5, 0x4f, 0x71, 0xe1, 0x37, 0x98, 0x76,
+	0x80, 0x15, 0xba, 0x69, 0xce, 0xed, 0xb9, 0xe7, 0xdc, 0x73, 0x2f, 0x62, 0xda, 0x5a, 0xbd, 0x2e,
+	0x88, 0xca, 0x81, 0x34, 0xd0, 0xa3, 0x1d, 0x25, 0x85, 0xa9, 0x2b, 0x20, 0xab, 0x1a, 0x9c, 0xad,
+	0x96, 0xa5, 0x71, 0xc5, 0xb6, 0x00, 0xb7, 0x04, 0xa7, 0x5c, 0x0d, 0x78, 0xb3, 0xb5, 0xce, 0x76,
+	0x7b, 0x8d, 0x00, 0xab, 0x1c, 0xf0, 0x51, 0x8b, 0x77, 0x14, 0x07, 0xed, 0xf5, 0xcd, 0xc1, 0x7a,
+	0x53, 0x12, 0x65, 0x8c, 0x75, 0xca, 0x95, 0xd6, 0xec, 0xc5, 0x83, 0x37, 0x74, 0x39, 0x0c, 0xe6,
+	0x93, 0xbd, 0xf7, 0x3c, 0x58, 0x0b, 0x53, 0x57, 0x03, 0x89, 0x2e, 0x4e, 0x71, 0xdd, 0x73, 0xd4,
+	0x59, 0xc8, 0xf9, 0x4c, 0x0c, 0x27, 0x77, 0x13, 0x31, 0x8a, 0xff, 0x75, 0x3b, 0xe8, 0x6c, 0x21,
+	0xef, 0xe5, 0xf4, 0x59, 0xc6, 0x2d, 0x5f, 0x08, 0xc9, 0x93, 0x07, 0x31, 0x8a, 0x23, 0x5f, 0x3c,
+	0x89, 0xc7, 0x69, 0x2a, 0x46, 0x71, 0x3b, 0xf9, 0x6e, 0xa1, 0xfe, 0xca, 0x56, 0xf8, 0xcf, 0xbc,
+	0xc9, 0xd5, 0xa9, 0x99, 0x33, 0x1f, 0x76, 0xd6, 0x7a, 0x49, 0xf6, 0x5a, 0x6d, 0xd7, 0xca, 0x68,
+	0x6c, 0xb7, 0x9a, 0xe8, 0xc2, 0x84, 0x55, 0x0e, 0x77, 0xdb, 0x94, 0xf0, 0xcb, 0x19, 0x6f, 0xc3,
+	0xfb, 0x1e, 0xb5, 0xc7, 0x9c, 0x7f, 0x44, 0xbd, 0x71, 0x63, 0xc5, 0x73, 0xc0, 0x0d, 0xf4, 0x28,
+	0xa5, 0xd8, 0xef, 0x0e, 0x9f, 0x07, 0x3e, 0xe3, 0x39, 0x64, 0x47, 0x3e, 0x4b, 0x69, 0x16, 0xf8,
+	0xaf, 0xa8, 0xdf, 0x7c, 0x32, 0xc6, 0x73, 0x60, 0xec, 0xd8, 0xc1, 0x58, 0x4a, 0x19, 0x0b, 0x3d,
+	0xaf, 0xff, 0x43, 0x30, 0xfa, 0x13, 0x00, 0x00, 0xff, 0xff, 0x75, 0x5e, 0xc1, 0xae, 0xde, 0x01,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/custom_interest_type.pb.go b/googleapis/ads/googleads/v3/enums/custom_interest_type.pb.go
new file mode 100644
index 0000000..0487bc3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/custom_interest_type.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/custom_interest_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing possible custom interest types.
+type CustomInterestTypeEnum_CustomInterestType int32
+
+const (
+	// Not specified.
+	CustomInterestTypeEnum_UNSPECIFIED CustomInterestTypeEnum_CustomInterestType = 0
+	// Used for return value only. Represents value unknown in this version.
+	CustomInterestTypeEnum_UNKNOWN CustomInterestTypeEnum_CustomInterestType = 1
+	// Allows brand advertisers to define custom affinity audience lists.
+	CustomInterestTypeEnum_CUSTOM_AFFINITY CustomInterestTypeEnum_CustomInterestType = 2
+	// Allows advertisers to define custom intent audience lists.
+	CustomInterestTypeEnum_CUSTOM_INTENT CustomInterestTypeEnum_CustomInterestType = 3
+)
+
+var CustomInterestTypeEnum_CustomInterestType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CUSTOM_AFFINITY",
+	3: "CUSTOM_INTENT",
+}
+
+var CustomInterestTypeEnum_CustomInterestType_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"CUSTOM_AFFINITY": 2,
+	"CUSTOM_INTENT":   3,
+}
+
+func (x CustomInterestTypeEnum_CustomInterestType) String() string {
+	return proto.EnumName(CustomInterestTypeEnum_CustomInterestType_name, int32(x))
+}
+
+func (CustomInterestTypeEnum_CustomInterestType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_76f3dccaa5d605c7, []int{0, 0}
+}
+
+// The types of custom interest.
+type CustomInterestTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomInterestTypeEnum) Reset()         { *m = CustomInterestTypeEnum{} }
+func (m *CustomInterestTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomInterestTypeEnum) ProtoMessage()    {}
+func (*CustomInterestTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_76f3dccaa5d605c7, []int{0}
+}
+
+func (m *CustomInterestTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomInterestTypeEnum.Unmarshal(m, b)
+}
+func (m *CustomInterestTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomInterestTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomInterestTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomInterestTypeEnum.Merge(m, src)
+}
+func (m *CustomInterestTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomInterestTypeEnum.Size(m)
+}
+func (m *CustomInterestTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomInterestTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomInterestTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CustomInterestTypeEnum_CustomInterestType", CustomInterestTypeEnum_CustomInterestType_name, CustomInterestTypeEnum_CustomInterestType_value)
+	proto.RegisterType((*CustomInterestTypeEnum)(nil), "google.ads.googleads.v3.enums.CustomInterestTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/custom_interest_type.proto", fileDescriptor_76f3dccaa5d605c7)
+}
+
+var fileDescriptor_76f3dccaa5d605c7 = []byte{
+	// 316 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x6a, 0xc2, 0x30,
+	0x1c, 0x9e, 0x15, 0x36, 0x88, 0x0c, 0xbb, 0x0e, 0x36, 0x18, 0xf3, 0xa0, 0x0f, 0x90, 0x1e, 0x72,
+	0x19, 0xd9, 0x29, 0xba, 0x2a, 0x61, 0x2c, 0x0a, 0x56, 0xc7, 0xa4, 0x20, 0x9d, 0x0d, 0xa1, 0x60,
+	0x93, 0x62, 0xa2, 0xe0, 0xeb, 0xec, 0xb8, 0x47, 0xd9, 0xa3, 0x8c, 0x3d, 0xc4, 0x68, 0xa2, 0xbd,
+	0xc8, 0x76, 0x29, 0x1f, 0xbf, 0xef, 0x4f, 0xbf, 0x7c, 0xe0, 0x41, 0x28, 0x25, 0xd6, 0x3c, 0x4c,
+	0x33, 0x1d, 0x3a, 0x58, 0xa1, 0x1d, 0x0a, 0xb9, 0xdc, 0x16, 0x3a, 0x5c, 0x6d, 0xb5, 0x51, 0xc5,
+	0x32, 0x97, 0x86, 0x6f, 0xb8, 0x36, 0x4b, 0xb3, 0x2f, 0x39, 0x2c, 0x37, 0xca, 0xa8, 0xa0, 0xe3,
+	0xe4, 0x30, 0xcd, 0x34, 0xac, 0x9d, 0x70, 0x87, 0xa0, 0x75, 0xde, 0xdd, 0x1f, 0x83, 0xcb, 0x3c,
+	0x4c, 0xa5, 0x54, 0x26, 0x35, 0xb9, 0x92, 0xda, 0x99, 0x7b, 0x06, 0xdc, 0x0c, 0x6c, 0x34, 0x3d,
+	0x24, 0xc7, 0xfb, 0x92, 0x47, 0x72, 0x5b, 0xf4, 0x16, 0x20, 0x38, 0x65, 0x82, 0x36, 0x68, 0xcd,
+	0xd8, 0x74, 0x12, 0x0d, 0xe8, 0x90, 0x46, 0x4f, 0xfe, 0x59, 0xd0, 0x02, 0x17, 0x33, 0xf6, 0xcc,
+	0xc6, 0xaf, 0xcc, 0x6f, 0x04, 0xd7, 0xa0, 0x3d, 0x98, 0x4d, 0xe3, 0xf1, 0xcb, 0x92, 0x0c, 0x87,
+	0x94, 0xd1, 0xf8, 0xcd, 0xf7, 0x82, 0x2b, 0x70, 0x79, 0x38, 0x52, 0x16, 0x47, 0x2c, 0xf6, 0x9b,
+	0xfd, 0x9f, 0x06, 0xe8, 0xae, 0x54, 0x01, 0xff, 0x6d, 0xde, 0xbf, 0x3d, 0xfd, 0xff, 0xa4, 0x2a,
+	0x3d, 0x69, 0x2c, 0xfa, 0x07, 0xa7, 0x50, 0xeb, 0x54, 0x0a, 0xa8, 0x36, 0x22, 0x14, 0x5c, 0xda,
+	0x27, 0x1d, 0xd7, 0x2b, 0x73, 0xfd, 0xc7, 0x98, 0x8f, 0xf6, 0xfb, 0xe1, 0x35, 0x47, 0x84, 0x7c,
+	0x7a, 0x9d, 0x91, 0x8b, 0x22, 0x99, 0x86, 0x0e, 0x56, 0x68, 0x8e, 0x60, 0xb5, 0x82, 0xfe, 0x3a,
+	0xf2, 0x09, 0xc9, 0x74, 0x52, 0xf3, 0xc9, 0x1c, 0x25, 0x96, 0xff, 0xf6, 0xba, 0xee, 0x88, 0x31,
+	0xc9, 0x34, 0xc6, 0xb5, 0x02, 0xe3, 0x39, 0xc2, 0xd8, 0x6a, 0xde, 0xcf, 0x6d, 0x31, 0xf4, 0x1b,
+	0x00, 0x00, 0xff, 0xff, 0x04, 0x2b, 0x31, 0x32, 0xe4, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/custom_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/custom_placeholder_field.pb.go
new file mode 100644
index 0000000..b743c1a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/custom_placeholder_field.pb.go
@@ -0,0 +1,234 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/custom_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Custom placeholder fields.
+type CustomPlaceholderFieldEnum_CustomPlaceholderField int32
+
+const (
+	// Not specified.
+	CustomPlaceholderFieldEnum_UNSPECIFIED CustomPlaceholderFieldEnum_CustomPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	CustomPlaceholderFieldEnum_UNKNOWN CustomPlaceholderFieldEnum_CustomPlaceholderField = 1
+	// Data Type: STRING. Required. Combination ID and ID2 must be unique per
+	// offer.
+	CustomPlaceholderFieldEnum_ID CustomPlaceholderFieldEnum_CustomPlaceholderField = 2
+	// Data Type: STRING. Combination ID and ID2 must be unique per offer.
+	CustomPlaceholderFieldEnum_ID2 CustomPlaceholderFieldEnum_CustomPlaceholderField = 3
+	// Data Type: STRING. Required. Main headline with product name to be shown
+	// in dynamic ad.
+	CustomPlaceholderFieldEnum_ITEM_TITLE CustomPlaceholderFieldEnum_CustomPlaceholderField = 4
+	// Data Type: STRING. Optional text to be shown in the image ad.
+	CustomPlaceholderFieldEnum_ITEM_SUBTITLE CustomPlaceholderFieldEnum_CustomPlaceholderField = 5
+	// Data Type: STRING. Optional description of the product to be shown in the
+	// ad.
+	CustomPlaceholderFieldEnum_ITEM_DESCRIPTION CustomPlaceholderFieldEnum_CustomPlaceholderField = 6
+	// Data Type: STRING. Full address of your offer or service, including
+	// postal code. This will be used to identify the closest product to the
+	// user when there are multiple offers in the feed that are relevant to the
+	// user.
+	CustomPlaceholderFieldEnum_ITEM_ADDRESS CustomPlaceholderFieldEnum_CustomPlaceholderField = 7
+	// Data Type: STRING. Price to be shown in the ad.
+	// Example: "100.00 USD"
+	CustomPlaceholderFieldEnum_PRICE CustomPlaceholderFieldEnum_CustomPlaceholderField = 8
+	// Data Type: STRING. Formatted price to be shown in the ad.
+	// Example: "Starting at $100.00 USD", "$80 - $100"
+	CustomPlaceholderFieldEnum_FORMATTED_PRICE CustomPlaceholderFieldEnum_CustomPlaceholderField = 9
+	// Data Type: STRING. Sale price to be shown in the ad.
+	// Example: "80.00 USD"
+	CustomPlaceholderFieldEnum_SALE_PRICE CustomPlaceholderFieldEnum_CustomPlaceholderField = 10
+	// Data Type: STRING. Formatted sale price to be shown in the ad.
+	// Example: "On sale for $80.00", "$60 - $80"
+	CustomPlaceholderFieldEnum_FORMATTED_SALE_PRICE CustomPlaceholderFieldEnum_CustomPlaceholderField = 11
+	// Data Type: URL. Image to be displayed in the ad. Highly recommended for
+	// image ads.
+	CustomPlaceholderFieldEnum_IMAGE_URL CustomPlaceholderFieldEnum_CustomPlaceholderField = 12
+	// Data Type: STRING. Used as a recommendation engine signal to serve items
+	// in the same category.
+	CustomPlaceholderFieldEnum_ITEM_CATEGORY CustomPlaceholderFieldEnum_CustomPlaceholderField = 13
+	// Data Type: URL_LIST. Final URLs for the ad when using Upgraded
+	// URLs. User will be redirected to these URLs when they click on an ad, or
+	// when they click on a specific product for ads that have multiple
+	// products.
+	CustomPlaceholderFieldEnum_FINAL_URLS CustomPlaceholderFieldEnum_CustomPlaceholderField = 14
+	// Data Type: URL_LIST. Final mobile URLs for the ad when using Upgraded
+	// URLs.
+	CustomPlaceholderFieldEnum_FINAL_MOBILE_URLS CustomPlaceholderFieldEnum_CustomPlaceholderField = 15
+	// Data Type: URL. Tracking template for the ad when using Upgraded URLs.
+	CustomPlaceholderFieldEnum_TRACKING_URL CustomPlaceholderFieldEnum_CustomPlaceholderField = 16
+	// Data Type: STRING_LIST. Keywords used for product retrieval.
+	CustomPlaceholderFieldEnum_CONTEXTUAL_KEYWORDS CustomPlaceholderFieldEnum_CustomPlaceholderField = 17
+	// Data Type: STRING. Android app link. Must be formatted as:
+	// android-app://{package_id}/{scheme}/{host_path}.
+	// The components are defined as follows:
+	// package_id: app ID as specified in Google Play.
+	// scheme: the scheme to pass to the application. Can be HTTP, or a custom
+	//   scheme.
+	// host_path: identifies the specific content within your application.
+	CustomPlaceholderFieldEnum_ANDROID_APP_LINK CustomPlaceholderFieldEnum_CustomPlaceholderField = 18
+	// Data Type: STRING_LIST. List of recommended IDs to show together with
+	// this item.
+	CustomPlaceholderFieldEnum_SIMILAR_IDS CustomPlaceholderFieldEnum_CustomPlaceholderField = 19
+	// Data Type: STRING. iOS app link.
+	CustomPlaceholderFieldEnum_IOS_APP_LINK CustomPlaceholderFieldEnum_CustomPlaceholderField = 20
+	// Data Type: INT64. iOS app store ID.
+	CustomPlaceholderFieldEnum_IOS_APP_STORE_ID CustomPlaceholderFieldEnum_CustomPlaceholderField = 21
+)
+
+var CustomPlaceholderFieldEnum_CustomPlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "ID",
+	3:  "ID2",
+	4:  "ITEM_TITLE",
+	5:  "ITEM_SUBTITLE",
+	6:  "ITEM_DESCRIPTION",
+	7:  "ITEM_ADDRESS",
+	8:  "PRICE",
+	9:  "FORMATTED_PRICE",
+	10: "SALE_PRICE",
+	11: "FORMATTED_SALE_PRICE",
+	12: "IMAGE_URL",
+	13: "ITEM_CATEGORY",
+	14: "FINAL_URLS",
+	15: "FINAL_MOBILE_URLS",
+	16: "TRACKING_URL",
+	17: "CONTEXTUAL_KEYWORDS",
+	18: "ANDROID_APP_LINK",
+	19: "SIMILAR_IDS",
+	20: "IOS_APP_LINK",
+	21: "IOS_APP_STORE_ID",
+}
+
+var CustomPlaceholderFieldEnum_CustomPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"ID":                   2,
+	"ID2":                  3,
+	"ITEM_TITLE":           4,
+	"ITEM_SUBTITLE":        5,
+	"ITEM_DESCRIPTION":     6,
+	"ITEM_ADDRESS":         7,
+	"PRICE":                8,
+	"FORMATTED_PRICE":      9,
+	"SALE_PRICE":           10,
+	"FORMATTED_SALE_PRICE": 11,
+	"IMAGE_URL":            12,
+	"ITEM_CATEGORY":        13,
+	"FINAL_URLS":           14,
+	"FINAL_MOBILE_URLS":    15,
+	"TRACKING_URL":         16,
+	"CONTEXTUAL_KEYWORDS":  17,
+	"ANDROID_APP_LINK":     18,
+	"SIMILAR_IDS":          19,
+	"IOS_APP_LINK":         20,
+	"IOS_APP_STORE_ID":     21,
+}
+
+func (x CustomPlaceholderFieldEnum_CustomPlaceholderField) String() string {
+	return proto.EnumName(CustomPlaceholderFieldEnum_CustomPlaceholderField_name, int32(x))
+}
+
+func (CustomPlaceholderFieldEnum_CustomPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d66efa55f2cff8c2, []int{0, 0}
+}
+
+// Values for Custom placeholder fields.
+// For more information about dynamic remarketing feeds, see
+// https://support.google.com/google-ads/answer/6053288.
+type CustomPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomPlaceholderFieldEnum) Reset()         { *m = CustomPlaceholderFieldEnum{} }
+func (m *CustomPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomPlaceholderFieldEnum) ProtoMessage()    {}
+func (*CustomPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d66efa55f2cff8c2, []int{0}
+}
+
+func (m *CustomPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *CustomPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *CustomPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomPlaceholderFieldEnum.Size(m)
+}
+func (m *CustomPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CustomPlaceholderFieldEnum_CustomPlaceholderField", CustomPlaceholderFieldEnum_CustomPlaceholderField_name, CustomPlaceholderFieldEnum_CustomPlaceholderField_value)
+	proto.RegisterType((*CustomPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.CustomPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/custom_placeholder_field.proto", fileDescriptor_d66efa55f2cff8c2)
+}
+
+var fileDescriptor_d66efa55f2cff8c2 = []byte{
+	// 525 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xcd, 0x8e, 0xda, 0x3c,
+	0x14, 0xfd, 0x06, 0xbe, 0x81, 0x62, 0x86, 0xc1, 0x18, 0xa6, 0xad, 0xa6, 0x9d, 0xc5, 0xcc, 0x03,
+	0x24, 0x52, 0xb3, 0x4b, 0xbb, 0x31, 0xb1, 0x41, 0x16, 0x21, 0x89, 0x62, 0xc3, 0x74, 0x2a, 0xa4,
+	0x28, 0x25, 0x69, 0x8a, 0x04, 0x31, 0x22, 0x30, 0xaf, 0x53, 0xa9, 0xcb, 0x3e, 0x44, 0x1f, 0xa0,
+	0x8f, 0xd2, 0x55, 0x1f, 0xa1, 0xb2, 0xc3, 0x4f, 0x17, 0xd3, 0x6e, 0xa2, 0x7b, 0xcf, 0x3d, 0xe7,
+	0xe4, 0xda, 0x3e, 0xe0, 0x5d, 0x26, 0x65, 0xb6, 0x4c, 0xcd, 0x38, 0x29, 0xcc, 0xb2, 0x54, 0xd5,
+	0xa3, 0x65, 0xa6, 0xf9, 0x6e, 0x55, 0x98, 0xf3, 0x5d, 0xb1, 0x95, 0xab, 0x68, 0xbd, 0x8c, 0xe7,
+	0xe9, 0x67, 0xb9, 0x4c, 0xd2, 0x4d, 0xf4, 0x69, 0x91, 0x2e, 0x13, 0x63, 0xbd, 0x91, 0x5b, 0x89,
+	0x6e, 0x4a, 0x89, 0x11, 0x27, 0x85, 0x71, 0x54, 0x1b, 0x8f, 0x96, 0xa1, 0xd5, 0xd7, 0xaf, 0x0f,
+	0xe6, 0xeb, 0x85, 0x19, 0xe7, 0xb9, 0xdc, 0xc6, 0xdb, 0x85, 0xcc, 0x8b, 0x52, 0x7c, 0xf7, 0xbd,
+	0x0a, 0xae, 0x1d, 0xed, 0x1f, 0x9c, 0xec, 0x07, 0xca, 0x9d, 0xe6, 0xbb, 0xd5, 0xdd, 0x97, 0x2a,
+	0x78, 0xfe, 0xf4, 0x18, 0xb5, 0x41, 0x73, 0xe2, 0xf1, 0x80, 0x3a, 0x6c, 0xc0, 0x28, 0x81, 0xff,
+	0xa1, 0x26, 0xa8, 0x4f, 0xbc, 0x91, 0xe7, 0xdf, 0x7b, 0xf0, 0x0c, 0xd5, 0x40, 0x85, 0x11, 0x58,
+	0x41, 0x75, 0x50, 0x65, 0xe4, 0x0d, 0xac, 0xa2, 0x4b, 0x00, 0x98, 0xa0, 0xe3, 0x48, 0x30, 0xe1,
+	0x52, 0xf8, 0x3f, 0xea, 0x80, 0x96, 0xee, 0xf9, 0xa4, 0x5f, 0x42, 0xe7, 0xa8, 0x07, 0xa0, 0x86,
+	0x08, 0xe5, 0x4e, 0xc8, 0x02, 0xc1, 0x7c, 0x0f, 0xd6, 0x10, 0x04, 0x17, 0x1a, 0xc5, 0x84, 0x84,
+	0x94, 0x73, 0x58, 0x47, 0x0d, 0x70, 0x1e, 0x84, 0xcc, 0xa1, 0xf0, 0x19, 0xea, 0x82, 0xf6, 0xc0,
+	0x0f, 0xc7, 0x58, 0x08, 0x4a, 0xa2, 0x12, 0x6c, 0xa8, 0x5f, 0x71, 0xec, 0xd2, 0x7d, 0x0f, 0xd0,
+	0x4b, 0xd0, 0x3b, 0x91, 0xfe, 0x98, 0x34, 0x51, 0x0b, 0x34, 0xd8, 0x18, 0x0f, 0x69, 0x34, 0x09,
+	0x5d, 0x78, 0x71, 0xdc, 0xc9, 0xc1, 0x82, 0x0e, 0xfd, 0xf0, 0x01, 0xb6, 0x94, 0xd7, 0x80, 0x79,
+	0xd8, 0x55, 0x0c, 0x0e, 0x2f, 0xd1, 0x15, 0xe8, 0x94, 0xfd, 0xd8, 0xef, 0x33, 0x97, 0x96, 0x70,
+	0x5b, 0x2d, 0x29, 0x42, 0xec, 0x8c, 0x98, 0x37, 0xd4, 0x5e, 0x10, 0xbd, 0x00, 0x5d, 0xc7, 0xf7,
+	0x04, 0x7d, 0x2f, 0x26, 0xd8, 0x8d, 0x46, 0xf4, 0xe1, 0xde, 0x0f, 0x09, 0x87, 0x1d, 0x75, 0x4a,
+	0xec, 0x91, 0xd0, 0x67, 0x24, 0xc2, 0x41, 0x10, 0xb9, 0xcc, 0x1b, 0x41, 0xa4, 0x6e, 0x93, 0xb3,
+	0x31, 0x73, 0x71, 0x18, 0x31, 0xc2, 0x61, 0x57, 0x1f, 0xdb, 0xe7, 0x27, 0x4a, 0x4f, 0x5f, 0xcf,
+	0x1e, 0xe1, 0xc2, 0x0f, 0x69, 0xc4, 0x08, 0xbc, 0xea, 0xff, 0x3a, 0x03, 0xb7, 0x73, 0xb9, 0x32,
+	0xfe, 0x19, 0x82, 0xfe, 0xab, 0xa7, 0x1f, 0x31, 0x50, 0x19, 0x08, 0xce, 0x3e, 0xf4, 0xf7, 0xea,
+	0x4c, 0x2e, 0xe3, 0x3c, 0x33, 0xe4, 0x26, 0x33, 0xb3, 0x34, 0xd7, 0x09, 0x39, 0x04, 0x72, 0xbd,
+	0x28, 0xfe, 0x92, 0xcf, 0xb7, 0xfa, 0xfb, 0xb5, 0x52, 0x1d, 0x62, 0xfc, 0xad, 0x72, 0x33, 0x2c,
+	0xad, 0x70, 0x52, 0x18, 0x65, 0xa9, 0xaa, 0xa9, 0x65, 0xa8, 0x3c, 0x15, 0x3f, 0x0e, 0xf3, 0x19,
+	0x4e, 0x8a, 0xd9, 0x71, 0x3e, 0x9b, 0x5a, 0x33, 0x3d, 0xff, 0x59, 0xb9, 0x2d, 0x41, 0xdb, 0xc6,
+	0x49, 0x61, 0xdb, 0x47, 0x86, 0x6d, 0x4f, 0x2d, 0xdb, 0xd6, 0x9c, 0x8f, 0x35, 0xbd, 0x98, 0xf5,
+	0x3b, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x4d, 0x05, 0x1f, 0x37, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/customer_match_upload_key_type.pb.go b/googleapis/ads/googleads/v3/enums/customer_match_upload_key_type.pb.go
new file mode 100644
index 0000000..d2096eb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/customer_match_upload_key_type.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/customer_match_upload_key_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible customer match upload key types.
+type CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType int32
+
+const (
+	// Not specified.
+	CustomerMatchUploadKeyTypeEnum_UNSPECIFIED CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 0
+	// Used for return value only. Represents value unknown in this version.
+	CustomerMatchUploadKeyTypeEnum_UNKNOWN CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 1
+	// Members are matched from customer info such as email address, phone
+	// number or physical address.
+	CustomerMatchUploadKeyTypeEnum_CONTACT_INFO CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 2
+	// Members are matched from a user id generated and assigned by the
+	// advertiser.
+	CustomerMatchUploadKeyTypeEnum_CRM_ID CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 3
+	// Members are matched from mobile advertising ids.
+	CustomerMatchUploadKeyTypeEnum_MOBILE_ADVERTISING_ID CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 4
+)
+
+var CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CONTACT_INFO",
+	3: "CRM_ID",
+	4: "MOBILE_ADVERTISING_ID",
+}
+
+var CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_value = map[string]int32{
+	"UNSPECIFIED":           0,
+	"UNKNOWN":               1,
+	"CONTACT_INFO":          2,
+	"CRM_ID":                3,
+	"MOBILE_ADVERTISING_ID": 4,
+}
+
+func (x CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType) String() string {
+	return proto.EnumName(CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_name, int32(x))
+}
+
+func (CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_5ec82e81541fd3d7, []int{0, 0}
+}
+
+// Indicates what type of data are the user list's members matched from.
+type CustomerMatchUploadKeyTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomerMatchUploadKeyTypeEnum) Reset()         { *m = CustomerMatchUploadKeyTypeEnum{} }
+func (m *CustomerMatchUploadKeyTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomerMatchUploadKeyTypeEnum) ProtoMessage()    {}
+func (*CustomerMatchUploadKeyTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5ec82e81541fd3d7, []int{0}
+}
+
+func (m *CustomerMatchUploadKeyTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerMatchUploadKeyTypeEnum.Unmarshal(m, b)
+}
+func (m *CustomerMatchUploadKeyTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerMatchUploadKeyTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomerMatchUploadKeyTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerMatchUploadKeyTypeEnum.Merge(m, src)
+}
+func (m *CustomerMatchUploadKeyTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomerMatchUploadKeyTypeEnum.Size(m)
+}
+func (m *CustomerMatchUploadKeyTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerMatchUploadKeyTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerMatchUploadKeyTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType", CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_name, CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_value)
+	proto.RegisterType((*CustomerMatchUploadKeyTypeEnum)(nil), "google.ads.googleads.v3.enums.CustomerMatchUploadKeyTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/customer_match_upload_key_type.proto", fileDescriptor_5ec82e81541fd3d7)
+}
+
+var fileDescriptor_5ec82e81541fd3d7 = []byte{
+	// 354 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0x6a, 0xab, 0x40,
+	0x14, 0x7d, 0x9a, 0x47, 0x1e, 0x4c, 0x1e, 0x3c, 0x11, 0xde, 0xa2, 0xa1, 0x69, 0x49, 0x3e, 0x60,
+	0x5c, 0xb8, 0x9b, 0xae, 0xd4, 0x98, 0x20, 0x69, 0xc6, 0x90, 0x18, 0x0b, 0x45, 0x18, 0xa6, 0x71,
+	0xb0, 0xa1, 0x71, 0x46, 0x32, 0x1a, 0xf0, 0x43, 0xfa, 0x03, 0x5d, 0xf6, 0x53, 0xfa, 0x29, 0x5d,
+	0xf7, 0x03, 0x8a, 0x63, 0x92, 0x5d, 0xba, 0x91, 0x83, 0xe7, 0xde, 0x73, 0xee, 0x39, 0x03, 0xdc,
+	0x4c, 0x88, 0x6c, 0xc7, 0x2c, 0x9a, 0x4a, 0xab, 0x85, 0x0d, 0x3a, 0xd8, 0x16, 0xe3, 0x55, 0x2e,
+	0xad, 0x4d, 0x25, 0x4b, 0x91, 0xb3, 0x3d, 0xc9, 0x69, 0xb9, 0x79, 0x26, 0x55, 0xb1, 0x13, 0x34,
+	0x25, 0x2f, 0xac, 0x26, 0x65, 0x5d, 0x30, 0x58, 0xec, 0x45, 0x29, 0xcc, 0x41, 0xbb, 0x08, 0x69,
+	0x2a, 0xe1, 0x59, 0x03, 0x1e, 0x6c, 0xa8, 0x34, 0xfa, 0xd7, 0x27, 0x8b, 0x62, 0x6b, 0x51, 0xce,
+	0x45, 0x49, 0xcb, 0xad, 0xe0, 0xb2, 0x5d, 0x1e, 0xbd, 0x6a, 0xe0, 0xc6, 0x3b, 0xba, 0xcc, 0x1b,
+	0x93, 0xb5, 0xf2, 0x98, 0xb1, 0x3a, 0xaa, 0x0b, 0xe6, 0xf3, 0x2a, 0x1f, 0x49, 0xd0, 0xbf, 0x3c,
+	0x61, 0xfe, 0x03, 0xbd, 0x35, 0x5e, 0x2d, 0x7c, 0x2f, 0x98, 0x04, 0xfe, 0xd8, 0xf8, 0x65, 0xf6,
+	0xc0, 0x9f, 0x35, 0x9e, 0xe1, 0xf0, 0x01, 0x1b, 0x9a, 0x69, 0x80, 0xbf, 0x5e, 0x88, 0x23, 0xc7,
+	0x8b, 0x48, 0x80, 0x27, 0xa1, 0xa1, 0x9b, 0x00, 0x74, 0xbd, 0xe5, 0x9c, 0x04, 0x63, 0xa3, 0x63,
+	0x5e, 0x81, 0xff, 0xf3, 0xd0, 0x0d, 0xee, 0x7d, 0xe2, 0x8c, 0x63, 0x7f, 0x19, 0x05, 0xab, 0x00,
+	0x4f, 0x1b, 0xea, 0xb7, 0xfb, 0xa5, 0x81, 0xe1, 0x46, 0xe4, 0xf0, 0xc7, 0x6c, 0xee, 0xed, 0xe5,
+	0xc3, 0x16, 0x4d, 0xbc, 0x85, 0xf6, 0x78, 0x6c, 0x18, 0x66, 0x62, 0x47, 0x79, 0x06, 0xc5, 0x3e,
+	0xb3, 0x32, 0xc6, 0x55, 0xf8, 0x53, 0xe3, 0xc5, 0x56, 0x5e, 0x78, 0x80, 0x3b, 0xf5, 0x7d, 0xd3,
+	0x3b, 0x53, 0xc7, 0x79, 0xd7, 0x07, 0xd3, 0x56, 0xca, 0x49, 0x25, 0x6c, 0x61, 0x83, 0x62, 0x1b,
+	0x36, 0x35, 0xc9, 0x8f, 0x13, 0x9f, 0x38, 0xa9, 0x4c, 0xce, 0x7c, 0x12, 0xdb, 0x89, 0xe2, 0x3f,
+	0xf5, 0x61, 0xfb, 0x13, 0x21, 0x27, 0x95, 0x08, 0x9d, 0x27, 0x10, 0x8a, 0x6d, 0x84, 0xd4, 0xcc,
+	0x53, 0x57, 0x1d, 0x66, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x96, 0x90, 0xd2, 0x18, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/customer_pay_per_conversion_eligibility_failure_reason.pb.go b/googleapis/ads/googleads/v3/enums/customer_pay_per_conversion_eligibility_failure_reason.pb.go
new file mode 100644
index 0000000..e62c625
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/customer_pay_per_conversion_eligibility_failure_reason.pb.go
@@ -0,0 +1,161 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/customer_pay_per_conversion_eligibility_failure_reason.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible reasons a customer is not eligible to use
+// PaymentMode.CONVERSIONS.
+type CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason int32
+
+const (
+	// Not specified.
+	CustomerPayPerConversionEligibilityFailureReasonEnum_UNSPECIFIED CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason = 0
+	// Used for return value only. Represents value unknown in this version.
+	CustomerPayPerConversionEligibilityFailureReasonEnum_UNKNOWN CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason = 1
+	// Customer does not have enough conversions.
+	CustomerPayPerConversionEligibilityFailureReasonEnum_NOT_ENOUGH_CONVERSIONS CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason = 2
+	// Customer's conversion lag is too high.
+	CustomerPayPerConversionEligibilityFailureReasonEnum_CONVERSION_LAG_TOO_HIGH CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason = 3
+	// Customer uses shared budgets.
+	CustomerPayPerConversionEligibilityFailureReasonEnum_HAS_CAMPAIGN_WITH_SHARED_BUDGET CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason = 4
+	// Customer has conversions with ConversionActionType.UPLOAD_CLICKS.
+	CustomerPayPerConversionEligibilityFailureReasonEnum_HAS_UPLOAD_CLICKS_CONVERSION CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason = 5
+	// Customer's average daily spend is too high.
+	CustomerPayPerConversionEligibilityFailureReasonEnum_AVERAGE_DAILY_SPEND_TOO_HIGH CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason = 6
+	// Customer's eligibility has not yet been calculated by the Google Ads
+	// backend. Check back soon.
+	CustomerPayPerConversionEligibilityFailureReasonEnum_ANALYSIS_NOT_COMPLETE CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason = 7
+	// Customer is not eligible due to other reasons.
+	CustomerPayPerConversionEligibilityFailureReasonEnum_OTHER CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason = 8
+)
+
+var CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "NOT_ENOUGH_CONVERSIONS",
+	3: "CONVERSION_LAG_TOO_HIGH",
+	4: "HAS_CAMPAIGN_WITH_SHARED_BUDGET",
+	5: "HAS_UPLOAD_CLICKS_CONVERSION",
+	6: "AVERAGE_DAILY_SPEND_TOO_HIGH",
+	7: "ANALYSIS_NOT_COMPLETE",
+	8: "OTHER",
+}
+
+var CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason_value = map[string]int32{
+	"UNSPECIFIED":                     0,
+	"UNKNOWN":                         1,
+	"NOT_ENOUGH_CONVERSIONS":          2,
+	"CONVERSION_LAG_TOO_HIGH":         3,
+	"HAS_CAMPAIGN_WITH_SHARED_BUDGET": 4,
+	"HAS_UPLOAD_CLICKS_CONVERSION":    5,
+	"AVERAGE_DAILY_SPEND_TOO_HIGH":    6,
+	"ANALYSIS_NOT_COMPLETE":           7,
+	"OTHER":                           8,
+}
+
+func (x CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason) String() string {
+	return proto.EnumName(CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason_name, int32(x))
+}
+
+func (CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2816f84d40fc8b20, []int{0, 0}
+}
+
+// Container for enum describing reasons why a customer is not eligible to use
+// PaymentMode.CONVERSIONS.
+type CustomerPayPerConversionEligibilityFailureReasonEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomerPayPerConversionEligibilityFailureReasonEnum) Reset() {
+	*m = CustomerPayPerConversionEligibilityFailureReasonEnum{}
+}
+func (m *CustomerPayPerConversionEligibilityFailureReasonEnum) String() string {
+	return proto.CompactTextString(m)
+}
+func (*CustomerPayPerConversionEligibilityFailureReasonEnum) ProtoMessage() {}
+func (*CustomerPayPerConversionEligibilityFailureReasonEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2816f84d40fc8b20, []int{0}
+}
+
+func (m *CustomerPayPerConversionEligibilityFailureReasonEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerPayPerConversionEligibilityFailureReasonEnum.Unmarshal(m, b)
+}
+func (m *CustomerPayPerConversionEligibilityFailureReasonEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerPayPerConversionEligibilityFailureReasonEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomerPayPerConversionEligibilityFailureReasonEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerPayPerConversionEligibilityFailureReasonEnum.Merge(m, src)
+}
+func (m *CustomerPayPerConversionEligibilityFailureReasonEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomerPayPerConversionEligibilityFailureReasonEnum.Size(m)
+}
+func (m *CustomerPayPerConversionEligibilityFailureReasonEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerPayPerConversionEligibilityFailureReasonEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerPayPerConversionEligibilityFailureReasonEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason", CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason_name, CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason_value)
+	proto.RegisterType((*CustomerPayPerConversionEligibilityFailureReasonEnum)(nil), "google.ads.googleads.v3.enums.CustomerPayPerConversionEligibilityFailureReasonEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/customer_pay_per_conversion_eligibility_failure_reason.proto", fileDescriptor_2816f84d40fc8b20)
+}
+
+var fileDescriptor_2816f84d40fc8b20 = []byte{
+	// 476 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0x6f, 0x94, 0x40,
+	0x18, 0xc6, 0x2d, 0xb5, 0xad, 0x4e, 0x0f, 0x12, 0x12, 0x35, 0xd6, 0x36, 0xda, 0x7a, 0x07, 0x13,
+	0xf4, 0x82, 0xa7, 0x59, 0x98, 0x02, 0x29, 0x9d, 0x21, 0xfc, 0x6b, 0xda, 0x6c, 0x32, 0xa1, 0xcb,
+	0x48, 0x48, 0xd8, 0x19, 0xc2, 0xb0, 0x9b, 0xec, 0x57, 0xf0, 0x13, 0x78, 0xf6, 0xe8, 0x47, 0xf1,
+	0xe6, 0xd7, 0xf0, 0x53, 0x18, 0xa0, 0xbb, 0xeb, 0xc5, 0x26, 0x7b, 0x21, 0x4f, 0xe6, 0x7d, 0xe6,
+	0xf9, 0x4d, 0x78, 0x5e, 0x70, 0x57, 0x0a, 0x51, 0xd6, 0xcc, 0xc8, 0x0b, 0x69, 0x8c, 0xb2, 0x57,
+	0x4b, 0xd3, 0x60, 0x7c, 0x31, 0x97, 0xc6, 0x6c, 0x21, 0x3b, 0x31, 0x67, 0x2d, 0x6d, 0xf2, 0x15,
+	0x6d, 0x58, 0x4b, 0x67, 0x82, 0x2f, 0x59, 0x2b, 0x2b, 0xc1, 0x29, 0xab, 0xab, 0xb2, 0xba, 0xaf,
+	0xea, 0xaa, 0x5b, 0xd1, 0xaf, 0x79, 0x55, 0x2f, 0x5a, 0x46, 0x5b, 0x96, 0x4b, 0xc1, 0xf5, 0xa6,
+	0x15, 0x9d, 0xd0, 0xce, 0xc6, 0x40, 0x3d, 0x2f, 0xa4, 0xbe, 0xc9, 0xd6, 0x97, 0xa6, 0x3e, 0x64,
+	0x9f, 0x9c, 0xae, 0xd1, 0x4d, 0x65, 0xe4, 0x9c, 0x8b, 0x2e, 0xef, 0x2a, 0xc1, 0xe5, 0x78, 0xf9,
+	0xe2, 0xb7, 0x02, 0x3e, 0xd9, 0x0f, 0xf4, 0x30, 0x5f, 0x85, 0xac, 0xb5, 0x37, 0x68, 0xb4, 0x25,
+	0x5f, 0x8e, 0xe0, 0x68, 0xe0, 0x22, 0xbe, 0x98, 0x5f, 0x7c, 0x57, 0xc0, 0xc7, 0x5d, 0x2f, 0x6a,
+	0x2f, 0xc0, 0x71, 0x8a, 0xe3, 0x10, 0xd9, 0xfe, 0xa5, 0x8f, 0x1c, 0xf5, 0x89, 0x76, 0x0c, 0x8e,
+	0x52, 0x7c, 0x85, 0xc9, 0x0d, 0x56, 0xf7, 0xb4, 0x13, 0xf0, 0x0a, 0x93, 0x84, 0x22, 0x4c, 0x52,
+	0xd7, 0xa3, 0x36, 0xc1, 0x19, 0x8a, 0x62, 0x9f, 0xe0, 0x58, 0x55, 0xb4, 0xb7, 0xe0, 0xf5, 0xf6,
+	0x80, 0x06, 0xd0, 0xa5, 0x09, 0x21, 0xd4, 0xf3, 0x5d, 0x4f, 0xdd, 0xd7, 0x3e, 0x80, 0x77, 0x1e,
+	0x8c, 0xa9, 0x0d, 0xaf, 0x43, 0xe8, 0xbb, 0x98, 0xde, 0xf8, 0x89, 0x47, 0x63, 0x0f, 0x46, 0xc8,
+	0xa1, 0x93, 0xd4, 0x71, 0x51, 0xa2, 0x3e, 0xd5, 0xde, 0x83, 0xd3, 0xde, 0x94, 0x86, 0x01, 0x81,
+	0x0e, 0xb5, 0x03, 0xdf, 0xbe, 0x8a, 0xff, 0x81, 0xa8, 0x07, 0xbd, 0x03, 0x66, 0x28, 0x82, 0x2e,
+	0xa2, 0x0e, 0xf4, 0x83, 0x5b, 0x1a, 0x87, 0x08, 0x3b, 0x5b, 0xd0, 0xa1, 0xf6, 0x06, 0xbc, 0x84,
+	0x18, 0x06, 0xb7, 0xb1, 0x1f, 0xd3, 0xfe, 0xa9, 0x36, 0xb9, 0x0e, 0x03, 0x94, 0x20, 0xf5, 0x48,
+	0x7b, 0x0e, 0x0e, 0x48, 0xe2, 0xa1, 0x48, 0x7d, 0x36, 0xf9, 0xa6, 0x80, 0xf3, 0x99, 0x98, 0xeb,
+	0x8f, 0xf6, 0x32, 0xf9, 0xbc, 0xeb, 0xdf, 0x0b, 0xfb, 0xc2, 0xc2, 0xbd, 0xbb, 0xc9, 0x43, 0x6e,
+	0x29, 0xea, 0x9c, 0x97, 0xba, 0x68, 0x4b, 0xa3, 0x64, 0x7c, 0xa8, 0x73, 0xbd, 0x5b, 0x4d, 0x25,
+	0xff, 0xb3, 0x6a, 0x5f, 0x86, 0xef, 0x0f, 0x65, 0xdf, 0x85, 0xf0, 0xa7, 0x72, 0xe6, 0x8e, 0x51,
+	0xb0, 0x90, 0xfa, 0x28, 0x7b, 0x95, 0x99, 0x7a, 0x5f, 0xb1, 0xfc, 0xb5, 0x9e, 0x4f, 0x61, 0x21,
+	0xa7, 0x9b, 0xf9, 0x34, 0x33, 0xa7, 0xc3, 0xfc, 0x8f, 0x72, 0x3e, 0x1e, 0x5a, 0x16, 0x2c, 0xa4,
+	0x65, 0x6d, 0x1c, 0x96, 0x95, 0x99, 0x96, 0x35, 0x78, 0xee, 0x0f, 0x87, 0x87, 0x99, 0x7f, 0x03,
+	0x00, 0x00, 0xff, 0xff, 0xff, 0xea, 0x85, 0xe1, 0x02, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/data_driven_model_status.pb.go b/googleapis/ads/googleads/v3/enums/data_driven_model_status.pb.go
new file mode 100644
index 0000000..24b1975
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/data_driven_model_status.pb.go
@@ -0,0 +1,140 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/data_driven_model_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates data driven model statuses.
+type DataDrivenModelStatusEnum_DataDrivenModelStatus int32
+
+const (
+	// Not specified.
+	DataDrivenModelStatusEnum_UNSPECIFIED DataDrivenModelStatusEnum_DataDrivenModelStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	DataDrivenModelStatusEnum_UNKNOWN DataDrivenModelStatusEnum_DataDrivenModelStatus = 1
+	// The data driven model is available.
+	DataDrivenModelStatusEnum_AVAILABLE DataDrivenModelStatusEnum_DataDrivenModelStatus = 2
+	// The data driven model is stale. It hasn't been updated for at least 7
+	// days. It is still being used, but will become expired if it does not get
+	// updated for 30 days.
+	DataDrivenModelStatusEnum_STALE DataDrivenModelStatusEnum_DataDrivenModelStatus = 3
+	// The data driven model expired. It hasn't been updated for at least 30
+	// days and cannot be used. Most commonly this is because there hasn't been
+	// the required number of events in a recent 30-day period.
+	DataDrivenModelStatusEnum_EXPIRED DataDrivenModelStatusEnum_DataDrivenModelStatus = 4
+	// The data driven model has never been generated. Most commonly this is
+	// because there has never been the required number of events in any 30-day
+	// period.
+	DataDrivenModelStatusEnum_NEVER_GENERATED DataDrivenModelStatusEnum_DataDrivenModelStatus = 5
+)
+
+var DataDrivenModelStatusEnum_DataDrivenModelStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AVAILABLE",
+	3: "STALE",
+	4: "EXPIRED",
+	5: "NEVER_GENERATED",
+}
+
+var DataDrivenModelStatusEnum_DataDrivenModelStatus_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"AVAILABLE":       2,
+	"STALE":           3,
+	"EXPIRED":         4,
+	"NEVER_GENERATED": 5,
+}
+
+func (x DataDrivenModelStatusEnum_DataDrivenModelStatus) String() string {
+	return proto.EnumName(DataDrivenModelStatusEnum_DataDrivenModelStatus_name, int32(x))
+}
+
+func (DataDrivenModelStatusEnum_DataDrivenModelStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6532b7607ba422ff, []int{0, 0}
+}
+
+// Container for enum indicating data driven model status.
+type DataDrivenModelStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DataDrivenModelStatusEnum) Reset()         { *m = DataDrivenModelStatusEnum{} }
+func (m *DataDrivenModelStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*DataDrivenModelStatusEnum) ProtoMessage()    {}
+func (*DataDrivenModelStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6532b7607ba422ff, []int{0}
+}
+
+func (m *DataDrivenModelStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DataDrivenModelStatusEnum.Unmarshal(m, b)
+}
+func (m *DataDrivenModelStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DataDrivenModelStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *DataDrivenModelStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DataDrivenModelStatusEnum.Merge(m, src)
+}
+func (m *DataDrivenModelStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_DataDrivenModelStatusEnum.Size(m)
+}
+func (m *DataDrivenModelStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DataDrivenModelStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DataDrivenModelStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.DataDrivenModelStatusEnum_DataDrivenModelStatus", DataDrivenModelStatusEnum_DataDrivenModelStatus_name, DataDrivenModelStatusEnum_DataDrivenModelStatus_value)
+	proto.RegisterType((*DataDrivenModelStatusEnum)(nil), "google.ads.googleads.v3.enums.DataDrivenModelStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/data_driven_model_status.proto", fileDescriptor_6532b7607ba422ff)
+}
+
+var fileDescriptor_6532b7607ba422ff = []byte{
+	// 342 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x3d, 0x4e, 0xfb, 0x30,
+	0x1c, 0xfd, 0x27, 0xfd, 0x17, 0x54, 0x57, 0xa8, 0x51, 0x10, 0x03, 0x15, 0x1d, 0xda, 0x03, 0x38,
+	0x43, 0x36, 0xc3, 0xe2, 0x10, 0x53, 0x45, 0x94, 0x10, 0xf5, 0x23, 0x20, 0x14, 0x29, 0x32, 0x38,
+	0x8a, 0x22, 0x35, 0x76, 0xa9, 0xdd, 0x1e, 0x83, 0x43, 0x30, 0x72, 0x14, 0x8e, 0xc2, 0xc2, 0x15,
+	0x50, 0x9c, 0x36, 0x53, 0x61, 0xb1, 0x9e, 0xfc, 0x3e, 0xf4, 0x7b, 0x0f, 0x5c, 0xe5, 0x42, 0xe4,
+	0xcb, 0xcc, 0xa1, 0x4c, 0x3a, 0x35, 0xac, 0xd0, 0xd6, 0x75, 0x32, 0xbe, 0x29, 0xa5, 0xc3, 0xa8,
+	0xa2, 0x29, 0x5b, 0x17, 0xdb, 0x8c, 0xa7, 0xa5, 0x60, 0xd9, 0x32, 0x95, 0x8a, 0xaa, 0x8d, 0x84,
+	0xab, 0xb5, 0x50, 0xc2, 0x1e, 0xd4, 0x16, 0x48, 0x99, 0x84, 0x8d, 0x1b, 0x6e, 0x5d, 0xa8, 0xdd,
+	0xfd, 0x8b, 0x7d, 0xf8, 0xaa, 0x70, 0x28, 0xe7, 0x42, 0x51, 0x55, 0x08, 0xbe, 0x33, 0x8f, 0xde,
+	0x0c, 0x70, 0xee, 0x53, 0x45, 0x7d, 0x1d, 0x7f, 0x57, 0xa5, 0xcf, 0x74, 0x38, 0xe1, 0x9b, 0x72,
+	0xf4, 0x0a, 0xce, 0x0e, 0x92, 0x76, 0x0f, 0x74, 0x17, 0xe1, 0x2c, 0x22, 0xd7, 0xc1, 0x4d, 0x40,
+	0x7c, 0xeb, 0x9f, 0xdd, 0x05, 0xc7, 0x8b, 0xf0, 0x36, 0xbc, 0x7f, 0x08, 0x2d, 0xc3, 0x3e, 0x01,
+	0x1d, 0x1c, 0xe3, 0x60, 0x82, 0xbd, 0x09, 0xb1, 0x4c, 0xbb, 0x03, 0xda, 0xb3, 0x39, 0x9e, 0x10,
+	0xab, 0x55, 0xc9, 0xc8, 0x63, 0x14, 0x4c, 0x89, 0x6f, 0xfd, 0xb7, 0x4f, 0x41, 0x2f, 0x24, 0x31,
+	0x99, 0xa6, 0x63, 0x12, 0x92, 0x29, 0x9e, 0x13, 0xdf, 0x6a, 0x7b, 0xdf, 0x06, 0x18, 0xbe, 0x88,
+	0x12, 0xfe, 0x59, 0xca, 0xeb, 0x1f, 0x3c, 0x2b, 0xaa, 0x2a, 0x45, 0xc6, 0x93, 0xb7, 0x33, 0xe7,
+	0x62, 0x49, 0x79, 0x0e, 0xc5, 0x3a, 0x77, 0xf2, 0x8c, 0xeb, 0xc2, 0xfb, 0x7d, 0x57, 0x85, 0xfc,
+	0x65, 0xee, 0x4b, 0xfd, 0xbe, 0x9b, 0xad, 0x31, 0xc6, 0x1f, 0xe6, 0x60, 0x5c, 0x47, 0x61, 0x26,
+	0x61, 0x0d, 0x2b, 0x14, 0xbb, 0xb0, 0xda, 0x47, 0x7e, 0xee, 0xf9, 0x04, 0x33, 0x99, 0x34, 0x7c,
+	0x12, 0xbb, 0x89, 0xe6, 0xbf, 0xcc, 0x61, 0xfd, 0x89, 0x10, 0x66, 0x12, 0xa1, 0x46, 0x81, 0x50,
+	0xec, 0x22, 0xa4, 0x35, 0xcf, 0x47, 0xfa, 0x30, 0xf7, 0x27, 0x00, 0x00, 0xff, 0xff, 0x24, 0x32,
+	0x20, 0xac, 0x06, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/day_of_week.pb.go b/googleapis/ads/googleads/v3/enums/day_of_week.pb.go
new file mode 100644
index 0000000..61719a8
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/day_of_week.pb.go
@@ -0,0 +1,146 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/day_of_week.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates days of the week, e.g., "Monday".
+type DayOfWeekEnum_DayOfWeek int32
+
+const (
+	// Not specified.
+	DayOfWeekEnum_UNSPECIFIED DayOfWeekEnum_DayOfWeek = 0
+	// The value is unknown in this version.
+	DayOfWeekEnum_UNKNOWN DayOfWeekEnum_DayOfWeek = 1
+	// Monday.
+	DayOfWeekEnum_MONDAY DayOfWeekEnum_DayOfWeek = 2
+	// Tuesday.
+	DayOfWeekEnum_TUESDAY DayOfWeekEnum_DayOfWeek = 3
+	// Wednesday.
+	DayOfWeekEnum_WEDNESDAY DayOfWeekEnum_DayOfWeek = 4
+	// Thursday.
+	DayOfWeekEnum_THURSDAY DayOfWeekEnum_DayOfWeek = 5
+	// Friday.
+	DayOfWeekEnum_FRIDAY DayOfWeekEnum_DayOfWeek = 6
+	// Saturday.
+	DayOfWeekEnum_SATURDAY DayOfWeekEnum_DayOfWeek = 7
+	// Sunday.
+	DayOfWeekEnum_SUNDAY DayOfWeekEnum_DayOfWeek = 8
+)
+
+var DayOfWeekEnum_DayOfWeek_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "MONDAY",
+	3: "TUESDAY",
+	4: "WEDNESDAY",
+	5: "THURSDAY",
+	6: "FRIDAY",
+	7: "SATURDAY",
+	8: "SUNDAY",
+}
+
+var DayOfWeekEnum_DayOfWeek_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"MONDAY":      2,
+	"TUESDAY":     3,
+	"WEDNESDAY":   4,
+	"THURSDAY":    5,
+	"FRIDAY":      6,
+	"SATURDAY":    7,
+	"SUNDAY":      8,
+}
+
+func (x DayOfWeekEnum_DayOfWeek) String() string {
+	return proto.EnumName(DayOfWeekEnum_DayOfWeek_name, int32(x))
+}
+
+func (DayOfWeekEnum_DayOfWeek) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6abebbff3028d41d, []int{0, 0}
+}
+
+// Container for enumeration of days of the week, e.g., "Monday".
+type DayOfWeekEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DayOfWeekEnum) Reset()         { *m = DayOfWeekEnum{} }
+func (m *DayOfWeekEnum) String() string { return proto.CompactTextString(m) }
+func (*DayOfWeekEnum) ProtoMessage()    {}
+func (*DayOfWeekEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6abebbff3028d41d, []int{0}
+}
+
+func (m *DayOfWeekEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DayOfWeekEnum.Unmarshal(m, b)
+}
+func (m *DayOfWeekEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DayOfWeekEnum.Marshal(b, m, deterministic)
+}
+func (m *DayOfWeekEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DayOfWeekEnum.Merge(m, src)
+}
+func (m *DayOfWeekEnum) XXX_Size() int {
+	return xxx_messageInfo_DayOfWeekEnum.Size(m)
+}
+func (m *DayOfWeekEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DayOfWeekEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DayOfWeekEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.DayOfWeekEnum_DayOfWeek", DayOfWeekEnum_DayOfWeek_name, DayOfWeekEnum_DayOfWeek_value)
+	proto.RegisterType((*DayOfWeekEnum)(nil), "google.ads.googleads.v3.enums.DayOfWeekEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/day_of_week.proto", fileDescriptor_6abebbff3028d41d)
+}
+
+var fileDescriptor_6abebbff3028d41d = []byte{
+	// 341 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4e, 0x02, 0x31,
+	0x14, 0xc6, 0x9d, 0x41, 0xf9, 0x53, 0x44, 0xc9, 0x2c, 0x8d, 0x2c, 0xe0, 0x00, 0x9d, 0xc5, 0xec,
+	0xea, 0xaa, 0x38, 0x03, 0x12, 0xe3, 0x40, 0x18, 0x06, 0xa2, 0x99, 0x84, 0x54, 0xa7, 0x34, 0x04,
+	0x68, 0x09, 0x05, 0x0c, 0x07, 0xf0, 0x0c, 0xee, 0x5d, 0x7a, 0x14, 0xaf, 0xe1, 0xce, 0x53, 0x98,
+	0xb6, 0xcc, 0xec, 0x74, 0xd3, 0x7c, 0x5f, 0x7f, 0xef, 0x7b, 0x79, 0xef, 0x01, 0x97, 0x09, 0xc1,
+	0x96, 0xd4, 0x25, 0xa9, 0x3c, 0x4a, 0xa5, 0xf6, 0x9e, 0x4b, 0xf9, 0x6e, 0x25, 0xdd, 0x94, 0x1c,
+	0xa6, 0x62, 0x36, 0x7d, 0xa5, 0x74, 0x01, 0xd7, 0x1b, 0xb1, 0x15, 0x4e, 0xc3, 0x54, 0x41, 0x92,
+	0x4a, 0x98, 0x07, 0xe0, 0xde, 0x83, 0x3a, 0x70, 0x75, 0x9d, 0xf5, 0x5b, 0xcf, 0x5d, 0xc2, 0xb9,
+	0xd8, 0x92, 0xed, 0x5c, 0x70, 0x69, 0xc2, 0xad, 0x77, 0x0b, 0xd4, 0x7c, 0x72, 0xe8, 0xcf, 0x26,
+	0x94, 0x2e, 0x02, 0xbe, 0x5b, 0xb5, 0xde, 0x2c, 0x50, 0xc9, 0x7f, 0x9c, 0x4b, 0x50, 0x8d, 0xc3,
+	0x68, 0x10, 0xdc, 0xf6, 0x3a, 0xbd, 0xc0, 0xaf, 0x9f, 0x38, 0x55, 0x50, 0x8a, 0xc3, 0xfb, 0xb0,
+	0x3f, 0x09, 0xeb, 0x96, 0x03, 0x40, 0xf1, 0xa1, 0x1f, 0xfa, 0xf8, 0xb1, 0x6e, 0x2b, 0x30, 0x8a,
+	0x83, 0x48, 0x99, 0x82, 0x53, 0x03, 0x95, 0x49, 0xe0, 0x87, 0xc6, 0x9e, 0x3a, 0xe7, 0xa0, 0x3c,
+	0xba, 0x8b, 0x87, 0xda, 0x9d, 0xa9, 0x54, 0x67, 0xd8, 0x53, 0xba, 0xa8, 0x48, 0x84, 0x47, 0xf1,
+	0x50, 0xb9, 0x92, 0x22, 0x51, 0xac, 0xfb, 0x95, 0xdb, 0xdf, 0x16, 0x68, 0xbe, 0x88, 0x15, 0xfc,
+	0x77, 0xbb, 0xf6, 0x45, 0x3e, 0xea, 0x40, 0xed, 0x33, 0xb0, 0x9e, 0xda, 0xc7, 0x00, 0x13, 0x4b,
+	0xc2, 0x19, 0x14, 0x1b, 0xe6, 0x32, 0xca, 0xf5, 0xb6, 0xd9, 0x3d, 0xd7, 0x73, 0xf9, 0xc7, 0x79,
+	0x6f, 0xf4, 0xfb, 0x61, 0x17, 0xba, 0x18, 0x7f, 0xda, 0x8d, 0xae, 0x69, 0x85, 0x53, 0x09, 0x8d,
+	0x54, 0x6a, 0xec, 0x41, 0x75, 0x28, 0xf9, 0x95, 0xf1, 0x04, 0xa7, 0x32, 0xc9, 0x79, 0x32, 0xf6,
+	0x12, 0xcd, 0x7f, 0xec, 0xa6, 0xf9, 0x44, 0x08, 0xa7, 0x12, 0xa1, 0xbc, 0x02, 0xa1, 0xb1, 0x87,
+	0x90, 0xae, 0x79, 0x2e, 0xea, 0xc1, 0xbc, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0x1e, 0x80,
+	0x91, 0xf6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/device.pb.go b/googleapis/ads/googleads/v3/enums/device.pb.go
new file mode 100644
index 0000000..68e427a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/device.pb.go
@@ -0,0 +1,136 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/device.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates Google Ads devices available for targeting.
+type DeviceEnum_Device int32
+
+const (
+	// Not specified.
+	DeviceEnum_UNSPECIFIED DeviceEnum_Device = 0
+	// The value is unknown in this version.
+	DeviceEnum_UNKNOWN DeviceEnum_Device = 1
+	// Mobile devices with full browsers.
+	DeviceEnum_MOBILE DeviceEnum_Device = 2
+	// Tablets with full browsers.
+	DeviceEnum_TABLET DeviceEnum_Device = 3
+	// Computers.
+	DeviceEnum_DESKTOP DeviceEnum_Device = 4
+	// Smart TVs and game consoles.
+	DeviceEnum_CONNECTED_TV DeviceEnum_Device = 6
+	// Other device types.
+	DeviceEnum_OTHER DeviceEnum_Device = 5
+)
+
+var DeviceEnum_Device_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "MOBILE",
+	3: "TABLET",
+	4: "DESKTOP",
+	6: "CONNECTED_TV",
+	5: "OTHER",
+}
+
+var DeviceEnum_Device_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"MOBILE":       2,
+	"TABLET":       3,
+	"DESKTOP":      4,
+	"CONNECTED_TV": 6,
+	"OTHER":        5,
+}
+
+func (x DeviceEnum_Device) String() string {
+	return proto.EnumName(DeviceEnum_Device_name, int32(x))
+}
+
+func (DeviceEnum_Device) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c7b3fa303d57f3cb, []int{0, 0}
+}
+
+// Container for enumeration of Google Ads devices available for targeting.
+type DeviceEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeviceEnum) Reset()         { *m = DeviceEnum{} }
+func (m *DeviceEnum) String() string { return proto.CompactTextString(m) }
+func (*DeviceEnum) ProtoMessage()    {}
+func (*DeviceEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c7b3fa303d57f3cb, []int{0}
+}
+
+func (m *DeviceEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeviceEnum.Unmarshal(m, b)
+}
+func (m *DeviceEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeviceEnum.Marshal(b, m, deterministic)
+}
+func (m *DeviceEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeviceEnum.Merge(m, src)
+}
+func (m *DeviceEnum) XXX_Size() int {
+	return xxx_messageInfo_DeviceEnum.Size(m)
+}
+func (m *DeviceEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeviceEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeviceEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.DeviceEnum_Device", DeviceEnum_Device_name, DeviceEnum_Device_value)
+	proto.RegisterType((*DeviceEnum)(nil), "google.ads.googleads.v3.enums.DeviceEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/device.proto", fileDescriptor_c7b3fa303d57f3cb)
+}
+
+var fileDescriptor_c7b3fa303d57f3cb = []byte{
+	// 318 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4f, 0xc2, 0x30,
+	0x00, 0x85, 0x65, 0xc8, 0x8c, 0xc5, 0xc4, 0x66, 0x47, 0x23, 0x07, 0x38, 0x7a, 0xe8, 0x0e, 0xbb,
+	0xd5, 0xd3, 0xc6, 0x2a, 0x12, 0x70, 0x5b, 0xa4, 0xcc, 0xc4, 0x2c, 0x31, 0x93, 0x2e, 0x75, 0x09,
+	0xb4, 0x84, 0xc2, 0x7e, 0x90, 0x47, 0x7f, 0x8a, 0xbf, 0xc2, 0xb3, 0xbf, 0xc2, 0xb4, 0x95, 0xdd,
+	0xf4, 0xb2, 0xbc, 0xf5, 0x7d, 0x7d, 0x79, 0x7d, 0xe0, 0x86, 0x4b, 0xc9, 0xd7, 0x95, 0x5f, 0x32,
+	0xe5, 0x5b, 0xa9, 0x55, 0x13, 0xf8, 0x95, 0x38, 0x6c, 0x94, 0xcf, 0xaa, 0xa6, 0x5e, 0x55, 0x68,
+	0xbb, 0x93, 0x7b, 0xe9, 0x0d, 0x2c, 0x80, 0x4a, 0xa6, 0x50, 0xcb, 0xa2, 0x26, 0x40, 0x86, 0xbd,
+	0xba, 0x3e, 0x46, 0x6d, 0x6b, 0xbf, 0x14, 0x42, 0xee, 0xcb, 0x7d, 0x2d, 0x85, 0xb2, 0x97, 0x47,
+	0x0d, 0x00, 0xb1, 0x09, 0x23, 0xe2, 0xb0, 0x19, 0xbd, 0x01, 0xd7, 0xfe, 0x79, 0x97, 0xa0, 0xbf,
+	0x4c, 0x16, 0x19, 0x19, 0x4f, 0xef, 0xa6, 0x24, 0x86, 0x27, 0x5e, 0x1f, 0x9c, 0x2d, 0x93, 0x59,
+	0x92, 0x3e, 0x25, 0xb0, 0xe3, 0x01, 0xe0, 0x3e, 0xa4, 0xd1, 0x74, 0x4e, 0xa0, 0xa3, 0x35, 0x0d,
+	0xa3, 0x39, 0xa1, 0xb0, 0xab, 0xa1, 0x98, 0x2c, 0x66, 0x34, 0xcd, 0xe0, 0xa9, 0x07, 0xc1, 0xc5,
+	0x38, 0x4d, 0x12, 0x32, 0xa6, 0x24, 0x7e, 0xa1, 0x39, 0x74, 0xbd, 0x73, 0xd0, 0x4b, 0xe9, 0x3d,
+	0x79, 0x84, 0xbd, 0xe8, 0xab, 0x03, 0x86, 0x2b, 0xb9, 0x41, 0xff, 0x76, 0x8f, 0xfa, 0xb6, 0x4d,
+	0xa6, 0xab, 0x66, 0x9d, 0xe7, 0xe8, 0x97, 0xe6, 0x72, 0x5d, 0x0a, 0x8e, 0xe4, 0x8e, 0xfb, 0xbc,
+	0x12, 0xe6, 0x21, 0xc7, 0x95, 0xb6, 0xb5, 0xfa, 0x63, 0xb4, 0x5b, 0xf3, 0x7d, 0x77, 0xba, 0x93,
+	0x30, 0xfc, 0x70, 0x06, 0x13, 0x1b, 0x15, 0x32, 0x85, 0xac, 0xd4, 0x2a, 0x0f, 0x90, 0xde, 0x41,
+	0x7d, 0x1e, 0xfd, 0x22, 0x64, 0xaa, 0x68, 0xfd, 0x22, 0x0f, 0x0a, 0xe3, 0x7f, 0x3b, 0x43, 0x7b,
+	0x88, 0x71, 0xc8, 0x14, 0xc6, 0x2d, 0x81, 0x71, 0x1e, 0x60, 0x6c, 0x98, 0x57, 0xd7, 0x14, 0x0b,
+	0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x17, 0x00, 0x7d, 0x77, 0xcc, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/display_ad_format_setting.pb.go b/googleapis/ads/googleads/v3/enums/display_ad_format_setting.pb.go
new file mode 100644
index 0000000..c9fb083
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/display_ad_format_setting.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/display_ad_format_setting.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates display ad format settings.
+type DisplayAdFormatSettingEnum_DisplayAdFormatSetting int32
+
+const (
+	// Not specified.
+	DisplayAdFormatSettingEnum_UNSPECIFIED DisplayAdFormatSettingEnum_DisplayAdFormatSetting = 0
+	// The value is unknown in this version.
+	DisplayAdFormatSettingEnum_UNKNOWN DisplayAdFormatSettingEnum_DisplayAdFormatSetting = 1
+	// Text, image and native formats.
+	DisplayAdFormatSettingEnum_ALL_FORMATS DisplayAdFormatSettingEnum_DisplayAdFormatSetting = 2
+	// Text and image formats.
+	DisplayAdFormatSettingEnum_NON_NATIVE DisplayAdFormatSettingEnum_DisplayAdFormatSetting = 3
+	// Native format, i.e. the format rendering is controlled by the publisher
+	// and not by Google.
+	DisplayAdFormatSettingEnum_NATIVE DisplayAdFormatSettingEnum_DisplayAdFormatSetting = 4
+)
+
+var DisplayAdFormatSettingEnum_DisplayAdFormatSetting_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ALL_FORMATS",
+	3: "NON_NATIVE",
+	4: "NATIVE",
+}
+
+var DisplayAdFormatSettingEnum_DisplayAdFormatSetting_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ALL_FORMATS": 2,
+	"NON_NATIVE":  3,
+	"NATIVE":      4,
+}
+
+func (x DisplayAdFormatSettingEnum_DisplayAdFormatSetting) String() string {
+	return proto.EnumName(DisplayAdFormatSettingEnum_DisplayAdFormatSetting_name, int32(x))
+}
+
+func (DisplayAdFormatSettingEnum_DisplayAdFormatSetting) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fc5ae562658ce012, []int{0, 0}
+}
+
+// Container for display ad format settings.
+type DisplayAdFormatSettingEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DisplayAdFormatSettingEnum) Reset()         { *m = DisplayAdFormatSettingEnum{} }
+func (m *DisplayAdFormatSettingEnum) String() string { return proto.CompactTextString(m) }
+func (*DisplayAdFormatSettingEnum) ProtoMessage()    {}
+func (*DisplayAdFormatSettingEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc5ae562658ce012, []int{0}
+}
+
+func (m *DisplayAdFormatSettingEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DisplayAdFormatSettingEnum.Unmarshal(m, b)
+}
+func (m *DisplayAdFormatSettingEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DisplayAdFormatSettingEnum.Marshal(b, m, deterministic)
+}
+func (m *DisplayAdFormatSettingEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DisplayAdFormatSettingEnum.Merge(m, src)
+}
+func (m *DisplayAdFormatSettingEnum) XXX_Size() int {
+	return xxx_messageInfo_DisplayAdFormatSettingEnum.Size(m)
+}
+func (m *DisplayAdFormatSettingEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DisplayAdFormatSettingEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DisplayAdFormatSettingEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting", DisplayAdFormatSettingEnum_DisplayAdFormatSetting_name, DisplayAdFormatSettingEnum_DisplayAdFormatSetting_value)
+	proto.RegisterType((*DisplayAdFormatSettingEnum)(nil), "google.ads.googleads.v3.enums.DisplayAdFormatSettingEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/display_ad_format_setting.proto", fileDescriptor_fc5ae562658ce012)
+}
+
+var fileDescriptor_fc5ae562658ce012 = []byte{
+	// 327 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4f, 0xc2, 0x30,
+	0x18, 0x75, 0xc3, 0x60, 0x52, 0x12, 0x5d, 0x76, 0xf0, 0x80, 0x72, 0x80, 0x1f, 0xd0, 0x1d, 0x76,
+	0xab, 0xf1, 0x50, 0x64, 0x10, 0x22, 0x16, 0x22, 0x30, 0x13, 0xb3, 0x64, 0xa9, 0x74, 0x36, 0x4b,
+	0x58, 0xbb, 0xd0, 0x42, 0xe2, 0xd1, 0xbf, 0xe2, 0xd1, 0x9f, 0xe2, 0x4f, 0xf1, 0xe4, 0x4f, 0x30,
+	0x6b, 0x61, 0x27, 0xf4, 0xd2, 0xbc, 0xf4, 0x7d, 0xef, 0x7d, 0xdf, 0x7b, 0xe0, 0x96, 0x4b, 0xc9,
+	0xd7, 0x59, 0x40, 0x99, 0x0a, 0x2c, 0xac, 0xd0, 0x2e, 0x0c, 0x32, 0xb1, 0x2d, 0x54, 0xc0, 0x72,
+	0x55, 0xae, 0xe9, 0x5b, 0x4a, 0x59, 0xfa, 0x2a, 0x37, 0x05, 0xd5, 0xa9, 0xca, 0xb4, 0xce, 0x05,
+	0x87, 0xe5, 0x46, 0x6a, 0xe9, 0x77, 0xac, 0x06, 0x52, 0xa6, 0x60, 0x2d, 0x87, 0xbb, 0x10, 0x1a,
+	0x79, 0xfb, 0xfa, 0xe0, 0x5e, 0xe6, 0x01, 0x15, 0x42, 0x6a, 0xaa, 0x73, 0x29, 0x94, 0x15, 0xf7,
+	0xde, 0x1d, 0xd0, 0x1e, 0xd8, 0x05, 0x98, 0x0d, 0x8d, 0xfd, 0xdc, 0xba, 0x47, 0x62, 0x5b, 0xf4,
+	0x56, 0xe0, 0xf2, 0x38, 0xeb, 0x5f, 0x80, 0xd6, 0x92, 0xcc, 0x67, 0xd1, 0xdd, 0x78, 0x38, 0x8e,
+	0x06, 0xde, 0x89, 0xdf, 0x02, 0x67, 0x4b, 0x72, 0x4f, 0xa6, 0x4f, 0xc4, 0x73, 0x2a, 0x16, 0x4f,
+	0x26, 0xe9, 0x70, 0xfa, 0xf8, 0x80, 0x17, 0x73, 0xcf, 0xf5, 0xcf, 0x01, 0x20, 0x53, 0x92, 0x12,
+	0xbc, 0x18, 0xc7, 0x91, 0xd7, 0xf0, 0x01, 0x68, 0xee, 0xf1, 0x69, 0xff, 0xc7, 0x01, 0xdd, 0x95,
+	0x2c, 0xe0, 0xbf, 0x39, 0xfa, 0x57, 0xc7, 0x0f, 0x99, 0x55, 0x31, 0x66, 0xce, 0x73, 0x7f, 0xaf,
+	0xe6, 0x72, 0x4d, 0x05, 0x87, 0x72, 0xc3, 0x03, 0x9e, 0x09, 0x13, 0xf2, 0x50, 0x6a, 0x99, 0xab,
+	0x3f, 0x3a, 0xbe, 0x31, 0xef, 0x87, 0xdb, 0x18, 0x61, 0xfc, 0xe9, 0x76, 0x46, 0xd6, 0x0a, 0x33,
+	0x05, 0x2d, 0xac, 0x50, 0x1c, 0xc2, 0xaa, 0x12, 0xf5, 0x75, 0xe0, 0x13, 0xcc, 0x54, 0x52, 0xf3,
+	0x49, 0x1c, 0x26, 0x86, 0xff, 0x76, 0xbb, 0xf6, 0x13, 0x21, 0xcc, 0x14, 0x42, 0xf5, 0x04, 0x42,
+	0x71, 0x88, 0x90, 0x99, 0x79, 0x69, 0x9a, 0xc3, 0xc2, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd6,
+	0x8f, 0x92, 0x5b, 0xfb, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/display_upload_product_type.pb.go b/googleapis/ads/googleads/v3/enums/display_upload_product_type.pb.go
new file mode 100644
index 0000000..1aff4b6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/display_upload_product_type.pb.go
@@ -0,0 +1,187 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/display_upload_product_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates display upload product types.
+type DisplayUploadProductTypeEnum_DisplayUploadProductType int32
+
+const (
+	// Not specified.
+	DisplayUploadProductTypeEnum_UNSPECIFIED DisplayUploadProductTypeEnum_DisplayUploadProductType = 0
+	// The value is unknown in this version.
+	DisplayUploadProductTypeEnum_UNKNOWN DisplayUploadProductTypeEnum_DisplayUploadProductType = 1
+	// HTML5 upload ad. This product type requires the upload_media_bundle
+	// field in DisplayUploadAdInfo to be set.
+	DisplayUploadProductTypeEnum_HTML5_UPLOAD_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 2
+	// Dynamic HTML5 education ad. This product type requires the
+	// upload_media_bundle field in DisplayUploadAdInfo to be set. Can only be
+	// used in an education campaign.
+	DisplayUploadProductTypeEnum_DYNAMIC_HTML5_EDUCATION_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 3
+	// Dynamic HTML5 flight ad. This product type requires the
+	// upload_media_bundle field in DisplayUploadAdInfo to be set. Can only be
+	// used in a flight campaign.
+	DisplayUploadProductTypeEnum_DYNAMIC_HTML5_FLIGHT_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 4
+	// Dynamic HTML5 hotel and rental ad. This product type requires the
+	// upload_media_bundle field in DisplayUploadAdInfo to be set. Can only be
+	// used in a hotel campaign.
+	DisplayUploadProductTypeEnum_DYNAMIC_HTML5_HOTEL_RENTAL_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 5
+	// Dynamic HTML5 job ad. This product type requires the
+	// upload_media_bundle field in DisplayUploadAdInfo to be set. Can only be
+	// used in a job campaign.
+	DisplayUploadProductTypeEnum_DYNAMIC_HTML5_JOB_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 6
+	// Dynamic HTML5 local ad. This product type requires the
+	// upload_media_bundle field in DisplayUploadAdInfo to be set. Can only be
+	// used in a local campaign.
+	DisplayUploadProductTypeEnum_DYNAMIC_HTML5_LOCAL_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 7
+	// Dynamic HTML5 real estate ad. This product type requires the
+	// upload_media_bundle field in DisplayUploadAdInfo to be set. Can only be
+	// used in a real estate campaign.
+	DisplayUploadProductTypeEnum_DYNAMIC_HTML5_REAL_ESTATE_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 8
+	// Dynamic HTML5 custom ad. This product type requires the
+	// upload_media_bundle field in DisplayUploadAdInfo to be set. Can only be
+	// used in a custom campaign.
+	DisplayUploadProductTypeEnum_DYNAMIC_HTML5_CUSTOM_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 9
+	// Dynamic HTML5 travel ad. This product type requires the
+	// upload_media_bundle field in DisplayUploadAdInfo to be set. Can only be
+	// used in a travel campaign.
+	DisplayUploadProductTypeEnum_DYNAMIC_HTML5_TRAVEL_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 10
+	// Dynamic HTML5 hotel ad. This product type requires the
+	// upload_media_bundle field in DisplayUploadAdInfo to be set. Can only be
+	// used in a hotel campaign.
+	DisplayUploadProductTypeEnum_DYNAMIC_HTML5_HOTEL_AD DisplayUploadProductTypeEnum_DisplayUploadProductType = 11
+)
+
+var DisplayUploadProductTypeEnum_DisplayUploadProductType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "HTML5_UPLOAD_AD",
+	3:  "DYNAMIC_HTML5_EDUCATION_AD",
+	4:  "DYNAMIC_HTML5_FLIGHT_AD",
+	5:  "DYNAMIC_HTML5_HOTEL_RENTAL_AD",
+	6:  "DYNAMIC_HTML5_JOB_AD",
+	7:  "DYNAMIC_HTML5_LOCAL_AD",
+	8:  "DYNAMIC_HTML5_REAL_ESTATE_AD",
+	9:  "DYNAMIC_HTML5_CUSTOM_AD",
+	10: "DYNAMIC_HTML5_TRAVEL_AD",
+	11: "DYNAMIC_HTML5_HOTEL_AD",
+}
+
+var DisplayUploadProductTypeEnum_DisplayUploadProductType_value = map[string]int32{
+	"UNSPECIFIED":                   0,
+	"UNKNOWN":                       1,
+	"HTML5_UPLOAD_AD":               2,
+	"DYNAMIC_HTML5_EDUCATION_AD":    3,
+	"DYNAMIC_HTML5_FLIGHT_AD":       4,
+	"DYNAMIC_HTML5_HOTEL_RENTAL_AD": 5,
+	"DYNAMIC_HTML5_JOB_AD":          6,
+	"DYNAMIC_HTML5_LOCAL_AD":        7,
+	"DYNAMIC_HTML5_REAL_ESTATE_AD":  8,
+	"DYNAMIC_HTML5_CUSTOM_AD":       9,
+	"DYNAMIC_HTML5_TRAVEL_AD":       10,
+	"DYNAMIC_HTML5_HOTEL_AD":        11,
+}
+
+func (x DisplayUploadProductTypeEnum_DisplayUploadProductType) String() string {
+	return proto.EnumName(DisplayUploadProductTypeEnum_DisplayUploadProductType_name, int32(x))
+}
+
+func (DisplayUploadProductTypeEnum_DisplayUploadProductType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_167ffb3f75d13ef8, []int{0, 0}
+}
+
+// Container for display upload product types. Product types that have the word
+// "DYNAMIC" in them must be associated with a campaign that has a dynamic
+// remarketing feed. See https://support.google.com/google-ads/answer/6053288
+// for more info about dynamic remarketing. Other product types are regarded
+// as "static" and do not have this requirement.
+type DisplayUploadProductTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DisplayUploadProductTypeEnum) Reset()         { *m = DisplayUploadProductTypeEnum{} }
+func (m *DisplayUploadProductTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*DisplayUploadProductTypeEnum) ProtoMessage()    {}
+func (*DisplayUploadProductTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_167ffb3f75d13ef8, []int{0}
+}
+
+func (m *DisplayUploadProductTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DisplayUploadProductTypeEnum.Unmarshal(m, b)
+}
+func (m *DisplayUploadProductTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DisplayUploadProductTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *DisplayUploadProductTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DisplayUploadProductTypeEnum.Merge(m, src)
+}
+func (m *DisplayUploadProductTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_DisplayUploadProductTypeEnum.Size(m)
+}
+func (m *DisplayUploadProductTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DisplayUploadProductTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DisplayUploadProductTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.DisplayUploadProductTypeEnum_DisplayUploadProductType", DisplayUploadProductTypeEnum_DisplayUploadProductType_name, DisplayUploadProductTypeEnum_DisplayUploadProductType_value)
+	proto.RegisterType((*DisplayUploadProductTypeEnum)(nil), "google.ads.googleads.v3.enums.DisplayUploadProductTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/display_upload_product_type.proto", fileDescriptor_167ffb3f75d13ef8)
+}
+
+var fileDescriptor_167ffb3f75d13ef8 = []byte{
+	// 440 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x41, 0x8e, 0xd3, 0x30,
+	0x14, 0x86, 0x69, 0x06, 0x66, 0xc0, 0x5d, 0x4c, 0x65, 0x10, 0x8c, 0x4a, 0x8b, 0xe8, 0x1c, 0xc0,
+	0x59, 0x44, 0x6c, 0xc2, 0x02, 0xb9, 0x89, 0xa7, 0x0d, 0xa4, 0x49, 0xd4, 0x3a, 0x45, 0xa0, 0x4a,
+	0x51, 0x18, 0x47, 0x51, 0xa5, 0x36, 0xb6, 0xea, 0xb4, 0x52, 0xaf, 0xc3, 0x92, 0xa3, 0x70, 0x05,
+	0x6e, 0xc0, 0x92, 0x35, 0x0b, 0x64, 0x9b, 0x56, 0x8a, 0xaa, 0xce, 0xc6, 0x7a, 0xf2, 0xf7, 0xbf,
+	0xff, 0x3d, 0xe9, 0x7f, 0xe0, 0x43, 0xc9, 0x79, 0xb9, 0x2a, 0xec, 0x9c, 0x49, 0xdb, 0x94, 0xaa,
+	0xda, 0x39, 0x76, 0x51, 0x6d, 0xd7, 0xd2, 0x66, 0x4b, 0x29, 0x56, 0xf9, 0x3e, 0xdb, 0x8a, 0x15,
+	0xcf, 0x59, 0x26, 0x36, 0x9c, 0x6d, 0xef, 0xeb, 0xac, 0xde, 0x8b, 0x02, 0x89, 0x0d, 0xaf, 0x39,
+	0xec, 0x9b, 0x2e, 0x94, 0x33, 0x89, 0x8e, 0x06, 0x68, 0xe7, 0x20, 0x6d, 0xd0, 0xed, 0x1d, 0xfc,
+	0xc5, 0xd2, 0xce, 0xab, 0x8a, 0xd7, 0x79, 0xbd, 0xe4, 0x95, 0x34, 0xcd, 0xb7, 0x7f, 0x2d, 0xd0,
+	0xf3, 0xcd, 0x88, 0x54, 0x4f, 0x48, 0xcc, 0x00, 0xba, 0x17, 0x05, 0xa9, 0xb6, 0xeb, 0xdb, 0x5f,
+	0x16, 0xb8, 0x39, 0x27, 0x80, 0xd7, 0xa0, 0x9d, 0x46, 0xb3, 0x84, 0x78, 0xc1, 0x5d, 0x40, 0xfc,
+	0xce, 0x23, 0xd8, 0x06, 0x57, 0x69, 0xf4, 0x29, 0x8a, 0x3f, 0x47, 0x9d, 0x16, 0x7c, 0x0e, 0xae,
+	0xc7, 0x74, 0x12, 0xbe, 0xcb, 0xd2, 0x24, 0x8c, 0xb1, 0x9f, 0x61, 0xbf, 0x63, 0xc1, 0x37, 0xa0,
+	0xeb, 0x7f, 0x89, 0xf0, 0x24, 0xf0, 0x32, 0x03, 0x89, 0x9f, 0x7a, 0x98, 0x06, 0x71, 0xa4, 0xf8,
+	0x05, 0x7c, 0x0d, 0x5e, 0x35, 0xf9, 0x5d, 0x18, 0x8c, 0xc6, 0x54, 0xc1, 0xc7, 0x70, 0x00, 0xfa,
+	0x4d, 0x38, 0x8e, 0x29, 0x09, 0xb3, 0x29, 0x89, 0x28, 0x0e, 0x95, 0xe4, 0x09, 0xbc, 0x01, 0x2f,
+	0x9a, 0x92, 0x8f, 0xf1, 0x50, 0x91, 0x4b, 0xd8, 0x05, 0x2f, 0x9b, 0x24, 0x8c, 0x3d, 0xd3, 0x75,
+	0x05, 0xdf, 0x82, 0x5e, 0x93, 0x4d, 0x09, 0x0e, 0x33, 0x32, 0xa3, 0x98, 0x12, 0xa5, 0x78, 0x7a,
+	0xba, 0x97, 0x97, 0xce, 0x68, 0x3c, 0x51, 0xf0, 0xd9, 0x29, 0xa4, 0x53, 0x3c, 0x27, 0xda, 0x1b,
+	0x9c, 0xce, 0x35, 0x4b, 0x63, 0xbf, 0xd3, 0x1e, 0xfe, 0x69, 0x81, 0xc1, 0x3d, 0x5f, 0xa3, 0x07,
+	0x23, 0x1c, 0xf6, 0xcf, 0x05, 0x90, 0xa8, 0x0c, 0x93, 0xd6, 0xd7, 0xe1, 0xff, 0xfe, 0x92, 0xaf,
+	0xf2, 0xaa, 0x44, 0x7c, 0x53, 0xda, 0x65, 0x51, 0xe9, 0x84, 0x0f, 0x37, 0x25, 0x96, 0xf2, 0xcc,
+	0x89, 0xbd, 0xd7, 0xef, 0x77, 0xeb, 0x62, 0x84, 0xf1, 0x0f, 0xab, 0x3f, 0x32, 0x56, 0x98, 0x49,
+	0x64, 0x4a, 0x55, 0xcd, 0x1d, 0xa4, 0xae, 0x41, 0xfe, 0x3c, 0xf0, 0x05, 0x66, 0x72, 0x71, 0xe4,
+	0x8b, 0xb9, 0xb3, 0xd0, 0xfc, 0xb7, 0x35, 0x30, 0x9f, 0xae, 0x8b, 0x99, 0x74, 0xdd, 0xa3, 0xc2,
+	0x75, 0xe7, 0x8e, 0xeb, 0x6a, 0xcd, 0xb7, 0x4b, 0xbd, 0x98, 0xf3, 0x2f, 0x00, 0x00, 0xff, 0xff,
+	0x2b, 0xce, 0x78, 0x56, 0xfa, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/distance_bucket.pb.go b/googleapis/ads/googleads/v3/enums/distance_bucket.pb.go
new file mode 100644
index 0000000..3b40baa
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/distance_bucket.pb.go
@@ -0,0 +1,235 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/distance_bucket.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The distance bucket for a user’s distance from an advertiser’s location
+// extension.
+type DistanceBucketEnum_DistanceBucket int32
+
+const (
+	// Not specified.
+	DistanceBucketEnum_UNSPECIFIED DistanceBucketEnum_DistanceBucket = 0
+	// Used for return value only. Represents value unknown in this version.
+	DistanceBucketEnum_UNKNOWN DistanceBucketEnum_DistanceBucket = 1
+	// User was within 700m of the location.
+	DistanceBucketEnum_WITHIN_700M DistanceBucketEnum_DistanceBucket = 2
+	// User was within 1KM of the location.
+	DistanceBucketEnum_WITHIN_1KM DistanceBucketEnum_DistanceBucket = 3
+	// User was within 5KM of the location.
+	DistanceBucketEnum_WITHIN_5KM DistanceBucketEnum_DistanceBucket = 4
+	// User was within 10KM of the location.
+	DistanceBucketEnum_WITHIN_10KM DistanceBucketEnum_DistanceBucket = 5
+	// User was within 15KM of the location.
+	DistanceBucketEnum_WITHIN_15KM DistanceBucketEnum_DistanceBucket = 6
+	// User was within 20KM of the location.
+	DistanceBucketEnum_WITHIN_20KM DistanceBucketEnum_DistanceBucket = 7
+	// User was within 25KM of the location.
+	DistanceBucketEnum_WITHIN_25KM DistanceBucketEnum_DistanceBucket = 8
+	// User was within 30KM of the location.
+	DistanceBucketEnum_WITHIN_30KM DistanceBucketEnum_DistanceBucket = 9
+	// User was within 35KM of the location.
+	DistanceBucketEnum_WITHIN_35KM DistanceBucketEnum_DistanceBucket = 10
+	// User was within 40KM of the location.
+	DistanceBucketEnum_WITHIN_40KM DistanceBucketEnum_DistanceBucket = 11
+	// User was within 45KM of the location.
+	DistanceBucketEnum_WITHIN_45KM DistanceBucketEnum_DistanceBucket = 12
+	// User was within 50KM of the location.
+	DistanceBucketEnum_WITHIN_50KM DistanceBucketEnum_DistanceBucket = 13
+	// User was within 55KM of the location.
+	DistanceBucketEnum_WITHIN_55KM DistanceBucketEnum_DistanceBucket = 14
+	// User was within 60KM of the location.
+	DistanceBucketEnum_WITHIN_60KM DistanceBucketEnum_DistanceBucket = 15
+	// User was within 65KM of the location.
+	DistanceBucketEnum_WITHIN_65KM DistanceBucketEnum_DistanceBucket = 16
+	// User was beyond 65KM of the location.
+	DistanceBucketEnum_BEYOND_65KM DistanceBucketEnum_DistanceBucket = 17
+	// User was within 0.7 miles of the location.
+	DistanceBucketEnum_WITHIN_0_7MILES DistanceBucketEnum_DistanceBucket = 18
+	// User was within 1 mile of the location.
+	DistanceBucketEnum_WITHIN_1MILE DistanceBucketEnum_DistanceBucket = 19
+	// User was within 5 miles of the location.
+	DistanceBucketEnum_WITHIN_5MILES DistanceBucketEnum_DistanceBucket = 20
+	// User was within 10 miles of the location.
+	DistanceBucketEnum_WITHIN_10MILES DistanceBucketEnum_DistanceBucket = 21
+	// User was within 15 miles of the location.
+	DistanceBucketEnum_WITHIN_15MILES DistanceBucketEnum_DistanceBucket = 22
+	// User was within 20 miles of the location.
+	DistanceBucketEnum_WITHIN_20MILES DistanceBucketEnum_DistanceBucket = 23
+	// User was within 25 miles of the location.
+	DistanceBucketEnum_WITHIN_25MILES DistanceBucketEnum_DistanceBucket = 24
+	// User was within 30 miles of the location.
+	DistanceBucketEnum_WITHIN_30MILES DistanceBucketEnum_DistanceBucket = 25
+	// User was within 35 miles of the location.
+	DistanceBucketEnum_WITHIN_35MILES DistanceBucketEnum_DistanceBucket = 26
+	// User was within 40 miles of the location.
+	DistanceBucketEnum_WITHIN_40MILES DistanceBucketEnum_DistanceBucket = 27
+	// User was beyond 40 miles of the location.
+	DistanceBucketEnum_BEYOND_40MILES DistanceBucketEnum_DistanceBucket = 28
+)
+
+var DistanceBucketEnum_DistanceBucket_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "WITHIN_700M",
+	3:  "WITHIN_1KM",
+	4:  "WITHIN_5KM",
+	5:  "WITHIN_10KM",
+	6:  "WITHIN_15KM",
+	7:  "WITHIN_20KM",
+	8:  "WITHIN_25KM",
+	9:  "WITHIN_30KM",
+	10: "WITHIN_35KM",
+	11: "WITHIN_40KM",
+	12: "WITHIN_45KM",
+	13: "WITHIN_50KM",
+	14: "WITHIN_55KM",
+	15: "WITHIN_60KM",
+	16: "WITHIN_65KM",
+	17: "BEYOND_65KM",
+	18: "WITHIN_0_7MILES",
+	19: "WITHIN_1MILE",
+	20: "WITHIN_5MILES",
+	21: "WITHIN_10MILES",
+	22: "WITHIN_15MILES",
+	23: "WITHIN_20MILES",
+	24: "WITHIN_25MILES",
+	25: "WITHIN_30MILES",
+	26: "WITHIN_35MILES",
+	27: "WITHIN_40MILES",
+	28: "BEYOND_40MILES",
+}
+
+var DistanceBucketEnum_DistanceBucket_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"WITHIN_700M":     2,
+	"WITHIN_1KM":      3,
+	"WITHIN_5KM":      4,
+	"WITHIN_10KM":     5,
+	"WITHIN_15KM":     6,
+	"WITHIN_20KM":     7,
+	"WITHIN_25KM":     8,
+	"WITHIN_30KM":     9,
+	"WITHIN_35KM":     10,
+	"WITHIN_40KM":     11,
+	"WITHIN_45KM":     12,
+	"WITHIN_50KM":     13,
+	"WITHIN_55KM":     14,
+	"WITHIN_60KM":     15,
+	"WITHIN_65KM":     16,
+	"BEYOND_65KM":     17,
+	"WITHIN_0_7MILES": 18,
+	"WITHIN_1MILE":    19,
+	"WITHIN_5MILES":   20,
+	"WITHIN_10MILES":  21,
+	"WITHIN_15MILES":  22,
+	"WITHIN_20MILES":  23,
+	"WITHIN_25MILES":  24,
+	"WITHIN_30MILES":  25,
+	"WITHIN_35MILES":  26,
+	"WITHIN_40MILES":  27,
+	"BEYOND_40MILES":  28,
+}
+
+func (x DistanceBucketEnum_DistanceBucket) String() string {
+	return proto.EnumName(DistanceBucketEnum_DistanceBucket_name, int32(x))
+}
+
+func (DistanceBucketEnum_DistanceBucket) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_4666d419e0011116, []int{0, 0}
+}
+
+// Container for distance buckets of a user’s distance from an advertiser’s
+// location extension.
+type DistanceBucketEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DistanceBucketEnum) Reset()         { *m = DistanceBucketEnum{} }
+func (m *DistanceBucketEnum) String() string { return proto.CompactTextString(m) }
+func (*DistanceBucketEnum) ProtoMessage()    {}
+func (*DistanceBucketEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4666d419e0011116, []int{0}
+}
+
+func (m *DistanceBucketEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DistanceBucketEnum.Unmarshal(m, b)
+}
+func (m *DistanceBucketEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DistanceBucketEnum.Marshal(b, m, deterministic)
+}
+func (m *DistanceBucketEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DistanceBucketEnum.Merge(m, src)
+}
+func (m *DistanceBucketEnum) XXX_Size() int {
+	return xxx_messageInfo_DistanceBucketEnum.Size(m)
+}
+func (m *DistanceBucketEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DistanceBucketEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DistanceBucketEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.DistanceBucketEnum_DistanceBucket", DistanceBucketEnum_DistanceBucket_name, DistanceBucketEnum_DistanceBucket_value)
+	proto.RegisterType((*DistanceBucketEnum)(nil), "google.ads.googleads.v3.enums.DistanceBucketEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/distance_bucket.proto", fileDescriptor_4666d419e0011116)
+}
+
+var fileDescriptor_4666d419e0011116 = []byte{
+	// 456 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xdf, 0x4e, 0xdb, 0x30,
+	0x14, 0x87, 0xd7, 0xd2, 0xc1, 0xe6, 0x42, 0x6b, 0xdc, 0xfd, 0x65, 0x70, 0x01, 0x0f, 0xe0, 0x14,
+	0x0c, 0x43, 0xca, 0xae, 0x92, 0x35, 0x63, 0x51, 0x97, 0x50, 0x89, 0x51, 0xb4, 0xa9, 0x52, 0x15,
+	0x9a, 0x28, 0xaa, 0x46, 0xed, 0x0a, 0xa7, 0x3c, 0xca, 0x1e, 0x60, 0x97, 0x93, 0xf6, 0x22, 0x7b,
+	0x92, 0x69, 0x4f, 0x31, 0x9d, 0xd8, 0x89, 0x0e, 0x17, 0xe3, 0x26, 0x3a, 0xf9, 0xce, 0x77, 0x4e,
+	0x62, 0xeb, 0x47, 0x44, 0xae, 0x54, 0x7e, 0x93, 0x39, 0x49, 0xaa, 0x1d, 0x53, 0x42, 0x75, 0x27,
+	0x9c, 0x4c, 0xae, 0x16, 0xda, 0x49, 0xe7, 0xba, 0x48, 0xe4, 0x2c, 0x9b, 0x5e, 0xaf, 0x66, 0xdf,
+	0xb2, 0x82, 0x2f, 0x6f, 0x55, 0xa1, 0xd8, 0x9e, 0x31, 0x79, 0x92, 0x6a, 0x5e, 0x0f, 0xf1, 0x3b,
+	0xc1, 0xcb, 0xa1, 0x9d, 0xdd, 0x6a, 0xe7, 0x72, 0xee, 0x24, 0x52, 0xaa, 0x22, 0x29, 0xe6, 0x4a,
+	0x6a, 0x33, 0x7c, 0xf0, 0xab, 0x45, 0xd8, 0xc0, 0xae, 0xf5, 0xcb, 0xad, 0x81, 0x5c, 0x2d, 0x0e,
+	0xbe, 0xb7, 0x48, 0xe7, 0x3e, 0x66, 0x5d, 0xd2, 0xbe, 0x8c, 0x2f, 0x46, 0xc1, 0xfb, 0xf0, 0x43,
+	0x18, 0x0c, 0xe8, 0x23, 0xd6, 0x26, 0x1b, 0x97, 0xf1, 0x30, 0x3e, 0xbf, 0x8a, 0x69, 0x03, 0xba,
+	0x57, 0xe1, 0xe7, 0x8f, 0x61, 0x3c, 0x3d, 0xed, 0xf7, 0x23, 0xda, 0x64, 0x1d, 0x42, 0x2c, 0x38,
+	0x1c, 0x46, 0x74, 0x0d, 0xbd, 0x9f, 0x0c, 0x23, 0xda, 0x42, 0x03, 0x87, 0xfd, 0x61, 0x44, 0x1f,
+	0x63, 0x00, 0xc6, 0x3a, 0x02, 0x47, 0x60, 0x6c, 0x60, 0x00, 0xc6, 0x13, 0x04, 0x04, 0x18, 0x4f,
+	0x31, 0x00, 0x83, 0x20, 0x70, 0x0c, 0x46, 0x1b, 0x03, 0x30, 0x36, 0x11, 0x38, 0x01, 0x63, 0x0b,
+	0x03, 0x30, 0x3a, 0x08, 0xbc, 0x05, 0xa3, 0x8b, 0x01, 0x18, 0x14, 0x80, 0x1f, 0x7c, 0x39, 0x8f,
+	0x07, 0x06, 0x6c, 0xb3, 0x1e, 0xe9, 0x5a, 0xa3, 0x3f, 0x3d, 0x8d, 0xc2, 0x4f, 0xc1, 0x05, 0x65,
+	0x8c, 0x92, 0xcd, 0xea, 0x80, 0x80, 0x68, 0x8f, 0x6d, 0x93, 0xad, 0xea, 0x53, 0x46, 0x7a, 0xc6,
+	0x18, 0xe9, 0xd4, 0xd7, 0x62, 0xd8, 0x73, 0xcc, 0xac, 0xf7, 0x02, 0xb1, 0x23, 0xeb, 0xbd, 0xc4,
+	0xcc, 0x7a, 0xaf, 0x10, 0x13, 0xd6, 0x7b, 0x8d, 0x99, 0xf5, 0x76, 0x10, 0x3b, 0xb6, 0xde, 0x1b,
+	0x60, 0xf6, 0x58, 0x15, 0xdb, 0xf5, 0xff, 0x34, 0xc8, 0xfe, 0x4c, 0x2d, 0xf8, 0x83, 0x99, 0xf3,
+	0x7b, 0xf7, 0xb3, 0x33, 0x82, 0xa8, 0x8d, 0x1a, 0x5f, 0x7d, 0x3b, 0x95, 0xab, 0x9b, 0x44, 0xe6,
+	0x5c, 0xdd, 0xe6, 0x4e, 0x9e, 0xc9, 0x32, 0x88, 0x55, 0xdc, 0x97, 0x73, 0xfd, 0x9f, 0xf4, 0xbf,
+	0x2b, 0x9f, 0x3f, 0x9a, 0x6b, 0x67, 0x9e, 0xf7, 0xb3, 0xb9, 0x77, 0x66, 0x56, 0x79, 0xa9, 0xe6,
+	0xa6, 0x84, 0x6a, 0x2c, 0x38, 0xc4, 0x57, 0xff, 0xae, 0xfa, 0x13, 0x2f, 0xd5, 0x93, 0xba, 0x3f,
+	0x19, 0x8b, 0x49, 0xd9, 0xff, 0xdb, 0xdc, 0x37, 0xd0, 0x75, 0xbd, 0x54, 0xbb, 0x6e, 0x6d, 0xb8,
+	0xee, 0x58, 0xb8, 0x6e, 0xe9, 0x5c, 0xaf, 0x97, 0x3f, 0x26, 0xfe, 0x05, 0x00, 0x00, 0xff, 0xff,
+	0x98, 0xa9, 0x3d, 0xe9, 0x95, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/dsa_page_feed_criterion_field.pb.go b/googleapis/ads/googleads/v3/enums/dsa_page_feed_criterion_field.pb.go
new file mode 100644
index 0000000..40f3749
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/dsa_page_feed_criterion_field.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/dsa_page_feed_criterion_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Dynamic Search Ad Page Feed criterion fields.
+type DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField int32
+
+const (
+	// Not specified.
+	DsaPageFeedCriterionFieldEnum_UNSPECIFIED DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField = 0
+	// Used for return value only. Represents value unknown in this version.
+	DsaPageFeedCriterionFieldEnum_UNKNOWN DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField = 1
+	// Data Type: URL or URL_LIST. URL of the web page you want to target.
+	DsaPageFeedCriterionFieldEnum_PAGE_URL DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField = 2
+	// Data Type: STRING_LIST. The labels that will help you target ads within
+	// your page feed.
+	DsaPageFeedCriterionFieldEnum_LABEL DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField = 3
+)
+
+var DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PAGE_URL",
+	3: "LABEL",
+}
+
+var DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"PAGE_URL":    2,
+	"LABEL":       3,
+}
+
+func (x DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField) String() string {
+	return proto.EnumName(DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField_name, int32(x))
+}
+
+func (DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_084fbedb240e0f43, []int{0, 0}
+}
+
+// Values for Dynamic Search Ad Page Feed criterion fields.
+type DsaPageFeedCriterionFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DsaPageFeedCriterionFieldEnum) Reset()         { *m = DsaPageFeedCriterionFieldEnum{} }
+func (m *DsaPageFeedCriterionFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*DsaPageFeedCriterionFieldEnum) ProtoMessage()    {}
+func (*DsaPageFeedCriterionFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_084fbedb240e0f43, []int{0}
+}
+
+func (m *DsaPageFeedCriterionFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DsaPageFeedCriterionFieldEnum.Unmarshal(m, b)
+}
+func (m *DsaPageFeedCriterionFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DsaPageFeedCriterionFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *DsaPageFeedCriterionFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DsaPageFeedCriterionFieldEnum.Merge(m, src)
+}
+func (m *DsaPageFeedCriterionFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_DsaPageFeedCriterionFieldEnum.Size(m)
+}
+func (m *DsaPageFeedCriterionFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DsaPageFeedCriterionFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DsaPageFeedCriterionFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField", DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField_name, DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField_value)
+	proto.RegisterType((*DsaPageFeedCriterionFieldEnum)(nil), "google.ads.googleads.v3.enums.DsaPageFeedCriterionFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/dsa_page_feed_criterion_field.proto", fileDescriptor_084fbedb240e0f43)
+}
+
+var fileDescriptor_084fbedb240e0f43 = []byte{
+	// 319 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x6a, 0xeb, 0x30,
+	0x18, 0x7c, 0x71, 0x78, 0xfd, 0x51, 0x0a, 0x35, 0xde, 0xb5, 0x34, 0x85, 0xe4, 0x00, 0xf2, 0xc2,
+	0x3b, 0x75, 0x25, 0x27, 0x4e, 0x08, 0x0d, 0xae, 0x49, 0x49, 0x0a, 0xc5, 0x60, 0xd4, 0x48, 0x11,
+	0x82, 0x44, 0x32, 0xfe, 0x9c, 0x1c, 0xa8, 0xcb, 0x1e, 0xa5, 0x47, 0xe9, 0xb6, 0x17, 0x28, 0x96,
+	0xea, 0xec, 0xd2, 0x8d, 0x19, 0x3c, 0xf3, 0xcd, 0x8c, 0x06, 0x51, 0x69, 0x8c, 0xdc, 0x8a, 0x90,
+	0x71, 0x08, 0x1d, 0x6c, 0xd0, 0x21, 0x0a, 0x85, 0xde, 0xef, 0x20, 0xe4, 0xc0, 0x8a, 0x92, 0x49,
+	0x51, 0x6c, 0x84, 0xe0, 0xc5, 0xba, 0x52, 0xb5, 0xa8, 0x94, 0xd1, 0xc5, 0x46, 0x89, 0x2d, 0xc7,
+	0x65, 0x65, 0x6a, 0x13, 0xf4, 0xdd, 0x1d, 0x66, 0x1c, 0xf0, 0xd1, 0x02, 0x1f, 0x22, 0x6c, 0x2d,
+	0x6e, 0xef, 0xda, 0x84, 0x52, 0x85, 0x4c, 0x6b, 0x53, 0xb3, 0x5a, 0x19, 0x0d, 0xee, 0x78, 0x08,
+	0xa8, 0x3f, 0x06, 0x96, 0x31, 0x29, 0x26, 0x42, 0xf0, 0x51, 0x1b, 0x30, 0x69, 0xfc, 0x13, 0xbd,
+	0xdf, 0x0d, 0x17, 0xe8, 0xe6, 0xa4, 0x20, 0xb8, 0x46, 0xbd, 0x65, 0xfa, 0x9c, 0x25, 0xa3, 0xd9,
+	0x64, 0x96, 0x8c, 0xfd, 0x7f, 0x41, 0x0f, 0x9d, 0x2f, 0xd3, 0xc7, 0xf4, 0xe9, 0x25, 0xf5, 0x3b,
+	0xc1, 0x15, 0xba, 0xc8, 0xe8, 0x34, 0x29, 0x96, 0x8b, 0xb9, 0xef, 0x05, 0x97, 0xe8, 0xff, 0x9c,
+	0xc6, 0xc9, 0xdc, 0xef, 0xc6, 0xdf, 0x1d, 0x34, 0x58, 0x9b, 0x1d, 0xfe, 0xb3, 0x78, 0x7c, 0x7f,
+	0x32, 0x37, 0x6b, 0xaa, 0x67, 0x9d, 0xd7, 0xf8, 0xd7, 0x40, 0x9a, 0x2d, 0xd3, 0x12, 0x9b, 0x4a,
+	0x86, 0x52, 0x68, 0xfb, 0xb0, 0x76, 0xcc, 0x52, 0xc1, 0x89, 0x6d, 0x1f, 0xec, 0xf7, 0xdd, 0xeb,
+	0x4e, 0x29, 0xfd, 0xf0, 0xfa, 0x53, 0x67, 0x45, 0x39, 0x60, 0x07, 0x1b, 0xb4, 0x8a, 0x70, 0x33,
+	0x02, 0x7c, 0xb6, 0x7c, 0x4e, 0x39, 0xe4, 0x47, 0x3e, 0x5f, 0x45, 0xb9, 0xe5, 0xbf, 0xbc, 0x81,
+	0xfb, 0x49, 0x08, 0xe5, 0x40, 0xc8, 0x51, 0x41, 0xc8, 0x2a, 0x22, 0xc4, 0x6a, 0xde, 0xce, 0x6c,
+	0xb1, 0xe8, 0x27, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xc0, 0x0d, 0xd4, 0xf3, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/education_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/education_placeholder_field.pb.go
new file mode 100644
index 0000000..111b5da
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/education_placeholder_field.pb.go
@@ -0,0 +1,213 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/education_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Education placeholder fields.
+type EducationPlaceholderFieldEnum_EducationPlaceholderField int32
+
+const (
+	// Not specified.
+	EducationPlaceholderFieldEnum_UNSPECIFIED EducationPlaceholderFieldEnum_EducationPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	EducationPlaceholderFieldEnum_UNKNOWN EducationPlaceholderFieldEnum_EducationPlaceholderField = 1
+	// Data Type: STRING. Required. Combination of PROGRAM ID and LOCATION ID
+	// must be unique per offer.
+	EducationPlaceholderFieldEnum_PROGRAM_ID EducationPlaceholderFieldEnum_EducationPlaceholderField = 2
+	// Data Type: STRING. Combination of PROGRAM ID and LOCATION ID must be
+	// unique per offer.
+	EducationPlaceholderFieldEnum_LOCATION_ID EducationPlaceholderFieldEnum_EducationPlaceholderField = 3
+	// Data Type: STRING. Required. Main headline with program name to be shown
+	// in dynamic ad.
+	EducationPlaceholderFieldEnum_PROGRAM_NAME EducationPlaceholderFieldEnum_EducationPlaceholderField = 4
+	// Data Type: STRING. Area of study that can be shown in dynamic ad.
+	EducationPlaceholderFieldEnum_AREA_OF_STUDY EducationPlaceholderFieldEnum_EducationPlaceholderField = 5
+	// Data Type: STRING. Description of program that can be shown in dynamic
+	// ad.
+	EducationPlaceholderFieldEnum_PROGRAM_DESCRIPTION EducationPlaceholderFieldEnum_EducationPlaceholderField = 6
+	// Data Type: STRING. Name of school that can be shown in dynamic ad.
+	EducationPlaceholderFieldEnum_SCHOOL_NAME EducationPlaceholderFieldEnum_EducationPlaceholderField = 7
+	// Data Type: STRING. Complete school address, including postal code.
+	EducationPlaceholderFieldEnum_ADDRESS EducationPlaceholderFieldEnum_EducationPlaceholderField = 8
+	// Data Type: URL. Image to be displayed in ads.
+	EducationPlaceholderFieldEnum_THUMBNAIL_IMAGE_URL EducationPlaceholderFieldEnum_EducationPlaceholderField = 9
+	// Data Type: URL. Alternative hosted file of image to be used in the ad.
+	EducationPlaceholderFieldEnum_ALTERNATIVE_THUMBNAIL_IMAGE_URL EducationPlaceholderFieldEnum_EducationPlaceholderField = 10
+	// Data Type: URL_LIST. Required. Final URLs to be used in ad when using
+	// Upgraded URLs; the more specific the better (e.g. the individual URL of a
+	// specific program and its location).
+	EducationPlaceholderFieldEnum_FINAL_URLS EducationPlaceholderFieldEnum_EducationPlaceholderField = 11
+	// Data Type: URL_LIST. Final mobile URLs for the ad when using Upgraded
+	// URLs.
+	EducationPlaceholderFieldEnum_FINAL_MOBILE_URLS EducationPlaceholderFieldEnum_EducationPlaceholderField = 12
+	// Data Type: URL. Tracking template for the ad when using Upgraded URLs.
+	EducationPlaceholderFieldEnum_TRACKING_URL EducationPlaceholderFieldEnum_EducationPlaceholderField = 13
+	// Data Type: STRING_LIST. Keywords used for product retrieval.
+	EducationPlaceholderFieldEnum_CONTEXTUAL_KEYWORDS EducationPlaceholderFieldEnum_EducationPlaceholderField = 14
+	// Data Type: STRING. Android app link. Must be formatted as:
+	// android-app://{package_id}/{scheme}/{host_path}.
+	// The components are defined as follows:
+	// package_id: app ID as specified in Google Play.
+	// scheme: the scheme to pass to the application. Can be HTTP, or a custom
+	//   scheme.
+	// host_path: identifies the specific content within your application.
+	EducationPlaceholderFieldEnum_ANDROID_APP_LINK EducationPlaceholderFieldEnum_EducationPlaceholderField = 15
+	// Data Type: STRING_LIST. List of recommended program IDs to show together
+	// with this item.
+	EducationPlaceholderFieldEnum_SIMILAR_PROGRAM_IDS EducationPlaceholderFieldEnum_EducationPlaceholderField = 16
+	// Data Type: STRING. iOS app link.
+	EducationPlaceholderFieldEnum_IOS_APP_LINK EducationPlaceholderFieldEnum_EducationPlaceholderField = 17
+	// Data Type: INT64. iOS app store ID.
+	EducationPlaceholderFieldEnum_IOS_APP_STORE_ID EducationPlaceholderFieldEnum_EducationPlaceholderField = 18
+)
+
+var EducationPlaceholderFieldEnum_EducationPlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "PROGRAM_ID",
+	3:  "LOCATION_ID",
+	4:  "PROGRAM_NAME",
+	5:  "AREA_OF_STUDY",
+	6:  "PROGRAM_DESCRIPTION",
+	7:  "SCHOOL_NAME",
+	8:  "ADDRESS",
+	9:  "THUMBNAIL_IMAGE_URL",
+	10: "ALTERNATIVE_THUMBNAIL_IMAGE_URL",
+	11: "FINAL_URLS",
+	12: "FINAL_MOBILE_URLS",
+	13: "TRACKING_URL",
+	14: "CONTEXTUAL_KEYWORDS",
+	15: "ANDROID_APP_LINK",
+	16: "SIMILAR_PROGRAM_IDS",
+	17: "IOS_APP_LINK",
+	18: "IOS_APP_STORE_ID",
+}
+
+var EducationPlaceholderFieldEnum_EducationPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":                     0,
+	"UNKNOWN":                         1,
+	"PROGRAM_ID":                      2,
+	"LOCATION_ID":                     3,
+	"PROGRAM_NAME":                    4,
+	"AREA_OF_STUDY":                   5,
+	"PROGRAM_DESCRIPTION":             6,
+	"SCHOOL_NAME":                     7,
+	"ADDRESS":                         8,
+	"THUMBNAIL_IMAGE_URL":             9,
+	"ALTERNATIVE_THUMBNAIL_IMAGE_URL": 10,
+	"FINAL_URLS":                      11,
+	"FINAL_MOBILE_URLS":               12,
+	"TRACKING_URL":                    13,
+	"CONTEXTUAL_KEYWORDS":             14,
+	"ANDROID_APP_LINK":                15,
+	"SIMILAR_PROGRAM_IDS":             16,
+	"IOS_APP_LINK":                    17,
+	"IOS_APP_STORE_ID":                18,
+}
+
+func (x EducationPlaceholderFieldEnum_EducationPlaceholderField) String() string {
+	return proto.EnumName(EducationPlaceholderFieldEnum_EducationPlaceholderField_name, int32(x))
+}
+
+func (EducationPlaceholderFieldEnum_EducationPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_13bff7ba698c75f1, []int{0, 0}
+}
+
+// Values for Education placeholder fields.
+// For more information about dynamic remarketing feeds, see
+// https://support.google.com/google-ads/answer/6053288.
+type EducationPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EducationPlaceholderFieldEnum) Reset()         { *m = EducationPlaceholderFieldEnum{} }
+func (m *EducationPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*EducationPlaceholderFieldEnum) ProtoMessage()    {}
+func (*EducationPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_13bff7ba698c75f1, []int{0}
+}
+
+func (m *EducationPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EducationPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *EducationPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EducationPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *EducationPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EducationPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *EducationPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_EducationPlaceholderFieldEnum.Size(m)
+}
+func (m *EducationPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_EducationPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EducationPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.EducationPlaceholderFieldEnum_EducationPlaceholderField", EducationPlaceholderFieldEnum_EducationPlaceholderField_name, EducationPlaceholderFieldEnum_EducationPlaceholderField_value)
+	proto.RegisterType((*EducationPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.EducationPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/education_placeholder_field.proto", fileDescriptor_13bff7ba698c75f1)
+}
+
+var fileDescriptor_13bff7ba698c75f1 = []byte{
+	// 514 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xcf, 0x8e, 0xd3, 0x3c,
+	0x14, 0xc5, 0xbf, 0xb6, 0x1f, 0x33, 0xe0, 0xce, 0x1f, 0xd7, 0x80, 0x10, 0x88, 0x82, 0x66, 0xd8,
+	0x27, 0x8b, 0xec, 0xc2, 0x02, 0xb9, 0x89, 0xdb, 0xb1, 0x9a, 0xd8, 0x91, 0x9d, 0x74, 0x18, 0x54,
+	0xc9, 0x0a, 0x4d, 0x08, 0x95, 0xd2, 0xa4, 0x6a, 0xda, 0x79, 0x1b, 0x36, 0x2c, 0x79, 0x09, 0xf6,
+	0x3c, 0x0a, 0x5b, 0x5e, 0x00, 0x39, 0x21, 0xed, 0x86, 0xb2, 0xa9, 0xae, 0xef, 0x3d, 0xf7, 0x77,
+	0x5c, 0xe7, 0x80, 0x77, 0x59, 0x59, 0x66, 0x79, 0x6a, 0xc6, 0x49, 0x65, 0x36, 0xa5, 0xae, 0xee,
+	0x2d, 0x33, 0x2d, 0x76, 0xab, 0xca, 0x4c, 0x93, 0xdd, 0x22, 0xde, 0x2e, 0xcb, 0x42, 0xad, 0xf3,
+	0x78, 0x91, 0x7e, 0x2e, 0xf3, 0x24, 0xdd, 0xa8, 0x4f, 0xcb, 0x34, 0x4f, 0x8c, 0xf5, 0xa6, 0xdc,
+	0x96, 0x68, 0xd8, 0x6c, 0x19, 0x71, 0x52, 0x19, 0x7b, 0x80, 0x71, 0x6f, 0x19, 0x35, 0xe0, 0xc5,
+	0xcb, 0x96, 0xbf, 0x5e, 0x9a, 0x71, 0x51, 0x94, 0xdb, 0x9a, 0x56, 0x35, 0xcb, 0xd7, 0xdf, 0x7b,
+	0x60, 0x48, 0x5a, 0x8b, 0xe0, 0xe0, 0x30, 0xd6, 0x06, 0xa4, 0xd8, 0xad, 0xae, 0xbf, 0xf4, 0xc0,
+	0xf3, 0xa3, 0x0a, 0x74, 0x09, 0xfa, 0x11, 0x93, 0x01, 0x71, 0xe8, 0x98, 0x12, 0x17, 0xfe, 0x87,
+	0xfa, 0xe0, 0x34, 0x62, 0x53, 0xc6, 0x6f, 0x19, 0xec, 0xa0, 0x0b, 0x00, 0x02, 0xc1, 0x27, 0x02,
+	0xfb, 0x8a, 0xba, 0xb0, 0xab, 0xd5, 0x1e, 0x77, 0x70, 0x48, 0x39, 0xd3, 0x8d, 0x1e, 0x82, 0xe0,
+	0xac, 0x15, 0x30, 0xec, 0x13, 0xf8, 0x3f, 0x1a, 0x80, 0x73, 0x2c, 0x08, 0x56, 0x7c, 0xac, 0x64,
+	0x18, 0xb9, 0x77, 0xf0, 0x01, 0x7a, 0x06, 0x1e, 0xb7, 0x22, 0x97, 0x48, 0x47, 0xd0, 0x40, 0x03,
+	0xe0, 0x89, 0xc6, 0x49, 0xe7, 0x86, 0x73, 0xaf, 0x59, 0x3e, 0xd5, 0xe6, 0xd8, 0x75, 0x05, 0x91,
+	0x12, 0x3e, 0xd4, 0x6b, 0xe1, 0x4d, 0xe4, 0x8f, 0x18, 0xa6, 0x9e, 0xa2, 0x3e, 0x9e, 0x10, 0x15,
+	0x09, 0x0f, 0x3e, 0x42, 0x6f, 0xc0, 0x6b, 0xec, 0x85, 0x44, 0x30, 0x1c, 0xd2, 0x19, 0x51, 0x7f,
+	0x13, 0x01, 0x7d, 0xf5, 0x31, 0x65, 0xd8, 0xd3, 0x47, 0x09, 0xfb, 0xe8, 0x29, 0x18, 0x34, 0x67,
+	0x9f, 0x8f, 0xa8, 0x47, 0x9a, 0xf6, 0x99, 0xfe, 0x03, 0xa1, 0xc0, 0xce, 0x94, 0xb2, 0x49, 0xbd,
+	0x78, 0xae, 0x6d, 0x1d, 0xce, 0x42, 0xf2, 0x3e, 0x8c, 0xb0, 0xa7, 0xa6, 0xe4, 0xee, 0x96, 0x0b,
+	0x57, 0xc2, 0x0b, 0xf4, 0x04, 0x40, 0xcc, 0x5c, 0xc1, 0xa9, 0xab, 0x70, 0x10, 0x28, 0x8f, 0xb2,
+	0x29, 0xbc, 0xd4, 0x72, 0x49, 0x7d, 0xea, 0x61, 0xa1, 0x0e, 0x4f, 0x25, 0x21, 0xd4, 0x64, 0xca,
+	0xe5, 0x41, 0x3a, 0xd0, 0x80, 0xb6, 0x23, 0x43, 0x2e, 0x88, 0x7e, 0x42, 0x34, 0xfa, 0xd5, 0x01,
+	0x57, 0x8b, 0x72, 0x65, 0xfc, 0x33, 0x05, 0xa3, 0x57, 0x47, 0x3f, 0x61, 0xa0, 0x73, 0x10, 0x74,
+	0x3e, 0x8c, 0xfe, 0x00, 0xb2, 0x32, 0x8f, 0x8b, 0xcc, 0x28, 0x37, 0x99, 0x99, 0xa5, 0x45, 0x9d,
+	0x92, 0x36, 0x97, 0xeb, 0x65, 0x75, 0x24, 0xa6, 0x6f, 0xeb, 0xdf, 0xaf, 0xdd, 0xde, 0x04, 0xe3,
+	0x6f, 0xdd, 0xe1, 0xa4, 0x41, 0xe1, 0xa4, 0x32, 0x9a, 0x52, 0x57, 0x33, 0xcb, 0xd0, 0x81, 0xaa,
+	0x7e, 0xb4, 0xf3, 0x39, 0x4e, 0xaa, 0xf9, 0x7e, 0x3e, 0x9f, 0x59, 0xf3, 0x7a, 0xfe, 0xb3, 0x7b,
+	0xd5, 0x34, 0x6d, 0x1b, 0x27, 0x95, 0x6d, 0xef, 0x15, 0xb6, 0x3d, 0xb3, 0x6c, 0xbb, 0xd6, 0x7c,
+	0x3c, 0xa9, 0x2f, 0x66, 0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xc0, 0xc1, 0xd0, 0x2d, 0x3e, 0x03,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/extension_setting_device.pb.go b/googleapis/ads/googleads/v3/enums/extension_setting_device.pb.go
new file mode 100644
index 0000000..4a6e0cd
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/extension_setting_device.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/extension_setting_device.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possbile device types for an extension setting.
+type ExtensionSettingDeviceEnum_ExtensionSettingDevice int32
+
+const (
+	// Not specified.
+	ExtensionSettingDeviceEnum_UNSPECIFIED ExtensionSettingDeviceEnum_ExtensionSettingDevice = 0
+	// The value is unknown in this version.
+	ExtensionSettingDeviceEnum_UNKNOWN ExtensionSettingDeviceEnum_ExtensionSettingDevice = 1
+	// Mobile. The extensions in the extension setting will only serve on
+	// mobile devices.
+	ExtensionSettingDeviceEnum_MOBILE ExtensionSettingDeviceEnum_ExtensionSettingDevice = 2
+	// Desktop. The extensions in the extension setting will only serve on
+	// desktop devices.
+	ExtensionSettingDeviceEnum_DESKTOP ExtensionSettingDeviceEnum_ExtensionSettingDevice = 3
+)
+
+var ExtensionSettingDeviceEnum_ExtensionSettingDevice_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "MOBILE",
+	3: "DESKTOP",
+}
+
+var ExtensionSettingDeviceEnum_ExtensionSettingDevice_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"MOBILE":      2,
+	"DESKTOP":     3,
+}
+
+func (x ExtensionSettingDeviceEnum_ExtensionSettingDevice) String() string {
+	return proto.EnumName(ExtensionSettingDeviceEnum_ExtensionSettingDevice_name, int32(x))
+}
+
+func (ExtensionSettingDeviceEnum_ExtensionSettingDevice) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d12dc0a0593aa785, []int{0, 0}
+}
+
+// Container for enum describing extension setting device types.
+type ExtensionSettingDeviceEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExtensionSettingDeviceEnum) Reset()         { *m = ExtensionSettingDeviceEnum{} }
+func (m *ExtensionSettingDeviceEnum) String() string { return proto.CompactTextString(m) }
+func (*ExtensionSettingDeviceEnum) ProtoMessage()    {}
+func (*ExtensionSettingDeviceEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d12dc0a0593aa785, []int{0}
+}
+
+func (m *ExtensionSettingDeviceEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExtensionSettingDeviceEnum.Unmarshal(m, b)
+}
+func (m *ExtensionSettingDeviceEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExtensionSettingDeviceEnum.Marshal(b, m, deterministic)
+}
+func (m *ExtensionSettingDeviceEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExtensionSettingDeviceEnum.Merge(m, src)
+}
+func (m *ExtensionSettingDeviceEnum) XXX_Size() int {
+	return xxx_messageInfo_ExtensionSettingDeviceEnum.Size(m)
+}
+func (m *ExtensionSettingDeviceEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExtensionSettingDeviceEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExtensionSettingDeviceEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice", ExtensionSettingDeviceEnum_ExtensionSettingDevice_name, ExtensionSettingDeviceEnum_ExtensionSettingDevice_value)
+	proto.RegisterType((*ExtensionSettingDeviceEnum)(nil), "google.ads.googleads.v3.enums.ExtensionSettingDeviceEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/extension_setting_device.proto", fileDescriptor_d12dc0a0593aa785)
+}
+
+var fileDescriptor_d12dc0a0593aa785 = []byte{
+	// 309 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0x5d, 0x07, 0x13, 0xb2, 0x83, 0xa5, 0x07, 0x0f, 0xd3, 0x1d, 0xb6, 0x07, 0x48, 0x0e,
+	0xb9, 0x45, 0x2f, 0xad, 0x8b, 0x63, 0x4c, 0xdb, 0xc2, 0xdc, 0x04, 0x29, 0x8c, 0xba, 0x84, 0x10,
+	0x58, 0x93, 0xb1, 0x64, 0xc3, 0xe7, 0xf1, 0xe8, 0xa3, 0xf8, 0x28, 0x9e, 0x7c, 0x04, 0x69, 0x62,
+	0x7b, 0x9a, 0x5e, 0xca, 0x47, 0xbf, 0xff, 0xf7, 0xcb, 0xf7, 0xff, 0x83, 0x5b, 0xa1, 0xb5, 0xd8,
+	0x72, 0x54, 0x32, 0x83, 0xbc, 0xac, 0xd5, 0x11, 0x23, 0xae, 0x0e, 0x95, 0x41, 0xfc, 0xcd, 0x72,
+	0x65, 0xa4, 0x56, 0x6b, 0xc3, 0xad, 0x95, 0x4a, 0xac, 0x19, 0x3f, 0xca, 0x0d, 0x87, 0xbb, 0xbd,
+	0xb6, 0x3a, 0x1a, 0xfa, 0x08, 0x2c, 0x99, 0x81, 0x6d, 0x1a, 0x1e, 0x31, 0x74, 0xe9, 0xc1, 0x75,
+	0x03, 0xdf, 0x49, 0x54, 0x2a, 0xa5, 0x6d, 0x69, 0xa5, 0x56, 0xc6, 0x87, 0xc7, 0x15, 0x18, 0xd0,
+	0x06, 0xbf, 0xf0, 0xf4, 0x89, 0x83, 0x53, 0x75, 0xa8, 0xc6, 0x19, 0xb8, 0x3c, 0xed, 0x46, 0x17,
+	0xa0, 0xbf, 0x4c, 0x17, 0x39, 0xbd, 0x9b, 0xdd, 0xcf, 0xe8, 0x24, 0x3c, 0x8b, 0xfa, 0xe0, 0x7c,
+	0x99, 0xce, 0xd3, 0xec, 0x39, 0x0d, 0x3b, 0x11, 0x00, 0xbd, 0xc7, 0x2c, 0x99, 0x3d, 0xd0, 0x30,
+	0xa8, 0x8d, 0x09, 0x5d, 0xcc, 0x9f, 0xb2, 0x3c, 0xec, 0x26, 0xdf, 0x1d, 0x30, 0xda, 0xe8, 0x0a,
+	0xfe, 0x5b, 0x39, 0xb9, 0x3a, 0xfd, 0x68, 0x5e, 0x37, 0xce, 0x3b, 0x2f, 0xc9, 0x6f, 0x5a, 0xe8,
+	0x6d, 0xa9, 0x04, 0xd4, 0x7b, 0x81, 0x04, 0x57, 0x6e, 0x9f, 0xe6, 0x7c, 0x3b, 0x69, 0xfe, 0xb8,
+	0xe6, 0x8d, 0xfb, 0xbe, 0x07, 0xdd, 0x69, 0x1c, 0x7f, 0x04, 0xc3, 0xa9, 0x47, 0xc5, 0xcc, 0x40,
+	0x2f, 0x6b, 0xb5, 0xc2, 0xb0, 0x5e, 0xdf, 0x7c, 0x36, 0x7e, 0x11, 0x33, 0x53, 0xb4, 0x7e, 0xb1,
+	0xc2, 0x85, 0xf3, 0xbf, 0x82, 0x91, 0xff, 0x49, 0x48, 0xcc, 0x0c, 0x21, 0xed, 0x04, 0x21, 0x2b,
+	0x4c, 0x88, 0x9b, 0x79, 0xed, 0xb9, 0x62, 0xf8, 0x27, 0x00, 0x00, 0xff, 0xff, 0x15, 0xea, 0xb4,
+	0x28, 0xe5, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/extension_type.pb.go b/googleapis/ads/googleads/v3/enums/extension_type.pb.go
new file mode 100644
index 0000000..b56bc0c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/extension_type.pb.go
@@ -0,0 +1,171 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/extension_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible data types for an extension in an extension setting.
+type ExtensionTypeEnum_ExtensionType int32
+
+const (
+	// Not specified.
+	ExtensionTypeEnum_UNSPECIFIED ExtensionTypeEnum_ExtensionType = 0
+	// Used for return value only. Represents value unknown in this version.
+	ExtensionTypeEnum_UNKNOWN ExtensionTypeEnum_ExtensionType = 1
+	// None.
+	ExtensionTypeEnum_NONE ExtensionTypeEnum_ExtensionType = 2
+	// App.
+	ExtensionTypeEnum_APP ExtensionTypeEnum_ExtensionType = 3
+	// Call.
+	ExtensionTypeEnum_CALL ExtensionTypeEnum_ExtensionType = 4
+	// Callout.
+	ExtensionTypeEnum_CALLOUT ExtensionTypeEnum_ExtensionType = 5
+	// Message.
+	ExtensionTypeEnum_MESSAGE ExtensionTypeEnum_ExtensionType = 6
+	// Price.
+	ExtensionTypeEnum_PRICE ExtensionTypeEnum_ExtensionType = 7
+	// Promotion.
+	ExtensionTypeEnum_PROMOTION ExtensionTypeEnum_ExtensionType = 8
+	// Sitelink.
+	ExtensionTypeEnum_SITELINK ExtensionTypeEnum_ExtensionType = 10
+	// Structured snippet.
+	ExtensionTypeEnum_STRUCTURED_SNIPPET ExtensionTypeEnum_ExtensionType = 11
+	// Location.
+	ExtensionTypeEnum_LOCATION ExtensionTypeEnum_ExtensionType = 12
+	// Affiliate location.
+	ExtensionTypeEnum_AFFILIATE_LOCATION ExtensionTypeEnum_ExtensionType = 13
+	// Hotel callout
+	ExtensionTypeEnum_HOTEL_CALLOUT ExtensionTypeEnum_ExtensionType = 15
+)
+
+var ExtensionTypeEnum_ExtensionType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "NONE",
+	3:  "APP",
+	4:  "CALL",
+	5:  "CALLOUT",
+	6:  "MESSAGE",
+	7:  "PRICE",
+	8:  "PROMOTION",
+	10: "SITELINK",
+	11: "STRUCTURED_SNIPPET",
+	12: "LOCATION",
+	13: "AFFILIATE_LOCATION",
+	15: "HOTEL_CALLOUT",
+}
+
+var ExtensionTypeEnum_ExtensionType_value = map[string]int32{
+	"UNSPECIFIED":        0,
+	"UNKNOWN":            1,
+	"NONE":               2,
+	"APP":                3,
+	"CALL":               4,
+	"CALLOUT":            5,
+	"MESSAGE":            6,
+	"PRICE":              7,
+	"PROMOTION":          8,
+	"SITELINK":           10,
+	"STRUCTURED_SNIPPET": 11,
+	"LOCATION":           12,
+	"AFFILIATE_LOCATION": 13,
+	"HOTEL_CALLOUT":      15,
+}
+
+func (x ExtensionTypeEnum_ExtensionType) String() string {
+	return proto.EnumName(ExtensionTypeEnum_ExtensionType_name, int32(x))
+}
+
+func (ExtensionTypeEnum_ExtensionType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_db17f887bbab658a, []int{0, 0}
+}
+
+// Container for enum describing possible data types for an extension in an
+// extension setting.
+type ExtensionTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExtensionTypeEnum) Reset()         { *m = ExtensionTypeEnum{} }
+func (m *ExtensionTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ExtensionTypeEnum) ProtoMessage()    {}
+func (*ExtensionTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_db17f887bbab658a, []int{0}
+}
+
+func (m *ExtensionTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExtensionTypeEnum.Unmarshal(m, b)
+}
+func (m *ExtensionTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExtensionTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ExtensionTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExtensionTypeEnum.Merge(m, src)
+}
+func (m *ExtensionTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ExtensionTypeEnum.Size(m)
+}
+func (m *ExtensionTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExtensionTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExtensionTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ExtensionTypeEnum_ExtensionType", ExtensionTypeEnum_ExtensionType_name, ExtensionTypeEnum_ExtensionType_value)
+	proto.RegisterType((*ExtensionTypeEnum)(nil), "google.ads.googleads.v3.enums.ExtensionTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/extension_type.proto", fileDescriptor_db17f887bbab658a)
+}
+
+var fileDescriptor_db17f887bbab658a = []byte{
+	// 409 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0x41, 0x6b, 0xdb, 0x30,
+	0x18, 0x9d, 0x93, 0xb6, 0x49, 0x95, 0x86, 0xaa, 0x3a, 0xec, 0x30, 0xd6, 0x43, 0xfb, 0x03, 0x64,
+	0x98, 0x6f, 0xda, 0x49, 0x71, 0x95, 0x4c, 0xd4, 0x95, 0x44, 0x2c, 0x67, 0x30, 0x02, 0xc1, 0x9b,
+	0x8d, 0x09, 0x34, 0x92, 0xa9, 0xdc, 0xb2, 0xfe, 0x9d, 0x1d, 0xf7, 0x53, 0xf6, 0x1f, 0x76, 0x1e,
+	0xec, 0xba, 0x3f, 0x30, 0x64, 0xcf, 0x81, 0x1c, 0xd6, 0x8b, 0x78, 0x7a, 0xdf, 0x7b, 0x1f, 0x1f,
+	0xef, 0x81, 0x77, 0x95, 0xb5, 0xd5, 0x7d, 0x19, 0xe6, 0x85, 0x0b, 0x3b, 0xe8, 0xd1, 0x53, 0x14,
+	0x96, 0xe6, 0x71, 0xe7, 0xc2, 0xf2, 0x6b, 0x53, 0x1a, 0xb7, 0xb5, 0x66, 0xd3, 0x3c, 0xd7, 0x25,
+	0xae, 0x1f, 0x6c, 0x63, 0xd1, 0x65, 0x27, 0xc4, 0x79, 0xe1, 0xf0, 0xde, 0x83, 0x9f, 0x22, 0xdc,
+	0x7a, 0xde, 0xbc, 0xed, 0x57, 0xd6, 0xdb, 0x30, 0x37, 0xc6, 0x36, 0x79, 0xb3, 0xb5, 0xc6, 0x75,
+	0xe6, 0xeb, 0x3f, 0x01, 0xb8, 0x60, 0xfd, 0x56, 0xfd, 0x5c, 0x97, 0xcc, 0x3c, 0xee, 0xae, 0x7f,
+	0x06, 0x60, 0x7a, 0xc0, 0xa2, 0x73, 0x30, 0xc9, 0x44, 0xaa, 0x58, 0xcc, 0xe7, 0x9c, 0xdd, 0xc0,
+	0x57, 0x68, 0x02, 0x46, 0x99, 0xb8, 0x15, 0xf2, 0xa3, 0x80, 0x01, 0x1a, 0x83, 0x23, 0x21, 0x05,
+	0x83, 0x03, 0x34, 0x02, 0x43, 0xaa, 0x14, 0x1c, 0x7a, 0x2a, 0xa6, 0x49, 0x02, 0x8f, 0xbc, 0xd2,
+	0x23, 0x99, 0x69, 0x78, 0xec, 0x3f, 0x77, 0x2c, 0x4d, 0xe9, 0x82, 0xc1, 0x13, 0x74, 0x0a, 0x8e,
+	0xd5, 0x92, 0xc7, 0x0c, 0x8e, 0xd0, 0x14, 0x9c, 0xaa, 0xa5, 0xbc, 0x93, 0x9a, 0x4b, 0x01, 0xc7,
+	0xe8, 0x0c, 0x8c, 0x53, 0xae, 0x59, 0xc2, 0xc5, 0x2d, 0x04, 0xe8, 0x35, 0x40, 0xa9, 0x5e, 0x66,
+	0xb1, 0xce, 0x96, 0xec, 0x66, 0x93, 0x0a, 0xae, 0x14, 0xd3, 0x70, 0xe2, 0x55, 0x89, 0x8c, 0x69,
+	0xeb, 0x39, 0xf3, 0x2a, 0x3a, 0x9f, 0xf3, 0x84, 0x53, 0xcd, 0x36, 0x7b, 0x7e, 0x8a, 0x2e, 0xc0,
+	0xf4, 0x83, 0xd4, 0x2c, 0xd9, 0xf4, 0x57, 0x9c, 0xcf, 0x7e, 0x05, 0xe0, 0xea, 0x8b, 0xdd, 0xe1,
+	0x17, 0x93, 0x9b, 0xa1, 0x83, 0x08, 0x94, 0xcf, 0x4b, 0x05, 0x9f, 0x66, 0xff, 0x4c, 0x95, 0xbd,
+	0xcf, 0x4d, 0x85, 0xed, 0x43, 0x15, 0x56, 0xa5, 0x69, 0xd3, 0xec, 0x2b, 0xab, 0xb7, 0xee, 0x3f,
+	0x0d, 0xbe, 0x6f, 0xdf, 0x6f, 0x83, 0xe1, 0x82, 0xd2, 0xef, 0x83, 0xcb, 0x45, 0xb7, 0x8a, 0x16,
+	0x0e, 0x77, 0xd0, 0xa3, 0x55, 0x84, 0x7d, 0x09, 0xee, 0x47, 0x3f, 0x5f, 0xd3, 0xc2, 0xad, 0xf7,
+	0xf3, 0xf5, 0x2a, 0x5a, 0xb7, 0xf3, 0xdf, 0x83, 0xab, 0x8e, 0x24, 0x84, 0x16, 0x8e, 0x90, 0xbd,
+	0x82, 0x90, 0x55, 0x44, 0x48, 0xab, 0xf9, 0x7c, 0xd2, 0x1e, 0x16, 0xfd, 0x0d, 0x00, 0x00, 0xff,
+	0xff, 0x09, 0x27, 0xaa, 0xa1, 0x59, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/external_conversion_source.pb.go b/googleapis/ads/googleads/v3/enums/external_conversion_source.pb.go
new file mode 100644
index 0000000..040ce5a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/external_conversion_source.pb.go
@@ -0,0 +1,240 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/external_conversion_source.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The external conversion source that is associated with a ConversionAction.
+type ExternalConversionSourceEnum_ExternalConversionSource int32
+
+const (
+	// Not specified.
+	ExternalConversionSourceEnum_UNSPECIFIED ExternalConversionSourceEnum_ExternalConversionSource = 0
+	// Represents value unknown in this version.
+	ExternalConversionSourceEnum_UNKNOWN ExternalConversionSourceEnum_ExternalConversionSource = 1
+	// Conversion that occurs when a user navigates to a particular webpage
+	// after viewing an ad; Displayed in Google Ads UI as 'Website'.
+	ExternalConversionSourceEnum_WEBPAGE ExternalConversionSourceEnum_ExternalConversionSource = 2
+	// Conversion that comes from linked Google Analytics goal or transaction;
+	// Displayed in Google Ads UI as 'Analytics'.
+	ExternalConversionSourceEnum_ANALYTICS ExternalConversionSourceEnum_ExternalConversionSource = 3
+	// Website conversion that is uploaded through ConversionUploadService;
+	// Displayed in Google Ads UI as 'Import from clicks'.
+	ExternalConversionSourceEnum_UPLOAD ExternalConversionSourceEnum_ExternalConversionSource = 4
+	// Conversion that occurs when a user clicks on a call extension directly on
+	// an ad; Displayed in Google Ads UI as 'Calls from ads'.
+	ExternalConversionSourceEnum_AD_CALL_METRICS ExternalConversionSourceEnum_ExternalConversionSource = 5
+	// Conversion that occurs when a user calls a dynamically-generated phone
+	// number (by installed javascript) from an advertiser's website after
+	// clicking on an ad; Displayed in Google Ads UI as 'Calls from website'.
+	ExternalConversionSourceEnum_WEBSITE_CALL_METRICS ExternalConversionSourceEnum_ExternalConversionSource = 6
+	// Conversion that occurs when a user visits an advertiser's retail store
+	// after clicking on a Google ad;
+	// Displayed in Google Ads UI as 'Store visits'.
+	ExternalConversionSourceEnum_STORE_VISITS ExternalConversionSourceEnum_ExternalConversionSource = 7
+	// Conversion that occurs when a user takes an in-app action such as a
+	// purchase in an Android app;
+	// Displayed in Google Ads UI as 'Android in-app action'.
+	ExternalConversionSourceEnum_ANDROID_IN_APP ExternalConversionSourceEnum_ExternalConversionSource = 8
+	// Conversion that occurs when a user takes an in-app action such as a
+	// purchase in an iOS app;
+	// Displayed in Google Ads UI as 'iOS in-app action'.
+	ExternalConversionSourceEnum_IOS_IN_APP ExternalConversionSourceEnum_ExternalConversionSource = 9
+	// Conversion that occurs when a user opens an iOS app for the first time;
+	// Displayed in Google Ads UI as 'iOS app install (first open)'.
+	ExternalConversionSourceEnum_IOS_FIRST_OPEN ExternalConversionSourceEnum_ExternalConversionSource = 10
+	// Legacy app conversions that do not have an AppPlatform provided;
+	// Displayed in Google Ads UI as 'Mobile app'.
+	ExternalConversionSourceEnum_APP_UNSPECIFIED ExternalConversionSourceEnum_ExternalConversionSource = 11
+	// Conversion that occurs when a user opens an Android app for the first
+	// time; Displayed in Google Ads UI as 'Android app install (first open)'.
+	ExternalConversionSourceEnum_ANDROID_FIRST_OPEN ExternalConversionSourceEnum_ExternalConversionSource = 12
+	// Call conversion that is uploaded through ConversionUploadService;
+	// Displayed in Google Ads UI as 'Import from calls'.
+	ExternalConversionSourceEnum_UPLOAD_CALLS ExternalConversionSourceEnum_ExternalConversionSource = 13
+	// Conversion that comes from a linked Firebase event;
+	// Displayed in Google Ads UI as 'Firebase'.
+	ExternalConversionSourceEnum_FIREBASE ExternalConversionSourceEnum_ExternalConversionSource = 14
+	// Conversion that occurs when a user clicks on a mobile phone number;
+	// Displayed in Google Ads UI as 'Phone number clicks'.
+	ExternalConversionSourceEnum_CLICK_TO_CALL ExternalConversionSourceEnum_ExternalConversionSource = 15
+	// Conversion that comes from Salesforce;
+	// Displayed in Google Ads UI as 'Salesforce.com'.
+	ExternalConversionSourceEnum_SALESFORCE ExternalConversionSourceEnum_ExternalConversionSource = 16
+	// Conversion that comes from in-store purchases recorded by CRM;
+	// Displayed in Google Ads UI as 'Store sales (data partner)'.
+	ExternalConversionSourceEnum_STORE_SALES_CRM ExternalConversionSourceEnum_ExternalConversionSource = 17
+	// Conversion that comes from in-store purchases from payment network;
+	// Displayed in Google Ads UI as 'Store sales (payment network)'.
+	ExternalConversionSourceEnum_STORE_SALES_PAYMENT_NETWORK ExternalConversionSourceEnum_ExternalConversionSource = 18
+	// Codeless Google Play conversion;
+	// Displayed in Google Ads UI as 'Google Play'.
+	ExternalConversionSourceEnum_GOOGLE_PLAY ExternalConversionSourceEnum_ExternalConversionSource = 19
+	// Conversion that comes from a linked third-party app analytics event;
+	// Displayed in Google Ads UI as 'Third-party app analytics'.
+	ExternalConversionSourceEnum_THIRD_PARTY_APP_ANALYTICS ExternalConversionSourceEnum_ExternalConversionSource = 20
+	// Conversion that is controlled by Google Attribution.
+	ExternalConversionSourceEnum_GOOGLE_ATTRIBUTION ExternalConversionSourceEnum_ExternalConversionSource = 21
+	// Store Sales conversion based on first-party or third-party merchant data
+	// uploads. Displayed in Google Ads UI as 'Store sales (direct)'.
+	ExternalConversionSourceEnum_STORE_SALES_DIRECT ExternalConversionSourceEnum_ExternalConversionSource = 22
+)
+
+var ExternalConversionSourceEnum_ExternalConversionSource_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "WEBPAGE",
+	3:  "ANALYTICS",
+	4:  "UPLOAD",
+	5:  "AD_CALL_METRICS",
+	6:  "WEBSITE_CALL_METRICS",
+	7:  "STORE_VISITS",
+	8:  "ANDROID_IN_APP",
+	9:  "IOS_IN_APP",
+	10: "IOS_FIRST_OPEN",
+	11: "APP_UNSPECIFIED",
+	12: "ANDROID_FIRST_OPEN",
+	13: "UPLOAD_CALLS",
+	14: "FIREBASE",
+	15: "CLICK_TO_CALL",
+	16: "SALESFORCE",
+	17: "STORE_SALES_CRM",
+	18: "STORE_SALES_PAYMENT_NETWORK",
+	19: "GOOGLE_PLAY",
+	20: "THIRD_PARTY_APP_ANALYTICS",
+	21: "GOOGLE_ATTRIBUTION",
+	22: "STORE_SALES_DIRECT",
+}
+
+var ExternalConversionSourceEnum_ExternalConversionSource_value = map[string]int32{
+	"UNSPECIFIED":                 0,
+	"UNKNOWN":                     1,
+	"WEBPAGE":                     2,
+	"ANALYTICS":                   3,
+	"UPLOAD":                      4,
+	"AD_CALL_METRICS":             5,
+	"WEBSITE_CALL_METRICS":        6,
+	"STORE_VISITS":                7,
+	"ANDROID_IN_APP":              8,
+	"IOS_IN_APP":                  9,
+	"IOS_FIRST_OPEN":              10,
+	"APP_UNSPECIFIED":             11,
+	"ANDROID_FIRST_OPEN":          12,
+	"UPLOAD_CALLS":                13,
+	"FIREBASE":                    14,
+	"CLICK_TO_CALL":               15,
+	"SALESFORCE":                  16,
+	"STORE_SALES_CRM":             17,
+	"STORE_SALES_PAYMENT_NETWORK": 18,
+	"GOOGLE_PLAY":                 19,
+	"THIRD_PARTY_APP_ANALYTICS":   20,
+	"GOOGLE_ATTRIBUTION":          21,
+	"STORE_SALES_DIRECT":          22,
+}
+
+func (x ExternalConversionSourceEnum_ExternalConversionSource) String() string {
+	return proto.EnumName(ExternalConversionSourceEnum_ExternalConversionSource_name, int32(x))
+}
+
+func (ExternalConversionSourceEnum_ExternalConversionSource) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b7b39ef7737c2983, []int{0, 0}
+}
+
+// Container for enum describing the external conversion source that is
+// associated with a ConversionAction.
+type ExternalConversionSourceEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExternalConversionSourceEnum) Reset()         { *m = ExternalConversionSourceEnum{} }
+func (m *ExternalConversionSourceEnum) String() string { return proto.CompactTextString(m) }
+func (*ExternalConversionSourceEnum) ProtoMessage()    {}
+func (*ExternalConversionSourceEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b7b39ef7737c2983, []int{0}
+}
+
+func (m *ExternalConversionSourceEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExternalConversionSourceEnum.Unmarshal(m, b)
+}
+func (m *ExternalConversionSourceEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExternalConversionSourceEnum.Marshal(b, m, deterministic)
+}
+func (m *ExternalConversionSourceEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExternalConversionSourceEnum.Merge(m, src)
+}
+func (m *ExternalConversionSourceEnum) XXX_Size() int {
+	return xxx_messageInfo_ExternalConversionSourceEnum.Size(m)
+}
+func (m *ExternalConversionSourceEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExternalConversionSourceEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExternalConversionSourceEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ExternalConversionSourceEnum_ExternalConversionSource", ExternalConversionSourceEnum_ExternalConversionSource_name, ExternalConversionSourceEnum_ExternalConversionSource_value)
+	proto.RegisterType((*ExternalConversionSourceEnum)(nil), "google.ads.googleads.v3.enums.ExternalConversionSourceEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/external_conversion_source.proto", fileDescriptor_b7b39ef7737c2983)
+}
+
+var fileDescriptor_b7b39ef7737c2983 = []byte{
+	// 551 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xdd, 0x6e, 0xd3, 0x30,
+	0x14, 0x66, 0xdd, 0xd8, 0x8f, 0xf7, 0xe7, 0x79, 0x63, 0x1a, 0xb0, 0x0a, 0x6d, 0x0f, 0x90, 0x5c,
+	0xe4, 0x2e, 0x48, 0x48, 0x4e, 0xe2, 0x16, 0x6b, 0x59, 0x6c, 0xd9, 0x6e, 0xab, 0xa2, 0x4a, 0x56,
+	0x58, 0xa3, 0xa8, 0xd2, 0x1a, 0x57, 0x4d, 0x5b, 0x71, 0xc9, 0xb3, 0x70, 0xc9, 0xa3, 0xf0, 0x12,
+	0xdc, 0x73, 0xc9, 0x13, 0x20, 0x27, 0x6d, 0x29, 0x17, 0xe5, 0xc6, 0x3a, 0x3f, 0xdf, 0x39, 0xdf,
+	0x77, 0xac, 0x0f, 0x7c, 0xc8, 0x8d, 0xc9, 0x9f, 0x33, 0x37, 0x1d, 0x96, 0x6e, 0x1d, 0xda, 0x68,
+	0xe1, 0xb9, 0x59, 0x31, 0x1f, 0x97, 0x6e, 0xf6, 0x65, 0x96, 0x4d, 0x8b, 0xf4, 0x59, 0x3f, 0x99,
+	0x62, 0x91, 0x4d, 0xcb, 0x91, 0x29, 0x74, 0x69, 0xe6, 0xd3, 0xa7, 0xcc, 0x99, 0x4c, 0xcd, 0xcc,
+	0xa0, 0x66, 0x3d, 0xe4, 0xa4, 0xc3, 0xd2, 0x59, 0xcf, 0x3b, 0x0b, 0xcf, 0xa9, 0xe6, 0xdf, 0xdc,
+	0xae, 0xd6, 0x4f, 0x46, 0x6e, 0x5a, 0x14, 0x66, 0x96, 0xce, 0x46, 0xa6, 0x28, 0xeb, 0xe1, 0xfb,
+	0xaf, 0x7b, 0xe0, 0x96, 0x2c, 0x19, 0xc2, 0x35, 0x81, 0xac, 0xf6, 0x93, 0x62, 0x3e, 0xbe, 0xff,
+	0xb9, 0x0b, 0x6e, 0xb6, 0x01, 0xd0, 0x39, 0x38, 0xee, 0x24, 0x92, 0x93, 0x90, 0xb6, 0x28, 0x89,
+	0xe0, 0x0b, 0x74, 0x0c, 0x0e, 0x3a, 0xc9, 0x43, 0xc2, 0x7a, 0x09, 0xdc, 0xb1, 0x49, 0x8f, 0x04,
+	0x1c, 0xb7, 0x09, 0x6c, 0xa0, 0x53, 0x70, 0x84, 0x13, 0x1c, 0xf7, 0x15, 0x0d, 0x25, 0xdc, 0x45,
+	0x00, 0xec, 0x77, 0x78, 0xcc, 0x70, 0x04, 0xf7, 0xd0, 0x25, 0x38, 0xc7, 0x91, 0x0e, 0x71, 0x1c,
+	0xeb, 0x47, 0xa2, 0x84, 0x05, 0xbc, 0x44, 0x37, 0xe0, 0xaa, 0x47, 0x02, 0x49, 0x15, 0xf9, 0xb7,
+	0xb3, 0x8f, 0x20, 0x38, 0x91, 0x8a, 0x09, 0xa2, 0xbb, 0x54, 0x52, 0x25, 0xe1, 0x01, 0x42, 0xe0,
+	0x0c, 0x27, 0x91, 0x60, 0x34, 0xd2, 0x34, 0xd1, 0x98, 0x73, 0x78, 0x88, 0xce, 0x00, 0xa0, 0x4c,
+	0xae, 0xf2, 0x23, 0x8b, 0xb1, 0x79, 0x8b, 0x0a, 0xa9, 0x34, 0xe3, 0x24, 0x81, 0xa0, 0x22, 0xe6,
+	0x5c, 0x6f, 0x9e, 0x70, 0x8c, 0xae, 0x01, 0x5a, 0x2d, 0xdb, 0x00, 0x9f, 0x58, 0xda, 0x5a, 0x71,
+	0xa5, 0x47, 0xc2, 0x53, 0x74, 0x02, 0x0e, 0x5b, 0x54, 0x90, 0x00, 0x4b, 0x02, 0xcf, 0xd0, 0x05,
+	0x38, 0x0d, 0x63, 0x1a, 0x3e, 0x68, 0xc5, 0x2a, 0x04, 0x3c, 0xb7, 0x1a, 0x24, 0x8e, 0x89, 0x6c,
+	0x31, 0x11, 0x12, 0x08, 0x2d, 0x5f, 0xad, 0xbc, 0xaa, 0xea, 0x50, 0x3c, 0xc2, 0x0b, 0xf4, 0x0e,
+	0xbc, 0xdd, 0x2c, 0x72, 0xdc, 0x7f, 0x24, 0x89, 0xd2, 0x09, 0x51, 0x3d, 0x26, 0x1e, 0x20, 0xb2,
+	0x9f, 0xdc, 0x66, 0xac, 0x1d, 0x13, 0xcd, 0x63, 0xdc, 0x87, 0x97, 0xa8, 0x09, 0x5e, 0xab, 0x8f,
+	0x54, 0x44, 0x9a, 0x63, 0xa1, 0xfa, 0xf6, 0x3e, 0xfd, 0xf7, 0x6b, 0xaf, 0xec, 0x01, 0x4b, 0x3c,
+	0x56, 0x4a, 0xd0, 0xa0, 0xa3, 0x28, 0x4b, 0xe0, 0x2b, 0x5b, 0xdf, 0x24, 0x8a, 0xa8, 0x20, 0xa1,
+	0x82, 0xd7, 0xc1, 0xef, 0x1d, 0x70, 0xf7, 0x64, 0xc6, 0xce, 0x7f, 0x6d, 0x14, 0x34, 0xb7, 0x99,
+	0x80, 0x5b, 0x1f, 0xf1, 0x9d, 0x4f, 0xc1, 0x72, 0x3e, 0x37, 0xcf, 0x69, 0x91, 0x3b, 0x66, 0x9a,
+	0xbb, 0x79, 0x56, 0x54, 0x2e, 0x5b, 0xd9, 0x7a, 0x32, 0x2a, 0xb7, 0xb8, 0xfc, 0x7d, 0xf5, 0x7e,
+	0x6b, 0xec, 0xb6, 0x31, 0xfe, 0xde, 0x68, 0xb6, 0xeb, 0x55, 0x78, 0x58, 0x3a, 0x75, 0x68, 0xa3,
+	0xae, 0xe7, 0x58, 0x47, 0x96, 0x3f, 0x56, 0xfd, 0x01, 0x1e, 0x96, 0x83, 0x75, 0x7f, 0xd0, 0xf5,
+	0x06, 0x55, 0xff, 0x57, 0xe3, 0xae, 0x2e, 0xfa, 0x3e, 0x1e, 0x96, 0xbe, 0xbf, 0x46, 0xf8, 0x7e,
+	0xd7, 0xf3, 0xfd, 0x0a, 0xf3, 0x79, 0xbf, 0x12, 0xe6, 0xfd, 0x09, 0x00, 0x00, 0xff, 0xff, 0x93,
+	0x89, 0xa5, 0x1b, 0x7d, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_attribute_type.pb.go b/googleapis/ads/googleads/v3/enums/feed_attribute_type.pb.go
new file mode 100644
index 0000000..fce71bd
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_attribute_type.pb.go
@@ -0,0 +1,174 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_attribute_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible data types for a feed attribute.
+type FeedAttributeTypeEnum_FeedAttributeType int32
+
+const (
+	// Not specified.
+	FeedAttributeTypeEnum_UNSPECIFIED FeedAttributeTypeEnum_FeedAttributeType = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedAttributeTypeEnum_UNKNOWN FeedAttributeTypeEnum_FeedAttributeType = 1
+	// Int64.
+	FeedAttributeTypeEnum_INT64 FeedAttributeTypeEnum_FeedAttributeType = 2
+	// Double.
+	FeedAttributeTypeEnum_DOUBLE FeedAttributeTypeEnum_FeedAttributeType = 3
+	// String.
+	FeedAttributeTypeEnum_STRING FeedAttributeTypeEnum_FeedAttributeType = 4
+	// Boolean.
+	FeedAttributeTypeEnum_BOOLEAN FeedAttributeTypeEnum_FeedAttributeType = 5
+	// Url.
+	FeedAttributeTypeEnum_URL FeedAttributeTypeEnum_FeedAttributeType = 6
+	// Datetime.
+	FeedAttributeTypeEnum_DATE_TIME FeedAttributeTypeEnum_FeedAttributeType = 7
+	// Int64 list.
+	FeedAttributeTypeEnum_INT64_LIST FeedAttributeTypeEnum_FeedAttributeType = 8
+	// Double (8 bytes) list.
+	FeedAttributeTypeEnum_DOUBLE_LIST FeedAttributeTypeEnum_FeedAttributeType = 9
+	// String list.
+	FeedAttributeTypeEnum_STRING_LIST FeedAttributeTypeEnum_FeedAttributeType = 10
+	// Boolean list.
+	FeedAttributeTypeEnum_BOOLEAN_LIST FeedAttributeTypeEnum_FeedAttributeType = 11
+	// Url list.
+	FeedAttributeTypeEnum_URL_LIST FeedAttributeTypeEnum_FeedAttributeType = 12
+	// Datetime list.
+	FeedAttributeTypeEnum_DATE_TIME_LIST FeedAttributeTypeEnum_FeedAttributeType = 13
+	// Price.
+	FeedAttributeTypeEnum_PRICE FeedAttributeTypeEnum_FeedAttributeType = 14
+)
+
+var FeedAttributeTypeEnum_FeedAttributeType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "INT64",
+	3:  "DOUBLE",
+	4:  "STRING",
+	5:  "BOOLEAN",
+	6:  "URL",
+	7:  "DATE_TIME",
+	8:  "INT64_LIST",
+	9:  "DOUBLE_LIST",
+	10: "STRING_LIST",
+	11: "BOOLEAN_LIST",
+	12: "URL_LIST",
+	13: "DATE_TIME_LIST",
+	14: "PRICE",
+}
+
+var FeedAttributeTypeEnum_FeedAttributeType_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"INT64":          2,
+	"DOUBLE":         3,
+	"STRING":         4,
+	"BOOLEAN":        5,
+	"URL":            6,
+	"DATE_TIME":      7,
+	"INT64_LIST":     8,
+	"DOUBLE_LIST":    9,
+	"STRING_LIST":    10,
+	"BOOLEAN_LIST":   11,
+	"URL_LIST":       12,
+	"DATE_TIME_LIST": 13,
+	"PRICE":          14,
+}
+
+func (x FeedAttributeTypeEnum_FeedAttributeType) String() string {
+	return proto.EnumName(FeedAttributeTypeEnum_FeedAttributeType_name, int32(x))
+}
+
+func (FeedAttributeTypeEnum_FeedAttributeType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7ad66d0f530d8c45, []int{0, 0}
+}
+
+// Container for enum describing possible data types for a feed attribute.
+type FeedAttributeTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedAttributeTypeEnum) Reset()         { *m = FeedAttributeTypeEnum{} }
+func (m *FeedAttributeTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedAttributeTypeEnum) ProtoMessage()    {}
+func (*FeedAttributeTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7ad66d0f530d8c45, []int{0}
+}
+
+func (m *FeedAttributeTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedAttributeTypeEnum.Unmarshal(m, b)
+}
+func (m *FeedAttributeTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedAttributeTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedAttributeTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedAttributeTypeEnum.Merge(m, src)
+}
+func (m *FeedAttributeTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedAttributeTypeEnum.Size(m)
+}
+func (m *FeedAttributeTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedAttributeTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedAttributeTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedAttributeTypeEnum_FeedAttributeType", FeedAttributeTypeEnum_FeedAttributeType_name, FeedAttributeTypeEnum_FeedAttributeType_value)
+	proto.RegisterType((*FeedAttributeTypeEnum)(nil), "google.ads.googleads.v3.enums.FeedAttributeTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_attribute_type.proto", fileDescriptor_7ad66d0f530d8c45)
+}
+
+var fileDescriptor_7ad66d0f530d8c45 = []byte{
+	// 406 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0x6e, 0xd3, 0x40,
+	0x14, 0x24, 0x0e, 0x4d, 0x9a, 0x97, 0x34, 0x2c, 0x2b, 0xc1, 0x01, 0xd1, 0x43, 0xfb, 0x01, 0xeb,
+	0x83, 0x11, 0x48, 0xcb, 0x69, 0xdd, 0x6c, 0x23, 0x0b, 0xe3, 0x58, 0x8e, 0x1d, 0x24, 0x64, 0xc9,
+	0x72, 0xf1, 0x62, 0x59, 0x6a, 0xbc, 0x56, 0xd6, 0xa9, 0xd4, 0x3b, 0x5f, 0xc2, 0x91, 0x4f, 0xe1,
+	0x53, 0xca, 0x4f, 0xa0, 0xf5, 0xd6, 0xbe, 0x54, 0x70, 0xb1, 0xc6, 0xf3, 0x66, 0x66, 0x9f, 0xe6,
+	0xc1, 0x87, 0x52, 0xca, 0xf2, 0x56, 0xd8, 0x79, 0xa1, 0x6c, 0x03, 0x35, 0xba, 0x73, 0x6c, 0x51,
+	0x1f, 0xf7, 0xca, 0xfe, 0x2e, 0x44, 0x91, 0xe5, 0x6d, 0x7b, 0xa8, 0x6e, 0x8e, 0xad, 0xc8, 0xda,
+	0xfb, 0x46, 0x90, 0xe6, 0x20, 0x5b, 0x89, 0xcf, 0x8d, 0x9a, 0xe4, 0x85, 0x22, 0x83, 0x91, 0xdc,
+	0x39, 0xa4, 0x33, 0xbe, 0x79, 0xdb, 0xe7, 0x36, 0x95, 0x9d, 0xd7, 0xb5, 0x6c, 0xf3, 0xb6, 0x92,
+	0xb5, 0x32, 0xe6, 0xcb, 0x1f, 0x16, 0xbc, 0xba, 0x16, 0xa2, 0x60, 0x7d, 0x72, 0x7c, 0xdf, 0x08,
+	0x5e, 0x1f, 0xf7, 0x97, 0x0f, 0x23, 0x78, 0xf9, 0x64, 0x82, 0x5f, 0xc0, 0x3c, 0x09, 0xb6, 0x21,
+	0xbf, 0xf2, 0xae, 0x3d, 0xbe, 0x42, 0xcf, 0xf0, 0x1c, 0xa6, 0x49, 0xf0, 0x29, 0xd8, 0x7c, 0x09,
+	0xd0, 0x08, 0xcf, 0xe0, 0xc4, 0x0b, 0xe2, 0xf7, 0xef, 0x90, 0x85, 0x01, 0x26, 0xab, 0x4d, 0xe2,
+	0xfa, 0x1c, 0x8d, 0x35, 0xde, 0xc6, 0x91, 0x17, 0xac, 0xd1, 0x73, 0xad, 0x77, 0x37, 0x1b, 0x9f,
+	0xb3, 0x00, 0x9d, 0xe0, 0x29, 0x8c, 0x93, 0xc8, 0x47, 0x13, 0x7c, 0x06, 0xb3, 0x15, 0x8b, 0x79,
+	0x16, 0x7b, 0x9f, 0x39, 0x9a, 0xe2, 0x25, 0x40, 0x97, 0x93, 0xf9, 0xde, 0x36, 0x46, 0xa7, 0xfa,
+	0x55, 0x13, 0x66, 0x88, 0x99, 0x26, 0x4c, 0xa2, 0x21, 0x00, 0x23, 0x58, 0x3c, 0xc6, 0x1a, 0x66,
+	0x8e, 0x17, 0x70, 0x9a, 0x44, 0xbe, 0xf9, 0x5b, 0x60, 0x0c, 0xcb, 0xe1, 0x01, 0xc3, 0x9d, 0xe9,
+	0x6d, 0xc3, 0xc8, 0xbb, 0xe2, 0x68, 0xe9, 0xfe, 0x19, 0xc1, 0xc5, 0x37, 0xb9, 0x27, 0xff, 0xad,
+	0xd2, 0x7d, 0xfd, 0xa4, 0x8f, 0x50, 0x97, 0x18, 0x8e, 0xbe, 0xba, 0x8f, 0xc6, 0x52, 0xde, 0xe6,
+	0x75, 0x49, 0xe4, 0xa1, 0xb4, 0x4b, 0x51, 0x77, 0x15, 0xf7, 0xc7, 0x6c, 0x2a, 0xf5, 0x8f, 0xdb,
+	0x7e, 0xec, 0xbe, 0x3f, 0xad, 0xf1, 0x9a, 0xb1, 0x5f, 0xd6, 0xf9, 0xda, 0x44, 0xb1, 0x42, 0x11,
+	0x03, 0x35, 0xda, 0x39, 0x44, 0x5f, 0x45, 0xfd, 0xee, 0xe7, 0x29, 0x2b, 0x54, 0x3a, 0xcc, 0xd3,
+	0x9d, 0x93, 0x76, 0xf3, 0x07, 0xeb, 0xc2, 0x90, 0x94, 0xb2, 0x42, 0x51, 0x3a, 0x28, 0x28, 0xdd,
+	0x39, 0x94, 0x76, 0x9a, 0x9b, 0x49, 0xb7, 0x98, 0xf3, 0x37, 0x00, 0x00, 0xff, 0xff, 0x52, 0x2c,
+	0x81, 0xd4, 0x73, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_item_quality_approval_status.pb.go b/googleapis/ads/googleads/v3/enums/feed_item_quality_approval_status.pb.go
new file mode 100644
index 0000000..d952edd
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_item_quality_approval_status.pb.go
@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_item_quality_approval_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible quality evaluation approval statuses of a feed item.
+type FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus int32
+
+const (
+	// No value has been specified.
+	FeedItemQualityApprovalStatusEnum_UNSPECIFIED FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedItemQualityApprovalStatusEnum_UNKNOWN FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus = 1
+	// Meets all quality expectations.
+	FeedItemQualityApprovalStatusEnum_APPROVED FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus = 2
+	// Does not meet some quality expectations. The specific reason is found in
+	// the quality_disapproval_reasons field.
+	FeedItemQualityApprovalStatusEnum_DISAPPROVED FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus = 3
+)
+
+var FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "APPROVED",
+	3: "DISAPPROVED",
+}
+
+var FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"APPROVED":    2,
+	"DISAPPROVED": 3,
+}
+
+func (x FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus) String() string {
+	return proto.EnumName(FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_name, int32(x))
+}
+
+func (FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fc4171234ccf44c4, []int{0, 0}
+}
+
+// Container for enum describing possible quality evaluation approval statuses
+// of a feed item.
+type FeedItemQualityApprovalStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemQualityApprovalStatusEnum) Reset()         { *m = FeedItemQualityApprovalStatusEnum{} }
+func (m *FeedItemQualityApprovalStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemQualityApprovalStatusEnum) ProtoMessage()    {}
+func (*FeedItemQualityApprovalStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc4171234ccf44c4, []int{0}
+}
+
+func (m *FeedItemQualityApprovalStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemQualityApprovalStatusEnum.Unmarshal(m, b)
+}
+func (m *FeedItemQualityApprovalStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemQualityApprovalStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemQualityApprovalStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemQualityApprovalStatusEnum.Merge(m, src)
+}
+func (m *FeedItemQualityApprovalStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemQualityApprovalStatusEnum.Size(m)
+}
+func (m *FeedItemQualityApprovalStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemQualityApprovalStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemQualityApprovalStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus", FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_name, FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_value)
+	proto.RegisterType((*FeedItemQualityApprovalStatusEnum)(nil), "google.ads.googleads.v3.enums.FeedItemQualityApprovalStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_item_quality_approval_status.proto", fileDescriptor_fc4171234ccf44c4)
+}
+
+var fileDescriptor_fc4171234ccf44c4 = []byte{
+	// 322 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4b, 0xc3, 0x30,
+	0x18, 0xb5, 0x1d, 0xa8, 0x64, 0x82, 0xa3, 0x47, 0x71, 0x87, 0xed, 0x07, 0xa4, 0x87, 0xdc, 0xe2,
+	0x29, 0x73, 0xdd, 0x28, 0x42, 0x57, 0x1d, 0xab, 0x20, 0x85, 0x12, 0x4d, 0x0c, 0x85, 0x36, 0xa9,
+	0x4b, 0x3a, 0xf0, 0xe8, 0x5f, 0xf1, 0xe8, 0x4f, 0xf1, 0xa7, 0xf8, 0x07, 0xbc, 0x4a, 0x93, 0xad,
+	0x37, 0x77, 0x09, 0x8f, 0x7c, 0xef, 0x7b, 0xef, 0x7b, 0x0f, 0x44, 0x42, 0x29, 0x51, 0xf1, 0x90,
+	0x32, 0x1d, 0x3a, 0xd8, 0xa1, 0x1d, 0x0a, 0xb9, 0x6c, 0x6b, 0x1d, 0xbe, 0x72, 0xce, 0x8a, 0xd2,
+	0xf0, 0xba, 0x78, 0x6b, 0x69, 0x55, 0x9a, 0xf7, 0x82, 0x36, 0xcd, 0x56, 0xed, 0x68, 0x55, 0x68,
+	0x43, 0x4d, 0xab, 0x61, 0xb3, 0x55, 0x46, 0x05, 0x63, 0xb7, 0x0b, 0x29, 0xd3, 0xb0, 0x97, 0x81,
+	0x3b, 0x04, 0xad, 0xcc, 0xd5, 0xf5, 0xc1, 0xa5, 0x29, 0x43, 0x2a, 0xa5, 0x32, 0xd4, 0x94, 0x4a,
+	0xee, 0x97, 0xa7, 0x1f, 0x1e, 0x98, 0x2c, 0x38, 0x67, 0xb1, 0xe1, 0xf5, 0xbd, 0xb3, 0x21, 0x7b,
+	0x97, 0xb5, 0x35, 0x89, 0x64, 0x5b, 0x4f, 0x73, 0x30, 0x3e, 0x4a, 0x0a, 0x2e, 0xc1, 0x70, 0x93,
+	0xac, 0xd3, 0xe8, 0x36, 0x5e, 0xc4, 0xd1, 0x7c, 0x74, 0x12, 0x0c, 0xc1, 0xd9, 0x26, 0xb9, 0x4b,
+	0x56, 0x8f, 0xc9, 0xc8, 0x0b, 0x2e, 0xc0, 0x39, 0x49, 0xd3, 0x87, 0x55, 0x16, 0xcd, 0x47, 0x7e,
+	0xc7, 0x9d, 0xc7, 0xeb, 0xfe, 0x63, 0x30, 0xfb, 0xf5, 0xc0, 0xe4, 0x45, 0xd5, 0xf0, 0x68, 0x8e,
+	0xd9, 0xf4, 0xe8, 0x05, 0x69, 0x97, 0x26, 0xf5, 0x9e, 0x66, 0x7b, 0x11, 0xa1, 0x2a, 0x2a, 0x05,
+	0x54, 0x5b, 0x11, 0x0a, 0x2e, 0x6d, 0xd6, 0x43, 0xc7, 0x4d, 0xa9, 0xff, 0xa9, 0xfc, 0xc6, 0xbe,
+	0x9f, 0xfe, 0x60, 0x49, 0xc8, 0x97, 0x3f, 0x5e, 0x3a, 0x29, 0xc2, 0x34, 0x74, 0xb0, 0x43, 0x19,
+	0x82, 0x5d, 0x25, 0xfa, 0xfb, 0x30, 0xcf, 0x09, 0xd3, 0x79, 0x3f, 0xcf, 0x33, 0x94, 0xdb, 0xf9,
+	0x8f, 0x3f, 0x71, 0x9f, 0x18, 0x13, 0xa6, 0x31, 0xee, 0x19, 0x18, 0x67, 0x08, 0x63, 0xcb, 0x79,
+	0x3e, 0xb5, 0x87, 0xa1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x65, 0x71, 0x05, 0xda, 0x0a, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_item_quality_disapproval_reason.pb.go b/googleapis/ads/googleads/v3/enums/feed_item_quality_disapproval_reason.pb.go
new file mode 100644
index 0000000..56b0f9f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_item_quality_disapproval_reason.pb.go
@@ -0,0 +1,209 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_item_quality_disapproval_reason.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible quality evaluation disapproval reasons of a feed item.
+type FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason int32
+
+const (
+	// No value has been specified.
+	FeedItemQualityDisapprovalReasonEnum_UNSPECIFIED FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedItemQualityDisapprovalReasonEnum_UNKNOWN FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 1
+	// Price contains repetitive headers.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_REPETITIVE_HEADERS FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 2
+	// Price contains repetitive description.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_REPETITIVE_DESCRIPTION FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 3
+	// Price contains inconsistent items.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_INCONSISTENT_ROWS FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 4
+	// Price contains qualifiers in description.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_DESCRIPTION_HAS_PRICE_QUALIFIERS FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 5
+	// Price contains an unsupported language.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_UNSUPPORTED_LANGUAGE FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 6
+	// Price item header is not relevant to the price type.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_ROW_HEADER_TABLE_TYPE_MISMATCH FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 7
+	// Price item header has promotional text.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_ROW_HEADER_HAS_PROMOTIONAL_TEXT FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 8
+	// Price item description is not relevant to the item header.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_ROW_DESCRIPTION_NOT_RELEVANT FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 9
+	// Price item description contains promotional text.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_ROW_DESCRIPTION_HAS_PROMOTIONAL_TEXT FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 10
+	// Price item header and description are repetitive.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_ROW_HEADER_DESCRIPTION_REPETITIVE FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 11
+	// Price item is in a foreign language, nonsense, or can't be rated.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_ROW_UNRATEABLE FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 12
+	// Price item price is invalid or inaccurate.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_ROW_PRICE_INVALID FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 13
+	// Price item URL is invalid or irrelevant.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_TABLE_ROW_URL_INVALID FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 14
+	// Price item header or description has price.
+	FeedItemQualityDisapprovalReasonEnum_PRICE_HEADER_OR_DESCRIPTION_HAS_PRICE FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 15
+	// Structured snippet values do not match the header.
+	FeedItemQualityDisapprovalReasonEnum_STRUCTURED_SNIPPETS_HEADER_POLICY_VIOLATED FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 16
+	// Structured snippet values are repeated.
+	FeedItemQualityDisapprovalReasonEnum_STRUCTURED_SNIPPETS_REPEATED_VALUES FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 17
+	// Structured snippet values violate editorial guidelines like punctuation.
+	FeedItemQualityDisapprovalReasonEnum_STRUCTURED_SNIPPETS_EDITORIAL_GUIDELINES FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 18
+	// Structured snippet contain promotional text.
+	FeedItemQualityDisapprovalReasonEnum_STRUCTURED_SNIPPETS_HAS_PROMOTIONAL_TEXT FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason = 19
+)
+
+var FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "PRICE_TABLE_REPETITIVE_HEADERS",
+	3:  "PRICE_TABLE_REPETITIVE_DESCRIPTION",
+	4:  "PRICE_TABLE_INCONSISTENT_ROWS",
+	5:  "PRICE_DESCRIPTION_HAS_PRICE_QUALIFIERS",
+	6:  "PRICE_UNSUPPORTED_LANGUAGE",
+	7:  "PRICE_TABLE_ROW_HEADER_TABLE_TYPE_MISMATCH",
+	8:  "PRICE_TABLE_ROW_HEADER_HAS_PROMOTIONAL_TEXT",
+	9:  "PRICE_TABLE_ROW_DESCRIPTION_NOT_RELEVANT",
+	10: "PRICE_TABLE_ROW_DESCRIPTION_HAS_PROMOTIONAL_TEXT",
+	11: "PRICE_TABLE_ROW_HEADER_DESCRIPTION_REPETITIVE",
+	12: "PRICE_TABLE_ROW_UNRATEABLE",
+	13: "PRICE_TABLE_ROW_PRICE_INVALID",
+	14: "PRICE_TABLE_ROW_URL_INVALID",
+	15: "PRICE_HEADER_OR_DESCRIPTION_HAS_PRICE",
+	16: "STRUCTURED_SNIPPETS_HEADER_POLICY_VIOLATED",
+	17: "STRUCTURED_SNIPPETS_REPEATED_VALUES",
+	18: "STRUCTURED_SNIPPETS_EDITORIAL_GUIDELINES",
+	19: "STRUCTURED_SNIPPETS_HAS_PROMOTIONAL_TEXT",
+}
+
+var FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason_value = map[string]int32{
+	"UNSPECIFIED":                                      0,
+	"UNKNOWN":                                          1,
+	"PRICE_TABLE_REPETITIVE_HEADERS":                   2,
+	"PRICE_TABLE_REPETITIVE_DESCRIPTION":               3,
+	"PRICE_TABLE_INCONSISTENT_ROWS":                    4,
+	"PRICE_DESCRIPTION_HAS_PRICE_QUALIFIERS":           5,
+	"PRICE_UNSUPPORTED_LANGUAGE":                       6,
+	"PRICE_TABLE_ROW_HEADER_TABLE_TYPE_MISMATCH":       7,
+	"PRICE_TABLE_ROW_HEADER_HAS_PROMOTIONAL_TEXT":      8,
+	"PRICE_TABLE_ROW_DESCRIPTION_NOT_RELEVANT":         9,
+	"PRICE_TABLE_ROW_DESCRIPTION_HAS_PROMOTIONAL_TEXT": 10,
+	"PRICE_TABLE_ROW_HEADER_DESCRIPTION_REPETITIVE":    11,
+	"PRICE_TABLE_ROW_UNRATEABLE":                       12,
+	"PRICE_TABLE_ROW_PRICE_INVALID":                    13,
+	"PRICE_TABLE_ROW_URL_INVALID":                      14,
+	"PRICE_HEADER_OR_DESCRIPTION_HAS_PRICE":            15,
+	"STRUCTURED_SNIPPETS_HEADER_POLICY_VIOLATED":       16,
+	"STRUCTURED_SNIPPETS_REPEATED_VALUES":              17,
+	"STRUCTURED_SNIPPETS_EDITORIAL_GUIDELINES":         18,
+	"STRUCTURED_SNIPPETS_HAS_PROMOTIONAL_TEXT":         19,
+}
+
+func (x FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason) String() string {
+	return proto.EnumName(FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason_name, int32(x))
+}
+
+func (FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_f4af24b544d16aee, []int{0, 0}
+}
+
+// Container for enum describing possible quality evaluation disapproval reasons
+// of a feed item.
+type FeedItemQualityDisapprovalReasonEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemQualityDisapprovalReasonEnum) Reset()         { *m = FeedItemQualityDisapprovalReasonEnum{} }
+func (m *FeedItemQualityDisapprovalReasonEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemQualityDisapprovalReasonEnum) ProtoMessage()    {}
+func (*FeedItemQualityDisapprovalReasonEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f4af24b544d16aee, []int{0}
+}
+
+func (m *FeedItemQualityDisapprovalReasonEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemQualityDisapprovalReasonEnum.Unmarshal(m, b)
+}
+func (m *FeedItemQualityDisapprovalReasonEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemQualityDisapprovalReasonEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemQualityDisapprovalReasonEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemQualityDisapprovalReasonEnum.Merge(m, src)
+}
+func (m *FeedItemQualityDisapprovalReasonEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemQualityDisapprovalReasonEnum.Size(m)
+}
+func (m *FeedItemQualityDisapprovalReasonEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemQualityDisapprovalReasonEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemQualityDisapprovalReasonEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason", FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason_name, FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason_value)
+	proto.RegisterType((*FeedItemQualityDisapprovalReasonEnum)(nil), "google.ads.googleads.v3.enums.FeedItemQualityDisapprovalReasonEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_item_quality_disapproval_reason.proto", fileDescriptor_f4af24b544d16aee)
+}
+
+var fileDescriptor_f4af24b544d16aee = []byte{
+	// 631 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x94, 0xcd, 0x72, 0xd3, 0x30,
+	0x10, 0xc7, 0x69, 0x0a, 0x29, 0xa8, 0x40, 0x85, 0xb8, 0x15, 0x5a, 0x68, 0xa0, 0x05, 0x0a, 0xd8,
+	0x30, 0xe1, 0x64, 0x4e, 0x8a, 0xad, 0x26, 0x1a, 0x5c, 0xd9, 0x95, 0x64, 0x97, 0x32, 0x99, 0xd1,
+	0x18, 0x6c, 0x32, 0x99, 0x49, 0xec, 0x10, 0xa7, 0x9d, 0xe1, 0x75, 0x38, 0xf2, 0x02, 0xbc, 0x03,
+	0x4f, 0xc1, 0x99, 0x47, 0xe0, 0xc4, 0xd8, 0xca, 0x17, 0x25, 0x69, 0x2f, 0x9e, 0xd5, 0xee, 0x6f,
+	0x77, 0xff, 0x5e, 0xcd, 0x0a, 0xb4, 0x3a, 0x59, 0xd6, 0xe9, 0x25, 0x66, 0x14, 0xe7, 0xa6, 0x36,
+	0x0b, 0xeb, 0xac, 0x6e, 0x26, 0xe9, 0x69, 0x3f, 0x37, 0x3f, 0x27, 0x49, 0xac, 0xba, 0xa3, 0xa4,
+	0xaf, 0xbe, 0x9c, 0x46, 0xbd, 0xee, 0xe8, 0xab, 0x8a, 0xbb, 0x79, 0x34, 0x18, 0x0c, 0xb3, 0xb3,
+	0xa8, 0xa7, 0x86, 0x49, 0x94, 0x67, 0xa9, 0x31, 0x18, 0x66, 0xa3, 0x0c, 0x6d, 0xe9, 0x74, 0x23,
+	0x8a, 0x73, 0x63, 0x5a, 0xc9, 0x38, 0xab, 0x1b, 0x65, 0xa5, 0xcd, 0xfb, 0x93, 0x46, 0x83, 0xae,
+	0x19, 0xa5, 0x69, 0x36, 0x8a, 0x46, 0xdd, 0x2c, 0xcd, 0x75, 0x72, 0xed, 0x57, 0x15, 0x3c, 0x3e,
+	0x48, 0x92, 0x98, 0x8e, 0x92, 0xfe, 0x91, 0xee, 0xe4, 0xcc, 0x1a, 0xf1, 0xb2, 0x0f, 0x49, 0x4f,
+	0xfb, 0xb5, 0x1f, 0x55, 0xf0, 0xf0, 0x32, 0x10, 0x6d, 0x80, 0xf5, 0x80, 0x09, 0x9f, 0xd8, 0xf4,
+	0x80, 0x12, 0x07, 0x5e, 0x41, 0xeb, 0x60, 0x2d, 0x60, 0xef, 0x98, 0x77, 0xcc, 0xe0, 0x0a, 0xaa,
+	0x81, 0x6d, 0x9f, 0x53, 0x9b, 0x28, 0x89, 0x1b, 0x2e, 0x51, 0x9c, 0xf8, 0x44, 0x52, 0x49, 0x43,
+	0xa2, 0x5a, 0x04, 0x3b, 0x84, 0x0b, 0x58, 0x41, 0x7b, 0xa0, 0xb6, 0x84, 0x71, 0x88, 0xb0, 0x39,
+	0xf5, 0x25, 0xf5, 0x18, 0x5c, 0x45, 0x3b, 0x60, 0x6b, 0x9e, 0xa3, 0xcc, 0xf6, 0x98, 0xa0, 0x42,
+	0x12, 0x26, 0x15, 0xf7, 0x8e, 0x05, 0xbc, 0x8a, 0xf6, 0xc1, 0x9e, 0x46, 0xe6, 0x32, 0x55, 0x0b,
+	0x0b, 0xa5, 0xbd, 0x47, 0x01, 0x76, 0x0b, 0x99, 0x5c, 0xc0, 0x6b, 0x68, 0x1b, 0x6c, 0x6a, 0x6f,
+	0xc0, 0x44, 0xe0, 0xfb, 0x1e, 0x97, 0xc4, 0x51, 0x2e, 0x66, 0xcd, 0x00, 0x37, 0x09, 0xac, 0x22,
+	0x03, 0xec, 0xff, 0x23, 0xcb, 0x3b, 0x1e, 0x6b, 0x1e, 0x3b, 0xe4, 0x89, 0x4f, 0xd4, 0x21, 0x15,
+	0x87, 0x58, 0xda, 0x2d, 0xb8, 0x86, 0x4c, 0xf0, 0x7c, 0x09, 0xaf, 0x05, 0x78, 0x87, 0x5e, 0x21,
+	0x07, 0xbb, 0x4a, 0x92, 0xf7, 0x12, 0x5e, 0x47, 0x2f, 0xc0, 0xd3, 0xf3, 0x09, 0xf3, 0xb2, 0x99,
+	0x27, 0x15, 0x27, 0x2e, 0x09, 0x31, 0x93, 0xf0, 0x06, 0x7a, 0x03, 0x5e, 0x5d, 0x44, 0x2f, 0xec,
+	0x01, 0xd0, 0x6b, 0xf0, 0x72, 0x89, 0xa8, 0xf9, 0xe4, 0xd9, 0xc8, 0xe1, 0xfa, 0x6c, 0x2e, 0xb3,
+	0x94, 0x80, 0x71, 0x2c, 0x49, 0x71, 0x84, 0x37, 0xcf, 0x5f, 0x43, 0x11, 0xd7, 0x67, 0xca, 0x42,
+	0xec, 0x52, 0x07, 0xde, 0x42, 0x0f, 0xc0, 0xbd, 0xff, 0x4a, 0x70, 0x77, 0x0a, 0xdc, 0x46, 0xcf,
+	0xc0, 0xae, 0x06, 0xc6, 0x62, 0x3c, 0xbe, 0xf8, 0xc6, 0xe0, 0x46, 0x71, 0x0d, 0x42, 0xf2, 0xc0,
+	0x96, 0x01, 0x27, 0x8e, 0x12, 0x8c, 0xfa, 0x3e, 0x91, 0x62, 0x92, 0xe8, 0x7b, 0x2e, 0xb5, 0x4f,
+	0x54, 0x48, 0x3d, 0x17, 0x4b, 0xe2, 0x40, 0x88, 0x9e, 0x80, 0x47, 0x8b, 0xf8, 0xe2, 0x17, 0x0b,
+	0x42, 0x85, 0xd8, 0x0d, 0x88, 0x80, 0x77, 0x8a, 0xf1, 0x2f, 0x02, 0x89, 0x43, 0xa5, 0xc7, 0x29,
+	0x76, 0x55, 0x33, 0xa0, 0x0e, 0x71, 0x29, 0x23, 0x02, 0xa2, 0x65, 0xf4, 0xc2, 0xb1, 0xdf, 0x6d,
+	0xfc, 0x59, 0x01, 0x3b, 0x9f, 0xb2, 0xbe, 0x71, 0xe1, 0x9a, 0x36, 0x76, 0x2f, 0x5b, 0x2e, 0xbf,
+	0xd8, 0x57, 0x7f, 0xe5, 0x43, 0x63, 0x5c, 0xa7, 0x93, 0xf5, 0xa2, 0xb4, 0x63, 0x64, 0xc3, 0x8e,
+	0xd9, 0x49, 0xd2, 0x72, 0x9b, 0x27, 0x0f, 0xc9, 0xa0, 0x9b, 0x2f, 0x79, 0x57, 0xde, 0x96, 0xdf,
+	0x6f, 0x95, 0xd5, 0x26, 0xc6, 0xdf, 0x2b, 0x5b, 0x4d, 0x5d, 0x0a, 0xc7, 0xb9, 0xa1, 0xcd, 0xc2,
+	0x0a, 0xeb, 0x46, 0xb1, 0xf1, 0xf9, 0xcf, 0x49, 0xbc, 0x8d, 0xe3, 0xbc, 0x3d, 0x8d, 0xb7, 0xc3,
+	0x7a, 0xbb, 0x8c, 0xff, 0xae, 0xec, 0x68, 0xa7, 0x65, 0xe1, 0x38, 0xb7, 0xac, 0x29, 0x61, 0x59,
+	0x61, 0xdd, 0xb2, 0x4a, 0xe6, 0x63, 0xb5, 0x14, 0x56, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xf0,
+	0xc5, 0x88, 0xec, 0xef, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_item_status.pb.go b/googleapis/ads/googleads/v3/enums/feed_item_status.pb.go
new file mode 100644
index 0000000..2b11b48
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_item_status.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_item_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a feed item.
+type FeedItemStatusEnum_FeedItemStatus int32
+
+const (
+	// Not specified.
+	FeedItemStatusEnum_UNSPECIFIED FeedItemStatusEnum_FeedItemStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedItemStatusEnum_UNKNOWN FeedItemStatusEnum_FeedItemStatus = 1
+	// Feed item is enabled.
+	FeedItemStatusEnum_ENABLED FeedItemStatusEnum_FeedItemStatus = 2
+	// Feed item has been removed.
+	FeedItemStatusEnum_REMOVED FeedItemStatusEnum_FeedItemStatus = 3
+)
+
+var FeedItemStatusEnum_FeedItemStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var FeedItemStatusEnum_FeedItemStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x FeedItemStatusEnum_FeedItemStatus) String() string {
+	return proto.EnumName(FeedItemStatusEnum_FeedItemStatus_name, int32(x))
+}
+
+func (FeedItemStatusEnum_FeedItemStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_15b96e530cd06c22, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of a feed item.
+type FeedItemStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemStatusEnum) Reset()         { *m = FeedItemStatusEnum{} }
+func (m *FeedItemStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemStatusEnum) ProtoMessage()    {}
+func (*FeedItemStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_15b96e530cd06c22, []int{0}
+}
+
+func (m *FeedItemStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemStatusEnum.Unmarshal(m, b)
+}
+func (m *FeedItemStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemStatusEnum.Merge(m, src)
+}
+func (m *FeedItemStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemStatusEnum.Size(m)
+}
+func (m *FeedItemStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedItemStatusEnum_FeedItemStatus", FeedItemStatusEnum_FeedItemStatus_name, FeedItemStatusEnum_FeedItemStatus_value)
+	proto.RegisterType((*FeedItemStatusEnum)(nil), "google.ads.googleads.v3.enums.FeedItemStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_item_status.proto", fileDescriptor_15b96e530cd06c22)
+}
+
+var fileDescriptor_15b96e530cd06c22 = []byte{
+	// 301 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x18, 0x77, 0x1d, 0x28, 0x64, 0xa0, 0xa5, 0xde, 0xc4, 0x1d, 0xb6, 0x07, 0x48, 0x0e, 0xf1, 0x14,
+	0x4f, 0xa9, 0xcb, 0xe6, 0x50, 0xbb, 0xe1, 0x58, 0x05, 0x29, 0x8e, 0x68, 0x62, 0x28, 0xac, 0xc9,
+	0x58, 0xb2, 0x3d, 0x90, 0x47, 0x1f, 0xc5, 0x27, 0x11, 0x9f, 0x42, 0x92, 0x6e, 0x85, 0x1d, 0xf4,
+	0x52, 0x7e, 0xdf, 0xf7, 0xfb, 0xd3, 0x5f, 0x3e, 0x70, 0xa5, 0x8c, 0x51, 0x4b, 0x89, 0xb8, 0xb0,
+	0xa8, 0x86, 0x1e, 0x6d, 0x31, 0x92, 0x7a, 0x53, 0x59, 0xf4, 0x2e, 0xa5, 0x58, 0x94, 0x4e, 0x56,
+	0x0b, 0xeb, 0xb8, 0xdb, 0x58, 0xb8, 0x5a, 0x1b, 0x67, 0x92, 0x6e, 0x2d, 0x85, 0x5c, 0x58, 0xd8,
+	0xb8, 0xe0, 0x16, 0xc3, 0xe0, 0xba, 0xb8, 0xdc, 0x87, 0xae, 0x4a, 0xc4, 0xb5, 0x36, 0x8e, 0xbb,
+	0xd2, 0xe8, 0x9d, 0xb9, 0xff, 0x02, 0x92, 0xa1, 0x94, 0x62, 0xec, 0x64, 0x35, 0x0b, 0xa1, 0x4c,
+	0x6f, 0xaa, 0xfe, 0x2d, 0x38, 0x3d, 0xdc, 0x26, 0x67, 0xa0, 0x33, 0xcf, 0x66, 0x53, 0x76, 0x33,
+	0x1e, 0x8e, 0xd9, 0x20, 0x3e, 0x4a, 0x3a, 0xe0, 0x64, 0x9e, 0xdd, 0x65, 0x93, 0xa7, 0x2c, 0x6e,
+	0xf9, 0x81, 0x65, 0x34, 0xbd, 0x67, 0x83, 0x38, 0xf2, 0xc3, 0x23, 0x7b, 0x98, 0xe4, 0x6c, 0x10,
+	0xb7, 0xd3, 0xef, 0x16, 0xe8, 0xbd, 0x99, 0x0a, 0xfe, 0xdb, 0x31, 0x3d, 0x3f, 0xfc, 0xdb, 0xd4,
+	0x57, 0x9b, 0xb6, 0x9e, 0xd3, 0x9d, 0x4b, 0x99, 0x25, 0xd7, 0x0a, 0x9a, 0xb5, 0x42, 0x4a, 0xea,
+	0x50, 0x7c, 0x7f, 0x9f, 0x55, 0x69, 0xff, 0x38, 0xd7, 0x75, 0xf8, 0x7e, 0x44, 0xed, 0x11, 0xa5,
+	0x9f, 0x51, 0x77, 0x54, 0x47, 0x51, 0x61, 0x61, 0x0d, 0x3d, 0xca, 0x31, 0xf4, 0xef, 0xb5, 0x5f,
+	0x7b, 0xbe, 0xa0, 0xc2, 0x16, 0x0d, 0x5f, 0xe4, 0xb8, 0x08, 0xfc, 0x4f, 0xd4, 0xab, 0x97, 0x84,
+	0x50, 0x61, 0x09, 0x69, 0x14, 0x84, 0xe4, 0x98, 0x90, 0xa0, 0x79, 0x3d, 0x0e, 0xc5, 0xf0, 0x6f,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0x09, 0x71, 0x41, 0xfa, 0xc6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_item_target_device.pb.go b/googleapis/ads/googleads/v3/enums/feed_item_target_device.pb.go
new file mode 100644
index 0000000..bb9077e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_item_target_device.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_item_target_device.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible data types for a feed item target device.
+type FeedItemTargetDeviceEnum_FeedItemTargetDevice int32
+
+const (
+	// Not specified.
+	FeedItemTargetDeviceEnum_UNSPECIFIED FeedItemTargetDeviceEnum_FeedItemTargetDevice = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedItemTargetDeviceEnum_UNKNOWN FeedItemTargetDeviceEnum_FeedItemTargetDevice = 1
+	// Mobile.
+	FeedItemTargetDeviceEnum_MOBILE FeedItemTargetDeviceEnum_FeedItemTargetDevice = 2
+)
+
+var FeedItemTargetDeviceEnum_FeedItemTargetDevice_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "MOBILE",
+}
+
+var FeedItemTargetDeviceEnum_FeedItemTargetDevice_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"MOBILE":      2,
+}
+
+func (x FeedItemTargetDeviceEnum_FeedItemTargetDevice) String() string {
+	return proto.EnumName(FeedItemTargetDeviceEnum_FeedItemTargetDevice_name, int32(x))
+}
+
+func (FeedItemTargetDeviceEnum_FeedItemTargetDevice) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_50a0f8cf1952a013, []int{0, 0}
+}
+
+// Container for enum describing possible data types for a feed item target
+// device.
+type FeedItemTargetDeviceEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemTargetDeviceEnum) Reset()         { *m = FeedItemTargetDeviceEnum{} }
+func (m *FeedItemTargetDeviceEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemTargetDeviceEnum) ProtoMessage()    {}
+func (*FeedItemTargetDeviceEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_50a0f8cf1952a013, []int{0}
+}
+
+func (m *FeedItemTargetDeviceEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemTargetDeviceEnum.Unmarshal(m, b)
+}
+func (m *FeedItemTargetDeviceEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemTargetDeviceEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemTargetDeviceEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemTargetDeviceEnum.Merge(m, src)
+}
+func (m *FeedItemTargetDeviceEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemTargetDeviceEnum.Size(m)
+}
+func (m *FeedItemTargetDeviceEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemTargetDeviceEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemTargetDeviceEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedItemTargetDeviceEnum_FeedItemTargetDevice", FeedItemTargetDeviceEnum_FeedItemTargetDevice_name, FeedItemTargetDeviceEnum_FeedItemTargetDevice_value)
+	proto.RegisterType((*FeedItemTargetDeviceEnum)(nil), "google.ads.googleads.v3.enums.FeedItemTargetDeviceEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_item_target_device.proto", fileDescriptor_50a0f8cf1952a013)
+}
+
+var fileDescriptor_50a0f8cf1952a013 = []byte{
+	// 304 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0x33, 0x31,
+	0x14, 0x85, 0xff, 0xce, 0x0f, 0x15, 0xd2, 0x85, 0x65, 0x70, 0xa1, 0x62, 0x17, 0xed, 0x03, 0x24,
+	0x8b, 0xec, 0xd2, 0x8d, 0x33, 0x76, 0x5a, 0x06, 0x75, 0x5a, 0xd0, 0x56, 0x90, 0x81, 0x12, 0x9b,
+	0x6b, 0x18, 0xe8, 0x24, 0xa5, 0x49, 0xe7, 0x81, 0x5c, 0xfa, 0x28, 0x3e, 0x8a, 0x0b, 0x9f, 0x41,
+	0x26, 0x71, 0x66, 0x55, 0xdd, 0x84, 0x43, 0xce, 0xfd, 0x4e, 0x4e, 0x2e, 0x1a, 0x4b, 0xad, 0xe5,
+	0x16, 0x08, 0x17, 0x86, 0x78, 0x59, 0xab, 0x8a, 0x12, 0x50, 0x87, 0xd2, 0x90, 0x57, 0x00, 0xb1,
+	0x2e, 0x2c, 0x94, 0x6b, 0xcb, 0xf7, 0x12, 0xec, 0x5a, 0x40, 0x55, 0x6c, 0x00, 0xef, 0xf6, 0xda,
+	0xea, 0x70, 0xe0, 0x09, 0xcc, 0x85, 0xc1, 0x2d, 0x8c, 0x2b, 0x8a, 0x1d, 0x7c, 0x79, 0xd5, 0x64,
+	0xef, 0x0a, 0xc2, 0x95, 0xd2, 0x96, 0xdb, 0x42, 0x2b, 0xe3, 0xe1, 0x51, 0x8e, 0xce, 0xa7, 0x00,
+	0x22, 0xb5, 0x50, 0x3e, 0xba, 0xec, 0x89, 0x8b, 0x4e, 0xd4, 0xa1, 0x1c, 0x5d, 0xa3, 0xb3, 0x63,
+	0x5e, 0x78, 0x8a, 0x7a, 0xcb, 0xec, 0x61, 0x91, 0xdc, 0xa4, 0xd3, 0x34, 0x99, 0xf4, 0xff, 0x85,
+	0x3d, 0x74, 0xb2, 0xcc, 0x6e, 0xb3, 0xf9, 0x53, 0xd6, 0xef, 0x84, 0x08, 0x75, 0xef, 0xe7, 0x71,
+	0x7a, 0x97, 0xf4, 0x83, 0xf8, 0xab, 0x83, 0x86, 0x1b, 0x5d, 0xe2, 0x3f, 0x1b, 0xc6, 0x17, 0xc7,
+	0x5e, 0x59, 0xd4, 0xf5, 0x16, 0x9d, 0xe7, 0xf8, 0x87, 0x95, 0x7a, 0xcb, 0x95, 0xc4, 0x7a, 0x2f,
+	0x89, 0x04, 0xe5, 0xca, 0x37, 0xab, 0xda, 0x15, 0xe6, 0x97, 0xcd, 0x8d, 0xdd, 0xf9, 0x16, 0xfc,
+	0x9f, 0x45, 0xd1, 0x7b, 0x30, 0x98, 0xf9, 0xa8, 0x48, 0x18, 0xec, 0x65, 0xad, 0x56, 0x14, 0xd7,
+	0xbf, 0x35, 0x1f, 0x8d, 0x9f, 0x47, 0xc2, 0xe4, 0xad, 0x9f, 0xaf, 0x68, 0xee, 0xfc, 0xcf, 0x60,
+	0xe8, 0x2f, 0x19, 0x8b, 0x84, 0x61, 0xac, 0x9d, 0x60, 0x6c, 0x45, 0x19, 0x73, 0x33, 0x2f, 0x5d,
+	0x57, 0x8c, 0x7e, 0x07, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x6e, 0x16, 0x44, 0xd1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_item_target_status.pb.go b/googleapis/ads/googleads/v3/enums/feed_item_target_status.pb.go
new file mode 100644
index 0000000..ffaed49
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_item_target_status.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_item_target_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a feed item target.
+type FeedItemTargetStatusEnum_FeedItemTargetStatus int32
+
+const (
+	// Not specified.
+	FeedItemTargetStatusEnum_UNSPECIFIED FeedItemTargetStatusEnum_FeedItemTargetStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedItemTargetStatusEnum_UNKNOWN FeedItemTargetStatusEnum_FeedItemTargetStatus = 1
+	// Feed item target is enabled.
+	FeedItemTargetStatusEnum_ENABLED FeedItemTargetStatusEnum_FeedItemTargetStatus = 2
+	// Feed item target has been removed.
+	FeedItemTargetStatusEnum_REMOVED FeedItemTargetStatusEnum_FeedItemTargetStatus = 3
+)
+
+var FeedItemTargetStatusEnum_FeedItemTargetStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var FeedItemTargetStatusEnum_FeedItemTargetStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x FeedItemTargetStatusEnum_FeedItemTargetStatus) String() string {
+	return proto.EnumName(FeedItemTargetStatusEnum_FeedItemTargetStatus_name, int32(x))
+}
+
+func (FeedItemTargetStatusEnum_FeedItemTargetStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b220975402148c96, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of a feed item target.
+type FeedItemTargetStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemTargetStatusEnum) Reset()         { *m = FeedItemTargetStatusEnum{} }
+func (m *FeedItemTargetStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemTargetStatusEnum) ProtoMessage()    {}
+func (*FeedItemTargetStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b220975402148c96, []int{0}
+}
+
+func (m *FeedItemTargetStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemTargetStatusEnum.Unmarshal(m, b)
+}
+func (m *FeedItemTargetStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemTargetStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemTargetStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemTargetStatusEnum.Merge(m, src)
+}
+func (m *FeedItemTargetStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemTargetStatusEnum.Size(m)
+}
+func (m *FeedItemTargetStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemTargetStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemTargetStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedItemTargetStatusEnum_FeedItemTargetStatus", FeedItemTargetStatusEnum_FeedItemTargetStatus_name, FeedItemTargetStatusEnum_FeedItemTargetStatus_value)
+	proto.RegisterType((*FeedItemTargetStatusEnum)(nil), "google.ads.googleads.v3.enums.FeedItemTargetStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_item_target_status.proto", fileDescriptor_b220975402148c96)
+}
+
+var fileDescriptor_b220975402148c96 = []byte{
+	// 310 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4e, 0x2a, 0x31,
+	0x14, 0x7d, 0x0c, 0xc9, 0x33, 0x29, 0x0b, 0x27, 0xc4, 0x85, 0x1a, 0x59, 0xc0, 0x07, 0xb4, 0x8b,
+	0xee, 0xca, 0xaa, 0x23, 0x85, 0x10, 0xb5, 0x10, 0x91, 0x31, 0x31, 0x93, 0x90, 0x6a, 0x6b, 0x33,
+	0x86, 0x69, 0x09, 0x2d, 0x7c, 0x90, 0x4b, 0x3f, 0xc5, 0x4f, 0x71, 0xe1, 0x37, 0x98, 0x76, 0x80,
+	0x15, 0xba, 0x69, 0xce, 0xed, 0xb9, 0xe7, 0xdc, 0x73, 0x2f, 0xe8, 0x6b, 0x6b, 0xf5, 0x52, 0x21,
+	0x21, 0x1d, 0xaa, 0x61, 0x40, 0x5b, 0x8c, 0x94, 0xd9, 0x54, 0x0e, 0xbd, 0x2a, 0x25, 0x17, 0xa5,
+	0x57, 0xd5, 0xc2, 0x8b, 0xb5, 0x56, 0x7e, 0xe1, 0xbc, 0xf0, 0x1b, 0x07, 0x57, 0x6b, 0xeb, 0x6d,
+	0xbb, 0x53, 0x2b, 0xa0, 0x90, 0x0e, 0x1e, 0xc4, 0x70, 0x8b, 0x61, 0x14, 0x5f, 0x5e, 0xed, 0xbd,
+	0x57, 0x25, 0x12, 0xc6, 0x58, 0x2f, 0x7c, 0x69, 0xcd, 0x4e, 0xdc, 0x7b, 0x03, 0xe7, 0x43, 0xa5,
+	0xe4, 0xd8, 0xab, 0xea, 0x21, 0x7a, 0xcf, 0xa2, 0x35, 0x33, 0x9b, 0xaa, 0xc7, 0xc1, 0xd9, 0x31,
+	0xae, 0x7d, 0x0a, 0x5a, 0x73, 0x3e, 0x9b, 0xb2, 0xeb, 0xf1, 0x70, 0xcc, 0x06, 0xe9, 0xbf, 0x76,
+	0x0b, 0x9c, 0xcc, 0xf9, 0x0d, 0x9f, 0x3c, 0xf2, 0xb4, 0x11, 0x0a, 0xc6, 0x69, 0x76, 0xcb, 0x06,
+	0x69, 0x12, 0x8a, 0x7b, 0x76, 0x37, 0xc9, 0xd9, 0x20, 0x6d, 0x66, 0xdf, 0x0d, 0xd0, 0x7d, 0xb1,
+	0x15, 0xfc, 0x33, 0x6f, 0x76, 0x71, 0x6c, 0xe6, 0x34, 0x84, 0x9d, 0x36, 0x9e, 0xb2, 0x9d, 0x56,
+	0xdb, 0xa5, 0x30, 0x1a, 0xda, 0xb5, 0x46, 0x5a, 0x99, 0xb8, 0xca, 0xfe, 0x70, 0xab, 0xd2, 0xfd,
+	0x72, 0xc7, 0x7e, 0x7c, 0xdf, 0x93, 0xe6, 0x88, 0xd2, 0x8f, 0xa4, 0x33, 0xaa, 0xad, 0xa8, 0x74,
+	0xb0, 0x86, 0x01, 0xe5, 0x18, 0x86, 0xdd, 0xdd, 0xe7, 0x9e, 0x2f, 0xa8, 0x74, 0xc5, 0x81, 0x2f,
+	0x72, 0x5c, 0x44, 0xfe, 0x2b, 0xe9, 0xd6, 0x9f, 0x84, 0x50, 0xe9, 0x08, 0x39, 0x74, 0x10, 0x92,
+	0x63, 0x42, 0x62, 0xcf, 0xf3, 0xff, 0x18, 0x0c, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x9b, 0x8a,
+	0x68, 0x18, 0xdf, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_item_target_type.pb.go b/googleapis/ads/googleads/v3/enums/feed_item_target_type.pb.go
new file mode 100644
index 0000000..1386821
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_item_target_type.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_item_target_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible type of a feed item target.
+type FeedItemTargetTypeEnum_FeedItemTargetType int32
+
+const (
+	// Not specified.
+	FeedItemTargetTypeEnum_UNSPECIFIED FeedItemTargetTypeEnum_FeedItemTargetType = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedItemTargetTypeEnum_UNKNOWN FeedItemTargetTypeEnum_FeedItemTargetType = 1
+	// Feed item targets a campaign.
+	FeedItemTargetTypeEnum_CAMPAIGN FeedItemTargetTypeEnum_FeedItemTargetType = 2
+	// Feed item targets an ad group.
+	FeedItemTargetTypeEnum_AD_GROUP FeedItemTargetTypeEnum_FeedItemTargetType = 3
+	// Feed item targets a criterion.
+	FeedItemTargetTypeEnum_CRITERION FeedItemTargetTypeEnum_FeedItemTargetType = 4
+)
+
+var FeedItemTargetTypeEnum_FeedItemTargetType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CAMPAIGN",
+	3: "AD_GROUP",
+	4: "CRITERION",
+}
+
+var FeedItemTargetTypeEnum_FeedItemTargetType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CAMPAIGN":    2,
+	"AD_GROUP":    3,
+	"CRITERION":   4,
+}
+
+func (x FeedItemTargetTypeEnum_FeedItemTargetType) String() string {
+	return proto.EnumName(FeedItemTargetTypeEnum_FeedItemTargetType_name, int32(x))
+}
+
+func (FeedItemTargetTypeEnum_FeedItemTargetType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d72b8d5b7777593c, []int{0, 0}
+}
+
+// Container for enum describing possible types of a feed item target.
+type FeedItemTargetTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemTargetTypeEnum) Reset()         { *m = FeedItemTargetTypeEnum{} }
+func (m *FeedItemTargetTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemTargetTypeEnum) ProtoMessage()    {}
+func (*FeedItemTargetTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d72b8d5b7777593c, []int{0}
+}
+
+func (m *FeedItemTargetTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemTargetTypeEnum.Unmarshal(m, b)
+}
+func (m *FeedItemTargetTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemTargetTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemTargetTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemTargetTypeEnum.Merge(m, src)
+}
+func (m *FeedItemTargetTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemTargetTypeEnum.Size(m)
+}
+func (m *FeedItemTargetTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemTargetTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemTargetTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedItemTargetTypeEnum_FeedItemTargetType", FeedItemTargetTypeEnum_FeedItemTargetType_name, FeedItemTargetTypeEnum_FeedItemTargetType_value)
+	proto.RegisterType((*FeedItemTargetTypeEnum)(nil), "google.ads.googleads.v3.enums.FeedItemTargetTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_item_target_type.proto", fileDescriptor_d72b8d5b7777593c)
+}
+
+var fileDescriptor_d72b8d5b7777593c = []byte{
+	// 326 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x1c, 0x76, 0x9d, 0xf8, 0x27, 0x53, 0x2c, 0x3d, 0x28, 0x88, 0x3b, 0x6c, 0x0f, 0x90, 0x1e, 0x7a,
+	0x32, 0x9e, 0xb2, 0xad, 0x2b, 0x45, 0xec, 0xca, 0xdc, 0x26, 0x48, 0xa5, 0x54, 0xf3, 0x33, 0x14,
+	0xd6, 0xa4, 0x2c, 0xd9, 0x64, 0xaf, 0xe3, 0xd1, 0x47, 0xf1, 0x51, 0xc4, 0x87, 0x90, 0xa6, 0x6e,
+	0x97, 0xa1, 0x97, 0xf0, 0x25, 0xdf, 0x1f, 0xbe, 0x7c, 0xe8, 0x9a, 0x4b, 0xc9, 0xe7, 0xe0, 0x66,
+	0x4c, 0xb9, 0x35, 0xac, 0xd0, 0xca, 0x73, 0x41, 0x2c, 0x0b, 0xe5, 0xbe, 0x02, 0xb0, 0x34, 0xd7,
+	0x50, 0xa4, 0x3a, 0x5b, 0x70, 0xd0, 0xa9, 0x5e, 0x97, 0x80, 0xcb, 0x85, 0xd4, 0xd2, 0x69, 0xd7,
+	0x7a, 0x9c, 0x31, 0x85, 0xb7, 0x56, 0xbc, 0xf2, 0xb0, 0xb1, 0x5e, 0x5e, 0x6d, 0x92, 0xcb, 0xdc,
+	0xcd, 0x84, 0x90, 0x3a, 0xd3, 0xb9, 0x14, 0xaa, 0x36, 0x77, 0xdf, 0xd0, 0xf9, 0x10, 0x80, 0x85,
+	0x1a, 0x8a, 0x89, 0x49, 0x9e, 0xac, 0x4b, 0xf0, 0xc5, 0xb2, 0xe8, 0x3e, 0x21, 0x67, 0x97, 0x71,
+	0xce, 0x50, 0x6b, 0x1a, 0xdd, 0xc7, 0x7e, 0x3f, 0x1c, 0x86, 0xfe, 0xc0, 0xde, 0x73, 0x5a, 0xe8,
+	0x70, 0x1a, 0xdd, 0x46, 0xa3, 0x87, 0xc8, 0x6e, 0x38, 0x27, 0xe8, 0xa8, 0x4f, 0xef, 0x62, 0x1a,
+	0x06, 0x91, 0x6d, 0x55, 0x37, 0x3a, 0x48, 0x83, 0xf1, 0x68, 0x1a, 0xdb, 0x4d, 0xe7, 0x14, 0x1d,
+	0xf7, 0xc7, 0xe1, 0xc4, 0x1f, 0x87, 0xa3, 0xc8, 0xde, 0xef, 0x7d, 0x37, 0x50, 0xe7, 0x45, 0x16,
+	0xf8, 0xdf, 0xf2, 0xbd, 0x8b, 0xdd, 0x0a, 0x71, 0xd5, 0x3b, 0x6e, 0x3c, 0xf6, 0x7e, 0x9d, 0x5c,
+	0xce, 0x33, 0xc1, 0xb1, 0x5c, 0x70, 0x97, 0x83, 0x30, 0xbf, 0xda, 0x2c, 0x58, 0xe6, 0xea, 0x8f,
+	0x41, 0x6f, 0xcc, 0xf9, 0x6e, 0x35, 0x03, 0x4a, 0x3f, 0xac, 0x76, 0x50, 0x47, 0x51, 0xa6, 0x70,
+	0x0d, 0x2b, 0x34, 0xf3, 0x70, 0x35, 0x84, 0xfa, 0xdc, 0xf0, 0x09, 0x65, 0x2a, 0xd9, 0xf2, 0xc9,
+	0xcc, 0x4b, 0x0c, 0xff, 0x65, 0x75, 0xea, 0x47, 0x42, 0x28, 0x53, 0x84, 0x6c, 0x15, 0x84, 0xcc,
+	0x3c, 0x42, 0x8c, 0xe6, 0xf9, 0xc0, 0x14, 0xf3, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x7a,
+	0x11, 0xc7, 0xe8, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_item_validation_status.pb.go b/googleapis/ads/googleads/v3/enums/feed_item_validation_status.pb.go
new file mode 100644
index 0000000..fb96977
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_item_validation_status.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_item_validation_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible validation statuses of a feed item.
+type FeedItemValidationStatusEnum_FeedItemValidationStatus int32
+
+const (
+	// No value has been specified.
+	FeedItemValidationStatusEnum_UNSPECIFIED FeedItemValidationStatusEnum_FeedItemValidationStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedItemValidationStatusEnum_UNKNOWN FeedItemValidationStatusEnum_FeedItemValidationStatus = 1
+	// Validation pending.
+	FeedItemValidationStatusEnum_PENDING FeedItemValidationStatusEnum_FeedItemValidationStatus = 2
+	// An error was found.
+	FeedItemValidationStatusEnum_INVALID FeedItemValidationStatusEnum_FeedItemValidationStatus = 3
+	// Feed item is semantically well-formed.
+	FeedItemValidationStatusEnum_VALID FeedItemValidationStatusEnum_FeedItemValidationStatus = 4
+)
+
+var FeedItemValidationStatusEnum_FeedItemValidationStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PENDING",
+	3: "INVALID",
+	4: "VALID",
+}
+
+var FeedItemValidationStatusEnum_FeedItemValidationStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"PENDING":     2,
+	"INVALID":     3,
+	"VALID":       4,
+}
+
+func (x FeedItemValidationStatusEnum_FeedItemValidationStatus) String() string {
+	return proto.EnumName(FeedItemValidationStatusEnum_FeedItemValidationStatus_name, int32(x))
+}
+
+func (FeedItemValidationStatusEnum_FeedItemValidationStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_041aff7e33a9050d, []int{0, 0}
+}
+
+// Container for enum describing possible validation statuses of a feed item.
+type FeedItemValidationStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemValidationStatusEnum) Reset()         { *m = FeedItemValidationStatusEnum{} }
+func (m *FeedItemValidationStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemValidationStatusEnum) ProtoMessage()    {}
+func (*FeedItemValidationStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_041aff7e33a9050d, []int{0}
+}
+
+func (m *FeedItemValidationStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemValidationStatusEnum.Unmarshal(m, b)
+}
+func (m *FeedItemValidationStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemValidationStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemValidationStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemValidationStatusEnum.Merge(m, src)
+}
+func (m *FeedItemValidationStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemValidationStatusEnum.Size(m)
+}
+func (m *FeedItemValidationStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemValidationStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemValidationStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedItemValidationStatusEnum_FeedItemValidationStatus", FeedItemValidationStatusEnum_FeedItemValidationStatus_name, FeedItemValidationStatusEnum_FeedItemValidationStatus_value)
+	proto.RegisterType((*FeedItemValidationStatusEnum)(nil), "google.ads.googleads.v3.enums.FeedItemValidationStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_item_validation_status.proto", fileDescriptor_041aff7e33a9050d)
+}
+
+var fileDescriptor_041aff7e33a9050d = []byte{
+	// 319 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0x33, 0x31,
+	0x14, 0x85, 0xff, 0x4e, 0x7f, 0x15, 0xd3, 0x85, 0xc3, 0xac, 0x44, 0xda, 0x45, 0xfb, 0x00, 0x99,
+	0xc5, 0xec, 0xe2, 0x42, 0x52, 0x3b, 0x2d, 0x41, 0x89, 0x03, 0xa5, 0x23, 0xc8, 0x48, 0x89, 0x26,
+	0x86, 0x81, 0x4e, 0x52, 0x9a, 0xb4, 0x3b, 0x5f, 0xc6, 0xa5, 0x8f, 0xe2, 0xa3, 0xb8, 0xf4, 0x09,
+	0x24, 0x49, 0x3b, 0xbb, 0xba, 0x09, 0xe7, 0xe6, 0xdc, 0xfb, 0x71, 0xef, 0x01, 0x37, 0x52, 0x6b,
+	0xb9, 0x12, 0x29, 0xe3, 0x26, 0x0d, 0xd2, 0xa9, 0x5d, 0x96, 0x0a, 0xb5, 0x6d, 0x4c, 0xfa, 0x26,
+	0x04, 0x5f, 0xd6, 0x56, 0x34, 0xcb, 0x1d, 0x5b, 0xd5, 0x9c, 0xd9, 0x5a, 0xab, 0xa5, 0xb1, 0xcc,
+	0x6e, 0x0d, 0x5c, 0x6f, 0xb4, 0xd5, 0xc9, 0x20, 0x4c, 0x41, 0xc6, 0x0d, 0x6c, 0x01, 0x70, 0x97,
+	0x41, 0x0f, 0xb8, 0xea, 0x1f, 0xf8, 0xeb, 0x3a, 0x65, 0x4a, 0x69, 0xeb, 0x11, 0xfb, 0xe1, 0xd1,
+	0x3b, 0xe8, 0x4f, 0x85, 0xe0, 0xc4, 0x8a, 0xa6, 0x6c, 0xf9, 0x73, 0x8f, 0xcf, 0xd5, 0xb6, 0x19,
+	0x3d, 0x83, 0xcb, 0x63, 0x7e, 0x72, 0x01, 0x7a, 0x0b, 0x3a, 0x2f, 0xf2, 0x5b, 0x32, 0x25, 0xf9,
+	0x24, 0xfe, 0x97, 0xf4, 0xc0, 0xd9, 0x82, 0xde, 0xd1, 0x87, 0x47, 0x1a, 0x77, 0x5c, 0x51, 0xe4,
+	0x74, 0x42, 0xe8, 0x2c, 0x8e, 0x5c, 0x41, 0x68, 0x89, 0xef, 0xc9, 0x24, 0xee, 0x26, 0xe7, 0xe0,
+	0x24, 0xc8, 0xff, 0xe3, 0x9f, 0x0e, 0x18, 0xbe, 0xea, 0x06, 0xfe, 0x79, 0xc2, 0x78, 0x70, 0x6c,
+	0x85, 0xc2, 0xdd, 0x50, 0x74, 0x9e, 0xc6, 0xfb, 0x79, 0xa9, 0x57, 0x4c, 0x49, 0xa8, 0x37, 0x32,
+	0x95, 0x42, 0xf9, 0x0b, 0x0f, 0x99, 0xae, 0x6b, 0x73, 0x24, 0xe2, 0x6b, 0xff, 0x7e, 0x44, 0xdd,
+	0x19, 0xc6, 0x9f, 0xd1, 0x60, 0x16, 0x50, 0x98, 0x1b, 0x18, 0xa4, 0x53, 0x65, 0x06, 0x5d, 0x1c,
+	0xe6, 0xeb, 0xe0, 0x57, 0x98, 0x9b, 0xaa, 0xf5, 0xab, 0x32, 0xab, 0xbc, 0xff, 0x1d, 0x0d, 0xc3,
+	0x27, 0x42, 0x98, 0x1b, 0x84, 0xda, 0x0e, 0x84, 0xca, 0x0c, 0x21, 0xdf, 0xf3, 0x72, 0xea, 0x17,
+	0xcb, 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x08, 0x36, 0x3c, 0xfa, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_link_status.pb.go b/googleapis/ads/googleads/v3/enums/feed_link_status.pb.go
new file mode 100644
index 0000000..043140c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_link_status.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_link_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a feed link.
+type FeedLinkStatusEnum_FeedLinkStatus int32
+
+const (
+	// Not specified.
+	FeedLinkStatusEnum_UNSPECIFIED FeedLinkStatusEnum_FeedLinkStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedLinkStatusEnum_UNKNOWN FeedLinkStatusEnum_FeedLinkStatus = 1
+	// Feed link is enabled.
+	FeedLinkStatusEnum_ENABLED FeedLinkStatusEnum_FeedLinkStatus = 2
+	// Feed link has been removed.
+	FeedLinkStatusEnum_REMOVED FeedLinkStatusEnum_FeedLinkStatus = 3
+)
+
+var FeedLinkStatusEnum_FeedLinkStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var FeedLinkStatusEnum_FeedLinkStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x FeedLinkStatusEnum_FeedLinkStatus) String() string {
+	return proto.EnumName(FeedLinkStatusEnum_FeedLinkStatus_name, int32(x))
+}
+
+func (FeedLinkStatusEnum_FeedLinkStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0b8273670f863712, []int{0, 0}
+}
+
+// Container for an enum describing possible statuses of a feed link.
+type FeedLinkStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedLinkStatusEnum) Reset()         { *m = FeedLinkStatusEnum{} }
+func (m *FeedLinkStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedLinkStatusEnum) ProtoMessage()    {}
+func (*FeedLinkStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0b8273670f863712, []int{0}
+}
+
+func (m *FeedLinkStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedLinkStatusEnum.Unmarshal(m, b)
+}
+func (m *FeedLinkStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedLinkStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedLinkStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedLinkStatusEnum.Merge(m, src)
+}
+func (m *FeedLinkStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedLinkStatusEnum.Size(m)
+}
+func (m *FeedLinkStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedLinkStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedLinkStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedLinkStatusEnum_FeedLinkStatus", FeedLinkStatusEnum_FeedLinkStatus_name, FeedLinkStatusEnum_FeedLinkStatus_value)
+	proto.RegisterType((*FeedLinkStatusEnum)(nil), "google.ads.googleads.v3.enums.FeedLinkStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_link_status.proto", fileDescriptor_0b8273670f863712)
+}
+
+var fileDescriptor_0b8273670f863712 = []byte{
+	// 303 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4f, 0xfa, 0x30,
+	0x18, 0xfe, 0x31, 0x92, 0x9f, 0x49, 0x49, 0x74, 0x99, 0x37, 0x23, 0x07, 0xf8, 0x00, 0xed, 0xa1,
+	0x9e, 0xea, 0xa9, 0x93, 0x82, 0x44, 0x1c, 0x44, 0xc2, 0x4c, 0xcc, 0x22, 0xa9, 0xb6, 0x36, 0x0b,
+	0xd0, 0x12, 0xba, 0xf1, 0x81, 0x3c, 0xfa, 0x51, 0xfc, 0x24, 0xc6, 0x4f, 0x61, 0xda, 0xb1, 0x25,
+	0x1c, 0xf4, 0xb2, 0x3c, 0xef, 0xfb, 0xfc, 0xd9, 0xd3, 0x17, 0x5c, 0x29, 0x63, 0xd4, 0x5a, 0x22,
+	0x2e, 0x2c, 0xaa, 0xa0, 0x43, 0x7b, 0x8c, 0xa4, 0x2e, 0x37, 0x16, 0xbd, 0x49, 0x29, 0x96, 0xeb,
+	0x5c, 0xaf, 0x96, 0xb6, 0xe0, 0x45, 0x69, 0xe1, 0x76, 0x67, 0x0a, 0x13, 0x75, 0x2b, 0x29, 0xe4,
+	0xc2, 0xc2, 0xc6, 0x05, 0xf7, 0x18, 0x7a, 0xd7, 0xc5, 0x65, 0x1d, 0xba, 0xcd, 0x11, 0xd7, 0xda,
+	0x14, 0xbc, 0xc8, 0x8d, 0x3e, 0x98, 0xfb, 0xcf, 0x20, 0x1a, 0x4a, 0x29, 0x26, 0xb9, 0x5e, 0xcd,
+	0x7d, 0x28, 0xd3, 0xe5, 0xa6, 0x7f, 0x0b, 0x4e, 0x8f, 0xb7, 0xd1, 0x19, 0xe8, 0x2c, 0x92, 0xf9,
+	0x8c, 0xdd, 0x8c, 0x87, 0x63, 0x36, 0x08, 0xff, 0x45, 0x1d, 0x70, 0xb2, 0x48, 0xee, 0x92, 0xe9,
+	0x63, 0x12, 0xb6, 0xdc, 0xc0, 0x12, 0x1a, 0x4f, 0xd8, 0x20, 0x0c, 0xdc, 0xf0, 0xc0, 0xee, 0xa7,
+	0x29, 0x1b, 0x84, 0xed, 0xf8, 0xab, 0x05, 0x7a, 0xaf, 0x66, 0x03, 0xff, 0xec, 0x18, 0x9f, 0x1f,
+	0xff, 0x6d, 0xe6, 0xaa, 0xcd, 0x5a, 0x4f, 0xf1, 0xc1, 0xa5, 0xcc, 0x9a, 0x6b, 0x05, 0xcd, 0x4e,
+	0x21, 0x25, 0xb5, 0x2f, 0x5e, 0xdf, 0x67, 0x9b, 0xdb, 0x5f, 0xce, 0x75, 0xed, 0xbf, 0xef, 0x41,
+	0x7b, 0x44, 0xe9, 0x47, 0xd0, 0x1d, 0x55, 0x51, 0x54, 0x58, 0x58, 0x41, 0x87, 0x52, 0x0c, 0xdd,
+	0x7b, 0xed, 0x67, 0xcd, 0x67, 0x54, 0xd8, 0xac, 0xe1, 0xb3, 0x14, 0x67, 0x9e, 0xff, 0x0e, 0x7a,
+	0xd5, 0x92, 0x10, 0x2a, 0x2c, 0x21, 0x8d, 0x82, 0x90, 0x14, 0x13, 0xe2, 0x35, 0x2f, 0xff, 0x7d,
+	0x31, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x5a, 0xf6, 0xca, 0xc6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_mapping_criterion_type.pb.go b/googleapis/ads/googleads/v3/enums/feed_mapping_criterion_type.pb.go
new file mode 100644
index 0000000..e57cda1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_mapping_criterion_type.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_mapping_criterion_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible placeholder types for a feed mapping.
+type FeedMappingCriterionTypeEnum_FeedMappingCriterionType int32
+
+const (
+	// Not specified.
+	FeedMappingCriterionTypeEnum_UNSPECIFIED FeedMappingCriterionTypeEnum_FeedMappingCriterionType = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedMappingCriterionTypeEnum_UNKNOWN FeedMappingCriterionTypeEnum_FeedMappingCriterionType = 1
+	// Allows campaign targeting at locations within a location feed.
+	FeedMappingCriterionTypeEnum_LOCATION_EXTENSION_TARGETING FeedMappingCriterionTypeEnum_FeedMappingCriterionType = 4
+	// Allows url targeting for your dynamic search ads within a page feed.
+	FeedMappingCriterionTypeEnum_DSA_PAGE_FEED FeedMappingCriterionTypeEnum_FeedMappingCriterionType = 3
+)
+
+var FeedMappingCriterionTypeEnum_FeedMappingCriterionType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	4: "LOCATION_EXTENSION_TARGETING",
+	3: "DSA_PAGE_FEED",
+}
+
+var FeedMappingCriterionTypeEnum_FeedMappingCriterionType_value = map[string]int32{
+	"UNSPECIFIED":                  0,
+	"UNKNOWN":                      1,
+	"LOCATION_EXTENSION_TARGETING": 4,
+	"DSA_PAGE_FEED":                3,
+}
+
+func (x FeedMappingCriterionTypeEnum_FeedMappingCriterionType) String() string {
+	return proto.EnumName(FeedMappingCriterionTypeEnum_FeedMappingCriterionType_name, int32(x))
+}
+
+func (FeedMappingCriterionTypeEnum_FeedMappingCriterionType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_14f0d190ef2adb0a, []int{0, 0}
+}
+
+// Container for enum describing possible criterion types for a feed mapping.
+type FeedMappingCriterionTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedMappingCriterionTypeEnum) Reset()         { *m = FeedMappingCriterionTypeEnum{} }
+func (m *FeedMappingCriterionTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedMappingCriterionTypeEnum) ProtoMessage()    {}
+func (*FeedMappingCriterionTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_14f0d190ef2adb0a, []int{0}
+}
+
+func (m *FeedMappingCriterionTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedMappingCriterionTypeEnum.Unmarshal(m, b)
+}
+func (m *FeedMappingCriterionTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedMappingCriterionTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedMappingCriterionTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedMappingCriterionTypeEnum.Merge(m, src)
+}
+func (m *FeedMappingCriterionTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedMappingCriterionTypeEnum.Size(m)
+}
+func (m *FeedMappingCriterionTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedMappingCriterionTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedMappingCriterionTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedMappingCriterionTypeEnum_FeedMappingCriterionType", FeedMappingCriterionTypeEnum_FeedMappingCriterionType_name, FeedMappingCriterionTypeEnum_FeedMappingCriterionType_value)
+	proto.RegisterType((*FeedMappingCriterionTypeEnum)(nil), "google.ads.googleads.v3.enums.FeedMappingCriterionTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_mapping_criterion_type.proto", fileDescriptor_14f0d190ef2adb0a)
+}
+
+var fileDescriptor_14f0d190ef2adb0a = []byte{
+	// 343 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x6a, 0xeb, 0x30,
+	0x14, 0xfc, 0x4e, 0x3e, 0xff, 0x83, 0x42, 0xa9, 0xeb, 0x55, 0x29, 0x09, 0x34, 0x39, 0x80, 0xbc,
+	0xf0, 0x4e, 0x5d, 0x14, 0x25, 0x51, 0x8c, 0x69, 0xeb, 0x98, 0xc6, 0x49, 0x4b, 0x31, 0x18, 0x37,
+	0x52, 0x85, 0x21, 0x96, 0x84, 0xe5, 0x04, 0x72, 0x88, 0x5e, 0xa2, 0xcb, 0x1e, 0xa5, 0x47, 0xe9,
+	0xb2, 0x27, 0x28, 0xb6, 0xea, 0xec, 0xd2, 0x8d, 0x18, 0x34, 0x6f, 0xe6, 0xbd, 0x19, 0x70, 0xcd,
+	0xa5, 0xe4, 0x1b, 0xe6, 0x66, 0x54, 0xbb, 0x06, 0xd6, 0x68, 0xe7, 0xb9, 0x4c, 0x6c, 0x0b, 0xed,
+	0xbe, 0x30, 0x46, 0xd3, 0x22, 0x53, 0x2a, 0x17, 0x3c, 0x5d, 0x97, 0x79, 0xc5, 0xca, 0x5c, 0x8a,
+	0xb4, 0xda, 0x2b, 0x06, 0x55, 0x29, 0x2b, 0xe9, 0x0c, 0x8c, 0x0a, 0x66, 0x54, 0xc3, 0x83, 0x01,
+	0xdc, 0x79, 0xb0, 0x31, 0xb8, 0xe8, 0xb7, 0xfe, 0x2a, 0x77, 0x33, 0x21, 0x64, 0x95, 0x55, 0xb9,
+	0x14, 0xda, 0x88, 0x47, 0xaf, 0x16, 0xe8, 0xcf, 0x18, 0xa3, 0x77, 0x66, 0xc3, 0xa4, 0x5d, 0x10,
+	0xef, 0x15, 0x23, 0x62, 0x5b, 0x8c, 0x0a, 0x70, 0x7e, 0x8c, 0x77, 0x4e, 0x41, 0x6f, 0x19, 0x2e,
+	0x22, 0x32, 0x09, 0x66, 0x01, 0x99, 0xda, 0x7f, 0x9c, 0x1e, 0xf8, 0xbf, 0x0c, 0x6f, 0xc2, 0xf9,
+	0x43, 0x68, 0x5b, 0xce, 0x25, 0xe8, 0xdf, 0xce, 0x27, 0x38, 0x0e, 0xe6, 0x61, 0x4a, 0x1e, 0x63,
+	0x12, 0x2e, 0x6a, 0x14, 0xe3, 0x7b, 0x9f, 0xc4, 0x41, 0xe8, 0xdb, 0x7f, 0x9d, 0x33, 0x70, 0x32,
+	0x5d, 0xe0, 0x34, 0xc2, 0x3e, 0x49, 0x67, 0x84, 0x4c, 0xed, 0xee, 0xf8, 0xcb, 0x02, 0xc3, 0xb5,
+	0x2c, 0xe0, 0xaf, 0x99, 0xc6, 0x83, 0x63, 0x27, 0x45, 0x75, 0xa8, 0xc8, 0x7a, 0x1a, 0xff, 0xe8,
+	0xb9, 0xdc, 0x64, 0x82, 0x43, 0x59, 0x72, 0x97, 0x33, 0xd1, 0x44, 0x6e, 0x4b, 0x56, 0xb9, 0x3e,
+	0xd2, 0xf9, 0x55, 0xf3, 0xbe, 0x75, 0xba, 0x3e, 0xc6, 0xef, 0x9d, 0x81, 0x6f, 0xac, 0x30, 0xd5,
+	0xd0, 0xc0, 0x1a, 0xad, 0x3c, 0x58, 0xd7, 0xa3, 0x3f, 0x5a, 0x3e, 0xc1, 0x54, 0x27, 0x07, 0x3e,
+	0x59, 0x79, 0x49, 0xc3, 0x7f, 0x76, 0x86, 0xe6, 0x13, 0x21, 0x4c, 0x35, 0x42, 0x87, 0x09, 0x84,
+	0x56, 0x1e, 0x42, 0xcd, 0xcc, 0xf3, 0xbf, 0xe6, 0x30, 0xef, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xbd,
+	0x6d, 0x23, 0x1a, 0x0b, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_mapping_status.pb.go b/googleapis/ads/googleads/v3/enums/feed_mapping_status.pb.go
new file mode 100644
index 0000000..938abdd
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_mapping_status.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_mapping_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a feed mapping.
+type FeedMappingStatusEnum_FeedMappingStatus int32
+
+const (
+	// Not specified.
+	FeedMappingStatusEnum_UNSPECIFIED FeedMappingStatusEnum_FeedMappingStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedMappingStatusEnum_UNKNOWN FeedMappingStatusEnum_FeedMappingStatus = 1
+	// Feed mapping is enabled.
+	FeedMappingStatusEnum_ENABLED FeedMappingStatusEnum_FeedMappingStatus = 2
+	// Feed mapping has been removed.
+	FeedMappingStatusEnum_REMOVED FeedMappingStatusEnum_FeedMappingStatus = 3
+)
+
+var FeedMappingStatusEnum_FeedMappingStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var FeedMappingStatusEnum_FeedMappingStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x FeedMappingStatusEnum_FeedMappingStatus) String() string {
+	return proto.EnumName(FeedMappingStatusEnum_FeedMappingStatus_name, int32(x))
+}
+
+func (FeedMappingStatusEnum_FeedMappingStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ce0d893a1df7704e, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of a feed mapping.
+type FeedMappingStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedMappingStatusEnum) Reset()         { *m = FeedMappingStatusEnum{} }
+func (m *FeedMappingStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedMappingStatusEnum) ProtoMessage()    {}
+func (*FeedMappingStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ce0d893a1df7704e, []int{0}
+}
+
+func (m *FeedMappingStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedMappingStatusEnum.Unmarshal(m, b)
+}
+func (m *FeedMappingStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedMappingStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedMappingStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedMappingStatusEnum.Merge(m, src)
+}
+func (m *FeedMappingStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedMappingStatusEnum.Size(m)
+}
+func (m *FeedMappingStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedMappingStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedMappingStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedMappingStatusEnum_FeedMappingStatus", FeedMappingStatusEnum_FeedMappingStatus_name, FeedMappingStatusEnum_FeedMappingStatus_value)
+	proto.RegisterType((*FeedMappingStatusEnum)(nil), "google.ads.googleads.v3.enums.FeedMappingStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_mapping_status.proto", fileDescriptor_ce0d893a1df7704e)
+}
+
+var fileDescriptor_ce0d893a1df7704e = []byte{
+	// 305 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcd, 0x4a, 0x33, 0x31,
+	0x14, 0xfd, 0x3a, 0x85, 0x4f, 0x48, 0x17, 0x8e, 0x05, 0x5d, 0x88, 0x5d, 0xb4, 0x0f, 0x90, 0x2c,
+	0xb2, 0x10, 0xe2, 0x2a, 0x63, 0xd3, 0x52, 0x6a, 0xa7, 0xc5, 0xd2, 0x11, 0x64, 0xa0, 0x44, 0x13,
+	0xc3, 0x40, 0x27, 0x19, 0x9a, 0x69, 0x1f, 0xc8, 0xa5, 0x8f, 0xe2, 0xa3, 0xe8, 0x4b, 0x48, 0x92,
+	0x76, 0x36, 0x45, 0x37, 0xc3, 0xb9, 0x73, 0x7e, 0x72, 0xee, 0x05, 0xb7, 0xca, 0x18, 0xb5, 0x91,
+	0x88, 0x0b, 0x8b, 0x02, 0x74, 0x68, 0x8f, 0x91, 0xd4, 0xbb, 0xd2, 0xa2, 0x37, 0x29, 0xc5, 0xba,
+	0xe4, 0x55, 0x55, 0x68, 0xb5, 0xb6, 0x35, 0xaf, 0x77, 0x16, 0x56, 0x5b, 0x53, 0x9b, 0x6e, 0x2f,
+	0xa8, 0x21, 0x17, 0x16, 0x36, 0x46, 0xb8, 0xc7, 0xd0, 0x1b, 0xaf, 0x6f, 0x8e, 0xb9, 0x55, 0x81,
+	0xb8, 0xd6, 0xa6, 0xe6, 0x75, 0x61, 0xf4, 0xc1, 0x3c, 0x10, 0xe0, 0x72, 0x24, 0xa5, 0x98, 0x85,
+	0xe0, 0xa5, 0xcf, 0x65, 0x7a, 0x57, 0x0e, 0xa6, 0xe0, 0xe2, 0x84, 0xe8, 0x9e, 0x83, 0xce, 0x2a,
+	0x5d, 0x2e, 0xd8, 0xfd, 0x64, 0x34, 0x61, 0xc3, 0xf8, 0x5f, 0xb7, 0x03, 0xce, 0x56, 0xe9, 0x34,
+	0x9d, 0x3f, 0xa5, 0x71, 0xcb, 0x0d, 0x2c, 0xa5, 0xc9, 0x03, 0x1b, 0xc6, 0x91, 0x1b, 0x1e, 0xd9,
+	0x6c, 0x9e, 0xb1, 0x61, 0xdc, 0x4e, 0xbe, 0x5b, 0xa0, 0xff, 0x6a, 0x4a, 0xf8, 0x67, 0xd3, 0xe4,
+	0xea, 0xe4, 0xc1, 0x85, 0xeb, 0xb8, 0x68, 0x3d, 0x27, 0x07, 0xa3, 0x32, 0x1b, 0xae, 0x15, 0x34,
+	0x5b, 0x85, 0x94, 0xd4, 0x7e, 0x83, 0xe3, 0xad, 0xaa, 0xc2, 0xfe, 0x72, 0xba, 0x3b, 0xff, 0x7d,
+	0x8f, 0xda, 0x63, 0x4a, 0x3f, 0xa2, 0xde, 0x38, 0x44, 0x51, 0x61, 0x61, 0x80, 0x0e, 0x65, 0x18,
+	0xba, 0xad, 0xed, 0xe7, 0x91, 0xcf, 0xa9, 0xb0, 0x79, 0xc3, 0xe7, 0x19, 0xce, 0x3d, 0xff, 0x15,
+	0xf5, 0xc3, 0x4f, 0x42, 0xa8, 0xb0, 0x84, 0x34, 0x0a, 0x42, 0x32, 0x4c, 0x88, 0xd7, 0xbc, 0xfc,
+	0xf7, 0xc5, 0xf0, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xe5, 0x4c, 0x93, 0xd2, 0x01, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_origin.pb.go b/googleapis/ads/googleads/v3/enums/feed_origin.pb.go
new file mode 100644
index 0000000..0d8f979
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_origin.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_origin.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for a feed origin.
+type FeedOriginEnum_FeedOrigin int32
+
+const (
+	// Not specified.
+	FeedOriginEnum_UNSPECIFIED FeedOriginEnum_FeedOrigin = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedOriginEnum_UNKNOWN FeedOriginEnum_FeedOrigin = 1
+	// The FeedAttributes for this Feed are managed by the
+	// user. Users can add FeedAttributes to this Feed.
+	FeedOriginEnum_USER FeedOriginEnum_FeedOrigin = 2
+	// The FeedAttributes for an GOOGLE Feed are created by Google. A feed of
+	// this type is maintained by Google and will have the correct attributes
+	// for the placeholder type of the feed.
+	FeedOriginEnum_GOOGLE FeedOriginEnum_FeedOrigin = 3
+)
+
+var FeedOriginEnum_FeedOrigin_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "USER",
+	3: "GOOGLE",
+}
+
+var FeedOriginEnum_FeedOrigin_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"USER":        2,
+	"GOOGLE":      3,
+}
+
+func (x FeedOriginEnum_FeedOrigin) String() string {
+	return proto.EnumName(FeedOriginEnum_FeedOrigin_name, int32(x))
+}
+
+func (FeedOriginEnum_FeedOrigin) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6bf0e294be3d78df, []int{0, 0}
+}
+
+// Container for enum describing possible values for a feed origin.
+type FeedOriginEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedOriginEnum) Reset()         { *m = FeedOriginEnum{} }
+func (m *FeedOriginEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedOriginEnum) ProtoMessage()    {}
+func (*FeedOriginEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6bf0e294be3d78df, []int{0}
+}
+
+func (m *FeedOriginEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedOriginEnum.Unmarshal(m, b)
+}
+func (m *FeedOriginEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedOriginEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedOriginEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedOriginEnum.Merge(m, src)
+}
+func (m *FeedOriginEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedOriginEnum.Size(m)
+}
+func (m *FeedOriginEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedOriginEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedOriginEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedOriginEnum_FeedOrigin", FeedOriginEnum_FeedOrigin_name, FeedOriginEnum_FeedOrigin_value)
+	proto.RegisterType((*FeedOriginEnum)(nil), "google.ads.googleads.v3.enums.FeedOriginEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_origin.proto", fileDescriptor_6bf0e294be3d78df)
+}
+
+var fileDescriptor_6bf0e294be3d78df = []byte{
+	// 293 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x18, 0xb7, 0x9d, 0x4c, 0xc9, 0xc0, 0x95, 0x1e, 0xc5, 0x1d, 0xb6, 0x07, 0x48, 0x0e, 0xb9, 0xc5,
+	0x8b, 0xad, 0x76, 0x65, 0x28, 0x6d, 0xd9, 0x68, 0x05, 0x29, 0x48, 0x35, 0x31, 0x14, 0xd6, 0xa4,
+	0x34, 0xdd, 0x1e, 0xc8, 0xa3, 0x8f, 0xe2, 0x73, 0x78, 0xf2, 0x29, 0xa4, 0xc9, 0xda, 0x9d, 0xdc,
+	0x25, 0xfc, 0xf8, 0x7e, 0x7f, 0xf2, 0xfb, 0x3e, 0x80, 0xb8, 0x94, 0x7c, 0xcb, 0x50, 0x41, 0xd5,
+	0x01, 0x76, 0x68, 0x8f, 0x11, 0x13, 0xbb, 0x4a, 0xa1, 0x0f, 0xc6, 0xe8, 0xab, 0x6c, 0x4a, 0x5e,
+	0x0a, 0x58, 0x37, 0xb2, 0x95, 0xee, 0xcc, 0xa8, 0x60, 0x41, 0x15, 0x1c, 0x0c, 0x70, 0x8f, 0xa1,
+	0x36, 0x5c, 0xdf, 0xf4, 0x79, 0x75, 0x89, 0x0a, 0x21, 0x64, 0x5b, 0xb4, 0xa5, 0x14, 0xca, 0x98,
+	0x17, 0x6b, 0x70, 0xb5, 0x64, 0x8c, 0xc6, 0x3a, 0x30, 0x10, 0xbb, 0x6a, 0x71, 0x07, 0xc0, 0x71,
+	0xe2, 0x4e, 0xc1, 0x24, 0x8d, 0x36, 0x49, 0x70, 0xbf, 0x5a, 0xae, 0x82, 0x07, 0xe7, 0xcc, 0x9d,
+	0x80, 0x8b, 0x34, 0x7a, 0x8c, 0xe2, 0xe7, 0xc8, 0xb1, 0xdc, 0x4b, 0x70, 0x9e, 0x6e, 0x82, 0xb5,
+	0x63, 0xbb, 0x00, 0x8c, 0xc3, 0x38, 0x0e, 0x9f, 0x02, 0x67, 0xe4, 0xff, 0x58, 0x60, 0xfe, 0x2e,
+	0x2b, 0x78, 0xb2, 0x97, 0x3f, 0x3d, 0xfe, 0x92, 0x74, 0x55, 0x12, 0xeb, 0xc5, 0x3f, 0x38, 0xb8,
+	0xdc, 0x16, 0x82, 0x43, 0xd9, 0x70, 0xc4, 0x99, 0xd0, 0x45, 0xfb, 0x53, 0xd4, 0xa5, 0xfa, 0xe7,
+	0x32, 0xb7, 0xfa, 0xfd, 0xb4, 0x47, 0xa1, 0xe7, 0x7d, 0xd9, 0xb3, 0xd0, 0x44, 0x79, 0x54, 0x41,
+	0x03, 0x3b, 0x94, 0x61, 0xd8, 0xed, 0xa8, 0xbe, 0x7b, 0x3e, 0xf7, 0xa8, 0xca, 0x07, 0x3e, 0xcf,
+	0x70, 0xae, 0xf9, 0x5f, 0x7b, 0x6e, 0x86, 0x84, 0x78, 0x54, 0x11, 0x32, 0x28, 0x08, 0xc9, 0x30,
+	0x21, 0x5a, 0xf3, 0x36, 0xd6, 0xc5, 0xf0, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x36, 0xff, 0x11,
+	0xd4, 0xb1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/feed_status.pb.go b/googleapis/ads/googleads/v3/enums/feed_status.pb.go
new file mode 100644
index 0000000..dba7a0f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/feed_status.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/feed_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a feed.
+type FeedStatusEnum_FeedStatus int32
+
+const (
+	// Not specified.
+	FeedStatusEnum_UNSPECIFIED FeedStatusEnum_FeedStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedStatusEnum_UNKNOWN FeedStatusEnum_FeedStatus = 1
+	// Feed is enabled.
+	FeedStatusEnum_ENABLED FeedStatusEnum_FeedStatus = 2
+	// Feed has been removed.
+	FeedStatusEnum_REMOVED FeedStatusEnum_FeedStatus = 3
+)
+
+var FeedStatusEnum_FeedStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var FeedStatusEnum_FeedStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x FeedStatusEnum_FeedStatus) String() string {
+	return proto.EnumName(FeedStatusEnum_FeedStatus_name, int32(x))
+}
+
+func (FeedStatusEnum_FeedStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3f6c6129d0eaf758, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of a feed.
+type FeedStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedStatusEnum) Reset()         { *m = FeedStatusEnum{} }
+func (m *FeedStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedStatusEnum) ProtoMessage()    {}
+func (*FeedStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3f6c6129d0eaf758, []int{0}
+}
+
+func (m *FeedStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedStatusEnum.Unmarshal(m, b)
+}
+func (m *FeedStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedStatusEnum.Merge(m, src)
+}
+func (m *FeedStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedStatusEnum.Size(m)
+}
+func (m *FeedStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedStatusEnum_FeedStatus", FeedStatusEnum_FeedStatus_name, FeedStatusEnum_FeedStatus_value)
+	proto.RegisterType((*FeedStatusEnum)(nil), "google.ads.googleads.v3.enums.FeedStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/feed_status.proto", fileDescriptor_3f6c6129d0eaf758)
+}
+
+var fileDescriptor_3f6c6129d0eaf758 = []byte{
+	// 291 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x18, 0x77, 0x1d, 0x28, 0x64, 0xe0, 0xca, 0x8e, 0xe2, 0x0e, 0xdb, 0x03, 0x24, 0x87, 0xdc, 0xe2,
+	0x29, 0xb5, 0xd9, 0x18, 0x6a, 0x37, 0x1c, 0xab, 0x20, 0x05, 0x89, 0x26, 0x86, 0xc2, 0x9a, 0x94,
+	0xa5, 0xdd, 0x03, 0x79, 0xf4, 0x51, 0x7c, 0x0e, 0x4f, 0x3e, 0x85, 0x24, 0xfd, 0xb3, 0x93, 0x5e,
+	0xca, 0xef, 0xfb, 0x7e, 0x7f, 0xfa, 0xcb, 0x07, 0x90, 0x32, 0x46, 0xed, 0x25, 0xe2, 0xc2, 0xb6,
+	0xd0, 0xa1, 0x23, 0x46, 0x52, 0xd7, 0x85, 0x45, 0xef, 0x52, 0x8a, 0x17, 0x5b, 0xf1, 0xaa, 0xb6,
+	0xb0, 0x3c, 0x98, 0xca, 0x4c, 0xa6, 0x8d, 0x0a, 0x72, 0x61, 0x61, 0x6f, 0x80, 0x47, 0x0c, 0xbd,
+	0xe1, 0xea, 0xba, 0xcb, 0x2b, 0x73, 0xc4, 0xb5, 0x36, 0x15, 0xaf, 0x72, 0xa3, 0x5b, 0xf3, 0x3c,
+	0x05, 0x97, 0x0b, 0x29, 0xc5, 0xd6, 0x07, 0x32, 0x5d, 0x17, 0xf3, 0x18, 0x80, 0xd3, 0x66, 0x32,
+	0x06, 0xa3, 0x5d, 0xb2, 0xdd, 0xb0, 0xdb, 0xd5, 0x62, 0xc5, 0xe2, 0xf0, 0x6c, 0x32, 0x02, 0x17,
+	0xbb, 0xe4, 0x2e, 0x59, 0x3f, 0x25, 0xe1, 0xc0, 0x0d, 0x2c, 0xa1, 0xd1, 0x3d, 0x8b, 0xc3, 0xc0,
+	0x0d, 0x8f, 0xec, 0x61, 0x9d, 0xb2, 0x38, 0x1c, 0x46, 0xdf, 0x03, 0x30, 0x7b, 0x33, 0x05, 0xfc,
+	0xb7, 0x5b, 0x34, 0x3e, 0xfd, 0x69, 0xe3, 0xea, 0x6c, 0x06, 0xcf, 0x51, 0xeb, 0x50, 0x66, 0xcf,
+	0xb5, 0x82, 0xe6, 0xa0, 0x90, 0x92, 0xda, 0x97, 0xed, 0xce, 0x51, 0xe6, 0xf6, 0x8f, 0xeb, 0xdc,
+	0xf8, 0xef, 0x47, 0x30, 0x5c, 0x52, 0xfa, 0x19, 0x4c, 0x97, 0x4d, 0x14, 0x15, 0x16, 0x36, 0xd0,
+	0xa1, 0x14, 0x43, 0xf7, 0x4e, 0xfb, 0xd5, 0xf1, 0x19, 0x15, 0x36, 0xeb, 0xf9, 0x2c, 0xc5, 0x99,
+	0xe7, 0x7f, 0x82, 0x59, 0xb3, 0x24, 0x84, 0x0a, 0x4b, 0x48, 0xaf, 0x20, 0x24, 0xc5, 0x84, 0x78,
+	0xcd, 0xeb, 0xb9, 0x2f, 0x86, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x17, 0x99, 0xc1, 0x4f, 0xb5,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/flight_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/flight_placeholder_field.pb.go
new file mode 100644
index 0000000..868d629
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/flight_placeholder_field.pb.go
@@ -0,0 +1,218 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/flight_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Flight placeholder fields.
+type FlightPlaceholderFieldEnum_FlightPlaceholderField int32
+
+const (
+	// Not specified.
+	FlightPlaceholderFieldEnum_UNSPECIFIED FlightPlaceholderFieldEnum_FlightPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	FlightPlaceholderFieldEnum_UNKNOWN FlightPlaceholderFieldEnum_FlightPlaceholderField = 1
+	// Data Type: STRING. Required. Destination id. Example: PAR, LON.
+	// For feed items that only have destination id, destination id must be a
+	// unique key. For feed items that have both destination id and origin id,
+	// then the combination must be a unique key.
+	FlightPlaceholderFieldEnum_DESTINATION_ID FlightPlaceholderFieldEnum_FlightPlaceholderField = 2
+	// Data Type: STRING. Origin id. Example: PAR, LON.
+	// Optional. Combination of destination id and origin id must be unique per
+	// offer.
+	FlightPlaceholderFieldEnum_ORIGIN_ID FlightPlaceholderFieldEnum_FlightPlaceholderField = 3
+	// Data Type: STRING. Required. Main headline with product name to be shown
+	// in dynamic ad.
+	FlightPlaceholderFieldEnum_FLIGHT_DESCRIPTION FlightPlaceholderFieldEnum_FlightPlaceholderField = 4
+	// Data Type: STRING. Shorter names are recommended.
+	FlightPlaceholderFieldEnum_ORIGIN_NAME FlightPlaceholderFieldEnum_FlightPlaceholderField = 5
+	// Data Type: STRING. Shorter names are recommended.
+	FlightPlaceholderFieldEnum_DESTINATION_NAME FlightPlaceholderFieldEnum_FlightPlaceholderField = 6
+	// Data Type: STRING. Price to be shown in the ad.
+	// Example: "100.00 USD"
+	FlightPlaceholderFieldEnum_FLIGHT_PRICE FlightPlaceholderFieldEnum_FlightPlaceholderField = 7
+	// Data Type: STRING. Formatted price to be shown in the ad.
+	// Example: "Starting at $100.00 USD", "$80 - $100"
+	FlightPlaceholderFieldEnum_FORMATTED_PRICE FlightPlaceholderFieldEnum_FlightPlaceholderField = 8
+	// Data Type: STRING. Sale price to be shown in the ad.
+	// Example: "80.00 USD"
+	FlightPlaceholderFieldEnum_FLIGHT_SALE_PRICE FlightPlaceholderFieldEnum_FlightPlaceholderField = 9
+	// Data Type: STRING. Formatted sale price to be shown in the ad.
+	// Example: "On sale for $80.00", "$60 - $80"
+	FlightPlaceholderFieldEnum_FORMATTED_SALE_PRICE FlightPlaceholderFieldEnum_FlightPlaceholderField = 10
+	// Data Type: URL. Image to be displayed in the ad.
+	FlightPlaceholderFieldEnum_IMAGE_URL FlightPlaceholderFieldEnum_FlightPlaceholderField = 11
+	// Data Type: URL_LIST. Required. Final URLs for the ad when using Upgraded
+	// URLs. User will be redirected to these URLs when they click on an ad, or
+	// when they click on a specific flight for ads that show multiple
+	// flights.
+	FlightPlaceholderFieldEnum_FINAL_URLS FlightPlaceholderFieldEnum_FlightPlaceholderField = 12
+	// Data Type: URL_LIST. Final mobile URLs for the ad when using Upgraded
+	// URLs.
+	FlightPlaceholderFieldEnum_FINAL_MOBILE_URLS FlightPlaceholderFieldEnum_FlightPlaceholderField = 13
+	// Data Type: URL. Tracking template for the ad when using Upgraded URLs.
+	FlightPlaceholderFieldEnum_TRACKING_URL FlightPlaceholderFieldEnum_FlightPlaceholderField = 14
+	// Data Type: STRING. Android app link. Must be formatted as:
+	// android-app://{package_id}/{scheme}/{host_path}.
+	// The components are defined as follows:
+	// package_id: app ID as specified in Google Play.
+	// scheme: the scheme to pass to the application. Can be HTTP, or a custom
+	//   scheme.
+	// host_path: identifies the specific content within your application.
+	FlightPlaceholderFieldEnum_ANDROID_APP_LINK FlightPlaceholderFieldEnum_FlightPlaceholderField = 15
+	// Data Type: STRING_LIST. List of recommended destination IDs to show
+	// together with this item.
+	FlightPlaceholderFieldEnum_SIMILAR_DESTINATION_IDS FlightPlaceholderFieldEnum_FlightPlaceholderField = 16
+	// Data Type: STRING. iOS app link.
+	FlightPlaceholderFieldEnum_IOS_APP_LINK FlightPlaceholderFieldEnum_FlightPlaceholderField = 17
+	// Data Type: INT64. iOS app store ID.
+	FlightPlaceholderFieldEnum_IOS_APP_STORE_ID FlightPlaceholderFieldEnum_FlightPlaceholderField = 18
+)
+
+var FlightPlaceholderFieldEnum_FlightPlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "DESTINATION_ID",
+	3:  "ORIGIN_ID",
+	4:  "FLIGHT_DESCRIPTION",
+	5:  "ORIGIN_NAME",
+	6:  "DESTINATION_NAME",
+	7:  "FLIGHT_PRICE",
+	8:  "FORMATTED_PRICE",
+	9:  "FLIGHT_SALE_PRICE",
+	10: "FORMATTED_SALE_PRICE",
+	11: "IMAGE_URL",
+	12: "FINAL_URLS",
+	13: "FINAL_MOBILE_URLS",
+	14: "TRACKING_URL",
+	15: "ANDROID_APP_LINK",
+	16: "SIMILAR_DESTINATION_IDS",
+	17: "IOS_APP_LINK",
+	18: "IOS_APP_STORE_ID",
+}
+
+var FlightPlaceholderFieldEnum_FlightPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":             0,
+	"UNKNOWN":                 1,
+	"DESTINATION_ID":          2,
+	"ORIGIN_ID":               3,
+	"FLIGHT_DESCRIPTION":      4,
+	"ORIGIN_NAME":             5,
+	"DESTINATION_NAME":        6,
+	"FLIGHT_PRICE":            7,
+	"FORMATTED_PRICE":         8,
+	"FLIGHT_SALE_PRICE":       9,
+	"FORMATTED_SALE_PRICE":    10,
+	"IMAGE_URL":               11,
+	"FINAL_URLS":              12,
+	"FINAL_MOBILE_URLS":       13,
+	"TRACKING_URL":            14,
+	"ANDROID_APP_LINK":        15,
+	"SIMILAR_DESTINATION_IDS": 16,
+	"IOS_APP_LINK":            17,
+	"IOS_APP_STORE_ID":        18,
+}
+
+func (x FlightPlaceholderFieldEnum_FlightPlaceholderField) String() string {
+	return proto.EnumName(FlightPlaceholderFieldEnum_FlightPlaceholderField_name, int32(x))
+}
+
+func (FlightPlaceholderFieldEnum_FlightPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_05562ffffd9d8d69, []int{0, 0}
+}
+
+// Values for Flight placeholder fields.
+// For more information about dynamic remarketing feeds, see
+// https://support.google.com/google-ads/answer/6053288.
+type FlightPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FlightPlaceholderFieldEnum) Reset()         { *m = FlightPlaceholderFieldEnum{} }
+func (m *FlightPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*FlightPlaceholderFieldEnum) ProtoMessage()    {}
+func (*FlightPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_05562ffffd9d8d69, []int{0}
+}
+
+func (m *FlightPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FlightPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *FlightPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FlightPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *FlightPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FlightPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *FlightPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_FlightPlaceholderFieldEnum.Size(m)
+}
+func (m *FlightPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FlightPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FlightPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FlightPlaceholderFieldEnum_FlightPlaceholderField", FlightPlaceholderFieldEnum_FlightPlaceholderField_name, FlightPlaceholderFieldEnum_FlightPlaceholderField_value)
+	proto.RegisterType((*FlightPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.FlightPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/flight_placeholder_field.proto", fileDescriptor_05562ffffd9d8d69)
+}
+
+var fileDescriptor_05562ffffd9d8d69 = []byte{
+	// 496 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0x4d, 0x6e, 0xd3, 0x40,
+	0x14, 0x26, 0x09, 0xb4, 0x74, 0xd2, 0x26, 0xd3, 0xa1, 0x14, 0x54, 0xda, 0x45, 0x7b, 0x00, 0x7b,
+	0xe1, 0x9d, 0x61, 0x33, 0x89, 0xc7, 0x66, 0x14, 0x7b, 0x6c, 0xd9, 0x4e, 0x90, 0x50, 0x24, 0xcb,
+	0xd4, 0xae, 0x6b, 0xc9, 0xf1, 0x44, 0x99, 0xb4, 0x17, 0xe1, 0x06, 0x2c, 0x59, 0x72, 0x0c, 0x8e,
+	0xc2, 0x8e, 0x1b, 0xa0, 0x19, 0x3b, 0x3f, 0x20, 0x60, 0x33, 0x7a, 0xef, 0xfb, 0xd3, 0xd3, 0xbc,
+	0x07, 0xde, 0x15, 0x9c, 0x17, 0x55, 0xae, 0xa7, 0x99, 0xd0, 0x9b, 0x52, 0x56, 0x8f, 0x86, 0x9e,
+	0xd7, 0x0f, 0x0b, 0xa1, 0xdf, 0x55, 0x65, 0x71, 0xbf, 0x4e, 0x96, 0x55, 0x7a, 0x9b, 0xdf, 0xf3,
+	0x2a, 0xcb, 0x57, 0xc9, 0x5d, 0x99, 0x57, 0x99, 0xb6, 0x5c, 0xf1, 0x35, 0x47, 0x57, 0x8d, 0x45,
+	0x4b, 0x33, 0xa1, 0x6d, 0xdd, 0xda, 0xa3, 0xa1, 0x29, 0xf7, 0xc5, 0xe5, 0x26, 0x7c, 0x59, 0xea,
+	0x69, 0x5d, 0xf3, 0x75, 0xba, 0x2e, 0x79, 0x2d, 0x1a, 0xf3, 0xcd, 0xb7, 0x1e, 0xb8, 0xb0, 0x55,
+	0x7e, 0xb0, 0x8b, 0xb7, 0x65, 0x3a, 0xa9, 0x1f, 0x16, 0x37, 0x9f, 0x7b, 0xe0, 0xfc, 0xef, 0x34,
+	0x1a, 0x82, 0xfe, 0x94, 0x45, 0x01, 0x19, 0x53, 0x9b, 0x12, 0x0b, 0x3e, 0x41, 0x7d, 0x70, 0x38,
+	0x65, 0x13, 0xe6, 0x7f, 0x60, 0xb0, 0x83, 0x10, 0x18, 0x58, 0x24, 0x8a, 0x29, 0xc3, 0x31, 0xf5,
+	0x59, 0x42, 0x2d, 0xd8, 0x45, 0x27, 0xe0, 0xc8, 0x0f, 0xa9, 0x43, 0x55, 0xdb, 0x43, 0xe7, 0x00,
+	0xd9, 0x2e, 0x75, 0xde, 0xc7, 0x89, 0x45, 0xa2, 0x71, 0x48, 0x03, 0xa9, 0x84, 0x4f, 0x65, 0x70,
+	0x2b, 0x63, 0xd8, 0x23, 0xf0, 0x19, 0x3a, 0x03, 0x70, 0x3f, 0x4b, 0xa1, 0x07, 0x08, 0x82, 0xe3,
+	0xd6, 0x1e, 0x84, 0x74, 0x4c, 0xe0, 0x21, 0x7a, 0x01, 0x86, 0xb6, 0x1f, 0x7a, 0x38, 0x8e, 0x89,
+	0xd5, 0x82, 0xcf, 0xd1, 0x4b, 0x70, 0xda, 0xca, 0x22, 0xec, 0x92, 0x16, 0x3e, 0x42, 0xaf, 0xc1,
+	0xd9, 0x4e, 0xbb, 0xc7, 0x00, 0x39, 0x25, 0xf5, 0xb0, 0x43, 0x92, 0x69, 0xe8, 0xc2, 0x3e, 0x1a,
+	0x00, 0x60, 0x53, 0x86, 0x5d, 0xd9, 0x46, 0xf0, 0x58, 0xe5, 0xa9, 0xde, 0xf3, 0x47, 0xd4, 0x25,
+	0x0d, 0x7c, 0x22, 0xa7, 0x89, 0x43, 0x3c, 0x9e, 0x50, 0xe6, 0x28, 0xe3, 0x40, 0x4e, 0x8d, 0x99,
+	0x15, 0xfa, 0xd4, 0x4a, 0x70, 0x10, 0x24, 0x2e, 0x65, 0x13, 0x38, 0x44, 0x6f, 0xc0, 0xab, 0x88,
+	0x7a, 0xd4, 0xc5, 0x61, 0xf2, 0xfb, 0xff, 0x44, 0x10, 0xca, 0x10, 0xea, 0x47, 0x3b, 0xf9, 0xa9,
+	0x0c, 0xd9, 0x20, 0x51, 0xec, 0x87, 0x44, 0xfe, 0x1c, 0x1a, 0xfd, 0xec, 0x80, 0xeb, 0x5b, 0xbe,
+	0xd0, 0xfe, 0xbb, 0xf8, 0xd1, 0x65, 0xb3, 0x38, 0xf1, 0xe7, 0xe6, 0x02, 0xb9, 0xf8, 0xa0, 0xf3,
+	0x71, 0xd4, 0xda, 0x0b, 0x5e, 0xa5, 0x75, 0xa1, 0xf1, 0x55, 0xa1, 0x17, 0x79, 0xad, 0xce, 0x62,
+	0x73, 0x85, 0xcb, 0x52, 0xfc, 0xe3, 0x28, 0xdf, 0xaa, 0xf7, 0x4b, 0xb7, 0xe7, 0x60, 0xfc, 0xb5,
+	0x7b, 0xe5, 0x34, 0x51, 0x38, 0x13, 0x5a, 0x53, 0xca, 0x6a, 0x66, 0x68, 0xf2, 0x88, 0xc4, 0xf7,
+	0x0d, 0x3f, 0xc7, 0x99, 0x98, 0x6f, 0xf9, 0xf9, 0xcc, 0x98, 0x2b, 0xfe, 0x47, 0xf7, 0xba, 0x01,
+	0x4d, 0x13, 0x67, 0xc2, 0x34, 0xb7, 0x0a, 0xd3, 0x9c, 0x19, 0xa6, 0xa9, 0x34, 0x9f, 0x0e, 0xd4,
+	0x60, 0xc6, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x63, 0xf9, 0xca, 0x7e, 0x2c, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/frequency_cap_event_type.pb.go b/googleapis/ads/googleads/v3/enums/frequency_cap_event_type.pb.go
new file mode 100644
index 0000000..ebae6a6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/frequency_cap_event_type.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/frequency_cap_event_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of event that the cap applies to (e.g. impression).
+type FrequencyCapEventTypeEnum_FrequencyCapEventType int32
+
+const (
+	// Not specified.
+	FrequencyCapEventTypeEnum_UNSPECIFIED FrequencyCapEventTypeEnum_FrequencyCapEventType = 0
+	// Used for return value only. Represents value unknown in this version.
+	FrequencyCapEventTypeEnum_UNKNOWN FrequencyCapEventTypeEnum_FrequencyCapEventType = 1
+	// The cap applies on ad impressions.
+	FrequencyCapEventTypeEnum_IMPRESSION FrequencyCapEventTypeEnum_FrequencyCapEventType = 2
+	// The cap applies on video ad views.
+	FrequencyCapEventTypeEnum_VIDEO_VIEW FrequencyCapEventTypeEnum_FrequencyCapEventType = 3
+)
+
+var FrequencyCapEventTypeEnum_FrequencyCapEventType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "IMPRESSION",
+	3: "VIDEO_VIEW",
+}
+
+var FrequencyCapEventTypeEnum_FrequencyCapEventType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"IMPRESSION":  2,
+	"VIDEO_VIEW":  3,
+}
+
+func (x FrequencyCapEventTypeEnum_FrequencyCapEventType) String() string {
+	return proto.EnumName(FrequencyCapEventTypeEnum_FrequencyCapEventType_name, int32(x))
+}
+
+func (FrequencyCapEventTypeEnum_FrequencyCapEventType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_645006887424b23b, []int{0, 0}
+}
+
+// Container for enum describing the type of event that the cap applies to.
+type FrequencyCapEventTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FrequencyCapEventTypeEnum) Reset()         { *m = FrequencyCapEventTypeEnum{} }
+func (m *FrequencyCapEventTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*FrequencyCapEventTypeEnum) ProtoMessage()    {}
+func (*FrequencyCapEventTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_645006887424b23b, []int{0}
+}
+
+func (m *FrequencyCapEventTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FrequencyCapEventTypeEnum.Unmarshal(m, b)
+}
+func (m *FrequencyCapEventTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FrequencyCapEventTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *FrequencyCapEventTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FrequencyCapEventTypeEnum.Merge(m, src)
+}
+func (m *FrequencyCapEventTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_FrequencyCapEventTypeEnum.Size(m)
+}
+func (m *FrequencyCapEventTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FrequencyCapEventTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FrequencyCapEventTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FrequencyCapEventTypeEnum_FrequencyCapEventType", FrequencyCapEventTypeEnum_FrequencyCapEventType_name, FrequencyCapEventTypeEnum_FrequencyCapEventType_value)
+	proto.RegisterType((*FrequencyCapEventTypeEnum)(nil), "google.ads.googleads.v3.enums.FrequencyCapEventTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/frequency_cap_event_type.proto", fileDescriptor_645006887424b23b)
+}
+
+var fileDescriptor_645006887424b23b = []byte{
+	// 321 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4b, 0xfb, 0x30,
+	0x1c, 0xfd, 0xaf, 0x83, 0xbf, 0x90, 0x81, 0x96, 0x82, 0x07, 0x87, 0x3b, 0x6c, 0x1f, 0x20, 0x3d,
+	0xf4, 0x16, 0xbd, 0x74, 0x5b, 0x36, 0x82, 0xd8, 0x15, 0xe7, 0x3a, 0x90, 0x42, 0x89, 0x6b, 0x0c,
+	0x83, 0x2d, 0x89, 0x4d, 0x37, 0xd8, 0xd7, 0xf1, 0xe8, 0x47, 0xf1, 0xa3, 0x78, 0xf1, 0x2b, 0x48,
+	0x12, 0xbb, 0xd3, 0xf4, 0x12, 0x5e, 0xf2, 0x7e, 0xef, 0xe5, 0xfd, 0x1e, 0xb8, 0xe5, 0x52, 0xf2,
+	0x0d, 0x0b, 0x69, 0xa9, 0x43, 0x07, 0x0d, 0xda, 0x47, 0x21, 0x13, 0xbb, 0xad, 0x0e, 0x5f, 0x2a,
+	0xf6, 0xba, 0x63, 0x62, 0x75, 0x28, 0x56, 0x54, 0x15, 0x6c, 0xcf, 0x44, 0x5d, 0xd4, 0x07, 0xc5,
+	0xa0, 0xaa, 0x64, 0x2d, 0x83, 0x9e, 0x93, 0x40, 0x5a, 0x6a, 0x78, 0x54, 0xc3, 0x7d, 0x04, 0xad,
+	0xba, 0x7b, 0xdd, 0x98, 0xab, 0x75, 0x48, 0x85, 0x90, 0x35, 0xad, 0xd7, 0x52, 0x68, 0x27, 0x1e,
+	0x54, 0xe0, 0x6a, 0xd2, 0xd8, 0x8f, 0xa8, 0xc2, 0xc6, 0xfc, 0xf1, 0xa0, 0x18, 0x16, 0xbb, 0xed,
+	0x60, 0x01, 0x2e, 0x4f, 0x92, 0xc1, 0x05, 0xe8, 0x2c, 0x92, 0x79, 0x8a, 0x47, 0x64, 0x42, 0xf0,
+	0xd8, 0xff, 0x17, 0x74, 0xc0, 0xd9, 0x22, 0xb9, 0x4b, 0x66, 0xcb, 0xc4, 0x6f, 0x05, 0xe7, 0x00,
+	0x90, 0xfb, 0xf4, 0x01, 0xcf, 0xe7, 0x64, 0x96, 0xf8, 0x9e, 0xb9, 0x67, 0x64, 0x8c, 0x67, 0x45,
+	0x46, 0xf0, 0xd2, 0x6f, 0x0f, 0xbf, 0x5a, 0xa0, 0xbf, 0x92, 0x5b, 0xf8, 0x67, 0xee, 0x61, 0xf7,
+	0xe4, 0xd7, 0xa9, 0x49, 0x9d, 0xb6, 0x9e, 0x86, 0x3f, 0x62, 0x2e, 0x37, 0x54, 0x70, 0x28, 0x2b,
+	0x1e, 0x72, 0x26, 0xec, 0x4e, 0x4d, 0x85, 0x6a, 0xad, 0x7f, 0x69, 0xf4, 0xc6, 0x9e, 0x6f, 0x5e,
+	0x7b, 0x1a, 0xc7, 0xef, 0x5e, 0x6f, 0xea, 0xac, 0xe2, 0x52, 0x43, 0x07, 0x0d, 0xca, 0x22, 0x68,
+	0x3a, 0xd0, 0x1f, 0x0d, 0x9f, 0xc7, 0xa5, 0xce, 0x8f, 0x7c, 0x9e, 0x45, 0xb9, 0xe5, 0x3f, 0xbd,
+	0xbe, 0x7b, 0x44, 0x28, 0x2e, 0x35, 0x42, 0xc7, 0x09, 0x84, 0xb2, 0x08, 0x21, 0x3b, 0xf3, 0xfc,
+	0xdf, 0x06, 0x8b, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x6f, 0x10, 0xf2, 0xe9, 0x01, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/frequency_cap_level.pb.go b/googleapis/ads/googleads/v3/enums/frequency_cap_level.pb.go
new file mode 100644
index 0000000..d645970
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/frequency_cap_level.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/frequency_cap_level.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The level on which the cap is to be applied (e.g ad group ad, ad group).
+// Cap is applied to all the resources of this level.
+type FrequencyCapLevelEnum_FrequencyCapLevel int32
+
+const (
+	// Not specified.
+	FrequencyCapLevelEnum_UNSPECIFIED FrequencyCapLevelEnum_FrequencyCapLevel = 0
+	// Used for return value only. Represents value unknown in this version.
+	FrequencyCapLevelEnum_UNKNOWN FrequencyCapLevelEnum_FrequencyCapLevel = 1
+	// The cap is applied at the ad group ad level.
+	FrequencyCapLevelEnum_AD_GROUP_AD FrequencyCapLevelEnum_FrequencyCapLevel = 2
+	// The cap is applied at the ad group level.
+	FrequencyCapLevelEnum_AD_GROUP FrequencyCapLevelEnum_FrequencyCapLevel = 3
+	// The cap is applied at the campaign level.
+	FrequencyCapLevelEnum_CAMPAIGN FrequencyCapLevelEnum_FrequencyCapLevel = 4
+)
+
+var FrequencyCapLevelEnum_FrequencyCapLevel_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AD_GROUP_AD",
+	3: "AD_GROUP",
+	4: "CAMPAIGN",
+}
+
+var FrequencyCapLevelEnum_FrequencyCapLevel_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"AD_GROUP_AD": 2,
+	"AD_GROUP":    3,
+	"CAMPAIGN":    4,
+}
+
+func (x FrequencyCapLevelEnum_FrequencyCapLevel) String() string {
+	return proto.EnumName(FrequencyCapLevelEnum_FrequencyCapLevel_name, int32(x))
+}
+
+func (FrequencyCapLevelEnum_FrequencyCapLevel) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7591f0d13b525d9e, []int{0, 0}
+}
+
+// Container for enum describing the level on which the cap is to be applied.
+type FrequencyCapLevelEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FrequencyCapLevelEnum) Reset()         { *m = FrequencyCapLevelEnum{} }
+func (m *FrequencyCapLevelEnum) String() string { return proto.CompactTextString(m) }
+func (*FrequencyCapLevelEnum) ProtoMessage()    {}
+func (*FrequencyCapLevelEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7591f0d13b525d9e, []int{0}
+}
+
+func (m *FrequencyCapLevelEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FrequencyCapLevelEnum.Unmarshal(m, b)
+}
+func (m *FrequencyCapLevelEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FrequencyCapLevelEnum.Marshal(b, m, deterministic)
+}
+func (m *FrequencyCapLevelEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FrequencyCapLevelEnum.Merge(m, src)
+}
+func (m *FrequencyCapLevelEnum) XXX_Size() int {
+	return xxx_messageInfo_FrequencyCapLevelEnum.Size(m)
+}
+func (m *FrequencyCapLevelEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FrequencyCapLevelEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FrequencyCapLevelEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FrequencyCapLevelEnum_FrequencyCapLevel", FrequencyCapLevelEnum_FrequencyCapLevel_name, FrequencyCapLevelEnum_FrequencyCapLevel_value)
+	proto.RegisterType((*FrequencyCapLevelEnum)(nil), "google.ads.googleads.v3.enums.FrequencyCapLevelEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/frequency_cap_level.proto", fileDescriptor_7591f0d13b525d9e)
+}
+
+var fileDescriptor_7591f0d13b525d9e = []byte{
+	// 316 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x1c, 0x76, 0x9d, 0xa8, 0x64, 0x82, 0xb5, 0xa0, 0x07, 0x71, 0x87, 0xed, 0x01, 0x92, 0x43, 0x0e,
+	0x42, 0x3c, 0x65, 0xff, 0xca, 0x50, 0xbb, 0xa2, 0x6c, 0x82, 0x14, 0x4b, 0x5c, 0x63, 0x18, 0x74,
+	0x49, 0x5d, 0xb6, 0x8a, 0xaf, 0xe3, 0xd1, 0x47, 0xf1, 0x51, 0xf4, 0x25, 0x24, 0x89, 0xed, 0x65,
+	0xe8, 0xa5, 0x7c, 0xfd, 0x7d, 0x7f, 0xf8, 0xf2, 0x81, 0x0b, 0xa1, 0x94, 0xc8, 0x39, 0x62, 0x99,
+	0x46, 0x0e, 0x1a, 0x54, 0x62, 0xc4, 0xe5, 0x66, 0xa9, 0xd1, 0xf3, 0x8a, 0xbf, 0x6c, 0xb8, 0x9c,
+	0xbf, 0xa5, 0x73, 0x56, 0xa4, 0x39, 0x2f, 0x79, 0x0e, 0x8b, 0x95, 0x5a, 0xab, 0xa0, 0xed, 0xd4,
+	0x90, 0x65, 0x1a, 0xd6, 0x46, 0x58, 0x62, 0x68, 0x8d, 0x67, 0xe7, 0x55, 0x6e, 0xb1, 0x40, 0x4c,
+	0x4a, 0xb5, 0x66, 0xeb, 0x85, 0x92, 0xda, 0x99, 0xbb, 0xaf, 0xe0, 0x64, 0x54, 0x25, 0xf7, 0x59,
+	0x71, 0x6d, 0x72, 0x87, 0x72, 0xb3, 0xec, 0x3e, 0x82, 0xe3, 0x2d, 0x22, 0x38, 0x02, 0xad, 0x69,
+	0x74, 0x17, 0x0f, 0xfb, 0xe3, 0xd1, 0x78, 0x38, 0xf0, 0x77, 0x82, 0x16, 0xd8, 0x9f, 0x46, 0x57,
+	0xd1, 0xe4, 0x3e, 0xf2, 0x1b, 0x86, 0xa5, 0x83, 0x34, 0xbc, 0x9d, 0x4c, 0xe3, 0x94, 0x0e, 0x7c,
+	0x2f, 0x38, 0x04, 0x07, 0xd5, 0xc1, 0x6f, 0x9a, 0xbf, 0x3e, 0xbd, 0x89, 0xe9, 0x38, 0x8c, 0xfc,
+	0xdd, 0xde, 0x77, 0x03, 0x74, 0xe6, 0x6a, 0x09, 0xff, 0x2d, 0xdf, 0x3b, 0xdd, 0xea, 0x10, 0x9b,
+	0xda, 0x71, 0xe3, 0xa1, 0xf7, 0x6b, 0x14, 0x2a, 0x67, 0x52, 0x40, 0xb5, 0x12, 0x48, 0x70, 0x69,
+	0x1f, 0x55, 0xcd, 0x57, 0x2c, 0xf4, 0x1f, 0x6b, 0x5e, 0xda, 0xef, 0xbb, 0xd7, 0x0c, 0x29, 0xfd,
+	0xf0, 0xda, 0xa1, 0x8b, 0xa2, 0x99, 0x86, 0x0e, 0x1a, 0x34, 0xc3, 0xd0, 0x0c, 0xa1, 0x3f, 0x2b,
+	0x3e, 0xa1, 0x99, 0x4e, 0x6a, 0x3e, 0x99, 0xe1, 0xc4, 0xf2, 0x5f, 0x5e, 0xc7, 0x1d, 0x09, 0xa1,
+	0x99, 0x26, 0xa4, 0x56, 0x10, 0x32, 0xc3, 0x84, 0x58, 0xcd, 0xd3, 0x9e, 0x2d, 0x86, 0x7f, 0x02,
+	0x00, 0x00, 0xff, 0xff, 0xc2, 0x8b, 0x44, 0x67, 0xe5, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/frequency_cap_time_unit.pb.go b/googleapis/ads/googleads/v3/enums/frequency_cap_time_unit.pb.go
new file mode 100644
index 0000000..cb655b7
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/frequency_cap_time_unit.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/frequency_cap_time_unit.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Unit of time the cap is defined at (e.g. day, week).
+type FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit int32
+
+const (
+	// Not specified.
+	FrequencyCapTimeUnitEnum_UNSPECIFIED FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit = 0
+	// Used for return value only. Represents value unknown in this version.
+	FrequencyCapTimeUnitEnum_UNKNOWN FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit = 1
+	// The cap would define limit per one day.
+	FrequencyCapTimeUnitEnum_DAY FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit = 2
+	// The cap would define limit per one week.
+	FrequencyCapTimeUnitEnum_WEEK FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit = 3
+	// The cap would define limit per one month.
+	FrequencyCapTimeUnitEnum_MONTH FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit = 4
+)
+
+var FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DAY",
+	3: "WEEK",
+	4: "MONTH",
+}
+
+var FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"DAY":         2,
+	"WEEK":        3,
+	"MONTH":       4,
+}
+
+func (x FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit) String() string {
+	return proto.EnumName(FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit_name, int32(x))
+}
+
+func (FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0acbdb304da9e43b, []int{0, 0}
+}
+
+// Container for enum describing the unit of time the cap is defined at.
+type FrequencyCapTimeUnitEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FrequencyCapTimeUnitEnum) Reset()         { *m = FrequencyCapTimeUnitEnum{} }
+func (m *FrequencyCapTimeUnitEnum) String() string { return proto.CompactTextString(m) }
+func (*FrequencyCapTimeUnitEnum) ProtoMessage()    {}
+func (*FrequencyCapTimeUnitEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0acbdb304da9e43b, []int{0}
+}
+
+func (m *FrequencyCapTimeUnitEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FrequencyCapTimeUnitEnum.Unmarshal(m, b)
+}
+func (m *FrequencyCapTimeUnitEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FrequencyCapTimeUnitEnum.Marshal(b, m, deterministic)
+}
+func (m *FrequencyCapTimeUnitEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FrequencyCapTimeUnitEnum.Merge(m, src)
+}
+func (m *FrequencyCapTimeUnitEnum) XXX_Size() int {
+	return xxx_messageInfo_FrequencyCapTimeUnitEnum.Size(m)
+}
+func (m *FrequencyCapTimeUnitEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FrequencyCapTimeUnitEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FrequencyCapTimeUnitEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit", FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit_name, FrequencyCapTimeUnitEnum_FrequencyCapTimeUnit_value)
+	proto.RegisterType((*FrequencyCapTimeUnitEnum)(nil), "google.ads.googleads.v3.enums.FrequencyCapTimeUnitEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/frequency_cap_time_unit.proto", fileDescriptor_0acbdb304da9e43b)
+}
+
+var fileDescriptor_0acbdb304da9e43b = []byte{
+	// 322 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4f, 0xc2, 0x30,
+	0x18, 0xc6, 0x65, 0xa0, 0x68, 0x39, 0xb8, 0x2c, 0x1e, 0xd4, 0xc8, 0x01, 0x3e, 0x40, 0x77, 0xd8,
+	0xad, 0x9c, 0x0a, 0x0c, 0x24, 0xc4, 0x41, 0x94, 0x3f, 0xd1, 0x2c, 0x21, 0x95, 0xd5, 0xa6, 0x09,
+	0x6b, 0x27, 0xed, 0x48, 0xfc, 0x3a, 0x1e, 0xfd, 0x28, 0x7e, 0x14, 0x0f, 0x7e, 0x06, 0xb3, 0xd6,
+	0x71, 0x42, 0x2f, 0xcb, 0x93, 0x3d, 0xef, 0xef, 0xe9, 0xf3, 0xbe, 0xa0, 0xc3, 0xa4, 0x64, 0x1b,
+	0xea, 0x93, 0x44, 0xf9, 0x56, 0x16, 0x6a, 0x17, 0xf8, 0x54, 0xe4, 0xa9, 0xf2, 0x5f, 0xb6, 0xf4,
+	0x35, 0xa7, 0x62, 0xfd, 0xb6, 0x5a, 0x93, 0x6c, 0xa5, 0x79, 0x4a, 0x57, 0xb9, 0xe0, 0x1a, 0x66,
+	0x5b, 0xa9, 0xa5, 0xd7, 0xb4, 0x04, 0x24, 0x89, 0x82, 0x7b, 0x18, 0xee, 0x02, 0x68, 0xe0, 0xeb,
+	0x9b, 0x32, 0x3b, 0xe3, 0x3e, 0x11, 0x42, 0x6a, 0xa2, 0xb9, 0x14, 0xca, 0xc2, 0x6d, 0x01, 0x2e,
+	0x07, 0x65, 0x7a, 0x8f, 0x64, 0x33, 0x9e, 0xd2, 0xb9, 0xe0, 0x3a, 0x14, 0x79, 0xda, 0xbe, 0x07,
+	0x17, 0x87, 0x3c, 0xef, 0x1c, 0x34, 0xe6, 0xd1, 0xc3, 0x34, 0xec, 0x8d, 0x06, 0xa3, 0xb0, 0xef,
+	0x1e, 0x79, 0x0d, 0x50, 0x9f, 0x47, 0xe3, 0x68, 0xb2, 0x8c, 0xdc, 0x8a, 0x57, 0x07, 0xd5, 0x3e,
+	0x7e, 0x74, 0x1d, 0xef, 0x14, 0xd4, 0x96, 0x61, 0x38, 0x76, 0xab, 0xde, 0x19, 0x38, 0xbe, 0x9b,
+	0x44, 0xb3, 0x5b, 0xb7, 0xd6, 0xfd, 0xae, 0x80, 0xd6, 0x5a, 0xa6, 0xf0, 0xdf, 0xce, 0xdd, 0xab,
+	0x43, 0xef, 0x4e, 0x8b, 0xc2, 0xd3, 0xca, 0x53, 0xf7, 0x97, 0x65, 0x72, 0x43, 0x04, 0x83, 0x72,
+	0xcb, 0x7c, 0x46, 0x85, 0x59, 0xa7, 0x3c, 0x5e, 0xc6, 0xd5, 0x1f, 0xb7, 0xec, 0x98, 0xef, 0xbb,
+	0x53, 0x1d, 0x62, 0xfc, 0xe1, 0x34, 0x87, 0x36, 0x0a, 0x27, 0x0a, 0x5a, 0x59, 0xa8, 0x45, 0x00,
+	0x8b, 0xfd, 0xd5, 0x67, 0xe9, 0xc7, 0x38, 0x51, 0xf1, 0xde, 0x8f, 0x17, 0x41, 0x6c, 0xfc, 0x2f,
+	0xa7, 0x65, 0x7f, 0x22, 0x84, 0x13, 0x85, 0xd0, 0x7e, 0x02, 0xa1, 0x45, 0x80, 0x90, 0x99, 0x79,
+	0x3e, 0x31, 0xc5, 0x82, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x6b, 0xc4, 0x54, 0xe3, 0x01,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/gender_type.pb.go b/googleapis/ads/googleads/v3/enums/gender_type.pb.go
new file mode 100644
index 0000000..feb8d5e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/gender_type.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/gender_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of demographic genders (e.g. female).
+type GenderTypeEnum_GenderType int32
+
+const (
+	// Not specified.
+	GenderTypeEnum_UNSPECIFIED GenderTypeEnum_GenderType = 0
+	// Used for return value only. Represents value unknown in this version.
+	GenderTypeEnum_UNKNOWN GenderTypeEnum_GenderType = 1
+	// Male.
+	GenderTypeEnum_MALE GenderTypeEnum_GenderType = 10
+	// Female.
+	GenderTypeEnum_FEMALE GenderTypeEnum_GenderType = 11
+	// Undetermined gender.
+	GenderTypeEnum_UNDETERMINED GenderTypeEnum_GenderType = 20
+)
+
+var GenderTypeEnum_GenderType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	10: "MALE",
+	11: "FEMALE",
+	20: "UNDETERMINED",
+}
+
+var GenderTypeEnum_GenderType_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"MALE":         10,
+	"FEMALE":       11,
+	"UNDETERMINED": 20,
+}
+
+func (x GenderTypeEnum_GenderType) String() string {
+	return proto.EnumName(GenderTypeEnum_GenderType_name, int32(x))
+}
+
+func (GenderTypeEnum_GenderType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_51e52a2335997197, []int{0, 0}
+}
+
+// Container for enum describing the type of demographic genders.
+type GenderTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GenderTypeEnum) Reset()         { *m = GenderTypeEnum{} }
+func (m *GenderTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*GenderTypeEnum) ProtoMessage()    {}
+func (*GenderTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_51e52a2335997197, []int{0}
+}
+
+func (m *GenderTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenderTypeEnum.Unmarshal(m, b)
+}
+func (m *GenderTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenderTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *GenderTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenderTypeEnum.Merge(m, src)
+}
+func (m *GenderTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_GenderTypeEnum.Size(m)
+}
+func (m *GenderTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenderTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenderTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.GenderTypeEnum_GenderType", GenderTypeEnum_GenderType_name, GenderTypeEnum_GenderType_value)
+	proto.RegisterType((*GenderTypeEnum)(nil), "google.ads.googleads.v3.enums.GenderTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/gender_type.proto", fileDescriptor_51e52a2335997197)
+}
+
+var fileDescriptor_51e52a2335997197 = []byte{
+	// 307 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4f, 0xf2, 0x30,
+	0x1c, 0x7e, 0xe1, 0x35, 0x68, 0x7e, 0x18, 0x59, 0x1a, 0x4f, 0x46, 0x0e, 0xf0, 0x01, 0xba, 0x43,
+	0x6f, 0xf5, 0x54, 0xa4, 0x10, 0xa2, 0x54, 0x82, 0x80, 0x89, 0x59, 0x62, 0xa6, 0x6d, 0x1a, 0x12,
+	0xd6, 0x2e, 0xeb, 0x20, 0xe1, 0xeb, 0x78, 0xf4, 0xa3, 0xf8, 0x39, 0x3c, 0xf9, 0x29, 0xcc, 0x3a,
+	0x36, 0x4e, 0x7a, 0x59, 0x9e, 0xfc, 0x9e, 0x3f, 0x7b, 0xfa, 0x40, 0xa8, 0xad, 0xd5, 0x1b, 0x15,
+	0xc6, 0xd2, 0x1d, 0x60, 0x81, 0x76, 0x24, 0x54, 0x66, 0x9b, 0xb8, 0x50, 0x2b, 0x23, 0x55, 0xf6,
+	0x92, 0xef, 0x53, 0x85, 0xd3, 0xcc, 0xe6, 0x16, 0x75, 0x4b, 0x15, 0x8e, 0xa5, 0xc3, 0xb5, 0x01,
+	0xef, 0x08, 0xf6, 0x86, 0xab, 0xeb, 0x2a, 0x2f, 0x5d, 0x87, 0xb1, 0x31, 0x36, 0x8f, 0xf3, 0xb5,
+	0x35, 0xae, 0x34, 0xf7, 0x25, 0x5c, 0x8c, 0x7d, 0xe2, 0x62, 0x9f, 0x2a, 0x6e, 0xb6, 0x49, 0x7f,
+	0x0e, 0x70, 0xbc, 0xa0, 0x0e, 0xb4, 0x97, 0xe2, 0x71, 0xc6, 0x6f, 0x27, 0xa3, 0x09, 0x1f, 0x06,
+	0xff, 0x50, 0x1b, 0x4e, 0x97, 0xe2, 0x4e, 0x3c, 0x3c, 0x89, 0xa0, 0x81, 0xce, 0xe0, 0x64, 0xca,
+	0xee, 0x79, 0x00, 0x08, 0xa0, 0x35, 0xe2, 0x1e, 0xb7, 0x51, 0x00, 0xe7, 0x4b, 0x31, 0xe4, 0x0b,
+	0x3e, 0x9f, 0x4e, 0x04, 0x1f, 0x06, 0x97, 0x83, 0xaf, 0x06, 0xf4, 0xde, 0x6c, 0x82, 0xff, 0x6c,
+	0x3a, 0xe8, 0x1c, 0xff, 0x3b, 0x2b, 0xca, 0xcd, 0x1a, 0xcf, 0x83, 0x83, 0x43, 0xdb, 0x4d, 0x6c,
+	0x34, 0xb6, 0x99, 0x2e, 0x06, 0xf0, 0xd5, 0xab, 0x71, 0xd2, 0xb5, 0xfb, 0x65, 0xab, 0x1b, 0xff,
+	0x7d, 0x6f, 0xfe, 0x1f, 0x33, 0xf6, 0xd1, 0xec, 0x8e, 0xcb, 0x28, 0x26, 0x1d, 0x2e, 0x61, 0x81,
+	0x56, 0x04, 0x17, 0xaf, 0x76, 0x9f, 0x15, 0x1f, 0x31, 0xe9, 0xa2, 0x9a, 0x8f, 0x56, 0x24, 0xf2,
+	0xfc, 0x77, 0xb3, 0x57, 0x1e, 0x29, 0x65, 0xd2, 0x51, 0x5a, 0x2b, 0x28, 0x5d, 0x11, 0x4a, 0xbd,
+	0xe6, 0xb5, 0xe5, 0x8b, 0x91, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x97, 0xaf, 0x35, 0x59, 0xc3,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/geo_target_constant_status.pb.go b/googleapis/ads/googleads/v3/enums/geo_target_constant_status.pb.go
new file mode 100644
index 0000000..6667e74
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/geo_target_constant_status.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/geo_target_constant_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible statuses of a geo target constant.
+type GeoTargetConstantStatusEnum_GeoTargetConstantStatus int32
+
+const (
+	// No value has been specified.
+	GeoTargetConstantStatusEnum_UNSPECIFIED GeoTargetConstantStatusEnum_GeoTargetConstantStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	GeoTargetConstantStatusEnum_UNKNOWN GeoTargetConstantStatusEnum_GeoTargetConstantStatus = 1
+	// The geo target constant is valid.
+	GeoTargetConstantStatusEnum_ENABLED GeoTargetConstantStatusEnum_GeoTargetConstantStatus = 2
+	// The geo target constant is obsolete and will be removed.
+	GeoTargetConstantStatusEnum_REMOVAL_PLANNED GeoTargetConstantStatusEnum_GeoTargetConstantStatus = 3
+)
+
+var GeoTargetConstantStatusEnum_GeoTargetConstantStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVAL_PLANNED",
+}
+
+var GeoTargetConstantStatusEnum_GeoTargetConstantStatus_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"ENABLED":         2,
+	"REMOVAL_PLANNED": 3,
+}
+
+func (x GeoTargetConstantStatusEnum_GeoTargetConstantStatus) String() string {
+	return proto.EnumName(GeoTargetConstantStatusEnum_GeoTargetConstantStatus_name, int32(x))
+}
+
+func (GeoTargetConstantStatusEnum_GeoTargetConstantStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c37ed64745a799b7, []int{0, 0}
+}
+
+// Container for describing the status of a geo target constant.
+type GeoTargetConstantStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GeoTargetConstantStatusEnum) Reset()         { *m = GeoTargetConstantStatusEnum{} }
+func (m *GeoTargetConstantStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*GeoTargetConstantStatusEnum) ProtoMessage()    {}
+func (*GeoTargetConstantStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c37ed64745a799b7, []int{0}
+}
+
+func (m *GeoTargetConstantStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GeoTargetConstantStatusEnum.Unmarshal(m, b)
+}
+func (m *GeoTargetConstantStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GeoTargetConstantStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *GeoTargetConstantStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GeoTargetConstantStatusEnum.Merge(m, src)
+}
+func (m *GeoTargetConstantStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_GeoTargetConstantStatusEnum.Size(m)
+}
+func (m *GeoTargetConstantStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_GeoTargetConstantStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GeoTargetConstantStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.GeoTargetConstantStatusEnum_GeoTargetConstantStatus", GeoTargetConstantStatusEnum_GeoTargetConstantStatus_name, GeoTargetConstantStatusEnum_GeoTargetConstantStatus_value)
+	proto.RegisterType((*GeoTargetConstantStatusEnum)(nil), "google.ads.googleads.v3.enums.GeoTargetConstantStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/geo_target_constant_status.proto", fileDescriptor_c37ed64745a799b7)
+}
+
+var fileDescriptor_c37ed64745a799b7 = []byte{
+	// 319 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x6b, 0xc2, 0x30,
+	0x18, 0x9d, 0x15, 0x36, 0x88, 0x07, 0x4b, 0x77, 0x18, 0x6c, 0x7a, 0xd0, 0x1f, 0x90, 0x1e, 0x7a,
+	0xcb, 0x60, 0x90, 0x6a, 0x26, 0x32, 0x17, 0xcb, 0x9c, 0x1d, 0x1b, 0x85, 0x92, 0xd9, 0x10, 0x04,
+	0xcd, 0x27, 0x26, 0xca, 0x7e, 0xcf, 0x8e, 0xfb, 0x29, 0xfb, 0x29, 0xbb, 0xed, 0x1f, 0x8c, 0xa6,
+	0xea, 0xad, 0xbb, 0x84, 0x97, 0xbc, 0xef, 0xbd, 0xbc, 0xef, 0xa1, 0x3b, 0x05, 0xa0, 0x56, 0x32,
+	0x14, 0x85, 0x09, 0x2b, 0x58, 0xa2, 0x7d, 0x14, 0x4a, 0xbd, 0x5b, 0x9b, 0x50, 0x49, 0xc8, 0xad,
+	0xd8, 0x2a, 0x69, 0xf3, 0x05, 0x68, 0x63, 0x85, 0xb6, 0xb9, 0xb1, 0xc2, 0xee, 0x0c, 0xde, 0x6c,
+	0xc1, 0x42, 0xd0, 0xad, 0x44, 0x58, 0x14, 0x06, 0x9f, 0xf4, 0x78, 0x1f, 0x61, 0xa7, 0xbf, 0xee,
+	0x1c, 0xed, 0x37, 0xcb, 0x50, 0x68, 0x0d, 0x56, 0xd8, 0x25, 0xe8, 0x83, 0xb8, 0xff, 0x81, 0x6e,
+	0x46, 0x12, 0x9e, 0x9d, 0xff, 0xe0, 0x60, 0x3f, 0x73, 0xee, 0x4c, 0xef, 0xd6, 0xfd, 0x57, 0x74,
+	0x55, 0x43, 0x07, 0x6d, 0xd4, 0x9a, 0xf3, 0x59, 0xc2, 0x06, 0xe3, 0xfb, 0x31, 0x1b, 0xfa, 0x67,
+	0x41, 0x0b, 0x5d, 0xcc, 0xf9, 0x03, 0x9f, 0xbe, 0x70, 0xbf, 0x51, 0x5e, 0x18, 0xa7, 0xf1, 0x84,
+	0x0d, 0x7d, 0x2f, 0xb8, 0x44, 0xed, 0x27, 0xf6, 0x38, 0x4d, 0xe9, 0x24, 0x4f, 0x26, 0x94, 0x73,
+	0x36, 0xf4, 0x9b, 0xf1, 0x6f, 0x03, 0xf5, 0x16, 0xb0, 0xc6, 0xff, 0xa6, 0x8f, 0x3b, 0x35, 0xdf,
+	0x27, 0x65, 0xfa, 0xa4, 0xf1, 0x16, 0x1f, 0xe4, 0x0a, 0x56, 0x42, 0x2b, 0x0c, 0x5b, 0x15, 0x2a,
+	0xa9, 0xdd, 0x6e, 0xc7, 0x32, 0x37, 0x4b, 0x53, 0xd3, 0xed, 0xad, 0x3b, 0x3f, 0xbd, 0xe6, 0x88,
+	0xd2, 0x2f, 0xaf, 0x3b, 0xaa, 0xac, 0x68, 0x61, 0x70, 0x05, 0x4b, 0x94, 0x46, 0xb8, 0x6c, 0xc2,
+	0x7c, 0x1f, 0xf9, 0x8c, 0x16, 0x26, 0x3b, 0xf1, 0x59, 0x1a, 0x65, 0x8e, 0xff, 0xf1, 0x7a, 0xd5,
+	0x23, 0x21, 0xb4, 0x30, 0x84, 0x9c, 0x26, 0x08, 0x49, 0x23, 0x42, 0xdc, 0xcc, 0xfb, 0xb9, 0x0b,
+	0x16, 0xfd, 0x05, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x6d, 0x83, 0x46, 0xf3, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/geo_targeting_restriction.pb.go b/googleapis/ads/googleads/v3/enums/geo_targeting_restriction.pb.go
new file mode 100644
index 0000000..f2da6f5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/geo_targeting_restriction.pb.go
@@ -0,0 +1,122 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/geo_targeting_restriction.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A restriction used to determine if the request context's
+// geo should be matched.
+type GeoTargetingRestrictionEnum_GeoTargetingRestriction int32
+
+const (
+	// Not specified.
+	GeoTargetingRestrictionEnum_UNSPECIFIED GeoTargetingRestrictionEnum_GeoTargetingRestriction = 0
+	// Used for return value only. Represents value unknown in this version.
+	GeoTargetingRestrictionEnum_UNKNOWN GeoTargetingRestrictionEnum_GeoTargetingRestriction = 1
+	// Indicates that request context should match the physical location of
+	// the user.
+	GeoTargetingRestrictionEnum_LOCATION_OF_PRESENCE GeoTargetingRestrictionEnum_GeoTargetingRestriction = 2
+)
+
+var GeoTargetingRestrictionEnum_GeoTargetingRestriction_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "LOCATION_OF_PRESENCE",
+}
+
+var GeoTargetingRestrictionEnum_GeoTargetingRestriction_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"LOCATION_OF_PRESENCE": 2,
+}
+
+func (x GeoTargetingRestrictionEnum_GeoTargetingRestriction) String() string {
+	return proto.EnumName(GeoTargetingRestrictionEnum_GeoTargetingRestriction_name, int32(x))
+}
+
+func (GeoTargetingRestrictionEnum_GeoTargetingRestriction) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_4bebe6870a1193bf, []int{0, 0}
+}
+
+// Message describing feed item geo targeting restriction.
+type GeoTargetingRestrictionEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GeoTargetingRestrictionEnum) Reset()         { *m = GeoTargetingRestrictionEnum{} }
+func (m *GeoTargetingRestrictionEnum) String() string { return proto.CompactTextString(m) }
+func (*GeoTargetingRestrictionEnum) ProtoMessage()    {}
+func (*GeoTargetingRestrictionEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4bebe6870a1193bf, []int{0}
+}
+
+func (m *GeoTargetingRestrictionEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GeoTargetingRestrictionEnum.Unmarshal(m, b)
+}
+func (m *GeoTargetingRestrictionEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GeoTargetingRestrictionEnum.Marshal(b, m, deterministic)
+}
+func (m *GeoTargetingRestrictionEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GeoTargetingRestrictionEnum.Merge(m, src)
+}
+func (m *GeoTargetingRestrictionEnum) XXX_Size() int {
+	return xxx_messageInfo_GeoTargetingRestrictionEnum.Size(m)
+}
+func (m *GeoTargetingRestrictionEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_GeoTargetingRestrictionEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GeoTargetingRestrictionEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.GeoTargetingRestrictionEnum_GeoTargetingRestriction", GeoTargetingRestrictionEnum_GeoTargetingRestriction_name, GeoTargetingRestrictionEnum_GeoTargetingRestriction_value)
+	proto.RegisterType((*GeoTargetingRestrictionEnum)(nil), "google.ads.googleads.v3.enums.GeoTargetingRestrictionEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/geo_targeting_restriction.proto", fileDescriptor_4bebe6870a1193bf)
+}
+
+var fileDescriptor_4bebe6870a1193bf = []byte{
+	// 311 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4a, 0x03, 0x31,
+	0x18, 0xc5, 0xed, 0x08, 0x0a, 0xe9, 0xc2, 0x32, 0x08, 0x8a, 0xb6, 0x8b, 0xf6, 0x00, 0x99, 0x45,
+	0x76, 0x11, 0x17, 0x69, 0x4d, 0x4b, 0x51, 0x32, 0x63, 0xff, 0x09, 0x32, 0x30, 0xc4, 0x4e, 0x08,
+	0x03, 0x6d, 0x32, 0x4c, 0xd2, 0x1e, 0xc8, 0xa5, 0x47, 0xf1, 0x28, 0xee, 0xbc, 0x81, 0x4c, 0xe2,
+	0xd4, 0x55, 0xdd, 0x84, 0x47, 0xde, 0xf7, 0x7b, 0xf9, 0xf2, 0xc0, 0xbd, 0xd4, 0x5a, 0x6e, 0x44,
+	0xc4, 0x73, 0x13, 0x79, 0x59, 0xab, 0x3d, 0x8a, 0x84, 0xda, 0x6d, 0x4d, 0x24, 0x85, 0xce, 0x2c,
+	0xaf, 0xa4, 0xb0, 0x85, 0x92, 0x59, 0x25, 0x8c, 0xad, 0x8a, 0xb5, 0x2d, 0xb4, 0x82, 0x65, 0xa5,
+	0xad, 0x0e, 0x7b, 0x9e, 0x81, 0x3c, 0x37, 0xf0, 0x80, 0xc3, 0x3d, 0x82, 0x0e, 0xbf, 0xe9, 0x36,
+	0xe9, 0x65, 0x11, 0x71, 0xa5, 0xb4, 0xe5, 0x35, 0x6b, 0x3c, 0x3c, 0x28, 0xc1, 0xed, 0x44, 0xe8,
+	0x45, 0x13, 0x3f, 0xfb, 0x4b, 0xa7, 0x6a, 0xb7, 0x1d, 0x3c, 0x83, 0xab, 0x23, 0x76, 0x78, 0x01,
+	0xda, 0x4b, 0x36, 0x4f, 0xe8, 0x68, 0x3a, 0x9e, 0xd2, 0x87, 0xce, 0x49, 0xd8, 0x06, 0xe7, 0x4b,
+	0xf6, 0xc8, 0xe2, 0x17, 0xd6, 0x69, 0x85, 0xd7, 0xe0, 0xf2, 0x29, 0x1e, 0x91, 0xc5, 0x34, 0x66,
+	0x59, 0x3c, 0xce, 0x92, 0x19, 0x9d, 0x53, 0x36, 0xa2, 0x9d, 0x60, 0xf8, 0xdd, 0x02, 0xfd, 0xb5,
+	0xde, 0xc2, 0x7f, 0xb7, 0x1e, 0x76, 0x8f, 0x3c, 0x9b, 0xd4, 0x5b, 0x27, 0xad, 0xd7, 0xe1, 0x2f,
+	0x2e, 0xf5, 0x86, 0x2b, 0x09, 0x75, 0x25, 0x23, 0x29, 0x94, 0xfb, 0x53, 0xd3, 0x61, 0x59, 0x98,
+	0x23, 0x95, 0xde, 0xb9, 0xf3, 0x3d, 0x38, 0x9d, 0x10, 0xf2, 0x11, 0xf4, 0x26, 0x3e, 0x8a, 0xe4,
+	0x06, 0x7a, 0x59, 0xab, 0x15, 0x82, 0x75, 0x03, 0xe6, 0xb3, 0xf1, 0x53, 0x92, 0x9b, 0xf4, 0xe0,
+	0xa7, 0x2b, 0x94, 0x3a, 0xff, 0x2b, 0xe8, 0xfb, 0x4b, 0x8c, 0x49, 0x6e, 0x30, 0x3e, 0x4c, 0x60,
+	0xbc, 0x42, 0x18, 0xbb, 0x99, 0xb7, 0x33, 0xb7, 0x18, 0xfa, 0x09, 0x00, 0x00, 0xff, 0xff, 0xf0,
+	0x1b, 0xb4, 0x13, 0xea, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/geo_targeting_type.pb.go b/googleapis/ads/googleads/v3/enums/geo_targeting_type.pb.go
new file mode 100644
index 0000000..79e5e5d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/geo_targeting_type.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/geo_targeting_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible geo targeting types.
+type GeoTargetingTypeEnum_GeoTargetingType int32
+
+const (
+	// Not specified.
+	GeoTargetingTypeEnum_UNSPECIFIED GeoTargetingTypeEnum_GeoTargetingType = 0
+	// The value is unknown in this version.
+	GeoTargetingTypeEnum_UNKNOWN GeoTargetingTypeEnum_GeoTargetingType = 1
+	// Location the user is interested in while making the query.
+	GeoTargetingTypeEnum_AREA_OF_INTEREST GeoTargetingTypeEnum_GeoTargetingType = 2
+	// Location of the user issuing the query.
+	GeoTargetingTypeEnum_LOCATION_OF_PRESENCE GeoTargetingTypeEnum_GeoTargetingType = 3
+)
+
+var GeoTargetingTypeEnum_GeoTargetingType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AREA_OF_INTEREST",
+	3: "LOCATION_OF_PRESENCE",
+}
+
+var GeoTargetingTypeEnum_GeoTargetingType_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"AREA_OF_INTEREST":     2,
+	"LOCATION_OF_PRESENCE": 3,
+}
+
+func (x GeoTargetingTypeEnum_GeoTargetingType) String() string {
+	return proto.EnumName(GeoTargetingTypeEnum_GeoTargetingType_name, int32(x))
+}
+
+func (GeoTargetingTypeEnum_GeoTargetingType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_89674afbd6140ba4, []int{0, 0}
+}
+
+// Container for enum describing possible geo targeting types.
+type GeoTargetingTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GeoTargetingTypeEnum) Reset()         { *m = GeoTargetingTypeEnum{} }
+func (m *GeoTargetingTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*GeoTargetingTypeEnum) ProtoMessage()    {}
+func (*GeoTargetingTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_89674afbd6140ba4, []int{0}
+}
+
+func (m *GeoTargetingTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GeoTargetingTypeEnum.Unmarshal(m, b)
+}
+func (m *GeoTargetingTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GeoTargetingTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *GeoTargetingTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GeoTargetingTypeEnum.Merge(m, src)
+}
+func (m *GeoTargetingTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_GeoTargetingTypeEnum.Size(m)
+}
+func (m *GeoTargetingTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_GeoTargetingTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GeoTargetingTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.GeoTargetingTypeEnum_GeoTargetingType", GeoTargetingTypeEnum_GeoTargetingType_name, GeoTargetingTypeEnum_GeoTargetingType_value)
+	proto.RegisterType((*GeoTargetingTypeEnum)(nil), "google.ads.googleads.v3.enums.GeoTargetingTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/geo_targeting_type.proto", fileDescriptor_89674afbd6140ba4)
+}
+
+var fileDescriptor_89674afbd6140ba4 = []byte{
+	// 321 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x1c, 0x76, 0x1d, 0x28, 0x64, 0x07, 0x4b, 0x99, 0x20, 0xe2, 0x0e, 0xdb, 0x03, 0xa4, 0x87, 0x82,
+	0x87, 0x78, 0xca, 0x66, 0x36, 0x8a, 0x92, 0x96, 0xad, 0x9b, 0x20, 0x85, 0x5a, 0x6d, 0x08, 0x85,
+	0x2d, 0x29, 0x4b, 0x36, 0xdc, 0xeb, 0x78, 0xf4, 0x51, 0x7c, 0x94, 0x3d, 0x85, 0x34, 0xb1, 0x3d,
+	0x0c, 0xf4, 0x12, 0x3e, 0x7e, 0xdf, 0x1f, 0xbe, 0x7c, 0xe0, 0x8e, 0x4b, 0xc9, 0xd7, 0xcc, 0xcf,
+	0x0b, 0xe5, 0x5b, 0x58, 0xa3, 0x7d, 0xe0, 0x33, 0xb1, 0xdb, 0x28, 0x9f, 0x33, 0x99, 0xe9, 0x7c,
+	0xcb, 0x99, 0x2e, 0x05, 0xcf, 0xf4, 0xa1, 0x62, 0xb0, 0xda, 0x4a, 0x2d, 0xbd, 0x81, 0x15, 0xc3,
+	0xbc, 0x50, 0xb0, 0xf5, 0xc1, 0x7d, 0x00, 0x8d, 0xef, 0xe6, 0xb6, 0x89, 0xad, 0x4a, 0x3f, 0x17,
+	0x42, 0xea, 0x5c, 0x97, 0x52, 0x28, 0x6b, 0x1e, 0x7d, 0x80, 0xfe, 0x8c, 0xc9, 0xa4, 0xc9, 0x4d,
+	0x0e, 0x15, 0x23, 0x62, 0xb7, 0x19, 0xbd, 0x02, 0xf7, 0xf4, 0xee, 0x5d, 0x82, 0xde, 0x92, 0x2e,
+	0x62, 0x32, 0x09, 0xa7, 0x21, 0x79, 0x70, 0xcf, 0xbc, 0x1e, 0xb8, 0x58, 0xd2, 0x47, 0x1a, 0x3d,
+	0x53, 0xb7, 0xe3, 0xf5, 0x81, 0x8b, 0xe7, 0x04, 0x67, 0xd1, 0x34, 0x0b, 0x69, 0x42, 0xe6, 0x64,
+	0x91, 0xb8, 0x8e, 0x77, 0x0d, 0xfa, 0x4f, 0xd1, 0x04, 0x27, 0x61, 0x44, 0x6b, 0x26, 0x9e, 0x93,
+	0x05, 0xa1, 0x13, 0xe2, 0x76, 0xc7, 0xc7, 0x0e, 0x18, 0xbe, 0xcb, 0x0d, 0xfc, 0xb7, 0xfd, 0xf8,
+	0xea, 0xb4, 0x45, 0x5c, 0xd7, 0x8e, 0x3b, 0x2f, 0xe3, 0x5f, 0x1f, 0x97, 0xeb, 0x5c, 0x70, 0x28,
+	0xb7, 0xdc, 0xe7, 0x4c, 0x98, 0x4f, 0x35, 0xeb, 0x55, 0xa5, 0xfa, 0x63, 0xcc, 0x7b, 0xf3, 0x7e,
+	0x3a, 0xdd, 0x19, 0xc6, 0x5f, 0xce, 0x60, 0x66, 0xa3, 0x70, 0xa1, 0xa0, 0x85, 0x35, 0x5a, 0x05,
+	0xb0, 0x5e, 0x42, 0x7d, 0x37, 0x7c, 0x8a, 0x0b, 0x95, 0xb6, 0x7c, 0xba, 0x0a, 0x52, 0xc3, 0x1f,
+	0x9d, 0xa1, 0x3d, 0x22, 0x84, 0x0b, 0x85, 0x50, 0xab, 0x40, 0x68, 0x15, 0x20, 0x64, 0x34, 0x6f,
+	0xe7, 0xa6, 0x58, 0xf0, 0x13, 0x00, 0x00, 0xff, 0xff, 0xcd, 0x2a, 0xe0, 0x62, 0xe4, 0x01, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/google_ads_field_category.pb.go b/googleapis/ads/googleads/v3/enums/google_ads_field_category.pb.go
new file mode 100644
index 0000000..ca20ed0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/google_ads_field_category.pb.go
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/google_ads_field_category.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The category of the artifact.
+type GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory int32
+
+const (
+	// Unspecified
+	GoogleAdsFieldCategoryEnum_UNSPECIFIED GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory = 0
+	// Unknown
+	GoogleAdsFieldCategoryEnum_UNKNOWN GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory = 1
+	// The described artifact is a resource.
+	GoogleAdsFieldCategoryEnum_RESOURCE GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory = 2
+	// The described artifact is a field and is an attribute of a resource.
+	// Including a resource attribute field in a query may segment the query if
+	// the resource to which it is attributed segments the resource found in
+	// the FROM clause.
+	GoogleAdsFieldCategoryEnum_ATTRIBUTE GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory = 3
+	// The described artifact is a field and always segments search queries.
+	GoogleAdsFieldCategoryEnum_SEGMENT GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory = 5
+	// The described artifact is a field and is a metric. It never segments
+	// search queries.
+	GoogleAdsFieldCategoryEnum_METRIC GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory = 6
+)
+
+var GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "RESOURCE",
+	3: "ATTRIBUTE",
+	5: "SEGMENT",
+	6: "METRIC",
+}
+
+var GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"RESOURCE":    2,
+	"ATTRIBUTE":   3,
+	"SEGMENT":     5,
+	"METRIC":      6,
+}
+
+func (x GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory) String() string {
+	return proto.EnumName(GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory_name, int32(x))
+}
+
+func (GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_da64c7d50b3b5323, []int{0, 0}
+}
+
+// Container for enum that determines if the described artifact is a resource
+// or a field, and if it is a field, when it segments search queries.
+type GoogleAdsFieldCategoryEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GoogleAdsFieldCategoryEnum) Reset()         { *m = GoogleAdsFieldCategoryEnum{} }
+func (m *GoogleAdsFieldCategoryEnum) String() string { return proto.CompactTextString(m) }
+func (*GoogleAdsFieldCategoryEnum) ProtoMessage()    {}
+func (*GoogleAdsFieldCategoryEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da64c7d50b3b5323, []int{0}
+}
+
+func (m *GoogleAdsFieldCategoryEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GoogleAdsFieldCategoryEnum.Unmarshal(m, b)
+}
+func (m *GoogleAdsFieldCategoryEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GoogleAdsFieldCategoryEnum.Marshal(b, m, deterministic)
+}
+func (m *GoogleAdsFieldCategoryEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GoogleAdsFieldCategoryEnum.Merge(m, src)
+}
+func (m *GoogleAdsFieldCategoryEnum) XXX_Size() int {
+	return xxx_messageInfo_GoogleAdsFieldCategoryEnum.Size(m)
+}
+func (m *GoogleAdsFieldCategoryEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_GoogleAdsFieldCategoryEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GoogleAdsFieldCategoryEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory", GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory_name, GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory_value)
+	proto.RegisterType((*GoogleAdsFieldCategoryEnum)(nil), "google.ads.googleads.v3.enums.GoogleAdsFieldCategoryEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/google_ads_field_category.proto", fileDescriptor_da64c7d50b3b5323)
+}
+
+var fileDescriptor_da64c7d50b3b5323 = []byte{
+	// 339 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0xe3, 0x30,
+	0x14, 0x9e, 0xa4, 0x9a, 0xce, 0x8c, 0x3b, 0x88, 0x28, 0x0b, 0x16, 0x85, 0x2e, 0xda, 0x03, 0x38,
+	0x8b, 0xec, 0x8c, 0x58, 0x38, 0xc1, 0xad, 0x22, 0xd4, 0xb4, 0x4a, 0x93, 0x22, 0xa1, 0x48, 0x95,
+	0xa9, 0x83, 0x15, 0x29, 0xb5, 0xab, 0x3a, 0xad, 0xc4, 0x15, 0x38, 0x06, 0x4b, 0x8e, 0xc2, 0x51,
+	0x58, 0x71, 0x04, 0x14, 0xa7, 0xc9, 0xaa, 0xb0, 0xb1, 0xac, 0xf7, 0xfd, 0xbc, 0xf7, 0x7d, 0xe0,
+	0x86, 0x4b, 0xc9, 0x8b, 0xcc, 0xa1, 0x4c, 0x39, 0xf5, 0xb7, 0xfa, 0x1d, 0x5c, 0x27, 0x13, 0xfb,
+	0x4d, 0x33, 0x5a, 0x51, 0xa6, 0x56, 0x4f, 0x79, 0x56, 0xb0, 0xd5, 0x9a, 0x96, 0x19, 0x97, 0xbb,
+	0x67, 0xb8, 0xdd, 0xc9, 0x52, 0xda, 0x83, 0x9a, 0x00, 0x29, 0x53, 0xb0, 0x95, 0xc3, 0x83, 0x0b,
+	0xb5, 0xbc, 0x7f, 0xd5, 0xb8, 0x6f, 0x73, 0x87, 0x0a, 0x21, 0x4b, 0x5a, 0xe6, 0x52, 0xa8, 0x5a,
+	0x3c, 0x7a, 0x31, 0x40, 0x7f, 0xa2, 0x09, 0x98, 0xa9, 0x71, 0x65, 0xef, 0x1f, 0xdd, 0x89, 0xd8,
+	0x6f, 0x46, 0x05, 0xb8, 0x38, 0x8d, 0xda, 0xe7, 0xa0, 0x97, 0x84, 0x8b, 0x39, 0xf1, 0x83, 0x71,
+	0x40, 0x6e, 0xad, 0x5f, 0x76, 0x0f, 0xfc, 0x49, 0xc2, 0xbb, 0x70, 0x76, 0x1f, 0x5a, 0x86, 0xfd,
+	0x1f, 0xfc, 0x8d, 0xc8, 0x62, 0x96, 0x44, 0x3e, 0xb1, 0x4c, 0xfb, 0x0c, 0xfc, 0xc3, 0x71, 0x1c,
+	0x05, 0x5e, 0x12, 0x13, 0xab, 0x53, 0x31, 0x17, 0x64, 0x32, 0x25, 0x61, 0x6c, 0xfd, 0xb6, 0x01,
+	0xe8, 0x4e, 0x49, 0x1c, 0x05, 0xbe, 0xd5, 0xf5, 0x3e, 0x0d, 0x30, 0x5c, 0xcb, 0x0d, 0xfc, 0x31,
+	0x90, 0x77, 0x79, 0xfa, 0xa2, 0x79, 0x95, 0x67, 0x6e, 0x3c, 0x78, 0x47, 0x35, 0x97, 0x05, 0x15,
+	0x1c, 0xca, 0x1d, 0x77, 0x78, 0x26, 0x74, 0xda, 0xa6, 0xdd, 0x6d, 0xae, 0xbe, 0x29, 0xfb, 0x5a,
+	0xbf, 0xaf, 0x66, 0x67, 0x82, 0xf1, 0x9b, 0x39, 0xa8, 0x37, 0x41, 0xcc, 0x14, 0x6c, 0x97, 0xc2,
+	0xa5, 0x0b, 0xab, 0x6e, 0xd4, 0x7b, 0x83, 0xa7, 0x98, 0xa9, 0xb4, 0xc5, 0xd3, 0xa5, 0x9b, 0x6a,
+	0xfc, 0xc3, 0x1c, 0xd6, 0x43, 0x84, 0x30, 0x53, 0x08, 0xb5, 0x0c, 0x84, 0x96, 0x2e, 0x42, 0x9a,
+	0xf3, 0xd8, 0xd5, 0x87, 0xb9, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf9, 0x4f, 0xe4, 0x9a, 0x04,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/google_ads_field_data_type.pb.go b/googleapis/ads/googleads/v3/enums/google_ads_field_data_type.pb.go
new file mode 100644
index 0000000..9d3b483
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/google_ads_field_data_type.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/google_ads_field_data_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// These are the various types a GoogleAdsService artifact may take on.
+type GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType int32
+
+const (
+	// Unspecified
+	GoogleAdsFieldDataTypeEnum_UNSPECIFIED GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 0
+	// Unknown
+	GoogleAdsFieldDataTypeEnum_UNKNOWN GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 1
+	// Maps to google.protobuf.BoolValue
+	//
+	// Applicable operators:  =, !=
+	GoogleAdsFieldDataTypeEnum_BOOLEAN GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 2
+	// Maps to google.protobuf.StringValue. It can be compared using the set of
+	// operators specific to dates however.
+	//
+	// Applicable operators:  =, <, >, <=, >=, BETWEEN, DURING, and IN
+	GoogleAdsFieldDataTypeEnum_DATE GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 3
+	// Maps to google.protobuf.DoubleValue
+	//
+	// Applicable operators:  =, !=, <, >, IN, NOT IN
+	GoogleAdsFieldDataTypeEnum_DOUBLE GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 4
+	// Maps to an enum. It's specific definition can be found at type_url.
+	//
+	// Applicable operators:  =, !=, IN, NOT IN
+	GoogleAdsFieldDataTypeEnum_ENUM GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 5
+	// Maps to google.protobuf.FloatValue
+	//
+	// Applicable operators:  =, !=, <, >, IN, NOT IN
+	GoogleAdsFieldDataTypeEnum_FLOAT GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 6
+	// Maps to google.protobuf.Int32Value
+	//
+	// Applicable operators:  =, !=, <, >, <=, >=, BETWEEN, IN, NOT IN
+	GoogleAdsFieldDataTypeEnum_INT32 GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 7
+	// Maps to google.protobuf.Int64Value
+	//
+	// Applicable operators:  =, !=, <, >, <=, >=, BETWEEN, IN, NOT IN
+	GoogleAdsFieldDataTypeEnum_INT64 GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 8
+	// Maps to a protocol buffer message type. The data type's details can be
+	// found in type_url.
+	//
+	// No operators work with MESSAGE fields.
+	GoogleAdsFieldDataTypeEnum_MESSAGE GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 9
+	// Maps to google.protobuf.StringValue. Represents the resource name
+	// (unique id) of a resource or one of its foreign keys.
+	//
+	// No operators work with RESOURCE_NAME fields.
+	GoogleAdsFieldDataTypeEnum_RESOURCE_NAME GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 10
+	// Maps to google.protobuf.StringValue.
+	//
+	// Applicable operators:  =, !=, LIKE, NOT LIKE, IN, NOT IN
+	GoogleAdsFieldDataTypeEnum_STRING GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 11
+	// Maps to google.protobuf.UInt64Value
+	//
+	// Applicable operators:  =, !=, <, >, <=, >=, BETWEEN, IN, NOT IN
+	GoogleAdsFieldDataTypeEnum_UINT64 GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType = 12
+)
+
+var GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "BOOLEAN",
+	3:  "DATE",
+	4:  "DOUBLE",
+	5:  "ENUM",
+	6:  "FLOAT",
+	7:  "INT32",
+	8:  "INT64",
+	9:  "MESSAGE",
+	10: "RESOURCE_NAME",
+	11: "STRING",
+	12: "UINT64",
+}
+
+var GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"BOOLEAN":       2,
+	"DATE":          3,
+	"DOUBLE":        4,
+	"ENUM":          5,
+	"FLOAT":         6,
+	"INT32":         7,
+	"INT64":         8,
+	"MESSAGE":       9,
+	"RESOURCE_NAME": 10,
+	"STRING":        11,
+	"UINT64":        12,
+}
+
+func (x GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType) String() string {
+	return proto.EnumName(GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType_name, int32(x))
+}
+
+func (GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_77e81755cfd3557b, []int{0, 0}
+}
+
+// Container holding the various data types.
+type GoogleAdsFieldDataTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GoogleAdsFieldDataTypeEnum) Reset()         { *m = GoogleAdsFieldDataTypeEnum{} }
+func (m *GoogleAdsFieldDataTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*GoogleAdsFieldDataTypeEnum) ProtoMessage()    {}
+func (*GoogleAdsFieldDataTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_77e81755cfd3557b, []int{0}
+}
+
+func (m *GoogleAdsFieldDataTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GoogleAdsFieldDataTypeEnum.Unmarshal(m, b)
+}
+func (m *GoogleAdsFieldDataTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GoogleAdsFieldDataTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *GoogleAdsFieldDataTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GoogleAdsFieldDataTypeEnum.Merge(m, src)
+}
+func (m *GoogleAdsFieldDataTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_GoogleAdsFieldDataTypeEnum.Size(m)
+}
+func (m *GoogleAdsFieldDataTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_GoogleAdsFieldDataTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GoogleAdsFieldDataTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType", GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType_name, GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType_value)
+	proto.RegisterType((*GoogleAdsFieldDataTypeEnum)(nil), "google.ads.googleads.v3.enums.GoogleAdsFieldDataTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/google_ads_field_data_type.proto", fileDescriptor_77e81755cfd3557b)
+}
+
+var fileDescriptor_77e81755cfd3557b = []byte{
+	// 397 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xcf, 0x8e, 0x93, 0x40,
+	0x18, 0x17, 0x76, 0xb7, 0xbb, 0x3b, 0xd5, 0x38, 0x72, 0xf0, 0xb0, 0xba, 0x87, 0xed, 0x03, 0x0c,
+	0x89, 0x18, 0x0f, 0x63, 0x62, 0x32, 0x94, 0x29, 0x21, 0xb6, 0x43, 0x53, 0xa0, 0x26, 0x86, 0x84,
+	0x8c, 0x0e, 0x12, 0x92, 0x96, 0x21, 0x1d, 0xda, 0xa4, 0xaf, 0xe3, 0xd1, 0x67, 0xf0, 0x09, 0x7c,
+	0x05, 0xdf, 0xc0, 0x93, 0x8f, 0x60, 0x06, 0x0a, 0xa7, 0xba, 0x17, 0xf2, 0xe3, 0xfb, 0xfd, 0xf9,
+	0xe0, 0xf7, 0x81, 0x0f, 0x85, 0x94, 0xc5, 0x26, 0xb7, 0xb9, 0x50, 0x76, 0x07, 0x35, 0x3a, 0x38,
+	0x76, 0x5e, 0xed, 0xb7, 0xfd, 0x28, 0xe3, 0x42, 0x65, 0xdf, 0xca, 0x7c, 0x23, 0x32, 0xc1, 0x1b,
+	0x9e, 0x35, 0xc7, 0x3a, 0x47, 0xf5, 0x4e, 0x36, 0xd2, 0xba, 0xef, 0x14, 0x88, 0x0b, 0x85, 0x06,
+	0x3f, 0x3a, 0x38, 0xa8, 0xf5, 0xdf, 0xbd, 0xee, 0xe3, 0xeb, 0xd2, 0xe6, 0x55, 0x25, 0x1b, 0xde,
+	0x94, 0xb2, 0x52, 0x9d, 0x79, 0xf2, 0xdb, 0x00, 0x77, 0x7e, 0x2b, 0x20, 0x42, 0xcd, 0x74, 0xbe,
+	0xc7, 0x1b, 0x1e, 0x1f, 0xeb, 0x9c, 0x56, 0xfb, 0xed, 0xe4, 0xa7, 0x01, 0x5e, 0x9e, 0xa7, 0xad,
+	0xe7, 0x60, 0x9c, 0xb0, 0x68, 0x49, 0xa7, 0xc1, 0x2c, 0xa0, 0x1e, 0x7c, 0x62, 0x8d, 0xc1, 0x75,
+	0xc2, 0x3e, 0xb2, 0xf0, 0x13, 0x83, 0x86, 0x7e, 0x71, 0xc3, 0x70, 0x4e, 0x09, 0x83, 0xa6, 0x75,
+	0x03, 0x2e, 0x3d, 0x12, 0x53, 0x78, 0x61, 0x01, 0x30, 0xf2, 0xc2, 0xc4, 0x9d, 0x53, 0x78, 0xa9,
+	0xa7, 0x94, 0x25, 0x0b, 0x78, 0x65, 0xdd, 0x82, 0xab, 0xd9, 0x3c, 0x24, 0x31, 0x1c, 0x69, 0x18,
+	0xb0, 0xd8, 0x79, 0x03, 0xaf, 0x4f, 0xf0, 0xdd, 0x5b, 0x78, 0xa3, 0xd3, 0x16, 0x34, 0x8a, 0x88,
+	0x4f, 0xe1, 0xad, 0xf5, 0x02, 0x3c, 0x5b, 0xd1, 0x28, 0x4c, 0x56, 0x53, 0x9a, 0x31, 0xb2, 0xa0,
+	0x10, 0xe8, 0xd8, 0x28, 0x5e, 0x05, 0xcc, 0x87, 0x63, 0x8d, 0x93, 0xce, 0xf7, 0xd4, 0xfd, 0x6b,
+	0x80, 0x87, 0xaf, 0x72, 0x8b, 0x1e, 0x6d, 0xc8, 0x7d, 0x75, 0xfe, 0x0f, 0x97, 0xba, 0xa0, 0xa5,
+	0xf1, 0xd9, 0x3d, 0xb9, 0x0b, 0xb9, 0xe1, 0x55, 0x81, 0xe4, 0xae, 0xb0, 0x8b, 0xbc, 0x6a, 0xeb,
+	0xeb, 0xef, 0x55, 0x97, 0xea, 0x3f, 0xe7, 0x7b, 0xdf, 0x3e, 0xbf, 0x9b, 0x17, 0x3e, 0x21, 0x3f,
+	0xcc, 0xfb, 0x6e, 0x13, 0x22, 0x42, 0xa1, 0x61, 0x29, 0x5a, 0x3b, 0x48, 0x97, 0xad, 0x7e, 0xf5,
+	0x7c, 0x4a, 0x84, 0x4a, 0x07, 0x3e, 0x5d, 0x3b, 0x69, 0xcb, 0xff, 0x31, 0x1f, 0xba, 0x21, 0xc6,
+	0x44, 0x28, 0x8c, 0x07, 0x05, 0xc6, 0x6b, 0x07, 0xe3, 0x56, 0xf3, 0x65, 0xd4, 0x7e, 0x98, 0xf3,
+	0x2f, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x94, 0x9b, 0x29, 0x56, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/hotel_date_selection_type.pb.go b/googleapis/ads/googleads/v3/enums/hotel_date_selection_type.pb.go
new file mode 100644
index 0000000..21bc1cd
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/hotel_date_selection_type.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/hotel_date_selection_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible hotel date selection types.
+type HotelDateSelectionTypeEnum_HotelDateSelectionType int32
+
+const (
+	// Not specified.
+	HotelDateSelectionTypeEnum_UNSPECIFIED HotelDateSelectionTypeEnum_HotelDateSelectionType = 0
+	// Used for return value only. Represents value unknown in this version.
+	HotelDateSelectionTypeEnum_UNKNOWN HotelDateSelectionTypeEnum_HotelDateSelectionType = 1
+	// Dates selected by default.
+	HotelDateSelectionTypeEnum_DEFAULT_SELECTION HotelDateSelectionTypeEnum_HotelDateSelectionType = 50
+	// Dates selected by the user.
+	HotelDateSelectionTypeEnum_USER_SELECTED HotelDateSelectionTypeEnum_HotelDateSelectionType = 51
+)
+
+var HotelDateSelectionTypeEnum_HotelDateSelectionType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	50: "DEFAULT_SELECTION",
+	51: "USER_SELECTED",
+}
+
+var HotelDateSelectionTypeEnum_HotelDateSelectionType_value = map[string]int32{
+	"UNSPECIFIED":       0,
+	"UNKNOWN":           1,
+	"DEFAULT_SELECTION": 50,
+	"USER_SELECTED":     51,
+}
+
+func (x HotelDateSelectionTypeEnum_HotelDateSelectionType) String() string {
+	return proto.EnumName(HotelDateSelectionTypeEnum_HotelDateSelectionType_name, int32(x))
+}
+
+func (HotelDateSelectionTypeEnum_HotelDateSelectionType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_9cc39d800b620f94, []int{0, 0}
+}
+
+// Container for enum describing possible hotel date selection types
+type HotelDateSelectionTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HotelDateSelectionTypeEnum) Reset()         { *m = HotelDateSelectionTypeEnum{} }
+func (m *HotelDateSelectionTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*HotelDateSelectionTypeEnum) ProtoMessage()    {}
+func (*HotelDateSelectionTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9cc39d800b620f94, []int{0}
+}
+
+func (m *HotelDateSelectionTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelDateSelectionTypeEnum.Unmarshal(m, b)
+}
+func (m *HotelDateSelectionTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelDateSelectionTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *HotelDateSelectionTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelDateSelectionTypeEnum.Merge(m, src)
+}
+func (m *HotelDateSelectionTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_HotelDateSelectionTypeEnum.Size(m)
+}
+func (m *HotelDateSelectionTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelDateSelectionTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelDateSelectionTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.HotelDateSelectionTypeEnum_HotelDateSelectionType", HotelDateSelectionTypeEnum_HotelDateSelectionType_name, HotelDateSelectionTypeEnum_HotelDateSelectionType_value)
+	proto.RegisterType((*HotelDateSelectionTypeEnum)(nil), "google.ads.googleads.v3.enums.HotelDateSelectionTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/hotel_date_selection_type.proto", fileDescriptor_9cc39d800b620f94)
+}
+
+var fileDescriptor_9cc39d800b620f94 = []byte{
+	// 328 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4a, 0xc3, 0x40,
+	0x14, 0xb4, 0x15, 0x14, 0xb6, 0x88, 0x69, 0x40, 0x0f, 0xd5, 0x1e, 0xda, 0x0f, 0xd8, 0x80, 0x7b,
+	0x5b, 0xf1, 0x90, 0x36, 0xdb, 0x5a, 0x2c, 0x69, 0x31, 0x4d, 0x05, 0x09, 0xc4, 0xb5, 0x59, 0x62,
+	0x21, 0xdd, 0x0d, 0xdd, 0x6d, 0xa1, 0x17, 0x3f, 0xc6, 0xa3, 0x9f, 0xe2, 0xa7, 0x78, 0xf2, 0x13,
+	0x24, 0xbb, 0x4d, 0x4e, 0xd5, 0xcb, 0x63, 0x78, 0xf3, 0x66, 0x78, 0x33, 0xe0, 0x2e, 0x15, 0x22,
+	0xcd, 0x98, 0x43, 0x13, 0xe9, 0x18, 0x58, 0xa0, 0x2d, 0x72, 0x18, 0xdf, 0xac, 0xa4, 0xf3, 0x26,
+	0x14, 0xcb, 0xe2, 0x84, 0x2a, 0x16, 0x4b, 0x96, 0xb1, 0x85, 0x5a, 0x0a, 0x1e, 0xab, 0x5d, 0xce,
+	0x60, 0xbe, 0x16, 0x4a, 0xd8, 0x6d, 0xa3, 0x81, 0x34, 0x91, 0xb0, 0x92, 0xc3, 0x2d, 0x82, 0x5a,
+	0xde, 0xba, 0x2e, 0xdd, 0xf3, 0xa5, 0x43, 0x39, 0x17, 0x8a, 0x16, 0x06, 0xd2, 0x88, 0xbb, 0xef,
+	0xa0, 0x75, 0x5f, 0xf8, 0x7b, 0x54, 0xb1, 0xa0, 0x74, 0x9f, 0xed, 0x72, 0x46, 0xf8, 0x66, 0xd5,
+	0x7d, 0x01, 0x97, 0x87, 0x59, 0xfb, 0x1c, 0x34, 0x42, 0x3f, 0x98, 0x92, 0xfe, 0x68, 0x30, 0x22,
+	0x9e, 0x75, 0x64, 0x37, 0xc0, 0x69, 0xe8, 0x3f, 0xf8, 0x93, 0x27, 0xdf, 0xaa, 0xd9, 0x17, 0xa0,
+	0xe9, 0x91, 0x81, 0x1b, 0x8e, 0x67, 0x71, 0x40, 0xc6, 0xa4, 0x3f, 0x1b, 0x4d, 0x7c, 0xeb, 0xc6,
+	0x6e, 0x82, 0xb3, 0x30, 0x20, 0x8f, 0xfb, 0x1d, 0xf1, 0x2c, 0xd4, 0xfb, 0xa9, 0x81, 0xce, 0x42,
+	0xac, 0xe0, 0xbf, 0x19, 0x7a, 0x57, 0x87, 0xbf, 0x98, 0x16, 0x11, 0xa6, 0xb5, 0xe7, 0xde, 0x5e,
+	0x9d, 0x8a, 0x8c, 0xf2, 0x14, 0x8a, 0x75, 0xea, 0xa4, 0x8c, 0xeb, 0x80, 0x65, 0xa1, 0xf9, 0x52,
+	0xfe, 0xd1, 0xef, 0xad, 0x9e, 0x1f, 0xf5, 0xe3, 0xa1, 0xeb, 0x7e, 0xd6, 0xdb, 0x43, 0x63, 0xe5,
+	0x26, 0x12, 0x1a, 0x58, 0xa0, 0x39, 0x82, 0x45, 0x1f, 0xf2, 0xab, 0xe4, 0x23, 0x37, 0x91, 0x51,
+	0xc5, 0x47, 0x73, 0x14, 0x69, 0xfe, 0xbb, 0xde, 0x31, 0x4b, 0x8c, 0xdd, 0x44, 0x62, 0x5c, 0x5d,
+	0x60, 0x3c, 0x47, 0x18, 0xeb, 0x9b, 0xd7, 0x13, 0xfd, 0x18, 0xfa, 0x0d, 0x00, 0x00, 0xff, 0xff,
+	0x00, 0x57, 0x9c, 0xba, 0xf7, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/hotel_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/hotel_placeholder_field.pb.go
new file mode 100644
index 0000000..22c8e94
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/hotel_placeholder_field.pb.go
@@ -0,0 +1,230 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/hotel_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Hotel placeholder fields.
+type HotelPlaceholderFieldEnum_HotelPlaceholderField int32
+
+const (
+	// Not specified.
+	HotelPlaceholderFieldEnum_UNSPECIFIED HotelPlaceholderFieldEnum_HotelPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	HotelPlaceholderFieldEnum_UNKNOWN HotelPlaceholderFieldEnum_HotelPlaceholderField = 1
+	// Data Type: STRING. Required. Unique ID.
+	HotelPlaceholderFieldEnum_PROPERTY_ID HotelPlaceholderFieldEnum_HotelPlaceholderField = 2
+	// Data Type: STRING. Required. Main headline with property name to be shown
+	// in dynamic ad.
+	HotelPlaceholderFieldEnum_PROPERTY_NAME HotelPlaceholderFieldEnum_HotelPlaceholderField = 3
+	// Data Type: STRING. Name of destination to be shown in dynamic ad.
+	HotelPlaceholderFieldEnum_DESTINATION_NAME HotelPlaceholderFieldEnum_HotelPlaceholderField = 4
+	// Data Type: STRING. Description of destination to be shown in dynamic ad.
+	HotelPlaceholderFieldEnum_DESCRIPTION HotelPlaceholderFieldEnum_HotelPlaceholderField = 5
+	// Data Type: STRING. Complete property address, including postal code.
+	HotelPlaceholderFieldEnum_ADDRESS HotelPlaceholderFieldEnum_HotelPlaceholderField = 6
+	// Data Type: STRING. Price to be shown in the ad.
+	// Example: "100.00 USD"
+	HotelPlaceholderFieldEnum_PRICE HotelPlaceholderFieldEnum_HotelPlaceholderField = 7
+	// Data Type: STRING. Formatted price to be shown in the ad.
+	// Example: "Starting at $100.00 USD", "$80 - $100"
+	HotelPlaceholderFieldEnum_FORMATTED_PRICE HotelPlaceholderFieldEnum_HotelPlaceholderField = 8
+	// Data Type: STRING. Sale price to be shown in the ad.
+	// Example: "80.00 USD"
+	HotelPlaceholderFieldEnum_SALE_PRICE HotelPlaceholderFieldEnum_HotelPlaceholderField = 9
+	// Data Type: STRING. Formatted sale price to be shown in the ad.
+	// Example: "On sale for $80.00", "$60 - $80"
+	HotelPlaceholderFieldEnum_FORMATTED_SALE_PRICE HotelPlaceholderFieldEnum_HotelPlaceholderField = 10
+	// Data Type: URL. Image to be displayed in the ad.
+	HotelPlaceholderFieldEnum_IMAGE_URL HotelPlaceholderFieldEnum_HotelPlaceholderField = 11
+	// Data Type: STRING. Category of property used to group like items together
+	// for recommendation engine.
+	HotelPlaceholderFieldEnum_CATEGORY HotelPlaceholderFieldEnum_HotelPlaceholderField = 12
+	// Data Type: INT64. Star rating (1 to 5) used to group like items
+	// together for recommendation engine.
+	HotelPlaceholderFieldEnum_STAR_RATING HotelPlaceholderFieldEnum_HotelPlaceholderField = 13
+	// Data Type: STRING_LIST. Keywords used for product retrieval.
+	HotelPlaceholderFieldEnum_CONTEXTUAL_KEYWORDS HotelPlaceholderFieldEnum_HotelPlaceholderField = 14
+	// Data Type: URL_LIST. Required. Final URLs for the ad when using Upgraded
+	// URLs. User will be redirected to these URLs when they click on an ad, or
+	// when they click on a specific flight for ads that show multiple
+	// flights.
+	HotelPlaceholderFieldEnum_FINAL_URLS HotelPlaceholderFieldEnum_HotelPlaceholderField = 15
+	// Data Type: URL_LIST. Final mobile URLs for the ad when using Upgraded
+	// URLs.
+	HotelPlaceholderFieldEnum_FINAL_MOBILE_URLS HotelPlaceholderFieldEnum_HotelPlaceholderField = 16
+	// Data Type: URL. Tracking template for the ad when using Upgraded URLs.
+	HotelPlaceholderFieldEnum_TRACKING_URL HotelPlaceholderFieldEnum_HotelPlaceholderField = 17
+	// Data Type: STRING. Android app link. Must be formatted as:
+	// android-app://{package_id}/{scheme}/{host_path}.
+	// The components are defined as follows:
+	// package_id: app ID as specified in Google Play.
+	// scheme: the scheme to pass to the application. Can be HTTP, or a custom
+	//   scheme.
+	// host_path: identifies the specific content within your application.
+	HotelPlaceholderFieldEnum_ANDROID_APP_LINK HotelPlaceholderFieldEnum_HotelPlaceholderField = 18
+	// Data Type: STRING_LIST. List of recommended property IDs to show together
+	// with this item.
+	HotelPlaceholderFieldEnum_SIMILAR_PROPERTY_IDS HotelPlaceholderFieldEnum_HotelPlaceholderField = 19
+	// Data Type: STRING. iOS app link.
+	HotelPlaceholderFieldEnum_IOS_APP_LINK HotelPlaceholderFieldEnum_HotelPlaceholderField = 20
+	// Data Type: INT64. iOS app store ID.
+	HotelPlaceholderFieldEnum_IOS_APP_STORE_ID HotelPlaceholderFieldEnum_HotelPlaceholderField = 21
+)
+
+var HotelPlaceholderFieldEnum_HotelPlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "PROPERTY_ID",
+	3:  "PROPERTY_NAME",
+	4:  "DESTINATION_NAME",
+	5:  "DESCRIPTION",
+	6:  "ADDRESS",
+	7:  "PRICE",
+	8:  "FORMATTED_PRICE",
+	9:  "SALE_PRICE",
+	10: "FORMATTED_SALE_PRICE",
+	11: "IMAGE_URL",
+	12: "CATEGORY",
+	13: "STAR_RATING",
+	14: "CONTEXTUAL_KEYWORDS",
+	15: "FINAL_URLS",
+	16: "FINAL_MOBILE_URLS",
+	17: "TRACKING_URL",
+	18: "ANDROID_APP_LINK",
+	19: "SIMILAR_PROPERTY_IDS",
+	20: "IOS_APP_LINK",
+	21: "IOS_APP_STORE_ID",
+}
+
+var HotelPlaceholderFieldEnum_HotelPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"PROPERTY_ID":          2,
+	"PROPERTY_NAME":        3,
+	"DESTINATION_NAME":     4,
+	"DESCRIPTION":          5,
+	"ADDRESS":              6,
+	"PRICE":                7,
+	"FORMATTED_PRICE":      8,
+	"SALE_PRICE":           9,
+	"FORMATTED_SALE_PRICE": 10,
+	"IMAGE_URL":            11,
+	"CATEGORY":             12,
+	"STAR_RATING":          13,
+	"CONTEXTUAL_KEYWORDS":  14,
+	"FINAL_URLS":           15,
+	"FINAL_MOBILE_URLS":    16,
+	"TRACKING_URL":         17,
+	"ANDROID_APP_LINK":     18,
+	"SIMILAR_PROPERTY_IDS": 19,
+	"IOS_APP_LINK":         20,
+	"IOS_APP_STORE_ID":     21,
+}
+
+func (x HotelPlaceholderFieldEnum_HotelPlaceholderField) String() string {
+	return proto.EnumName(HotelPlaceholderFieldEnum_HotelPlaceholderField_name, int32(x))
+}
+
+func (HotelPlaceholderFieldEnum_HotelPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_af03dec519ec03be, []int{0, 0}
+}
+
+// Values for Hotel placeholder fields.
+// For more information about dynamic remarketing feeds, see
+// https://support.google.com/google-ads/answer/6053288.
+type HotelPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HotelPlaceholderFieldEnum) Reset()         { *m = HotelPlaceholderFieldEnum{} }
+func (m *HotelPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*HotelPlaceholderFieldEnum) ProtoMessage()    {}
+func (*HotelPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_af03dec519ec03be, []int{0}
+}
+
+func (m *HotelPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *HotelPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *HotelPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *HotelPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_HotelPlaceholderFieldEnum.Size(m)
+}
+func (m *HotelPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.HotelPlaceholderFieldEnum_HotelPlaceholderField", HotelPlaceholderFieldEnum_HotelPlaceholderField_name, HotelPlaceholderFieldEnum_HotelPlaceholderField_value)
+	proto.RegisterType((*HotelPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.HotelPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/hotel_placeholder_field.proto", fileDescriptor_af03dec519ec03be)
+}
+
+var fileDescriptor_af03dec519ec03be = []byte{
+	// 532 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xcd, 0x8e, 0xda, 0x3c,
+	0x14, 0xfd, 0x80, 0x6f, 0x7e, 0x30, 0x30, 0x18, 0x03, 0xea, 0xef, 0x2c, 0x66, 0x1e, 0x20, 0x59,
+	0x64, 0x97, 0x59, 0x99, 0xc4, 0xa4, 0x16, 0xc1, 0x89, 0x6c, 0xc3, 0x94, 0x0a, 0x29, 0x4a, 0x27,
+	0x69, 0x06, 0x29, 0x24, 0x88, 0x30, 0xf3, 0x40, 0x5d, 0x76, 0xd3, 0xf7, 0xa8, 0xd4, 0x17, 0xe9,
+	0xaa, 0x8f, 0x50, 0x39, 0x19, 0x60, 0x54, 0xb5, 0xdd, 0x44, 0xd7, 0xe7, 0xdc, 0x73, 0x7c, 0xe3,
+	0x7b, 0xc0, 0x4d, 0x92, 0xe7, 0x49, 0x1a, 0xeb, 0x61, 0x54, 0xe8, 0x55, 0xa9, 0xaa, 0x47, 0x43,
+	0x8f, 0xb3, 0x87, 0x75, 0xa1, 0xdf, 0xe7, 0xbb, 0x38, 0x0d, 0x36, 0x69, 0x78, 0x17, 0xdf, 0xe7,
+	0x69, 0x14, 0x6f, 0x83, 0x4f, 0xab, 0x38, 0x8d, 0xb4, 0xcd, 0x36, 0xdf, 0xe5, 0xe8, 0xb2, 0x52,
+	0x68, 0x61, 0x54, 0x68, 0x07, 0xb1, 0xf6, 0x68, 0x68, 0xa5, 0xf8, 0xf5, 0xdb, 0xbd, 0xf7, 0x66,
+	0xa5, 0x87, 0x59, 0x96, 0xef, 0xc2, 0xdd, 0x2a, 0xcf, 0x8a, 0x4a, 0x7c, 0xfd, 0xbd, 0x01, 0x5e,
+	0xbd, 0x53, 0xf6, 0xfe, 0xd1, 0x7d, 0xac, 0xcc, 0x49, 0xf6, 0xb0, 0xbe, 0xfe, 0xda, 0x00, 0xc3,
+	0x3f, 0xb2, 0xa8, 0x0b, 0x5a, 0x33, 0x26, 0x7c, 0x62, 0xd1, 0x31, 0x25, 0x36, 0xfc, 0x0f, 0xb5,
+	0xc0, 0xd9, 0x8c, 0x4d, 0x98, 0x77, 0xcb, 0x60, 0x4d, 0xb1, 0x3e, 0xf7, 0x7c, 0xc2, 0xe5, 0x22,
+	0xa0, 0x36, 0xac, 0xa3, 0x1e, 0xe8, 0x1c, 0x00, 0x86, 0xa7, 0x04, 0x36, 0xd0, 0x00, 0x40, 0x9b,
+	0x08, 0x49, 0x19, 0x96, 0xd4, 0x63, 0x15, 0xfa, 0xbf, 0x52, 0xda, 0x44, 0x58, 0x9c, 0xfa, 0x0a,
+	0x85, 0x27, 0xca, 0x17, 0xdb, 0x36, 0x27, 0x42, 0xc0, 0x53, 0xd4, 0x04, 0x27, 0x3e, 0xa7, 0x16,
+	0x81, 0x67, 0xa8, 0x0f, 0xba, 0x63, 0x8f, 0x4f, 0xb1, 0x94, 0xc4, 0x0e, 0x2a, 0xf0, 0x1c, 0x5d,
+	0x00, 0x20, 0xb0, 0x4b, 0x9e, 0xce, 0x4d, 0xf4, 0x12, 0x0c, 0x8e, 0x4d, 0xcf, 0x18, 0x80, 0x3a,
+	0xa0, 0x49, 0xa7, 0xd8, 0x21, 0xc1, 0x8c, 0xbb, 0xb0, 0x85, 0xda, 0xe0, 0xdc, 0xc2, 0x92, 0x38,
+	0x1e, 0x5f, 0xc0, 0xb6, 0x1a, 0x42, 0x48, 0xcc, 0x03, 0x8e, 0x25, 0x65, 0x0e, 0xec, 0xa0, 0x17,
+	0xa0, 0x6f, 0x79, 0x4c, 0x92, 0xf7, 0x72, 0x86, 0xdd, 0x60, 0x42, 0x16, 0xb7, 0x1e, 0xb7, 0x05,
+	0xbc, 0x50, 0x17, 0x8e, 0x29, 0xc3, 0xae, 0xb2, 0x11, 0xb0, 0x8b, 0x86, 0xa0, 0x57, 0x9d, 0xa7,
+	0xde, 0x88, 0xba, 0xa4, 0x82, 0x21, 0x82, 0xa0, 0x2d, 0x39, 0xb6, 0x26, 0x94, 0x39, 0xe5, 0x85,
+	0x3d, 0xf5, 0xf7, 0x98, 0xd9, 0xdc, 0xa3, 0x76, 0x80, 0x7d, 0x3f, 0x70, 0x29, 0x9b, 0x40, 0xa4,
+	0xe6, 0x15, 0x74, 0x4a, 0x5d, 0xcc, 0x83, 0x67, 0xef, 0x27, 0x60, 0x5f, 0x39, 0x50, 0x4f, 0x1c,
+	0x7b, 0x07, 0xca, 0x61, 0x8f, 0x08, 0xe9, 0x71, 0xa2, 0x1e, 0x7a, 0x38, 0xfa, 0x59, 0x03, 0x57,
+	0x77, 0xf9, 0x5a, 0xfb, 0x67, 0x26, 0x46, 0x6f, 0xca, 0xa5, 0x16, 0xbf, 0x6f, 0xd5, 0x57, 0x91,
+	0xf0, 0x6b, 0x1f, 0x46, 0x4f, 0xea, 0x24, 0x4f, 0xc3, 0x2c, 0xd1, 0xf2, 0x6d, 0xa2, 0x27, 0x71,
+	0x56, 0x06, 0x66, 0x1f, 0xcf, 0xcd, 0xaa, 0xf8, 0x4b, 0x5a, 0x6f, 0xca, 0xef, 0xe7, 0x7a, 0xc3,
+	0xc1, 0xf8, 0x4b, 0xfd, 0xd2, 0xa9, 0xac, 0x70, 0x54, 0x68, 0x55, 0xa9, 0xaa, 0xb9, 0xa1, 0xa9,
+	0x7c, 0x15, 0xdf, 0xf6, 0xfc, 0x12, 0x47, 0xc5, 0xf2, 0xc0, 0x2f, 0xe7, 0xc6, 0xb2, 0xe4, 0x7f,
+	0xd4, 0xaf, 0x2a, 0xd0, 0x34, 0x71, 0x54, 0x98, 0xe6, 0xa1, 0xc3, 0x34, 0xe7, 0x86, 0x69, 0x96,
+	0x3d, 0x1f, 0x4f, 0xcb, 0xc1, 0x8c, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x61, 0x73, 0x43, 0x77,
+	0x45, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/hotel_price_bucket.pb.go b/googleapis/ads/googleads/v3/enums/hotel_price_bucket.pb.go
new file mode 100644
index 0000000..e93ce51
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/hotel_price_bucket.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/hotel_price_bucket.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible hotel price buckets.
+type HotelPriceBucketEnum_HotelPriceBucket int32
+
+const (
+	// Not specified.
+	HotelPriceBucketEnum_UNSPECIFIED HotelPriceBucketEnum_HotelPriceBucket = 0
+	// The value is unknown in this version.
+	HotelPriceBucketEnum_UNKNOWN HotelPriceBucketEnum_HotelPriceBucket = 1
+	// Tied for lowest price. Partner is within a small variance of the lowest
+	// price.
+	HotelPriceBucketEnum_LOWEST_TIED HotelPriceBucketEnum_HotelPriceBucket = 3
+	// Not lowest price. Partner is not within a small variance of the lowest
+	// price.
+	HotelPriceBucketEnum_NOT_LOWEST HotelPriceBucketEnum_HotelPriceBucket = 4
+)
+
+var HotelPriceBucketEnum_HotelPriceBucket_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	3: "LOWEST_TIED",
+	4: "NOT_LOWEST",
+}
+
+var HotelPriceBucketEnum_HotelPriceBucket_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"LOWEST_TIED": 3,
+	"NOT_LOWEST":  4,
+}
+
+func (x HotelPriceBucketEnum_HotelPriceBucket) String() string {
+	return proto.EnumName(HotelPriceBucketEnum_HotelPriceBucket_name, int32(x))
+}
+
+func (HotelPriceBucketEnum_HotelPriceBucket) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_16ae25469274b7fb, []int{0, 0}
+}
+
+// Container for enum describing hotel price bucket for a hotel itinerary.
+type HotelPriceBucketEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HotelPriceBucketEnum) Reset()         { *m = HotelPriceBucketEnum{} }
+func (m *HotelPriceBucketEnum) String() string { return proto.CompactTextString(m) }
+func (*HotelPriceBucketEnum) ProtoMessage()    {}
+func (*HotelPriceBucketEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_16ae25469274b7fb, []int{0}
+}
+
+func (m *HotelPriceBucketEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelPriceBucketEnum.Unmarshal(m, b)
+}
+func (m *HotelPriceBucketEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelPriceBucketEnum.Marshal(b, m, deterministic)
+}
+func (m *HotelPriceBucketEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelPriceBucketEnum.Merge(m, src)
+}
+func (m *HotelPriceBucketEnum) XXX_Size() int {
+	return xxx_messageInfo_HotelPriceBucketEnum.Size(m)
+}
+func (m *HotelPriceBucketEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelPriceBucketEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelPriceBucketEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.HotelPriceBucketEnum_HotelPriceBucket", HotelPriceBucketEnum_HotelPriceBucket_name, HotelPriceBucketEnum_HotelPriceBucket_value)
+	proto.RegisterType((*HotelPriceBucketEnum)(nil), "google.ads.googleads.v3.enums.HotelPriceBucketEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/hotel_price_bucket.proto", fileDescriptor_16ae25469274b7fb)
+}
+
+var fileDescriptor_16ae25469274b7fb = []byte{
+	// 308 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4b, 0xfb, 0x30,
+	0x18, 0xfe, 0x6d, 0xfb, 0xa1, 0x90, 0x81, 0x96, 0xa2, 0x17, 0x71, 0x87, 0xed, 0x03, 0x24, 0x87,
+	0x80, 0x87, 0x78, 0x6a, 0xb5, 0xce, 0xa1, 0x74, 0x95, 0x6d, 0x1d, 0x48, 0xa1, 0x74, 0x6d, 0x88,
+	0xc5, 0x36, 0x29, 0x4d, 0xbb, 0x0f, 0xe4, 0xd1, 0x8f, 0xe2, 0x47, 0xd9, 0xa7, 0x90, 0x24, 0xb6,
+	0x87, 0x81, 0x5e, 0xc2, 0xc3, 0xfb, 0xfc, 0xc9, 0xf3, 0xbe, 0xe0, 0x86, 0x09, 0xc1, 0x0a, 0x8a,
+	0x92, 0x4c, 0x22, 0x03, 0x15, 0xda, 0x63, 0x44, 0x79, 0x5b, 0x4a, 0xf4, 0x26, 0x1a, 0x5a, 0xc4,
+	0x55, 0x9d, 0xa7, 0x34, 0xde, 0xb5, 0xe9, 0x3b, 0x6d, 0x60, 0x55, 0x8b, 0x46, 0xd8, 0x13, 0x23,
+	0x86, 0x49, 0x26, 0x61, 0xef, 0x83, 0x7b, 0x0c, 0xb5, 0xef, 0xea, 0xba, 0x8b, 0xad, 0x72, 0x94,
+	0x70, 0x2e, 0x9a, 0xa4, 0xc9, 0x05, 0x97, 0xc6, 0x3c, 0xcb, 0xc1, 0xc5, 0xa3, 0x0a, 0x0e, 0x54,
+	0xae, 0xab, 0x63, 0x3d, 0xde, 0x96, 0xb3, 0x17, 0x60, 0x1d, 0xcf, 0xed, 0x73, 0x30, 0xde, 0xf8,
+	0xab, 0xc0, 0xbb, 0x5b, 0x3c, 0x2c, 0xbc, 0x7b, 0xeb, 0x9f, 0x3d, 0x06, 0xa7, 0x1b, 0xff, 0xc9,
+	0x5f, 0x6e, 0x7d, 0x6b, 0xa0, 0xd8, 0xe7, 0xe5, 0xd6, 0x5b, 0xad, 0xe3, 0xb5, 0x62, 0x47, 0xf6,
+	0x19, 0x00, 0xfe, 0x72, 0x1d, 0x9b, 0xa1, 0xf5, 0xdf, 0x3d, 0x0c, 0xc0, 0x34, 0x15, 0x25, 0xfc,
+	0xb3, 0xae, 0x7b, 0x79, 0xfc, 0x6d, 0xa0, 0x7a, 0x06, 0x83, 0x57, 0xf7, 0xc7, 0xc7, 0x44, 0x91,
+	0x70, 0x06, 0x45, 0xcd, 0x10, 0xa3, 0x5c, 0x6f, 0xd1, 0x9d, 0xab, 0xca, 0xe5, 0x2f, 0xd7, 0xbb,
+	0xd5, 0xef, 0xc7, 0x70, 0x34, 0x77, 0x9c, 0xcf, 0xe1, 0x64, 0x6e, 0xa2, 0x9c, 0x4c, 0x42, 0x03,
+	0x15, 0x0a, 0x31, 0x54, 0xab, 0xcb, 0xaf, 0x8e, 0x8f, 0x9c, 0x4c, 0x46, 0x3d, 0x1f, 0x85, 0x38,
+	0xd2, 0xfc, 0x61, 0x38, 0x35, 0x43, 0x42, 0x9c, 0x4c, 0x12, 0xd2, 0x2b, 0x08, 0x09, 0x31, 0x21,
+	0x5a, 0xb3, 0x3b, 0xd1, 0xc5, 0xf0, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x8f, 0xdc, 0x53,
+	0xd5, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/hotel_rate_type.pb.go b/googleapis/ads/googleads/v3/enums/hotel_rate_type.pb.go
new file mode 100644
index 0000000..a0569c4
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/hotel_rate_type.pb.go
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/hotel_rate_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible hotel rate types.
+type HotelRateTypeEnum_HotelRateType int32
+
+const (
+	// Not specified.
+	HotelRateTypeEnum_UNSPECIFIED HotelRateTypeEnum_HotelRateType = 0
+	// The value is unknown in this version.
+	HotelRateTypeEnum_UNKNOWN HotelRateTypeEnum_HotelRateType = 1
+	// Rate type information is unavailable.
+	HotelRateTypeEnum_UNAVAILABLE HotelRateTypeEnum_HotelRateType = 2
+	// Rates available to everyone.
+	HotelRateTypeEnum_PUBLIC_RATE HotelRateTypeEnum_HotelRateType = 3
+	// A membership program rate is available and satisfies basic requirements
+	// like having a public rate available. UI treatment will strikethrough the
+	// public rate and indicate that a discount is available to the user. For
+	// more on Qualified Rates, visit
+	// https://developers.google.com/hotels/hotel-ads/dev-guide/qualified-rates
+	HotelRateTypeEnum_QUALIFIED_RATE HotelRateTypeEnum_HotelRateType = 4
+	// Rates available to users that satisfy some eligibility criteria. e.g.
+	// all signed-in users, 20% of mobile users, all mobile users in Canada,
+	// etc.
+	HotelRateTypeEnum_PRIVATE_RATE HotelRateTypeEnum_HotelRateType = 5
+)
+
+var HotelRateTypeEnum_HotelRateType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "UNAVAILABLE",
+	3: "PUBLIC_RATE",
+	4: "QUALIFIED_RATE",
+	5: "PRIVATE_RATE",
+}
+
+var HotelRateTypeEnum_HotelRateType_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"UNAVAILABLE":    2,
+	"PUBLIC_RATE":    3,
+	"QUALIFIED_RATE": 4,
+	"PRIVATE_RATE":   5,
+}
+
+func (x HotelRateTypeEnum_HotelRateType) String() string {
+	return proto.EnumName(HotelRateTypeEnum_HotelRateType_name, int32(x))
+}
+
+func (HotelRateTypeEnum_HotelRateType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e6359dfc1c88f2ee, []int{0, 0}
+}
+
+// Container for enum describing possible hotel rate types.
+type HotelRateTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HotelRateTypeEnum) Reset()         { *m = HotelRateTypeEnum{} }
+func (m *HotelRateTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*HotelRateTypeEnum) ProtoMessage()    {}
+func (*HotelRateTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e6359dfc1c88f2ee, []int{0}
+}
+
+func (m *HotelRateTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelRateTypeEnum.Unmarshal(m, b)
+}
+func (m *HotelRateTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelRateTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *HotelRateTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelRateTypeEnum.Merge(m, src)
+}
+func (m *HotelRateTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_HotelRateTypeEnum.Size(m)
+}
+func (m *HotelRateTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelRateTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelRateTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.HotelRateTypeEnum_HotelRateType", HotelRateTypeEnum_HotelRateType_name, HotelRateTypeEnum_HotelRateType_value)
+	proto.RegisterType((*HotelRateTypeEnum)(nil), "google.ads.googleads.v3.enums.HotelRateTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/hotel_rate_type.proto", fileDescriptor_e6359dfc1c88f2ee)
+}
+
+var fileDescriptor_e6359dfc1c88f2ee = []byte{
+	// 332 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xdf, 0x4a, 0xf3, 0x30,
+	0x1c, 0xfd, 0xda, 0x7d, 0x2a, 0x64, 0xfe, 0xa9, 0xb9, 0x14, 0x77, 0xb1, 0x3d, 0x40, 0x7a, 0x91,
+	0xbb, 0x78, 0x95, 0xce, 0x3a, 0x8b, 0xa5, 0xd6, 0xb9, 0x56, 0x90, 0xc2, 0x88, 0x36, 0xd4, 0xc1,
+	0x96, 0x94, 0x25, 0x1b, 0xec, 0x15, 0x7c, 0x0c, 0x2f, 0x7d, 0x14, 0x5f, 0x44, 0xf0, 0x29, 0xa4,
+	0x89, 0x2b, 0xec, 0x42, 0x6f, 0xc2, 0xe1, 0x9c, 0xdf, 0x39, 0xe4, 0x1c, 0x80, 0x2b, 0x29, 0xab,
+	0x39, 0xf7, 0x59, 0xa9, 0x7c, 0x0b, 0x1b, 0xb4, 0xc6, 0x3e, 0x17, 0xab, 0x85, 0xf2, 0x5f, 0xa4,
+	0xe6, 0xf3, 0xe9, 0x92, 0x69, 0x3e, 0xd5, 0x9b, 0x9a, 0xa3, 0x7a, 0x29, 0xb5, 0x84, 0x3d, 0x7b,
+	0x89, 0x58, 0xa9, 0x50, 0x6b, 0x42, 0x6b, 0x8c, 0x8c, 0xe9, 0xec, 0x7c, 0x9b, 0x59, 0xcf, 0x7c,
+	0x26, 0x84, 0xd4, 0x4c, 0xcf, 0xa4, 0x50, 0xd6, 0x3c, 0x78, 0x75, 0xc0, 0xe9, 0x75, 0x13, 0x3b,
+	0x66, 0x9a, 0x4f, 0x36, 0x35, 0x0f, 0xc5, 0x6a, 0x31, 0x58, 0x81, 0xa3, 0x1d, 0x12, 0x9e, 0x80,
+	0x6e, 0x96, 0xdc, 0xa7, 0xe1, 0x30, 0xba, 0x8a, 0xc2, 0x4b, 0xef, 0x1f, 0xec, 0x82, 0x83, 0x2c,
+	0xb9, 0x49, 0x6e, 0x1f, 0x12, 0xcf, 0xb1, 0x2a, 0xcd, 0x69, 0x14, 0xd3, 0x20, 0x0e, 0x3d, 0xb7,
+	0x21, 0xd2, 0x2c, 0x88, 0xa3, 0xe1, 0x74, 0x4c, 0x27, 0xa1, 0xd7, 0x81, 0x10, 0x1c, 0xdf, 0x65,
+	0x34, 0x36, 0x6e, 0xcb, 0xfd, 0x87, 0x1e, 0x38, 0x4c, 0xc7, 0x51, 0x4e, 0x27, 0xa1, 0x65, 0xf6,
+	0x82, 0x4f, 0x07, 0xf4, 0x9f, 0xe5, 0x02, 0xfd, 0x59, 0x28, 0x80, 0x3b, 0x5f, 0x4b, 0x9b, 0x1a,
+	0xa9, 0xf3, 0x18, 0xfc, 0x98, 0x2a, 0x39, 0x67, 0xa2, 0x42, 0x72, 0x59, 0xf9, 0x15, 0x17, 0xa6,
+	0xe4, 0x76, 0xca, 0x7a, 0xa6, 0x7e, 0x59, 0xf6, 0xc2, 0xbc, 0x6f, 0x6e, 0x67, 0x44, 0xe9, 0xbb,
+	0xdb, 0x1b, 0xd9, 0x28, 0x5a, 0x2a, 0x64, 0x61, 0x83, 0x72, 0x8c, 0x9a, 0x6d, 0xd4, 0xc7, 0x56,
+	0x2f, 0x68, 0xa9, 0x8a, 0x56, 0x2f, 0x72, 0x5c, 0x18, 0xfd, 0xcb, 0xed, 0x5b, 0x92, 0x10, 0x5a,
+	0x2a, 0x42, 0xda, 0x0b, 0x42, 0x72, 0x4c, 0x88, 0xb9, 0x79, 0xda, 0x37, 0x1f, 0xc3, 0xdf, 0x01,
+	0x00, 0x00, 0xff, 0xff, 0x65, 0x27, 0xf0, 0x0f, 0xf1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/income_range_type.pb.go b/googleapis/ads/googleads/v3/enums/income_range_type.pb.go
new file mode 100644
index 0000000..494e218
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/income_range_type.pb.go
@@ -0,0 +1,148 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/income_range_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of demographic income ranges (e.g. between 0% to 50%).
+type IncomeRangeTypeEnum_IncomeRangeType int32
+
+const (
+	// Not specified.
+	IncomeRangeTypeEnum_UNSPECIFIED IncomeRangeTypeEnum_IncomeRangeType = 0
+	// Used for return value only. Represents value unknown in this version.
+	IncomeRangeTypeEnum_UNKNOWN IncomeRangeTypeEnum_IncomeRangeType = 1
+	// 0%-50%.
+	IncomeRangeTypeEnum_INCOME_RANGE_0_50 IncomeRangeTypeEnum_IncomeRangeType = 510001
+	// 50% to 60%.
+	IncomeRangeTypeEnum_INCOME_RANGE_50_60 IncomeRangeTypeEnum_IncomeRangeType = 510002
+	// 60% to 70%.
+	IncomeRangeTypeEnum_INCOME_RANGE_60_70 IncomeRangeTypeEnum_IncomeRangeType = 510003
+	// 70% to 80%.
+	IncomeRangeTypeEnum_INCOME_RANGE_70_80 IncomeRangeTypeEnum_IncomeRangeType = 510004
+	// 80% to 90%.
+	IncomeRangeTypeEnum_INCOME_RANGE_80_90 IncomeRangeTypeEnum_IncomeRangeType = 510005
+	// Greater than 90%.
+	IncomeRangeTypeEnum_INCOME_RANGE_90_UP IncomeRangeTypeEnum_IncomeRangeType = 510006
+	// Undetermined income range.
+	IncomeRangeTypeEnum_INCOME_RANGE_UNDETERMINED IncomeRangeTypeEnum_IncomeRangeType = 510000
+)
+
+var IncomeRangeTypeEnum_IncomeRangeType_name = map[int32]string{
+	0:      "UNSPECIFIED",
+	1:      "UNKNOWN",
+	510001: "INCOME_RANGE_0_50",
+	510002: "INCOME_RANGE_50_60",
+	510003: "INCOME_RANGE_60_70",
+	510004: "INCOME_RANGE_70_80",
+	510005: "INCOME_RANGE_80_90",
+	510006: "INCOME_RANGE_90_UP",
+	510000: "INCOME_RANGE_UNDETERMINED",
+}
+
+var IncomeRangeTypeEnum_IncomeRangeType_value = map[string]int32{
+	"UNSPECIFIED":               0,
+	"UNKNOWN":                   1,
+	"INCOME_RANGE_0_50":         510001,
+	"INCOME_RANGE_50_60":        510002,
+	"INCOME_RANGE_60_70":        510003,
+	"INCOME_RANGE_70_80":        510004,
+	"INCOME_RANGE_80_90":        510005,
+	"INCOME_RANGE_90_UP":        510006,
+	"INCOME_RANGE_UNDETERMINED": 510000,
+}
+
+func (x IncomeRangeTypeEnum_IncomeRangeType) String() string {
+	return proto.EnumName(IncomeRangeTypeEnum_IncomeRangeType_name, int32(x))
+}
+
+func (IncomeRangeTypeEnum_IncomeRangeType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_bf3d5076be1ea19c, []int{0, 0}
+}
+
+// Container for enum describing the type of demographic income ranges.
+type IncomeRangeTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *IncomeRangeTypeEnum) Reset()         { *m = IncomeRangeTypeEnum{} }
+func (m *IncomeRangeTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*IncomeRangeTypeEnum) ProtoMessage()    {}
+func (*IncomeRangeTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bf3d5076be1ea19c, []int{0}
+}
+
+func (m *IncomeRangeTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_IncomeRangeTypeEnum.Unmarshal(m, b)
+}
+func (m *IncomeRangeTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_IncomeRangeTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *IncomeRangeTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_IncomeRangeTypeEnum.Merge(m, src)
+}
+func (m *IncomeRangeTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_IncomeRangeTypeEnum.Size(m)
+}
+func (m *IncomeRangeTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_IncomeRangeTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_IncomeRangeTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.IncomeRangeTypeEnum_IncomeRangeType", IncomeRangeTypeEnum_IncomeRangeType_name, IncomeRangeTypeEnum_IncomeRangeType_value)
+	proto.RegisterType((*IncomeRangeTypeEnum)(nil), "google.ads.googleads.v3.enums.IncomeRangeTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/income_range_type.proto", fileDescriptor_bf3d5076be1ea19c)
+}
+
+var fileDescriptor_bf3d5076be1ea19c = []byte{
+	// 384 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xdb, 0xaa, 0xd3, 0x40,
+	0x18, 0x85, 0x4d, 0x04, 0x85, 0xd9, 0x17, 0x7b, 0x8c, 0x82, 0x07, 0xdc, 0x84, 0xf6, 0x01, 0x26,
+	0x03, 0xa1, 0xa7, 0xf1, 0x2a, 0x6d, 0xc7, 0x12, 0xa4, 0xd3, 0x50, 0x9b, 0x0a, 0x12, 0x18, 0x62,
+	0x13, 0x42, 0xa0, 0x99, 0x09, 0x9d, 0xb4, 0xd0, 0x6b, 0x5f, 0xa0, 0xcf, 0xe0, 0xa5, 0x57, 0x9e,
+	0x1f, 0xc2, 0x37, 0x51, 0x5f, 0x42, 0x92, 0xd8, 0x42, 0x4b, 0xdc, 0x37, 0xc3, 0xe2, 0xff, 0xfe,
+	0xb5, 0x18, 0xd6, 0x0f, 0x3a, 0x89, 0x94, 0xc9, 0x3a, 0xb6, 0xc2, 0x48, 0x59, 0xb5, 0x2c, 0xd5,
+	0xce, 0xb6, 0x62, 0xb1, 0xcd, 0x94, 0x95, 0x8a, 0x95, 0xcc, 0x62, 0xbe, 0x09, 0x45, 0x12, 0xf3,
+	0x62, 0x9f, 0xc7, 0x28, 0xdf, 0xc8, 0x42, 0x1a, 0x37, 0xf5, 0x2e, 0x0a, 0x23, 0x85, 0x4e, 0x36,
+	0xb4, 0xb3, 0x51, 0x65, 0x7b, 0xf6, 0xfc, 0x98, 0x9a, 0xa7, 0x56, 0x28, 0x84, 0x2c, 0xc2, 0x22,
+	0x95, 0x42, 0xd5, 0xe6, 0xf6, 0x7b, 0x1d, 0x3c, 0x74, 0xab, 0xe0, 0x79, 0x99, 0xbb, 0xd8, 0xe7,
+	0x31, 0x15, 0xdb, 0xac, 0xfd, 0x47, 0x03, 0xd7, 0x17, 0x73, 0xe3, 0x1a, 0x5c, 0xf9, 0xec, 0xb5,
+	0x47, 0x47, 0xee, 0x4b, 0x97, 0x8e, 0xe1, 0x1d, 0xe3, 0x0a, 0xdc, 0xf7, 0xd9, 0x2b, 0x36, 0x7b,
+	0xc3, 0xa0, 0x66, 0x3c, 0x06, 0x0f, 0x5c, 0x36, 0x9a, 0x4d, 0x29, 0x9f, 0x3b, 0x6c, 0x42, 0x39,
+	0xe6, 0x1d, 0x0c, 0x3f, 0x1f, 0x4c, 0xe3, 0x09, 0x30, 0xce, 0x40, 0x07, 0xf3, 0x2e, 0x86, 0x5f,
+	0x1a, 0x48, 0x17, 0xf3, 0x1e, 0x86, 0x5f, 0x1b, 0x48, 0x0f, 0xf3, 0x3e, 0x86, 0xdf, 0x1a, 0x48,
+	0x1f, 0xf3, 0x01, 0x86, 0xdf, 0x1b, 0xc8, 0x00, 0x73, 0xdf, 0x83, 0x3f, 0x0e, 0xa6, 0x61, 0x82,
+	0xa7, 0x67, 0xc4, 0x67, 0x63, 0xba, 0xa0, 0xf3, 0xa9, 0xcb, 0xe8, 0x18, 0x7e, 0x3a, 0x98, 0xc3,
+	0x5f, 0x1a, 0x68, 0xad, 0x64, 0x86, 0x6e, 0x6d, 0x72, 0xf8, 0xe8, 0xa2, 0x10, 0xaf, 0x6c, 0xd0,
+	0xd3, 0xde, 0x0e, 0xff, 0xd9, 0x12, 0xb9, 0x0e, 0x45, 0x82, 0xe4, 0x26, 0xb1, 0x92, 0x58, 0x54,
+	0xfd, 0x1e, 0xef, 0x98, 0xa7, 0xea, 0x3f, 0x67, 0x7d, 0x51, 0xbd, 0x1f, 0xf4, 0xbb, 0x13, 0xc7,
+	0xf9, 0xa8, 0xdf, 0x4c, 0xea, 0x28, 0x27, 0x52, 0xa8, 0x96, 0xa5, 0x5a, 0xda, 0xa8, 0x3c, 0x8a,
+	0xfa, 0x79, 0xe4, 0x81, 0x13, 0xa9, 0xe0, 0xc4, 0x83, 0xa5, 0x1d, 0x54, 0xfc, 0xb7, 0xde, 0xaa,
+	0x87, 0x84, 0x38, 0x91, 0x22, 0xe4, 0xb4, 0x41, 0xc8, 0xd2, 0x26, 0xa4, 0xda, 0x79, 0x77, 0xaf,
+	0xfa, 0x98, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, 0xad, 0xd1, 0x51, 0xd6, 0x6e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/interaction_event_type.pb.go b/googleapis/ads/googleads/v3/enums/interaction_event_type.pb.go
new file mode 100644
index 0000000..07589e5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/interaction_event_type.pb.go
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/interaction_event_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible types of payable and free interactions.
+type InteractionEventTypeEnum_InteractionEventType int32
+
+const (
+	// Not specified.
+	InteractionEventTypeEnum_UNSPECIFIED InteractionEventTypeEnum_InteractionEventType = 0
+	// Used for return value only. Represents value unknown in this version.
+	InteractionEventTypeEnum_UNKNOWN InteractionEventTypeEnum_InteractionEventType = 1
+	// Click to site. In most cases, this interaction navigates to an external
+	// location, usually the advertiser's landing page. This is also the default
+	// InteractionEventType for click events.
+	InteractionEventTypeEnum_CLICK InteractionEventTypeEnum_InteractionEventType = 2
+	// The user's expressed intent to engage with the ad in-place.
+	InteractionEventTypeEnum_ENGAGEMENT InteractionEventTypeEnum_InteractionEventType = 3
+	// User viewed a video ad.
+	InteractionEventTypeEnum_VIDEO_VIEW InteractionEventTypeEnum_InteractionEventType = 4
+	// The default InteractionEventType for ad conversion events.
+	// This is used when an ad conversion row does NOT indicate
+	// that the free interactions (i.e., the ad conversions)
+	// should be 'promoted' and reported as part of the core metrics.
+	// These are simply other (ad) conversions.
+	InteractionEventTypeEnum_NONE InteractionEventTypeEnum_InteractionEventType = 5
+)
+
+var InteractionEventTypeEnum_InteractionEventType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CLICK",
+	3: "ENGAGEMENT",
+	4: "VIDEO_VIEW",
+	5: "NONE",
+}
+
+var InteractionEventTypeEnum_InteractionEventType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CLICK":       2,
+	"ENGAGEMENT":  3,
+	"VIDEO_VIEW":  4,
+	"NONE":        5,
+}
+
+func (x InteractionEventTypeEnum_InteractionEventType) String() string {
+	return proto.EnumName(InteractionEventTypeEnum_InteractionEventType_name, int32(x))
+}
+
+func (InteractionEventTypeEnum_InteractionEventType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d3dbb1c76f569f9a, []int{0, 0}
+}
+
+// Container for enum describing types of payable and free interactions.
+type InteractionEventTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *InteractionEventTypeEnum) Reset()         { *m = InteractionEventTypeEnum{} }
+func (m *InteractionEventTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*InteractionEventTypeEnum) ProtoMessage()    {}
+func (*InteractionEventTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d3dbb1c76f569f9a, []int{0}
+}
+
+func (m *InteractionEventTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_InteractionEventTypeEnum.Unmarshal(m, b)
+}
+func (m *InteractionEventTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_InteractionEventTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *InteractionEventTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_InteractionEventTypeEnum.Merge(m, src)
+}
+func (m *InteractionEventTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_InteractionEventTypeEnum.Size(m)
+}
+func (m *InteractionEventTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_InteractionEventTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_InteractionEventTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.InteractionEventTypeEnum_InteractionEventType", InteractionEventTypeEnum_InteractionEventType_name, InteractionEventTypeEnum_InteractionEventType_value)
+	proto.RegisterType((*InteractionEventTypeEnum)(nil), "google.ads.googleads.v3.enums.InteractionEventTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/interaction_event_type.proto", fileDescriptor_d3dbb1c76f569f9a)
+}
+
+var fileDescriptor_d3dbb1c76f569f9a = []byte{
+	// 334 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xdd, 0x4e, 0xc2, 0x30,
+	0x18, 0x75, 0x03, 0xfc, 0x29, 0x89, 0x2e, 0x8b, 0x17, 0x6a, 0xe4, 0x02, 0x1e, 0xa0, 0xbb, 0xd8,
+	0x5d, 0xbd, 0x1a, 0x50, 0x97, 0x05, 0x2d, 0x24, 0xc2, 0x48, 0xcc, 0x12, 0x32, 0x59, 0xd3, 0x2c,
+	0x81, 0x76, 0xa1, 0x85, 0x84, 0x07, 0xf0, 0x45, 0xbc, 0xf4, 0x51, 0x7c, 0x14, 0x2f, 0x7c, 0x06,
+	0xd3, 0x56, 0xf0, 0x06, 0xbd, 0x69, 0x4e, 0xbf, 0xf3, 0x9d, 0x93, 0xef, 0x1c, 0x80, 0x98, 0x10,
+	0x6c, 0x41, 0x83, 0xbc, 0x90, 0x81, 0x85, 0x1a, 0x6d, 0xc2, 0x80, 0xf2, 0xf5, 0x52, 0x06, 0x25,
+	0x57, 0x74, 0x95, 0xcf, 0x55, 0x29, 0xf8, 0x8c, 0x6e, 0x28, 0x57, 0x33, 0xb5, 0xad, 0x28, 0xac,
+	0x56, 0x42, 0x09, 0xbf, 0x65, 0x05, 0x30, 0x2f, 0x24, 0xdc, 0x6b, 0xe1, 0x26, 0x84, 0x46, 0x7b,
+	0x73, 0xbb, 0xb3, 0xae, 0xca, 0x20, 0xe7, 0x5c, 0xa8, 0x5c, 0xdb, 0x48, 0x2b, 0xee, 0xbc, 0x3a,
+	0xe0, 0x2a, 0xf9, 0x75, 0xc7, 0xda, 0x7c, 0xbc, 0xad, 0x28, 0xe6, 0xeb, 0x65, 0xa7, 0x04, 0x97,
+	0x87, 0x38, 0xff, 0x02, 0x34, 0x27, 0xe4, 0x69, 0x84, 0x7b, 0xc9, 0x7d, 0x82, 0xfb, 0xde, 0x91,
+	0xdf, 0x04, 0x27, 0x13, 0x32, 0x20, 0xc3, 0x29, 0xf1, 0x1c, 0xff, 0x0c, 0x34, 0x7a, 0x0f, 0x49,
+	0x6f, 0xe0, 0xb9, 0xfe, 0x39, 0x00, 0x98, 0xc4, 0x51, 0x8c, 0x1f, 0x31, 0x19, 0x7b, 0x35, 0xfd,
+	0x4f, 0x93, 0x3e, 0x1e, 0xce, 0xd2, 0x04, 0x4f, 0xbd, 0xba, 0x7f, 0x0a, 0xea, 0x64, 0x48, 0xb0,
+	0xd7, 0xe8, 0x7e, 0x39, 0xa0, 0x3d, 0x17, 0x4b, 0xf8, 0x6f, 0x96, 0xee, 0xf5, 0xa1, 0x73, 0x46,
+	0x3a, 0xc8, 0xc8, 0x79, 0xee, 0xfe, 0x68, 0x99, 0x58, 0xe4, 0x9c, 0x41, 0xb1, 0x62, 0x01, 0xa3,
+	0xdc, 0xc4, 0xdc, 0x75, 0x5a, 0x95, 0xf2, 0x8f, 0x8a, 0xef, 0xcc, 0xfb, 0xe6, 0xd6, 0xe2, 0x28,
+	0x7a, 0x77, 0x5b, 0xb1, 0xb5, 0x8a, 0x0a, 0x09, 0x2d, 0xd4, 0x28, 0x0d, 0xa1, 0xae, 0x45, 0x7e,
+	0xec, 0xf8, 0x2c, 0x2a, 0x64, 0xb6, 0xe7, 0xb3, 0x34, 0xcc, 0x0c, 0xff, 0xe9, 0xb6, 0xed, 0x10,
+	0xa1, 0xa8, 0x90, 0x08, 0xed, 0x37, 0x10, 0x4a, 0x43, 0x84, 0xcc, 0xce, 0xcb, 0xb1, 0x39, 0x2c,
+	0xfc, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x28, 0x56, 0xeb, 0x66, 0xfa, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/interaction_type.pb.go b/googleapis/ads/googleads/v3/enums/interaction_type.pb.go
new file mode 100644
index 0000000..3a07f5c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/interaction_type.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/interaction_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible interaction types.
+type InteractionTypeEnum_InteractionType int32
+
+const (
+	// Not specified.
+	InteractionTypeEnum_UNSPECIFIED InteractionTypeEnum_InteractionType = 0
+	// Used for return value only. Represents value unknown in this version.
+	InteractionTypeEnum_UNKNOWN InteractionTypeEnum_InteractionType = 1
+	// Calls.
+	InteractionTypeEnum_CALLS InteractionTypeEnum_InteractionType = 8000
+)
+
+var InteractionTypeEnum_InteractionType_name = map[int32]string{
+	0:    "UNSPECIFIED",
+	1:    "UNKNOWN",
+	8000: "CALLS",
+}
+
+var InteractionTypeEnum_InteractionType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CALLS":       8000,
+}
+
+func (x InteractionTypeEnum_InteractionType) String() string {
+	return proto.EnumName(InteractionTypeEnum_InteractionType_name, int32(x))
+}
+
+func (InteractionTypeEnum_InteractionType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8fc9fa17678200f2, []int{0, 0}
+}
+
+// Container for enum describing possible interaction types.
+type InteractionTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *InteractionTypeEnum) Reset()         { *m = InteractionTypeEnum{} }
+func (m *InteractionTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*InteractionTypeEnum) ProtoMessage()    {}
+func (*InteractionTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8fc9fa17678200f2, []int{0}
+}
+
+func (m *InteractionTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_InteractionTypeEnum.Unmarshal(m, b)
+}
+func (m *InteractionTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_InteractionTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *InteractionTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_InteractionTypeEnum.Merge(m, src)
+}
+func (m *InteractionTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_InteractionTypeEnum.Size(m)
+}
+func (m *InteractionTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_InteractionTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_InteractionTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.InteractionTypeEnum_InteractionType", InteractionTypeEnum_InteractionType_name, InteractionTypeEnum_InteractionType_value)
+	proto.RegisterType((*InteractionTypeEnum)(nil), "google.ads.googleads.v3.enums.InteractionTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/interaction_type.proto", fileDescriptor_8fc9fa17678200f2)
+}
+
+var fileDescriptor_8fc9fa17678200f2 = []byte{
+	// 291 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x49, 0xcf, 0xcf, 0x4f,
+	0xcf, 0x49, 0xd5, 0x4f, 0x4c, 0x29, 0xd6, 0x87, 0x30, 0x41, 0xac, 0x32, 0x63, 0xfd, 0xd4, 0xbc,
+	0xd2, 0xdc, 0x62, 0xfd, 0xcc, 0xbc, 0x92, 0xd4, 0xa2, 0xc4, 0xe4, 0x92, 0xcc, 0xfc, 0xbc, 0xf8,
+	0x92, 0xca, 0x82, 0x54, 0xbd, 0x82, 0xa2, 0xfc, 0x92, 0x7c, 0x21, 0x59, 0x88, 0x52, 0xbd, 0xc4,
+	0x94, 0x62, 0x3d, 0xb8, 0x2e, 0xbd, 0x32, 0x63, 0x3d, 0xb0, 0x2e, 0x29, 0x19, 0x98, 0xa1, 0x05,
+	0x99, 0xfa, 0x89, 0x79, 0x79, 0xf9, 0x25, 0x89, 0x20, 0x03, 0x8a, 0x21, 0x9a, 0x95, 0x82, 0xb8,
+	0x84, 0x3d, 0x11, 0xc6, 0x86, 0x54, 0x16, 0xa4, 0xba, 0xe6, 0x95, 0xe6, 0x2a, 0x59, 0x73, 0xf1,
+	0xa3, 0x09, 0x0b, 0xf1, 0x73, 0x71, 0x87, 0xfa, 0x05, 0x07, 0xb8, 0x3a, 0x7b, 0xba, 0x79, 0xba,
+	0xba, 0x08, 0x30, 0x08, 0x71, 0x73, 0xb1, 0x87, 0xfa, 0x79, 0xfb, 0xf9, 0x87, 0xfb, 0x09, 0x30,
+	0x0a, 0x71, 0x71, 0xb1, 0x3a, 0x3b, 0xfa, 0xf8, 0x04, 0x0b, 0x1c, 0xb0, 0x73, 0x7a, 0xc9, 0xc8,
+	0xa5, 0x98, 0x9c, 0x9f, 0xab, 0x87, 0xd7, 0x5d, 0x4e, 0x22, 0x68, 0x16, 0x04, 0x80, 0xdc, 0x13,
+	0xc0, 0x18, 0xe5, 0x04, 0xd5, 0x96, 0x9e, 0x9f, 0x93, 0x98, 0x97, 0xae, 0x97, 0x5f, 0x94, 0xae,
+	0x9f, 0x9e, 0x9a, 0x07, 0x76, 0x2d, 0x2c, 0x50, 0x0a, 0x32, 0x8b, 0x71, 0x84, 0x91, 0x35, 0x98,
+	0x5c, 0xc4, 0xc4, 0xec, 0xee, 0xe8, 0xb8, 0x8a, 0x49, 0xd6, 0x1d, 0x62, 0x94, 0x63, 0x4a, 0xb1,
+	0x1e, 0x84, 0x09, 0x62, 0x85, 0x19, 0xeb, 0x81, 0xfc, 0x58, 0x7c, 0x0a, 0x26, 0x1f, 0xe3, 0x98,
+	0x52, 0x1c, 0x03, 0x97, 0x8f, 0x09, 0x33, 0x8e, 0x01, 0xcb, 0xbf, 0x62, 0x52, 0x84, 0x08, 0x5a,
+	0x59, 0x39, 0xa6, 0x14, 0x5b, 0x59, 0xc1, 0x55, 0x58, 0x59, 0x85, 0x19, 0x5b, 0x59, 0x81, 0xd5,
+	0x24, 0xb1, 0x81, 0x1d, 0x66, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd5, 0x2c, 0x97, 0xbb,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/invoice_type.pb.go b/googleapis/ads/googleads/v3/enums/invoice_type.pb.go
new file mode 100644
index 0000000..0883b28
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/invoice_type.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/invoice_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible type of invoices.
+type InvoiceTypeEnum_InvoiceType int32
+
+const (
+	// Not specified.
+	InvoiceTypeEnum_UNSPECIFIED InvoiceTypeEnum_InvoiceType = 0
+	// Used for return value only. Represents value unknown in this version.
+	InvoiceTypeEnum_UNKNOWN InvoiceTypeEnum_InvoiceType = 1
+	// An invoice with a negative amount. The account receives a credit.
+	InvoiceTypeEnum_CREDIT_MEMO InvoiceTypeEnum_InvoiceType = 2
+	// An invoice with a positive amount. The account owes a balance.
+	InvoiceTypeEnum_INVOICE InvoiceTypeEnum_InvoiceType = 3
+)
+
+var InvoiceTypeEnum_InvoiceType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CREDIT_MEMO",
+	3: "INVOICE",
+}
+
+var InvoiceTypeEnum_InvoiceType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CREDIT_MEMO": 2,
+	"INVOICE":     3,
+}
+
+func (x InvoiceTypeEnum_InvoiceType) String() string {
+	return proto.EnumName(InvoiceTypeEnum_InvoiceType_name, int32(x))
+}
+
+func (InvoiceTypeEnum_InvoiceType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_22c008ffe76f80f6, []int{0, 0}
+}
+
+// Container for enum describing the type of invoices.
+type InvoiceTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *InvoiceTypeEnum) Reset()         { *m = InvoiceTypeEnum{} }
+func (m *InvoiceTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*InvoiceTypeEnum) ProtoMessage()    {}
+func (*InvoiceTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_22c008ffe76f80f6, []int{0}
+}
+
+func (m *InvoiceTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_InvoiceTypeEnum.Unmarshal(m, b)
+}
+func (m *InvoiceTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_InvoiceTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *InvoiceTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_InvoiceTypeEnum.Merge(m, src)
+}
+func (m *InvoiceTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_InvoiceTypeEnum.Size(m)
+}
+func (m *InvoiceTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_InvoiceTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_InvoiceTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.InvoiceTypeEnum_InvoiceType", InvoiceTypeEnum_InvoiceType_name, InvoiceTypeEnum_InvoiceType_value)
+	proto.RegisterType((*InvoiceTypeEnum)(nil), "google.ads.googleads.v3.enums.InvoiceTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/invoice_type.proto", fileDescriptor_22c008ffe76f80f6)
+}
+
+var fileDescriptor_22c008ffe76f80f6 = []byte{
+	// 300 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xbd, 0x6a, 0xf3, 0x30,
+	0x14, 0xfd, 0xe2, 0xc0, 0x57, 0x50, 0x86, 0x98, 0x8c, 0xa5, 0x19, 0x92, 0x07, 0x90, 0x0a, 0xda,
+	0xd4, 0xc9, 0x71, 0xd4, 0x20, 0x4a, 0x6c, 0xd3, 0x26, 0x2e, 0x14, 0x43, 0x70, 0x63, 0x21, 0x0c,
+	0xb1, 0x64, 0x22, 0xc7, 0x90, 0xd7, 0xe9, 0xd8, 0x47, 0xe9, 0x7b, 0x74, 0xe9, 0x53, 0x14, 0x49,
+	0xb5, 0xc9, 0xd2, 0x2e, 0xe2, 0x70, 0xcf, 0x8f, 0xce, 0xbd, 0xe0, 0x56, 0x28, 0x25, 0x0e, 0x1c,
+	0xe5, 0x85, 0x46, 0x0e, 0x1a, 0xd4, 0x62, 0xc4, 0xe5, 0xa9, 0xd2, 0xa8, 0x94, 0xad, 0x2a, 0xf7,
+	0x7c, 0xd7, 0x9c, 0x6b, 0x0e, 0xeb, 0xa3, 0x6a, 0xd4, 0x64, 0xea, 0x64, 0x30, 0x2f, 0x34, 0xec,
+	0x1d, 0xb0, 0xc5, 0xd0, 0x3a, 0xae, 0x6f, 0xba, 0xc0, 0xba, 0x44, 0xb9, 0x94, 0xaa, 0xc9, 0x9b,
+	0x52, 0x49, 0xed, 0xcc, 0xf3, 0x0c, 0x8c, 0x99, 0x8b, 0xdc, 0x9c, 0x6b, 0x4e, 0xe5, 0xa9, 0x9a,
+	0x33, 0x30, 0xba, 0x18, 0x4d, 0xc6, 0x60, 0xb4, 0x8d, 0x9e, 0x12, 0x1a, 0xb2, 0x7b, 0x46, 0x97,
+	0xfe, 0xbf, 0xc9, 0x08, 0x5c, 0x6d, 0xa3, 0x87, 0x28, 0x7e, 0x8e, 0xfc, 0x81, 0x61, 0xc3, 0x47,
+	0xba, 0x64, 0x9b, 0xdd, 0x9a, 0xae, 0x63, 0xdf, 0x33, 0x2c, 0x8b, 0xd2, 0x98, 0x85, 0xd4, 0x1f,
+	0x2e, 0x3e, 0x07, 0x60, 0xb6, 0x57, 0x15, 0xfc, 0xb3, 0xe1, 0xc2, 0xbf, 0xf8, 0x2e, 0x31, 0xad,
+	0x92, 0xc1, 0xcb, 0xe2, 0xc7, 0x22, 0xd4, 0x21, 0x97, 0x02, 0xaa, 0xa3, 0x40, 0x82, 0x4b, 0xdb,
+	0xb9, 0x3b, 0x4b, 0x5d, 0xea, 0x5f, 0xae, 0x74, 0x67, 0xdf, 0x37, 0x6f, 0xb8, 0x0a, 0x82, 0x77,
+	0x6f, 0xba, 0x72, 0x51, 0x41, 0xa1, 0xa1, 0x83, 0x06, 0xa5, 0x18, 0x9a, 0x6d, 0xf5, 0x47, 0xc7,
+	0x67, 0x41, 0xa1, 0xb3, 0x9e, 0xcf, 0x52, 0x9c, 0x59, 0xfe, 0xcb, 0x9b, 0xb9, 0x21, 0x21, 0x41,
+	0xa1, 0x09, 0xe9, 0x15, 0x84, 0xa4, 0x98, 0x10, 0xab, 0x79, 0xfd, 0x6f, 0x8b, 0xe1, 0xef, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0x78, 0x11, 0xae, 0x31, 0xbd, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/job_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/job_placeholder_field.pb.go
new file mode 100644
index 0000000..2dfef89
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/job_placeholder_field.pb.go
@@ -0,0 +1,215 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/job_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Job placeholder fields.
+type JobPlaceholderFieldEnum_JobPlaceholderField int32
+
+const (
+	// Not specified.
+	JobPlaceholderFieldEnum_UNSPECIFIED JobPlaceholderFieldEnum_JobPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	JobPlaceholderFieldEnum_UNKNOWN JobPlaceholderFieldEnum_JobPlaceholderField = 1
+	// Data Type: STRING. Required. If only JOB_ID is specified, then it must be
+	// unique. If both JOB_ID and LOCATION_ID are specified, then the
+	// pair must be unique.
+	// ID) pair must be unique.
+	JobPlaceholderFieldEnum_JOB_ID JobPlaceholderFieldEnum_JobPlaceholderField = 2
+	// Data Type: STRING. Combination of JOB_ID and LOCATION_ID must be unique
+	// per offer.
+	JobPlaceholderFieldEnum_LOCATION_ID JobPlaceholderFieldEnum_JobPlaceholderField = 3
+	// Data Type: STRING. Required. Main headline with job title to be shown in
+	// dynamic ad.
+	JobPlaceholderFieldEnum_TITLE JobPlaceholderFieldEnum_JobPlaceholderField = 4
+	// Data Type: STRING. Job subtitle to be shown in dynamic ad.
+	JobPlaceholderFieldEnum_SUBTITLE JobPlaceholderFieldEnum_JobPlaceholderField = 5
+	// Data Type: STRING. Description of job to be shown in dynamic ad.
+	JobPlaceholderFieldEnum_DESCRIPTION JobPlaceholderFieldEnum_JobPlaceholderField = 6
+	// Data Type: URL. Image to be displayed in the ad. Highly recommended for
+	// image ads.
+	JobPlaceholderFieldEnum_IMAGE_URL JobPlaceholderFieldEnum_JobPlaceholderField = 7
+	// Data Type: STRING. Category of property used to group like items together
+	// for recommendation engine.
+	JobPlaceholderFieldEnum_CATEGORY JobPlaceholderFieldEnum_JobPlaceholderField = 8
+	// Data Type: STRING_LIST. Keywords used for product retrieval.
+	JobPlaceholderFieldEnum_CONTEXTUAL_KEYWORDS JobPlaceholderFieldEnum_JobPlaceholderField = 9
+	// Data Type: STRING. Complete property address, including postal code.
+	JobPlaceholderFieldEnum_ADDRESS JobPlaceholderFieldEnum_JobPlaceholderField = 10
+	// Data Type: STRING. Salary or salary range of job to be shown in dynamic
+	// ad.
+	JobPlaceholderFieldEnum_SALARY JobPlaceholderFieldEnum_JobPlaceholderField = 11
+	// Data Type: URL_LIST. Required. Final URLs to be used in ad when using
+	// Upgraded URLs; the more specific the better (e.g. the individual URL of a
+	// specific job and its location).
+	JobPlaceholderFieldEnum_FINAL_URLS JobPlaceholderFieldEnum_JobPlaceholderField = 12
+	// Data Type: URL_LIST. Final mobile URLs for the ad when using Upgraded
+	// URLs.
+	JobPlaceholderFieldEnum_FINAL_MOBILE_URLS JobPlaceholderFieldEnum_JobPlaceholderField = 14
+	// Data Type: URL. Tracking template for the ad when using Upgraded URLs.
+	JobPlaceholderFieldEnum_TRACKING_URL JobPlaceholderFieldEnum_JobPlaceholderField = 15
+	// Data Type: STRING. Android app link. Must be formatted as:
+	// android-app://{package_id}/{scheme}/{host_path}.
+	// The components are defined as follows:
+	// package_id: app ID as specified in Google Play.
+	// scheme: the scheme to pass to the application. Can be HTTP, or a custom
+	//   scheme.
+	// host_path: identifies the specific content within your application.
+	JobPlaceholderFieldEnum_ANDROID_APP_LINK JobPlaceholderFieldEnum_JobPlaceholderField = 16
+	// Data Type: STRING_LIST. List of recommended job IDs to show together with
+	// this item.
+	JobPlaceholderFieldEnum_SIMILAR_JOB_IDS JobPlaceholderFieldEnum_JobPlaceholderField = 17
+	// Data Type: STRING. iOS app link.
+	JobPlaceholderFieldEnum_IOS_APP_LINK JobPlaceholderFieldEnum_JobPlaceholderField = 18
+	// Data Type: INT64. iOS app store ID.
+	JobPlaceholderFieldEnum_IOS_APP_STORE_ID JobPlaceholderFieldEnum_JobPlaceholderField = 19
+)
+
+var JobPlaceholderFieldEnum_JobPlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "JOB_ID",
+	3:  "LOCATION_ID",
+	4:  "TITLE",
+	5:  "SUBTITLE",
+	6:  "DESCRIPTION",
+	7:  "IMAGE_URL",
+	8:  "CATEGORY",
+	9:  "CONTEXTUAL_KEYWORDS",
+	10: "ADDRESS",
+	11: "SALARY",
+	12: "FINAL_URLS",
+	14: "FINAL_MOBILE_URLS",
+	15: "TRACKING_URL",
+	16: "ANDROID_APP_LINK",
+	17: "SIMILAR_JOB_IDS",
+	18: "IOS_APP_LINK",
+	19: "IOS_APP_STORE_ID",
+}
+
+var JobPlaceholderFieldEnum_JobPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"JOB_ID":              2,
+	"LOCATION_ID":         3,
+	"TITLE":               4,
+	"SUBTITLE":            5,
+	"DESCRIPTION":         6,
+	"IMAGE_URL":           7,
+	"CATEGORY":            8,
+	"CONTEXTUAL_KEYWORDS": 9,
+	"ADDRESS":             10,
+	"SALARY":              11,
+	"FINAL_URLS":          12,
+	"FINAL_MOBILE_URLS":   14,
+	"TRACKING_URL":        15,
+	"ANDROID_APP_LINK":    16,
+	"SIMILAR_JOB_IDS":     17,
+	"IOS_APP_LINK":        18,
+	"IOS_APP_STORE_ID":    19,
+}
+
+func (x JobPlaceholderFieldEnum_JobPlaceholderField) String() string {
+	return proto.EnumName(JobPlaceholderFieldEnum_JobPlaceholderField_name, int32(x))
+}
+
+func (JobPlaceholderFieldEnum_JobPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a7c8492101f9a12a, []int{0, 0}
+}
+
+// Values for Job placeholder fields.
+// For more information about dynamic remarketing feeds, see
+// https://support.google.com/google-ads/answer/6053288.
+type JobPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *JobPlaceholderFieldEnum) Reset()         { *m = JobPlaceholderFieldEnum{} }
+func (m *JobPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*JobPlaceholderFieldEnum) ProtoMessage()    {}
+func (*JobPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a7c8492101f9a12a, []int{0}
+}
+
+func (m *JobPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_JobPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *JobPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_JobPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *JobPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_JobPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *JobPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_JobPlaceholderFieldEnum.Size(m)
+}
+func (m *JobPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_JobPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_JobPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.JobPlaceholderFieldEnum_JobPlaceholderField", JobPlaceholderFieldEnum_JobPlaceholderField_name, JobPlaceholderFieldEnum_JobPlaceholderField_value)
+	proto.RegisterType((*JobPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.JobPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/job_placeholder_field.proto", fileDescriptor_a7c8492101f9a12a)
+}
+
+var fileDescriptor_a7c8492101f9a12a = []byte{
+	// 494 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x41, 0x6f, 0xd3, 0x30,
+	0x14, 0xc7, 0x59, 0xc6, 0xba, 0xd5, 0x2d, 0xab, 0xe7, 0x82, 0x26, 0x10, 0x3b, 0x6c, 0x1f, 0x20,
+	0x39, 0xe4, 0x44, 0x38, 0x39, 0x89, 0x5b, 0xb9, 0x4d, 0xe3, 0x28, 0x4e, 0x3b, 0x8a, 0x2a, 0x45,
+	0xe9, 0x12, 0x42, 0x51, 0x1a, 0x57, 0x75, 0xb7, 0x0f, 0xc4, 0x91, 0x8f, 0xc2, 0x9d, 0x2f, 0xc1,
+	0x01, 0x89, 0x6f, 0x80, 0x1c, 0xd3, 0x4e, 0x42, 0xc0, 0x25, 0x7a, 0x7e, 0xef, 0xf7, 0xff, 0xe7,
+	0xd9, 0xef, 0x81, 0x37, 0xa5, 0x10, 0x65, 0x55, 0x58, 0x59, 0x2e, 0x2d, 0x1d, 0xaa, 0xe8, 0xc1,
+	0xb6, 0x8a, 0xfa, 0x7e, 0x2d, 0xad, 0x4f, 0x62, 0x99, 0x6e, 0xaa, 0xec, 0xae, 0xf8, 0x28, 0xaa,
+	0xbc, 0xd8, 0xa6, 0x1f, 0x56, 0x45, 0x95, 0x9b, 0x9b, 0xad, 0xd8, 0x09, 0x74, 0xa5, 0x79, 0x33,
+	0xcb, 0xa5, 0x79, 0x90, 0x9a, 0x0f, 0xb6, 0xd9, 0x48, 0x5f, 0xbd, 0xde, 0x3b, 0x6f, 0x56, 0x56,
+	0x56, 0xd7, 0x62, 0x97, 0xed, 0x56, 0xa2, 0x96, 0x5a, 0x7c, 0xf3, 0xd3, 0x00, 0x97, 0x23, 0xb1,
+	0x8c, 0x1e, 0xbd, 0x07, 0xca, 0x9a, 0xd4, 0xf7, 0xeb, 0x9b, 0x6f, 0x06, 0xe8, 0xff, 0xa5, 0x86,
+	0x7a, 0xa0, 0x33, 0x0d, 0x79, 0x44, 0x3c, 0x3a, 0xa0, 0xc4, 0x87, 0x4f, 0x50, 0x07, 0x9c, 0x4e,
+	0xc3, 0x71, 0xc8, 0x6e, 0x43, 0x78, 0x84, 0x00, 0x68, 0x8d, 0x98, 0x9b, 0x52, 0x1f, 0x1a, 0x8a,
+	0x0c, 0x98, 0x87, 0x13, 0xca, 0x42, 0x95, 0x38, 0x46, 0x6d, 0x70, 0x92, 0xd0, 0x24, 0x20, 0xf0,
+	0x29, 0xea, 0x82, 0x33, 0x3e, 0x75, 0xf5, 0xe9, 0x44, 0x91, 0x3e, 0xe1, 0x5e, 0x4c, 0x23, 0x05,
+	0xc3, 0x16, 0x7a, 0x06, 0xda, 0x74, 0x82, 0x87, 0x24, 0x9d, 0xc6, 0x01, 0x3c, 0x55, 0xb4, 0x87,
+	0x13, 0x32, 0x64, 0xf1, 0x1c, 0x9e, 0xa1, 0x4b, 0xd0, 0xf7, 0x58, 0x98, 0x90, 0x77, 0xc9, 0x14,
+	0x07, 0xe9, 0x98, 0xcc, 0x6f, 0x59, 0xec, 0x73, 0xd8, 0x56, 0x9d, 0x60, 0xdf, 0x8f, 0x09, 0xe7,
+	0x10, 0xa8, 0x4e, 0x38, 0x0e, 0x70, 0x3c, 0x87, 0x1d, 0x74, 0x0e, 0xc0, 0x80, 0x86, 0x38, 0x50,
+	0x76, 0x1c, 0x76, 0xd1, 0x0b, 0x70, 0xa1, 0xcf, 0x13, 0xe6, 0xd2, 0x80, 0xe8, 0xf4, 0x39, 0x82,
+	0xa0, 0x9b, 0xc4, 0xd8, 0x1b, 0xd3, 0x70, 0xd8, 0xfc, 0xb8, 0x87, 0x9e, 0x03, 0x88, 0x43, 0x3f,
+	0x66, 0xd4, 0x4f, 0x71, 0x14, 0xa5, 0x01, 0x0d, 0xc7, 0x10, 0xa2, 0x3e, 0xe8, 0x71, 0x3a, 0xa1,
+	0x01, 0x8e, 0x53, 0x7d, 0x59, 0x0e, 0x2f, 0x94, 0x98, 0x32, 0xfe, 0x88, 0x21, 0x25, 0xde, 0x67,
+	0x78, 0xc2, 0x62, 0xa2, 0x1e, 0xa1, 0xef, 0xfe, 0x38, 0x02, 0xd7, 0x77, 0x62, 0x6d, 0xfe, 0x77,
+	0x6e, 0xee, 0xcb, 0x91, 0x58, 0xca, 0x3f, 0xdf, 0x3e, 0x52, 0x43, 0x8b, 0x8e, 0xde, 0xbb, 0xbf,
+	0xb5, 0xa5, 0xa8, 0xb2, 0xba, 0x34, 0xc5, 0xb6, 0xb4, 0xca, 0xa2, 0x6e, 0x46, 0xba, 0x5f, 0x9f,
+	0xcd, 0x4a, 0xfe, 0x63, 0x9b, 0xde, 0x36, 0xdf, 0xcf, 0xc6, 0xf1, 0x10, 0xe3, 0x2f, 0xc6, 0xd5,
+	0x50, 0x5b, 0xe1, 0x5c, 0x9a, 0x3a, 0x54, 0xd1, 0xcc, 0x36, 0xd5, 0x0e, 0xc8, 0xaf, 0xfb, 0xfa,
+	0x02, 0xe7, 0x72, 0x71, 0xa8, 0x2f, 0x66, 0xf6, 0xa2, 0xa9, 0x7f, 0x37, 0xae, 0x75, 0xd2, 0x71,
+	0x70, 0x2e, 0x1d, 0xe7, 0x40, 0x38, 0xce, 0xcc, 0x76, 0x9c, 0x86, 0x59, 0xb6, 0x9a, 0xc6, 0xec,
+	0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x79, 0x78, 0x3b, 0xfd, 0xe5, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/keyword_match_type.pb.go b/googleapis/ads/googleads/v3/enums/keyword_match_type.pb.go
new file mode 100644
index 0000000..2be2197
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/keyword_match_type.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/keyword_match_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible Keyword match types.
+type KeywordMatchTypeEnum_KeywordMatchType int32
+
+const (
+	// Not specified.
+	KeywordMatchTypeEnum_UNSPECIFIED KeywordMatchTypeEnum_KeywordMatchType = 0
+	// Used for return value only. Represents value unknown in this version.
+	KeywordMatchTypeEnum_UNKNOWN KeywordMatchTypeEnum_KeywordMatchType = 1
+	// Exact match.
+	KeywordMatchTypeEnum_EXACT KeywordMatchTypeEnum_KeywordMatchType = 2
+	// Phrase match.
+	KeywordMatchTypeEnum_PHRASE KeywordMatchTypeEnum_KeywordMatchType = 3
+	// Broad match.
+	KeywordMatchTypeEnum_BROAD KeywordMatchTypeEnum_KeywordMatchType = 4
+)
+
+var KeywordMatchTypeEnum_KeywordMatchType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "EXACT",
+	3: "PHRASE",
+	4: "BROAD",
+}
+
+var KeywordMatchTypeEnum_KeywordMatchType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"EXACT":       2,
+	"PHRASE":      3,
+	"BROAD":       4,
+}
+
+func (x KeywordMatchTypeEnum_KeywordMatchType) String() string {
+	return proto.EnumName(KeywordMatchTypeEnum_KeywordMatchType_name, int32(x))
+}
+
+func (KeywordMatchTypeEnum_KeywordMatchType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_40ad762a8e7a3289, []int{0, 0}
+}
+
+// Message describing Keyword match types.
+type KeywordMatchTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordMatchTypeEnum) Reset()         { *m = KeywordMatchTypeEnum{} }
+func (m *KeywordMatchTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordMatchTypeEnum) ProtoMessage()    {}
+func (*KeywordMatchTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_40ad762a8e7a3289, []int{0}
+}
+
+func (m *KeywordMatchTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordMatchTypeEnum.Unmarshal(m, b)
+}
+func (m *KeywordMatchTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordMatchTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordMatchTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordMatchTypeEnum.Merge(m, src)
+}
+func (m *KeywordMatchTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordMatchTypeEnum.Size(m)
+}
+func (m *KeywordMatchTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordMatchTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordMatchTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.KeywordMatchTypeEnum_KeywordMatchType", KeywordMatchTypeEnum_KeywordMatchType_name, KeywordMatchTypeEnum_KeywordMatchType_value)
+	proto.RegisterType((*KeywordMatchTypeEnum)(nil), "google.ads.googleads.v3.enums.KeywordMatchTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/keyword_match_type.proto", fileDescriptor_40ad762a8e7a3289)
+}
+
+var fileDescriptor_40ad762a8e7a3289 = []byte{
+	// 315 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4e, 0xc2, 0x30,
+	0x18, 0x97, 0xa1, 0x18, 0xcb, 0xc1, 0x65, 0xd1, 0x8b, 0x91, 0x03, 0x3c, 0x40, 0x77, 0x58, 0xe2,
+	0xa1, 0x9e, 0x3a, 0x98, 0x48, 0x88, 0x63, 0xe1, 0x9f, 0xc6, 0x2c, 0x21, 0x95, 0x36, 0x15, 0x65,
+	0xed, 0x42, 0x07, 0x86, 0xd7, 0xf1, 0xe8, 0xa3, 0xf8, 0x28, 0x3c, 0x85, 0x69, 0x2b, 0x3b, 0x90,
+	0xe8, 0xa5, 0xf9, 0xe5, 0xfb, 0xfd, 0xe9, 0xef, 0xfb, 0xc0, 0x0d, 0x97, 0x92, 0x2f, 0x99, 0x4f,
+	0xa8, 0xf2, 0x2d, 0xd4, 0x68, 0x13, 0xf8, 0x4c, 0xac, 0x33, 0xe5, 0xbf, 0xb3, 0xed, 0x87, 0x5c,
+	0xd1, 0x59, 0x46, 0x8a, 0xf9, 0xeb, 0xac, 0xd8, 0xe6, 0x0c, 0xe6, 0x2b, 0x59, 0x48, 0xaf, 0x61,
+	0xc5, 0x90, 0x50, 0x05, 0x4b, 0x1f, 0xdc, 0x04, 0xd0, 0xf8, 0xae, 0xae, 0xf7, 0xb1, 0xf9, 0xc2,
+	0x27, 0x42, 0xc8, 0x82, 0x14, 0x0b, 0x29, 0x94, 0x35, 0xb7, 0xde, 0xc0, 0x45, 0xdf, 0x06, 0x3f,
+	0xe8, 0xdc, 0xf1, 0x36, 0x67, 0x91, 0x58, 0x67, 0xad, 0x21, 0x70, 0x0f, 0xe7, 0xde, 0x39, 0xa8,
+	0x4f, 0xe2, 0x51, 0x12, 0xb5, 0x7b, 0x77, 0xbd, 0xa8, 0xe3, 0x1e, 0x79, 0x75, 0x70, 0x3a, 0x89,
+	0xfb, 0xf1, 0xe0, 0x31, 0x76, 0x2b, 0xde, 0x19, 0x38, 0x89, 0x9e, 0x70, 0x7b, 0xec, 0x3a, 0x1e,
+	0x00, 0xb5, 0xe4, 0x7e, 0x88, 0x47, 0x91, 0x5b, 0xd5, 0xe3, 0x70, 0x38, 0xc0, 0x1d, 0xf7, 0x38,
+	0xdc, 0x55, 0x40, 0x73, 0x2e, 0x33, 0xf8, 0x6f, 0xdf, 0xf0, 0xf2, 0xf0, 0xdf, 0x44, 0x17, 0x4d,
+	0x2a, 0xcf, 0xe1, 0xaf, 0x8f, 0xcb, 0x25, 0x11, 0x1c, 0xca, 0x15, 0xf7, 0x39, 0x13, 0x66, 0x8d,
+	0xfd, 0xbd, 0xf2, 0x85, 0xfa, 0xe3, 0x7c, 0xb7, 0xe6, 0xfd, 0x74, 0xaa, 0x5d, 0x8c, 0xbf, 0x9c,
+	0x46, 0xd7, 0x46, 0x61, 0xaa, 0xa0, 0x85, 0x1a, 0x4d, 0x03, 0xa8, 0x77, 0x57, 0xdf, 0x7b, 0x3e,
+	0xc5, 0x54, 0xa5, 0x25, 0x9f, 0x4e, 0x83, 0xd4, 0xf0, 0x3b, 0xa7, 0x69, 0x87, 0x08, 0x61, 0xaa,
+	0x10, 0x2a, 0x15, 0x08, 0x4d, 0x03, 0x84, 0x8c, 0xe6, 0xa5, 0x66, 0x8a, 0x05, 0x3f, 0x01, 0x00,
+	0x00, 0xff, 0xff, 0xbd, 0xe1, 0xac, 0xf4, 0xd6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/keyword_plan_competition_level.pb.go b/googleapis/ads/googleads/v3/enums/keyword_plan_competition_level.pb.go
new file mode 100644
index 0000000..1ed1d24
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/keyword_plan_competition_level.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/keyword_plan_competition_level.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Competition level of a keyword.
+type KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel int32
+
+const (
+	// Not specified.
+	KeywordPlanCompetitionLevelEnum_UNSPECIFIED KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 0
+	// The value is unknown in this version.
+	KeywordPlanCompetitionLevelEnum_UNKNOWN KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 1
+	// Low competition.
+	KeywordPlanCompetitionLevelEnum_LOW KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 2
+	// Medium competition.
+	KeywordPlanCompetitionLevelEnum_MEDIUM KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 3
+	// High competition.
+	KeywordPlanCompetitionLevelEnum_HIGH KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 4
+)
+
+var KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "LOW",
+	3: "MEDIUM",
+	4: "HIGH",
+}
+
+var KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"LOW":         2,
+	"MEDIUM":      3,
+	"HIGH":        4,
+}
+
+func (x KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel) String() string {
+	return proto.EnumName(KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel_name, int32(x))
+}
+
+func (KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_aaf960a010cf6f64, []int{0, 0}
+}
+
+// Container for enumeration of keyword competition levels. The competition
+// level indicates how competitive ad placement is for a keyword and
+// is determined by the number of advertisers bidding on that keyword relative
+// to all keywords across Google. The competition level can depend on the
+// location and Search Network targeting options you've selected.
+type KeywordPlanCompetitionLevelEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordPlanCompetitionLevelEnum) Reset()         { *m = KeywordPlanCompetitionLevelEnum{} }
+func (m *KeywordPlanCompetitionLevelEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanCompetitionLevelEnum) ProtoMessage()    {}
+func (*KeywordPlanCompetitionLevelEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aaf960a010cf6f64, []int{0}
+}
+
+func (m *KeywordPlanCompetitionLevelEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanCompetitionLevelEnum.Unmarshal(m, b)
+}
+func (m *KeywordPlanCompetitionLevelEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanCompetitionLevelEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanCompetitionLevelEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanCompetitionLevelEnum.Merge(m, src)
+}
+func (m *KeywordPlanCompetitionLevelEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanCompetitionLevelEnum.Size(m)
+}
+func (m *KeywordPlanCompetitionLevelEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanCompetitionLevelEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanCompetitionLevelEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel", KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel_name, KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel_value)
+	proto.RegisterType((*KeywordPlanCompetitionLevelEnum)(nil), "google.ads.googleads.v3.enums.KeywordPlanCompetitionLevelEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/keyword_plan_competition_level.proto", fileDescriptor_aaf960a010cf6f64)
+}
+
+var fileDescriptor_aaf960a010cf6f64 = []byte{
+	// 325 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xb1, 0x6e, 0xf2, 0x30,
+	0x18, 0xfc, 0x09, 0x08, 0x7e, 0x99, 0xa1, 0x51, 0xc6, 0xb6, 0xa8, 0x85, 0x07, 0x70, 0x86, 0x6c,
+	0xee, 0x14, 0x20, 0x85, 0x08, 0x08, 0x91, 0x2a, 0x40, 0x42, 0x91, 0x90, 0x8b, 0x2d, 0x2b, 0xaa,
+	0x63, 0x47, 0x38, 0x50, 0x75, 0xe8, 0xcb, 0x74, 0xec, 0xa3, 0xf4, 0x51, 0xba, 0x77, 0xaf, 0x6c,
+	0x17, 0x3a, 0x95, 0x25, 0x3a, 0xe5, 0xee, 0xbb, 0xf3, 0x1d, 0xe8, 0x33, 0x29, 0x19, 0xa7, 0x3e,
+	0x26, 0xca, 0xb7, 0x50, 0xa3, 0x43, 0xe0, 0x53, 0xb1, 0x2f, 0x94, 0xff, 0x44, 0x5f, 0x9e, 0xe5,
+	0x8e, 0x6c, 0x4a, 0x8e, 0xc5, 0x66, 0x2b, 0x8b, 0x92, 0x56, 0x79, 0x95, 0x4b, 0xb1, 0xe1, 0xf4,
+	0x40, 0x39, 0x2c, 0x77, 0xb2, 0x92, 0x5e, 0xc7, 0x1e, 0x42, 0x4c, 0x14, 0x3c, 0x79, 0xc0, 0x43,
+	0x00, 0x8d, 0xc7, 0xe5, 0xf5, 0x31, 0xa2, 0xcc, 0x7d, 0x2c, 0x84, 0xac, 0xb0, 0x76, 0x50, 0xf6,
+	0xb8, 0xf7, 0x0a, 0x6e, 0x26, 0x36, 0x24, 0xe5, 0x58, 0x0c, 0x7e, 0x23, 0xa6, 0x3a, 0x21, 0x12,
+	0xfb, 0xa2, 0xb7, 0x06, 0x57, 0x67, 0x24, 0xde, 0x05, 0x68, 0x2f, 0x92, 0x87, 0x34, 0x1a, 0xc4,
+	0xf7, 0x71, 0x34, 0x74, 0xff, 0x79, 0x6d, 0xd0, 0x5a, 0x24, 0x93, 0x64, 0xbe, 0x4a, 0xdc, 0x9a,
+	0xd7, 0x02, 0xf5, 0xe9, 0x7c, 0xe5, 0x3a, 0x1e, 0x00, 0xcd, 0x59, 0x34, 0x8c, 0x17, 0x33, 0xb7,
+	0xee, 0xfd, 0x07, 0x8d, 0x71, 0x3c, 0x1a, 0xbb, 0x8d, 0xfe, 0x57, 0x0d, 0x74, 0xb7, 0xb2, 0x80,
+	0x67, 0x2b, 0xf4, 0x6f, 0xcf, 0xe4, 0xa7, 0xba, 0x46, 0x5a, 0x5b, 0xff, 0x2c, 0x09, 0x99, 0xe4,
+	0x58, 0x30, 0x28, 0x77, 0xcc, 0x67, 0x54, 0x98, 0x92, 0xc7, 0x65, 0xcb, 0x5c, 0xfd, 0x31, 0xf4,
+	0x9d, 0xf9, 0xbe, 0x39, 0xf5, 0x51, 0x18, 0xbe, 0x3b, 0x9d, 0x91, 0xb5, 0x0a, 0x89, 0x82, 0x16,
+	0x6a, 0xb4, 0x0c, 0xa0, 0x9e, 0x43, 0x7d, 0x1c, 0xf9, 0x2c, 0x24, 0x2a, 0x3b, 0xf1, 0xd9, 0x32,
+	0xc8, 0x0c, 0xff, 0xe9, 0x74, 0xed, 0x4f, 0x84, 0x42, 0xa2, 0x10, 0x3a, 0x29, 0x10, 0x5a, 0x06,
+	0x08, 0x19, 0xcd, 0x63, 0xd3, 0x3c, 0x2c, 0xf8, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x87, 0x6a,
+	0xf6, 0x00, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/keyword_plan_forecast_interval.pb.go b/googleapis/ads/googleads/v3/enums/keyword_plan_forecast_interval.pb.go
new file mode 100644
index 0000000..16c1b96
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/keyword_plan_forecast_interval.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/keyword_plan_forecast_interval.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Forecast intervals.
+type KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval int32
+
+const (
+	// Not specified.
+	KeywordPlanForecastIntervalEnum_UNSPECIFIED KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 0
+	// The value is unknown in this version.
+	KeywordPlanForecastIntervalEnum_UNKNOWN KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 1
+	// The next week date range for keyword plan. The next week is based
+	// on the default locale of the user's account and is mostly SUN-SAT or
+	// MON-SUN.
+	// This can be different from next-7 days.
+	KeywordPlanForecastIntervalEnum_NEXT_WEEK KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 3
+	// The next month date range for keyword plan.
+	KeywordPlanForecastIntervalEnum_NEXT_MONTH KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 4
+	// The next quarter date range for keyword plan.
+	KeywordPlanForecastIntervalEnum_NEXT_QUARTER KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 5
+)
+
+var KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	3: "NEXT_WEEK",
+	4: "NEXT_MONTH",
+	5: "NEXT_QUARTER",
+}
+
+var KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"NEXT_WEEK":    3,
+	"NEXT_MONTH":   4,
+	"NEXT_QUARTER": 5,
+}
+
+func (x KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval) String() string {
+	return proto.EnumName(KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_name, int32(x))
+}
+
+func (KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7a59f184ceefa6df, []int{0, 0}
+}
+
+// Container for enumeration of forecast intervals.
+type KeywordPlanForecastIntervalEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordPlanForecastIntervalEnum) Reset()         { *m = KeywordPlanForecastIntervalEnum{} }
+func (m *KeywordPlanForecastIntervalEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanForecastIntervalEnum) ProtoMessage()    {}
+func (*KeywordPlanForecastIntervalEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7a59f184ceefa6df, []int{0}
+}
+
+func (m *KeywordPlanForecastIntervalEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanForecastIntervalEnum.Unmarshal(m, b)
+}
+func (m *KeywordPlanForecastIntervalEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanForecastIntervalEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanForecastIntervalEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanForecastIntervalEnum.Merge(m, src)
+}
+func (m *KeywordPlanForecastIntervalEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanForecastIntervalEnum.Size(m)
+}
+func (m *KeywordPlanForecastIntervalEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanForecastIntervalEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanForecastIntervalEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval", KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_name, KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_value)
+	proto.RegisterType((*KeywordPlanForecastIntervalEnum)(nil), "google.ads.googleads.v3.enums.KeywordPlanForecastIntervalEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/keyword_plan_forecast_interval.proto", fileDescriptor_7a59f184ceefa6df)
+}
+
+var fileDescriptor_7a59f184ceefa6df = []byte{
+	// 340 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0xf3, 0x30,
+	0x10, 0xfd, 0xd2, 0x7e, 0x80, 0x70, 0xf9, 0x89, 0xb2, 0x04, 0x2a, 0x68, 0x0f, 0xe0, 0x2c, 0xb2,
+	0x33, 0xab, 0x14, 0xdc, 0x52, 0x55, 0xa4, 0xa1, 0xf4, 0x07, 0xa1, 0x48, 0x91, 0x69, 0x8c, 0x15,
+	0xe1, 0xda, 0x51, 0x9c, 0x16, 0x71, 0x0a, 0xee, 0xc0, 0x92, 0xa3, 0x70, 0x14, 0xf6, 0xec, 0x51,
+	0xec, 0xb6, 0x3b, 0xb2, 0xb1, 0xde, 0x78, 0x66, 0xde, 0x9b, 0xf7, 0x40, 0x87, 0x49, 0xc9, 0x38,
+	0x75, 0x49, 0xa2, 0x5c, 0x03, 0x4b, 0xb4, 0xf2, 0x5c, 0x2a, 0x96, 0x0b, 0xe5, 0xbe, 0xd0, 0xb7,
+	0x57, 0x99, 0x27, 0x71, 0xc6, 0x89, 0x88, 0x9f, 0x65, 0x4e, 0xe7, 0x44, 0x15, 0x71, 0x2a, 0x0a,
+	0x9a, 0xaf, 0x08, 0x87, 0x59, 0x2e, 0x0b, 0xe9, 0x34, 0xcd, 0x22, 0x24, 0x89, 0x82, 0x5b, 0x0e,
+	0xb8, 0xf2, 0xa0, 0xe6, 0x38, 0x39, 0xdb, 0x48, 0x64, 0xa9, 0x4b, 0x84, 0x90, 0x05, 0x29, 0x52,
+	0x29, 0x94, 0x59, 0x6e, 0xbf, 0x5b, 0xe0, 0x7c, 0x60, 0x54, 0x42, 0x4e, 0x44, 0x77, 0xad, 0xd1,
+	0x5f, 0x4b, 0x60, 0xb1, 0x5c, 0xb4, 0x39, 0x38, 0xad, 0x18, 0x71, 0x8e, 0x41, 0x63, 0x12, 0xdc,
+	0x87, 0xf8, 0xaa, 0xdf, 0xed, 0xe3, 0x6b, 0xfb, 0x9f, 0xd3, 0x00, 0x7b, 0x93, 0x60, 0x10, 0x0c,
+	0x67, 0x81, 0x6d, 0x39, 0x87, 0x60, 0x3f, 0xc0, 0x0f, 0xe3, 0x78, 0x86, 0xf1, 0xc0, 0xae, 0x3b,
+	0x47, 0x00, 0xe8, 0xf2, 0x76, 0x18, 0x8c, 0x6f, 0xec, 0xff, 0x8e, 0x0d, 0x0e, 0x74, 0x7d, 0x37,
+	0xf1, 0x47, 0x63, 0x3c, 0xb2, 0x77, 0x3a, 0x3f, 0x16, 0x68, 0xcd, 0xe5, 0x02, 0x56, 0xba, 0xea,
+	0x5c, 0x54, 0x5c, 0x14, 0x96, 0xce, 0x42, 0xeb, 0x71, 0x1d, 0x2e, 0x64, 0x92, 0x13, 0xc1, 0xa0,
+	0xcc, 0x99, 0xcb, 0xa8, 0xd0, 0xbe, 0x37, 0x61, 0x67, 0xa9, 0xfa, 0x23, 0xfb, 0x4b, 0xfd, 0x7e,
+	0xd4, 0xea, 0x3d, 0xdf, 0xff, 0xac, 0x35, 0x7b, 0x86, 0xca, 0x4f, 0x14, 0x34, 0xb0, 0x44, 0x53,
+	0x0f, 0x96, 0x01, 0xa9, 0xaf, 0x4d, 0x3f, 0xf2, 0x13, 0x15, 0x6d, 0xfb, 0xd1, 0xd4, 0x8b, 0x74,
+	0xff, 0xbb, 0xd6, 0x32, 0x9f, 0x08, 0xf9, 0x89, 0x42, 0x68, 0x3b, 0x81, 0xd0, 0xd4, 0x43, 0x48,
+	0xcf, 0x3c, 0xed, 0xea, 0xc3, 0xbc, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6b, 0x04, 0x05, 0xe3,
+	0x13, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/keyword_plan_network.pb.go b/googleapis/ads/googleads/v3/enums/keyword_plan_network.pb.go
new file mode 100644
index 0000000..7195e9a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/keyword_plan_network.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/keyword_plan_network.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates keyword plan forecastable network types.
+type KeywordPlanNetworkEnum_KeywordPlanNetwork int32
+
+const (
+	// Not specified.
+	KeywordPlanNetworkEnum_UNSPECIFIED KeywordPlanNetworkEnum_KeywordPlanNetwork = 0
+	// The value is unknown in this version.
+	KeywordPlanNetworkEnum_UNKNOWN KeywordPlanNetworkEnum_KeywordPlanNetwork = 1
+	// Google Search.
+	KeywordPlanNetworkEnum_GOOGLE_SEARCH KeywordPlanNetworkEnum_KeywordPlanNetwork = 2
+	// Google Search + Search partners.
+	KeywordPlanNetworkEnum_GOOGLE_SEARCH_AND_PARTNERS KeywordPlanNetworkEnum_KeywordPlanNetwork = 3
+)
+
+var KeywordPlanNetworkEnum_KeywordPlanNetwork_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "GOOGLE_SEARCH",
+	3: "GOOGLE_SEARCH_AND_PARTNERS",
+}
+
+var KeywordPlanNetworkEnum_KeywordPlanNetwork_value = map[string]int32{
+	"UNSPECIFIED":                0,
+	"UNKNOWN":                    1,
+	"GOOGLE_SEARCH":              2,
+	"GOOGLE_SEARCH_AND_PARTNERS": 3,
+}
+
+func (x KeywordPlanNetworkEnum_KeywordPlanNetwork) String() string {
+	return proto.EnumName(KeywordPlanNetworkEnum_KeywordPlanNetwork_name, int32(x))
+}
+
+func (KeywordPlanNetworkEnum_KeywordPlanNetwork) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_01afaeca21e51bd7, []int{0, 0}
+}
+
+// Container for enumeration of keyword plan forecastable network types.
+type KeywordPlanNetworkEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordPlanNetworkEnum) Reset()         { *m = KeywordPlanNetworkEnum{} }
+func (m *KeywordPlanNetworkEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanNetworkEnum) ProtoMessage()    {}
+func (*KeywordPlanNetworkEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01afaeca21e51bd7, []int{0}
+}
+
+func (m *KeywordPlanNetworkEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanNetworkEnum.Unmarshal(m, b)
+}
+func (m *KeywordPlanNetworkEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanNetworkEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanNetworkEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanNetworkEnum.Merge(m, src)
+}
+func (m *KeywordPlanNetworkEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanNetworkEnum.Size(m)
+}
+func (m *KeywordPlanNetworkEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanNetworkEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanNetworkEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.KeywordPlanNetworkEnum_KeywordPlanNetwork", KeywordPlanNetworkEnum_KeywordPlanNetwork_name, KeywordPlanNetworkEnum_KeywordPlanNetwork_value)
+	proto.RegisterType((*KeywordPlanNetworkEnum)(nil), "google.ads.googleads.v3.enums.KeywordPlanNetworkEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/keyword_plan_network.proto", fileDescriptor_01afaeca21e51bd7)
+}
+
+var fileDescriptor_01afaeca21e51bd7 = []byte{
+	// 323 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x1c, 0x76, 0x1d, 0x28, 0x64, 0x88, 0xb5, 0x07, 0x85, 0xe1, 0x84, 0xed, 0x01, 0xd2, 0x43, 0x2f,
+	0x12, 0x4f, 0xd9, 0x56, 0xeb, 0x98, 0x64, 0x65, 0x73, 0x13, 0xa4, 0x50, 0xa2, 0x09, 0x61, 0xac,
+	0x4b, 0x4a, 0xd3, 0x6d, 0x78, 0xf2, 0x5d, 0x3c, 0xfa, 0x28, 0x3e, 0x8a, 0xf8, 0x10, 0xd2, 0xc4,
+	0x0d, 0x64, 0xe8, 0x25, 0x7c, 0xe4, 0xfb, 0xc3, 0xf7, 0xfb, 0xc0, 0x95, 0x50, 0x4a, 0x64, 0xdc,
+	0xa7, 0x4c, 0xfb, 0x16, 0x56, 0x68, 0x1d, 0xf8, 0x5c, 0xae, 0x96, 0xda, 0x5f, 0xf0, 0x97, 0x8d,
+	0x2a, 0x58, 0x9a, 0x67, 0x54, 0xa6, 0x92, 0x97, 0x1b, 0x55, 0x2c, 0x60, 0x5e, 0xa8, 0x52, 0x79,
+	0x2d, 0x2b, 0x87, 0x94, 0x69, 0xb8, 0x73, 0xc2, 0x75, 0x00, 0x8d, 0xb3, 0x79, 0xb1, 0x0d, 0xce,
+	0xe7, 0x3e, 0x95, 0x52, 0x95, 0xb4, 0x9c, 0x2b, 0xa9, 0xad, 0xb9, 0xf3, 0x0a, 0xce, 0x86, 0x36,
+	0x3a, 0xce, 0xa8, 0x24, 0x36, 0x38, 0x94, 0xab, 0x65, 0x87, 0x03, 0x6f, 0x9f, 0xf1, 0x4e, 0x40,
+	0x63, 0x4a, 0x26, 0x71, 0xd8, 0x1b, 0xdc, 0x0c, 0xc2, 0xbe, 0x7b, 0xe0, 0x35, 0xc0, 0xd1, 0x94,
+	0x0c, 0xc9, 0xe8, 0x81, 0xb8, 0x35, 0xef, 0x14, 0x1c, 0x47, 0xa3, 0x51, 0x74, 0x17, 0xa6, 0x93,
+	0x10, 0x8f, 0x7b, 0xb7, 0xae, 0xe3, 0x5d, 0x82, 0xe6, 0xaf, 0xaf, 0x14, 0x93, 0x7e, 0x1a, 0xe3,
+	0xf1, 0x3d, 0x09, 0xc7, 0x13, 0xb7, 0xde, 0xfd, 0xaa, 0x81, 0xf6, 0xb3, 0x5a, 0xc2, 0x7f, 0x8f,
+	0xe8, 0x9e, 0xef, 0x57, 0x89, 0xab, 0xfe, 0x71, 0xed, 0xb1, 0xfb, 0xe3, 0x14, 0x2a, 0xa3, 0x52,
+	0x40, 0x55, 0x08, 0x5f, 0x70, 0x69, 0xae, 0xdb, 0x0e, 0x99, 0xcf, 0xf5, 0x1f, 0xbb, 0x5e, 0x9b,
+	0xf7, 0xcd, 0xa9, 0x47, 0x18, 0xbf, 0x3b, 0xad, 0xc8, 0x46, 0x61, 0xa6, 0xa1, 0x85, 0x15, 0x9a,
+	0x05, 0xb0, 0x1a, 0x44, 0x7f, 0x6c, 0xf9, 0x04, 0x33, 0x9d, 0xec, 0xf8, 0x64, 0x16, 0x24, 0x86,
+	0xff, 0x74, 0xda, 0xf6, 0x13, 0x21, 0xcc, 0x34, 0x42, 0x3b, 0x05, 0x42, 0xb3, 0x00, 0x21, 0xa3,
+	0x79, 0x3a, 0x34, 0xc5, 0x82, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x99, 0x75, 0x65, 0x21, 0xef,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/label_status.pb.go b/googleapis/ads/googleads/v3/enums/label_status.pb.go
new file mode 100644
index 0000000..3156d23
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/label_status.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/label_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a label.
+type LabelStatusEnum_LabelStatus int32
+
+const (
+	// Not specified.
+	LabelStatusEnum_UNSPECIFIED LabelStatusEnum_LabelStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	LabelStatusEnum_UNKNOWN LabelStatusEnum_LabelStatus = 1
+	// Label is enabled.
+	LabelStatusEnum_ENABLED LabelStatusEnum_LabelStatus = 2
+	// Label is removed.
+	LabelStatusEnum_REMOVED LabelStatusEnum_LabelStatus = 3
+)
+
+var LabelStatusEnum_LabelStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var LabelStatusEnum_LabelStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x LabelStatusEnum_LabelStatus) String() string {
+	return proto.EnumName(LabelStatusEnum_LabelStatus_name, int32(x))
+}
+
+func (LabelStatusEnum_LabelStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d2f43f327476a4c8, []int{0, 0}
+}
+
+// Container for enum describing possible status of a label.
+type LabelStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LabelStatusEnum) Reset()         { *m = LabelStatusEnum{} }
+func (m *LabelStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*LabelStatusEnum) ProtoMessage()    {}
+func (*LabelStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d2f43f327476a4c8, []int{0}
+}
+
+func (m *LabelStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LabelStatusEnum.Unmarshal(m, b)
+}
+func (m *LabelStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LabelStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *LabelStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LabelStatusEnum.Merge(m, src)
+}
+func (m *LabelStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_LabelStatusEnum.Size(m)
+}
+func (m *LabelStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_LabelStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LabelStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.LabelStatusEnum_LabelStatus", LabelStatusEnum_LabelStatus_name, LabelStatusEnum_LabelStatus_value)
+	proto.RegisterType((*LabelStatusEnum)(nil), "google.ads.googleads.v3.enums.LabelStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/label_status.proto", fileDescriptor_d2f43f327476a4c8)
+}
+
+var fileDescriptor_d2f43f327476a4c8 = []byte{
+	// 294 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x6b, 0xbb, 0x30,
+	0x18, 0xfe, 0x69, 0xe1, 0x37, 0x88, 0x87, 0x8a, 0xc7, 0xb1, 0x1e, 0xda, 0x0f, 0x90, 0x0c, 0x72,
+	0xcb, 0x4e, 0x71, 0x66, 0xa5, 0xac, 0xb3, 0xb2, 0x52, 0x37, 0x86, 0x30, 0xd2, 0x29, 0x41, 0xd0,
+	0x44, 0x1a, 0xed, 0x07, 0xda, 0x71, 0x1f, 0x65, 0xdf, 0x63, 0x97, 0x7d, 0x8a, 0x91, 0x58, 0xa5,
+	0x97, 0xed, 0x22, 0xcf, 0xfb, 0x3e, 0x7f, 0x7c, 0xf2, 0x82, 0x6b, 0xa1, 0x94, 0xa8, 0x0a, 0xc4,
+	0x73, 0x8d, 0x7a, 0x68, 0xd0, 0x11, 0xa3, 0x42, 0x76, 0xb5, 0x46, 0x15, 0xdf, 0x17, 0xd5, 0xab,
+	0x6e, 0x79, 0xdb, 0x69, 0xd8, 0x1c, 0x54, 0xab, 0x82, 0x59, 0x2f, 0x83, 0x3c, 0xd7, 0x70, 0x74,
+	0xc0, 0x23, 0x86, 0xd6, 0x71, 0x79, 0x35, 0x04, 0x36, 0x25, 0xe2, 0x52, 0xaa, 0x96, 0xb7, 0xa5,
+	0x92, 0x27, 0xf3, 0xe2, 0x19, 0x4c, 0xd7, 0x26, 0x72, 0x6b, 0x13, 0x99, 0xec, 0xea, 0x05, 0x03,
+	0xde, 0xd9, 0x2a, 0x98, 0x02, 0x6f, 0x17, 0x6f, 0x13, 0x76, 0xbb, 0xba, 0x5b, 0xb1, 0xc8, 0xff,
+	0x17, 0x78, 0xe0, 0x62, 0x17, 0xdf, 0xc7, 0x9b, 0xa7, 0xd8, 0x77, 0xcc, 0xc0, 0x62, 0x1a, 0xae,
+	0x59, 0xe4, 0xbb, 0x66, 0x78, 0x64, 0x0f, 0x9b, 0x94, 0x45, 0xfe, 0x24, 0xfc, 0x72, 0xc0, 0xfc,
+	0x4d, 0xd5, 0xf0, 0xcf, 0x76, 0xa1, 0x7f, 0xf6, 0xab, 0xc4, 0x34, 0x4a, 0x9c, 0x97, 0xf0, 0x64,
+	0x11, 0xaa, 0xe2, 0x52, 0x40, 0x75, 0x10, 0x48, 0x14, 0xd2, 0xf6, 0x1d, 0x4e, 0xd2, 0x94, 0xfa,
+	0x97, 0x0b, 0xdd, 0xd8, 0xef, 0xbb, 0x3b, 0x59, 0x52, 0xfa, 0xe1, 0xce, 0x96, 0x7d, 0x14, 0xcd,
+	0x35, 0xec, 0xa1, 0x41, 0x29, 0x86, 0xe6, 0xa5, 0xfa, 0x73, 0xe0, 0x33, 0x9a, 0xeb, 0x6c, 0xe4,
+	0xb3, 0x14, 0x67, 0x96, 0xff, 0x76, 0xe7, 0xfd, 0x92, 0x10, 0x9a, 0x6b, 0x42, 0x46, 0x05, 0x21,
+	0x29, 0x26, 0xc4, 0x6a, 0xf6, 0xff, 0x6d, 0x31, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0x21, 0x43,
+	0x8c, 0x14, 0xb9, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/legacy_app_install_ad_app_store.pb.go b/googleapis/ads/googleads/v3/enums/legacy_app_install_ad_app_store.pb.go
new file mode 100644
index 0000000..9db4e8e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/legacy_app_install_ad_app_store.pb.go
@@ -0,0 +1,140 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/legacy_app_install_ad_app_store.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// App store type in a legacy app install ad.
+type LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore int32
+
+const (
+	// Not specified.
+	LegacyAppInstallAdAppStoreEnum_UNSPECIFIED LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore = 0
+	// Used for return value only. Represents value unknown in this version.
+	LegacyAppInstallAdAppStoreEnum_UNKNOWN LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore = 1
+	// Apple iTunes.
+	LegacyAppInstallAdAppStoreEnum_APPLE_APP_STORE LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore = 2
+	// Google Play.
+	LegacyAppInstallAdAppStoreEnum_GOOGLE_PLAY LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore = 3
+	// Windows Store.
+	LegacyAppInstallAdAppStoreEnum_WINDOWS_STORE LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore = 4
+	// Windows Phone Store.
+	LegacyAppInstallAdAppStoreEnum_WINDOWS_PHONE_STORE LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore = 5
+	// The app is hosted in a Chinese app store.
+	LegacyAppInstallAdAppStoreEnum_CN_APP_STORE LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore = 6
+)
+
+var LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "APPLE_APP_STORE",
+	3: "GOOGLE_PLAY",
+	4: "WINDOWS_STORE",
+	5: "WINDOWS_PHONE_STORE",
+	6: "CN_APP_STORE",
+}
+
+var LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"APPLE_APP_STORE":     2,
+	"GOOGLE_PLAY":         3,
+	"WINDOWS_STORE":       4,
+	"WINDOWS_PHONE_STORE": 5,
+	"CN_APP_STORE":        6,
+}
+
+func (x LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore) String() string {
+	return proto.EnumName(LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore_name, int32(x))
+}
+
+func (LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7fbe0fcc71f1681d, []int{0, 0}
+}
+
+// Container for enum describing app store type in a legacy app install ad.
+type LegacyAppInstallAdAppStoreEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LegacyAppInstallAdAppStoreEnum) Reset()         { *m = LegacyAppInstallAdAppStoreEnum{} }
+func (m *LegacyAppInstallAdAppStoreEnum) String() string { return proto.CompactTextString(m) }
+func (*LegacyAppInstallAdAppStoreEnum) ProtoMessage()    {}
+func (*LegacyAppInstallAdAppStoreEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7fbe0fcc71f1681d, []int{0}
+}
+
+func (m *LegacyAppInstallAdAppStoreEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LegacyAppInstallAdAppStoreEnum.Unmarshal(m, b)
+}
+func (m *LegacyAppInstallAdAppStoreEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LegacyAppInstallAdAppStoreEnum.Marshal(b, m, deterministic)
+}
+func (m *LegacyAppInstallAdAppStoreEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LegacyAppInstallAdAppStoreEnum.Merge(m, src)
+}
+func (m *LegacyAppInstallAdAppStoreEnum) XXX_Size() int {
+	return xxx_messageInfo_LegacyAppInstallAdAppStoreEnum.Size(m)
+}
+func (m *LegacyAppInstallAdAppStoreEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_LegacyAppInstallAdAppStoreEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LegacyAppInstallAdAppStoreEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore", LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore_name, LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore_value)
+	proto.RegisterType((*LegacyAppInstallAdAppStoreEnum)(nil), "google.ads.googleads.v3.enums.LegacyAppInstallAdAppStoreEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/legacy_app_install_ad_app_store.proto", fileDescriptor_7fbe0fcc71f1681d)
+}
+
+var fileDescriptor_7fbe0fcc71f1681d = []byte{
+	// 371 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0x41, 0x6b, 0xa3, 0x40,
+	0x18, 0x5d, 0xcd, 0x6e, 0x16, 0x26, 0xbb, 0xc4, 0x35, 0x87, 0x85, 0xb0, 0xd9, 0x92, 0xfc, 0x80,
+	0xf1, 0xe0, 0x6d, 0x7a, 0x9a, 0x24, 0xd6, 0x4a, 0x45, 0x87, 0xda, 0x24, 0xb4, 0x08, 0x32, 0x8d,
+	0x22, 0x82, 0x99, 0x19, 0x32, 0x26, 0xd0, 0x3f, 0xd3, 0x43, 0x8f, 0xfd, 0x17, 0xbd, 0xf6, 0xa7,
+	0xf4, 0xdc, 0x1f, 0x50, 0x1c, 0x63, 0xe8, 0x25, 0xbd, 0xc8, 0xf3, 0x7b, 0xef, 0x7b, 0x4f, 0xdf,
+	0x07, 0x66, 0x39, 0xe7, 0x79, 0x99, 0x59, 0x34, 0x95, 0x56, 0x03, 0x6b, 0xb4, 0xb7, 0xad, 0x8c,
+	0xed, 0x36, 0xd2, 0x2a, 0xb3, 0x9c, 0xae, 0x1f, 0x12, 0x2a, 0x44, 0x52, 0x30, 0x59, 0xd1, 0xb2,
+	0x4c, 0x68, 0xaa, 0x5e, 0x65, 0xc5, 0xb7, 0x19, 0x14, 0x5b, 0x5e, 0x71, 0x73, 0xd4, 0x6c, 0x42,
+	0x9a, 0x4a, 0x78, 0x34, 0x81, 0x7b, 0x1b, 0x2a, 0x93, 0xe1, 0xbf, 0x36, 0x43, 0x14, 0x16, 0x65,
+	0x8c, 0x57, 0xb4, 0x2a, 0x38, 0x93, 0xcd, 0xf2, 0xe4, 0x45, 0x03, 0xff, 0x7d, 0x15, 0x83, 0x85,
+	0xf0, 0x9a, 0x10, 0x9c, 0x62, 0x21, 0xa2, 0x3a, 0xc1, 0x61, 0xbb, 0xcd, 0xe4, 0x51, 0x03, 0xc3,
+	0xd3, 0x12, 0xb3, 0x0f, 0x7a, 0x8b, 0x20, 0x22, 0xce, 0xcc, 0xbb, 0xf0, 0x9c, 0xb9, 0xf1, 0xcd,
+	0xec, 0x81, 0x9f, 0x8b, 0xe0, 0x2a, 0x08, 0x57, 0x81, 0xa1, 0x99, 0x03, 0xd0, 0xc7, 0x84, 0xf8,
+	0x4e, 0x82, 0x09, 0x49, 0xa2, 0x9b, 0xf0, 0xda, 0x31, 0xf4, 0x7a, 0xc5, 0x0d, 0x43, 0xd7, 0x77,
+	0x12, 0xe2, 0xe3, 0x5b, 0xa3, 0x63, 0xfe, 0x01, 0xbf, 0x57, 0x5e, 0x30, 0x0f, 0x57, 0xd1, 0x41,
+	0xf3, 0xdd, 0xfc, 0x0b, 0x06, 0xed, 0x88, 0x5c, 0x86, 0x81, 0x73, 0x20, 0x7e, 0x98, 0x06, 0xf8,
+	0x35, 0x0b, 0x3e, 0xd9, 0x75, 0xa7, 0xef, 0x1a, 0x18, 0xaf, 0xf9, 0x06, 0x7e, 0xd9, 0xc3, 0xf4,
+	0xec, 0xf4, 0x3f, 0x90, 0xba, 0x0a, 0xa2, 0xdd, 0x4d, 0x0f, 0x0e, 0x39, 0x2f, 0x29, 0xcb, 0x21,
+	0xdf, 0xe6, 0x56, 0x9e, 0x31, 0x55, 0x54, 0x7b, 0x1e, 0x51, 0xc8, 0x13, 0xd7, 0x3a, 0x57, 0xcf,
+	0x27, 0xbd, 0xe3, 0x62, 0xfc, 0xac, 0x8f, 0xdc, 0xc6, 0x0a, 0xa7, 0x12, 0x36, 0xb0, 0x46, 0x4b,
+	0x1b, 0xd6, 0x95, 0xca, 0xd7, 0x96, 0x8f, 0x71, 0x2a, 0xe3, 0x23, 0x1f, 0x2f, 0xed, 0x58, 0xf1,
+	0x6f, 0xfa, 0xb8, 0x19, 0x22, 0x84, 0x53, 0x89, 0xd0, 0x51, 0x81, 0xd0, 0xd2, 0x46, 0x48, 0x69,
+	0xee, 0xbb, 0xea, 0xc3, 0xec, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8b, 0xbf, 0x9c, 0xfa, 0x45,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/listing_custom_attribute_index.pb.go b/googleapis/ads/googleads/v3/enums/listing_custom_attribute_index.pb.go
new file mode 100644
index 0000000..8209f7f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/listing_custom_attribute_index.pb.go
@@ -0,0 +1,137 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/listing_custom_attribute_index.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The index of the listing custom attribute.
+type ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex int32
+
+const (
+	// Not specified.
+	ListingCustomAttributeIndexEnum_UNSPECIFIED ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 0
+	// Used for return value only. Represents value unknown in this version.
+	ListingCustomAttributeIndexEnum_UNKNOWN ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 1
+	// First listing custom attribute.
+	ListingCustomAttributeIndexEnum_INDEX0 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 7
+	// Second listing custom attribute.
+	ListingCustomAttributeIndexEnum_INDEX1 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 8
+	// Third listing custom attribute.
+	ListingCustomAttributeIndexEnum_INDEX2 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 9
+	// Fourth listing custom attribute.
+	ListingCustomAttributeIndexEnum_INDEX3 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 10
+	// Fifth listing custom attribute.
+	ListingCustomAttributeIndexEnum_INDEX4 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 11
+)
+
+var ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	7:  "INDEX0",
+	8:  "INDEX1",
+	9:  "INDEX2",
+	10: "INDEX3",
+	11: "INDEX4",
+}
+
+var ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"INDEX0":      7,
+	"INDEX1":      8,
+	"INDEX2":      9,
+	"INDEX3":      10,
+	"INDEX4":      11,
+}
+
+func (x ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex) String() string {
+	return proto.EnumName(ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex_name, int32(x))
+}
+
+func (ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_016144a196bca518, []int{0, 0}
+}
+
+// Container for enum describing the index of the listing custom attribute.
+type ListingCustomAttributeIndexEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListingCustomAttributeIndexEnum) Reset()         { *m = ListingCustomAttributeIndexEnum{} }
+func (m *ListingCustomAttributeIndexEnum) String() string { return proto.CompactTextString(m) }
+func (*ListingCustomAttributeIndexEnum) ProtoMessage()    {}
+func (*ListingCustomAttributeIndexEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_016144a196bca518, []int{0}
+}
+
+func (m *ListingCustomAttributeIndexEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListingCustomAttributeIndexEnum.Unmarshal(m, b)
+}
+func (m *ListingCustomAttributeIndexEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListingCustomAttributeIndexEnum.Marshal(b, m, deterministic)
+}
+func (m *ListingCustomAttributeIndexEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListingCustomAttributeIndexEnum.Merge(m, src)
+}
+func (m *ListingCustomAttributeIndexEnum) XXX_Size() int {
+	return xxx_messageInfo_ListingCustomAttributeIndexEnum.Size(m)
+}
+func (m *ListingCustomAttributeIndexEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListingCustomAttributeIndexEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListingCustomAttributeIndexEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex", ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex_name, ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex_value)
+	proto.RegisterType((*ListingCustomAttributeIndexEnum)(nil), "google.ads.googleads.v3.enums.ListingCustomAttributeIndexEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/listing_custom_attribute_index.proto", fileDescriptor_016144a196bca518)
+}
+
+var fileDescriptor_016144a196bca518 = []byte{
+	// 326 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x4b, 0xc3, 0x30,
+	0x14, 0xc7, 0xed, 0x84, 0x4d, 0xb3, 0x83, 0xa1, 0x47, 0x75, 0xe8, 0xf6, 0x01, 0x52, 0x35, 0x9e,
+	0xe2, 0xa9, 0xdb, 0xea, 0x28, 0x4a, 0x1d, 0xc8, 0xa6, 0x48, 0x61, 0x74, 0x4b, 0x09, 0x81, 0x35,
+	0x19, 0x4b, 0x3a, 0xfd, 0x2c, 0x1e, 0x3d, 0xfa, 0x51, 0xfc, 0x28, 0xde, 0xbd, 0x4b, 0x13, 0x9b,
+	0x9b, 0xbd, 0x94, 0x1f, 0x7d, 0xef, 0xfd, 0xff, 0xef, 0xfd, 0x03, 0x86, 0x4c, 0x4a, 0xb6, 0xce,
+	0x83, 0x8c, 0xaa, 0xc0, 0x62, 0x45, 0x3b, 0x1c, 0xe4, 0xa2, 0x2c, 0x54, 0xb0, 0xe6, 0x4a, 0x73,
+	0xc1, 0x16, 0xab, 0x52, 0x69, 0x59, 0x2c, 0x32, 0xad, 0xb7, 0x7c, 0x59, 0xea, 0x7c, 0xc1, 0x05,
+	0xcd, 0xdf, 0xd0, 0x66, 0x2b, 0xb5, 0xf4, 0x7b, 0x76, 0x10, 0x65, 0x54, 0x21, 0xa7, 0x81, 0x76,
+	0x18, 0x19, 0x8d, 0xe3, 0xd3, 0xda, 0x62, 0xc3, 0x83, 0x4c, 0x08, 0xa9, 0x33, 0xcd, 0xa5, 0x50,
+	0x76, 0x78, 0xf0, 0xee, 0x81, 0xb3, 0x7b, 0xeb, 0x32, 0x32, 0x26, 0x61, 0xed, 0x11, 0x57, 0x16,
+	0x91, 0x28, 0x8b, 0xc1, 0x2b, 0x38, 0x69, 0x68, 0xf1, 0x8f, 0x40, 0x77, 0x96, 0x3c, 0x4e, 0xa3,
+	0x51, 0x7c, 0x1b, 0x47, 0x63, 0xb8, 0xe7, 0x77, 0x41, 0x67, 0x96, 0xdc, 0x25, 0x0f, 0x4f, 0x09,
+	0xf4, 0x7c, 0x00, 0xda, 0x71, 0x32, 0x8e, 0x9e, 0x2f, 0x60, 0xc7, 0xf1, 0x25, 0x3c, 0x70, 0x7c,
+	0x05, 0x0f, 0x1d, 0x63, 0x08, 0x1c, 0x5f, 0xc3, 0xee, 0xf0, 0xc7, 0x03, 0xfd, 0x95, 0x2c, 0x50,
+	0xe3, 0x81, 0xc3, 0xf3, 0x86, 0xe5, 0xa6, 0xd5, 0x91, 0x53, 0xef, 0xe5, 0x2f, 0x67, 0xc4, 0xe4,
+	0x3a, 0x13, 0x0c, 0xc9, 0x2d, 0x0b, 0x58, 0x2e, 0x4c, 0x04, 0x75, 0xee, 0x1b, 0xae, 0xfe, 0x79,
+	0x86, 0x1b, 0xf3, 0xfd, 0x68, 0xed, 0x4f, 0xc2, 0xf0, 0xb3, 0xd5, 0x9b, 0x58, 0xa9, 0x90, 0x2a,
+	0x64, 0xb1, 0xa2, 0x39, 0x46, 0x55, 0x56, 0xea, 0xab, 0xae, 0xa7, 0x21, 0x55, 0xa9, 0xab, 0xa7,
+	0x73, 0x9c, 0x9a, 0xfa, 0x77, 0xab, 0x6f, 0x7f, 0x12, 0x12, 0x52, 0x45, 0x88, 0xeb, 0x20, 0x64,
+	0x8e, 0x09, 0x31, 0x3d, 0xcb, 0xb6, 0x59, 0x0c, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x65, 0x2e,
+	0xcc, 0x72, 0x1e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/listing_group_type.pb.go b/googleapis/ads/googleads/v3/enums/listing_group_type.pb.go
new file mode 100644
index 0000000..bd5e568
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/listing_group_type.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/listing_group_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of the listing group.
+type ListingGroupTypeEnum_ListingGroupType int32
+
+const (
+	// Not specified.
+	ListingGroupTypeEnum_UNSPECIFIED ListingGroupTypeEnum_ListingGroupType = 0
+	// Used for return value only. Represents value unknown in this version.
+	ListingGroupTypeEnum_UNKNOWN ListingGroupTypeEnum_ListingGroupType = 1
+	// Subdivision of products along some listing dimension. These nodes
+	// are not used by serving to target listing entries, but is purely
+	// to define the structure of the tree.
+	ListingGroupTypeEnum_SUBDIVISION ListingGroupTypeEnum_ListingGroupType = 2
+	// Listing group unit that defines a bid.
+	ListingGroupTypeEnum_UNIT ListingGroupTypeEnum_ListingGroupType = 3
+)
+
+var ListingGroupTypeEnum_ListingGroupType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "SUBDIVISION",
+	3: "UNIT",
+}
+
+var ListingGroupTypeEnum_ListingGroupType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"SUBDIVISION": 2,
+	"UNIT":        3,
+}
+
+func (x ListingGroupTypeEnum_ListingGroupType) String() string {
+	return proto.EnumName(ListingGroupTypeEnum_ListingGroupType_name, int32(x))
+}
+
+func (ListingGroupTypeEnum_ListingGroupType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ee9f45bd9f5ee097, []int{0, 0}
+}
+
+// Container for enum describing the type of the listing group.
+type ListingGroupTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListingGroupTypeEnum) Reset()         { *m = ListingGroupTypeEnum{} }
+func (m *ListingGroupTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ListingGroupTypeEnum) ProtoMessage()    {}
+func (*ListingGroupTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ee9f45bd9f5ee097, []int{0}
+}
+
+func (m *ListingGroupTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListingGroupTypeEnum.Unmarshal(m, b)
+}
+func (m *ListingGroupTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListingGroupTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ListingGroupTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListingGroupTypeEnum.Merge(m, src)
+}
+func (m *ListingGroupTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ListingGroupTypeEnum.Size(m)
+}
+func (m *ListingGroupTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListingGroupTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListingGroupTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ListingGroupTypeEnum_ListingGroupType", ListingGroupTypeEnum_ListingGroupType_name, ListingGroupTypeEnum_ListingGroupType_value)
+	proto.RegisterType((*ListingGroupTypeEnum)(nil), "google.ads.googleads.v3.enums.ListingGroupTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/listing_group_type.proto", fileDescriptor_ee9f45bd9f5ee097)
+}
+
+var fileDescriptor_ee9f45bd9f5ee097 = []byte{
+	// 308 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4b, 0xfb, 0x30,
+	0x18, 0xfe, 0xad, 0xfb, 0xa1, 0x92, 0x1d, 0x2c, 0x45, 0x2f, 0xe2, 0x0e, 0xdb, 0x07, 0x48, 0x0e,
+	0x01, 0x0f, 0xf1, 0xd4, 0xba, 0x39, 0xc2, 0x24, 0x1b, 0x6c, 0xad, 0x20, 0x85, 0x51, 0xd7, 0x12,
+	0x0a, 0x5b, 0x12, 0x9a, 0x76, 0xb0, 0xaf, 0xe3, 0xd1, 0x8f, 0xe2, 0x47, 0xd9, 0xa7, 0x90, 0x24,
+	0xb6, 0x87, 0x81, 0x5e, 0xc2, 0xc3, 0xfb, 0xfc, 0xc9, 0xf3, 0xbe, 0xe0, 0x81, 0x4b, 0xc9, 0x77,
+	0x05, 0xca, 0x72, 0x8d, 0x1c, 0x34, 0xe8, 0x80, 0x51, 0x21, 0x9a, 0xbd, 0x46, 0xbb, 0x52, 0xd7,
+	0xa5, 0xe0, 0x1b, 0x5e, 0xc9, 0x46, 0x6d, 0xea, 0xa3, 0x2a, 0xa0, 0xaa, 0x64, 0x2d, 0x83, 0xa1,
+	0x13, 0xc3, 0x2c, 0xd7, 0xb0, 0xf3, 0xc1, 0x03, 0x86, 0xd6, 0x77, 0x77, 0xdf, 0xc6, 0xaa, 0x12,
+	0x65, 0x42, 0xc8, 0x3a, 0xab, 0x4b, 0x29, 0xb4, 0x33, 0x8f, 0xb7, 0xe0, 0xe6, 0xc5, 0x05, 0xcf,
+	0x4c, 0xee, 0xfa, 0xa8, 0x8a, 0xa9, 0x68, 0xf6, 0xe3, 0x39, 0xf0, 0xcf, 0xe7, 0xc1, 0x35, 0x18,
+	0xc4, 0x6c, 0xb5, 0x9c, 0x3e, 0xd1, 0x67, 0x3a, 0x9d, 0xf8, 0xff, 0x82, 0x01, 0xb8, 0x8c, 0xd9,
+	0x9c, 0x2d, 0x5e, 0x99, 0xdf, 0x33, 0xec, 0x2a, 0x8e, 0x26, 0x34, 0xa1, 0x2b, 0xba, 0x60, 0xbe,
+	0x17, 0x5c, 0x81, 0xff, 0x31, 0xa3, 0x6b, 0xbf, 0x1f, 0x9d, 0x7a, 0x60, 0xb4, 0x95, 0x7b, 0xf8,
+	0x67, 0xd1, 0xe8, 0xf6, 0xfc, 0xc3, 0xa5, 0x69, 0xb8, 0xec, 0xbd, 0x45, 0x3f, 0x3e, 0x2e, 0x77,
+	0x99, 0xe0, 0x50, 0x56, 0x1c, 0xf1, 0x42, 0xd8, 0xfe, 0xed, 0xa1, 0x54, 0xa9, 0x7f, 0xb9, 0xdb,
+	0xa3, 0x7d, 0x3f, 0xbc, 0xfe, 0x2c, 0x0c, 0x3f, 0xbd, 0xe1, 0xcc, 0x45, 0x85, 0xb9, 0x86, 0x0e,
+	0x1a, 0x94, 0x60, 0x68, 0x96, 0xd6, 0x5f, 0x2d, 0x9f, 0x86, 0xb9, 0x4e, 0x3b, 0x3e, 0x4d, 0x70,
+	0x6a, 0xf9, 0x93, 0x37, 0x72, 0x43, 0x42, 0xc2, 0x5c, 0x13, 0xd2, 0x29, 0x08, 0x49, 0x30, 0x21,
+	0x56, 0xf3, 0x7e, 0x61, 0x8b, 0xe1, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x45, 0x49, 0xb6, 0x11,
+	0xcf, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/local_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/local_placeholder_field.pb.go
new file mode 100644
index 0000000..6d53ec6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/local_placeholder_field.pb.go
@@ -0,0 +1,222 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/local_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Local placeholder fields.
+type LocalPlaceholderFieldEnum_LocalPlaceholderField int32
+
+const (
+	// Not specified.
+	LocalPlaceholderFieldEnum_UNSPECIFIED LocalPlaceholderFieldEnum_LocalPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	LocalPlaceholderFieldEnum_UNKNOWN LocalPlaceholderFieldEnum_LocalPlaceholderField = 1
+	// Data Type: STRING. Required. Unique ID.
+	LocalPlaceholderFieldEnum_DEAL_ID LocalPlaceholderFieldEnum_LocalPlaceholderField = 2
+	// Data Type: STRING. Required. Main headline with local deal title to be
+	// shown in dynamic ad.
+	LocalPlaceholderFieldEnum_DEAL_NAME LocalPlaceholderFieldEnum_LocalPlaceholderField = 3
+	// Data Type: STRING. Local deal subtitle to be shown in dynamic ad.
+	LocalPlaceholderFieldEnum_SUBTITLE LocalPlaceholderFieldEnum_LocalPlaceholderField = 4
+	// Data Type: STRING. Description of local deal to be shown in dynamic ad.
+	LocalPlaceholderFieldEnum_DESCRIPTION LocalPlaceholderFieldEnum_LocalPlaceholderField = 5
+	// Data Type: STRING. Price to be shown in the ad. Highly recommended for
+	// dynamic ads. Example: "100.00 USD"
+	LocalPlaceholderFieldEnum_PRICE LocalPlaceholderFieldEnum_LocalPlaceholderField = 6
+	// Data Type: STRING. Formatted price to be shown in the ad.
+	// Example: "Starting at $100.00 USD", "$80 - $100"
+	LocalPlaceholderFieldEnum_FORMATTED_PRICE LocalPlaceholderFieldEnum_LocalPlaceholderField = 7
+	// Data Type: STRING. Sale price to be shown in the ad.
+	// Example: "80.00 USD"
+	LocalPlaceholderFieldEnum_SALE_PRICE LocalPlaceholderFieldEnum_LocalPlaceholderField = 8
+	// Data Type: STRING. Formatted sale price to be shown in the ad.
+	// Example: "On sale for $80.00", "$60 - $80"
+	LocalPlaceholderFieldEnum_FORMATTED_SALE_PRICE LocalPlaceholderFieldEnum_LocalPlaceholderField = 9
+	// Data Type: URL. Image to be displayed in the ad.
+	LocalPlaceholderFieldEnum_IMAGE_URL LocalPlaceholderFieldEnum_LocalPlaceholderField = 10
+	// Data Type: STRING. Complete property address, including postal code.
+	LocalPlaceholderFieldEnum_ADDRESS LocalPlaceholderFieldEnum_LocalPlaceholderField = 11
+	// Data Type: STRING. Category of local deal used to group like items
+	// together for recommendation engine.
+	LocalPlaceholderFieldEnum_CATEGORY LocalPlaceholderFieldEnum_LocalPlaceholderField = 12
+	// Data Type: STRING_LIST. Keywords used for product retrieval.
+	LocalPlaceholderFieldEnum_CONTEXTUAL_KEYWORDS LocalPlaceholderFieldEnum_LocalPlaceholderField = 13
+	// Data Type: URL_LIST. Required. Final URLs to be used in ad when using
+	// Upgraded URLs; the more specific the better (e.g. the individual URL of a
+	// specific local deal and its location).
+	LocalPlaceholderFieldEnum_FINAL_URLS LocalPlaceholderFieldEnum_LocalPlaceholderField = 14
+	// Data Type: URL_LIST. Final mobile URLs for the ad when using Upgraded
+	// URLs.
+	LocalPlaceholderFieldEnum_FINAL_MOBILE_URLS LocalPlaceholderFieldEnum_LocalPlaceholderField = 15
+	// Data Type: URL. Tracking template for the ad when using Upgraded URLs.
+	LocalPlaceholderFieldEnum_TRACKING_URL LocalPlaceholderFieldEnum_LocalPlaceholderField = 16
+	// Data Type: STRING. Android app link. Must be formatted as:
+	// android-app://{package_id}/{scheme}/{host_path}.
+	// The components are defined as follows:
+	// package_id: app ID as specified in Google Play.
+	// scheme: the scheme to pass to the application. Can be HTTP, or a custom
+	//   scheme.
+	// host_path: identifies the specific content within your application.
+	LocalPlaceholderFieldEnum_ANDROID_APP_LINK LocalPlaceholderFieldEnum_LocalPlaceholderField = 17
+	// Data Type: STRING_LIST. List of recommended local deal IDs to show
+	// together with this item.
+	LocalPlaceholderFieldEnum_SIMILAR_DEAL_IDS LocalPlaceholderFieldEnum_LocalPlaceholderField = 18
+	// Data Type: STRING. iOS app link.
+	LocalPlaceholderFieldEnum_IOS_APP_LINK LocalPlaceholderFieldEnum_LocalPlaceholderField = 19
+	// Data Type: INT64. iOS app store ID.
+	LocalPlaceholderFieldEnum_IOS_APP_STORE_ID LocalPlaceholderFieldEnum_LocalPlaceholderField = 20
+)
+
+var LocalPlaceholderFieldEnum_LocalPlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "DEAL_ID",
+	3:  "DEAL_NAME",
+	4:  "SUBTITLE",
+	5:  "DESCRIPTION",
+	6:  "PRICE",
+	7:  "FORMATTED_PRICE",
+	8:  "SALE_PRICE",
+	9:  "FORMATTED_SALE_PRICE",
+	10: "IMAGE_URL",
+	11: "ADDRESS",
+	12: "CATEGORY",
+	13: "CONTEXTUAL_KEYWORDS",
+	14: "FINAL_URLS",
+	15: "FINAL_MOBILE_URLS",
+	16: "TRACKING_URL",
+	17: "ANDROID_APP_LINK",
+	18: "SIMILAR_DEAL_IDS",
+	19: "IOS_APP_LINK",
+	20: "IOS_APP_STORE_ID",
+}
+
+var LocalPlaceholderFieldEnum_LocalPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"DEAL_ID":              2,
+	"DEAL_NAME":            3,
+	"SUBTITLE":             4,
+	"DESCRIPTION":          5,
+	"PRICE":                6,
+	"FORMATTED_PRICE":      7,
+	"SALE_PRICE":           8,
+	"FORMATTED_SALE_PRICE": 9,
+	"IMAGE_URL":            10,
+	"ADDRESS":              11,
+	"CATEGORY":             12,
+	"CONTEXTUAL_KEYWORDS":  13,
+	"FINAL_URLS":           14,
+	"FINAL_MOBILE_URLS":    15,
+	"TRACKING_URL":         16,
+	"ANDROID_APP_LINK":     17,
+	"SIMILAR_DEAL_IDS":     18,
+	"IOS_APP_LINK":         19,
+	"IOS_APP_STORE_ID":     20,
+}
+
+func (x LocalPlaceholderFieldEnum_LocalPlaceholderField) String() string {
+	return proto.EnumName(LocalPlaceholderFieldEnum_LocalPlaceholderField_name, int32(x))
+}
+
+func (LocalPlaceholderFieldEnum_LocalPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_11210823e63e5310, []int{0, 0}
+}
+
+// Values for Local placeholder fields.
+// For more information about dynamic remarketing feeds, see
+// https://support.google.com/google-ads/answer/6053288.
+type LocalPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LocalPlaceholderFieldEnum) Reset()         { *m = LocalPlaceholderFieldEnum{} }
+func (m *LocalPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*LocalPlaceholderFieldEnum) ProtoMessage()    {}
+func (*LocalPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_11210823e63e5310, []int{0}
+}
+
+func (m *LocalPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LocalPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *LocalPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LocalPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *LocalPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LocalPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *LocalPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_LocalPlaceholderFieldEnum.Size(m)
+}
+func (m *LocalPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_LocalPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LocalPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.LocalPlaceholderFieldEnum_LocalPlaceholderField", LocalPlaceholderFieldEnum_LocalPlaceholderField_name, LocalPlaceholderFieldEnum_LocalPlaceholderField_value)
+	proto.RegisterType((*LocalPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.LocalPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/local_placeholder_field.proto", fileDescriptor_11210823e63e5310)
+}
+
+var fileDescriptor_11210823e63e5310 = []byte{
+	// 510 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0x4b, 0x6e, 0xdb, 0x30,
+	0x10, 0x6d, 0xec, 0xe6, 0x63, 0xda, 0x89, 0x19, 0xda, 0x41, 0xdb, 0xa0, 0x59, 0x24, 0x07, 0x90,
+	0x16, 0xda, 0x29, 0x2b, 0x5a, 0xa2, 0x0d, 0xc2, 0x32, 0x25, 0x90, 0x94, 0xd3, 0x14, 0x06, 0x04,
+	0xd5, 0x52, 0x55, 0x03, 0xb2, 0x68, 0x58, 0x4e, 0x0e, 0xd1, 0x63, 0x74, 0x55, 0xf4, 0x28, 0x3d,
+	0x4a, 0x37, 0xbd, 0x42, 0x41, 0xc9, 0x9f, 0x2e, 0xd2, 0x6e, 0x88, 0x99, 0x79, 0x9f, 0x19, 0x70,
+	0x06, 0xdc, 0x67, 0x4a, 0x65, 0x79, 0x6a, 0xc6, 0x49, 0x69, 0xd6, 0xa1, 0x8e, 0x9e, 0x2d, 0x33,
+	0x2d, 0x9e, 0x96, 0xa5, 0x99, 0xab, 0x79, 0x9c, 0x47, 0xab, 0x3c, 0x9e, 0xa7, 0x5f, 0x54, 0x9e,
+	0xa4, 0xeb, 0xe8, 0xf3, 0x22, 0xcd, 0x13, 0x63, 0xb5, 0x56, 0x1b, 0x85, 0x6e, 0x6a, 0x85, 0x11,
+	0x27, 0xa5, 0xb1, 0x17, 0x1b, 0xcf, 0x96, 0x51, 0x89, 0xaf, 0xdf, 0xef, 0xbc, 0x57, 0x0b, 0x33,
+	0x2e, 0x0a, 0xb5, 0x89, 0x37, 0x0b, 0x55, 0x94, 0xb5, 0xf8, 0xee, 0x7b, 0x13, 0xbc, 0xf3, 0xb4,
+	0x7d, 0x70, 0x70, 0x1f, 0x6a, 0x73, 0x52, 0x3c, 0x2d, 0xef, 0xbe, 0x36, 0xc1, 0xd5, 0x8b, 0x28,
+	0xea, 0x82, 0x76, 0xc8, 0x44, 0x40, 0x1c, 0x3a, 0xa4, 0xc4, 0x85, 0xaf, 0x50, 0x1b, 0x9c, 0x86,
+	0x6c, 0xcc, 0xfc, 0x07, 0x06, 0x8f, 0x74, 0xe2, 0x12, 0xec, 0x45, 0xd4, 0x85, 0x0d, 0x74, 0x0e,
+	0x5a, 0x55, 0xc2, 0xf0, 0x84, 0xc0, 0x26, 0xea, 0x80, 0x33, 0x11, 0x0e, 0x24, 0x95, 0x1e, 0x81,
+	0xaf, 0xb5, 0x8f, 0x4b, 0x84, 0xc3, 0x69, 0x20, 0xa9, 0xcf, 0xe0, 0x31, 0x6a, 0x81, 0xe3, 0x80,
+	0x53, 0x87, 0xc0, 0x13, 0xd4, 0x03, 0xdd, 0xa1, 0xcf, 0x27, 0x58, 0x4a, 0xe2, 0x46, 0x75, 0xf1,
+	0x14, 0x5d, 0x00, 0x20, 0xb0, 0x47, 0xb6, 0xf9, 0x19, 0x7a, 0x0b, 0xfa, 0x07, 0xd2, 0x5f, 0x48,
+	0x4b, 0xf7, 0xa5, 0x13, 0x3c, 0x22, 0x51, 0xc8, 0x3d, 0x08, 0xf4, 0x4c, 0xd8, 0x75, 0x39, 0x11,
+	0x02, 0xb6, 0xf5, 0x10, 0x0e, 0x96, 0x64, 0xe4, 0xf3, 0x47, 0xd8, 0x41, 0x6f, 0x40, 0xcf, 0xf1,
+	0x99, 0x24, 0x1f, 0x64, 0x88, 0xbd, 0x68, 0x4c, 0x1e, 0x1f, 0x7c, 0xee, 0x0a, 0x78, 0xae, 0x9b,
+	0x0d, 0x29, 0xc3, 0x9e, 0xb6, 0x10, 0xf0, 0x02, 0x5d, 0x81, 0xcb, 0x3a, 0x9f, 0xf8, 0x03, 0xea,
+	0x91, 0xba, 0xdc, 0x45, 0x10, 0x74, 0x24, 0xc7, 0xce, 0x98, 0xb2, 0x51, 0xd5, 0x0c, 0xa2, 0x3e,
+	0x80, 0x98, 0xb9, 0xdc, 0xa7, 0x6e, 0x84, 0x83, 0x20, 0xf2, 0x28, 0x1b, 0xc3, 0x4b, 0x5d, 0x15,
+	0x74, 0x42, 0x3d, 0xcc, 0xa3, 0xed, 0xf7, 0x08, 0x88, 0xb4, 0x9a, 0xfa, 0xe2, 0xc0, 0xeb, 0x69,
+	0xde, 0xae, 0x22, 0xa4, 0xcf, 0x89, 0xfe, 0xc7, 0xfe, 0xe0, 0xf7, 0x11, 0xb8, 0x9d, 0xab, 0xa5,
+	0xf1, 0xdf, 0x75, 0x0f, 0xae, 0x5f, 0xdc, 0x57, 0xa0, 0x97, 0x1d, 0x1c, 0x7d, 0x1c, 0x6c, 0xc5,
+	0x99, 0xca, 0xe3, 0x22, 0x33, 0xd4, 0x3a, 0x33, 0xb3, 0xb4, 0xa8, 0x4e, 0x61, 0x77, 0x78, 0xab,
+	0x45, 0xf9, 0x8f, 0x3b, 0xbc, 0xaf, 0xde, 0x6f, 0x8d, 0xe6, 0x08, 0xe3, 0x1f, 0x8d, 0x9b, 0x51,
+	0x6d, 0x85, 0x93, 0xd2, 0xa8, 0x43, 0x1d, 0x4d, 0x2d, 0x43, 0x5f, 0x4e, 0xf9, 0x73, 0x87, 0xcf,
+	0x70, 0x52, 0xce, 0xf6, 0xf8, 0x6c, 0x6a, 0xcd, 0x2a, 0xfc, 0x57, 0xe3, 0xb6, 0x2e, 0xda, 0x36,
+	0x4e, 0x4a, 0xdb, 0xde, 0x33, 0x6c, 0x7b, 0x6a, 0xd9, 0x76, 0xc5, 0xf9, 0x74, 0x52, 0x0d, 0x66,
+	0xfd, 0x09, 0x00, 0x00, 0xff, 0xff, 0x17, 0xe8, 0x7d, 0x2f, 0x1f, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/location_extension_targeting_criterion_field.pb.go b/googleapis/ads/googleads/v3/enums/location_extension_targeting_criterion_field.pb.go
new file mode 100644
index 0000000..7b1986f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/location_extension_targeting_criterion_field.pb.go
@@ -0,0 +1,148 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/location_extension_targeting_criterion_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Location Extension Targeting criterion fields.
+type LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField int32
+
+const (
+	// Not specified.
+	LocationExtensionTargetingCriterionFieldEnum_UNSPECIFIED LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 0
+	// Used for return value only. Represents value unknown in this version.
+	LocationExtensionTargetingCriterionFieldEnum_UNKNOWN LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 1
+	// Data Type: STRING. Line 1 of the business address.
+	LocationExtensionTargetingCriterionFieldEnum_ADDRESS_LINE_1 LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 2
+	// Data Type: STRING. Line 2 of the business address.
+	LocationExtensionTargetingCriterionFieldEnum_ADDRESS_LINE_2 LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 3
+	// Data Type: STRING. City of the business address.
+	LocationExtensionTargetingCriterionFieldEnum_CITY LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 4
+	// Data Type: STRING. Province of the business address.
+	LocationExtensionTargetingCriterionFieldEnum_PROVINCE LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 5
+	// Data Type: STRING. Postal code of the business address.
+	LocationExtensionTargetingCriterionFieldEnum_POSTAL_CODE LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 6
+	// Data Type: STRING. Country code of the business address.
+	LocationExtensionTargetingCriterionFieldEnum_COUNTRY_CODE LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 7
+)
+
+var LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ADDRESS_LINE_1",
+	3: "ADDRESS_LINE_2",
+	4: "CITY",
+	5: "PROVINCE",
+	6: "POSTAL_CODE",
+	7: "COUNTRY_CODE",
+}
+
+var LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"ADDRESS_LINE_1": 2,
+	"ADDRESS_LINE_2": 3,
+	"CITY":           4,
+	"PROVINCE":       5,
+	"POSTAL_CODE":    6,
+	"COUNTRY_CODE":   7,
+}
+
+func (x LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField) String() string {
+	return proto.EnumName(LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField_name, int32(x))
+}
+
+func (LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_73a9efbd1548604a, []int{0, 0}
+}
+
+// Values for Location Extension Targeting criterion fields.
+type LocationExtensionTargetingCriterionFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LocationExtensionTargetingCriterionFieldEnum) Reset() {
+	*m = LocationExtensionTargetingCriterionFieldEnum{}
+}
+func (m *LocationExtensionTargetingCriterionFieldEnum) String() string {
+	return proto.CompactTextString(m)
+}
+func (*LocationExtensionTargetingCriterionFieldEnum) ProtoMessage() {}
+func (*LocationExtensionTargetingCriterionFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_73a9efbd1548604a, []int{0}
+}
+
+func (m *LocationExtensionTargetingCriterionFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LocationExtensionTargetingCriterionFieldEnum.Unmarshal(m, b)
+}
+func (m *LocationExtensionTargetingCriterionFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LocationExtensionTargetingCriterionFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *LocationExtensionTargetingCriterionFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LocationExtensionTargetingCriterionFieldEnum.Merge(m, src)
+}
+func (m *LocationExtensionTargetingCriterionFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_LocationExtensionTargetingCriterionFieldEnum.Size(m)
+}
+func (m *LocationExtensionTargetingCriterionFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_LocationExtensionTargetingCriterionFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LocationExtensionTargetingCriterionFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField", LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField_name, LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField_value)
+	proto.RegisterType((*LocationExtensionTargetingCriterionFieldEnum)(nil), "google.ads.googleads.v3.enums.LocationExtensionTargetingCriterionFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/location_extension_targeting_criterion_field.proto", fileDescriptor_73a9efbd1548604a)
+}
+
+var fileDescriptor_73a9efbd1548604a = []byte{
+	// 383 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xc1, 0xae, 0x93, 0x40,
+	0x18, 0x85, 0x85, 0x7b, 0xbd, 0xf7, 0x66, 0xda, 0xe8, 0x64, 0x96, 0xc6, 0x2e, 0xda, 0x95, 0x0b,
+	0x1d, 0xa2, 0xec, 0xc6, 0x15, 0x85, 0x69, 0x43, 0x6c, 0x80, 0x14, 0x8a, 0xa9, 0x21, 0x21, 0x58,
+	0xc6, 0x09, 0x09, 0x9d, 0x69, 0x18, 0xda, 0xb8, 0xf6, 0x51, 0x5c, 0xea, 0x9b, 0xf8, 0x0c, 0x3e,
+	0x81, 0x4f, 0x61, 0x06, 0x4a, 0x37, 0xc6, 0x9b, 0x6e, 0xc8, 0xc9, 0xf9, 0x67, 0xbe, 0xc3, 0x9c,
+	0x1f, 0x44, 0x5c, 0x4a, 0x5e, 0x33, 0xab, 0x28, 0x95, 0xd5, 0x4b, 0xad, 0x4e, 0xb6, 0xc5, 0xc4,
+	0x71, 0xaf, 0xac, 0x5a, 0xee, 0x8a, 0xb6, 0x92, 0x22, 0x67, 0x5f, 0x5b, 0x26, 0x94, 0x56, 0x6d,
+	0xd1, 0x70, 0xd6, 0x56, 0x82, 0xe7, 0xbb, 0xa6, 0x6a, 0x59, 0xa3, 0xbd, 0x2f, 0x15, 0xab, 0x4b,
+	0x7c, 0x68, 0x64, 0x2b, 0xd1, 0xa4, 0xc7, 0xe0, 0xa2, 0x54, 0xf8, 0x42, 0xc4, 0x27, 0x1b, 0x77,
+	0xc4, 0x17, 0x2f, 0x87, 0xc0, 0x43, 0x65, 0x15, 0x42, 0xc8, 0xb6, 0xe3, 0xab, 0xfe, 0xf2, 0xec,
+	0xb7, 0x01, 0x5e, 0xaf, 0xce, 0x99, 0x74, 0x88, 0x4c, 0x86, 0x44, 0x77, 0x08, 0x5c, 0xe8, 0x3c,
+	0x2a, 0x8e, 0xfb, 0xd9, 0x4f, 0x03, 0xbc, 0xba, 0xf6, 0x02, 0x7a, 0x0e, 0x46, 0x9b, 0x20, 0x8e,
+	0xa8, 0xeb, 0x2f, 0x7c, 0xea, 0xc1, 0x27, 0x68, 0x04, 0xee, 0x37, 0xc1, 0x87, 0x20, 0xfc, 0x18,
+	0x40, 0x03, 0x21, 0xf0, 0xcc, 0xf1, 0xbc, 0x35, 0x8d, 0xe3, 0x7c, 0xe5, 0x07, 0x34, 0x7f, 0x0b,
+	0xcd, 0x7f, 0xbc, 0x77, 0xf0, 0x06, 0x3d, 0x80, 0x5b, 0xd7, 0x4f, 0xb6, 0xf0, 0x16, 0x8d, 0xc1,
+	0x43, 0xb4, 0x0e, 0x53, 0x3f, 0x70, 0x29, 0x7c, 0xaa, 0xe9, 0x51, 0x18, 0x27, 0xce, 0x2a, 0x77,
+	0x43, 0x8f, 0xc2, 0x3b, 0x04, 0xc1, 0xd8, 0x0d, 0x37, 0x41, 0xb2, 0xde, 0xf6, 0xce, 0xfd, 0xfc,
+	0x9b, 0x09, 0xa6, 0x3b, 0xb9, 0xc7, 0x8f, 0x56, 0x34, 0x7f, 0x73, 0xed, 0x83, 0x22, 0xdd, 0x59,
+	0x64, 0x7c, 0x9a, 0x9f, 0x79, 0x5c, 0xd6, 0x85, 0xe0, 0x58, 0x36, 0xdc, 0xe2, 0x4c, 0x74, 0x8d,
+	0x0e, 0x4b, 0x3d, 0x54, 0xea, 0x3f, 0x3b, 0x7e, 0xdf, 0x7d, 0xbf, 0x9b, 0x37, 0x4b, 0xc7, 0xf9,
+	0x61, 0x4e, 0x96, 0x3d, 0xca, 0x29, 0x15, 0xee, 0xa5, 0x56, 0xa9, 0x8d, 0x75, 0xdb, 0xea, 0xd7,
+	0x30, 0xcf, 0x9c, 0x52, 0x65, 0x97, 0x79, 0x96, 0xda, 0x59, 0x37, 0xff, 0x63, 0x4e, 0x7b, 0x93,
+	0x10, 0xa7, 0x54, 0x84, 0x5c, 0x4e, 0x10, 0x92, 0xda, 0x84, 0x74, 0x67, 0x3e, 0xdf, 0x75, 0x3f,
+	0x66, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x12, 0xde, 0x3f, 0xb3, 0x7b, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/location_group_radius_units.pb.go b/googleapis/ads/googleads/v3/enums/location_group_radius_units.pb.go
new file mode 100644
index 0000000..025d16d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/location_group_radius_units.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/location_group_radius_units.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The unit of radius distance in location group (e.g. MILES)
+type LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits int32
+
+const (
+	// Not specified.
+	LocationGroupRadiusUnitsEnum_UNSPECIFIED LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits = 0
+	// Used for return value only. Represents value unknown in this version.
+	LocationGroupRadiusUnitsEnum_UNKNOWN LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits = 1
+	// Meters
+	LocationGroupRadiusUnitsEnum_METERS LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits = 2
+	// Miles
+	LocationGroupRadiusUnitsEnum_MILES LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits = 3
+)
+
+var LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "METERS",
+	3: "MILES",
+}
+
+var LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"METERS":      2,
+	"MILES":       3,
+}
+
+func (x LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits) String() string {
+	return proto.EnumName(LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits_name, int32(x))
+}
+
+func (LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_09c27d38d739393b, []int{0, 0}
+}
+
+// Container for enum describing unit of radius in location group.
+type LocationGroupRadiusUnitsEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LocationGroupRadiusUnitsEnum) Reset()         { *m = LocationGroupRadiusUnitsEnum{} }
+func (m *LocationGroupRadiusUnitsEnum) String() string { return proto.CompactTextString(m) }
+func (*LocationGroupRadiusUnitsEnum) ProtoMessage()    {}
+func (*LocationGroupRadiusUnitsEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_09c27d38d739393b, []int{0}
+}
+
+func (m *LocationGroupRadiusUnitsEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LocationGroupRadiusUnitsEnum.Unmarshal(m, b)
+}
+func (m *LocationGroupRadiusUnitsEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LocationGroupRadiusUnitsEnum.Marshal(b, m, deterministic)
+}
+func (m *LocationGroupRadiusUnitsEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LocationGroupRadiusUnitsEnum.Merge(m, src)
+}
+func (m *LocationGroupRadiusUnitsEnum) XXX_Size() int {
+	return xxx_messageInfo_LocationGroupRadiusUnitsEnum.Size(m)
+}
+func (m *LocationGroupRadiusUnitsEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_LocationGroupRadiusUnitsEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LocationGroupRadiusUnitsEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits", LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits_name, LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits_value)
+	proto.RegisterType((*LocationGroupRadiusUnitsEnum)(nil), "google.ads.googleads.v3.enums.LocationGroupRadiusUnitsEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/location_group_radius_units.proto", fileDescriptor_09c27d38d739393b)
+}
+
+var fileDescriptor_09c27d38d739393b = []byte{
+	// 312 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4e, 0xc2, 0x30,
+	0x18, 0xc7, 0x65, 0x44, 0x8c, 0xe5, 0xe0, 0xb2, 0x93, 0x31, 0x70, 0x80, 0x07, 0x68, 0x0f, 0xbd,
+	0xd5, 0x83, 0x19, 0x5a, 0x09, 0x11, 0x06, 0x01, 0xc1, 0xc4, 0x2c, 0x21, 0x95, 0x92, 0x66, 0x09,
+	0xf4, 0x5b, 0xd6, 0x8d, 0x07, 0xf2, 0xe8, 0xa3, 0xf8, 0x28, 0x1e, 0x7d, 0x02, 0xd3, 0x8e, 0xed,
+	0x36, 0x2f, 0xcb, 0x3f, 0xfb, 0x7f, 0xdf, 0xef, 0xfb, 0xf7, 0x8f, 0x1e, 0x14, 0x80, 0x3a, 0xec,
+	0x89, 0x90, 0x86, 0x94, 0xd2, 0xaa, 0x13, 0x25, 0x7b, 0x5d, 0x1c, 0x0d, 0x39, 0xc0, 0x4e, 0xe4,
+	0x09, 0xe8, 0xad, 0xca, 0xa0, 0x48, 0xb7, 0x99, 0x90, 0x49, 0x61, 0xb6, 0x85, 0x4e, 0x72, 0x83,
+	0xd3, 0x0c, 0x72, 0x08, 0xfa, 0xe5, 0x16, 0x16, 0xd2, 0xe0, 0x1a, 0x80, 0x4f, 0x14, 0x3b, 0xc0,
+	0x5d, 0xaf, 0xe2, 0xa7, 0x09, 0x11, 0x5a, 0x43, 0xee, 0x70, 0xe7, 0xe5, 0x21, 0xa0, 0xde, 0xf4,
+	0x7c, 0x61, 0x6c, 0x0f, 0x2c, 0x1d, 0x7f, 0x6d, 0xf1, 0x5c, 0x17, 0xc7, 0xe1, 0x1c, 0xdd, 0x36,
+	0xf9, 0xc1, 0x0d, 0xea, 0xae, 0xa3, 0xd5, 0x82, 0x3f, 0x4e, 0x9e, 0x27, 0xfc, 0xc9, 0xbf, 0x08,
+	0xba, 0xe8, 0x6a, 0x1d, 0xbd, 0x44, 0xf3, 0xb7, 0xc8, 0x6f, 0x05, 0x08, 0x75, 0x66, 0xfc, 0x95,
+	0x2f, 0x57, 0xbe, 0x17, 0x5c, 0xa3, 0xcb, 0xd9, 0x64, 0xca, 0x57, 0x7e, 0x7b, 0xf4, 0xdb, 0x42,
+	0x83, 0x1d, 0x1c, 0xf1, 0xbf, 0xa1, 0x47, 0xfd, 0xa6, 0xa3, 0x0b, 0x9b, 0x7a, 0xd1, 0x7a, 0x1f,
+	0x9d, 0xf7, 0x15, 0x1c, 0x84, 0x56, 0x18, 0x32, 0x45, 0xd4, 0x5e, 0xbb, 0x37, 0x55, 0x2d, 0xa6,
+	0x89, 0x69, 0x28, 0xf5, 0xde, 0x7d, 0x3f, 0xbd, 0xf6, 0x38, 0x0c, 0xbf, 0xbc, 0xfe, 0xb8, 0x44,
+	0x85, 0xd2, 0xe0, 0x52, 0x5a, 0xb5, 0xa1, 0xd8, 0x16, 0x60, 0xbe, 0x2b, 0x3f, 0x0e, 0xa5, 0x89,
+	0x6b, 0x3f, 0xde, 0xd0, 0xd8, 0xf9, 0x3f, 0xde, 0xa0, 0xfc, 0xc9, 0x58, 0x28, 0x0d, 0x63, 0xf5,
+	0x04, 0x63, 0x1b, 0xca, 0x98, 0x9b, 0xf9, 0xe8, 0xb8, 0x60, 0xf4, 0x2f, 0x00, 0x00, 0xff, 0xff,
+	0x83, 0xa1, 0xe1, 0xcd, 0xec, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/location_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/location_placeholder_field.pb.go
new file mode 100644
index 0000000..f715c5e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/location_placeholder_field.pb.go
@@ -0,0 +1,153 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/location_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Location placeholder fields.
+type LocationPlaceholderFieldEnum_LocationPlaceholderField int32
+
+const (
+	// Not specified.
+	LocationPlaceholderFieldEnum_UNSPECIFIED LocationPlaceholderFieldEnum_LocationPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	LocationPlaceholderFieldEnum_UNKNOWN LocationPlaceholderFieldEnum_LocationPlaceholderField = 1
+	// Data Type: STRING. The name of the business.
+	LocationPlaceholderFieldEnum_BUSINESS_NAME LocationPlaceholderFieldEnum_LocationPlaceholderField = 2
+	// Data Type: STRING. Line 1 of the business address.
+	LocationPlaceholderFieldEnum_ADDRESS_LINE_1 LocationPlaceholderFieldEnum_LocationPlaceholderField = 3
+	// Data Type: STRING. Line 2 of the business address.
+	LocationPlaceholderFieldEnum_ADDRESS_LINE_2 LocationPlaceholderFieldEnum_LocationPlaceholderField = 4
+	// Data Type: STRING. City of the business address.
+	LocationPlaceholderFieldEnum_CITY LocationPlaceholderFieldEnum_LocationPlaceholderField = 5
+	// Data Type: STRING. Province of the business address.
+	LocationPlaceholderFieldEnum_PROVINCE LocationPlaceholderFieldEnum_LocationPlaceholderField = 6
+	// Data Type: STRING. Postal code of the business address.
+	LocationPlaceholderFieldEnum_POSTAL_CODE LocationPlaceholderFieldEnum_LocationPlaceholderField = 7
+	// Data Type: STRING. Country code of the business address.
+	LocationPlaceholderFieldEnum_COUNTRY_CODE LocationPlaceholderFieldEnum_LocationPlaceholderField = 8
+	// Data Type: STRING. Phone number of the business.
+	LocationPlaceholderFieldEnum_PHONE_NUMBER LocationPlaceholderFieldEnum_LocationPlaceholderField = 9
+)
+
+var LocationPlaceholderFieldEnum_LocationPlaceholderField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "BUSINESS_NAME",
+	3: "ADDRESS_LINE_1",
+	4: "ADDRESS_LINE_2",
+	5: "CITY",
+	6: "PROVINCE",
+	7: "POSTAL_CODE",
+	8: "COUNTRY_CODE",
+	9: "PHONE_NUMBER",
+}
+
+var LocationPlaceholderFieldEnum_LocationPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"BUSINESS_NAME":  2,
+	"ADDRESS_LINE_1": 3,
+	"ADDRESS_LINE_2": 4,
+	"CITY":           5,
+	"PROVINCE":       6,
+	"POSTAL_CODE":    7,
+	"COUNTRY_CODE":   8,
+	"PHONE_NUMBER":   9,
+}
+
+func (x LocationPlaceholderFieldEnum_LocationPlaceholderField) String() string {
+	return proto.EnumName(LocationPlaceholderFieldEnum_LocationPlaceholderField_name, int32(x))
+}
+
+func (LocationPlaceholderFieldEnum_LocationPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_06285cb96465af84, []int{0, 0}
+}
+
+// Values for Location placeholder fields.
+type LocationPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LocationPlaceholderFieldEnum) Reset()         { *m = LocationPlaceholderFieldEnum{} }
+func (m *LocationPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*LocationPlaceholderFieldEnum) ProtoMessage()    {}
+func (*LocationPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_06285cb96465af84, []int{0}
+}
+
+func (m *LocationPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LocationPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *LocationPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LocationPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *LocationPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LocationPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *LocationPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_LocationPlaceholderFieldEnum.Size(m)
+}
+func (m *LocationPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_LocationPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LocationPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.LocationPlaceholderFieldEnum_LocationPlaceholderField", LocationPlaceholderFieldEnum_LocationPlaceholderField_name, LocationPlaceholderFieldEnum_LocationPlaceholderField_value)
+	proto.RegisterType((*LocationPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.LocationPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/location_placeholder_field.proto", fileDescriptor_06285cb96465af84)
+}
+
+var fileDescriptor_06285cb96465af84 = []byte{
+	// 392 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0xae, 0x93, 0x40,
+	0x14, 0x15, 0xde, 0xf3, 0xbd, 0x3a, 0xef, 0xa9, 0xe3, 0xac, 0x8c, 0x69, 0x17, 0xed, 0x07, 0x0c,
+	0x51, 0x76, 0x63, 0x62, 0x32, 0xc0, 0xb4, 0x12, 0xdb, 0x81, 0x40, 0xc1, 0xd4, 0x90, 0x10, 0x2c,
+	0x88, 0x24, 0x94, 0x21, 0x9d, 0xb6, 0x1f, 0xe4, 0xd2, 0xaf, 0x70, 0xed, 0x5f, 0xb8, 0x75, 0xe9,
+	0x17, 0x98, 0x81, 0xb6, 0x2e, 0x4c, 0xdf, 0x86, 0x9c, 0x9c, 0x7b, 0xcf, 0x39, 0xcc, 0xb9, 0xe0,
+	0x5d, 0x29, 0x44, 0x59, 0x17, 0x46, 0x96, 0x4b, 0xa3, 0x87, 0x0a, 0x1d, 0x4c, 0xa3, 0x68, 0xf6,
+	0x1b, 0x69, 0xd4, 0x62, 0x9d, 0xed, 0x2a, 0xd1, 0xa4, 0x6d, 0x9d, 0xad, 0x8b, 0xaf, 0xa2, 0xce,
+	0x8b, 0x6d, 0xfa, 0xa5, 0x2a, 0xea, 0x1c, 0xb7, 0x5b, 0xb1, 0x13, 0x68, 0xd4, 0x8b, 0x70, 0x96,
+	0x4b, 0x7c, 0xd6, 0xe3, 0x83, 0x89, 0x3b, 0xfd, 0xab, 0xe1, 0xc9, 0xbe, 0xad, 0x8c, 0xac, 0x69,
+	0xc4, 0xae, 0x73, 0x93, 0xbd, 0x78, 0xf2, 0x4b, 0x03, 0xc3, 0xf9, 0x31, 0xc1, 0xff, 0x17, 0x30,
+	0x55, 0xfe, 0xac, 0xd9, 0x6f, 0x26, 0x3f, 0x34, 0xf0, 0xf2, 0xd2, 0x02, 0x7a, 0x0e, 0xee, 0x22,
+	0x1e, 0xfa, 0xcc, 0x76, 0xa7, 0x2e, 0x73, 0xe0, 0x23, 0x74, 0x07, 0x6e, 0x23, 0xfe, 0x81, 0x7b,
+	0x1f, 0x39, 0xd4, 0xd0, 0x0b, 0xf0, 0xd4, 0x8a, 0x42, 0x97, 0xb3, 0x30, 0x4c, 0x39, 0x5d, 0x30,
+	0xa8, 0x23, 0x04, 0x9e, 0x51, 0xc7, 0x09, 0x14, 0x33, 0x77, 0x39, 0x4b, 0x5f, 0xc3, 0xab, 0xff,
+	0xb8, 0x37, 0xf0, 0x1a, 0x0d, 0xc0, 0xb5, 0xed, 0x2e, 0x57, 0xf0, 0x31, 0xba, 0x07, 0x03, 0x3f,
+	0xf0, 0x62, 0x97, 0xdb, 0x0c, 0xde, 0xa8, 0x40, 0xdf, 0x0b, 0x97, 0x74, 0x9e, 0xda, 0x9e, 0xc3,
+	0xe0, 0x2d, 0x82, 0xe0, 0xde, 0xf6, 0x22, 0xbe, 0x0c, 0x56, 0x3d, 0x33, 0x50, 0x8c, 0xff, 0xde,
+	0xe3, 0x2c, 0xe5, 0xd1, 0xc2, 0x62, 0x01, 0x7c, 0x62, 0xfd, 0xd1, 0xc0, 0x78, 0x2d, 0x36, 0xf8,
+	0xc1, 0x9e, 0xac, 0xd1, 0xa5, 0x57, 0xfa, 0xaa, 0x28, 0x5f, 0xfb, 0x64, 0x1d, 0xf5, 0xa5, 0xa8,
+	0xb3, 0xa6, 0xc4, 0x62, 0x5b, 0x1a, 0x65, 0xd1, 0x74, 0x35, 0x9e, 0xee, 0xd6, 0x56, 0xf2, 0xc2,
+	0x19, 0xdf, 0x76, 0xdf, 0x6f, 0xfa, 0xd5, 0x8c, 0xd2, 0xef, 0xfa, 0x68, 0xd6, 0x5b, 0xd1, 0x5c,
+	0xe2, 0x1e, 0x2a, 0x14, 0x9b, 0x58, 0x55, 0x2e, 0x7f, 0x9e, 0xe6, 0x09, 0xcd, 0x65, 0x72, 0x9e,
+	0x27, 0xb1, 0x99, 0x74, 0xf3, 0xdf, 0xfa, 0xb8, 0x27, 0x09, 0xa1, 0xb9, 0x24, 0xe4, 0xbc, 0x41,
+	0x48, 0x6c, 0x12, 0xd2, 0xed, 0x7c, 0xbe, 0xe9, 0x7e, 0xcc, 0xfc, 0x1b, 0x00, 0x00, 0xff, 0xff,
+	0x6c, 0x41, 0x6a, 0xaa, 0x5e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/manager_link_status.pb.go b/googleapis/ads/googleads/v3/enums/manager_link_status.pb.go
new file mode 100644
index 0000000..b19f255
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/manager_link_status.pb.go
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/manager_link_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible statuses of a link.
+type ManagerLinkStatusEnum_ManagerLinkStatus int32
+
+const (
+	// Not specified.
+	ManagerLinkStatusEnum_UNSPECIFIED ManagerLinkStatusEnum_ManagerLinkStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	ManagerLinkStatusEnum_UNKNOWN ManagerLinkStatusEnum_ManagerLinkStatus = 1
+	// Indicates current in-effect relationship
+	ManagerLinkStatusEnum_ACTIVE ManagerLinkStatusEnum_ManagerLinkStatus = 2
+	// Indicates terminated relationship
+	ManagerLinkStatusEnum_INACTIVE ManagerLinkStatusEnum_ManagerLinkStatus = 3
+	// Indicates relationship has been requested by manager, but the client
+	// hasn't accepted yet.
+	ManagerLinkStatusEnum_PENDING ManagerLinkStatusEnum_ManagerLinkStatus = 4
+	// Relationship was requested by the manager, but the client has refused.
+	ManagerLinkStatusEnum_REFUSED ManagerLinkStatusEnum_ManagerLinkStatus = 5
+	// Indicates relationship has been requested by manager, but manager
+	// canceled it.
+	ManagerLinkStatusEnum_CANCELED ManagerLinkStatusEnum_ManagerLinkStatus = 6
+)
+
+var ManagerLinkStatusEnum_ManagerLinkStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ACTIVE",
+	3: "INACTIVE",
+	4: "PENDING",
+	5: "REFUSED",
+	6: "CANCELED",
+}
+
+var ManagerLinkStatusEnum_ManagerLinkStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ACTIVE":      2,
+	"INACTIVE":    3,
+	"PENDING":     4,
+	"REFUSED":     5,
+	"CANCELED":    6,
+}
+
+func (x ManagerLinkStatusEnum_ManagerLinkStatus) String() string {
+	return proto.EnumName(ManagerLinkStatusEnum_ManagerLinkStatus_name, int32(x))
+}
+
+func (ManagerLinkStatusEnum_ManagerLinkStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_00c1bfbdfc096c31, []int{0, 0}
+}
+
+// Container for enum describing possible status of a manager and client link.
+type ManagerLinkStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ManagerLinkStatusEnum) Reset()         { *m = ManagerLinkStatusEnum{} }
+func (m *ManagerLinkStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*ManagerLinkStatusEnum) ProtoMessage()    {}
+func (*ManagerLinkStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_00c1bfbdfc096c31, []int{0}
+}
+
+func (m *ManagerLinkStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ManagerLinkStatusEnum.Unmarshal(m, b)
+}
+func (m *ManagerLinkStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ManagerLinkStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *ManagerLinkStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ManagerLinkStatusEnum.Merge(m, src)
+}
+func (m *ManagerLinkStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_ManagerLinkStatusEnum.Size(m)
+}
+func (m *ManagerLinkStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ManagerLinkStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ManagerLinkStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ManagerLinkStatusEnum_ManagerLinkStatus", ManagerLinkStatusEnum_ManagerLinkStatus_name, ManagerLinkStatusEnum_ManagerLinkStatus_value)
+	proto.RegisterType((*ManagerLinkStatusEnum)(nil), "google.ads.googleads.v3.enums.ManagerLinkStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/manager_link_status.proto", fileDescriptor_00c1bfbdfc096c31)
+}
+
+var fileDescriptor_00c1bfbdfc096c31 = []byte{
+	// 333 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x18, 0xb7, 0x9d, 0x4e, 0xc9, 0x04, 0x6b, 0x41, 0x0f, 0xe2, 0x0e, 0xdb, 0x03, 0xa4, 0x87, 0x1e,
+	0x84, 0x78, 0xca, 0xda, 0x6c, 0x14, 0x67, 0x2c, 0xce, 0x55, 0x90, 0xc2, 0x88, 0xb6, 0x84, 0xb2,
+	0x35, 0x19, 0x4b, 0xb7, 0xa7, 0xf0, 0x29, 0x3c, 0xfa, 0x28, 0x3e, 0x8a, 0xbe, 0x84, 0x24, 0xdd,
+	0x7a, 0x19, 0x7a, 0x09, 0xbf, 0x2f, 0xbf, 0x3f, 0x7c, 0xdf, 0x0f, 0xdc, 0x70, 0x29, 0xf9, 0x22,
+	0xf7, 0x58, 0xa6, 0xbc, 0x1a, 0x6a, 0xb4, 0xf1, 0xbd, 0x5c, 0xac, 0x4b, 0xe5, 0x95, 0x4c, 0x30,
+	0x9e, 0xaf, 0x66, 0x8b, 0x42, 0xcc, 0x67, 0xaa, 0x62, 0xd5, 0x5a, 0xc1, 0xe5, 0x4a, 0x56, 0xd2,
+	0xed, 0xd6, 0x6a, 0xc8, 0x32, 0x05, 0x1b, 0x23, 0xdc, 0xf8, 0xd0, 0x18, 0xaf, 0xae, 0x77, 0xb9,
+	0xcb, 0xc2, 0x63, 0x42, 0xc8, 0x8a, 0x55, 0x85, 0x14, 0x5b, 0x73, 0xff, 0xdd, 0x02, 0x17, 0xf7,
+	0x75, 0xf4, 0xb8, 0x10, 0xf3, 0x89, 0x09, 0x26, 0x62, 0x5d, 0xf6, 0x15, 0x38, 0xdf, 0x23, 0xdc,
+	0x33, 0xd0, 0x99, 0xd2, 0x49, 0x4c, 0x82, 0x68, 0x18, 0x91, 0xd0, 0x39, 0x70, 0x3b, 0xe0, 0x78,
+	0x4a, 0xef, 0xe8, 0xc3, 0x33, 0x75, 0x2c, 0x17, 0x80, 0x36, 0x0e, 0x9e, 0xa2, 0x84, 0x38, 0xb6,
+	0x7b, 0x0a, 0x4e, 0x22, 0xba, 0x9d, 0x5a, 0x5a, 0x16, 0x13, 0x1a, 0x46, 0x74, 0xe4, 0x1c, 0xea,
+	0xe1, 0x91, 0x0c, 0xa7, 0x13, 0x12, 0x3a, 0x47, 0x5a, 0x17, 0x60, 0x1a, 0x90, 0x31, 0x09, 0x9d,
+	0xf6, 0xe0, 0xc7, 0x02, 0xbd, 0x37, 0x59, 0xc2, 0x7f, 0x4f, 0x1a, 0x5c, 0xee, 0x2d, 0x16, 0xeb,
+	0x63, 0x62, 0xeb, 0x65, 0xb0, 0x35, 0x72, 0xb9, 0x60, 0x82, 0x43, 0xb9, 0xe2, 0x1e, 0xcf, 0x85,
+	0x39, 0x75, 0x57, 0xea, 0xb2, 0x50, 0x7f, 0x74, 0x7c, 0x6b, 0xde, 0x0f, 0xbb, 0x35, 0xc2, 0xf8,
+	0xd3, 0xee, 0x8e, 0xea, 0x28, 0x9c, 0x29, 0x58, 0x43, 0x8d, 0x12, 0x1f, 0xea, 0x76, 0xd4, 0xd7,
+	0x8e, 0x4f, 0x71, 0xa6, 0xd2, 0x86, 0x4f, 0x13, 0x3f, 0x35, 0xfc, 0xb7, 0xdd, 0xab, 0x3f, 0x11,
+	0xc2, 0x99, 0x42, 0xa8, 0x51, 0x20, 0x94, 0xf8, 0x08, 0x19, 0xcd, 0x6b, 0xdb, 0x2c, 0xe6, 0xff,
+	0x06, 0x00, 0x00, 0xff, 0xff, 0xac, 0x62, 0x97, 0x1a, 0xfb, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/matching_function_context_type.pb.go b/googleapis/ads/googleads/v3/enums/matching_function_context_type.pb.go
new file mode 100644
index 0000000..6ade4d1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/matching_function_context_type.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/matching_function_context_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible context types for an operand in a matching function.
+type MatchingFunctionContextTypeEnum_MatchingFunctionContextType int32
+
+const (
+	// Not specified.
+	MatchingFunctionContextTypeEnum_UNSPECIFIED MatchingFunctionContextTypeEnum_MatchingFunctionContextType = 0
+	// Used for return value only. Represents value unknown in this version.
+	MatchingFunctionContextTypeEnum_UNKNOWN MatchingFunctionContextTypeEnum_MatchingFunctionContextType = 1
+	// Feed item id in the request context.
+	MatchingFunctionContextTypeEnum_FEED_ITEM_ID MatchingFunctionContextTypeEnum_MatchingFunctionContextType = 2
+	// The device being used (possible values are 'Desktop' or 'Mobile').
+	MatchingFunctionContextTypeEnum_DEVICE_NAME MatchingFunctionContextTypeEnum_MatchingFunctionContextType = 3
+)
+
+var MatchingFunctionContextTypeEnum_MatchingFunctionContextType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "FEED_ITEM_ID",
+	3: "DEVICE_NAME",
+}
+
+var MatchingFunctionContextTypeEnum_MatchingFunctionContextType_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"FEED_ITEM_ID": 2,
+	"DEVICE_NAME":  3,
+}
+
+func (x MatchingFunctionContextTypeEnum_MatchingFunctionContextType) String() string {
+	return proto.EnumName(MatchingFunctionContextTypeEnum_MatchingFunctionContextType_name, int32(x))
+}
+
+func (MatchingFunctionContextTypeEnum_MatchingFunctionContextType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_59c241b42801f559, []int{0, 0}
+}
+
+// Container for context types for an operand in a matching function.
+type MatchingFunctionContextTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MatchingFunctionContextTypeEnum) Reset()         { *m = MatchingFunctionContextTypeEnum{} }
+func (m *MatchingFunctionContextTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*MatchingFunctionContextTypeEnum) ProtoMessage()    {}
+func (*MatchingFunctionContextTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_59c241b42801f559, []int{0}
+}
+
+func (m *MatchingFunctionContextTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MatchingFunctionContextTypeEnum.Unmarshal(m, b)
+}
+func (m *MatchingFunctionContextTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MatchingFunctionContextTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *MatchingFunctionContextTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MatchingFunctionContextTypeEnum.Merge(m, src)
+}
+func (m *MatchingFunctionContextTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_MatchingFunctionContextTypeEnum.Size(m)
+}
+func (m *MatchingFunctionContextTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MatchingFunctionContextTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MatchingFunctionContextTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MatchingFunctionContextTypeEnum_MatchingFunctionContextType", MatchingFunctionContextTypeEnum_MatchingFunctionContextType_name, MatchingFunctionContextTypeEnum_MatchingFunctionContextType_value)
+	proto.RegisterType((*MatchingFunctionContextTypeEnum)(nil), "google.ads.googleads.v3.enums.MatchingFunctionContextTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/matching_function_context_type.proto", fileDescriptor_59c241b42801f559)
+}
+
+var fileDescriptor_59c241b42801f559 = []byte{
+	// 328 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4b, 0xfb, 0x30,
+	0x1c, 0xfd, 0xb7, 0x83, 0xbf, 0x90, 0x09, 0x96, 0x1e, 0xd5, 0xa1, 0xdb, 0x07, 0x48, 0x0f, 0xbd,
+	0xc5, 0x53, 0xb7, 0x66, 0xa3, 0xc8, 0xea, 0xc0, 0xad, 0x82, 0x14, 0x4b, 0x6c, 0x63, 0x2c, 0xac,
+	0x49, 0x59, 0xb2, 0xe1, 0x8e, 0x7e, 0x15, 0x8f, 0x7e, 0x14, 0x3f, 0x8a, 0x77, 0xef, 0x92, 0x64,
+	0xdb, 0xcd, 0x5d, 0xc2, 0x23, 0xbf, 0xf7, 0x7b, 0xef, 0xf7, 0x1e, 0x18, 0x32, 0x21, 0xd8, 0x92,
+	0x06, 0xa4, 0x92, 0x81, 0x85, 0x1a, 0x6d, 0xc2, 0x80, 0xf2, 0x75, 0x23, 0x83, 0x86, 0xa8, 0xf2,
+	0xb5, 0xe6, 0xac, 0x78, 0x59, 0xf3, 0x52, 0xd5, 0x82, 0x17, 0xa5, 0xe0, 0x8a, 0xbe, 0xa9, 0x42,
+	0x6d, 0x5b, 0x0a, 0xdb, 0x95, 0x50, 0xc2, 0xef, 0xd9, 0x45, 0x48, 0x2a, 0x09, 0x0f, 0x1a, 0x70,
+	0x13, 0x42, 0xa3, 0x71, 0x7e, 0xb9, 0xb7, 0x68, 0xeb, 0x80, 0x70, 0x2e, 0x14, 0xd1, 0x42, 0xd2,
+	0x2e, 0x0f, 0xde, 0x1d, 0x70, 0x35, 0xdd, 0xb9, 0x8c, 0x77, 0x26, 0x23, 0xeb, 0x31, 0xdf, 0xb6,
+	0x14, 0xf3, 0x75, 0x33, 0x78, 0x02, 0x17, 0x47, 0x28, 0xfe, 0x19, 0xe8, 0x2e, 0xd2, 0xfb, 0x19,
+	0x1e, 0x25, 0xe3, 0x04, 0xc7, 0xde, 0x3f, 0xbf, 0x0b, 0x4e, 0x16, 0xe9, 0x6d, 0x7a, 0xf7, 0x90,
+	0x7a, 0x8e, 0xef, 0x81, 0xd3, 0x31, 0xc6, 0x71, 0x91, 0xcc, 0xf1, 0xb4, 0x48, 0x62, 0xcf, 0xd5,
+	0xfc, 0x18, 0x67, 0xc9, 0x08, 0x17, 0x69, 0x34, 0xc5, 0x5e, 0x67, 0xf8, 0xe3, 0x80, 0x7e, 0x29,
+	0x1a, 0x78, 0x34, 0xc7, 0xf0, 0xfa, 0xc8, 0x0d, 0x33, 0x9d, 0x65, 0xe6, 0x3c, 0xee, 0xea, 0x84,
+	0x4c, 0x2c, 0x09, 0x67, 0x50, 0xac, 0x58, 0xc0, 0x28, 0x37, 0x49, 0xf7, 0xf5, 0xb6, 0xb5, 0xfc,
+	0xa3, 0xed, 0x1b, 0xf3, 0x7e, 0xb8, 0x9d, 0x49, 0x14, 0x7d, 0xba, 0xbd, 0x89, 0x95, 0x8a, 0x2a,
+	0x09, 0x2d, 0xd4, 0x28, 0x0b, 0xa1, 0xae, 0x44, 0x7e, 0xed, 0xe7, 0x79, 0x54, 0xc9, 0xfc, 0x30,
+	0xcf, 0xb3, 0x30, 0x37, 0xf3, 0x6f, 0xb7, 0x6f, 0x3f, 0x11, 0x8a, 0x2a, 0x89, 0xd0, 0x81, 0x81,
+	0x50, 0x16, 0x22, 0x64, 0x38, 0xcf, 0xff, 0xcd, 0x61, 0xe1, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x84, 0x8c, 0xc4, 0x0d, 0x05, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/matching_function_operator.pb.go b/googleapis/ads/googleads/v3/enums/matching_function_operator.pb.go
new file mode 100644
index 0000000..a0f4eca
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/matching_function_operator.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/matching_function_operator.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible operators in a matching function.
+type MatchingFunctionOperatorEnum_MatchingFunctionOperator int32
+
+const (
+	// Not specified.
+	MatchingFunctionOperatorEnum_UNSPECIFIED MatchingFunctionOperatorEnum_MatchingFunctionOperator = 0
+	// Used for return value only. Represents value unknown in this version.
+	MatchingFunctionOperatorEnum_UNKNOWN MatchingFunctionOperatorEnum_MatchingFunctionOperator = 1
+	// The IN operator.
+	MatchingFunctionOperatorEnum_IN MatchingFunctionOperatorEnum_MatchingFunctionOperator = 2
+	// The IDENTITY operator.
+	MatchingFunctionOperatorEnum_IDENTITY MatchingFunctionOperatorEnum_MatchingFunctionOperator = 3
+	// The EQUALS operator
+	MatchingFunctionOperatorEnum_EQUALS MatchingFunctionOperatorEnum_MatchingFunctionOperator = 4
+	// Operator that takes two or more operands that are of type
+	// FunctionOperand and checks that all the operands evaluate to true.
+	// For functions related to ad formats, all the operands must be in
+	// left_operands.
+	MatchingFunctionOperatorEnum_AND MatchingFunctionOperatorEnum_MatchingFunctionOperator = 5
+	// Operator that returns true if the elements in left_operands contain any
+	// of the elements in right_operands. Otherwise, return false. The
+	// right_operands must contain at least 1 and no more than 3
+	// ConstantOperands.
+	MatchingFunctionOperatorEnum_CONTAINS_ANY MatchingFunctionOperatorEnum_MatchingFunctionOperator = 6
+)
+
+var MatchingFunctionOperatorEnum_MatchingFunctionOperator_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "IN",
+	3: "IDENTITY",
+	4: "EQUALS",
+	5: "AND",
+	6: "CONTAINS_ANY",
+}
+
+var MatchingFunctionOperatorEnum_MatchingFunctionOperator_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"IN":           2,
+	"IDENTITY":     3,
+	"EQUALS":       4,
+	"AND":          5,
+	"CONTAINS_ANY": 6,
+}
+
+func (x MatchingFunctionOperatorEnum_MatchingFunctionOperator) String() string {
+	return proto.EnumName(MatchingFunctionOperatorEnum_MatchingFunctionOperator_name, int32(x))
+}
+
+func (MatchingFunctionOperatorEnum_MatchingFunctionOperator) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_5d607f3302220a7f, []int{0, 0}
+}
+
+// Container for enum describing matching function operator.
+type MatchingFunctionOperatorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MatchingFunctionOperatorEnum) Reset()         { *m = MatchingFunctionOperatorEnum{} }
+func (m *MatchingFunctionOperatorEnum) String() string { return proto.CompactTextString(m) }
+func (*MatchingFunctionOperatorEnum) ProtoMessage()    {}
+func (*MatchingFunctionOperatorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5d607f3302220a7f, []int{0}
+}
+
+func (m *MatchingFunctionOperatorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MatchingFunctionOperatorEnum.Unmarshal(m, b)
+}
+func (m *MatchingFunctionOperatorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MatchingFunctionOperatorEnum.Marshal(b, m, deterministic)
+}
+func (m *MatchingFunctionOperatorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MatchingFunctionOperatorEnum.Merge(m, src)
+}
+func (m *MatchingFunctionOperatorEnum) XXX_Size() int {
+	return xxx_messageInfo_MatchingFunctionOperatorEnum.Size(m)
+}
+func (m *MatchingFunctionOperatorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MatchingFunctionOperatorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MatchingFunctionOperatorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MatchingFunctionOperatorEnum_MatchingFunctionOperator", MatchingFunctionOperatorEnum_MatchingFunctionOperator_name, MatchingFunctionOperatorEnum_MatchingFunctionOperator_value)
+	proto.RegisterType((*MatchingFunctionOperatorEnum)(nil), "google.ads.googleads.v3.enums.MatchingFunctionOperatorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/matching_function_operator.proto", fileDescriptor_5d607f3302220a7f)
+}
+
+var fileDescriptor_5d607f3302220a7f = []byte{
+	// 343 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4b, 0x4e, 0xc3, 0x30,
+	0x14, 0x24, 0x29, 0xa4, 0xc8, 0xad, 0x84, 0xe5, 0x15, 0x42, 0xed, 0xa2, 0x3d, 0x80, 0xb3, 0xc8,
+	0xce, 0x48, 0x48, 0x6e, 0x9b, 0x56, 0x11, 0xe0, 0x16, 0xf5, 0x83, 0x8a, 0x22, 0x55, 0xa6, 0x09,
+	0x26, 0x52, 0x63, 0x47, 0x71, 0xd2, 0x9b, 0x70, 0x01, 0x96, 0x1c, 0x85, 0xa3, 0xb0, 0xe4, 0x04,
+	0x28, 0x9f, 0x76, 0x57, 0x36, 0xd6, 0xc8, 0xf3, 0x66, 0xde, 0x9b, 0x01, 0x77, 0x42, 0x29, 0xb1,
+	0x0b, 0x6d, 0x1e, 0x68, 0xbb, 0x82, 0x05, 0xda, 0x3b, 0x76, 0x28, 0xf3, 0x58, 0xdb, 0x31, 0xcf,
+	0xb6, 0xef, 0x91, 0x14, 0x9b, 0xb7, 0x5c, 0x6e, 0xb3, 0x48, 0xc9, 0x8d, 0x4a, 0xc2, 0x94, 0x67,
+	0x2a, 0xc5, 0x49, 0xaa, 0x32, 0x85, 0xba, 0x95, 0x08, 0xf3, 0x40, 0xe3, 0xa3, 0x1e, 0xef, 0x1d,
+	0x5c, 0xea, 0x6f, 0x3a, 0x07, 0xfb, 0x24, 0xb2, 0xb9, 0x94, 0x2a, 0xe3, 0x85, 0x89, 0xae, 0xc4,
+	0xfd, 0x0f, 0x03, 0x74, 0x1e, 0xeb, 0x0d, 0xe3, 0x7a, 0xc1, 0xb4, 0xf6, 0x77, 0x65, 0x1e, 0xf7,
+	0x73, 0x70, 0x7d, 0x8a, 0x47, 0x57, 0xa0, 0xb5, 0x64, 0xf3, 0x99, 0x3b, 0xf4, 0xc6, 0x9e, 0x3b,
+	0x82, 0x67, 0xa8, 0x05, 0x9a, 0x4b, 0x76, 0xcf, 0xa6, 0xcf, 0x0c, 0x1a, 0xc8, 0x02, 0xa6, 0xc7,
+	0xa0, 0x89, 0xda, 0xe0, 0xd2, 0x1b, 0xb9, 0x6c, 0xe1, 0x2d, 0xd6, 0xb0, 0x81, 0x00, 0xb0, 0xdc,
+	0xa7, 0x25, 0x7d, 0x98, 0xc3, 0x73, 0xd4, 0x04, 0x0d, 0xca, 0x46, 0xf0, 0x02, 0x41, 0xd0, 0x1e,
+	0x4e, 0xd9, 0x82, 0x7a, 0x6c, 0xbe, 0xa1, 0x6c, 0x0d, 0xad, 0xc1, 0xaf, 0x01, 0x7a, 0x5b, 0x15,
+	0xe3, 0x7f, 0xb3, 0x0d, 0xba, 0xa7, 0x4e, 0x9b, 0x15, 0xe1, 0x66, 0xc6, 0xcb, 0xa0, 0xd6, 0x0b,
+	0xb5, 0xe3, 0x52, 0x60, 0x95, 0x0a, 0x5b, 0x84, 0xb2, 0x8c, 0x7e, 0xe8, 0x3a, 0x89, 0xf4, 0x89,
+	0xea, 0x6f, 0xcb, 0xf7, 0xd3, 0x6c, 0x4c, 0x28, 0xfd, 0x32, 0xbb, 0x93, 0xca, 0x8a, 0x06, 0x1a,
+	0x57, 0xb0, 0x40, 0x2b, 0x07, 0x17, 0x35, 0xe9, 0xef, 0x03, 0xef, 0xd3, 0x40, 0xfb, 0x47, 0xde,
+	0x5f, 0x39, 0x7e, 0xc9, 0xff, 0x98, 0xbd, 0xea, 0x93, 0x10, 0x1a, 0x68, 0x42, 0x8e, 0x13, 0x84,
+	0xac, 0x1c, 0x42, 0xca, 0x99, 0x57, 0xab, 0x3c, 0xcc, 0xf9, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x5d,
+	0xe8, 0x9e, 0xe0, 0x12, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/media_type.pb.go b/googleapis/ads/googleads/v3/enums/media_type.pb.go
new file mode 100644
index 0000000..60f691b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/media_type.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/media_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of media.
+type MediaTypeEnum_MediaType int32
+
+const (
+	// The media type has not been specified.
+	MediaTypeEnum_UNSPECIFIED MediaTypeEnum_MediaType = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	MediaTypeEnum_UNKNOWN MediaTypeEnum_MediaType = 1
+	// Static image, used for image ad.
+	MediaTypeEnum_IMAGE MediaTypeEnum_MediaType = 2
+	// Small image, used for map ad.
+	MediaTypeEnum_ICON MediaTypeEnum_MediaType = 3
+	// ZIP file, used in fields of template ads.
+	MediaTypeEnum_MEDIA_BUNDLE MediaTypeEnum_MediaType = 4
+	// Audio file.
+	MediaTypeEnum_AUDIO MediaTypeEnum_MediaType = 5
+	// Video file.
+	MediaTypeEnum_VIDEO MediaTypeEnum_MediaType = 6
+	// Animated image, such as animated GIF.
+	MediaTypeEnum_DYNAMIC_IMAGE MediaTypeEnum_MediaType = 7
+)
+
+var MediaTypeEnum_MediaType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "IMAGE",
+	3: "ICON",
+	4: "MEDIA_BUNDLE",
+	5: "AUDIO",
+	6: "VIDEO",
+	7: "DYNAMIC_IMAGE",
+}
+
+var MediaTypeEnum_MediaType_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"IMAGE":         2,
+	"ICON":          3,
+	"MEDIA_BUNDLE":  4,
+	"AUDIO":         5,
+	"VIDEO":         6,
+	"DYNAMIC_IMAGE": 7,
+}
+
+func (x MediaTypeEnum_MediaType) String() string {
+	return proto.EnumName(MediaTypeEnum_MediaType_name, int32(x))
+}
+
+func (MediaTypeEnum_MediaType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6278b809e9e9ccfb, []int{0, 0}
+}
+
+// Container for enum describing the types of media.
+type MediaTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MediaTypeEnum) Reset()         { *m = MediaTypeEnum{} }
+func (m *MediaTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*MediaTypeEnum) ProtoMessage()    {}
+func (*MediaTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6278b809e9e9ccfb, []int{0}
+}
+
+func (m *MediaTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaTypeEnum.Unmarshal(m, b)
+}
+func (m *MediaTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *MediaTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaTypeEnum.Merge(m, src)
+}
+func (m *MediaTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_MediaTypeEnum.Size(m)
+}
+func (m *MediaTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MediaTypeEnum_MediaType", MediaTypeEnum_MediaType_name, MediaTypeEnum_MediaType_value)
+	proto.RegisterType((*MediaTypeEnum)(nil), "google.ads.googleads.v3.enums.MediaTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/media_type.proto", fileDescriptor_6278b809e9e9ccfb)
+}
+
+var fileDescriptor_6278b809e9e9ccfb = []byte{
+	// 340 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4e, 0xe3, 0x30,
+	0x18, 0xc5, 0x27, 0xe9, 0xbf, 0xa9, 0x3b, 0x9d, 0xf1, 0x64, 0x89, 0xe8, 0xa2, 0x3d, 0x80, 0xb3,
+	0xc8, 0xce, 0xac, 0x9c, 0x26, 0x54, 0x16, 0xc4, 0xa9, 0x04, 0x09, 0x02, 0x45, 0xaa, 0x02, 0x89,
+	0xa2, 0x48, 0x8d, 0x1d, 0xd5, 0x69, 0xa5, 0x5e, 0x81, 0x63, 0xb0, 0xe4, 0x28, 0x5c, 0x83, 0x1d,
+	0xa7, 0x40, 0x8e, 0x69, 0x76, 0xb0, 0xb1, 0x9e, 0xfc, 0xfd, 0xbe, 0xa7, 0xef, 0x3d, 0x80, 0x0a,
+	0x21, 0x8a, 0x6d, 0x6e, 0xa7, 0x99, 0xb4, 0xb5, 0x54, 0xea, 0xe0, 0xd8, 0x39, 0xdf, 0x57, 0xd2,
+	0xae, 0xf2, 0xac, 0x4c, 0x37, 0xcd, 0xb1, 0xce, 0x51, 0xbd, 0x13, 0x8d, 0xb0, 0x66, 0x1a, 0x42,
+	0x69, 0x26, 0x51, 0xc7, 0xa3, 0x83, 0x83, 0x5a, 0xfe, 0xec, 0xfc, 0x64, 0x57, 0x97, 0x76, 0xca,
+	0xb9, 0x68, 0xd2, 0xa6, 0x14, 0x5c, 0xea, 0xe5, 0xc5, 0xb3, 0x01, 0xa6, 0x81, 0x72, 0xbc, 0x3d,
+	0xd6, 0xb9, 0xcf, 0xf7, 0xd5, 0xe2, 0x08, 0xc6, 0xdd, 0x87, 0xf5, 0x0f, 0x4c, 0x22, 0x76, 0xb3,
+	0xf6, 0x97, 0xf4, 0x92, 0xfa, 0x1e, 0xfc, 0x65, 0x4d, 0xc0, 0x28, 0x62, 0x57, 0x2c, 0xbc, 0x63,
+	0xd0, 0xb0, 0xc6, 0x60, 0x40, 0x03, 0xb2, 0xf2, 0xa1, 0x69, 0xfd, 0x06, 0x7d, 0xba, 0x0c, 0x19,
+	0xec, 0x59, 0x10, 0xfc, 0x09, 0x7c, 0x8f, 0x92, 0x8d, 0x1b, 0x31, 0xef, 0xda, 0x87, 0x7d, 0x85,
+	0x91, 0xc8, 0xa3, 0x21, 0x1c, 0x28, 0x19, 0x53, 0xcf, 0x0f, 0xe1, 0xd0, 0xfa, 0x0f, 0xa6, 0xde,
+	0x3d, 0x23, 0x01, 0x5d, 0x6e, 0xb4, 0xc9, 0xc8, 0x7d, 0x37, 0xc0, 0xfc, 0x49, 0x54, 0xe8, 0xc7,
+	0x40, 0xee, 0xdf, 0xee, 0xbc, 0xb5, 0x8a, 0xb0, 0x36, 0x1e, 0xdc, 0xaf, 0x85, 0x42, 0x6c, 0x53,
+	0x5e, 0x20, 0xb1, 0x2b, 0xec, 0x22, 0xe7, 0x6d, 0xc0, 0x53, 0x83, 0x75, 0x29, 0xbf, 0x29, 0xf4,
+	0xa2, 0x7d, 0x5f, 0xcc, 0xde, 0x8a, 0x90, 0x57, 0x73, 0xb6, 0xd2, 0x56, 0x24, 0x93, 0x48, 0x4b,
+	0xa5, 0x62, 0x07, 0xa9, 0x6e, 0xe4, 0xdb, 0x69, 0x9e, 0x90, 0x4c, 0x26, 0xdd, 0x3c, 0x89, 0x9d,
+	0xa4, 0x9d, 0x7f, 0x98, 0x73, 0xfd, 0x89, 0x31, 0xc9, 0x24, 0xc6, 0x1d, 0x81, 0x71, 0xec, 0x60,
+	0xdc, 0x32, 0x8f, 0xc3, 0xf6, 0x30, 0xe7, 0x33, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xbb, 0xa1, 0x2a,
+	0xe8, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/merchant_center_link_status.pb.go b/googleapis/ads/googleads/v3/enums/merchant_center_link_status.pb.go
new file mode 100644
index 0000000..2540955
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/merchant_center_link_status.pb.go
@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/merchant_center_link_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Describes the possible statuses for a link between a Google Ads customer
+// and a Google Merchant Center account.
+type MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus int32
+
+const (
+	// Not specified.
+	MerchantCenterLinkStatusEnum_UNSPECIFIED MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	MerchantCenterLinkStatusEnum_UNKNOWN MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus = 1
+	// The link is enabled.
+	MerchantCenterLinkStatusEnum_ENABLED MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus = 2
+	// The link has no effect. It was proposed by the Merchant Center Account
+	// owner and hasn't been confirmed by the customer.
+	MerchantCenterLinkStatusEnum_PENDING MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus = 3
+)
+
+var MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "PENDING",
+}
+
+var MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"PENDING":     3,
+}
+
+func (x MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus) String() string {
+	return proto.EnumName(MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus_name, int32(x))
+}
+
+func (MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8efd1c04a55e69bb, []int{0, 0}
+}
+
+// Container for enum describing possible statuses of a Google Merchant Center
+// link.
+type MerchantCenterLinkStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MerchantCenterLinkStatusEnum) Reset()         { *m = MerchantCenterLinkStatusEnum{} }
+func (m *MerchantCenterLinkStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*MerchantCenterLinkStatusEnum) ProtoMessage()    {}
+func (*MerchantCenterLinkStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8efd1c04a55e69bb, []int{0}
+}
+
+func (m *MerchantCenterLinkStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MerchantCenterLinkStatusEnum.Unmarshal(m, b)
+}
+func (m *MerchantCenterLinkStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MerchantCenterLinkStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *MerchantCenterLinkStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MerchantCenterLinkStatusEnum.Merge(m, src)
+}
+func (m *MerchantCenterLinkStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_MerchantCenterLinkStatusEnum.Size(m)
+}
+func (m *MerchantCenterLinkStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MerchantCenterLinkStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MerchantCenterLinkStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus", MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus_name, MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus_value)
+	proto.RegisterType((*MerchantCenterLinkStatusEnum)(nil), "google.ads.googleads.v3.enums.MerchantCenterLinkStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/merchant_center_link_status.proto", fileDescriptor_8efd1c04a55e69bb)
+}
+
+var fileDescriptor_8efd1c04a55e69bb = []byte{
+	// 313 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4e, 0x02, 0x31,
+	0x14, 0x94, 0x25, 0xd1, 0xa4, 0x1c, 0xdc, 0x70, 0x32, 0x06, 0x0e, 0xf0, 0x01, 0xed, 0xa1, 0xb7,
+	0x7a, 0x30, 0x5d, 0xa8, 0x84, 0x88, 0x75, 0x23, 0x01, 0x13, 0xb3, 0x09, 0xa9, 0x6c, 0x53, 0x37,
+	0xb0, 0x2d, 0xd9, 0x16, 0x3e, 0xc8, 0xa3, 0x9f, 0xe2, 0xa7, 0x78, 0xf4, 0x0b, 0x4c, 0xbb, 0xc0,
+	0x6d, 0xbd, 0x6c, 0xe6, 0xed, 0xbc, 0x37, 0x33, 0x1d, 0x70, 0xaf, 0x8c, 0x51, 0x5b, 0x89, 0x44,
+	0x6e, 0x51, 0x0d, 0x3d, 0x3a, 0x60, 0x24, 0xf5, 0xbe, 0xb4, 0xa8, 0x94, 0xd5, 0xfa, 0x43, 0x68,
+	0xb7, 0x5a, 0x4b, 0xed, 0x64, 0xb5, 0xda, 0x16, 0x7a, 0xb3, 0xb2, 0x4e, 0xb8, 0xbd, 0x85, 0xbb,
+	0xca, 0x38, 0xd3, 0xed, 0xd7, 0x57, 0x50, 0xe4, 0x16, 0x9e, 0x05, 0xe0, 0x01, 0xc3, 0x20, 0x70,
+	0xdb, 0x3b, 0xe9, 0xef, 0x0a, 0x24, 0xb4, 0x36, 0x4e, 0xb8, 0xc2, 0xe8, 0xe3, 0xf1, 0xb0, 0x02,
+	0xbd, 0xa7, 0xa3, 0xc3, 0x28, 0x18, 0xcc, 0x0a, 0xbd, 0x99, 0x07, 0x79, 0xa6, 0xf7, 0xe5, 0xf0,
+	0x05, 0xdc, 0x34, 0xf1, 0xdd, 0x6b, 0xd0, 0x59, 0xf0, 0x79, 0xca, 0x46, 0xd3, 0x87, 0x29, 0x1b,
+	0xc7, 0x17, 0xdd, 0x0e, 0xb8, 0x5a, 0xf0, 0x47, 0xfe, 0xfc, 0xca, 0xe3, 0x96, 0x1f, 0x18, 0xa7,
+	0xc9, 0x8c, 0x8d, 0xe3, 0xc8, 0x0f, 0x29, 0xe3, 0xe3, 0x29, 0x9f, 0xc4, 0xed, 0xe4, 0xb7, 0x05,
+	0x06, 0x6b, 0x53, 0xc2, 0x7f, 0x73, 0x27, 0xfd, 0x26, 0xdf, 0xd4, 0x07, 0x4f, 0x5b, 0x6f, 0xc9,
+	0xf1, 0x5e, 0x99, 0xad, 0xd0, 0x0a, 0x9a, 0x4a, 0x21, 0x25, 0x75, 0x78, 0xd6, 0xa9, 0xc8, 0x5d,
+	0x61, 0x1b, 0x7a, 0xbd, 0x0b, 0xdf, 0xcf, 0xa8, 0x3d, 0xa1, 0xf4, 0x2b, 0xea, 0x4f, 0x6a, 0x29,
+	0x9a, 0x5b, 0x58, 0x43, 0x8f, 0x96, 0x18, 0xfa, 0x0e, 0xec, 0xf7, 0x89, 0xcf, 0x68, 0x6e, 0xb3,
+	0x33, 0x9f, 0x2d, 0x71, 0x16, 0xf8, 0x9f, 0x68, 0x50, 0xff, 0x24, 0x84, 0xe6, 0x96, 0x90, 0xf3,
+	0x06, 0x21, 0x4b, 0x4c, 0x48, 0xd8, 0x79, 0xbf, 0x0c, 0xc1, 0xf0, 0x5f, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0x86, 0x38, 0x4f, 0x57, 0xef, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/message_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/message_placeholder_field.pb.go
new file mode 100644
index 0000000..3e5269c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/message_placeholder_field.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/message_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Message placeholder fields.
+type MessagePlaceholderFieldEnum_MessagePlaceholderField int32
+
+const (
+	// Not specified.
+	MessagePlaceholderFieldEnum_UNSPECIFIED MessagePlaceholderFieldEnum_MessagePlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	MessagePlaceholderFieldEnum_UNKNOWN MessagePlaceholderFieldEnum_MessagePlaceholderField = 1
+	// Data Type: STRING. The name of your business.
+	MessagePlaceholderFieldEnum_BUSINESS_NAME MessagePlaceholderFieldEnum_MessagePlaceholderField = 2
+	// Data Type: STRING. Country code of phone number.
+	MessagePlaceholderFieldEnum_COUNTRY_CODE MessagePlaceholderFieldEnum_MessagePlaceholderField = 3
+	// Data Type: STRING. A phone number that's capable of sending and receiving
+	// text messages.
+	MessagePlaceholderFieldEnum_PHONE_NUMBER MessagePlaceholderFieldEnum_MessagePlaceholderField = 4
+	// Data Type: STRING. The text that will go in your click-to-message ad.
+	MessagePlaceholderFieldEnum_MESSAGE_EXTENSION_TEXT MessagePlaceholderFieldEnum_MessagePlaceholderField = 5
+	// Data Type: STRING. The message text automatically shows in people's
+	// messaging apps when they tap to send you a message.
+	MessagePlaceholderFieldEnum_MESSAGE_TEXT MessagePlaceholderFieldEnum_MessagePlaceholderField = 6
+)
+
+var MessagePlaceholderFieldEnum_MessagePlaceholderField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "BUSINESS_NAME",
+	3: "COUNTRY_CODE",
+	4: "PHONE_NUMBER",
+	5: "MESSAGE_EXTENSION_TEXT",
+	6: "MESSAGE_TEXT",
+}
+
+var MessagePlaceholderFieldEnum_MessagePlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":            0,
+	"UNKNOWN":                1,
+	"BUSINESS_NAME":          2,
+	"COUNTRY_CODE":           3,
+	"PHONE_NUMBER":           4,
+	"MESSAGE_EXTENSION_TEXT": 5,
+	"MESSAGE_TEXT":           6,
+}
+
+func (x MessagePlaceholderFieldEnum_MessagePlaceholderField) String() string {
+	return proto.EnumName(MessagePlaceholderFieldEnum_MessagePlaceholderField_name, int32(x))
+}
+
+func (MessagePlaceholderFieldEnum_MessagePlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_dfd7bbc8830233e3, []int{0, 0}
+}
+
+// Values for Message placeholder fields.
+type MessagePlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MessagePlaceholderFieldEnum) Reset()         { *m = MessagePlaceholderFieldEnum{} }
+func (m *MessagePlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*MessagePlaceholderFieldEnum) ProtoMessage()    {}
+func (*MessagePlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dfd7bbc8830233e3, []int{0}
+}
+
+func (m *MessagePlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MessagePlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *MessagePlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MessagePlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *MessagePlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MessagePlaceholderFieldEnum.Merge(m, src)
+}
+func (m *MessagePlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_MessagePlaceholderFieldEnum.Size(m)
+}
+func (m *MessagePlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MessagePlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MessagePlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MessagePlaceholderFieldEnum_MessagePlaceholderField", MessagePlaceholderFieldEnum_MessagePlaceholderField_name, MessagePlaceholderFieldEnum_MessagePlaceholderField_value)
+	proto.RegisterType((*MessagePlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.MessagePlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/message_placeholder_field.proto", fileDescriptor_dfd7bbc8830233e3)
+}
+
+var fileDescriptor_dfd7bbc8830233e3 = []byte{
+	// 368 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xcf, 0x4e, 0x83, 0x30,
+	0x1c, 0x16, 0xa6, 0x33, 0xe9, 0x34, 0x22, 0x07, 0x4d, 0xe6, 0x76, 0xd8, 0x1e, 0xa0, 0x1c, 0xb8,
+	0xd5, 0x78, 0x80, 0xad, 0x9b, 0xc4, 0x50, 0xc8, 0x80, 0x39, 0x0d, 0x09, 0xc1, 0x51, 0x91, 0x04,
+	0x28, 0x59, 0xb7, 0x3d, 0x8d, 0x27, 0x8f, 0x3e, 0x83, 0x4f, 0xe0, 0xa3, 0x78, 0xf3, 0x0d, 0x0c,
+	0x20, 0xf3, 0x34, 0x2f, 0xcd, 0x97, 0xdf, 0xf7, 0xa7, 0xed, 0xf7, 0x03, 0x37, 0x31, 0x63, 0x71,
+	0x4a, 0x95, 0x30, 0xe2, 0x4a, 0x0d, 0x4b, 0xb4, 0x55, 0x15, 0x9a, 0x6f, 0x32, 0xae, 0x64, 0x94,
+	0xf3, 0x30, 0xa6, 0x41, 0x91, 0x86, 0x4b, 0xfa, 0xc2, 0xd2, 0x88, 0xae, 0x82, 0xe7, 0x84, 0xa6,
+	0x11, 0x2c, 0x56, 0x6c, 0xcd, 0xe4, 0x7e, 0xed, 0x81, 0x61, 0xc4, 0xe1, 0xce, 0x0e, 0xb7, 0x2a,
+	0xac, 0xec, 0xdd, 0x5e, 0x93, 0x5e, 0x24, 0x4a, 0x98, 0xe7, 0x6c, 0x1d, 0xae, 0x13, 0x96, 0xf3,
+	0xda, 0x3c, 0xfc, 0x10, 0xc0, 0x95, 0x59, 0x5f, 0x60, 0xff, 0xe5, 0x4f, 0xca, 0x78, 0x9c, 0x6f,
+	0xb2, 0xe1, 0xab, 0x00, 0x2e, 0xf7, 0xf0, 0xf2, 0x19, 0xe8, 0x78, 0xc4, 0xb1, 0xf1, 0xc8, 0x98,
+	0x18, 0x78, 0x2c, 0x1d, 0xc8, 0x1d, 0x70, 0xec, 0x91, 0x3b, 0x62, 0xdd, 0x13, 0x49, 0x90, 0xcf,
+	0xc1, 0xa9, 0xee, 0x39, 0x06, 0xc1, 0x8e, 0x13, 0x10, 0xcd, 0xc4, 0x92, 0x28, 0x4b, 0xe0, 0x64,
+	0x64, 0x79, 0xc4, 0x9d, 0x3d, 0x04, 0x23, 0x6b, 0x8c, 0xa5, 0x56, 0x39, 0xb1, 0x6f, 0x2d, 0x82,
+	0x03, 0xe2, 0x99, 0x3a, 0x9e, 0x49, 0x87, 0x72, 0x17, 0x5c, 0x98, 0xd8, 0x71, 0xb4, 0x29, 0x0e,
+	0xf0, 0xc2, 0xc5, 0xc4, 0x31, 0x2c, 0x12, 0xb8, 0x78, 0xe1, 0x4a, 0x47, 0xa5, 0xba, 0xe1, 0xaa,
+	0x49, 0x5b, 0xff, 0x16, 0xc0, 0x60, 0xc9, 0x32, 0xf8, 0x6f, 0x05, 0x7a, 0x6f, 0xcf, 0x0f, 0xec,
+	0xb2, 0x02, 0x5b, 0x78, 0xd4, 0x7f, 0xed, 0x31, 0x4b, 0xc3, 0x3c, 0x86, 0x6c, 0x15, 0x2b, 0x31,
+	0xcd, 0xab, 0x82, 0x9a, 0x85, 0x14, 0x09, 0xdf, 0xb3, 0x9f, 0xeb, 0xea, 0x7c, 0x13, 0x5b, 0x53,
+	0x4d, 0x7b, 0x17, 0xfb, 0xd3, 0x3a, 0x4a, 0x8b, 0x38, 0xac, 0x61, 0x89, 0xe6, 0x2a, 0x2c, 0xdb,
+	0xe4, 0x9f, 0x0d, 0xef, 0x6b, 0x11, 0xf7, 0x77, 0xbc, 0x3f, 0x57, 0xfd, 0x8a, 0xff, 0x12, 0x07,
+	0xf5, 0x10, 0x21, 0x2d, 0xe2, 0x08, 0xed, 0x14, 0x08, 0xcd, 0x55, 0x84, 0x2a, 0xcd, 0x53, 0xbb,
+	0x7a, 0x98, 0xfa, 0x13, 0x00, 0x00, 0xff, 0xff, 0x01, 0x89, 0xc8, 0xac, 0x37, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/mime_type.pb.go b/googleapis/ads/googleads/v3/enums/mime_type.pb.go
new file mode 100644
index 0000000..253d418
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/mime_type.pb.go
@@ -0,0 +1,171 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/mime_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The mime type
+type MimeTypeEnum_MimeType int32
+
+const (
+	// The mime type has not been specified.
+	MimeTypeEnum_UNSPECIFIED MimeTypeEnum_MimeType = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	MimeTypeEnum_UNKNOWN MimeTypeEnum_MimeType = 1
+	// MIME type of image/jpeg.
+	MimeTypeEnum_IMAGE_JPEG MimeTypeEnum_MimeType = 2
+	// MIME type of image/gif.
+	MimeTypeEnum_IMAGE_GIF MimeTypeEnum_MimeType = 3
+	// MIME type of image/png.
+	MimeTypeEnum_IMAGE_PNG MimeTypeEnum_MimeType = 4
+	// MIME type of application/x-shockwave-flash.
+	MimeTypeEnum_FLASH MimeTypeEnum_MimeType = 5
+	// MIME type of text/html.
+	MimeTypeEnum_TEXT_HTML MimeTypeEnum_MimeType = 6
+	// MIME type of application/pdf.
+	MimeTypeEnum_PDF MimeTypeEnum_MimeType = 7
+	// MIME type of application/msword.
+	MimeTypeEnum_MSWORD MimeTypeEnum_MimeType = 8
+	// MIME type of application/vnd.ms-excel.
+	MimeTypeEnum_MSEXCEL MimeTypeEnum_MimeType = 9
+	// MIME type of application/rtf.
+	MimeTypeEnum_RTF MimeTypeEnum_MimeType = 10
+	// MIME type of audio/wav.
+	MimeTypeEnum_AUDIO_WAV MimeTypeEnum_MimeType = 11
+	// MIME type of audio/mp3.
+	MimeTypeEnum_AUDIO_MP3 MimeTypeEnum_MimeType = 12
+	// MIME type of application/x-html5-ad-zip.
+	MimeTypeEnum_HTML5_AD_ZIP MimeTypeEnum_MimeType = 13
+)
+
+var MimeTypeEnum_MimeType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "IMAGE_JPEG",
+	3:  "IMAGE_GIF",
+	4:  "IMAGE_PNG",
+	5:  "FLASH",
+	6:  "TEXT_HTML",
+	7:  "PDF",
+	8:  "MSWORD",
+	9:  "MSEXCEL",
+	10: "RTF",
+	11: "AUDIO_WAV",
+	12: "AUDIO_MP3",
+	13: "HTML5_AD_ZIP",
+}
+
+var MimeTypeEnum_MimeType_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"IMAGE_JPEG":   2,
+	"IMAGE_GIF":    3,
+	"IMAGE_PNG":    4,
+	"FLASH":        5,
+	"TEXT_HTML":    6,
+	"PDF":          7,
+	"MSWORD":       8,
+	"MSEXCEL":      9,
+	"RTF":          10,
+	"AUDIO_WAV":    11,
+	"AUDIO_MP3":    12,
+	"HTML5_AD_ZIP": 13,
+}
+
+func (x MimeTypeEnum_MimeType) String() string {
+	return proto.EnumName(MimeTypeEnum_MimeType_name, int32(x))
+}
+
+func (MimeTypeEnum_MimeType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a00e9a6c94fbfc0a, []int{0, 0}
+}
+
+// Container for enum describing the mime types.
+type MimeTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MimeTypeEnum) Reset()         { *m = MimeTypeEnum{} }
+func (m *MimeTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*MimeTypeEnum) ProtoMessage()    {}
+func (*MimeTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a00e9a6c94fbfc0a, []int{0}
+}
+
+func (m *MimeTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MimeTypeEnum.Unmarshal(m, b)
+}
+func (m *MimeTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MimeTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *MimeTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MimeTypeEnum.Merge(m, src)
+}
+func (m *MimeTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_MimeTypeEnum.Size(m)
+}
+func (m *MimeTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MimeTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MimeTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MimeTypeEnum_MimeType", MimeTypeEnum_MimeType_name, MimeTypeEnum_MimeType_value)
+	proto.RegisterType((*MimeTypeEnum)(nil), "google.ads.googleads.v3.enums.MimeTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/mime_type.proto", fileDescriptor_a00e9a6c94fbfc0a)
+}
+
+var fileDescriptor_a00e9a6c94fbfc0a = []byte{
+	// 395 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x8f, 0x93, 0x40,
+	0x14, 0xc7, 0x85, 0xba, 0xed, 0x76, 0xda, 0xea, 0x64, 0x8e, 0xc6, 0x3d, 0xec, 0xde, 0x1d, 0x0e,
+	0xc4, 0xcb, 0x78, 0x9a, 0x2e, 0x03, 0x8b, 0x16, 0x3a, 0x59, 0x28, 0xdd, 0x6c, 0x48, 0x08, 0x0a,
+	0x21, 0x24, 0x85, 0x21, 0x1d, 0xda, 0xa4, 0x5f, 0xc7, 0xa3, 0x1f, 0x45, 0xbf, 0x82, 0x27, 0x8f,
+	0x7e, 0x0a, 0x33, 0x20, 0xed, 0x49, 0x2f, 0xe4, 0xff, 0xde, 0xff, 0xf7, 0x1e, 0xf0, 0x7f, 0xe0,
+	0x5d, 0x21, 0x44, 0xb1, 0xcb, 0x8d, 0x34, 0x93, 0x46, 0x2f, 0x95, 0x3a, 0x9a, 0x46, 0x5e, 0x1f,
+	0x2a, 0x69, 0x54, 0x65, 0x95, 0x27, 0xed, 0xa9, 0xc9, 0x71, 0xb3, 0x17, 0xad, 0x40, 0x37, 0x3d,
+	0x83, 0xd3, 0x4c, 0xe2, 0x33, 0x8e, 0x8f, 0x26, 0xee, 0xf0, 0x37, 0x6f, 0x87, 0x6d, 0x4d, 0x69,
+	0xa4, 0x75, 0x2d, 0xda, 0xb4, 0x2d, 0x45, 0x2d, 0xfb, 0xe1, 0xbb, 0x9f, 0x1a, 0x98, 0x7b, 0x65,
+	0x95, 0x87, 0xa7, 0x26, 0x67, 0xf5, 0xa1, 0xba, 0xfb, 0xa1, 0x81, 0xeb, 0xa1, 0x81, 0x5e, 0x83,
+	0xd9, 0xc6, 0x0f, 0x38, 0xbb, 0x77, 0x6d, 0x97, 0x59, 0xf0, 0x05, 0x9a, 0x81, 0xc9, 0xc6, 0xff,
+	0xe4, 0xaf, 0xb7, 0x3e, 0xd4, 0xd0, 0x2b, 0x00, 0x5c, 0x8f, 0x3a, 0x2c, 0xf9, 0xc8, 0x99, 0x03,
+	0x75, 0xb4, 0x00, 0xd3, 0xbe, 0x76, 0x5c, 0x1b, 0x8e, 0x2e, 0x25, 0xf7, 0x1d, 0xf8, 0x12, 0x4d,
+	0xc1, 0x95, 0xbd, 0xa2, 0xc1, 0x03, 0xbc, 0x52, 0x4e, 0xc8, 0x9e, 0xc2, 0xe4, 0x21, 0xf4, 0x56,
+	0x70, 0x8c, 0x26, 0x60, 0xc4, 0x2d, 0x1b, 0x4e, 0x10, 0x00, 0x63, 0x2f, 0xd8, 0xae, 0x1f, 0x2d,
+	0x78, 0xad, 0xde, 0xe4, 0x05, 0xec, 0xe9, 0x9e, 0xad, 0xe0, 0x54, 0x11, 0x8f, 0xa1, 0x0d, 0x81,
+	0x9a, 0xa4, 0x1b, 0xcb, 0x5d, 0x27, 0x5b, 0x1a, 0xc1, 0xd9, 0xa5, 0xf4, 0xb8, 0x09, 0xe7, 0x08,
+	0x82, 0xb9, 0x5a, 0xf9, 0x3e, 0xa1, 0x56, 0xf2, 0xec, 0x72, 0xb8, 0x58, 0xfe, 0xd2, 0xc0, 0xed,
+	0x17, 0x51, 0xe1, 0xff, 0x46, 0xb4, 0x5c, 0x0c, 0x3f, 0xcc, 0x55, 0x26, 0x5c, 0x7b, 0x5e, 0xfe,
+	0xe5, 0x0b, 0xb1, 0x4b, 0xeb, 0x02, 0x8b, 0x7d, 0x61, 0x14, 0x79, 0xdd, 0x25, 0x36, 0x5c, 0xa4,
+	0x29, 0xe5, 0x3f, 0x0e, 0xf4, 0xa1, 0x7b, 0x7e, 0xd5, 0x47, 0x0e, 0xa5, 0xdf, 0xf4, 0x1b, 0xa7,
+	0x5f, 0x45, 0x33, 0x89, 0x7b, 0xa9, 0x54, 0x64, 0x62, 0x95, 0xb6, 0xfc, 0x3e, 0xf8, 0x31, 0xcd,
+	0x64, 0x7c, 0xf6, 0xe3, 0xc8, 0x8c, 0x3b, 0xff, 0xb7, 0x7e, 0xdb, 0x37, 0x09, 0xa1, 0x99, 0x24,
+	0xe4, 0x4c, 0x10, 0x12, 0x99, 0x84, 0x74, 0xcc, 0xe7, 0x71, 0xf7, 0x61, 0xe6, 0x9f, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0x90, 0x56, 0x3c, 0x57, 0x38, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/minute_of_hour.pb.go b/googleapis/ads/googleads/v3/enums/minute_of_hour.pb.go
new file mode 100644
index 0000000..7f00f4b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/minute_of_hour.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/minute_of_hour.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates of quarter-hours. E.g. "FIFTEEN"
+type MinuteOfHourEnum_MinuteOfHour int32
+
+const (
+	// Not specified.
+	MinuteOfHourEnum_UNSPECIFIED MinuteOfHourEnum_MinuteOfHour = 0
+	// The value is unknown in this version.
+	MinuteOfHourEnum_UNKNOWN MinuteOfHourEnum_MinuteOfHour = 1
+	// Zero minutes past the hour.
+	MinuteOfHourEnum_ZERO MinuteOfHourEnum_MinuteOfHour = 2
+	// Fifteen minutes past the hour.
+	MinuteOfHourEnum_FIFTEEN MinuteOfHourEnum_MinuteOfHour = 3
+	// Thirty minutes past the hour.
+	MinuteOfHourEnum_THIRTY MinuteOfHourEnum_MinuteOfHour = 4
+	// Forty-five minutes past the hour.
+	MinuteOfHourEnum_FORTY_FIVE MinuteOfHourEnum_MinuteOfHour = 5
+)
+
+var MinuteOfHourEnum_MinuteOfHour_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ZERO",
+	3: "FIFTEEN",
+	4: "THIRTY",
+	5: "FORTY_FIVE",
+}
+
+var MinuteOfHourEnum_MinuteOfHour_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ZERO":        2,
+	"FIFTEEN":     3,
+	"THIRTY":      4,
+	"FORTY_FIVE":  5,
+}
+
+func (x MinuteOfHourEnum_MinuteOfHour) String() string {
+	return proto.EnumName(MinuteOfHourEnum_MinuteOfHour_name, int32(x))
+}
+
+func (MinuteOfHourEnum_MinuteOfHour) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_cd84aaf261dcd483, []int{0, 0}
+}
+
+// Container for enumeration of quarter-hours.
+type MinuteOfHourEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MinuteOfHourEnum) Reset()         { *m = MinuteOfHourEnum{} }
+func (m *MinuteOfHourEnum) String() string { return proto.CompactTextString(m) }
+func (*MinuteOfHourEnum) ProtoMessage()    {}
+func (*MinuteOfHourEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_cd84aaf261dcd483, []int{0}
+}
+
+func (m *MinuteOfHourEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MinuteOfHourEnum.Unmarshal(m, b)
+}
+func (m *MinuteOfHourEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MinuteOfHourEnum.Marshal(b, m, deterministic)
+}
+func (m *MinuteOfHourEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MinuteOfHourEnum.Merge(m, src)
+}
+func (m *MinuteOfHourEnum) XXX_Size() int {
+	return xxx_messageInfo_MinuteOfHourEnum.Size(m)
+}
+func (m *MinuteOfHourEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MinuteOfHourEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MinuteOfHourEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MinuteOfHourEnum_MinuteOfHour", MinuteOfHourEnum_MinuteOfHour_name, MinuteOfHourEnum_MinuteOfHour_value)
+	proto.RegisterType((*MinuteOfHourEnum)(nil), "google.ads.googleads.v3.enums.MinuteOfHourEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/minute_of_hour.proto", fileDescriptor_cd84aaf261dcd483)
+}
+
+var fileDescriptor_cd84aaf261dcd483 = []byte{
+	// 321 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0xc2, 0x40,
+	0x18, 0x95, 0x82, 0x68, 0x06, 0xa3, 0x63, 0x97, 0x46, 0x16, 0x70, 0x80, 0x69, 0x62, 0x77, 0xe3,
+	0xaa, 0xe8, 0x14, 0x1a, 0x63, 0x4b, 0xb0, 0xd4, 0x40, 0x9a, 0x34, 0xd5, 0x96, 0xda, 0x84, 0xce,
+	0x47, 0x3a, 0x2d, 0x07, 0x72, 0xe9, 0x51, 0x3c, 0x88, 0x0b, 0x4f, 0x61, 0x3a, 0x23, 0x84, 0x8d,
+	0x6e, 0x26, 0x2f, 0xdf, 0xfb, 0xc9, 0x9b, 0x87, 0x6e, 0x32, 0x80, 0x6c, 0x9d, 0x1a, 0x71, 0x22,
+	0x0c, 0x05, 0x1b, 0xb4, 0x35, 0x8d, 0x94, 0xd7, 0x85, 0x30, 0x8a, 0x9c, 0xd7, 0x55, 0x1a, 0xc1,
+	0x2a, 0x7a, 0x83, 0xba, 0x24, 0x9b, 0x12, 0x2a, 0xd0, 0xfb, 0x4a, 0x48, 0xe2, 0x44, 0x90, 0xbd,
+	0x87, 0x6c, 0x4d, 0x22, 0x3d, 0x57, 0xd7, 0xbb, 0xc8, 0x4d, 0x6e, 0xc4, 0x9c, 0x43, 0x15, 0x57,
+	0x39, 0x70, 0xa1, 0xcc, 0x43, 0x81, 0xf0, 0xa3, 0x0c, 0xf5, 0x56, 0x13, 0xa8, 0x4b, 0xc6, 0xeb,
+	0x62, 0x18, 0xa1, 0xb3, 0xc3, 0x9b, 0x7e, 0x81, 0x7a, 0x73, 0xf7, 0x69, 0xca, 0xee, 0x1c, 0xdb,
+	0x61, 0xf7, 0xf8, 0x48, 0xef, 0xa1, 0x93, 0xb9, 0xfb, 0xe0, 0x7a, 0xcf, 0x2e, 0x6e, 0xe9, 0xa7,
+	0xa8, 0xb3, 0x64, 0x33, 0x0f, 0x6b, 0xcd, 0xd9, 0x76, 0x6c, 0x9f, 0x31, 0x17, 0xb7, 0x75, 0x84,
+	0xba, 0xfe, 0xc4, 0x99, 0xf9, 0x0b, 0xdc, 0xd1, 0xcf, 0x11, 0xb2, 0xbd, 0x99, 0xbf, 0x88, 0x6c,
+	0x27, 0x60, 0xf8, 0x78, 0xf4, 0xd5, 0x42, 0x83, 0x57, 0x28, 0xc8, 0xbf, 0xc5, 0x47, 0x97, 0x87,
+	0x25, 0xa6, 0x4d, 0xdb, 0x69, 0x6b, 0x39, 0xfa, 0xf5, 0x64, 0xb0, 0x8e, 0x79, 0x46, 0xa0, 0xcc,
+	0x8c, 0x2c, 0xe5, 0xf2, 0x2f, 0xbb, 0xc1, 0x36, 0xb9, 0xf8, 0x63, 0xbf, 0x5b, 0xf9, 0xbe, 0x6b,
+	0xed, 0xb1, 0x65, 0x7d, 0x68, 0xfd, 0xb1, 0x8a, 0xb2, 0x12, 0x41, 0x14, 0x6c, 0x50, 0x60, 0x92,
+	0x66, 0x04, 0xf1, 0xb9, 0xe3, 0x43, 0x2b, 0x11, 0xe1, 0x9e, 0x0f, 0x03, 0x33, 0x94, 0xfc, 0xb7,
+	0x36, 0x50, 0x47, 0x4a, 0xad, 0x44, 0x50, 0xba, 0x57, 0x50, 0x1a, 0x98, 0x94, 0x4a, 0xcd, 0x4b,
+	0x57, 0x16, 0x33, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x87, 0xad, 0xe8, 0xbd, 0xd7, 0x01, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/mobile_device_type.pb.go b/googleapis/ads/googleads/v3/enums/mobile_device_type.pb.go
new file mode 100644
index 0000000..2259ffa
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/mobile_device_type.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/mobile_device_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of mobile device.
+type MobileDeviceTypeEnum_MobileDeviceType int32
+
+const (
+	// Not specified.
+	MobileDeviceTypeEnum_UNSPECIFIED MobileDeviceTypeEnum_MobileDeviceType = 0
+	// Used for return value only. Represents value unknown in this version.
+	MobileDeviceTypeEnum_UNKNOWN MobileDeviceTypeEnum_MobileDeviceType = 1
+	// Mobile phones.
+	MobileDeviceTypeEnum_MOBILE MobileDeviceTypeEnum_MobileDeviceType = 2
+	// Tablets.
+	MobileDeviceTypeEnum_TABLET MobileDeviceTypeEnum_MobileDeviceType = 3
+)
+
+var MobileDeviceTypeEnum_MobileDeviceType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "MOBILE",
+	3: "TABLET",
+}
+
+var MobileDeviceTypeEnum_MobileDeviceType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"MOBILE":      2,
+	"TABLET":      3,
+}
+
+func (x MobileDeviceTypeEnum_MobileDeviceType) String() string {
+	return proto.EnumName(MobileDeviceTypeEnum_MobileDeviceType_name, int32(x))
+}
+
+func (MobileDeviceTypeEnum_MobileDeviceType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1217305e9fde61b1, []int{0, 0}
+}
+
+// Container for enum describing the types of mobile device.
+type MobileDeviceTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MobileDeviceTypeEnum) Reset()         { *m = MobileDeviceTypeEnum{} }
+func (m *MobileDeviceTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*MobileDeviceTypeEnum) ProtoMessage()    {}
+func (*MobileDeviceTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1217305e9fde61b1, []int{0}
+}
+
+func (m *MobileDeviceTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MobileDeviceTypeEnum.Unmarshal(m, b)
+}
+func (m *MobileDeviceTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MobileDeviceTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *MobileDeviceTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MobileDeviceTypeEnum.Merge(m, src)
+}
+func (m *MobileDeviceTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_MobileDeviceTypeEnum.Size(m)
+}
+func (m *MobileDeviceTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MobileDeviceTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MobileDeviceTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MobileDeviceTypeEnum_MobileDeviceType", MobileDeviceTypeEnum_MobileDeviceType_name, MobileDeviceTypeEnum_MobileDeviceType_value)
+	proto.RegisterType((*MobileDeviceTypeEnum)(nil), "google.ads.googleads.v3.enums.MobileDeviceTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/mobile_device_type.proto", fileDescriptor_1217305e9fde61b1)
+}
+
+var fileDescriptor_1217305e9fde61b1 = []byte{
+	// 304 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x18, 0x77, 0x1d, 0x4c, 0xc8, 0x0e, 0x96, 0xa2, 0x17, 0x71, 0x87, 0xed, 0x01, 0x92, 0x43, 0xc0,
+	0x43, 0x3c, 0xa5, 0xae, 0xce, 0xe1, 0xd6, 0x0d, 0xdc, 0x2a, 0x48, 0x61, 0x76, 0x4b, 0x08, 0x85,
+	0x36, 0x29, 0x4b, 0x57, 0xd8, 0xeb, 0x78, 0xf4, 0x51, 0x7c, 0x94, 0x3d, 0x85, 0x34, 0xb1, 0x3d,
+	0x0c, 0xf4, 0x12, 0x7e, 0x7c, 0xbf, 0x3f, 0xf9, 0x7d, 0x1f, 0xb8, 0x17, 0x4a, 0x89, 0x8c, 0xa3,
+	0x84, 0x69, 0x64, 0x61, 0x8d, 0x2a, 0x8c, 0xb8, 0x3c, 0xe4, 0x1a, 0xe5, 0x6a, 0x9b, 0x66, 0x7c,
+	0xc3, 0x78, 0x95, 0xee, 0xf8, 0xa6, 0x3c, 0x16, 0x1c, 0x16, 0x7b, 0x55, 0x2a, 0x6f, 0x60, 0xc5,
+	0x30, 0x61, 0x1a, 0xb6, 0x3e, 0x58, 0x61, 0x68, 0x7c, 0xb7, 0x77, 0x4d, 0x6c, 0x91, 0xa2, 0x44,
+	0x4a, 0x55, 0x26, 0x65, 0xaa, 0xa4, 0xb6, 0xe6, 0xd1, 0x07, 0xb8, 0x9e, 0x9b, 0xe0, 0xb1, 0xc9,
+	0x5d, 0x1d, 0x0b, 0x1e, 0xc8, 0x43, 0x3e, 0x7a, 0x06, 0xee, 0xf9, 0xdc, 0xbb, 0x02, 0xfd, 0x75,
+	0xf8, 0xba, 0x0c, 0x1e, 0xa7, 0x4f, 0xd3, 0x60, 0xec, 0x5e, 0x78, 0x7d, 0x70, 0xb9, 0x0e, 0x5f,
+	0xc2, 0xc5, 0x5b, 0xe8, 0x76, 0x3c, 0x00, 0x7a, 0xf3, 0x85, 0x3f, 0x9d, 0x05, 0xae, 0x53, 0xe3,
+	0x15, 0xf5, 0x67, 0xc1, 0xca, 0xed, 0xfa, 0xa7, 0x0e, 0x18, 0xee, 0x54, 0x0e, 0xff, 0x6d, 0xe9,
+	0xdf, 0x9c, 0xff, 0xb6, 0xac, 0xeb, 0x2d, 0x3b, 0xef, 0xfe, 0xaf, 0x4f, 0xa8, 0x2c, 0x91, 0x02,
+	0xaa, 0xbd, 0x40, 0x82, 0x4b, 0x53, 0xbe, 0xb9, 0x52, 0x91, 0xea, 0x3f, 0x8e, 0xf6, 0x60, 0xde,
+	0x4f, 0xa7, 0x3b, 0xa1, 0xf4, 0xcb, 0x19, 0x4c, 0x6c, 0x14, 0x65, 0x1a, 0x5a, 0x58, 0xa3, 0x08,
+	0xc3, 0x7a, 0x63, 0xfd, 0xdd, 0xf0, 0x31, 0x65, 0x3a, 0x6e, 0xf9, 0x38, 0xc2, 0xb1, 0xe1, 0x4f,
+	0xce, 0xd0, 0x0e, 0x09, 0xa1, 0x4c, 0x13, 0xd2, 0x2a, 0x08, 0x89, 0x30, 0x21, 0x46, 0xb3, 0xed,
+	0x99, 0x62, 0xf8, 0x27, 0x00, 0x00, 0xff, 0xff, 0x20, 0x5e, 0x3e, 0x66, 0xcc, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/month_of_year.pb.go b/googleapis/ads/googleads/v3/enums/month_of_year.pb.go
new file mode 100644
index 0000000..f6c904d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/month_of_year.pb.go
@@ -0,0 +1,169 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/month_of_year.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates months of the year, e.g., "January".
+type MonthOfYearEnum_MonthOfYear int32
+
+const (
+	// Not specified.
+	MonthOfYearEnum_UNSPECIFIED MonthOfYearEnum_MonthOfYear = 0
+	// The value is unknown in this version.
+	MonthOfYearEnum_UNKNOWN MonthOfYearEnum_MonthOfYear = 1
+	// January.
+	MonthOfYearEnum_JANUARY MonthOfYearEnum_MonthOfYear = 2
+	// February.
+	MonthOfYearEnum_FEBRUARY MonthOfYearEnum_MonthOfYear = 3
+	// March.
+	MonthOfYearEnum_MARCH MonthOfYearEnum_MonthOfYear = 4
+	// April.
+	MonthOfYearEnum_APRIL MonthOfYearEnum_MonthOfYear = 5
+	// May.
+	MonthOfYearEnum_MAY MonthOfYearEnum_MonthOfYear = 6
+	// June.
+	MonthOfYearEnum_JUNE MonthOfYearEnum_MonthOfYear = 7
+	// July.
+	MonthOfYearEnum_JULY MonthOfYearEnum_MonthOfYear = 8
+	// August.
+	MonthOfYearEnum_AUGUST MonthOfYearEnum_MonthOfYear = 9
+	// September.
+	MonthOfYearEnum_SEPTEMBER MonthOfYearEnum_MonthOfYear = 10
+	// October.
+	MonthOfYearEnum_OCTOBER MonthOfYearEnum_MonthOfYear = 11
+	// November.
+	MonthOfYearEnum_NOVEMBER MonthOfYearEnum_MonthOfYear = 12
+	// December.
+	MonthOfYearEnum_DECEMBER MonthOfYearEnum_MonthOfYear = 13
+)
+
+var MonthOfYearEnum_MonthOfYear_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "JANUARY",
+	3:  "FEBRUARY",
+	4:  "MARCH",
+	5:  "APRIL",
+	6:  "MAY",
+	7:  "JUNE",
+	8:  "JULY",
+	9:  "AUGUST",
+	10: "SEPTEMBER",
+	11: "OCTOBER",
+	12: "NOVEMBER",
+	13: "DECEMBER",
+}
+
+var MonthOfYearEnum_MonthOfYear_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"JANUARY":     2,
+	"FEBRUARY":    3,
+	"MARCH":       4,
+	"APRIL":       5,
+	"MAY":         6,
+	"JUNE":        7,
+	"JULY":        8,
+	"AUGUST":      9,
+	"SEPTEMBER":   10,
+	"OCTOBER":     11,
+	"NOVEMBER":    12,
+	"DECEMBER":    13,
+}
+
+func (x MonthOfYearEnum_MonthOfYear) String() string {
+	return proto.EnumName(MonthOfYearEnum_MonthOfYear_name, int32(x))
+}
+
+func (MonthOfYearEnum_MonthOfYear) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_9fad203756f7601c, []int{0, 0}
+}
+
+// Container for enumeration of months of the year, e.g., "January".
+type MonthOfYearEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MonthOfYearEnum) Reset()         { *m = MonthOfYearEnum{} }
+func (m *MonthOfYearEnum) String() string { return proto.CompactTextString(m) }
+func (*MonthOfYearEnum) ProtoMessage()    {}
+func (*MonthOfYearEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9fad203756f7601c, []int{0}
+}
+
+func (m *MonthOfYearEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MonthOfYearEnum.Unmarshal(m, b)
+}
+func (m *MonthOfYearEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MonthOfYearEnum.Marshal(b, m, deterministic)
+}
+func (m *MonthOfYearEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MonthOfYearEnum.Merge(m, src)
+}
+func (m *MonthOfYearEnum) XXX_Size() int {
+	return xxx_messageInfo_MonthOfYearEnum.Size(m)
+}
+func (m *MonthOfYearEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MonthOfYearEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MonthOfYearEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MonthOfYearEnum_MonthOfYear", MonthOfYearEnum_MonthOfYear_name, MonthOfYearEnum_MonthOfYear_value)
+	proto.RegisterType((*MonthOfYearEnum)(nil), "google.ads.googleads.v3.enums.MonthOfYearEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/month_of_year.proto", fileDescriptor_9fad203756f7601c)
+}
+
+var fileDescriptor_9fad203756f7601c = []byte{
+	// 389 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xcb, 0x8e, 0xd3, 0x30,
+	0x14, 0x25, 0xe9, 0x4c, 0x1f, 0xce, 0x8c, 0xc6, 0xf2, 0x12, 0x31, 0x8b, 0x99, 0x0f, 0x70, 0x84,
+	0xb2, 0x33, 0x2b, 0x27, 0xe3, 0x29, 0x2d, 0xcd, 0x43, 0x69, 0x13, 0x14, 0x14, 0xa9, 0x0a, 0x24,
+	0x0d, 0x95, 0x1a, 0xbb, 0x8a, 0xd3, 0x4a, 0xfc, 0x0e, 0x4b, 0xfe, 0x81, 0x1f, 0x60, 0xc7, 0x47,
+	0xb0, 0xe1, 0x2b, 0x90, 0x63, 0x5a, 0x75, 0x03, 0x9b, 0xe8, 0x9c, 0x7b, 0xee, 0xb9, 0x37, 0x3e,
+	0x17, 0xbc, 0xae, 0x85, 0xa8, 0x77, 0x95, 0x5d, 0x94, 0xd2, 0xd6, 0x50, 0xa1, 0xa3, 0x63, 0x57,
+	0xfc, 0xd0, 0x48, 0xbb, 0x11, 0xbc, 0xfb, 0xbc, 0x16, 0x9b, 0xf5, 0x97, 0xaa, 0x68, 0xf1, 0xbe,
+	0x15, 0x9d, 0x40, 0xf7, 0xba, 0x0f, 0x17, 0xa5, 0xc4, 0x67, 0x0b, 0x3e, 0x3a, 0xb8, 0xb7, 0xbc,
+	0x7c, 0x75, 0x9a, 0xb8, 0xdf, 0xda, 0x05, 0xe7, 0xa2, 0x2b, 0xba, 0xad, 0xe0, 0x52, 0x9b, 0x1f,
+	0x7f, 0x1a, 0xe0, 0xce, 0x57, 0x43, 0xc3, 0x4d, 0x56, 0x15, 0x2d, 0xe3, 0x87, 0xe6, 0xf1, 0xbb,
+	0x01, 0xac, 0x8b, 0x1a, 0xba, 0x03, 0x56, 0x12, 0x2c, 0x23, 0xe6, 0xcd, 0x9e, 0x67, 0xec, 0x09,
+	0xbe, 0x40, 0x16, 0x18, 0x25, 0xc1, 0xbb, 0x20, 0x7c, 0x1f, 0x40, 0x43, 0x91, 0x39, 0x0d, 0x12,
+	0x1a, 0x67, 0xd0, 0x44, 0x37, 0x60, 0xfc, 0xcc, 0xdc, 0xb8, 0x67, 0x03, 0x34, 0x01, 0xd7, 0x3e,
+	0x8d, 0xbd, 0xb7, 0xf0, 0x4a, 0x41, 0x1a, 0xc5, 0xb3, 0x05, 0xbc, 0x46, 0x23, 0x30, 0xf0, 0x69,
+	0x06, 0x87, 0x68, 0x0c, 0xae, 0xe6, 0x49, 0xc0, 0xe0, 0x48, 0xa3, 0x45, 0x06, 0xc7, 0x08, 0x80,
+	0x21, 0x4d, 0xa6, 0xc9, 0x72, 0x05, 0x27, 0xe8, 0x16, 0x4c, 0x96, 0x2c, 0x5a, 0x31, 0xdf, 0x65,
+	0x31, 0x04, 0x6a, 0x51, 0xe8, 0xad, 0x42, 0x45, 0x2c, 0xb5, 0x28, 0x08, 0x53, 0x2d, 0xdd, 0x28,
+	0xf6, 0xc4, 0x3c, 0xcd, 0x6e, 0xdd, 0x5f, 0x06, 0x78, 0xf8, 0x24, 0x1a, 0xfc, 0xdf, 0x5c, 0x5c,
+	0x78, 0xf1, 0xc4, 0x48, 0x65, 0x11, 0x19, 0x1f, 0xdc, 0xbf, 0x96, 0x5a, 0xec, 0x0a, 0x5e, 0x63,
+	0xd1, 0xd6, 0x76, 0x5d, 0xf1, 0x3e, 0xa9, 0xd3, 0x35, 0xf6, 0x5b, 0xf9, 0x8f, 0xe3, 0xbc, 0xe9,
+	0xbf, 0x5f, 0xcd, 0xc1, 0x94, 0xd2, 0x6f, 0xe6, 0xfd, 0x54, 0x8f, 0xa2, 0xa5, 0xc4, 0x1a, 0x2a,
+	0x94, 0x3a, 0x58, 0x45, 0x2c, 0x7f, 0x9c, 0xf4, 0x9c, 0x96, 0x32, 0x3f, 0xeb, 0x79, 0xea, 0xe4,
+	0xbd, 0xfe, 0xdb, 0x7c, 0xd0, 0x45, 0x42, 0x68, 0x29, 0x09, 0x39, 0x77, 0x10, 0x92, 0x3a, 0x84,
+	0xf4, 0x3d, 0x1f, 0x87, 0xfd, 0x8f, 0x39, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x68, 0x60, 0x63,
+	0xea, 0x34, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/mutate_job_status.pb.go b/googleapis/ads/googleads/v3/enums/mutate_job_status.pb.go
new file mode 100644
index 0000000..f3ebcb9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/mutate_job_status.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/mutate_job_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The mutate job statuses.
+type MutateJobStatusEnum_MutateJobStatus int32
+
+const (
+	// Not specified.
+	MutateJobStatusEnum_UNSPECIFIED MutateJobStatusEnum_MutateJobStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	MutateJobStatusEnum_UNKNOWN MutateJobStatusEnum_MutateJobStatus = 1
+	// The job is not currently running.
+	MutateJobStatusEnum_PENDING MutateJobStatusEnum_MutateJobStatus = 2
+	// The job is running.
+	MutateJobStatusEnum_RUNNING MutateJobStatusEnum_MutateJobStatus = 3
+	// The job is done.
+	MutateJobStatusEnum_DONE MutateJobStatusEnum_MutateJobStatus = 4
+)
+
+var MutateJobStatusEnum_MutateJobStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PENDING",
+	3: "RUNNING",
+	4: "DONE",
+}
+
+var MutateJobStatusEnum_MutateJobStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"PENDING":     2,
+	"RUNNING":     3,
+	"DONE":        4,
+}
+
+func (x MutateJobStatusEnum_MutateJobStatus) String() string {
+	return proto.EnumName(MutateJobStatusEnum_MutateJobStatus_name, int32(x))
+}
+
+func (MutateJobStatusEnum_MutateJobStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_52c7990b70abb227, []int{0, 0}
+}
+
+// Container for enum describing possible mutate job statuses.
+type MutateJobStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateJobStatusEnum) Reset()         { *m = MutateJobStatusEnum{} }
+func (m *MutateJobStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*MutateJobStatusEnum) ProtoMessage()    {}
+func (*MutateJobStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_52c7990b70abb227, []int{0}
+}
+
+func (m *MutateJobStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateJobStatusEnum.Unmarshal(m, b)
+}
+func (m *MutateJobStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateJobStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *MutateJobStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateJobStatusEnum.Merge(m, src)
+}
+func (m *MutateJobStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_MutateJobStatusEnum.Size(m)
+}
+func (m *MutateJobStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateJobStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateJobStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.MutateJobStatusEnum_MutateJobStatus", MutateJobStatusEnum_MutateJobStatus_name, MutateJobStatusEnum_MutateJobStatus_value)
+	proto.RegisterType((*MutateJobStatusEnum)(nil), "google.ads.googleads.v3.enums.MutateJobStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/mutate_job_status.proto", fileDescriptor_52c7990b70abb227)
+}
+
+var fileDescriptor_52c7990b70abb227 = []byte{
+	// 310 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4e, 0xeb, 0x30,
+	0x10, 0xfd, 0x4d, 0xab, 0x0f, 0x72, 0x17, 0x8d, 0x02, 0x2b, 0x44, 0x17, 0xed, 0x01, 0xec, 0x85,
+	0xc5, 0xc6, 0xac, 0x52, 0x1a, 0xaa, 0x82, 0x70, 0x23, 0xaa, 0x04, 0x09, 0x45, 0xaa, 0x1c, 0x12,
+	0x59, 0xa9, 0x1a, 0x3b, 0xaa, 0x9d, 0x1e, 0x88, 0x25, 0x47, 0xe1, 0x26, 0x70, 0x0a, 0x64, 0xa7,
+	0xc9, 0xa2, 0x12, 0x6c, 0xac, 0x37, 0x33, 0xef, 0x3d, 0xbf, 0x19, 0x70, 0xc3, 0xa5, 0xe4, 0xbb,
+	0x1c, 0xb1, 0x4c, 0xa1, 0x06, 0x1a, 0x74, 0xc0, 0x28, 0x17, 0x75, 0xa9, 0x50, 0x59, 0x6b, 0xa6,
+	0xf3, 0xcd, 0x56, 0xa6, 0x1b, 0xa5, 0x99, 0xae, 0x15, 0xac, 0xf6, 0x52, 0x4b, 0x6f, 0xdc, 0x70,
+	0x21, 0xcb, 0x14, 0xec, 0x64, 0xf0, 0x80, 0xa1, 0x95, 0x5d, 0x5d, 0xb7, 0xae, 0x55, 0x81, 0x98,
+	0x10, 0x52, 0x33, 0x5d, 0x48, 0x71, 0x14, 0x4f, 0xb7, 0xe0, 0xe2, 0xc9, 0xfa, 0x3e, 0xc8, 0x74,
+	0x6d, 0x5d, 0x03, 0x51, 0x97, 0xd3, 0x35, 0x18, 0x9d, 0xb4, 0xbd, 0x11, 0x18, 0x46, 0x74, 0x1d,
+	0x06, 0x77, 0xcb, 0xfb, 0x65, 0x30, 0x77, 0xff, 0x79, 0x43, 0x70, 0x16, 0xd1, 0x47, 0xba, 0x7a,
+	0xa1, 0x6e, 0xcf, 0x14, 0x61, 0x40, 0xe7, 0x4b, 0xba, 0x70, 0x1d, 0x53, 0x3c, 0x47, 0x94, 0x9a,
+	0xa2, 0xef, 0x9d, 0x83, 0xc1, 0x7c, 0x45, 0x03, 0x77, 0x30, 0xfb, 0xea, 0x81, 0xc9, 0x9b, 0x2c,
+	0xe1, 0x9f, 0x79, 0x67, 0x97, 0x27, 0x1f, 0x87, 0x26, 0x67, 0xd8, 0x7b, 0x9d, 0x1d, 0x65, 0x5c,
+	0xee, 0x98, 0xe0, 0x50, 0xee, 0x39, 0xe2, 0xb9, 0xb0, 0x5b, 0xb4, 0xd7, 0xaa, 0x0a, 0xf5, 0xcb,
+	0xf1, 0x6e, 0xed, 0xfb, 0xee, 0xf4, 0x17, 0xbe, 0xff, 0xe1, 0x8c, 0x17, 0x8d, 0x95, 0x9f, 0x29,
+	0xd8, 0x40, 0x83, 0x62, 0x0c, 0xcd, 0xee, 0xea, 0xb3, 0x9d, 0x27, 0x7e, 0xa6, 0x92, 0x6e, 0x9e,
+	0xc4, 0x38, 0xb1, 0xf3, 0x6f, 0x67, 0xd2, 0x34, 0x09, 0xf1, 0x33, 0x45, 0x48, 0xc7, 0x20, 0x24,
+	0xc6, 0x84, 0x58, 0x4e, 0xfa, 0xdf, 0x06, 0xc3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xc6,
+	0xee, 0xec, 0xd4, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/negative_geo_target_type.pb.go b/googleapis/ads/googleads/v3/enums/negative_geo_target_type.pb.go
new file mode 100644
index 0000000..6fe4a02
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/negative_geo_target_type.pb.go
@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/negative_geo_target_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible negative geo target types.
+type NegativeGeoTargetTypeEnum_NegativeGeoTargetType int32
+
+const (
+	// Not specified.
+	NegativeGeoTargetTypeEnum_UNSPECIFIED NegativeGeoTargetTypeEnum_NegativeGeoTargetType = 0
+	// The value is unknown in this version.
+	NegativeGeoTargetTypeEnum_UNKNOWN NegativeGeoTargetTypeEnum_NegativeGeoTargetType = 1
+	// Specifies that a user is excluded from seeing the ad if they
+	// are in, or show interest in, advertiser's excluded locations.
+	NegativeGeoTargetTypeEnum_PRESENCE_OR_INTEREST NegativeGeoTargetTypeEnum_NegativeGeoTargetType = 4
+	// Specifies that a user is excluded from seeing the ad if they
+	// are in advertiser's excluded locations.
+	NegativeGeoTargetTypeEnum_PRESENCE NegativeGeoTargetTypeEnum_NegativeGeoTargetType = 5
+)
+
+var NegativeGeoTargetTypeEnum_NegativeGeoTargetType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	4: "PRESENCE_OR_INTEREST",
+	5: "PRESENCE",
+}
+
+var NegativeGeoTargetTypeEnum_NegativeGeoTargetType_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"PRESENCE_OR_INTEREST": 4,
+	"PRESENCE":             5,
+}
+
+func (x NegativeGeoTargetTypeEnum_NegativeGeoTargetType) String() string {
+	return proto.EnumName(NegativeGeoTargetTypeEnum_NegativeGeoTargetType_name, int32(x))
+}
+
+func (NegativeGeoTargetTypeEnum_NegativeGeoTargetType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_145bd44f7b043ddc, []int{0, 0}
+}
+
+// Container for enum describing possible negative geo target types.
+type NegativeGeoTargetTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *NegativeGeoTargetTypeEnum) Reset()         { *m = NegativeGeoTargetTypeEnum{} }
+func (m *NegativeGeoTargetTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*NegativeGeoTargetTypeEnum) ProtoMessage()    {}
+func (*NegativeGeoTargetTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_145bd44f7b043ddc, []int{0}
+}
+
+func (m *NegativeGeoTargetTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_NegativeGeoTargetTypeEnum.Unmarshal(m, b)
+}
+func (m *NegativeGeoTargetTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_NegativeGeoTargetTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *NegativeGeoTargetTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_NegativeGeoTargetTypeEnum.Merge(m, src)
+}
+func (m *NegativeGeoTargetTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_NegativeGeoTargetTypeEnum.Size(m)
+}
+func (m *NegativeGeoTargetTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_NegativeGeoTargetTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_NegativeGeoTargetTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.NegativeGeoTargetTypeEnum_NegativeGeoTargetType", NegativeGeoTargetTypeEnum_NegativeGeoTargetType_name, NegativeGeoTargetTypeEnum_NegativeGeoTargetType_value)
+	proto.RegisterType((*NegativeGeoTargetTypeEnum)(nil), "google.ads.googleads.v3.enums.NegativeGeoTargetTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/negative_geo_target_type.proto", fileDescriptor_145bd44f7b043ddc)
+}
+
+var fileDescriptor_145bd44f7b043ddc = []byte{
+	// 324 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xdf, 0x4a, 0xfb, 0x30,
+	0x1c, 0xc5, 0x7f, 0xdb, 0xcf, 0x7f, 0x64, 0x82, 0xa5, 0x28, 0xe8, 0x70, 0x17, 0xdb, 0x03, 0xa4,
+	0x17, 0xb9, 0x8b, 0xde, 0x74, 0x33, 0x8e, 0x21, 0x64, 0x65, 0xeb, 0x26, 0x48, 0xa5, 0x44, 0x1b,
+	0x42, 0x61, 0x4b, 0xca, 0x92, 0x0d, 0xe6, 0xe3, 0x78, 0xe9, 0xa3, 0xf8, 0x28, 0xde, 0xf8, 0x0a,
+	0xd2, 0x64, 0xed, 0xd5, 0xf4, 0xa6, 0x1c, 0x7a, 0xbe, 0x9f, 0xc3, 0xc9, 0x01, 0xb7, 0x42, 0x29,
+	0xb1, 0xe0, 0x01, 0xcb, 0x74, 0xe0, 0x64, 0xa9, 0x36, 0x28, 0xe0, 0x72, 0xbd, 0xd4, 0x81, 0xe4,
+	0x82, 0x99, 0x7c, 0xc3, 0x53, 0xc1, 0x55, 0x6a, 0xd8, 0x4a, 0x70, 0x93, 0x9a, 0x6d, 0xc1, 0x61,
+	0xb1, 0x52, 0x46, 0xf9, 0x1d, 0x87, 0x40, 0x96, 0x69, 0x58, 0xd3, 0x70, 0x83, 0xa0, 0xa5, 0xdb,
+	0xd7, 0x55, 0x78, 0x91, 0x07, 0x4c, 0x4a, 0x65, 0x98, 0xc9, 0x95, 0xd4, 0x0e, 0xee, 0xbd, 0x81,
+	0x2b, 0xba, 0x8b, 0x1f, 0x72, 0x15, 0xdb, 0xf0, 0x78, 0x5b, 0x70, 0x22, 0xd7, 0xcb, 0xde, 0x33,
+	0xb8, 0xd8, 0x6b, 0xfa, 0x67, 0xa0, 0x35, 0xa3, 0xd3, 0x88, 0x0c, 0x46, 0xf7, 0x23, 0x72, 0xe7,
+	0xfd, 0xf3, 0x5b, 0xe0, 0x78, 0x46, 0x1f, 0xe8, 0xf8, 0x91, 0x7a, 0x0d, 0xff, 0x12, 0x9c, 0x47,
+	0x13, 0x32, 0x25, 0x74, 0x40, 0xd2, 0xf1, 0x24, 0x1d, 0xd1, 0x98, 0x4c, 0xc8, 0x34, 0xf6, 0x0e,
+	0xfc, 0x53, 0x70, 0x52, 0x39, 0xde, 0x61, 0xff, 0xbb, 0x01, 0xba, 0xaf, 0x6a, 0x09, 0xff, 0xec,
+	0xdf, 0x6f, 0xef, 0xad, 0x10, 0x95, 0xed, 0xa3, 0xc6, 0x53, 0x7f, 0x07, 0x0b, 0xb5, 0x60, 0x52,
+	0x40, 0xb5, 0x12, 0x81, 0xe0, 0xd2, 0xbe, 0xad, 0x9a, 0xb2, 0xc8, 0xf5, 0x2f, 0xcb, 0xde, 0xd8,
+	0xef, 0x7b, 0xf3, 0xff, 0x30, 0x0c, 0x3f, 0x9a, 0x9d, 0xa1, 0x8b, 0x0a, 0x33, 0x0d, 0x9d, 0x2c,
+	0xd5, 0x1c, 0xc1, 0x72, 0x0b, 0xfd, 0x59, 0xf9, 0x49, 0x98, 0xe9, 0xa4, 0xf6, 0x93, 0x39, 0x4a,
+	0xac, 0xff, 0xd5, 0xec, 0xba, 0x9f, 0x18, 0x87, 0x99, 0xc6, 0xb8, 0xbe, 0xc0, 0x78, 0x8e, 0x30,
+	0xb6, 0x37, 0x2f, 0x47, 0xb6, 0x18, 0xfa, 0x09, 0x00, 0x00, 0xff, 0xff, 0x6b, 0x8c, 0x63, 0x22,
+	0xf1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/operating_system_version_operator_type.pb.go b/googleapis/ads/googleads/v3/enums/operating_system_version_operator_type.pb.go
new file mode 100644
index 0000000..6663681
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/operating_system_version_operator_type.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/operating_system_version_operator_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of operating system version.
+type OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType int32
+
+const (
+	// Not specified.
+	OperatingSystemVersionOperatorTypeEnum_UNSPECIFIED OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType = 0
+	// Used for return value only. Represents value unknown in this version.
+	OperatingSystemVersionOperatorTypeEnum_UNKNOWN OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType = 1
+	// Equals to the specified version.
+	OperatingSystemVersionOperatorTypeEnum_EQUALS_TO OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType = 2
+	// Greater than or equals to the specified version.
+	OperatingSystemVersionOperatorTypeEnum_GREATER_THAN_EQUALS_TO OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType = 4
+)
+
+var OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "EQUALS_TO",
+	4: "GREATER_THAN_EQUALS_TO",
+}
+
+var OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType_value = map[string]int32{
+	"UNSPECIFIED":            0,
+	"UNKNOWN":                1,
+	"EQUALS_TO":              2,
+	"GREATER_THAN_EQUALS_TO": 4,
+}
+
+func (x OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType) String() string {
+	return proto.EnumName(OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType_name, int32(x))
+}
+
+func (OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a9a8e9ce9b3332be, []int{0, 0}
+}
+
+// Container for enum describing the type of OS operators.
+type OperatingSystemVersionOperatorTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OperatingSystemVersionOperatorTypeEnum) Reset() {
+	*m = OperatingSystemVersionOperatorTypeEnum{}
+}
+func (m *OperatingSystemVersionOperatorTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*OperatingSystemVersionOperatorTypeEnum) ProtoMessage()    {}
+func (*OperatingSystemVersionOperatorTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a9a8e9ce9b3332be, []int{0}
+}
+
+func (m *OperatingSystemVersionOperatorTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OperatingSystemVersionOperatorTypeEnum.Unmarshal(m, b)
+}
+func (m *OperatingSystemVersionOperatorTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OperatingSystemVersionOperatorTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *OperatingSystemVersionOperatorTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OperatingSystemVersionOperatorTypeEnum.Merge(m, src)
+}
+func (m *OperatingSystemVersionOperatorTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_OperatingSystemVersionOperatorTypeEnum.Size(m)
+}
+func (m *OperatingSystemVersionOperatorTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_OperatingSystemVersionOperatorTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OperatingSystemVersionOperatorTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType", OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType_name, OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType_value)
+	proto.RegisterType((*OperatingSystemVersionOperatorTypeEnum)(nil), "google.ads.googleads.v3.enums.OperatingSystemVersionOperatorTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/operating_system_version_operator_type.proto", fileDescriptor_a9a8e9ce9b3332be)
+}
+
+var fileDescriptor_a9a8e9ce9b3332be = []byte{
+	// 339 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x51, 0xbf, 0x4e, 0xf3, 0x30,
+	0x1c, 0xfc, 0x92, 0x0f, 0x81, 0x70, 0x85, 0xa8, 0x32, 0x30, 0x54, 0x74, 0x68, 0x07, 0xd8, 0x9c,
+	0x21, 0x9b, 0x99, 0x5c, 0x08, 0xa5, 0x80, 0x92, 0xd2, 0xa6, 0x41, 0x42, 0x91, 0xac, 0x40, 0x2c,
+	0x2b, 0x52, 0x63, 0x47, 0xb1, 0x5b, 0xa9, 0x4f, 0xc2, 0xce, 0xc8, 0xa3, 0xf0, 0x28, 0x3c, 0x03,
+	0x03, 0x8a, 0xdd, 0x84, 0x09, 0xba, 0x58, 0x27, 0xdf, 0xfd, 0xee, 0x7e, 0x7f, 0xc0, 0x2d, 0x13,
+	0x82, 0x2d, 0xa9, 0x9b, 0x66, 0xd2, 0x35, 0xb0, 0x46, 0x6b, 0xcf, 0xa5, 0x7c, 0x55, 0x48, 0x57,
+	0x94, 0xb4, 0x4a, 0x55, 0xce, 0x19, 0x91, 0x1b, 0xa9, 0x68, 0x41, 0xd6, 0xb4, 0x92, 0xb9, 0xe0,
+	0xc4, 0x10, 0xa2, 0x22, 0x6a, 0x53, 0x52, 0x58, 0x56, 0x42, 0x09, 0xa7, 0x6f, 0x0c, 0x60, 0x9a,
+	0x49, 0xd8, 0x7a, 0xc1, 0xb5, 0x07, 0xb5, 0x57, 0xef, 0xb4, 0x89, 0x2a, 0x73, 0x37, 0xe5, 0x5c,
+	0xa8, 0x54, 0xe5, 0x82, 0x4b, 0x53, 0x3c, 0x7c, 0xb5, 0xc0, 0x59, 0xd8, 0xa4, 0xcd, 0x75, 0x58,
+	0x6c, 0xb2, 0xc2, 0x6d, 0x54, 0xb4, 0x29, 0xa9, 0xcf, 0x57, 0xc5, 0xb0, 0x00, 0xc3, 0xdd, 0x4a,
+	0xe7, 0x18, 0x74, 0x16, 0xc1, 0x7c, 0xea, 0x5f, 0x4e, 0xae, 0x27, 0xfe, 0x55, 0xf7, 0x9f, 0xd3,
+	0x01, 0x07, 0x8b, 0xe0, 0x2e, 0x08, 0x1f, 0x83, 0xae, 0xe5, 0x1c, 0x81, 0x43, 0xff, 0x61, 0x81,
+	0xef, 0xe7, 0x24, 0x0a, 0xbb, 0xb6, 0xd3, 0x03, 0x27, 0xe3, 0x99, 0x8f, 0x23, 0x7f, 0x46, 0xa2,
+	0x1b, 0x1c, 0x90, 0x1f, 0x6e, 0x6f, 0xf4, 0x65, 0x81, 0xc1, 0x8b, 0x28, 0xe0, 0x9f, 0xd3, 0x8d,
+	0xce, 0x77, 0xb7, 0x34, 0xad, 0x07, 0x9d, 0x5a, 0x4f, 0xa3, 0xad, 0x13, 0x13, 0xcb, 0x94, 0x33,
+	0x28, 0x2a, 0xe6, 0x32, 0xca, 0xf5, 0x1a, 0x9a, 0x1b, 0x94, 0xb9, 0xfc, 0xe5, 0x24, 0x17, 0xfa,
+	0x7d, 0xb3, 0xff, 0x8f, 0x31, 0x7e, 0xb7, 0xfb, 0x63, 0x63, 0x85, 0x33, 0x09, 0x0d, 0xac, 0x51,
+	0xec, 0xc1, 0x7a, 0x51, 0xf2, 0xa3, 0xe1, 0x13, 0x9c, 0xc9, 0xa4, 0xe5, 0x93, 0xd8, 0x4b, 0x34,
+	0xff, 0x69, 0x0f, 0xcc, 0x27, 0x42, 0x38, 0x93, 0x08, 0xb5, 0x0a, 0x84, 0x62, 0x0f, 0x21, 0xad,
+	0x79, 0xde, 0xd7, 0x8d, 0x79, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x36, 0x63, 0xa6, 0x2b, 0x2a,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/page_one_promoted_strategy_goal.pb.go b/googleapis/ads/googleads/v3/enums/page_one_promoted_strategy_goal.pb.go
new file mode 100644
index 0000000..a606ae9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/page_one_promoted_strategy_goal.pb.go
@@ -0,0 +1,47 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/page_one_promoted_strategy_goal.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/page_one_promoted_strategy_goal.proto", fileDescriptor_c64613aa3985b1f2)
+}
+
+var fileDescriptor_c64613aa3985b1f2 = []byte{
+	// 248 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x8f, 0xb1, 0x4a, 0xc5, 0x30,
+	0x14, 0x86, 0xb9, 0x15, 0x1c, 0xee, 0xe8, 0x28, 0x5e, 0xf0, 0xbe, 0x40, 0x32, 0x64, 0x8b, 0x53,
+	0x2a, 0xd2, 0xd1, 0x82, 0xd0, 0x41, 0x0a, 0xe5, 0x68, 0xc2, 0xa1, 0xd0, 0xe6, 0x84, 0x9e, 0x58,
+	0xf0, 0x75, 0x1c, 0x7d, 0x14, 0x1f, 0xc5, 0xdd, 0x5d, 0x9a, 0xb4, 0xdd, 0x74, 0x09, 0x3f, 0xf9,
+	0xff, 0xf3, 0x9d, 0xff, 0x1c, 0xef, 0x91, 0x08, 0x07, 0x27, 0xc1, 0xb2, 0xcc, 0x72, 0x51, 0xb3,
+	0x92, 0xce, 0xbf, 0x8d, 0x2c, 0x03, 0xa0, 0xeb, 0xc8, 0xbb, 0x2e, 0x4c, 0x34, 0x52, 0x74, 0xb6,
+	0xe3, 0x38, 0x41, 0x74, 0xf8, 0xde, 0x21, 0xc1, 0x20, 0xc2, 0x44, 0x91, 0xae, 0x4e, 0x79, 0x52,
+	0x80, 0x65, 0xb1, 0x43, 0xc4, 0xac, 0x44, 0x82, 0x5c, 0xdf, 0x6c, 0x3b, 0x42, 0x2f, 0xc1, 0x7b,
+	0x8a, 0x10, 0x7b, 0xf2, 0x9c, 0x87, 0xcb, 0x9f, 0xc3, 0xf1, 0xfc, 0x4a, 0xa3, 0xf8, 0x97, 0x51,
+	0xde, 0xd6, 0x80, 0xee, 0xd1, 0xbb, 0x7a, 0xed, 0xf1, 0xb4, 0xd6, 0xa8, 0x08, 0x86, 0x7a, 0xe1,
+	0xd4, 0x87, 0xe7, 0x72, 0x45, 0x20, 0x0d, 0xe0, 0x51, 0xd0, 0x84, 0x12, 0x9d, 0x4f, 0x5b, 0xb6,
+	0xdb, 0x42, 0xcf, 0x7f, 0x9c, 0x7a, 0x97, 0xde, 0x8f, 0xe2, 0xa2, 0x32, 0xe6, 0xb3, 0x38, 0x55,
+	0x19, 0x65, 0x2c, 0x8b, 0x2c, 0x17, 0xd5, 0x28, 0xf1, 0xb0, 0xa4, 0xbe, 0x36, 0xbf, 0x35, 0x96,
+	0xdb, 0xdd, 0x6f, 0x1b, 0xd5, 0x26, 0xff, 0xbb, 0x38, 0xe7, 0x4f, 0xad, 0x8d, 0x65, 0xad, 0xf7,
+	0x84, 0xd6, 0x8d, 0xd2, 0x3a, 0x65, 0x5e, 0x2e, 0x53, 0x31, 0xf5, 0x1b, 0x00, 0x00, 0xff, 0xff,
+	0xe5, 0x14, 0xfb, 0x5c, 0x82, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/parental_status_type.pb.go b/googleapis/ads/googleads/v3/enums/parental_status_type.pb.go
new file mode 100644
index 0000000..63212e3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/parental_status_type.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/parental_status_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of parental statuses (e.g. not a parent).
+type ParentalStatusTypeEnum_ParentalStatusType int32
+
+const (
+	// Not specified.
+	ParentalStatusTypeEnum_UNSPECIFIED ParentalStatusTypeEnum_ParentalStatusType = 0
+	// Used for return value only. Represents value unknown in this version.
+	ParentalStatusTypeEnum_UNKNOWN ParentalStatusTypeEnum_ParentalStatusType = 1
+	// Parent.
+	ParentalStatusTypeEnum_PARENT ParentalStatusTypeEnum_ParentalStatusType = 300
+	// Not a parent.
+	ParentalStatusTypeEnum_NOT_A_PARENT ParentalStatusTypeEnum_ParentalStatusType = 301
+	// Undetermined parental status.
+	ParentalStatusTypeEnum_UNDETERMINED ParentalStatusTypeEnum_ParentalStatusType = 302
+)
+
+var ParentalStatusTypeEnum_ParentalStatusType_name = map[int32]string{
+	0:   "UNSPECIFIED",
+	1:   "UNKNOWN",
+	300: "PARENT",
+	301: "NOT_A_PARENT",
+	302: "UNDETERMINED",
+}
+
+var ParentalStatusTypeEnum_ParentalStatusType_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"PARENT":       300,
+	"NOT_A_PARENT": 301,
+	"UNDETERMINED": 302,
+}
+
+func (x ParentalStatusTypeEnum_ParentalStatusType) String() string {
+	return proto.EnumName(ParentalStatusTypeEnum_ParentalStatusType_name, int32(x))
+}
+
+func (ParentalStatusTypeEnum_ParentalStatusType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_377126a50dfd61e5, []int{0, 0}
+}
+
+// Container for enum describing the type of demographic parental statuses.
+type ParentalStatusTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ParentalStatusTypeEnum) Reset()         { *m = ParentalStatusTypeEnum{} }
+func (m *ParentalStatusTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ParentalStatusTypeEnum) ProtoMessage()    {}
+func (*ParentalStatusTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_377126a50dfd61e5, []int{0}
+}
+
+func (m *ParentalStatusTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ParentalStatusTypeEnum.Unmarshal(m, b)
+}
+func (m *ParentalStatusTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ParentalStatusTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ParentalStatusTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ParentalStatusTypeEnum.Merge(m, src)
+}
+func (m *ParentalStatusTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ParentalStatusTypeEnum.Size(m)
+}
+func (m *ParentalStatusTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ParentalStatusTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ParentalStatusTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ParentalStatusTypeEnum_ParentalStatusType", ParentalStatusTypeEnum_ParentalStatusType_name, ParentalStatusTypeEnum_ParentalStatusType_value)
+	proto.RegisterType((*ParentalStatusTypeEnum)(nil), "google.ads.googleads.v3.enums.ParentalStatusTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/parental_status_type.proto", fileDescriptor_377126a50dfd61e5)
+}
+
+var fileDescriptor_377126a50dfd61e5 = []byte{
+	// 325 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x1c, 0x76, 0x15, 0x26, 0x64, 0x82, 0xb5, 0x07, 0x05, 0x71, 0x87, 0xed, 0x01, 0xd2, 0x43, 0x2f,
+	0x12, 0x4f, 0x99, 0x8b, 0x63, 0x88, 0x59, 0xd9, 0xba, 0x09, 0x52, 0x28, 0xd1, 0x86, 0x30, 0xd8,
+	0x92, 0xb0, 0x64, 0x83, 0x9d, 0x7c, 0x17, 0x8f, 0xa2, 0x3e, 0x88, 0x8f, 0x22, 0x3e, 0x84, 0x34,
+	0xd9, 0x76, 0x19, 0x7a, 0x09, 0x1f, 0xbf, 0xef, 0x0f, 0x5f, 0x3e, 0x70, 0x25, 0x94, 0x12, 0x33,
+	0x1e, 0xb3, 0xd2, 0xc4, 0x1e, 0x56, 0x68, 0x95, 0xc4, 0x5c, 0x2e, 0xe7, 0x26, 0xd6, 0x6c, 0xc1,
+	0xa5, 0x65, 0xb3, 0xc2, 0x58, 0x66, 0x97, 0xa6, 0xb0, 0x6b, 0xcd, 0xa1, 0x5e, 0x28, 0xab, 0xa2,
+	0xa6, 0x97, 0x43, 0x56, 0x1a, 0xb8, 0x73, 0xc2, 0x55, 0x02, 0x9d, 0xf3, 0xe2, 0x72, 0x1b, 0xac,
+	0xa7, 0x31, 0x93, 0x52, 0x59, 0x66, 0xa7, 0x4a, 0x1a, 0x6f, 0x6e, 0xbf, 0x80, 0xb3, 0x74, 0x13,
+	0x3d, 0x72, 0xc9, 0xd9, 0x5a, 0x73, 0x22, 0x97, 0xf3, 0x36, 0x07, 0xd1, 0x3e, 0x13, 0x9d, 0x80,
+	0xc6, 0x98, 0x8e, 0x52, 0x72, 0xd3, 0xbf, 0xed, 0x93, 0x6e, 0x78, 0x10, 0x35, 0xc0, 0xd1, 0x98,
+	0xde, 0xd1, 0xc1, 0x03, 0x0d, 0x6b, 0x51, 0x03, 0xd4, 0x53, 0x3c, 0x24, 0x34, 0x0b, 0xdf, 0x83,
+	0xe8, 0x14, 0x1c, 0xd3, 0x41, 0x56, 0xe0, 0x62, 0x73, 0xfa, 0x70, 0xa7, 0x31, 0xed, 0x92, 0x8c,
+	0x0c, 0xef, 0xfb, 0x94, 0x74, 0xc3, 0xcf, 0xa0, 0xf3, 0x53, 0x03, 0xad, 0x67, 0x35, 0x87, 0xff,
+	0x7e, 0xa2, 0x73, 0xbe, 0x5f, 0x25, 0xad, 0xfa, 0xa7, 0xb5, 0xc7, 0xce, 0xc6, 0x29, 0xd4, 0x8c,
+	0x49, 0x01, 0xd5, 0x42, 0xc4, 0x82, 0x4b, 0xf7, 0xbb, 0xed, 0x90, 0x7a, 0x6a, 0xfe, 0xd8, 0xf5,
+	0xda, 0xbd, 0xaf, 0xc1, 0x61, 0x0f, 0xe3, 0xb7, 0xa0, 0xd9, 0xf3, 0x51, 0xb8, 0x34, 0xd0, 0xc3,
+	0x0a, 0x4d, 0x12, 0x58, 0x0d, 0x62, 0xbe, 0xb6, 0x7c, 0x8e, 0x4b, 0x93, 0xef, 0xf8, 0x7c, 0x92,
+	0xe4, 0x8e, 0xff, 0x0e, 0x5a, 0xfe, 0x88, 0x10, 0x2e, 0x0d, 0x42, 0x3b, 0x05, 0x42, 0x93, 0x04,
+	0x21, 0xa7, 0x79, 0xaa, 0xbb, 0x62, 0xc9, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0x6e, 0xfd,
+	0xab, 0xef, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/payment_mode.pb.go b/googleapis/ads/googleads/v3/enums/payment_mode.pb.go
new file mode 100644
index 0000000..af7938d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/payment_mode.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/payment_mode.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible payment modes.
+type PaymentModeEnum_PaymentMode int32
+
+const (
+	// Not specified.
+	PaymentModeEnum_UNSPECIFIED PaymentModeEnum_PaymentMode = 0
+	// Used for return value only. Represents value unknown in this version.
+	PaymentModeEnum_UNKNOWN PaymentModeEnum_PaymentMode = 1
+	// Pay per click.
+	PaymentModeEnum_CLICKS PaymentModeEnum_PaymentMode = 4
+	// Pay per conversion value. This mode is only supported by campaigns with
+	// AdvertisingChannelType.HOTEL, BiddingStrategyType.COMMISSION, and
+	// BudgetType.HOTEL_ADS_COMMISSION.
+	PaymentModeEnum_CONVERSION_VALUE PaymentModeEnum_PaymentMode = 5
+	// Pay per conversion. This mode is only supported by campaigns with
+	// AdvertisingChannelType.DISPLAY (excluding
+	// AdvertisingChannelSubType.DISPLAY_GMAIL), BiddingStrategyType.TARGET_CPA,
+	// and BudgetType.FIXED_CPA. The customer must also be eligible for this
+	// mode. See Customer.eligibility_failure_reasons for details.
+	PaymentModeEnum_CONVERSIONS PaymentModeEnum_PaymentMode = 6
+	// Pay per guest stay value. This mode is only supported by campaigns with
+	// AdvertisingChannelType.HOTEL, BiddingStrategyType.COMMISSION, and
+	// BudgetType.HOTEL_ADS_COMMISSION.
+	PaymentModeEnum_GUEST_STAY PaymentModeEnum_PaymentMode = 7
+)
+
+var PaymentModeEnum_PaymentMode_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	4: "CLICKS",
+	5: "CONVERSION_VALUE",
+	6: "CONVERSIONS",
+	7: "GUEST_STAY",
+}
+
+var PaymentModeEnum_PaymentMode_value = map[string]int32{
+	"UNSPECIFIED":      0,
+	"UNKNOWN":          1,
+	"CLICKS":           4,
+	"CONVERSION_VALUE": 5,
+	"CONVERSIONS":      6,
+	"GUEST_STAY":       7,
+}
+
+func (x PaymentModeEnum_PaymentMode) String() string {
+	return proto.EnumName(PaymentModeEnum_PaymentMode_name, int32(x))
+}
+
+func (PaymentModeEnum_PaymentMode) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7bf76f63298a9af6, []int{0, 0}
+}
+
+// Container for enum describing possible payment modes.
+type PaymentModeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PaymentModeEnum) Reset()         { *m = PaymentModeEnum{} }
+func (m *PaymentModeEnum) String() string { return proto.CompactTextString(m) }
+func (*PaymentModeEnum) ProtoMessage()    {}
+func (*PaymentModeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7bf76f63298a9af6, []int{0}
+}
+
+func (m *PaymentModeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PaymentModeEnum.Unmarshal(m, b)
+}
+func (m *PaymentModeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PaymentModeEnum.Marshal(b, m, deterministic)
+}
+func (m *PaymentModeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PaymentModeEnum.Merge(m, src)
+}
+func (m *PaymentModeEnum) XXX_Size() int {
+	return xxx_messageInfo_PaymentModeEnum.Size(m)
+}
+func (m *PaymentModeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PaymentModeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PaymentModeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PaymentModeEnum_PaymentMode", PaymentModeEnum_PaymentMode_name, PaymentModeEnum_PaymentMode_value)
+	proto.RegisterType((*PaymentModeEnum)(nil), "google.ads.googleads.v3.enums.PaymentModeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/payment_mode.proto", fileDescriptor_7bf76f63298a9af6)
+}
+
+var fileDescriptor_7bf76f63298a9af6 = []byte{
+	// 328 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4b, 0xf3, 0x30,
+	0x1c, 0x7e, 0xbb, 0x57, 0x37, 0xc8, 0xc0, 0x85, 0xe2, 0x49, 0xdc, 0x61, 0xfb, 0x00, 0xa9, 0xd0,
+	0x5b, 0x3c, 0x65, 0xb5, 0x8e, 0xb2, 0xd9, 0x15, 0xbb, 0x56, 0x94, 0xc2, 0x88, 0x26, 0x84, 0xc1,
+	0x9a, 0x94, 0xa5, 0x1b, 0x78, 0xf4, 0xab, 0x78, 0xf4, 0xa3, 0xf8, 0x3d, 0xbc, 0xf8, 0x29, 0xa4,
+	0x89, 0x9b, 0xbb, 0xe8, 0x25, 0x3c, 0xfc, 0x9e, 0x3f, 0x3c, 0x79, 0xc0, 0x85, 0x50, 0x4a, 0xac,
+	0xb8, 0x47, 0x99, 0xf6, 0x2c, 0x6c, 0xd0, 0xd6, 0xf7, 0xb8, 0xdc, 0x94, 0xda, 0xab, 0xe8, 0x73,
+	0xc9, 0x65, 0xbd, 0x28, 0x15, 0xe3, 0xa8, 0x5a, 0xab, 0x5a, 0xb9, 0x7d, 0x2b, 0x43, 0x94, 0x69,
+	0xb4, 0x77, 0xa0, 0xad, 0x8f, 0x8c, 0xe3, 0xec, 0x7c, 0x17, 0x58, 0x2d, 0x3d, 0x2a, 0xa5, 0xaa,
+	0x69, 0xbd, 0x54, 0x52, 0x5b, 0xf3, 0xf0, 0xc5, 0x01, 0xbd, 0xc4, 0x66, 0xde, 0x28, 0xc6, 0x43,
+	0xb9, 0x29, 0x87, 0x12, 0x74, 0x0f, 0x4e, 0x6e, 0x0f, 0x74, 0xb3, 0x38, 0x4d, 0xc2, 0x20, 0xba,
+	0x8e, 0xc2, 0x2b, 0xf8, 0xcf, 0xed, 0x82, 0x4e, 0x16, 0x4f, 0xe2, 0xd9, 0x5d, 0x0c, 0x1d, 0x17,
+	0x80, 0x76, 0x30, 0x8d, 0x82, 0x49, 0x0a, 0x8f, 0xdc, 0x53, 0x00, 0x83, 0x59, 0x9c, 0x87, 0xb7,
+	0x69, 0x34, 0x8b, 0x17, 0x39, 0x99, 0x66, 0x21, 0x3c, 0x6e, 0xfc, 0x3f, 0xd7, 0x14, 0xb6, 0xdd,
+	0x13, 0x00, 0xc6, 0x59, 0x98, 0xce, 0x17, 0xe9, 0x9c, 0xdc, 0xc3, 0xce, 0xe8, 0xc3, 0x01, 0x83,
+	0x27, 0x55, 0xa2, 0x3f, 0xff, 0x31, 0x82, 0x07, 0x9d, 0x92, 0xa6, 0x7b, 0xe2, 0x3c, 0x8c, 0xbe,
+	0x2d, 0x42, 0xad, 0xa8, 0x14, 0x48, 0xad, 0x85, 0x27, 0xb8, 0x34, 0x3f, 0xdb, 0x8d, 0x57, 0x2d,
+	0xf5, 0x2f, 0x5b, 0x5e, 0x9a, 0xf7, 0xb5, 0xf5, 0x7f, 0x4c, 0xc8, 0x5b, 0xab, 0x3f, 0xb6, 0x51,
+	0x84, 0x69, 0x64, 0x61, 0x83, 0x72, 0x1f, 0x35, 0x93, 0xe8, 0xf7, 0x1d, 0x5f, 0x10, 0xa6, 0x8b,
+	0x3d, 0x5f, 0xe4, 0x7e, 0x61, 0xf8, 0xcf, 0xd6, 0xc0, 0x1e, 0x31, 0x26, 0x4c, 0x63, 0xbc, 0x57,
+	0x60, 0x9c, 0xfb, 0x18, 0x1b, 0xcd, 0x63, 0xdb, 0x14, 0xf3, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff,
+	0x62, 0x70, 0x40, 0x8a, 0xe3, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/placeholder_type.pb.go b/googleapis/ads/googleads/v3/enums/placeholder_type.pb.go
new file mode 100644
index 0000000..c919b86
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/placeholder_type.pb.go
@@ -0,0 +1,223 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/placeholder_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible placeholder types for a feed mapping.
+type PlaceholderTypeEnum_PlaceholderType int32
+
+const (
+	// Not specified.
+	PlaceholderTypeEnum_UNSPECIFIED PlaceholderTypeEnum_PlaceholderType = 0
+	// Used for return value only. Represents value unknown in this version.
+	PlaceholderTypeEnum_UNKNOWN PlaceholderTypeEnum_PlaceholderType = 1
+	// Lets you show links in your ad to pages from your website, including the
+	// main landing page.
+	PlaceholderTypeEnum_SITELINK PlaceholderTypeEnum_PlaceholderType = 2
+	// Lets you attach a phone number to an ad, allowing customers to call
+	// directly from the ad.
+	PlaceholderTypeEnum_CALL PlaceholderTypeEnum_PlaceholderType = 3
+	// Lets you provide users with a link that points to a mobile app in
+	// addition to a website.
+	PlaceholderTypeEnum_APP PlaceholderTypeEnum_PlaceholderType = 4
+	// Lets you show locations of businesses from your Google My Business
+	// account in your ad. This helps people find your locations by showing your
+	// ads with your address, a map to your location, or the distance to your
+	// business. This extension type is useful to draw customers to your
+	// brick-and-mortar location.
+	PlaceholderTypeEnum_LOCATION PlaceholderTypeEnum_PlaceholderType = 5
+	// If you sell your product through retail chains, affiliate location
+	// extensions let you show nearby stores that carry your products.
+	PlaceholderTypeEnum_AFFILIATE_LOCATION PlaceholderTypeEnum_PlaceholderType = 6
+	// Lets you include additional text with your search ads that provide
+	// detailed information about your business, including products and services
+	// you offer. Callouts appear in ads at the top and bottom of Google search
+	// results.
+	PlaceholderTypeEnum_CALLOUT PlaceholderTypeEnum_PlaceholderType = 7
+	// Lets you add more info to your ad, specific to some predefined categories
+	// such as types, brands, styles, etc. A minimum of 3 text (SNIPPETS) values
+	// are required.
+	PlaceholderTypeEnum_STRUCTURED_SNIPPET PlaceholderTypeEnum_PlaceholderType = 8
+	// Allows users to see your ad, click an icon, and contact you directly by
+	// text message. With one tap on your ad, people can contact you to book an
+	// appointment, get a quote, ask for information, or request a service.
+	PlaceholderTypeEnum_MESSAGE PlaceholderTypeEnum_PlaceholderType = 9
+	// Lets you display prices for a list of items along with your ads. A price
+	// feed is composed of three to eight price table rows.
+	PlaceholderTypeEnum_PRICE PlaceholderTypeEnum_PlaceholderType = 10
+	// Allows you to highlight sales and other promotions that let users see how
+	// they can save by buying now.
+	PlaceholderTypeEnum_PROMOTION PlaceholderTypeEnum_PlaceholderType = 11
+	// Lets you dynamically inject custom data into the title and description
+	// of your ads.
+	PlaceholderTypeEnum_AD_CUSTOMIZER PlaceholderTypeEnum_PlaceholderType = 12
+	// Indicates that this feed is for education dynamic remarketing.
+	PlaceholderTypeEnum_DYNAMIC_EDUCATION PlaceholderTypeEnum_PlaceholderType = 13
+	// Indicates that this feed is for flight dynamic remarketing.
+	PlaceholderTypeEnum_DYNAMIC_FLIGHT PlaceholderTypeEnum_PlaceholderType = 14
+	// Indicates that this feed is for a custom dynamic remarketing type. Use
+	// this only if the other business types don't apply to your products or
+	// services.
+	PlaceholderTypeEnum_DYNAMIC_CUSTOM PlaceholderTypeEnum_PlaceholderType = 15
+	// Indicates that this feed is for hotels and rentals dynamic remarketing.
+	PlaceholderTypeEnum_DYNAMIC_HOTEL PlaceholderTypeEnum_PlaceholderType = 16
+	// Indicates that this feed is for real estate dynamic remarketing.
+	PlaceholderTypeEnum_DYNAMIC_REAL_ESTATE PlaceholderTypeEnum_PlaceholderType = 17
+	// Indicates that this feed is for travel dynamic remarketing.
+	PlaceholderTypeEnum_DYNAMIC_TRAVEL PlaceholderTypeEnum_PlaceholderType = 18
+	// Indicates that this feed is for local deals dynamic remarketing.
+	PlaceholderTypeEnum_DYNAMIC_LOCAL PlaceholderTypeEnum_PlaceholderType = 19
+	// Indicates that this feed is for job dynamic remarketing.
+	PlaceholderTypeEnum_DYNAMIC_JOB PlaceholderTypeEnum_PlaceholderType = 20
+)
+
+var PlaceholderTypeEnum_PlaceholderType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "SITELINK",
+	3:  "CALL",
+	4:  "APP",
+	5:  "LOCATION",
+	6:  "AFFILIATE_LOCATION",
+	7:  "CALLOUT",
+	8:  "STRUCTURED_SNIPPET",
+	9:  "MESSAGE",
+	10: "PRICE",
+	11: "PROMOTION",
+	12: "AD_CUSTOMIZER",
+	13: "DYNAMIC_EDUCATION",
+	14: "DYNAMIC_FLIGHT",
+	15: "DYNAMIC_CUSTOM",
+	16: "DYNAMIC_HOTEL",
+	17: "DYNAMIC_REAL_ESTATE",
+	18: "DYNAMIC_TRAVEL",
+	19: "DYNAMIC_LOCAL",
+	20: "DYNAMIC_JOB",
+}
+
+var PlaceholderTypeEnum_PlaceholderType_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"SITELINK":            2,
+	"CALL":                3,
+	"APP":                 4,
+	"LOCATION":            5,
+	"AFFILIATE_LOCATION":  6,
+	"CALLOUT":             7,
+	"STRUCTURED_SNIPPET":  8,
+	"MESSAGE":             9,
+	"PRICE":               10,
+	"PROMOTION":           11,
+	"AD_CUSTOMIZER":       12,
+	"DYNAMIC_EDUCATION":   13,
+	"DYNAMIC_FLIGHT":      14,
+	"DYNAMIC_CUSTOM":      15,
+	"DYNAMIC_HOTEL":       16,
+	"DYNAMIC_REAL_ESTATE": 17,
+	"DYNAMIC_TRAVEL":      18,
+	"DYNAMIC_LOCAL":       19,
+	"DYNAMIC_JOB":         20,
+}
+
+func (x PlaceholderTypeEnum_PlaceholderType) String() string {
+	return proto.EnumName(PlaceholderTypeEnum_PlaceholderType_name, int32(x))
+}
+
+func (PlaceholderTypeEnum_PlaceholderType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_60d966f72e921afd, []int{0, 0}
+}
+
+// Container for enum describing possible placeholder types for a feed mapping.
+type PlaceholderTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PlaceholderTypeEnum) Reset()         { *m = PlaceholderTypeEnum{} }
+func (m *PlaceholderTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*PlaceholderTypeEnum) ProtoMessage()    {}
+func (*PlaceholderTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_60d966f72e921afd, []int{0}
+}
+
+func (m *PlaceholderTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PlaceholderTypeEnum.Unmarshal(m, b)
+}
+func (m *PlaceholderTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PlaceholderTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *PlaceholderTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PlaceholderTypeEnum.Merge(m, src)
+}
+func (m *PlaceholderTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_PlaceholderTypeEnum.Size(m)
+}
+func (m *PlaceholderTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PlaceholderTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PlaceholderTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PlaceholderTypeEnum_PlaceholderType", PlaceholderTypeEnum_PlaceholderType_name, PlaceholderTypeEnum_PlaceholderType_value)
+	proto.RegisterType((*PlaceholderTypeEnum)(nil), "google.ads.googleads.v3.enums.PlaceholderTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/placeholder_type.proto", fileDescriptor_60d966f72e921afd)
+}
+
+var fileDescriptor_60d966f72e921afd = []byte{
+	// 490 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xd1, 0x6e, 0x9b, 0x30,
+	0x14, 0x86, 0x17, 0xd2, 0x36, 0x89, 0xd3, 0x34, 0x8e, 0xd3, 0x6d, 0xd2, 0xb4, 0x5e, 0xb4, 0x0f,
+	0x00, 0x17, 0xec, 0x8a, 0x5d, 0x39, 0xe0, 0xa4, 0x5e, 0x1d, 0xb0, 0xc0, 0x64, 0x5a, 0x15, 0x09,
+	0xb1, 0x82, 0x58, 0xa4, 0x04, 0xa3, 0x90, 0x56, 0xea, 0x5b, 0xec, 0x19, 0x76, 0xb9, 0x47, 0xd9,
+	0x9b, 0x6c, 0x4f, 0xb0, 0xcb, 0xc9, 0x50, 0xb2, 0xa8, 0xd2, 0x76, 0x83, 0x8e, 0xbe, 0xf3, 0xff,
+	0x3f, 0xb6, 0xcf, 0x01, 0xef, 0x32, 0x29, 0xb3, 0x75, 0x6a, 0xc4, 0x49, 0x69, 0xd4, 0xa5, 0xaa,
+	0x1e, 0x4c, 0x23, 0xcd, 0xef, 0x37, 0xa5, 0x51, 0xac, 0xe3, 0xbb, 0xf4, 0x8b, 0x5c, 0x27, 0xe9,
+	0x36, 0xda, 0x3d, 0x16, 0xa9, 0x5e, 0x6c, 0xe5, 0x4e, 0xa2, 0x8b, 0x5a, 0xaa, 0xc7, 0x49, 0xa9,
+	0xef, 0x5d, 0xfa, 0x83, 0xa9, 0x57, 0xae, 0x37, 0x6f, 0x9b, 0xd0, 0x62, 0x65, 0xc4, 0x79, 0x2e,
+	0x77, 0xf1, 0x6e, 0x25, 0xf3, 0xb2, 0x36, 0x5f, 0x7d, 0x6d, 0x83, 0x31, 0xff, 0x9b, 0x2b, 0x1e,
+	0x8b, 0x94, 0xe4, 0xf7, 0x9b, 0xab, 0xdf, 0x1a, 0x18, 0x3e, 0xe3, 0x68, 0x08, 0xfa, 0xa1, 0x1b,
+	0x70, 0x62, 0xd3, 0x29, 0x25, 0x0e, 0x7c, 0x81, 0xfa, 0xa0, 0x13, 0xba, 0x37, 0xae, 0xf7, 0xd1,
+	0x85, 0x2d, 0x74, 0x0a, 0xba, 0x01, 0x15, 0x84, 0x51, 0xf7, 0x06, 0x6a, 0xa8, 0x0b, 0x8e, 0x6c,
+	0xcc, 0x18, 0x6c, 0xa3, 0x0e, 0x68, 0x63, 0xce, 0xe1, 0x91, 0x12, 0x30, 0xcf, 0xc6, 0x82, 0x7a,
+	0x2e, 0x3c, 0x46, 0xaf, 0x00, 0xc2, 0xd3, 0x29, 0x65, 0x14, 0x0b, 0x12, 0xed, 0xf9, 0x89, 0xca,
+	0x54, 0x46, 0x2f, 0x14, 0xb0, 0xa3, 0x44, 0x81, 0xf0, 0x43, 0x5b, 0x84, 0x3e, 0x71, 0xa2, 0xc0,
+	0xa5, 0x9c, 0x13, 0x01, 0xbb, 0x4a, 0x34, 0x27, 0x41, 0x80, 0x67, 0x04, 0xf6, 0x50, 0x0f, 0x1c,
+	0x73, 0x9f, 0xda, 0x04, 0x02, 0x34, 0x00, 0x3d, 0xee, 0x7b, 0x73, 0xaf, 0xca, 0xea, 0xa3, 0x11,
+	0x18, 0x60, 0x27, 0xb2, 0xc3, 0x40, 0x78, 0x73, 0x7a, 0x4b, 0x7c, 0x78, 0x8a, 0x5e, 0x82, 0x91,
+	0xf3, 0xc9, 0xc5, 0x73, 0x6a, 0x47, 0xc4, 0x09, 0x9f, 0xfe, 0x3a, 0x40, 0x08, 0x9c, 0x35, 0x78,
+	0xca, 0xe8, 0xec, 0x5a, 0xc0, 0xb3, 0x43, 0x56, 0x47, 0xc0, 0xa1, 0x4a, 0x6c, 0xd8, 0xb5, 0x27,
+	0x08, 0x83, 0x10, 0xbd, 0x06, 0xe3, 0x06, 0xf9, 0x04, 0xb3, 0x88, 0x04, 0x02, 0x0b, 0x02, 0x47,
+	0x87, 0x7e, 0xe1, 0xe3, 0x05, 0x61, 0x10, 0x1d, 0xfa, 0xd5, 0x9d, 0x19, 0x1c, 0xab, 0x57, 0x6d,
+	0xd0, 0x07, 0x6f, 0x02, 0xcf, 0x27, 0x3f, 0x5b, 0xe0, 0xf2, 0x4e, 0x6e, 0xf4, 0xff, 0x8e, 0x75,
+	0x72, 0xfe, 0x6c, 0x3a, 0x5c, 0x8d, 0x93, 0xb7, 0x6e, 0x27, 0x4f, 0xb6, 0x4c, 0xae, 0xe3, 0x3c,
+	0xd3, 0xe5, 0x36, 0x33, 0xb2, 0x34, 0xaf, 0x86, 0xdd, 0xec, 0x54, 0xb1, 0x2a, 0xff, 0xb1, 0x62,
+	0xef, 0xab, 0xef, 0x37, 0xad, 0x3d, 0xc3, 0xf8, 0xbb, 0x76, 0x31, 0xab, 0xa3, 0x70, 0x52, 0xea,
+	0x75, 0xa9, 0xaa, 0x85, 0xa9, 0xab, 0x0d, 0x29, 0x7f, 0x34, 0xfd, 0x25, 0x4e, 0xca, 0xe5, 0xbe,
+	0xbf, 0x5c, 0x98, 0xcb, 0xaa, 0xff, 0x4b, 0xbb, 0xac, 0xa1, 0x65, 0xe1, 0xa4, 0xb4, 0xac, 0xbd,
+	0xc2, 0xb2, 0x16, 0xa6, 0x65, 0x55, 0x9a, 0xcf, 0x27, 0xd5, 0xc1, 0xcc, 0x3f, 0x01, 0x00, 0x00,
+	0xff, 0xff, 0x00, 0xfe, 0x7a, 0x86, 0xfa, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/placement_type.pb.go b/googleapis/ads/googleads/v3/enums/placement_type.pb.go
new file mode 100644
index 0000000..4dc05b7
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/placement_type.pb.go
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/placement_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible placement types for a feed mapping.
+type PlacementTypeEnum_PlacementType int32
+
+const (
+	// Not specified.
+	PlacementTypeEnum_UNSPECIFIED PlacementTypeEnum_PlacementType = 0
+	// Used for return value only. Represents value unknown in this version.
+	PlacementTypeEnum_UNKNOWN PlacementTypeEnum_PlacementType = 1
+	// Websites(e.g. 'www.flowers4sale.com').
+	PlacementTypeEnum_WEBSITE PlacementTypeEnum_PlacementType = 2
+	// Mobile application categories(e.g. 'Games').
+	PlacementTypeEnum_MOBILE_APP_CATEGORY PlacementTypeEnum_PlacementType = 3
+	// mobile applications(e.g. 'mobileapp::2-com.whatsthewordanswers').
+	PlacementTypeEnum_MOBILE_APPLICATION PlacementTypeEnum_PlacementType = 4
+	// YouTube videos(e.g. 'youtube.com/video/wtLJPvx7-ys').
+	PlacementTypeEnum_YOUTUBE_VIDEO PlacementTypeEnum_PlacementType = 5
+	// YouTube channels(e.g. 'youtube.com::L8ZULXASCc1I_oaOT0NaOQ').
+	PlacementTypeEnum_YOUTUBE_CHANNEL PlacementTypeEnum_PlacementType = 6
+)
+
+var PlacementTypeEnum_PlacementType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "WEBSITE",
+	3: "MOBILE_APP_CATEGORY",
+	4: "MOBILE_APPLICATION",
+	5: "YOUTUBE_VIDEO",
+	6: "YOUTUBE_CHANNEL",
+}
+
+var PlacementTypeEnum_PlacementType_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"WEBSITE":             2,
+	"MOBILE_APP_CATEGORY": 3,
+	"MOBILE_APPLICATION":  4,
+	"YOUTUBE_VIDEO":       5,
+	"YOUTUBE_CHANNEL":     6,
+}
+
+func (x PlacementTypeEnum_PlacementType) String() string {
+	return proto.EnumName(PlacementTypeEnum_PlacementType_name, int32(x))
+}
+
+func (PlacementTypeEnum_PlacementType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_05b9db770804c8f7, []int{0, 0}
+}
+
+// Container for enum describing possible placement types.
+type PlacementTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PlacementTypeEnum) Reset()         { *m = PlacementTypeEnum{} }
+func (m *PlacementTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*PlacementTypeEnum) ProtoMessage()    {}
+func (*PlacementTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_05b9db770804c8f7, []int{0}
+}
+
+func (m *PlacementTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PlacementTypeEnum.Unmarshal(m, b)
+}
+func (m *PlacementTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PlacementTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *PlacementTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PlacementTypeEnum.Merge(m, src)
+}
+func (m *PlacementTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_PlacementTypeEnum.Size(m)
+}
+func (m *PlacementTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PlacementTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PlacementTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PlacementTypeEnum_PlacementType", PlacementTypeEnum_PlacementType_name, PlacementTypeEnum_PlacementType_value)
+	proto.RegisterType((*PlacementTypeEnum)(nil), "google.ads.googleads.v3.enums.PlacementTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/placement_type.proto", fileDescriptor_05b9db770804c8f7)
+}
+
+var fileDescriptor_05b9db770804c8f7 = []byte{
+	// 359 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x5d, 0x6a, 0xab, 0x40,
+	0x14, 0xbe, 0x9a, 0x7b, 0x73, 0x61, 0x42, 0x88, 0x99, 0xc0, 0xbd, 0x50, 0x9a, 0x87, 0x64, 0x01,
+	0x23, 0xd4, 0xb7, 0xe9, 0xd3, 0x68, 0xa6, 0xa9, 0x34, 0x55, 0x69, 0xd4, 0x90, 0x22, 0x88, 0x8d,
+	0x22, 0x81, 0x38, 0x23, 0x19, 0x13, 0xc8, 0x3a, 0xba, 0x83, 0xbe, 0xb5, 0x4b, 0xe9, 0x46, 0x0a,
+	0x5d, 0x45, 0x51, 0x6b, 0x4a, 0x1e, 0xda, 0x97, 0xe1, 0x9b, 0xf3, 0xfd, 0x70, 0xce, 0x07, 0x2e,
+	0x52, 0xce, 0xd3, 0x4d, 0xa2, 0x46, 0xb1, 0x50, 0x6b, 0x58, 0xa2, 0xbd, 0xa6, 0x26, 0x6c, 0x97,
+	0x09, 0x35, 0xdf, 0x44, 0xab, 0x24, 0x4b, 0x58, 0x11, 0x16, 0x87, 0x3c, 0x41, 0xf9, 0x96, 0x17,
+	0x1c, 0x0e, 0x6b, 0x21, 0x8a, 0x62, 0x81, 0x8e, 0x1e, 0xb4, 0xd7, 0x50, 0xe5, 0x39, 0x3b, 0x6f,
+	0x22, 0xf3, 0xb5, 0x1a, 0x31, 0xc6, 0x8b, 0xa8, 0x58, 0x73, 0x26, 0x6a, 0xf3, 0xf8, 0x59, 0x02,
+	0x7d, 0xa7, 0x49, 0x75, 0x0f, 0x79, 0x42, 0xd9, 0x2e, 0x1b, 0x3f, 0x4a, 0xa0, 0x7b, 0x32, 0x85,
+	0x3d, 0xd0, 0xf1, 0xac, 0xb9, 0x43, 0x0d, 0xf3, 0xca, 0xa4, 0x13, 0xe5, 0x17, 0xec, 0x80, 0xbf,
+	0x9e, 0x75, 0x63, 0xd9, 0x0b, 0x4b, 0x91, 0xca, 0xcf, 0x82, 0xea, 0x73, 0xd3, 0xa5, 0x8a, 0x0c,
+	0xff, 0x83, 0xc1, 0xad, 0xad, 0x9b, 0x33, 0x1a, 0x12, 0xc7, 0x09, 0x0d, 0xe2, 0xd2, 0xa9, 0x7d,
+	0xb7, 0x54, 0x5a, 0xf0, 0x1f, 0x80, 0x5f, 0xc4, 0xcc, 0x34, 0x88, 0x6b, 0xda, 0x96, 0xf2, 0x1b,
+	0xf6, 0x41, 0x77, 0x69, 0x7b, 0xae, 0xa7, 0xd3, 0xd0, 0x37, 0x27, 0xd4, 0x56, 0xfe, 0xc0, 0x01,
+	0xe8, 0x35, 0x23, 0xe3, 0x9a, 0x58, 0x16, 0x9d, 0x29, 0x6d, 0xfd, 0x4d, 0x02, 0xa3, 0x15, 0xcf,
+	0xd0, 0x8f, 0xf7, 0xea, 0xf0, 0x64, 0x71, 0xa7, 0xbc, 0xd2, 0x91, 0xee, 0xf5, 0x4f, 0x53, 0xca,
+	0x37, 0x11, 0x4b, 0x11, 0xdf, 0xa6, 0x6a, 0x9a, 0xb0, 0xaa, 0x83, 0xa6, 0xe8, 0x7c, 0x2d, 0xbe,
+	0xe9, 0xfd, 0xb2, 0x7a, 0x9f, 0xe4, 0xd6, 0x94, 0x90, 0x17, 0x79, 0x38, 0xad, 0xa3, 0x48, 0x2c,
+	0x50, 0x0d, 0x4b, 0xe4, 0x6b, 0xa8, 0xac, 0x4e, 0xbc, 0x36, 0x7c, 0x40, 0x62, 0x11, 0x1c, 0xf9,
+	0xc0, 0xd7, 0x82, 0x8a, 0x7f, 0x97, 0x47, 0xf5, 0x10, 0x63, 0x12, 0x0b, 0x8c, 0x8f, 0x0a, 0x8c,
+	0x7d, 0x0d, 0xe3, 0x4a, 0xf3, 0xd0, 0xae, 0x16, 0xd3, 0x3e, 0x02, 0x00, 0x00, 0xff, 0xff, 0xbc,
+	0xbc, 0x0c, 0x7f, 0x0f, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/policy_approval_status.pb.go b/googleapis/ads/googleads/v3/enums/policy_approval_status.pb.go
new file mode 100644
index 0000000..b139788
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/policy_approval_status.pb.go
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/policy_approval_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible policy approval statuses. When there are several approval
+// statuses available the most severe one will be used. The order of severity
+// is DISAPPROVED, AREA_OF_INTEREST_ONLY, APPROVED_LIMITED and APPROVED.
+type PolicyApprovalStatusEnum_PolicyApprovalStatus int32
+
+const (
+	// No value has been specified.
+	PolicyApprovalStatusEnum_UNSPECIFIED PolicyApprovalStatusEnum_PolicyApprovalStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	PolicyApprovalStatusEnum_UNKNOWN PolicyApprovalStatusEnum_PolicyApprovalStatus = 1
+	// Will not serve.
+	PolicyApprovalStatusEnum_DISAPPROVED PolicyApprovalStatusEnum_PolicyApprovalStatus = 2
+	// Serves with restrictions.
+	PolicyApprovalStatusEnum_APPROVED_LIMITED PolicyApprovalStatusEnum_PolicyApprovalStatus = 3
+	// Serves without restrictions.
+	PolicyApprovalStatusEnum_APPROVED PolicyApprovalStatusEnum_PolicyApprovalStatus = 4
+	// Will not serve in targeted countries, but may serve for users who are
+	// searching for information about the targeted countries.
+	PolicyApprovalStatusEnum_AREA_OF_INTEREST_ONLY PolicyApprovalStatusEnum_PolicyApprovalStatus = 5
+)
+
+var PolicyApprovalStatusEnum_PolicyApprovalStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DISAPPROVED",
+	3: "APPROVED_LIMITED",
+	4: "APPROVED",
+	5: "AREA_OF_INTEREST_ONLY",
+}
+
+var PolicyApprovalStatusEnum_PolicyApprovalStatus_value = map[string]int32{
+	"UNSPECIFIED":           0,
+	"UNKNOWN":               1,
+	"DISAPPROVED":           2,
+	"APPROVED_LIMITED":      3,
+	"APPROVED":              4,
+	"AREA_OF_INTEREST_ONLY": 5,
+}
+
+func (x PolicyApprovalStatusEnum_PolicyApprovalStatus) String() string {
+	return proto.EnumName(PolicyApprovalStatusEnum_PolicyApprovalStatus_name, int32(x))
+}
+
+func (PolicyApprovalStatusEnum_PolicyApprovalStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_f111d9ed5ef13a4d, []int{0, 0}
+}
+
+// Container for enum describing possible policy approval statuses.
+type PolicyApprovalStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyApprovalStatusEnum) Reset()         { *m = PolicyApprovalStatusEnum{} }
+func (m *PolicyApprovalStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*PolicyApprovalStatusEnum) ProtoMessage()    {}
+func (*PolicyApprovalStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f111d9ed5ef13a4d, []int{0}
+}
+
+func (m *PolicyApprovalStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyApprovalStatusEnum.Unmarshal(m, b)
+}
+func (m *PolicyApprovalStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyApprovalStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *PolicyApprovalStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyApprovalStatusEnum.Merge(m, src)
+}
+func (m *PolicyApprovalStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_PolicyApprovalStatusEnum.Size(m)
+}
+func (m *PolicyApprovalStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyApprovalStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyApprovalStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PolicyApprovalStatusEnum_PolicyApprovalStatus", PolicyApprovalStatusEnum_PolicyApprovalStatus_name, PolicyApprovalStatusEnum_PolicyApprovalStatus_value)
+	proto.RegisterType((*PolicyApprovalStatusEnum)(nil), "google.ads.googleads.v3.enums.PolicyApprovalStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/policy_approval_status.proto", fileDescriptor_f111d9ed5ef13a4d)
+}
+
+var fileDescriptor_f111d9ed5ef13a4d = []byte{
+	// 347 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcb, 0x4a, 0xf3, 0x40,
+	0x14, 0xfe, 0x93, 0xfe, 0x5e, 0x98, 0x0a, 0x86, 0x50, 0xc1, 0x8a, 0x5d, 0xb4, 0x0f, 0x30, 0x59,
+	0x64, 0x37, 0xae, 0xa6, 0x66, 0x5a, 0x82, 0x35, 0x09, 0x4d, 0x1b, 0x51, 0x02, 0x61, 0x6c, 0x4a,
+	0x08, 0xa4, 0x33, 0xa1, 0x93, 0x16, 0xdc, 0xfb, 0x22, 0xba, 0xf4, 0x51, 0x7c, 0x14, 0x17, 0x3e,
+	0x83, 0x64, 0x72, 0x59, 0x55, 0x37, 0xc3, 0x37, 0xe7, 0xbb, 0x70, 0xce, 0x07, 0x50, 0xc2, 0x79,
+	0x92, 0xad, 0x0d, 0x1a, 0x0b, 0xa3, 0x82, 0x25, 0xda, 0x9b, 0xc6, 0x9a, 0xed, 0x36, 0xc2, 0xc8,
+	0x79, 0x96, 0xae, 0x5e, 0x22, 0x9a, 0xe7, 0x5b, 0xbe, 0xa7, 0x59, 0x24, 0x0a, 0x5a, 0xec, 0x04,
+	0xcc, 0xb7, 0xbc, 0xe0, 0xfa, 0xa0, 0x32, 0x40, 0x1a, 0x0b, 0xd8, 0x7a, 0xe1, 0xde, 0x84, 0xd2,
+	0x7b, 0x75, 0xdd, 0x44, 0xe7, 0xa9, 0x41, 0x19, 0xe3, 0x05, 0x2d, 0x52, 0xce, 0x6a, 0xf3, 0xe8,
+	0x4d, 0x01, 0x97, 0x9e, 0x4c, 0xc7, 0x75, 0xb8, 0x2f, 0xb3, 0x09, 0xdb, 0x6d, 0x46, 0xaf, 0x0a,
+	0xe8, 0x1d, 0x22, 0xf5, 0x73, 0xd0, 0x5d, 0x3a, 0xbe, 0x47, 0x6e, 0xed, 0x89, 0x4d, 0x2c, 0xed,
+	0x9f, 0xde, 0x05, 0x27, 0x4b, 0xe7, 0xce, 0x71, 0x1f, 0x1c, 0x4d, 0x29, 0x59, 0xcb, 0xf6, 0xb1,
+	0xe7, 0xcd, 0xdd, 0x80, 0x58, 0x9a, 0xaa, 0xf7, 0x80, 0xd6, 0xfc, 0xa2, 0x99, 0x7d, 0x6f, 0x2f,
+	0x88, 0xa5, 0x75, 0xf4, 0x33, 0x70, 0xda, 0x6a, 0xfe, 0xeb, 0x7d, 0x70, 0x81, 0xe7, 0x04, 0x47,
+	0xee, 0x24, 0xb2, 0x9d, 0x05, 0x99, 0x13, 0x7f, 0x11, 0xb9, 0xce, 0xec, 0x51, 0x3b, 0x1a, 0x7f,
+	0x2b, 0x60, 0xb8, 0xe2, 0x1b, 0xf8, 0xe7, 0x9d, 0xe3, 0xfe, 0xa1, 0x4d, 0xbd, 0xf2, 0x48, 0x4f,
+	0x79, 0x1a, 0xd7, 0xde, 0x84, 0x67, 0x94, 0x25, 0x90, 0x6f, 0x13, 0x23, 0x59, 0x33, 0x59, 0x41,
+	0xd3, 0x77, 0x9e, 0x8a, 0x5f, 0xea, 0xbf, 0x91, 0xef, 0xbb, 0xda, 0x99, 0x62, 0xfc, 0xa1, 0x0e,
+	0xa6, 0x55, 0x14, 0x8e, 0x05, 0xac, 0x60, 0x89, 0x02, 0x13, 0x96, 0x95, 0x89, 0xcf, 0x86, 0x0f,
+	0x71, 0x2c, 0xc2, 0x96, 0x0f, 0x03, 0x33, 0x94, 0xfc, 0x97, 0x3a, 0xac, 0x86, 0x08, 0xe1, 0x58,
+	0x20, 0xd4, 0x2a, 0x10, 0x0a, 0x4c, 0x84, 0xa4, 0xe6, 0xf9, 0x58, 0x2e, 0x66, 0xfe, 0x04, 0x00,
+	0x00, 0xff, 0xff, 0x2f, 0x49, 0x5c, 0x3e, 0x16, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/policy_review_status.pb.go b/googleapis/ads/googleads/v3/enums/policy_review_status.pb.go
new file mode 100644
index 0000000..ce026b9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/policy_review_status.pb.go
@@ -0,0 +1,138 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/policy_review_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible policy review statuses.
+type PolicyReviewStatusEnum_PolicyReviewStatus int32
+
+const (
+	// No value has been specified.
+	PolicyReviewStatusEnum_UNSPECIFIED PolicyReviewStatusEnum_PolicyReviewStatus = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	PolicyReviewStatusEnum_UNKNOWN PolicyReviewStatusEnum_PolicyReviewStatus = 1
+	// Currently under review.
+	PolicyReviewStatusEnum_REVIEW_IN_PROGRESS PolicyReviewStatusEnum_PolicyReviewStatus = 2
+	// Primary review complete. Other reviews may be continuing.
+	PolicyReviewStatusEnum_REVIEWED PolicyReviewStatusEnum_PolicyReviewStatus = 3
+	// The resource has been resubmitted for approval or its policy decision has
+	// been appealed.
+	PolicyReviewStatusEnum_UNDER_APPEAL PolicyReviewStatusEnum_PolicyReviewStatus = 4
+	// The resource is eligible and may be serving but could still undergo
+	// further review.
+	PolicyReviewStatusEnum_ELIGIBLE_MAY_SERVE PolicyReviewStatusEnum_PolicyReviewStatus = 5
+)
+
+var PolicyReviewStatusEnum_PolicyReviewStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "REVIEW_IN_PROGRESS",
+	3: "REVIEWED",
+	4: "UNDER_APPEAL",
+	5: "ELIGIBLE_MAY_SERVE",
+}
+
+var PolicyReviewStatusEnum_PolicyReviewStatus_value = map[string]int32{
+	"UNSPECIFIED":        0,
+	"UNKNOWN":            1,
+	"REVIEW_IN_PROGRESS": 2,
+	"REVIEWED":           3,
+	"UNDER_APPEAL":       4,
+	"ELIGIBLE_MAY_SERVE": 5,
+}
+
+func (x PolicyReviewStatusEnum_PolicyReviewStatus) String() string {
+	return proto.EnumName(PolicyReviewStatusEnum_PolicyReviewStatus_name, int32(x))
+}
+
+func (PolicyReviewStatusEnum_PolicyReviewStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c693618f5306b1b3, []int{0, 0}
+}
+
+// Container for enum describing possible policy review statuses.
+type PolicyReviewStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyReviewStatusEnum) Reset()         { *m = PolicyReviewStatusEnum{} }
+func (m *PolicyReviewStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*PolicyReviewStatusEnum) ProtoMessage()    {}
+func (*PolicyReviewStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c693618f5306b1b3, []int{0}
+}
+
+func (m *PolicyReviewStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyReviewStatusEnum.Unmarshal(m, b)
+}
+func (m *PolicyReviewStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyReviewStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *PolicyReviewStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyReviewStatusEnum.Merge(m, src)
+}
+func (m *PolicyReviewStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_PolicyReviewStatusEnum.Size(m)
+}
+func (m *PolicyReviewStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyReviewStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyReviewStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PolicyReviewStatusEnum_PolicyReviewStatus", PolicyReviewStatusEnum_PolicyReviewStatus_name, PolicyReviewStatusEnum_PolicyReviewStatus_value)
+	proto.RegisterType((*PolicyReviewStatusEnum)(nil), "google.ads.googleads.v3.enums.PolicyReviewStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/policy_review_status.proto", fileDescriptor_c693618f5306b1b3)
+}
+
+var fileDescriptor_c693618f5306b1b3 = []byte{
+	// 351 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4b, 0xfb, 0x30,
+	0x1c, 0xfe, 0xb7, 0xfb, 0xbf, 0x91, 0x0d, 0x2c, 0x39, 0x4c, 0x10, 0x77, 0xd8, 0x3e, 0x40, 0x7a,
+	0xe8, 0x45, 0xe2, 0x29, 0x75, 0xb1, 0x14, 0x67, 0x17, 0x5a, 0xd6, 0xa1, 0x14, 0x42, 0x5d, 0x4b,
+	0x29, 0x6c, 0x49, 0x59, 0xba, 0x89, 0x57, 0xbf, 0x87, 0x17, 0x8f, 0x7e, 0x14, 0x3f, 0x8a, 0xf8,
+	0x21, 0xa4, 0xe9, 0xb6, 0xcb, 0xd0, 0x4b, 0x78, 0xc8, 0xf3, 0xc2, 0xef, 0x79, 0xc0, 0x45, 0x21,
+	0x65, 0xb1, 0xcc, 0xed, 0x34, 0x53, 0x76, 0x0b, 0x1b, 0xb4, 0x75, 0xec, 0x5c, 0x6c, 0x56, 0xca,
+	0xae, 0xe4, 0xb2, 0x5c, 0x3c, 0xf1, 0x75, 0xbe, 0x2d, 0xf3, 0x47, 0xae, 0xea, 0xb4, 0xde, 0x28,
+	0x54, 0xad, 0x65, 0x2d, 0xe1, 0xa0, 0x95, 0xa3, 0x34, 0x53, 0xe8, 0xe0, 0x44, 0x5b, 0x07, 0x69,
+	0xe7, 0xd9, 0xf9, 0x3e, 0xb8, 0x2a, 0xed, 0x54, 0x08, 0x59, 0xa7, 0x75, 0x29, 0xc5, 0xce, 0x3c,
+	0x7a, 0x31, 0x40, 0x9f, 0xe9, 0xec, 0x50, 0x47, 0x47, 0x3a, 0x99, 0x8a, 0xcd, 0x6a, 0xf4, 0x6c,
+	0x00, 0x78, 0x4c, 0xc1, 0x13, 0xd0, 0x9d, 0x05, 0x11, 0xa3, 0x57, 0xfe, 0xb5, 0x4f, 0xc7, 0xd6,
+	0x2f, 0xd8, 0x05, 0xff, 0x66, 0xc1, 0x4d, 0x30, 0x9d, 0x07, 0x96, 0x01, 0xfb, 0x00, 0x86, 0x34,
+	0xf6, 0xe9, 0x9c, 0xfb, 0x01, 0x67, 0xe1, 0xd4, 0x0b, 0x69, 0x14, 0x59, 0x26, 0xec, 0x81, 0xff,
+	0xed, 0x3f, 0x1d, 0x5b, 0x1d, 0x68, 0x81, 0xde, 0x2c, 0x18, 0xd3, 0x90, 0x13, 0xc6, 0x28, 0x99,
+	0x58, 0xbf, 0x1b, 0x1f, 0x9d, 0xf8, 0x9e, 0xef, 0x4e, 0x28, 0xbf, 0x25, 0x77, 0x3c, 0xa2, 0x61,
+	0x4c, 0xad, 0x3f, 0xee, 0xa7, 0x01, 0x86, 0x0b, 0xb9, 0x42, 0x3f, 0x76, 0x74, 0x4f, 0x8f, 0xef,
+	0x64, 0x4d, 0x3d, 0x66, 0xdc, 0xbb, 0x3b, 0x67, 0x21, 0x97, 0xa9, 0x28, 0x90, 0x5c, 0x17, 0x76,
+	0x91, 0x0b, 0x5d, 0x7e, 0xbf, 0x73, 0x55, 0xaa, 0x6f, 0x66, 0xbf, 0xd4, 0xef, 0xab, 0xd9, 0xf1,
+	0x08, 0x79, 0x33, 0x07, 0x5e, 0x1b, 0x45, 0x32, 0x85, 0x5a, 0xd8, 0xa0, 0xd8, 0x41, 0xcd, 0x5c,
+	0xea, 0x7d, 0xcf, 0x27, 0x24, 0x53, 0xc9, 0x81, 0x4f, 0x62, 0x27, 0xd1, 0xfc, 0x87, 0x39, 0x6c,
+	0x3f, 0x31, 0x26, 0x99, 0xc2, 0xf8, 0xa0, 0xc0, 0x38, 0x76, 0x30, 0xd6, 0x9a, 0x87, 0xbf, 0xfa,
+	0x30, 0xe7, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x84, 0x21, 0x68, 0x0e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/policy_topic_entry_type.pb.go b/googleapis/ads/googleads/v3/enums/policy_topic_entry_type.pb.go
new file mode 100644
index 0000000..ed91de0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/policy_topic_entry_type.pb.go
@@ -0,0 +1,148 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/policy_topic_entry_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible policy topic entry types.
+type PolicyTopicEntryTypeEnum_PolicyTopicEntryType int32
+
+const (
+	// No value has been specified.
+	PolicyTopicEntryTypeEnum_UNSPECIFIED PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	PolicyTopicEntryTypeEnum_UNKNOWN PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 1
+	// The resource will not be served.
+	PolicyTopicEntryTypeEnum_PROHIBITED PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 2
+	// The resource will not be served under some circumstances.
+	PolicyTopicEntryTypeEnum_LIMITED PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 4
+	// The resource cannot serve at all because of the current targeting
+	// criteria.
+	PolicyTopicEntryTypeEnum_FULLY_LIMITED PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 8
+	// May be of interest, but does not limit how the resource is served.
+	PolicyTopicEntryTypeEnum_DESCRIPTIVE PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 5
+	// Could increase coverage beyond normal.
+	PolicyTopicEntryTypeEnum_BROADENING PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 6
+	// Constrained for all targeted countries, but may serve in other countries
+	// through area of interest.
+	PolicyTopicEntryTypeEnum_AREA_OF_INTEREST_ONLY PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 7
+)
+
+var PolicyTopicEntryTypeEnum_PolicyTopicEntryType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PROHIBITED",
+	4: "LIMITED",
+	8: "FULLY_LIMITED",
+	5: "DESCRIPTIVE",
+	6: "BROADENING",
+	7: "AREA_OF_INTEREST_ONLY",
+}
+
+var PolicyTopicEntryTypeEnum_PolicyTopicEntryType_value = map[string]int32{
+	"UNSPECIFIED":           0,
+	"UNKNOWN":               1,
+	"PROHIBITED":            2,
+	"LIMITED":               4,
+	"FULLY_LIMITED":         8,
+	"DESCRIPTIVE":           5,
+	"BROADENING":            6,
+	"AREA_OF_INTEREST_ONLY": 7,
+}
+
+func (x PolicyTopicEntryTypeEnum_PolicyTopicEntryType) String() string {
+	return proto.EnumName(PolicyTopicEntryTypeEnum_PolicyTopicEntryType_name, int32(x))
+}
+
+func (PolicyTopicEntryTypeEnum_PolicyTopicEntryType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_19cf7ab69a275a95, []int{0, 0}
+}
+
+// Container for enum describing possible policy topic entry types.
+type PolicyTopicEntryTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyTopicEntryTypeEnum) Reset()         { *m = PolicyTopicEntryTypeEnum{} }
+func (m *PolicyTopicEntryTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*PolicyTopicEntryTypeEnum) ProtoMessage()    {}
+func (*PolicyTopicEntryTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_19cf7ab69a275a95, []int{0}
+}
+
+func (m *PolicyTopicEntryTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEntryTypeEnum.Unmarshal(m, b)
+}
+func (m *PolicyTopicEntryTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEntryTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEntryTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEntryTypeEnum.Merge(m, src)
+}
+func (m *PolicyTopicEntryTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEntryTypeEnum.Size(m)
+}
+func (m *PolicyTopicEntryTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEntryTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEntryTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PolicyTopicEntryTypeEnum_PolicyTopicEntryType", PolicyTopicEntryTypeEnum_PolicyTopicEntryType_name, PolicyTopicEntryTypeEnum_PolicyTopicEntryType_value)
+	proto.RegisterType((*PolicyTopicEntryTypeEnum)(nil), "google.ads.googleads.v3.enums.PolicyTopicEntryTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/policy_topic_entry_type.proto", fileDescriptor_19cf7ab69a275a95)
+}
+
+var fileDescriptor_19cf7ab69a275a95 = []byte{
+	// 379 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xc1, 0xae, 0x93, 0x40,
+	0x18, 0x85, 0x05, 0xf5, 0x5e, 0x33, 0x37, 0x2a, 0x12, 0x4d, 0xbc, 0xc6, 0x2e, 0xda, 0x07, 0x18,
+	0x16, 0xec, 0xa6, 0xab, 0xa1, 0x4c, 0xeb, 0x44, 0x1c, 0x08, 0xa5, 0x98, 0x1a, 0x12, 0x82, 0x85,
+	0x10, 0x92, 0x76, 0x86, 0x74, 0x68, 0x13, 0xde, 0xc6, 0xb8, 0xf4, 0x1d, 0x7c, 0x01, 0x1f, 0xc5,
+	0x85, 0xcf, 0x60, 0x66, 0x90, 0xae, 0xea, 0xdd, 0x90, 0xc3, 0x7f, 0xfe, 0xf3, 0x05, 0xce, 0x0f,
+	0xe6, 0xb5, 0x10, 0xf5, 0xbe, 0x72, 0x8a, 0x52, 0x3a, 0x83, 0x54, 0xea, 0xec, 0x3a, 0x15, 0x3f,
+	0x1d, 0xa4, 0xd3, 0x8a, 0x7d, 0xb3, 0xeb, 0xf3, 0x4e, 0xb4, 0xcd, 0x2e, 0xaf, 0x78, 0x77, 0xec,
+	0xf3, 0xae, 0x6f, 0x2b, 0xd8, 0x1e, 0x45, 0x27, 0xec, 0xc9, 0x90, 0x80, 0x45, 0x29, 0xe1, 0x25,
+	0x0c, 0xcf, 0x2e, 0xd4, 0xe1, 0x77, 0xef, 0x47, 0x76, 0xdb, 0x38, 0x05, 0xe7, 0xa2, 0x2b, 0xba,
+	0x46, 0x70, 0x39, 0x84, 0x67, 0x3f, 0x0d, 0xf0, 0x36, 0xd2, 0xf8, 0x44, 0xd1, 0x89, 0x82, 0x27,
+	0x7d, 0x5b, 0x11, 0x7e, 0x3a, 0xcc, 0xbe, 0x19, 0xe0, 0xf5, 0x35, 0xd3, 0x7e, 0x09, 0xee, 0x36,
+	0x6c, 0x1d, 0x91, 0x05, 0x5d, 0x52, 0xe2, 0x5b, 0x8f, 0xec, 0x3b, 0x70, 0xbb, 0x61, 0x1f, 0x59,
+	0xf8, 0x99, 0x59, 0x86, 0xfd, 0x02, 0x80, 0x28, 0x0e, 0x3f, 0x50, 0x8f, 0x26, 0xc4, 0xb7, 0x4c,
+	0x65, 0x06, 0xf4, 0x93, 0x7e, 0x79, 0x62, 0xbf, 0x02, 0xcf, 0x97, 0x9b, 0x20, 0xd8, 0xe6, 0xe3,
+	0xe8, 0x99, 0xa2, 0xf9, 0x64, 0xbd, 0x88, 0x69, 0x94, 0xd0, 0x94, 0x58, 0x4f, 0x15, 0xc0, 0x8b,
+	0x43, 0xec, 0x13, 0x46, 0xd9, 0xca, 0xba, 0xb1, 0xef, 0xc1, 0x1b, 0x1c, 0x13, 0x9c, 0x87, 0xcb,
+	0x9c, 0xb2, 0x84, 0xc4, 0x64, 0x9d, 0xe4, 0x21, 0x0b, 0xb6, 0xd6, 0xad, 0xf7, 0xc7, 0x00, 0xd3,
+	0x9d, 0x38, 0xc0, 0x07, 0x3b, 0xf0, 0xee, 0xaf, 0xfd, 0x45, 0xa4, 0x0a, 0x88, 0x8c, 0x2f, 0xde,
+	0xbf, 0x6c, 0x2d, 0xf6, 0x05, 0xaf, 0xa1, 0x38, 0xd6, 0x4e, 0x5d, 0x71, 0x5d, 0xcf, 0x78, 0x8c,
+	0xb6, 0x91, 0xff, 0xb9, 0xcd, 0x5c, 0x3f, 0xbf, 0x9b, 0x8f, 0x57, 0x18, 0xff, 0x30, 0x27, 0xab,
+	0x01, 0x85, 0x4b, 0x09, 0x07, 0xa9, 0x54, 0xea, 0x42, 0x55, 0xa7, 0xfc, 0x35, 0xfa, 0x19, 0x2e,
+	0x65, 0x76, 0xf1, 0xb3, 0xd4, 0xcd, 0xb4, 0xff, 0xdb, 0x9c, 0x0e, 0x43, 0x84, 0x70, 0x29, 0x11,
+	0xba, 0x6c, 0x20, 0x94, 0xba, 0x08, 0xe9, 0x9d, 0xaf, 0x37, 0xfa, 0xc3, 0xdc, 0xbf, 0x01, 0x00,
+	0x00, 0xff, 0xff, 0x3f, 0xfa, 0x47, 0x32, 0x33, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/policy_topic_evidence_destination_mismatch_url_type.pb.go b/googleapis/ads/googleads/v3/enums/policy_topic_evidence_destination_mismatch_url_type.pb.go
new file mode 100644
index 0000000..bba0311
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/policy_topic_evidence_destination_mismatch_url_type.pb.go
@@ -0,0 +1,148 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/policy_topic_evidence_destination_mismatch_url_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible policy topic evidence destination mismatch url types.
+type PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType int32
+
+const (
+	// No value has been specified.
+	PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_UNSPECIFIED PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_UNKNOWN PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType = 1
+	// The display url.
+	PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_DISPLAY_URL PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType = 2
+	// The final url.
+	PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_FINAL_URL PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType = 3
+	// The final mobile url.
+	PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_FINAL_MOBILE_URL PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType = 4
+	// The tracking url template, with substituted desktop url.
+	PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_TRACKING_URL PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType = 5
+	// The tracking url template, with substituted mobile url.
+	PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_MOBILE_TRACKING_URL PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType = 6
+)
+
+var PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DISPLAY_URL",
+	3: "FINAL_URL",
+	4: "FINAL_MOBILE_URL",
+	5: "TRACKING_URL",
+	6: "MOBILE_TRACKING_URL",
+}
+
+var PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"DISPLAY_URL":         2,
+	"FINAL_URL":           3,
+	"FINAL_MOBILE_URL":    4,
+	"TRACKING_URL":        5,
+	"MOBILE_TRACKING_URL": 6,
+}
+
+func (x PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType) String() string {
+	return proto.EnumName(PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType_name, int32(x))
+}
+
+func (PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1fe4244cca06d810, []int{0, 0}
+}
+
+// Container for enum describing possible policy topic evidence destination
+// mismatch url types.
+type PolicyTopicEvidenceDestinationMismatchUrlTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyTopicEvidenceDestinationMismatchUrlTypeEnum) Reset() {
+	*m = PolicyTopicEvidenceDestinationMismatchUrlTypeEnum{}
+}
+func (m *PolicyTopicEvidenceDestinationMismatchUrlTypeEnum) String() string {
+	return proto.CompactTextString(m)
+}
+func (*PolicyTopicEvidenceDestinationMismatchUrlTypeEnum) ProtoMessage() {}
+func (*PolicyTopicEvidenceDestinationMismatchUrlTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1fe4244cca06d810, []int{0}
+}
+
+func (m *PolicyTopicEvidenceDestinationMismatchUrlTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEvidenceDestinationMismatchUrlTypeEnum.Unmarshal(m, b)
+}
+func (m *PolicyTopicEvidenceDestinationMismatchUrlTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEvidenceDestinationMismatchUrlTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEvidenceDestinationMismatchUrlTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEvidenceDestinationMismatchUrlTypeEnum.Merge(m, src)
+}
+func (m *PolicyTopicEvidenceDestinationMismatchUrlTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEvidenceDestinationMismatchUrlTypeEnum.Size(m)
+}
+func (m *PolicyTopicEvidenceDestinationMismatchUrlTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEvidenceDestinationMismatchUrlTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEvidenceDestinationMismatchUrlTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType", PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType_name, PolicyTopicEvidenceDestinationMismatchUrlTypeEnum_PolicyTopicEvidenceDestinationMismatchUrlType_value)
+	proto.RegisterType((*PolicyTopicEvidenceDestinationMismatchUrlTypeEnum)(nil), "google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationMismatchUrlTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/policy_topic_evidence_destination_mismatch_url_type.proto", fileDescriptor_1fe4244cca06d810)
+}
+
+var fileDescriptor_1fe4244cca06d810 = []byte{
+	// 390 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x51, 0xc1, 0xaa, 0x9b, 0x40,
+	0x14, 0xad, 0xa6, 0x4d, 0xe9, 0xa4, 0xa5, 0x62, 0x0b, 0x85, 0xd2, 0x2c, 0x92, 0x7d, 0x47, 0x5a,
+	0x77, 0xd3, 0xd5, 0x98, 0x98, 0x20, 0x31, 0x46, 0x92, 0x98, 0xd0, 0x22, 0x88, 0xd5, 0xc1, 0x0e,
+	0xe8, 0x8c, 0x38, 0x26, 0x90, 0x2f, 0xe8, 0x7f, 0x74, 0xd9, 0x45, 0x3f, 0xa4, 0xdf, 0xf1, 0x56,
+	0xef, 0x2b, 0x1e, 0x8e, 0x26, 0x8f, 0xb7, 0x78, 0x0f, 0xb2, 0x91, 0x73, 0xef, 0xb9, 0xf7, 0x1c,
+	0xe7, 0x5c, 0xb0, 0xcf, 0x38, 0xcf, 0x72, 0x62, 0xc4, 0xa9, 0x30, 0x5a, 0xd8, 0xa0, 0xa3, 0x69,
+	0x10, 0x76, 0x28, 0x84, 0x51, 0xf2, 0x9c, 0x26, 0xa7, 0xa8, 0xe6, 0x25, 0x4d, 0x22, 0x72, 0xa4,
+	0x29, 0x61, 0x09, 0x89, 0x52, 0x22, 0x6a, 0xca, 0xe2, 0x9a, 0x72, 0x16, 0x15, 0x54, 0x14, 0x71,
+	0x9d, 0xfc, 0x8a, 0x0e, 0x55, 0x1e, 0xd5, 0xa7, 0x92, 0xc0, 0xb2, 0xe2, 0x35, 0xd7, 0x87, 0xad,
+	0x1a, 0x8c, 0x53, 0x01, 0x2f, 0xc2, 0xf0, 0x68, 0x42, 0x29, 0xfc, 0xf1, 0xd3, 0xd9, 0xb7, 0xa4,
+	0x46, 0xcc, 0x18, 0xaf, 0xa5, 0x9a, 0x68, 0x97, 0xc7, 0x37, 0x0a, 0xf8, 0xe2, 0x4b, 0xeb, 0x6d,
+	0xe3, 0x6c, 0x77, 0xc6, 0xd3, 0x7b, 0xdf, 0x65, 0x67, 0x1b, 0x54, 0xf9, 0xf6, 0x54, 0x12, 0x9b,
+	0x1d, 0x8a, 0xf1, 0x3f, 0x05, 0x7c, 0xbe, 0x6a, 0x4b, 0x7f, 0x0b, 0x06, 0x81, 0xb7, 0xf1, 0xed,
+	0x89, 0x33, 0x73, 0xec, 0xa9, 0xf6, 0x4c, 0x1f, 0x80, 0x97, 0x81, 0xb7, 0xf0, 0x56, 0x7b, 0x4f,
+	0x53, 0x1a, 0x76, 0xea, 0x6c, 0x7c, 0x17, 0x7f, 0x8f, 0x82, 0xb5, 0xab, 0xa9, 0xfa, 0x1b, 0xf0,
+	0x6a, 0xe6, 0x78, 0xd8, 0x95, 0x65, 0x4f, 0x7f, 0x0f, 0xb4, 0xb6, 0x5c, 0xae, 0x2c, 0xc7, 0xb5,
+	0x65, 0xf7, 0xb9, 0xae, 0x81, 0xd7, 0xdb, 0x35, 0x9e, 0x2c, 0x1c, 0x6f, 0x2e, 0x3b, 0x2f, 0xf4,
+	0x0f, 0xe0, 0x5d, 0x37, 0xf1, 0x80, 0xe8, 0x5b, 0xbf, 0x55, 0x30, 0x4a, 0x78, 0x01, 0x9f, 0x8c,
+	0xca, 0xfa, 0x7a, 0xd5, 0x9b, 0xfc, 0x26, 0x40, 0x5f, 0xf9, 0x61, 0x75, 0xa2, 0x19, 0xcf, 0x63,
+	0x96, 0x41, 0x5e, 0x65, 0x46, 0x46, 0x98, 0x8c, 0xf7, 0x7c, 0xe8, 0x92, 0x8a, 0x47, 0xee, 0xfe,
+	0x4d, 0x7e, 0xff, 0xa8, 0xbd, 0x39, 0xc6, 0x7f, 0xd5, 0xe1, 0xbc, 0x95, 0xc2, 0xa9, 0x80, 0x2d,
+	0x6c, 0xd0, 0xce, 0x84, 0x4d, 0xea, 0xe2, 0xff, 0x99, 0x0f, 0x71, 0x2a, 0xc2, 0x0b, 0x1f, 0xee,
+	0xcc, 0x50, 0xf2, 0xb7, 0xea, 0xa8, 0x6d, 0x22, 0x84, 0x53, 0x81, 0xd0, 0x65, 0x02, 0xa1, 0x9d,
+	0x89, 0x90, 0x9c, 0xf9, 0xd9, 0x97, 0x3f, 0x66, 0xde, 0x05, 0x00, 0x00, 0xff, 0xff, 0x73, 0xb6,
+	0x6d, 0xf9, 0x8f, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_device.pb.go b/googleapis/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_device.pb.go
new file mode 100644
index 0000000..5ce07fb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_device.pb.go
@@ -0,0 +1,137 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_device.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible policy topic evidence destination not working devices.
+type PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice int32
+
+const (
+	// No value has been specified.
+	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_UNSPECIFIED PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_UNKNOWN PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 1
+	// Landing page doesn't work on desktop device.
+	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_DESKTOP PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 2
+	// Landing page doesn't work on Android device.
+	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_ANDROID PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 3
+	// Landing page doesn't work on iOS device.
+	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_IOS PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 4
+)
+
+var PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DESKTOP",
+	3: "ANDROID",
+	4: "IOS",
+}
+
+var PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"DESKTOP":     2,
+	"ANDROID":     3,
+	"IOS":         4,
+}
+
+func (x PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice) String() string {
+	return proto.EnumName(PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_name, int32(x))
+}
+
+func (PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d11a2a3922d7bdc6, []int{0, 0}
+}
+
+// Container for enum describing possible policy topic evidence destination not
+// working devices.
+type PolicyTopicEvidenceDestinationNotWorkingDeviceEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) Reset() {
+	*m = PolicyTopicEvidenceDestinationNotWorkingDeviceEnum{}
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) String() string {
+	return proto.CompactTextString(m)
+}
+func (*PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) ProtoMessage() {}
+func (*PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d11a2a3922d7bdc6, []int{0}
+}
+
+func (m *PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDeviceEnum.Unmarshal(m, b)
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDeviceEnum.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDeviceEnum.Merge(m, src)
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDeviceEnum.Size(m)
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDeviceEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDeviceEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice", PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_name, PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_value)
+	proto.RegisterType((*PolicyTopicEvidenceDestinationNotWorkingDeviceEnum)(nil), "google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_device.proto", fileDescriptor_d11a2a3922d7bdc6)
+}
+
+var fileDescriptor_d11a2a3922d7bdc6 = []byte{
+	// 352 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0x4f, 0x6a, 0xeb, 0x30,
+	0x10, 0xc6, 0x5f, 0x9c, 0xc7, 0x0b, 0x38, 0x8b, 0x67, 0xbc, 0x2c, 0xcd, 0x22, 0x39, 0x80, 0x0c,
+	0xf5, 0x4e, 0x5d, 0x39, 0xb5, 0x1b, 0x4c, 0xc0, 0x36, 0xcd, 0xbf, 0x52, 0x0c, 0xc6, 0xb5, 0x84,
+	0x11, 0x4d, 0x34, 0x6e, 0xa4, 0xb8, 0xf4, 0x06, 0x3d, 0x47, 0x37, 0x85, 0x1e, 0xa5, 0x47, 0xe9,
+	0x29, 0x8a, 0xa4, 0x24, 0x5d, 0xb5, 0x90, 0x8d, 0xf9, 0xc6, 0x33, 0xf3, 0xfd, 0x46, 0x33, 0xf6,
+	0x6d, 0x0d, 0x50, 0xaf, 0xa9, 0x57, 0x12, 0xe1, 0x19, 0xa9, 0x54, 0xeb, 0x7b, 0x94, 0xef, 0x36,
+	0xc2, 0x6b, 0x60, 0xcd, 0xaa, 0xe7, 0x42, 0x42, 0xc3, 0xaa, 0x82, 0xb6, 0x8c, 0x50, 0x5e, 0xd1,
+	0x82, 0x50, 0x21, 0x19, 0x2f, 0x25, 0x03, 0x5e, 0x70, 0x90, 0xc5, 0x13, 0x6c, 0x1f, 0x18, 0xaf,
+	0x0b, 0x42, 0x5b, 0x56, 0x51, 0xd4, 0x6c, 0x41, 0x82, 0x3b, 0x30, 0x76, 0xa8, 0x24, 0x02, 0x1d,
+	0x9d, 0x51, 0xeb, 0x23, 0xed, 0x7c, 0x76, 0x7e, 0x00, 0x37, 0xcc, 0x2b, 0x39, 0x07, 0xa9, 0xed,
+	0x84, 0x69, 0x1e, 0xbd, 0x75, 0xec, 0x8b, 0x4c, 0xb3, 0xe7, 0x0a, 0x1d, 0xed, 0xc9, 0xe1, 0x37,
+	0x38, 0x01, 0xb9, 0x32, 0xd8, 0x50, 0x53, 0x23, 0xbe, 0xdb, 0x8c, 0x1e, 0x6d, 0x74, 0x5a, 0x97,
+	0xfb, 0xdf, 0xee, 0x2f, 0x92, 0x59, 0x16, 0x5d, 0xc5, 0xd7, 0x71, 0x14, 0x3a, 0x7f, 0xdc, 0xbe,
+	0xdd, 0x5b, 0x24, 0xd3, 0x24, 0x5d, 0x25, 0x4e, 0x47, 0x05, 0x61, 0x34, 0x9b, 0xce, 0xd3, 0xcc,
+	0xb1, 0x54, 0x10, 0x24, 0xe1, 0x4d, 0x1a, 0x87, 0x4e, 0xd7, 0xed, 0xd9, 0xdd, 0x38, 0x9d, 0x39,
+	0x7f, 0xc7, 0x2f, 0x96, 0x3d, 0xac, 0x60, 0x83, 0x7e, 0x7d, 0xed, 0xd8, 0x3f, 0x6d, 0xac, 0x4c,
+	0x2d, 0x21, 0xeb, 0xdc, 0x8d, 0xf7, 0xae, 0x35, 0xac, 0x4b, 0x5e, 0x23, 0xd8, 0xd6, 0x5e, 0x4d,
+	0xb9, 0x5e, 0xd1, 0xe1, 0x5a, 0x0d, 0x13, 0x3f, 0x1c, 0xef, 0x52, 0x7f, 0x5f, 0xad, 0xee, 0x24,
+	0x08, 0xde, 0xad, 0xc1, 0xc4, 0x58, 0x05, 0x44, 0x20, 0x23, 0x95, 0x5a, 0xfa, 0x48, 0x2d, 0x4e,
+	0x7c, 0x1c, 0xf2, 0x79, 0x40, 0x44, 0x7e, 0xcc, 0xe7, 0x4b, 0x3f, 0xd7, 0xf9, 0x4f, 0x6b, 0x68,
+	0x7e, 0x62, 0x1c, 0x10, 0x81, 0xf1, 0xb1, 0x02, 0xe3, 0xa5, 0x8f, 0xb1, 0xae, 0xb9, 0xff, 0xa7,
+	0x07, 0xf3, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x32, 0xfc, 0xac, 0x9f, 0x54, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_dns_error_type.pb.go b/googleapis/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_dns_error_type.pb.go
new file mode 100644
index 0000000..6a133fe
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_dns_error_type.pb.go
@@ -0,0 +1,138 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_dns_error_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible policy topic evidence destination not working DNS error types.
+type PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType int32
+
+const (
+	// No value has been specified.
+	PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_UNSPECIFIED PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_UNKNOWN PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType = 1
+	// Host name not found in DNS when fetching landing page.
+	PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_HOSTNAME_NOT_FOUND PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType = 2
+	// Google internal crawler issue when communicating with DNS. This error
+	// doesn't mean the landing page doesn't work. Google will recrawl the
+	// landing page.
+	PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_GOOGLE_CRAWLER_DNS_ISSUE PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType = 3
+)
+
+var PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "HOSTNAME_NOT_FOUND",
+	3: "GOOGLE_CRAWLER_DNS_ISSUE",
+}
+
+var PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"HOSTNAME_NOT_FOUND":       2,
+	"GOOGLE_CRAWLER_DNS_ISSUE": 3,
+}
+
+func (x PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType) String() string {
+	return proto.EnumName(PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType_name, int32(x))
+}
+
+func (PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_773e4ae416a24f1f, []int{0, 0}
+}
+
+// Container for enum describing possible policy topic evidence destination not
+// working DNS error types.
+type PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum) Reset() {
+	*m = PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum{}
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum) String() string {
+	return proto.CompactTextString(m)
+}
+func (*PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum) ProtoMessage() {}
+func (*PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_773e4ae416a24f1f, []int{0}
+}
+
+func (m *PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum.Unmarshal(m, b)
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum.Merge(m, src)
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum.Size(m)
+}
+func (m *PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType", PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType_name, PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum_PolicyTopicEvidenceDestinationNotWorkingDnsErrorType_value)
+	proto.RegisterType((*PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum)(nil), "google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationNotWorkingDnsErrorTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/policy_topic_evidence_destination_not_working_dns_error_type.proto", fileDescriptor_773e4ae416a24f1f)
+}
+
+var fileDescriptor_773e4ae416a24f1f = []byte{
+	// 388 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x91, 0xc1, 0xaa, 0xd3, 0x40,
+	0x18, 0x85, 0x4d, 0x2e, 0x28, 0xcc, 0x5d, 0x18, 0xb2, 0x10, 0x91, 0x7b, 0x17, 0xb7, 0x0f, 0x30,
+	0x59, 0xc4, 0x85, 0x8e, 0xab, 0xb4, 0x99, 0xc6, 0x62, 0x9d, 0x84, 0x26, 0x69, 0x41, 0x02, 0x63,
+	0xcc, 0x0c, 0x61, 0xb0, 0x9d, 0x09, 0x99, 0x69, 0xa5, 0xaf, 0xe0, 0xc2, 0x87, 0x70, 0xe9, 0x8b,
+	0x08, 0x3e, 0x8a, 0x4f, 0x21, 0x99, 0xb4, 0x75, 0xa5, 0x8b, 0x6e, 0xc2, 0x21, 0xff, 0xfc, 0xe7,
+	0x7c, 0x9c, 0x1f, 0x7c, 0x6c, 0x95, 0x6a, 0xb7, 0x3c, 0xa8, 0x99, 0x0e, 0x46, 0x39, 0xa8, 0x43,
+	0x18, 0x70, 0xb9, 0xdf, 0xe9, 0xa0, 0x53, 0x5b, 0xd1, 0x1c, 0xa9, 0x51, 0x9d, 0x68, 0x28, 0x3f,
+	0x08, 0xc6, 0x65, 0xc3, 0x29, 0xe3, 0xda, 0x08, 0x59, 0x1b, 0xa1, 0x24, 0x95, 0xca, 0xd0, 0x2f,
+	0xaa, 0xff, 0x2c, 0x64, 0x4b, 0x99, 0xd4, 0x94, 0xf7, 0xbd, 0xea, 0xa9, 0x39, 0x76, 0x1c, 0x76,
+	0xbd, 0x32, 0xca, 0xbf, 0x1f, 0x6d, 0x61, 0xcd, 0x34, 0xbc, 0x24, 0xc0, 0x43, 0x08, 0x6d, 0xc2,
+	0x8b, 0xbb, 0x33, 0x40, 0x27, 0x82, 0x5a, 0x4a, 0x65, 0xac, 0xad, 0x1e, 0x97, 0x27, 0x3f, 0x1d,
+	0xf0, 0x2a, 0xb3, 0x0c, 0xc5, 0x80, 0x80, 0x4f, 0x04, 0xf1, 0x5f, 0x00, 0xa2, 0xcc, 0x66, 0x8c,
+	0x8f, 0xa5, 0xc6, 0x43, 0x78, 0x71, 0xec, 0x38, 0x96, 0xfb, 0xdd, 0xe4, 0xab, 0x03, 0x5e, 0x5e,
+	0xb3, 0xec, 0x3f, 0x05, 0xb7, 0x25, 0xc9, 0x33, 0x3c, 0x5b, 0xcc, 0x17, 0x38, 0xf6, 0x1e, 0xf9,
+	0xb7, 0xe0, 0x49, 0x49, 0xde, 0x91, 0x74, 0x43, 0x3c, 0xc7, 0x7f, 0x06, 0xfc, 0xb7, 0x69, 0x5e,
+	0x90, 0xe8, 0x3d, 0xa6, 0x24, 0x2d, 0xe8, 0x3c, 0x2d, 0x49, 0xec, 0xb9, 0xfe, 0x1d, 0x78, 0x9e,
+	0xa4, 0x69, 0xb2, 0xc4, 0x74, 0xb6, 0x8a, 0x36, 0x4b, 0xbc, 0xa2, 0x31, 0xc9, 0xe9, 0x22, 0xcf,
+	0x4b, 0xec, 0xdd, 0x4c, 0xbf, 0xb9, 0xe0, 0xa1, 0x51, 0x3b, 0xf8, 0xdf, 0x36, 0xa6, 0xaf, 0xaf,
+	0xe1, 0xcd, 0x86, 0xaa, 0x32, 0xe7, 0xc3, 0xf4, 0xe4, 0xdd, 0xaa, 0x6d, 0x2d, 0x5b, 0xa8, 0xfa,
+	0x36, 0x68, 0xb9, 0xb4, 0x45, 0x9e, 0x6f, 0xdb, 0x09, 0xfd, 0x8f, 0x53, 0xbf, 0xb1, 0xdf, 0xef,
+	0xee, 0x4d, 0x12, 0x45, 0x3f, 0xdc, 0xfb, 0x64, 0xb4, 0x8a, 0x98, 0x86, 0xa3, 0x1c, 0xd4, 0x3a,
+	0x84, 0x43, 0xb1, 0xfa, 0xd7, 0x79, 0x5e, 0x45, 0x4c, 0x57, 0x97, 0x79, 0xb5, 0x0e, 0x2b, 0x3b,
+	0xff, 0xed, 0x3e, 0x8c, 0x3f, 0x11, 0x8a, 0x98, 0x46, 0xe8, 0xf2, 0x02, 0xa1, 0x75, 0x88, 0x90,
+	0x7d, 0xf3, 0xe9, 0xb1, 0x05, 0x0b, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x16, 0x63, 0x89,
+	0x82, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/positive_geo_target_type.pb.go b/googleapis/ads/googleads/v3/enums/positive_geo_target_type.pb.go
new file mode 100644
index 0000000..c735250
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/positive_geo_target_type.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/positive_geo_target_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible positive geo target types.
+type PositiveGeoTargetTypeEnum_PositiveGeoTargetType int32
+
+const (
+	// Not specified.
+	PositiveGeoTargetTypeEnum_UNSPECIFIED PositiveGeoTargetTypeEnum_PositiveGeoTargetType = 0
+	// The value is unknown in this version.
+	PositiveGeoTargetTypeEnum_UNKNOWN PositiveGeoTargetTypeEnum_PositiveGeoTargetType = 1
+	// Specifies that an ad is triggered if the user is in,
+	// or shows interest in, advertiser's targeted locations.
+	PositiveGeoTargetTypeEnum_PRESENCE_OR_INTEREST PositiveGeoTargetTypeEnum_PositiveGeoTargetType = 5
+	// Specifies that an ad is triggered if the user
+	// searches for advertiser's targeted locations.
+	PositiveGeoTargetTypeEnum_SEARCH_INTEREST PositiveGeoTargetTypeEnum_PositiveGeoTargetType = 6
+	// Specifies that an ad is triggered if the user is in
+	// or regularly in advertiser's targeted locations.
+	PositiveGeoTargetTypeEnum_PRESENCE PositiveGeoTargetTypeEnum_PositiveGeoTargetType = 7
+)
+
+var PositiveGeoTargetTypeEnum_PositiveGeoTargetType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	5: "PRESENCE_OR_INTEREST",
+	6: "SEARCH_INTEREST",
+	7: "PRESENCE",
+}
+
+var PositiveGeoTargetTypeEnum_PositiveGeoTargetType_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"PRESENCE_OR_INTEREST": 5,
+	"SEARCH_INTEREST":      6,
+	"PRESENCE":             7,
+}
+
+func (x PositiveGeoTargetTypeEnum_PositiveGeoTargetType) String() string {
+	return proto.EnumName(PositiveGeoTargetTypeEnum_PositiveGeoTargetType_name, int32(x))
+}
+
+func (PositiveGeoTargetTypeEnum_PositiveGeoTargetType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_74e8d47d77af9abc, []int{0, 0}
+}
+
+// Container for enum describing possible positive geo target types.
+type PositiveGeoTargetTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PositiveGeoTargetTypeEnum) Reset()         { *m = PositiveGeoTargetTypeEnum{} }
+func (m *PositiveGeoTargetTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*PositiveGeoTargetTypeEnum) ProtoMessage()    {}
+func (*PositiveGeoTargetTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_74e8d47d77af9abc, []int{0}
+}
+
+func (m *PositiveGeoTargetTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PositiveGeoTargetTypeEnum.Unmarshal(m, b)
+}
+func (m *PositiveGeoTargetTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PositiveGeoTargetTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *PositiveGeoTargetTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PositiveGeoTargetTypeEnum.Merge(m, src)
+}
+func (m *PositiveGeoTargetTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_PositiveGeoTargetTypeEnum.Size(m)
+}
+func (m *PositiveGeoTargetTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PositiveGeoTargetTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PositiveGeoTargetTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PositiveGeoTargetTypeEnum_PositiveGeoTargetType", PositiveGeoTargetTypeEnum_PositiveGeoTargetType_name, PositiveGeoTargetTypeEnum_PositiveGeoTargetType_value)
+	proto.RegisterType((*PositiveGeoTargetTypeEnum)(nil), "google.ads.googleads.v3.enums.PositiveGeoTargetTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/positive_geo_target_type.proto", fileDescriptor_74e8d47d77af9abc)
+}
+
+var fileDescriptor_74e8d47d77af9abc = []byte{
+	// 337 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xdf, 0x4a, 0xf3, 0x30,
+	0x1c, 0xfd, 0xba, 0x0f, 0x37, 0xc9, 0x84, 0x95, 0xaa, 0xa0, 0xc3, 0x5d, 0x6c, 0x0f, 0x90, 0x5e,
+	0xf4, 0x2e, 0x7a, 0xd3, 0xcd, 0x38, 0x87, 0xd0, 0x95, 0xb6, 0x9b, 0x20, 0x85, 0x52, 0x6d, 0x08,
+	0x85, 0x2d, 0x29, 0x4d, 0x36, 0xd8, 0x53, 0xf8, 0x0e, 0x5e, 0xfa, 0x28, 0x3e, 0x8a, 0x37, 0xbe,
+	0x82, 0x34, 0x59, 0xeb, 0xcd, 0xf4, 0x26, 0x1c, 0x72, 0xfe, 0xf0, 0x3b, 0x07, 0xdc, 0x50, 0xce,
+	0xe9, 0x8a, 0xd8, 0x69, 0x26, 0x6c, 0x0d, 0x2b, 0xb4, 0x75, 0x6c, 0xc2, 0x36, 0x6b, 0x61, 0x17,
+	0x5c, 0xe4, 0x32, 0xdf, 0x92, 0x84, 0x12, 0x9e, 0xc8, 0xb4, 0xa4, 0x44, 0x26, 0x72, 0x57, 0x10,
+	0x58, 0x94, 0x5c, 0x72, 0x6b, 0xa0, 0x2d, 0x30, 0xcd, 0x04, 0x6c, 0xdc, 0x70, 0xeb, 0x40, 0xe5,
+	0xee, 0x5f, 0xd5, 0xe1, 0x45, 0x6e, 0xa7, 0x8c, 0x71, 0x99, 0xca, 0x9c, 0x33, 0xa1, 0xcd, 0xa3,
+	0x57, 0x03, 0x5c, 0xfa, 0xfb, 0xfc, 0x29, 0xe1, 0x91, 0x4a, 0x8f, 0x76, 0x05, 0xc1, 0x6c, 0xb3,
+	0x1e, 0x95, 0xe0, 0xfc, 0x20, 0x69, 0xf5, 0x40, 0x77, 0xe1, 0x85, 0x3e, 0x9e, 0xcc, 0xee, 0x66,
+	0xf8, 0xd6, 0xfc, 0x67, 0x75, 0x41, 0x67, 0xe1, 0x3d, 0x78, 0xf3, 0x47, 0xcf, 0x34, 0xac, 0x0b,
+	0x70, 0xe6, 0x07, 0x38, 0xc4, 0xde, 0x04, 0x27, 0xf3, 0x20, 0x99, 0x79, 0x11, 0x0e, 0x70, 0x18,
+	0x99, 0x47, 0xd6, 0x29, 0xe8, 0x85, 0xd8, 0x0d, 0x26, 0xf7, 0x3f, 0x9f, 0x6d, 0xeb, 0x04, 0x1c,
+	0xd7, 0x72, 0xb3, 0x33, 0xfe, 0x32, 0xc0, 0xf0, 0x85, 0xaf, 0xe1, 0x9f, 0xad, 0xc6, 0xfd, 0x83,
+	0x77, 0xf9, 0x55, 0x27, 0xdf, 0x78, 0x1a, 0xef, 0xcd, 0x94, 0xaf, 0x52, 0x46, 0x21, 0x2f, 0xa9,
+	0x4d, 0x09, 0x53, 0x8d, 0xeb, 0x81, 0x8b, 0x5c, 0xfc, 0xb2, 0xf7, 0xb5, 0x7a, 0xdf, 0x5a, 0xff,
+	0xa7, 0xae, 0xfb, 0xde, 0x1a, 0x4c, 0x75, 0x94, 0x9b, 0x09, 0xa8, 0x61, 0x85, 0x96, 0x0e, 0xac,
+	0x06, 0x12, 0x1f, 0x35, 0x1f, 0xbb, 0x99, 0x88, 0x1b, 0x3e, 0x5e, 0x3a, 0xb1, 0xe2, 0x3f, 0x5b,
+	0x43, 0xfd, 0x89, 0x90, 0x9b, 0x09, 0x84, 0x1a, 0x05, 0x42, 0x4b, 0x07, 0x21, 0xa5, 0x79, 0x6e,
+	0xab, 0xc3, 0x9c, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x03, 0xaa, 0xe5, 0x07, 0x02, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/preferred_content_type.pb.go b/googleapis/ads/googleads/v3/enums/preferred_content_type.pb.go
new file mode 100644
index 0000000..0f7d210
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/preferred_content_type.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/preferred_content_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates preferred content criterion type.
+type PreferredContentTypeEnum_PreferredContentType int32
+
+const (
+	// Not specified.
+	PreferredContentTypeEnum_UNSPECIFIED PreferredContentTypeEnum_PreferredContentType = 0
+	// The value is unknown in this version.
+	PreferredContentTypeEnum_UNKNOWN PreferredContentTypeEnum_PreferredContentType = 1
+	// Represents top content on YouTube.
+	PreferredContentTypeEnum_YOUTUBE_TOP_CONTENT PreferredContentTypeEnum_PreferredContentType = 400
+)
+
+var PreferredContentTypeEnum_PreferredContentType_name = map[int32]string{
+	0:   "UNSPECIFIED",
+	1:   "UNKNOWN",
+	400: "YOUTUBE_TOP_CONTENT",
+}
+
+var PreferredContentTypeEnum_PreferredContentType_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"YOUTUBE_TOP_CONTENT": 400,
+}
+
+func (x PreferredContentTypeEnum_PreferredContentType) String() string {
+	return proto.EnumName(PreferredContentTypeEnum_PreferredContentType_name, int32(x))
+}
+
+func (PreferredContentTypeEnum_PreferredContentType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_9fb83cbeec849d46, []int{0, 0}
+}
+
+// Container for enumeration of preferred content criterion type.
+type PreferredContentTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PreferredContentTypeEnum) Reset()         { *m = PreferredContentTypeEnum{} }
+func (m *PreferredContentTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*PreferredContentTypeEnum) ProtoMessage()    {}
+func (*PreferredContentTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9fb83cbeec849d46, []int{0}
+}
+
+func (m *PreferredContentTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PreferredContentTypeEnum.Unmarshal(m, b)
+}
+func (m *PreferredContentTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PreferredContentTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *PreferredContentTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PreferredContentTypeEnum.Merge(m, src)
+}
+func (m *PreferredContentTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_PreferredContentTypeEnum.Size(m)
+}
+func (m *PreferredContentTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PreferredContentTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PreferredContentTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PreferredContentTypeEnum_PreferredContentType", PreferredContentTypeEnum_PreferredContentType_name, PreferredContentTypeEnum_PreferredContentType_value)
+	proto.RegisterType((*PreferredContentTypeEnum)(nil), "google.ads.googleads.v3.enums.PreferredContentTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/preferred_content_type.proto", fileDescriptor_9fb83cbeec849d46)
+}
+
+var fileDescriptor_9fb83cbeec849d46 = []byte{
+	// 314 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0xdd, 0x06, 0x0a, 0xd9, 0xc1, 0x51, 0x3d, 0x4c, 0x71, 0x87, 0xed, 0x01, 0xd2, 0x43,
+	0x6e, 0xf1, 0xd4, 0xce, 0x3a, 0x86, 0x90, 0x16, 0x6c, 0x27, 0x4a, 0xa1, 0xd4, 0x25, 0x86, 0xc9,
+	0x96, 0x84, 0x26, 0x1b, 0xec, 0x2d, 0x7c, 0x06, 0x8f, 0x3e, 0x8a, 0x8f, 0xe2, 0xc1, 0x67, 0x90,
+	0x26, 0xb6, 0xa7, 0xe9, 0xa5, 0x7c, 0xf4, 0xfb, 0xff, 0xbe, 0x7c, 0xff, 0x3f, 0xc0, 0x5c, 0x4a,
+	0xbe, 0x66, 0x7e, 0x49, 0xb5, 0xef, 0x64, 0xad, 0x76, 0xc8, 0x67, 0x62, 0xbb, 0xd1, 0xbe, 0xaa,
+	0xd8, 0x0b, 0xab, 0x2a, 0x46, 0x8b, 0xa5, 0x14, 0x86, 0x09, 0x53, 0x98, 0xbd, 0x62, 0x50, 0x55,
+	0xd2, 0x48, 0x6f, 0xe4, 0x00, 0x58, 0x52, 0x0d, 0x5b, 0x16, 0xee, 0x10, 0xb4, 0xec, 0xe5, 0x55,
+	0x13, 0xad, 0x56, 0x7e, 0x29, 0x84, 0x34, 0xa5, 0x59, 0x49, 0xa1, 0x1d, 0x3c, 0x79, 0x05, 0xc3,
+	0xa4, 0x09, 0x9f, 0xba, 0xec, 0x74, 0xaf, 0x58, 0x24, 0xb6, 0x9b, 0x09, 0x01, 0xe7, 0x87, 0x3c,
+	0xef, 0x14, 0xf4, 0x33, 0x72, 0x9f, 0x44, 0xd3, 0xf9, 0xed, 0x3c, 0xba, 0x19, 0x1c, 0x79, 0x7d,
+	0x70, 0x92, 0x91, 0x3b, 0x12, 0x3f, 0x90, 0x41, 0xc7, 0x1b, 0x82, 0xb3, 0xc7, 0x38, 0x4b, 0xb3,
+	0x30, 0x2a, 0xd2, 0x38, 0x29, 0xa6, 0x31, 0x49, 0x23, 0x92, 0x0e, 0xde, 0x7a, 0xe1, 0x77, 0x07,
+	0x8c, 0x97, 0x72, 0x03, 0xff, 0xed, 0x1b, 0x5e, 0x1c, 0x7a, 0x33, 0xa9, 0xcb, 0x26, 0x9d, 0xa7,
+	0xf0, 0x97, 0xe5, 0x72, 0x5d, 0x0a, 0x0e, 0x65, 0xc5, 0x7d, 0xce, 0x84, 0x5d, 0xa5, 0xb9, 0x9b,
+	0x5a, 0xe9, 0x3f, 0xce, 0x78, 0x6d, 0xbf, 0xef, 0xdd, 0xde, 0x2c, 0x08, 0x3e, 0xba, 0xa3, 0x99,
+	0x8b, 0x0a, 0xa8, 0x86, 0x4e, 0xd6, 0x6a, 0x81, 0x60, 0xbd, 0xbb, 0xfe, 0x6c, 0xfc, 0x3c, 0xa0,
+	0x3a, 0x6f, 0xfd, 0x7c, 0x81, 0x72, 0xeb, 0x7f, 0x75, 0xc7, 0xee, 0x27, 0xc6, 0x01, 0xd5, 0x18,
+	0xb7, 0x13, 0x18, 0x2f, 0x10, 0xc6, 0x76, 0xe6, 0xf9, 0xd8, 0x16, 0x43, 0x3f, 0x01, 0x00, 0x00,
+	0xff, 0xff, 0x20, 0x35, 0x49, 0x46, 0xde, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/price_extension_price_qualifier.pb.go b/googleapis/ads/googleads/v3/enums/price_extension_price_qualifier.pb.go
new file mode 100644
index 0000000..aa25fca
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/price_extension_price_qualifier.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/price_extension_price_qualifier.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enums of price extension price qualifier.
+type PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier int32
+
+const (
+	// Not specified.
+	PriceExtensionPriceQualifierEnum_UNSPECIFIED PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 0
+	// Used for return value only. Represents value unknown in this version.
+	PriceExtensionPriceQualifierEnum_UNKNOWN PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 1
+	// 'From' qualifier for the price.
+	PriceExtensionPriceQualifierEnum_FROM PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 2
+	// 'Up to' qualifier for the price.
+	PriceExtensionPriceQualifierEnum_UP_TO PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 3
+	// 'Average' qualifier for the price.
+	PriceExtensionPriceQualifierEnum_AVERAGE PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 4
+)
+
+var PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "FROM",
+	3: "UP_TO",
+	4: "AVERAGE",
+}
+
+var PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"FROM":        2,
+	"UP_TO":       3,
+	"AVERAGE":     4,
+}
+
+func (x PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier) String() string {
+	return proto.EnumName(PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_name, int32(x))
+}
+
+func (PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fa4a6b7a443225c4, []int{0, 0}
+}
+
+// Container for enum describing a price extension price qualifier.
+type PriceExtensionPriceQualifierEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PriceExtensionPriceQualifierEnum) Reset()         { *m = PriceExtensionPriceQualifierEnum{} }
+func (m *PriceExtensionPriceQualifierEnum) String() string { return proto.CompactTextString(m) }
+func (*PriceExtensionPriceQualifierEnum) ProtoMessage()    {}
+func (*PriceExtensionPriceQualifierEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fa4a6b7a443225c4, []int{0}
+}
+
+func (m *PriceExtensionPriceQualifierEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PriceExtensionPriceQualifierEnum.Unmarshal(m, b)
+}
+func (m *PriceExtensionPriceQualifierEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PriceExtensionPriceQualifierEnum.Marshal(b, m, deterministic)
+}
+func (m *PriceExtensionPriceQualifierEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PriceExtensionPriceQualifierEnum.Merge(m, src)
+}
+func (m *PriceExtensionPriceQualifierEnum) XXX_Size() int {
+	return xxx_messageInfo_PriceExtensionPriceQualifierEnum.Size(m)
+}
+func (m *PriceExtensionPriceQualifierEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PriceExtensionPriceQualifierEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PriceExtensionPriceQualifierEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier", PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_name, PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_value)
+	proto.RegisterType((*PriceExtensionPriceQualifierEnum)(nil), "google.ads.googleads.v3.enums.PriceExtensionPriceQualifierEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/price_extension_price_qualifier.proto", fileDescriptor_fa4a6b7a443225c4)
+}
+
+var fileDescriptor_fa4a6b7a443225c4 = []byte{
+	// 324 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xbb, 0x4e, 0xc3, 0x30,
+	0x14, 0x25, 0x69, 0x79, 0xb9, 0x03, 0x51, 0x46, 0xd4, 0x4a, 0xb4, 0x1f, 0xe0, 0x0c, 0xd9, 0xcc,
+	0xe4, 0x96, 0xb4, 0xaa, 0x10, 0x69, 0x28, 0x34, 0x48, 0x28, 0xa2, 0x32, 0x8d, 0xb1, 0x2c, 0xb5,
+	0x76, 0x88, 0xd3, 0x8a, 0x99, 0x4f, 0x61, 0xe4, 0x53, 0xf8, 0x14, 0x3e, 0x80, 0x19, 0xd9, 0x26,
+	0xdd, 0xc8, 0x62, 0x9d, 0xeb, 0x7b, 0xee, 0xb9, 0xf7, 0x1c, 0x30, 0x62, 0x52, 0xb2, 0x35, 0x0d,
+	0x48, 0xae, 0x02, 0x0b, 0x35, 0xda, 0x85, 0x01, 0x15, 0xdb, 0x8d, 0x0a, 0x8a, 0x92, 0xaf, 0xe8,
+	0x92, 0xbe, 0x55, 0x54, 0x28, 0x2e, 0xc5, 0xd2, 0xd6, 0xaf, 0x5b, 0xb2, 0xe6, 0x2f, 0x9c, 0x96,
+	0xb0, 0x28, 0x65, 0x25, 0xfd, 0x9e, 0x9d, 0x84, 0x24, 0x57, 0x70, 0x2f, 0x02, 0x77, 0x21, 0x34,
+	0x22, 0xe7, 0xdd, 0x7a, 0x47, 0xc1, 0x03, 0x22, 0x84, 0xac, 0x48, 0xc5, 0xa5, 0x50, 0x76, 0x78,
+	0xf0, 0xee, 0x80, 0x8b, 0x44, 0xcb, 0x46, 0xf5, 0x16, 0x53, 0xdd, 0xd6, 0x3b, 0x22, 0xb1, 0xdd,
+	0x0c, 0x9e, 0x40, 0xb7, 0x89, 0xe3, 0x9f, 0x81, 0xce, 0x22, 0xbe, 0x4b, 0xa2, 0xd1, 0x74, 0x3c,
+	0x8d, 0xae, 0xbc, 0x03, 0xbf, 0x03, 0x8e, 0x17, 0xf1, 0x75, 0x3c, 0x7b, 0x88, 0x3d, 0xc7, 0x3f,
+	0x01, 0xed, 0xf1, 0x7c, 0x76, 0xe3, 0xb9, 0xfe, 0x29, 0x38, 0x5c, 0x24, 0xcb, 0xfb, 0x99, 0xd7,
+	0xd2, 0x0c, 0x9c, 0x46, 0x73, 0x3c, 0x89, 0xbc, 0xf6, 0xf0, 0xc7, 0x01, 0xfd, 0x95, 0xdc, 0xc0,
+	0x46, 0x23, 0xc3, 0x7e, 0xd3, 0x0d, 0x89, 0x76, 0x93, 0x38, 0x8f, 0xc3, 0x3f, 0x0d, 0x26, 0xd7,
+	0x44, 0x30, 0x28, 0x4b, 0x16, 0x30, 0x2a, 0x8c, 0xd7, 0x3a, 0xe1, 0x82, 0xab, 0x7f, 0x02, 0xbf,
+	0x34, 0xef, 0x87, 0xdb, 0x9a, 0x60, 0xfc, 0xe9, 0xf6, 0x26, 0x56, 0x0a, 0xe7, 0x0a, 0x5a, 0xa8,
+	0x51, 0x1a, 0x42, 0x9d, 0x89, 0xfa, 0xaa, 0xfb, 0x19, 0xce, 0x55, 0xb6, 0xef, 0x67, 0x69, 0x98,
+	0x99, 0xfe, 0xb7, 0xdb, 0xb7, 0x9f, 0x08, 0xe1, 0x5c, 0x21, 0xb4, 0x67, 0x20, 0x94, 0x86, 0x08,
+	0x19, 0xce, 0xf3, 0x91, 0x39, 0x2c, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x8d, 0x8d, 0xaf,
+	0x08, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/price_extension_price_unit.pb.go b/googleapis/ads/googleads/v3/enums/price_extension_price_unit.pb.go
new file mode 100644
index 0000000..d055e83
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/price_extension_price_unit.pb.go
@@ -0,0 +1,142 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/price_extension_price_unit.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Price extension price unit.
+type PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit int32
+
+const (
+	// Not specified.
+	PriceExtensionPriceUnitEnum_UNSPECIFIED PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit = 0
+	// Used for return value only. Represents value unknown in this version.
+	PriceExtensionPriceUnitEnum_UNKNOWN PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit = 1
+	// Per hour.
+	PriceExtensionPriceUnitEnum_PER_HOUR PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit = 2
+	// Per day.
+	PriceExtensionPriceUnitEnum_PER_DAY PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit = 3
+	// Per week.
+	PriceExtensionPriceUnitEnum_PER_WEEK PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit = 4
+	// Per month.
+	PriceExtensionPriceUnitEnum_PER_MONTH PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit = 5
+	// Per year.
+	PriceExtensionPriceUnitEnum_PER_YEAR PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit = 6
+	// Per night.
+	PriceExtensionPriceUnitEnum_PER_NIGHT PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit = 7
+)
+
+var PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PER_HOUR",
+	3: "PER_DAY",
+	4: "PER_WEEK",
+	5: "PER_MONTH",
+	6: "PER_YEAR",
+	7: "PER_NIGHT",
+}
+
+var PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"PER_HOUR":    2,
+	"PER_DAY":     3,
+	"PER_WEEK":    4,
+	"PER_MONTH":   5,
+	"PER_YEAR":    6,
+	"PER_NIGHT":   7,
+}
+
+func (x PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit) String() string {
+	return proto.EnumName(PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit_name, int32(x))
+}
+
+func (PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_f56842b8a7c3806b, []int{0, 0}
+}
+
+// Container for enum describing price extension price unit.
+type PriceExtensionPriceUnitEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PriceExtensionPriceUnitEnum) Reset()         { *m = PriceExtensionPriceUnitEnum{} }
+func (m *PriceExtensionPriceUnitEnum) String() string { return proto.CompactTextString(m) }
+func (*PriceExtensionPriceUnitEnum) ProtoMessage()    {}
+func (*PriceExtensionPriceUnitEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f56842b8a7c3806b, []int{0}
+}
+
+func (m *PriceExtensionPriceUnitEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PriceExtensionPriceUnitEnum.Unmarshal(m, b)
+}
+func (m *PriceExtensionPriceUnitEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PriceExtensionPriceUnitEnum.Marshal(b, m, deterministic)
+}
+func (m *PriceExtensionPriceUnitEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PriceExtensionPriceUnitEnum.Merge(m, src)
+}
+func (m *PriceExtensionPriceUnitEnum) XXX_Size() int {
+	return xxx_messageInfo_PriceExtensionPriceUnitEnum.Size(m)
+}
+func (m *PriceExtensionPriceUnitEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PriceExtensionPriceUnitEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PriceExtensionPriceUnitEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit", PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit_name, PriceExtensionPriceUnitEnum_PriceExtensionPriceUnit_value)
+	proto.RegisterType((*PriceExtensionPriceUnitEnum)(nil), "google.ads.googleads.v3.enums.PriceExtensionPriceUnitEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/price_extension_price_unit.proto", fileDescriptor_f56842b8a7c3806b)
+}
+
+var fileDescriptor_f56842b8a7c3806b = []byte{
+	// 348 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xc1, 0x4e, 0xc2, 0x30,
+	0x18, 0xc7, 0xdd, 0x50, 0xd0, 0xa2, 0xb1, 0xd9, 0xc5, 0x44, 0xe1, 0x00, 0x0f, 0xd0, 0x1d, 0x76,
+	0xab, 0x89, 0xc9, 0x90, 0x0a, 0x84, 0x38, 0x16, 0x64, 0x10, 0xcc, 0x12, 0x32, 0xd9, 0xb2, 0x34,
+	0x81, 0x76, 0xa1, 0x83, 0xf8, 0x10, 0x3e, 0x85, 0x47, 0xe3, 0x93, 0xf8, 0x28, 0xde, 0x7c, 0x03,
+	0xd3, 0xd6, 0x72, 0xc3, 0xcb, 0xf2, 0xff, 0xef, 0xd7, 0xff, 0xd7, 0x7e, 0xdf, 0x07, 0xee, 0x72,
+	0xce, 0xf3, 0x55, 0xe6, 0x26, 0xa9, 0x70, 0xb5, 0x94, 0x6a, 0xe7, 0xb9, 0x19, 0xdb, 0xae, 0x85,
+	0x5b, 0x6c, 0xe8, 0x32, 0x5b, 0x64, 0xaf, 0x65, 0xc6, 0x04, 0xe5, 0x6c, 0xa1, 0xfd, 0x96, 0xd1,
+	0x12, 0x15, 0x1b, 0x5e, 0x72, 0xa7, 0xa9, 0x43, 0x28, 0x49, 0x05, 0xda, 0xe7, 0xd1, 0xce, 0x43,
+	0x2a, 0x7f, 0xdd, 0x30, 0xe5, 0x0b, 0xea, 0x26, 0x8c, 0xf1, 0x32, 0x29, 0x29, 0x67, 0x42, 0x87,
+	0xdb, 0x9f, 0x16, 0xb8, 0x09, 0x65, 0x45, 0x62, 0x2e, 0x50, 0x2e, 0x62, 0xb4, 0x24, 0x6c, 0xbb,
+	0x6e, 0xbf, 0x59, 0xe0, 0xea, 0x00, 0x77, 0x2e, 0x41, 0x3d, 0x0a, 0x9e, 0x42, 0x72, 0x3f, 0x78,
+	0x18, 0x90, 0x2e, 0x3c, 0x72, 0xea, 0xa0, 0x16, 0x05, 0xc3, 0x60, 0x34, 0x0b, 0xa0, 0xe5, 0x9c,
+	0x83, 0xd3, 0x90, 0x8c, 0x17, 0xfd, 0x51, 0x34, 0x86, 0xb6, 0x44, 0xd2, 0x75, 0xfd, 0x39, 0xac,
+	0x18, 0x34, 0x23, 0x64, 0x08, 0x8f, 0x9d, 0x0b, 0x70, 0x26, 0xdd, 0xe3, 0x28, 0x98, 0xf4, 0xe1,
+	0x89, 0x81, 0x73, 0xe2, 0x8f, 0x61, 0xd5, 0xc0, 0x60, 0xd0, 0xeb, 0x4f, 0x60, 0xad, 0xf3, 0x63,
+	0x81, 0xd6, 0x92, 0xaf, 0xd1, 0xbf, 0x2d, 0x77, 0x1a, 0x07, 0x5e, 0x1c, 0xca, 0x96, 0x43, 0xeb,
+	0xb9, 0xf3, 0x17, 0xcf, 0xf9, 0x2a, 0x61, 0x39, 0xe2, 0x9b, 0xdc, 0xcd, 0x33, 0xa6, 0x06, 0x62,
+	0x36, 0x50, 0x50, 0x71, 0x60, 0x21, 0xb7, 0xea, 0xfb, 0x6e, 0x57, 0x7a, 0xbe, 0xff, 0x61, 0x37,
+	0x7b, 0xba, 0x94, 0x9f, 0x0a, 0xa4, 0xa5, 0x54, 0x53, 0x0f, 0xc9, 0xe9, 0x89, 0x2f, 0xc3, 0x63,
+	0x3f, 0x15, 0xf1, 0x9e, 0xc7, 0x53, 0x2f, 0x56, 0xfc, 0xdb, 0x6e, 0xe9, 0x9f, 0x18, 0xfb, 0xa9,
+	0xc0, 0x78, 0x7f, 0x02, 0xe3, 0xa9, 0x87, 0xb1, 0x3a, 0xf3, 0x52, 0x55, 0x0f, 0xf3, 0x7e, 0x03,
+	0x00, 0x00, 0xff, 0xff, 0x0f, 0x0d, 0x55, 0xd7, 0x28, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/price_extension_type.pb.go b/googleapis/ads/googleads/v3/enums/price_extension_type.pb.go
new file mode 100644
index 0000000..52e2ee2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/price_extension_type.pb.go
@@ -0,0 +1,157 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/price_extension_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Price extension type.
+type PriceExtensionTypeEnum_PriceExtensionType int32
+
+const (
+	// Not specified.
+	PriceExtensionTypeEnum_UNSPECIFIED PriceExtensionTypeEnum_PriceExtensionType = 0
+	// Used for return value only. Represents value unknown in this version.
+	PriceExtensionTypeEnum_UNKNOWN PriceExtensionTypeEnum_PriceExtensionType = 1
+	// The type for showing a list of brands.
+	PriceExtensionTypeEnum_BRANDS PriceExtensionTypeEnum_PriceExtensionType = 2
+	// The type for showing a list of events.
+	PriceExtensionTypeEnum_EVENTS PriceExtensionTypeEnum_PriceExtensionType = 3
+	// The type for showing locations relevant to your business.
+	PriceExtensionTypeEnum_LOCATIONS PriceExtensionTypeEnum_PriceExtensionType = 4
+	// The type for showing sub-regions or districts within a city or region.
+	PriceExtensionTypeEnum_NEIGHBORHOODS PriceExtensionTypeEnum_PriceExtensionType = 5
+	// The type for showing a collection of product categories.
+	PriceExtensionTypeEnum_PRODUCT_CATEGORIES PriceExtensionTypeEnum_PriceExtensionType = 6
+	// The type for showing a collection of related product tiers.
+	PriceExtensionTypeEnum_PRODUCT_TIERS PriceExtensionTypeEnum_PriceExtensionType = 7
+	// The type for showing a collection of services offered by your business.
+	PriceExtensionTypeEnum_SERVICES PriceExtensionTypeEnum_PriceExtensionType = 8
+	// The type for showing a collection of service categories.
+	PriceExtensionTypeEnum_SERVICE_CATEGORIES PriceExtensionTypeEnum_PriceExtensionType = 9
+	// The type for showing a collection of related service tiers.
+	PriceExtensionTypeEnum_SERVICE_TIERS PriceExtensionTypeEnum_PriceExtensionType = 10
+)
+
+var PriceExtensionTypeEnum_PriceExtensionType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "BRANDS",
+	3:  "EVENTS",
+	4:  "LOCATIONS",
+	5:  "NEIGHBORHOODS",
+	6:  "PRODUCT_CATEGORIES",
+	7:  "PRODUCT_TIERS",
+	8:  "SERVICES",
+	9:  "SERVICE_CATEGORIES",
+	10: "SERVICE_TIERS",
+}
+
+var PriceExtensionTypeEnum_PriceExtensionType_value = map[string]int32{
+	"UNSPECIFIED":        0,
+	"UNKNOWN":            1,
+	"BRANDS":             2,
+	"EVENTS":             3,
+	"LOCATIONS":          4,
+	"NEIGHBORHOODS":      5,
+	"PRODUCT_CATEGORIES": 6,
+	"PRODUCT_TIERS":      7,
+	"SERVICES":           8,
+	"SERVICE_CATEGORIES": 9,
+	"SERVICE_TIERS":      10,
+}
+
+func (x PriceExtensionTypeEnum_PriceExtensionType) String() string {
+	return proto.EnumName(PriceExtensionTypeEnum_PriceExtensionType_name, int32(x))
+}
+
+func (PriceExtensionTypeEnum_PriceExtensionType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d28cbae1bf68a407, []int{0, 0}
+}
+
+// Container for enum describing types for a price extension.
+type PriceExtensionTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PriceExtensionTypeEnum) Reset()         { *m = PriceExtensionTypeEnum{} }
+func (m *PriceExtensionTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*PriceExtensionTypeEnum) ProtoMessage()    {}
+func (*PriceExtensionTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d28cbae1bf68a407, []int{0}
+}
+
+func (m *PriceExtensionTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PriceExtensionTypeEnum.Unmarshal(m, b)
+}
+func (m *PriceExtensionTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PriceExtensionTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *PriceExtensionTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PriceExtensionTypeEnum.Merge(m, src)
+}
+func (m *PriceExtensionTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_PriceExtensionTypeEnum.Size(m)
+}
+func (m *PriceExtensionTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PriceExtensionTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PriceExtensionTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PriceExtensionTypeEnum_PriceExtensionType", PriceExtensionTypeEnum_PriceExtensionType_name, PriceExtensionTypeEnum_PriceExtensionType_value)
+	proto.RegisterType((*PriceExtensionTypeEnum)(nil), "google.ads.googleads.v3.enums.PriceExtensionTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/price_extension_type.proto", fileDescriptor_d28cbae1bf68a407)
+}
+
+var fileDescriptor_d28cbae1bf68a407 = []byte{
+	// 394 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x6e, 0xd4, 0x30,
+	0x18, 0x85, 0xc9, 0x14, 0xa6, 0xad, 0x4b, 0x85, 0xf1, 0xa2, 0x48, 0x88, 0x2e, 0xda, 0x03, 0x38,
+	0x8b, 0x6c, 0x90, 0x59, 0x39, 0x89, 0x49, 0x23, 0x90, 0x1d, 0xc5, 0x99, 0x20, 0xa1, 0x48, 0xa3,
+	0xd0, 0x58, 0x51, 0xa4, 0x8e, 0x1d, 0x8d, 0xd3, 0x8a, 0x5e, 0x87, 0x25, 0x47, 0x61, 0xc5, 0x39,
+	0x80, 0x43, 0x20, 0x27, 0xcd, 0x08, 0x69, 0x44, 0x37, 0xd1, 0xcb, 0xff, 0xbf, 0xef, 0x29, 0x79,
+	0x3f, 0x78, 0xdb, 0x1a, 0xd3, 0xde, 0x28, 0xbf, 0x6e, 0xac, 0x3f, 0x49, 0xa7, 0xee, 0x02, 0x5f,
+	0xe9, 0xdb, 0x8d, 0xf5, 0xfb, 0x6d, 0x77, 0xad, 0xd6, 0xea, 0xeb, 0xa0, 0xb4, 0xed, 0x8c, 0x5e,
+	0x0f, 0xf7, 0xbd, 0xc2, 0xfd, 0xd6, 0x0c, 0x06, 0x9d, 0x4f, 0x76, 0x5c, 0x37, 0x16, 0xef, 0x48,
+	0x7c, 0x17, 0xe0, 0x91, 0x7c, 0xfd, 0x66, 0x0e, 0xee, 0x3b, 0xbf, 0xd6, 0xda, 0x0c, 0xf5, 0xd0,
+	0x19, 0x6d, 0x27, 0xf8, 0xf2, 0xb7, 0x07, 0xce, 0x32, 0x97, 0xcd, 0xe6, 0xe8, 0xe2, 0xbe, 0x57,
+	0x4c, 0xdf, 0x6e, 0x2e, 0x7f, 0x7a, 0x00, 0xed, 0xaf, 0xd0, 0x0b, 0x70, 0xb2, 0xe2, 0x32, 0x63,
+	0x51, 0xfa, 0x3e, 0x65, 0x31, 0x7c, 0x82, 0x4e, 0xc0, 0xe1, 0x8a, 0x7f, 0xe0, 0xe2, 0x13, 0x87,
+	0x1e, 0x02, 0x60, 0x19, 0xe6, 0x94, 0xc7, 0x12, 0x2e, 0x9c, 0x66, 0x25, 0xe3, 0x85, 0x84, 0x07,
+	0xe8, 0x14, 0x1c, 0x7f, 0x14, 0x11, 0x2d, 0x52, 0xc1, 0x25, 0x7c, 0x8a, 0x5e, 0x82, 0x53, 0xce,
+	0xd2, 0xe4, 0x2a, 0x14, 0xf9, 0x95, 0x10, 0xb1, 0x84, 0xcf, 0xd0, 0x19, 0x40, 0x59, 0x2e, 0xe2,
+	0x55, 0x54, 0xac, 0x23, 0x5a, 0xb0, 0x44, 0xe4, 0x29, 0x93, 0x70, 0xe9, 0xac, 0xf3, 0xbc, 0x48,
+	0x59, 0x2e, 0xe1, 0x21, 0x7a, 0x0e, 0x8e, 0x24, 0xcb, 0xcb, 0x34, 0x62, 0x12, 0x1e, 0x39, 0xf0,
+	0xe1, 0xed, 0x5f, 0xf0, 0xd8, 0x81, 0xf3, 0x7c, 0x02, 0x41, 0xf8, 0xc7, 0x03, 0x17, 0xd7, 0x66,
+	0x83, 0x1f, 0x6d, 0x2c, 0x7c, 0xb5, 0xff, 0xd7, 0x99, 0x2b, 0x2b, 0xf3, 0x3e, 0x87, 0x0f, 0x64,
+	0x6b, 0x6e, 0x6a, 0xdd, 0x62, 0xb3, 0x6d, 0xfd, 0x56, 0xe9, 0xb1, 0xca, 0xf9, 0x6a, 0x7d, 0x67,
+	0xff, 0x73, 0xc4, 0x77, 0xe3, 0xf3, 0xdb, 0xe2, 0x20, 0xa1, 0xf4, 0xfb, 0xe2, 0x3c, 0x99, 0xa2,
+	0x68, 0x63, 0xf1, 0x24, 0x9d, 0x2a, 0x03, 0xec, 0xca, 0xb7, 0x3f, 0xe6, 0x7d, 0x45, 0x1b, 0x5b,
+	0xed, 0xf6, 0x55, 0x19, 0x54, 0xe3, 0xfe, 0xd7, 0xe2, 0x62, 0x1a, 0x12, 0x42, 0x1b, 0x4b, 0xc8,
+	0xce, 0x41, 0x48, 0x19, 0x10, 0x32, 0x7a, 0xbe, 0x2c, 0xc7, 0x0f, 0x0b, 0xfe, 0x06, 0x00, 0x00,
+	0xff, 0xff, 0x13, 0xf3, 0xb8, 0x7a, 0x5c, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/price_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/price_placeholder_field.pb.go
new file mode 100644
index 0000000..383c395
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/price_placeholder_field.pb.go
@@ -0,0 +1,391 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/price_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Price placeholder fields.
+type PricePlaceholderFieldEnum_PricePlaceholderField int32
+
+const (
+	// Not specified.
+	PricePlaceholderFieldEnum_UNSPECIFIED PricePlaceholderFieldEnum_PricePlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	PricePlaceholderFieldEnum_UNKNOWN PricePlaceholderFieldEnum_PricePlaceholderField = 1
+	// Data Type: STRING. The type of your price feed. Must match one of the
+	// predefined price feed type exactly.
+	PricePlaceholderFieldEnum_TYPE PricePlaceholderFieldEnum_PricePlaceholderField = 2
+	// Data Type: STRING. The qualifier of each price. Must match one of the
+	// predefined price qualifiers exactly.
+	PricePlaceholderFieldEnum_PRICE_QUALIFIER PricePlaceholderFieldEnum_PricePlaceholderField = 3
+	// Data Type: URL. Tracking template for the price feed when using Upgraded
+	// URLs.
+	PricePlaceholderFieldEnum_TRACKING_TEMPLATE PricePlaceholderFieldEnum_PricePlaceholderField = 4
+	// Data Type: STRING. Language of the price feed. Must match one of the
+	// available available locale codes exactly.
+	PricePlaceholderFieldEnum_LANGUAGE PricePlaceholderFieldEnum_PricePlaceholderField = 5
+	// Data Type: STRING. Final URL suffix for the price feed when using
+	// parallel tracking.
+	PricePlaceholderFieldEnum_FINAL_URL_SUFFIX PricePlaceholderFieldEnum_PricePlaceholderField = 6
+	// Data Type: STRING. The header of item 1 of the table.
+	PricePlaceholderFieldEnum_ITEM_1_HEADER PricePlaceholderFieldEnum_PricePlaceholderField = 100
+	// Data Type: STRING. The description of item 1 of the table.
+	PricePlaceholderFieldEnum_ITEM_1_DESCRIPTION PricePlaceholderFieldEnum_PricePlaceholderField = 101
+	// Data Type: MONEY. The price (money with currency) of item 1 of the table,
+	// e.g., 30 USD. The currency must match one of the available currencies.
+	PricePlaceholderFieldEnum_ITEM_1_PRICE PricePlaceholderFieldEnum_PricePlaceholderField = 102
+	// Data Type: STRING. The price unit of item 1 of the table. Must match one
+	// of the predefined price units.
+	PricePlaceholderFieldEnum_ITEM_1_UNIT PricePlaceholderFieldEnum_PricePlaceholderField = 103
+	// Data Type: URL_LIST. The final URLs of item 1 of the table when using
+	// Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_1_FINAL_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 104
+	// Data Type: URL_LIST. The final mobile URLs of item 1 of the table when
+	// using Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_1_FINAL_MOBILE_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 105
+	// Data Type: STRING. The header of item 2 of the table.
+	PricePlaceholderFieldEnum_ITEM_2_HEADER PricePlaceholderFieldEnum_PricePlaceholderField = 200
+	// Data Type: STRING. The description of item 2 of the table.
+	PricePlaceholderFieldEnum_ITEM_2_DESCRIPTION PricePlaceholderFieldEnum_PricePlaceholderField = 201
+	// Data Type: MONEY. The price (money with currency) of item 2 of the table,
+	// e.g., 30 USD. The currency must match one of the available currencies.
+	PricePlaceholderFieldEnum_ITEM_2_PRICE PricePlaceholderFieldEnum_PricePlaceholderField = 202
+	// Data Type: STRING. The price unit of item 2 of the table. Must match one
+	// of the predefined price units.
+	PricePlaceholderFieldEnum_ITEM_2_UNIT PricePlaceholderFieldEnum_PricePlaceholderField = 203
+	// Data Type: URL_LIST. The final URLs of item 2 of the table when using
+	// Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_2_FINAL_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 204
+	// Data Type: URL_LIST. The final mobile URLs of item 2 of the table when
+	// using Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_2_FINAL_MOBILE_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 205
+	// Data Type: STRING. The header of item 3 of the table.
+	PricePlaceholderFieldEnum_ITEM_3_HEADER PricePlaceholderFieldEnum_PricePlaceholderField = 300
+	// Data Type: STRING. The description of item 3 of the table.
+	PricePlaceholderFieldEnum_ITEM_3_DESCRIPTION PricePlaceholderFieldEnum_PricePlaceholderField = 301
+	// Data Type: MONEY. The price (money with currency) of item 3 of the table,
+	// e.g., 30 USD. The currency must match one of the available currencies.
+	PricePlaceholderFieldEnum_ITEM_3_PRICE PricePlaceholderFieldEnum_PricePlaceholderField = 302
+	// Data Type: STRING. The price unit of item 3 of the table. Must match one
+	// of the predefined price units.
+	PricePlaceholderFieldEnum_ITEM_3_UNIT PricePlaceholderFieldEnum_PricePlaceholderField = 303
+	// Data Type: URL_LIST. The final URLs of item 3 of the table when using
+	// Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_3_FINAL_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 304
+	// Data Type: URL_LIST. The final mobile URLs of item 3 of the table when
+	// using Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_3_FINAL_MOBILE_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 305
+	// Data Type: STRING. The header of item 4 of the table.
+	PricePlaceholderFieldEnum_ITEM_4_HEADER PricePlaceholderFieldEnum_PricePlaceholderField = 400
+	// Data Type: STRING. The description of item 4 of the table.
+	PricePlaceholderFieldEnum_ITEM_4_DESCRIPTION PricePlaceholderFieldEnum_PricePlaceholderField = 401
+	// Data Type: MONEY. The price (money with currency) of item 4 of the table,
+	// e.g., 30 USD. The currency must match one of the available currencies.
+	PricePlaceholderFieldEnum_ITEM_4_PRICE PricePlaceholderFieldEnum_PricePlaceholderField = 402
+	// Data Type: STRING. The price unit of item 4 of the table. Must match one
+	// of the predefined price units.
+	PricePlaceholderFieldEnum_ITEM_4_UNIT PricePlaceholderFieldEnum_PricePlaceholderField = 403
+	// Data Type: URL_LIST. The final URLs of item 4 of the table when using
+	// Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_4_FINAL_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 404
+	// Data Type: URL_LIST. The final mobile URLs of item 4 of the table when
+	// using Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_4_FINAL_MOBILE_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 405
+	// Data Type: STRING. The header of item 5 of the table.
+	PricePlaceholderFieldEnum_ITEM_5_HEADER PricePlaceholderFieldEnum_PricePlaceholderField = 500
+	// Data Type: STRING. The description of item 5 of the table.
+	PricePlaceholderFieldEnum_ITEM_5_DESCRIPTION PricePlaceholderFieldEnum_PricePlaceholderField = 501
+	// Data Type: MONEY. The price (money with currency) of item 5 of the table,
+	// e.g., 30 USD. The currency must match one of the available currencies.
+	PricePlaceholderFieldEnum_ITEM_5_PRICE PricePlaceholderFieldEnum_PricePlaceholderField = 502
+	// Data Type: STRING. The price unit of item 5 of the table. Must match one
+	// of the predefined price units.
+	PricePlaceholderFieldEnum_ITEM_5_UNIT PricePlaceholderFieldEnum_PricePlaceholderField = 503
+	// Data Type: URL_LIST. The final URLs of item 5 of the table when using
+	// Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_5_FINAL_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 504
+	// Data Type: URL_LIST. The final mobile URLs of item 5 of the table when
+	// using Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_5_FINAL_MOBILE_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 505
+	// Data Type: STRING. The header of item 6 of the table.
+	PricePlaceholderFieldEnum_ITEM_6_HEADER PricePlaceholderFieldEnum_PricePlaceholderField = 600
+	// Data Type: STRING. The description of item 6 of the table.
+	PricePlaceholderFieldEnum_ITEM_6_DESCRIPTION PricePlaceholderFieldEnum_PricePlaceholderField = 601
+	// Data Type: MONEY. The price (money with currency) of item 6 of the table,
+	// e.g., 30 USD. The currency must match one of the available currencies.
+	PricePlaceholderFieldEnum_ITEM_6_PRICE PricePlaceholderFieldEnum_PricePlaceholderField = 602
+	// Data Type: STRING. The price unit of item 6 of the table. Must match one
+	// of the predefined price units.
+	PricePlaceholderFieldEnum_ITEM_6_UNIT PricePlaceholderFieldEnum_PricePlaceholderField = 603
+	// Data Type: URL_LIST. The final URLs of item 6 of the table when using
+	// Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_6_FINAL_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 604
+	// Data Type: URL_LIST. The final mobile URLs of item 6 of the table when
+	// using Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_6_FINAL_MOBILE_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 605
+	// Data Type: STRING. The header of item 7 of the table.
+	PricePlaceholderFieldEnum_ITEM_7_HEADER PricePlaceholderFieldEnum_PricePlaceholderField = 700
+	// Data Type: STRING. The description of item 7 of the table.
+	PricePlaceholderFieldEnum_ITEM_7_DESCRIPTION PricePlaceholderFieldEnum_PricePlaceholderField = 701
+	// Data Type: MONEY. The price (money with currency) of item 7 of the table,
+	// e.g., 30 USD. The currency must match one of the available currencies.
+	PricePlaceholderFieldEnum_ITEM_7_PRICE PricePlaceholderFieldEnum_PricePlaceholderField = 702
+	// Data Type: STRING. The price unit of item 7 of the table. Must match one
+	// of the predefined price units.
+	PricePlaceholderFieldEnum_ITEM_7_UNIT PricePlaceholderFieldEnum_PricePlaceholderField = 703
+	// Data Type: URL_LIST. The final URLs of item 7 of the table when using
+	// Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_7_FINAL_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 704
+	// Data Type: URL_LIST. The final mobile URLs of item 7 of the table when
+	// using Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_7_FINAL_MOBILE_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 705
+	// Data Type: STRING. The header of item 8 of the table.
+	PricePlaceholderFieldEnum_ITEM_8_HEADER PricePlaceholderFieldEnum_PricePlaceholderField = 800
+	// Data Type: STRING. The description of item 8 of the table.
+	PricePlaceholderFieldEnum_ITEM_8_DESCRIPTION PricePlaceholderFieldEnum_PricePlaceholderField = 801
+	// Data Type: MONEY. The price (money with currency) of item 8 of the table,
+	// e.g., 30 USD. The currency must match one of the available currencies.
+	PricePlaceholderFieldEnum_ITEM_8_PRICE PricePlaceholderFieldEnum_PricePlaceholderField = 802
+	// Data Type: STRING. The price unit of item 8 of the table. Must match one
+	// of the predefined price units.
+	PricePlaceholderFieldEnum_ITEM_8_UNIT PricePlaceholderFieldEnum_PricePlaceholderField = 803
+	// Data Type: URL_LIST. The final URLs of item 8 of the table when using
+	// Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_8_FINAL_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 804
+	// Data Type: URL_LIST. The final mobile URLs of item 8 of the table when
+	// using Upgraded URLs.
+	PricePlaceholderFieldEnum_ITEM_8_FINAL_MOBILE_URLS PricePlaceholderFieldEnum_PricePlaceholderField = 805
+)
+
+var PricePlaceholderFieldEnum_PricePlaceholderField_name = map[int32]string{
+	0:   "UNSPECIFIED",
+	1:   "UNKNOWN",
+	2:   "TYPE",
+	3:   "PRICE_QUALIFIER",
+	4:   "TRACKING_TEMPLATE",
+	5:   "LANGUAGE",
+	6:   "FINAL_URL_SUFFIX",
+	100: "ITEM_1_HEADER",
+	101: "ITEM_1_DESCRIPTION",
+	102: "ITEM_1_PRICE",
+	103: "ITEM_1_UNIT",
+	104: "ITEM_1_FINAL_URLS",
+	105: "ITEM_1_FINAL_MOBILE_URLS",
+	200: "ITEM_2_HEADER",
+	201: "ITEM_2_DESCRIPTION",
+	202: "ITEM_2_PRICE",
+	203: "ITEM_2_UNIT",
+	204: "ITEM_2_FINAL_URLS",
+	205: "ITEM_2_FINAL_MOBILE_URLS",
+	300: "ITEM_3_HEADER",
+	301: "ITEM_3_DESCRIPTION",
+	302: "ITEM_3_PRICE",
+	303: "ITEM_3_UNIT",
+	304: "ITEM_3_FINAL_URLS",
+	305: "ITEM_3_FINAL_MOBILE_URLS",
+	400: "ITEM_4_HEADER",
+	401: "ITEM_4_DESCRIPTION",
+	402: "ITEM_4_PRICE",
+	403: "ITEM_4_UNIT",
+	404: "ITEM_4_FINAL_URLS",
+	405: "ITEM_4_FINAL_MOBILE_URLS",
+	500: "ITEM_5_HEADER",
+	501: "ITEM_5_DESCRIPTION",
+	502: "ITEM_5_PRICE",
+	503: "ITEM_5_UNIT",
+	504: "ITEM_5_FINAL_URLS",
+	505: "ITEM_5_FINAL_MOBILE_URLS",
+	600: "ITEM_6_HEADER",
+	601: "ITEM_6_DESCRIPTION",
+	602: "ITEM_6_PRICE",
+	603: "ITEM_6_UNIT",
+	604: "ITEM_6_FINAL_URLS",
+	605: "ITEM_6_FINAL_MOBILE_URLS",
+	700: "ITEM_7_HEADER",
+	701: "ITEM_7_DESCRIPTION",
+	702: "ITEM_7_PRICE",
+	703: "ITEM_7_UNIT",
+	704: "ITEM_7_FINAL_URLS",
+	705: "ITEM_7_FINAL_MOBILE_URLS",
+	800: "ITEM_8_HEADER",
+	801: "ITEM_8_DESCRIPTION",
+	802: "ITEM_8_PRICE",
+	803: "ITEM_8_UNIT",
+	804: "ITEM_8_FINAL_URLS",
+	805: "ITEM_8_FINAL_MOBILE_URLS",
+}
+
+var PricePlaceholderFieldEnum_PricePlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"TYPE":                     2,
+	"PRICE_QUALIFIER":          3,
+	"TRACKING_TEMPLATE":        4,
+	"LANGUAGE":                 5,
+	"FINAL_URL_SUFFIX":         6,
+	"ITEM_1_HEADER":            100,
+	"ITEM_1_DESCRIPTION":       101,
+	"ITEM_1_PRICE":             102,
+	"ITEM_1_UNIT":              103,
+	"ITEM_1_FINAL_URLS":        104,
+	"ITEM_1_FINAL_MOBILE_URLS": 105,
+	"ITEM_2_HEADER":            200,
+	"ITEM_2_DESCRIPTION":       201,
+	"ITEM_2_PRICE":             202,
+	"ITEM_2_UNIT":              203,
+	"ITEM_2_FINAL_URLS":        204,
+	"ITEM_2_FINAL_MOBILE_URLS": 205,
+	"ITEM_3_HEADER":            300,
+	"ITEM_3_DESCRIPTION":       301,
+	"ITEM_3_PRICE":             302,
+	"ITEM_3_UNIT":              303,
+	"ITEM_3_FINAL_URLS":        304,
+	"ITEM_3_FINAL_MOBILE_URLS": 305,
+	"ITEM_4_HEADER":            400,
+	"ITEM_4_DESCRIPTION":       401,
+	"ITEM_4_PRICE":             402,
+	"ITEM_4_UNIT":              403,
+	"ITEM_4_FINAL_URLS":        404,
+	"ITEM_4_FINAL_MOBILE_URLS": 405,
+	"ITEM_5_HEADER":            500,
+	"ITEM_5_DESCRIPTION":       501,
+	"ITEM_5_PRICE":             502,
+	"ITEM_5_UNIT":              503,
+	"ITEM_5_FINAL_URLS":        504,
+	"ITEM_5_FINAL_MOBILE_URLS": 505,
+	"ITEM_6_HEADER":            600,
+	"ITEM_6_DESCRIPTION":       601,
+	"ITEM_6_PRICE":             602,
+	"ITEM_6_UNIT":              603,
+	"ITEM_6_FINAL_URLS":        604,
+	"ITEM_6_FINAL_MOBILE_URLS": 605,
+	"ITEM_7_HEADER":            700,
+	"ITEM_7_DESCRIPTION":       701,
+	"ITEM_7_PRICE":             702,
+	"ITEM_7_UNIT":              703,
+	"ITEM_7_FINAL_URLS":        704,
+	"ITEM_7_FINAL_MOBILE_URLS": 705,
+	"ITEM_8_HEADER":            800,
+	"ITEM_8_DESCRIPTION":       801,
+	"ITEM_8_PRICE":             802,
+	"ITEM_8_UNIT":              803,
+	"ITEM_8_FINAL_URLS":        804,
+	"ITEM_8_FINAL_MOBILE_URLS": 805,
+}
+
+func (x PricePlaceholderFieldEnum_PricePlaceholderField) String() string {
+	return proto.EnumName(PricePlaceholderFieldEnum_PricePlaceholderField_name, int32(x))
+}
+
+func (PricePlaceholderFieldEnum_PricePlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_4bcb1bf31a53d818, []int{0, 0}
+}
+
+// Values for Price placeholder fields.
+type PricePlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PricePlaceholderFieldEnum) Reset()         { *m = PricePlaceholderFieldEnum{} }
+func (m *PricePlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*PricePlaceholderFieldEnum) ProtoMessage()    {}
+func (*PricePlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4bcb1bf31a53d818, []int{0}
+}
+
+func (m *PricePlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PricePlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *PricePlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PricePlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *PricePlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PricePlaceholderFieldEnum.Merge(m, src)
+}
+func (m *PricePlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_PricePlaceholderFieldEnum.Size(m)
+}
+func (m *PricePlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PricePlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PricePlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PricePlaceholderFieldEnum_PricePlaceholderField", PricePlaceholderFieldEnum_PricePlaceholderField_name, PricePlaceholderFieldEnum_PricePlaceholderField_value)
+	proto.RegisterType((*PricePlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.PricePlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/price_placeholder_field.proto", fileDescriptor_4bcb1bf31a53d818)
+}
+
+var fileDescriptor_4bcb1bf31a53d818 = []byte{
+	// 728 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0xd4, 0x49, 0x6f, 0xd3, 0x50,
+	0x10, 0x07, 0x70, 0xbc, 0xc4, 0xb4, 0xaf, 0x45, 0x7d, 0x7d, 0xd0, 0x02, 0x55, 0x7b, 0x68, 0x3f,
+	0x80, 0x23, 0xe2, 0x6c, 0x72, 0x4f, 0x4e, 0xea, 0x04, 0xab, 0xa9, 0x6b, 0xb2, 0x94, 0x45, 0x91,
+	0xac, 0x50, 0xbb, 0x69, 0xa4, 0x34, 0x8e, 0xe2, 0xb6, 0x9f, 0x83, 0xf5, 0x0e, 0x05, 0x2e, 0x88,
+	0xf5, 0xce, 0x7a, 0x83, 0x02, 0x07, 0x6e, 0xac, 0x5f, 0x80, 0x4b, 0x2f, 0xac, 0x37, 0xe4, 0xf8,
+	0x79, 0x12, 0x4b, 0x86, 0x8b, 0x35, 0x9a, 0x79, 0x33, 0xfe, 0x9d, 0xfe, 0x68, 0xb1, 0xe9, 0x38,
+	0xcd, 0xb6, 0x1d, 0x6f, 0x58, 0x6e, 0xdc, 0x2f, 0xbd, 0x6a, 0x57, 0x8a, 0xdb, 0x9d, 0x9d, 0x2d,
+	0x37, 0xde, 0xed, 0xb5, 0xd6, 0x6d, 0xb3, 0xdb, 0x6e, 0xac, 0xdb, 0x9b, 0x4e, 0xdb, 0xb2, 0x7b,
+	0xe6, 0x46, 0xcb, 0x6e, 0x5b, 0x62, 0xb7, 0xe7, 0x6c, 0x3b, 0x64, 0xce, 0xdf, 0x10, 0x1b, 0x96,
+	0x2b, 0xc2, 0xb2, 0xb8, 0x2b, 0x89, 0xfd, 0xe5, 0x99, 0xd9, 0xe0, 0x76, 0xb7, 0x15, 0x6f, 0x74,
+	0x3a, 0xce, 0x76, 0x63, 0xbb, 0xe5, 0x74, 0x5c, 0x7f, 0x79, 0xe1, 0x60, 0x14, 0x9d, 0x34, 0xbc,
+	0xf3, 0xc6, 0xe0, 0x7a, 0xc1, 0x3b, 0xae, 0x76, 0x76, 0xb6, 0x16, 0xde, 0x8f, 0xa2, 0xa9, 0xc8,
+	0x29, 0x99, 0x40, 0x63, 0x35, 0xbd, 0x62, 0xa8, 0x79, 0xad, 0xa0, 0xa9, 0x4b, 0xf8, 0x10, 0x19,
+	0x43, 0x87, 0x6b, 0xfa, 0xb2, 0xbe, 0x7a, 0x56, 0xc7, 0x0c, 0x19, 0x41, 0x7c, 0xf5, 0xbc, 0xa1,
+	0x62, 0x96, 0x1c, 0x45, 0x13, 0x46, 0x59, 0xcb, 0xab, 0xe6, 0x99, 0x9a, 0x52, 0xf2, 0xde, 0x96,
+	0x31, 0x47, 0xa6, 0xd0, 0x64, 0xb5, 0xac, 0xe4, 0x97, 0x35, 0xbd, 0x68, 0x56, 0xd5, 0x15, 0xa3,
+	0xa4, 0x54, 0x55, 0xcc, 0x93, 0x71, 0x34, 0x52, 0x52, 0xf4, 0x62, 0x4d, 0x29, 0xaa, 0x38, 0x46,
+	0x8e, 0x21, 0x5c, 0xd0, 0x74, 0xa5, 0x64, 0xd6, 0xca, 0x25, 0xb3, 0x52, 0x2b, 0x14, 0xb4, 0x73,
+	0x58, 0x20, 0x93, 0xe8, 0x88, 0x56, 0x55, 0x57, 0xcc, 0x53, 0xe6, 0x69, 0x55, 0x59, 0x52, 0xcb,
+	0xd8, 0x22, 0xd3, 0x88, 0xd0, 0xd6, 0x92, 0x5a, 0xc9, 0x97, 0x35, 0xa3, 0xaa, 0xad, 0xea, 0xd8,
+	0x26, 0x18, 0x8d, 0xd3, 0x7e, 0x5f, 0x80, 0x37, 0x3c, 0x34, 0xed, 0xd4, 0x74, 0xad, 0x8a, 0x9b,
+	0x1e, 0x84, 0x36, 0xe0, 0x57, 0x15, 0xbc, 0x49, 0x66, 0xd1, 0x89, 0x50, 0x7b, 0x65, 0x35, 0xa7,
+	0x95, 0x54, 0x7f, 0xda, 0x22, 0x84, 0x12, 0x12, 0x01, 0xe1, 0x15, 0x43, 0x8e, 0x53, 0x43, 0x22,
+	0x64, 0x78, 0xcd, 0x90, 0x49, 0x8a, 0x48, 0x50, 0xc4, 0x3e, 0x43, 0x30, 0x55, 0x24, 0x7c, 0xc5,
+	0x1b, 0x86, 0x4c, 0x53, 0x46, 0x62, 0x98, 0xf1, 0x96, 0x21, 0x73, 0xd4, 0x91, 0x88, 0x70, 0xbc,
+	0x63, 0x00, 0x22, 0x05, 0x90, 0x7b, 0x2c, 0x40, 0xa4, 0x10, 0xe4, 0x3e, 0x0b, 0x10, 0x89, 0x42,
+	0x1e, 0xb0, 0x00, 0x91, 0x7c, 0xc8, 0x43, 0x16, 0x20, 0xd2, 0x30, 0xe4, 0x11, 0x0b, 0x10, 0x29,
+	0x02, 0xf2, 0x98, 0x05, 0x48, 0x32, 0x80, 0x5c, 0xe2, 0x00, 0x92, 0x0c, 0x41, 0x2e, 0x73, 0x00,
+	0x49, 0x52, 0xc8, 0x15, 0x0e, 0x20, 0x49, 0x1f, 0x72, 0x95, 0x03, 0x48, 0x72, 0x18, 0x72, 0x8d,
+	0x03, 0x48, 0x32, 0x02, 0x72, 0x9d, 0x03, 0x48, 0x2a, 0x80, 0x7c, 0x1f, 0x40, 0x52, 0x21, 0xc8,
+	0x8f, 0x01, 0x24, 0x45, 0x21, 0x3f, 0x07, 0x90, 0x94, 0x0f, 0xf9, 0x35, 0x80, 0xa4, 0x86, 0x21,
+	0xbf, 0x07, 0x90, 0x54, 0x04, 0xe4, 0xcf, 0x00, 0x92, 0x0e, 0x20, 0x1f, 0x78, 0x80, 0xa4, 0x43,
+	0x90, 0x8f, 0x3c, 0x40, 0xd2, 0x14, 0xf2, 0x89, 0x07, 0x48, 0xda, 0x87, 0x7c, 0xe6, 0x01, 0x92,
+	0x1e, 0x86, 0x7c, 0xe1, 0x01, 0x92, 0x8e, 0x80, 0x7c, 0xe5, 0x01, 0x92, 0x09, 0x20, 0x4f, 0x62,
+	0x00, 0xc9, 0x84, 0x20, 0x4f, 0x63, 0x00, 0xc9, 0x50, 0xc8, 0xb3, 0x18, 0x40, 0x32, 0x3e, 0xe4,
+	0x79, 0x0c, 0x20, 0x99, 0x61, 0xc8, 0x8b, 0x18, 0x40, 0x32, 0x11, 0x90, 0x97, 0x31, 0x80, 0x64,
+	0x03, 0xc8, 0x0d, 0x01, 0x20, 0xd9, 0x10, 0xe4, 0xa6, 0x00, 0x90, 0x2c, 0x85, 0xec, 0x09, 0x00,
+	0xc9, 0xfa, 0x90, 0x5b, 0x02, 0x40, 0xb2, 0xc3, 0x90, 0xdb, 0x02, 0x40, 0xb2, 0x11, 0x90, 0x3b,
+	0x42, 0xee, 0x80, 0x41, 0xf3, 0xeb, 0xce, 0x96, 0xf8, 0xdf, 0xd4, 0xcc, 0xcd, 0x44, 0xc6, 0x9e,
+	0xe1, 0x65, 0xa6, 0xc1, 0x5c, 0xc8, 0xd1, 0xe5, 0xa6, 0xd3, 0x6e, 0x74, 0x9a, 0xa2, 0xd3, 0x6b,
+	0xc6, 0x9b, 0x76, 0xa7, 0x9f, 0xa8, 0x41, 0x7e, 0x77, 0x5b, 0xee, 0x3f, 0xe2, 0x7c, 0xb1, 0xff,
+	0xdd, 0x63, 0xb9, 0xa2, 0xa2, 0xdc, 0x65, 0xe7, 0x8a, 0xfe, 0x29, 0xc5, 0x72, 0x45, 0xbf, 0xf4,
+	0xaa, 0x35, 0x49, 0xf4, 0x02, 0xd8, 0xdd, 0x0f, 0xe6, 0x75, 0xc5, 0x72, 0xeb, 0x30, 0xaf, 0xaf,
+	0x49, 0xf5, 0xfe, 0xfc, 0x1b, 0x3b, 0xef, 0x37, 0x65, 0x59, 0xb1, 0x5c, 0x59, 0x86, 0x17, 0xb2,
+	0xbc, 0x26, 0xc9, 0x72, 0xff, 0xcd, 0x45, 0xa1, 0x0f, 0x93, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff,
+	0x7b, 0x39, 0x81, 0xe3, 0x66, 0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/product_bidding_category_level.pb.go b/googleapis/ads/googleads/v3/enums/product_bidding_category_level.pb.go
new file mode 100644
index 0000000..be843dd
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/product_bidding_category_level.pb.go
@@ -0,0 +1,137 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/product_bidding_category_level.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the level of the product bidding category.
+type ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel int32
+
+const (
+	// Not specified.
+	ProductBiddingCategoryLevelEnum_UNSPECIFIED ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 0
+	// Used for return value only. Represents value unknown in this version.
+	ProductBiddingCategoryLevelEnum_UNKNOWN ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 1
+	// Level 1.
+	ProductBiddingCategoryLevelEnum_LEVEL1 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 2
+	// Level 2.
+	ProductBiddingCategoryLevelEnum_LEVEL2 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 3
+	// Level 3.
+	ProductBiddingCategoryLevelEnum_LEVEL3 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 4
+	// Level 4.
+	ProductBiddingCategoryLevelEnum_LEVEL4 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 5
+	// Level 5.
+	ProductBiddingCategoryLevelEnum_LEVEL5 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 6
+)
+
+var ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "LEVEL1",
+	3: "LEVEL2",
+	4: "LEVEL3",
+	5: "LEVEL4",
+	6: "LEVEL5",
+}
+
+var ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"LEVEL1":      2,
+	"LEVEL2":      3,
+	"LEVEL3":      4,
+	"LEVEL4":      5,
+	"LEVEL5":      6,
+}
+
+func (x ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel) String() string {
+	return proto.EnumName(ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel_name, int32(x))
+}
+
+func (ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_086360d475e60285, []int{0, 0}
+}
+
+// Level of a product bidding category.
+type ProductBiddingCategoryLevelEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProductBiddingCategoryLevelEnum) Reset()         { *m = ProductBiddingCategoryLevelEnum{} }
+func (m *ProductBiddingCategoryLevelEnum) String() string { return proto.CompactTextString(m) }
+func (*ProductBiddingCategoryLevelEnum) ProtoMessage()    {}
+func (*ProductBiddingCategoryLevelEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_086360d475e60285, []int{0}
+}
+
+func (m *ProductBiddingCategoryLevelEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductBiddingCategoryLevelEnum.Unmarshal(m, b)
+}
+func (m *ProductBiddingCategoryLevelEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductBiddingCategoryLevelEnum.Marshal(b, m, deterministic)
+}
+func (m *ProductBiddingCategoryLevelEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductBiddingCategoryLevelEnum.Merge(m, src)
+}
+func (m *ProductBiddingCategoryLevelEnum) XXX_Size() int {
+	return xxx_messageInfo_ProductBiddingCategoryLevelEnum.Size(m)
+}
+func (m *ProductBiddingCategoryLevelEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductBiddingCategoryLevelEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductBiddingCategoryLevelEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel", ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel_name, ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel_value)
+	proto.RegisterType((*ProductBiddingCategoryLevelEnum)(nil), "google.ads.googleads.v3.enums.ProductBiddingCategoryLevelEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/product_bidding_category_level.proto", fileDescriptor_086360d475e60285)
+}
+
+var fileDescriptor_086360d475e60285 = []byte{
+	// 327 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x4b, 0xc3, 0x30,
+	0x14, 0xc7, 0x6d, 0xa7, 0x13, 0xb2, 0x83, 0xa1, 0x47, 0x75, 0xe8, 0xf6, 0x01, 0x52, 0x34, 0x7a,
+	0x89, 0xa7, 0x76, 0xd6, 0x31, 0x1c, 0xb5, 0x20, 0xab, 0x20, 0x85, 0xd1, 0x2d, 0x21, 0x14, 0xba,
+	0xa4, 0x34, 0xdd, 0xc4, 0xaf, 0xe2, 0xd1, 0xa3, 0x1f, 0xc5, 0x8f, 0xe2, 0xdd, 0xbb, 0x34, 0xd9,
+	0x72, 0x73, 0x97, 0xf2, 0xa3, 0xef, 0xbd, 0xff, 0xff, 0xbd, 0x7f, 0x40, 0xc8, 0xa5, 0xe4, 0x25,
+	0xf3, 0x73, 0xaa, 0x7c, 0x83, 0x2d, 0x6d, 0xb0, 0xcf, 0xc4, 0x7a, 0xa5, 0xfc, 0xaa, 0x96, 0x74,
+	0xbd, 0x6c, 0xe6, 0x8b, 0x82, 0xd2, 0x42, 0xf0, 0xf9, 0x32, 0x6f, 0x18, 0x97, 0xf5, 0xfb, 0xbc,
+	0x64, 0x1b, 0x56, 0xa2, 0xaa, 0x96, 0x8d, 0xf4, 0xfa, 0x66, 0x10, 0xe5, 0x54, 0x21, 0xab, 0x81,
+	0x36, 0x18, 0x69, 0x8d, 0xd3, 0xf3, 0x9d, 0x45, 0x55, 0xf8, 0xb9, 0x10, 0xb2, 0xc9, 0x9b, 0x42,
+	0x0a, 0x65, 0x86, 0x87, 0x1f, 0x0e, 0xb8, 0x48, 0x8c, 0x4b, 0x68, 0x4c, 0x46, 0x5b, 0x8f, 0x69,
+	0x6b, 0x11, 0x89, 0xf5, 0x6a, 0xf8, 0x06, 0xce, 0xf6, 0xb4, 0x78, 0x27, 0xa0, 0x37, 0x8b, 0x9f,
+	0x93, 0x68, 0x34, 0x79, 0x98, 0x44, 0xf7, 0xf0, 0xc0, 0xeb, 0x81, 0xe3, 0x59, 0xfc, 0x18, 0x3f,
+	0xbd, 0xc4, 0xd0, 0xf1, 0x00, 0xe8, 0x4e, 0xa3, 0x34, 0x9a, 0x5e, 0x41, 0xd7, 0xf2, 0x35, 0xec,
+	0x58, 0xc6, 0xf0, 0xd0, 0xf2, 0x0d, 0x3c, 0xb2, 0x7c, 0x0b, 0xbb, 0xe1, 0xaf, 0x03, 0x06, 0x4b,
+	0xb9, 0x42, 0x7b, 0x0f, 0x0c, 0x2f, 0xf7, 0x2c, 0x97, 0xb4, 0x47, 0x26, 0xce, 0xeb, 0x36, 0x67,
+	0xc4, 0x65, 0x99, 0x0b, 0x8e, 0x64, 0xcd, 0x7d, 0xce, 0x84, 0x8e, 0x60, 0x97, 0x7b, 0x55, 0xa8,
+	0x7f, 0x9e, 0xe1, 0x4e, 0x7f, 0x3f, 0xdd, 0xce, 0x38, 0x08, 0xbe, 0xdc, 0xfe, 0xd8, 0x48, 0x05,
+	0x54, 0x21, 0x83, 0x2d, 0xa5, 0x18, 0xb5, 0x59, 0xa9, 0xef, 0x5d, 0x3d, 0x0b, 0xa8, 0xca, 0x6c,
+	0x3d, 0x4b, 0x71, 0xa6, 0xeb, 0x3f, 0xee, 0xc0, 0xfc, 0x24, 0x24, 0xa0, 0x8a, 0x10, 0xdb, 0x41,
+	0x48, 0x8a, 0x09, 0xd1, 0x3d, 0x8b, 0xae, 0x5e, 0x0c, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x44,
+	0x4a, 0x86, 0xb8, 0x1e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/product_bidding_category_status.pb.go b/googleapis/ads/googleads/v3/enums/product_bidding_category_status.pb.go
new file mode 100644
index 0000000..8e16964
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/product_bidding_category_status.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/product_bidding_category_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the status of the product bidding category.
+type ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus int32
+
+const (
+	// Not specified.
+	ProductBiddingCategoryStatusEnum_UNSPECIFIED ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	ProductBiddingCategoryStatusEnum_UNKNOWN ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus = 1
+	// The category is active and can be used for bidding.
+	ProductBiddingCategoryStatusEnum_ACTIVE ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus = 2
+	// The category is obsolete. Used only for reporting purposes.
+	ProductBiddingCategoryStatusEnum_OBSOLETE ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus = 3
+)
+
+var ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ACTIVE",
+	3: "OBSOLETE",
+}
+
+var ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ACTIVE":      2,
+	"OBSOLETE":    3,
+}
+
+func (x ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus) String() string {
+	return proto.EnumName(ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus_name, int32(x))
+}
+
+func (ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a3fa627f0e7cbddb, []int{0, 0}
+}
+
+// Status of the product bidding category.
+type ProductBiddingCategoryStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProductBiddingCategoryStatusEnum) Reset()         { *m = ProductBiddingCategoryStatusEnum{} }
+func (m *ProductBiddingCategoryStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*ProductBiddingCategoryStatusEnum) ProtoMessage()    {}
+func (*ProductBiddingCategoryStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a3fa627f0e7cbddb, []int{0}
+}
+
+func (m *ProductBiddingCategoryStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductBiddingCategoryStatusEnum.Unmarshal(m, b)
+}
+func (m *ProductBiddingCategoryStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductBiddingCategoryStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *ProductBiddingCategoryStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductBiddingCategoryStatusEnum.Merge(m, src)
+}
+func (m *ProductBiddingCategoryStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_ProductBiddingCategoryStatusEnum.Size(m)
+}
+func (m *ProductBiddingCategoryStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductBiddingCategoryStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductBiddingCategoryStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus", ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus_name, ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus_value)
+	proto.RegisterType((*ProductBiddingCategoryStatusEnum)(nil), "google.ads.googleads.v3.enums.ProductBiddingCategoryStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/product_bidding_category_status.proto", fileDescriptor_a3fa627f0e7cbddb)
+}
+
+var fileDescriptor_a3fa627f0e7cbddb = []byte{
+	// 320 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x6a, 0xf3, 0x30,
+	0x10, 0x85, 0xff, 0x38, 0x90, 0xbf, 0x28, 0x85, 0x1a, 0x2f, 0x4b, 0x02, 0x4d, 0x0e, 0x20, 0x2f,
+	0xb4, 0x53, 0x57, 0xb2, 0xab, 0x86, 0xd0, 0xe2, 0x18, 0x92, 0xb8, 0x50, 0x0c, 0x41, 0x89, 0x8c,
+	0x30, 0x24, 0x92, 0xb1, 0xe4, 0x40, 0x7b, 0x9c, 0x2e, 0x7b, 0x94, 0x1e, 0xa5, 0x07, 0xe8, 0xba,
+	0x58, 0x4a, 0xb2, 0xab, 0x37, 0xe2, 0xa1, 0x99, 0x79, 0xdf, 0xcc, 0x03, 0xb1, 0x50, 0x4a, 0xec,
+	0x8b, 0x90, 0x71, 0x1d, 0x3a, 0xd9, 0xaa, 0x23, 0x0a, 0x0b, 0xd9, 0x1c, 0x74, 0x58, 0xd5, 0x8a,
+	0x37, 0x3b, 0xb3, 0xd9, 0x96, 0x9c, 0x97, 0x52, 0x6c, 0x76, 0xcc, 0x14, 0x42, 0xd5, 0x6f, 0x1b,
+	0x6d, 0x98, 0x69, 0x34, 0xac, 0x6a, 0x65, 0x54, 0x30, 0x76, 0x93, 0x90, 0x71, 0x0d, 0x2f, 0x26,
+	0xf0, 0x88, 0xa0, 0x35, 0xb9, 0x1d, 0x9d, 0x19, 0x55, 0x19, 0x32, 0x29, 0x95, 0x61, 0xa6, 0x54,
+	0xf2, 0x34, 0x3c, 0x7d, 0x07, 0x77, 0xa9, 0xa3, 0x44, 0x0e, 0x12, 0x9f, 0x18, 0x4b, 0x8b, 0xa0,
+	0xb2, 0x39, 0x4c, 0x33, 0x30, 0xea, 0xea, 0x09, 0x6e, 0xc0, 0x70, 0x9d, 0x2c, 0x53, 0x1a, 0xcf,
+	0x1f, 0xe7, 0xf4, 0xc1, 0xff, 0x17, 0x0c, 0xc1, 0xff, 0x75, 0xf2, 0x94, 0x2c, 0x5e, 0x12, 0xbf,
+	0x17, 0x00, 0x30, 0x20, 0xf1, 0x6a, 0x9e, 0x51, 0xdf, 0x0b, 0xae, 0xc1, 0xd5, 0x22, 0x5a, 0x2e,
+	0x9e, 0xe9, 0x8a, 0xfa, 0xfd, 0xe8, 0xa7, 0x07, 0x26, 0x3b, 0x75, 0x80, 0x9d, 0xfb, 0x47, 0x93,
+	0x2e, 0x76, 0xda, 0x1e, 0x91, 0xf6, 0x5e, 0xa3, 0x93, 0x87, 0x50, 0x7b, 0x26, 0x05, 0x54, 0xb5,
+	0x08, 0x45, 0x21, 0xed, 0x89, 0xe7, 0x60, 0xab, 0x52, 0xff, 0x91, 0xf3, 0xbd, 0x7d, 0x3f, 0xbc,
+	0xfe, 0x8c, 0x90, 0x4f, 0x6f, 0x3c, 0x73, 0x56, 0x84, 0x6b, 0xe8, 0x64, 0xab, 0x32, 0x04, 0xdb,
+	0x2c, 0xf4, 0xd7, 0xb9, 0x9e, 0x13, 0xae, 0xf3, 0x4b, 0x3d, 0xcf, 0x50, 0x6e, 0xeb, 0xdf, 0xde,
+	0xc4, 0x7d, 0x62, 0x4c, 0xb8, 0xc6, 0xf8, 0xd2, 0x81, 0x71, 0x86, 0x30, 0xb6, 0x3d, 0xdb, 0x81,
+	0x5d, 0x0c, 0xfd, 0x06, 0x00, 0x00, 0xff, 0xff, 0x00, 0xab, 0xd3, 0x23, 0xff, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/product_channel.pb.go b/googleapis/ads/googleads/v3/enums/product_channel.pb.go
new file mode 100644
index 0000000..96d19c0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/product_channel.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/product_channel.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the locality of a product offer.
+type ProductChannelEnum_ProductChannel int32
+
+const (
+	// Not specified.
+	ProductChannelEnum_UNSPECIFIED ProductChannelEnum_ProductChannel = 0
+	// Used for return value only. Represents value unknown in this version.
+	ProductChannelEnum_UNKNOWN ProductChannelEnum_ProductChannel = 1
+	// The item is sold online.
+	ProductChannelEnum_ONLINE ProductChannelEnum_ProductChannel = 2
+	// The item is sold in local stores.
+	ProductChannelEnum_LOCAL ProductChannelEnum_ProductChannel = 3
+)
+
+var ProductChannelEnum_ProductChannel_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ONLINE",
+	3: "LOCAL",
+}
+
+var ProductChannelEnum_ProductChannel_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ONLINE":      2,
+	"LOCAL":       3,
+}
+
+func (x ProductChannelEnum_ProductChannel) String() string {
+	return proto.EnumName(ProductChannelEnum_ProductChannel_name, int32(x))
+}
+
+func (ProductChannelEnum_ProductChannel) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e9342ffcc394dc23, []int{0, 0}
+}
+
+// Locality of a product offer.
+type ProductChannelEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProductChannelEnum) Reset()         { *m = ProductChannelEnum{} }
+func (m *ProductChannelEnum) String() string { return proto.CompactTextString(m) }
+func (*ProductChannelEnum) ProtoMessage()    {}
+func (*ProductChannelEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e9342ffcc394dc23, []int{0}
+}
+
+func (m *ProductChannelEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductChannelEnum.Unmarshal(m, b)
+}
+func (m *ProductChannelEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductChannelEnum.Marshal(b, m, deterministic)
+}
+func (m *ProductChannelEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductChannelEnum.Merge(m, src)
+}
+func (m *ProductChannelEnum) XXX_Size() int {
+	return xxx_messageInfo_ProductChannelEnum.Size(m)
+}
+func (m *ProductChannelEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductChannelEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductChannelEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ProductChannelEnum_ProductChannel", ProductChannelEnum_ProductChannel_name, ProductChannelEnum_ProductChannel_value)
+	proto.RegisterType((*ProductChannelEnum)(nil), "google.ads.googleads.v3.enums.ProductChannelEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/product_channel.proto", fileDescriptor_e9342ffcc394dc23)
+}
+
+var fileDescriptor_e9342ffcc394dc23 = []byte{
+	// 298 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4b, 0xfb, 0x30,
+	0x18, 0xfe, 0xad, 0xe3, 0x37, 0x31, 0x03, 0x2d, 0xf1, 0x26, 0xee, 0xb0, 0x7d, 0x80, 0xe4, 0x90,
+	0x5b, 0x3c, 0x65, 0xb3, 0x8e, 0xe1, 0xc8, 0x0a, 0xb2, 0x09, 0x5a, 0x90, 0xb8, 0x94, 0x58, 0x68,
+	0x93, 0xd2, 0xb4, 0xfb, 0x40, 0x1e, 0xfd, 0x28, 0x7e, 0x12, 0xf1, 0x53, 0x48, 0x13, 0x5b, 0xd8,
+	0x41, 0x2f, 0xe1, 0xe1, 0x7d, 0xfe, 0xe4, 0x79, 0x5f, 0x40, 0x94, 0x31, 0x2a, 0x4f, 0xb1, 0x90,
+	0x16, 0x7b, 0xd8, 0xa2, 0x03, 0xc1, 0xa9, 0x6e, 0x0a, 0x8b, 0xcb, 0xca, 0xc8, 0x66, 0x5f, 0x3f,
+	0xef, 0x5f, 0x85, 0xd6, 0x69, 0x8e, 0xca, 0xca, 0xd4, 0x06, 0x4e, 0xbc, 0x12, 0x09, 0x69, 0x51,
+	0x6f, 0x42, 0x07, 0x82, 0x9c, 0xe9, 0xf2, 0xaa, 0xcb, 0x2c, 0x33, 0x2c, 0xb4, 0x36, 0xb5, 0xa8,
+	0x33, 0xa3, 0xad, 0x37, 0xcf, 0x9e, 0x00, 0x8c, 0x7d, 0xea, 0xc2, 0x87, 0x46, 0xba, 0x29, 0x66,
+	0x11, 0x38, 0x3b, 0x9e, 0xc2, 0x73, 0x30, 0xde, 0xf2, 0xfb, 0x38, 0x5a, 0xac, 0x6e, 0x57, 0xd1,
+	0x4d, 0xf8, 0x0f, 0x8e, 0xc1, 0xc9, 0x96, 0xdf, 0xf1, 0xcd, 0x03, 0x0f, 0x07, 0x10, 0x80, 0xd1,
+	0x86, 0xaf, 0x57, 0x3c, 0x0a, 0x03, 0x78, 0x0a, 0xfe, 0xaf, 0x37, 0x0b, 0xb6, 0x0e, 0x87, 0xf3,
+	0xcf, 0x01, 0x98, 0xee, 0x4d, 0x81, 0xfe, 0x2c, 0x38, 0xbf, 0x38, 0xfe, 0x2a, 0x6e, 0x7b, 0xc5,
+	0x83, 0xc7, 0xf9, 0x8f, 0x4b, 0x99, 0x5c, 0x68, 0x85, 0x4c, 0xa5, 0xb0, 0x4a, 0xb5, 0x6b, 0xdd,
+	0xdd, 0xa6, 0xcc, 0xec, 0x2f, 0xa7, 0xba, 0x76, 0xef, 0x5b, 0x30, 0x5c, 0x32, 0xf6, 0x1e, 0x4c,
+	0x96, 0x3e, 0x8a, 0x49, 0x8b, 0x3c, 0x6c, 0xd1, 0x8e, 0xa0, 0x76, 0x59, 0xfb, 0xd1, 0xf1, 0x09,
+	0x93, 0x36, 0xe9, 0xf9, 0x64, 0x47, 0x12, 0xc7, 0x7f, 0x05, 0x53, 0x3f, 0xa4, 0x94, 0x49, 0x4b,
+	0x69, 0xaf, 0xa0, 0x74, 0x47, 0x28, 0x75, 0x9a, 0x97, 0x91, 0x2b, 0x46, 0xbe, 0x03, 0x00, 0x00,
+	0xff, 0xff, 0xea, 0x05, 0x6c, 0x93, 0xc2, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/product_channel_exclusivity.pb.go b/googleapis/ads/googleads/v3/enums/product_channel_exclusivity.pb.go
new file mode 100644
index 0000000..832ac2b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/product_channel_exclusivity.pb.go
@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/product_channel_exclusivity.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the availability of a product offer.
+type ProductChannelExclusivityEnum_ProductChannelExclusivity int32
+
+const (
+	// Not specified.
+	ProductChannelExclusivityEnum_UNSPECIFIED ProductChannelExclusivityEnum_ProductChannelExclusivity = 0
+	// Used for return value only. Represents value unknown in this version.
+	ProductChannelExclusivityEnum_UNKNOWN ProductChannelExclusivityEnum_ProductChannelExclusivity = 1
+	// The item is sold through one channel only, either local stores or online
+	// as indicated by its ProductChannel.
+	ProductChannelExclusivityEnum_SINGLE_CHANNEL ProductChannelExclusivityEnum_ProductChannelExclusivity = 2
+	// The item is matched to its online or local stores counterpart, indicating
+	// it is available for purchase in both ShoppingProductChannels.
+	ProductChannelExclusivityEnum_MULTI_CHANNEL ProductChannelExclusivityEnum_ProductChannelExclusivity = 3
+)
+
+var ProductChannelExclusivityEnum_ProductChannelExclusivity_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "SINGLE_CHANNEL",
+	3: "MULTI_CHANNEL",
+}
+
+var ProductChannelExclusivityEnum_ProductChannelExclusivity_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"SINGLE_CHANNEL": 2,
+	"MULTI_CHANNEL":  3,
+}
+
+func (x ProductChannelExclusivityEnum_ProductChannelExclusivity) String() string {
+	return proto.EnumName(ProductChannelExclusivityEnum_ProductChannelExclusivity_name, int32(x))
+}
+
+func (ProductChannelExclusivityEnum_ProductChannelExclusivity) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_5a8016d5df911ee6, []int{0, 0}
+}
+
+// Availability of a product offer.
+type ProductChannelExclusivityEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProductChannelExclusivityEnum) Reset()         { *m = ProductChannelExclusivityEnum{} }
+func (m *ProductChannelExclusivityEnum) String() string { return proto.CompactTextString(m) }
+func (*ProductChannelExclusivityEnum) ProtoMessage()    {}
+func (*ProductChannelExclusivityEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5a8016d5df911ee6, []int{0}
+}
+
+func (m *ProductChannelExclusivityEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductChannelExclusivityEnum.Unmarshal(m, b)
+}
+func (m *ProductChannelExclusivityEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductChannelExclusivityEnum.Marshal(b, m, deterministic)
+}
+func (m *ProductChannelExclusivityEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductChannelExclusivityEnum.Merge(m, src)
+}
+func (m *ProductChannelExclusivityEnum) XXX_Size() int {
+	return xxx_messageInfo_ProductChannelExclusivityEnum.Size(m)
+}
+func (m *ProductChannelExclusivityEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductChannelExclusivityEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductChannelExclusivityEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ProductChannelExclusivityEnum_ProductChannelExclusivity", ProductChannelExclusivityEnum_ProductChannelExclusivity_name, ProductChannelExclusivityEnum_ProductChannelExclusivity_value)
+	proto.RegisterType((*ProductChannelExclusivityEnum)(nil), "google.ads.googleads.v3.enums.ProductChannelExclusivityEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/product_channel_exclusivity.proto", fileDescriptor_5a8016d5df911ee6)
+}
+
+var fileDescriptor_5a8016d5df911ee6 = []byte{
+	// 326 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xd1, 0x4a, 0xf3, 0x30,
+	0x18, 0xfd, 0xdb, 0xc1, 0x2f, 0x64, 0xa8, 0xb3, 0x77, 0x8a, 0x13, 0xb6, 0x07, 0x48, 0x2f, 0x7a,
+	0x17, 0x2f, 0x24, 0x9b, 0x71, 0x16, 0x67, 0x2c, 0xcc, 0x4d, 0x90, 0xc2, 0x8c, 0x4d, 0x89, 0x85,
+	0x2e, 0x29, 0x4b, 0x3b, 0xf4, 0xd2, 0x57, 0xf1, 0xd2, 0x47, 0xf1, 0x51, 0xbc, 0xf5, 0x05, 0xa4,
+	0x89, 0xab, 0x57, 0xf5, 0x26, 0x1c, 0xf2, 0x9d, 0xef, 0x9c, 0xef, 0x1c, 0x70, 0x26, 0x94, 0x12,
+	0x79, 0xea, 0x33, 0xae, 0x7d, 0x0b, 0x6b, 0xb4, 0x09, 0xfc, 0x54, 0x56, 0x2b, 0xed, 0x17, 0x6b,
+	0xc5, 0xab, 0xa4, 0x5c, 0x26, 0x4f, 0x4c, 0xca, 0x34, 0x5f, 0xa6, 0xcf, 0x49, 0x5e, 0xe9, 0x6c,
+	0x93, 0x95, 0x2f, 0xb0, 0x58, 0xab, 0x52, 0x79, 0x7d, 0xbb, 0x05, 0x19, 0xd7, 0xb0, 0x11, 0x80,
+	0x9b, 0x00, 0x1a, 0x81, 0xa3, 0xe3, 0xad, 0x7e, 0x91, 0xf9, 0x4c, 0x4a, 0x55, 0xb2, 0x32, 0x53,
+	0x52, 0xdb, 0xe5, 0xe1, 0xab, 0x03, 0xfa, 0x91, 0xb5, 0x18, 0x5b, 0x07, 0xf2, 0x6b, 0x40, 0x64,
+	0xb5, 0x1a, 0x3e, 0x80, 0xc3, 0x56, 0x82, 0xb7, 0x0f, 0xba, 0x73, 0x3a, 0x8b, 0xc8, 0x38, 0xbc,
+	0x08, 0xc9, 0x79, 0xef, 0x9f, 0xd7, 0x05, 0x3b, 0x73, 0x7a, 0x45, 0x6f, 0xee, 0x68, 0xcf, 0xf1,
+	0x3c, 0xb0, 0x37, 0x0b, 0xe9, 0x64, 0x4a, 0x96, 0xe3, 0x4b, 0x4c, 0x29, 0x99, 0xf6, 0x5c, 0xef,
+	0x00, 0xec, 0x5e, 0xcf, 0xa7, 0xb7, 0x61, 0xf3, 0xd5, 0x19, 0x7d, 0x39, 0x60, 0x90, 0xa8, 0x15,
+	0xfc, 0x33, 0xc7, 0xe8, 0xa4, 0xf5, 0x8a, 0xa8, 0x4e, 0x12, 0x39, 0xf7, 0xa3, 0x1f, 0x01, 0xa1,
+	0x72, 0x26, 0x05, 0x54, 0x6b, 0xe1, 0x8b, 0x54, 0x9a, 0x9c, 0xdb, 0x66, 0x8b, 0x4c, 0xb7, 0x14,
+	0x7d, 0x6a, 0xde, 0x37, 0xb7, 0x33, 0xc1, 0xf8, 0xdd, 0xed, 0x4f, 0xac, 0x14, 0xe6, 0x1a, 0x5a,
+	0x58, 0xa3, 0x45, 0x00, 0xeb, 0x4a, 0xf4, 0xc7, 0x76, 0x1e, 0x63, 0xae, 0xe3, 0x66, 0x1e, 0x2f,
+	0x82, 0xd8, 0xcc, 0x3f, 0xdd, 0x81, 0xfd, 0x44, 0x08, 0x73, 0x8d, 0x50, 0xc3, 0x40, 0x68, 0x11,
+	0x20, 0x64, 0x38, 0x8f, 0xff, 0xcd, 0x61, 0xc1, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb1, 0xaa,
+	0xcb, 0x16, 0x00, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/product_condition.pb.go b/googleapis/ads/googleads/v3/enums/product_condition.pb.go
new file mode 100644
index 0000000..51e6664
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/product_condition.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/product_condition.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the condition of a product offer.
+type ProductConditionEnum_ProductCondition int32
+
+const (
+	// Not specified.
+	ProductConditionEnum_UNSPECIFIED ProductConditionEnum_ProductCondition = 0
+	// Used for return value only. Represents value unknown in this version.
+	ProductConditionEnum_UNKNOWN ProductConditionEnum_ProductCondition = 1
+	// The product condition is new.
+	ProductConditionEnum_NEW ProductConditionEnum_ProductCondition = 3
+	// The product condition is refurbished.
+	ProductConditionEnum_REFURBISHED ProductConditionEnum_ProductCondition = 4
+	// The product condition is used.
+	ProductConditionEnum_USED ProductConditionEnum_ProductCondition = 5
+)
+
+var ProductConditionEnum_ProductCondition_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	3: "NEW",
+	4: "REFURBISHED",
+	5: "USED",
+}
+
+var ProductConditionEnum_ProductCondition_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"NEW":         3,
+	"REFURBISHED": 4,
+	"USED":        5,
+}
+
+func (x ProductConditionEnum_ProductCondition) String() string {
+	return proto.EnumName(ProductConditionEnum_ProductCondition_name, int32(x))
+}
+
+func (ProductConditionEnum_ProductCondition) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ac799eb3636d41b8, []int{0, 0}
+}
+
+// Condition of a product offer.
+type ProductConditionEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProductConditionEnum) Reset()         { *m = ProductConditionEnum{} }
+func (m *ProductConditionEnum) String() string { return proto.CompactTextString(m) }
+func (*ProductConditionEnum) ProtoMessage()    {}
+func (*ProductConditionEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ac799eb3636d41b8, []int{0}
+}
+
+func (m *ProductConditionEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductConditionEnum.Unmarshal(m, b)
+}
+func (m *ProductConditionEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductConditionEnum.Marshal(b, m, deterministic)
+}
+func (m *ProductConditionEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductConditionEnum.Merge(m, src)
+}
+func (m *ProductConditionEnum) XXX_Size() int {
+	return xxx_messageInfo_ProductConditionEnum.Size(m)
+}
+func (m *ProductConditionEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductConditionEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductConditionEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ProductConditionEnum_ProductCondition", ProductConditionEnum_ProductCondition_name, ProductConditionEnum_ProductCondition_value)
+	proto.RegisterType((*ProductConditionEnum)(nil), "google.ads.googleads.v3.enums.ProductConditionEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/product_condition.proto", fileDescriptor_ac799eb3636d41b8)
+}
+
+var fileDescriptor_ac799eb3636d41b8 = []byte{
+	// 309 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xbd, 0x6a, 0xf3, 0x30,
+	0x14, 0xfd, 0xf2, 0xf3, 0x35, 0x45, 0x19, 0x2a, 0x4c, 0xbb, 0x94, 0x66, 0x48, 0x1e, 0x40, 0x1a,
+	0x44, 0x17, 0x75, 0xb2, 0x13, 0x25, 0x0d, 0x05, 0xd7, 0x24, 0x75, 0x02, 0xc5, 0x50, 0xdc, 0x28,
+	0x08, 0x43, 0x2c, 0x19, 0xcb, 0xce, 0x03, 0x75, 0xec, 0xa3, 0xf4, 0x51, 0xf2, 0x14, 0x45, 0x52,
+	0xed, 0x21, 0xd0, 0x2e, 0xe2, 0x70, 0xcf, 0x8f, 0xce, 0xbd, 0xe0, 0x5e, 0x28, 0x25, 0x0e, 0x7b,
+	0x9c, 0x72, 0x8d, 0x1d, 0x34, 0xe8, 0x48, 0xf0, 0x5e, 0xd6, 0xb9, 0xc6, 0x45, 0xa9, 0x78, 0xbd,
+	0xab, 0xde, 0x76, 0x4a, 0xf2, 0xac, 0xca, 0x94, 0x44, 0x45, 0xa9, 0x2a, 0xe5, 0x8d, 0x9c, 0x16,
+	0xa5, 0x5c, 0xa3, 0xd6, 0x86, 0x8e, 0x04, 0x59, 0xdb, 0xed, 0x5d, 0x93, 0x5a, 0x64, 0x38, 0x95,
+	0x52, 0x55, 0xa9, 0xf1, 0x6a, 0x67, 0x9e, 0x1c, 0xc0, 0x75, 0xe4, 0x72, 0xa7, 0x4d, 0x2c, 0x93,
+	0x75, 0x3e, 0x79, 0x01, 0xf0, 0x7c, 0xee, 0x5d, 0x81, 0x61, 0x1c, 0xae, 0x23, 0x36, 0x5d, 0xce,
+	0x97, 0x6c, 0x06, 0xff, 0x79, 0x43, 0x30, 0x88, 0xc3, 0xa7, 0xf0, 0x79, 0x1b, 0xc2, 0x8e, 0x37,
+	0x00, 0xbd, 0x90, 0x6d, 0x61, 0xcf, 0xc8, 0x56, 0x6c, 0x1e, 0xaf, 0x82, 0xe5, 0xfa, 0x91, 0xcd,
+	0x60, 0xdf, 0xbb, 0x04, 0xfd, 0x78, 0xcd, 0x66, 0xf0, 0x7f, 0x70, 0xea, 0x80, 0xf1, 0x4e, 0xe5,
+	0xe8, 0xcf, 0xc6, 0xc1, 0xcd, 0xf9, 0xcf, 0x91, 0xa9, 0x1a, 0x75, 0x5e, 0x83, 0x1f, 0x9f, 0x50,
+	0x87, 0x54, 0x0a, 0xa4, 0x4a, 0x81, 0xc5, 0x5e, 0xda, 0x45, 0x9a, 0x83, 0x15, 0x99, 0xfe, 0xe5,
+	0x7e, 0x0f, 0xf6, 0xfd, 0xe8, 0xf6, 0x16, 0xbe, 0xff, 0xd9, 0x1d, 0x2d, 0x5c, 0x94, 0xcf, 0x35,
+	0x72, 0xd0, 0xa0, 0x0d, 0x41, 0x66, 0x7b, 0xfd, 0xd5, 0xf0, 0x89, 0xcf, 0x75, 0xd2, 0xf2, 0xc9,
+	0x86, 0x24, 0x96, 0x3f, 0x75, 0xc7, 0x6e, 0x48, 0xa9, 0xcf, 0x35, 0xa5, 0xad, 0x82, 0xd2, 0x0d,
+	0xa1, 0xd4, 0x6a, 0xde, 0x2f, 0x6c, 0x31, 0xf2, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x80, 0x3a, 0x94,
+	0xa1, 0xd7, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/product_custom_attribute_index.pb.go b/googleapis/ads/googleads/v3/enums/product_custom_attribute_index.pb.go
new file mode 100644
index 0000000..f626363
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/product_custom_attribute_index.pb.go
@@ -0,0 +1,137 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/product_custom_attribute_index.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The index of the product custom attribute.
+type ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex int32
+
+const (
+	// Not specified.
+	ProductCustomAttributeIndexEnum_UNSPECIFIED ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 0
+	// Used for return value only. Represents value unknown in this version.
+	ProductCustomAttributeIndexEnum_UNKNOWN ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 1
+	// First product custom attribute.
+	ProductCustomAttributeIndexEnum_INDEX0 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 7
+	// Second product custom attribute.
+	ProductCustomAttributeIndexEnum_INDEX1 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 8
+	// Third product custom attribute.
+	ProductCustomAttributeIndexEnum_INDEX2 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 9
+	// Fourth product custom attribute.
+	ProductCustomAttributeIndexEnum_INDEX3 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 10
+	// Fifth product custom attribute.
+	ProductCustomAttributeIndexEnum_INDEX4 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 11
+)
+
+var ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	7:  "INDEX0",
+	8:  "INDEX1",
+	9:  "INDEX2",
+	10: "INDEX3",
+	11: "INDEX4",
+}
+
+var ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"INDEX0":      7,
+	"INDEX1":      8,
+	"INDEX2":      9,
+	"INDEX3":      10,
+	"INDEX4":      11,
+}
+
+func (x ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex) String() string {
+	return proto.EnumName(ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_name, int32(x))
+}
+
+func (ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_80f002e0af7a25fd, []int{0, 0}
+}
+
+// Container for enum describing the index of the product custom attribute.
+type ProductCustomAttributeIndexEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProductCustomAttributeIndexEnum) Reset()         { *m = ProductCustomAttributeIndexEnum{} }
+func (m *ProductCustomAttributeIndexEnum) String() string { return proto.CompactTextString(m) }
+func (*ProductCustomAttributeIndexEnum) ProtoMessage()    {}
+func (*ProductCustomAttributeIndexEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_80f002e0af7a25fd, []int{0}
+}
+
+func (m *ProductCustomAttributeIndexEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductCustomAttributeIndexEnum.Unmarshal(m, b)
+}
+func (m *ProductCustomAttributeIndexEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductCustomAttributeIndexEnum.Marshal(b, m, deterministic)
+}
+func (m *ProductCustomAttributeIndexEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductCustomAttributeIndexEnum.Merge(m, src)
+}
+func (m *ProductCustomAttributeIndexEnum) XXX_Size() int {
+	return xxx_messageInfo_ProductCustomAttributeIndexEnum.Size(m)
+}
+func (m *ProductCustomAttributeIndexEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductCustomAttributeIndexEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductCustomAttributeIndexEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex", ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_name, ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_value)
+	proto.RegisterType((*ProductCustomAttributeIndexEnum)(nil), "google.ads.googleads.v3.enums.ProductCustomAttributeIndexEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/product_custom_attribute_index.proto", fileDescriptor_80f002e0af7a25fd)
+}
+
+var fileDescriptor_80f002e0af7a25fd = []byte{
+	// 327 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xb1, 0x4e, 0xf3, 0x30,
+	0x14, 0x85, 0xff, 0xf4, 0x97, 0x5a, 0x70, 0x07, 0xac, 0x8c, 0x40, 0x05, 0xed, 0x03, 0x38, 0x80,
+	0x99, 0xcc, 0x94, 0xb6, 0xa1, 0x8a, 0x90, 0x42, 0x24, 0xd4, 0x82, 0x50, 0xa4, 0x2a, 0xad, 0x23,
+	0x2b, 0x52, 0x63, 0x47, 0xb1, 0x53, 0x78, 0x16, 0x46, 0x46, 0x1e, 0x85, 0x47, 0x61, 0x67, 0x47,
+	0xb1, 0x89, 0x37, 0xb2, 0x44, 0x9f, 0x72, 0xef, 0x3d, 0xe7, 0xde, 0x63, 0x30, 0x65, 0x42, 0xb0,
+	0x5d, 0xe6, 0xa5, 0x54, 0x7a, 0x06, 0x1b, 0xda, 0x63, 0x2f, 0xe3, 0x75, 0x21, 0xbd, 0xb2, 0x12,
+	0xb4, 0xde, 0xaa, 0xf5, 0xb6, 0x96, 0x4a, 0x14, 0xeb, 0x54, 0xa9, 0x2a, 0xdf, 0xd4, 0x2a, 0x5b,
+	0xe7, 0x9c, 0x66, 0xaf, 0xa8, 0xac, 0x84, 0x12, 0xee, 0xc8, 0x0c, 0xa2, 0x94, 0x4a, 0x64, 0x35,
+	0xd0, 0x1e, 0x23, 0xad, 0x71, 0x7c, 0xda, 0x5a, 0x94, 0xb9, 0x97, 0x72, 0x2e, 0x54, 0xaa, 0x72,
+	0xc1, 0xa5, 0x19, 0x9e, 0xbc, 0x39, 0xe0, 0x2c, 0x36, 0x2e, 0x33, 0x6d, 0xe2, 0xb7, 0x1e, 0x61,
+	0x63, 0x11, 0xf0, 0xba, 0x98, 0xbc, 0x80, 0x93, 0x8e, 0x16, 0xf7, 0x08, 0x0c, 0x97, 0xd1, 0x43,
+	0x1c, 0xcc, 0xc2, 0xdb, 0x30, 0x98, 0xc3, 0x7f, 0xee, 0x10, 0x0c, 0x96, 0xd1, 0x5d, 0x74, 0xff,
+	0x18, 0x41, 0xc7, 0x05, 0xa0, 0x1f, 0x46, 0xf3, 0xe0, 0xe9, 0x02, 0x0e, 0x2c, 0x5f, 0xc2, 0x03,
+	0xcb, 0x57, 0xf0, 0xd0, 0x32, 0x86, 0xc0, 0xf2, 0x35, 0x1c, 0x4e, 0xbf, 0x1d, 0x30, 0xde, 0x8a,
+	0x02, 0x75, 0x1e, 0x38, 0x3d, 0xef, 0x58, 0x2e, 0x6e, 0x8e, 0x8c, 0x9d, 0xe7, 0xdf, 0x9c, 0x11,
+	0x13, 0xbb, 0x94, 0x33, 0x24, 0x2a, 0xe6, 0xb1, 0x8c, 0xeb, 0x08, 0xda, 0xdc, 0xcb, 0x5c, 0xfe,
+	0xf1, 0x0c, 0x37, 0xfa, 0xfb, 0xde, 0xfb, 0xbf, 0xf0, 0xfd, 0x8f, 0xde, 0x68, 0x61, 0xa4, 0x7c,
+	0x2a, 0x91, 0xc1, 0x86, 0x56, 0x18, 0x35, 0x59, 0xc9, 0xcf, 0xb6, 0x9e, 0xf8, 0x54, 0x26, 0xb6,
+	0x9e, 0xac, 0x70, 0xa2, 0xeb, 0x5f, 0xbd, 0xb1, 0xf9, 0x49, 0x88, 0x4f, 0x25, 0x21, 0xb6, 0x83,
+	0x90, 0x15, 0x26, 0x44, 0xf7, 0x6c, 0xfa, 0x7a, 0x31, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0xb1,
+	0xf0, 0x6e, 0xe3, 0x1e, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/product_type_level.pb.go b/googleapis/ads/googleads/v3/enums/product_type_level.pb.go
new file mode 100644
index 0000000..994385a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/product_type_level.pb.go
@@ -0,0 +1,136 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/product_type_level.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the level of the type of a product offer.
+type ProductTypeLevelEnum_ProductTypeLevel int32
+
+const (
+	// Not specified.
+	ProductTypeLevelEnum_UNSPECIFIED ProductTypeLevelEnum_ProductTypeLevel = 0
+	// Used for return value only. Represents value unknown in this version.
+	ProductTypeLevelEnum_UNKNOWN ProductTypeLevelEnum_ProductTypeLevel = 1
+	// Level 1.
+	ProductTypeLevelEnum_LEVEL1 ProductTypeLevelEnum_ProductTypeLevel = 7
+	// Level 2.
+	ProductTypeLevelEnum_LEVEL2 ProductTypeLevelEnum_ProductTypeLevel = 8
+	// Level 3.
+	ProductTypeLevelEnum_LEVEL3 ProductTypeLevelEnum_ProductTypeLevel = 9
+	// Level 4.
+	ProductTypeLevelEnum_LEVEL4 ProductTypeLevelEnum_ProductTypeLevel = 10
+	// Level 5.
+	ProductTypeLevelEnum_LEVEL5 ProductTypeLevelEnum_ProductTypeLevel = 11
+)
+
+var ProductTypeLevelEnum_ProductTypeLevel_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	7:  "LEVEL1",
+	8:  "LEVEL2",
+	9:  "LEVEL3",
+	10: "LEVEL4",
+	11: "LEVEL5",
+}
+
+var ProductTypeLevelEnum_ProductTypeLevel_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"LEVEL1":      7,
+	"LEVEL2":      8,
+	"LEVEL3":      9,
+	"LEVEL4":      10,
+	"LEVEL5":      11,
+}
+
+func (x ProductTypeLevelEnum_ProductTypeLevel) String() string {
+	return proto.EnumName(ProductTypeLevelEnum_ProductTypeLevel_name, int32(x))
+}
+
+func (ProductTypeLevelEnum_ProductTypeLevel) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b23b5c7ad7feb34b, []int{0, 0}
+}
+
+// Level of the type of a product offer.
+type ProductTypeLevelEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProductTypeLevelEnum) Reset()         { *m = ProductTypeLevelEnum{} }
+func (m *ProductTypeLevelEnum) String() string { return proto.CompactTextString(m) }
+func (*ProductTypeLevelEnum) ProtoMessage()    {}
+func (*ProductTypeLevelEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b23b5c7ad7feb34b, []int{0}
+}
+
+func (m *ProductTypeLevelEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductTypeLevelEnum.Unmarshal(m, b)
+}
+func (m *ProductTypeLevelEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductTypeLevelEnum.Marshal(b, m, deterministic)
+}
+func (m *ProductTypeLevelEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductTypeLevelEnum.Merge(m, src)
+}
+func (m *ProductTypeLevelEnum) XXX_Size() int {
+	return xxx_messageInfo_ProductTypeLevelEnum.Size(m)
+}
+func (m *ProductTypeLevelEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductTypeLevelEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductTypeLevelEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ProductTypeLevelEnum_ProductTypeLevel", ProductTypeLevelEnum_ProductTypeLevel_name, ProductTypeLevelEnum_ProductTypeLevel_value)
+	proto.RegisterType((*ProductTypeLevelEnum)(nil), "google.ads.googleads.v3.enums.ProductTypeLevelEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/product_type_level.proto", fileDescriptor_b23b5c7ad7feb34b)
+}
+
+var fileDescriptor_b23b5c7ad7feb34b = []byte{
+	// 316 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0x33, 0x31,
+	0x14, 0x85, 0xff, 0xe9, 0x0f, 0xad, 0xa6, 0x0b, 0xc3, 0xa0, 0x1b, 0xb1, 0x8b, 0xf6, 0x01, 0x12,
+	0x34, 0xea, 0x22, 0xae, 0xa6, 0x3a, 0x96, 0x62, 0x19, 0x07, 0xb4, 0x23, 0xc8, 0x40, 0x19, 0x9b,
+	0x10, 0x0a, 0xd3, 0x24, 0x34, 0xd3, 0x42, 0xf7, 0x3e, 0x89, 0x4b, 0x1f, 0xc5, 0x47, 0xe9, 0x53,
+	0xc8, 0x24, 0x4e, 0x16, 0x05, 0xdd, 0x84, 0x8f, 0xdc, 0x7b, 0x0e, 0xf7, 0x1c, 0x70, 0x2d, 0x94,
+	0x12, 0x25, 0xc7, 0x05, 0x33, 0xd8, 0x61, 0x4d, 0x1b, 0x82, 0xb9, 0x5c, 0x2f, 0x0d, 0xd6, 0x2b,
+	0xc5, 0xd6, 0xf3, 0x6a, 0x56, 0x6d, 0x35, 0x9f, 0x95, 0x7c, 0xc3, 0x4b, 0xa4, 0x57, 0xaa, 0x52,
+	0x61, 0xcf, 0x2d, 0xa3, 0x82, 0x19, 0xe4, 0x75, 0x68, 0x43, 0x90, 0xd5, 0x9d, 0x9e, 0x35, 0xb6,
+	0x7a, 0x81, 0x0b, 0x29, 0x55, 0x55, 0x54, 0x0b, 0x25, 0x8d, 0x13, 0x0f, 0xde, 0x03, 0x70, 0x9c,
+	0x3a, 0xe7, 0xe7, 0xad, 0xe6, 0x93, 0xda, 0x37, 0x96, 0xeb, 0xe5, 0xa0, 0x04, 0x70, 0xff, 0x3f,
+	0x3c, 0x02, 0xdd, 0x69, 0xf2, 0x94, 0xc6, 0xb7, 0xe3, 0xfb, 0x71, 0x7c, 0x07, 0xff, 0x85, 0x5d,
+	0xd0, 0x99, 0x26, 0x0f, 0xc9, 0xe3, 0x4b, 0x02, 0x83, 0x10, 0x80, 0xf6, 0x24, 0xce, 0xe2, 0xc9,
+	0x39, 0xec, 0x78, 0xbe, 0x80, 0x07, 0x9e, 0x09, 0x3c, 0xf4, 0x7c, 0x09, 0x81, 0xe7, 0x2b, 0xd8,
+	0x1d, 0xee, 0x02, 0xd0, 0x9f, 0xab, 0x25, 0xfa, 0x33, 0xca, 0xf0, 0x64, 0xff, 0xa2, 0xb4, 0xce,
+	0x90, 0x06, 0xaf, 0xc3, 0x1f, 0x9d, 0x50, 0x65, 0x21, 0x05, 0x52, 0x2b, 0x81, 0x05, 0x97, 0x36,
+	0x61, 0x53, 0xa5, 0x5e, 0x98, 0x5f, 0x9a, 0xbd, 0xb1, 0xef, 0x47, 0xeb, 0xff, 0x28, 0x8a, 0x3e,
+	0x5b, 0xbd, 0x91, 0xb3, 0x8a, 0x98, 0x41, 0x0e, 0x6b, 0xca, 0x08, 0xaa, 0x5b, 0x31, 0x5f, 0xcd,
+	0x3c, 0x8f, 0x98, 0xc9, 0xfd, 0x3c, 0xcf, 0x48, 0x6e, 0xe7, 0xbb, 0x56, 0xdf, 0x7d, 0x52, 0x1a,
+	0x31, 0x43, 0xa9, 0xdf, 0xa0, 0x34, 0x23, 0x94, 0xda, 0x9d, 0xb7, 0xb6, 0x3d, 0x8c, 0x7c, 0x07,
+	0x00, 0x00, 0xff, 0xff, 0xf5, 0xca, 0x80, 0x46, 0xf1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/promotion_extension_discount_modifier.pb.go b/googleapis/ads/googleads/v3/enums/promotion_extension_discount_modifier.pb.go
new file mode 100644
index 0000000..141527d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/promotion_extension_discount_modifier.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/promotion_extension_discount_modifier.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A promotion extension discount modifier.
+type PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier int32
+
+const (
+	// Not specified.
+	PromotionExtensionDiscountModifierEnum_UNSPECIFIED PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier = 0
+	// Used for return value only. Represents value unknown in this version.
+	PromotionExtensionDiscountModifierEnum_UNKNOWN PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier = 1
+	// 'Up to'.
+	PromotionExtensionDiscountModifierEnum_UP_TO PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier = 2
+)
+
+var PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "UP_TO",
+}
+
+var PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"UP_TO":       2,
+}
+
+func (x PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier) String() string {
+	return proto.EnumName(PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier_name, int32(x))
+}
+
+func (PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7b6cacf196203e5e, []int{0, 0}
+}
+
+// Container for enum describing possible a promotion extension
+// discount modifier.
+type PromotionExtensionDiscountModifierEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PromotionExtensionDiscountModifierEnum) Reset() {
+	*m = PromotionExtensionDiscountModifierEnum{}
+}
+func (m *PromotionExtensionDiscountModifierEnum) String() string { return proto.CompactTextString(m) }
+func (*PromotionExtensionDiscountModifierEnum) ProtoMessage()    {}
+func (*PromotionExtensionDiscountModifierEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7b6cacf196203e5e, []int{0}
+}
+
+func (m *PromotionExtensionDiscountModifierEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PromotionExtensionDiscountModifierEnum.Unmarshal(m, b)
+}
+func (m *PromotionExtensionDiscountModifierEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PromotionExtensionDiscountModifierEnum.Marshal(b, m, deterministic)
+}
+func (m *PromotionExtensionDiscountModifierEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PromotionExtensionDiscountModifierEnum.Merge(m, src)
+}
+func (m *PromotionExtensionDiscountModifierEnum) XXX_Size() int {
+	return xxx_messageInfo_PromotionExtensionDiscountModifierEnum.Size(m)
+}
+func (m *PromotionExtensionDiscountModifierEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PromotionExtensionDiscountModifierEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PromotionExtensionDiscountModifierEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier", PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier_name, PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier_value)
+	proto.RegisterType((*PromotionExtensionDiscountModifierEnum)(nil), "google.ads.googleads.v3.enums.PromotionExtensionDiscountModifierEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/promotion_extension_discount_modifier.proto", fileDescriptor_7b6cacf196203e5e)
+}
+
+var fileDescriptor_7b6cacf196203e5e = []byte{
+	// 312 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0xb1, 0x4e, 0xfb, 0x30,
+	0x10, 0xc6, 0xff, 0xcd, 0x5f, 0x80, 0x70, 0x07, 0xaa, 0x8c, 0x88, 0x0e, 0xed, 0x00, 0x9b, 0x3d,
+	0x78, 0x33, 0x53, 0x4a, 0x43, 0x55, 0xa1, 0xa6, 0x91, 0xa0, 0x45, 0x42, 0x91, 0xaa, 0x50, 0x1b,
+	0xcb, 0x52, 0xe3, 0x8b, 0xe2, 0xb4, 0xf0, 0x3c, 0x8c, 0x3c, 0x0a, 0x8f, 0xc2, 0x33, 0x30, 0x20,
+	0xdb, 0x4d, 0x36, 0xe8, 0x62, 0x7d, 0xf2, 0xdd, 0x7d, 0xbf, 0xbb, 0x0f, 0x4d, 0x25, 0x80, 0xdc,
+	0x08, 0x92, 0x73, 0x43, 0xbc, 0xb4, 0x6a, 0x47, 0x89, 0xd0, 0xdb, 0xc2, 0x90, 0xb2, 0x82, 0x02,
+	0x6a, 0x05, 0x7a, 0x25, 0xde, 0x6a, 0xa1, 0x8d, 0x55, 0x5c, 0x99, 0x35, 0x6c, 0x75, 0xbd, 0x2a,
+	0x80, 0xab, 0x17, 0x25, 0x2a, 0x5c, 0x56, 0x50, 0x43, 0xd8, 0xf7, 0xf3, 0x38, 0xe7, 0x06, 0xb7,
+	0x56, 0x78, 0x47, 0xb1, 0xb3, 0x3a, 0xbf, 0x68, 0x48, 0xa5, 0x22, 0xb9, 0xd6, 0x50, 0xe7, 0xd6,
+	0xd7, 0xf8, 0xe1, 0xe1, 0x2b, 0xba, 0x4c, 0x1b, 0x56, 0xdc, 0xa0, 0xc6, 0x7b, 0xd2, 0x6c, 0x0f,
+	0x8a, 0xf5, 0xb6, 0x18, 0xce, 0xd0, 0xf0, 0x70, 0x67, 0x78, 0x86, 0xba, 0x8b, 0xe4, 0x3e, 0x8d,
+	0x6f, 0xa6, 0xb7, 0xd3, 0x78, 0xdc, 0xfb, 0x17, 0x76, 0xd1, 0xc9, 0x22, 0xb9, 0x4b, 0xe6, 0x8f,
+	0x49, 0xaf, 0x13, 0x9e, 0xa2, 0xa3, 0x45, 0xba, 0x7a, 0x98, 0xf7, 0x82, 0xd1, 0x77, 0x07, 0x0d,
+	0xd6, 0x50, 0xe0, 0x3f, 0x97, 0x1f, 0x5d, 0x1d, 0x46, 0xa6, 0xf6, 0x8e, 0xb4, 0xf3, 0x34, 0xda,
+	0x3b, 0x49, 0xd8, 0xe4, 0x5a, 0x62, 0xa8, 0x24, 0x91, 0x42, 0xbb, 0x2b, 0x9b, 0x84, 0x4b, 0x65,
+	0x7e, 0x09, 0xfc, 0xda, 0xbd, 0xef, 0xc1, 0xff, 0x49, 0x14, 0x7d, 0x04, 0xfd, 0x89, 0xb7, 0x8a,
+	0xb8, 0xc1, 0x5e, 0x5a, 0xb5, 0xa4, 0xd8, 0x06, 0x61, 0x3e, 0x9b, 0x7a, 0x16, 0x71, 0x93, 0xb5,
+	0xf5, 0x6c, 0x49, 0x33, 0x57, 0xff, 0x0a, 0x06, 0xfe, 0x93, 0xb1, 0x88, 0x1b, 0xc6, 0xda, 0x0e,
+	0xc6, 0x96, 0x94, 0x31, 0xd7, 0xf3, 0x7c, 0xec, 0x16, 0xa3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0x83, 0x52, 0x77, 0xd7, 0x08, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/promotion_extension_occasion.pb.go b/googleapis/ads/googleads/v3/enums/promotion_extension_occasion.pb.go
new file mode 100644
index 0000000..0a42988
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/promotion_extension_occasion.pb.go
@@ -0,0 +1,288 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/promotion_extension_occasion.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A promotion extension occasion.
+type PromotionExtensionOccasionEnum_PromotionExtensionOccasion int32
+
+const (
+	// Not specified.
+	PromotionExtensionOccasionEnum_UNSPECIFIED PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 0
+	// Used for return value only. Represents value unknown in this version.
+	PromotionExtensionOccasionEnum_UNKNOWN PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 1
+	// New Year's.
+	PromotionExtensionOccasionEnum_NEW_YEARS PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 2
+	// Chinese New Year.
+	PromotionExtensionOccasionEnum_CHINESE_NEW_YEAR PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 3
+	// Valentine's Day.
+	PromotionExtensionOccasionEnum_VALENTINES_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 4
+	// Easter.
+	PromotionExtensionOccasionEnum_EASTER PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 5
+	// Mother's Day.
+	PromotionExtensionOccasionEnum_MOTHERS_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 6
+	// Father's Day.
+	PromotionExtensionOccasionEnum_FATHERS_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 7
+	// Labor Day.
+	PromotionExtensionOccasionEnum_LABOR_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 8
+	// Back To School.
+	PromotionExtensionOccasionEnum_BACK_TO_SCHOOL PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 9
+	// Halloween.
+	PromotionExtensionOccasionEnum_HALLOWEEN PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 10
+	// Black Friday.
+	PromotionExtensionOccasionEnum_BLACK_FRIDAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 11
+	// Cyber Monday.
+	PromotionExtensionOccasionEnum_CYBER_MONDAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 12
+	// Christmas.
+	PromotionExtensionOccasionEnum_CHRISTMAS PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 13
+	// Boxing Day.
+	PromotionExtensionOccasionEnum_BOXING_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 14
+	// Independence Day in any country.
+	PromotionExtensionOccasionEnum_INDEPENDENCE_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 15
+	// National Day in any country.
+	PromotionExtensionOccasionEnum_NATIONAL_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 16
+	// End of any season.
+	PromotionExtensionOccasionEnum_END_OF_SEASON PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 17
+	// Winter Sale.
+	PromotionExtensionOccasionEnum_WINTER_SALE PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 18
+	// Summer sale.
+	PromotionExtensionOccasionEnum_SUMMER_SALE PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 19
+	// Fall Sale.
+	PromotionExtensionOccasionEnum_FALL_SALE PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 20
+	// Spring Sale.
+	PromotionExtensionOccasionEnum_SPRING_SALE PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 21
+	// Ramadan.
+	PromotionExtensionOccasionEnum_RAMADAN PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 22
+	// Eid al-Fitr.
+	PromotionExtensionOccasionEnum_EID_AL_FITR PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 23
+	// Eid al-Adha.
+	PromotionExtensionOccasionEnum_EID_AL_ADHA PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 24
+	// Singles Day.
+	PromotionExtensionOccasionEnum_SINGLES_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 25
+	// Women's Day.
+	PromotionExtensionOccasionEnum_WOMENS_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 26
+	// Holi.
+	PromotionExtensionOccasionEnum_HOLI PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 27
+	// Parent's Day.
+	PromotionExtensionOccasionEnum_PARENTS_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 28
+	// St. Nicholas Day.
+	PromotionExtensionOccasionEnum_ST_NICHOLAS_DAY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 29
+	// Carnival.
+	PromotionExtensionOccasionEnum_CARNIVAL PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 30
+	// Epiphany, also known as Three Kings' Day.
+	PromotionExtensionOccasionEnum_EPIPHANY PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 31
+	// Rosh Hashanah.
+	PromotionExtensionOccasionEnum_ROSH_HASHANAH PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 32
+	// Passover.
+	PromotionExtensionOccasionEnum_PASSOVER PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 33
+	// Hanukkah.
+	PromotionExtensionOccasionEnum_HANUKKAH PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 34
+	// Diwali.
+	PromotionExtensionOccasionEnum_DIWALI PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 35
+	// Navratri.
+	PromotionExtensionOccasionEnum_NAVRATRI PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 36
+	// Available in Thai: Songkran.
+	PromotionExtensionOccasionEnum_SONGKRAN PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 37
+	// Available in Japanese: Year-end Gift.
+	PromotionExtensionOccasionEnum_YEAR_END_GIFT PromotionExtensionOccasionEnum_PromotionExtensionOccasion = 38
+)
+
+var PromotionExtensionOccasionEnum_PromotionExtensionOccasion_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "NEW_YEARS",
+	3:  "CHINESE_NEW_YEAR",
+	4:  "VALENTINES_DAY",
+	5:  "EASTER",
+	6:  "MOTHERS_DAY",
+	7:  "FATHERS_DAY",
+	8:  "LABOR_DAY",
+	9:  "BACK_TO_SCHOOL",
+	10: "HALLOWEEN",
+	11: "BLACK_FRIDAY",
+	12: "CYBER_MONDAY",
+	13: "CHRISTMAS",
+	14: "BOXING_DAY",
+	15: "INDEPENDENCE_DAY",
+	16: "NATIONAL_DAY",
+	17: "END_OF_SEASON",
+	18: "WINTER_SALE",
+	19: "SUMMER_SALE",
+	20: "FALL_SALE",
+	21: "SPRING_SALE",
+	22: "RAMADAN",
+	23: "EID_AL_FITR",
+	24: "EID_AL_ADHA",
+	25: "SINGLES_DAY",
+	26: "WOMENS_DAY",
+	27: "HOLI",
+	28: "PARENTS_DAY",
+	29: "ST_NICHOLAS_DAY",
+	30: "CARNIVAL",
+	31: "EPIPHANY",
+	32: "ROSH_HASHANAH",
+	33: "PASSOVER",
+	34: "HANUKKAH",
+	35: "DIWALI",
+	36: "NAVRATRI",
+	37: "SONGKRAN",
+	38: "YEAR_END_GIFT",
+}
+
+var PromotionExtensionOccasionEnum_PromotionExtensionOccasion_value = map[string]int32{
+	"UNSPECIFIED":      0,
+	"UNKNOWN":          1,
+	"NEW_YEARS":        2,
+	"CHINESE_NEW_YEAR": 3,
+	"VALENTINES_DAY":   4,
+	"EASTER":           5,
+	"MOTHERS_DAY":      6,
+	"FATHERS_DAY":      7,
+	"LABOR_DAY":        8,
+	"BACK_TO_SCHOOL":   9,
+	"HALLOWEEN":        10,
+	"BLACK_FRIDAY":     11,
+	"CYBER_MONDAY":     12,
+	"CHRISTMAS":        13,
+	"BOXING_DAY":       14,
+	"INDEPENDENCE_DAY": 15,
+	"NATIONAL_DAY":     16,
+	"END_OF_SEASON":    17,
+	"WINTER_SALE":      18,
+	"SUMMER_SALE":      19,
+	"FALL_SALE":        20,
+	"SPRING_SALE":      21,
+	"RAMADAN":          22,
+	"EID_AL_FITR":      23,
+	"EID_AL_ADHA":      24,
+	"SINGLES_DAY":      25,
+	"WOMENS_DAY":       26,
+	"HOLI":             27,
+	"PARENTS_DAY":      28,
+	"ST_NICHOLAS_DAY":  29,
+	"CARNIVAL":         30,
+	"EPIPHANY":         31,
+	"ROSH_HASHANAH":    32,
+	"PASSOVER":         33,
+	"HANUKKAH":         34,
+	"DIWALI":           35,
+	"NAVRATRI":         36,
+	"SONGKRAN":         37,
+	"YEAR_END_GIFT":    38,
+}
+
+func (x PromotionExtensionOccasionEnum_PromotionExtensionOccasion) String() string {
+	return proto.EnumName(PromotionExtensionOccasionEnum_PromotionExtensionOccasion_name, int32(x))
+}
+
+func (PromotionExtensionOccasionEnum_PromotionExtensionOccasion) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8769a8b487cba8b6, []int{0, 0}
+}
+
+// Container for enum describing a promotion extension occasion.
+// For more information about the occasions please check:
+// https://support.google.com/google-ads/answer/7367521
+type PromotionExtensionOccasionEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PromotionExtensionOccasionEnum) Reset()         { *m = PromotionExtensionOccasionEnum{} }
+func (m *PromotionExtensionOccasionEnum) String() string { return proto.CompactTextString(m) }
+func (*PromotionExtensionOccasionEnum) ProtoMessage()    {}
+func (*PromotionExtensionOccasionEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8769a8b487cba8b6, []int{0}
+}
+
+func (m *PromotionExtensionOccasionEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PromotionExtensionOccasionEnum.Unmarshal(m, b)
+}
+func (m *PromotionExtensionOccasionEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PromotionExtensionOccasionEnum.Marshal(b, m, deterministic)
+}
+func (m *PromotionExtensionOccasionEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PromotionExtensionOccasionEnum.Merge(m, src)
+}
+func (m *PromotionExtensionOccasionEnum) XXX_Size() int {
+	return xxx_messageInfo_PromotionExtensionOccasionEnum.Size(m)
+}
+func (m *PromotionExtensionOccasionEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PromotionExtensionOccasionEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PromotionExtensionOccasionEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PromotionExtensionOccasionEnum_PromotionExtensionOccasion", PromotionExtensionOccasionEnum_PromotionExtensionOccasion_name, PromotionExtensionOccasionEnum_PromotionExtensionOccasion_value)
+	proto.RegisterType((*PromotionExtensionOccasionEnum)(nil), "google.ads.googleads.v3.enums.PromotionExtensionOccasionEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/promotion_extension_occasion.proto", fileDescriptor_8769a8b487cba8b6)
+}
+
+var fileDescriptor_8769a8b487cba8b6 = []byte{
+	// 669 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xcb, 0x6e, 0xdb, 0x3a,
+	0x10, 0xbd, 0x71, 0xde, 0xcc, 0x8b, 0x51, 0x72, 0x5f, 0xb9, 0x79, 0xdc, 0xe4, 0xde, 0x76, 0x29,
+	0x2f, 0xbc, 0x53, 0x37, 0x1d, 0x49, 0xb4, 0x45, 0x98, 0x1e, 0x0a, 0xa4, 0x6c, 0xd7, 0x85, 0x01,
+	0xc1, 0x8d, 0x0d, 0x23, 0x40, 0x2c, 0x19, 0x91, 0x13, 0xf4, 0x57, 0xba, 0xed, 0xb2, 0xdf, 0xd0,
+	0x2f, 0xe8, 0xa7, 0x74, 0xdd, 0x0f, 0x28, 0x46, 0x8a, 0xd3, 0x6e, 0xd2, 0x8d, 0x31, 0x73, 0xce,
+	0x99, 0x73, 0x4c, 0x8a, 0xc3, 0x5e, 0x4f, 0xf3, 0x7c, 0x7a, 0x3b, 0xa9, 0x8f, 0xc6, 0x45, 0xbd,
+	0x2a, 0xa9, 0x7a, 0x68, 0xd4, 0x27, 0xd9, 0xfd, 0xac, 0xa8, 0xcf, 0xef, 0xf2, 0x59, 0xbe, 0xb8,
+	0xc9, 0xb3, 0x74, 0xf2, 0x7e, 0x31, 0xc9, 0x0a, 0xaa, 0xf2, 0xeb, 0xeb, 0x11, 0x15, 0xee, 0xfc,
+	0x2e, 0x5f, 0xe4, 0xce, 0x59, 0x35, 0xe6, 0x8e, 0xc6, 0x85, 0xfb, 0xe4, 0xe0, 0x3e, 0x34, 0xdc,
+	0xd2, 0xe1, 0xe4, 0x74, 0x19, 0x30, 0xbf, 0xa9, 0x8f, 0xb2, 0x2c, 0x5f, 0x8c, 0xc8, 0xae, 0xa8,
+	0x86, 0xaf, 0x3e, 0xaf, 0xb3, 0xf3, 0x78, 0x99, 0x21, 0x96, 0x11, 0xfa, 0x31, 0x41, 0x64, 0xf7,
+	0xb3, 0xab, 0x0f, 0xeb, 0xec, 0xe4, 0x79, 0x89, 0x73, 0xc0, 0x76, 0xba, 0x68, 0x63, 0x11, 0xc8,
+	0xa6, 0x14, 0x21, 0xff, 0xcd, 0xd9, 0x61, 0x9b, 0x5d, 0x6c, 0xa3, 0xee, 0x23, 0x5f, 0x71, 0xf6,
+	0xd8, 0x36, 0x8a, 0x7e, 0x3a, 0x10, 0x60, 0x2c, 0xaf, 0x39, 0xc7, 0x8c, 0x07, 0x91, 0x44, 0x61,
+	0x45, 0xba, 0x84, 0xf9, 0xaa, 0xe3, 0xb0, 0xfd, 0x1e, 0x28, 0x81, 0x09, 0x31, 0x69, 0x08, 0x03,
+	0xbe, 0xe6, 0x30, 0xb6, 0x21, 0xc0, 0x26, 0xc2, 0xf0, 0x75, 0x8a, 0xe8, 0xe8, 0x24, 0x12, 0xa6,
+	0x22, 0x37, 0x08, 0x68, 0xc2, 0x0f, 0x60, 0x93, 0x62, 0x14, 0xf8, 0xda, 0x94, 0xed, 0x16, 0x19,
+	0xfa, 0x10, 0xb4, 0xd3, 0x44, 0xa7, 0x36, 0x88, 0xb4, 0x56, 0x7c, 0x9b, 0x24, 0x11, 0x28, 0xa5,
+	0xfb, 0x42, 0x20, 0x67, 0x0e, 0x67, 0xbb, 0xbe, 0x22, 0x4d, 0xd3, 0x48, 0x1a, 0xda, 0x21, 0x24,
+	0x18, 0xf8, 0xc2, 0xa4, 0x1d, 0x8d, 0x84, 0xec, 0xd2, 0x48, 0x10, 0x19, 0x69, 0x93, 0x0e, 0x58,
+	0xbe, 0xe7, 0xec, 0x33, 0xe6, 0xeb, 0x37, 0x12, 0x5b, 0x65, 0xca, 0x3e, 0x1d, 0x46, 0x62, 0x28,
+	0x62, 0x81, 0xa1, 0xc0, 0x40, 0x94, 0xe8, 0x01, 0xd9, 0x20, 0x24, 0x52, 0x23, 0xa8, 0x12, 0xe1,
+	0xce, 0x21, 0xdb, 0x13, 0x18, 0xa6, 0xba, 0x99, 0x5a, 0x01, 0x56, 0x23, 0x3f, 0xa4, 0x03, 0xf4,
+	0x25, 0x26, 0xc2, 0xa4, 0x16, 0x94, 0xe0, 0x0e, 0x01, 0xb6, 0xdb, 0xe9, 0x2c, 0x81, 0x23, 0xca,
+	0x6e, 0x82, 0x52, 0x55, 0x7b, 0x5c, 0xf2, 0xb1, 0xa1, 0xec, 0x12, 0xf8, 0x9d, 0x6e, 0xd9, 0x40,
+	0x07, 0x42, 0x40, 0xfe, 0x07, 0xb1, 0x42, 0x86, 0x29, 0xa8, 0xb4, 0x29, 0x13, 0xc3, 0xff, 0xfc,
+	0x09, 0x80, 0x30, 0x02, 0xfe, 0x57, 0x39, 0x2f, 0xb1, 0xa5, 0x1e, 0xef, 0xf7, 0x6f, 0x3a, 0x4c,
+	0x5f, 0x77, 0x04, 0x56, 0xfd, 0x89, 0xb3, 0xc5, 0xd6, 0x22, 0xad, 0x24, 0xff, 0x87, 0xa4, 0x31,
+	0x18, 0x81, 0x49, 0x45, 0x9d, 0x3a, 0x47, 0xec, 0xc0, 0x26, 0x29, 0xca, 0x20, 0xd2, 0x0a, 0x2a,
+	0xf0, 0xcc, 0xd9, 0x65, 0x5b, 0x01, 0x18, 0x94, 0x3d, 0x50, 0xfc, 0x9c, 0x3a, 0x11, 0xcb, 0x38,
+	0x02, 0x1c, 0xf0, 0x0b, 0x3a, 0xb0, 0xd1, 0x36, 0x4a, 0x23, 0xb0, 0x11, 0x20, 0x44, 0xfc, 0x5f,
+	0x12, 0xc4, 0x60, 0xad, 0xee, 0x09, 0xc3, 0x2f, 0xa9, 0x8b, 0x00, 0xbb, 0xed, 0x36, 0x44, 0xfc,
+	0x8a, 0x3e, 0x75, 0x28, 0xfb, 0xa0, 0x24, 0xff, 0x8f, 0x18, 0x84, 0x9e, 0x81, 0xc4, 0x48, 0xfe,
+	0x3f, 0x75, 0x56, 0x63, 0xab, 0x6d, 0x00, 0xf9, 0x0b, 0xb2, 0xa5, 0x07, 0x93, 0xd2, 0x65, 0xb6,
+	0x64, 0x33, 0xe1, 0x2f, 0xfd, 0x6f, 0x2b, 0xec, 0xf2, 0x3a, 0x9f, 0xb9, 0xbf, 0x5c, 0x01, 0xff,
+	0xe2, 0xf9, 0xe7, 0x1b, 0xd3, 0x16, 0xc4, 0x2b, 0x6f, 0xfd, 0x47, 0x87, 0x69, 0x7e, 0x3b, 0xca,
+	0xa6, 0x6e, 0x7e, 0x37, 0xad, 0x4f, 0x27, 0x59, 0xb9, 0x23, 0xcb, 0xb5, 0x9c, 0xdf, 0x14, 0xcf,
+	0x6c, 0xe9, 0xab, 0xf2, 0xf7, 0x63, 0x6d, 0xb5, 0x05, 0xf0, 0xa9, 0x76, 0xd6, 0xaa, 0xac, 0x60,
+	0x5c, 0xb8, 0x55, 0x49, 0x55, 0xaf, 0xe1, 0xd2, 0x36, 0x15, 0x5f, 0x96, 0xfc, 0x10, 0xc6, 0xc5,
+	0xf0, 0x89, 0x1f, 0xf6, 0x1a, 0xc3, 0x92, 0xff, 0x5a, 0xbb, 0xac, 0x40, 0xcf, 0x83, 0x71, 0xe1,
+	0x79, 0x4f, 0x0a, 0xcf, 0xeb, 0x35, 0x3c, 0xaf, 0xd4, 0xbc, 0xdb, 0x28, 0xff, 0x58, 0xe3, 0x7b,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0x57, 0xc4, 0xe8, 0xc4, 0x3d, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/promotion_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/promotion_placeholder_field.pb.go
new file mode 100644
index 0000000..12c9ff8
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/promotion_placeholder_field.pb.go
@@ -0,0 +1,191 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/promotion_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Promotion placeholder fields.
+type PromotionPlaceholderFieldEnum_PromotionPlaceholderField int32
+
+const (
+	// Not specified.
+	PromotionPlaceholderFieldEnum_UNSPECIFIED PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	PromotionPlaceholderFieldEnum_UNKNOWN PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 1
+	// Data Type: STRING. The text that appears on the ad when the extension is
+	// shown.
+	PromotionPlaceholderFieldEnum_PROMOTION_TARGET PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 2
+	// Data Type: STRING. Allows you to add "up to" phrase to the promotion,
+	// in case you have variable promotion rates.
+	PromotionPlaceholderFieldEnum_DISCOUNT_MODIFIER PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 3
+	// Data Type: INT64. Takes a value in micros, where 1 million micros
+	// represents 1%, and is shown as a percentage when rendered.
+	PromotionPlaceholderFieldEnum_PERCENT_OFF PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 4
+	// Data Type: MONEY. Requires a currency and an amount of money.
+	PromotionPlaceholderFieldEnum_MONEY_AMOUNT_OFF PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 5
+	// Data Type: STRING. A string that the user enters to get the discount.
+	PromotionPlaceholderFieldEnum_PROMOTION_CODE PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 6
+	// Data Type: MONEY. A minimum spend before the user qualifies for the
+	// promotion.
+	PromotionPlaceholderFieldEnum_ORDERS_OVER_AMOUNT PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 7
+	// Data Type: DATE. The start date of the promotion.
+	PromotionPlaceholderFieldEnum_PROMOTION_START PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 8
+	// Data Type: DATE. The end date of the promotion.
+	PromotionPlaceholderFieldEnum_PROMOTION_END PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 9
+	// Data Type: STRING. Describes the associated event for the promotion using
+	// one of the PromotionExtensionOccasion enum values, for example NEW_YEARS.
+	PromotionPlaceholderFieldEnum_OCCASION PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 10
+	// Data Type: URL_LIST. Final URLs to be used in the ad when using Upgraded
+	// URLs.
+	PromotionPlaceholderFieldEnum_FINAL_URLS PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 11
+	// Data Type: URL_LIST. Final mobile URLs for the ad when using Upgraded
+	// URLs.
+	PromotionPlaceholderFieldEnum_FINAL_MOBILE_URLS PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 12
+	// Data Type: URL. Tracking template for the ad when using Upgraded URLs.
+	PromotionPlaceholderFieldEnum_TRACKING_URL PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 13
+	// Data Type: STRING. A string represented by a language code for the
+	// promotion.
+	PromotionPlaceholderFieldEnum_LANGUAGE PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 14
+	// Data Type: STRING. Final URL suffix for the ad when using parallel
+	// tracking.
+	PromotionPlaceholderFieldEnum_FINAL_URL_SUFFIX PromotionPlaceholderFieldEnum_PromotionPlaceholderField = 15
+)
+
+var PromotionPlaceholderFieldEnum_PromotionPlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "PROMOTION_TARGET",
+	3:  "DISCOUNT_MODIFIER",
+	4:  "PERCENT_OFF",
+	5:  "MONEY_AMOUNT_OFF",
+	6:  "PROMOTION_CODE",
+	7:  "ORDERS_OVER_AMOUNT",
+	8:  "PROMOTION_START",
+	9:  "PROMOTION_END",
+	10: "OCCASION",
+	11: "FINAL_URLS",
+	12: "FINAL_MOBILE_URLS",
+	13: "TRACKING_URL",
+	14: "LANGUAGE",
+	15: "FINAL_URL_SUFFIX",
+}
+
+var PromotionPlaceholderFieldEnum_PromotionPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":        0,
+	"UNKNOWN":            1,
+	"PROMOTION_TARGET":   2,
+	"DISCOUNT_MODIFIER":  3,
+	"PERCENT_OFF":        4,
+	"MONEY_AMOUNT_OFF":   5,
+	"PROMOTION_CODE":     6,
+	"ORDERS_OVER_AMOUNT": 7,
+	"PROMOTION_START":    8,
+	"PROMOTION_END":      9,
+	"OCCASION":           10,
+	"FINAL_URLS":         11,
+	"FINAL_MOBILE_URLS":  12,
+	"TRACKING_URL":       13,
+	"LANGUAGE":           14,
+	"FINAL_URL_SUFFIX":   15,
+}
+
+func (x PromotionPlaceholderFieldEnum_PromotionPlaceholderField) String() string {
+	return proto.EnumName(PromotionPlaceholderFieldEnum_PromotionPlaceholderField_name, int32(x))
+}
+
+func (PromotionPlaceholderFieldEnum_PromotionPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3144856f64c0e58c, []int{0, 0}
+}
+
+// Values for Promotion placeholder fields.
+type PromotionPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PromotionPlaceholderFieldEnum) Reset()         { *m = PromotionPlaceholderFieldEnum{} }
+func (m *PromotionPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*PromotionPlaceholderFieldEnum) ProtoMessage()    {}
+func (*PromotionPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3144856f64c0e58c, []int{0}
+}
+
+func (m *PromotionPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PromotionPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *PromotionPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PromotionPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *PromotionPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PromotionPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *PromotionPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_PromotionPlaceholderFieldEnum.Size(m)
+}
+func (m *PromotionPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PromotionPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PromotionPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.PromotionPlaceholderFieldEnum_PromotionPlaceholderField", PromotionPlaceholderFieldEnum_PromotionPlaceholderField_name, PromotionPlaceholderFieldEnum_PromotionPlaceholderField_value)
+	proto.RegisterType((*PromotionPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.PromotionPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/promotion_placeholder_field.proto", fileDescriptor_3144856f64c0e58c)
+}
+
+var fileDescriptor_3144856f64c0e58c = []byte{
+	// 474 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xcd, 0x6e, 0x9b, 0x40,
+	0x10, 0xc7, 0x6b, 0xd2, 0x26, 0xe9, 0xda, 0xb1, 0x37, 0xdb, 0x0f, 0xa9, 0x55, 0x5d, 0x29, 0x79,
+	0x00, 0x38, 0x70, 0xa3, 0x87, 0x6a, 0x0d, 0x0b, 0x42, 0x31, 0xbb, 0x68, 0x01, 0xf7, 0x43, 0x96,
+	0x56, 0x34, 0x50, 0x6a, 0x09, 0xb3, 0xc8, 0xeb, 0xe4, 0x81, 0x7a, 0xec, 0xa3, 0x54, 0x7d, 0x92,
+	0x1e, 0x7a, 0xe9, 0x0b, 0x54, 0x0b, 0xb1, 0x7d, 0x72, 0x2f, 0x68, 0xf8, 0xcf, 0x7f, 0x7e, 0x33,
+	0xda, 0x19, 0xf0, 0xbe, 0x92, 0xb2, 0xaa, 0x4b, 0x2b, 0x2f, 0x94, 0xd5, 0x87, 0x3a, 0xba, 0xb7,
+	0xad, 0xb2, 0xb9, 0x5b, 0x2b, 0xab, 0xdd, 0xc8, 0xb5, 0xdc, 0xae, 0x64, 0x23, 0xda, 0x3a, 0xbf,
+	0x2d, 0xbf, 0xc9, 0xba, 0x28, 0x37, 0xe2, 0xeb, 0xaa, 0xac, 0x0b, 0xb3, 0xdd, 0xc8, 0xad, 0x44,
+	0xd3, 0xbe, 0xca, 0xcc, 0x0b, 0x65, 0xee, 0x01, 0xe6, 0xbd, 0x6d, 0x76, 0x80, 0xd7, 0x6f, 0x76,
+	0xfc, 0x76, 0x65, 0xe5, 0x4d, 0x23, 0xb7, 0xb9, 0xa6, 0xa9, 0xbe, 0xf8, 0xfa, 0x8f, 0x01, 0xa6,
+	0xf1, 0xae, 0x45, 0x7c, 0xe8, 0xe0, 0xeb, 0x06, 0xa4, 0xb9, 0x5b, 0x5f, 0xff, 0x32, 0xc0, 0xab,
+	0xa3, 0x0e, 0x34, 0x01, 0xc3, 0x8c, 0x26, 0x31, 0x71, 0x43, 0x3f, 0x24, 0x1e, 0x7c, 0x84, 0x86,
+	0xe0, 0x2c, 0xa3, 0x37, 0x94, 0x7d, 0xa0, 0x70, 0x80, 0x9e, 0x03, 0x18, 0x73, 0x16, 0xb1, 0x34,
+	0x64, 0x54, 0xa4, 0x98, 0x07, 0x24, 0x85, 0x06, 0x7a, 0x01, 0x2e, 0xbd, 0x30, 0x71, 0x59, 0x46,
+	0x53, 0x11, 0x31, 0x4f, 0x57, 0x72, 0x78, 0xa2, 0x51, 0x31, 0xe1, 0x2e, 0xa1, 0xa9, 0x60, 0xbe,
+	0x0f, 0x1f, 0xeb, 0xea, 0x88, 0x51, 0xf2, 0x49, 0xe0, 0xa8, 0xf3, 0x6a, 0xf5, 0x09, 0x42, 0x60,
+	0x7c, 0x60, 0xba, 0xcc, 0x23, 0xf0, 0x14, 0xbd, 0x04, 0x88, 0x71, 0x8f, 0xf0, 0x44, 0xb0, 0x05,
+	0xe1, 0x0f, 0x7e, 0x78, 0x86, 0x9e, 0x81, 0xc9, 0xc1, 0x9b, 0xa4, 0x98, 0xa7, 0xf0, 0x1c, 0x5d,
+	0x82, 0x8b, 0x83, 0x48, 0xa8, 0x07, 0x9f, 0xa2, 0x11, 0x38, 0x67, 0xae, 0x8b, 0x93, 0x90, 0x51,
+	0x08, 0xd0, 0x18, 0x00, 0x3f, 0xa4, 0x78, 0x2e, 0x32, 0x3e, 0x4f, 0xe0, 0x50, 0xcf, 0xdb, 0xff,
+	0x47, 0x6c, 0x16, 0xce, 0x49, 0x2f, 0x8f, 0x10, 0x04, 0xa3, 0x94, 0x63, 0xf7, 0x26, 0xa4, 0x81,
+	0x96, 0xe0, 0x85, 0xc6, 0xcc, 0x31, 0x0d, 0x32, 0x1c, 0x10, 0x38, 0xd6, 0xe3, 0xef, 0x31, 0x22,
+	0xc9, 0x7c, 0x3f, 0xfc, 0x08, 0x27, 0xb3, 0xbf, 0x03, 0x70, 0x75, 0x2b, 0xd7, 0xe6, 0x7f, 0x97,
+	0x36, 0x7b, 0x7b, 0xf4, 0xc5, 0x63, 0xbd, 0xb6, 0x78, 0xf0, 0x79, 0xf6, 0x00, 0xa8, 0x64, 0x9d,
+	0x37, 0x95, 0x29, 0x37, 0x95, 0x55, 0x95, 0x4d, 0xb7, 0xd4, 0xdd, 0x19, 0xb5, 0x2b, 0x75, 0xe4,
+	0xaa, 0xde, 0x75, 0xdf, 0xef, 0xc6, 0x49, 0x80, 0xf1, 0x0f, 0x63, 0x1a, 0xf4, 0x28, 0x5c, 0x28,
+	0xb3, 0x0f, 0x75, 0xb4, 0xb0, 0x4d, 0xbd, 0x7f, 0xf5, 0x73, 0x97, 0x5f, 0xe2, 0x42, 0x2d, 0xf7,
+	0xf9, 0xe5, 0xc2, 0x5e, 0x76, 0xf9, 0xdf, 0xc6, 0x55, 0x2f, 0x3a, 0x0e, 0x2e, 0x94, 0xe3, 0xec,
+	0x1d, 0x8e, 0xb3, 0xb0, 0x1d, 0xa7, 0xf3, 0x7c, 0x39, 0xed, 0x06, 0xb3, 0xff, 0x05, 0x00, 0x00,
+	0xff, 0xff, 0xe8, 0x56, 0xe2, 0xac, 0xed, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/proximity_radius_units.pb.go b/googleapis/ads/googleads/v3/enums/proximity_radius_units.pb.go
new file mode 100644
index 0000000..d52022c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/proximity_radius_units.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/proximity_radius_units.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The unit of radius distance in proximity (e.g. MILES)
+type ProximityRadiusUnitsEnum_ProximityRadiusUnits int32
+
+const (
+	// Not specified.
+	ProximityRadiusUnitsEnum_UNSPECIFIED ProximityRadiusUnitsEnum_ProximityRadiusUnits = 0
+	// Used for return value only. Represents value unknown in this version.
+	ProximityRadiusUnitsEnum_UNKNOWN ProximityRadiusUnitsEnum_ProximityRadiusUnits = 1
+	// Miles
+	ProximityRadiusUnitsEnum_MILES ProximityRadiusUnitsEnum_ProximityRadiusUnits = 2
+	// Kilometers
+	ProximityRadiusUnitsEnum_KILOMETERS ProximityRadiusUnitsEnum_ProximityRadiusUnits = 3
+)
+
+var ProximityRadiusUnitsEnum_ProximityRadiusUnits_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "MILES",
+	3: "KILOMETERS",
+}
+
+var ProximityRadiusUnitsEnum_ProximityRadiusUnits_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"MILES":       2,
+	"KILOMETERS":  3,
+}
+
+func (x ProximityRadiusUnitsEnum_ProximityRadiusUnits) String() string {
+	return proto.EnumName(ProximityRadiusUnitsEnum_ProximityRadiusUnits_name, int32(x))
+}
+
+func (ProximityRadiusUnitsEnum_ProximityRadiusUnits) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a987958cbc0f39f4, []int{0, 0}
+}
+
+// Container for enum describing unit of radius in proximity.
+type ProximityRadiusUnitsEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProximityRadiusUnitsEnum) Reset()         { *m = ProximityRadiusUnitsEnum{} }
+func (m *ProximityRadiusUnitsEnum) String() string { return proto.CompactTextString(m) }
+func (*ProximityRadiusUnitsEnum) ProtoMessage()    {}
+func (*ProximityRadiusUnitsEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a987958cbc0f39f4, []int{0}
+}
+
+func (m *ProximityRadiusUnitsEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProximityRadiusUnitsEnum.Unmarshal(m, b)
+}
+func (m *ProximityRadiusUnitsEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProximityRadiusUnitsEnum.Marshal(b, m, deterministic)
+}
+func (m *ProximityRadiusUnitsEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProximityRadiusUnitsEnum.Merge(m, src)
+}
+func (m *ProximityRadiusUnitsEnum) XXX_Size() int {
+	return xxx_messageInfo_ProximityRadiusUnitsEnum.Size(m)
+}
+func (m *ProximityRadiusUnitsEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProximityRadiusUnitsEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProximityRadiusUnitsEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ProximityRadiusUnitsEnum_ProximityRadiusUnits", ProximityRadiusUnitsEnum_ProximityRadiusUnits_name, ProximityRadiusUnitsEnum_ProximityRadiusUnits_value)
+	proto.RegisterType((*ProximityRadiusUnitsEnum)(nil), "google.ads.googleads.v3.enums.ProximityRadiusUnitsEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/proximity_radius_units.proto", fileDescriptor_a987958cbc0f39f4)
+}
+
+var fileDescriptor_a987958cbc0f39f4 = []byte{
+	// 313 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0x5d, 0x87, 0x8a, 0x19, 0x68, 0x29, 0x1e, 0x54, 0xdc, 0x61, 0x7b, 0x80, 0xe4, 0x90,
+	0x5b, 0x3c, 0x75, 0x1a, 0x47, 0xd9, 0xd6, 0x95, 0xcd, 0x4d, 0x90, 0xc2, 0x88, 0x66, 0x84, 0xe0,
+	0x9a, 0x94, 0xa6, 0x1d, 0xfa, 0x3a, 0x1e, 0x7d, 0x14, 0x1f, 0xc5, 0x83, 0xcf, 0x20, 0x4d, 0xd7,
+	0x9e, 0xa6, 0x97, 0xf2, 0xd1, 0xef, 0xff, 0xfd, 0xf2, 0xfd, 0xff, 0x80, 0x08, 0xad, 0xc5, 0x66,
+	0x8d, 0x18, 0x37, 0xa8, 0x92, 0xa5, 0xda, 0x62, 0xb4, 0x56, 0x45, 0x62, 0x50, 0x9a, 0xe9, 0x37,
+	0x99, 0xc8, 0xfc, 0x7d, 0x95, 0x31, 0x2e, 0x0b, 0xb3, 0x2a, 0x94, 0xcc, 0x0d, 0x4c, 0x33, 0x9d,
+	0x6b, 0xaf, 0x5b, 0x05, 0x20, 0xe3, 0x06, 0x36, 0x59, 0xb8, 0xc5, 0xd0, 0x66, 0xaf, 0xae, 0x6b,
+	0x74, 0x2a, 0x11, 0x53, 0x4a, 0xe7, 0x2c, 0x97, 0x5a, 0xed, 0xc2, 0xfd, 0x57, 0x70, 0x11, 0xd5,
+	0xf0, 0x99, 0x65, 0x2f, 0x4a, 0x34, 0x55, 0x45, 0xd2, 0x9f, 0x82, 0xf3, 0x7d, 0x9e, 0x77, 0x06,
+	0x3a, 0x8b, 0x70, 0x1e, 0xd1, 0xdb, 0xe0, 0x3e, 0xa0, 0x77, 0xee, 0x81, 0xd7, 0x01, 0xc7, 0x8b,
+	0x70, 0x14, 0x4e, 0x1f, 0x43, 0xb7, 0xe5, 0x9d, 0x80, 0xc3, 0x49, 0x30, 0xa6, 0x73, 0xd7, 0xf1,
+	0x4e, 0x01, 0x18, 0x05, 0xe3, 0xe9, 0x84, 0x3e, 0xd0, 0xd9, 0xdc, 0x6d, 0x0f, 0x7e, 0x5a, 0xa0,
+	0xf7, 0xa2, 0x13, 0xf8, 0x6f, 0xe1, 0xc1, 0xe5, 0xbe, 0x47, 0xa3, 0xb2, 0x6d, 0xd4, 0x7a, 0x1a,
+	0xec, 0xb2, 0x42, 0x6f, 0x98, 0x12, 0x50, 0x67, 0x02, 0x89, 0xb5, 0xb2, 0xbb, 0xd4, 0x87, 0x4b,
+	0xa5, 0xf9, 0xe3, 0x8e, 0x37, 0xf6, 0xfb, 0xe1, 0xb4, 0x87, 0xbe, 0xff, 0xe9, 0x74, 0x87, 0x15,
+	0xca, 0xe7, 0x06, 0x56, 0xb2, 0x54, 0x4b, 0x0c, 0xcb, 0xe5, 0xcd, 0x57, 0xed, 0xc7, 0x3e, 0x37,
+	0x71, 0xe3, 0xc7, 0x4b, 0x1c, 0x5b, 0xff, 0xdb, 0xe9, 0x55, 0x3f, 0x09, 0xf1, 0xb9, 0x21, 0xa4,
+	0x99, 0x20, 0x64, 0x89, 0x09, 0xb1, 0x33, 0xcf, 0x47, 0xb6, 0x18, 0xfe, 0x0d, 0x00, 0x00, 0xff,
+	0xff, 0xcc, 0x1e, 0x70, 0x1d, 0xdf, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/quality_score_bucket.pb.go b/googleapis/ads/googleads/v3/enums/quality_score_bucket.pb.go
new file mode 100644
index 0000000..6c57600
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/quality_score_bucket.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/quality_score_bucket.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum listing the possible quality score buckets.
+type QualityScoreBucketEnum_QualityScoreBucket int32
+
+const (
+	// Not specified.
+	QualityScoreBucketEnum_UNSPECIFIED QualityScoreBucketEnum_QualityScoreBucket = 0
+	// Used for return value only. Represents value unknown in this version.
+	QualityScoreBucketEnum_UNKNOWN QualityScoreBucketEnum_QualityScoreBucket = 1
+	// Quality of the creative is below average.
+	QualityScoreBucketEnum_BELOW_AVERAGE QualityScoreBucketEnum_QualityScoreBucket = 2
+	// Quality of the creative is average.
+	QualityScoreBucketEnum_AVERAGE QualityScoreBucketEnum_QualityScoreBucket = 3
+	// Quality of the creative is above average.
+	QualityScoreBucketEnum_ABOVE_AVERAGE QualityScoreBucketEnum_QualityScoreBucket = 4
+)
+
+var QualityScoreBucketEnum_QualityScoreBucket_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "BELOW_AVERAGE",
+	3: "AVERAGE",
+	4: "ABOVE_AVERAGE",
+}
+
+var QualityScoreBucketEnum_QualityScoreBucket_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"BELOW_AVERAGE": 2,
+	"AVERAGE":       3,
+	"ABOVE_AVERAGE": 4,
+}
+
+func (x QualityScoreBucketEnum_QualityScoreBucket) String() string {
+	return proto.EnumName(QualityScoreBucketEnum_QualityScoreBucket_name, int32(x))
+}
+
+func (QualityScoreBucketEnum_QualityScoreBucket) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_375aaff68f435146, []int{0, 0}
+}
+
+// The relative performance compared to other advertisers.
+type QualityScoreBucketEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *QualityScoreBucketEnum) Reset()         { *m = QualityScoreBucketEnum{} }
+func (m *QualityScoreBucketEnum) String() string { return proto.CompactTextString(m) }
+func (*QualityScoreBucketEnum) ProtoMessage()    {}
+func (*QualityScoreBucketEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_375aaff68f435146, []int{0}
+}
+
+func (m *QualityScoreBucketEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_QualityScoreBucketEnum.Unmarshal(m, b)
+}
+func (m *QualityScoreBucketEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_QualityScoreBucketEnum.Marshal(b, m, deterministic)
+}
+func (m *QualityScoreBucketEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_QualityScoreBucketEnum.Merge(m, src)
+}
+func (m *QualityScoreBucketEnum) XXX_Size() int {
+	return xxx_messageInfo_QualityScoreBucketEnum.Size(m)
+}
+func (m *QualityScoreBucketEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_QualityScoreBucketEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_QualityScoreBucketEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.QualityScoreBucketEnum_QualityScoreBucket", QualityScoreBucketEnum_QualityScoreBucket_name, QualityScoreBucketEnum_QualityScoreBucket_value)
+	proto.RegisterType((*QualityScoreBucketEnum)(nil), "google.ads.googleads.v3.enums.QualityScoreBucketEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/quality_score_bucket.proto", fileDescriptor_375aaff68f435146)
+}
+
+var fileDescriptor_375aaff68f435146 = []byte{
+	// 318 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0x5d, 0x27, 0x0a, 0x19, 0xe2, 0xec, 0x41, 0x41, 0xdc, 0x61, 0x7b, 0x80, 0xf4, 0x90,
+	0x8b, 0xc4, 0x53, 0xa2, 0x71, 0x0c, 0xa5, 0x9b, 0x8e, 0x75, 0x20, 0x85, 0x91, 0xad, 0x21, 0x14,
+	0xb7, 0x64, 0x2e, 0xed, 0xc0, 0x93, 0xef, 0xe2, 0xd1, 0x47, 0xf1, 0x51, 0xc4, 0x87, 0x90, 0x24,
+	0xb6, 0x97, 0xa1, 0x97, 0xf2, 0x35, 0xbf, 0xff, 0xf7, 0xf1, 0xff, 0x7f, 0xe0, 0x52, 0x6a, 0x2d,
+	0x97, 0x22, 0xe2, 0x99, 0x89, 0xbc, 0xb4, 0x6a, 0x8b, 0x22, 0xa1, 0xca, 0x95, 0x89, 0x5e, 0x4a,
+	0xbe, 0xcc, 0x8b, 0xd7, 0x99, 0x59, 0xe8, 0x8d, 0x98, 0xcd, 0xcb, 0xc5, 0xb3, 0x28, 0xe0, 0x7a,
+	0xa3, 0x0b, 0x1d, 0x76, 0xfc, 0x38, 0xe4, 0x99, 0x81, 0xb5, 0x13, 0x6e, 0x11, 0x74, 0xce, 0xf3,
+	0x8b, 0x2a, 0x78, 0x9d, 0x47, 0x5c, 0x29, 0x5d, 0xf0, 0x22, 0xd7, 0xca, 0x78, 0x73, 0xef, 0x0d,
+	0x9c, 0x3e, 0xf8, 0xe8, 0xb1, 0x4d, 0xa6, 0x2e, 0x98, 0xa9, 0x72, 0xd5, 0x13, 0x20, 0xdc, 0x25,
+	0xe1, 0x31, 0x68, 0x4d, 0xe2, 0xf1, 0x88, 0x5d, 0x0f, 0x6e, 0x07, 0xec, 0xa6, 0xbd, 0x17, 0xb6,
+	0xc0, 0xe1, 0x24, 0xbe, 0x8b, 0x87, 0xd3, 0xb8, 0xdd, 0x08, 0x4f, 0xc0, 0x11, 0x65, 0xf7, 0xc3,
+	0xe9, 0x8c, 0x24, 0xec, 0x91, 0xf4, 0x59, 0x3b, 0xb0, 0xbc, 0xfa, 0x69, 0x5a, 0x4e, 0xe8, 0x30,
+	0x61, 0x35, 0xdf, 0xa7, 0xdf, 0x0d, 0xd0, 0x5d, 0xe8, 0x15, 0xfc, 0xf7, 0x08, 0x7a, 0xb6, 0xbb,
+	0xca, 0xc8, 0xee, 0x3f, 0x6a, 0x3c, 0xd1, 0x5f, 0xa7, 0xd4, 0x4b, 0xae, 0x24, 0xd4, 0x1b, 0x19,
+	0x49, 0xa1, 0xdc, 0x75, 0x55, 0x91, 0xeb, 0xdc, 0xfc, 0xd1, 0xeb, 0x95, 0xfb, 0xbe, 0x07, 0xcd,
+	0x3e, 0x21, 0x1f, 0x41, 0xa7, 0xef, 0xa3, 0x48, 0x66, 0xa0, 0x97, 0x56, 0x25, 0x08, 0xda, 0x42,
+	0xcc, 0x67, 0xc5, 0x53, 0x92, 0x99, 0xb4, 0xe6, 0x69, 0x82, 0x52, 0xc7, 0xbf, 0x82, 0xae, 0x7f,
+	0xc4, 0x98, 0x64, 0x06, 0xe3, 0x7a, 0x02, 0xe3, 0x04, 0x61, 0xec, 0x66, 0xe6, 0x07, 0x6e, 0x31,
+	0xf4, 0x13, 0x00, 0x00, 0xff, 0xff, 0x4c, 0xd9, 0xc1, 0x43, 0xef, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/reach_plan_ad_length.pb.go b/googleapis/ads/googleads/v3/enums/reach_plan_ad_length.pb.go
new file mode 100644
index 0000000..0f08f2a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/reach_plan_ad_length.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/reach_plan_ad_length.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible ad length values.
+type ReachPlanAdLengthEnum_ReachPlanAdLength int32
+
+const (
+	// Not specified.
+	ReachPlanAdLengthEnum_UNSPECIFIED ReachPlanAdLengthEnum_ReachPlanAdLength = 0
+	// The value is unknown in this version.
+	ReachPlanAdLengthEnum_UNKNOWN ReachPlanAdLengthEnum_ReachPlanAdLength = 1
+	// 6 seconds long ad.
+	ReachPlanAdLengthEnum_SIX_SECONDS ReachPlanAdLengthEnum_ReachPlanAdLength = 2
+	// 15 or 20 seconds long ad.
+	ReachPlanAdLengthEnum_FIFTEEN_OR_TWENTY_SECONDS ReachPlanAdLengthEnum_ReachPlanAdLength = 3
+	// More than 20 seconds long ad.
+	ReachPlanAdLengthEnum_TWENTY_SECONDS_OR_MORE ReachPlanAdLengthEnum_ReachPlanAdLength = 4
+)
+
+var ReachPlanAdLengthEnum_ReachPlanAdLength_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "SIX_SECONDS",
+	3: "FIFTEEN_OR_TWENTY_SECONDS",
+	4: "TWENTY_SECONDS_OR_MORE",
+}
+
+var ReachPlanAdLengthEnum_ReachPlanAdLength_value = map[string]int32{
+	"UNSPECIFIED":               0,
+	"UNKNOWN":                   1,
+	"SIX_SECONDS":               2,
+	"FIFTEEN_OR_TWENTY_SECONDS": 3,
+	"TWENTY_SECONDS_OR_MORE":    4,
+}
+
+func (x ReachPlanAdLengthEnum_ReachPlanAdLength) String() string {
+	return proto.EnumName(ReachPlanAdLengthEnum_ReachPlanAdLength_name, int32(x))
+}
+
+func (ReachPlanAdLengthEnum_ReachPlanAdLength) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_defa8c9b250c2696, []int{0, 0}
+}
+
+// Message describing length of a plannable video ad.
+type ReachPlanAdLengthEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ReachPlanAdLengthEnum) Reset()         { *m = ReachPlanAdLengthEnum{} }
+func (m *ReachPlanAdLengthEnum) String() string { return proto.CompactTextString(m) }
+func (*ReachPlanAdLengthEnum) ProtoMessage()    {}
+func (*ReachPlanAdLengthEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_defa8c9b250c2696, []int{0}
+}
+
+func (m *ReachPlanAdLengthEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ReachPlanAdLengthEnum.Unmarshal(m, b)
+}
+func (m *ReachPlanAdLengthEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ReachPlanAdLengthEnum.Marshal(b, m, deterministic)
+}
+func (m *ReachPlanAdLengthEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ReachPlanAdLengthEnum.Merge(m, src)
+}
+func (m *ReachPlanAdLengthEnum) XXX_Size() int {
+	return xxx_messageInfo_ReachPlanAdLengthEnum.Size(m)
+}
+func (m *ReachPlanAdLengthEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ReachPlanAdLengthEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ReachPlanAdLengthEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ReachPlanAdLengthEnum_ReachPlanAdLength", ReachPlanAdLengthEnum_ReachPlanAdLength_name, ReachPlanAdLengthEnum_ReachPlanAdLength_value)
+	proto.RegisterType((*ReachPlanAdLengthEnum)(nil), "google.ads.googleads.v3.enums.ReachPlanAdLengthEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/reach_plan_ad_length.proto", fileDescriptor_defa8c9b250c2696)
+}
+
+var fileDescriptor_defa8c9b250c2696 = []byte{
+	// 342 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xcf, 0x4a, 0xeb, 0x40,
+	0x18, 0xc5, 0x6f, 0xd2, 0xcb, 0xbd, 0x30, 0x5d, 0x18, 0x03, 0x16, 0x2c, 0x76, 0xd1, 0x3e, 0xc0,
+	0x64, 0x91, 0x8d, 0x8c, 0xab, 0xb4, 0x9d, 0x96, 0xa0, 0x26, 0xa1, 0xe9, 0x1f, 0x95, 0x40, 0x18,
+	0x3b, 0x61, 0x5a, 0x48, 0x67, 0x42, 0x27, 0xed, 0xce, 0xd7, 0xf0, 0x01, 0x5c, 0xfa, 0x28, 0x3e,
+	0x8a, 0xbe, 0x84, 0xcc, 0xc4, 0x06, 0xa4, 0xe8, 0x66, 0x38, 0xcc, 0xef, 0x9c, 0xc3, 0xf7, 0x7d,
+	0xe0, 0x92, 0x09, 0xc1, 0xf2, 0xcc, 0x21, 0x54, 0x3a, 0x95, 0x54, 0x6a, 0xef, 0x3a, 0x19, 0xdf,
+	0x6d, 0xa4, 0xb3, 0xcd, 0xc8, 0x72, 0x95, 0x16, 0x39, 0xe1, 0x29, 0xa1, 0x69, 0x9e, 0x71, 0x56,
+	0xae, 0x60, 0xb1, 0x15, 0xa5, 0xb0, 0x3b, 0x95, 0x1d, 0x12, 0x2a, 0x61, 0x9d, 0x84, 0x7b, 0x17,
+	0xea, 0x64, 0xfb, 0xe2, 0x50, 0x5c, 0xac, 0x1d, 0xc2, 0xb9, 0x28, 0x49, 0xb9, 0x16, 0x5c, 0x56,
+	0xe1, 0xde, 0xb3, 0x01, 0xce, 0x26, 0xaa, 0x3b, 0xca, 0x09, 0xf7, 0xe8, 0x8d, 0x2e, 0xc6, 0x7c,
+	0xb7, 0xe9, 0x3d, 0x81, 0xd3, 0x23, 0x60, 0x9f, 0x80, 0xe6, 0x2c, 0x88, 0x23, 0x3c, 0xf0, 0x47,
+	0x3e, 0x1e, 0x5a, 0x7f, 0xec, 0x26, 0xf8, 0x3f, 0x0b, 0xae, 0x83, 0x70, 0x11, 0x58, 0x86, 0xa2,
+	0xb1, 0x7f, 0x97, 0xc6, 0x78, 0x10, 0x06, 0xc3, 0xd8, 0x32, 0xed, 0x0e, 0x38, 0x1f, 0xf9, 0xa3,
+	0x29, 0xc6, 0x41, 0x1a, 0x4e, 0xd2, 0xe9, 0x02, 0x07, 0xd3, 0xfb, 0x1a, 0x37, 0xec, 0x36, 0x68,
+	0x7d, 0xff, 0x53, 0xae, 0xdb, 0x70, 0x82, 0xad, 0xbf, 0xfd, 0x0f, 0x03, 0x74, 0x97, 0x62, 0x03,
+	0x7f, 0x5d, 0xae, 0xdf, 0x3a, 0x1a, 0x31, 0x52, 0x6b, 0x45, 0xc6, 0x43, 0xff, 0x2b, 0xc8, 0x44,
+	0x4e, 0x38, 0x83, 0x62, 0xcb, 0x1c, 0x96, 0x71, 0xbd, 0xf4, 0xe1, 0xbe, 0xc5, 0x5a, 0xfe, 0x70,
+	0xee, 0x2b, 0xfd, 0xbe, 0x98, 0x8d, 0xb1, 0xe7, 0xbd, 0x9a, 0x9d, 0x71, 0x55, 0xe5, 0x51, 0x09,
+	0x2b, 0xa9, 0xd4, 0xdc, 0x85, 0xea, 0x4e, 0xf2, 0xed, 0xc0, 0x13, 0x8f, 0xca, 0xa4, 0xe6, 0xc9,
+	0xdc, 0x4d, 0x34, 0x7f, 0x37, 0xbb, 0xd5, 0x27, 0x42, 0x1e, 0x95, 0x08, 0xd5, 0x0e, 0x84, 0xe6,
+	0x2e, 0x42, 0xda, 0xf3, 0xf8, 0x4f, 0x0f, 0xe6, 0x7e, 0x06, 0x00, 0x00, 0xff, 0xff, 0x16, 0xb4,
+	0x90, 0xd1, 0x06, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/reach_plan_age_range.pb.go b/googleapis/ads/googleads/v3/enums/reach_plan_age_range.pb.go
new file mode 100644
index 0000000..5faec28
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/reach_plan_age_range.pb.go
@@ -0,0 +1,230 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/reach_plan_age_range.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible plannable age range values.
+type ReachPlanAgeRangeEnum_ReachPlanAgeRange int32
+
+const (
+	// Not specified.
+	ReachPlanAgeRangeEnum_UNSPECIFIED ReachPlanAgeRangeEnum_ReachPlanAgeRange = 0
+	// The value is unknown in this version.
+	ReachPlanAgeRangeEnum_UNKNOWN ReachPlanAgeRangeEnum_ReachPlanAgeRange = 1
+	// Between 18 and 24 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_18_24 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 503001
+	// Between 18 and 34 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_18_34 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 2
+	// Between 18 and 44 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_18_44 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 3
+	// Between 18 and 49 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_18_49 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 4
+	// Between 18 and 54 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_18_54 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 5
+	// Between 18 and 64 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_18_64 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 6
+	// Between 18 and 65+ years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_18_65_UP ReachPlanAgeRangeEnum_ReachPlanAgeRange = 7
+	// Between 21 and 34 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_21_34 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 8
+	// Between 25 and 34 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_25_34 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 503002
+	// Between 25 and 44 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_25_44 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 9
+	// Between 25 and 49 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_25_49 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 10
+	// Between 25 and 54 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_25_54 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 11
+	// Between 25 and 64 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_25_64 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 12
+	// Between 25 and 65+ years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_25_65_UP ReachPlanAgeRangeEnum_ReachPlanAgeRange = 13
+	// Between 35 and 44 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_35_44 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 503003
+	// Between 35 and 49 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_35_49 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 14
+	// Between 35 and 54 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_35_54 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 15
+	// Between 35 and 64 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_35_64 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 16
+	// Between 35 and 65+ years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_35_65_UP ReachPlanAgeRangeEnum_ReachPlanAgeRange = 17
+	// Between 45 and 54 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_45_54 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 503004
+	// Between 45 and 64 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_45_64 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 18
+	// Between 45 and 65+ years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_45_65_UP ReachPlanAgeRangeEnum_ReachPlanAgeRange = 19
+	// Between 50 and 65+ years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_50_65_UP ReachPlanAgeRangeEnum_ReachPlanAgeRange = 20
+	// Between 55 and 64 years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_55_64 ReachPlanAgeRangeEnum_ReachPlanAgeRange = 503005
+	// Between 55 and 65+ years old.
+	ReachPlanAgeRangeEnum_AGE_RANGE_55_65_UP ReachPlanAgeRangeEnum_ReachPlanAgeRange = 21
+	// 65 years old and beyond.
+	ReachPlanAgeRangeEnum_AGE_RANGE_65_UP ReachPlanAgeRangeEnum_ReachPlanAgeRange = 503006
+)
+
+var ReachPlanAgeRangeEnum_ReachPlanAgeRange_name = map[int32]string{
+	0:      "UNSPECIFIED",
+	1:      "UNKNOWN",
+	503001: "AGE_RANGE_18_24",
+	2:      "AGE_RANGE_18_34",
+	3:      "AGE_RANGE_18_44",
+	4:      "AGE_RANGE_18_49",
+	5:      "AGE_RANGE_18_54",
+	6:      "AGE_RANGE_18_64",
+	7:      "AGE_RANGE_18_65_UP",
+	8:      "AGE_RANGE_21_34",
+	503002: "AGE_RANGE_25_34",
+	9:      "AGE_RANGE_25_44",
+	10:     "AGE_RANGE_25_49",
+	11:     "AGE_RANGE_25_54",
+	12:     "AGE_RANGE_25_64",
+	13:     "AGE_RANGE_25_65_UP",
+	503003: "AGE_RANGE_35_44",
+	14:     "AGE_RANGE_35_49",
+	15:     "AGE_RANGE_35_54",
+	16:     "AGE_RANGE_35_64",
+	17:     "AGE_RANGE_35_65_UP",
+	503004: "AGE_RANGE_45_54",
+	18:     "AGE_RANGE_45_64",
+	19:     "AGE_RANGE_45_65_UP",
+	20:     "AGE_RANGE_50_65_UP",
+	503005: "AGE_RANGE_55_64",
+	21:     "AGE_RANGE_55_65_UP",
+	503006: "AGE_RANGE_65_UP",
+}
+
+var ReachPlanAgeRangeEnum_ReachPlanAgeRange_value = map[string]int32{
+	"UNSPECIFIED":        0,
+	"UNKNOWN":            1,
+	"AGE_RANGE_18_24":    503001,
+	"AGE_RANGE_18_34":    2,
+	"AGE_RANGE_18_44":    3,
+	"AGE_RANGE_18_49":    4,
+	"AGE_RANGE_18_54":    5,
+	"AGE_RANGE_18_64":    6,
+	"AGE_RANGE_18_65_UP": 7,
+	"AGE_RANGE_21_34":    8,
+	"AGE_RANGE_25_34":    503002,
+	"AGE_RANGE_25_44":    9,
+	"AGE_RANGE_25_49":    10,
+	"AGE_RANGE_25_54":    11,
+	"AGE_RANGE_25_64":    12,
+	"AGE_RANGE_25_65_UP": 13,
+	"AGE_RANGE_35_44":    503003,
+	"AGE_RANGE_35_49":    14,
+	"AGE_RANGE_35_54":    15,
+	"AGE_RANGE_35_64":    16,
+	"AGE_RANGE_35_65_UP": 17,
+	"AGE_RANGE_45_54":    503004,
+	"AGE_RANGE_45_64":    18,
+	"AGE_RANGE_45_65_UP": 19,
+	"AGE_RANGE_50_65_UP": 20,
+	"AGE_RANGE_55_64":    503005,
+	"AGE_RANGE_55_65_UP": 21,
+	"AGE_RANGE_65_UP":    503006,
+}
+
+func (x ReachPlanAgeRangeEnum_ReachPlanAgeRange) String() string {
+	return proto.EnumName(ReachPlanAgeRangeEnum_ReachPlanAgeRange_name, int32(x))
+}
+
+func (ReachPlanAgeRangeEnum_ReachPlanAgeRange) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_aa9ffb3fe54db3d3, []int{0, 0}
+}
+
+// Message describing plannable age ranges.
+type ReachPlanAgeRangeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ReachPlanAgeRangeEnum) Reset()         { *m = ReachPlanAgeRangeEnum{} }
+func (m *ReachPlanAgeRangeEnum) String() string { return proto.CompactTextString(m) }
+func (*ReachPlanAgeRangeEnum) ProtoMessage()    {}
+func (*ReachPlanAgeRangeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aa9ffb3fe54db3d3, []int{0}
+}
+
+func (m *ReachPlanAgeRangeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ReachPlanAgeRangeEnum.Unmarshal(m, b)
+}
+func (m *ReachPlanAgeRangeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ReachPlanAgeRangeEnum.Marshal(b, m, deterministic)
+}
+func (m *ReachPlanAgeRangeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ReachPlanAgeRangeEnum.Merge(m, src)
+}
+func (m *ReachPlanAgeRangeEnum) XXX_Size() int {
+	return xxx_messageInfo_ReachPlanAgeRangeEnum.Size(m)
+}
+func (m *ReachPlanAgeRangeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ReachPlanAgeRangeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ReachPlanAgeRangeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ReachPlanAgeRangeEnum_ReachPlanAgeRange", ReachPlanAgeRangeEnum_ReachPlanAgeRange_name, ReachPlanAgeRangeEnum_ReachPlanAgeRange_value)
+	proto.RegisterType((*ReachPlanAgeRangeEnum)(nil), "google.ads.googleads.v3.enums.ReachPlanAgeRangeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/reach_plan_age_range.proto", fileDescriptor_aa9ffb3fe54db3d3)
+}
+
+var fileDescriptor_aa9ffb3fe54db3d3 = []byte{
+	// 469 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0xdf, 0x6e, 0xd3, 0x30,
+	0x14, 0xc6, 0x69, 0xf7, 0x0f, 0x5c, 0xa0, 0x5e, 0x46, 0x77, 0x81, 0x58, 0xa5, 0xed, 0x01, 0x1c,
+	0x56, 0x3b, 0xd5, 0x16, 0xae, 0x5c, 0x08, 0xd5, 0x84, 0x14, 0xa2, 0xa2, 0x16, 0x09, 0x55, 0x8a,
+	0xcc, 0x12, 0x99, 0x4a, 0xad, 0x5d, 0xd5, 0xdd, 0x5e, 0x82, 0xb7, 0xe0, 0x92, 0x47, 0xe1, 0x0d,
+	0xc2, 0xbf, 0x07, 0x80, 0x2b, 0xde, 0x00, 0xd9, 0x69, 0x2a, 0x39, 0x16, 0xdc, 0x58, 0x47, 0xbf,
+	0x73, 0xce, 0xf7, 0x7d, 0x17, 0xc7, 0xe0, 0x82, 0x4b, 0xc9, 0xe7, 0xb9, 0xcf, 0x32, 0xe5, 0x97,
+	0xa5, 0xae, 0x6e, 0xb1, 0x9f, 0x8b, 0x9b, 0x85, 0xf2, 0x57, 0x39, 0xbb, 0xfe, 0x90, 0x2e, 0xe7,
+	0x4c, 0xa4, 0x8c, 0xe7, 0xe9, 0x8a, 0x09, 0x9e, 0xa3, 0xe5, 0x4a, 0xae, 0xa5, 0x77, 0x52, 0x8e,
+	0x23, 0x96, 0x29, 0xb4, 0xdd, 0x44, 0xb7, 0x18, 0x99, 0xcd, 0xc7, 0x4f, 0x2a, 0xe1, 0xe5, 0xcc,
+	0x67, 0x42, 0xc8, 0x35, 0x5b, 0xcf, 0xa4, 0x50, 0xe5, 0xf2, 0xd9, 0xc7, 0x3d, 0xd0, 0x19, 0x69,
+	0xed, 0x64, 0xce, 0x04, 0xe5, 0xf9, 0x48, 0x0b, 0x47, 0xe2, 0x66, 0x71, 0xf6, 0x67, 0x17, 0x1c,
+	0x3a, 0x1d, 0xaf, 0x0d, 0x5a, 0xe3, 0xf8, 0x4d, 0x12, 0x3d, 0xbf, 0x7a, 0x79, 0x15, 0xbd, 0x80,
+	0x77, 0xbc, 0x16, 0x38, 0x18, 0xc7, 0xaf, 0xe2, 0xd7, 0x6f, 0x63, 0xd8, 0xf0, 0x3a, 0xa0, 0x4d,
+	0x87, 0x51, 0x3a, 0xa2, 0xf1, 0x30, 0x4a, 0xcf, 0x2f, 0xd2, 0x1e, 0x81, 0x45, 0xd1, 0xf5, 0x8e,
+	0x6a, 0x18, 0x13, 0xd8, 0x74, 0x20, 0x21, 0x70, 0xc7, 0x85, 0x97, 0x70, 0xd7, 0x81, 0x01, 0x81,
+	0x7b, 0x0e, 0xec, 0x13, 0xb8, 0xef, 0x1d, 0x03, 0xcf, 0x86, 0x41, 0x3a, 0x4e, 0xe0, 0x81, 0x3d,
+	0xdc, 0x3b, 0xd7, 0x01, 0xee, 0xda, 0x61, 0x7b, 0x81, 0x86, 0x5f, 0xeb, 0x61, 0x7b, 0x81, 0xce,
+	0x75, 0xcf, 0x85, 0x97, 0x10, 0x38, 0x30, 0x20, 0xb0, 0xe5, 0xc0, 0x3e, 0x81, 0xf7, 0xed, 0x5c,
+	0x1a, 0x9a, 0x5c, 0x0f, 0xec, 0x08, 0xd8, 0x78, 0x7d, 0xab, 0x47, 0xc0, 0xc6, 0xed, 0xa1, 0x03,
+	0x03, 0x02, 0xdb, 0x0e, 0xec, 0x13, 0x08, 0x6d, 0x37, 0x5c, 0xb9, 0x1d, 0xda, 0x6e, 0xc4, 0x28,
+	0x7c, 0xaf, 0xbb, 0x11, 0xa3, 0xe1, 0xd9, 0x1a, 0xa4, 0xd2, 0x38, 0xb2, 0x79, 0xf0, 0x74, 0xc3,
+	0x1f, 0xd9, 0xda, 0x81, 0x11, 0xf9, 0x51, 0x74, 0x6b, 0xe3, 0x95, 0x4c, 0xc7, 0x1e, 0x2f, 0xe1,
+	0xcf, 0xa2, 0x3b, 0xf8, 0xdd, 0x00, 0xa7, 0xd7, 0x72, 0x81, 0xfe, 0x7b, 0xd1, 0x83, 0x63, 0xe7,
+	0x2c, 0x13, 0x7d, 0xcb, 0x49, 0xe3, 0xdd, 0x60, 0xb3, 0xc8, 0xe5, 0x9c, 0x09, 0x8e, 0xe4, 0x8a,
+	0xfb, 0x3c, 0x17, 0xe6, 0xd2, 0xab, 0x4f, 0xb5, 0x9c, 0xa9, 0x7f, 0xfc, 0xb1, 0x67, 0xe6, 0xfd,
+	0xd4, 0xdc, 0x19, 0x52, 0xfa, 0xb9, 0x79, 0x32, 0x2c, 0xa5, 0x68, 0xa6, 0x50, 0x59, 0xea, 0x6a,
+	0x82, 0x91, 0xfe, 0x1c, 0xea, 0x4b, 0xd5, 0x9f, 0xd2, 0x4c, 0x4d, 0xb7, 0xfd, 0xe9, 0x04, 0x4f,
+	0x4d, 0xff, 0x57, 0xf3, 0xb4, 0x84, 0x61, 0x48, 0x33, 0x15, 0x86, 0xdb, 0x89, 0x30, 0x9c, 0xe0,
+	0x30, 0x34, 0x33, 0xef, 0xf7, 0x4d, 0x30, 0xfc, 0x37, 0x00, 0x00, 0xff, 0xff, 0x17, 0x4f, 0x5d,
+	0x4f, 0xfb, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/reach_plan_network.pb.go b/googleapis/ads/googleads/v3/enums/reach_plan_network.pb.go
new file mode 100644
index 0000000..00561f1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/reach_plan_network.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/reach_plan_network.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible plannable network values.
+type ReachPlanNetworkEnum_ReachPlanNetwork int32
+
+const (
+	// Not specified.
+	ReachPlanNetworkEnum_UNSPECIFIED ReachPlanNetworkEnum_ReachPlanNetwork = 0
+	// Used as a return value only. Represents value unknown in this version.
+	ReachPlanNetworkEnum_UNKNOWN ReachPlanNetworkEnum_ReachPlanNetwork = 1
+	// YouTube network.
+	ReachPlanNetworkEnum_YOUTUBE ReachPlanNetworkEnum_ReachPlanNetwork = 2
+	// Google Video Partners (GVP) network.
+	ReachPlanNetworkEnum_GOOGLE_VIDEO_PARTNERS ReachPlanNetworkEnum_ReachPlanNetwork = 3
+	// A combination of the YouTube network and the Google Video Partners
+	// network.
+	ReachPlanNetworkEnum_YOUTUBE_AND_GOOGLE_VIDEO_PARTNERS ReachPlanNetworkEnum_ReachPlanNetwork = 4
+)
+
+var ReachPlanNetworkEnum_ReachPlanNetwork_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "YOUTUBE",
+	3: "GOOGLE_VIDEO_PARTNERS",
+	4: "YOUTUBE_AND_GOOGLE_VIDEO_PARTNERS",
+}
+
+var ReachPlanNetworkEnum_ReachPlanNetwork_value = map[string]int32{
+	"UNSPECIFIED":                       0,
+	"UNKNOWN":                           1,
+	"YOUTUBE":                           2,
+	"GOOGLE_VIDEO_PARTNERS":             3,
+	"YOUTUBE_AND_GOOGLE_VIDEO_PARTNERS": 4,
+}
+
+func (x ReachPlanNetworkEnum_ReachPlanNetwork) String() string {
+	return proto.EnumName(ReachPlanNetworkEnum_ReachPlanNetwork_name, int32(x))
+}
+
+func (ReachPlanNetworkEnum_ReachPlanNetwork) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_604f342e4658a385, []int{0, 0}
+}
+
+// Container for enum describing plannable networks.
+type ReachPlanNetworkEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ReachPlanNetworkEnum) Reset()         { *m = ReachPlanNetworkEnum{} }
+func (m *ReachPlanNetworkEnum) String() string { return proto.CompactTextString(m) }
+func (*ReachPlanNetworkEnum) ProtoMessage()    {}
+func (*ReachPlanNetworkEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_604f342e4658a385, []int{0}
+}
+
+func (m *ReachPlanNetworkEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ReachPlanNetworkEnum.Unmarshal(m, b)
+}
+func (m *ReachPlanNetworkEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ReachPlanNetworkEnum.Marshal(b, m, deterministic)
+}
+func (m *ReachPlanNetworkEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ReachPlanNetworkEnum.Merge(m, src)
+}
+func (m *ReachPlanNetworkEnum) XXX_Size() int {
+	return xxx_messageInfo_ReachPlanNetworkEnum.Size(m)
+}
+func (m *ReachPlanNetworkEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ReachPlanNetworkEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ReachPlanNetworkEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ReachPlanNetworkEnum_ReachPlanNetwork", ReachPlanNetworkEnum_ReachPlanNetwork_name, ReachPlanNetworkEnum_ReachPlanNetwork_value)
+	proto.RegisterType((*ReachPlanNetworkEnum)(nil), "google.ads.googleads.v3.enums.ReachPlanNetworkEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/reach_plan_network.proto", fileDescriptor_604f342e4658a385)
+}
+
+var fileDescriptor_604f342e4658a385 = []byte{
+	// 334 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4b, 0xc3, 0x30,
+	0x18, 0xb5, 0x9d, 0x28, 0x64, 0x07, 0x4b, 0x71, 0x07, 0xc5, 0x1d, 0x36, 0xf0, 0x9a, 0x1e, 0x0a,
+	0x1e, 0xe2, 0x29, 0x75, 0xb1, 0x0c, 0x25, 0x2d, 0xdb, 0x5a, 0x51, 0x0a, 0x25, 0xae, 0xa5, 0x0e,
+	0xbb, 0xa4, 0x34, 0xdd, 0x3c, 0xfa, 0x33, 0xbc, 0x7b, 0xf4, 0xa7, 0xf8, 0x53, 0xf6, 0x2b, 0xa4,
+	0xcd, 0xd6, 0xc3, 0x50, 0x2f, 0xe1, 0xe5, 0xfb, 0xde, 0x7b, 0x7c, 0xef, 0x81, 0xab, 0x4c, 0x88,
+	0x2c, 0x4f, 0x2d, 0x96, 0x48, 0x4b, 0xc1, 0x1a, 0xad, 0x6d, 0x2b, 0xe5, 0xab, 0xa5, 0xb4, 0xca,
+	0x94, 0xcd, 0x5f, 0xe2, 0x22, 0x67, 0x3c, 0xe6, 0x69, 0xf5, 0x26, 0xca, 0x57, 0x58, 0x94, 0xa2,
+	0x12, 0x66, 0x5f, 0x91, 0x21, 0x4b, 0x24, 0x6c, 0x75, 0x70, 0x6d, 0xc3, 0x46, 0x77, 0x7e, 0xb1,
+	0xb3, 0x2d, 0x16, 0x16, 0xe3, 0x5c, 0x54, 0xac, 0x5a, 0x08, 0x2e, 0x95, 0x78, 0xf8, 0xa1, 0x81,
+	0xd3, 0x49, 0xed, 0xec, 0xe7, 0x8c, 0x53, 0xe5, 0x4b, 0xf8, 0x6a, 0x39, 0x7c, 0x07, 0xc6, 0xfe,
+	0xdc, 0x3c, 0x01, 0xdd, 0x80, 0x4e, 0x7d, 0x72, 0x33, 0xbe, 0x1d, 0x93, 0x91, 0x71, 0x60, 0x76,
+	0xc1, 0x71, 0x40, 0xef, 0xa8, 0xf7, 0x40, 0x0d, 0xad, 0xfe, 0x3c, 0x7a, 0xc1, 0x2c, 0x70, 0x88,
+	0xa1, 0x9b, 0x67, 0xa0, 0xe7, 0x7a, 0x9e, 0x7b, 0x4f, 0xe2, 0x70, 0x3c, 0x22, 0x5e, 0xec, 0xe3,
+	0xc9, 0x8c, 0x92, 0xc9, 0xd4, 0xe8, 0x98, 0x97, 0x60, 0xb0, 0xe5, 0xc5, 0x98, 0x8e, 0xe2, 0xdf,
+	0x69, 0x87, 0xce, 0x46, 0x03, 0x83, 0xb9, 0x58, 0xc2, 0x7f, 0xd3, 0x39, 0xbd, 0xfd, 0x23, 0xfd,
+	0x3a, 0x96, 0xaf, 0x3d, 0x39, 0x5b, 0x5d, 0x26, 0x72, 0xc6, 0x33, 0x28, 0xca, 0xcc, 0xca, 0x52,
+	0xde, 0x84, 0xde, 0xb5, 0x5b, 0x2c, 0xe4, 0x1f, 0x65, 0x5f, 0x37, 0xef, 0xa7, 0xde, 0x71, 0x31,
+	0xfe, 0xd2, 0xfb, 0xae, 0xb2, 0xc2, 0x89, 0x84, 0x0a, 0xd6, 0x28, 0xb4, 0x61, 0x5d, 0x94, 0xfc,
+	0xde, 0xed, 0x23, 0x9c, 0xc8, 0xa8, 0xdd, 0x47, 0xa1, 0x1d, 0x35, 0xfb, 0x8d, 0x3e, 0x50, 0x43,
+	0x84, 0x70, 0x22, 0x11, 0x6a, 0x19, 0x08, 0x85, 0x36, 0x42, 0x0d, 0xe7, 0xf9, 0xa8, 0x39, 0xcc,
+	0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xa6, 0xa9, 0x02, 0x04, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/real_estate_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/real_estate_placeholder_field.pb.go
new file mode 100644
index 0000000..c4b8871
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/real_estate_placeholder_field.pb.go
@@ -0,0 +1,217 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/real_estate_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Real Estate placeholder fields.
+type RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField int32
+
+const (
+	// Not specified.
+	RealEstatePlaceholderFieldEnum_UNSPECIFIED RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	RealEstatePlaceholderFieldEnum_UNKNOWN RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 1
+	// Data Type: STRING. Unique ID.
+	RealEstatePlaceholderFieldEnum_LISTING_ID RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 2
+	// Data Type: STRING. Main headline with listing name to be shown in dynamic
+	// ad.
+	RealEstatePlaceholderFieldEnum_LISTING_NAME RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 3
+	// Data Type: STRING. City name to be shown in dynamic ad.
+	RealEstatePlaceholderFieldEnum_CITY_NAME RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 4
+	// Data Type: STRING. Description of listing to be shown in dynamic ad.
+	RealEstatePlaceholderFieldEnum_DESCRIPTION RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 5
+	// Data Type: STRING. Complete listing address, including postal code.
+	RealEstatePlaceholderFieldEnum_ADDRESS RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 6
+	// Data Type: STRING. Price to be shown in the ad.
+	// Example: "100.00 USD"
+	RealEstatePlaceholderFieldEnum_PRICE RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 7
+	// Data Type: STRING. Formatted price to be shown in the ad.
+	// Example: "Starting at $100.00 USD", "$80 - $100"
+	RealEstatePlaceholderFieldEnum_FORMATTED_PRICE RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 8
+	// Data Type: URL. Image to be displayed in the ad.
+	RealEstatePlaceholderFieldEnum_IMAGE_URL RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 9
+	// Data Type: STRING. Type of property (house, condo, apartment, etc.) used
+	// to group like items together for recommendation engine.
+	RealEstatePlaceholderFieldEnum_PROPERTY_TYPE RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 10
+	// Data Type: STRING. Type of listing (resale, rental, foreclosure, etc.)
+	// used to group like items together for recommendation engine.
+	RealEstatePlaceholderFieldEnum_LISTING_TYPE RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 11
+	// Data Type: STRING_LIST. Keywords used for product retrieval.
+	RealEstatePlaceholderFieldEnum_CONTEXTUAL_KEYWORDS RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 12
+	// Data Type: URL_LIST. Final URLs to be used in ad when using Upgraded
+	// URLs; the more specific the better (e.g. the individual URL of a specific
+	// listing and its location).
+	RealEstatePlaceholderFieldEnum_FINAL_URLS RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 13
+	// Data Type: URL_LIST. Final mobile URLs for the ad when using Upgraded
+	// URLs.
+	RealEstatePlaceholderFieldEnum_FINAL_MOBILE_URLS RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 14
+	// Data Type: URL. Tracking template for the ad when using Upgraded URLs.
+	RealEstatePlaceholderFieldEnum_TRACKING_URL RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 15
+	// Data Type: STRING. Android app link. Must be formatted as:
+	// android-app://{package_id}/{scheme}/{host_path}.
+	// The components are defined as follows:
+	// package_id: app ID as specified in Google Play.
+	// scheme: the scheme to pass to the application. Can be HTTP, or a custom
+	//   scheme.
+	// host_path: identifies the specific content within your application.
+	RealEstatePlaceholderFieldEnum_ANDROID_APP_LINK RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 16
+	// Data Type: STRING_LIST. List of recommended listing IDs to show together
+	// with this item.
+	RealEstatePlaceholderFieldEnum_SIMILAR_LISTING_IDS RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 17
+	// Data Type: STRING. iOS app link.
+	RealEstatePlaceholderFieldEnum_IOS_APP_LINK RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 18
+	// Data Type: INT64. iOS app store ID.
+	RealEstatePlaceholderFieldEnum_IOS_APP_STORE_ID RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField = 19
+)
+
+var RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "LISTING_ID",
+	3:  "LISTING_NAME",
+	4:  "CITY_NAME",
+	5:  "DESCRIPTION",
+	6:  "ADDRESS",
+	7:  "PRICE",
+	8:  "FORMATTED_PRICE",
+	9:  "IMAGE_URL",
+	10: "PROPERTY_TYPE",
+	11: "LISTING_TYPE",
+	12: "CONTEXTUAL_KEYWORDS",
+	13: "FINAL_URLS",
+	14: "FINAL_MOBILE_URLS",
+	15: "TRACKING_URL",
+	16: "ANDROID_APP_LINK",
+	17: "SIMILAR_LISTING_IDS",
+	18: "IOS_APP_LINK",
+	19: "IOS_APP_STORE_ID",
+}
+
+var RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"LISTING_ID":          2,
+	"LISTING_NAME":        3,
+	"CITY_NAME":           4,
+	"DESCRIPTION":         5,
+	"ADDRESS":             6,
+	"PRICE":               7,
+	"FORMATTED_PRICE":     8,
+	"IMAGE_URL":           9,
+	"PROPERTY_TYPE":       10,
+	"LISTING_TYPE":        11,
+	"CONTEXTUAL_KEYWORDS": 12,
+	"FINAL_URLS":          13,
+	"FINAL_MOBILE_URLS":   14,
+	"TRACKING_URL":        15,
+	"ANDROID_APP_LINK":    16,
+	"SIMILAR_LISTING_IDS": 17,
+	"IOS_APP_LINK":        18,
+	"IOS_APP_STORE_ID":    19,
+}
+
+func (x RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField) String() string {
+	return proto.EnumName(RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField_name, int32(x))
+}
+
+func (RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e3d5f7d0d8a31d4c, []int{0, 0}
+}
+
+// Values for Real Estate placeholder fields.
+// For more information about dynamic remarketing feeds, see
+// https://support.google.com/google-ads/answer/6053288.
+type RealEstatePlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *RealEstatePlaceholderFieldEnum) Reset()         { *m = RealEstatePlaceholderFieldEnum{} }
+func (m *RealEstatePlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*RealEstatePlaceholderFieldEnum) ProtoMessage()    {}
+func (*RealEstatePlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e3d5f7d0d8a31d4c, []int{0}
+}
+
+func (m *RealEstatePlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RealEstatePlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *RealEstatePlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RealEstatePlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *RealEstatePlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RealEstatePlaceholderFieldEnum.Merge(m, src)
+}
+func (m *RealEstatePlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_RealEstatePlaceholderFieldEnum.Size(m)
+}
+func (m *RealEstatePlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_RealEstatePlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RealEstatePlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField", RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField_name, RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField_value)
+	proto.RegisterType((*RealEstatePlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.RealEstatePlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/real_estate_placeholder_field.proto", fileDescriptor_e3d5f7d0d8a31d4c)
+}
+
+var fileDescriptor_e3d5f7d0d8a31d4c = []byte{
+	// 511 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xc1, 0x8e, 0xda, 0x30,
+	0x10, 0x86, 0x0b, 0x74, 0x77, 0x8b, 0x59, 0x16, 0x63, 0x5a, 0x55, 0x5a, 0x75, 0x5b, 0xed, 0x3e,
+	0x40, 0x72, 0xc8, 0x2d, 0x3d, 0x99, 0xc4, 0x20, 0x8b, 0xe0, 0x58, 0xb6, 0x61, 0x4b, 0x85, 0x64,
+	0xa5, 0x9b, 0x34, 0x45, 0x0a, 0x09, 0x22, 0xec, 0x3e, 0x42, 0x1f, 0xa4, 0xb7, 0xf6, 0x51, 0xfa,
+	0x28, 0x3d, 0xf7, 0x01, 0x2a, 0x27, 0x05, 0x7a, 0xa1, 0x97, 0x68, 0xe6, 0x9f, 0xc9, 0xf7, 0x8f,
+	0x3c, 0x03, 0x70, 0x5a, 0x14, 0x69, 0x96, 0xd8, 0x51, 0x5c, 0xda, 0x75, 0x68, 0xa2, 0x27, 0xc7,
+	0x4e, 0xf2, 0xc7, 0x75, 0x69, 0x6f, 0x93, 0x28, 0xd3, 0x49, 0xb9, 0x8b, 0x76, 0x89, 0xde, 0x64,
+	0xd1, 0x43, 0xf2, 0xa5, 0xc8, 0xe2, 0x64, 0xab, 0x3f, 0xaf, 0x92, 0x2c, 0xb6, 0x36, 0xdb, 0x62,
+	0x57, 0xa0, 0x9b, 0xfa, 0x3f, 0x2b, 0x8a, 0x4b, 0xeb, 0x80, 0xb0, 0x9e, 0x1c, 0xab, 0x42, 0x5c,
+	0xbf, 0xd9, 0x3b, 0x6c, 0x56, 0x76, 0x94, 0xe7, 0xc5, 0x2e, 0xda, 0xad, 0x8a, 0xbc, 0xac, 0x7f,
+	0xbe, 0xfb, 0xde, 0x02, 0x6f, 0x45, 0x12, 0x65, 0xa4, 0xf2, 0xe0, 0x47, 0x8b, 0x91, 0x71, 0x20,
+	0xf9, 0xe3, 0xfa, 0xee, 0x6b, 0x0b, 0x5c, 0x9f, 0x6e, 0x41, 0x3d, 0xd0, 0x99, 0x31, 0xc9, 0x89,
+	0x47, 0x47, 0x94, 0xf8, 0xf0, 0x19, 0xea, 0x80, 0x8b, 0x19, 0x9b, 0xb0, 0xf0, 0x9e, 0xc1, 0x06,
+	0xba, 0x02, 0x20, 0xa0, 0x52, 0x51, 0x36, 0xd6, 0xd4, 0x87, 0x4d, 0x04, 0xc1, 0xe5, 0x3e, 0x67,
+	0x78, 0x4a, 0x60, 0x0b, 0x75, 0x41, 0xdb, 0xa3, 0x6a, 0x51, 0xa7, 0xcf, 0x0d, 0xce, 0x27, 0xd2,
+	0x13, 0x94, 0x2b, 0x1a, 0x32, 0x78, 0x66, 0x70, 0xd8, 0xf7, 0x05, 0x91, 0x12, 0x9e, 0xa3, 0x36,
+	0x38, 0xe3, 0x82, 0x7a, 0x04, 0x5e, 0xa0, 0x01, 0xe8, 0x8d, 0x42, 0x31, 0xc5, 0x4a, 0x11, 0x5f,
+	0xd7, 0xe2, 0x0b, 0x03, 0xa3, 0x53, 0x3c, 0x26, 0x7a, 0x26, 0x02, 0xd8, 0x46, 0x7d, 0xd0, 0xe5,
+	0x22, 0xe4, 0x44, 0xa8, 0x85, 0x56, 0x0b, 0x4e, 0x20, 0xf8, 0x77, 0x80, 0x4a, 0xe9, 0xa0, 0xd7,
+	0x60, 0xe0, 0x85, 0x4c, 0x91, 0x0f, 0x6a, 0x86, 0x03, 0x3d, 0x21, 0x8b, 0xfb, 0x50, 0xf8, 0x12,
+	0x5e, 0x9a, 0xd9, 0x47, 0x94, 0xe1, 0xc0, 0xc0, 0x24, 0xec, 0xa2, 0x57, 0xa0, 0x5f, 0xe7, 0xd3,
+	0x70, 0x48, 0x03, 0x52, 0xcb, 0x57, 0x86, 0xa8, 0x04, 0xf6, 0x26, 0x06, 0x69, 0x6c, 0x7b, 0xe8,
+	0x25, 0x80, 0x98, 0xf9, 0x22, 0xa4, 0xbe, 0xc6, 0x9c, 0xeb, 0x80, 0xb2, 0x09, 0x84, 0xc6, 0x47,
+	0xd2, 0x29, 0x0d, 0xb0, 0xd0, 0xc7, 0x27, 0x91, 0xb0, 0x6f, 0x00, 0x34, 0x94, 0xc7, 0x56, 0x64,
+	0x00, 0x7b, 0x45, 0xaa, 0x50, 0x10, 0xf3, 0x76, 0x83, 0xe1, 0xef, 0x06, 0xb8, 0x7d, 0x28, 0xd6,
+	0xd6, 0x7f, 0xf7, 0x3d, 0x7c, 0x77, 0x7a, 0x57, 0xdc, 0xac, 0x9c, 0x37, 0x3e, 0x0e, 0xff, 0x12,
+	0xd2, 0x22, 0x8b, 0xf2, 0xd4, 0x2a, 0xb6, 0xa9, 0x9d, 0x26, 0x79, 0x75, 0x10, 0xfb, 0x23, 0xdc,
+	0xac, 0xca, 0x13, 0x37, 0xf9, 0xbe, 0xfa, 0x7e, 0x6b, 0xb6, 0xc6, 0x18, 0xff, 0x68, 0xde, 0x8c,
+	0x6b, 0x14, 0x8e, 0x4b, 0xab, 0x0e, 0x4d, 0x34, 0x77, 0x2c, 0x73, 0x3a, 0xe5, 0xcf, 0x7d, 0x7d,
+	0x89, 0xe3, 0x72, 0x79, 0xa8, 0x2f, 0xe7, 0xce, 0xb2, 0xaa, 0xff, 0x6a, 0xde, 0xd6, 0xa2, 0xeb,
+	0xe2, 0xb8, 0x74, 0xdd, 0x43, 0x87, 0xeb, 0xce, 0x1d, 0xd7, 0xad, 0x7a, 0x3e, 0x9d, 0x57, 0x83,
+	0x39, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x71, 0xac, 0x18, 0xe5, 0x2b, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/recommendation_type.pb.go b/googleapis/ads/googleads/v3/enums/recommendation_type.pb.go
new file mode 100644
index 0000000..016f010
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/recommendation_type.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/recommendation_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Types of recommendations.
+type RecommendationTypeEnum_RecommendationType int32
+
+const (
+	// Not specified.
+	RecommendationTypeEnum_UNSPECIFIED RecommendationTypeEnum_RecommendationType = 0
+	// Used for return value only. Represents value unknown in this version.
+	RecommendationTypeEnum_UNKNOWN RecommendationTypeEnum_RecommendationType = 1
+	// Budget recommendation for budget constrained campaigns.
+	RecommendationTypeEnum_CAMPAIGN_BUDGET RecommendationTypeEnum_RecommendationType = 2
+	// Keyword recommendation.
+	RecommendationTypeEnum_KEYWORD RecommendationTypeEnum_RecommendationType = 3
+	// Recommendation to add a new text ad.
+	RecommendationTypeEnum_TEXT_AD RecommendationTypeEnum_RecommendationType = 4
+	// Recommendation to update a campaign to use a Target CPA bidding strategy.
+	RecommendationTypeEnum_TARGET_CPA_OPT_IN RecommendationTypeEnum_RecommendationType = 5
+	// Recommendation to update a campaign to use the Maximize Conversions
+	// bidding strategy.
+	RecommendationTypeEnum_MAXIMIZE_CONVERSIONS_OPT_IN RecommendationTypeEnum_RecommendationType = 6
+	// Recommendation to enable Enhanced Cost Per Click for a campaign.
+	RecommendationTypeEnum_ENHANCED_CPC_OPT_IN RecommendationTypeEnum_RecommendationType = 7
+	// Recommendation to start showing your campaign's ads on Google Search
+	// Partners Websites.
+	RecommendationTypeEnum_SEARCH_PARTNERS_OPT_IN RecommendationTypeEnum_RecommendationType = 8
+	// Recommendation to update a campaign to use a Maximize Clicks bidding
+	// strategy.
+	RecommendationTypeEnum_MAXIMIZE_CLICKS_OPT_IN RecommendationTypeEnum_RecommendationType = 9
+	// Recommendation to start using the "Optimize" ad rotation setting for the
+	// given ad group.
+	RecommendationTypeEnum_OPTIMIZE_AD_ROTATION RecommendationTypeEnum_RecommendationType = 10
+	// Recommendation to add callout extensions to a campaign.
+	RecommendationTypeEnum_CALLOUT_EXTENSION RecommendationTypeEnum_RecommendationType = 11
+	// Recommendation to add sitelink extensions to a campaign.
+	RecommendationTypeEnum_SITELINK_EXTENSION RecommendationTypeEnum_RecommendationType = 12
+	// Recommendation to add call extensions to a campaign.
+	RecommendationTypeEnum_CALL_EXTENSION RecommendationTypeEnum_RecommendationType = 13
+	// Recommendation to change an existing keyword from one match type to a
+	// broader match type.
+	RecommendationTypeEnum_KEYWORD_MATCH_TYPE RecommendationTypeEnum_RecommendationType = 14
+	// Recommendation to move unused budget from one budget to a constrained
+	// budget.
+	RecommendationTypeEnum_MOVE_UNUSED_BUDGET RecommendationTypeEnum_RecommendationType = 15
+)
+
+var RecommendationTypeEnum_RecommendationType_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "CAMPAIGN_BUDGET",
+	3:  "KEYWORD",
+	4:  "TEXT_AD",
+	5:  "TARGET_CPA_OPT_IN",
+	6:  "MAXIMIZE_CONVERSIONS_OPT_IN",
+	7:  "ENHANCED_CPC_OPT_IN",
+	8:  "SEARCH_PARTNERS_OPT_IN",
+	9:  "MAXIMIZE_CLICKS_OPT_IN",
+	10: "OPTIMIZE_AD_ROTATION",
+	11: "CALLOUT_EXTENSION",
+	12: "SITELINK_EXTENSION",
+	13: "CALL_EXTENSION",
+	14: "KEYWORD_MATCH_TYPE",
+	15: "MOVE_UNUSED_BUDGET",
+}
+
+var RecommendationTypeEnum_RecommendationType_value = map[string]int32{
+	"UNSPECIFIED":                 0,
+	"UNKNOWN":                     1,
+	"CAMPAIGN_BUDGET":             2,
+	"KEYWORD":                     3,
+	"TEXT_AD":                     4,
+	"TARGET_CPA_OPT_IN":           5,
+	"MAXIMIZE_CONVERSIONS_OPT_IN": 6,
+	"ENHANCED_CPC_OPT_IN":         7,
+	"SEARCH_PARTNERS_OPT_IN":      8,
+	"MAXIMIZE_CLICKS_OPT_IN":      9,
+	"OPTIMIZE_AD_ROTATION":        10,
+	"CALLOUT_EXTENSION":           11,
+	"SITELINK_EXTENSION":          12,
+	"CALL_EXTENSION":              13,
+	"KEYWORD_MATCH_TYPE":          14,
+	"MOVE_UNUSED_BUDGET":          15,
+}
+
+func (x RecommendationTypeEnum_RecommendationType) String() string {
+	return proto.EnumName(RecommendationTypeEnum_RecommendationType_name, int32(x))
+}
+
+func (RecommendationTypeEnum_RecommendationType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_9494f455c4c1913e, []int{0, 0}
+}
+
+// Container for enum describing types of recommendations.
+type RecommendationTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *RecommendationTypeEnum) Reset()         { *m = RecommendationTypeEnum{} }
+func (m *RecommendationTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*RecommendationTypeEnum) ProtoMessage()    {}
+func (*RecommendationTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9494f455c4c1913e, []int{0}
+}
+
+func (m *RecommendationTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RecommendationTypeEnum.Unmarshal(m, b)
+}
+func (m *RecommendationTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RecommendationTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *RecommendationTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RecommendationTypeEnum.Merge(m, src)
+}
+func (m *RecommendationTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_RecommendationTypeEnum.Size(m)
+}
+func (m *RecommendationTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_RecommendationTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RecommendationTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.RecommendationTypeEnum_RecommendationType", RecommendationTypeEnum_RecommendationType_name, RecommendationTypeEnum_RecommendationType_value)
+	proto.RegisterType((*RecommendationTypeEnum)(nil), "google.ads.googleads.v3.enums.RecommendationTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/recommendation_type.proto", fileDescriptor_9494f455c4c1913e)
+}
+
+var fileDescriptor_9494f455c4c1913e = []byte{
+	// 492 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xd1, 0x6e, 0xd3, 0x30,
+	0x14, 0x86, 0x59, 0x0b, 0x1b, 0xb8, 0xb0, 0x06, 0x0f, 0x3a, 0x34, 0x98, 0xd0, 0xf6, 0x00, 0xc9,
+	0x45, 0x2e, 0x90, 0xc2, 0x95, 0xeb, 0x98, 0xd6, 0x6a, 0x6b, 0x5b, 0x89, 0xd3, 0x75, 0x53, 0x25,
+	0xab, 0x2c, 0x51, 0x54, 0x69, 0x89, 0xa3, 0xa6, 0x9b, 0xb4, 0xd7, 0xe0, 0x11, 0xb8, 0xe4, 0x51,
+	0x78, 0x14, 0xc4, 0x3d, 0xb7, 0xc8, 0xc9, 0x12, 0x86, 0x26, 0xb8, 0x89, 0x4e, 0xce, 0xf7, 0xff,
+	0xbf, 0x4e, 0x72, 0x0e, 0xf8, 0x90, 0x6a, 0x9d, 0x5e, 0x25, 0xce, 0x2a, 0x2e, 0x9d, 0xba, 0x34,
+	0xd5, 0x8d, 0xeb, 0x24, 0xf9, 0x75, 0x56, 0x3a, 0x9b, 0xe4, 0x52, 0x67, 0x59, 0x92, 0xc7, 0xab,
+	0xed, 0x5a, 0xe7, 0x6a, 0x7b, 0x5b, 0x24, 0x76, 0xb1, 0xd1, 0x5b, 0x0d, 0x8f, 0x6b, 0xb5, 0xbd,
+	0x8a, 0x4b, 0xbb, 0x35, 0xda, 0x37, 0xae, 0x5d, 0x19, 0x8f, 0xde, 0x35, 0xb9, 0xc5, 0xda, 0x59,
+	0xe5, 0xb9, 0xde, 0x56, 0x01, 0x65, 0x6d, 0x3e, 0xfd, 0xd2, 0x05, 0x83, 0xe0, 0xaf, 0x68, 0x79,
+	0x5b, 0x24, 0x24, 0xbf, 0xce, 0x4e, 0x7f, 0x75, 0x00, 0x7c, 0x88, 0x60, 0x1f, 0xf4, 0x22, 0x16,
+	0x0a, 0x82, 0xe9, 0x27, 0x4a, 0x7c, 0xeb, 0x11, 0xec, 0x81, 0xbd, 0x88, 0x4d, 0x18, 0x3f, 0x63,
+	0xd6, 0x0e, 0x3c, 0x00, 0x7d, 0x8c, 0x66, 0x02, 0xd1, 0x11, 0x53, 0xc3, 0xc8, 0x1f, 0x11, 0x69,
+	0x75, 0x8c, 0x62, 0x42, 0xce, 0xcf, 0x78, 0xe0, 0x5b, 0x5d, 0xf3, 0x22, 0xc9, 0x42, 0x2a, 0xe4,
+	0x5b, 0x8f, 0xe1, 0x6b, 0xf0, 0x52, 0xa2, 0x60, 0x44, 0xa4, 0xc2, 0x02, 0x29, 0x2e, 0xa4, 0xa2,
+	0xcc, 0x7a, 0x02, 0xdf, 0x83, 0xb7, 0x33, 0xb4, 0xa0, 0x33, 0x7a, 0x41, 0x14, 0xe6, 0x6c, 0x4e,
+	0x82, 0x90, 0x72, 0x16, 0x36, 0x82, 0x5d, 0x78, 0x08, 0x0e, 0x08, 0x1b, 0x23, 0x86, 0x89, 0xaf,
+	0xb0, 0xc0, 0x0d, 0xd8, 0x83, 0x47, 0x60, 0x10, 0x12, 0x14, 0xe0, 0xb1, 0x12, 0x28, 0x90, 0x8c,
+	0x04, 0xad, 0xe9, 0xa9, 0x61, 0x7f, 0x52, 0xa7, 0x14, 0x4f, 0x5a, 0xf6, 0x0c, 0xbe, 0x01, 0xaf,
+	0xb8, 0x90, 0x35, 0x43, 0xbe, 0x0a, 0xb8, 0x44, 0x92, 0x72, 0x66, 0x01, 0x33, 0x22, 0x46, 0xd3,
+	0x29, 0x8f, 0xa4, 0x22, 0x0b, 0x49, 0x98, 0x99, 0xc4, 0xea, 0xc1, 0x01, 0x80, 0x21, 0x95, 0x64,
+	0x4a, 0xd9, 0xe4, 0x5e, 0xff, 0x39, 0x84, 0x60, 0xdf, 0xc8, 0xef, 0xf5, 0x5e, 0x18, 0xed, 0xdd,
+	0xf7, 0xab, 0x19, 0x92, 0x78, 0xac, 0xe4, 0xb9, 0x20, 0xd6, 0xbe, 0xe9, 0xcf, 0xf8, 0x9c, 0xa8,
+	0x88, 0x45, 0x21, 0xf1, 0x9b, 0xff, 0xd5, 0x1f, 0xfe, 0xdc, 0x01, 0x27, 0x97, 0x3a, 0xb3, 0xff,
+	0xbb, 0xd8, 0xe1, 0xe1, 0xc3, 0xe5, 0x08, 0xb3, 0x53, 0xb1, 0x73, 0x31, 0xbc, 0x73, 0xa6, 0xfa,
+	0x6a, 0x95, 0xa7, 0xb6, 0xde, 0xa4, 0x4e, 0x9a, 0xe4, 0xd5, 0xc6, 0x9b, 0xdb, 0x2a, 0xd6, 0xe5,
+	0x3f, 0x4e, 0xed, 0x63, 0xf5, 0xfc, 0xda, 0xe9, 0x8e, 0x10, 0xfa, 0xd6, 0x39, 0x1e, 0xd5, 0x51,
+	0x28, 0x2e, 0xed, 0xba, 0x34, 0xd5, 0xdc, 0xb5, 0xcd, 0x8d, 0x94, 0xdf, 0x1b, 0xbe, 0x44, 0x71,
+	0xb9, 0x6c, 0xf9, 0x72, 0xee, 0x2e, 0x2b, 0xfe, 0xa3, 0x73, 0x52, 0x37, 0x3d, 0x0f, 0xc5, 0xa5,
+	0xe7, 0xb5, 0x0a, 0xcf, 0x9b, 0xbb, 0x9e, 0x57, 0x69, 0x3e, 0xef, 0x56, 0x83, 0xb9, 0xbf, 0x03,
+	0x00, 0x00, 0xff, 0xff, 0xcd, 0x45, 0xb5, 0x80, 0x02, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/search_engine_results_page_type.pb.go b/googleapis/ads/googleads/v3/enums/search_engine_results_page_type.pb.go
new file mode 100644
index 0000000..c1881ab
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/search_engine_results_page_type.pb.go
@@ -0,0 +1,131 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/search_engine_results_page_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of the search engine results page.
+type SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType int32
+
+const (
+	// Not specified.
+	SearchEngineResultsPageTypeEnum_UNSPECIFIED SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType = 0
+	// Used for return value only. Represents value unknown in this version.
+	SearchEngineResultsPageTypeEnum_UNKNOWN SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType = 1
+	// Only ads were contained in the search engine results page.
+	SearchEngineResultsPageTypeEnum_ADS_ONLY SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType = 2
+	// Only organic results were contained in the search engine results page.
+	SearchEngineResultsPageTypeEnum_ORGANIC_ONLY SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType = 3
+	// Both ads and organic results were contained in the search engine results
+	// page.
+	SearchEngineResultsPageTypeEnum_ADS_AND_ORGANIC SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType = 4
+)
+
+var SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ADS_ONLY",
+	3: "ORGANIC_ONLY",
+	4: "ADS_AND_ORGANIC",
+}
+
+var SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"ADS_ONLY":        2,
+	"ORGANIC_ONLY":    3,
+	"ADS_AND_ORGANIC": 4,
+}
+
+func (x SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType) String() string {
+	return proto.EnumName(SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType_name, int32(x))
+}
+
+func (SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8d0c9169c79e638f, []int{0, 0}
+}
+
+// The type of the search engine results page.
+type SearchEngineResultsPageTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SearchEngineResultsPageTypeEnum) Reset()         { *m = SearchEngineResultsPageTypeEnum{} }
+func (m *SearchEngineResultsPageTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*SearchEngineResultsPageTypeEnum) ProtoMessage()    {}
+func (*SearchEngineResultsPageTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8d0c9169c79e638f, []int{0}
+}
+
+func (m *SearchEngineResultsPageTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchEngineResultsPageTypeEnum.Unmarshal(m, b)
+}
+func (m *SearchEngineResultsPageTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchEngineResultsPageTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *SearchEngineResultsPageTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchEngineResultsPageTypeEnum.Merge(m, src)
+}
+func (m *SearchEngineResultsPageTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_SearchEngineResultsPageTypeEnum.Size(m)
+}
+func (m *SearchEngineResultsPageTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchEngineResultsPageTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchEngineResultsPageTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType", SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType_name, SearchEngineResultsPageTypeEnum_SearchEngineResultsPageType_value)
+	proto.RegisterType((*SearchEngineResultsPageTypeEnum)(nil), "google.ads.googleads.v3.enums.SearchEngineResultsPageTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/search_engine_results_page_type.proto", fileDescriptor_8d0c9169c79e638f)
+}
+
+var fileDescriptor_8d0c9169c79e638f = []byte{
+	// 341 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xd1, 0x4e, 0xf2, 0x30,
+	0x14, 0xfe, 0x37, 0xfe, 0xa8, 0x29, 0x24, 0x2c, 0xf3, 0x4e, 0x25, 0x0a, 0x0f, 0xd0, 0x5d, 0xec,
+	0xae, 0x5e, 0x15, 0x98, 0x84, 0x68, 0xca, 0x02, 0x82, 0xd1, 0x2c, 0x59, 0x2a, 0x6b, 0xea, 0x12,
+	0x68, 0x9b, 0x75, 0x90, 0xf0, 0x1c, 0xbe, 0x81, 0x97, 0x3e, 0x8a, 0x8f, 0xe2, 0xbd, 0xf7, 0x66,
+	0x2d, 0x70, 0xe7, 0x6e, 0x9a, 0x2f, 0xe7, 0x3b, 0xe7, 0xfb, 0xce, 0x77, 0x0a, 0x06, 0x5c, 0x4a,
+	0xbe, 0x62, 0x01, 0xcd, 0x74, 0x60, 0x61, 0x85, 0xb6, 0x61, 0xc0, 0xc4, 0x66, 0xad, 0x03, 0xcd,
+	0x68, 0xb1, 0x7c, 0x4b, 0x99, 0xe0, 0xb9, 0x60, 0x69, 0xc1, 0xf4, 0x66, 0x55, 0xea, 0x54, 0x51,
+	0xce, 0xd2, 0x72, 0xa7, 0x18, 0x54, 0x85, 0x2c, 0xa5, 0xdf, 0xb1, 0x93, 0x90, 0x66, 0x1a, 0x1e,
+	0x45, 0xe0, 0x36, 0x84, 0x46, 0xe4, 0xe2, 0xea, 0xe0, 0xa1, 0xf2, 0x80, 0x0a, 0x21, 0x4b, 0x5a,
+	0xe6, 0x52, 0x68, 0x3b, 0xdc, 0x7b, 0x77, 0xc0, 0xf5, 0xcc, 0xd8, 0x44, 0xc6, 0x65, 0x6a, 0x4d,
+	0x62, 0xca, 0xd9, 0xe3, 0x4e, 0xb1, 0x48, 0x6c, 0xd6, 0x3d, 0x05, 0x2e, 0x6b, 0x5a, 0xfc, 0x36,
+	0x68, 0xce, 0xc9, 0x2c, 0x8e, 0x06, 0xe3, 0xbb, 0x71, 0x34, 0xf4, 0xfe, 0xf9, 0x4d, 0x70, 0x3a,
+	0x27, 0xf7, 0x64, 0xf2, 0x44, 0x3c, 0xc7, 0x6f, 0x81, 0x33, 0x3c, 0x9c, 0xa5, 0x13, 0xf2, 0xf0,
+	0xec, 0xb9, 0xbe, 0x07, 0x5a, 0x93, 0xe9, 0x08, 0x93, 0xf1, 0xc0, 0x56, 0x1a, 0xfe, 0x39, 0x68,
+	0x57, 0x3c, 0x26, 0xc3, 0x74, 0xcf, 0x78, 0xff, 0xfb, 0x3f, 0x0e, 0xe8, 0x2e, 0xe5, 0x1a, 0xd6,
+	0x26, 0xeb, 0xdf, 0xd4, 0x6c, 0x15, 0x57, 0xe9, 0x62, 0xe7, 0xa5, 0xbf, 0x97, 0xe0, 0x72, 0x45,
+	0x05, 0x87, 0xb2, 0xe0, 0x01, 0x67, 0xc2, 0x64, 0x3f, 0x5c, 0x5c, 0xe5, 0xfa, 0x8f, 0x0f, 0xb8,
+	0x35, 0xef, 0x87, 0xdb, 0x18, 0x61, 0xfc, 0xe9, 0x76, 0x46, 0x56, 0x0a, 0x67, 0x1a, 0x5a, 0x58,
+	0xa1, 0x45, 0x08, 0xab, 0x23, 0xe9, 0xaf, 0x03, 0x9f, 0xe0, 0x4c, 0x27, 0x47, 0x3e, 0x59, 0x84,
+	0x89, 0xe1, 0xbf, 0xdd, 0xae, 0x2d, 0x22, 0x84, 0x33, 0x8d, 0xd0, 0xb1, 0x03, 0xa1, 0x45, 0x88,
+	0x90, 0xe9, 0x79, 0x3d, 0x31, 0x8b, 0x85, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x8a, 0xf0, 0x2c,
+	0x2c, 0x18, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/search_term_match_type.pb.go b/googleapis/ads/googleads/v3/enums/search_term_match_type.pb.go
new file mode 100644
index 0000000..9a0bd77
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/search_term_match_type.pb.go
@@ -0,0 +1,138 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/search_term_match_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible match types for a keyword triggering an ad, including variants.
+type SearchTermMatchTypeEnum_SearchTermMatchType int32
+
+const (
+	// Not specified.
+	SearchTermMatchTypeEnum_UNSPECIFIED SearchTermMatchTypeEnum_SearchTermMatchType = 0
+	// Used for return value only. Represents value unknown in this version.
+	SearchTermMatchTypeEnum_UNKNOWN SearchTermMatchTypeEnum_SearchTermMatchType = 1
+	// Broad match.
+	SearchTermMatchTypeEnum_BROAD SearchTermMatchTypeEnum_SearchTermMatchType = 2
+	// Exact match.
+	SearchTermMatchTypeEnum_EXACT SearchTermMatchTypeEnum_SearchTermMatchType = 3
+	// Phrase match.
+	SearchTermMatchTypeEnum_PHRASE SearchTermMatchTypeEnum_SearchTermMatchType = 4
+	// Exact match (close variant).
+	SearchTermMatchTypeEnum_NEAR_EXACT SearchTermMatchTypeEnum_SearchTermMatchType = 5
+	// Phrase match (close variant).
+	SearchTermMatchTypeEnum_NEAR_PHRASE SearchTermMatchTypeEnum_SearchTermMatchType = 6
+)
+
+var SearchTermMatchTypeEnum_SearchTermMatchType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "BROAD",
+	3: "EXACT",
+	4: "PHRASE",
+	5: "NEAR_EXACT",
+	6: "NEAR_PHRASE",
+}
+
+var SearchTermMatchTypeEnum_SearchTermMatchType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"BROAD":       2,
+	"EXACT":       3,
+	"PHRASE":      4,
+	"NEAR_EXACT":  5,
+	"NEAR_PHRASE": 6,
+}
+
+func (x SearchTermMatchTypeEnum_SearchTermMatchType) String() string {
+	return proto.EnumName(SearchTermMatchTypeEnum_SearchTermMatchType_name, int32(x))
+}
+
+func (SearchTermMatchTypeEnum_SearchTermMatchType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_37984e6ef3c9b9dd, []int{0, 0}
+}
+
+// Container for enum describing match types for a keyword triggering an ad.
+type SearchTermMatchTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SearchTermMatchTypeEnum) Reset()         { *m = SearchTermMatchTypeEnum{} }
+func (m *SearchTermMatchTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*SearchTermMatchTypeEnum) ProtoMessage()    {}
+func (*SearchTermMatchTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37984e6ef3c9b9dd, []int{0}
+}
+
+func (m *SearchTermMatchTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchTermMatchTypeEnum.Unmarshal(m, b)
+}
+func (m *SearchTermMatchTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchTermMatchTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *SearchTermMatchTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchTermMatchTypeEnum.Merge(m, src)
+}
+func (m *SearchTermMatchTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_SearchTermMatchTypeEnum.Size(m)
+}
+func (m *SearchTermMatchTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchTermMatchTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchTermMatchTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SearchTermMatchTypeEnum_SearchTermMatchType", SearchTermMatchTypeEnum_SearchTermMatchType_name, SearchTermMatchTypeEnum_SearchTermMatchType_value)
+	proto.RegisterType((*SearchTermMatchTypeEnum)(nil), "google.ads.googleads.v3.enums.SearchTermMatchTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/search_term_match_type.proto", fileDescriptor_37984e6ef3c9b9dd)
+}
+
+var fileDescriptor_37984e6ef3c9b9dd = []byte{
+	// 337 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xdf, 0x4a, 0xc3, 0x30,
+	0x18, 0xc5, 0x6d, 0xe7, 0x26, 0x66, 0xa0, 0xa5, 0x5e, 0x28, 0xe2, 0x2e, 0xb6, 0x07, 0x48, 0x2f,
+	0x7a, 0x17, 0xaf, 0xd2, 0xad, 0xce, 0x21, 0x76, 0x65, 0xff, 0x14, 0x29, 0x8c, 0xb8, 0x86, 0x3a,
+	0x58, 0x92, 0xd2, 0x74, 0x83, 0x3d, 0x86, 0xaf, 0xe0, 0xa5, 0x8f, 0xe2, 0xa3, 0x08, 0xbe, 0x83,
+	0x24, 0xd9, 0x7a, 0x35, 0xbd, 0x29, 0xbf, 0xe6, 0x7c, 0xe7, 0xf0, 0x7d, 0x07, 0xa0, 0x4c, 0x88,
+	0x6c, 0x45, 0x3d, 0x92, 0x4a, 0xcf, 0xa0, 0xa2, 0x8d, 0xef, 0x51, 0xbe, 0x66, 0xd2, 0x93, 0x94,
+	0x14, 0x8b, 0xb7, 0x79, 0x49, 0x0b, 0x36, 0x67, 0xa4, 0x54, 0xb8, 0xcd, 0x29, 0xcc, 0x0b, 0x51,
+	0x0a, 0xb7, 0x65, 0x0c, 0x90, 0xa4, 0x12, 0x56, 0x5e, 0xb8, 0xf1, 0xa1, 0xf6, 0x5e, 0xdf, 0xec,
+	0xa3, 0xf3, 0xa5, 0x47, 0x38, 0x17, 0x25, 0x29, 0x97, 0x82, 0x4b, 0x63, 0xee, 0xbc, 0x5b, 0xe0,
+	0x72, 0xac, 0xd3, 0x27, 0xb4, 0x60, 0x8f, 0x2a, 0x7b, 0xb2, 0xcd, 0x69, 0xc8, 0xd7, 0xac, 0xb3,
+	0x01, 0x17, 0x07, 0x24, 0xf7, 0x1c, 0x34, 0xa7, 0xd1, 0x38, 0x0e, 0xbb, 0x83, 0xbb, 0x41, 0xd8,
+	0x73, 0x8e, 0xdc, 0x26, 0x38, 0x99, 0x46, 0x0f, 0xd1, 0xf0, 0x29, 0x72, 0x2c, 0xf7, 0x14, 0xd4,
+	0x83, 0xd1, 0x10, 0xf7, 0x1c, 0x5b, 0x61, 0xf8, 0x8c, 0xbb, 0x13, 0xa7, 0xe6, 0x02, 0xd0, 0x88,
+	0xef, 0x47, 0x78, 0x1c, 0x3a, 0xc7, 0xee, 0x19, 0x00, 0x51, 0x88, 0x47, 0x73, 0xa3, 0xd5, 0x55,
+	0x9e, 0xfe, 0xdf, 0x0d, 0x34, 0x82, 0x1f, 0x0b, 0xb4, 0x17, 0x82, 0xc1, 0x7f, 0xef, 0x0a, 0xae,
+	0x0e, 0xec, 0x16, 0xab, 0x9b, 0x62, 0xeb, 0x25, 0xd8, 0x59, 0x33, 0xb1, 0x22, 0x3c, 0x83, 0xa2,
+	0xc8, 0xbc, 0x8c, 0x72, 0x7d, 0xf1, 0xbe, 0xde, 0x7c, 0x29, 0xff, 0x68, 0xfb, 0x56, 0x7f, 0x3f,
+	0xec, 0x5a, 0x1f, 0xe3, 0x4f, 0xbb, 0xd5, 0x37, 0x51, 0x38, 0x95, 0xd0, 0xa0, 0xa2, 0x99, 0x0f,
+	0x55, 0x45, 0xf2, 0x6b, 0xaf, 0x27, 0x38, 0x95, 0x49, 0xa5, 0x27, 0x33, 0x3f, 0xd1, 0xfa, 0xb7,
+	0xdd, 0x36, 0x8f, 0x08, 0xe1, 0x54, 0x22, 0x54, 0x4d, 0x20, 0x34, 0xf3, 0x11, 0xd2, 0x33, 0xaf,
+	0x0d, 0xbd, 0x98, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x65, 0x16, 0xc4, 0x05, 0x02, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/search_term_targeting_status.pb.go b/googleapis/ads/googleads/v3/enums/search_term_targeting_status.pb.go
new file mode 100644
index 0000000..4caaa6c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/search_term_targeting_status.pb.go
@@ -0,0 +1,135 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/search_term_targeting_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Indicates whether the search term is one of your targeted or excluded
+// keywords.
+type SearchTermTargetingStatusEnum_SearchTermTargetingStatus int32
+
+const (
+	// Not specified.
+	SearchTermTargetingStatusEnum_UNSPECIFIED SearchTermTargetingStatusEnum_SearchTermTargetingStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	SearchTermTargetingStatusEnum_UNKNOWN SearchTermTargetingStatusEnum_SearchTermTargetingStatus = 1
+	// Search term is added to targeted keywords.
+	SearchTermTargetingStatusEnum_ADDED SearchTermTargetingStatusEnum_SearchTermTargetingStatus = 2
+	// Search term matches a negative keyword.
+	SearchTermTargetingStatusEnum_EXCLUDED SearchTermTargetingStatusEnum_SearchTermTargetingStatus = 3
+	// Search term has been both added and excluded.
+	SearchTermTargetingStatusEnum_ADDED_EXCLUDED SearchTermTargetingStatusEnum_SearchTermTargetingStatus = 4
+	// Search term is neither targeted nor excluded.
+	SearchTermTargetingStatusEnum_NONE SearchTermTargetingStatusEnum_SearchTermTargetingStatus = 5
+)
+
+var SearchTermTargetingStatusEnum_SearchTermTargetingStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ADDED",
+	3: "EXCLUDED",
+	4: "ADDED_EXCLUDED",
+	5: "NONE",
+}
+
+var SearchTermTargetingStatusEnum_SearchTermTargetingStatus_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"ADDED":          2,
+	"EXCLUDED":       3,
+	"ADDED_EXCLUDED": 4,
+	"NONE":           5,
+}
+
+func (x SearchTermTargetingStatusEnum_SearchTermTargetingStatus) String() string {
+	return proto.EnumName(SearchTermTargetingStatusEnum_SearchTermTargetingStatus_name, int32(x))
+}
+
+func (SearchTermTargetingStatusEnum_SearchTermTargetingStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_da66182abbe9bacc, []int{0, 0}
+}
+
+// Container for enum indicating whether a search term is one of your targeted
+// or excluded keywords.
+type SearchTermTargetingStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SearchTermTargetingStatusEnum) Reset()         { *m = SearchTermTargetingStatusEnum{} }
+func (m *SearchTermTargetingStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*SearchTermTargetingStatusEnum) ProtoMessage()    {}
+func (*SearchTermTargetingStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da66182abbe9bacc, []int{0}
+}
+
+func (m *SearchTermTargetingStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchTermTargetingStatusEnum.Unmarshal(m, b)
+}
+func (m *SearchTermTargetingStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchTermTargetingStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *SearchTermTargetingStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchTermTargetingStatusEnum.Merge(m, src)
+}
+func (m *SearchTermTargetingStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_SearchTermTargetingStatusEnum.Size(m)
+}
+func (m *SearchTermTargetingStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchTermTargetingStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchTermTargetingStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SearchTermTargetingStatusEnum_SearchTermTargetingStatus", SearchTermTargetingStatusEnum_SearchTermTargetingStatus_name, SearchTermTargetingStatusEnum_SearchTermTargetingStatus_value)
+	proto.RegisterType((*SearchTermTargetingStatusEnum)(nil), "google.ads.googleads.v3.enums.SearchTermTargetingStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/search_term_targeting_status.proto", fileDescriptor_da66182abbe9bacc)
+}
+
+var fileDescriptor_da66182abbe9bacc = []byte{
+	// 336 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0xf3, 0x30,
+	0x10, 0xfd, 0x92, 0xb6, 0x1f, 0xc5, 0x45, 0x10, 0x79, 0x07, 0xa2, 0x48, 0xed, 0x01, 0x9c, 0x45,
+	0x76, 0x66, 0x43, 0xda, 0x84, 0xaa, 0x02, 0xa5, 0x95, 0xfa, 0x03, 0x42, 0x91, 0x22, 0xd3, 0x58,
+	0x26, 0x52, 0x63, 0x47, 0xb6, 0xdb, 0x7b, 0x70, 0x05, 0x96, 0x1c, 0x85, 0xa3, 0xb0, 0xe5, 0x02,
+	0x28, 0x4e, 0x93, 0x5d, 0xd9, 0x58, 0xcf, 0xf3, 0x66, 0xde, 0x9b, 0x79, 0xe0, 0x8e, 0x09, 0xc1,
+	0xb6, 0xd4, 0x25, 0xa9, 0x72, 0x2b, 0x58, 0xa2, 0xbd, 0xe7, 0x52, 0xbe, 0xcb, 0x95, 0xab, 0x28,
+	0x91, 0x9b, 0xb7, 0x44, 0x53, 0x99, 0x27, 0x9a, 0x48, 0x46, 0x75, 0xc6, 0x59, 0xa2, 0x34, 0xd1,
+	0x3b, 0x85, 0x0a, 0x29, 0xb4, 0x80, 0xfd, 0x6a, 0x0c, 0x91, 0x54, 0xa1, 0x46, 0x01, 0xed, 0x3d,
+	0x64, 0x14, 0xae, 0xae, 0x6b, 0x83, 0x22, 0x73, 0x09, 0xe7, 0x42, 0x13, 0x9d, 0x09, 0x7e, 0x18,
+	0x1e, 0xbe, 0x5b, 0xa0, 0xbf, 0x30, 0x1e, 0x4b, 0x2a, 0xf3, 0x65, 0xed, 0xb0, 0x30, 0x06, 0x21,
+	0xdf, 0xe5, 0xc3, 0x02, 0x5c, 0x1e, 0x6d, 0x80, 0x17, 0xa0, 0xb7, 0x8a, 0x16, 0xf3, 0x70, 0x3c,
+	0xbd, 0x9f, 0x86, 0x81, 0xf3, 0x0f, 0xf6, 0xc0, 0xc9, 0x2a, 0x7a, 0x88, 0x66, 0x4f, 0x91, 0x63,
+	0xc1, 0x53, 0xd0, 0xf1, 0x83, 0x20, 0x0c, 0x1c, 0x1b, 0x9e, 0x81, 0x6e, 0xf8, 0x3c, 0x7e, 0x5c,
+	0x95, 0xbf, 0x16, 0x84, 0xe0, 0xdc, 0x10, 0x49, 0x53, 0x6b, 0xc3, 0x2e, 0x68, 0x47, 0xb3, 0x28,
+	0x74, 0x3a, 0xa3, 0x1f, 0x0b, 0x0c, 0x36, 0x22, 0x47, 0x7f, 0xde, 0x35, 0xba, 0x39, 0xba, 0xd5,
+	0xbc, 0xbc, 0x6c, 0x6e, 0xbd, 0x8c, 0x0e, 0x02, 0x4c, 0x6c, 0x09, 0x67, 0x48, 0x48, 0xe6, 0x32,
+	0xca, 0xcd, 0xdd, 0x75, 0xd4, 0x45, 0xa6, 0x8e, 0x24, 0x7f, 0x6b, 0xde, 0x0f, 0xbb, 0x35, 0xf1,
+	0xfd, 0x4f, 0xbb, 0x3f, 0xa9, 0xa4, 0xfc, 0x54, 0xa1, 0x0a, 0x96, 0x68, 0xed, 0xa1, 0x32, 0x22,
+	0xf5, 0x55, 0xf3, 0xb1, 0x9f, 0xaa, 0xb8, 0xe1, 0xe3, 0xb5, 0x17, 0x1b, 0xfe, 0xdb, 0x1e, 0x54,
+	0x45, 0x8c, 0xfd, 0x54, 0x61, 0xdc, 0x74, 0x60, 0xbc, 0xf6, 0x30, 0x36, 0x3d, 0xaf, 0xff, 0xcd,
+	0x62, 0xde, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0a, 0x19, 0x13, 0x86, 0x11, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/served_asset_field_type.pb.go b/googleapis/ads/googleads/v3/enums/served_asset_field_type.pb.go
new file mode 100644
index 0000000..ed91b92
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/served_asset_field_type.pb.go
@@ -0,0 +1,140 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/served_asset_field_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible asset field types.
+type ServedAssetFieldTypeEnum_ServedAssetFieldType int32
+
+const (
+	// No value has been specified.
+	ServedAssetFieldTypeEnum_UNSPECIFIED ServedAssetFieldTypeEnum_ServedAssetFieldType = 0
+	// The received value is not known in this version.
+	//
+	// This is a response-only value.
+	ServedAssetFieldTypeEnum_UNKNOWN ServedAssetFieldTypeEnum_ServedAssetFieldType = 1
+	// The asset is used in headline 1.
+	ServedAssetFieldTypeEnum_HEADLINE_1 ServedAssetFieldTypeEnum_ServedAssetFieldType = 2
+	// The asset is used in headline 2.
+	ServedAssetFieldTypeEnum_HEADLINE_2 ServedAssetFieldTypeEnum_ServedAssetFieldType = 3
+	// The asset is used in headline 3.
+	ServedAssetFieldTypeEnum_HEADLINE_3 ServedAssetFieldTypeEnum_ServedAssetFieldType = 4
+	// The asset is used in description 1.
+	ServedAssetFieldTypeEnum_DESCRIPTION_1 ServedAssetFieldTypeEnum_ServedAssetFieldType = 5
+	// The asset is used in description 2.
+	ServedAssetFieldTypeEnum_DESCRIPTION_2 ServedAssetFieldTypeEnum_ServedAssetFieldType = 6
+)
+
+var ServedAssetFieldTypeEnum_ServedAssetFieldType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "HEADLINE_1",
+	3: "HEADLINE_2",
+	4: "HEADLINE_3",
+	5: "DESCRIPTION_1",
+	6: "DESCRIPTION_2",
+}
+
+var ServedAssetFieldTypeEnum_ServedAssetFieldType_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"HEADLINE_1":    2,
+	"HEADLINE_2":    3,
+	"HEADLINE_3":    4,
+	"DESCRIPTION_1": 5,
+	"DESCRIPTION_2": 6,
+}
+
+func (x ServedAssetFieldTypeEnum_ServedAssetFieldType) String() string {
+	return proto.EnumName(ServedAssetFieldTypeEnum_ServedAssetFieldType_name, int32(x))
+}
+
+func (ServedAssetFieldTypeEnum_ServedAssetFieldType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_22851b573f32db7f, []int{0, 0}
+}
+
+// Container for enum describing possible asset field types.
+type ServedAssetFieldTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ServedAssetFieldTypeEnum) Reset()         { *m = ServedAssetFieldTypeEnum{} }
+func (m *ServedAssetFieldTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*ServedAssetFieldTypeEnum) ProtoMessage()    {}
+func (*ServedAssetFieldTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_22851b573f32db7f, []int{0}
+}
+
+func (m *ServedAssetFieldTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ServedAssetFieldTypeEnum.Unmarshal(m, b)
+}
+func (m *ServedAssetFieldTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ServedAssetFieldTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *ServedAssetFieldTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ServedAssetFieldTypeEnum.Merge(m, src)
+}
+func (m *ServedAssetFieldTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_ServedAssetFieldTypeEnum.Size(m)
+}
+func (m *ServedAssetFieldTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ServedAssetFieldTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ServedAssetFieldTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.ServedAssetFieldTypeEnum_ServedAssetFieldType", ServedAssetFieldTypeEnum_ServedAssetFieldType_name, ServedAssetFieldTypeEnum_ServedAssetFieldType_value)
+	proto.RegisterType((*ServedAssetFieldTypeEnum)(nil), "google.ads.googleads.v3.enums.ServedAssetFieldTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/served_asset_field_type.proto", fileDescriptor_22851b573f32db7f)
+}
+
+var fileDescriptor_22851b573f32db7f = []byte{
+	// 344 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xdd, 0x4a, 0xc3, 0x30,
+	0x14, 0xb6, 0x9d, 0x4e, 0xc8, 0x50, 0x63, 0xf1, 0x42, 0xc5, 0x5d, 0x6c, 0x0f, 0x90, 0xb2, 0xe5,
+	0x2e, 0xbb, 0xca, 0xb6, 0x6e, 0x16, 0xa5, 0x2b, 0xee, 0x47, 0x90, 0x42, 0xa9, 0x26, 0x96, 0xc2,
+	0x96, 0x94, 0xa5, 0x1b, 0xec, 0x15, 0x7c, 0x0c, 0x6f, 0x04, 0x1f, 0xc5, 0x47, 0xf1, 0xc2, 0x67,
+	0x90, 0xa6, 0x6e, 0x30, 0x99, 0xde, 0x84, 0xef, 0x9c, 0xef, 0x7c, 0x1f, 0xe7, 0x7c, 0x01, 0xad,
+	0x58, 0xca, 0x78, 0xca, 0xed, 0x88, 0x29, 0xbb, 0x80, 0x39, 0x5a, 0x62, 0x9b, 0x8b, 0xc5, 0x4c,
+	0xd9, 0x8a, 0xcf, 0x97, 0x9c, 0x85, 0x91, 0x52, 0x3c, 0x0b, 0x9f, 0x13, 0x3e, 0x65, 0x61, 0xb6,
+	0x4a, 0x39, 0x4a, 0xe7, 0x32, 0x93, 0x56, 0xb5, 0x50, 0xa0, 0x88, 0x29, 0xb4, 0x11, 0xa3, 0x25,
+	0x46, 0x5a, 0x7c, 0x79, 0xb5, 0xf6, 0x4e, 0x13, 0x3b, 0x12, 0x42, 0x66, 0x51, 0x96, 0x48, 0xa1,
+	0x0a, 0x71, 0xfd, 0xcd, 0x00, 0xe7, 0x43, 0x6d, 0x4f, 0x73, 0xf7, 0x5e, 0x6e, 0x3e, 0x5a, 0xa5,
+	0xdc, 0x11, 0x8b, 0x59, 0xfd, 0xc5, 0x00, 0x67, 0xbb, 0x48, 0xeb, 0x04, 0x54, 0xc6, 0xde, 0xd0,
+	0x77, 0x3a, 0x6e, 0xcf, 0x75, 0xba, 0x70, 0xcf, 0xaa, 0x80, 0xc3, 0xb1, 0x77, 0xe3, 0x0d, 0xee,
+	0x3d, 0x68, 0x58, 0xc7, 0x00, 0x5c, 0x3b, 0xb4, 0x7b, 0xeb, 0x7a, 0x4e, 0xd8, 0x80, 0xe6, 0x56,
+	0xdd, 0x84, 0xa5, 0xad, 0x1a, 0xc3, 0x7d, 0xeb, 0x14, 0x1c, 0x75, 0x9d, 0x61, 0xe7, 0xce, 0xf5,
+	0x47, 0xee, 0xc0, 0x0b, 0x1b, 0xf0, 0xe0, 0x77, 0xab, 0x09, 0xcb, 0xed, 0x2f, 0x03, 0xd4, 0x9e,
+	0xe4, 0x0c, 0xfd, 0x7b, 0x6d, 0xfb, 0x62, 0xd7, 0xbe, 0x7e, 0x7e, 0xaa, 0x6f, 0x3c, 0xb4, 0x7f,
+	0xb4, 0xb1, 0x9c, 0x46, 0x22, 0x46, 0x72, 0x1e, 0xdb, 0x31, 0x17, 0x3a, 0x88, 0x75, 0xec, 0x69,
+	0xa2, 0xfe, 0xf8, 0x85, 0x96, 0x7e, 0x5f, 0xcd, 0x52, 0x9f, 0xd2, 0x77, 0xb3, 0xda, 0x2f, 0xac,
+	0x28, 0x53, 0xa8, 0x80, 0x39, 0x9a, 0x60, 0x94, 0x07, 0xa7, 0x3e, 0xd6, 0x7c, 0x40, 0x99, 0x0a,
+	0x36, 0x7c, 0x30, 0xc1, 0x81, 0xe6, 0x3f, 0xcd, 0x5a, 0xd1, 0x24, 0x84, 0x32, 0x45, 0xc8, 0x66,
+	0x82, 0x90, 0x09, 0x26, 0x44, 0xcf, 0x3c, 0x96, 0xf5, 0x62, 0xf8, 0x3b, 0x00, 0x00, 0xff, 0xff,
+	0xed, 0xfc, 0xd1, 0x6b, 0x1d, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/shared_set_status.pb.go b/googleapis/ads/googleads/v3/enums/shared_set_status.pb.go
new file mode 100644
index 0000000..1cc2ded
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/shared_set_status.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/shared_set_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum listing the possible shared set statuses.
+type SharedSetStatusEnum_SharedSetStatus int32
+
+const (
+	// Not specified.
+	SharedSetStatusEnum_UNSPECIFIED SharedSetStatusEnum_SharedSetStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	SharedSetStatusEnum_UNKNOWN SharedSetStatusEnum_SharedSetStatus = 1
+	// The shared set is enabled.
+	SharedSetStatusEnum_ENABLED SharedSetStatusEnum_SharedSetStatus = 2
+	// The shared set is removed and can no longer be used.
+	SharedSetStatusEnum_REMOVED SharedSetStatusEnum_SharedSetStatus = 3
+)
+
+var SharedSetStatusEnum_SharedSetStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "REMOVED",
+}
+
+var SharedSetStatusEnum_SharedSetStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"REMOVED":     3,
+}
+
+func (x SharedSetStatusEnum_SharedSetStatus) String() string {
+	return proto.EnumName(SharedSetStatusEnum_SharedSetStatus_name, int32(x))
+}
+
+func (SharedSetStatusEnum_SharedSetStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_aa56d9c6516a1fd1, []int{0, 0}
+}
+
+// Container for enum describing types of shared set statuses.
+type SharedSetStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SharedSetStatusEnum) Reset()         { *m = SharedSetStatusEnum{} }
+func (m *SharedSetStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*SharedSetStatusEnum) ProtoMessage()    {}
+func (*SharedSetStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aa56d9c6516a1fd1, []int{0}
+}
+
+func (m *SharedSetStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SharedSetStatusEnum.Unmarshal(m, b)
+}
+func (m *SharedSetStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SharedSetStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *SharedSetStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SharedSetStatusEnum.Merge(m, src)
+}
+func (m *SharedSetStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_SharedSetStatusEnum.Size(m)
+}
+func (m *SharedSetStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SharedSetStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SharedSetStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SharedSetStatusEnum_SharedSetStatus", SharedSetStatusEnum_SharedSetStatus_name, SharedSetStatusEnum_SharedSetStatus_value)
+	proto.RegisterType((*SharedSetStatusEnum)(nil), "google.ads.googleads.v3.enums.SharedSetStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/shared_set_status.proto", fileDescriptor_aa56d9c6516a1fd1)
+}
+
+var fileDescriptor_aa56d9c6516a1fd1 = []byte{
+	// 301 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcd, 0x4e, 0x32, 0x31,
+	0x14, 0xfd, 0x18, 0x92, 0xcf, 0xa4, 0x2c, 0x98, 0xa0, 0x2b, 0x23, 0x0b, 0x78, 0x80, 0x76, 0xd1,
+	0xb8, 0xa9, 0xab, 0x8e, 0x54, 0x42, 0xd4, 0x81, 0x38, 0x61, 0x4c, 0xcc, 0x24, 0x58, 0x6d, 0x53,
+	0x49, 0xa0, 0x25, 0xdc, 0xc2, 0x03, 0xb9, 0xf4, 0x51, 0x7c, 0x13, 0x7d, 0x0a, 0xd3, 0x0e, 0xb0,
+	0x20, 0xd1, 0xcd, 0xe4, 0xdc, 0x7b, 0x7e, 0xe6, 0xf4, 0xa2, 0x4b, 0xe3, 0x9c, 0x59, 0x68, 0x22,
+	0x15, 0x90, 0x1a, 0x06, 0xb4, 0xa5, 0x44, 0xdb, 0xcd, 0x12, 0x08, 0xbc, 0xc9, 0xb5, 0x56, 0x33,
+	0xd0, 0x7e, 0x06, 0x5e, 0xfa, 0x0d, 0xe0, 0xd5, 0xda, 0x79, 0xd7, 0xe9, 0xd6, 0x5a, 0x2c, 0x15,
+	0xe0, 0x83, 0x0d, 0x6f, 0x29, 0x8e, 0xb6, 0xf3, 0x8b, 0x7d, 0xea, 0x6a, 0x4e, 0xa4, 0xb5, 0xce,
+	0x4b, 0x3f, 0x77, 0x76, 0x67, 0xee, 0x3f, 0xa3, 0xd3, 0x22, 0xe6, 0x16, 0xda, 0x17, 0x31, 0x55,
+	0xd8, 0xcd, 0xb2, 0x3f, 0x42, 0xed, 0xa3, 0x75, 0xa7, 0x8d, 0x5a, 0xd3, 0xbc, 0x98, 0x88, 0xeb,
+	0xd1, 0xcd, 0x48, 0x0c, 0xd2, 0x7f, 0x9d, 0x16, 0x3a, 0x99, 0xe6, 0xb7, 0xf9, 0xf8, 0x31, 0x4f,
+	0x1b, 0x61, 0x10, 0x39, 0xcf, 0xee, 0xc4, 0x20, 0x4d, 0xc2, 0xf0, 0x20, 0xee, 0xc7, 0xa5, 0x18,
+	0xa4, 0xcd, 0xec, 0xab, 0x81, 0x7a, 0xaf, 0x6e, 0x89, 0xff, 0x6c, 0x99, 0x9d, 0x1d, 0xfd, 0x6e,
+	0x12, 0xda, 0x4d, 0x1a, 0x4f, 0xd9, 0xce, 0x66, 0xdc, 0x42, 0x5a, 0x83, 0xdd, 0xda, 0x10, 0xa3,
+	0x6d, 0xec, 0xbe, 0xbf, 0xd1, 0x6a, 0x0e, 0xbf, 0x9c, 0xec, 0x2a, 0x7e, 0xdf, 0x93, 0xe6, 0x90,
+	0xf3, 0x8f, 0xa4, 0x3b, 0xac, 0xa3, 0xb8, 0x02, 0x5c, 0xc3, 0x80, 0x4a, 0x8a, 0xc3, 0x8b, 0xe1,
+	0x73, 0xcf, 0x57, 0x5c, 0x41, 0x75, 0xe0, 0xab, 0x92, 0x56, 0x91, 0xff, 0x4e, 0x7a, 0xf5, 0x92,
+	0x31, 0xae, 0x80, 0xb1, 0x83, 0x82, 0xb1, 0x92, 0x32, 0x16, 0x35, 0x2f, 0xff, 0x63, 0x31, 0xfa,
+	0x13, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x90, 0xf6, 0xeb, 0xca, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/shared_set_type.pb.go b/googleapis/ads/googleads/v3/enums/shared_set_type.pb.go
new file mode 100644
index 0000000..f0e3242
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/shared_set_type.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/shared_set_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum listing the possible shared set types.
+type SharedSetTypeEnum_SharedSetType int32
+
+const (
+	// Not specified.
+	SharedSetTypeEnum_UNSPECIFIED SharedSetTypeEnum_SharedSetType = 0
+	// Used for return value only. Represents value unknown in this version.
+	SharedSetTypeEnum_UNKNOWN SharedSetTypeEnum_SharedSetType = 1
+	// A set of keywords that can be excluded from targeting.
+	SharedSetTypeEnum_NEGATIVE_KEYWORDS SharedSetTypeEnum_SharedSetType = 2
+	// A set of placements that can be excluded from targeting.
+	SharedSetTypeEnum_NEGATIVE_PLACEMENTS SharedSetTypeEnum_SharedSetType = 3
+)
+
+var SharedSetTypeEnum_SharedSetType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "NEGATIVE_KEYWORDS",
+	3: "NEGATIVE_PLACEMENTS",
+}
+
+var SharedSetTypeEnum_SharedSetType_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"NEGATIVE_KEYWORDS":   2,
+	"NEGATIVE_PLACEMENTS": 3,
+}
+
+func (x SharedSetTypeEnum_SharedSetType) String() string {
+	return proto.EnumName(SharedSetTypeEnum_SharedSetType_name, int32(x))
+}
+
+func (SharedSetTypeEnum_SharedSetType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3f04b2780a66f344, []int{0, 0}
+}
+
+// Container for enum describing types of shared sets.
+type SharedSetTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SharedSetTypeEnum) Reset()         { *m = SharedSetTypeEnum{} }
+func (m *SharedSetTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*SharedSetTypeEnum) ProtoMessage()    {}
+func (*SharedSetTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3f04b2780a66f344, []int{0}
+}
+
+func (m *SharedSetTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SharedSetTypeEnum.Unmarshal(m, b)
+}
+func (m *SharedSetTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SharedSetTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *SharedSetTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SharedSetTypeEnum.Merge(m, src)
+}
+func (m *SharedSetTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_SharedSetTypeEnum.Size(m)
+}
+func (m *SharedSetTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SharedSetTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SharedSetTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SharedSetTypeEnum_SharedSetType", SharedSetTypeEnum_SharedSetType_name, SharedSetTypeEnum_SharedSetType_value)
+	proto.RegisterType((*SharedSetTypeEnum)(nil), "google.ads.googleads.v3.enums.SharedSetTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/shared_set_type.proto", fileDescriptor_3f04b2780a66f344)
+}
+
+var fileDescriptor_3f04b2780a66f344 = []byte{
+	// 317 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
+	0x1c, 0x76, 0x1d, 0x28, 0x64, 0x88, 0x5d, 0x45, 0x04, 0x71, 0x87, 0xed, 0x01, 0xd2, 0x43, 0x6e,
+	0xf1, 0x94, 0x6d, 0x71, 0x8c, 0x69, 0x57, 0xec, 0xd6, 0xa1, 0x54, 0x46, 0xb5, 0x21, 0x0e, 0xb6,
+	0xa4, 0x34, 0xd9, 0x60, 0xaf, 0xe3, 0xd1, 0x47, 0xf1, 0x45, 0x04, 0x9f, 0x42, 0x9a, 0xd8, 0xc2,
+	0x0e, 0x7a, 0x09, 0x1f, 0xbf, 0xef, 0x0f, 0x5f, 0x3e, 0x80, 0xb8, 0x94, 0x7c, 0xcd, 0xfc, 0x34,
+	0x53, 0xbe, 0x85, 0x25, 0xda, 0x21, 0x9f, 0x89, 0xed, 0x46, 0xf9, 0xea, 0x2d, 0x2d, 0x58, 0xb6,
+	0x54, 0x4c, 0x2f, 0xf5, 0x3e, 0x67, 0x30, 0x2f, 0xa4, 0x96, 0x5e, 0xc7, 0x2a, 0x61, 0x9a, 0x29,
+	0x58, 0x9b, 0xe0, 0x0e, 0x41, 0x63, 0xba, 0xba, 0xae, 0x32, 0xf3, 0x95, 0x9f, 0x0a, 0x21, 0x75,
+	0xaa, 0x57, 0x52, 0x28, 0x6b, 0xee, 0x15, 0xa0, 0x1d, 0x99, 0xd4, 0x88, 0xe9, 0xd9, 0x3e, 0x67,
+	0x54, 0x6c, 0x37, 0xbd, 0x67, 0x70, 0x7a, 0x70, 0xf4, 0xce, 0x40, 0x6b, 0x1e, 0x44, 0x21, 0x1d,
+	0x8c, 0x6f, 0xc7, 0x74, 0xe8, 0x1e, 0x79, 0x2d, 0x70, 0x32, 0x0f, 0x26, 0xc1, 0x74, 0x11, 0xb8,
+	0x0d, 0xef, 0x02, 0xb4, 0x03, 0x3a, 0x22, 0xb3, 0x71, 0x4c, 0x97, 0x13, 0xfa, 0xb8, 0x98, 0x3e,
+	0x0c, 0x23, 0xd7, 0xf1, 0x2e, 0xc1, 0x79, 0x7d, 0x0e, 0xef, 0xc8, 0x80, 0xde, 0xd3, 0x60, 0x16,
+	0xb9, 0xcd, 0xfe, 0x57, 0x03, 0x74, 0x5f, 0xe5, 0x06, 0xfe, 0xdb, 0xbb, 0xef, 0x1d, 0x54, 0x08,
+	0xcb, 0xb6, 0x61, 0xe3, 0xa9, 0xff, 0x6b, 0xe2, 0x72, 0x9d, 0x0a, 0x0e, 0x65, 0xc1, 0x7d, 0xce,
+	0x84, 0xf9, 0x4b, 0xb5, 0x58, 0xbe, 0x52, 0x7f, 0x0c, 0x78, 0x63, 0xde, 0x77, 0xa7, 0x39, 0x22,
+	0xe4, 0xc3, 0xe9, 0x8c, 0x6c, 0x14, 0xc9, 0x14, 0xb4, 0xb0, 0x44, 0x31, 0x82, 0xe5, 0x06, 0xea,
+	0xb3, 0xe2, 0x13, 0x92, 0xa9, 0xa4, 0xe6, 0x93, 0x18, 0x25, 0x86, 0xff, 0x76, 0xba, 0xf6, 0x88,
+	0x31, 0xc9, 0x14, 0xc6, 0xb5, 0x02, 0xe3, 0x18, 0x61, 0x6c, 0x34, 0x2f, 0xc7, 0xa6, 0x18, 0xfa,
+	0x09, 0x00, 0x00, 0xff, 0xff, 0x69, 0xb8, 0x8e, 0xf5, 0xd8, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/simulation_modification_method.pb.go b/googleapis/ads/googleads/v3/enums/simulation_modification_method.pb.go
new file mode 100644
index 0000000..91f8457
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/simulation_modification_method.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/simulation_modification_method.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the method by which a simulation modifies a field.
+type SimulationModificationMethodEnum_SimulationModificationMethod int32
+
+const (
+	// Not specified.
+	SimulationModificationMethodEnum_UNSPECIFIED SimulationModificationMethodEnum_SimulationModificationMethod = 0
+	// Used for return value only. Represents value unknown in this version.
+	SimulationModificationMethodEnum_UNKNOWN SimulationModificationMethodEnum_SimulationModificationMethod = 1
+	// The values in a simulation were applied to all children of a given
+	// resource uniformly. Overrides on child resources were not respected.
+	SimulationModificationMethodEnum_UNIFORM SimulationModificationMethodEnum_SimulationModificationMethod = 2
+	// The values in a simulation were applied to the given resource.
+	// Overrides on child resources were respected, and traffic estimates
+	// do not include these resources.
+	SimulationModificationMethodEnum_DEFAULT SimulationModificationMethodEnum_SimulationModificationMethod = 3
+)
+
+var SimulationModificationMethodEnum_SimulationModificationMethod_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "UNIFORM",
+	3: "DEFAULT",
+}
+
+var SimulationModificationMethodEnum_SimulationModificationMethod_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"UNIFORM":     2,
+	"DEFAULT":     3,
+}
+
+func (x SimulationModificationMethodEnum_SimulationModificationMethod) String() string {
+	return proto.EnumName(SimulationModificationMethodEnum_SimulationModificationMethod_name, int32(x))
+}
+
+func (SimulationModificationMethodEnum_SimulationModificationMethod) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_cfaf85ba3d548b87, []int{0, 0}
+}
+
+// Container for enum describing the method by which a simulation modifies
+// a field.
+type SimulationModificationMethodEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SimulationModificationMethodEnum) Reset()         { *m = SimulationModificationMethodEnum{} }
+func (m *SimulationModificationMethodEnum) String() string { return proto.CompactTextString(m) }
+func (*SimulationModificationMethodEnum) ProtoMessage()    {}
+func (*SimulationModificationMethodEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_cfaf85ba3d548b87, []int{0}
+}
+
+func (m *SimulationModificationMethodEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SimulationModificationMethodEnum.Unmarshal(m, b)
+}
+func (m *SimulationModificationMethodEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SimulationModificationMethodEnum.Marshal(b, m, deterministic)
+}
+func (m *SimulationModificationMethodEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SimulationModificationMethodEnum.Merge(m, src)
+}
+func (m *SimulationModificationMethodEnum) XXX_Size() int {
+	return xxx_messageInfo_SimulationModificationMethodEnum.Size(m)
+}
+func (m *SimulationModificationMethodEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SimulationModificationMethodEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SimulationModificationMethodEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SimulationModificationMethodEnum_SimulationModificationMethod", SimulationModificationMethodEnum_SimulationModificationMethod_name, SimulationModificationMethodEnum_SimulationModificationMethod_value)
+	proto.RegisterType((*SimulationModificationMethodEnum)(nil), "google.ads.googleads.v3.enums.SimulationModificationMethodEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/simulation_modification_method.proto", fileDescriptor_cfaf85ba3d548b87)
+}
+
+var fileDescriptor_cfaf85ba3d548b87 = []byte{
+	// 309 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xb1, 0x4e, 0xeb, 0x30,
+	0x14, 0x7d, 0x4d, 0xa5, 0x87, 0xe4, 0x0e, 0x44, 0x1d, 0x51, 0x2b, 0xd1, 0x7e, 0x80, 0x3d, 0x78,
+	0x33, 0x93, 0x4b, 0xd3, 0xaa, 0x82, 0xa4, 0x11, 0x25, 0x41, 0x42, 0x91, 0x50, 0xa8, 0x83, 0xb1,
+	0x94, 0xd8, 0x51, 0x9d, 0x74, 0xe0, 0x73, 0x18, 0xf9, 0x14, 0x3e, 0x85, 0x0f, 0x60, 0x46, 0xb1,
+	0x9b, 0x88, 0x85, 0x2c, 0xd6, 0xb9, 0xbe, 0xe7, 0x9e, 0x73, 0xef, 0x01, 0x0b, 0xae, 0x14, 0xcf,
+	0x33, 0x94, 0x32, 0x8d, 0x2c, 0x6c, 0xd0, 0x11, 0xa3, 0x4c, 0xd6, 0x85, 0x46, 0x5a, 0x14, 0x75,
+	0x9e, 0x56, 0x42, 0xc9, 0xa7, 0x42, 0x31, 0xf1, 0x22, 0xf6, 0xa7, 0x22, 0xab, 0x5e, 0x15, 0x83,
+	0xe5, 0x41, 0x55, 0x6a, 0x3c, 0xb5, 0x83, 0x30, 0x65, 0x1a, 0x76, 0x1a, 0xf0, 0x88, 0xa1, 0xd1,
+	0xb8, 0x98, 0xb4, 0x16, 0xa5, 0x40, 0xa9, 0x94, 0xaa, 0x32, 0x12, 0xda, 0x0e, 0xcf, 0xdf, 0xc0,
+	0xe5, 0xae, 0x33, 0xf1, 0x7f, 0x79, 0xf8, 0xc6, 0xc2, 0x93, 0x75, 0x31, 0x8f, 0xc1, 0xa4, 0x8f,
+	0x33, 0x3e, 0x07, 0xa3, 0x28, 0xd8, 0x85, 0xde, 0xf5, 0x66, 0xb5, 0xf1, 0x96, 0xee, 0xbf, 0xf1,
+	0x08, 0x9c, 0x45, 0xc1, 0x4d, 0xb0, 0x7d, 0x08, 0xdc, 0x81, 0x2d, 0x36, 0xab, 0xed, 0x9d, 0xef,
+	0x3a, 0x4d, 0xb1, 0xf4, 0x56, 0x34, 0xba, 0xbd, 0x77, 0x87, 0x8b, 0xef, 0x01, 0x98, 0xed, 0x55,
+	0x01, 0x7b, 0xf7, 0x5f, 0xcc, 0xfa, 0xbc, 0xc3, 0xe6, 0x88, 0x70, 0xf0, 0x78, 0xca, 0x11, 0x72,
+	0x95, 0xa7, 0x92, 0x43, 0x75, 0xe0, 0x88, 0x67, 0xd2, 0x9c, 0xd8, 0xe6, 0x5a, 0x0a, 0xfd, 0x47,
+	0xcc, 0x57, 0xe6, 0x7d, 0x77, 0x86, 0x6b, 0x4a, 0x3f, 0x9c, 0xe9, 0xda, 0x4a, 0x51, 0xa6, 0xa1,
+	0x85, 0x0d, 0x8a, 0x31, 0x6c, 0xb2, 0xd0, 0x9f, 0x6d, 0x3f, 0xa1, 0x4c, 0x27, 0x5d, 0x3f, 0x89,
+	0x71, 0x62, 0xfa, 0x5f, 0xce, 0xcc, 0x7e, 0x12, 0x42, 0x99, 0x26, 0xa4, 0x63, 0x10, 0x12, 0x63,
+	0x42, 0x0c, 0xe7, 0xf9, 0xbf, 0x59, 0x0c, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x08, 0xda, 0x85,
+	0xbb, 0xfe, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/simulation_type.pb.go b/googleapis/ads/googleads/v3/enums/simulation_type.pb.go
new file mode 100644
index 0000000..4dc425a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/simulation_type.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/simulation_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing the field a simulation modifies.
+type SimulationTypeEnum_SimulationType int32
+
+const (
+	// Not specified.
+	SimulationTypeEnum_UNSPECIFIED SimulationTypeEnum_SimulationType = 0
+	// Used for return value only. Represents value unknown in this version.
+	SimulationTypeEnum_UNKNOWN SimulationTypeEnum_SimulationType = 1
+	// The simulation is for a cpc bid.
+	SimulationTypeEnum_CPC_BID SimulationTypeEnum_SimulationType = 2
+	// The simulation is for a cpv bid.
+	SimulationTypeEnum_CPV_BID SimulationTypeEnum_SimulationType = 3
+	// The simulation is for a cpa target.
+	SimulationTypeEnum_TARGET_CPA SimulationTypeEnum_SimulationType = 4
+	// The simulation is for a bid modifier.
+	SimulationTypeEnum_BID_MODIFIER SimulationTypeEnum_SimulationType = 5
+)
+
+var SimulationTypeEnum_SimulationType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CPC_BID",
+	3: "CPV_BID",
+	4: "TARGET_CPA",
+	5: "BID_MODIFIER",
+}
+
+var SimulationTypeEnum_SimulationType_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"CPC_BID":      2,
+	"CPV_BID":      3,
+	"TARGET_CPA":   4,
+	"BID_MODIFIER": 5,
+}
+
+func (x SimulationTypeEnum_SimulationType) String() string {
+	return proto.EnumName(SimulationTypeEnum_SimulationType_name, int32(x))
+}
+
+func (SimulationTypeEnum_SimulationType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d1c7182d7b109649, []int{0, 0}
+}
+
+// Container for enum describing the field a simulation modifies.
+type SimulationTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SimulationTypeEnum) Reset()         { *m = SimulationTypeEnum{} }
+func (m *SimulationTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*SimulationTypeEnum) ProtoMessage()    {}
+func (*SimulationTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d1c7182d7b109649, []int{0}
+}
+
+func (m *SimulationTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SimulationTypeEnum.Unmarshal(m, b)
+}
+func (m *SimulationTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SimulationTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *SimulationTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SimulationTypeEnum.Merge(m, src)
+}
+func (m *SimulationTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_SimulationTypeEnum.Size(m)
+}
+func (m *SimulationTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SimulationTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SimulationTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SimulationTypeEnum_SimulationType", SimulationTypeEnum_SimulationType_name, SimulationTypeEnum_SimulationType_value)
+	proto.RegisterType((*SimulationTypeEnum)(nil), "google.ads.googleads.v3.enums.SimulationTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/simulation_type.proto", fileDescriptor_d1c7182d7b109649)
+}
+
+var fileDescriptor_d1c7182d7b109649 = []byte{
+	// 323 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcd, 0x4a, 0xf3, 0x40,
+	0x14, 0xfd, 0x92, 0x7e, 0x2a, 0x4c, 0xa5, 0x86, 0xb8, 0x13, 0xbb, 0x68, 0x1f, 0x60, 0xb2, 0x98,
+	0xdd, 0xb8, 0x9a, 0xfc, 0x58, 0x82, 0x98, 0x86, 0xfe, 0x44, 0x90, 0x40, 0x88, 0x26, 0x0c, 0x91,
+	0x66, 0x26, 0x74, 0xd2, 0x42, 0x77, 0x3e, 0x8b, 0x4b, 0x1f, 0xc5, 0x27, 0x11, 0x9f, 0x42, 0x66,
+	0xc6, 0x04, 0xba, 0xd0, 0xcd, 0x70, 0xee, 0xdc, 0x73, 0x0e, 0xe7, 0x1e, 0x80, 0x28, 0xe7, 0x74,
+	0x53, 0x3a, 0x79, 0x21, 0x1c, 0x0d, 0x25, 0xda, 0x23, 0xa7, 0x64, 0xbb, 0x5a, 0x38, 0xa2, 0xaa,
+	0x77, 0x9b, 0xbc, 0xad, 0x38, 0xcb, 0xda, 0x43, 0x53, 0xc2, 0x66, 0xcb, 0x5b, 0x6e, 0x8f, 0x35,
+	0x13, 0xe6, 0x85, 0x80, 0xbd, 0x08, 0xee, 0x11, 0x54, 0xa2, 0xab, 0xeb, 0xce, 0xb3, 0xa9, 0x9c,
+	0x9c, 0x31, 0xde, 0x2a, 0x03, 0xa1, 0xc5, 0xd3, 0x57, 0x03, 0xd8, 0xcb, 0xde, 0x76, 0x75, 0x68,
+	0xca, 0x80, 0xed, 0xea, 0xe9, 0x0b, 0x18, 0x1d, 0xff, 0xda, 0x17, 0x60, 0xb8, 0x8e, 0x96, 0x71,
+	0xe0, 0x85, 0xb7, 0x61, 0xe0, 0x5b, 0xff, 0xec, 0x21, 0x38, 0x5b, 0x47, 0x77, 0xd1, 0xfc, 0x21,
+	0xb2, 0x0c, 0x39, 0x78, 0xb1, 0x97, 0xb9, 0xa1, 0x6f, 0x99, 0x7a, 0x48, 0xd4, 0x30, 0xb0, 0x47,
+	0x00, 0xac, 0xc8, 0x62, 0x16, 0xac, 0x32, 0x2f, 0x26, 0xd6, 0x7f, 0xdb, 0x02, 0xe7, 0x6e, 0xe8,
+	0x67, 0xf7, 0x73, 0x5f, 0x1a, 0x2d, 0xac, 0x13, 0xf7, 0xd3, 0x00, 0x93, 0x67, 0x5e, 0xc3, 0x3f,
+	0xcf, 0x70, 0x2f, 0x8f, 0xf3, 0xc4, 0x32, 0x7d, 0x6c, 0x3c, 0xba, 0x3f, 0x2a, 0xca, 0x37, 0x39,
+	0xa3, 0x90, 0x6f, 0xa9, 0x43, 0x4b, 0xa6, 0x6e, 0xeb, 0x1a, 0x6c, 0x2a, 0xf1, 0x4b, 0xa1, 0x37,
+	0xea, 0x7d, 0x33, 0x07, 0x33, 0x42, 0xde, 0xcd, 0xf1, 0x4c, 0x5b, 0x91, 0x42, 0x40, 0x0d, 0x25,
+	0x4a, 0x10, 0x94, 0x8d, 0x88, 0x8f, 0x6e, 0x9f, 0x92, 0x42, 0xa4, 0xfd, 0x3e, 0x4d, 0x50, 0xaa,
+	0xf6, 0x5f, 0xe6, 0x44, 0x7f, 0x62, 0x4c, 0x0a, 0x81, 0x71, 0xcf, 0xc0, 0x38, 0x41, 0x18, 0x2b,
+	0xce, 0xd3, 0xa9, 0x0a, 0x86, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0x56, 0xbb, 0x64, 0x6f, 0xe8,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/sitelink_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/sitelink_placeholder_field.pb.go
new file mode 100644
index 0000000..8b1aaf1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/sitelink_placeholder_field.pb.go
@@ -0,0 +1,152 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/sitelink_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Sitelink placeholder fields.
+type SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField int32
+
+const (
+	// Not specified.
+	SitelinkPlaceholderFieldEnum_UNSPECIFIED SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	SitelinkPlaceholderFieldEnum_UNKNOWN SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField = 1
+	// Data Type: STRING. The link text for your sitelink.
+	SitelinkPlaceholderFieldEnum_TEXT SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField = 2
+	// Data Type: STRING. First line of the sitelink description.
+	SitelinkPlaceholderFieldEnum_LINE_1 SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField = 3
+	// Data Type: STRING. Second line of the sitelink description.
+	SitelinkPlaceholderFieldEnum_LINE_2 SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField = 4
+	// Data Type: URL_LIST. Final URLs for the sitelink when using Upgraded
+	// URLs.
+	SitelinkPlaceholderFieldEnum_FINAL_URLS SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField = 5
+	// Data Type: URL_LIST. Final Mobile URLs for the sitelink when using
+	// Upgraded URLs.
+	SitelinkPlaceholderFieldEnum_FINAL_MOBILE_URLS SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField = 6
+	// Data Type: URL. Tracking template for the sitelink when using Upgraded
+	// URLs.
+	SitelinkPlaceholderFieldEnum_TRACKING_URL SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField = 7
+	// Data Type: STRING. Final URL suffix for sitelink when using parallel
+	// tracking.
+	SitelinkPlaceholderFieldEnum_FINAL_URL_SUFFIX SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField = 8
+)
+
+var SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "TEXT",
+	3: "LINE_1",
+	4: "LINE_2",
+	5: "FINAL_URLS",
+	6: "FINAL_MOBILE_URLS",
+	7: "TRACKING_URL",
+	8: "FINAL_URL_SUFFIX",
+}
+
+var SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":       0,
+	"UNKNOWN":           1,
+	"TEXT":              2,
+	"LINE_1":            3,
+	"LINE_2":            4,
+	"FINAL_URLS":        5,
+	"FINAL_MOBILE_URLS": 6,
+	"TRACKING_URL":      7,
+	"FINAL_URL_SUFFIX":  8,
+}
+
+func (x SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField) String() string {
+	return proto.EnumName(SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField_name, int32(x))
+}
+
+func (SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_09e6e96547734ac1, []int{0, 0}
+}
+
+// Values for Sitelink placeholder fields.
+type SitelinkPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SitelinkPlaceholderFieldEnum) Reset()         { *m = SitelinkPlaceholderFieldEnum{} }
+func (m *SitelinkPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*SitelinkPlaceholderFieldEnum) ProtoMessage()    {}
+func (*SitelinkPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_09e6e96547734ac1, []int{0}
+}
+
+func (m *SitelinkPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SitelinkPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *SitelinkPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SitelinkPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *SitelinkPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SitelinkPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *SitelinkPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_SitelinkPlaceholderFieldEnum.Size(m)
+}
+func (m *SitelinkPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SitelinkPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SitelinkPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField", SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField_name, SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField_value)
+	proto.RegisterType((*SitelinkPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.SitelinkPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/sitelink_placeholder_field.proto", fileDescriptor_09e6e96547734ac1)
+}
+
+var fileDescriptor_09e6e96547734ac1 = []byte{
+	// 377 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xd1, 0x8e, 0x9a, 0x40,
+	0x14, 0x86, 0x0b, 0x5a, 0x35, 0x63, 0xd3, 0x4e, 0x27, 0x6d, 0xd2, 0x34, 0x7a, 0xa1, 0x0f, 0x30,
+	0xa4, 0xe5, 0x6e, 0x9a, 0x34, 0x01, 0x0b, 0x86, 0x48, 0x91, 0x88, 0xb8, 0x66, 0x43, 0x42, 0x58,
+	0x61, 0x59, 0xb2, 0x38, 0x43, 0x1c, 0xf4, 0x81, 0xf6, 0x6e, 0xf7, 0x51, 0x7c, 0x94, 0xbd, 0xdc,
+	0x27, 0xd8, 0xc0, 0x28, 0x7b, 0xe5, 0xde, 0x4c, 0xfe, 0x39, 0xe7, 0x7c, 0xe7, 0xcc, 0xfc, 0x07,
+	0xfc, 0x4d, 0x19, 0x4b, 0xf3, 0x44, 0x89, 0x62, 0xae, 0x08, 0x59, 0xa9, 0x83, 0xaa, 0x24, 0x74,
+	0xbf, 0xe5, 0x0a, 0xcf, 0xca, 0x24, 0xcf, 0xe8, 0x7d, 0x58, 0xe4, 0xd1, 0x26, 0xb9, 0x63, 0x79,
+	0x9c, 0xec, 0xc2, 0xdb, 0x2c, 0xc9, 0x63, 0x5c, 0xec, 0x58, 0xc9, 0xd0, 0x50, 0x40, 0x38, 0x8a,
+	0x39, 0x6e, 0x78, 0x7c, 0x50, 0x71, 0xcd, 0xff, 0x1c, 0x9c, 0xdb, 0x17, 0x99, 0x12, 0x51, 0xca,
+	0xca, 0xa8, 0xcc, 0x18, 0xe5, 0x02, 0x1e, 0x1f, 0x25, 0x30, 0xf0, 0x4e, 0x13, 0xdc, 0xb7, 0x01,
+	0x66, 0xd5, 0xdf, 0xa0, 0xfb, 0xed, 0xf8, 0x51, 0x02, 0x3f, 0x2e, 0x15, 0xa0, 0x2f, 0xa0, 0xef,
+	0x3b, 0x9e, 0x6b, 0x4c, 0x2c, 0xd3, 0x32, 0xfe, 0xc1, 0x0f, 0xa8, 0x0f, 0xba, 0xbe, 0x33, 0x73,
+	0xe6, 0x57, 0x0e, 0x94, 0x50, 0x0f, 0xb4, 0x97, 0xc6, 0x7a, 0x09, 0x65, 0x04, 0x40, 0xc7, 0xb6,
+	0x1c, 0x23, 0xfc, 0x05, 0x5b, 0x8d, 0xfe, 0x0d, 0xdb, 0xe8, 0x33, 0x00, 0xa6, 0xe5, 0x68, 0x76,
+	0xe8, 0x2f, 0x6c, 0x0f, 0x7e, 0x44, 0xdf, 0xc1, 0x57, 0x71, 0xff, 0x3f, 0xd7, 0x2d, 0xdb, 0x10,
+	0xe1, 0x0e, 0x82, 0xe0, 0xd3, 0x72, 0xa1, 0x4d, 0x66, 0x96, 0x33, 0xad, 0x42, 0xb0, 0x8b, 0xbe,
+	0x01, 0xd8, 0x80, 0xa1, 0xe7, 0x9b, 0xa6, 0xb5, 0x86, 0x3d, 0xfd, 0x45, 0x02, 0xa3, 0x0d, 0xdb,
+	0xe2, 0x77, 0x0d, 0xd1, 0x87, 0x97, 0xbe, 0xe3, 0x56, 0x8e, 0xb8, 0xd2, 0xb5, 0x7e, 0xe2, 0x53,
+	0x96, 0x47, 0x34, 0xc5, 0x6c, 0x97, 0x2a, 0x69, 0x42, 0x6b, 0xbf, 0xce, 0x0b, 0x2a, 0x32, 0x7e,
+	0x61, 0x5f, 0x7f, 0xea, 0xf3, 0x41, 0x6e, 0x4d, 0x35, 0xed, 0x49, 0x1e, 0x4e, 0x45, 0x2b, 0x2d,
+	0xe6, 0x58, 0xc8, 0x4a, 0xad, 0x54, 0x5c, 0x79, 0xcb, 0x8f, 0xe7, 0x7c, 0xa0, 0xc5, 0x3c, 0x68,
+	0xf2, 0xc1, 0x4a, 0x0d, 0xea, 0xfc, 0xb3, 0x3c, 0x12, 0x41, 0x42, 0xb4, 0x98, 0x13, 0xd2, 0x54,
+	0x10, 0xb2, 0x52, 0x09, 0xa9, 0x6b, 0x6e, 0x3a, 0xf5, 0xc3, 0xd4, 0xd7, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0xe0, 0xce, 0x53, 0x75, 0x47, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/slot.pb.go b/googleapis/ads/googleads/v3/enums/slot.pb.go
new file mode 100644
index 0000000..e7933d3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/slot.pb.go
@@ -0,0 +1,146 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/slot.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enumerates possible positions of the Ad.
+type SlotEnum_Slot int32
+
+const (
+	// Not specified.
+	SlotEnum_UNSPECIFIED SlotEnum_Slot = 0
+	// The value is unknown in this version.
+	SlotEnum_UNKNOWN SlotEnum_Slot = 1
+	// Google search: Side.
+	SlotEnum_SEARCH_SIDE SlotEnum_Slot = 2
+	// Google search: Top.
+	SlotEnum_SEARCH_TOP SlotEnum_Slot = 3
+	// Google search: Other.
+	SlotEnum_SEARCH_OTHER SlotEnum_Slot = 4
+	// Google Display Network.
+	SlotEnum_CONTENT SlotEnum_Slot = 5
+	// Search partners: Top.
+	SlotEnum_SEARCH_PARTNER_TOP SlotEnum_Slot = 6
+	// Search partners: Other.
+	SlotEnum_SEARCH_PARTNER_OTHER SlotEnum_Slot = 7
+	// Cross-network.
+	SlotEnum_MIXED SlotEnum_Slot = 8
+)
+
+var SlotEnum_Slot_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "SEARCH_SIDE",
+	3: "SEARCH_TOP",
+	4: "SEARCH_OTHER",
+	5: "CONTENT",
+	6: "SEARCH_PARTNER_TOP",
+	7: "SEARCH_PARTNER_OTHER",
+	8: "MIXED",
+}
+
+var SlotEnum_Slot_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"SEARCH_SIDE":          2,
+	"SEARCH_TOP":           3,
+	"SEARCH_OTHER":         4,
+	"CONTENT":              5,
+	"SEARCH_PARTNER_TOP":   6,
+	"SEARCH_PARTNER_OTHER": 7,
+	"MIXED":                8,
+}
+
+func (x SlotEnum_Slot) String() string {
+	return proto.EnumName(SlotEnum_Slot_name, int32(x))
+}
+
+func (SlotEnum_Slot) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fef43849b89d590c, []int{0, 0}
+}
+
+// Container for enumeration of possible positions of the Ad.
+type SlotEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SlotEnum) Reset()         { *m = SlotEnum{} }
+func (m *SlotEnum) String() string { return proto.CompactTextString(m) }
+func (*SlotEnum) ProtoMessage()    {}
+func (*SlotEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fef43849b89d590c, []int{0}
+}
+
+func (m *SlotEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SlotEnum.Unmarshal(m, b)
+}
+func (m *SlotEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SlotEnum.Marshal(b, m, deterministic)
+}
+func (m *SlotEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SlotEnum.Merge(m, src)
+}
+func (m *SlotEnum) XXX_Size() int {
+	return xxx_messageInfo_SlotEnum.Size(m)
+}
+func (m *SlotEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SlotEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SlotEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SlotEnum_Slot", SlotEnum_Slot_name, SlotEnum_Slot_value)
+	proto.RegisterType((*SlotEnum)(nil), "google.ads.googleads.v3.enums.SlotEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/slot.proto", fileDescriptor_fef43849b89d590c)
+}
+
+var fileDescriptor_fef43849b89d590c = []byte{
+	// 346 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xfb, 0x40,
+	0x18, 0xfc, 0x25, 0xfd, 0xbf, 0xfd, 0xa1, 0xcb, 0x22, 0x22, 0x62, 0x0f, 0xed, 0xc9, 0xd3, 0xe6,
+	0x90, 0xdb, 0x7a, 0x4a, 0xdb, 0xb5, 0x0d, 0x62, 0x12, 0x92, 0xb4, 0x8a, 0x04, 0x24, 0x9a, 0x12,
+	0x0a, 0xe9, 0x6e, 0xe9, 0xa6, 0x7d, 0x1f, 0x3d, 0x7a, 0xf0, 0x41, 0x7c, 0x08, 0x1f, 0xc0, 0xa7,
+	0x90, 0xdd, 0x4d, 0x7b, 0x10, 0xf4, 0xb2, 0xcc, 0xf7, 0xcd, 0xcc, 0xc7, 0xce, 0x80, 0xcb, 0x9c,
+	0xf3, 0xbc, 0x58, 0x58, 0x69, 0x26, 0x2c, 0x0d, 0x25, 0xda, 0xd9, 0xd6, 0x82, 0x6d, 0x57, 0xc2,
+	0x12, 0x05, 0x2f, 0xf1, 0x7a, 0xc3, 0x4b, 0x8e, 0x7a, 0x9a, 0xc6, 0x69, 0x26, 0xf0, 0x41, 0x89,
+	0x77, 0x36, 0x56, 0xca, 0xf3, 0x8b, 0xfd, 0xa1, 0xf5, 0xd2, 0x4a, 0x19, 0xe3, 0x65, 0x5a, 0x2e,
+	0x39, 0x13, 0xda, 0x3c, 0x78, 0x37, 0x40, 0x3b, 0x2a, 0x78, 0x49, 0xd9, 0x76, 0x35, 0x78, 0x31,
+	0x40, 0x5d, 0x0e, 0xe8, 0x18, 0x74, 0x67, 0x5e, 0x14, 0xd0, 0x91, 0x7b, 0xed, 0xd2, 0x31, 0xfc,
+	0x87, 0xba, 0xa0, 0x35, 0xf3, 0x6e, 0x3c, 0xff, 0xce, 0x83, 0x86, 0x64, 0x23, 0xea, 0x84, 0xa3,
+	0xe9, 0x63, 0xe4, 0x8e, 0x29, 0x34, 0xd1, 0x11, 0x00, 0xd5, 0x22, 0xf6, 0x03, 0x58, 0x43, 0x10,
+	0xfc, 0xaf, 0x66, 0x3f, 0x9e, 0xd2, 0x10, 0xd6, 0xa5, 0x7f, 0xe4, 0x7b, 0x31, 0xf5, 0x62, 0xd8,
+	0x40, 0xa7, 0x00, 0x55, 0x74, 0xe0, 0x84, 0xb1, 0x47, 0x43, 0x65, 0x6b, 0xa2, 0x33, 0x70, 0xf2,
+	0x63, 0xaf, 0xed, 0x2d, 0xd4, 0x01, 0x8d, 0x5b, 0xf7, 0x9e, 0x8e, 0x61, 0x7b, 0xf8, 0x69, 0x80,
+	0xfe, 0x33, 0x5f, 0xe1, 0x3f, 0x43, 0x0f, 0x3b, 0x32, 0x46, 0x20, 0x13, 0x06, 0xc6, 0xc3, 0xb0,
+	0xd2, 0xe6, 0xbc, 0x48, 0x59, 0x8e, 0xf9, 0x26, 0xb7, 0xf2, 0x05, 0x53, 0xf9, 0xf7, 0xd5, 0xae,
+	0x97, 0xe2, 0x97, 0xa6, 0xaf, 0xd4, 0xfb, 0x6a, 0xd6, 0x26, 0x8e, 0xf3, 0x66, 0xf6, 0x26, 0xfa,
+	0x94, 0x93, 0x09, 0xac, 0xa1, 0x44, 0x73, 0x1b, 0xcb, 0xfe, 0xc4, 0xc7, 0x9e, 0x4f, 0x9c, 0x4c,
+	0x24, 0x07, 0x3e, 0x99, 0xdb, 0x89, 0xe2, 0xbf, 0xcc, 0xbe, 0x5e, 0x12, 0xe2, 0x64, 0x82, 0x90,
+	0x83, 0x82, 0x90, 0xb9, 0x4d, 0x88, 0xd2, 0x3c, 0x35, 0xd5, 0xc7, 0xec, 0xef, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0x11, 0xde, 0x43, 0x57, 0x01, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/spending_limit_type.pb.go b/googleapis/ads/googleads/v3/enums/spending_limit_type.pb.go
new file mode 100644
index 0000000..816fd9d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/spending_limit_type.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/spending_limit_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible spending limit types used by certain resources as an
+// alternative to absolute money values in micros.
+type SpendingLimitTypeEnum_SpendingLimitType int32
+
+const (
+	// Not specified.
+	SpendingLimitTypeEnum_UNSPECIFIED SpendingLimitTypeEnum_SpendingLimitType = 0
+	// Used for return value only. Represents value unknown in this version.
+	SpendingLimitTypeEnum_UNKNOWN SpendingLimitTypeEnum_SpendingLimitType = 1
+	// Infinite, indicates unlimited spending power.
+	SpendingLimitTypeEnum_INFINITE SpendingLimitTypeEnum_SpendingLimitType = 2
+)
+
+var SpendingLimitTypeEnum_SpendingLimitType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INFINITE",
+}
+
+var SpendingLimitTypeEnum_SpendingLimitType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"INFINITE":    2,
+}
+
+func (x SpendingLimitTypeEnum_SpendingLimitType) String() string {
+	return proto.EnumName(SpendingLimitTypeEnum_SpendingLimitType_name, int32(x))
+}
+
+func (SpendingLimitTypeEnum_SpendingLimitType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_05de225243b8687a, []int{0, 0}
+}
+
+// Message describing spending limit types.
+type SpendingLimitTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SpendingLimitTypeEnum) Reset()         { *m = SpendingLimitTypeEnum{} }
+func (m *SpendingLimitTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*SpendingLimitTypeEnum) ProtoMessage()    {}
+func (*SpendingLimitTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_05de225243b8687a, []int{0}
+}
+
+func (m *SpendingLimitTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SpendingLimitTypeEnum.Unmarshal(m, b)
+}
+func (m *SpendingLimitTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SpendingLimitTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *SpendingLimitTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SpendingLimitTypeEnum.Merge(m, src)
+}
+func (m *SpendingLimitTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_SpendingLimitTypeEnum.Size(m)
+}
+func (m *SpendingLimitTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SpendingLimitTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SpendingLimitTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SpendingLimitTypeEnum_SpendingLimitType", SpendingLimitTypeEnum_SpendingLimitType_name, SpendingLimitTypeEnum_SpendingLimitType_value)
+	proto.RegisterType((*SpendingLimitTypeEnum)(nil), "google.ads.googleads.v3.enums.SpendingLimitTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/spending_limit_type.proto", fileDescriptor_05de225243b8687a)
+}
+
+var fileDescriptor_05de225243b8687a = []byte{
+	// 299 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xfb, 0x30,
+	0x00, 0xfe, 0xad, 0x3f, 0x50, 0xc9, 0x04, 0x67, 0x41, 0x0f, 0xe2, 0x0e, 0xdb, 0x03, 0x24, 0x87,
+	0x1c, 0x84, 0x78, 0x90, 0x4e, 0xbb, 0x51, 0x94, 0x38, 0xd8, 0x56, 0x45, 0x0a, 0xa3, 0x9a, 0x10,
+	0x02, 0x6d, 0x12, 0x96, 0x6e, 0xb0, 0xd7, 0xf1, 0xe8, 0xa3, 0xf8, 0x28, 0xfa, 0x12, 0xd2, 0x64,
+	0xed, 0x65, 0xe8, 0x25, 0x7c, 0xe4, 0xfb, 0x93, 0x2f, 0x1f, 0xb8, 0x12, 0x5a, 0x8b, 0x82, 0xa3,
+	0x9c, 0x59, 0xe4, 0x61, 0x8d, 0x36, 0x18, 0x71, 0xb5, 0x2e, 0x2d, 0xb2, 0x86, 0x2b, 0x26, 0x95,
+	0x58, 0x16, 0xb2, 0x94, 0xd5, 0xb2, 0xda, 0x1a, 0x0e, 0xcd, 0x4a, 0x57, 0x3a, 0xec, 0x7b, 0x35,
+	0xcc, 0x99, 0x85, 0xad, 0x11, 0x6e, 0x30, 0x74, 0xc6, 0x8b, 0xcb, 0x26, 0xd7, 0x48, 0x94, 0x2b,
+	0xa5, 0xab, 0xbc, 0x92, 0x5a, 0x59, 0x6f, 0x1e, 0x3e, 0x83, 0xb3, 0xd9, 0x2e, 0xf9, 0xa1, 0x0e,
+	0x9e, 0x6f, 0x0d, 0x8f, 0xd5, 0xba, 0x1c, 0xde, 0x80, 0xd3, 0x3d, 0x22, 0x3c, 0x01, 0xdd, 0x05,
+	0x9d, 0x4d, 0xe3, 0xdb, 0x64, 0x9c, 0xc4, 0x77, 0xbd, 0x7f, 0x61, 0x17, 0x1c, 0x2e, 0xe8, 0x3d,
+	0x7d, 0x7c, 0xa2, 0xbd, 0x4e, 0x78, 0x0c, 0x8e, 0x12, 0x3a, 0x4e, 0x68, 0x32, 0x8f, 0x7b, 0xc1,
+	0xe8, 0xbb, 0x03, 0x06, 0x6f, 0xba, 0x84, 0x7f, 0xb6, 0x1b, 0x9d, 0xef, 0x3d, 0x32, 0xad, 0x7b,
+	0x4d, 0x3b, 0x2f, 0xa3, 0x9d, 0x51, 0xe8, 0x22, 0x57, 0x02, 0xea, 0x95, 0x40, 0x82, 0x2b, 0xd7,
+	0xba, 0xd9, 0xc7, 0x48, 0xfb, 0xcb, 0x5c, 0xd7, 0xee, 0x7c, 0x0f, 0xfe, 0x4f, 0xa2, 0xe8, 0x23,
+	0xe8, 0x4f, 0x7c, 0x54, 0xc4, 0x2c, 0xf4, 0xb0, 0x46, 0x29, 0x86, 0xf5, 0x4f, 0xed, 0x67, 0xc3,
+	0x67, 0x11, 0xb3, 0x59, 0xcb, 0x67, 0x29, 0xce, 0x1c, 0xff, 0x15, 0x0c, 0xfc, 0x25, 0x21, 0x11,
+	0xb3, 0x84, 0xb4, 0x0a, 0x42, 0x52, 0x4c, 0x88, 0xd3, 0xbc, 0x1e, 0xb8, 0x62, 0xf8, 0x27, 0x00,
+	0x00, 0xff, 0xff, 0x78, 0x15, 0xb3, 0xa4, 0xc6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/structured_snippet_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/structured_snippet_placeholder_field.pb.go
new file mode 100644
index 0000000..d62185a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/structured_snippet_placeholder_field.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/structured_snippet_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Structured Snippet placeholder fields.
+type StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField int32
+
+const (
+	// Not specified.
+	StructuredSnippetPlaceholderFieldEnum_UNSPECIFIED StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	StructuredSnippetPlaceholderFieldEnum_UNKNOWN StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField = 1
+	// Data Type: STRING. The category of snippet of your products/services.
+	// Must match exactly one of the predefined structured snippets headers.
+	// For a list, visit
+	// https://developers.google.com/adwords/api/docs/appendix/structured-snippet-headers
+	StructuredSnippetPlaceholderFieldEnum_HEADER StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField = 2
+	// Data Type: STRING_LIST. Text values that describe your products/services.
+	// All text must be family safe. Special or non-ASCII characters are not
+	// permitted. A snippet can be at most 25 characters.
+	StructuredSnippetPlaceholderFieldEnum_SNIPPETS StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField = 3
+)
+
+var StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "HEADER",
+	3: "SNIPPETS",
+}
+
+var StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"HEADER":      2,
+	"SNIPPETS":    3,
+}
+
+func (x StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField) String() string {
+	return proto.EnumName(StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField_name, int32(x))
+}
+
+func (StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_96b948df16ee6043, []int{0, 0}
+}
+
+// Values for Structured Snippet placeholder fields.
+type StructuredSnippetPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StructuredSnippetPlaceholderFieldEnum) Reset()         { *m = StructuredSnippetPlaceholderFieldEnum{} }
+func (m *StructuredSnippetPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*StructuredSnippetPlaceholderFieldEnum) ProtoMessage()    {}
+func (*StructuredSnippetPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_96b948df16ee6043, []int{0}
+}
+
+func (m *StructuredSnippetPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StructuredSnippetPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *StructuredSnippetPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StructuredSnippetPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *StructuredSnippetPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StructuredSnippetPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *StructuredSnippetPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_StructuredSnippetPlaceholderFieldEnum.Size(m)
+}
+func (m *StructuredSnippetPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_StructuredSnippetPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StructuredSnippetPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField", StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField_name, StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField_value)
+	proto.RegisterType((*StructuredSnippetPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.StructuredSnippetPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/structured_snippet_placeholder_field.proto", fileDescriptor_96b948df16ee6043)
+}
+
+var fileDescriptor_96b948df16ee6043 = []byte{
+	// 327 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x50, 0xbd, 0x4e, 0xc3, 0x30,
+	0x18, 0x24, 0xa9, 0x54, 0x90, 0x8b, 0x44, 0x94, 0x11, 0xd1, 0xa1, 0x95, 0x60, 0x74, 0x86, 0x6c,
+	0x66, 0x4a, 0x69, 0xfa, 0x23, 0xa4, 0x10, 0x11, 0x5a, 0x24, 0x88, 0x54, 0x99, 0xda, 0x98, 0x48,
+	0xa9, 0x6d, 0xc5, 0x4e, 0x9f, 0x80, 0x27, 0x61, 0xe4, 0x51, 0x78, 0x14, 0x5e, 0x81, 0x05, 0xc5,
+	0xa6, 0x61, 0x82, 0x2e, 0xd6, 0xc9, 0xdf, 0x7d, 0x77, 0xdf, 0x1d, 0x98, 0x31, 0x21, 0x58, 0x49,
+	0x03, 0x4c, 0x54, 0x60, 0x61, 0x83, 0xb6, 0x61, 0x40, 0x79, 0xbd, 0x51, 0x81, 0xd2, 0x55, 0xbd,
+	0xd6, 0x75, 0x45, 0xc9, 0x4a, 0xf1, 0x42, 0x4a, 0xaa, 0x57, 0xb2, 0xc4, 0x6b, 0xfa, 0x22, 0x4a,
+	0x42, 0xab, 0xd5, 0x73, 0x41, 0x4b, 0x02, 0x65, 0x25, 0xb4, 0xf0, 0xfb, 0x76, 0x1d, 0x62, 0xa2,
+	0x60, 0xab, 0x04, 0xb7, 0x21, 0x34, 0x4a, 0xa7, 0x67, 0x3b, 0x23, 0x59, 0x04, 0x98, 0x73, 0xa1,
+	0xb1, 0x2e, 0x04, 0x57, 0x76, 0x79, 0xf8, 0xea, 0x80, 0xf3, 0xac, 0xf5, 0xca, 0xac, 0x55, 0xfa,
+	0xeb, 0x34, 0x69, 0x8c, 0x62, 0x5e, 0x6f, 0x86, 0x8f, 0x60, 0xb0, 0x97, 0xe8, 0x9f, 0x80, 0xde,
+	0x22, 0xc9, 0xd2, 0xf8, 0x6a, 0x3e, 0x99, 0xc7, 0x63, 0xef, 0xc0, 0xef, 0x81, 0xc3, 0x45, 0x72,
+	0x9d, 0xdc, 0xdc, 0x27, 0x9e, 0xe3, 0x03, 0xd0, 0x9d, 0xc5, 0xd1, 0x38, 0xbe, 0xf5, 0x5c, 0xff,
+	0x18, 0x1c, 0x65, 0xc9, 0x3c, 0x4d, 0xe3, 0xbb, 0xcc, 0xeb, 0x8c, 0xbe, 0x1c, 0x30, 0x58, 0x8b,
+	0x0d, 0xfc, 0x37, 0xca, 0xe8, 0x62, 0xef, 0x01, 0x69, 0x13, 0x2a, 0x75, 0x1e, 0x46, 0x3f, 0x42,
+	0x4c, 0x94, 0x98, 0x33, 0x28, 0x2a, 0x16, 0x30, 0xca, 0x4d, 0xe4, 0x5d, 0xdb, 0xb2, 0x50, 0x7f,
+	0x94, 0x7f, 0x69, 0xde, 0x37, 0xb7, 0x33, 0x8d, 0xa2, 0x77, 0xb7, 0x3f, 0xb5, 0x52, 0x11, 0x51,
+	0xd0, 0xc2, 0x06, 0x2d, 0x43, 0xd8, 0xb4, 0xa2, 0x3e, 0x76, 0xf3, 0x3c, 0x22, 0x2a, 0x6f, 0xe7,
+	0xf9, 0x32, 0xcc, 0xcd, 0xfc, 0xd3, 0x1d, 0xd8, 0x4f, 0x84, 0x22, 0xa2, 0x10, 0x6a, 0x19, 0x08,
+	0x2d, 0x43, 0x84, 0x0c, 0xe7, 0xa9, 0x6b, 0x0e, 0x0b, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xd6,
+	0x0d, 0x39, 0x40, 0x14, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/summary_row_setting.pb.go b/googleapis/ads/googleads/v3/enums/summary_row_setting.pb.go
new file mode 100644
index 0000000..a312914
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/summary_row_setting.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/summary_row_setting.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing return summary row settings.
+type SummaryRowSettingEnum_SummaryRowSetting int32
+
+const (
+	// Not specified.
+	SummaryRowSettingEnum_UNSPECIFIED SummaryRowSettingEnum_SummaryRowSetting = 0
+	// Represent unknown values of return summary row.
+	SummaryRowSettingEnum_UNKNOWN SummaryRowSettingEnum_SummaryRowSetting = 1
+	// Do not return summary row.
+	SummaryRowSettingEnum_NO_SUMMARY_ROW SummaryRowSettingEnum_SummaryRowSetting = 2
+	// Return summary row along with results. The summary row will be returned
+	// in the last batch alone (last batch will contain no results).
+	SummaryRowSettingEnum_SUMMARY_ROW_WITH_RESULTS SummaryRowSettingEnum_SummaryRowSetting = 3
+	// Return summary row only and return no results.
+	SummaryRowSettingEnum_SUMMARY_ROW_ONLY SummaryRowSettingEnum_SummaryRowSetting = 4
+)
+
+var SummaryRowSettingEnum_SummaryRowSetting_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "NO_SUMMARY_ROW",
+	3: "SUMMARY_ROW_WITH_RESULTS",
+	4: "SUMMARY_ROW_ONLY",
+}
+
+var SummaryRowSettingEnum_SummaryRowSetting_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"NO_SUMMARY_ROW":           2,
+	"SUMMARY_ROW_WITH_RESULTS": 3,
+	"SUMMARY_ROW_ONLY":         4,
+}
+
+func (x SummaryRowSettingEnum_SummaryRowSetting) String() string {
+	return proto.EnumName(SummaryRowSettingEnum_SummaryRowSetting_name, int32(x))
+}
+
+func (SummaryRowSettingEnum_SummaryRowSetting) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b824b08816a03176, []int{0, 0}
+}
+
+// Indicates summary row setting in request parameter.
+type SummaryRowSettingEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SummaryRowSettingEnum) Reset()         { *m = SummaryRowSettingEnum{} }
+func (m *SummaryRowSettingEnum) String() string { return proto.CompactTextString(m) }
+func (*SummaryRowSettingEnum) ProtoMessage()    {}
+func (*SummaryRowSettingEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b824b08816a03176, []int{0}
+}
+
+func (m *SummaryRowSettingEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SummaryRowSettingEnum.Unmarshal(m, b)
+}
+func (m *SummaryRowSettingEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SummaryRowSettingEnum.Marshal(b, m, deterministic)
+}
+func (m *SummaryRowSettingEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SummaryRowSettingEnum.Merge(m, src)
+}
+func (m *SummaryRowSettingEnum) XXX_Size() int {
+	return xxx_messageInfo_SummaryRowSettingEnum.Size(m)
+}
+func (m *SummaryRowSettingEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SummaryRowSettingEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SummaryRowSettingEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SummaryRowSettingEnum_SummaryRowSetting", SummaryRowSettingEnum_SummaryRowSetting_name, SummaryRowSettingEnum_SummaryRowSetting_value)
+	proto.RegisterType((*SummaryRowSettingEnum)(nil), "google.ads.googleads.v3.enums.SummaryRowSettingEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/summary_row_setting.proto", fileDescriptor_b824b08816a03176)
+}
+
+var fileDescriptor_b824b08816a03176 = []byte{
+	// 335 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x5f, 0x4a, 0xc3, 0x30,
+	0x1c, 0xb6, 0x9d, 0x28, 0x64, 0xa0, 0x35, 0xa8, 0x88, 0x6c, 0x0f, 0xdb, 0x01, 0xd2, 0x87, 0x3e,
+	0x08, 0xf1, 0xa9, 0xd3, 0x3a, 0x87, 0x5b, 0x3b, 0xda, 0x75, 0x63, 0x52, 0x28, 0xd1, 0x96, 0x50,
+	0x58, 0x93, 0xd1, 0x74, 0x1b, 0xbb, 0x86, 0x47, 0xf0, 0xd1, 0xa3, 0x78, 0x14, 0xbd, 0x84, 0x34,
+	0x71, 0x63, 0x30, 0xf4, 0x25, 0x7c, 0xe4, 0xfb, 0xc3, 0xef, 0xfb, 0xc0, 0x0d, 0xe5, 0x9c, 0xce,
+	0x52, 0x93, 0x24, 0xc2, 0x54, 0xb0, 0x42, 0x4b, 0xcb, 0x4c, 0xd9, 0x22, 0x17, 0xa6, 0x58, 0xe4,
+	0x39, 0x29, 0xd6, 0x71, 0xc1, 0x57, 0xb1, 0x48, 0xcb, 0x32, 0x63, 0x14, 0xcd, 0x0b, 0x5e, 0x72,
+	0xd8, 0x54, 0x6a, 0x44, 0x12, 0x81, 0xb6, 0x46, 0xb4, 0xb4, 0x90, 0x34, 0x5e, 0x37, 0x36, 0xb9,
+	0xf3, 0xcc, 0x24, 0x8c, 0xf1, 0x92, 0x94, 0x19, 0x67, 0x42, 0x99, 0xdb, 0x6f, 0x1a, 0xb8, 0x08,
+	0x54, 0xb4, 0xcf, 0x57, 0x81, 0x0a, 0x76, 0xd8, 0x22, 0x6f, 0xaf, 0xc1, 0xd9, 0x1e, 0x01, 0x4f,
+	0x41, 0x3d, 0x74, 0x83, 0xa1, 0x73, 0xd7, 0x7b, 0xe8, 0x39, 0xf7, 0xc6, 0x01, 0xac, 0x83, 0xe3,
+	0xd0, 0x7d, 0x72, 0xbd, 0x89, 0x6b, 0x68, 0x10, 0x82, 0x13, 0xd7, 0x8b, 0x83, 0x70, 0x30, 0xb0,
+	0xfd, 0x69, 0xec, 0x7b, 0x13, 0x43, 0x87, 0x0d, 0x70, 0xb5, 0xf3, 0x11, 0x4f, 0x7a, 0xa3, 0xc7,
+	0xd8, 0x77, 0x82, 0xb0, 0x3f, 0x0a, 0x8c, 0x1a, 0x3c, 0x07, 0xc6, 0x2e, 0xeb, 0xb9, 0xfd, 0xa9,
+	0x71, 0xd8, 0xf9, 0xd6, 0x40, 0xeb, 0x95, 0xe7, 0xe8, 0xdf, 0x62, 0x9d, 0xcb, 0xbd, 0xf3, 0x86,
+	0x55, 0xa5, 0xa1, 0xf6, 0xdc, 0xf9, 0x35, 0x52, 0x3e, 0x23, 0x8c, 0x22, 0x5e, 0x50, 0x93, 0xa6,
+	0x4c, 0x16, 0xde, 0x4c, 0x3b, 0xcf, 0xc4, 0x1f, 0x4b, 0xdf, 0xca, 0xf7, 0x5d, 0xaf, 0x75, 0x6d,
+	0xfb, 0x43, 0x6f, 0x76, 0x55, 0x94, 0x9d, 0x08, 0xa4, 0x60, 0x85, 0xc6, 0x16, 0xaa, 0x36, 0x12,
+	0x9f, 0x1b, 0x3e, 0xb2, 0x13, 0x11, 0x6d, 0xf9, 0x68, 0x6c, 0x45, 0x92, 0xff, 0xd2, 0x5b, 0xea,
+	0x13, 0x63, 0x3b, 0x11, 0x18, 0x6f, 0x15, 0x18, 0x8f, 0x2d, 0x8c, 0xa5, 0xe6, 0xe5, 0x48, 0x1e,
+	0x66, 0xfd, 0x04, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x4d, 0xab, 0x2a, 0x01, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/system_managed_entity_source.pb.go b/googleapis/ads/googleads/v3/enums/system_managed_entity_source.pb.go
new file mode 100644
index 0000000..4f92d38
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/system_managed_entity_source.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/system_managed_entity_source.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum listing the possible system managed entity sources.
+type SystemManagedResourceSourceEnum_SystemManagedResourceSource int32
+
+const (
+	// Not specified.
+	SystemManagedResourceSourceEnum_UNSPECIFIED SystemManagedResourceSourceEnum_SystemManagedResourceSource = 0
+	// Used for return value only. Represents value unknown in this version.
+	SystemManagedResourceSourceEnum_UNKNOWN SystemManagedResourceSourceEnum_SystemManagedResourceSource = 1
+	// Generated ad variations experiment ad.
+	SystemManagedResourceSourceEnum_AD_VARIATIONS SystemManagedResourceSourceEnum_SystemManagedResourceSource = 2
+)
+
+var SystemManagedResourceSourceEnum_SystemManagedResourceSource_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AD_VARIATIONS",
+}
+
+var SystemManagedResourceSourceEnum_SystemManagedResourceSource_value = map[string]int32{
+	"UNSPECIFIED":   0,
+	"UNKNOWN":       1,
+	"AD_VARIATIONS": 2,
+}
+
+func (x SystemManagedResourceSourceEnum_SystemManagedResourceSource) String() string {
+	return proto.EnumName(SystemManagedResourceSourceEnum_SystemManagedResourceSource_name, int32(x))
+}
+
+func (SystemManagedResourceSourceEnum_SystemManagedResourceSource) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a5fe06dec8282bd9, []int{0, 0}
+}
+
+// Container for enum describing possible system managed entity sources.
+type SystemManagedResourceSourceEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SystemManagedResourceSourceEnum) Reset()         { *m = SystemManagedResourceSourceEnum{} }
+func (m *SystemManagedResourceSourceEnum) String() string { return proto.CompactTextString(m) }
+func (*SystemManagedResourceSourceEnum) ProtoMessage()    {}
+func (*SystemManagedResourceSourceEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a5fe06dec8282bd9, []int{0}
+}
+
+func (m *SystemManagedResourceSourceEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SystemManagedResourceSourceEnum.Unmarshal(m, b)
+}
+func (m *SystemManagedResourceSourceEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SystemManagedResourceSourceEnum.Marshal(b, m, deterministic)
+}
+func (m *SystemManagedResourceSourceEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SystemManagedResourceSourceEnum.Merge(m, src)
+}
+func (m *SystemManagedResourceSourceEnum) XXX_Size() int {
+	return xxx_messageInfo_SystemManagedResourceSourceEnum.Size(m)
+}
+func (m *SystemManagedResourceSourceEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SystemManagedResourceSourceEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SystemManagedResourceSourceEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.SystemManagedResourceSourceEnum_SystemManagedResourceSource", SystemManagedResourceSourceEnum_SystemManagedResourceSource_name, SystemManagedResourceSourceEnum_SystemManagedResourceSource_value)
+	proto.RegisterType((*SystemManagedResourceSourceEnum)(nil), "google.ads.googleads.v3.enums.SystemManagedResourceSourceEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/system_managed_entity_source.proto", fileDescriptor_a5fe06dec8282bd9)
+}
+
+var fileDescriptor_a5fe06dec8282bd9 = []byte{
+	// 317 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xd1, 0x4a, 0xc3, 0x30,
+	0x14, 0x75, 0x15, 0x14, 0x32, 0xc4, 0xd9, 0x47, 0x75, 0xca, 0xf6, 0x01, 0xe9, 0x43, 0xdf, 0xe2,
+	0x8b, 0x99, 0xab, 0xa3, 0x88, 0xdd, 0x58, 0x5d, 0x05, 0x29, 0x94, 0xb8, 0x84, 0x50, 0x58, 0x93,
+	0xb9, 0x9b, 0x0d, 0xf6, 0x3b, 0x3e, 0xfa, 0x29, 0x7e, 0x8a, 0xaf, 0xfe, 0x80, 0x34, 0x71, 0x05,
+	0x1f, 0xdc, 0x4b, 0x38, 0xe4, 0x9e, 0x7b, 0xce, 0xb9, 0x07, 0xdd, 0x4a, 0xad, 0xe5, 0x42, 0x04,
+	0x8c, 0x43, 0xe0, 0x60, 0x8d, 0x36, 0x61, 0x20, 0xd4, 0xba, 0x82, 0x00, 0xb6, 0x60, 0x44, 0x55,
+	0x54, 0x4c, 0x31, 0x29, 0x78, 0x21, 0x94, 0x29, 0xcd, 0xb6, 0x00, 0xbd, 0x5e, 0xcd, 0x05, 0x5e,
+	0xae, 0xb4, 0xd1, 0x7e, 0xd7, 0xad, 0x61, 0xc6, 0x01, 0x37, 0x0a, 0x78, 0x13, 0x62, 0xab, 0x70,
+	0x7e, 0xb9, 0x33, 0x58, 0x96, 0x01, 0x53, 0x4a, 0x1b, 0x66, 0x4a, 0xad, 0xc0, 0x2d, 0xf7, 0xdf,
+	0xd0, 0x75, 0x6a, 0x2d, 0x1e, 0x9d, 0xc3, 0x54, 0x38, 0xed, 0xd4, 0xbe, 0x91, 0x5a, 0x57, 0xfd,
+	0x04, 0x5d, 0xec, 0xa1, 0xf8, 0xa7, 0xa8, 0x3d, 0x4b, 0xd2, 0x49, 0x74, 0x17, 0xdf, 0xc7, 0xd1,
+	0xb0, 0x73, 0xe0, 0xb7, 0xd1, 0xf1, 0x2c, 0x79, 0x48, 0xc6, 0xcf, 0x49, 0xa7, 0xe5, 0x9f, 0xa1,
+	0x13, 0x3a, 0x2c, 0x32, 0x3a, 0x8d, 0xe9, 0x53, 0x3c, 0x4e, 0xd2, 0x8e, 0x37, 0xf8, 0x6e, 0xa1,
+	0xde, 0x5c, 0x57, 0x78, 0x6f, 0xec, 0xc1, 0xd5, 0x1f, 0xcf, 0xc8, 0xde, 0xed, 0x1c, 0x27, 0x75,
+	0xf0, 0x49, 0xeb, 0x65, 0xf0, 0x2b, 0x20, 0xf5, 0x82, 0x29, 0x89, 0xf5, 0x4a, 0x06, 0x52, 0x28,
+	0x7b, 0xd6, 0xae, 0xc9, 0x65, 0x09, 0xff, 0x14, 0x7b, 0x63, 0xdf, 0x77, 0xef, 0x70, 0x44, 0xe9,
+	0x87, 0xd7, 0x1d, 0x39, 0x29, 0xca, 0x01, 0x3b, 0x58, 0xa3, 0x2c, 0xc4, 0x75, 0x01, 0xf0, 0xb9,
+	0x9b, 0xe7, 0x94, 0x43, 0xde, 0xcc, 0xf3, 0x2c, 0xcc, 0xed, 0xfc, 0xcb, 0xeb, 0xb9, 0x4f, 0x42,
+	0x28, 0x07, 0x42, 0x1a, 0x06, 0x21, 0x59, 0x48, 0x88, 0xe5, 0xbc, 0x1e, 0xd9, 0x60, 0xe1, 0x4f,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x46, 0x13, 0x02, 0xf0, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/target_cpa_opt_in_recommendation_goal.pb.go b/googleapis/ads/googleads/v3/enums/target_cpa_opt_in_recommendation_goal.pb.go
new file mode 100644
index 0000000..17bcecb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/target_cpa_opt_in_recommendation_goal.pb.go
@@ -0,0 +1,136 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/target_cpa_opt_in_recommendation_goal.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Goal of TargetCpaOptIn recommendation.
+type TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal int32
+
+const (
+	// Not specified.
+	TargetCpaOptInRecommendationGoalEnum_UNSPECIFIED TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 0
+	// Used for return value only. Represents value unknown in this version.
+	TargetCpaOptInRecommendationGoalEnum_UNKNOWN TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 1
+	// Recommendation to set Target CPA to maintain the same cost.
+	TargetCpaOptInRecommendationGoalEnum_SAME_COST TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 2
+	// Recommendation to set Target CPA to maintain the same conversions.
+	TargetCpaOptInRecommendationGoalEnum_SAME_CONVERSIONS TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 3
+	// Recommendation to set Target CPA to maintain the same CPA.
+	TargetCpaOptInRecommendationGoalEnum_SAME_CPA TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 4
+	// Recommendation to set Target CPA to a value that is as close as possible
+	// to, yet lower than, the actual CPA (computed for past 28 days).
+	TargetCpaOptInRecommendationGoalEnum_CLOSEST_CPA TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 5
+)
+
+var TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "SAME_COST",
+	3: "SAME_CONVERSIONS",
+	4: "SAME_CPA",
+	5: "CLOSEST_CPA",
+}
+
+var TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_value = map[string]int32{
+	"UNSPECIFIED":      0,
+	"UNKNOWN":          1,
+	"SAME_COST":        2,
+	"SAME_CONVERSIONS": 3,
+	"SAME_CPA":         4,
+	"CLOSEST_CPA":      5,
+}
+
+func (x TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal) String() string {
+	return proto.EnumName(TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_name, int32(x))
+}
+
+func (TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b31eca895470b68a, []int{0, 0}
+}
+
+// Container for enum describing goals for TargetCpaOptIn recommendation.
+type TargetCpaOptInRecommendationGoalEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TargetCpaOptInRecommendationGoalEnum) Reset()         { *m = TargetCpaOptInRecommendationGoalEnum{} }
+func (m *TargetCpaOptInRecommendationGoalEnum) String() string { return proto.CompactTextString(m) }
+func (*TargetCpaOptInRecommendationGoalEnum) ProtoMessage()    {}
+func (*TargetCpaOptInRecommendationGoalEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b31eca895470b68a, []int{0}
+}
+
+func (m *TargetCpaOptInRecommendationGoalEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetCpaOptInRecommendationGoalEnum.Unmarshal(m, b)
+}
+func (m *TargetCpaOptInRecommendationGoalEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetCpaOptInRecommendationGoalEnum.Marshal(b, m, deterministic)
+}
+func (m *TargetCpaOptInRecommendationGoalEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetCpaOptInRecommendationGoalEnum.Merge(m, src)
+}
+func (m *TargetCpaOptInRecommendationGoalEnum) XXX_Size() int {
+	return xxx_messageInfo_TargetCpaOptInRecommendationGoalEnum.Size(m)
+}
+func (m *TargetCpaOptInRecommendationGoalEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetCpaOptInRecommendationGoalEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetCpaOptInRecommendationGoalEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal", TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_name, TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_value)
+	proto.RegisterType((*TargetCpaOptInRecommendationGoalEnum)(nil), "google.ads.googleads.v3.enums.TargetCpaOptInRecommendationGoalEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/target_cpa_opt_in_recommendation_goal.proto", fileDescriptor_b31eca895470b68a)
+}
+
+var fileDescriptor_b31eca895470b68a = []byte{
+	// 358 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xcb, 0x4a, 0xeb, 0x40,
+	0x18, 0xc7, 0x4f, 0xd2, 0x73, 0x8e, 0x3a, 0x55, 0x0c, 0xc1, 0x95, 0x58, 0xb0, 0x45, 0xb7, 0x93,
+	0x45, 0x76, 0xe3, 0x2a, 0x8d, 0xb1, 0x04, 0x35, 0x09, 0x4d, 0x1b, 0x41, 0x02, 0x61, 0x6c, 0xc2,
+	0x10, 0x48, 0x66, 0x42, 0x66, 0xda, 0x27, 0xf0, 0x49, 0x5c, 0x0a, 0xbe, 0x88, 0x8f, 0xe2, 0x23,
+	0xb8, 0x92, 0xcc, 0xb4, 0x05, 0x17, 0xda, 0xcd, 0xf0, 0x9f, 0xef, 0xf2, 0xfb, 0x6e, 0xc0, 0x27,
+	0x8c, 0x91, 0xaa, 0xb0, 0x70, 0xce, 0x2d, 0x25, 0x3b, 0xb5, 0xb2, 0xad, 0x82, 0x2e, 0x6b, 0x6e,
+	0x09, 0xdc, 0x92, 0x42, 0x64, 0x8b, 0x06, 0x67, 0xac, 0x11, 0x59, 0x49, 0xb3, 0xb6, 0x58, 0xb0,
+	0xba, 0x2e, 0x68, 0x8e, 0x45, 0xc9, 0x68, 0x46, 0x18, 0xae, 0x60, 0xd3, 0x32, 0xc1, 0xcc, 0x81,
+	0xca, 0x87, 0x38, 0xe7, 0x70, 0x8b, 0x82, 0x2b, 0x1b, 0x4a, 0xd4, 0xe9, 0xd9, 0xa6, 0x52, 0x53,
+	0x5a, 0x98, 0x52, 0x26, 0x24, 0x80, 0xab, 0xe4, 0xd1, 0x9b, 0x06, 0x2e, 0x66, 0xb2, 0x98, 0xdb,
+	0xe0, 0xb0, 0x11, 0x3e, 0x9d, 0x7e, 0x2b, 0x34, 0x61, 0xb8, 0xf2, 0xe8, 0xb2, 0x1e, 0x3d, 0x6b,
+	0xe0, 0x7c, 0x57, 0xa0, 0x79, 0x0c, 0xfa, 0xf3, 0x20, 0x8e, 0x3c, 0xd7, 0xbf, 0xf1, 0xbd, 0x6b,
+	0xe3, 0x8f, 0xd9, 0x07, 0x7b, 0xf3, 0xe0, 0x36, 0x08, 0x1f, 0x02, 0x43, 0x33, 0x8f, 0xc0, 0x41,
+	0xec, 0xdc, 0x7b, 0x99, 0x1b, 0xc6, 0x33, 0x43, 0x37, 0x4f, 0x80, 0xb1, 0xfe, 0x06, 0x89, 0x37,
+	0x8d, 0xfd, 0x30, 0x88, 0x8d, 0x9e, 0x79, 0x08, 0xf6, 0x95, 0x35, 0x72, 0x8c, 0xbf, 0x1d, 0xd0,
+	0xbd, 0x0b, 0x63, 0x2f, 0x9e, 0x49, 0xc3, 0xbf, 0xf1, 0xa7, 0x06, 0x86, 0x0b, 0x56, 0xc3, 0x5f,
+	0x67, 0x1e, 0x5f, 0xee, 0xea, 0x34, 0xea, 0x86, 0x8f, 0xb4, 0xc7, 0xf1, 0x9a, 0x43, 0x58, 0x85,
+	0x29, 0x81, 0xac, 0x25, 0x16, 0x29, 0xa8, 0x5c, 0xcd, 0xe6, 0x2c, 0x4d, 0xc9, 0x7f, 0xb8, 0xd2,
+	0x95, 0x7c, 0x5f, 0xf4, 0xde, 0xc4, 0x71, 0x5e, 0xf5, 0xc1, 0x44, 0xa1, 0x9c, 0x9c, 0x43, 0x25,
+	0x3b, 0x95, 0xd8, 0xb0, 0x5b, 0x1f, 0x7f, 0xdf, 0xf8, 0x53, 0x27, 0xe7, 0xe9, 0xd6, 0x9f, 0x26,
+	0x76, 0x2a, 0xfd, 0x1f, 0xfa, 0x50, 0x19, 0x11, 0x72, 0x72, 0x8e, 0xd0, 0x36, 0x02, 0xa1, 0xc4,
+	0x46, 0x48, 0xc6, 0x3c, 0xfd, 0x97, 0x8d, 0xd9, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdf, 0x49,
+	0x6a, 0x72, 0x3d, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/target_impression_share_location.pb.go b/googleapis/ads/googleads/v3/enums/target_impression_share_location.pb.go
new file mode 100644
index 0000000..7da6cc4
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/target_impression_share_location.pb.go
@@ -0,0 +1,132 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/target_impression_share_location.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible goals.
+type TargetImpressionShareLocationEnum_TargetImpressionShareLocation int32
+
+const (
+	// Not specified.
+	TargetImpressionShareLocationEnum_UNSPECIFIED TargetImpressionShareLocationEnum_TargetImpressionShareLocation = 0
+	// Used for return value only. Represents value unknown in this version.
+	TargetImpressionShareLocationEnum_UNKNOWN TargetImpressionShareLocationEnum_TargetImpressionShareLocation = 1
+	// Any location on the web page.
+	TargetImpressionShareLocationEnum_ANYWHERE_ON_PAGE TargetImpressionShareLocationEnum_TargetImpressionShareLocation = 2
+	// Top box of ads.
+	TargetImpressionShareLocationEnum_TOP_OF_PAGE TargetImpressionShareLocationEnum_TargetImpressionShareLocation = 3
+	// Top slot in the top box of ads.
+	TargetImpressionShareLocationEnum_ABSOLUTE_TOP_OF_PAGE TargetImpressionShareLocationEnum_TargetImpressionShareLocation = 4
+)
+
+var TargetImpressionShareLocationEnum_TargetImpressionShareLocation_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ANYWHERE_ON_PAGE",
+	3: "TOP_OF_PAGE",
+	4: "ABSOLUTE_TOP_OF_PAGE",
+}
+
+var TargetImpressionShareLocationEnum_TargetImpressionShareLocation_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"ANYWHERE_ON_PAGE":     2,
+	"TOP_OF_PAGE":          3,
+	"ABSOLUTE_TOP_OF_PAGE": 4,
+}
+
+func (x TargetImpressionShareLocationEnum_TargetImpressionShareLocation) String() string {
+	return proto.EnumName(TargetImpressionShareLocationEnum_TargetImpressionShareLocation_name, int32(x))
+}
+
+func (TargetImpressionShareLocationEnum_TargetImpressionShareLocation) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_de25f6d6d05843a7, []int{0, 0}
+}
+
+// Container for enum describing where on the first search results page the
+// automated bidding system should target impressions for the
+// TargetImpressionShare bidding strategy.
+type TargetImpressionShareLocationEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TargetImpressionShareLocationEnum) Reset()         { *m = TargetImpressionShareLocationEnum{} }
+func (m *TargetImpressionShareLocationEnum) String() string { return proto.CompactTextString(m) }
+func (*TargetImpressionShareLocationEnum) ProtoMessage()    {}
+func (*TargetImpressionShareLocationEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_de25f6d6d05843a7, []int{0}
+}
+
+func (m *TargetImpressionShareLocationEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetImpressionShareLocationEnum.Unmarshal(m, b)
+}
+func (m *TargetImpressionShareLocationEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetImpressionShareLocationEnum.Marshal(b, m, deterministic)
+}
+func (m *TargetImpressionShareLocationEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetImpressionShareLocationEnum.Merge(m, src)
+}
+func (m *TargetImpressionShareLocationEnum) XXX_Size() int {
+	return xxx_messageInfo_TargetImpressionShareLocationEnum.Size(m)
+}
+func (m *TargetImpressionShareLocationEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetImpressionShareLocationEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetImpressionShareLocationEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.TargetImpressionShareLocationEnum_TargetImpressionShareLocation", TargetImpressionShareLocationEnum_TargetImpressionShareLocation_name, TargetImpressionShareLocationEnum_TargetImpressionShareLocation_value)
+	proto.RegisterType((*TargetImpressionShareLocationEnum)(nil), "google.ads.googleads.v3.enums.TargetImpressionShareLocationEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/target_impression_share_location.proto", fileDescriptor_de25f6d6d05843a7)
+}
+
+var fileDescriptor_de25f6d6d05843a7 = []byte{
+	// 342 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xbb, 0x4e, 0xf3, 0x30,
+	0x18, 0xfd, 0x93, 0xfe, 0x02, 0xc9, 0x1d, 0x88, 0xa2, 0x0e, 0x08, 0xd1, 0xa1, 0x7d, 0x00, 0x67,
+	0xc8, 0x66, 0x26, 0x87, 0xba, 0xa5, 0xa2, 0x4a, 0x22, 0x7a, 0x13, 0x28, 0x92, 0x65, 0x9a, 0xc8,
+	0x44, 0x6a, 0xec, 0x28, 0x4e, 0x3b, 0xf2, 0x30, 0xb0, 0xf1, 0x28, 0x3c, 0x0a, 0x2f, 0xc0, 0x8a,
+	0x62, 0xb7, 0x11, 0x0b, 0x5d, 0xac, 0x23, 0x9f, 0xef, 0x9c, 0xf3, 0x5d, 0xc0, 0x88, 0x4b, 0xc9,
+	0xb7, 0x99, 0xc7, 0x52, 0xe5, 0x19, 0xd8, 0xa0, 0xbd, 0xef, 0x65, 0x62, 0x57, 0x28, 0xaf, 0x66,
+	0x15, 0xcf, 0x6a, 0x9a, 0x17, 0x65, 0x95, 0x29, 0x95, 0x4b, 0x41, 0xd5, 0x0b, 0xab, 0x32, 0xba,
+	0x95, 0x1b, 0x56, 0xe7, 0x52, 0xc0, 0xb2, 0x92, 0xb5, 0x74, 0xfb, 0x46, 0x0a, 0x59, 0xaa, 0x60,
+	0xeb, 0x02, 0xf7, 0x3e, 0xd4, 0x2e, 0x57, 0xd7, 0xc7, 0x90, 0x32, 0xf7, 0x98, 0x10, 0xb2, 0xd6,
+	0x5a, 0x65, 0xc4, 0xc3, 0x77, 0x0b, 0x0c, 0x16, 0x3a, 0x67, 0xda, 0xc6, 0xcc, 0x9b, 0x94, 0xd9,
+	0x21, 0x84, 0x88, 0x5d, 0x31, 0x7c, 0x05, 0xfd, 0x93, 0x45, 0xee, 0x05, 0xe8, 0x2e, 0xc3, 0x79,
+	0x4c, 0x6e, 0xa7, 0xe3, 0x29, 0x19, 0x39, 0xff, 0xdc, 0x2e, 0x38, 0x5f, 0x86, 0xf7, 0x61, 0xb4,
+	0x0e, 0x1d, 0xcb, 0xed, 0x01, 0x07, 0x87, 0x8f, 0xeb, 0x3b, 0xf2, 0x40, 0x68, 0x14, 0xd2, 0x18,
+	0x4f, 0x88, 0x63, 0x37, 0x9a, 0x45, 0x14, 0xd3, 0x68, 0x6c, 0x3e, 0x3a, 0xee, 0x25, 0xe8, 0xe1,
+	0x60, 0x1e, 0xcd, 0x96, 0x0b, 0x42, 0x7f, 0x33, 0xff, 0x83, 0x6f, 0x0b, 0x0c, 0x36, 0xb2, 0x80,
+	0x27, 0x27, 0x0d, 0x86, 0x27, 0x7b, 0x8c, 0x9b, 0x79, 0x63, 0xeb, 0x29, 0x38, 0x98, 0x70, 0xb9,
+	0x65, 0x82, 0x43, 0x59, 0x71, 0x8f, 0x67, 0x42, 0x6f, 0xe3, 0x78, 0x84, 0x32, 0x57, 0x7f, 0xdc,
+	0xe4, 0x46, 0xbf, 0x6f, 0x76, 0x67, 0x82, 0xf1, 0x87, 0xdd, 0x9f, 0x18, 0x2b, 0x9c, 0x2a, 0x68,
+	0x60, 0x83, 0x56, 0x3e, 0x6c, 0x96, 0xa6, 0x3e, 0x8f, 0x7c, 0x82, 0x53, 0x95, 0xb4, 0x7c, 0xb2,
+	0xf2, 0x13, 0xcd, 0x7f, 0xd9, 0x03, 0xf3, 0x89, 0x10, 0x4e, 0x15, 0x42, 0x6d, 0x05, 0x42, 0x2b,
+	0x1f, 0x21, 0x5d, 0xf3, 0x7c, 0xa6, 0x1b, 0xf3, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5a, 0x23,
+	0x39, 0x09, 0x2b, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/targeting_dimension.pb.go b/googleapis/ads/googleads/v3/enums/targeting_dimension.pb.go
new file mode 100644
index 0000000..21a925b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/targeting_dimension.pb.go
@@ -0,0 +1,158 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/targeting_dimension.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible targeting dimensions.
+type TargetingDimensionEnum_TargetingDimension int32
+
+const (
+	// Not specified.
+	TargetingDimensionEnum_UNSPECIFIED TargetingDimensionEnum_TargetingDimension = 0
+	// Used for return value only. Represents value unknown in this version.
+	TargetingDimensionEnum_UNKNOWN TargetingDimensionEnum_TargetingDimension = 1
+	// Keyword criteria, e.g. 'mars cruise'. KEYWORD may be used as a custom bid
+	// dimension. Keywords are always a targeting dimension, so may not be set
+	// as a target "ALL" dimension with TargetRestriction.
+	TargetingDimensionEnum_KEYWORD TargetingDimensionEnum_TargetingDimension = 2
+	// Audience criteria, which include user list, user interest, custom
+	// affinity,  and custom in market.
+	TargetingDimensionEnum_AUDIENCE TargetingDimensionEnum_TargetingDimension = 3
+	// Topic criteria for targeting categories of content, e.g.
+	// 'category::Animals>Pets' Used for Display and Video targeting.
+	TargetingDimensionEnum_TOPIC TargetingDimensionEnum_TargetingDimension = 4
+	// Criteria for targeting gender.
+	TargetingDimensionEnum_GENDER TargetingDimensionEnum_TargetingDimension = 5
+	// Criteria for targeting age ranges.
+	TargetingDimensionEnum_AGE_RANGE TargetingDimensionEnum_TargetingDimension = 6
+	// Placement criteria, which include websites like 'www.flowers4sale.com',
+	// as well as mobile applications, mobile app categories, YouTube videos,
+	// and YouTube channels.
+	TargetingDimensionEnum_PLACEMENT TargetingDimensionEnum_TargetingDimension = 7
+	// Criteria for parental status targeting.
+	TargetingDimensionEnum_PARENTAL_STATUS TargetingDimensionEnum_TargetingDimension = 8
+	// Criteria for income range targeting.
+	TargetingDimensionEnum_INCOME_RANGE TargetingDimensionEnum_TargetingDimension = 9
+)
+
+var TargetingDimensionEnum_TargetingDimension_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "KEYWORD",
+	3: "AUDIENCE",
+	4: "TOPIC",
+	5: "GENDER",
+	6: "AGE_RANGE",
+	7: "PLACEMENT",
+	8: "PARENTAL_STATUS",
+	9: "INCOME_RANGE",
+}
+
+var TargetingDimensionEnum_TargetingDimension_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"KEYWORD":         2,
+	"AUDIENCE":        3,
+	"TOPIC":           4,
+	"GENDER":          5,
+	"AGE_RANGE":       6,
+	"PLACEMENT":       7,
+	"PARENTAL_STATUS": 8,
+	"INCOME_RANGE":    9,
+}
+
+func (x TargetingDimensionEnum_TargetingDimension) String() string {
+	return proto.EnumName(TargetingDimensionEnum_TargetingDimension_name, int32(x))
+}
+
+func (TargetingDimensionEnum_TargetingDimension) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e42413d270777352, []int{0, 0}
+}
+
+// The dimensions that can be targeted.
+type TargetingDimensionEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TargetingDimensionEnum) Reset()         { *m = TargetingDimensionEnum{} }
+func (m *TargetingDimensionEnum) String() string { return proto.CompactTextString(m) }
+func (*TargetingDimensionEnum) ProtoMessage()    {}
+func (*TargetingDimensionEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e42413d270777352, []int{0}
+}
+
+func (m *TargetingDimensionEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TargetingDimensionEnum.Unmarshal(m, b)
+}
+func (m *TargetingDimensionEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TargetingDimensionEnum.Marshal(b, m, deterministic)
+}
+func (m *TargetingDimensionEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TargetingDimensionEnum.Merge(m, src)
+}
+func (m *TargetingDimensionEnum) XXX_Size() int {
+	return xxx_messageInfo_TargetingDimensionEnum.Size(m)
+}
+func (m *TargetingDimensionEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_TargetingDimensionEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TargetingDimensionEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.TargetingDimensionEnum_TargetingDimension", TargetingDimensionEnum_TargetingDimension_name, TargetingDimensionEnum_TargetingDimension_value)
+	proto.RegisterType((*TargetingDimensionEnum)(nil), "google.ads.googleads.v3.enums.TargetingDimensionEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/targeting_dimension.proto", fileDescriptor_e42413d270777352)
+}
+
+var fileDescriptor_e42413d270777352 = []byte{
+	// 377 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0x4f, 0xcb, 0xd3, 0x30,
+	0x1c, 0xb6, 0x7d, 0x7d, 0xf7, 0x6e, 0xd9, 0x64, 0x21, 0x82, 0x82, 0xb8, 0xc3, 0xf6, 0x01, 0xd2,
+	0x43, 0x0f, 0x42, 0x3c, 0x65, 0x6d, 0x2c, 0x65, 0x5b, 0x5a, 0xba, 0x76, 0x43, 0x29, 0x8c, 0x6a,
+	0x4b, 0x28, 0xac, 0xc9, 0x58, 0xba, 0x7d, 0x20, 0x6f, 0xfa, 0x39, 0x3c, 0xf9, 0x51, 0xc4, 0x0f,
+	0x21, 0x6d, 0xed, 0x2e, 0x43, 0x2f, 0xe1, 0xf9, 0xe5, 0xf9, 0x43, 0xf2, 0xfc, 0xc0, 0x3b, 0xa1,
+	0x94, 0x38, 0x16, 0x56, 0x96, 0x6b, 0xab, 0x83, 0x0d, 0xba, 0xda, 0x56, 0x21, 0x2f, 0x95, 0xb6,
+	0xea, 0xec, 0x2c, 0x8a, 0xba, 0x94, 0xe2, 0x90, 0x97, 0x55, 0x21, 0x75, 0xa9, 0x24, 0x3e, 0x9d,
+	0x55, 0xad, 0xd0, 0xac, 0x53, 0xe3, 0x2c, 0xd7, 0xf8, 0x66, 0xc4, 0x57, 0x1b, 0xb7, 0xc6, 0x37,
+	0x6f, 0xfb, 0xdc, 0x53, 0x69, 0x65, 0x52, 0xaa, 0x3a, 0xab, 0x4b, 0x25, 0x75, 0x67, 0x5e, 0xfc,
+	0x30, 0xc0, 0xab, 0xb8, 0x8f, 0x76, 0xfb, 0x64, 0x26, 0x2f, 0xd5, 0xe2, 0x9b, 0x01, 0xd0, 0x3d,
+	0x85, 0xa6, 0x60, 0x9c, 0xf0, 0x6d, 0xc8, 0x1c, 0xff, 0x83, 0xcf, 0x5c, 0xf8, 0x0c, 0x8d, 0xc1,
+	0x53, 0xc2, 0x57, 0x3c, 0xd8, 0x73, 0x68, 0x34, 0xc3, 0x8a, 0x7d, 0xdc, 0x07, 0x91, 0x0b, 0x4d,
+	0x34, 0x01, 0x43, 0x9a, 0xb8, 0x3e, 0xe3, 0x0e, 0x83, 0x0f, 0x68, 0x04, 0x1e, 0xe3, 0x20, 0xf4,
+	0x1d, 0xf8, 0x1c, 0x01, 0x30, 0xf0, 0x18, 0x77, 0x59, 0x04, 0x1f, 0xd1, 0x0b, 0x30, 0xa2, 0x1e,
+	0x3b, 0x44, 0x94, 0x7b, 0x0c, 0x0e, 0x9a, 0x31, 0x5c, 0x53, 0x87, 0x6d, 0x18, 0x8f, 0xe1, 0x13,
+	0x7a, 0x09, 0xa6, 0x21, 0x8d, 0x18, 0x8f, 0xe9, 0xfa, 0xb0, 0x8d, 0x69, 0x9c, 0x6c, 0xe1, 0x10,
+	0x41, 0x30, 0xf1, 0xb9, 0x13, 0x6c, 0x7a, 0xd7, 0x68, 0xf9, 0xdb, 0x00, 0xf3, 0x2f, 0xaa, 0xc2,
+	0xff, 0xad, 0x62, 0xf9, 0xfa, 0xfe, 0x3b, 0x61, 0xd3, 0x42, 0x68, 0x7c, 0x5a, 0xfe, 0x75, 0x0a,
+	0x75, 0xcc, 0xa4, 0xc0, 0xea, 0x2c, 0x2c, 0x51, 0xc8, 0xb6, 0xa3, 0x7e, 0x1b, 0xa7, 0x52, 0xff,
+	0x63, 0x39, 0xef, 0xdb, 0xf3, 0xab, 0xf9, 0xe0, 0x51, 0xfa, 0xdd, 0x9c, 0x79, 0x5d, 0x14, 0xcd,
+	0x35, 0xee, 0x60, 0x83, 0x76, 0x36, 0x6e, 0x5a, 0xd5, 0x3f, 0x7b, 0x3e, 0xa5, 0xb9, 0x4e, 0x6f,
+	0x7c, 0xba, 0xb3, 0xd3, 0x96, 0xff, 0x65, 0xce, 0xbb, 0x4b, 0x42, 0x68, 0xae, 0x09, 0xb9, 0x29,
+	0x08, 0xd9, 0xd9, 0x84, 0xb4, 0x9a, 0xcf, 0x83, 0xf6, 0x61, 0xf6, 0x9f, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0x45, 0xef, 0xff, 0xbe, 0x34, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/time_type.pb.go b/googleapis/ads/googleads/v3/enums/time_type.pb.go
new file mode 100644
index 0000000..13ec05e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/time_type.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/time_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible time types used by certain resources as an alternative to
+// absolute timestamps.
+type TimeTypeEnum_TimeType int32
+
+const (
+	// Not specified.
+	TimeTypeEnum_UNSPECIFIED TimeTypeEnum_TimeType = 0
+	// Used for return value only. Represents value unknown in this version.
+	TimeTypeEnum_UNKNOWN TimeTypeEnum_TimeType = 1
+	// As soon as possible.
+	TimeTypeEnum_NOW TimeTypeEnum_TimeType = 2
+	// An infinite point in the future.
+	TimeTypeEnum_FOREVER TimeTypeEnum_TimeType = 3
+)
+
+var TimeTypeEnum_TimeType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "NOW",
+	3: "FOREVER",
+}
+
+var TimeTypeEnum_TimeType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"NOW":         2,
+	"FOREVER":     3,
+}
+
+func (x TimeTypeEnum_TimeType) String() string {
+	return proto.EnumName(TimeTypeEnum_TimeType_name, int32(x))
+}
+
+func (TimeTypeEnum_TimeType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2bcb6847913a5158, []int{0, 0}
+}
+
+// Message describing time types.
+type TimeTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TimeTypeEnum) Reset()         { *m = TimeTypeEnum{} }
+func (m *TimeTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*TimeTypeEnum) ProtoMessage()    {}
+func (*TimeTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2bcb6847913a5158, []int{0}
+}
+
+func (m *TimeTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TimeTypeEnum.Unmarshal(m, b)
+}
+func (m *TimeTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TimeTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *TimeTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TimeTypeEnum.Merge(m, src)
+}
+func (m *TimeTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_TimeTypeEnum.Size(m)
+}
+func (m *TimeTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_TimeTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TimeTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.TimeTypeEnum_TimeType", TimeTypeEnum_TimeType_name, TimeTypeEnum_TimeType_value)
+	proto.RegisterType((*TimeTypeEnum)(nil), "google.ads.googleads.v3.enums.TimeTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/time_type.proto", fileDescriptor_2bcb6847913a5158)
+}
+
+var fileDescriptor_2bcb6847913a5158 = []byte{
+	// 293 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x18, 0xc7, 0x5d, 0x0b, 0x4e, 0x32, 0xc5, 0xd2, 0xa3, 0xb8, 0xc3, 0x76, 0x37, 0x39, 0xe4, 0x16,
+	0x41, 0x68, 0xb5, 0x1b, 0x43, 0x48, 0xcb, 0xdc, 0x3a, 0x90, 0x82, 0x54, 0x1b, 0x42, 0x61, 0x4d,
+	0xca, 0xd2, 0x0d, 0xf6, 0x3a, 0x1e, 0x7d, 0x14, 0x1f, 0xc3, 0xa3, 0x4f, 0x21, 0x49, 0x4c, 0x6f,
+	0x7a, 0x09, 0xff, 0x7c, 0xff, 0x5f, 0xbe, 0xfc, 0xbf, 0x0f, 0xdc, 0x70, 0x29, 0xf9, 0x96, 0xa1,
+	0xb2, 0x52, 0xc8, 0x4a, 0xad, 0x0e, 0x18, 0x31, 0xb1, 0x6f, 0x14, 0xea, 0xea, 0x86, 0xbd, 0x74,
+	0xc7, 0x96, 0xc1, 0x76, 0x27, 0x3b, 0x19, 0x8e, 0x2d, 0x03, 0xcb, 0x4a, 0xc1, 0x1e, 0x87, 0x07,
+	0x0c, 0x0d, 0x7e, 0x75, 0xed, 0xba, 0xb5, 0x35, 0x2a, 0x85, 0x90, 0x5d, 0xd9, 0xd5, 0x52, 0x28,
+	0xfb, 0x78, 0x4a, 0xc1, 0xf9, 0xaa, 0x6e, 0xd8, 0xea, 0xd8, 0xb2, 0x44, 0xec, 0x9b, 0xe9, 0x1d,
+	0x38, 0x73, 0xf7, 0xf0, 0x12, 0x8c, 0xd6, 0xf4, 0x29, 0x4b, 0xee, 0x17, 0xb3, 0x45, 0xf2, 0x10,
+	0x9c, 0x84, 0x23, 0x30, 0x5c, 0xd3, 0x47, 0x9a, 0x6e, 0x68, 0x30, 0x08, 0x87, 0xc0, 0xa7, 0xe9,
+	0x26, 0xf0, 0x74, 0x75, 0x96, 0x2e, 0x93, 0x3c, 0x59, 0x06, 0x7e, 0xfc, 0x35, 0x00, 0x93, 0x37,
+	0xd9, 0xc0, 0x7f, 0x33, 0xc5, 0x17, 0xee, 0x8f, 0x4c, 0x87, 0xc8, 0x06, 0xcf, 0xf1, 0x2f, 0xcf,
+	0xe5, 0xb6, 0x14, 0x1c, 0xca, 0x1d, 0x47, 0x9c, 0x09, 0x13, 0xd1, 0xad, 0xa0, 0xad, 0xd5, 0x1f,
+	0x1b, 0xb9, 0x35, 0xe7, 0xbb, 0xe7, 0xcf, 0xa3, 0xe8, 0xc3, 0x1b, 0xcf, 0x6d, 0xab, 0xa8, 0x52,
+	0xd0, 0x4a, 0xad, 0x72, 0x0c, 0xf5, 0x7c, 0xea, 0xd3, 0xf9, 0x45, 0x54, 0xa9, 0xa2, 0xf7, 0x8b,
+	0x1c, 0x17, 0xc6, 0xff, 0xf6, 0x26, 0xb6, 0x48, 0x48, 0x54, 0x29, 0x42, 0x7a, 0x82, 0x90, 0x1c,
+	0x13, 0x62, 0x98, 0xd7, 0x53, 0x13, 0x0c, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x16, 0x18, 0x32,
+	0xc9, 0xa9, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/tracking_code_page_format.pb.go b/googleapis/ads/googleads/v3/enums/tracking_code_page_format.pb.go
new file mode 100644
index 0000000..1782987
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/tracking_code_page_format.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/tracking_code_page_format.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The format of the web page where the tracking tag and snippet will be
+// installed.
+type TrackingCodePageFormatEnum_TrackingCodePageFormat int32
+
+const (
+	// Not specified.
+	TrackingCodePageFormatEnum_UNSPECIFIED TrackingCodePageFormatEnum_TrackingCodePageFormat = 0
+	// Used for return value only. Represents value unknown in this version.
+	TrackingCodePageFormatEnum_UNKNOWN TrackingCodePageFormatEnum_TrackingCodePageFormat = 1
+	// Standard HTML page format.
+	TrackingCodePageFormatEnum_HTML TrackingCodePageFormatEnum_TrackingCodePageFormat = 2
+	// Google AMP page format.
+	TrackingCodePageFormatEnum_AMP TrackingCodePageFormatEnum_TrackingCodePageFormat = 3
+)
+
+var TrackingCodePageFormatEnum_TrackingCodePageFormat_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "HTML",
+	3: "AMP",
+}
+
+var TrackingCodePageFormatEnum_TrackingCodePageFormat_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"HTML":        2,
+	"AMP":         3,
+}
+
+func (x TrackingCodePageFormatEnum_TrackingCodePageFormat) String() string {
+	return proto.EnumName(TrackingCodePageFormatEnum_TrackingCodePageFormat_name, int32(x))
+}
+
+func (TrackingCodePageFormatEnum_TrackingCodePageFormat) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e3a23c7c2a2a42f2, []int{0, 0}
+}
+
+// Container for enum describing the format of the web page where the tracking
+// tag and snippet will be installed.
+type TrackingCodePageFormatEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TrackingCodePageFormatEnum) Reset()         { *m = TrackingCodePageFormatEnum{} }
+func (m *TrackingCodePageFormatEnum) String() string { return proto.CompactTextString(m) }
+func (*TrackingCodePageFormatEnum) ProtoMessage()    {}
+func (*TrackingCodePageFormatEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e3a23c7c2a2a42f2, []int{0}
+}
+
+func (m *TrackingCodePageFormatEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TrackingCodePageFormatEnum.Unmarshal(m, b)
+}
+func (m *TrackingCodePageFormatEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TrackingCodePageFormatEnum.Marshal(b, m, deterministic)
+}
+func (m *TrackingCodePageFormatEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TrackingCodePageFormatEnum.Merge(m, src)
+}
+func (m *TrackingCodePageFormatEnum) XXX_Size() int {
+	return xxx_messageInfo_TrackingCodePageFormatEnum.Size(m)
+}
+func (m *TrackingCodePageFormatEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_TrackingCodePageFormatEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TrackingCodePageFormatEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.TrackingCodePageFormatEnum_TrackingCodePageFormat", TrackingCodePageFormatEnum_TrackingCodePageFormat_name, TrackingCodePageFormatEnum_TrackingCodePageFormat_value)
+	proto.RegisterType((*TrackingCodePageFormatEnum)(nil), "google.ads.googleads.v3.enums.TrackingCodePageFormatEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/tracking_code_page_format.proto", fileDescriptor_e3a23c7c2a2a42f2)
+}
+
+var fileDescriptor_e3a23c7c2a2a42f2 = []byte{
+	// 313 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4e, 0xf2, 0x40,
+	0x14, 0x85, 0x7f, 0xca, 0x1f, 0x31, 0xc3, 0xc2, 0xa6, 0x0b, 0x17, 0x28, 0x0b, 0x78, 0x80, 0xe9,
+	0x62, 0x76, 0x63, 0x5c, 0x0c, 0x08, 0x48, 0x94, 0xda, 0x44, 0xc0, 0xc4, 0x34, 0x21, 0x23, 0x33,
+	0x4e, 0x1a, 0xe9, 0xdc, 0xa6, 0x53, 0x78, 0x20, 0x97, 0x3e, 0x8a, 0x8f, 0xe2, 0xca, 0x47, 0x30,
+	0x9d, 0x81, 0xae, 0xd0, 0x4d, 0x73, 0xd2, 0x73, 0xbf, 0x33, 0xe7, 0x5e, 0x74, 0xad, 0x00, 0xd4,
+	0x46, 0x86, 0x5c, 0x98, 0xd0, 0xc9, 0x4a, 0xed, 0x48, 0x28, 0xf5, 0x36, 0x33, 0x61, 0x59, 0xf0,
+	0xf5, 0x5b, 0xaa, 0xd5, 0x6a, 0x0d, 0x42, 0xae, 0x72, 0xae, 0xe4, 0xea, 0x15, 0x8a, 0x8c, 0x97,
+	0x38, 0x2f, 0xa0, 0x84, 0xa0, 0xeb, 0x18, 0xcc, 0x85, 0xc1, 0x35, 0x8e, 0x77, 0x04, 0x5b, 0xbc,
+	0x73, 0x79, 0x48, 0xcf, 0xd3, 0x90, 0x6b, 0x0d, 0x25, 0x2f, 0x53, 0xd0, 0xc6, 0xc1, 0x7d, 0x85,
+	0x3a, 0xf3, 0x7d, 0xfe, 0x10, 0x84, 0x8c, 0xb9, 0x92, 0x63, 0x1b, 0x3e, 0xd2, 0xdb, 0xac, 0x3f,
+	0x45, 0xe7, 0xc7, 0xdd, 0xe0, 0x0c, 0xb5, 0x17, 0xd1, 0x63, 0x3c, 0x1a, 0x4e, 0xc7, 0xd3, 0xd1,
+	0x8d, 0xff, 0x2f, 0x68, 0xa3, 0xd6, 0x22, 0xba, 0x8b, 0x1e, 0x9e, 0x22, 0xbf, 0x11, 0x9c, 0xa2,
+	0xff, 0xb7, 0xf3, 0xd9, 0xbd, 0xef, 0x05, 0x2d, 0xd4, 0x64, 0xb3, 0xd8, 0x6f, 0x0e, 0xbe, 0x1b,
+	0xa8, 0xb7, 0x86, 0x0c, 0xff, 0x59, 0x76, 0x70, 0x71, 0xfc, 0xb9, 0xb8, 0xea, 0x1a, 0x37, 0x9e,
+	0x07, 0x7b, 0x5a, 0xc1, 0x86, 0x6b, 0x85, 0xa1, 0x50, 0xa1, 0x92, 0xda, 0x6e, 0x72, 0xb8, 0x5c,
+	0x9e, 0x9a, 0x5f, 0x0e, 0x79, 0x65, 0xbf, 0xef, 0x5e, 0x73, 0xc2, 0xd8, 0x87, 0xd7, 0x9d, 0xb8,
+	0x28, 0x26, 0x0c, 0x76, 0xb2, 0x52, 0x4b, 0x82, 0xab, 0xc5, 0xcd, 0xe7, 0xc1, 0x4f, 0x98, 0x30,
+	0x49, 0xed, 0x27, 0x4b, 0x92, 0x58, 0xff, 0xcb, 0xeb, 0xb9, 0x9f, 0x94, 0x32, 0x61, 0x28, 0xad,
+	0x27, 0x28, 0x5d, 0x12, 0x4a, 0xed, 0xcc, 0xcb, 0x89, 0x2d, 0x46, 0x7e, 0x02, 0x00, 0x00, 0xff,
+	0xff, 0x9e, 0x0d, 0x97, 0x9e, 0xe0, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/tracking_code_type.pb.go b/googleapis/ads/googleads/v3/enums/tracking_code_type.pb.go
new file mode 100644
index 0000000..18b93c0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/tracking_code_type.pb.go
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/tracking_code_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The type of the generated tag snippets for tracking conversions.
+type TrackingCodeTypeEnum_TrackingCodeType int32
+
+const (
+	// Not specified.
+	TrackingCodeTypeEnum_UNSPECIFIED TrackingCodeTypeEnum_TrackingCodeType = 0
+	// Used for return value only. Represents value unknown in this version.
+	TrackingCodeTypeEnum_UNKNOWN TrackingCodeTypeEnum_TrackingCodeType = 1
+	// The snippet that is fired as a result of a website page loading.
+	TrackingCodeTypeEnum_WEBPAGE TrackingCodeTypeEnum_TrackingCodeType = 2
+	// The snippet contains a JavaScript function which fires the tag. This
+	// function is typically called from an onClick handler added to a link or
+	// button element on the page.
+	TrackingCodeTypeEnum_WEBPAGE_ONCLICK TrackingCodeTypeEnum_TrackingCodeType = 3
+	// For embedding on a mobile webpage. The snippet contains a JavaScript
+	// function which fires the tag.
+	TrackingCodeTypeEnum_CLICK_TO_CALL TrackingCodeTypeEnum_TrackingCodeType = 4
+	// The snippet that is used to replace the phone number on your website with
+	// a Google forwarding number for call tracking purposes.
+	TrackingCodeTypeEnum_WEBSITE_CALL TrackingCodeTypeEnum_TrackingCodeType = 5
+)
+
+var TrackingCodeTypeEnum_TrackingCodeType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "WEBPAGE",
+	3: "WEBPAGE_ONCLICK",
+	4: "CLICK_TO_CALL",
+	5: "WEBSITE_CALL",
+}
+
+var TrackingCodeTypeEnum_TrackingCodeType_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"WEBPAGE":         2,
+	"WEBPAGE_ONCLICK": 3,
+	"CLICK_TO_CALL":   4,
+	"WEBSITE_CALL":    5,
+}
+
+func (x TrackingCodeTypeEnum_TrackingCodeType) String() string {
+	return proto.EnumName(TrackingCodeTypeEnum_TrackingCodeType_name, int32(x))
+}
+
+func (TrackingCodeTypeEnum_TrackingCodeType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7ecffb311479e90, []int{0, 0}
+}
+
+// Container for enum describing the type of the generated tag snippets for
+// tracking conversions.
+type TrackingCodeTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TrackingCodeTypeEnum) Reset()         { *m = TrackingCodeTypeEnum{} }
+func (m *TrackingCodeTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*TrackingCodeTypeEnum) ProtoMessage()    {}
+func (*TrackingCodeTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7ecffb311479e90, []int{0}
+}
+
+func (m *TrackingCodeTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TrackingCodeTypeEnum.Unmarshal(m, b)
+}
+func (m *TrackingCodeTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TrackingCodeTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *TrackingCodeTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TrackingCodeTypeEnum.Merge(m, src)
+}
+func (m *TrackingCodeTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_TrackingCodeTypeEnum.Size(m)
+}
+func (m *TrackingCodeTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_TrackingCodeTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TrackingCodeTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.TrackingCodeTypeEnum_TrackingCodeType", TrackingCodeTypeEnum_TrackingCodeType_name, TrackingCodeTypeEnum_TrackingCodeType_value)
+	proto.RegisterType((*TrackingCodeTypeEnum)(nil), "google.ads.googleads.v3.enums.TrackingCodeTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/tracking_code_type.proto", fileDescriptor_d7ecffb311479e90)
+}
+
+var fileDescriptor_d7ecffb311479e90 = []byte{
+	// 339 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xdd, 0x6a, 0xc2, 0x30,
+	0x18, 0x5d, 0xeb, 0x7e, 0x20, 0x6e, 0xd8, 0x75, 0xdb, 0xcd, 0x98, 0x17, 0xfa, 0x00, 0xe9, 0x45,
+	0x61, 0x17, 0xd9, 0x55, 0xdb, 0x65, 0x52, 0x94, 0x5a, 0xb0, 0x2a, 0x8c, 0x42, 0xe9, 0x4c, 0x08,
+	0x65, 0x9a, 0x14, 0x53, 0x1d, 0x3e, 0xc5, 0xde, 0x61, 0x97, 0x7b, 0x94, 0x3d, 0x8a, 0x4f, 0x31,
+	0x9a, 0xa8, 0x17, 0xc2, 0x76, 0x13, 0x4e, 0xbe, 0xef, 0x9c, 0xc3, 0x77, 0x0e, 0x78, 0x64, 0x42,
+	0xb0, 0x39, 0x75, 0x72, 0x22, 0x1d, 0x0d, 0x6b, 0xb4, 0x76, 0x1d, 0xca, 0x57, 0x0b, 0xe9, 0x54,
+	0xcb, 0x7c, 0xf6, 0x5e, 0x70, 0x96, 0xcd, 0x04, 0xa1, 0x59, 0xb5, 0x29, 0x29, 0x2c, 0x97, 0xa2,
+	0x12, 0x76, 0x5b, 0x93, 0x61, 0x4e, 0x24, 0x3c, 0xe8, 0xe0, 0xda, 0x85, 0x4a, 0x77, 0xff, 0xb0,
+	0xb7, 0x2d, 0x0b, 0x27, 0xe7, 0x5c, 0x54, 0x79, 0x55, 0x08, 0x2e, 0xb5, 0xb8, 0xfb, 0x69, 0x80,
+	0xdb, 0x64, 0xe7, 0x1c, 0x08, 0x42, 0x93, 0x4d, 0x49, 0x31, 0x5f, 0x2d, 0xba, 0x1f, 0xc0, 0x3a,
+	0x9e, 0xdb, 0x2d, 0xd0, 0x1c, 0x47, 0xa3, 0x18, 0x07, 0xe1, 0x4b, 0x88, 0x9f, 0xad, 0x13, 0xbb,
+	0x09, 0x2e, 0xc6, 0x51, 0x3f, 0x1a, 0x4e, 0x23, 0xcb, 0xa8, 0x3f, 0x53, 0xec, 0xc7, 0x5e, 0x0f,
+	0x5b, 0xa6, 0x7d, 0x03, 0x5a, 0xbb, 0x4f, 0x36, 0x8c, 0x82, 0x41, 0x18, 0xf4, 0xad, 0x86, 0x7d,
+	0x0d, 0xae, 0x14, 0xcc, 0x92, 0x61, 0x16, 0x78, 0x83, 0x81, 0x75, 0x6a, 0x5b, 0xe0, 0x72, 0x8a,
+	0xfd, 0x51, 0x98, 0x60, 0x3d, 0x39, 0xf3, 0xb7, 0x06, 0xe8, 0xcc, 0xc4, 0x02, 0xfe, 0x9b, 0xca,
+	0xbf, 0x3b, 0x3e, 0x2e, 0xae, 0xe3, 0xc4, 0xc6, 0xab, 0xbf, 0xd3, 0x31, 0x31, 0xcf, 0x39, 0x83,
+	0x62, 0xc9, 0x1c, 0x46, 0xb9, 0x0a, 0xbb, 0x6f, 0xb5, 0x2c, 0xe4, 0x1f, 0x25, 0x3f, 0xa9, 0xf7,
+	0xcb, 0x6c, 0xf4, 0x3c, 0xef, 0xdb, 0x6c, 0xf7, 0xb4, 0x95, 0x47, 0x24, 0xd4, 0xb0, 0x46, 0x13,
+	0x17, 0xd6, 0x05, 0xc9, 0x9f, 0xfd, 0x3e, 0xf5, 0x88, 0x4c, 0x0f, 0xfb, 0x74, 0xe2, 0xa6, 0x6a,
+	0xbf, 0x35, 0x3b, 0x7a, 0x88, 0x90, 0x47, 0x24, 0x42, 0x07, 0x06, 0x42, 0x13, 0x17, 0x21, 0xc5,
+	0x79, 0x3b, 0x57, 0x87, 0xb9, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x73, 0x76, 0x2d, 0xfc,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/travel_placeholder_field.pb.go b/googleapis/ads/googleads/v3/enums/travel_placeholder_field.pb.go
new file mode 100644
index 0000000..60a6160
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/travel_placeholder_field.pb.go
@@ -0,0 +1,233 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/travel_placeholder_field.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Possible values for Travel placeholder fields.
+type TravelPlaceholderFieldEnum_TravelPlaceholderField int32
+
+const (
+	// Not specified.
+	TravelPlaceholderFieldEnum_UNSPECIFIED TravelPlaceholderFieldEnum_TravelPlaceholderField = 0
+	// Used for return value only. Represents value unknown in this version.
+	TravelPlaceholderFieldEnum_UNKNOWN TravelPlaceholderFieldEnum_TravelPlaceholderField = 1
+	// Data Type: STRING. Required. Destination id. Example: PAR, LON.
+	// For feed items that only have destination id, destination id must be a
+	// unique key. For feed items that have both destination id and origin id,
+	// then the combination must be a unique key.
+	TravelPlaceholderFieldEnum_DESTINATION_ID TravelPlaceholderFieldEnum_TravelPlaceholderField = 2
+	// Data Type: STRING. Origin id. Example: PAR, LON.
+	// Combination of DESTINATION_ID and ORIGIN_ID must be
+	// unique per offer.
+	TravelPlaceholderFieldEnum_ORIGIN_ID TravelPlaceholderFieldEnum_TravelPlaceholderField = 3
+	// Data Type: STRING. Required. Main headline with name to be shown in
+	// dynamic ad.
+	TravelPlaceholderFieldEnum_TITLE TravelPlaceholderFieldEnum_TravelPlaceholderField = 4
+	// Data Type: STRING. The destination name. Shorter names are recommended.
+	TravelPlaceholderFieldEnum_DESTINATION_NAME TravelPlaceholderFieldEnum_TravelPlaceholderField = 5
+	// Data Type: STRING. Origin name. Shorter names are recommended.
+	TravelPlaceholderFieldEnum_ORIGIN_NAME TravelPlaceholderFieldEnum_TravelPlaceholderField = 6
+	// Data Type: STRING. Price to be shown in the ad. Highly recommended for
+	// dynamic ads.
+	// Example: "100.00 USD"
+	TravelPlaceholderFieldEnum_PRICE TravelPlaceholderFieldEnum_TravelPlaceholderField = 7
+	// Data Type: STRING. Formatted price to be shown in the ad.
+	// Example: "Starting at $100.00 USD", "$80 - $100"
+	TravelPlaceholderFieldEnum_FORMATTED_PRICE TravelPlaceholderFieldEnum_TravelPlaceholderField = 8
+	// Data Type: STRING. Sale price to be shown in the ad.
+	// Example: "80.00 USD"
+	TravelPlaceholderFieldEnum_SALE_PRICE TravelPlaceholderFieldEnum_TravelPlaceholderField = 9
+	// Data Type: STRING. Formatted sale price to be shown in the ad.
+	// Example: "On sale for $80.00", "$60 - $80"
+	TravelPlaceholderFieldEnum_FORMATTED_SALE_PRICE TravelPlaceholderFieldEnum_TravelPlaceholderField = 10
+	// Data Type: URL. Image to be displayed in the ad.
+	TravelPlaceholderFieldEnum_IMAGE_URL TravelPlaceholderFieldEnum_TravelPlaceholderField = 11
+	// Data Type: STRING. Category of travel offer used to group like items
+	// together for recommendation engine.
+	TravelPlaceholderFieldEnum_CATEGORY TravelPlaceholderFieldEnum_TravelPlaceholderField = 12
+	// Data Type: STRING_LIST. Keywords used for product retrieval.
+	TravelPlaceholderFieldEnum_CONTEXTUAL_KEYWORDS TravelPlaceholderFieldEnum_TravelPlaceholderField = 13
+	// Data Type: STRING. Address of travel offer, including postal code.
+	TravelPlaceholderFieldEnum_DESTINATION_ADDRESS TravelPlaceholderFieldEnum_TravelPlaceholderField = 14
+	// Data Type: URL_LIST. Required. Final URLs to be used in ad, when using
+	// Upgraded URLs; the more specific the better (e.g. the individual URL of a
+	// specific travel offer and its location).
+	TravelPlaceholderFieldEnum_FINAL_URL TravelPlaceholderFieldEnum_TravelPlaceholderField = 15
+	// Data Type: URL_LIST. Final mobile URLs for the ad when using Upgraded
+	// URLs.
+	TravelPlaceholderFieldEnum_FINAL_MOBILE_URLS TravelPlaceholderFieldEnum_TravelPlaceholderField = 16
+	// Data Type: URL. Tracking template for the ad when using Upgraded URLs.
+	TravelPlaceholderFieldEnum_TRACKING_URL TravelPlaceholderFieldEnum_TravelPlaceholderField = 17
+	// Data Type: STRING. Android app link. Must be formatted as:
+	// android-app://{package_id}/{scheme}/{host_path}.
+	// The components are defined as follows:
+	// package_id: app ID as specified in Google Play.
+	// scheme: the scheme to pass to the application. Can be HTTP, or a custom
+	//   scheme.
+	// host_path: identifies the specific content within your application.
+	TravelPlaceholderFieldEnum_ANDROID_APP_LINK TravelPlaceholderFieldEnum_TravelPlaceholderField = 18
+	// Data Type: STRING_LIST. List of recommended destination IDs to show
+	// together with this item.
+	TravelPlaceholderFieldEnum_SIMILAR_DESTINATION_IDS TravelPlaceholderFieldEnum_TravelPlaceholderField = 19
+	// Data Type: STRING. iOS app link.
+	TravelPlaceholderFieldEnum_IOS_APP_LINK TravelPlaceholderFieldEnum_TravelPlaceholderField = 20
+	// Data Type: INT64. iOS app store ID.
+	TravelPlaceholderFieldEnum_IOS_APP_STORE_ID TravelPlaceholderFieldEnum_TravelPlaceholderField = 21
+)
+
+var TravelPlaceholderFieldEnum_TravelPlaceholderField_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "DESTINATION_ID",
+	3:  "ORIGIN_ID",
+	4:  "TITLE",
+	5:  "DESTINATION_NAME",
+	6:  "ORIGIN_NAME",
+	7:  "PRICE",
+	8:  "FORMATTED_PRICE",
+	9:  "SALE_PRICE",
+	10: "FORMATTED_SALE_PRICE",
+	11: "IMAGE_URL",
+	12: "CATEGORY",
+	13: "CONTEXTUAL_KEYWORDS",
+	14: "DESTINATION_ADDRESS",
+	15: "FINAL_URL",
+	16: "FINAL_MOBILE_URLS",
+	17: "TRACKING_URL",
+	18: "ANDROID_APP_LINK",
+	19: "SIMILAR_DESTINATION_IDS",
+	20: "IOS_APP_LINK",
+	21: "IOS_APP_STORE_ID",
+}
+
+var TravelPlaceholderFieldEnum_TravelPlaceholderField_value = map[string]int32{
+	"UNSPECIFIED":             0,
+	"UNKNOWN":                 1,
+	"DESTINATION_ID":          2,
+	"ORIGIN_ID":               3,
+	"TITLE":                   4,
+	"DESTINATION_NAME":        5,
+	"ORIGIN_NAME":             6,
+	"PRICE":                   7,
+	"FORMATTED_PRICE":         8,
+	"SALE_PRICE":              9,
+	"FORMATTED_SALE_PRICE":    10,
+	"IMAGE_URL":               11,
+	"CATEGORY":                12,
+	"CONTEXTUAL_KEYWORDS":     13,
+	"DESTINATION_ADDRESS":     14,
+	"FINAL_URL":               15,
+	"FINAL_MOBILE_URLS":       16,
+	"TRACKING_URL":            17,
+	"ANDROID_APP_LINK":        18,
+	"SIMILAR_DESTINATION_IDS": 19,
+	"IOS_APP_LINK":            20,
+	"IOS_APP_STORE_ID":        21,
+}
+
+func (x TravelPlaceholderFieldEnum_TravelPlaceholderField) String() string {
+	return proto.EnumName(TravelPlaceholderFieldEnum_TravelPlaceholderField_name, int32(x))
+}
+
+func (TravelPlaceholderFieldEnum_TravelPlaceholderField) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c5525e64a37cd678, []int{0, 0}
+}
+
+// Values for Travel placeholder fields.
+// For more information about dynamic remarketing feeds, see
+// https://support.google.com/google-ads/answer/6053288.
+type TravelPlaceholderFieldEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TravelPlaceholderFieldEnum) Reset()         { *m = TravelPlaceholderFieldEnum{} }
+func (m *TravelPlaceholderFieldEnum) String() string { return proto.CompactTextString(m) }
+func (*TravelPlaceholderFieldEnum) ProtoMessage()    {}
+func (*TravelPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c5525e64a37cd678, []int{0}
+}
+
+func (m *TravelPlaceholderFieldEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TravelPlaceholderFieldEnum.Unmarshal(m, b)
+}
+func (m *TravelPlaceholderFieldEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TravelPlaceholderFieldEnum.Marshal(b, m, deterministic)
+}
+func (m *TravelPlaceholderFieldEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TravelPlaceholderFieldEnum.Merge(m, src)
+}
+func (m *TravelPlaceholderFieldEnum) XXX_Size() int {
+	return xxx_messageInfo_TravelPlaceholderFieldEnum.Size(m)
+}
+func (m *TravelPlaceholderFieldEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_TravelPlaceholderFieldEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TravelPlaceholderFieldEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.TravelPlaceholderFieldEnum_TravelPlaceholderField", TravelPlaceholderFieldEnum_TravelPlaceholderField_name, TravelPlaceholderFieldEnum_TravelPlaceholderField_value)
+	proto.RegisterType((*TravelPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.TravelPlaceholderFieldEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/travel_placeholder_field.proto", fileDescriptor_c5525e64a37cd678)
+}
+
+var fileDescriptor_c5525e64a37cd678 = []byte{
+	// 524 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xdd, 0x6e, 0xda, 0x30,
+	0x14, 0x1e, 0xb0, 0xfe, 0x60, 0x28, 0xb8, 0x86, 0xae, 0x53, 0xbb, 0x5e, 0xb4, 0x0f, 0x90, 0x5c,
+	0xe4, 0x2e, 0xdb, 0x8d, 0x21, 0x26, 0xb2, 0x08, 0x4e, 0x14, 0x1b, 0xba, 0x4e, 0x48, 0x51, 0xd6,
+	0x64, 0x19, 0x52, 0x48, 0x10, 0xa1, 0x3c, 0xd0, 0x2e, 0xf7, 0x02, 0x7b, 0x87, 0x3d, 0xc0, 0x1e,
+	0x62, 0x57, 0x7b, 0x84, 0xc9, 0x0e, 0x7f, 0x93, 0xba, 0xde, 0x44, 0xe7, 0x9c, 0xef, 0xc7, 0x27,
+	0xf6, 0x07, 0x3e, 0x24, 0x79, 0x9e, 0xa4, 0xb1, 0x1e, 0x46, 0x85, 0x5e, 0x96, 0xb2, 0x5a, 0x1b,
+	0x7a, 0x9c, 0x3d, 0xcd, 0x0b, 0x7d, 0xb5, 0x0c, 0xd7, 0x71, 0x1a, 0x2c, 0xd2, 0xf0, 0x31, 0xfe,
+	0x9a, 0xa7, 0x51, 0xbc, 0x0c, 0xbe, 0xcc, 0xe2, 0x34, 0xd2, 0x16, 0xcb, 0x7c, 0x95, 0xa3, 0x9b,
+	0x52, 0xa2, 0x85, 0x51, 0xa1, 0xed, 0xd4, 0xda, 0xda, 0xd0, 0x94, 0xfa, 0xea, 0xdd, 0xd6, 0x7c,
+	0x31, 0xd3, 0xc3, 0x2c, 0xcb, 0x57, 0xe1, 0x6a, 0x96, 0x67, 0x45, 0x29, 0xbe, 0xfb, 0x55, 0x03,
+	0x57, 0x42, 0xf9, 0x7b, 0x7b, 0xfb, 0x81, 0x74, 0x27, 0xd9, 0xd3, 0xfc, 0xee, 0x47, 0x0d, 0xbc,
+	0x79, 0x1e, 0x46, 0x6d, 0xd0, 0x18, 0x33, 0xee, 0x91, 0x3e, 0x1d, 0x50, 0x62, 0xc1, 0x57, 0xa8,
+	0x01, 0x4e, 0xc6, 0x6c, 0xc8, 0xdc, 0x7b, 0x06, 0x2b, 0x08, 0x81, 0x96, 0x45, 0xb8, 0xa0, 0x0c,
+	0x0b, 0xea, 0xb2, 0x80, 0x5a, 0xb0, 0x8a, 0xce, 0x40, 0xdd, 0xf5, 0xa9, 0x4d, 0x55, 0x5b, 0x43,
+	0x75, 0x70, 0x24, 0xa8, 0x70, 0x08, 0x7c, 0x8d, 0xba, 0x00, 0x1e, 0xb2, 0x19, 0x1e, 0x11, 0x78,
+	0x24, 0x4f, 0xd8, 0xf0, 0xd5, 0xe0, 0x58, 0x2a, 0x3c, 0x9f, 0xf6, 0x09, 0x3c, 0x41, 0x1d, 0xd0,
+	0x1e, 0xb8, 0xfe, 0x08, 0x0b, 0x41, 0xac, 0xa0, 0x1c, 0x9e, 0xa2, 0x16, 0x00, 0x1c, 0x3b, 0x64,
+	0xd3, 0xd7, 0xd1, 0x5b, 0xd0, 0xdd, 0x93, 0x0e, 0x10, 0x20, 0x57, 0xa1, 0x23, 0x6c, 0x93, 0x60,
+	0xec, 0x3b, 0xb0, 0x81, 0x9a, 0xe0, 0xb4, 0x8f, 0x05, 0xb1, 0x5d, 0xff, 0x01, 0x36, 0xd1, 0x25,
+	0xe8, 0xf4, 0x5d, 0x26, 0xc8, 0x47, 0x31, 0xc6, 0x4e, 0x30, 0x24, 0x0f, 0xf7, 0xae, 0x6f, 0x71,
+	0x78, 0x26, 0x81, 0xc3, 0x35, 0xb1, 0x65, 0xf9, 0x84, 0x73, 0xd8, 0x92, 0x76, 0x03, 0xca, 0xb0,
+	0xa3, 0xec, 0xda, 0xe8, 0x02, 0x9c, 0x97, 0xed, 0xc8, 0xed, 0x51, 0x47, 0x1d, 0xc2, 0x21, 0x44,
+	0x10, 0x34, 0x85, 0x8f, 0xfb, 0x43, 0xca, 0x6c, 0x45, 0x3c, 0x97, 0xff, 0x8d, 0x99, 0xe5, 0xbb,
+	0xd4, 0x0a, 0xb0, 0xe7, 0x05, 0x0e, 0x65, 0x43, 0x88, 0xd0, 0x35, 0xb8, 0xe4, 0x74, 0x44, 0x1d,
+	0xec, 0x07, 0xff, 0xde, 0x21, 0x87, 0x1d, 0x69, 0x42, 0x5d, 0xbe, 0xa7, 0x77, 0xa5, 0xc9, 0x76,
+	0xc2, 0x85, 0xeb, 0x13, 0x79, 0xbb, 0x17, 0xbd, 0x3f, 0x15, 0x70, 0xfb, 0x98, 0xcf, 0xb5, 0x17,
+	0xc3, 0xd1, 0xbb, 0x7e, 0xfe, 0x71, 0x3d, 0x99, 0x0d, 0xaf, 0xf2, 0xa9, 0xb7, 0x51, 0x27, 0x79,
+	0x1a, 0x66, 0x89, 0x96, 0x2f, 0x13, 0x3d, 0x89, 0x33, 0x95, 0x9c, 0x6d, 0x50, 0x17, 0xb3, 0xe2,
+	0x3f, 0xb9, 0x7d, 0xaf, 0xbe, 0xdf, 0xaa, 0x35, 0x1b, 0xe3, 0xef, 0xd5, 0x1b, 0xbb, 0xb4, 0xc2,
+	0x51, 0xa1, 0x95, 0xa5, 0xac, 0x26, 0x86, 0x26, 0x73, 0x56, 0xfc, 0xdc, 0xe2, 0x53, 0x1c, 0x15,
+	0xd3, 0x1d, 0x3e, 0x9d, 0x18, 0x53, 0x85, 0xff, 0xae, 0xde, 0x96, 0x43, 0xd3, 0xc4, 0x51, 0x61,
+	0x9a, 0x3b, 0x86, 0x69, 0x4e, 0x0c, 0xd3, 0x54, 0x9c, 0xcf, 0xc7, 0x6a, 0x31, 0xe3, 0x6f, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0x1f, 0x98, 0x06, 0xeb, 0x4f, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_interest_taxonomy_type.pb.go b/googleapis/ads/googleads/v3/enums/user_interest_taxonomy_type.pb.go
new file mode 100644
index 0000000..d97161c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_interest_taxonomy_type.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_interest_taxonomy_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing the possible UserInterestTaxonomyTypes.
+type UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType int32
+
+const (
+	// Not specified.
+	UserInterestTaxonomyTypeEnum_UNSPECIFIED UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserInterestTaxonomyTypeEnum_UNKNOWN UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 1
+	// The affinity for this user interest.
+	UserInterestTaxonomyTypeEnum_AFFINITY UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 2
+	// The market for this user interest.
+	UserInterestTaxonomyTypeEnum_IN_MARKET UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 3
+	// Users known to have installed applications in the specified categories.
+	UserInterestTaxonomyTypeEnum_MOBILE_APP_INSTALL_USER UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 4
+	// The geographical location of the interest-based vertical.
+	UserInterestTaxonomyTypeEnum_VERTICAL_GEO UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 5
+	// User interest criteria for new smart phone users.
+	UserInterestTaxonomyTypeEnum_NEW_SMART_PHONE_USER UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 6
+)
+
+var UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AFFINITY",
+	3: "IN_MARKET",
+	4: "MOBILE_APP_INSTALL_USER",
+	5: "VERTICAL_GEO",
+	6: "NEW_SMART_PHONE_USER",
+}
+
+var UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_value = map[string]int32{
+	"UNSPECIFIED":             0,
+	"UNKNOWN":                 1,
+	"AFFINITY":                2,
+	"IN_MARKET":               3,
+	"MOBILE_APP_INSTALL_USER": 4,
+	"VERTICAL_GEO":            5,
+	"NEW_SMART_PHONE_USER":    6,
+}
+
+func (x UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType) String() string {
+	return proto.EnumName(UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_name, int32(x))
+}
+
+func (UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_75f124a452fd711d, []int{0, 0}
+}
+
+// Message describing a UserInterestTaxonomyType.
+type UserInterestTaxonomyTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserInterestTaxonomyTypeEnum) Reset()         { *m = UserInterestTaxonomyTypeEnum{} }
+func (m *UserInterestTaxonomyTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*UserInterestTaxonomyTypeEnum) ProtoMessage()    {}
+func (*UserInterestTaxonomyTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_75f124a452fd711d, []int{0}
+}
+
+func (m *UserInterestTaxonomyTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserInterestTaxonomyTypeEnum.Unmarshal(m, b)
+}
+func (m *UserInterestTaxonomyTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserInterestTaxonomyTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *UserInterestTaxonomyTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserInterestTaxonomyTypeEnum.Merge(m, src)
+}
+func (m *UserInterestTaxonomyTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_UserInterestTaxonomyTypeEnum.Size(m)
+}
+func (m *UserInterestTaxonomyTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserInterestTaxonomyTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserInterestTaxonomyTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType", UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_name, UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_value)
+	proto.RegisterType((*UserInterestTaxonomyTypeEnum)(nil), "google.ads.googleads.v3.enums.UserInterestTaxonomyTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_interest_taxonomy_type.proto", fileDescriptor_75f124a452fd711d)
+}
+
+var fileDescriptor_75f124a452fd711d = []byte{
+	// 386 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0x4d, 0x6e, 0xd4, 0x30,
+	0x18, 0x25, 0x29, 0x14, 0x70, 0x8b, 0x88, 0x2c, 0x24, 0x2a, 0xe8, 0x2c, 0xda, 0x03, 0x38, 0x8b,
+	0xec, 0xcc, 0x02, 0x39, 0xc5, 0x33, 0x58, 0xcd, 0x38, 0x51, 0xfe, 0x2a, 0x50, 0x24, 0x2b, 0x10,
+	0x2b, 0x8a, 0xd4, 0xd8, 0x51, 0x9c, 0xa9, 0x98, 0xcb, 0xb0, 0x60, 0xc9, 0x25, 0xd8, 0x73, 0x14,
+	0x96, 0x9c, 0x00, 0x25, 0x99, 0x99, 0xdd, 0xb0, 0xb1, 0x9e, 0xfc, 0x7e, 0x3e, 0xfb, 0x7d, 0xe0,
+	0x7d, 0xad, 0x75, 0x7d, 0x2f, 0xdd, 0xb2, 0x32, 0xee, 0x0c, 0x47, 0xf4, 0xe0, 0xb9, 0x52, 0x6d,
+	0x5a, 0xe3, 0x6e, 0x8c, 0xec, 0x45, 0xa3, 0x06, 0xd9, 0x4b, 0x33, 0x88, 0xa1, 0xfc, 0xa6, 0x95,
+	0x6e, 0xb7, 0x62, 0xd8, 0x76, 0x12, 0x75, 0xbd, 0x1e, 0x34, 0x5c, 0xcc, 0x2e, 0x54, 0x56, 0x06,
+	0x1d, 0x02, 0xd0, 0x83, 0x87, 0xa6, 0x80, 0x37, 0x97, 0xfb, 0xfc, 0xae, 0x71, 0x4b, 0xa5, 0xf4,
+	0x50, 0x0e, 0x8d, 0x56, 0x66, 0x36, 0x5f, 0xff, 0xb2, 0xc0, 0x65, 0x66, 0x64, 0xcf, 0x76, 0x13,
+	0xd2, 0xdd, 0x80, 0x74, 0xdb, 0x49, 0xaa, 0x36, 0xed, 0xf5, 0x77, 0x0b, 0x5c, 0x1c, 0x13, 0xc0,
+	0x97, 0xe0, 0x2c, 0xe3, 0x49, 0x44, 0x6f, 0xd8, 0x92, 0xd1, 0x0f, 0xce, 0x23, 0x78, 0x06, 0x9e,
+	0x66, 0xfc, 0x96, 0x87, 0x77, 0xdc, 0xb1, 0xe0, 0x39, 0x78, 0x46, 0x96, 0x4b, 0xc6, 0x59, 0xfa,
+	0xc9, 0xb1, 0xe1, 0x0b, 0xf0, 0x9c, 0x71, 0xb1, 0x26, 0xf1, 0x2d, 0x4d, 0x9d, 0x13, 0xf8, 0x16,
+	0xbc, 0x5e, 0x87, 0x3e, 0x0b, 0xa8, 0x20, 0x51, 0x24, 0x18, 0x4f, 0x52, 0x12, 0x04, 0x22, 0x4b,
+	0x68, 0xec, 0x3c, 0x86, 0x0e, 0x38, 0xcf, 0x69, 0x9c, 0xb2, 0x1b, 0x12, 0x88, 0x15, 0x0d, 0x9d,
+	0x27, 0xf0, 0x02, 0xbc, 0xe2, 0xf4, 0x4e, 0x24, 0x6b, 0x12, 0xa7, 0x22, 0xfa, 0x18, 0x72, 0x3a,
+	0x6b, 0x4f, 0xfd, 0xbf, 0x16, 0xb8, 0xfa, 0xaa, 0x5b, 0xf4, 0xdf, 0x16, 0xfc, 0xc5, 0xb1, 0x3f,
+	0x44, 0x63, 0x0d, 0x91, 0xf5, 0xd9, 0xdf, 0xf9, 0x6b, 0x7d, 0x5f, 0xaa, 0x1a, 0xe9, 0xbe, 0x76,
+	0x6b, 0xa9, 0xa6, 0x92, 0xf6, 0x6b, 0xe9, 0x1a, 0x73, 0x64, 0x4b, 0xef, 0xa6, 0xf3, 0x87, 0x7d,
+	0xb2, 0x22, 0xe4, 0xa7, 0xbd, 0x58, 0xcd, 0x51, 0xa4, 0x32, 0x68, 0x86, 0x23, 0xca, 0x3d, 0x34,
+	0x16, 0x6a, 0x7e, 0xef, 0xf9, 0x82, 0x54, 0xa6, 0x38, 0xf0, 0x45, 0xee, 0x15, 0x13, 0xff, 0xc7,
+	0xbe, 0x9a, 0x2f, 0x31, 0x26, 0x95, 0xc1, 0xf8, 0xa0, 0xc0, 0x38, 0xf7, 0x30, 0x9e, 0x34, 0x5f,
+	0x4e, 0xa7, 0x87, 0x79, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x9d, 0x9d, 0x43, 0x8f, 0x3d, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_access_status.pb.go b/googleapis/ads/googleads/v3/enums/user_list_access_status.pb.go
new file mode 100644
index 0000000..7e0246f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_access_status.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_access_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing possible user list access statuses.
+type UserListAccessStatusEnum_UserListAccessStatus int32
+
+const (
+	// Not specified.
+	UserListAccessStatusEnum_UNSPECIFIED UserListAccessStatusEnum_UserListAccessStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListAccessStatusEnum_UNKNOWN UserListAccessStatusEnum_UserListAccessStatus = 1
+	// The access is enabled.
+	UserListAccessStatusEnum_ENABLED UserListAccessStatusEnum_UserListAccessStatus = 2
+	// The access is disabled.
+	UserListAccessStatusEnum_DISABLED UserListAccessStatusEnum_UserListAccessStatus = 3
+)
+
+var UserListAccessStatusEnum_UserListAccessStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ENABLED",
+	3: "DISABLED",
+}
+
+var UserListAccessStatusEnum_UserListAccessStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ENABLED":     2,
+	"DISABLED":    3,
+}
+
+func (x UserListAccessStatusEnum_UserListAccessStatus) String() string {
+	return proto.EnumName(UserListAccessStatusEnum_UserListAccessStatus_name, int32(x))
+}
+
+func (UserListAccessStatusEnum_UserListAccessStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c4c9f8c364837617, []int{0, 0}
+}
+
+// Indicates if this client still has access to the list.
+type UserListAccessStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListAccessStatusEnum) Reset()         { *m = UserListAccessStatusEnum{} }
+func (m *UserListAccessStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListAccessStatusEnum) ProtoMessage()    {}
+func (*UserListAccessStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4c9f8c364837617, []int{0}
+}
+
+func (m *UserListAccessStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListAccessStatusEnum.Unmarshal(m, b)
+}
+func (m *UserListAccessStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListAccessStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListAccessStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListAccessStatusEnum.Merge(m, src)
+}
+func (m *UserListAccessStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListAccessStatusEnum.Size(m)
+}
+func (m *UserListAccessStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListAccessStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListAccessStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListAccessStatusEnum_UserListAccessStatus", UserListAccessStatusEnum_UserListAccessStatus_name, UserListAccessStatusEnum_UserListAccessStatus_value)
+	proto.RegisterType((*UserListAccessStatusEnum)(nil), "google.ads.googleads.v3.enums.UserListAccessStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_access_status.proto", fileDescriptor_c4c9f8c364837617)
+}
+
+var fileDescriptor_c4c9f8c364837617 = []byte{
+	// 309 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4a, 0x03, 0x31,
+	0x10, 0xb5, 0x5b, 0x50, 0x49, 0x05, 0xcb, 0xe2, 0x41, 0xc5, 0x1e, 0xda, 0x0f, 0x48, 0x0e, 0xb9,
+	0xa5, 0xa7, 0xac, 0x5d, 0x4b, 0xb1, 0x6c, 0x0b, 0xa5, 0x15, 0x64, 0xa1, 0xc4, 0x6e, 0x08, 0x8b,
+	0x6d, 0x52, 0x76, 0xb2, 0xfd, 0x20, 0x8f, 0x7e, 0x8a, 0x9f, 0xe2, 0xc1, 0x6f, 0x90, 0x4d, 0xba,
+	0x7b, 0xaa, 0x5e, 0xc2, 0x9b, 0xbc, 0x79, 0x6f, 0xde, 0x0c, 0x1a, 0x2a, 0x63, 0xd4, 0x56, 0x12,
+	0x91, 0x01, 0xf1, 0xb0, 0x42, 0x07, 0x4a, 0xa4, 0x2e, 0x77, 0x40, 0x4a, 0x90, 0xc5, 0x7a, 0x9b,
+	0x83, 0x5d, 0x8b, 0xcd, 0x46, 0x02, 0xac, 0xc1, 0x0a, 0x5b, 0x02, 0xde, 0x17, 0xc6, 0x9a, 0xb0,
+	0xe7, 0x15, 0x58, 0x64, 0x80, 0x1b, 0x31, 0x3e, 0x50, 0xec, 0xc4, 0xf7, 0x0f, 0xb5, 0xf7, 0x3e,
+	0x27, 0x42, 0x6b, 0x63, 0x85, 0xcd, 0x8d, 0x3e, 0x8a, 0x07, 0xef, 0xe8, 0x76, 0x09, 0xb2, 0x98,
+	0xe6, 0x60, 0xb9, 0xf3, 0x5e, 0x38, 0xeb, 0x58, 0x97, 0xbb, 0xc1, 0x0c, 0xdd, 0x9c, 0xe2, 0xc2,
+	0x6b, 0xd4, 0x59, 0x26, 0x8b, 0x79, 0xfc, 0x38, 0x79, 0x9a, 0xc4, 0xa3, 0xee, 0x59, 0xd8, 0x41,
+	0x17, 0xcb, 0xe4, 0x39, 0x99, 0xbd, 0x24, 0xdd, 0x56, 0x55, 0xc4, 0x09, 0x8f, 0xa6, 0xf1, 0xa8,
+	0x1b, 0x84, 0x57, 0xe8, 0x72, 0x34, 0x59, 0xf8, 0xaa, 0x1d, 0xfd, 0xb4, 0x50, 0x7f, 0x63, 0x76,
+	0xf8, 0xdf, 0xc0, 0xd1, 0xdd, 0xa9, 0xa1, 0xf3, 0x2a, 0xed, 0xbc, 0xf5, 0x1a, 0x1d, 0xb5, 0xca,
+	0x6c, 0x85, 0x56, 0xd8, 0x14, 0x8a, 0x28, 0xa9, 0xdd, 0x2e, 0xf5, 0xe5, 0xf6, 0x39, 0xfc, 0x71,
+	0xc8, 0xa1, 0x7b, 0x3f, 0x82, 0xf6, 0x98, 0xf3, 0xcf, 0xa0, 0x37, 0xf6, 0x56, 0x3c, 0x03, 0xec,
+	0x61, 0x85, 0x56, 0x14, 0x57, 0xcb, 0xc3, 0x57, 0xcd, 0xa7, 0x3c, 0x83, 0xb4, 0xe1, 0xd3, 0x15,
+	0x4d, 0x1d, 0xff, 0x1d, 0xf4, 0xfd, 0x27, 0x63, 0x3c, 0x03, 0xc6, 0x9a, 0x0e, 0xc6, 0x56, 0x94,
+	0x31, 0xd7, 0xf3, 0x76, 0xee, 0x82, 0xd1, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x20, 0xb6,
+	0xbb, 0xe0, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_closing_reason.pb.go b/googleapis/ads/googleads/v3/enums/user_list_closing_reason.pb.go
new file mode 100644
index 0000000..f7982c6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_closing_reason.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_closing_reason.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list closing reasons.
+type UserListClosingReasonEnum_UserListClosingReason int32
+
+const (
+	// Not specified.
+	UserListClosingReasonEnum_UNSPECIFIED UserListClosingReasonEnum_UserListClosingReason = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListClosingReasonEnum_UNKNOWN UserListClosingReasonEnum_UserListClosingReason = 1
+	// The userlist was closed because of not being used for over one year.
+	UserListClosingReasonEnum_UNUSED UserListClosingReasonEnum_UserListClosingReason = 2
+)
+
+var UserListClosingReasonEnum_UserListClosingReason_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "UNUSED",
+}
+
+var UserListClosingReasonEnum_UserListClosingReason_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"UNUSED":      2,
+}
+
+func (x UserListClosingReasonEnum_UserListClosingReason) String() string {
+	return proto.EnumName(UserListClosingReasonEnum_UserListClosingReason_name, int32(x))
+}
+
+func (UserListClosingReasonEnum_UserListClosingReason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_77005016633d6157, []int{0, 0}
+}
+
+// Indicates the reason why the userlist was closed.
+// This enum is only used when a list is auto-closed by the system.
+type UserListClosingReasonEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListClosingReasonEnum) Reset()         { *m = UserListClosingReasonEnum{} }
+func (m *UserListClosingReasonEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListClosingReasonEnum) ProtoMessage()    {}
+func (*UserListClosingReasonEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_77005016633d6157, []int{0}
+}
+
+func (m *UserListClosingReasonEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListClosingReasonEnum.Unmarshal(m, b)
+}
+func (m *UserListClosingReasonEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListClosingReasonEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListClosingReasonEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListClosingReasonEnum.Merge(m, src)
+}
+func (m *UserListClosingReasonEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListClosingReasonEnum.Size(m)
+}
+func (m *UserListClosingReasonEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListClosingReasonEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListClosingReasonEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListClosingReasonEnum_UserListClosingReason", UserListClosingReasonEnum_UserListClosingReason_name, UserListClosingReasonEnum_UserListClosingReason_value)
+	proto.RegisterType((*UserListClosingReasonEnum)(nil), "google.ads.googleads.v3.enums.UserListClosingReasonEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_closing_reason.proto", fileDescriptor_77005016633d6157)
+}
+
+var fileDescriptor_77005016633d6157 = []byte{
+	// 304 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4b, 0xfb, 0x30,
+	0x18, 0xc6, 0xff, 0xeb, 0x1f, 0x26, 0x64, 0x07, 0x47, 0xc1, 0x83, 0xc3, 0x1d, 0xb6, 0x0f, 0x90,
+	0x1c, 0x72, 0x8b, 0x5e, 0xb2, 0xad, 0x8e, 0xa1, 0xd4, 0xe1, 0xe8, 0x04, 0x29, 0x8e, 0xb8, 0x86,
+	0x10, 0xe8, 0x92, 0xd2, 0xb7, 0xdd, 0x07, 0xf2, 0xe8, 0x47, 0xf1, 0xa3, 0x78, 0xf1, 0x2b, 0x48,
+	0x13, 0xdb, 0xd3, 0xf4, 0x12, 0x1e, 0xf2, 0xbc, 0xbf, 0x27, 0x4f, 0x5e, 0x74, 0xa3, 0xac, 0x55,
+	0xb9, 0x24, 0x22, 0x03, 0xe2, 0x65, 0xa3, 0x8e, 0x94, 0x48, 0x53, 0x1f, 0x80, 0xd4, 0x20, 0xcb,
+	0x5d, 0xae, 0xa1, 0xda, 0xed, 0x73, 0x0b, 0xda, 0xa8, 0x5d, 0x29, 0x05, 0x58, 0x83, 0x8b, 0xd2,
+	0x56, 0x36, 0x1c, 0x7b, 0x04, 0x8b, 0x0c, 0x70, 0x47, 0xe3, 0x23, 0xc5, 0x8e, 0x1e, 0x5d, 0xb5,
+	0xe1, 0x85, 0x26, 0xc2, 0x18, 0x5b, 0x89, 0x4a, 0x5b, 0x03, 0x1e, 0x9e, 0xbe, 0xa0, 0xcb, 0x04,
+	0x64, 0x79, 0xaf, 0xa1, 0x9a, 0xfb, 0xf0, 0x47, 0x97, 0x1d, 0x99, 0xfa, 0x30, 0xe5, 0xe8, 0xe2,
+	0xa4, 0x19, 0x9e, 0xa3, 0x41, 0x12, 0x6f, 0xd6, 0xd1, 0x7c, 0x75, 0xbb, 0x8a, 0x16, 0xc3, 0x7f,
+	0xe1, 0x00, 0x9d, 0x25, 0xf1, 0x5d, 0xfc, 0xf0, 0x14, 0x0f, 0x7b, 0x21, 0x42, 0xfd, 0x24, 0x4e,
+	0x36, 0xd1, 0x62, 0x18, 0xcc, 0xbe, 0x7a, 0x68, 0xb2, 0xb7, 0x07, 0xfc, 0x67, 0xc7, 0xd9, 0xe8,
+	0xe4, 0x33, 0xeb, 0xa6, 0xe1, 0xba, 0xf7, 0x3c, 0xfb, 0x81, 0x95, 0xcd, 0x85, 0x51, 0xd8, 0x96,
+	0x8a, 0x28, 0x69, 0x5c, 0xff, 0x76, 0x5d, 0x85, 0x86, 0x5f, 0xb6, 0x77, 0xed, 0xce, 0xb7, 0xe0,
+	0xff, 0x92, 0xf3, 0xf7, 0x60, 0xbc, 0xf4, 0x51, 0x3c, 0x03, 0xec, 0x65, 0xa3, 0xb6, 0x14, 0x37,
+	0xff, 0x85, 0x8f, 0xd6, 0x4f, 0x79, 0x06, 0x69, 0xe7, 0xa7, 0x5b, 0x9a, 0x3a, 0xff, 0x33, 0x98,
+	0xf8, 0x4b, 0xc6, 0x78, 0x06, 0x8c, 0x75, 0x13, 0x8c, 0x6d, 0x29, 0x63, 0x6e, 0xe6, 0xb5, 0xef,
+	0x8a, 0xd1, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc9, 0xb3, 0xf1, 0x36, 0xd5, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_combined_rule_operator.pb.go b/googleapis/ads/googleads/v3/enums/user_list_combined_rule_operator.pb.go
new file mode 100644
index 0000000..cab11cb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_combined_rule_operator.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_combined_rule_operator.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list combined rule operators.
+type UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator int32
+
+const (
+	// Not specified.
+	UserListCombinedRuleOperatorEnum_UNSPECIFIED UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListCombinedRuleOperatorEnum_UNKNOWN UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator = 1
+	// A AND B.
+	UserListCombinedRuleOperatorEnum_AND UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator = 2
+	// A AND NOT B.
+	UserListCombinedRuleOperatorEnum_AND_NOT UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator = 3
+)
+
+var UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AND",
+	3: "AND_NOT",
+}
+
+var UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"AND":         2,
+	"AND_NOT":     3,
+}
+
+func (x UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator) String() string {
+	return proto.EnumName(UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_name, int32(x))
+}
+
+func (UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a88176faa8d2b974, []int{0, 0}
+}
+
+// Logical operator connecting two rules.
+type UserListCombinedRuleOperatorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListCombinedRuleOperatorEnum) Reset()         { *m = UserListCombinedRuleOperatorEnum{} }
+func (m *UserListCombinedRuleOperatorEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListCombinedRuleOperatorEnum) ProtoMessage()    {}
+func (*UserListCombinedRuleOperatorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a88176faa8d2b974, []int{0}
+}
+
+func (m *UserListCombinedRuleOperatorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListCombinedRuleOperatorEnum.Unmarshal(m, b)
+}
+func (m *UserListCombinedRuleOperatorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListCombinedRuleOperatorEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListCombinedRuleOperatorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListCombinedRuleOperatorEnum.Merge(m, src)
+}
+func (m *UserListCombinedRuleOperatorEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListCombinedRuleOperatorEnum.Size(m)
+}
+func (m *UserListCombinedRuleOperatorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListCombinedRuleOperatorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListCombinedRuleOperatorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator", UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_name, UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_value)
+	proto.RegisterType((*UserListCombinedRuleOperatorEnum)(nil), "google.ads.googleads.v3.enums.UserListCombinedRuleOperatorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_combined_rule_operator.proto", fileDescriptor_a88176faa8d2b974)
+}
+
+var fileDescriptor_a88176faa8d2b974 = []byte{
+	// 317 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x6a, 0xc2, 0x40,
+	0x14, 0xac, 0x11, 0x2a, 0xac, 0x87, 0x86, 0x1c, 0x8b, 0x42, 0xf5, 0x03, 0x36, 0x87, 0xdc, 0xb6,
+	0xa7, 0xd5, 0x58, 0x91, 0x96, 0x55, 0x6c, 0xb5, 0x50, 0x02, 0x21, 0x9a, 0x25, 0x04, 0x92, 0x7d,
+	0x61, 0x5f, 0xe2, 0x07, 0xf5, 0xd8, 0x4f, 0xe9, 0xa7, 0xf4, 0x03, 0x7a, 0x2e, 0xd9, 0x55, 0x6f,
+	0xcd, 0x65, 0x19, 0x76, 0xe6, 0xcd, 0xbc, 0x37, 0x24, 0xcc, 0x00, 0xb2, 0x42, 0xfa, 0x49, 0x8a,
+	0xbe, 0x85, 0x2d, 0x3a, 0x05, 0xbe, 0x54, 0x4d, 0x89, 0x7e, 0x83, 0x52, 0xc7, 0x45, 0x8e, 0x75,
+	0x7c, 0x84, 0xf2, 0x90, 0x2b, 0x99, 0xc6, 0xba, 0x29, 0x64, 0x0c, 0x95, 0xd4, 0x49, 0x0d, 0x9a,
+	0x56, 0x1a, 0x6a, 0xf0, 0xc6, 0x76, 0x94, 0x26, 0x29, 0xd2, 0xab, 0x0b, 0x3d, 0x05, 0xd4, 0xb8,
+	0xdc, 0x8f, 0x2e, 0x21, 0x55, 0xee, 0x27, 0x4a, 0x41, 0x9d, 0xd4, 0x39, 0x28, 0xb4, 0xc3, 0xd3,
+	0x13, 0x79, 0xd8, 0xa1, 0xd4, 0x2f, 0x39, 0xd6, 0xf3, 0x73, 0xc8, 0xb6, 0x29, 0xe4, 0xfa, 0x1c,
+	0xb1, 0x50, 0x4d, 0x39, 0xdd, 0x92, 0x51, 0x97, 0xc6, 0xbb, 0x23, 0xc3, 0x9d, 0x78, 0xdd, 0x2c,
+	0xe6, 0xab, 0xa7, 0xd5, 0x22, 0x74, 0x6f, 0xbc, 0x21, 0x19, 0xec, 0xc4, 0xb3, 0x58, 0xbf, 0x0b,
+	0xb7, 0xe7, 0x0d, 0x48, 0x9f, 0x8b, 0xd0, 0x75, 0xda, 0x5f, 0x2e, 0xc2, 0x58, 0xac, 0xdf, 0xdc,
+	0xfe, 0xec, 0xb7, 0x47, 0x26, 0x47, 0x28, 0x69, 0xe7, 0xee, 0xb3, 0x49, 0x57, 0xee, 0xa6, 0x3d,
+	0x60, 0xd3, 0xfb, 0x98, 0x9d, 0x3d, 0x32, 0x28, 0x12, 0x95, 0x51, 0xd0, 0x99, 0x9f, 0x49, 0x65,
+	0xce, 0xbb, 0xb4, 0x5a, 0xe5, 0xf8, 0x4f, 0xc9, 0x8f, 0xe6, 0xfd, 0x74, 0xfa, 0x4b, 0xce, 0xbf,
+	0x9c, 0xf1, 0xd2, 0x5a, 0xf1, 0x14, 0xa9, 0x85, 0x2d, 0xda, 0x07, 0xb4, 0xed, 0x01, 0xbf, 0x2f,
+	0x7c, 0xc4, 0x53, 0x8c, 0xae, 0x7c, 0xb4, 0x0f, 0x22, 0xc3, 0xff, 0x38, 0x13, 0xfb, 0xc9, 0x18,
+	0x4f, 0x91, 0xb1, 0xab, 0x82, 0xb1, 0x7d, 0xc0, 0x98, 0xd1, 0x1c, 0x6e, 0xcd, 0x62, 0xc1, 0x5f,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0x54, 0x69, 0x22, 0x93, 0xfc, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_crm_data_source_type.pb.go b/googleapis/ads/googleads/v3/enums/user_list_crm_data_source_type.pb.go
new file mode 100644
index 0000000..aa32f94
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_crm_data_source_type.pb.go
@@ -0,0 +1,131 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_crm_data_source_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list crm data source type.
+type UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType int32
+
+const (
+	// Not specified.
+	UserListCrmDataSourceTypeEnum_UNSPECIFIED UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListCrmDataSourceTypeEnum_UNKNOWN UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 1
+	// The uploaded data is first-party data.
+	UserListCrmDataSourceTypeEnum_FIRST_PARTY UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 2
+	// The uploaded data is from a third-party credit bureau.
+	UserListCrmDataSourceTypeEnum_THIRD_PARTY_CREDIT_BUREAU UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 3
+	// The uploaded data is from a third-party voter file.
+	UserListCrmDataSourceTypeEnum_THIRD_PARTY_VOTER_FILE UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 4
+)
+
+var UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "FIRST_PARTY",
+	3: "THIRD_PARTY_CREDIT_BUREAU",
+	4: "THIRD_PARTY_VOTER_FILE",
+}
+
+var UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_value = map[string]int32{
+	"UNSPECIFIED":               0,
+	"UNKNOWN":                   1,
+	"FIRST_PARTY":               2,
+	"THIRD_PARTY_CREDIT_BUREAU": 3,
+	"THIRD_PARTY_VOTER_FILE":    4,
+}
+
+func (x UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType) String() string {
+	return proto.EnumName(UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_name, int32(x))
+}
+
+func (UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_de5941dcc9ec4be9, []int{0, 0}
+}
+
+// Indicates source of Crm upload data.
+type UserListCrmDataSourceTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListCrmDataSourceTypeEnum) Reset()         { *m = UserListCrmDataSourceTypeEnum{} }
+func (m *UserListCrmDataSourceTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListCrmDataSourceTypeEnum) ProtoMessage()    {}
+func (*UserListCrmDataSourceTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_de5941dcc9ec4be9, []int{0}
+}
+
+func (m *UserListCrmDataSourceTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListCrmDataSourceTypeEnum.Unmarshal(m, b)
+}
+func (m *UserListCrmDataSourceTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListCrmDataSourceTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListCrmDataSourceTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListCrmDataSourceTypeEnum.Merge(m, src)
+}
+func (m *UserListCrmDataSourceTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListCrmDataSourceTypeEnum.Size(m)
+}
+func (m *UserListCrmDataSourceTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListCrmDataSourceTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListCrmDataSourceTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType", UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_name, UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_value)
+	proto.RegisterType((*UserListCrmDataSourceTypeEnum)(nil), "google.ads.googleads.v3.enums.UserListCrmDataSourceTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_crm_data_source_type.proto", fileDescriptor_de5941dcc9ec4be9)
+}
+
+var fileDescriptor_de5941dcc9ec4be9 = []byte{
+	// 360 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0x41, 0x6a, 0x83, 0x40,
+	0x14, 0xad, 0xa6, 0xb4, 0x30, 0x59, 0x54, 0x5c, 0x14, 0x12, 0x6a, 0x21, 0x39, 0xc0, 0xb8, 0x70,
+	0x37, 0x5d, 0x69, 0x34, 0xa9, 0x34, 0x18, 0x31, 0x6a, 0x69, 0x11, 0x86, 0x69, 0x1c, 0x44, 0x88,
+	0x8e, 0x38, 0x63, 0x20, 0x07, 0xe8, 0x45, 0xba, 0x29, 0xf4, 0x28, 0x3d, 0x4a, 0xb7, 0xbd, 0x40,
+	0x51, 0x9b, 0xd0, 0x4d, 0xba, 0x19, 0x1e, 0xf3, 0xde, 0x7f, 0xff, 0xff, 0xf7, 0x81, 0x95, 0x31,
+	0x96, 0x6d, 0xa9, 0x4e, 0x52, 0xae, 0xf7, 0xb0, 0x45, 0x3b, 0x43, 0xa7, 0x65, 0x53, 0x70, 0xbd,
+	0xe1, 0xb4, 0xc6, 0xdb, 0x9c, 0x0b, 0xbc, 0xa9, 0x0b, 0x9c, 0x12, 0x41, 0x30, 0x67, 0x4d, 0xbd,
+	0xa1, 0x58, 0xec, 0x2b, 0x0a, 0xab, 0x9a, 0x09, 0xa6, 0x6a, 0x7d, 0x21, 0x24, 0x29, 0x87, 0x47,
+	0x0f, 0xb8, 0x33, 0x60, 0xe7, 0x31, 0xbe, 0x39, 0xb4, 0xa8, 0x72, 0x9d, 0x94, 0x25, 0x13, 0x44,
+	0xe4, 0xac, 0xe4, 0x7d, 0xf1, 0xf4, 0x5d, 0x02, 0x5a, 0xc4, 0x69, 0xbd, 0xcc, 0xb9, 0x98, 0xd5,
+	0x85, 0x4d, 0x04, 0x59, 0x77, 0x1d, 0xc2, 0x7d, 0x45, 0x9d, 0xb2, 0x29, 0xa6, 0xaf, 0x12, 0x18,
+	0x9d, 0x54, 0xa8, 0x57, 0x60, 0x18, 0x79, 0x6b, 0xdf, 0x99, 0xb9, 0x73, 0xd7, 0xb1, 0x95, 0x33,
+	0x75, 0x08, 0x2e, 0x23, 0xef, 0xc1, 0x5b, 0x3d, 0x7a, 0x8a, 0xd4, 0xb2, 0x73, 0x37, 0x58, 0x87,
+	0xd8, 0x37, 0x83, 0xf0, 0x49, 0x91, 0x55, 0x0d, 0x8c, 0xc2, 0x7b, 0x37, 0xb0, 0xfb, 0x0f, 0x3c,
+	0x0b, 0x1c, 0xdb, 0x0d, 0xb1, 0x15, 0x05, 0x8e, 0x19, 0x29, 0x03, 0x75, 0x0c, 0xae, 0xff, 0xd2,
+	0xf1, 0x2a, 0x74, 0x02, 0x3c, 0x77, 0x97, 0x8e, 0x72, 0x6e, 0x7d, 0x4b, 0x60, 0xb2, 0x61, 0x05,
+	0xfc, 0x77, 0x5b, 0xeb, 0xf6, 0xe4, 0xa8, 0x7e, 0xbb, 0xaf, 0x2f, 0x3d, 0xff, 0x46, 0x0e, 0x33,
+	0xb6, 0x25, 0x65, 0x06, 0x59, 0x9d, 0xe9, 0x19, 0x2d, 0xbb, 0x34, 0x0e, 0x27, 0xa8, 0x72, 0x7e,
+	0xe2, 0x22, 0x77, 0xdd, 0xfb, 0x26, 0x0f, 0x16, 0xa6, 0xf9, 0x21, 0x6b, 0x8b, 0xde, 0xca, 0x4c,
+	0x39, 0xec, 0x61, 0x8b, 0x62, 0x03, 0xb6, 0xc1, 0xf1, 0xcf, 0x03, 0x9f, 0x98, 0x29, 0x4f, 0x8e,
+	0x7c, 0x12, 0x1b, 0x49, 0xc7, 0x7f, 0xc9, 0x93, 0xfe, 0x13, 0x21, 0x33, 0xe5, 0x08, 0x1d, 0x15,
+	0x08, 0xc5, 0x06, 0x42, 0x9d, 0xe6, 0xe5, 0xa2, 0x1b, 0xcc, 0xf8, 0x09, 0x00, 0x00, 0xff, 0xff,
+	0xd1, 0x50, 0xda, 0x2a, 0x29, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_date_rule_item_operator.pb.go b/googleapis/ads/googleads/v3/enums/user_list_date_rule_item_operator.pb.go
new file mode 100644
index 0000000..506c043
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_date_rule_item_operator.pb.go
@@ -0,0 +1,134 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_date_rule_item_operator.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list date rule item operators.
+type UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator int32
+
+const (
+	// Not specified.
+	UserListDateRuleItemOperatorEnum_UNSPECIFIED UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListDateRuleItemOperatorEnum_UNKNOWN UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 1
+	// Equals.
+	UserListDateRuleItemOperatorEnum_EQUALS UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 2
+	// Not Equals.
+	UserListDateRuleItemOperatorEnum_NOT_EQUALS UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 3
+	// Before.
+	UserListDateRuleItemOperatorEnum_BEFORE UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 4
+	// After.
+	UserListDateRuleItemOperatorEnum_AFTER UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 5
+)
+
+var UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "EQUALS",
+	3: "NOT_EQUALS",
+	4: "BEFORE",
+	5: "AFTER",
+}
+
+var UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"EQUALS":      2,
+	"NOT_EQUALS":  3,
+	"BEFORE":      4,
+	"AFTER":       5,
+}
+
+func (x UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator) String() string {
+	return proto.EnumName(UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_name, int32(x))
+}
+
+func (UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_37e7b607763ee2a2, []int{0, 0}
+}
+
+// Supported rule operator for date type.
+type UserListDateRuleItemOperatorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListDateRuleItemOperatorEnum) Reset()         { *m = UserListDateRuleItemOperatorEnum{} }
+func (m *UserListDateRuleItemOperatorEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListDateRuleItemOperatorEnum) ProtoMessage()    {}
+func (*UserListDateRuleItemOperatorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37e7b607763ee2a2, []int{0}
+}
+
+func (m *UserListDateRuleItemOperatorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListDateRuleItemOperatorEnum.Unmarshal(m, b)
+}
+func (m *UserListDateRuleItemOperatorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListDateRuleItemOperatorEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListDateRuleItemOperatorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListDateRuleItemOperatorEnum.Merge(m, src)
+}
+func (m *UserListDateRuleItemOperatorEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListDateRuleItemOperatorEnum.Size(m)
+}
+func (m *UserListDateRuleItemOperatorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListDateRuleItemOperatorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListDateRuleItemOperatorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator", UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_name, UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_value)
+	proto.RegisterType((*UserListDateRuleItemOperatorEnum)(nil), "google.ads.googleads.v3.enums.UserListDateRuleItemOperatorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_date_rule_item_operator.proto", fileDescriptor_37e7b607763ee2a2)
+}
+
+var fileDescriptor_37e7b607763ee2a2 = []byte{
+	// 344 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xd1, 0x4e, 0x83, 0x30,
+	0x14, 0x15, 0xe6, 0x66, 0xec, 0x12, 0x25, 0x3c, 0x9a, 0x2d, 0x71, 0xfb, 0x80, 0xf2, 0xc0, 0x5b,
+	0x7d, 0x2a, 0xae, 0x5b, 0x16, 0x17, 0x98, 0xdb, 0x98, 0x89, 0x21, 0x21, 0x55, 0x1a, 0x42, 0x02,
+	0x2d, 0x69, 0xcb, 0x7e, 0xc4, 0x3f, 0xf0, 0xd1, 0x4f, 0xf1, 0x53, 0xfc, 0x00, 0x9f, 0x0d, 0xb0,
+	0xed, 0x4d, 0x5e, 0x9a, 0xd3, 0x9e, 0x73, 0xcf, 0xbd, 0xe7, 0x16, 0x90, 0x54, 0x88, 0x34, 0x67,
+	0x0e, 0x4d, 0x94, 0xd3, 0xc2, 0x1a, 0x1d, 0x5c, 0x87, 0xf1, 0xaa, 0x50, 0x4e, 0xa5, 0x98, 0x8c,
+	0xf3, 0x4c, 0xe9, 0x38, 0xa1, 0x9a, 0xc5, 0xb2, 0xca, 0x59, 0x9c, 0x69, 0x56, 0xc4, 0xa2, 0x64,
+	0x92, 0x6a, 0x21, 0x61, 0x29, 0x85, 0x16, 0xf6, 0xb8, 0xad, 0x85, 0x34, 0x51, 0xf0, 0x6c, 0x03,
+	0x0f, 0x2e, 0x6c, 0x6c, 0xee, 0x46, 0xa7, 0x2e, 0x65, 0xe6, 0x50, 0xce, 0x85, 0xa6, 0x3a, 0x13,
+	0x5c, 0xb5, 0xc5, 0xd3, 0x0f, 0x03, 0xdc, 0x87, 0x8a, 0xc9, 0x55, 0xa6, 0xf4, 0x8c, 0x6a, 0xb6,
+	0xa9, 0x72, 0xb6, 0xd4, 0xac, 0x08, 0x8e, 0x3d, 0x08, 0xaf, 0x8a, 0xa9, 0x00, 0xa3, 0x2e, 0x8d,
+	0x7d, 0x0b, 0x86, 0xa1, 0xbf, 0x5d, 0x93, 0xc7, 0xe5, 0x7c, 0x49, 0x66, 0xd6, 0x85, 0x3d, 0x04,
+	0x57, 0xa1, 0xff, 0xe4, 0x07, 0x2f, 0xbe, 0x65, 0xd8, 0x00, 0x0c, 0xc8, 0x73, 0x88, 0x57, 0x5b,
+	0xcb, 0xb4, 0x6f, 0x00, 0xf0, 0x83, 0x5d, 0x7c, 0xbc, 0xf7, 0x6a, 0xce, 0x23, 0xf3, 0x60, 0x43,
+	0xac, 0x4b, 0xfb, 0x1a, 0xf4, 0xf1, 0x7c, 0x47, 0x36, 0x56, 0xdf, 0xfb, 0x35, 0xc0, 0xe4, 0x5d,
+	0x14, 0xb0, 0x33, 0x99, 0x37, 0xe9, 0x1a, 0x6a, 0x5d, 0xc7, 0x5b, 0x1b, 0xaf, 0xde, 0xd1, 0x23,
+	0x15, 0x39, 0xe5, 0x29, 0x14, 0x32, 0x75, 0x52, 0xc6, 0x9b, 0xf0, 0xa7, 0xa5, 0x97, 0x99, 0xfa,
+	0xe7, 0x0f, 0x1e, 0x9a, 0xf3, 0xd3, 0xec, 0x2d, 0x30, 0xfe, 0x32, 0xc7, 0x8b, 0xd6, 0x0a, 0x27,
+	0x0a, 0xb6, 0xb0, 0x46, 0x7b, 0x17, 0xd6, 0x4b, 0x52, 0xdf, 0x27, 0x3e, 0xc2, 0x89, 0x8a, 0xce,
+	0x7c, 0xb4, 0x77, 0xa3, 0x86, 0xff, 0x31, 0x27, 0xed, 0x23, 0x42, 0x38, 0x51, 0x08, 0x9d, 0x15,
+	0x08, 0xed, 0x5d, 0x84, 0x1a, 0xcd, 0xdb, 0xa0, 0x19, 0xcc, 0xfd, 0x0b, 0x00, 0x00, 0xff, 0xff,
+	0xee, 0x52, 0xc4, 0xc4, 0x1b, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_logical_rule_operator.pb.go b/googleapis/ads/googleads/v3/enums/user_list_logical_rule_operator.pb.go
new file mode 100644
index 0000000..4d08cea
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_logical_rule_operator.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_logical_rule_operator.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list logical rule operators.
+type UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator int32
+
+const (
+	// Not specified.
+	UserListLogicalRuleOperatorEnum_UNSPECIFIED UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListLogicalRuleOperatorEnum_UNKNOWN UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator = 1
+	// And - all of the operands.
+	UserListLogicalRuleOperatorEnum_ALL UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator = 2
+	// Or - at least one of the operands.
+	UserListLogicalRuleOperatorEnum_ANY UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator = 3
+	// Not - none of the operands.
+	UserListLogicalRuleOperatorEnum_NONE UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator = 4
+)
+
+var UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ALL",
+	3: "ANY",
+	4: "NONE",
+}
+
+var UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ALL":         2,
+	"ANY":         3,
+	"NONE":        4,
+}
+
+func (x UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator) String() string {
+	return proto.EnumName(UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator_name, int32(x))
+}
+
+func (UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1f4edaf0f110fb85, []int{0, 0}
+}
+
+// The logical operator of the rule.
+type UserListLogicalRuleOperatorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListLogicalRuleOperatorEnum) Reset()         { *m = UserListLogicalRuleOperatorEnum{} }
+func (m *UserListLogicalRuleOperatorEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListLogicalRuleOperatorEnum) ProtoMessage()    {}
+func (*UserListLogicalRuleOperatorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1f4edaf0f110fb85, []int{0}
+}
+
+func (m *UserListLogicalRuleOperatorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListLogicalRuleOperatorEnum.Unmarshal(m, b)
+}
+func (m *UserListLogicalRuleOperatorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListLogicalRuleOperatorEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListLogicalRuleOperatorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListLogicalRuleOperatorEnum.Merge(m, src)
+}
+func (m *UserListLogicalRuleOperatorEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListLogicalRuleOperatorEnum.Size(m)
+}
+func (m *UserListLogicalRuleOperatorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListLogicalRuleOperatorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListLogicalRuleOperatorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator", UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator_name, UserListLogicalRuleOperatorEnum_UserListLogicalRuleOperator_value)
+	proto.RegisterType((*UserListLogicalRuleOperatorEnum)(nil), "google.ads.googleads.v3.enums.UserListLogicalRuleOperatorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_logical_rule_operator.proto", fileDescriptor_1f4edaf0f110fb85)
+}
+
+var fileDescriptor_1f4edaf0f110fb85 = []byte{
+	// 323 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xb1, 0x6e, 0xea, 0x30,
+	0x14, 0x7d, 0x04, 0xf4, 0x78, 0x32, 0xc3, 0x8b, 0x32, 0xb6, 0x45, 0x2d, 0x7c, 0x80, 0x33, 0x64,
+	0x73, 0xa7, 0x40, 0x53, 0x84, 0x1a, 0x19, 0xd4, 0x0a, 0x50, 0xab, 0x48, 0x91, 0x4b, 0x2c, 0x2b,
+	0x92, 0xb1, 0x23, 0xdf, 0x84, 0xa1, 0x9f, 0xd3, 0xb1, 0x9f, 0xd2, 0x4f, 0xe9, 0xde, 0xbd, 0x8a,
+	0x0d, 0x6c, 0x65, 0xb1, 0x8e, 0x7c, 0xce, 0x3d, 0xe7, 0xde, 0x83, 0xa6, 0x42, 0x6b, 0x21, 0x79,
+	0xc8, 0x0a, 0x08, 0x1d, 0x6c, 0xd1, 0x3e, 0x0a, 0xb9, 0x6a, 0x76, 0x10, 0x36, 0xc0, 0x4d, 0x2e,
+	0x4b, 0xa8, 0x73, 0xa9, 0x45, 0xb9, 0x65, 0x32, 0x37, 0x8d, 0xe4, 0xb9, 0xae, 0xb8, 0x61, 0xb5,
+	0x36, 0xb8, 0x32, 0xba, 0xd6, 0xc1, 0xd0, 0x4d, 0x62, 0x56, 0x00, 0x3e, 0x99, 0xe0, 0x7d, 0x84,
+	0xad, 0xc9, 0xc5, 0xd5, 0x31, 0xa3, 0x2a, 0x43, 0xa6, 0x94, 0xae, 0x59, 0x5d, 0x6a, 0x05, 0x6e,
+	0x78, 0xfc, 0x86, 0xae, 0x57, 0xc0, 0x4d, 0x5a, 0x42, 0x9d, 0xba, 0x8c, 0xc7, 0x46, 0xf2, 0xc5,
+	0x21, 0x21, 0x51, 0xcd, 0x6e, 0xbc, 0x41, 0x97, 0x67, 0x24, 0xc1, 0x7f, 0x34, 0x58, 0xd1, 0xa7,
+	0x65, 0x32, 0x9d, 0xdf, 0xcf, 0x93, 0x3b, 0xff, 0x4f, 0x30, 0x40, 0xfd, 0x15, 0x7d, 0xa0, 0x8b,
+	0x0d, 0xf5, 0x3b, 0x41, 0x1f, 0x75, 0xe3, 0x34, 0xf5, 0x3d, 0x0b, 0xe8, 0xb3, 0xdf, 0x0d, 0xfe,
+	0xa1, 0x1e, 0x5d, 0xd0, 0xc4, 0xef, 0x4d, 0xbe, 0x3b, 0x68, 0xb4, 0xd5, 0x3b, 0x7c, 0x76, 0xff,
+	0xc9, 0xcd, 0x99, 0xf0, 0x65, 0x7b, 0xc3, 0xb2, 0xf3, 0x32, 0x39, 0x58, 0x08, 0x2d, 0x99, 0x12,
+	0x58, 0x1b, 0x11, 0x0a, 0xae, 0xec, 0x85, 0xc7, 0x5e, 0xab, 0x12, 0x7e, 0xa9, 0xf9, 0xd6, 0xbe,
+	0xef, 0x5e, 0x77, 0x16, 0xc7, 0x1f, 0xde, 0x70, 0xe6, 0xac, 0xe2, 0x02, 0xb0, 0x83, 0x2d, 0x5a,
+	0x47, 0xb8, 0xed, 0x02, 0x3e, 0x8f, 0x7c, 0x16, 0x17, 0x90, 0x9d, 0xf8, 0x6c, 0x1d, 0x65, 0x96,
+	0xff, 0xf2, 0x46, 0xee, 0x93, 0x90, 0xb8, 0x00, 0x42, 0x4e, 0x0a, 0x42, 0xd6, 0x11, 0x21, 0x56,
+	0xf3, 0xfa, 0xd7, 0x2e, 0x16, 0xfd, 0x04, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xcd, 0xbb, 0x94, 0xfe,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_membership_status.pb.go b/googleapis/ads/googleads/v3/enums/user_list_membership_status.pb.go
new file mode 100644
index 0000000..ca36543
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_membership_status.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_membership_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing possible user list membership statuses.
+type UserListMembershipStatusEnum_UserListMembershipStatus int32
+
+const (
+	// Not specified.
+	UserListMembershipStatusEnum_UNSPECIFIED UserListMembershipStatusEnum_UserListMembershipStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListMembershipStatusEnum_UNKNOWN UserListMembershipStatusEnum_UserListMembershipStatus = 1
+	// Open status - List is accruing members and can be targeted to.
+	UserListMembershipStatusEnum_OPEN UserListMembershipStatusEnum_UserListMembershipStatus = 2
+	// Closed status - No new members being added. Cannot be used for targeting.
+	UserListMembershipStatusEnum_CLOSED UserListMembershipStatusEnum_UserListMembershipStatus = 3
+)
+
+var UserListMembershipStatusEnum_UserListMembershipStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "OPEN",
+	3: "CLOSED",
+}
+
+var UserListMembershipStatusEnum_UserListMembershipStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"OPEN":        2,
+	"CLOSED":      3,
+}
+
+func (x UserListMembershipStatusEnum_UserListMembershipStatus) String() string {
+	return proto.EnumName(UserListMembershipStatusEnum_UserListMembershipStatus_name, int32(x))
+}
+
+func (UserListMembershipStatusEnum_UserListMembershipStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0ef275e742537128, []int{0, 0}
+}
+
+// Membership status of this user list. Indicates whether a user list is open
+// or active. Only open user lists can accumulate more users and can be used for
+// targeting.
+type UserListMembershipStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListMembershipStatusEnum) Reset()         { *m = UserListMembershipStatusEnum{} }
+func (m *UserListMembershipStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListMembershipStatusEnum) ProtoMessage()    {}
+func (*UserListMembershipStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ef275e742537128, []int{0}
+}
+
+func (m *UserListMembershipStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListMembershipStatusEnum.Unmarshal(m, b)
+}
+func (m *UserListMembershipStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListMembershipStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListMembershipStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListMembershipStatusEnum.Merge(m, src)
+}
+func (m *UserListMembershipStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListMembershipStatusEnum.Size(m)
+}
+func (m *UserListMembershipStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListMembershipStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListMembershipStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListMembershipStatusEnum_UserListMembershipStatus", UserListMembershipStatusEnum_UserListMembershipStatus_name, UserListMembershipStatusEnum_UserListMembershipStatus_value)
+	proto.RegisterType((*UserListMembershipStatusEnum)(nil), "google.ads.googleads.v3.enums.UserListMembershipStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_membership_status.proto", fileDescriptor_0ef275e742537128)
+}
+
+var fileDescriptor_0ef275e742537128 = []byte{
+	// 314 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x6a, 0xf2, 0x40,
+	0x14, 0x85, 0x7f, 0xe3, 0x8f, 0x2d, 0xe3, 0xa2, 0x21, 0xab, 0x52, 0x74, 0xa1, 0x0f, 0x30, 0x59,
+	0xcc, 0x6e, 0xba, 0x28, 0x51, 0x53, 0x91, 0xda, 0x31, 0x20, 0x5a, 0x28, 0x01, 0x19, 0x9b, 0x61,
+	0x3a, 0x60, 0x66, 0x42, 0xee, 0xc4, 0x07, 0xea, 0xb2, 0x8f, 0xd2, 0x47, 0xe9, 0xb2, 0x4f, 0x50,
+	0x32, 0xd1, 0xec, 0xec, 0x26, 0x1c, 0x72, 0xee, 0xf9, 0xe6, 0xdc, 0x8b, 0x1e, 0xa4, 0x31, 0xf2,
+	0x20, 0x42, 0x9e, 0x41, 0xd8, 0xc8, 0x5a, 0x1d, 0x49, 0x28, 0x74, 0x95, 0x43, 0x58, 0x81, 0x28,
+	0x77, 0x07, 0x05, 0x76, 0x97, 0x8b, 0x7c, 0x2f, 0x4a, 0x78, 0x57, 0xc5, 0x0e, 0x2c, 0xb7, 0x15,
+	0xe0, 0xa2, 0x34, 0xd6, 0x04, 0xc3, 0x26, 0x85, 0x79, 0x06, 0xb8, 0x05, 0xe0, 0x23, 0xc1, 0x0e,
+	0x70, 0x37, 0x38, 0xf3, 0x0b, 0x15, 0x72, 0xad, 0x8d, 0xe5, 0x56, 0x19, 0x7d, 0x0a, 0x8f, 0x35,
+	0x1a, 0x6c, 0x40, 0x94, 0x4b, 0x05, 0xf6, 0xb9, 0xe5, 0xaf, 0x1d, 0x3e, 0xd6, 0x55, 0x3e, 0x66,
+	0xe8, 0xf6, 0x92, 0x1f, 0xdc, 0xa0, 0xfe, 0x86, 0xad, 0x93, 0x78, 0xba, 0x78, 0x5c, 0xc4, 0x33,
+	0xff, 0x5f, 0xd0, 0x47, 0x57, 0x1b, 0xf6, 0xc4, 0x56, 0x2f, 0xcc, 0xef, 0x04, 0xd7, 0xe8, 0xff,
+	0x2a, 0x89, 0x99, 0xef, 0x05, 0x08, 0xf5, 0xa6, 0xcb, 0xd5, 0x3a, 0x9e, 0xf9, 0xdd, 0xc9, 0x4f,
+	0x07, 0x8d, 0xde, 0x4c, 0x8e, 0xff, 0xec, 0x3c, 0x19, 0x5e, 0x7a, 0x33, 0xa9, 0x4b, 0x27, 0x9d,
+	0xd7, 0xc9, 0x29, 0x2f, 0xcd, 0x81, 0x6b, 0x89, 0x4d, 0x29, 0x43, 0x29, 0xb4, 0x5b, 0xe9, 0x7c,
+	0xc4, 0x42, 0xc1, 0x85, 0x9b, 0xde, 0xbb, 0xef, 0x87, 0xd7, 0x9d, 0x47, 0xd1, 0xa7, 0x37, 0x9c,
+	0x37, 0xa8, 0x28, 0x03, 0xdc, 0xc8, 0x5a, 0x6d, 0x09, 0xae, 0xf7, 0x87, 0xaf, 0xb3, 0x9f, 0x46,
+	0x19, 0xa4, 0xad, 0x9f, 0x6e, 0x49, 0xea, 0xfc, 0x6f, 0x6f, 0xd4, 0xfc, 0xa4, 0x34, 0xca, 0x80,
+	0xd2, 0x76, 0x82, 0xd2, 0x2d, 0xa1, 0xd4, 0xcd, 0xec, 0x7b, 0xae, 0x18, 0xf9, 0x0d, 0x00, 0x00,
+	0xff, 0xff, 0xe7, 0x7e, 0x6b, 0x54, 0xeb, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_number_rule_item_operator.pb.go b/googleapis/ads/googleads/v3/enums/user_list_number_rule_item_operator.pb.go
new file mode 100644
index 0000000..4264133
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_number_rule_item_operator.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_number_rule_item_operator.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list number rule item operators.
+type UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator int32
+
+const (
+	// Not specified.
+	UserListNumberRuleItemOperatorEnum_UNSPECIFIED UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListNumberRuleItemOperatorEnum_UNKNOWN UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 1
+	// Greater than.
+	UserListNumberRuleItemOperatorEnum_GREATER_THAN UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 2
+	// Greater than or equal.
+	UserListNumberRuleItemOperatorEnum_GREATER_THAN_OR_EQUAL UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 3
+	// Equals.
+	UserListNumberRuleItemOperatorEnum_EQUALS UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 4
+	// Not equals.
+	UserListNumberRuleItemOperatorEnum_NOT_EQUALS UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 5
+	// Less than.
+	UserListNumberRuleItemOperatorEnum_LESS_THAN UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 6
+	// Less than or equal.
+	UserListNumberRuleItemOperatorEnum_LESS_THAN_OR_EQUAL UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 7
+)
+
+var UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "GREATER_THAN",
+	3: "GREATER_THAN_OR_EQUAL",
+	4: "EQUALS",
+	5: "NOT_EQUALS",
+	6: "LESS_THAN",
+	7: "LESS_THAN_OR_EQUAL",
+}
+
+var UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator_value = map[string]int32{
+	"UNSPECIFIED":           0,
+	"UNKNOWN":               1,
+	"GREATER_THAN":          2,
+	"GREATER_THAN_OR_EQUAL": 3,
+	"EQUALS":                4,
+	"NOT_EQUALS":            5,
+	"LESS_THAN":             6,
+	"LESS_THAN_OR_EQUAL":    7,
+}
+
+func (x UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator) String() string {
+	return proto.EnumName(UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator_name, int32(x))
+}
+
+func (UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_dabed540aeb56a56, []int{0, 0}
+}
+
+// Supported rule operator for number type.
+type UserListNumberRuleItemOperatorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListNumberRuleItemOperatorEnum) Reset()         { *m = UserListNumberRuleItemOperatorEnum{} }
+func (m *UserListNumberRuleItemOperatorEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListNumberRuleItemOperatorEnum) ProtoMessage()    {}
+func (*UserListNumberRuleItemOperatorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dabed540aeb56a56, []int{0}
+}
+
+func (m *UserListNumberRuleItemOperatorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListNumberRuleItemOperatorEnum.Unmarshal(m, b)
+}
+func (m *UserListNumberRuleItemOperatorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListNumberRuleItemOperatorEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListNumberRuleItemOperatorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListNumberRuleItemOperatorEnum.Merge(m, src)
+}
+func (m *UserListNumberRuleItemOperatorEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListNumberRuleItemOperatorEnum.Size(m)
+}
+func (m *UserListNumberRuleItemOperatorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListNumberRuleItemOperatorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListNumberRuleItemOperatorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator", UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator_name, UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator_value)
+	proto.RegisterType((*UserListNumberRuleItemOperatorEnum)(nil), "google.ads.googleads.v3.enums.UserListNumberRuleItemOperatorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_number_rule_item_operator.proto", fileDescriptor_dabed540aeb56a56)
+}
+
+var fileDescriptor_dabed540aeb56a56 = []byte{
+	// 379 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xcd, 0xae, 0x93, 0x40,
+	0x14, 0xc7, 0x85, 0x6a, 0x1b, 0xa7, 0x7e, 0x90, 0x49, 0x34, 0xd1, 0x58, 0x93, 0xd6, 0xfd, 0xb0,
+	0x60, 0x37, 0xae, 0xa6, 0x8a, 0xd8, 0xd8, 0x40, 0x85, 0x52, 0x13, 0x43, 0x32, 0xa1, 0x32, 0x21,
+	0x24, 0x30, 0x43, 0x66, 0x86, 0x3e, 0x90, 0x4b, 0x17, 0x3e, 0x88, 0x7b, 0x5f, 0xc2, 0x27, 0x70,
+	0x79, 0xc3, 0xd0, 0x72, 0xef, 0xe6, 0x76, 0x43, 0xfe, 0xe7, 0xeb, 0x77, 0x98, 0xff, 0x01, 0x41,
+	0x29, 0x44, 0x59, 0x33, 0x37, 0x2f, 0x94, 0x3b, 0xc8, 0x5e, 0x9d, 0x3c, 0x97, 0xf1, 0xae, 0x51,
+	0x6e, 0xa7, 0x98, 0xa4, 0x75, 0xa5, 0x34, 0xe5, 0x5d, 0x73, 0x64, 0x92, 0xca, 0xae, 0x66, 0xb4,
+	0xd2, 0xac, 0xa1, 0xa2, 0x65, 0x32, 0xd7, 0x42, 0xa2, 0x56, 0x0a, 0x2d, 0xe0, 0x62, 0x98, 0x46,
+	0x79, 0xa1, 0xd0, 0x08, 0x42, 0x27, 0x0f, 0x19, 0xd0, 0xeb, 0x37, 0x97, 0x3d, 0x6d, 0xe5, 0xe6,
+	0x9c, 0x0b, 0x9d, 0xeb, 0x4a, 0x70, 0x35, 0x0c, 0xaf, 0xfe, 0x5a, 0x60, 0x95, 0x2a, 0x26, 0xb7,
+	0x95, 0xd2, 0xa1, 0x59, 0x14, 0x77, 0x35, 0xdb, 0x68, 0xd6, 0x44, 0xe7, 0x2d, 0x3e, 0xef, 0x9a,
+	0xd5, 0x6f, 0x0b, 0xbc, 0xbd, 0xde, 0x06, 0x9f, 0x83, 0x79, 0x1a, 0x26, 0x3b, 0xff, 0xc3, 0xe6,
+	0xd3, 0xc6, 0xff, 0xe8, 0x3c, 0x80, 0x73, 0x30, 0x4b, 0xc3, 0x2f, 0x61, 0xf4, 0x2d, 0x74, 0x2c,
+	0xe8, 0x80, 0x27, 0x41, 0xec, 0x93, 0xbd, 0x1f, 0xd3, 0xfd, 0x67, 0x12, 0x3a, 0x36, 0x7c, 0x05,
+	0x5e, 0xdc, 0xcd, 0xd0, 0x28, 0xa6, 0xfe, 0xd7, 0x94, 0x6c, 0x9d, 0x09, 0x04, 0x60, 0x6a, 0x64,
+	0xe2, 0x3c, 0x84, 0xcf, 0x00, 0x08, 0xa3, 0x3d, 0x3d, 0xc7, 0x8f, 0xe0, 0x53, 0xf0, 0x78, 0xeb,
+	0x27, 0xc9, 0x40, 0x99, 0xc2, 0x97, 0x00, 0x8e, 0xe1, 0x2d, 0x62, 0xb6, 0xfe, 0x6f, 0x81, 0xe5,
+	0x0f, 0xd1, 0xa0, 0xab, 0xde, 0xac, 0xdf, 0x5d, 0x7f, 0xd3, 0xae, 0xb7, 0x68, 0x67, 0x7d, 0x5f,
+	0x9f, 0x29, 0xa5, 0xa8, 0x73, 0x5e, 0x22, 0x21, 0x4b, 0xb7, 0x64, 0xdc, 0x18, 0x78, 0x39, 0x5d,
+	0x5b, 0xa9, 0x7b, 0x2e, 0xf9, 0xde, 0x7c, 0x7f, 0xda, 0x93, 0x80, 0x90, 0x5f, 0xf6, 0x22, 0x18,
+	0x50, 0xa4, 0x50, 0x68, 0x90, 0xbd, 0x3a, 0x78, 0xa8, 0xb7, 0x59, 0xfd, 0xb9, 0xd4, 0x33, 0x52,
+	0xa8, 0x6c, 0xac, 0x67, 0x07, 0x2f, 0x33, 0xf5, 0x7f, 0xf6, 0x72, 0x48, 0x62, 0x4c, 0x0a, 0x85,
+	0xf1, 0xd8, 0x81, 0xf1, 0xc1, 0xc3, 0xd8, 0xf4, 0x1c, 0xa7, 0xe6, 0xc7, 0xbc, 0x9b, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0x5d, 0xbb, 0xa1, 0x0e, 0x61, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_prepopulation_status.pb.go b/googleapis/ads/googleads/v3/enums/user_list_prepopulation_status.pb.go
new file mode 100644
index 0000000..b02414f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_prepopulation_status.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_prepopulation_status.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list prepopulation status.
+type UserListPrepopulationStatusEnum_UserListPrepopulationStatus int32
+
+const (
+	// Not specified.
+	UserListPrepopulationStatusEnum_UNSPECIFIED UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListPrepopulationStatusEnum_UNKNOWN UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 1
+	// Prepopoulation is being requested.
+	UserListPrepopulationStatusEnum_REQUESTED UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 2
+	// Prepopulation is finished.
+	UserListPrepopulationStatusEnum_FINISHED UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 3
+	// Prepopulation failed.
+	UserListPrepopulationStatusEnum_FAILED UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 4
+)
+
+var UserListPrepopulationStatusEnum_UserListPrepopulationStatus_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "REQUESTED",
+	3: "FINISHED",
+	4: "FAILED",
+}
+
+var UserListPrepopulationStatusEnum_UserListPrepopulationStatus_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"REQUESTED":   2,
+	"FINISHED":    3,
+	"FAILED":      4,
+}
+
+func (x UserListPrepopulationStatusEnum_UserListPrepopulationStatus) String() string {
+	return proto.EnumName(UserListPrepopulationStatusEnum_UserListPrepopulationStatus_name, int32(x))
+}
+
+func (UserListPrepopulationStatusEnum_UserListPrepopulationStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e9b6e6af973a186e, []int{0, 0}
+}
+
+// Indicates status of prepopulation based on the rule.
+type UserListPrepopulationStatusEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListPrepopulationStatusEnum) Reset()         { *m = UserListPrepopulationStatusEnum{} }
+func (m *UserListPrepopulationStatusEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListPrepopulationStatusEnum) ProtoMessage()    {}
+func (*UserListPrepopulationStatusEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e9b6e6af973a186e, []int{0}
+}
+
+func (m *UserListPrepopulationStatusEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListPrepopulationStatusEnum.Unmarshal(m, b)
+}
+func (m *UserListPrepopulationStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListPrepopulationStatusEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListPrepopulationStatusEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListPrepopulationStatusEnum.Merge(m, src)
+}
+func (m *UserListPrepopulationStatusEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListPrepopulationStatusEnum.Size(m)
+}
+func (m *UserListPrepopulationStatusEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListPrepopulationStatusEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListPrepopulationStatusEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListPrepopulationStatusEnum_UserListPrepopulationStatus", UserListPrepopulationStatusEnum_UserListPrepopulationStatus_name, UserListPrepopulationStatusEnum_UserListPrepopulationStatus_value)
+	proto.RegisterType((*UserListPrepopulationStatusEnum)(nil), "google.ads.googleads.v3.enums.UserListPrepopulationStatusEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_prepopulation_status.proto", fileDescriptor_e9b6e6af973a186e)
+}
+
+var fileDescriptor_e9b6e6af973a186e = []byte{
+	// 331 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4e, 0x83, 0x40,
+	0x14, 0x14, 0x6a, 0xaa, 0x6e, 0x35, 0x12, 0x8e, 0x6a, 0xa3, 0xed, 0x07, 0x2c, 0x07, 0x6e, 0xeb,
+	0x89, 0xca, 0xb6, 0x12, 0x1b, 0x44, 0x91, 0x9a, 0x18, 0x92, 0x06, 0x85, 0x10, 0x12, 0xba, 0xbb,
+	0xe1, 0x2d, 0xfd, 0x05, 0xff, 0xc3, 0xa3, 0x9f, 0xe2, 0xa7, 0x78, 0xf7, 0x6e, 0x58, 0xda, 0xc6,
+	0x8b, 0x5c, 0x36, 0x93, 0x7d, 0xf3, 0x66, 0xde, 0x0c, 0x9a, 0xe4, 0x9c, 0xe7, 0x65, 0x66, 0x25,
+	0x29, 0x58, 0x2d, 0x6c, 0xd0, 0xda, 0xb6, 0x32, 0x56, 0xaf, 0xc0, 0xaa, 0x21, 0xab, 0x96, 0x65,
+	0x01, 0x72, 0x29, 0xaa, 0x4c, 0x70, 0x51, 0x97, 0x89, 0x2c, 0x38, 0x5b, 0x82, 0x4c, 0x64, 0x0d,
+	0x58, 0x54, 0x5c, 0x72, 0x73, 0xd8, 0x2e, 0xe2, 0x24, 0x05, 0xbc, 0xd3, 0xc0, 0x6b, 0x1b, 0x2b,
+	0x8d, 0xb3, 0x8b, 0xad, 0x85, 0x28, 0xac, 0x84, 0x31, 0x2e, 0x95, 0xc4, 0x66, 0x79, 0xfc, 0xae,
+	0xa1, 0xcb, 0x08, 0xb2, 0x6a, 0x5e, 0x80, 0x0c, 0xfe, 0x7a, 0x84, 0xca, 0x82, 0xb2, 0x7a, 0x35,
+	0x4e, 0xd1, 0x79, 0x07, 0xc5, 0x3c, 0x45, 0x83, 0xc8, 0x0f, 0x03, 0x7a, 0xe3, 0x4d, 0x3d, 0xea,
+	0x1a, 0x7b, 0xe6, 0x00, 0x1d, 0x44, 0xfe, 0x9d, 0x7f, 0xff, 0xec, 0x1b, 0x9a, 0x79, 0x82, 0x8e,
+	0x1e, 0xe9, 0x43, 0x44, 0xc3, 0x27, 0xea, 0x1a, 0xba, 0x79, 0x8c, 0x0e, 0xa7, 0x9e, 0xef, 0x85,
+	0xb7, 0xd4, 0x35, 0x7a, 0x26, 0x42, 0xfd, 0xa9, 0xe3, 0xcd, 0xa9, 0x6b, 0xec, 0x4f, 0x7e, 0x34,
+	0x34, 0x7a, 0xe3, 0x2b, 0xdc, 0x99, 0x66, 0x72, 0xd5, 0x71, 0x49, 0xd0, 0x24, 0x0a, 0xb4, 0x97,
+	0x4d, 0xa9, 0x38, 0xe7, 0x65, 0xc2, 0x72, 0xcc, 0xab, 0xdc, 0xca, 0x33, 0xa6, 0xf2, 0x6e, 0x4b,
+	0x16, 0x05, 0xfc, 0xd3, 0xf9, 0xb5, 0x7a, 0x3f, 0xf4, 0xde, 0xcc, 0x71, 0x3e, 0xf5, 0xe1, 0xac,
+	0x95, 0x72, 0x52, 0xc0, 0x2d, 0x6c, 0xd0, 0xc2, 0xc6, 0x4d, 0x31, 0xf0, 0xb5, 0x9d, 0xc7, 0x4e,
+	0x0a, 0xf1, 0x6e, 0x1e, 0x2f, 0xec, 0x58, 0xcd, 0xbf, 0xf5, 0x51, 0xfb, 0x49, 0x88, 0x93, 0x02,
+	0x21, 0x3b, 0x06, 0x21, 0x0b, 0x9b, 0x10, 0xc5, 0x79, 0xed, 0xab, 0xc3, 0xec, 0xdf, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0xae, 0x3e, 0xc9, 0xbe, 0x0b, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_rule_type.pb.go b/googleapis/ads/googleads/v3/enums/user_list_rule_type.pb.go
new file mode 100644
index 0000000..5af3ed0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_rule_type.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_rule_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list rule types.
+type UserListRuleTypeEnum_UserListRuleType int32
+
+const (
+	// Not specified.
+	UserListRuleTypeEnum_UNSPECIFIED UserListRuleTypeEnum_UserListRuleType = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListRuleTypeEnum_UNKNOWN UserListRuleTypeEnum_UserListRuleType = 1
+	// Conjunctive normal form.
+	UserListRuleTypeEnum_AND_OF_ORS UserListRuleTypeEnum_UserListRuleType = 2
+	// Disjunctive normal form.
+	UserListRuleTypeEnum_OR_OF_ANDS UserListRuleTypeEnum_UserListRuleType = 3
+)
+
+var UserListRuleTypeEnum_UserListRuleType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AND_OF_ORS",
+	3: "OR_OF_ANDS",
+}
+
+var UserListRuleTypeEnum_UserListRuleType_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"AND_OF_ORS":  2,
+	"OR_OF_ANDS":  3,
+}
+
+func (x UserListRuleTypeEnum_UserListRuleType) String() string {
+	return proto.EnumName(UserListRuleTypeEnum_UserListRuleType_name, int32(x))
+}
+
+func (UserListRuleTypeEnum_UserListRuleType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_445e52642a4c2209, []int{0, 0}
+}
+
+// Rule based user list rule type.
+type UserListRuleTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListRuleTypeEnum) Reset()         { *m = UserListRuleTypeEnum{} }
+func (m *UserListRuleTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListRuleTypeEnum) ProtoMessage()    {}
+func (*UserListRuleTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_445e52642a4c2209, []int{0}
+}
+
+func (m *UserListRuleTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListRuleTypeEnum.Unmarshal(m, b)
+}
+func (m *UserListRuleTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListRuleTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListRuleTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListRuleTypeEnum.Merge(m, src)
+}
+func (m *UserListRuleTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListRuleTypeEnum.Size(m)
+}
+func (m *UserListRuleTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListRuleTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListRuleTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListRuleTypeEnum_UserListRuleType", UserListRuleTypeEnum_UserListRuleType_name, UserListRuleTypeEnum_UserListRuleType_value)
+	proto.RegisterType((*UserListRuleTypeEnum)(nil), "google.ads.googleads.v3.enums.UserListRuleTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_rule_type.proto", fileDescriptor_445e52642a4c2209)
+}
+
+var fileDescriptor_445e52642a4c2209 = []byte{
+	// 316 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x6a, 0xf3, 0x30,
+	0x10, 0xfd, 0xe2, 0xc0, 0x57, 0x50, 0xa0, 0x35, 0xa6, 0xdd, 0x94, 0x66, 0x91, 0x1c, 0x40, 0x5e,
+	0x78, 0x51, 0x50, 0x57, 0x4a, 0xf3, 0x43, 0x68, 0x91, 0x4d, 0xd2, 0xa4, 0x50, 0x0c, 0xc6, 0xad,
+	0x85, 0x6a, 0x70, 0x24, 0xe3, 0x91, 0x03, 0xb9, 0x4e, 0x97, 0x3d, 0x4a, 0x8f, 0x92, 0x53, 0x14,
+	0x49, 0x4d, 0x16, 0x81, 0x76, 0x23, 0xde, 0xcc, 0x7b, 0x6f, 0xf4, 0x66, 0xd0, 0xad, 0x50, 0x4a,
+	0x54, 0x3c, 0xcc, 0x0b, 0x08, 0x1d, 0x34, 0x68, 0x1b, 0x85, 0x5c, 0xb6, 0x1b, 0x08, 0x5b, 0xe0,
+	0x4d, 0x56, 0x95, 0xa0, 0xb3, 0xa6, 0xad, 0x78, 0xa6, 0x77, 0x35, 0xc7, 0x75, 0xa3, 0xb4, 0x0a,
+	0xfa, 0x4e, 0x8d, 0xf3, 0x02, 0xf0, 0xd1, 0x88, 0xb7, 0x11, 0xb6, 0xc6, 0xeb, 0x9b, 0xc3, 0xdc,
+	0xba, 0x0c, 0x73, 0x29, 0x95, 0xce, 0x75, 0xa9, 0x24, 0x38, 0xf3, 0xf0, 0x1d, 0x5d, 0xae, 0x80,
+	0x37, 0x8f, 0x25, 0xe8, 0x45, 0x5b, 0xf1, 0xa7, 0x5d, 0xcd, 0x27, 0xb2, 0xdd, 0x0c, 0x13, 0xe4,
+	0x9f, 0xf6, 0x83, 0x0b, 0xd4, 0x5b, 0xb1, 0x65, 0x32, 0xb9, 0x9f, 0x4f, 0xe7, 0x93, 0xb1, 0xff,
+	0x2f, 0xe8, 0xa1, 0xb3, 0x15, 0x7b, 0x60, 0xf1, 0x33, 0xf3, 0x3b, 0xc1, 0x39, 0x42, 0x94, 0x8d,
+	0xb3, 0x78, 0x9a, 0xc5, 0x8b, 0xa5, 0xef, 0x99, 0x3a, 0x5e, 0x98, 0x92, 0xb2, 0xf1, 0xd2, 0xef,
+	0x8e, 0xf6, 0x1d, 0x34, 0x78, 0x53, 0x1b, 0xfc, 0x67, 0xda, 0xd1, 0xd5, 0xe9, 0xaf, 0x89, 0x89,
+	0x99, 0x74, 0x5e, 0x46, 0x3f, 0x3e, 0xa1, 0xaa, 0x5c, 0x0a, 0xac, 0x1a, 0x11, 0x0a, 0x2e, 0xed,
+	0x12, 0x87, 0x73, 0xd5, 0x25, 0xfc, 0x72, 0xbd, 0x3b, 0xfb, 0x7e, 0x78, 0xdd, 0x19, 0xa5, 0x9f,
+	0x5e, 0x7f, 0xe6, 0x46, 0xd1, 0x02, 0xb0, 0x83, 0x06, 0xad, 0x23, 0x6c, 0x36, 0x87, 0xaf, 0x03,
+	0x9f, 0xd2, 0x02, 0xd2, 0x23, 0x9f, 0xae, 0xa3, 0xd4, 0xf2, 0x7b, 0x6f, 0xe0, 0x9a, 0x84, 0xd0,
+	0x02, 0x08, 0x39, 0x2a, 0x08, 0x59, 0x47, 0x84, 0x58, 0xcd, 0xeb, 0x7f, 0x1b, 0x2c, 0xfa, 0x0e,
+	0x00, 0x00, 0xff, 0xff, 0xf4, 0xca, 0x25, 0x39, 0xd5, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_size_range.pb.go b/googleapis/ads/googleads/v3/enums/user_list_size_range.pb.go
new file mode 100644
index 0000000..be007db
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_size_range.pb.go
@@ -0,0 +1,192 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_size_range.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing possible user list size ranges.
+type UserListSizeRangeEnum_UserListSizeRange int32
+
+const (
+	// Not specified.
+	UserListSizeRangeEnum_UNSPECIFIED UserListSizeRangeEnum_UserListSizeRange = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListSizeRangeEnum_UNKNOWN UserListSizeRangeEnum_UserListSizeRange = 1
+	// User list has less than 500 users.
+	UserListSizeRangeEnum_LESS_THAN_FIVE_HUNDRED UserListSizeRangeEnum_UserListSizeRange = 2
+	// User list has number of users in range of 500 to 1000.
+	UserListSizeRangeEnum_LESS_THAN_ONE_THOUSAND UserListSizeRangeEnum_UserListSizeRange = 3
+	// User list has number of users in range of 1000 to 10000.
+	UserListSizeRangeEnum_ONE_THOUSAND_TO_TEN_THOUSAND UserListSizeRangeEnum_UserListSizeRange = 4
+	// User list has number of users in range of 10000 to 50000.
+	UserListSizeRangeEnum_TEN_THOUSAND_TO_FIFTY_THOUSAND UserListSizeRangeEnum_UserListSizeRange = 5
+	// User list has number of users in range of 50000 to 100000.
+	UserListSizeRangeEnum_FIFTY_THOUSAND_TO_ONE_HUNDRED_THOUSAND UserListSizeRangeEnum_UserListSizeRange = 6
+	// User list has number of users in range of 100000 to 300000.
+	UserListSizeRangeEnum_ONE_HUNDRED_THOUSAND_TO_THREE_HUNDRED_THOUSAND UserListSizeRangeEnum_UserListSizeRange = 7
+	// User list has number of users in range of 300000 to 500000.
+	UserListSizeRangeEnum_THREE_HUNDRED_THOUSAND_TO_FIVE_HUNDRED_THOUSAND UserListSizeRangeEnum_UserListSizeRange = 8
+	// User list has number of users in range of 500000 to 1 million.
+	UserListSizeRangeEnum_FIVE_HUNDRED_THOUSAND_TO_ONE_MILLION UserListSizeRangeEnum_UserListSizeRange = 9
+	// User list has number of users in range of 1 to 2 millions.
+	UserListSizeRangeEnum_ONE_MILLION_TO_TWO_MILLION UserListSizeRangeEnum_UserListSizeRange = 10
+	// User list has number of users in range of 2 to 3 millions.
+	UserListSizeRangeEnum_TWO_MILLION_TO_THREE_MILLION UserListSizeRangeEnum_UserListSizeRange = 11
+	// User list has number of users in range of 3 to 5 millions.
+	UserListSizeRangeEnum_THREE_MILLION_TO_FIVE_MILLION UserListSizeRangeEnum_UserListSizeRange = 12
+	// User list has number of users in range of 5 to 10 millions.
+	UserListSizeRangeEnum_FIVE_MILLION_TO_TEN_MILLION UserListSizeRangeEnum_UserListSizeRange = 13
+	// User list has number of users in range of 10 to 20 millions.
+	UserListSizeRangeEnum_TEN_MILLION_TO_TWENTY_MILLION UserListSizeRangeEnum_UserListSizeRange = 14
+	// User list has number of users in range of 20 to 30 millions.
+	UserListSizeRangeEnum_TWENTY_MILLION_TO_THIRTY_MILLION UserListSizeRangeEnum_UserListSizeRange = 15
+	// User list has number of users in range of 30 to 50 millions.
+	UserListSizeRangeEnum_THIRTY_MILLION_TO_FIFTY_MILLION UserListSizeRangeEnum_UserListSizeRange = 16
+	// User list has over 50 million users.
+	UserListSizeRangeEnum_OVER_FIFTY_MILLION UserListSizeRangeEnum_UserListSizeRange = 17
+)
+
+var UserListSizeRangeEnum_UserListSizeRange_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "LESS_THAN_FIVE_HUNDRED",
+	3:  "LESS_THAN_ONE_THOUSAND",
+	4:  "ONE_THOUSAND_TO_TEN_THOUSAND",
+	5:  "TEN_THOUSAND_TO_FIFTY_THOUSAND",
+	6:  "FIFTY_THOUSAND_TO_ONE_HUNDRED_THOUSAND",
+	7:  "ONE_HUNDRED_THOUSAND_TO_THREE_HUNDRED_THOUSAND",
+	8:  "THREE_HUNDRED_THOUSAND_TO_FIVE_HUNDRED_THOUSAND",
+	9:  "FIVE_HUNDRED_THOUSAND_TO_ONE_MILLION",
+	10: "ONE_MILLION_TO_TWO_MILLION",
+	11: "TWO_MILLION_TO_THREE_MILLION",
+	12: "THREE_MILLION_TO_FIVE_MILLION",
+	13: "FIVE_MILLION_TO_TEN_MILLION",
+	14: "TEN_MILLION_TO_TWENTY_MILLION",
+	15: "TWENTY_MILLION_TO_THIRTY_MILLION",
+	16: "THIRTY_MILLION_TO_FIFTY_MILLION",
+	17: "OVER_FIFTY_MILLION",
+}
+
+var UserListSizeRangeEnum_UserListSizeRange_value = map[string]int32{
+	"UNSPECIFIED":                                     0,
+	"UNKNOWN":                                         1,
+	"LESS_THAN_FIVE_HUNDRED":                          2,
+	"LESS_THAN_ONE_THOUSAND":                          3,
+	"ONE_THOUSAND_TO_TEN_THOUSAND":                    4,
+	"TEN_THOUSAND_TO_FIFTY_THOUSAND":                  5,
+	"FIFTY_THOUSAND_TO_ONE_HUNDRED_THOUSAND":          6,
+	"ONE_HUNDRED_THOUSAND_TO_THREE_HUNDRED_THOUSAND":  7,
+	"THREE_HUNDRED_THOUSAND_TO_FIVE_HUNDRED_THOUSAND": 8,
+	"FIVE_HUNDRED_THOUSAND_TO_ONE_MILLION":            9,
+	"ONE_MILLION_TO_TWO_MILLION":                      10,
+	"TWO_MILLION_TO_THREE_MILLION":                    11,
+	"THREE_MILLION_TO_FIVE_MILLION":                   12,
+	"FIVE_MILLION_TO_TEN_MILLION":                     13,
+	"TEN_MILLION_TO_TWENTY_MILLION":                   14,
+	"TWENTY_MILLION_TO_THIRTY_MILLION":                15,
+	"THIRTY_MILLION_TO_FIFTY_MILLION":                 16,
+	"OVER_FIFTY_MILLION":                              17,
+}
+
+func (x UserListSizeRangeEnum_UserListSizeRange) String() string {
+	return proto.EnumName(UserListSizeRangeEnum_UserListSizeRange_name, int32(x))
+}
+
+func (UserListSizeRangeEnum_UserListSizeRange) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_288127de0922904a, []int{0, 0}
+}
+
+// Size range in terms of number of users of a UserList.
+type UserListSizeRangeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListSizeRangeEnum) Reset()         { *m = UserListSizeRangeEnum{} }
+func (m *UserListSizeRangeEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListSizeRangeEnum) ProtoMessage()    {}
+func (*UserListSizeRangeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_288127de0922904a, []int{0}
+}
+
+func (m *UserListSizeRangeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListSizeRangeEnum.Unmarshal(m, b)
+}
+func (m *UserListSizeRangeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListSizeRangeEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListSizeRangeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListSizeRangeEnum.Merge(m, src)
+}
+func (m *UserListSizeRangeEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListSizeRangeEnum.Size(m)
+}
+func (m *UserListSizeRangeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListSizeRangeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListSizeRangeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListSizeRangeEnum_UserListSizeRange", UserListSizeRangeEnum_UserListSizeRange_name, UserListSizeRangeEnum_UserListSizeRange_value)
+	proto.RegisterType((*UserListSizeRangeEnum)(nil), "google.ads.googleads.v3.enums.UserListSizeRangeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_size_range.proto", fileDescriptor_288127de0922904a)
+}
+
+var fileDescriptor_288127de0922904a = []byte{
+	// 504 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0xcb, 0x6e, 0xd3, 0x40,
+	0x14, 0x86, 0x69, 0x7a, 0x83, 0x13, 0xa0, 0xee, 0x48, 0x64, 0x11, 0x9a, 0xb6, 0x09, 0x15, 0x42,
+	0x2c, 0xc6, 0x12, 0xde, 0x20, 0xb3, 0x72, 0xc8, 0xa4, 0xb1, 0x08, 0xe3, 0xc8, 0xb7, 0xaa, 0x28,
+	0x92, 0x65, 0xb0, 0x65, 0x59, 0x4a, 0xec, 0xc8, 0xe3, 0x74, 0xd1, 0xe7, 0xe0, 0x09, 0x58, 0xf2,
+	0x28, 0x3c, 0x0a, 0xbc, 0x01, 0x2b, 0x64, 0xbb, 0xe3, 0x0b, 0x35, 0x6c, 0xa2, 0xa3, 0xff, 0xff,
+	0xce, 0xc9, 0xaf, 0xf1, 0x39, 0xf0, 0x36, 0x88, 0xe3, 0x60, 0xe5, 0x8b, 0xae, 0xc7, 0xc4, 0xa2,
+	0xcc, 0xaa, 0x1b, 0x49, 0xf4, 0xa3, 0xed, 0x9a, 0x89, 0x5b, 0xe6, 0x27, 0xce, 0x2a, 0x64, 0xa9,
+	0xc3, 0xc2, 0x5b, 0xdf, 0x49, 0xdc, 0x28, 0xf0, 0xf1, 0x26, 0x89, 0xd3, 0x18, 0x0d, 0x0a, 0x1c,
+	0xbb, 0x1e, 0xc3, 0x65, 0x27, 0xbe, 0x91, 0x70, 0xde, 0xd9, 0x3f, 0xe1, 0x83, 0x37, 0xa1, 0xe8,
+	0x46, 0x51, 0x9c, 0xba, 0x69, 0x18, 0x47, 0xac, 0x68, 0x1e, 0x7d, 0xdd, 0x87, 0x67, 0x16, 0xf3,
+	0x93, 0x79, 0xc8, 0x52, 0x23, 0xbc, 0xf5, 0xf5, 0x6c, 0x30, 0x89, 0xb6, 0xeb, 0xd1, 0xef, 0x3d,
+	0x38, 0xbe, 0xe7, 0xa0, 0x23, 0xe8, 0x5a, 0xd4, 0x58, 0x90, 0xf7, 0xea, 0x54, 0x25, 0x13, 0xe1,
+	0x01, 0xea, 0xc2, 0xa1, 0x45, 0x3f, 0x50, 0xed, 0x8a, 0x0a, 0x3b, 0xa8, 0x0f, 0xbd, 0x39, 0x31,
+	0x0c, 0xc7, 0x9c, 0x29, 0xd4, 0x99, 0xaa, 0x36, 0x71, 0x66, 0x16, 0x9d, 0xe8, 0x64, 0x22, 0x74,
+	0x9a, 0x9e, 0x46, 0x89, 0x63, 0xce, 0x34, 0xcb, 0x50, 0xe8, 0x44, 0xd8, 0x45, 0xe7, 0x70, 0x52,
+	0x57, 0x1c, 0x53, 0x73, 0x4c, 0x42, 0x2b, 0x62, 0x0f, 0x8d, 0xe0, 0xb4, 0xae, 0x64, 0xc4, 0x54,
+	0x9d, 0x9a, 0xd7, 0x15, 0xb3, 0x8f, 0x5e, 0xc3, 0xcb, 0xa6, 0x96, 0x51, 0xd9, 0xdc, 0xbb, 0x10,
+	0x15, 0x7b, 0x80, 0xde, 0x00, 0x6e, 0x73, 0xf2, 0x7f, 0x9e, 0xe9, 0xa4, 0xa5, 0xe7, 0x10, 0x49,
+	0x20, 0xb6, 0x7b, 0x45, 0x1a, 0xbb, 0xa5, 0xe9, 0x21, 0x7a, 0x05, 0x17, 0xad, 0x16, 0xcf, 0xf6,
+	0x51, 0x9d, 0xcf, 0x55, 0x8d, 0x0a, 0x8f, 0xd0, 0x29, 0xf4, 0x6b, 0x42, 0x9e, 0xe4, 0x4a, 0x2b,
+	0x7d, 0xc8, 0x1e, 0xa9, 0x26, 0x54, 0x49, 0x39, 0xd1, 0x45, 0x43, 0x18, 0x34, 0xa4, 0x32, 0x17,
+	0x47, 0x1e, 0xa3, 0x33, 0x78, 0x5e, 0x57, 0xf8, 0x4b, 0x73, 0xe0, 0x49, 0x3e, 0xa3, 0x12, 0x8a,
+	0x14, 0x84, 0x9a, 0xd7, 0x25, 0xf2, 0x14, 0x5d, 0xc0, 0x79, 0x53, 0x2b, 0xb2, 0xa8, 0x7a, 0x8d,
+	0x3a, 0x42, 0x2f, 0xe0, 0xac, 0xa9, 0x55, 0xdf, 0x8c, 0x43, 0x02, 0xea, 0x01, 0xd2, 0x6c, 0xa2,
+	0xff, 0xa5, 0x1f, 0x8f, 0x7f, 0xed, 0xc0, 0xf0, 0x4b, 0xbc, 0xc6, 0xff, 0x5d, 0xed, 0x71, 0xef,
+	0xde, 0x7e, 0x2e, 0xb2, 0xa5, 0x5e, 0xec, 0x7c, 0x1a, 0xdf, 0x35, 0x06, 0xf1, 0xca, 0x8d, 0x02,
+	0x1c, 0x27, 0x81, 0x18, 0xf8, 0x51, 0xbe, 0xf2, 0xfc, 0xba, 0x36, 0x21, 0xfb, 0xc7, 0xb1, 0xbd,
+	0xcb, 0x7f, 0xbf, 0x75, 0x76, 0x2f, 0x15, 0xe5, 0x7b, 0x67, 0x70, 0x59, 0x8c, 0x52, 0x3c, 0x86,
+	0x8b, 0x32, 0xab, 0x6c, 0x09, 0x67, 0x57, 0xc2, 0x7e, 0x70, 0x7f, 0xa9, 0x78, 0x6c, 0x59, 0xfa,
+	0x4b, 0x5b, 0x5a, 0xe6, 0xfe, 0xcf, 0xce, 0xb0, 0x10, 0x65, 0x59, 0xf1, 0x98, 0x2c, 0x97, 0x84,
+	0x2c, 0xdb, 0x92, 0x2c, 0xe7, 0xcc, 0xe7, 0x83, 0x3c, 0x98, 0xf4, 0x27, 0x00, 0x00, 0xff, 0xff,
+	0xdf, 0xdc, 0x48, 0x4a, 0x04, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_string_rule_item_operator.pb.go b/googleapis/ads/googleads/v3/enums/user_list_string_rule_item_operator.pb.go
new file mode 100644
index 0000000..0e534cb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_string_rule_item_operator.pb.go
@@ -0,0 +1,153 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_string_rule_item_operator.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list string rule item operators.
+type UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator int32
+
+const (
+	// Not specified.
+	UserListStringRuleItemOperatorEnum_UNSPECIFIED UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListStringRuleItemOperatorEnum_UNKNOWN UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 1
+	// Contains.
+	UserListStringRuleItemOperatorEnum_CONTAINS UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 2
+	// Equals.
+	UserListStringRuleItemOperatorEnum_EQUALS UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 3
+	// Starts with.
+	UserListStringRuleItemOperatorEnum_STARTS_WITH UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 4
+	// Ends with.
+	UserListStringRuleItemOperatorEnum_ENDS_WITH UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 5
+	// Not equals.
+	UserListStringRuleItemOperatorEnum_NOT_EQUALS UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 6
+	// Not contains.
+	UserListStringRuleItemOperatorEnum_NOT_CONTAINS UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 7
+	// Not starts with.
+	UserListStringRuleItemOperatorEnum_NOT_STARTS_WITH UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 8
+	// Not ends with.
+	UserListStringRuleItemOperatorEnum_NOT_ENDS_WITH UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator = 9
+)
+
+var UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CONTAINS",
+	3: "EQUALS",
+	4: "STARTS_WITH",
+	5: "ENDS_WITH",
+	6: "NOT_EQUALS",
+	7: "NOT_CONTAINS",
+	8: "NOT_STARTS_WITH",
+	9: "NOT_ENDS_WITH",
+}
+
+var UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"CONTAINS":        2,
+	"EQUALS":          3,
+	"STARTS_WITH":     4,
+	"ENDS_WITH":       5,
+	"NOT_EQUALS":      6,
+	"NOT_CONTAINS":    7,
+	"NOT_STARTS_WITH": 8,
+	"NOT_ENDS_WITH":   9,
+}
+
+func (x UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator) String() string {
+	return proto.EnumName(UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator_name, int32(x))
+}
+
+func (UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_31510c4974875989, []int{0, 0}
+}
+
+// Supported rule operator for string type.
+type UserListStringRuleItemOperatorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListStringRuleItemOperatorEnum) Reset()         { *m = UserListStringRuleItemOperatorEnum{} }
+func (m *UserListStringRuleItemOperatorEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListStringRuleItemOperatorEnum) ProtoMessage()    {}
+func (*UserListStringRuleItemOperatorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_31510c4974875989, []int{0}
+}
+
+func (m *UserListStringRuleItemOperatorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListStringRuleItemOperatorEnum.Unmarshal(m, b)
+}
+func (m *UserListStringRuleItemOperatorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListStringRuleItemOperatorEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListStringRuleItemOperatorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListStringRuleItemOperatorEnum.Merge(m, src)
+}
+func (m *UserListStringRuleItemOperatorEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListStringRuleItemOperatorEnum.Size(m)
+}
+func (m *UserListStringRuleItemOperatorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListStringRuleItemOperatorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListStringRuleItemOperatorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator", UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator_name, UserListStringRuleItemOperatorEnum_UserListStringRuleItemOperator_value)
+	proto.RegisterType((*UserListStringRuleItemOperatorEnum)(nil), "google.ads.googleads.v3.enums.UserListStringRuleItemOperatorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_string_rule_item_operator.proto", fileDescriptor_31510c4974875989)
+}
+
+var fileDescriptor_31510c4974875989 = []byte{
+	// 390 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0x8e, 0xd3, 0x30,
+	0x10, 0x25, 0x59, 0xe8, 0xee, 0x7a, 0x77, 0xd9, 0x60, 0x6e, 0x88, 0x45, 0xda, 0x72, 0x77, 0x0e,
+	0xb9, 0x99, 0x93, 0xdb, 0x86, 0x12, 0x51, 0x39, 0xa5, 0x49, 0x5a, 0x09, 0x45, 0x8a, 0x02, 0xb1,
+	0xa2, 0x48, 0x89, 0x1d, 0xd9, 0x4e, 0x3f, 0x88, 0x23, 0x9f, 0xc1, 0x91, 0x3f, 0x81, 0x2f, 0xe0,
+	0x88, 0xe2, 0xa4, 0x11, 0x17, 0x7a, 0x89, 0xde, 0xcc, 0xbc, 0xf7, 0x26, 0x7e, 0x03, 0xd6, 0xa5,
+	0x10, 0x65, 0xcd, 0xdc, 0xbc, 0x50, 0xee, 0x00, 0x7b, 0x74, 0xf4, 0x5c, 0xc6, 0xbb, 0x46, 0xb9,
+	0x9d, 0x62, 0x32, 0xab, 0x2b, 0xa5, 0x33, 0xa5, 0x65, 0xc5, 0xcb, 0x4c, 0x76, 0x35, 0xcb, 0x2a,
+	0xcd, 0x9a, 0x4c, 0xb4, 0x4c, 0xe6, 0x5a, 0x48, 0xd4, 0x4a, 0xa1, 0x05, 0x7c, 0x18, 0xd4, 0x28,
+	0x2f, 0x14, 0x9a, 0x8c, 0xd0, 0xd1, 0x43, 0xc6, 0xe8, 0xd5, 0xeb, 0xd3, 0x9e, 0xb6, 0x72, 0x73,
+	0xce, 0x85, 0xce, 0x75, 0x25, 0xb8, 0x1a, 0xc4, 0xf3, 0x5f, 0x16, 0x98, 0x27, 0x8a, 0xc9, 0x4d,
+	0xa5, 0x74, 0x64, 0x16, 0xed, 0xba, 0x9a, 0x05, 0x9a, 0x35, 0xe1, 0xb8, 0xc5, 0xe7, 0x5d, 0x33,
+	0xff, 0x61, 0x81, 0x37, 0xe7, 0x69, 0xf0, 0x1e, 0xdc, 0x24, 0x34, 0xda, 0xfa, 0xcb, 0xe0, 0x7d,
+	0xe0, 0xaf, 0x9c, 0x27, 0xf0, 0x06, 0x5c, 0x26, 0xf4, 0x23, 0x0d, 0x0f, 0xd4, 0xb1, 0xe0, 0x2d,
+	0xb8, 0x5a, 0x86, 0x34, 0x26, 0x01, 0x8d, 0x1c, 0x1b, 0x02, 0x30, 0xf3, 0x3f, 0x25, 0x64, 0x13,
+	0x39, 0x17, 0xbd, 0x2e, 0x8a, 0xc9, 0x2e, 0x8e, 0xb2, 0x43, 0x10, 0x7f, 0x70, 0x9e, 0xc2, 0x3b,
+	0x70, 0xed, 0xd3, 0xd5, 0x58, 0x3e, 0x83, 0xcf, 0x01, 0xa0, 0x61, 0x9c, 0x8d, 0xfc, 0x19, 0x74,
+	0xc0, 0x6d, 0x5f, 0x4f, 0x6e, 0x97, 0xf0, 0x25, 0xb8, 0xef, 0x3b, 0xff, 0xba, 0x5c, 0xc1, 0x17,
+	0xe0, 0xce, 0xc8, 0x26, 0xa7, 0xeb, 0xc5, 0x1f, 0x0b, 0x3c, 0x7e, 0x15, 0x0d, 0x3a, 0x9b, 0xd7,
+	0xe2, 0xed, 0xf9, 0x77, 0x6e, 0xfb, 0xd8, 0xb6, 0xd6, 0xe7, 0xc5, 0xe8, 0x52, 0x8a, 0x3a, 0xe7,
+	0x25, 0x12, 0xb2, 0x74, 0x4b, 0xc6, 0x4d, 0xa8, 0xa7, 0x73, 0xb6, 0x95, 0xfa, 0xcf, 0x75, 0xdf,
+	0x99, 0xef, 0x37, 0xfb, 0x62, 0x4d, 0xc8, 0x77, 0xfb, 0x61, 0x3d, 0x58, 0x91, 0x42, 0xa1, 0x01,
+	0xf6, 0x68, 0xef, 0xa1, 0x3e, 0x7a, 0xf5, 0xf3, 0x34, 0x4f, 0x49, 0xa1, 0xd2, 0x69, 0x9e, 0xee,
+	0xbd, 0xd4, 0xcc, 0x7f, 0xdb, 0x8f, 0x43, 0x13, 0x63, 0x52, 0x28, 0x8c, 0x27, 0x06, 0xc6, 0x7b,
+	0x0f, 0x63, 0xc3, 0xf9, 0x32, 0x33, 0x3f, 0xe6, 0xfd, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x64, 0xad,
+	0x35, 0xa5, 0x75, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/user_list_type.pb.go b/googleapis/ads/googleads/v3/enums/user_list_type.pb.go
new file mode 100644
index 0000000..d0d18b3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/user_list_type.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/user_list_type.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum containing possible user list types.
+type UserListTypeEnum_UserListType int32
+
+const (
+	// Not specified.
+	UserListTypeEnum_UNSPECIFIED UserListTypeEnum_UserListType = 0
+	// Used for return value only. Represents value unknown in this version.
+	UserListTypeEnum_UNKNOWN UserListTypeEnum_UserListType = 1
+	// UserList represented as a collection of conversion types.
+	UserListTypeEnum_REMARKETING UserListTypeEnum_UserListType = 2
+	// UserList represented as a combination of other user lists/interests.
+	UserListTypeEnum_LOGICAL UserListTypeEnum_UserListType = 3
+	// UserList created in the Google Ad Manager platform.
+	UserListTypeEnum_EXTERNAL_REMARKETING UserListTypeEnum_UserListType = 4
+	// UserList associated with a rule.
+	UserListTypeEnum_RULE_BASED UserListTypeEnum_UserListType = 5
+	// UserList with users similar to users of another UserList.
+	UserListTypeEnum_SIMILAR UserListTypeEnum_UserListType = 6
+	// UserList of first-party CRM data provided by advertiser in the form of
+	// emails or other formats.
+	UserListTypeEnum_CRM_BASED UserListTypeEnum_UserListType = 7
+)
+
+var UserListTypeEnum_UserListType_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "REMARKETING",
+	3: "LOGICAL",
+	4: "EXTERNAL_REMARKETING",
+	5: "RULE_BASED",
+	6: "SIMILAR",
+	7: "CRM_BASED",
+}
+
+var UserListTypeEnum_UserListType_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"REMARKETING":          2,
+	"LOGICAL":              3,
+	"EXTERNAL_REMARKETING": 4,
+	"RULE_BASED":           5,
+	"SIMILAR":              6,
+	"CRM_BASED":            7,
+}
+
+func (x UserListTypeEnum_UserListType) String() string {
+	return proto.EnumName(UserListTypeEnum_UserListType_name, int32(x))
+}
+
+func (UserListTypeEnum_UserListType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a7a482e427775cd4, []int{0, 0}
+}
+
+// The user list types.
+type UserListTypeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListTypeEnum) Reset()         { *m = UserListTypeEnum{} }
+func (m *UserListTypeEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListTypeEnum) ProtoMessage()    {}
+func (*UserListTypeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a7a482e427775cd4, []int{0}
+}
+
+func (m *UserListTypeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListTypeEnum.Unmarshal(m, b)
+}
+func (m *UserListTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListTypeEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListTypeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListTypeEnum.Merge(m, src)
+}
+func (m *UserListTypeEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListTypeEnum.Size(m)
+}
+func (m *UserListTypeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListTypeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListTypeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListTypeEnum_UserListType", UserListTypeEnum_UserListType_name, UserListTypeEnum_UserListType_value)
+	proto.RegisterType((*UserListTypeEnum)(nil), "google.ads.googleads.v3.enums.UserListTypeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_type.proto", fileDescriptor_a7a482e427775cd4)
+}
+
+var fileDescriptor_a7a482e427775cd4 = []byte{
+	// 358 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xcf, 0x4a, 0xf3, 0x40,
+	0x14, 0xc5, 0xbf, 0xa4, 0x9f, 0x2d, 0x4e, 0xfd, 0x13, 0x83, 0x0b, 0x11, 0xbb, 0x68, 0x1f, 0x60,
+	0x02, 0x66, 0x37, 0xae, 0x26, 0xed, 0x18, 0x42, 0xd3, 0xb4, 0xa4, 0x4d, 0x15, 0x09, 0x84, 0x68,
+	0x86, 0x10, 0x68, 0x67, 0x42, 0x26, 0x2d, 0xf4, 0x2d, 0x7c, 0x06, 0xc1, 0x8d, 0x8f, 0xe2, 0x83,
+	0xb8, 0xf0, 0x29, 0x64, 0x92, 0xb6, 0x74, 0xa3, 0x9b, 0xe1, 0x30, 0xbf, 0x73, 0x2e, 0xf7, 0x1e,
+	0x70, 0x9b, 0x72, 0x9e, 0x2e, 0xa8, 0x11, 0x27, 0xc2, 0xa8, 0xa5, 0x54, 0x6b, 0xd3, 0xa0, 0x6c,
+	0xb5, 0x14, 0xc6, 0x4a, 0xd0, 0x22, 0x5a, 0x64, 0xa2, 0x8c, 0xca, 0x4d, 0x4e, 0x61, 0x5e, 0xf0,
+	0x92, 0xeb, 0x9d, 0xda, 0x08, 0xe3, 0x44, 0xc0, 0x7d, 0x06, 0xae, 0x4d, 0x58, 0x65, 0xae, 0x6f,
+	0x76, 0x23, 0xf3, 0xcc, 0x88, 0x19, 0xe3, 0x65, 0x5c, 0x66, 0x9c, 0x89, 0x3a, 0xdc, 0x7b, 0x57,
+	0x80, 0x16, 0x08, 0x5a, 0xb8, 0x99, 0x28, 0x67, 0x9b, 0x9c, 0x12, 0xb6, 0x5a, 0xf6, 0x5e, 0x15,
+	0x70, 0x72, 0xf8, 0xa9, 0x9f, 0x83, 0x76, 0xe0, 0x4d, 0x27, 0xa4, 0xef, 0xdc, 0x3b, 0x64, 0xa0,
+	0xfd, 0xd3, 0xdb, 0xa0, 0x15, 0x78, 0x43, 0x6f, 0xfc, 0xe0, 0x69, 0x8a, 0xa4, 0x3e, 0x19, 0x61,
+	0x7f, 0x48, 0x66, 0x8e, 0x67, 0x6b, 0xaa, 0xa4, 0xee, 0xd8, 0x76, 0xfa, 0xd8, 0xd5, 0x1a, 0xfa,
+	0x15, 0xb8, 0x24, 0x8f, 0x33, 0xe2, 0x7b, 0xd8, 0x8d, 0x0e, 0x6d, 0xff, 0xf5, 0x33, 0x00, 0xfc,
+	0xc0, 0x25, 0x91, 0x85, 0xa7, 0x64, 0xa0, 0x1d, 0xc9, 0xd8, 0xd4, 0x19, 0x39, 0x2e, 0xf6, 0xb5,
+	0xa6, 0x7e, 0x0a, 0x8e, 0xfb, 0xfe, 0x68, 0xcb, 0x5a, 0xd6, 0x97, 0x02, 0xba, 0x2f, 0x7c, 0x09,
+	0xff, 0xbc, 0xd5, 0xba, 0x38, 0xdc, 0x7a, 0x22, 0x0f, 0x9c, 0x28, 0x4f, 0xd6, 0x36, 0x93, 0xf2,
+	0x45, 0xcc, 0x52, 0xc8, 0x8b, 0xd4, 0x48, 0x29, 0xab, 0xce, 0xdf, 0x75, 0x9c, 0x67, 0xe2, 0x97,
+	0xca, 0xef, 0xaa, 0xf7, 0x4d, 0x6d, 0xd8, 0x18, 0x7f, 0xa8, 0x1d, 0xbb, 0x1e, 0x85, 0x13, 0x01,
+	0x6b, 0x29, 0xd5, 0xdc, 0x84, 0xb2, 0x36, 0xf1, 0xb9, 0xe3, 0x21, 0x4e, 0x44, 0xb8, 0xe7, 0xe1,
+	0xdc, 0x0c, 0x2b, 0xfe, 0xad, 0x76, 0xeb, 0x4f, 0x84, 0x70, 0x22, 0x10, 0xda, 0x3b, 0x10, 0x9a,
+	0x9b, 0x08, 0x55, 0x9e, 0xe7, 0x66, 0xb5, 0x98, 0xf9, 0x13, 0x00, 0x00, 0xff, 0xff, 0x88, 0xce,
+	0x94, 0x82, 0x0a, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/vanity_pharma_display_url_mode.pb.go b/googleapis/ads/googleads/v3/enums/vanity_pharma_display_url_mode.pb.go
new file mode 100644
index 0000000..432d0b3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/vanity_pharma_display_url_mode.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/vanity_pharma_display_url_mode.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible display modes for vanity pharma URLs.
+type VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode int32
+
+const (
+	// Not specified.
+	VanityPharmaDisplayUrlModeEnum_UNSPECIFIED VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode = 0
+	// Used for return value only. Represents value unknown in this version.
+	VanityPharmaDisplayUrlModeEnum_UNKNOWN VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode = 1
+	// Replace vanity pharma URL with manufacturer website url.
+	VanityPharmaDisplayUrlModeEnum_MANUFACTURER_WEBSITE_URL VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode = 2
+	// Replace vanity pharma URL with description of the website.
+	VanityPharmaDisplayUrlModeEnum_WEBSITE_DESCRIPTION VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode = 3
+)
+
+var VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "MANUFACTURER_WEBSITE_URL",
+	3: "WEBSITE_DESCRIPTION",
+}
+
+var VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"MANUFACTURER_WEBSITE_URL": 2,
+	"WEBSITE_DESCRIPTION":      3,
+}
+
+func (x VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode) String() string {
+	return proto.EnumName(VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode_name, int32(x))
+}
+
+func (VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_9a51a1ab460d19ab, []int{0, 0}
+}
+
+// The display mode for vanity pharma URLs.
+type VanityPharmaDisplayUrlModeEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *VanityPharmaDisplayUrlModeEnum) Reset()         { *m = VanityPharmaDisplayUrlModeEnum{} }
+func (m *VanityPharmaDisplayUrlModeEnum) String() string { return proto.CompactTextString(m) }
+func (*VanityPharmaDisplayUrlModeEnum) ProtoMessage()    {}
+func (*VanityPharmaDisplayUrlModeEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9a51a1ab460d19ab, []int{0}
+}
+
+func (m *VanityPharmaDisplayUrlModeEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_VanityPharmaDisplayUrlModeEnum.Unmarshal(m, b)
+}
+func (m *VanityPharmaDisplayUrlModeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_VanityPharmaDisplayUrlModeEnum.Marshal(b, m, deterministic)
+}
+func (m *VanityPharmaDisplayUrlModeEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VanityPharmaDisplayUrlModeEnum.Merge(m, src)
+}
+func (m *VanityPharmaDisplayUrlModeEnum) XXX_Size() int {
+	return xxx_messageInfo_VanityPharmaDisplayUrlModeEnum.Size(m)
+}
+func (m *VanityPharmaDisplayUrlModeEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_VanityPharmaDisplayUrlModeEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VanityPharmaDisplayUrlModeEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode", VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode_name, VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode_value)
+	proto.RegisterType((*VanityPharmaDisplayUrlModeEnum)(nil), "google.ads.googleads.v3.enums.VanityPharmaDisplayUrlModeEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/vanity_pharma_display_url_mode.proto", fileDescriptor_9a51a1ab460d19ab)
+}
+
+var fileDescriptor_9a51a1ab460d19ab = []byte{
+	// 345 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4e, 0x83, 0x40,
+	0x14, 0x15, 0x9a, 0x68, 0x32, 0x5d, 0x48, 0x70, 0xa1, 0x69, 0x5a, 0x4d, 0x7b, 0x80, 0x61, 0xc1,
+	0x6e, 0x5c, 0x41, 0x4b, 0x1b, 0xa2, 0xa5, 0x84, 0x16, 0x9a, 0x18, 0x12, 0x32, 0x3a, 0x04, 0x49,
+	0x60, 0x06, 0x19, 0xda, 0xa4, 0xe7, 0xf0, 0x06, 0x2e, 0x3d, 0x8a, 0x47, 0x71, 0xed, 0x01, 0x0c,
+	0x33, 0xd2, 0x5d, 0xdd, 0x4c, 0x5e, 0xe6, 0xbf, 0xff, 0xde, 0x7f, 0x0f, 0xd8, 0x19, 0x63, 0x59,
+	0x91, 0x1a, 0x98, 0x70, 0x43, 0xc2, 0x16, 0xed, 0x4d, 0x23, 0xa5, 0xbb, 0x92, 0x1b, 0x7b, 0x4c,
+	0xf3, 0xe6, 0x90, 0x54, 0xaf, 0xb8, 0x2e, 0x71, 0x42, 0x72, 0x5e, 0x15, 0xf8, 0x90, 0xec, 0xea,
+	0x22, 0x29, 0x19, 0x49, 0x61, 0x55, 0xb3, 0x86, 0xe9, 0x23, 0xb9, 0x08, 0x31, 0xe1, 0xf0, 0xa8,
+	0x01, 0xf7, 0x26, 0x14, 0x1a, 0x83, 0x61, 0x67, 0x51, 0xe5, 0x06, 0xa6, 0x94, 0x35, 0xb8, 0xc9,
+	0x19, 0xe5, 0x72, 0x79, 0xf2, 0xae, 0x80, 0xdb, 0x48, 0xb8, 0xf8, 0xc2, 0x64, 0x26, 0x3d, 0xc2,
+	0xba, 0x58, 0x32, 0x92, 0x3a, 0x74, 0x57, 0x4e, 0xde, 0xc0, 0xe0, 0x34, 0x43, 0xbf, 0x04, 0xfd,
+	0xd0, 0x5b, 0xfb, 0xce, 0xd4, 0x9d, 0xbb, 0xce, 0x4c, 0x3b, 0xd3, 0xfb, 0xe0, 0x22, 0xf4, 0x1e,
+	0xbc, 0xd5, 0xd6, 0xd3, 0x14, 0x7d, 0x08, 0x6e, 0x96, 0x96, 0x17, 0xce, 0xad, 0xe9, 0x26, 0x0c,
+	0x9c, 0x20, 0xd9, 0x3a, 0xf6, 0xda, 0xdd, 0x38, 0x49, 0x18, 0x3c, 0x6a, 0xaa, 0x7e, 0x0d, 0xae,
+	0xba, 0x8f, 0x99, 0xb3, 0x9e, 0x06, 0xae, 0xbf, 0x71, 0x57, 0x9e, 0xd6, 0xb3, 0x7f, 0x14, 0x30,
+	0x7e, 0x61, 0x25, 0xfc, 0x37, 0x99, 0x7d, 0x77, 0xfa, 0x2c, 0xbf, 0x0d, 0xe7, 0x2b, 0x4f, 0x7f,
+	0xfd, 0xc2, 0x8c, 0x15, 0x98, 0x66, 0x90, 0xd5, 0x99, 0x91, 0xa5, 0x54, 0x44, 0xef, 0xfa, 0xae,
+	0x72, 0x7e, 0xa2, 0xfe, 0x7b, 0xf1, 0x7e, 0xa8, 0xbd, 0x85, 0x65, 0x7d, 0xaa, 0xa3, 0x85, 0x94,
+	0xb2, 0x08, 0x87, 0x12, 0xb6, 0x28, 0x32, 0x61, 0x5b, 0x12, 0xff, 0xea, 0xe6, 0xb1, 0x45, 0x78,
+	0x7c, 0x9c, 0xc7, 0x91, 0x19, 0x8b, 0xf9, 0xb7, 0x3a, 0x96, 0x9f, 0x08, 0x59, 0x84, 0x23, 0x74,
+	0x64, 0x20, 0x14, 0x99, 0x08, 0x09, 0xce, 0xf3, 0xb9, 0x38, 0xcc, 0xfc, 0x0d, 0x00, 0x00, 0xff,
+	0xff, 0x72, 0x7b, 0xcd, 0xdf, 0x16, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/vanity_pharma_text.pb.go b/googleapis/ads/googleads/v3/enums/vanity_pharma_text.pb.go
new file mode 100644
index 0000000..83f4dc5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/vanity_pharma_text.pb.go
@@ -0,0 +1,178 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/vanity_pharma_text.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible text.
+type VanityPharmaTextEnum_VanityPharmaText int32
+
+const (
+	// Not specified.
+	VanityPharmaTextEnum_UNSPECIFIED VanityPharmaTextEnum_VanityPharmaText = 0
+	// Used for return value only. Represents value unknown in this version.
+	VanityPharmaTextEnum_UNKNOWN VanityPharmaTextEnum_VanityPharmaText = 1
+	// Prescription treatment website with website content in English.
+	VanityPharmaTextEnum_PRESCRIPTION_TREATMENT_WEBSITE_EN VanityPharmaTextEnum_VanityPharmaText = 2
+	// Prescription treatment website with website content in Spanish
+	// (Sitio de tratamientos con receta).
+	VanityPharmaTextEnum_PRESCRIPTION_TREATMENT_WEBSITE_ES VanityPharmaTextEnum_VanityPharmaText = 3
+	// Prescription device website with website content in English.
+	VanityPharmaTextEnum_PRESCRIPTION_DEVICE_WEBSITE_EN VanityPharmaTextEnum_VanityPharmaText = 4
+	// Prescription device website with website content in Spanish (Sitio de
+	// dispositivos con receta).
+	VanityPharmaTextEnum_PRESCRIPTION_DEVICE_WEBSITE_ES VanityPharmaTextEnum_VanityPharmaText = 5
+	// Medical device website with website content in English.
+	VanityPharmaTextEnum_MEDICAL_DEVICE_WEBSITE_EN VanityPharmaTextEnum_VanityPharmaText = 6
+	// Medical device website with website content in Spanish (Sitio de
+	// dispositivos médicos).
+	VanityPharmaTextEnum_MEDICAL_DEVICE_WEBSITE_ES VanityPharmaTextEnum_VanityPharmaText = 7
+	// Preventative treatment website with website content in English.
+	VanityPharmaTextEnum_PREVENTATIVE_TREATMENT_WEBSITE_EN VanityPharmaTextEnum_VanityPharmaText = 8
+	// Preventative treatment website with website content in Spanish (Sitio de
+	// tratamientos preventivos).
+	VanityPharmaTextEnum_PREVENTATIVE_TREATMENT_WEBSITE_ES VanityPharmaTextEnum_VanityPharmaText = 9
+	// Prescription contraception website with website content in English.
+	VanityPharmaTextEnum_PRESCRIPTION_CONTRACEPTION_WEBSITE_EN VanityPharmaTextEnum_VanityPharmaText = 10
+	// Prescription contraception website with website content in Spanish (Sitio
+	// de anticonceptivos con receta).
+	VanityPharmaTextEnum_PRESCRIPTION_CONTRACEPTION_WEBSITE_ES VanityPharmaTextEnum_VanityPharmaText = 11
+	// Prescription vaccine website with website content in English.
+	VanityPharmaTextEnum_PRESCRIPTION_VACCINE_WEBSITE_EN VanityPharmaTextEnum_VanityPharmaText = 12
+	// Prescription vaccine website with website content in Spanish (Sitio de
+	// vacunas con receta).
+	VanityPharmaTextEnum_PRESCRIPTION_VACCINE_WEBSITE_ES VanityPharmaTextEnum_VanityPharmaText = 13
+)
+
+var VanityPharmaTextEnum_VanityPharmaText_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "PRESCRIPTION_TREATMENT_WEBSITE_EN",
+	3:  "PRESCRIPTION_TREATMENT_WEBSITE_ES",
+	4:  "PRESCRIPTION_DEVICE_WEBSITE_EN",
+	5:  "PRESCRIPTION_DEVICE_WEBSITE_ES",
+	6:  "MEDICAL_DEVICE_WEBSITE_EN",
+	7:  "MEDICAL_DEVICE_WEBSITE_ES",
+	8:  "PREVENTATIVE_TREATMENT_WEBSITE_EN",
+	9:  "PREVENTATIVE_TREATMENT_WEBSITE_ES",
+	10: "PRESCRIPTION_CONTRACEPTION_WEBSITE_EN",
+	11: "PRESCRIPTION_CONTRACEPTION_WEBSITE_ES",
+	12: "PRESCRIPTION_VACCINE_WEBSITE_EN",
+	13: "PRESCRIPTION_VACCINE_WEBSITE_ES",
+}
+
+var VanityPharmaTextEnum_VanityPharmaText_value = map[string]int32{
+	"UNSPECIFIED":                           0,
+	"UNKNOWN":                               1,
+	"PRESCRIPTION_TREATMENT_WEBSITE_EN":     2,
+	"PRESCRIPTION_TREATMENT_WEBSITE_ES":     3,
+	"PRESCRIPTION_DEVICE_WEBSITE_EN":        4,
+	"PRESCRIPTION_DEVICE_WEBSITE_ES":        5,
+	"MEDICAL_DEVICE_WEBSITE_EN":             6,
+	"MEDICAL_DEVICE_WEBSITE_ES":             7,
+	"PREVENTATIVE_TREATMENT_WEBSITE_EN":     8,
+	"PREVENTATIVE_TREATMENT_WEBSITE_ES":     9,
+	"PRESCRIPTION_CONTRACEPTION_WEBSITE_EN": 10,
+	"PRESCRIPTION_CONTRACEPTION_WEBSITE_ES": 11,
+	"PRESCRIPTION_VACCINE_WEBSITE_EN":       12,
+	"PRESCRIPTION_VACCINE_WEBSITE_ES":       13,
+}
+
+func (x VanityPharmaTextEnum_VanityPharmaText) String() string {
+	return proto.EnumName(VanityPharmaTextEnum_VanityPharmaText_name, int32(x))
+}
+
+func (VanityPharmaTextEnum_VanityPharmaText) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3ab6b0da50d44ae9, []int{0, 0}
+}
+
+// The text that will be displayed in display URL of the text ad when website
+// description is the selected display mode for vanity pharma URLs.
+type VanityPharmaTextEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *VanityPharmaTextEnum) Reset()         { *m = VanityPharmaTextEnum{} }
+func (m *VanityPharmaTextEnum) String() string { return proto.CompactTextString(m) }
+func (*VanityPharmaTextEnum) ProtoMessage()    {}
+func (*VanityPharmaTextEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3ab6b0da50d44ae9, []int{0}
+}
+
+func (m *VanityPharmaTextEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_VanityPharmaTextEnum.Unmarshal(m, b)
+}
+func (m *VanityPharmaTextEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_VanityPharmaTextEnum.Marshal(b, m, deterministic)
+}
+func (m *VanityPharmaTextEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VanityPharmaTextEnum.Merge(m, src)
+}
+func (m *VanityPharmaTextEnum) XXX_Size() int {
+	return xxx_messageInfo_VanityPharmaTextEnum.Size(m)
+}
+func (m *VanityPharmaTextEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_VanityPharmaTextEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VanityPharmaTextEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.VanityPharmaTextEnum_VanityPharmaText", VanityPharmaTextEnum_VanityPharmaText_name, VanityPharmaTextEnum_VanityPharmaText_value)
+	proto.RegisterType((*VanityPharmaTextEnum)(nil), "google.ads.googleads.v3.enums.VanityPharmaTextEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/vanity_pharma_text.proto", fileDescriptor_3ab6b0da50d44ae9)
+}
+
+var fileDescriptor_3ab6b0da50d44ae9 = []byte{
+	// 429 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x6e, 0x13, 0x31,
+	0x18, 0x85, 0x49, 0x52, 0x5a, 0x70, 0x40, 0x58, 0x23, 0x58, 0x80, 0x08, 0x28, 0x41, 0x5d, 0xb0,
+	0xf1, 0x2c, 0x46, 0x62, 0x61, 0x56, 0x8e, 0x63, 0x2a, 0x0b, 0xea, 0x8c, 0x62, 0xd7, 0x95, 0x50,
+	0xa4, 0x91, 0x61, 0x46, 0x43, 0xa4, 0xc6, 0x8e, 0xe2, 0x69, 0x54, 0xce, 0xc0, 0x2d, 0x58, 0x72,
+	0x14, 0x8e, 0xd2, 0x25, 0x27, 0x40, 0xf1, 0x34, 0x51, 0x53, 0xb5, 0x4d, 0x36, 0xa3, 0x7f, 0xfc,
+	0xbe, 0xf7, 0xf4, 0xff, 0xd2, 0x03, 0x1f, 0x4a, 0xe7, 0xca, 0xb3, 0x22, 0x36, 0xb9, 0x8f, 0xeb,
+	0x71, 0x39, 0x2d, 0x92, 0xb8, 0xb0, 0xe7, 0x53, 0x1f, 0x2f, 0x8c, 0x9d, 0x54, 0x3f, 0xb3, 0xd9,
+	0x0f, 0x33, 0x9f, 0x9a, 0xac, 0x2a, 0x2e, 0x2a, 0x34, 0x9b, 0xbb, 0xca, 0x45, 0x9d, 0x1a, 0x46,
+	0x26, 0xf7, 0x68, 0xed, 0x43, 0x8b, 0x04, 0x05, 0xdf, 0xab, 0xd7, 0xab, 0xd8, 0xd9, 0x24, 0x36,
+	0xd6, 0xba, 0xca, 0x54, 0x13, 0x67, 0x7d, 0x6d, 0xee, 0xfd, 0xda, 0x03, 0xcf, 0x75, 0x48, 0x4e,
+	0x43, 0xb0, 0x2a, 0x2e, 0x2a, 0x66, 0xcf, 0xa7, 0xbd, 0x7f, 0x2d, 0x00, 0x6f, 0x0a, 0xd1, 0x33,
+	0xd0, 0x3e, 0x11, 0x32, 0x65, 0x94, 0x7f, 0xe2, 0x6c, 0x00, 0x1f, 0x44, 0x6d, 0x70, 0x70, 0x22,
+	0x3e, 0x8b, 0xe1, 0xa9, 0x80, 0x8d, 0xe8, 0x10, 0x74, 0xd3, 0x11, 0x93, 0x74, 0xc4, 0x53, 0xc5,
+	0x87, 0x22, 0x53, 0x23, 0x46, 0xd4, 0x31, 0x13, 0x2a, 0x3b, 0x65, 0x7d, 0xc9, 0x15, 0xcb, 0x98,
+	0x80, 0xcd, 0x5d, 0x30, 0x09, 0x5b, 0x51, 0x0f, 0xbc, 0xd9, 0xc0, 0x06, 0x4c, 0x73, 0xca, 0xae,
+	0x47, 0xed, 0x6d, 0x65, 0x24, 0x7c, 0x18, 0x75, 0xc0, 0xcb, 0x63, 0x36, 0xe0, 0x94, 0x7c, 0xb9,
+	0x25, 0x62, 0xff, 0x3e, 0x59, 0xc2, 0x83, 0xab, 0x65, 0x35, 0x13, 0x8a, 0x28, 0xae, 0xd9, 0xed,
+	0x37, 0x3d, 0xda, 0x05, 0x93, 0xf0, 0x71, 0xf4, 0x1e, 0x1c, 0x6e, 0xec, 0x4b, 0x87, 0x42, 0x8d,
+	0x08, 0x65, 0xf5, 0xdf, 0xb5, 0x44, 0xb0, 0x2b, 0x2a, 0x61, 0x3b, 0x7a, 0x07, 0xde, 0x6e, 0xa0,
+	0x9a, 0x50, 0xca, 0xc5, 0xc6, 0x9d, 0x4f, 0xb6, 0x43, 0x12, 0x3e, 0xed, 0x5f, 0x36, 0x40, 0xf7,
+	0xbb, 0x9b, 0xa2, 0x7b, 0x1b, 0xd5, 0x7f, 0x71, 0xb3, 0x17, 0xe9, 0xb2, 0x4a, 0x69, 0xe3, 0x6b,
+	0xff, 0xca, 0x57, 0xba, 0x33, 0x63, 0x4b, 0xe4, 0xe6, 0x65, 0x5c, 0x16, 0x36, 0x14, 0x6d, 0xd5,
+	0xe8, 0xd9, 0xc4, 0xdf, 0x51, 0xf0, 0x8f, 0xe1, 0xfb, 0xbb, 0xd9, 0x3a, 0x22, 0xe4, 0x4f, 0xb3,
+	0x73, 0x54, 0x47, 0x91, 0xdc, 0xa3, 0x7a, 0x5c, 0x4e, 0x3a, 0x41, 0xcb, 0x72, 0xfa, 0xbf, 0x2b,
+	0x7d, 0x4c, 0x72, 0x3f, 0x5e, 0xeb, 0x63, 0x9d, 0x8c, 0x83, 0x7e, 0xd9, 0xec, 0xd6, 0x8f, 0x18,
+	0x93, 0xdc, 0x63, 0xbc, 0x26, 0x30, 0xd6, 0x09, 0xc6, 0x81, 0xf9, 0xb6, 0x1f, 0x16, 0x4b, 0xfe,
+	0x07, 0x00, 0x00, 0xff, 0xff, 0x34, 0x69, 0x54, 0xfc, 0x78, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/webpage_condition_operand.pb.go b/googleapis/ads/googleads/v3/enums/webpage_condition_operand.pb.go
new file mode 100644
index 0000000..e964ce3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/webpage_condition_operand.pb.go
@@ -0,0 +1,138 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/webpage_condition_operand.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The webpage condition operand in webpage criterion.
+type WebpageConditionOperandEnum_WebpageConditionOperand int32
+
+const (
+	// Not specified.
+	WebpageConditionOperandEnum_UNSPECIFIED WebpageConditionOperandEnum_WebpageConditionOperand = 0
+	// Used for return value only. Represents value unknown in this version.
+	WebpageConditionOperandEnum_UNKNOWN WebpageConditionOperandEnum_WebpageConditionOperand = 1
+	// Operand denoting a webpage URL targeting condition.
+	WebpageConditionOperandEnum_URL WebpageConditionOperandEnum_WebpageConditionOperand = 2
+	// Operand denoting a webpage category targeting condition.
+	WebpageConditionOperandEnum_CATEGORY WebpageConditionOperandEnum_WebpageConditionOperand = 3
+	// Operand denoting a webpage title targeting condition.
+	WebpageConditionOperandEnum_PAGE_TITLE WebpageConditionOperandEnum_WebpageConditionOperand = 4
+	// Operand denoting a webpage content targeting condition.
+	WebpageConditionOperandEnum_PAGE_CONTENT WebpageConditionOperandEnum_WebpageConditionOperand = 5
+	// Operand denoting a webpage custom label targeting condition.
+	WebpageConditionOperandEnum_CUSTOM_LABEL WebpageConditionOperandEnum_WebpageConditionOperand = 6
+)
+
+var WebpageConditionOperandEnum_WebpageConditionOperand_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "URL",
+	3: "CATEGORY",
+	4: "PAGE_TITLE",
+	5: "PAGE_CONTENT",
+	6: "CUSTOM_LABEL",
+}
+
+var WebpageConditionOperandEnum_WebpageConditionOperand_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"URL":          2,
+	"CATEGORY":     3,
+	"PAGE_TITLE":   4,
+	"PAGE_CONTENT": 5,
+	"CUSTOM_LABEL": 6,
+}
+
+func (x WebpageConditionOperandEnum_WebpageConditionOperand) String() string {
+	return proto.EnumName(WebpageConditionOperandEnum_WebpageConditionOperand_name, int32(x))
+}
+
+func (WebpageConditionOperandEnum_WebpageConditionOperand) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_32e8eb751efc1016, []int{0, 0}
+}
+
+// Container for enum describing webpage condition operand in webpage criterion.
+type WebpageConditionOperandEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *WebpageConditionOperandEnum) Reset()         { *m = WebpageConditionOperandEnum{} }
+func (m *WebpageConditionOperandEnum) String() string { return proto.CompactTextString(m) }
+func (*WebpageConditionOperandEnum) ProtoMessage()    {}
+func (*WebpageConditionOperandEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_32e8eb751efc1016, []int{0}
+}
+
+func (m *WebpageConditionOperandEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WebpageConditionOperandEnum.Unmarshal(m, b)
+}
+func (m *WebpageConditionOperandEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WebpageConditionOperandEnum.Marshal(b, m, deterministic)
+}
+func (m *WebpageConditionOperandEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WebpageConditionOperandEnum.Merge(m, src)
+}
+func (m *WebpageConditionOperandEnum) XXX_Size() int {
+	return xxx_messageInfo_WebpageConditionOperandEnum.Size(m)
+}
+func (m *WebpageConditionOperandEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_WebpageConditionOperandEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WebpageConditionOperandEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.WebpageConditionOperandEnum_WebpageConditionOperand", WebpageConditionOperandEnum_WebpageConditionOperand_name, WebpageConditionOperandEnum_WebpageConditionOperand_value)
+	proto.RegisterType((*WebpageConditionOperandEnum)(nil), "google.ads.googleads.v3.enums.WebpageConditionOperandEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/webpage_condition_operand.proto", fileDescriptor_32e8eb751efc1016)
+}
+
+var fileDescriptor_32e8eb751efc1016 = []byte{
+	// 352 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0x4e, 0xc2, 0x30,
+	0x18, 0x76, 0x43, 0xc1, 0x14, 0xa2, 0xcd, 0x2e, 0x26, 0x0a, 0x07, 0x78, 0x80, 0xee, 0xb0, 0x5b,
+	0x8d, 0x87, 0x6e, 0xd6, 0x85, 0x38, 0xb7, 0x05, 0x36, 0x88, 0x66, 0xc9, 0x32, 0xd8, 0xb2, 0x2c,
+	0x81, 0x76, 0xa1, 0x80, 0x77, 0x1f, 0x85, 0xa3, 0x8f, 0xe2, 0xa3, 0x78, 0xf3, 0x0d, 0xcc, 0x56,
+	0xc7, 0x0d, 0x2f, 0xcd, 0xd7, 0xff, 0xfb, 0xbf, 0xaf, 0xff, 0xff, 0x15, 0x3c, 0xe4, 0x9c, 0xe7,
+	0xab, 0x4c, 0x4f, 0x52, 0xa1, 0x4b, 0x58, 0xa1, 0xbd, 0xa1, 0x67, 0x6c, 0xb7, 0x16, 0xfa, 0x7b,
+	0xb6, 0x28, 0x93, 0x3c, 0x8b, 0x97, 0x9c, 0xa5, 0xc5, 0xb6, 0xe0, 0x2c, 0xe6, 0x65, 0xb6, 0x49,
+	0x58, 0x8a, 0xca, 0x0d, 0xdf, 0x72, 0x6d, 0x20, 0x35, 0x28, 0x49, 0x05, 0x3a, 0xca, 0xd1, 0xde,
+	0x40, 0xb5, 0xfc, 0xb6, 0xdf, 0xb8, 0x97, 0x85, 0x9e, 0x30, 0xc6, 0xb7, 0x49, 0xe5, 0x21, 0xa4,
+	0x78, 0x74, 0x50, 0xc0, 0xdd, 0x5c, 0x3e, 0x60, 0x35, 0xfe, 0x9e, 0xb4, 0xa7, 0x6c, 0xb7, 0x1e,
+	0x7d, 0x28, 0xe0, 0xe6, 0x04, 0xaf, 0x5d, 0x83, 0x6e, 0xe8, 0x4e, 0x7d, 0x6a, 0x8d, 0x9f, 0xc6,
+	0xf4, 0x11, 0x9e, 0x69, 0x5d, 0xd0, 0x09, 0xdd, 0x67, 0xd7, 0x9b, 0xbb, 0x50, 0xd1, 0x3a, 0xa0,
+	0x15, 0x4e, 0x1c, 0xa8, 0x6a, 0x3d, 0x70, 0x69, 0x91, 0x80, 0xda, 0xde, 0xe4, 0x15, 0xb6, 0xb4,
+	0x2b, 0x00, 0x7c, 0x62, 0xd3, 0x38, 0x18, 0x07, 0x0e, 0x85, 0xe7, 0x1a, 0x04, 0xbd, 0xfa, 0x6e,
+	0x79, 0x6e, 0x40, 0xdd, 0x00, 0x5e, 0x54, 0x15, 0x2b, 0x9c, 0x06, 0xde, 0x4b, 0xec, 0x10, 0x93,
+	0x3a, 0xb0, 0x6d, 0xfe, 0x28, 0x60, 0xb8, 0xe4, 0x6b, 0xf4, 0xef, 0xa2, 0x66, 0xff, 0xc4, 0x9c,
+	0x7e, 0xb5, 0xa8, 0xaf, 0xbc, 0x99, 0x7f, 0xf2, 0x9c, 0xaf, 0x12, 0x96, 0x23, 0xbe, 0xc9, 0xf5,
+	0x3c, 0x63, 0x75, 0x0c, 0x4d, 0xec, 0x65, 0x21, 0x4e, 0xfc, 0xc2, 0x7d, 0x7d, 0x1e, 0xd4, 0x96,
+	0x4d, 0xc8, 0xa7, 0x3a, 0xb0, 0xa5, 0x15, 0x49, 0x05, 0x92, 0xb0, 0x42, 0x33, 0x03, 0x55, 0x99,
+	0x89, 0xaf, 0x86, 0x8f, 0x48, 0x2a, 0xa2, 0x23, 0x1f, 0xcd, 0x8c, 0xa8, 0xe6, 0xbf, 0xd5, 0xa1,
+	0x2c, 0x62, 0x4c, 0x52, 0x81, 0xf1, 0xb1, 0x03, 0xe3, 0x99, 0x81, 0x71, 0xdd, 0xb3, 0x68, 0xd7,
+	0x83, 0x19, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x62, 0x35, 0x73, 0x1d, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/enums/webpage_condition_operator.pb.go b/googleapis/ads/googleads/v3/enums/webpage_condition_operator.pb.go
new file mode 100644
index 0000000..f6f4ed5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/enums/webpage_condition_operator.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/enums/webpage_condition_operator.proto
+
+package enums
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The webpage condition operator in webpage criterion.
+type WebpageConditionOperatorEnum_WebpageConditionOperator int32
+
+const (
+	// Not specified.
+	WebpageConditionOperatorEnum_UNSPECIFIED WebpageConditionOperatorEnum_WebpageConditionOperator = 0
+	// Used for return value only. Represents value unknown in this version.
+	WebpageConditionOperatorEnum_UNKNOWN WebpageConditionOperatorEnum_WebpageConditionOperator = 1
+	// The argument web condition is equal to the compared web condition.
+	WebpageConditionOperatorEnum_EQUALS WebpageConditionOperatorEnum_WebpageConditionOperator = 2
+	// The argument web condition is part of the compared web condition.
+	WebpageConditionOperatorEnum_CONTAINS WebpageConditionOperatorEnum_WebpageConditionOperator = 3
+)
+
+var WebpageConditionOperatorEnum_WebpageConditionOperator_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "EQUALS",
+	3: "CONTAINS",
+}
+
+var WebpageConditionOperatorEnum_WebpageConditionOperator_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"EQUALS":      2,
+	"CONTAINS":    3,
+}
+
+func (x WebpageConditionOperatorEnum_WebpageConditionOperator) String() string {
+	return proto.EnumName(WebpageConditionOperatorEnum_WebpageConditionOperator_name, int32(x))
+}
+
+func (WebpageConditionOperatorEnum_WebpageConditionOperator) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b4b44426ec5939a0, []int{0, 0}
+}
+
+// Container for enum describing webpage condition operator in webpage
+// criterion.
+type WebpageConditionOperatorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *WebpageConditionOperatorEnum) Reset()         { *m = WebpageConditionOperatorEnum{} }
+func (m *WebpageConditionOperatorEnum) String() string { return proto.CompactTextString(m) }
+func (*WebpageConditionOperatorEnum) ProtoMessage()    {}
+func (*WebpageConditionOperatorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b4b44426ec5939a0, []int{0}
+}
+
+func (m *WebpageConditionOperatorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WebpageConditionOperatorEnum.Unmarshal(m, b)
+}
+func (m *WebpageConditionOperatorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WebpageConditionOperatorEnum.Marshal(b, m, deterministic)
+}
+func (m *WebpageConditionOperatorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WebpageConditionOperatorEnum.Merge(m, src)
+}
+func (m *WebpageConditionOperatorEnum) XXX_Size() int {
+	return xxx_messageInfo_WebpageConditionOperatorEnum.Size(m)
+}
+func (m *WebpageConditionOperatorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_WebpageConditionOperatorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WebpageConditionOperatorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.enums.WebpageConditionOperatorEnum_WebpageConditionOperator", WebpageConditionOperatorEnum_WebpageConditionOperator_name, WebpageConditionOperatorEnum_WebpageConditionOperator_value)
+	proto.RegisterType((*WebpageConditionOperatorEnum)(nil), "google.ads.googleads.v3.enums.WebpageConditionOperatorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/enums/webpage_condition_operator.proto", fileDescriptor_b4b44426ec5939a0)
+}
+
+var fileDescriptor_b4b44426ec5939a0 = []byte{
+	// 313 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x6a, 0x32, 0x31,
+	0x18, 0xfc, 0x5d, 0xc1, 0xbf, 0xc4, 0x42, 0x97, 0x3d, 0x95, 0xa2, 0x07, 0x7d, 0x80, 0xec, 0x21,
+	0xb7, 0x14, 0x0a, 0xd1, 0x6e, 0x45, 0x5a, 0xa2, 0xad, 0x55, 0xa1, 0x2c, 0x48, 0x34, 0x21, 0x2c,
+	0x68, 0xbe, 0x65, 0xb3, 0xda, 0xf7, 0xe9, 0xb1, 0x8f, 0xd2, 0x47, 0xe9, 0xb1, 0x4f, 0x50, 0x36,
+	0x71, 0xbd, 0xd9, 0x4b, 0x18, 0x32, 0xdf, 0xcc, 0x37, 0xdf, 0xa0, 0x3b, 0x0d, 0xa0, 0xb7, 0x2a,
+	0x16, 0xd2, 0xc6, 0x1e, 0x56, 0xe8, 0x40, 0x62, 0x65, 0xf6, 0x3b, 0x1b, 0xbf, 0xab, 0x75, 0x2e,
+	0xb4, 0x5a, 0x6d, 0xc0, 0xc8, 0xac, 0xcc, 0xc0, 0xac, 0x20, 0x57, 0x85, 0x28, 0xa1, 0xc0, 0x79,
+	0x01, 0x25, 0x44, 0x5d, 0x2f, 0xc2, 0x42, 0x5a, 0x7c, 0xd2, 0xe3, 0x03, 0xc1, 0x4e, 0x7f, 0xd3,
+	0xa9, 0xed, 0xf3, 0x2c, 0x16, 0xc6, 0x40, 0x29, 0x2a, 0x13, 0xeb, 0xc5, 0xfd, 0x02, 0x75, 0x96,
+	0x7e, 0xc1, 0xb0, 0xf6, 0x9f, 0x1c, 0xed, 0x13, 0xb3, 0xdf, 0xf5, 0x5f, 0xd0, 0xf5, 0x39, 0x3e,
+	0xba, 0x42, 0xed, 0x39, 0x9f, 0x4d, 0x93, 0xe1, 0xf8, 0x61, 0x9c, 0xdc, 0x87, 0xff, 0xa2, 0x36,
+	0xfa, 0x3f, 0xe7, 0x8f, 0x7c, 0xb2, 0xe4, 0x61, 0x23, 0x42, 0xa8, 0x95, 0x3c, 0xcf, 0xd9, 0xd3,
+	0x2c, 0x0c, 0xa2, 0x4b, 0x74, 0x31, 0x9c, 0xf0, 0x57, 0x36, 0xe6, 0xb3, 0xb0, 0x39, 0xf8, 0x69,
+	0xa0, 0xde, 0x06, 0x76, 0xf8, 0xcf, 0xdc, 0x83, 0xee, 0xb9, 0xbd, 0xd3, 0x2a, 0xf8, 0xb4, 0xf1,
+	0x36, 0x38, 0xea, 0x35, 0x6c, 0x85, 0xd1, 0x18, 0x0a, 0x1d, 0x6b, 0x65, 0xdc, 0x59, 0x75, 0x8f,
+	0x79, 0x66, 0xcf, 0xd4, 0x7a, 0xeb, 0xde, 0x8f, 0xa0, 0x39, 0x62, 0xec, 0x33, 0xe8, 0x8e, 0xbc,
+	0x15, 0x93, 0x16, 0x7b, 0x58, 0xa1, 0x05, 0xc1, 0x55, 0x07, 0xf6, 0xab, 0xe6, 0x53, 0x26, 0x6d,
+	0x7a, 0xe2, 0xd3, 0x05, 0x49, 0x1d, 0xff, 0x1d, 0xf4, 0xfc, 0x27, 0xa5, 0x4c, 0x5a, 0x4a, 0x4f,
+	0x13, 0x94, 0x2e, 0x08, 0xa5, 0x6e, 0x66, 0xdd, 0x72, 0xc1, 0xc8, 0x6f, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0xf4, 0xc4, 0x1d, 0x0e, 0xee, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/access_invitation_error.pb.go b/googleapis/ads/googleads/v3/errors/access_invitation_error.pb.go
new file mode 100644
index 0000000..a65ea18
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/access_invitation_error.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/access_invitation_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible AccessInvitation errors.
+type AccessInvitationErrorEnum_AccessInvitationError int32
+
+const (
+	// Enum unspecified.
+	AccessInvitationErrorEnum_UNSPECIFIED AccessInvitationErrorEnum_AccessInvitationError = 0
+	// The received error code is not known in this version.
+	AccessInvitationErrorEnum_UNKNOWN AccessInvitationErrorEnum_AccessInvitationError = 1
+	// The email address is invalid for sending an invitation.
+	AccessInvitationErrorEnum_INVALID_EMAIL_ADDRESS AccessInvitationErrorEnum_AccessInvitationError = 2
+	// Email address already has access to this customer.
+	AccessInvitationErrorEnum_EMAIL_ADDRESS_ALREADY_HAS_ACCESS AccessInvitationErrorEnum_AccessInvitationError = 3
+)
+
+var AccessInvitationErrorEnum_AccessInvitationError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INVALID_EMAIL_ADDRESS",
+	3: "EMAIL_ADDRESS_ALREADY_HAS_ACCESS",
+}
+
+var AccessInvitationErrorEnum_AccessInvitationError_value = map[string]int32{
+	"UNSPECIFIED":                      0,
+	"UNKNOWN":                          1,
+	"INVALID_EMAIL_ADDRESS":            2,
+	"EMAIL_ADDRESS_ALREADY_HAS_ACCESS": 3,
+}
+
+func (x AccessInvitationErrorEnum_AccessInvitationError) String() string {
+	return proto.EnumName(AccessInvitationErrorEnum_AccessInvitationError_name, int32(x))
+}
+
+func (AccessInvitationErrorEnum_AccessInvitationError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_83bb9ac67920b6f6, []int{0, 0}
+}
+
+// Container for enum describing possible AccessInvitation errors.
+type AccessInvitationErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AccessInvitationErrorEnum) Reset()         { *m = AccessInvitationErrorEnum{} }
+func (m *AccessInvitationErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AccessInvitationErrorEnum) ProtoMessage()    {}
+func (*AccessInvitationErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_83bb9ac67920b6f6, []int{0}
+}
+
+func (m *AccessInvitationErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccessInvitationErrorEnum.Unmarshal(m, b)
+}
+func (m *AccessInvitationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccessInvitationErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AccessInvitationErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccessInvitationErrorEnum.Merge(m, src)
+}
+func (m *AccessInvitationErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AccessInvitationErrorEnum.Size(m)
+}
+func (m *AccessInvitationErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccessInvitationErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccessInvitationErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AccessInvitationErrorEnum_AccessInvitationError", AccessInvitationErrorEnum_AccessInvitationError_name, AccessInvitationErrorEnum_AccessInvitationError_value)
+	proto.RegisterType((*AccessInvitationErrorEnum)(nil), "google.ads.googleads.v3.errors.AccessInvitationErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/access_invitation_error.proto", fileDescriptor_83bb9ac67920b6f6)
+}
+
+var fileDescriptor_83bb9ac67920b6f6 = []byte{
+	// 329 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x40,
+	0x10, 0x86, 0x4d, 0x0a, 0x0a, 0xdb, 0x83, 0x25, 0xd0, 0x43, 0x8b, 0x14, 0x09, 0x9e, 0x37, 0x87,
+	0xdc, 0x56, 0x2f, 0xd3, 0x66, 0xad, 0xc1, 0x1a, 0x4b, 0x43, 0x23, 0x4a, 0x60, 0x59, 0x9b, 0xb0,
+	0x04, 0xda, 0xdd, 0x92, 0xad, 0x79, 0x11, 0xdf, 0xc0, 0xa3, 0x8f, 0xe2, 0xa3, 0x78, 0xf7, 0x2e,
+	0xc9, 0xda, 0x80, 0x50, 0x3d, 0xed, 0xcf, 0xcc, 0xff, 0xfd, 0x3b, 0x33, 0xe8, 0x4a, 0x28, 0x25,
+	0xd6, 0xb9, 0xc7, 0x33, 0xed, 0x19, 0x59, 0xab, 0xca, 0xf7, 0xf2, 0xb2, 0x54, 0xa5, 0xf6, 0xf8,
+	0x6a, 0x95, 0x6b, 0xcd, 0x0a, 0x59, 0x15, 0x3b, 0xbe, 0x2b, 0x94, 0x64, 0x4d, 0x03, 0x6f, 0x4b,
+	0xb5, 0x53, 0xce, 0xc8, 0x20, 0x98, 0x67, 0x1a, 0xb7, 0x34, 0xae, 0x7c, 0x6c, 0xe8, 0xe1, 0xd9,
+	0x3e, 0x7d, 0x5b, 0x78, 0x5c, 0x4a, 0x65, 0x22, 0xb4, 0xa1, 0xdd, 0x57, 0x0b, 0x0d, 0xa0, 0xc9,
+	0x0f, 0xdb, 0x78, 0x5a, 0x83, 0x54, 0xbe, 0x6c, 0xdc, 0x0a, 0xf5, 0x0f, 0x36, 0x9d, 0x53, 0xd4,
+	0x5d, 0x46, 0xf1, 0x9c, 0x4e, 0xc2, 0xeb, 0x90, 0x06, 0xbd, 0x23, 0xa7, 0x8b, 0x4e, 0x96, 0xd1,
+	0x6d, 0x74, 0xff, 0x10, 0xf5, 0x2c, 0x67, 0x80, 0xfa, 0x61, 0x94, 0xc0, 0x2c, 0x0c, 0x18, 0xbd,
+	0x83, 0x70, 0xc6, 0x20, 0x08, 0x16, 0x34, 0x8e, 0x7b, 0xb6, 0x73, 0x81, 0xce, 0x7f, 0x95, 0x18,
+	0xcc, 0x16, 0x14, 0x82, 0x47, 0x76, 0x03, 0x31, 0x83, 0xc9, 0xa4, 0x76, 0x75, 0xc6, 0x5f, 0x16,
+	0x72, 0x57, 0x6a, 0x83, 0xff, 0x5f, 0x6d, 0x3c, 0x3c, 0x38, 0xdc, 0xbc, 0x5e, 0x6c, 0x6e, 0x3d,
+	0x05, 0x3f, 0xb4, 0x50, 0x6b, 0x2e, 0x05, 0x56, 0xa5, 0xf0, 0x44, 0x2e, 0x9b, 0xb5, 0xf7, 0x67,
+	0xde, 0x16, 0xfa, 0xaf, 0xab, 0x5f, 0x9a, 0xe7, 0xcd, 0xee, 0x4c, 0x01, 0xde, 0xed, 0xd1, 0xd4,
+	0x84, 0x41, 0xa6, 0xb1, 0x91, 0xb5, 0x4a, 0x7c, 0xdc, 0x7c, 0xa9, 0x3f, 0xf6, 0x86, 0x14, 0x32,
+	0x9d, 0xb6, 0x86, 0x34, 0xf1, 0x53, 0x63, 0xf8, 0xb4, 0x5d, 0x53, 0x25, 0x04, 0x32, 0x4d, 0x48,
+	0x6b, 0x21, 0x24, 0xf1, 0x09, 0x31, 0xa6, 0xe7, 0xe3, 0x66, 0x3a, 0xff, 0x3b, 0x00, 0x00, 0xff,
+	0xff, 0xd8, 0x6b, 0x44, 0xc4, 0x12, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/account_budget_proposal_error.pb.go b/googleapis/ads/googleads/v3/errors/account_budget_proposal_error.pb.go
new file mode 100644
index 0000000..acaa74b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/account_budget_proposal_error.pb.go
@@ -0,0 +1,231 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/account_budget_proposal_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible account budget proposal errors.
+type AccountBudgetProposalErrorEnum_AccountBudgetProposalError int32
+
+const (
+	// Enum unspecified.
+	AccountBudgetProposalErrorEnum_UNSPECIFIED AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 0
+	// The received error code is not known in this version.
+	AccountBudgetProposalErrorEnum_UNKNOWN AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 1
+	// The field mask must be empty for create/end/remove proposals.
+	AccountBudgetProposalErrorEnum_FIELD_MASK_NOT_ALLOWED AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 2
+	// The field cannot be set because of the proposal type.
+	AccountBudgetProposalErrorEnum_IMMUTABLE_FIELD AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 3
+	// The field is required because of the proposal type.
+	AccountBudgetProposalErrorEnum_REQUIRED_FIELD_MISSING AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 4
+	// Proposals that have been approved cannot be cancelled.
+	AccountBudgetProposalErrorEnum_CANNOT_CANCEL_APPROVED_PROPOSAL AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 5
+	// Budgets that haven't been approved cannot be removed.
+	AccountBudgetProposalErrorEnum_CANNOT_REMOVE_UNAPPROVED_BUDGET AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 6
+	// Budgets that are currently running cannot be removed.
+	AccountBudgetProposalErrorEnum_CANNOT_REMOVE_RUNNING_BUDGET AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 7
+	// Budgets that haven't been approved cannot be truncated.
+	AccountBudgetProposalErrorEnum_CANNOT_END_UNAPPROVED_BUDGET AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 8
+	// Only budgets that are currently running can be truncated.
+	AccountBudgetProposalErrorEnum_CANNOT_END_INACTIVE_BUDGET AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 9
+	// All budgets must have names.
+	AccountBudgetProposalErrorEnum_BUDGET_NAME_REQUIRED AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 10
+	// Expired budgets cannot be edited after a sufficient amount of time has
+	// passed.
+	AccountBudgetProposalErrorEnum_CANNOT_UPDATE_OLD_BUDGET AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 11
+	// It is not permissible a propose a new budget that ends in the past.
+	AccountBudgetProposalErrorEnum_CANNOT_END_IN_PAST AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 12
+	// An expired budget cannot be extended to overlap with the running budget.
+	AccountBudgetProposalErrorEnum_CANNOT_EXTEND_END_TIME AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 13
+	// A purchase order number is required.
+	AccountBudgetProposalErrorEnum_PURCHASE_ORDER_NUMBER_REQUIRED AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 14
+	// Budgets that have a pending update cannot be updated.
+	AccountBudgetProposalErrorEnum_PENDING_UPDATE_PROPOSAL_EXISTS AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 15
+	// Cannot propose more than one budget when the corresponding billing setup
+	// hasn't been approved.
+	AccountBudgetProposalErrorEnum_MULTIPLE_BUDGETS_NOT_ALLOWED_FOR_UNAPPROVED_BILLING_SETUP AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 16
+	// Cannot update the start time of a budget that has already started.
+	AccountBudgetProposalErrorEnum_CANNOT_UPDATE_START_TIME_FOR_STARTED_BUDGET AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 17
+	// Cannot update the spending limit of a budget with an amount lower than
+	// what has already been spent.
+	AccountBudgetProposalErrorEnum_SPENDING_LIMIT_LOWER_THAN_ACCRUED_COST_NOT_ALLOWED AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 18
+	// Cannot propose a budget update without actually changing any fields.
+	AccountBudgetProposalErrorEnum_UPDATE_IS_NO_OP AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 19
+	// The end time must come after the start time.
+	AccountBudgetProposalErrorEnum_END_TIME_MUST_FOLLOW_START_TIME AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 20
+	// The budget's date range must fall within the date range of its billing
+	// setup.
+	AccountBudgetProposalErrorEnum_BUDGET_DATE_RANGE_INCOMPATIBLE_WITH_BILLING_SETUP AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 21
+	// The user is not authorized to mutate budgets for the given billing setup.
+	AccountBudgetProposalErrorEnum_NOT_AUTHORIZED AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 22
+	// Mutates are not allowed for the given billing setup.
+	AccountBudgetProposalErrorEnum_INVALID_BILLING_SETUP AccountBudgetProposalErrorEnum_AccountBudgetProposalError = 23
+)
+
+var AccountBudgetProposalErrorEnum_AccountBudgetProposalError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "FIELD_MASK_NOT_ALLOWED",
+	3:  "IMMUTABLE_FIELD",
+	4:  "REQUIRED_FIELD_MISSING",
+	5:  "CANNOT_CANCEL_APPROVED_PROPOSAL",
+	6:  "CANNOT_REMOVE_UNAPPROVED_BUDGET",
+	7:  "CANNOT_REMOVE_RUNNING_BUDGET",
+	8:  "CANNOT_END_UNAPPROVED_BUDGET",
+	9:  "CANNOT_END_INACTIVE_BUDGET",
+	10: "BUDGET_NAME_REQUIRED",
+	11: "CANNOT_UPDATE_OLD_BUDGET",
+	12: "CANNOT_END_IN_PAST",
+	13: "CANNOT_EXTEND_END_TIME",
+	14: "PURCHASE_ORDER_NUMBER_REQUIRED",
+	15: "PENDING_UPDATE_PROPOSAL_EXISTS",
+	16: "MULTIPLE_BUDGETS_NOT_ALLOWED_FOR_UNAPPROVED_BILLING_SETUP",
+	17: "CANNOT_UPDATE_START_TIME_FOR_STARTED_BUDGET",
+	18: "SPENDING_LIMIT_LOWER_THAN_ACCRUED_COST_NOT_ALLOWED",
+	19: "UPDATE_IS_NO_OP",
+	20: "END_TIME_MUST_FOLLOW_START_TIME",
+	21: "BUDGET_DATE_RANGE_INCOMPATIBLE_WITH_BILLING_SETUP",
+	22: "NOT_AUTHORIZED",
+	23: "INVALID_BILLING_SETUP",
+}
+
+var AccountBudgetProposalErrorEnum_AccountBudgetProposalError_value = map[string]int32{
+	"UNSPECIFIED":                     0,
+	"UNKNOWN":                         1,
+	"FIELD_MASK_NOT_ALLOWED":          2,
+	"IMMUTABLE_FIELD":                 3,
+	"REQUIRED_FIELD_MISSING":          4,
+	"CANNOT_CANCEL_APPROVED_PROPOSAL": 5,
+	"CANNOT_REMOVE_UNAPPROVED_BUDGET": 6,
+	"CANNOT_REMOVE_RUNNING_BUDGET":    7,
+	"CANNOT_END_UNAPPROVED_BUDGET":    8,
+	"CANNOT_END_INACTIVE_BUDGET":      9,
+	"BUDGET_NAME_REQUIRED":            10,
+	"CANNOT_UPDATE_OLD_BUDGET":        11,
+	"CANNOT_END_IN_PAST":              12,
+	"CANNOT_EXTEND_END_TIME":          13,
+	"PURCHASE_ORDER_NUMBER_REQUIRED":  14,
+	"PENDING_UPDATE_PROPOSAL_EXISTS":  15,
+	"MULTIPLE_BUDGETS_NOT_ALLOWED_FOR_UNAPPROVED_BILLING_SETUP": 16,
+	"CANNOT_UPDATE_START_TIME_FOR_STARTED_BUDGET":               17,
+	"SPENDING_LIMIT_LOWER_THAN_ACCRUED_COST_NOT_ALLOWED":        18,
+	"UPDATE_IS_NO_OP":                                   19,
+	"END_TIME_MUST_FOLLOW_START_TIME":                   20,
+	"BUDGET_DATE_RANGE_INCOMPATIBLE_WITH_BILLING_SETUP": 21,
+	"NOT_AUTHORIZED":                                    22,
+	"INVALID_BILLING_SETUP":                             23,
+}
+
+func (x AccountBudgetProposalErrorEnum_AccountBudgetProposalError) String() string {
+	return proto.EnumName(AccountBudgetProposalErrorEnum_AccountBudgetProposalError_name, int32(x))
+}
+
+func (AccountBudgetProposalErrorEnum_AccountBudgetProposalError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_82eaf8fa240a3a68, []int{0, 0}
+}
+
+// Container for enum describing possible account budget proposal errors.
+type AccountBudgetProposalErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AccountBudgetProposalErrorEnum) Reset()         { *m = AccountBudgetProposalErrorEnum{} }
+func (m *AccountBudgetProposalErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AccountBudgetProposalErrorEnum) ProtoMessage()    {}
+func (*AccountBudgetProposalErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_82eaf8fa240a3a68, []int{0}
+}
+
+func (m *AccountBudgetProposalErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccountBudgetProposalErrorEnum.Unmarshal(m, b)
+}
+func (m *AccountBudgetProposalErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccountBudgetProposalErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AccountBudgetProposalErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccountBudgetProposalErrorEnum.Merge(m, src)
+}
+func (m *AccountBudgetProposalErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AccountBudgetProposalErrorEnum.Size(m)
+}
+func (m *AccountBudgetProposalErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccountBudgetProposalErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccountBudgetProposalErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AccountBudgetProposalErrorEnum_AccountBudgetProposalError", AccountBudgetProposalErrorEnum_AccountBudgetProposalError_name, AccountBudgetProposalErrorEnum_AccountBudgetProposalError_value)
+	proto.RegisterType((*AccountBudgetProposalErrorEnum)(nil), "google.ads.googleads.v3.errors.AccountBudgetProposalErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/account_budget_proposal_error.proto", fileDescriptor_82eaf8fa240a3a68)
+}
+
+var fileDescriptor_82eaf8fa240a3a68 = []byte{
+	// 686 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xcb, 0x6e, 0x13, 0x3d,
+	0x14, 0xfe, 0x9b, 0xfe, 0xa4, 0xe0, 0x42, 0x6b, 0xdc, 0x0b, 0x25, 0xaa, 0x52, 0x14, 0x96, 0x48,
+	0x13, 0x41, 0x04, 0x12, 0x83, 0x58, 0x38, 0x33, 0x4e, 0x62, 0x75, 0xc6, 0x36, 0xbe, 0xa4, 0x55,
+	0x15, 0xc9, 0x4a, 0x9b, 0x28, 0xaa, 0xd4, 0x66, 0xa2, 0x4c, 0xda, 0x07, 0x62, 0xc9, 0x8e, 0xd7,
+	0x60, 0xcd, 0x53, 0xf0, 0x08, 0xac, 0x90, 0x67, 0x32, 0x69, 0x52, 0x51, 0x16, 0x51, 0xce, 0xd8,
+	0xdf, 0xe5, 0x9c, 0x63, 0x1f, 0x83, 0xe6, 0x28, 0x49, 0x46, 0x57, 0xc3, 0x7a, 0x7f, 0x90, 0xd6,
+	0xf3, 0xd0, 0x45, 0xb7, 0x8d, 0xfa, 0x70, 0x3a, 0x4d, 0xa6, 0x69, 0xbd, 0x7f, 0x71, 0x91, 0xdc,
+	0x8c, 0x67, 0xf6, 0xfc, 0x66, 0x30, 0x1a, 0xce, 0xec, 0x64, 0x9a, 0x4c, 0x92, 0xb4, 0x7f, 0x65,
+	0xb3, 0x6d, 0x6f, 0x32, 0x4d, 0x66, 0x09, 0xaa, 0xe6, 0x44, 0xaf, 0x3f, 0x48, 0xbd, 0x85, 0x86,
+	0x77, 0xdb, 0xf0, 0x72, 0x8d, 0xca, 0x61, 0xe1, 0x31, 0xb9, 0xac, 0xf7, 0xc7, 0xe3, 0x64, 0xd6,
+	0x9f, 0x5d, 0x26, 0xe3, 0x34, 0x67, 0xd7, 0x7e, 0x96, 0x41, 0x15, 0xe7, 0x2e, 0xcd, 0xcc, 0x44,
+	0xcc, 0x3d, 0x88, 0x63, 0x93, 0xf1, 0xcd, 0x75, 0xed, 0x7b, 0x19, 0x54, 0x1e, 0x86, 0xa0, 0x6d,
+	0xb0, 0x69, 0x98, 0x12, 0x24, 0xa0, 0x2d, 0x4a, 0x42, 0xf8, 0x1f, 0xda, 0x04, 0x1b, 0x86, 0x1d,
+	0x33, 0x7e, 0xc2, 0xe0, 0x1a, 0xaa, 0x80, 0xfd, 0x16, 0x25, 0x51, 0x68, 0x63, 0xac, 0x8e, 0x2d,
+	0xe3, 0xda, 0xe2, 0x28, 0xe2, 0x27, 0x24, 0x84, 0x25, 0xb4, 0x03, 0xb6, 0x69, 0x1c, 0x1b, 0x8d,
+	0x9b, 0x11, 0xb1, 0x19, 0x0a, 0xae, 0x3b, 0x82, 0x24, 0x5f, 0x0c, 0x95, 0x24, 0xb4, 0x73, 0x26,
+	0x55, 0x8a, 0xb2, 0x36, 0xfc, 0x1f, 0xbd, 0x06, 0x47, 0x01, 0x66, 0x4e, 0x24, 0xc0, 0x2c, 0x20,
+	0x91, 0xc5, 0x42, 0x48, 0xde, 0x25, 0xa1, 0x15, 0x92, 0x0b, 0xae, 0x70, 0x04, 0x1f, 0x2d, 0x81,
+	0x24, 0x89, 0x79, 0x97, 0x58, 0xc3, 0x16, 0xb0, 0xa6, 0x09, 0xdb, 0x44, 0xc3, 0x32, 0x7a, 0x05,
+	0x0e, 0x57, 0x41, 0xd2, 0x30, 0x46, 0x59, 0xbb, 0x40, 0x6c, 0x2c, 0x21, 0x08, 0x0b, 0xff, 0xa2,
+	0xf1, 0x18, 0x55, 0x41, 0x65, 0x09, 0x41, 0x19, 0x0e, 0x34, 0xed, 0x92, 0x62, 0xff, 0x09, 0x3a,
+	0x00, 0xbb, 0x79, 0x6c, 0x19, 0x8e, 0x89, 0x2d, 0xaa, 0x82, 0x00, 0x1d, 0x82, 0x83, 0x39, 0xd3,
+	0x88, 0x10, 0x6b, 0x62, 0x79, 0xb4, 0xd0, 0xdd, 0x44, 0xfb, 0x00, 0xad, 0xe8, 0x5a, 0x81, 0x95,
+	0x86, 0x4f, 0x5d, 0x67, 0x8a, 0xf5, 0x53, 0xed, 0xb6, 0xdc, 0x4f, 0xd3, 0x98, 0xc0, 0x67, 0xa8,
+	0x06, 0xaa, 0xc2, 0xc8, 0xa0, 0x83, 0x15, 0xb1, 0x5c, 0x86, 0x44, 0x5a, 0x66, 0xe2, 0x26, 0x91,
+	0x77, 0xae, 0x5b, 0x19, 0x86, 0xb0, 0xd0, 0x55, 0x39, 0xb7, 0x2d, 0xba, 0x66, 0xc9, 0x29, 0x55,
+	0x5a, 0xc1, 0x6d, 0xf4, 0x19, 0x7c, 0x8c, 0x4d, 0xa4, 0xa9, 0x88, 0x8a, 0x42, 0xd4, 0xf2, 0xa1,
+	0xd9, 0x16, 0x97, 0x2b, 0xbd, 0xa0, 0x51, 0xe4, 0xf4, 0x14, 0xd1, 0x46, 0x40, 0x88, 0xea, 0xe0,
+	0xcd, 0x6a, 0x61, 0x4a, 0x63, 0xa9, 0xb3, 0x24, 0x33, 0x6a, 0xf6, 0x79, 0xd7, 0xc3, 0xe7, 0xe8,
+	0x03, 0x78, 0xa7, 0x8a, 0xa4, 0x22, 0x1a, 0x53, 0x6d, 0x9d, 0x8f, 0xb4, 0xba, 0x83, 0x99, 0xc5,
+	0x41, 0x20, 0x0d, 0x09, 0x6d, 0xc0, 0x95, 0x5e, 0xb9, 0x3a, 0xc8, 0x5d, 0x9d, 0xb9, 0x03, 0x75,
+	0x09, 0x5a, 0x2e, 0xe0, 0x8e, 0x3b, 0xf9, 0xa2, 0x25, 0x36, 0x36, 0x4a, 0xdb, 0x16, 0x77, 0x84,
+	0xa5, 0x24, 0xe0, 0x2e, 0x7a, 0x0f, 0xde, 0xce, 0x4f, 0x25, 0xa3, 0x4b, 0xcc, 0xda, 0xc4, 0x52,
+	0x16, 0xf0, 0x58, 0x60, 0x4d, 0xdd, 0x4d, 0x3c, 0xa1, 0xba, 0x73, 0xaf, 0xb2, 0x3d, 0x84, 0xc0,
+	0x56, 0x96, 0x81, 0xd1, 0x1d, 0x2e, 0xe9, 0x19, 0x09, 0xe1, 0x3e, 0x7a, 0x09, 0xf6, 0x28, 0xeb,
+	0xe2, 0x88, 0xde, 0x6f, 0xc4, 0x8b, 0xe6, 0xef, 0x35, 0x50, 0xbb, 0x48, 0xae, 0xbd, 0x7f, 0xcf,
+	0x66, 0xf3, 0xe8, 0xe1, 0xb9, 0x12, 0x6e, 0x3c, 0xc5, 0xda, 0x59, 0x38, 0x97, 0x18, 0x25, 0x57,
+	0xfd, 0xf1, 0xc8, 0x4b, 0xa6, 0xa3, 0xfa, 0x68, 0x38, 0xce, 0x86, 0xb7, 0x78, 0x32, 0x26, 0x97,
+	0xe9, 0x43, 0x2f, 0xc8, 0xa7, 0xfc, 0xef, 0x6b, 0x69, 0xbd, 0x8d, 0xf1, 0xb7, 0x52, 0xb5, 0x9d,
+	0x8b, 0xe1, 0x41, 0xea, 0xe5, 0xa1, 0x8b, 0xba, 0x0d, 0x2f, 0xb3, 0x4c, 0x7f, 0x14, 0x80, 0x1e,
+	0x1e, 0xa4, 0xbd, 0x05, 0xa0, 0xd7, 0x6d, 0xf4, 0x72, 0xc0, 0xaf, 0x52, 0x2d, 0x5f, 0xf5, 0x7d,
+	0x3c, 0x48, 0x7d, 0x7f, 0x01, 0xf1, 0xfd, 0x6e, 0xc3, 0xf7, 0x73, 0xd0, 0x79, 0x39, 0xcb, 0xae,
+	0xf1, 0x27, 0x00, 0x00, 0xff, 0xff, 0x1f, 0xfc, 0x4e, 0x26, 0xde, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/ad_customizer_error.pb.go b/googleapis/ads/googleads/v3/errors/ad_customizer_error.pb.go
new file mode 100644
index 0000000..3312504
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/ad_customizer_error.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/ad_customizer_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ad customizer errors.
+type AdCustomizerErrorEnum_AdCustomizerError int32
+
+const (
+	// Enum unspecified.
+	AdCustomizerErrorEnum_UNSPECIFIED AdCustomizerErrorEnum_AdCustomizerError = 0
+	// The received error code is not known in this version.
+	AdCustomizerErrorEnum_UNKNOWN AdCustomizerErrorEnum_AdCustomizerError = 1
+	// Invalid date argument in countdown function.
+	AdCustomizerErrorEnum_COUNTDOWN_INVALID_DATE_FORMAT AdCustomizerErrorEnum_AdCustomizerError = 2
+	// Countdown end date is in the past.
+	AdCustomizerErrorEnum_COUNTDOWN_DATE_IN_PAST AdCustomizerErrorEnum_AdCustomizerError = 3
+	// Invalid locale string in countdown function.
+	AdCustomizerErrorEnum_COUNTDOWN_INVALID_LOCALE AdCustomizerErrorEnum_AdCustomizerError = 4
+	// Days-before argument to countdown function is not positive.
+	AdCustomizerErrorEnum_COUNTDOWN_INVALID_START_DAYS_BEFORE AdCustomizerErrorEnum_AdCustomizerError = 5
+	// A user list referenced in an IF function does not exist.
+	AdCustomizerErrorEnum_UNKNOWN_USER_LIST AdCustomizerErrorEnum_AdCustomizerError = 6
+)
+
+var AdCustomizerErrorEnum_AdCustomizerError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "COUNTDOWN_INVALID_DATE_FORMAT",
+	3: "COUNTDOWN_DATE_IN_PAST",
+	4: "COUNTDOWN_INVALID_LOCALE",
+	5: "COUNTDOWN_INVALID_START_DAYS_BEFORE",
+	6: "UNKNOWN_USER_LIST",
+}
+
+var AdCustomizerErrorEnum_AdCustomizerError_value = map[string]int32{
+	"UNSPECIFIED":                         0,
+	"UNKNOWN":                             1,
+	"COUNTDOWN_INVALID_DATE_FORMAT":       2,
+	"COUNTDOWN_DATE_IN_PAST":              3,
+	"COUNTDOWN_INVALID_LOCALE":            4,
+	"COUNTDOWN_INVALID_START_DAYS_BEFORE": 5,
+	"UNKNOWN_USER_LIST":                   6,
+}
+
+func (x AdCustomizerErrorEnum_AdCustomizerError) String() string {
+	return proto.EnumName(AdCustomizerErrorEnum_AdCustomizerError_name, int32(x))
+}
+
+func (AdCustomizerErrorEnum_AdCustomizerError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_83f4cb4ac17f0827, []int{0, 0}
+}
+
+// Container for enum describing possible ad customizer errors.
+type AdCustomizerErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdCustomizerErrorEnum) Reset()         { *m = AdCustomizerErrorEnum{} }
+func (m *AdCustomizerErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdCustomizerErrorEnum) ProtoMessage()    {}
+func (*AdCustomizerErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_83f4cb4ac17f0827, []int{0}
+}
+
+func (m *AdCustomizerErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdCustomizerErrorEnum.Unmarshal(m, b)
+}
+func (m *AdCustomizerErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdCustomizerErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdCustomizerErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdCustomizerErrorEnum.Merge(m, src)
+}
+func (m *AdCustomizerErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdCustomizerErrorEnum.Size(m)
+}
+func (m *AdCustomizerErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdCustomizerErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdCustomizerErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdCustomizerErrorEnum_AdCustomizerError", AdCustomizerErrorEnum_AdCustomizerError_name, AdCustomizerErrorEnum_AdCustomizerError_value)
+	proto.RegisterType((*AdCustomizerErrorEnum)(nil), "google.ads.googleads.v3.errors.AdCustomizerErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/ad_customizer_error.proto", fileDescriptor_83f4cb4ac17f0827)
+}
+
+var fileDescriptor_83f4cb4ac17f0827 = []byte{
+	// 386 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xcf, 0x8e, 0x94, 0x40,
+	0x10, 0xc6, 0x85, 0xd5, 0x35, 0xe9, 0x3d, 0xc8, 0x76, 0xb2, 0x1b, 0xb3, 0x59, 0x37, 0x11, 0x0f,
+	0xde, 0x9a, 0x03, 0x17, 0xd3, 0x9e, 0x7a, 0xa0, 0x67, 0x42, 0xc4, 0x86, 0xf0, 0x6f, 0xa2, 0x21,
+	0xe9, 0xe0, 0x40, 0x08, 0xc9, 0x0c, 0x3d, 0xa1, 0x99, 0x39, 0xf8, 0x38, 0x1e, 0x7d, 0x14, 0x0f,
+	0x3e, 0x87, 0xf1, 0xe6, 0x1b, 0x18, 0xe8, 0x19, 0x3c, 0x10, 0xf7, 0xc4, 0x97, 0xaa, 0xdf, 0x57,
+	0x54, 0x7f, 0x05, 0xde, 0xd5, 0x42, 0xd4, 0xdb, 0xca, 0x2a, 0x4a, 0x69, 0x29, 0x39, 0xa8, 0xa3,
+	0x6d, 0x55, 0x5d, 0x27, 0x3a, 0x69, 0x15, 0x25, 0xdf, 0x1c, 0x64, 0x2f, 0x76, 0xcd, 0xd7, 0xaa,
+	0xe3, 0x63, 0x11, 0xed, 0x3b, 0xd1, 0x0b, 0xf8, 0xa0, 0x70, 0x54, 0x94, 0x12, 0x4d, 0x4e, 0x74,
+	0xb4, 0x91, 0x72, 0xde, 0xdd, 0x9f, 0x27, 0xef, 0x1b, 0xab, 0x68, 0x5b, 0xd1, 0x17, 0x7d, 0x23,
+	0x5a, 0xa9, 0xdc, 0xe6, 0x2f, 0x0d, 0xdc, 0x90, 0xd2, 0x99, 0x46, 0xd3, 0xc1, 0x44, 0xdb, 0xc3,
+	0xce, 0xfc, 0xa9, 0x81, 0xeb, 0x59, 0x07, 0xbe, 0x00, 0x57, 0x29, 0x8b, 0x43, 0xea, 0x78, 0x4b,
+	0x8f, 0xba, 0xc6, 0x13, 0x78, 0x05, 0x9e, 0xa7, 0xec, 0x03, 0x0b, 0xd6, 0xcc, 0xd0, 0xe0, 0x6b,
+	0xf0, 0xca, 0x09, 0x52, 0x96, 0xb8, 0xc1, 0x9a, 0x71, 0x8f, 0x65, 0xc4, 0xf7, 0x5c, 0xee, 0x92,
+	0x84, 0xf2, 0x65, 0x10, 0x7d, 0x24, 0x89, 0xa1, 0xc3, 0x3b, 0x70, 0xfb, 0x0f, 0x19, 0x5b, 0x1e,
+	0xe3, 0x21, 0x89, 0x13, 0xe3, 0x02, 0xde, 0x83, 0x97, 0x73, 0xbb, 0x1f, 0x38, 0xc4, 0xa7, 0xc6,
+	0x53, 0xf8, 0x16, 0xbc, 0x99, 0x77, 0xe3, 0x84, 0x44, 0x09, 0x77, 0xc9, 0xa7, 0x98, 0x2f, 0xe8,
+	0x32, 0x88, 0xa8, 0xf1, 0x0c, 0xde, 0x80, 0xeb, 0xd3, 0x4a, 0x3c, 0x8d, 0x69, 0xc4, 0x7d, 0x2f,
+	0x4e, 0x8c, 0xcb, 0xc5, 0x1f, 0x0d, 0x98, 0x1b, 0xb1, 0x43, 0x8f, 0xe7, 0xb5, 0xb8, 0x9d, 0x3d,
+	0x3a, 0x1c, 0x92, 0x0a, 0xb5, 0xcf, 0xee, 0xc9, 0x59, 0x8b, 0x6d, 0xd1, 0xd6, 0x48, 0x74, 0xb5,
+	0x55, 0x57, 0xed, 0x98, 0xe3, 0xf9, 0x66, 0xfb, 0x46, 0xfe, 0xef, 0x84, 0xef, 0xd5, 0xe7, 0x9b,
+	0x7e, 0xb1, 0x22, 0xe4, 0xbb, 0xfe, 0xb0, 0x52, 0xc3, 0x48, 0x29, 0x91, 0x92, 0x83, 0xca, 0x6c,
+	0x34, 0xfe, 0x52, 0xfe, 0x38, 0x03, 0x39, 0x29, 0x65, 0x3e, 0x01, 0x79, 0x66, 0xe7, 0x0a, 0xf8,
+	0xad, 0x9b, 0xaa, 0x8a, 0x31, 0x29, 0x25, 0xc6, 0x13, 0x82, 0x71, 0x66, 0x63, 0xac, 0xa0, 0x2f,
+	0x97, 0xe3, 0x76, 0xf6, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xe2, 0x63, 0xa5, 0x5f, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/ad_error.pb.go b/googleapis/ads/googleads/v3/errors/ad_error.pb.go
new file mode 100644
index 0000000..0909eac
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/ad_error.pb.go
@@ -0,0 +1,801 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/ad_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ad errors.
+type AdErrorEnum_AdError int32
+
+const (
+	// Enum unspecified.
+	AdErrorEnum_UNSPECIFIED AdErrorEnum_AdError = 0
+	// The received error code is not known in this version.
+	AdErrorEnum_UNKNOWN AdErrorEnum_AdError = 1
+	// Ad customizers are not supported for ad type.
+	AdErrorEnum_AD_CUSTOMIZERS_NOT_SUPPORTED_FOR_AD_TYPE AdErrorEnum_AdError = 2
+	// Estimating character sizes the string is too long.
+	AdErrorEnum_APPROXIMATELY_TOO_LONG AdErrorEnum_AdError = 3
+	// Estimating character sizes the string is too short.
+	AdErrorEnum_APPROXIMATELY_TOO_SHORT AdErrorEnum_AdError = 4
+	// There is a problem with the snippet.
+	AdErrorEnum_BAD_SNIPPET AdErrorEnum_AdError = 5
+	// Cannot modify an ad.
+	AdErrorEnum_CANNOT_MODIFY_AD AdErrorEnum_AdError = 6
+	// business name and url cannot be set at the same time
+	AdErrorEnum_CANNOT_SET_BUSINESS_NAME_IF_URL_SET AdErrorEnum_AdError = 7
+	// The specified field is incompatible with this ad's type or settings.
+	AdErrorEnum_CANNOT_SET_FIELD AdErrorEnum_AdError = 8
+	// Cannot set field when originAdId is set.
+	AdErrorEnum_CANNOT_SET_FIELD_WITH_ORIGIN_AD_ID_SET AdErrorEnum_AdError = 9
+	// Cannot set field when an existing ad id is set for sharing.
+	AdErrorEnum_CANNOT_SET_FIELD_WITH_AD_ID_SET_FOR_SHARING AdErrorEnum_AdError = 10
+	// Cannot set allowFlexibleColor false if no color is provided by user.
+	AdErrorEnum_CANNOT_SET_ALLOW_FLEXIBLE_COLOR_FALSE AdErrorEnum_AdError = 11
+	// When user select native, no color control is allowed because we will
+	// always respect publisher color for native format serving.
+	AdErrorEnum_CANNOT_SET_COLOR_CONTROL_WHEN_NATIVE_FORMAT_SETTING AdErrorEnum_AdError = 12
+	// Cannot specify a url for the ad type
+	AdErrorEnum_CANNOT_SET_URL AdErrorEnum_AdError = 13
+	// Cannot specify a tracking or mobile url without also setting final urls
+	AdErrorEnum_CANNOT_SET_WITHOUT_FINAL_URLS AdErrorEnum_AdError = 14
+	// Cannot specify a legacy url and a final url simultaneously
+	AdErrorEnum_CANNOT_SET_WITH_FINAL_URLS AdErrorEnum_AdError = 15
+	// Cannot specify a urls in UrlData and in template fields simultaneously.
+	AdErrorEnum_CANNOT_SET_WITH_URL_DATA AdErrorEnum_AdError = 17
+	// This operator cannot be used with a subclass of Ad.
+	AdErrorEnum_CANNOT_USE_AD_SUBCLASS_FOR_OPERATOR AdErrorEnum_AdError = 18
+	// Customer is not approved for mobile ads.
+	AdErrorEnum_CUSTOMER_NOT_APPROVED_MOBILEADS AdErrorEnum_AdError = 19
+	// Customer is not approved for 3PAS richmedia ads.
+	AdErrorEnum_CUSTOMER_NOT_APPROVED_THIRDPARTY_ADS AdErrorEnum_AdError = 20
+	// Customer is not approved for 3PAS redirect richmedia (Ad Exchange) ads.
+	AdErrorEnum_CUSTOMER_NOT_APPROVED_THIRDPARTY_REDIRECT_ADS AdErrorEnum_AdError = 21
+	// Not an eligible customer
+	AdErrorEnum_CUSTOMER_NOT_ELIGIBLE AdErrorEnum_AdError = 22
+	// Customer is not eligible for updating beacon url
+	AdErrorEnum_CUSTOMER_NOT_ELIGIBLE_FOR_UPDATING_BEACON_URL AdErrorEnum_AdError = 23
+	// There already exists an ad with the same dimensions in the union.
+	AdErrorEnum_DIMENSION_ALREADY_IN_UNION AdErrorEnum_AdError = 24
+	// Ad's dimension must be set before setting union dimension.
+	AdErrorEnum_DIMENSION_MUST_BE_SET AdErrorEnum_AdError = 25
+	// Ad's dimension must be included in the union dimensions.
+	AdErrorEnum_DIMENSION_NOT_IN_UNION AdErrorEnum_AdError = 26
+	// Display Url cannot be specified (applies to Ad Exchange Ads)
+	AdErrorEnum_DISPLAY_URL_CANNOT_BE_SPECIFIED AdErrorEnum_AdError = 27
+	// Telephone number contains invalid characters or invalid format. Please
+	// re-enter your number using digits (0-9), dashes (-), and parentheses
+	// only.
+	AdErrorEnum_DOMESTIC_PHONE_NUMBER_FORMAT AdErrorEnum_AdError = 28
+	// Emergency telephone numbers are not allowed. Please enter a valid
+	// domestic phone number to connect customers to your business.
+	AdErrorEnum_EMERGENCY_PHONE_NUMBER AdErrorEnum_AdError = 29
+	// A required field was not specified or is an empty string.
+	AdErrorEnum_EMPTY_FIELD AdErrorEnum_AdError = 30
+	// A feed attribute referenced in an ad customizer tag is not in the ad
+	// customizer mapping for the feed.
+	AdErrorEnum_FEED_ATTRIBUTE_MUST_HAVE_MAPPING_FOR_TYPE_ID AdErrorEnum_AdError = 31
+	// The ad customizer field mapping for the feed attribute does not match the
+	// expected field type.
+	AdErrorEnum_FEED_ATTRIBUTE_MAPPING_TYPE_MISMATCH AdErrorEnum_AdError = 32
+	// The use of ad customizer tags in the ad text is disallowed. Details in
+	// trigger.
+	AdErrorEnum_ILLEGAL_AD_CUSTOMIZER_TAG_USE AdErrorEnum_AdError = 33
+	// Tags of the form {PH_x}, where x is a number, are disallowed in ad text.
+	AdErrorEnum_ILLEGAL_TAG_USE AdErrorEnum_AdError = 34
+	// The dimensions of the ad are specified or derived in multiple ways and
+	// are not consistent.
+	AdErrorEnum_INCONSISTENT_DIMENSIONS AdErrorEnum_AdError = 35
+	// The status cannot differ among template ads of the same union.
+	AdErrorEnum_INCONSISTENT_STATUS_IN_TEMPLATE_UNION AdErrorEnum_AdError = 36
+	// The length of the string is not valid.
+	AdErrorEnum_INCORRECT_LENGTH AdErrorEnum_AdError = 37
+	// The ad is ineligible for upgrade.
+	AdErrorEnum_INELIGIBLE_FOR_UPGRADE AdErrorEnum_AdError = 38
+	// User cannot create mobile ad for countries targeted in specified
+	// campaign.
+	AdErrorEnum_INVALID_AD_ADDRESS_CAMPAIGN_TARGET AdErrorEnum_AdError = 39
+	// Invalid Ad type. A specific type of Ad is required.
+	AdErrorEnum_INVALID_AD_TYPE AdErrorEnum_AdError = 40
+	// Headline, description or phone cannot be present when creating mobile
+	// image ad.
+	AdErrorEnum_INVALID_ATTRIBUTES_FOR_MOBILE_IMAGE AdErrorEnum_AdError = 41
+	// Image cannot be present when creating mobile text ad.
+	AdErrorEnum_INVALID_ATTRIBUTES_FOR_MOBILE_TEXT AdErrorEnum_AdError = 42
+	// Invalid call to action text.
+	AdErrorEnum_INVALID_CALL_TO_ACTION_TEXT AdErrorEnum_AdError = 43
+	// Invalid character in URL.
+	AdErrorEnum_INVALID_CHARACTER_FOR_URL AdErrorEnum_AdError = 44
+	// Creative's country code is not valid.
+	AdErrorEnum_INVALID_COUNTRY_CODE AdErrorEnum_AdError = 45
+	// Invalid use of Expanded Dynamic Search Ads tags ({lpurl} etc.)
+	AdErrorEnum_INVALID_EXPANDED_DYNAMIC_SEARCH_AD_TAG AdErrorEnum_AdError = 47
+	// An input error whose real reason was not properly mapped (should not
+	// happen).
+	AdErrorEnum_INVALID_INPUT AdErrorEnum_AdError = 48
+	// An invalid markup language was entered.
+	AdErrorEnum_INVALID_MARKUP_LANGUAGE AdErrorEnum_AdError = 49
+	// An invalid mobile carrier was entered.
+	AdErrorEnum_INVALID_MOBILE_CARRIER AdErrorEnum_AdError = 50
+	// Specified mobile carriers target a country not targeted by the campaign.
+	AdErrorEnum_INVALID_MOBILE_CARRIER_TARGET AdErrorEnum_AdError = 51
+	// Wrong number of elements for given element type
+	AdErrorEnum_INVALID_NUMBER_OF_ELEMENTS AdErrorEnum_AdError = 52
+	// The format of the telephone number is incorrect. Please re-enter the
+	// number using the correct format.
+	AdErrorEnum_INVALID_PHONE_NUMBER_FORMAT AdErrorEnum_AdError = 53
+	// The certified vendor format id is incorrect.
+	AdErrorEnum_INVALID_RICH_MEDIA_CERTIFIED_VENDOR_FORMAT_ID AdErrorEnum_AdError = 54
+	// The template ad data contains validation errors.
+	AdErrorEnum_INVALID_TEMPLATE_DATA AdErrorEnum_AdError = 55
+	// The template field doesn't have have the correct type.
+	AdErrorEnum_INVALID_TEMPLATE_ELEMENT_FIELD_TYPE AdErrorEnum_AdError = 56
+	// Invalid template id.
+	AdErrorEnum_INVALID_TEMPLATE_ID AdErrorEnum_AdError = 57
+	// After substituting replacement strings, the line is too wide.
+	AdErrorEnum_LINE_TOO_WIDE AdErrorEnum_AdError = 58
+	// The feed referenced must have ad customizer mapping to be used in a
+	// customizer tag.
+	AdErrorEnum_MISSING_AD_CUSTOMIZER_MAPPING AdErrorEnum_AdError = 59
+	// Missing address component in template element address field.
+	AdErrorEnum_MISSING_ADDRESS_COMPONENT AdErrorEnum_AdError = 60
+	// An ad name must be entered.
+	AdErrorEnum_MISSING_ADVERTISEMENT_NAME AdErrorEnum_AdError = 61
+	// Business name must be entered.
+	AdErrorEnum_MISSING_BUSINESS_NAME AdErrorEnum_AdError = 62
+	// Description (line 2) must be entered.
+	AdErrorEnum_MISSING_DESCRIPTION1 AdErrorEnum_AdError = 63
+	// Description (line 3) must be entered.
+	AdErrorEnum_MISSING_DESCRIPTION2 AdErrorEnum_AdError = 64
+	// The destination url must contain at least one tag (e.g. {lpurl})
+	AdErrorEnum_MISSING_DESTINATION_URL_TAG AdErrorEnum_AdError = 65
+	// The tracking url template of ExpandedDynamicSearchAd must contain at
+	// least one tag. (e.g. {lpurl})
+	AdErrorEnum_MISSING_LANDING_PAGE_URL_TAG AdErrorEnum_AdError = 66
+	// A valid dimension must be specified for this ad.
+	AdErrorEnum_MISSING_DIMENSION AdErrorEnum_AdError = 67
+	// A display URL must be entered.
+	AdErrorEnum_MISSING_DISPLAY_URL AdErrorEnum_AdError = 68
+	// Headline must be entered.
+	AdErrorEnum_MISSING_HEADLINE AdErrorEnum_AdError = 69
+	// A height must be entered.
+	AdErrorEnum_MISSING_HEIGHT AdErrorEnum_AdError = 70
+	// An image must be entered.
+	AdErrorEnum_MISSING_IMAGE AdErrorEnum_AdError = 71
+	// Marketing image or product videos are required.
+	AdErrorEnum_MISSING_MARKETING_IMAGE_OR_PRODUCT_VIDEOS AdErrorEnum_AdError = 72
+	// The markup language in which your site is written must be entered.
+	AdErrorEnum_MISSING_MARKUP_LANGUAGES AdErrorEnum_AdError = 73
+	// A mobile carrier must be entered.
+	AdErrorEnum_MISSING_MOBILE_CARRIER AdErrorEnum_AdError = 74
+	// Phone number must be entered.
+	AdErrorEnum_MISSING_PHONE AdErrorEnum_AdError = 75
+	// Missing required template fields
+	AdErrorEnum_MISSING_REQUIRED_TEMPLATE_FIELDS AdErrorEnum_AdError = 76
+	// Missing a required field value
+	AdErrorEnum_MISSING_TEMPLATE_FIELD_VALUE AdErrorEnum_AdError = 77
+	// The ad must have text.
+	AdErrorEnum_MISSING_TEXT AdErrorEnum_AdError = 78
+	// A visible URL must be entered.
+	AdErrorEnum_MISSING_VISIBLE_URL AdErrorEnum_AdError = 79
+	// A width must be entered.
+	AdErrorEnum_MISSING_WIDTH AdErrorEnum_AdError = 80
+	// Only 1 feed can be used as the source of ad customizer substitutions in a
+	// single ad.
+	AdErrorEnum_MULTIPLE_DISTINCT_FEEDS_UNSUPPORTED AdErrorEnum_AdError = 81
+	// TempAdUnionId must be use when adding template ads.
+	AdErrorEnum_MUST_USE_TEMP_AD_UNION_ID_ON_ADD AdErrorEnum_AdError = 82
+	// The string has too many characters.
+	AdErrorEnum_TOO_LONG AdErrorEnum_AdError = 83
+	// The string has too few characters.
+	AdErrorEnum_TOO_SHORT AdErrorEnum_AdError = 84
+	// Ad union dimensions cannot change for saved ads.
+	AdErrorEnum_UNION_DIMENSIONS_CANNOT_CHANGE AdErrorEnum_AdError = 85
+	// Address component is not {country, lat, lng}.
+	AdErrorEnum_UNKNOWN_ADDRESS_COMPONENT AdErrorEnum_AdError = 86
+	// Unknown unique field name
+	AdErrorEnum_UNKNOWN_FIELD_NAME AdErrorEnum_AdError = 87
+	// Unknown unique name (template element type specifier)
+	AdErrorEnum_UNKNOWN_UNIQUE_NAME AdErrorEnum_AdError = 88
+	// Unsupported ad dimension
+	AdErrorEnum_UNSUPPORTED_DIMENSIONS AdErrorEnum_AdError = 89
+	// URL starts with an invalid scheme.
+	AdErrorEnum_URL_INVALID_SCHEME AdErrorEnum_AdError = 90
+	// URL ends with an invalid top-level domain name.
+	AdErrorEnum_URL_INVALID_TOP_LEVEL_DOMAIN AdErrorEnum_AdError = 91
+	// URL contains illegal characters.
+	AdErrorEnum_URL_MALFORMED AdErrorEnum_AdError = 92
+	// URL must contain a host name.
+	AdErrorEnum_URL_NO_HOST AdErrorEnum_AdError = 93
+	// URL not equivalent during upgrade.
+	AdErrorEnum_URL_NOT_EQUIVALENT AdErrorEnum_AdError = 94
+	// URL host name too long to be stored as visible URL (applies to Ad
+	// Exchange ads)
+	AdErrorEnum_URL_HOST_NAME_TOO_LONG AdErrorEnum_AdError = 95
+	// URL must start with a scheme.
+	AdErrorEnum_URL_NO_SCHEME AdErrorEnum_AdError = 96
+	// URL should end in a valid domain extension, such as .com or .net.
+	AdErrorEnum_URL_NO_TOP_LEVEL_DOMAIN AdErrorEnum_AdError = 97
+	// URL must not end with a path.
+	AdErrorEnum_URL_PATH_NOT_ALLOWED AdErrorEnum_AdError = 98
+	// URL must not specify a port.
+	AdErrorEnum_URL_PORT_NOT_ALLOWED AdErrorEnum_AdError = 99
+	// URL must not contain a query.
+	AdErrorEnum_URL_QUERY_NOT_ALLOWED AdErrorEnum_AdError = 100
+	// A url scheme is not allowed in front of tag in tracking url template
+	// (e.g. http://{lpurl})
+	AdErrorEnum_URL_SCHEME_BEFORE_EXPANDED_DYNAMIC_SEARCH_AD_TAG AdErrorEnum_AdError = 102
+	// The user does not have permissions to create a template ad for the given
+	// template.
+	AdErrorEnum_USER_DOES_NOT_HAVE_ACCESS_TO_TEMPLATE AdErrorEnum_AdError = 103
+	// Expandable setting is inconsistent/wrong. For example, an AdX ad is
+	// invalid if it has a expandable vendor format but no expanding directions
+	// specified, or expanding directions is specified, but the vendor format is
+	// not expandable.
+	AdErrorEnum_INCONSISTENT_EXPANDABLE_SETTINGS AdErrorEnum_AdError = 104
+	// Format is invalid
+	AdErrorEnum_INVALID_FORMAT AdErrorEnum_AdError = 105
+	// The text of this field did not match a pattern of allowed values.
+	AdErrorEnum_INVALID_FIELD_TEXT AdErrorEnum_AdError = 106
+	// Template element is mising
+	AdErrorEnum_ELEMENT_NOT_PRESENT AdErrorEnum_AdError = 107
+	// Error occurred during image processing
+	AdErrorEnum_IMAGE_ERROR AdErrorEnum_AdError = 108
+	// The value is not within the valid range
+	AdErrorEnum_VALUE_NOT_IN_RANGE AdErrorEnum_AdError = 109
+	// Template element field is not present
+	AdErrorEnum_FIELD_NOT_PRESENT AdErrorEnum_AdError = 110
+	// Address is incomplete
+	AdErrorEnum_ADDRESS_NOT_COMPLETE AdErrorEnum_AdError = 111
+	// Invalid address
+	AdErrorEnum_ADDRESS_INVALID AdErrorEnum_AdError = 112
+	// Error retrieving specified video
+	AdErrorEnum_VIDEO_RETRIEVAL_ERROR AdErrorEnum_AdError = 113
+	// Error processing audio
+	AdErrorEnum_AUDIO_ERROR AdErrorEnum_AdError = 114
+	// Display URL is incorrect for YouTube PYV ads
+	AdErrorEnum_INVALID_YOUTUBE_DISPLAY_URL AdErrorEnum_AdError = 115
+	// Too many product Images in GmailAd
+	AdErrorEnum_TOO_MANY_PRODUCT_IMAGES AdErrorEnum_AdError = 116
+	// Too many product Videos in GmailAd
+	AdErrorEnum_TOO_MANY_PRODUCT_VIDEOS AdErrorEnum_AdError = 117
+	// The device preference is not compatible with the ad type
+	AdErrorEnum_INCOMPATIBLE_AD_TYPE_AND_DEVICE_PREFERENCE AdErrorEnum_AdError = 118
+	// Call tracking is not supported for specified country.
+	AdErrorEnum_CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY AdErrorEnum_AdError = 119
+	// Carrier specific short number is not allowed.
+	AdErrorEnum_CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED AdErrorEnum_AdError = 120
+	// Specified phone number type is disallowed.
+	AdErrorEnum_DISALLOWED_NUMBER_TYPE AdErrorEnum_AdError = 121
+	// Phone number not supported for country.
+	AdErrorEnum_PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY AdErrorEnum_AdError = 122
+	// Phone number not supported with call tracking enabled for country.
+	AdErrorEnum_PHONE_NUMBER_NOT_SUPPORTED_WITH_CALLTRACKING_FOR_COUNTRY AdErrorEnum_AdError = 123
+	// Premium rate phone number is not allowed.
+	AdErrorEnum_PREMIUM_RATE_NUMBER_NOT_ALLOWED AdErrorEnum_AdError = 124
+	// Vanity phone number is not allowed.
+	AdErrorEnum_VANITY_PHONE_NUMBER_NOT_ALLOWED AdErrorEnum_AdError = 125
+	// Invalid call conversion type id.
+	AdErrorEnum_INVALID_CALL_CONVERSION_TYPE_ID AdErrorEnum_AdError = 126
+	// Cannot disable call conversion and set conversion type id.
+	AdErrorEnum_CANNOT_DISABLE_CALL_CONVERSION_AND_SET_CONVERSION_TYPE_ID AdErrorEnum_AdError = 127
+	// Cannot set path2 without path1.
+	AdErrorEnum_CANNOT_SET_PATH2_WITHOUT_PATH1 AdErrorEnum_AdError = 128
+	// Missing domain name in campaign setting when adding expanded dynamic
+	// search ad.
+	AdErrorEnum_MISSING_DYNAMIC_SEARCH_ADS_SETTING_DOMAIN_NAME AdErrorEnum_AdError = 129
+	// The associated ad is not compatible with restriction type.
+	AdErrorEnum_INCOMPATIBLE_WITH_RESTRICTION_TYPE AdErrorEnum_AdError = 130
+	// Consent for call recording is required for creating/updating call only
+	// ads. Please see https://support.google.com/google-ads/answer/7412639.
+	AdErrorEnum_CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED AdErrorEnum_AdError = 131
+	// Either an image or a media bundle is required in a display upload ad.
+	AdErrorEnum_MISSING_IMAGE_OR_MEDIA_BUNDLE AdErrorEnum_AdError = 132
+	// The display upload product type is not supported in this campaign.
+	AdErrorEnum_PRODUCT_TYPE_NOT_SUPPORTED_IN_THIS_CAMPAIGN AdErrorEnum_AdError = 133
+	// The default value of an ad placeholder can not be the empty string.
+	AdErrorEnum_PLACEHOLDER_CANNOT_HAVE_EMPTY_DEFAULT_VALUE AdErrorEnum_AdError = 134
+	// Ad placeholders with countdown functions must not have a default value.
+	AdErrorEnum_PLACEHOLDER_COUNTDOWN_FUNCTION_CANNOT_HAVE_DEFAULT_VALUE AdErrorEnum_AdError = 135
+	// A previous ad placeholder that had a default value was found which means
+	// that all (non-countdown) placeholders must have a default value. This
+	// ad placeholder does not have a default value.
+	AdErrorEnum_PLACEHOLDER_DEFAULT_VALUE_MISSING AdErrorEnum_AdError = 136
+	// A previous ad placeholder that did not have a default value was found
+	// which means that no placeholders may have a default value. This
+	// ad placeholder does have a default value.
+	AdErrorEnum_UNEXPECTED_PLACEHOLDER_DEFAULT_VALUE AdErrorEnum_AdError = 137
+	// Two ad customizers may not be directly adjacent in an ad text. They must
+	// be separated by at least one character.
+	AdErrorEnum_AD_CUSTOMIZERS_MAY_NOT_BE_ADJACENT AdErrorEnum_AdError = 138
+	// The ad is not associated with any enabled AdGroupAd, and cannot be
+	// updated.
+	AdErrorEnum_UPDATING_AD_WITH_NO_ENABLED_ASSOCIATION AdErrorEnum_AdError = 139
+)
+
+var AdErrorEnum_AdError_name = map[int32]string{
+	0:   "UNSPECIFIED",
+	1:   "UNKNOWN",
+	2:   "AD_CUSTOMIZERS_NOT_SUPPORTED_FOR_AD_TYPE",
+	3:   "APPROXIMATELY_TOO_LONG",
+	4:   "APPROXIMATELY_TOO_SHORT",
+	5:   "BAD_SNIPPET",
+	6:   "CANNOT_MODIFY_AD",
+	7:   "CANNOT_SET_BUSINESS_NAME_IF_URL_SET",
+	8:   "CANNOT_SET_FIELD",
+	9:   "CANNOT_SET_FIELD_WITH_ORIGIN_AD_ID_SET",
+	10:  "CANNOT_SET_FIELD_WITH_AD_ID_SET_FOR_SHARING",
+	11:  "CANNOT_SET_ALLOW_FLEXIBLE_COLOR_FALSE",
+	12:  "CANNOT_SET_COLOR_CONTROL_WHEN_NATIVE_FORMAT_SETTING",
+	13:  "CANNOT_SET_URL",
+	14:  "CANNOT_SET_WITHOUT_FINAL_URLS",
+	15:  "CANNOT_SET_WITH_FINAL_URLS",
+	17:  "CANNOT_SET_WITH_URL_DATA",
+	18:  "CANNOT_USE_AD_SUBCLASS_FOR_OPERATOR",
+	19:  "CUSTOMER_NOT_APPROVED_MOBILEADS",
+	20:  "CUSTOMER_NOT_APPROVED_THIRDPARTY_ADS",
+	21:  "CUSTOMER_NOT_APPROVED_THIRDPARTY_REDIRECT_ADS",
+	22:  "CUSTOMER_NOT_ELIGIBLE",
+	23:  "CUSTOMER_NOT_ELIGIBLE_FOR_UPDATING_BEACON_URL",
+	24:  "DIMENSION_ALREADY_IN_UNION",
+	25:  "DIMENSION_MUST_BE_SET",
+	26:  "DIMENSION_NOT_IN_UNION",
+	27:  "DISPLAY_URL_CANNOT_BE_SPECIFIED",
+	28:  "DOMESTIC_PHONE_NUMBER_FORMAT",
+	29:  "EMERGENCY_PHONE_NUMBER",
+	30:  "EMPTY_FIELD",
+	31:  "FEED_ATTRIBUTE_MUST_HAVE_MAPPING_FOR_TYPE_ID",
+	32:  "FEED_ATTRIBUTE_MAPPING_TYPE_MISMATCH",
+	33:  "ILLEGAL_AD_CUSTOMIZER_TAG_USE",
+	34:  "ILLEGAL_TAG_USE",
+	35:  "INCONSISTENT_DIMENSIONS",
+	36:  "INCONSISTENT_STATUS_IN_TEMPLATE_UNION",
+	37:  "INCORRECT_LENGTH",
+	38:  "INELIGIBLE_FOR_UPGRADE",
+	39:  "INVALID_AD_ADDRESS_CAMPAIGN_TARGET",
+	40:  "INVALID_AD_TYPE",
+	41:  "INVALID_ATTRIBUTES_FOR_MOBILE_IMAGE",
+	42:  "INVALID_ATTRIBUTES_FOR_MOBILE_TEXT",
+	43:  "INVALID_CALL_TO_ACTION_TEXT",
+	44:  "INVALID_CHARACTER_FOR_URL",
+	45:  "INVALID_COUNTRY_CODE",
+	47:  "INVALID_EXPANDED_DYNAMIC_SEARCH_AD_TAG",
+	48:  "INVALID_INPUT",
+	49:  "INVALID_MARKUP_LANGUAGE",
+	50:  "INVALID_MOBILE_CARRIER",
+	51:  "INVALID_MOBILE_CARRIER_TARGET",
+	52:  "INVALID_NUMBER_OF_ELEMENTS",
+	53:  "INVALID_PHONE_NUMBER_FORMAT",
+	54:  "INVALID_RICH_MEDIA_CERTIFIED_VENDOR_FORMAT_ID",
+	55:  "INVALID_TEMPLATE_DATA",
+	56:  "INVALID_TEMPLATE_ELEMENT_FIELD_TYPE",
+	57:  "INVALID_TEMPLATE_ID",
+	58:  "LINE_TOO_WIDE",
+	59:  "MISSING_AD_CUSTOMIZER_MAPPING",
+	60:  "MISSING_ADDRESS_COMPONENT",
+	61:  "MISSING_ADVERTISEMENT_NAME",
+	62:  "MISSING_BUSINESS_NAME",
+	63:  "MISSING_DESCRIPTION1",
+	64:  "MISSING_DESCRIPTION2",
+	65:  "MISSING_DESTINATION_URL_TAG",
+	66:  "MISSING_LANDING_PAGE_URL_TAG",
+	67:  "MISSING_DIMENSION",
+	68:  "MISSING_DISPLAY_URL",
+	69:  "MISSING_HEADLINE",
+	70:  "MISSING_HEIGHT",
+	71:  "MISSING_IMAGE",
+	72:  "MISSING_MARKETING_IMAGE_OR_PRODUCT_VIDEOS",
+	73:  "MISSING_MARKUP_LANGUAGES",
+	74:  "MISSING_MOBILE_CARRIER",
+	75:  "MISSING_PHONE",
+	76:  "MISSING_REQUIRED_TEMPLATE_FIELDS",
+	77:  "MISSING_TEMPLATE_FIELD_VALUE",
+	78:  "MISSING_TEXT",
+	79:  "MISSING_VISIBLE_URL",
+	80:  "MISSING_WIDTH",
+	81:  "MULTIPLE_DISTINCT_FEEDS_UNSUPPORTED",
+	82:  "MUST_USE_TEMP_AD_UNION_ID_ON_ADD",
+	83:  "TOO_LONG",
+	84:  "TOO_SHORT",
+	85:  "UNION_DIMENSIONS_CANNOT_CHANGE",
+	86:  "UNKNOWN_ADDRESS_COMPONENT",
+	87:  "UNKNOWN_FIELD_NAME",
+	88:  "UNKNOWN_UNIQUE_NAME",
+	89:  "UNSUPPORTED_DIMENSIONS",
+	90:  "URL_INVALID_SCHEME",
+	91:  "URL_INVALID_TOP_LEVEL_DOMAIN",
+	92:  "URL_MALFORMED",
+	93:  "URL_NO_HOST",
+	94:  "URL_NOT_EQUIVALENT",
+	95:  "URL_HOST_NAME_TOO_LONG",
+	96:  "URL_NO_SCHEME",
+	97:  "URL_NO_TOP_LEVEL_DOMAIN",
+	98:  "URL_PATH_NOT_ALLOWED",
+	99:  "URL_PORT_NOT_ALLOWED",
+	100: "URL_QUERY_NOT_ALLOWED",
+	102: "URL_SCHEME_BEFORE_EXPANDED_DYNAMIC_SEARCH_AD_TAG",
+	103: "USER_DOES_NOT_HAVE_ACCESS_TO_TEMPLATE",
+	104: "INCONSISTENT_EXPANDABLE_SETTINGS",
+	105: "INVALID_FORMAT",
+	106: "INVALID_FIELD_TEXT",
+	107: "ELEMENT_NOT_PRESENT",
+	108: "IMAGE_ERROR",
+	109: "VALUE_NOT_IN_RANGE",
+	110: "FIELD_NOT_PRESENT",
+	111: "ADDRESS_NOT_COMPLETE",
+	112: "ADDRESS_INVALID",
+	113: "VIDEO_RETRIEVAL_ERROR",
+	114: "AUDIO_ERROR",
+	115: "INVALID_YOUTUBE_DISPLAY_URL",
+	116: "TOO_MANY_PRODUCT_IMAGES",
+	117: "TOO_MANY_PRODUCT_VIDEOS",
+	118: "INCOMPATIBLE_AD_TYPE_AND_DEVICE_PREFERENCE",
+	119: "CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY",
+	120: "CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED",
+	121: "DISALLOWED_NUMBER_TYPE",
+	122: "PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY",
+	123: "PHONE_NUMBER_NOT_SUPPORTED_WITH_CALLTRACKING_FOR_COUNTRY",
+	124: "PREMIUM_RATE_NUMBER_NOT_ALLOWED",
+	125: "VANITY_PHONE_NUMBER_NOT_ALLOWED",
+	126: "INVALID_CALL_CONVERSION_TYPE_ID",
+	127: "CANNOT_DISABLE_CALL_CONVERSION_AND_SET_CONVERSION_TYPE_ID",
+	128: "CANNOT_SET_PATH2_WITHOUT_PATH1",
+	129: "MISSING_DYNAMIC_SEARCH_ADS_SETTING_DOMAIN_NAME",
+	130: "INCOMPATIBLE_WITH_RESTRICTION_TYPE",
+	131: "CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED",
+	132: "MISSING_IMAGE_OR_MEDIA_BUNDLE",
+	133: "PRODUCT_TYPE_NOT_SUPPORTED_IN_THIS_CAMPAIGN",
+	134: "PLACEHOLDER_CANNOT_HAVE_EMPTY_DEFAULT_VALUE",
+	135: "PLACEHOLDER_COUNTDOWN_FUNCTION_CANNOT_HAVE_DEFAULT_VALUE",
+	136: "PLACEHOLDER_DEFAULT_VALUE_MISSING",
+	137: "UNEXPECTED_PLACEHOLDER_DEFAULT_VALUE",
+	138: "AD_CUSTOMIZERS_MAY_NOT_BE_ADJACENT",
+	139: "UPDATING_AD_WITH_NO_ENABLED_ASSOCIATION",
+}
+
+var AdErrorEnum_AdError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"AD_CUSTOMIZERS_NOT_SUPPORTED_FOR_AD_TYPE":                  2,
+	"APPROXIMATELY_TOO_LONG":                                    3,
+	"APPROXIMATELY_TOO_SHORT":                                   4,
+	"BAD_SNIPPET":                                               5,
+	"CANNOT_MODIFY_AD":                                          6,
+	"CANNOT_SET_BUSINESS_NAME_IF_URL_SET":                       7,
+	"CANNOT_SET_FIELD":                                          8,
+	"CANNOT_SET_FIELD_WITH_ORIGIN_AD_ID_SET":                    9,
+	"CANNOT_SET_FIELD_WITH_AD_ID_SET_FOR_SHARING":               10,
+	"CANNOT_SET_ALLOW_FLEXIBLE_COLOR_FALSE":                     11,
+	"CANNOT_SET_COLOR_CONTROL_WHEN_NATIVE_FORMAT_SETTING":       12,
+	"CANNOT_SET_URL":                                            13,
+	"CANNOT_SET_WITHOUT_FINAL_URLS":                             14,
+	"CANNOT_SET_WITH_FINAL_URLS":                                15,
+	"CANNOT_SET_WITH_URL_DATA":                                  17,
+	"CANNOT_USE_AD_SUBCLASS_FOR_OPERATOR":                       18,
+	"CUSTOMER_NOT_APPROVED_MOBILEADS":                           19,
+	"CUSTOMER_NOT_APPROVED_THIRDPARTY_ADS":                      20,
+	"CUSTOMER_NOT_APPROVED_THIRDPARTY_REDIRECT_ADS":             21,
+	"CUSTOMER_NOT_ELIGIBLE":                                     22,
+	"CUSTOMER_NOT_ELIGIBLE_FOR_UPDATING_BEACON_URL":             23,
+	"DIMENSION_ALREADY_IN_UNION":                                24,
+	"DIMENSION_MUST_BE_SET":                                     25,
+	"DIMENSION_NOT_IN_UNION":                                    26,
+	"DISPLAY_URL_CANNOT_BE_SPECIFIED":                           27,
+	"DOMESTIC_PHONE_NUMBER_FORMAT":                              28,
+	"EMERGENCY_PHONE_NUMBER":                                    29,
+	"EMPTY_FIELD":                                               30,
+	"FEED_ATTRIBUTE_MUST_HAVE_MAPPING_FOR_TYPE_ID":              31,
+	"FEED_ATTRIBUTE_MAPPING_TYPE_MISMATCH":                      32,
+	"ILLEGAL_AD_CUSTOMIZER_TAG_USE":                             33,
+	"ILLEGAL_TAG_USE":                                           34,
+	"INCONSISTENT_DIMENSIONS":                                   35,
+	"INCONSISTENT_STATUS_IN_TEMPLATE_UNION":                     36,
+	"INCORRECT_LENGTH":                                          37,
+	"INELIGIBLE_FOR_UPGRADE":                                    38,
+	"INVALID_AD_ADDRESS_CAMPAIGN_TARGET":                        39,
+	"INVALID_AD_TYPE":                                           40,
+	"INVALID_ATTRIBUTES_FOR_MOBILE_IMAGE":                       41,
+	"INVALID_ATTRIBUTES_FOR_MOBILE_TEXT":                        42,
+	"INVALID_CALL_TO_ACTION_TEXT":                               43,
+	"INVALID_CHARACTER_FOR_URL":                                 44,
+	"INVALID_COUNTRY_CODE":                                      45,
+	"INVALID_EXPANDED_DYNAMIC_SEARCH_AD_TAG":                    47,
+	"INVALID_INPUT":                                             48,
+	"INVALID_MARKUP_LANGUAGE":                                   49,
+	"INVALID_MOBILE_CARRIER":                                    50,
+	"INVALID_MOBILE_CARRIER_TARGET":                             51,
+	"INVALID_NUMBER_OF_ELEMENTS":                                52,
+	"INVALID_PHONE_NUMBER_FORMAT":                               53,
+	"INVALID_RICH_MEDIA_CERTIFIED_VENDOR_FORMAT_ID":             54,
+	"INVALID_TEMPLATE_DATA":                                     55,
+	"INVALID_TEMPLATE_ELEMENT_FIELD_TYPE":                       56,
+	"INVALID_TEMPLATE_ID":                                       57,
+	"LINE_TOO_WIDE":                                             58,
+	"MISSING_AD_CUSTOMIZER_MAPPING":                             59,
+	"MISSING_ADDRESS_COMPONENT":                                 60,
+	"MISSING_ADVERTISEMENT_NAME":                                61,
+	"MISSING_BUSINESS_NAME":                                     62,
+	"MISSING_DESCRIPTION1":                                      63,
+	"MISSING_DESCRIPTION2":                                      64,
+	"MISSING_DESTINATION_URL_TAG":                               65,
+	"MISSING_LANDING_PAGE_URL_TAG":                              66,
+	"MISSING_DIMENSION":                                         67,
+	"MISSING_DISPLAY_URL":                                       68,
+	"MISSING_HEADLINE":                                          69,
+	"MISSING_HEIGHT":                                            70,
+	"MISSING_IMAGE":                                             71,
+	"MISSING_MARKETING_IMAGE_OR_PRODUCT_VIDEOS":                 72,
+	"MISSING_MARKUP_LANGUAGES":                                  73,
+	"MISSING_MOBILE_CARRIER":                                    74,
+	"MISSING_PHONE":                                             75,
+	"MISSING_REQUIRED_TEMPLATE_FIELDS":                          76,
+	"MISSING_TEMPLATE_FIELD_VALUE":                              77,
+	"MISSING_TEXT":                                              78,
+	"MISSING_VISIBLE_URL":                                       79,
+	"MISSING_WIDTH":                                             80,
+	"MULTIPLE_DISTINCT_FEEDS_UNSUPPORTED":                       81,
+	"MUST_USE_TEMP_AD_UNION_ID_ON_ADD":                          82,
+	"TOO_LONG":                                                  83,
+	"TOO_SHORT":                                                 84,
+	"UNION_DIMENSIONS_CANNOT_CHANGE":                            85,
+	"UNKNOWN_ADDRESS_COMPONENT":                                 86,
+	"UNKNOWN_FIELD_NAME":                                        87,
+	"UNKNOWN_UNIQUE_NAME":                                       88,
+	"UNSUPPORTED_DIMENSIONS":                                    89,
+	"URL_INVALID_SCHEME":                                        90,
+	"URL_INVALID_TOP_LEVEL_DOMAIN":                              91,
+	"URL_MALFORMED":                                             92,
+	"URL_NO_HOST":                                               93,
+	"URL_NOT_EQUIVALENT":                                        94,
+	"URL_HOST_NAME_TOO_LONG":                                    95,
+	"URL_NO_SCHEME":                                             96,
+	"URL_NO_TOP_LEVEL_DOMAIN":                                   97,
+	"URL_PATH_NOT_ALLOWED":                                      98,
+	"URL_PORT_NOT_ALLOWED":                                      99,
+	"URL_QUERY_NOT_ALLOWED":                                     100,
+	"URL_SCHEME_BEFORE_EXPANDED_DYNAMIC_SEARCH_AD_TAG":          102,
+	"USER_DOES_NOT_HAVE_ACCESS_TO_TEMPLATE":                     103,
+	"INCONSISTENT_EXPANDABLE_SETTINGS":                          104,
+	"INVALID_FORMAT":                                            105,
+	"INVALID_FIELD_TEXT":                                        106,
+	"ELEMENT_NOT_PRESENT":                                       107,
+	"IMAGE_ERROR":                                               108,
+	"VALUE_NOT_IN_RANGE":                                        109,
+	"FIELD_NOT_PRESENT":                                         110,
+	"ADDRESS_NOT_COMPLETE":                                      111,
+	"ADDRESS_INVALID":                                           112,
+	"VIDEO_RETRIEVAL_ERROR":                                     113,
+	"AUDIO_ERROR":                                               114,
+	"INVALID_YOUTUBE_DISPLAY_URL":                               115,
+	"TOO_MANY_PRODUCT_IMAGES":                                   116,
+	"TOO_MANY_PRODUCT_VIDEOS":                                   117,
+	"INCOMPATIBLE_AD_TYPE_AND_DEVICE_PREFERENCE":                118,
+	"CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY":                    119,
+	"CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED":                 120,
+	"DISALLOWED_NUMBER_TYPE":                                    121,
+	"PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY":                    122,
+	"PHONE_NUMBER_NOT_SUPPORTED_WITH_CALLTRACKING_FOR_COUNTRY":  123,
+	"PREMIUM_RATE_NUMBER_NOT_ALLOWED":                           124,
+	"VANITY_PHONE_NUMBER_NOT_ALLOWED":                           125,
+	"INVALID_CALL_CONVERSION_TYPE_ID":                           126,
+	"CANNOT_DISABLE_CALL_CONVERSION_AND_SET_CONVERSION_TYPE_ID": 127,
+	"CANNOT_SET_PATH2_WITHOUT_PATH1":                            128,
+	"MISSING_DYNAMIC_SEARCH_ADS_SETTING_DOMAIN_NAME":            129,
+	"INCOMPATIBLE_WITH_RESTRICTION_TYPE":                        130,
+	"CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED":              131,
+	"MISSING_IMAGE_OR_MEDIA_BUNDLE":                             132,
+	"PRODUCT_TYPE_NOT_SUPPORTED_IN_THIS_CAMPAIGN":               133,
+	"PLACEHOLDER_CANNOT_HAVE_EMPTY_DEFAULT_VALUE":               134,
+	"PLACEHOLDER_COUNTDOWN_FUNCTION_CANNOT_HAVE_DEFAULT_VALUE":  135,
+	"PLACEHOLDER_DEFAULT_VALUE_MISSING":                         136,
+	"UNEXPECTED_PLACEHOLDER_DEFAULT_VALUE":                      137,
+	"AD_CUSTOMIZERS_MAY_NOT_BE_ADJACENT":                        138,
+	"UPDATING_AD_WITH_NO_ENABLED_ASSOCIATION":                   139,
+}
+
+func (x AdErrorEnum_AdError) String() string {
+	return proto.EnumName(AdErrorEnum_AdError_name, int32(x))
+}
+
+func (AdErrorEnum_AdError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_55578c5f7a565f9a, []int{0, 0}
+}
+
+// Container for enum describing possible ad errors.
+type AdErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdErrorEnum) Reset()         { *m = AdErrorEnum{} }
+func (m *AdErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdErrorEnum) ProtoMessage()    {}
+func (*AdErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_55578c5f7a565f9a, []int{0}
+}
+
+func (m *AdErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdErrorEnum.Unmarshal(m, b)
+}
+func (m *AdErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdErrorEnum.Merge(m, src)
+}
+func (m *AdErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdErrorEnum.Size(m)
+}
+func (m *AdErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdErrorEnum_AdError", AdErrorEnum_AdError_name, AdErrorEnum_AdError_value)
+	proto.RegisterType((*AdErrorEnum)(nil), "google.ads.googleads.v3.errors.AdErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/ad_error.proto", fileDescriptor_55578c5f7a565f9a)
+}
+
+var fileDescriptor_55578c5f7a565f9a = []byte{
+	// 2174 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x58, 0x6b, 0x7b, 0x14, 0xb7,
+	0x15, 0xee, 0x92, 0x36, 0x24, 0x02, 0x82, 0x10, 0xf7, 0x9b, 0x01, 0x43, 0xb8, 0xb3, 0x06, 0x9c,
+	0x36, 0xc4, 0x09, 0x6d, 0xb5, 0xa3, 0xb3, 0xbb, 0x0a, 0x1a, 0x69, 0x90, 0x34, 0x6b, 0x2f, 0xa5,
+	0x55, 0x9d, 0x98, 0xba, 0xb4, 0xe0, 0xa5, 0x36, 0xa1, 0xf7, 0xfb, 0xbd, 0xf9, 0x17, 0xfd, 0xd8,
+	0x9f, 0xd2, 0x3f, 0xd2, 0xe7, 0xe9, 0x5f, 0xe8, 0x97, 0x3e, 0x47, 0x9a, 0x99, 0x9d, 0xb5, 0x4d,
+	0xf2, 0xc9, 0x6b, 0x9d, 0x57, 0x97, 0xf3, 0xea, 0x3d, 0x17, 0x0d, 0xb9, 0xb5, 0x3e, 0x99, 0xac,
+	0x3f, 0x7b, 0xb2, 0xb0, 0xba, 0xb6, 0xb5, 0x90, 0x7e, 0xe2, 0xaf, 0x57, 0x8b, 0x0b, 0x4f, 0x36,
+	0x37, 0x27, 0x9b, 0x5b, 0x0b, 0xab, 0x6b, 0x21, 0xfe, 0xea, 0xbe, 0xd8, 0x9c, 0xbc, 0x9c, 0xb0,
+	0xb9, 0x84, 0xe9, 0xae, 0xae, 0x6d, 0x75, 0x1b, 0x78, 0xf7, 0xd5, 0x62, 0x37, 0xc1, 0x4f, 0x9d,
+	0xa9, 0x97, 0x7b, 0xf1, 0x74, 0x61, 0x75, 0x63, 0x63, 0xf2, 0x72, 0xf5, 0xe5, 0xd3, 0xc9, 0xc6,
+	0x56, 0x9a, 0x3d, 0xff, 0xf9, 0x45, 0xb2, 0x8f, 0xaf, 0x01, 0x42, 0x61, 0xe3, 0xb3, 0xe7, 0xf3,
+	0xff, 0x9b, 0x27, 0x7b, 0xab, 0xff, 0xd9, 0x41, 0xb2, 0xaf, 0xd4, 0xae, 0x80, 0x4c, 0xf6, 0x25,
+	0x08, 0xfa, 0x15, 0xb6, 0x8f, 0xec, 0x2d, 0xf5, 0x03, 0x6d, 0x96, 0x35, 0xed, 0xb0, 0x9b, 0xe4,
+	0x2a, 0x17, 0x21, 0x2b, 0x9d, 0x37, 0xb9, 0x7c, 0x04, 0xd6, 0x05, 0x6d, 0x7c, 0x70, 0x65, 0x51,
+	0x18, 0xeb, 0x41, 0x84, 0xbe, 0xb1, 0x81, 0x8b, 0xe0, 0xc7, 0x05, 0xd0, 0x3d, 0xec, 0x14, 0x39,
+	0xc6, 0x8b, 0xc2, 0x9a, 0x15, 0x99, 0x73, 0x0f, 0x6a, 0x1c, 0xbc, 0x31, 0x41, 0x19, 0x3d, 0xa0,
+	0x6f, 0xb0, 0xd3, 0xe4, 0xf8, 0x4e, 0x9b, 0x1b, 0x1a, 0xeb, 0xe9, 0x57, 0xf1, 0x10, 0x3d, 0x2e,
+	0x82, 0xd3, 0xb2, 0x28, 0xc0, 0xd3, 0xaf, 0xb1, 0x23, 0x84, 0x66, 0x5c, 0xe3, 0x5e, 0xb9, 0x11,
+	0xb2, 0x3f, 0x0e, 0x5c, 0xd0, 0x37, 0xd9, 0x15, 0x72, 0xb1, 0x1a, 0x75, 0xe0, 0x43, 0xaf, 0x74,
+	0x52, 0x83, 0x73, 0x41, 0xf3, 0x1c, 0x82, 0xec, 0x87, 0xd2, 0x2a, 0x34, 0xd0, 0xbd, 0xad, 0xe9,
+	0x08, 0xec, 0x4b, 0x50, 0x82, 0xbe, 0xc5, 0xae, 0x93, 0xcb, 0xdb, 0x47, 0xc3, 0xb2, 0xf4, 0xc3,
+	0x60, 0xac, 0x1c, 0x48, 0x8d, 0x8e, 0x48, 0x11, 0x57, 0x78, 0x9b, 0x2d, 0x90, 0x1b, 0xbb, 0x63,
+	0x1b, 0x50, 0xf4, 0xdd, 0x0d, 0xb9, 0x95, 0x7a, 0x40, 0x09, 0xbb, 0x46, 0xde, 0x6d, 0x4d, 0xe0,
+	0x4a, 0x99, 0xe5, 0xd0, 0x57, 0xb0, 0x22, 0x7b, 0x0a, 0x42, 0x66, 0x94, 0xb1, 0xa1, 0xcf, 0x95,
+	0x03, 0xba, 0x8f, 0xbd, 0x4f, 0x16, 0x5b, 0xd0, 0x64, 0xcb, 0x8c, 0xf6, 0xd6, 0xa8, 0xb0, 0x3c,
+	0x04, 0x1d, 0x34, 0xf7, 0x72, 0x04, 0xb8, 0x41, 0xce, 0x23, 0xc8, 0xe3, 0x1e, 0xfb, 0x19, 0x23,
+	0xef, 0xb4, 0x26, 0x96, 0x56, 0xd1, 0x03, 0xec, 0x02, 0x39, 0xdb, 0x1a, 0xc3, 0x23, 0x9a, 0x12,
+	0x0f, 0xac, 0xb9, 0x42, 0x84, 0xa3, 0xef, 0xb0, 0x39, 0x72, 0x6a, 0x1b, 0xa4, 0x6d, 0x3f, 0xc8,
+	0xce, 0x90, 0x13, 0xdb, 0xed, 0x48, 0xa5, 0xe0, 0x9e, 0xd3, 0x43, 0x2d, 0xd2, 0x4b, 0x07, 0xe8,
+	0xbe, 0x2b, 0x7b, 0x99, 0xe2, 0xce, 0x45, 0x02, 0x4c, 0x01, 0x96, 0x7b, 0x63, 0x29, 0x63, 0x17,
+	0xc9, 0xb9, 0x24, 0x14, 0xb0, 0x51, 0x25, 0xf1, 0xba, 0x47, 0x20, 0x42, 0x6e, 0x7a, 0x52, 0x01,
+	0x17, 0x8e, 0x1e, 0x66, 0x57, 0xc9, 0xa5, 0xdd, 0x41, 0x7e, 0x28, 0xad, 0x28, 0xb8, 0xf5, 0x78,
+	0xd7, 0x8e, 0x1e, 0x61, 0x77, 0xc8, 0xad, 0x2f, 0x45, 0x5a, 0x10, 0xd2, 0x42, 0xe6, 0xe3, 0x94,
+	0xa3, 0xec, 0x24, 0x39, 0x3a, 0x33, 0x05, 0x94, 0x1c, 0x20, 0xff, 0xf4, 0xd8, 0x8e, 0xd5, 0x6a,
+	0x53, 0x74, 0xa2, 0x2c, 0x04, 0x47, 0x8a, 0x43, 0x0f, 0x78, 0x66, 0x74, 0x64, 0xf6, 0x38, 0xd2,
+	0x26, 0x64, 0x0e, 0xda, 0x49, 0xa3, 0x03, 0x57, 0x16, 0xb8, 0x18, 0x07, 0xa9, 0x43, 0xa9, 0xa5,
+	0xd1, 0xf4, 0x04, 0xee, 0x36, 0xb5, 0xe7, 0xa5, 0xf3, 0xa1, 0x07, 0x51, 0x3d, 0x27, 0x31, 0x10,
+	0xa6, 0x26, 0xdc, 0xae, 0x99, 0x76, 0x0a, 0x69, 0x12, 0xd2, 0x15, 0x8a, 0x8f, 0x23, 0xcb, 0x15,
+	0xb7, 0x38, 0xb5, 0x09, 0xc2, 0xd3, 0xec, 0x3c, 0x39, 0x23, 0x4c, 0x0e, 0xce, 0xcb, 0x2c, 0x14,
+	0x43, 0xa3, 0x21, 0xe8, 0x32, 0xef, 0x81, 0xad, 0x34, 0x41, 0xcf, 0xe0, 0x16, 0x90, 0x83, 0x1d,
+	0x80, 0xce, 0xc6, 0x33, 0x10, 0x7a, 0x16, 0xc3, 0x09, 0xf2, 0xc2, 0x8f, 0x2b, 0xe5, 0xcf, 0xb1,
+	0xdb, 0xe4, 0x66, 0x1f, 0x40, 0x04, 0xee, 0xbd, 0x95, 0xbd, 0xd2, 0x43, 0x3a, 0xef, 0x90, 0x8f,
+	0x20, 0xe4, 0xbc, 0x28, 0xd0, 0x77, 0x24, 0x02, 0xe3, 0x38, 0x48, 0x41, 0xcf, 0xe1, 0x3d, 0x6d,
+	0x9f, 0x51, 0xe1, 0x22, 0x26, 0x97, 0x2e, 0xe7, 0x3e, 0x1b, 0xd2, 0xf3, 0x28, 0x40, 0xa9, 0x14,
+	0x0c, 0xb8, 0x0a, 0x33, 0xa9, 0x22, 0x78, 0x3e, 0x40, 0xc9, 0xd0, 0x0b, 0xec, 0x30, 0x39, 0x58,
+	0x43, 0xea, 0xc1, 0x79, 0x4c, 0x08, 0x52, 0x67, 0x46, 0x3b, 0xe9, 0x3c, 0x68, 0x1f, 0x1a, 0xc2,
+	0x1c, 0xbd, 0x88, 0xd1, 0x34, 0x63, 0x74, 0x9e, 0xfb, 0xd2, 0x21, 0x8d, 0x1e, 0xf2, 0x42, 0x71,
+	0x0f, 0x15, 0x9f, 0x97, 0x30, 0xd6, 0x11, 0x6a, 0xa3, 0x0e, 0x14, 0xe8, 0x81, 0x1f, 0xd2, 0x77,
+	0x91, 0x1e, 0xa9, 0xb7, 0x5d, 0xf2, 0xc0, 0x72, 0x01, 0xf4, 0x32, 0xbb, 0x4c, 0xe6, 0xa5, 0x1e,
+	0x71, 0x25, 0x05, 0x9e, 0x98, 0x0b, 0x61, 0x31, 0x8b, 0x64, 0x3c, 0x2f, 0xb8, 0x1c, 0xe8, 0xe0,
+	0xb9, 0x1d, 0x80, 0xa7, 0x57, 0xe2, 0xb1, 0xa7, 0xb8, 0x98, 0xe3, 0xae, 0x62, 0x38, 0x34, 0x83,
+	0x35, 0x37, 0x29, 0x14, 0x92, 0xcc, 0x83, 0xcc, 0xf9, 0x00, 0xe8, 0xb5, 0x99, 0x5d, 0x76, 0x05,
+	0x7a, 0x58, 0xf1, 0xf4, 0x3a, 0x3b, 0x47, 0x4e, 0xd7, 0xb8, 0x8c, 0x2b, 0x15, 0xbc, 0x09, 0x3c,
+	0xf3, 0x28, 0x9c, 0x08, 0xb8, 0xc1, 0xce, 0x92, 0x93, 0x0d, 0x60, 0xc8, 0x2d, 0xcf, 0x7c, 0xd2,
+	0x41, 0x94, 0xe9, 0x4d, 0x76, 0x82, 0x1c, 0x69, 0xcc, 0xa6, 0xd4, 0xde, 0x8e, 0x43, 0x66, 0x04,
+	0xd0, 0x5b, 0x98, 0xef, 0x6a, 0x0b, 0xac, 0x14, 0x5c, 0x0b, 0x10, 0x41, 0x8c, 0x35, 0xcf, 0x65,
+	0x16, 0x1c, 0x70, 0x9b, 0xc5, 0x6c, 0xe6, 0xf9, 0x80, 0x2e, 0xb0, 0x43, 0xe4, 0x40, 0x8d, 0x95,
+	0xba, 0x28, 0x3d, 0xbd, 0x9d, 0x2e, 0x28, 0x0d, 0xe5, 0xdc, 0x3e, 0x28, 0x8b, 0xa0, 0xb8, 0x1e,
+	0x94, 0xe8, 0xdd, 0x9d, 0xc4, 0x6f, 0x65, 0x4c, 0xee, 0x64, 0xdc, 0x5a, 0x09, 0x96, 0xde, 0x8d,
+	0x8a, 0xd8, 0xd5, 0x56, 0x53, 0xbb, 0x88, 0xb1, 0x55, 0x43, 0x2a, 0x61, 0x9b, 0x7e, 0x00, 0x05,
+	0x39, 0x68, 0xef, 0xe8, 0x7b, 0x6d, 0x52, 0x76, 0x93, 0xff, 0xd7, 0x31, 0x9e, 0x6b, 0x80, 0x95,
+	0xd9, 0x30, 0xe4, 0x20, 0x24, 0x0f, 0x19, 0x58, 0x1f, 0x43, 0x28, 0x8c, 0x40, 0x0b, 0x53, 0xe3,
+	0x51, 0xd2, 0xdf, 0xc0, 0x78, 0xad, 0xa7, 0x34, 0x22, 0x8a, 0x39, 0xee, 0xfd, 0xf6, 0xa5, 0x36,
+	0xa6, 0xea, 0x34, 0x55, 0xee, 0x8f, 0xb7, 0x7f, 0x8f, 0x1d, 0x27, 0x87, 0x77, 0x00, 0xa5, 0xa0,
+	0x1f, 0x20, 0x7f, 0x4a, 0x6a, 0x88, 0x55, 0x6d, 0x59, 0x0a, 0xa0, 0x4b, 0x48, 0x43, 0x2e, 0x9d,
+	0xc3, 0x98, 0x99, 0x0d, 0x8c, 0x2a, 0x92, 0xe8, 0x87, 0x78, 0xb5, 0x53, 0x48, 0x25, 0x43, 0x93,
+	0x17, 0x46, 0x83, 0xf6, 0xf4, 0x23, 0x64, 0x69, 0x6a, 0x1e, 0xa1, 0x6f, 0x2e, 0x9d, 0x09, 0x2b,
+	0x1e, 0xbd, 0x8f, 0x1e, 0xd5, 0xf6, 0x99, 0x62, 0x48, 0xbf, 0x89, 0xaa, 0xa8, 0x4d, 0x02, 0x5c,
+	0x66, 0x65, 0x81, 0x92, 0xba, 0x43, 0xbf, 0xf5, 0x1a, 0xcb, 0x5d, 0xfa, 0x6d, 0x24, 0xbd, 0x65,
+	0xf1, 0x12, 0xcb, 0x50, 0xca, 0x86, 0x51, 0x24, 0x1c, 0xb3, 0x52, 0x0d, 0x50, 0x5c, 0x0b, 0xfc,
+	0x5b, 0xf0, 0x01, 0x34, 0x88, 0x1e, 0x3b, 0x4a, 0x0e, 0x35, 0x4b, 0xd4, 0xf1, 0x4c, 0x33, 0xa4,
+	0x6d, 0x3a, 0xdc, 0xe4, 0x3e, 0x2a, 0x30, 0x78, 0x6b, 0xc3, 0x10, 0xb8, 0x40, 0x0a, 0x29, 0x60,
+	0x9d, 0x9b, 0x8e, 0xca, 0xc1, 0xd0, 0xd3, 0x3e, 0x12, 0x5c, 0x8f, 0xa5, 0x08, 0x1b, 0xb0, 0x5b,
+	0xe4, 0x5a, 0x3d, 0x84, 0x02, 0x05, 0xdf, 0x18, 0x83, 0xb1, 0xa1, 0xb0, 0x46, 0x94, 0x99, 0x0f,
+	0x23, 0x29, 0xc0, 0x38, 0x3a, 0xc4, 0x32, 0xd7, 0x86, 0xb7, 0xf4, 0xec, 0xa8, 0x44, 0x41, 0x37,
+	0xd6, 0x59, 0x41, 0x7f, 0xdc, 0xde, 0x3b, 0xaa, 0x91, 0x3e, 0x60, 0x97, 0xc8, 0xf9, 0x7a, 0xc8,
+	0xc2, 0xc3, 0x52, 0x5a, 0x68, 0x29, 0x22, 0x4a, 0xc6, 0x51, 0xd5, 0x26, 0x6c, 0xd6, 0x18, 0x46,
+	0x5c, 0x95, 0x40, 0x73, 0x46, 0xc9, 0xfe, 0x29, 0x62, 0xc5, 0x53, 0xdd, 0xe6, 0x6a, 0x24, 0x5d,
+	0x4c, 0x5f, 0xc8, 0x95, 0x69, 0x9f, 0x62, 0x59, 0x0a, 0x3f, 0xa4, 0x05, 0xea, 0x36, 0x2f, 0x95,
+	0x97, 0x85, 0x02, 0x24, 0xd6, 0x4b, 0x9d, 0xf9, 0x80, 0x79, 0xdb, 0x85, 0x52, 0x37, 0x5d, 0x1a,
+	0x7d, 0x18, 0x8f, 0x8b, 0x19, 0x1f, 0x4b, 0x38, 0x9e, 0x04, 0x15, 0x19, 0x13, 0x28, 0x36, 0x33,
+	0x58, 0xde, 0x84, 0xa0, 0x96, 0xed, 0x27, 0x6f, 0x35, 0x1d, 0x9b, 0x63, 0x07, 0xc8, 0xdb, 0xd3,
+	0x1e, 0xcd, 0xb3, 0x79, 0x32, 0x97, 0x66, 0x4c, 0x13, 0x75, 0x5d, 0xbc, 0xb2, 0x21, 0xd7, 0x03,
+	0xa0, 0x25, 0xea, 0xb9, 0xea, 0x1d, 0x77, 0xd1, 0xf3, 0x88, 0x1d, 0x23, 0xac, 0x36, 0x27, 0x16,
+	0xa2, 0x58, 0x97, 0xd1, 0xe5, 0x7a, 0xbc, 0xd4, 0xf2, 0x61, 0x09, 0xc9, 0xb0, 0x82, 0x97, 0xd2,
+	0xf2, 0xa3, 0x5d, 0x22, 0xc6, 0x71, 0x31, 0xab, 0x42, 0x1d, 0x8e, 0x2e, 0x1b, 0x42, 0x0e, 0xf4,
+	0x11, 0x72, 0xde, 0x1e, 0xf7, 0xa6, 0x08, 0x0a, 0x46, 0xa0, 0x82, 0x30, 0x39, 0x97, 0x9a, 0x7e,
+	0x07, 0x89, 0x44, 0x44, 0xce, 0x15, 0xa6, 0x07, 0x10, 0xf4, 0x71, 0xec, 0x82, 0xad, 0x0a, 0xda,
+	0x84, 0xa1, 0x71, 0x9e, 0x7e, 0xb7, 0x5e, 0x3d, 0xb6, 0x0a, 0x0f, 0x4b, 0x39, 0xe2, 0x0a, 0x5d,
+	0xf8, 0x5e, 0x3c, 0x91, 0x55, 0x11, 0x95, 0xfa, 0xce, 0x86, 0xb0, 0x50, 0xaf, 0xab, 0x4d, 0x7d,
+	0x98, 0xef, 0x63, 0x0e, 0xad, 0x86, 0x76, 0x9c, 0x63, 0x15, 0x23, 0x11, 0x8d, 0x05, 0xf7, 0xc3,
+	0xd4, 0xe1, 0x60, 0xd3, 0x08, 0x82, 0x7e, 0xd2, 0x58, 0x8c, 0xf5, 0x33, 0x96, 0x4f, 0x31, 0xe4,
+	0xd1, 0xf2, 0xb0, 0x04, 0x3b, 0x9e, 0x31, 0xad, 0xb1, 0xf7, 0xc8, 0xed, 0xd8, 0x01, 0xc7, 0xbd,
+	0x43, 0x0f, 0xfa, 0xc6, 0xc2, 0x97, 0x25, 0xfe, 0x1f, 0x60, 0xa5, 0x2d, 0x1d, 0xd8, 0x20, 0x0c,
+	0xa4, 0xe6, 0x3e, 0x36, 0x05, 0x3c, 0xcb, 0xf0, 0xf2, 0xbc, 0x69, 0x74, 0x4b, 0xd7, 0x51, 0x44,
+	0x33, 0x45, 0x39, 0xad, 0xcd, 0x51, 0xa1, 0x55, 0x8f, 0xea, 0xe8, 0x0f, 0x31, 0x78, 0x6b, 0xee,
+	0xab, 0x6c, 0xfd, 0x14, 0xd9, 0x6c, 0xc6, 0x52, 0x3a, 0x45, 0xad, 0xff, 0x08, 0x2f, 0xbe, 0x4e,
+	0xb3, 0xb8, 0x75, 0x61, 0xc1, 0x21, 0xcd, 0x3f, 0xc6, 0xfb, 0x48, 0x81, 0x0c, 0xd6, 0x1a, 0x4b,
+	0x9f, 0xe1, 0x0a, 0x31, 0x64, 0xea, 0x6e, 0xca, 0x46, 0xc5, 0x3d, 0xc7, 0x84, 0x53, 0x49, 0xa9,
+	0x35, 0x7f, 0x03, 0x09, 0xac, 0x05, 0x18, 0x05, 0x6a, 0xf2, 0x42, 0x81, 0x07, 0x3a, 0xc1, 0xa2,
+	0x5e, 0x5b, 0xaa, 0x23, 0xd1, 0x17, 0xc8, 0x6a, 0x4c, 0x13, 0xc1, 0x82, 0xb7, 0x12, 0x46, 0x5c,
+	0x55, 0x1b, 0xff, 0x04, 0x4f, 0xc2, 0x4b, 0x21, 0x4d, 0x35, 0xb0, 0xd9, 0x2e, 0x4d, 0x63, 0x53,
+	0xfa, 0xb2, 0x07, 0x33, 0x39, 0x6d, 0x0b, 0xef, 0x1c, 0x45, 0x91, 0x73, 0x3d, 0x6e, 0x92, 0x50,
+	0x74, 0xc6, 0xd1, 0x97, 0xbb, 0x1a, 0xab, 0x0c, 0xf5, 0x19, 0xeb, 0x92, 0xeb, 0x48, 0x70, 0x5e,
+	0x70, 0x1f, 0xe3, 0xbe, 0xea, 0x3a, 0x02, 0xd7, 0x22, 0x08, 0x18, 0xc9, 0x0c, 0xd0, 0xc5, 0x3e,
+	0x58, 0xd0, 0x19, 0xd0, 0x57, 0xe9, 0x41, 0xa3, 0x94, 0xb7, 0x3c, 0x7b, 0x80, 0x69, 0x61, 0xe7,
+	0xdb, 0xac, 0xea, 0x08, 0xe8, 0x4f, 0x31, 0x59, 0xd6, 0x55, 0xb8, 0x6a, 0x34, 0xb3, 0x14, 0xda,
+	0x75, 0x69, 0x6d, 0x8b, 0xe9, 0x67, 0xa9, 0x83, 0x75, 0xd5, 0xff, 0x35, 0x24, 0x16, 0xc1, 0x9f,
+	0xe3, 0xb6, 0x33, 0x45, 0xf9, 0xf5, 0xdb, 0xfe, 0x82, 0x7d, 0x44, 0xee, 0x7d, 0x01, 0x36, 0xbe,
+	0x35, 0x66, 0x5c, 0x68, 0xcf, 0xfe, 0x25, 0xf6, 0xca, 0x85, 0x85, 0x5c, 0x96, 0x79, 0xb0, 0x98,
+	0x3b, 0x77, 0x39, 0xea, 0xaf, 0x10, 0x34, 0xe2, 0x5a, 0xfa, 0xd9, 0x36, 0x78, 0x06, 0xf4, 0x6b,
+	0x04, 0xcd, 0x74, 0x59, 0x99, 0xd1, 0x23, 0xb0, 0xb1, 0x3f, 0xaf, 0x9b, 0xde, 0xdf, 0xb0, 0xfb,
+	0xe4, 0x83, 0x2a, 0xa3, 0xa1, 0xef, 0xf1, 0xe1, 0xb6, 0x0d, 0x8b, 0x37, 0x91, 0x1e, 0x6d, 0x3b,
+	0xa6, 0xff, 0x96, 0x5d, 0x24, 0x73, 0xad, 0x77, 0x14, 0x86, 0xf5, 0xdd, 0xe6, 0x41, 0x86, 0xff,
+	0xdd, 0xa1, 0xbf, 0xeb, 0xb0, 0x45, 0xd2, 0x6d, 0x4a, 0xe1, 0xf6, 0x90, 0x74, 0x75, 0x1c, 0x55,
+	0x39, 0x22, 0xa5, 0xc1, 0xdf, 0x77, 0xd8, 0x15, 0xec, 0x25, 0x5b, 0xc2, 0x88, 0xbc, 0x59, 0x70,
+	0xde, 0xca, 0xaa, 0x55, 0xc4, 0x9b, 0xf9, 0x43, 0x87, 0xdd, 0x21, 0x37, 0x9b, 0x67, 0x0e, 0x46,
+	0x6a, 0x6c, 0x60, 0x90, 0x52, 0xf4, 0xc3, 0x42, 0x66, 0xac, 0x68, 0x97, 0x2c, 0xfa, 0xc7, 0x0e,
+	0x9b, 0x9f, 0xb6, 0x29, 0x4d, 0xed, 0x4c, 0xdd, 0x54, 0xaf, 0xd4, 0x42, 0x01, 0xfd, 0x53, 0x87,
+	0xdd, 0x26, 0x37, 0x6a, 0xb1, 0x46, 0x77, 0x67, 0x6f, 0x11, 0xbb, 0xf2, 0xa1, 0x9c, 0x76, 0xd0,
+	0xf4, 0xcf, 0x69, 0x86, 0xe2, 0x19, 0x0c, 0x8d, 0x12, 0x78, 0x96, 0xc4, 0x4b, 0xcc, 0x2d, 0xe9,
+	0x69, 0x22, 0xa0, 0xcf, 0x4b, 0xe5, 0xab, 0x42, 0xf8, 0x97, 0x0e, 0xbb, 0x4f, 0xee, 0xcd, 0xcc,
+	0x40, 0x11, 0x88, 0x58, 0x2a, 0x4a, 0x9d, 0x9c, 0x6c, 0x2f, 0x32, 0x3b, 0xfd, 0xaf, 0x1d, 0x76,
+	0x99, 0x5c, 0x68, 0x4f, 0x9f, 0xb1, 0x87, 0xca, 0x41, 0xfa, 0xb7, 0x0e, 0xbb, 0x46, 0x2e, 0x95,
+	0x1a, 0x56, 0x0a, 0xc8, 0xf0, 0xe8, 0xaf, 0x9d, 0x42, 0xff, 0x1e, 0x59, 0xdf, 0xf6, 0xf1, 0x23,
+	0xe7, 0x29, 0xe9, 0xf6, 0x30, 0x36, 0x3f, 0xe6, 0x19, 0x26, 0x9b, 0x7f, 0x74, 0xd8, 0x4d, 0x72,
+	0xa5, 0x79, 0x42, 0xf2, 0x4a, 0xd5, 0xda, 0x04, 0xd0, 0xa8, 0x21, 0x11, 0xb8, 0x73, 0x26, 0x93,
+	0xb1, 0x99, 0xa2, 0x9f, 0x77, 0x7a, 0xff, 0xe9, 0x90, 0xf9, 0x4f, 0x27, 0xcf, 0xbb, 0x5f, 0xfc,
+	0x49, 0xa7, 0xb7, 0xbf, 0xfa, 0x42, 0x53, 0x6c, 0x4e, 0x5e, 0x4e, 0x8a, 0xce, 0x23, 0x51, 0xe1,
+	0xd7, 0x27, 0xcf, 0x56, 0x37, 0xd6, 0xbb, 0x93, 0xcd, 0xf5, 0x85, 0xf5, 0x27, 0x1b, 0xf1, 0x03,
+	0x4f, 0xfd, 0x05, 0xe9, 0xc5, 0xd3, 0xad, 0xd7, 0x7d, 0x50, 0xfa, 0x30, 0xfd, 0xf9, 0xe7, 0x9e,
+	0x37, 0x06, 0x9c, 0xff, 0x6b, 0xcf, 0xdc, 0x20, 0x2d, 0xc6, 0xd7, 0xb6, 0xba, 0xe9, 0x27, 0xfe,
+	0x1a, 0x2d, 0x76, 0xe3, 0x96, 0x5b, 0xff, 0xae, 0x01, 0x8f, 0xf9, 0xda, 0xd6, 0xe3, 0x06, 0xf0,
+	0x78, 0xb4, 0xf8, 0x38, 0x01, 0xfe, 0xbb, 0x67, 0x3e, 0x8d, 0x2e, 0x2d, 0xf1, 0xb5, 0xad, 0xa5,
+	0xa5, 0x06, 0xb2, 0xb4, 0x34, 0x5a, 0x5c, 0x5a, 0x4a, 0xa0, 0x4f, 0xde, 0x8c, 0xa7, 0x5b, 0xfc,
+	0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x57, 0x60, 0x75, 0x27, 0xed, 0x12, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/ad_group_ad_error.pb.go b/googleapis/ads/googleads/v3/errors/ad_group_ad_error.pb.go
new file mode 100644
index 0000000..2ae3e35
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/ad_group_ad_error.pb.go
@@ -0,0 +1,158 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/ad_group_ad_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ad group ad errors.
+type AdGroupAdErrorEnum_AdGroupAdError int32
+
+const (
+	// Enum unspecified.
+	AdGroupAdErrorEnum_UNSPECIFIED AdGroupAdErrorEnum_AdGroupAdError = 0
+	// The received error code is not known in this version.
+	AdGroupAdErrorEnum_UNKNOWN AdGroupAdErrorEnum_AdGroupAdError = 1
+	// No link found between the adgroup ad and the label.
+	AdGroupAdErrorEnum_AD_GROUP_AD_LABEL_DOES_NOT_EXIST AdGroupAdErrorEnum_AdGroupAdError = 2
+	// The label has already been attached to the adgroup ad.
+	AdGroupAdErrorEnum_AD_GROUP_AD_LABEL_ALREADY_EXISTS AdGroupAdErrorEnum_AdGroupAdError = 3
+	// The specified ad was not found in the adgroup
+	AdGroupAdErrorEnum_AD_NOT_UNDER_ADGROUP AdGroupAdErrorEnum_AdGroupAdError = 4
+	// Removed ads may not be modified
+	AdGroupAdErrorEnum_CANNOT_OPERATE_ON_REMOVED_ADGROUPAD AdGroupAdErrorEnum_AdGroupAdError = 5
+	// An ad of this type is deprecated and cannot be created. Only deletions
+	// are permitted.
+	AdGroupAdErrorEnum_CANNOT_CREATE_DEPRECATED_ADS AdGroupAdErrorEnum_AdGroupAdError = 6
+	// Text ads are deprecated and cannot be created. Use expanded text ads
+	// instead.
+	AdGroupAdErrorEnum_CANNOT_CREATE_TEXT_ADS AdGroupAdErrorEnum_AdGroupAdError = 7
+	// A required field was not specified or is an empty string.
+	AdGroupAdErrorEnum_EMPTY_FIELD AdGroupAdErrorEnum_AdGroupAdError = 8
+	// An ad may only be modified once per call
+	AdGroupAdErrorEnum_RESOURCE_REFERENCED_IN_MULTIPLE_OPS AdGroupAdErrorEnum_AdGroupAdError = 9
+)
+
+var AdGroupAdErrorEnum_AdGroupAdError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AD_GROUP_AD_LABEL_DOES_NOT_EXIST",
+	3: "AD_GROUP_AD_LABEL_ALREADY_EXISTS",
+	4: "AD_NOT_UNDER_ADGROUP",
+	5: "CANNOT_OPERATE_ON_REMOVED_ADGROUPAD",
+	6: "CANNOT_CREATE_DEPRECATED_ADS",
+	7: "CANNOT_CREATE_TEXT_ADS",
+	8: "EMPTY_FIELD",
+	9: "RESOURCE_REFERENCED_IN_MULTIPLE_OPS",
+}
+
+var AdGroupAdErrorEnum_AdGroupAdError_value = map[string]int32{
+	"UNSPECIFIED":                         0,
+	"UNKNOWN":                             1,
+	"AD_GROUP_AD_LABEL_DOES_NOT_EXIST":    2,
+	"AD_GROUP_AD_LABEL_ALREADY_EXISTS":    3,
+	"AD_NOT_UNDER_ADGROUP":                4,
+	"CANNOT_OPERATE_ON_REMOVED_ADGROUPAD": 5,
+	"CANNOT_CREATE_DEPRECATED_ADS":        6,
+	"CANNOT_CREATE_TEXT_ADS":              7,
+	"EMPTY_FIELD":                         8,
+	"RESOURCE_REFERENCED_IN_MULTIPLE_OPS": 9,
+}
+
+func (x AdGroupAdErrorEnum_AdGroupAdError) String() string {
+	return proto.EnumName(AdGroupAdErrorEnum_AdGroupAdError_name, int32(x))
+}
+
+func (AdGroupAdErrorEnum_AdGroupAdError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_77c412918395d9af, []int{0, 0}
+}
+
+// Container for enum describing possible ad group ad errors.
+type AdGroupAdErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupAdErrorEnum) Reset()         { *m = AdGroupAdErrorEnum{} }
+func (m *AdGroupAdErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAdErrorEnum) ProtoMessage()    {}
+func (*AdGroupAdErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_77c412918395d9af, []int{0}
+}
+
+func (m *AdGroupAdErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAdErrorEnum.Unmarshal(m, b)
+}
+func (m *AdGroupAdErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAdErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAdErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAdErrorEnum.Merge(m, src)
+}
+func (m *AdGroupAdErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAdErrorEnum.Size(m)
+}
+func (m *AdGroupAdErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAdErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAdErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdGroupAdErrorEnum_AdGroupAdError", AdGroupAdErrorEnum_AdGroupAdError_name, AdGroupAdErrorEnum_AdGroupAdError_value)
+	proto.RegisterType((*AdGroupAdErrorEnum)(nil), "google.ads.googleads.v3.errors.AdGroupAdErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/ad_group_ad_error.proto", fileDescriptor_77c412918395d9af)
+}
+
+var fileDescriptor_77c412918395d9af = []byte{
+	// 447 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x41, 0x6b, 0xd4, 0x40,
+	0x14, 0xc7, 0x6d, 0xaa, 0xad, 0x4e, 0x41, 0x43, 0x14, 0x91, 0x52, 0x4a, 0x59, 0x05, 0x6f, 0xc9,
+	0x21, 0xe0, 0x21, 0x9e, 0xde, 0x66, 0xde, 0x2e, 0xc1, 0xec, 0x64, 0x98, 0x24, 0x6b, 0x2b, 0x0b,
+	0x43, 0x74, 0x96, 0xb0, 0xd0, 0x66, 0x96, 0xcc, 0xb6, 0x1f, 0xc8, 0xa3, 0x77, 0xbf, 0x84, 0xf8,
+	0x49, 0x3c, 0xf8, 0x19, 0x64, 0x32, 0xdd, 0x85, 0x05, 0xf5, 0x34, 0x7f, 0xde, 0xfb, 0xfd, 0xdf,
+	0x9b, 0x99, 0xf7, 0xc8, 0xbb, 0x56, 0xeb, 0xf6, 0x7a, 0x19, 0x35, 0xca, 0x44, 0x4e, 0x5a, 0x75,
+	0x17, 0x47, 0xcb, 0xbe, 0xd7, 0xbd, 0x89, 0x1a, 0x25, 0xdb, 0x5e, 0xdf, 0xae, 0x65, 0xa3, 0xe4,
+	0x10, 0x0a, 0xd7, 0xbd, 0xde, 0xe8, 0xe0, 0xdc, 0xc1, 0x61, 0xa3, 0x4c, 0xb8, 0xf3, 0x85, 0x77,
+	0x71, 0xe8, 0x7c, 0xa7, 0x67, 0xdb, 0xba, 0xeb, 0x55, 0xd4, 0x74, 0x9d, 0xde, 0x34, 0x9b, 0x95,
+	0xee, 0x8c, 0x73, 0x8f, 0x7e, 0x7a, 0x24, 0x00, 0x35, 0xb5, 0x85, 0x41, 0xa1, 0x75, 0x60, 0x77,
+	0x7b, 0x33, 0xfa, 0xee, 0x91, 0xa7, 0xfb, 0xe1, 0xe0, 0x19, 0x39, 0xa9, 0x59, 0xc9, 0x31, 0xcd,
+	0x26, 0x19, 0x52, 0xff, 0x41, 0x70, 0x42, 0x8e, 0x6b, 0xf6, 0x81, 0x15, 0x1f, 0x99, 0x7f, 0x10,
+	0xbc, 0x21, 0x17, 0x40, 0xe5, 0x54, 0x14, 0x35, 0x97, 0x40, 0x65, 0x0e, 0x63, 0xcc, 0x25, 0x2d,
+	0xb0, 0x94, 0xac, 0xa8, 0x24, 0x5e, 0x66, 0x65, 0xe5, 0x7b, 0x7f, 0xa7, 0x20, 0x17, 0x08, 0xf4,
+	0xca, 0x41, 0xa5, 0x7f, 0x18, 0xbc, 0x22, 0x2f, 0x80, 0x0e, 0xbe, 0x9a, 0x51, 0x14, 0x12, 0xe8,
+	0xe0, 0xf0, 0x1f, 0x06, 0x6f, 0xc9, 0xeb, 0x14, 0x98, 0xcd, 0x14, 0x1c, 0x05, 0x54, 0x28, 0x0b,
+	0x26, 0x05, 0xce, 0x8a, 0x39, 0xd2, 0x2d, 0x06, 0xd4, 0x7f, 0x14, 0x5c, 0x90, 0xb3, 0x7b, 0x30,
+	0x15, 0x68, 0x39, 0x8a, 0x5c, 0x60, 0x0a, 0xd5, 0xc0, 0x95, 0xfe, 0x51, 0x70, 0x4a, 0x5e, 0xee,
+	0x13, 0x15, 0x5e, 0x56, 0x43, 0xee, 0xd8, 0x3e, 0x15, 0x67, 0xbc, 0xba, 0x92, 0x93, 0x0c, 0x73,
+	0xea, 0x3f, 0xb6, 0x7d, 0x05, 0x96, 0x45, 0x2d, 0x52, 0x94, 0x02, 0x27, 0x28, 0x90, 0xa5, 0x48,
+	0x65, 0xc6, 0xe4, 0xac, 0xce, 0xab, 0x8c, 0xe7, 0x28, 0x0b, 0x5e, 0xfa, 0x4f, 0xc6, 0xbf, 0x0f,
+	0xc8, 0xe8, 0x8b, 0xbe, 0x09, 0xff, 0x3f, 0x93, 0xf1, 0xf3, 0xfd, 0xbf, 0xe5, 0x76, 0x14, 0xfc,
+	0xe0, 0x13, 0xbd, 0xb7, 0xb5, 0xfa, 0xba, 0xe9, 0xda, 0x50, 0xf7, 0x6d, 0xd4, 0x2e, 0xbb, 0x61,
+	0x50, 0xdb, 0x95, 0x58, 0xaf, 0xcc, 0xbf, 0x36, 0xe4, 0xbd, 0x3b, 0xbe, 0x7a, 0x87, 0x53, 0x80,
+	0x6f, 0xde, 0xf9, 0xd4, 0x15, 0x03, 0x65, 0x42, 0x27, 0xad, 0x9a, 0xc7, 0xe1, 0xd0, 0xd2, 0xfc,
+	0xd8, 0x02, 0x0b, 0x50, 0x66, 0xb1, 0x03, 0x16, 0xf3, 0x78, 0xe1, 0x80, 0x5f, 0xde, 0xc8, 0x45,
+	0x93, 0x04, 0x94, 0x49, 0x92, 0x1d, 0x92, 0x24, 0xf3, 0x38, 0x49, 0x1c, 0xf4, 0xf9, 0x68, 0xb8,
+	0x5d, 0xfc, 0x27, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x5e, 0xd4, 0x6a, 0xbe, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/ad_group_bid_modifier_error.pb.go b/googleapis/ads/googleads/v3/errors/ad_group_bid_modifier_error.pb.go
new file mode 100644
index 0000000..226484a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/ad_group_bid_modifier_error.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/ad_group_bid_modifier_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ad group bid modifier errors.
+type AdGroupBidModifierErrorEnum_AdGroupBidModifierError int32
+
+const (
+	// Enum unspecified.
+	AdGroupBidModifierErrorEnum_UNSPECIFIED AdGroupBidModifierErrorEnum_AdGroupBidModifierError = 0
+	// The received error code is not known in this version.
+	AdGroupBidModifierErrorEnum_UNKNOWN AdGroupBidModifierErrorEnum_AdGroupBidModifierError = 1
+	// The criterion ID does not support bid modification.
+	AdGroupBidModifierErrorEnum_CRITERION_ID_NOT_SUPPORTED AdGroupBidModifierErrorEnum_AdGroupBidModifierError = 2
+	// Cannot override the bid modifier for the given criterion ID if the parent
+	// campaign is opted out of the same criterion.
+	AdGroupBidModifierErrorEnum_CANNOT_OVERRIDE_OPTED_OUT_CAMPAIGN_CRITERION_BID_MODIFIER AdGroupBidModifierErrorEnum_AdGroupBidModifierError = 3
+)
+
+var AdGroupBidModifierErrorEnum_AdGroupBidModifierError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CRITERION_ID_NOT_SUPPORTED",
+	3: "CANNOT_OVERRIDE_OPTED_OUT_CAMPAIGN_CRITERION_BID_MODIFIER",
+}
+
+var AdGroupBidModifierErrorEnum_AdGroupBidModifierError_value = map[string]int32{
+	"UNSPECIFIED":                0,
+	"UNKNOWN":                    1,
+	"CRITERION_ID_NOT_SUPPORTED": 2,
+	"CANNOT_OVERRIDE_OPTED_OUT_CAMPAIGN_CRITERION_BID_MODIFIER": 3,
+}
+
+func (x AdGroupBidModifierErrorEnum_AdGroupBidModifierError) String() string {
+	return proto.EnumName(AdGroupBidModifierErrorEnum_AdGroupBidModifierError_name, int32(x))
+}
+
+func (AdGroupBidModifierErrorEnum_AdGroupBidModifierError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b1dd6efa793776eb, []int{0, 0}
+}
+
+// Container for enum describing possible ad group bid modifier errors.
+type AdGroupBidModifierErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupBidModifierErrorEnum) Reset()         { *m = AdGroupBidModifierErrorEnum{} }
+func (m *AdGroupBidModifierErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupBidModifierErrorEnum) ProtoMessage()    {}
+func (*AdGroupBidModifierErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b1dd6efa793776eb, []int{0}
+}
+
+func (m *AdGroupBidModifierErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupBidModifierErrorEnum.Unmarshal(m, b)
+}
+func (m *AdGroupBidModifierErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupBidModifierErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupBidModifierErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupBidModifierErrorEnum.Merge(m, src)
+}
+func (m *AdGroupBidModifierErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupBidModifierErrorEnum.Size(m)
+}
+func (m *AdGroupBidModifierErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupBidModifierErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupBidModifierErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdGroupBidModifierErrorEnum_AdGroupBidModifierError", AdGroupBidModifierErrorEnum_AdGroupBidModifierError_name, AdGroupBidModifierErrorEnum_AdGroupBidModifierError_value)
+	proto.RegisterType((*AdGroupBidModifierErrorEnum)(nil), "google.ads.googleads.v3.errors.AdGroupBidModifierErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/ad_group_bid_modifier_error.proto", fileDescriptor_b1dd6efa793776eb)
+}
+
+var fileDescriptor_b1dd6efa793776eb = []byte{
+	// 367 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0x4f, 0xca, 0xd4, 0x30,
+	0x14, 0xb7, 0xfd, 0x40, 0x21, 0xdf, 0xc2, 0xd2, 0x8d, 0xf0, 0x39, 0xcc, 0xa2, 0x07, 0x48, 0x17,
+	0x5d, 0x19, 0x11, 0x4c, 0x9b, 0x58, 0x82, 0x4c, 0x52, 0x3a, 0x6d, 0x05, 0x29, 0x84, 0x8e, 0xa9,
+	0xa5, 0x30, 0xd3, 0x94, 0x66, 0x66, 0x8e, 0xe2, 0x01, 0x5c, 0x7a, 0x00, 0x0f, 0xe1, 0x51, 0xbc,
+	0x80, 0x5b, 0x69, 0x33, 0x33, 0xae, 0xc6, 0x55, 0x7e, 0xbc, 0xf7, 0xfb, 0xf3, 0x5e, 0x1e, 0x78,
+	0xdf, 0x69, 0xdd, 0xed, 0xdb, 0xb0, 0x51, 0x26, 0xb4, 0x70, 0x46, 0xe7, 0x28, 0x6c, 0xa7, 0x49,
+	0x4f, 0x26, 0x6c, 0x94, 0xec, 0x26, 0x7d, 0x1a, 0xe5, 0xae, 0x57, 0xf2, 0xa0, 0x55, 0xff, 0xb5,
+	0x6f, 0x27, 0xb9, 0x34, 0xe1, 0x38, 0xe9, 0xa3, 0xf6, 0xd7, 0x56, 0x06, 0x1b, 0x65, 0xe0, 0xcd,
+	0x01, 0x9e, 0x23, 0x68, 0x1d, 0x9e, 0x56, 0xd7, 0x84, 0xb1, 0x0f, 0x9b, 0x61, 0xd0, 0xc7, 0xe6,
+	0xd8, 0xeb, 0xc1, 0x58, 0x75, 0xf0, 0xd3, 0x01, 0xaf, 0xb1, 0x4a, 0xe7, 0x88, 0xb8, 0x57, 0x9b,
+	0x4b, 0x00, 0x9d, 0xa5, 0x74, 0x38, 0x1d, 0x82, 0x6f, 0x0e, 0x78, 0x75, 0xa7, 0xef, 0xbf, 0x04,
+	0x8f, 0x25, 0xdf, 0x66, 0x34, 0x61, 0x1f, 0x18, 0x25, 0xde, 0x33, 0xff, 0x11, 0xbc, 0x28, 0xf9,
+	0x47, 0x2e, 0x3e, 0x71, 0xcf, 0xf1, 0xd7, 0xe0, 0x29, 0xc9, 0x59, 0x41, 0x73, 0x26, 0xb8, 0x64,
+	0x44, 0x72, 0x51, 0xc8, 0x6d, 0x99, 0x65, 0x22, 0x2f, 0x28, 0xf1, 0x5c, 0xff, 0x1d, 0x78, 0x93,
+	0x60, 0x3e, 0x57, 0x45, 0x45, 0xf3, 0x9c, 0x11, 0x2a, 0x45, 0x56, 0x50, 0x22, 0x45, 0x59, 0xc8,
+	0x04, 0x6f, 0x32, 0xcc, 0x52, 0x2e, 0xff, 0x59, 0xc4, 0x8c, 0xc8, 0x8d, 0x20, 0x73, 0x56, 0xee,
+	0x3d, 0xc4, 0x7f, 0x1c, 0x10, 0x7c, 0xd1, 0x07, 0xf8, 0xff, 0xed, 0xe3, 0xd5, 0x9d, 0xe1, 0xb3,
+	0x79, 0xfb, 0xcc, 0xf9, 0x4c, 0x2e, 0xfa, 0x4e, 0xef, 0x9b, 0xa1, 0x83, 0x7a, 0xea, 0xc2, 0xae,
+	0x1d, 0x96, 0xbf, 0xb9, 0xde, 0x63, 0xec, 0xcd, 0xbd, 0xf3, 0xbc, 0xb5, 0xcf, 0x77, 0xf7, 0x21,
+	0xc5, 0xf8, 0x87, 0xbb, 0x4e, 0xad, 0x19, 0x56, 0x06, 0x5a, 0x38, 0xa3, 0x2a, 0x82, 0x4b, 0xa4,
+	0xf9, 0x75, 0x25, 0xd4, 0x58, 0x99, 0xfa, 0x46, 0xa8, 0xab, 0xa8, 0xb6, 0x84, 0xdf, 0x6e, 0x60,
+	0xab, 0x08, 0x61, 0x65, 0x10, 0xba, 0x51, 0x10, 0xaa, 0x22, 0x84, 0x2c, 0x69, 0xf7, 0x7c, 0x99,
+	0x2e, 0xfa, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x8e, 0xad, 0xe4, 0x3b, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/ad_group_criterion_error.pb.go b/googleapis/ads/googleads/v3/errors/ad_group_criterion_error.pb.go
new file mode 100644
index 0000000..9bd53ec
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/ad_group_criterion_error.pb.go
@@ -0,0 +1,315 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/ad_group_criterion_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ad group criterion errors.
+type AdGroupCriterionErrorEnum_AdGroupCriterionError int32
+
+const (
+	// Enum unspecified.
+	AdGroupCriterionErrorEnum_UNSPECIFIED AdGroupCriterionErrorEnum_AdGroupCriterionError = 0
+	// The received error code is not known in this version.
+	AdGroupCriterionErrorEnum_UNKNOWN AdGroupCriterionErrorEnum_AdGroupCriterionError = 1
+	// No link found between the AdGroupCriterion and the label.
+	AdGroupCriterionErrorEnum_AD_GROUP_CRITERION_LABEL_DOES_NOT_EXIST AdGroupCriterionErrorEnum_AdGroupCriterionError = 2
+	// The label has already been attached to the AdGroupCriterion.
+	AdGroupCriterionErrorEnum_AD_GROUP_CRITERION_LABEL_ALREADY_EXISTS AdGroupCriterionErrorEnum_AdGroupCriterionError = 3
+	// Negative AdGroupCriterion cannot have labels.
+	AdGroupCriterionErrorEnum_CANNOT_ADD_LABEL_TO_NEGATIVE_CRITERION AdGroupCriterionErrorEnum_AdGroupCriterionError = 4
+	// Too many operations for a single call.
+	AdGroupCriterionErrorEnum_TOO_MANY_OPERATIONS AdGroupCriterionErrorEnum_AdGroupCriterionError = 5
+	// Negative ad group criteria are not updateable.
+	AdGroupCriterionErrorEnum_CANT_UPDATE_NEGATIVE AdGroupCriterionErrorEnum_AdGroupCriterionError = 6
+	// Concrete type of criterion (keyword v.s. placement) is required for ADD
+	// and SET operations.
+	AdGroupCriterionErrorEnum_CONCRETE_TYPE_REQUIRED AdGroupCriterionErrorEnum_AdGroupCriterionError = 7
+	// Bid is incompatible with ad group's bidding settings.
+	AdGroupCriterionErrorEnum_BID_INCOMPATIBLE_WITH_ADGROUP AdGroupCriterionErrorEnum_AdGroupCriterionError = 8
+	// Cannot target and exclude the same criterion at once.
+	AdGroupCriterionErrorEnum_CANNOT_TARGET_AND_EXCLUDE AdGroupCriterionErrorEnum_AdGroupCriterionError = 9
+	// The URL of a placement is invalid.
+	AdGroupCriterionErrorEnum_ILLEGAL_URL AdGroupCriterionErrorEnum_AdGroupCriterionError = 10
+	// Keyword text was invalid.
+	AdGroupCriterionErrorEnum_INVALID_KEYWORD_TEXT AdGroupCriterionErrorEnum_AdGroupCriterionError = 11
+	// Destination URL was invalid.
+	AdGroupCriterionErrorEnum_INVALID_DESTINATION_URL AdGroupCriterionErrorEnum_AdGroupCriterionError = 12
+	// The destination url must contain at least one tag (e.g. {lpurl})
+	AdGroupCriterionErrorEnum_MISSING_DESTINATION_URL_TAG AdGroupCriterionErrorEnum_AdGroupCriterionError = 13
+	// Keyword-level cpm bid is not supported
+	AdGroupCriterionErrorEnum_KEYWORD_LEVEL_BID_NOT_SUPPORTED_FOR_MANUALCPM AdGroupCriterionErrorEnum_AdGroupCriterionError = 14
+	// For example, cannot add a biddable ad group criterion that had been
+	// removed.
+	AdGroupCriterionErrorEnum_INVALID_USER_STATUS AdGroupCriterionErrorEnum_AdGroupCriterionError = 15
+	// Criteria type cannot be targeted for the ad group. Either the account is
+	// restricted to keywords only, the criteria type is incompatible with the
+	// campaign's bidding strategy, or the criteria type can only be applied to
+	// campaigns.
+	AdGroupCriterionErrorEnum_CANNOT_ADD_CRITERIA_TYPE AdGroupCriterionErrorEnum_AdGroupCriterionError = 16
+	// Criteria type cannot be excluded for the ad group. Refer to the
+	// documentation for a specific criterion to check if it is excludable.
+	AdGroupCriterionErrorEnum_CANNOT_EXCLUDE_CRITERIA_TYPE AdGroupCriterionErrorEnum_AdGroupCriterionError = 17
+	// Partial failure is not supported for shopping campaign mutate operations.
+	AdGroupCriterionErrorEnum_CAMPAIGN_TYPE_NOT_COMPATIBLE_WITH_PARTIAL_FAILURE AdGroupCriterionErrorEnum_AdGroupCriterionError = 27
+	// Operations in the mutate request changes too many shopping ad groups.
+	// Please split requests for multiple shopping ad groups across multiple
+	// requests.
+	AdGroupCriterionErrorEnum_OPERATIONS_FOR_TOO_MANY_SHOPPING_ADGROUPS AdGroupCriterionErrorEnum_AdGroupCriterionError = 28
+	// Not allowed to modify url fields of an ad group criterion if there are
+	// duplicate elements for that ad group criterion in the request.
+	AdGroupCriterionErrorEnum_CANNOT_MODIFY_URL_FIELDS_WITH_DUPLICATE_ELEMENTS AdGroupCriterionErrorEnum_AdGroupCriterionError = 29
+	// Cannot set url fields without also setting final urls.
+	AdGroupCriterionErrorEnum_CANNOT_SET_WITHOUT_FINAL_URLS AdGroupCriterionErrorEnum_AdGroupCriterionError = 30
+	// Cannot clear final urls if final mobile urls exist.
+	AdGroupCriterionErrorEnum_CANNOT_CLEAR_FINAL_URLS_IF_FINAL_MOBILE_URLS_EXIST AdGroupCriterionErrorEnum_AdGroupCriterionError = 31
+	// Cannot clear final urls if final app urls exist.
+	AdGroupCriterionErrorEnum_CANNOT_CLEAR_FINAL_URLS_IF_FINAL_APP_URLS_EXIST AdGroupCriterionErrorEnum_AdGroupCriterionError = 32
+	// Cannot clear final urls if tracking url template exists.
+	AdGroupCriterionErrorEnum_CANNOT_CLEAR_FINAL_URLS_IF_TRACKING_URL_TEMPLATE_EXISTS AdGroupCriterionErrorEnum_AdGroupCriterionError = 33
+	// Cannot clear final urls if url custom parameters exist.
+	AdGroupCriterionErrorEnum_CANNOT_CLEAR_FINAL_URLS_IF_URL_CUSTOM_PARAMETERS_EXIST AdGroupCriterionErrorEnum_AdGroupCriterionError = 34
+	// Cannot set both destination url and final urls.
+	AdGroupCriterionErrorEnum_CANNOT_SET_BOTH_DESTINATION_URL_AND_FINAL_URLS AdGroupCriterionErrorEnum_AdGroupCriterionError = 35
+	// Cannot set both destination url and tracking url template.
+	AdGroupCriterionErrorEnum_CANNOT_SET_BOTH_DESTINATION_URL_AND_TRACKING_URL_TEMPLATE AdGroupCriterionErrorEnum_AdGroupCriterionError = 36
+	// Final urls are not supported for this criterion type.
+	AdGroupCriterionErrorEnum_FINAL_URLS_NOT_SUPPORTED_FOR_CRITERION_TYPE AdGroupCriterionErrorEnum_AdGroupCriterionError = 37
+	// Final mobile urls are not supported for this criterion type.
+	AdGroupCriterionErrorEnum_FINAL_MOBILE_URLS_NOT_SUPPORTED_FOR_CRITERION_TYPE AdGroupCriterionErrorEnum_AdGroupCriterionError = 38
+	// Ad group is invalid due to the listing groups it contains.
+	AdGroupCriterionErrorEnum_INVALID_LISTING_GROUP_HIERARCHY AdGroupCriterionErrorEnum_AdGroupCriterionError = 39
+	// Listing group unit cannot have children.
+	AdGroupCriterionErrorEnum_LISTING_GROUP_UNIT_CANNOT_HAVE_CHILDREN AdGroupCriterionErrorEnum_AdGroupCriterionError = 40
+	// Subdivided listing groups must have an "others" case.
+	AdGroupCriterionErrorEnum_LISTING_GROUP_SUBDIVISION_REQUIRES_OTHERS_CASE AdGroupCriterionErrorEnum_AdGroupCriterionError = 41
+	// Dimension type of listing group must be the same as that of its siblings.
+	AdGroupCriterionErrorEnum_LISTING_GROUP_REQUIRES_SAME_DIMENSION_TYPE_AS_SIBLINGS AdGroupCriterionErrorEnum_AdGroupCriterionError = 42
+	// Listing group cannot be added to the ad group because it already exists.
+	AdGroupCriterionErrorEnum_LISTING_GROUP_ALREADY_EXISTS AdGroupCriterionErrorEnum_AdGroupCriterionError = 43
+	// Listing group referenced in the operation was not found in the ad group.
+	AdGroupCriterionErrorEnum_LISTING_GROUP_DOES_NOT_EXIST AdGroupCriterionErrorEnum_AdGroupCriterionError = 44
+	// Recursive removal failed because listing group subdivision is being
+	// created or modified in this request.
+	AdGroupCriterionErrorEnum_LISTING_GROUP_CANNOT_BE_REMOVED AdGroupCriterionErrorEnum_AdGroupCriterionError = 45
+	// Listing group type is not allowed for specified ad group criterion type.
+	AdGroupCriterionErrorEnum_INVALID_LISTING_GROUP_TYPE AdGroupCriterionErrorEnum_AdGroupCriterionError = 46
+	// Listing group in an ADD operation specifies a non temporary criterion id.
+	AdGroupCriterionErrorEnum_LISTING_GROUP_ADD_MAY_ONLY_USE_TEMP_ID AdGroupCriterionErrorEnum_AdGroupCriterionError = 47
+)
+
+var AdGroupCriterionErrorEnum_AdGroupCriterionError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "AD_GROUP_CRITERION_LABEL_DOES_NOT_EXIST",
+	3:  "AD_GROUP_CRITERION_LABEL_ALREADY_EXISTS",
+	4:  "CANNOT_ADD_LABEL_TO_NEGATIVE_CRITERION",
+	5:  "TOO_MANY_OPERATIONS",
+	6:  "CANT_UPDATE_NEGATIVE",
+	7:  "CONCRETE_TYPE_REQUIRED",
+	8:  "BID_INCOMPATIBLE_WITH_ADGROUP",
+	9:  "CANNOT_TARGET_AND_EXCLUDE",
+	10: "ILLEGAL_URL",
+	11: "INVALID_KEYWORD_TEXT",
+	12: "INVALID_DESTINATION_URL",
+	13: "MISSING_DESTINATION_URL_TAG",
+	14: "KEYWORD_LEVEL_BID_NOT_SUPPORTED_FOR_MANUALCPM",
+	15: "INVALID_USER_STATUS",
+	16: "CANNOT_ADD_CRITERIA_TYPE",
+	17: "CANNOT_EXCLUDE_CRITERIA_TYPE",
+	27: "CAMPAIGN_TYPE_NOT_COMPATIBLE_WITH_PARTIAL_FAILURE",
+	28: "OPERATIONS_FOR_TOO_MANY_SHOPPING_ADGROUPS",
+	29: "CANNOT_MODIFY_URL_FIELDS_WITH_DUPLICATE_ELEMENTS",
+	30: "CANNOT_SET_WITHOUT_FINAL_URLS",
+	31: "CANNOT_CLEAR_FINAL_URLS_IF_FINAL_MOBILE_URLS_EXIST",
+	32: "CANNOT_CLEAR_FINAL_URLS_IF_FINAL_APP_URLS_EXIST",
+	33: "CANNOT_CLEAR_FINAL_URLS_IF_TRACKING_URL_TEMPLATE_EXISTS",
+	34: "CANNOT_CLEAR_FINAL_URLS_IF_URL_CUSTOM_PARAMETERS_EXIST",
+	35: "CANNOT_SET_BOTH_DESTINATION_URL_AND_FINAL_URLS",
+	36: "CANNOT_SET_BOTH_DESTINATION_URL_AND_TRACKING_URL_TEMPLATE",
+	37: "FINAL_URLS_NOT_SUPPORTED_FOR_CRITERION_TYPE",
+	38: "FINAL_MOBILE_URLS_NOT_SUPPORTED_FOR_CRITERION_TYPE",
+	39: "INVALID_LISTING_GROUP_HIERARCHY",
+	40: "LISTING_GROUP_UNIT_CANNOT_HAVE_CHILDREN",
+	41: "LISTING_GROUP_SUBDIVISION_REQUIRES_OTHERS_CASE",
+	42: "LISTING_GROUP_REQUIRES_SAME_DIMENSION_TYPE_AS_SIBLINGS",
+	43: "LISTING_GROUP_ALREADY_EXISTS",
+	44: "LISTING_GROUP_DOES_NOT_EXIST",
+	45: "LISTING_GROUP_CANNOT_BE_REMOVED",
+	46: "INVALID_LISTING_GROUP_TYPE",
+	47: "LISTING_GROUP_ADD_MAY_ONLY_USE_TEMP_ID",
+}
+
+var AdGroupCriterionErrorEnum_AdGroupCriterionError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"AD_GROUP_CRITERION_LABEL_DOES_NOT_EXIST":                   2,
+	"AD_GROUP_CRITERION_LABEL_ALREADY_EXISTS":                   3,
+	"CANNOT_ADD_LABEL_TO_NEGATIVE_CRITERION":                    4,
+	"TOO_MANY_OPERATIONS":                                       5,
+	"CANT_UPDATE_NEGATIVE":                                      6,
+	"CONCRETE_TYPE_REQUIRED":                                    7,
+	"BID_INCOMPATIBLE_WITH_ADGROUP":                             8,
+	"CANNOT_TARGET_AND_EXCLUDE":                                 9,
+	"ILLEGAL_URL":                                               10,
+	"INVALID_KEYWORD_TEXT":                                      11,
+	"INVALID_DESTINATION_URL":                                   12,
+	"MISSING_DESTINATION_URL_TAG":                               13,
+	"KEYWORD_LEVEL_BID_NOT_SUPPORTED_FOR_MANUALCPM":             14,
+	"INVALID_USER_STATUS":                                       15,
+	"CANNOT_ADD_CRITERIA_TYPE":                                  16,
+	"CANNOT_EXCLUDE_CRITERIA_TYPE":                              17,
+	"CAMPAIGN_TYPE_NOT_COMPATIBLE_WITH_PARTIAL_FAILURE":         27,
+	"OPERATIONS_FOR_TOO_MANY_SHOPPING_ADGROUPS":                 28,
+	"CANNOT_MODIFY_URL_FIELDS_WITH_DUPLICATE_ELEMENTS":          29,
+	"CANNOT_SET_WITHOUT_FINAL_URLS":                             30,
+	"CANNOT_CLEAR_FINAL_URLS_IF_FINAL_MOBILE_URLS_EXIST":        31,
+	"CANNOT_CLEAR_FINAL_URLS_IF_FINAL_APP_URLS_EXIST":           32,
+	"CANNOT_CLEAR_FINAL_URLS_IF_TRACKING_URL_TEMPLATE_EXISTS":   33,
+	"CANNOT_CLEAR_FINAL_URLS_IF_URL_CUSTOM_PARAMETERS_EXIST":    34,
+	"CANNOT_SET_BOTH_DESTINATION_URL_AND_FINAL_URLS":            35,
+	"CANNOT_SET_BOTH_DESTINATION_URL_AND_TRACKING_URL_TEMPLATE": 36,
+	"FINAL_URLS_NOT_SUPPORTED_FOR_CRITERION_TYPE":               37,
+	"FINAL_MOBILE_URLS_NOT_SUPPORTED_FOR_CRITERION_TYPE":        38,
+	"INVALID_LISTING_GROUP_HIERARCHY":                           39,
+	"LISTING_GROUP_UNIT_CANNOT_HAVE_CHILDREN":                   40,
+	"LISTING_GROUP_SUBDIVISION_REQUIRES_OTHERS_CASE":            41,
+	"LISTING_GROUP_REQUIRES_SAME_DIMENSION_TYPE_AS_SIBLINGS":    42,
+	"LISTING_GROUP_ALREADY_EXISTS":                              43,
+	"LISTING_GROUP_DOES_NOT_EXIST":                              44,
+	"LISTING_GROUP_CANNOT_BE_REMOVED":                           45,
+	"INVALID_LISTING_GROUP_TYPE":                                46,
+	"LISTING_GROUP_ADD_MAY_ONLY_USE_TEMP_ID":                    47,
+}
+
+func (x AdGroupCriterionErrorEnum_AdGroupCriterionError) String() string {
+	return proto.EnumName(AdGroupCriterionErrorEnum_AdGroupCriterionError_name, int32(x))
+}
+
+func (AdGroupCriterionErrorEnum_AdGroupCriterionError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_5a28fddaeefc2376, []int{0, 0}
+}
+
+// Container for enum describing possible ad group criterion errors.
+type AdGroupCriterionErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupCriterionErrorEnum) Reset()         { *m = AdGroupCriterionErrorEnum{} }
+func (m *AdGroupCriterionErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterionErrorEnum) ProtoMessage()    {}
+func (*AdGroupCriterionErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5a28fddaeefc2376, []int{0}
+}
+
+func (m *AdGroupCriterionErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterionErrorEnum.Unmarshal(m, b)
+}
+func (m *AdGroupCriterionErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterionErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterionErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterionErrorEnum.Merge(m, src)
+}
+func (m *AdGroupCriterionErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterionErrorEnum.Size(m)
+}
+func (m *AdGroupCriterionErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterionErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterionErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdGroupCriterionErrorEnum_AdGroupCriterionError", AdGroupCriterionErrorEnum_AdGroupCriterionError_name, AdGroupCriterionErrorEnum_AdGroupCriterionError_value)
+	proto.RegisterType((*AdGroupCriterionErrorEnum)(nil), "google.ads.googleads.v3.errors.AdGroupCriterionErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/ad_group_criterion_error.proto", fileDescriptor_5a28fddaeefc2376)
+}
+
+var fileDescriptor_5a28fddaeefc2376 = []byte{
+	// 976 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xdd, 0x72, 0x1b, 0x35,
+	0x14, 0xa6, 0x29, 0xb4, 0xa0, 0x06, 0x2a, 0xc4, 0x4f, 0xdb, 0xfc, 0xb6, 0x29, 0xb4, 0xb4, 0x21,
+	0x36, 0xad, 0xa1, 0x0c, 0xee, 0xf4, 0xe2, 0x78, 0x75, 0xbc, 0xd6, 0x44, 0x2b, 0x2d, 0x92, 0xd6,
+	0x89, 0x99, 0xcc, 0x68, 0x4c, 0x9d, 0xf1, 0x64, 0xa6, 0xf5, 0x66, 0xec, 0xb4, 0x0f, 0xc4, 0x25,
+	0x6f, 0xc0, 0x2b, 0xf0, 0x02, 0xbc, 0x03, 0xf7, 0xdc, 0x33, 0xda, 0x5d, 0x3b, 0x8e, 0x13, 0x52,
+	0xae, 0xa2, 0xf8, 0x7c, 0x9f, 0xf4, 0x9d, 0xef, 0x9c, 0x3d, 0x87, 0xbc, 0x18, 0xe6, 0xf9, 0xf0,
+	0xd5, 0x61, 0xbd, 0x3f, 0x98, 0xd4, 0xcb, 0x63, 0x38, 0xbd, 0x6d, 0xd4, 0x0f, 0xc7, 0xe3, 0x7c,
+	0x3c, 0xa9, 0xf7, 0x07, 0x7e, 0x38, 0xce, 0xdf, 0x1c, 0xfb, 0x97, 0xe3, 0xa3, 0x93, 0xc3, 0xf1,
+	0x51, 0x3e, 0xf2, 0x45, 0xa4, 0x76, 0x3c, 0xce, 0x4f, 0x72, 0xb6, 0x51, 0x72, 0x6a, 0xfd, 0xc1,
+	0xa4, 0x36, 0xa3, 0xd7, 0xde, 0x36, 0x6a, 0x25, 0x7d, 0x65, 0x6d, 0x7a, 0xfd, 0xf1, 0x51, 0xbd,
+	0x3f, 0x1a, 0xe5, 0x27, 0xfd, 0x93, 0xa3, 0x7c, 0x34, 0x29, 0xd9, 0x5b, 0x7f, 0x2d, 0x93, 0x3b,
+	0x30, 0x88, 0xc3, 0xfd, 0xd1, 0xf4, 0x7a, 0x0c, 0x44, 0x1c, 0xbd, 0x79, 0xbd, 0xf5, 0xc7, 0x32,
+	0xf9, 0xe2, 0xc2, 0x28, 0xbb, 0x49, 0x6e, 0x64, 0xca, 0xa6, 0x18, 0x89, 0xb6, 0x40, 0x4e, 0xdf,
+	0x63, 0x37, 0xc8, 0xf5, 0x4c, 0xed, 0x2a, 0xbd, 0xa7, 0xe8, 0x15, 0xb6, 0x4d, 0x1e, 0x02, 0xf7,
+	0xb1, 0xd1, 0x59, 0xea, 0x23, 0x23, 0x1c, 0x1a, 0xa1, 0x95, 0x97, 0xd0, 0x42, 0xe9, 0xb9, 0x46,
+	0xeb, 0x95, 0x76, 0x1e, 0xf7, 0x85, 0x75, 0x74, 0xe9, 0x52, 0x30, 0x48, 0x83, 0xc0, 0x7b, 0x25,
+	0xd6, 0xd2, 0xab, 0xec, 0x31, 0x79, 0x10, 0x81, 0x0a, 0x74, 0xe0, 0xbc, 0x02, 0x39, 0xed, 0x15,
+	0xc6, 0xe0, 0x44, 0x17, 0x4f, 0x2f, 0xa0, 0xef, 0xb3, 0x5b, 0xe4, 0x33, 0xa7, 0xb5, 0x4f, 0x40,
+	0xf5, 0xbc, 0x4e, 0xd1, 0x80, 0x13, 0x5a, 0x59, 0xfa, 0x01, 0xbb, 0x4d, 0x3e, 0x8f, 0x40, 0x39,
+	0x9f, 0xa5, 0x1c, 0x1c, 0xce, 0xc8, 0xf4, 0x1a, 0x5b, 0x21, 0x5f, 0x46, 0x5a, 0x45, 0x06, 0x1d,
+	0x7a, 0xd7, 0x4b, 0xd1, 0x1b, 0xfc, 0x39, 0x13, 0x06, 0x39, 0xbd, 0xce, 0xee, 0x91, 0xf5, 0x96,
+	0xe0, 0x5e, 0xa8, 0x48, 0x27, 0x29, 0x38, 0xd1, 0x92, 0xe8, 0xf7, 0x84, 0xeb, 0x78, 0xe0, 0x85,
+	0x78, 0xfa, 0x21, 0x5b, 0x27, 0x77, 0x2a, 0x75, 0x0e, 0x4c, 0x8c, 0xce, 0x83, 0xe2, 0x1e, 0xf7,
+	0x23, 0x99, 0x71, 0xa4, 0x1f, 0x05, 0xd3, 0x84, 0x94, 0x18, 0x83, 0xf4, 0x99, 0x91, 0x94, 0x04,
+	0x21, 0x42, 0x75, 0x41, 0x0a, 0xee, 0x77, 0xb1, 0xb7, 0xa7, 0x0d, 0xf7, 0x0e, 0xf7, 0x1d, 0xbd,
+	0xc1, 0x56, 0xc9, 0xad, 0x69, 0x84, 0xa3, 0x75, 0x42, 0x15, 0xe2, 0x0b, 0xda, 0x32, 0xdb, 0x24,
+	0xab, 0x89, 0xb0, 0x56, 0xa8, 0x78, 0x31, 0xe8, 0x1d, 0xc4, 0xf4, 0x63, 0xf6, 0x84, 0xec, 0x4c,
+	0xef, 0x93, 0xd8, 0x45, 0xe9, 0x83, 0xf0, 0x20, 0xcb, 0x66, 0x69, 0xaa, 0x8d, 0x43, 0xee, 0xdb,
+	0xda, 0x04, 0x67, 0x32, 0x90, 0x51, 0x9a, 0xd0, 0x4f, 0x82, 0x59, 0xd3, 0x07, 0x33, 0x8b, 0xc6,
+	0x5b, 0x07, 0x2e, 0xb3, 0xf4, 0x26, 0x5b, 0x23, 0xb7, 0xe7, 0x1c, 0xaf, 0xfc, 0x85, 0xc2, 0x1d,
+	0x4a, 0xd9, 0x5d, 0xb2, 0x56, 0x45, 0xab, 0x34, 0x17, 0x10, 0x9f, 0xb2, 0x1f, 0xc8, 0x93, 0x08,
+	0x92, 0x14, 0x44, 0xac, 0x4a, 0x4b, 0x03, 0x78, 0xd1, 0xc2, 0x14, 0x8c, 0x13, 0x20, 0x7d, 0x1b,
+	0x84, 0xcc, 0x0c, 0xd2, 0x55, 0xb6, 0x43, 0x1e, 0x9d, 0xd6, 0xac, 0x50, 0x3b, 0xab, 0xa5, 0xed,
+	0xe8, 0x34, 0x0d, 0xc9, 0x57, 0xc6, 0x5b, 0xba, 0xc6, 0xbe, 0x27, 0xdf, 0x55, 0x3a, 0x12, 0xcd,
+	0x45, 0xbb, 0x57, 0x98, 0xd1, 0x16, 0x28, 0xb9, 0x2d, 0x5f, 0xe0, 0x59, 0x2a, 0x45, 0x14, 0xca,
+	0x8d, 0x12, 0x13, 0x54, 0xce, 0xd2, 0xf5, 0x50, 0xd2, 0x8a, 0x65, 0xd1, 0x15, 0x38, 0x9d, 0x39,
+	0xdf, 0x16, 0xaa, 0xac, 0x90, 0xa5, 0x1b, 0xec, 0x19, 0x79, 0x5a, 0x41, 0x22, 0x89, 0x60, 0xe6,
+	0x82, 0x5e, 0xb4, 0xab, 0xff, 0x12, 0xdd, 0x12, 0x12, 0xcb, 0x1f, 0xcb, 0xae, 0xde, 0x64, 0x0d,
+	0x52, 0x7f, 0x27, 0x0f, 0xd2, 0x74, 0x9e, 0x74, 0x97, 0x3d, 0x27, 0x3f, 0x5e, 0x42, 0x72, 0x06,
+	0xa2, 0xdd, 0x90, 0x77, 0x51, 0x68, 0x4c, 0x52, 0x59, 0xa4, 0x53, 0x7e, 0x1a, 0xf7, 0x58, 0x93,
+	0x3c, 0xbb, 0x84, 0x1c, 0x38, 0x51, 0x66, 0x9d, 0x4e, 0x82, 0xd9, 0x90, 0xa0, 0x43, 0x33, 0x7d,
+	0x78, 0x8b, 0x3d, 0x25, 0xb5, 0x39, 0x23, 0x5a, 0x3a, 0x18, 0xb6, 0xd0, 0x59, 0xa1, 0x95, 0xe7,
+	0x9c, 0xb9, 0xcf, 0x5e, 0x90, 0x9f, 0xfe, 0x0f, 0xe7, 0x42, 0xd5, 0xf4, 0x2b, 0x56, 0x27, 0xdb,
+	0x73, 0x0a, 0xcf, 0x37, 0xe7, 0xe9, 0x28, 0x28, 0x1a, 0xe9, 0xeb, 0x50, 0x89, 0xf3, 0x76, 0xbf,
+	0x93, 0xf7, 0x80, 0xdd, 0x27, 0x9b, 0xd3, 0xce, 0x96, 0x22, 0xe8, 0x8b, 0xab, 0x61, 0xd3, 0x11,
+	0x68, 0xc0, 0x44, 0x9d, 0x1e, 0x7d, 0x18, 0x86, 0xd0, 0xd9, 0x60, 0xa6, 0x84, 0xf3, 0x55, 0x7e,
+	0x1d, 0x08, 0x93, 0xa5, 0x23, 0x24, 0x37, 0xa8, 0xe8, 0x37, 0xc1, 0xad, 0xb3, 0x60, 0x9b, 0xb5,
+	0xb8, 0xe8, 0x0a, 0x1b, 0x5e, 0xad, 0x26, 0x86, 0xf5, 0xda, 0x75, 0x82, 0xc5, 0x11, 0x58, 0xa4,
+	0x8f, 0x42, 0x75, 0xce, 0x72, 0x66, 0x38, 0x0b, 0x09, 0x7a, 0x2e, 0x12, 0x54, 0x76, 0xaa, 0xda,
+	0x83, 0xf5, 0x56, 0xb4, 0xa4, 0x50, 0xb1, 0xa5, 0x8f, 0xc3, 0x47, 0x76, 0x96, 0xbb, 0x30, 0x16,
+	0xb7, 0xcf, 0x23, 0x16, 0xa6, 0xec, 0xb7, 0xc1, 0x85, 0xb3, 0x88, 0x2a, 0xb7, 0x56, 0x98, 0x71,
+	0x89, 0xee, 0x22, 0xa7, 0x3b, 0x6c, 0x83, 0xac, 0x5c, 0x6c, 0x55, 0x61, 0x65, 0x2d, 0x4c, 0xdf,
+	0x05, 0x21, 0x9c, 0xfb, 0x04, 0x7a, 0x5e, 0x2b, 0xd9, 0x0b, 0x73, 0xa3, 0x28, 0xb0, 0x17, 0x9c,
+	0xd6, 0x5b, 0xff, 0x5c, 0x21, 0x5b, 0x2f, 0xf3, 0xd7, 0xb5, 0xcb, 0xd7, 0x53, 0x6b, 0xe5, 0xc2,
+	0xfd, 0x92, 0x86, 0xe5, 0x94, 0x5e, 0xf9, 0x85, 0x57, 0xec, 0x61, 0xfe, 0xaa, 0x3f, 0x1a, 0xd6,
+	0xf2, 0xf1, 0xb0, 0x3e, 0x3c, 0x1c, 0x15, 0xab, 0x6b, 0xba, 0x2b, 0x8f, 0x8f, 0x26, 0xff, 0xb5,
+	0x3a, 0x9f, 0x97, 0x7f, 0x7e, 0x5b, 0xba, 0x1a, 0x03, 0xfc, 0xbe, 0xb4, 0x11, 0x97, 0x97, 0xc1,
+	0x60, 0x52, 0x2b, 0x8f, 0xe1, 0xd4, 0x6d, 0xd4, 0x8a, 0x27, 0x27, 0x7f, 0x4e, 0x01, 0x07, 0x30,
+	0x98, 0x1c, 0xcc, 0x00, 0x07, 0xdd, 0xc6, 0x41, 0x09, 0xf8, 0x7b, 0x69, 0xab, 0xfc, 0xb5, 0xd9,
+	0x84, 0xc1, 0xa4, 0xd9, 0x9c, 0x41, 0x9a, 0xcd, 0x6e, 0xa3, 0xd9, 0x2c, 0x41, 0xbf, 0x5e, 0x2b,
+	0xd4, 0x35, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x70, 0x09, 0xd6, 0x0f, 0xd7, 0x07, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/ad_group_error.pb.go b/googleapis/ads/googleads/v3/errors/ad_group_error.pb.go
new file mode 100644
index 0000000..b78a230
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/ad_group_error.pb.go
@@ -0,0 +1,182 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/ad_group_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ad group errors.
+type AdGroupErrorEnum_AdGroupError int32
+
+const (
+	// Enum unspecified.
+	AdGroupErrorEnum_UNSPECIFIED AdGroupErrorEnum_AdGroupError = 0
+	// The received error code is not known in this version.
+	AdGroupErrorEnum_UNKNOWN AdGroupErrorEnum_AdGroupError = 1
+	// AdGroup with the same name already exists for the campaign.
+	AdGroupErrorEnum_DUPLICATE_ADGROUP_NAME AdGroupErrorEnum_AdGroupError = 2
+	// AdGroup name is not valid.
+	AdGroupErrorEnum_INVALID_ADGROUP_NAME AdGroupErrorEnum_AdGroupError = 3
+	// Advertiser is not allowed to target sites or set site bids that are not
+	// on the Google Search Network.
+	AdGroupErrorEnum_ADVERTISER_NOT_ON_CONTENT_NETWORK AdGroupErrorEnum_AdGroupError = 5
+	// Bid amount is too big.
+	AdGroupErrorEnum_BID_TOO_BIG AdGroupErrorEnum_AdGroupError = 6
+	// AdGroup bid does not match the campaign's bidding strategy.
+	AdGroupErrorEnum_BID_TYPE_AND_BIDDING_STRATEGY_MISMATCH AdGroupErrorEnum_AdGroupError = 7
+	// AdGroup name is required for Add.
+	AdGroupErrorEnum_MISSING_ADGROUP_NAME AdGroupErrorEnum_AdGroupError = 8
+	// No link found between the ad group and the label.
+	AdGroupErrorEnum_ADGROUP_LABEL_DOES_NOT_EXIST AdGroupErrorEnum_AdGroupError = 9
+	// The label has already been attached to the ad group.
+	AdGroupErrorEnum_ADGROUP_LABEL_ALREADY_EXISTS AdGroupErrorEnum_AdGroupError = 10
+	// The CriterionTypeGroup is not supported for the content bid dimension.
+	AdGroupErrorEnum_INVALID_CONTENT_BID_CRITERION_TYPE_GROUP AdGroupErrorEnum_AdGroupError = 11
+	// The ad group type is not compatible with the campaign channel type.
+	AdGroupErrorEnum_AD_GROUP_TYPE_NOT_VALID_FOR_ADVERTISING_CHANNEL_TYPE AdGroupErrorEnum_AdGroupError = 12
+	// The ad group type is not supported in the country of sale of the
+	// campaign.
+	AdGroupErrorEnum_ADGROUP_TYPE_NOT_SUPPORTED_FOR_CAMPAIGN_SALES_COUNTRY AdGroupErrorEnum_AdGroupError = 13
+	// Ad groups of AdGroupType.SEARCH_DYNAMIC_ADS can only be added to
+	// campaigns that have DynamicSearchAdsSetting attached.
+	AdGroupErrorEnum_CANNOT_ADD_ADGROUP_OF_TYPE_DSA_TO_CAMPAIGN_WITHOUT_DSA_SETTING AdGroupErrorEnum_AdGroupError = 14
+)
+
+var AdGroupErrorEnum_AdGroupError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "DUPLICATE_ADGROUP_NAME",
+	3:  "INVALID_ADGROUP_NAME",
+	5:  "ADVERTISER_NOT_ON_CONTENT_NETWORK",
+	6:  "BID_TOO_BIG",
+	7:  "BID_TYPE_AND_BIDDING_STRATEGY_MISMATCH",
+	8:  "MISSING_ADGROUP_NAME",
+	9:  "ADGROUP_LABEL_DOES_NOT_EXIST",
+	10: "ADGROUP_LABEL_ALREADY_EXISTS",
+	11: "INVALID_CONTENT_BID_CRITERION_TYPE_GROUP",
+	12: "AD_GROUP_TYPE_NOT_VALID_FOR_ADVERTISING_CHANNEL_TYPE",
+	13: "ADGROUP_TYPE_NOT_SUPPORTED_FOR_CAMPAIGN_SALES_COUNTRY",
+	14: "CANNOT_ADD_ADGROUP_OF_TYPE_DSA_TO_CAMPAIGN_WITHOUT_DSA_SETTING",
+}
+
+var AdGroupErrorEnum_AdGroupError_value = map[string]int32{
+	"UNSPECIFIED":                                                    0,
+	"UNKNOWN":                                                        1,
+	"DUPLICATE_ADGROUP_NAME":                                         2,
+	"INVALID_ADGROUP_NAME":                                           3,
+	"ADVERTISER_NOT_ON_CONTENT_NETWORK":                              5,
+	"BID_TOO_BIG":                                                    6,
+	"BID_TYPE_AND_BIDDING_STRATEGY_MISMATCH":                         7,
+	"MISSING_ADGROUP_NAME":                                           8,
+	"ADGROUP_LABEL_DOES_NOT_EXIST":                                   9,
+	"ADGROUP_LABEL_ALREADY_EXISTS":                                   10,
+	"INVALID_CONTENT_BID_CRITERION_TYPE_GROUP":                       11,
+	"AD_GROUP_TYPE_NOT_VALID_FOR_ADVERTISING_CHANNEL_TYPE":           12,
+	"ADGROUP_TYPE_NOT_SUPPORTED_FOR_CAMPAIGN_SALES_COUNTRY":          13,
+	"CANNOT_ADD_ADGROUP_OF_TYPE_DSA_TO_CAMPAIGN_WITHOUT_DSA_SETTING": 14,
+}
+
+func (x AdGroupErrorEnum_AdGroupError) String() string {
+	return proto.EnumName(AdGroupErrorEnum_AdGroupError_name, int32(x))
+}
+
+func (AdGroupErrorEnum_AdGroupError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e609153f44ae1ab8, []int{0, 0}
+}
+
+// Container for enum describing possible ad group errors.
+type AdGroupErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupErrorEnum) Reset()         { *m = AdGroupErrorEnum{} }
+func (m *AdGroupErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupErrorEnum) ProtoMessage()    {}
+func (*AdGroupErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e609153f44ae1ab8, []int{0}
+}
+
+func (m *AdGroupErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupErrorEnum.Unmarshal(m, b)
+}
+func (m *AdGroupErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupErrorEnum.Merge(m, src)
+}
+func (m *AdGroupErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupErrorEnum.Size(m)
+}
+func (m *AdGroupErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdGroupErrorEnum_AdGroupError", AdGroupErrorEnum_AdGroupError_name, AdGroupErrorEnum_AdGroupError_value)
+	proto.RegisterType((*AdGroupErrorEnum)(nil), "google.ads.googleads.v3.errors.AdGroupErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/ad_group_error.proto", fileDescriptor_e609153f44ae1ab8)
+}
+
+var fileDescriptor_e609153f44ae1ab8 = []byte{
+	// 553 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xd1, 0x6a, 0xd4, 0x40,
+	0x14, 0x86, 0xed, 0xb6, 0xb6, 0x3a, 0xad, 0x3a, 0x0e, 0x22, 0x52, 0x4a, 0xd1, 0x05, 0x45, 0x44,
+	0xb2, 0x17, 0x51, 0xd0, 0x08, 0xc2, 0x49, 0x66, 0x9a, 0x0e, 0xcd, 0xce, 0x84, 0xcc, 0x64, 0xeb,
+	0xca, 0xc2, 0xb0, 0x9a, 0x12, 0x0a, 0x6d, 0xb2, 0x24, 0x6d, 0x5f, 0xc2, 0x97, 0x10, 0x2f, 0x7d,
+	0x14, 0x1f, 0x45, 0x7c, 0x08, 0x99, 0x8c, 0xd9, 0xb6, 0x88, 0x5e, 0xe5, 0xcc, 0x99, 0xef, 0x3f,
+	0xe7, 0x4f, 0xf2, 0x23, 0xbf, 0xac, 0xeb, 0xf2, 0xe4, 0x68, 0x34, 0x2f, 0xda, 0x91, 0x2b, 0x6d,
+	0x75, 0xe1, 0x8f, 0x8e, 0x9a, 0xa6, 0x6e, 0xda, 0xd1, 0xbc, 0x30, 0x65, 0x53, 0x9f, 0x2f, 0x4c,
+	0x77, 0xf6, 0x16, 0x4d, 0x7d, 0x56, 0x93, 0x5d, 0x47, 0x7a, 0xf3, 0xa2, 0xf5, 0x96, 0x22, 0xef,
+	0xc2, 0xf7, 0x9c, 0x68, 0x7b, 0xa7, 0x1f, 0xba, 0x38, 0x1e, 0xcd, 0xab, 0xaa, 0x3e, 0x9b, 0x9f,
+	0x1d, 0xd7, 0x55, 0xeb, 0xd4, 0xc3, 0xaf, 0x6b, 0x08, 0x43, 0x11, 0xdb, 0xa9, 0xcc, 0xf2, 0xac,
+	0x3a, 0x3f, 0x1d, 0x7e, 0x59, 0x43, 0x5b, 0x57, 0x9b, 0xe4, 0x1e, 0xda, 0xcc, 0x85, 0x4a, 0x59,
+	0xc4, 0xf7, 0x38, 0xa3, 0xf8, 0x06, 0xd9, 0x44, 0x1b, 0xb9, 0x38, 0x10, 0xf2, 0x50, 0xe0, 0x15,
+	0xb2, 0x8d, 0x1e, 0xd2, 0x3c, 0x4d, 0x78, 0x04, 0x9a, 0x19, 0xa0, 0x71, 0x26, 0xf3, 0xd4, 0x08,
+	0x18, 0x33, 0x3c, 0x20, 0x8f, 0xd0, 0x03, 0x2e, 0x26, 0x90, 0x70, 0x7a, 0xfd, 0x66, 0x95, 0x3c,
+	0x45, 0x4f, 0x80, 0x4e, 0x58, 0xa6, 0xb9, 0x62, 0x99, 0x11, 0x52, 0x1b, 0x29, 0x4c, 0x24, 0x85,
+	0x66, 0x42, 0x1b, 0xc1, 0xf4, 0xa1, 0xcc, 0x0e, 0xf0, 0x4d, 0xbb, 0x3a, 0xe4, 0xd4, 0x68, 0x29,
+	0x4d, 0xc8, 0x63, 0xbc, 0x4e, 0x5e, 0xa0, 0x67, 0x5d, 0x63, 0x9a, 0x32, 0x03, 0x82, 0x9a, 0x90,
+	0x53, 0xca, 0x45, 0x6c, 0x94, 0xce, 0x40, 0xb3, 0x78, 0x6a, 0xc6, 0x5c, 0x8d, 0x41, 0x47, 0xfb,
+	0x78, 0xc3, 0x6e, 0x1f, 0x73, 0xa5, 0xec, 0xf5, 0xb5, 0xed, 0xb7, 0xc8, 0x63, 0xb4, 0xd3, 0x77,
+	0x12, 0x08, 0x59, 0x62, 0xa8, 0x64, 0xaa, 0x73, 0xc1, 0x3e, 0x70, 0xa5, 0xf1, 0xed, 0xbf, 0x09,
+	0x48, 0x32, 0x06, 0x74, 0xea, 0x00, 0x85, 0x11, 0x79, 0x89, 0x9e, 0xf7, 0xef, 0xd6, 0xfb, 0xb6,
+	0xce, 0xa2, 0x8c, 0x6b, 0x96, 0x71, 0x29, 0x9c, 0xc7, 0x6e, 0x04, 0xde, 0x24, 0x6f, 0xd0, 0x2b,
+	0xa0, 0xee, 0xe4, 0x2e, 0xec, 0x32, 0xa7, 0xde, 0x93, 0x99, 0xe9, 0xbf, 0x85, 0xf5, 0x1a, 0xed,
+	0x83, 0x10, 0x2c, 0xe9, 0x30, 0xbc, 0x45, 0xde, 0xa2, 0xd7, 0xbd, 0x93, 0xa5, 0x50, 0xe5, 0x69,
+	0x2a, 0x33, 0xcd, 0x9c, 0x38, 0x82, 0x71, 0x0a, 0x3c, 0x16, 0x46, 0x41, 0xc2, 0x94, 0x89, 0x64,
+	0x2e, 0x74, 0x36, 0xc5, 0x77, 0x48, 0x88, 0xde, 0x47, 0x20, 0xac, 0x00, 0xe8, 0xe5, 0x1f, 0x90,
+	0x7b, 0x6e, 0x10, 0x55, 0x60, 0xb4, 0xbc, 0x54, 0x1f, 0x72, 0xbd, 0x2f, 0x73, 0xdd, 0xf5, 0x15,
+	0xd3, 0x9a, 0x8b, 0x18, 0xdf, 0x0d, 0x7f, 0xad, 0xa0, 0xe1, 0xe7, 0xfa, 0xd4, 0xfb, 0x7f, 0xce,
+	0xc2, 0xfb, 0x57, 0x13, 0x93, 0xda, 0x70, 0xa5, 0x2b, 0x1f, 0xe9, 0x1f, 0x51, 0x59, 0x9f, 0xcc,
+	0xab, 0xd2, 0xab, 0x9b, 0x72, 0x54, 0x1e, 0x55, 0x5d, 0xf4, 0xfa, 0x84, 0x2f, 0x8e, 0xdb, 0x7f,
+	0x05, 0xfe, 0x9d, 0x7b, 0x7c, 0x1b, 0xac, 0xc6, 0x00, 0xdf, 0x07, 0xbb, 0xb1, 0x1b, 0x06, 0x45,
+	0xeb, 0xb9, 0xd2, 0x56, 0x13, 0xdf, 0xeb, 0x56, 0xb6, 0x3f, 0x7a, 0x60, 0x06, 0x45, 0x3b, 0x5b,
+	0x02, 0xb3, 0x89, 0x3f, 0x73, 0xc0, 0xcf, 0xc1, 0xd0, 0x75, 0x83, 0x00, 0x8a, 0x36, 0x08, 0x96,
+	0x48, 0x10, 0x4c, 0xfc, 0x20, 0x70, 0xd0, 0xa7, 0xf5, 0xce, 0x9d, 0xff, 0x3b, 0x00, 0x00, 0xff,
+	0xff, 0xf3, 0x1a, 0x86, 0xaa, 0x8d, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/ad_group_feed_error.pb.go b/googleapis/ads/googleads/v3/errors/ad_group_feed_error.pb.go
new file mode 100644
index 0000000..02666f3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/ad_group_feed_error.pb.go
@@ -0,0 +1,154 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/ad_group_feed_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ad group feed errors.
+type AdGroupFeedErrorEnum_AdGroupFeedError int32
+
+const (
+	// Enum unspecified.
+	AdGroupFeedErrorEnum_UNSPECIFIED AdGroupFeedErrorEnum_AdGroupFeedError = 0
+	// The received error code is not known in this version.
+	AdGroupFeedErrorEnum_UNKNOWN AdGroupFeedErrorEnum_AdGroupFeedError = 1
+	// An active feed already exists for this ad group and place holder type.
+	AdGroupFeedErrorEnum_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE AdGroupFeedErrorEnum_AdGroupFeedError = 2
+	// The specified feed is removed.
+	AdGroupFeedErrorEnum_CANNOT_CREATE_FOR_REMOVED_FEED AdGroupFeedErrorEnum_AdGroupFeedError = 3
+	// The AdGroupFeed already exists. UPDATE operation should be used to modify
+	// the existing AdGroupFeed.
+	AdGroupFeedErrorEnum_ADGROUP_FEED_ALREADY_EXISTS AdGroupFeedErrorEnum_AdGroupFeedError = 4
+	// Cannot operate on removed AdGroupFeed.
+	AdGroupFeedErrorEnum_CANNOT_OPERATE_ON_REMOVED_ADGROUP_FEED AdGroupFeedErrorEnum_AdGroupFeedError = 5
+	// Invalid placeholder type.
+	AdGroupFeedErrorEnum_INVALID_PLACEHOLDER_TYPE AdGroupFeedErrorEnum_AdGroupFeedError = 6
+	// Feed mapping for this placeholder type does not exist.
+	AdGroupFeedErrorEnum_MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE AdGroupFeedErrorEnum_AdGroupFeedError = 7
+	// Location AdGroupFeeds cannot be created unless there is a location
+	// CustomerFeed for the specified feed.
+	AdGroupFeedErrorEnum_NO_EXISTING_LOCATION_CUSTOMER_FEED AdGroupFeedErrorEnum_AdGroupFeedError = 8
+)
+
+var AdGroupFeedErrorEnum_AdGroupFeedError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE",
+	3: "CANNOT_CREATE_FOR_REMOVED_FEED",
+	4: "ADGROUP_FEED_ALREADY_EXISTS",
+	5: "CANNOT_OPERATE_ON_REMOVED_ADGROUP_FEED",
+	6: "INVALID_PLACEHOLDER_TYPE",
+	7: "MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE",
+	8: "NO_EXISTING_LOCATION_CUSTOMER_FEED",
+}
+
+var AdGroupFeedErrorEnum_AdGroupFeedError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE": 2,
+	"CANNOT_CREATE_FOR_REMOVED_FEED":           3,
+	"ADGROUP_FEED_ALREADY_EXISTS":              4,
+	"CANNOT_OPERATE_ON_REMOVED_ADGROUP_FEED":   5,
+	"INVALID_PLACEHOLDER_TYPE":                 6,
+	"MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE": 7,
+	"NO_EXISTING_LOCATION_CUSTOMER_FEED":       8,
+}
+
+func (x AdGroupFeedErrorEnum_AdGroupFeedError) String() string {
+	return proto.EnumName(AdGroupFeedErrorEnum_AdGroupFeedError_name, int32(x))
+}
+
+func (AdGroupFeedErrorEnum_AdGroupFeedError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d50cd165cb21e840, []int{0, 0}
+}
+
+// Container for enum describing possible ad group feed errors.
+type AdGroupFeedErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupFeedErrorEnum) Reset()         { *m = AdGroupFeedErrorEnum{} }
+func (m *AdGroupFeedErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdGroupFeedErrorEnum) ProtoMessage()    {}
+func (*AdGroupFeedErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d50cd165cb21e840, []int{0}
+}
+
+func (m *AdGroupFeedErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupFeedErrorEnum.Unmarshal(m, b)
+}
+func (m *AdGroupFeedErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupFeedErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdGroupFeedErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupFeedErrorEnum.Merge(m, src)
+}
+func (m *AdGroupFeedErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdGroupFeedErrorEnum.Size(m)
+}
+func (m *AdGroupFeedErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupFeedErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupFeedErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdGroupFeedErrorEnum_AdGroupFeedError", AdGroupFeedErrorEnum_AdGroupFeedError_name, AdGroupFeedErrorEnum_AdGroupFeedError_value)
+	proto.RegisterType((*AdGroupFeedErrorEnum)(nil), "google.ads.googleads.v3.errors.AdGroupFeedErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/ad_group_feed_error.proto", fileDescriptor_d50cd165cb21e840)
+}
+
+var fileDescriptor_d50cd165cb21e840 = []byte{
+	// 444 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xc1, 0x8a, 0xd4, 0x30,
+	0x1c, 0xc6, 0x9d, 0xae, 0xee, 0x4a, 0xf6, 0x60, 0x29, 0x0a, 0xa2, 0xcb, 0x08, 0x3d, 0x2c, 0x22,
+	0x92, 0x1e, 0x7a, 0x91, 0x7a, 0xca, 0xb6, 0xff, 0xa9, 0xc5, 0x4e, 0x12, 0xda, 0x4e, 0x75, 0x65,
+	0x20, 0x54, 0x53, 0xcb, 0xc0, 0x6e, 0x33, 0x34, 0xb3, 0xfb, 0x40, 0x1e, 0x7d, 0x0d, 0x6f, 0x3e,
+	0x83, 0x4f, 0xe0, 0xc9, 0x47, 0x90, 0x34, 0x3b, 0x83, 0xac, 0xa3, 0xa7, 0x7e, 0xa4, 0xbf, 0xef,
+	0xcb, 0x47, 0xfe, 0x7f, 0xf4, 0xaa, 0x53, 0xaa, 0xbb, 0x68, 0x83, 0x46, 0xea, 0xc0, 0x4a, 0xa3,
+	0xae, 0xc3, 0xa0, 0x1d, 0x06, 0x35, 0xe8, 0xa0, 0x91, 0xa2, 0x1b, 0xd4, 0xd5, 0x5a, 0x7c, 0x6e,
+	0x5b, 0x29, 0xc6, 0x43, 0xbc, 0x1e, 0xd4, 0x46, 0x79, 0x53, 0x8b, 0xe3, 0x46, 0x6a, 0xbc, 0x73,
+	0xe2, 0xeb, 0x10, 0x5b, 0xe7, 0x93, 0x93, 0x6d, 0xf2, 0x7a, 0x15, 0x34, 0x7d, 0xaf, 0x36, 0xcd,
+	0x66, 0xa5, 0x7a, 0x6d, 0xdd, 0xfe, 0x0f, 0x07, 0x3d, 0x24, 0x32, 0x35, 0xd1, 0xb3, 0xb6, 0x95,
+	0x60, 0x3c, 0xd0, 0x5f, 0x5d, 0xfa, 0xdf, 0x1c, 0xe4, 0xde, 0xfe, 0xe1, 0x3d, 0x40, 0xc7, 0x0b,
+	0x5a, 0x72, 0x88, 0xb3, 0x59, 0x06, 0x89, 0x7b, 0xc7, 0x3b, 0x46, 0x47, 0x0b, 0xfa, 0x96, 0xb2,
+	0x77, 0xd4, 0x9d, 0x78, 0x2f, 0xd1, 0xf3, 0x19, 0x40, 0x22, 0x48, 0x5e, 0x00, 0x49, 0xce, 0x05,
+	0xbc, 0xcf, 0xca, 0xaa, 0x14, 0x33, 0x56, 0x08, 0x9e, 0x93, 0x18, 0xde, 0xb0, 0x3c, 0x81, 0x42,
+	0x54, 0xe7, 0x1c, 0x5c, 0xc7, 0xf3, 0xd1, 0x34, 0x26, 0x94, 0xb2, 0x4a, 0xc4, 0x05, 0x90, 0x0a,
+	0x46, 0xae, 0x80, 0x39, 0xab, 0x21, 0x11, 0x26, 0xc7, 0x3d, 0xf0, 0x9e, 0xa1, 0xa7, 0x24, 0x49,
+	0x0b, 0xb6, 0xe0, 0x62, 0x4f, 0xb2, 0x7b, 0xd7, 0x7b, 0x81, 0x4e, 0x6f, 0x42, 0x18, 0x87, 0xc2,
+	0xa4, 0x30, 0xba, 0x0b, 0xf9, 0xd3, 0xea, 0xde, 0xf3, 0x4e, 0xd0, 0xe3, 0x8c, 0xd6, 0x24, 0xcf,
+	0x92, 0xbf, 0xeb, 0x1c, 0x9a, 0xf2, 0xf3, 0xac, 0x2c, 0x33, 0x9a, 0x8e, 0xfc, 0x9c, 0x70, 0x3e,
+	0xea, 0x7d, 0xe5, 0x8f, 0xbc, 0x53, 0xe4, 0x53, 0x66, 0x6b, 0x18, 0x2a, 0x67, 0x31, 0xa9, 0x32,
+	0x46, 0x45, 0xbc, 0x28, 0x2b, 0x36, 0x87, 0xc2, 0xde, 0x79, 0xff, 0xec, 0xd7, 0x04, 0xf9, 0x9f,
+	0xd4, 0x25, 0xfe, 0xff, 0x8c, 0xce, 0x1e, 0xdd, 0x7e, 0x69, 0x6e, 0x86, 0xc3, 0x27, 0x1f, 0x92,
+	0x1b, 0x63, 0xa7, 0x2e, 0x9a, 0xbe, 0xc3, 0x6a, 0xe8, 0x82, 0xae, 0xed, 0xc7, 0xd1, 0x6d, 0xd7,
+	0x64, 0xbd, 0xd2, 0xff, 0xda, 0x9a, 0xd7, 0xf6, 0xf3, 0xc5, 0x39, 0x48, 0x09, 0xf9, 0xea, 0x4c,
+	0x53, 0x1b, 0x46, 0xa4, 0xc6, 0x56, 0x1a, 0x55, 0x87, 0x78, 0xbc, 0x52, 0x7f, 0xdf, 0x02, 0x4b,
+	0x22, 0xf5, 0x72, 0x07, 0x2c, 0xeb, 0x70, 0x69, 0x81, 0x9f, 0x8e, 0x6f, 0x4f, 0xa3, 0x88, 0x48,
+	0x1d, 0x45, 0x3b, 0x24, 0x8a, 0xea, 0x30, 0x8a, 0x2c, 0xf4, 0xf1, 0x70, 0x6c, 0x17, 0xfe, 0x0e,
+	0x00, 0x00, 0xff, 0xff, 0x64, 0x34, 0x18, 0x57, 0xd2, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/ad_parameter_error.pb.go b/googleapis/ads/googleads/v3/errors/ad_parameter_error.pb.go
new file mode 100644
index 0000000..65f3b76
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/ad_parameter_error.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/ad_parameter_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ad parameter errors.
+type AdParameterErrorEnum_AdParameterError int32
+
+const (
+	// Enum unspecified.
+	AdParameterErrorEnum_UNSPECIFIED AdParameterErrorEnum_AdParameterError = 0
+	// The received error code is not known in this version.
+	AdParameterErrorEnum_UNKNOWN AdParameterErrorEnum_AdParameterError = 1
+	// The ad group criterion must be a keyword criterion.
+	AdParameterErrorEnum_AD_GROUP_CRITERION_MUST_BE_KEYWORD AdParameterErrorEnum_AdParameterError = 2
+	// The insertion text is invalid.
+	AdParameterErrorEnum_INVALID_INSERTION_TEXT_FORMAT AdParameterErrorEnum_AdParameterError = 3
+)
+
+var AdParameterErrorEnum_AdParameterError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AD_GROUP_CRITERION_MUST_BE_KEYWORD",
+	3: "INVALID_INSERTION_TEXT_FORMAT",
+}
+
+var AdParameterErrorEnum_AdParameterError_value = map[string]int32{
+	"UNSPECIFIED":                        0,
+	"UNKNOWN":                            1,
+	"AD_GROUP_CRITERION_MUST_BE_KEYWORD": 2,
+	"INVALID_INSERTION_TEXT_FORMAT":      3,
+}
+
+func (x AdParameterErrorEnum_AdParameterError) String() string {
+	return proto.EnumName(AdParameterErrorEnum_AdParameterError_name, int32(x))
+}
+
+func (AdParameterErrorEnum_AdParameterError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_cdb54cc8afb74021, []int{0, 0}
+}
+
+// Container for enum describing possible ad parameter errors.
+type AdParameterErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdParameterErrorEnum) Reset()         { *m = AdParameterErrorEnum{} }
+func (m *AdParameterErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdParameterErrorEnum) ProtoMessage()    {}
+func (*AdParameterErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_cdb54cc8afb74021, []int{0}
+}
+
+func (m *AdParameterErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdParameterErrorEnum.Unmarshal(m, b)
+}
+func (m *AdParameterErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdParameterErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdParameterErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdParameterErrorEnum.Merge(m, src)
+}
+func (m *AdParameterErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdParameterErrorEnum.Size(m)
+}
+func (m *AdParameterErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdParameterErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdParameterErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdParameterErrorEnum_AdParameterError", AdParameterErrorEnum_AdParameterError_name, AdParameterErrorEnum_AdParameterError_value)
+	proto.RegisterType((*AdParameterErrorEnum)(nil), "google.ads.googleads.v3.errors.AdParameterErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/ad_parameter_error.proto", fileDescriptor_cdb54cc8afb74021)
+}
+
+var fileDescriptor_cdb54cc8afb74021 = []byte{
+	// 348 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xf3, 0x40,
+	0x14, 0x85, 0xff, 0xa4, 0xf0, 0x0b, 0xd3, 0x85, 0x21, 0xe8, 0x46, 0xb4, 0x60, 0x16, 0x2e, 0x27,
+	0x8b, 0x2c, 0x84, 0x71, 0x35, 0x6d, 0xa6, 0x25, 0xd4, 0x26, 0x21, 0x4d, 0x52, 0x95, 0xc0, 0x30,
+	0x9a, 0x10, 0x0a, 0x6d, 0x26, 0xcc, 0xc4, 0x6e, 0x7c, 0x0c, 0xdf, 0xc0, 0xa5, 0x8f, 0xe2, 0xa3,
+	0xb8, 0xf2, 0x11, 0x24, 0x19, 0xd3, 0x45, 0x41, 0x57, 0x73, 0xb8, 0x7c, 0xe7, 0xcc, 0x3d, 0x17,
+	0x5c, 0x97, 0x9c, 0x97, 0x9b, 0xc2, 0x66, 0xb9, 0xb4, 0x95, 0x6c, 0xd5, 0xce, 0xb1, 0x0b, 0x21,
+	0xb8, 0x90, 0x36, 0xcb, 0x69, 0xcd, 0x04, 0xdb, 0x16, 0x4d, 0x21, 0x68, 0x37, 0x83, 0xb5, 0xe0,
+	0x0d, 0x37, 0x47, 0x8a, 0x86, 0x2c, 0x97, 0x70, 0x6f, 0x84, 0x3b, 0x07, 0x2a, 0xe3, 0xd9, 0x79,
+	0x1f, 0x5c, 0xaf, 0x6d, 0x56, 0x55, 0xbc, 0x61, 0xcd, 0x9a, 0x57, 0x52, 0xb9, 0xad, 0x57, 0x0d,
+	0x9c, 0xe0, 0x3c, 0xec, 0x93, 0x49, 0xeb, 0x21, 0xd5, 0xf3, 0xd6, 0x7a, 0x01, 0xc6, 0xe1, 0xdc,
+	0x3c, 0x06, 0xc3, 0xc4, 0x5f, 0x86, 0x64, 0xe2, 0x4d, 0x3d, 0xe2, 0x1a, 0xff, 0xcc, 0x21, 0x38,
+	0x4a, 0xfc, 0xb9, 0x1f, 0xac, 0x7c, 0x43, 0x33, 0xaf, 0x80, 0x85, 0x5d, 0x3a, 0x8b, 0x82, 0x24,
+	0xa4, 0x93, 0xc8, 0x8b, 0x49, 0xe4, 0x05, 0x3e, 0x5d, 0x24, 0xcb, 0x98, 0x8e, 0x09, 0x9d, 0x93,
+	0xfb, 0x55, 0x10, 0xb9, 0x86, 0x6e, 0x5e, 0x82, 0x0b, 0xcf, 0x4f, 0xf1, 0xad, 0xe7, 0x52, 0xcf,
+	0x5f, 0x92, 0x28, 0x6e, 0xb1, 0x98, 0xdc, 0xc5, 0x74, 0x1a, 0x44, 0x0b, 0x1c, 0x1b, 0x83, 0xf1,
+	0x97, 0x06, 0xac, 0x27, 0xbe, 0x85, 0x7f, 0x57, 0x1b, 0x9f, 0x1e, 0x6e, 0x18, 0xb6, 0x9d, 0x42,
+	0xed, 0xc1, 0xfd, 0x31, 0x96, 0x7c, 0xc3, 0xaa, 0x12, 0x72, 0x51, 0xda, 0x65, 0x51, 0x75, 0x8d,
+	0xfb, 0xe3, 0xd6, 0x6b, 0xf9, 0xdb, 0xad, 0x6f, 0xd4, 0xf3, 0xa6, 0x0f, 0x66, 0x18, 0xbf, 0xeb,
+	0xa3, 0x99, 0x0a, 0xc3, 0xb9, 0x84, 0x4a, 0xb6, 0x2a, 0x75, 0x60, 0xf7, 0xa5, 0xfc, 0xe8, 0x81,
+	0x0c, 0xe7, 0x32, 0xdb, 0x03, 0x59, 0xea, 0x64, 0x0a, 0xf8, 0xd4, 0x2d, 0x35, 0x45, 0x08, 0xe7,
+	0x12, 0xa1, 0x3d, 0x82, 0x50, 0xea, 0x20, 0xa4, 0xa0, 0xc7, 0xff, 0xdd, 0x76, 0xce, 0x77, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0x3f, 0x4a, 0xd8, 0x47, 0x08, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/ad_sharing_error.pb.go b/googleapis/ads/googleads/v3/errors/ad_sharing_error.pb.go
new file mode 100644
index 0000000..0cfd1e7
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/ad_sharing_error.pb.go
@@ -0,0 +1,132 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/ad_sharing_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ad sharing errors.
+type AdSharingErrorEnum_AdSharingError int32
+
+const (
+	// Enum unspecified.
+	AdSharingErrorEnum_UNSPECIFIED AdSharingErrorEnum_AdSharingError = 0
+	// The received error code is not known in this version.
+	AdSharingErrorEnum_UNKNOWN AdSharingErrorEnum_AdSharingError = 1
+	// Error resulting in attempting to add an Ad to an AdGroup that already
+	// contains the Ad.
+	AdSharingErrorEnum_AD_GROUP_ALREADY_CONTAINS_AD AdSharingErrorEnum_AdSharingError = 2
+	// Ad is not compatible with the AdGroup it is being shared with.
+	AdSharingErrorEnum_INCOMPATIBLE_AD_UNDER_AD_GROUP AdSharingErrorEnum_AdSharingError = 3
+	// Cannot add AdGroupAd on inactive Ad.
+	AdSharingErrorEnum_CANNOT_SHARE_INACTIVE_AD AdSharingErrorEnum_AdSharingError = 4
+)
+
+var AdSharingErrorEnum_AdSharingError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "AD_GROUP_ALREADY_CONTAINS_AD",
+	3: "INCOMPATIBLE_AD_UNDER_AD_GROUP",
+	4: "CANNOT_SHARE_INACTIVE_AD",
+}
+
+var AdSharingErrorEnum_AdSharingError_value = map[string]int32{
+	"UNSPECIFIED":                    0,
+	"UNKNOWN":                        1,
+	"AD_GROUP_ALREADY_CONTAINS_AD":   2,
+	"INCOMPATIBLE_AD_UNDER_AD_GROUP": 3,
+	"CANNOT_SHARE_INACTIVE_AD":       4,
+}
+
+func (x AdSharingErrorEnum_AdSharingError) String() string {
+	return proto.EnumName(AdSharingErrorEnum_AdSharingError_name, int32(x))
+}
+
+func (AdSharingErrorEnum_AdSharingError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_4892a55c96781176, []int{0, 0}
+}
+
+// Container for enum describing possible ad sharing errors.
+type AdSharingErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdSharingErrorEnum) Reset()         { *m = AdSharingErrorEnum{} }
+func (m *AdSharingErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdSharingErrorEnum) ProtoMessage()    {}
+func (*AdSharingErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4892a55c96781176, []int{0}
+}
+
+func (m *AdSharingErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdSharingErrorEnum.Unmarshal(m, b)
+}
+func (m *AdSharingErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdSharingErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdSharingErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdSharingErrorEnum.Merge(m, src)
+}
+func (m *AdSharingErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdSharingErrorEnum.Size(m)
+}
+func (m *AdSharingErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdSharingErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdSharingErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdSharingErrorEnum_AdSharingError", AdSharingErrorEnum_AdSharingError_name, AdSharingErrorEnum_AdSharingError_value)
+	proto.RegisterType((*AdSharingErrorEnum)(nil), "google.ads.googleads.v3.errors.AdSharingErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/ad_sharing_error.proto", fileDescriptor_4892a55c96781176)
+}
+
+var fileDescriptor_4892a55c96781176 = []byte{
+	// 360 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xcf, 0x4a, 0xeb, 0x40,
+	0x14, 0x87, 0x6f, 0xd2, 0xcb, 0xbd, 0x30, 0x85, 0x7b, 0x43, 0xee, 0xe6, 0x22, 0xa5, 0x48, 0x1e,
+	0x60, 0xb2, 0x08, 0x6e, 0xc6, 0xd5, 0x69, 0x32, 0xd6, 0x60, 0x9d, 0x84, 0xfc, 0x13, 0x25, 0x30,
+	0x44, 0x53, 0x62, 0xa0, 0xcd, 0x94, 0x4c, 0xed, 0x83, 0xf8, 0x08, 0xee, 0xf4, 0x51, 0x7c, 0x14,
+	0x17, 0x3e, 0x83, 0x24, 0x63, 0x0a, 0x5d, 0xe8, 0x6a, 0x7e, 0x1c, 0xbe, 0xef, 0xcc, 0x39, 0x07,
+	0x9d, 0x54, 0x42, 0x54, 0xab, 0xa5, 0x5d, 0x94, 0xd2, 0x56, 0xb1, 0x4b, 0x3b, 0xc7, 0x5e, 0xb6,
+	0xad, 0x68, 0xa5, 0x5d, 0x94, 0x5c, 0xde, 0x17, 0x6d, 0xdd, 0x54, 0xbc, 0xaf, 0xe0, 0x4d, 0x2b,
+	0xb6, 0xc2, 0x9c, 0x2a, 0x16, 0x17, 0xa5, 0xc4, 0x7b, 0x0d, 0xef, 0x1c, 0xac, 0xb4, 0xa3, 0xc9,
+	0xd0, 0x76, 0x53, 0xdb, 0x45, 0xd3, 0x88, 0x6d, 0xb1, 0xad, 0x45, 0x23, 0x95, 0x6d, 0x3d, 0x6b,
+	0xc8, 0x84, 0x32, 0x56, 0x7d, 0x69, 0x67, 0xd0, 0xe6, 0x61, 0x6d, 0x3d, 0x6a, 0xe8, 0xcf, 0x61,
+	0xd9, 0xfc, 0x8b, 0xc6, 0x29, 0x8b, 0x43, 0xea, 0xfa, 0x67, 0x3e, 0xf5, 0x8c, 0x1f, 0xe6, 0x18,
+	0xfd, 0x4e, 0xd9, 0x05, 0x0b, 0xae, 0x98, 0xa1, 0x99, 0xc7, 0x68, 0x02, 0x1e, 0x9f, 0x47, 0x41,
+	0x1a, 0x72, 0x58, 0x44, 0x14, 0xbc, 0x6b, 0xee, 0x06, 0x2c, 0x01, 0x9f, 0xc5, 0x1c, 0x3c, 0x43,
+	0x37, 0x2d, 0x34, 0xf5, 0x99, 0x1b, 0x5c, 0x86, 0x90, 0xf8, 0xb3, 0x05, 0xe5, 0xe0, 0xf1, 0x94,
+	0x79, 0x34, 0xe2, 0x83, 0x67, 0x8c, 0xcc, 0x09, 0xfa, 0xef, 0x02, 0x63, 0x41, 0xc2, 0xe3, 0x73,
+	0x88, 0x28, 0xf7, 0x19, 0xb8, 0x89, 0x9f, 0x75, 0xb0, 0xf1, 0x73, 0xf6, 0xae, 0x21, 0xeb, 0x4e,
+	0xac, 0xf1, 0xf7, 0x0b, 0xcf, 0xfe, 0x1d, 0x0e, 0x1e, 0x76, 0x7b, 0x86, 0xda, 0x8d, 0xf7, 0xa9,
+	0x55, 0x62, 0x55, 0x34, 0x15, 0x16, 0x6d, 0x65, 0x57, 0xcb, 0xa6, 0xbf, 0xc2, 0x70, 0xee, 0x4d,
+	0x2d, 0xbf, 0xba, 0xfe, 0xa9, 0x7a, 0x9e, 0xf4, 0xd1, 0x1c, 0xe0, 0x45, 0x9f, 0xce, 0x55, 0x33,
+	0x28, 0x25, 0x56, 0xb1, 0x4b, 0x99, 0x83, 0xfb, 0x2f, 0xe5, 0xeb, 0x00, 0xe4, 0x50, 0xca, 0x7c,
+	0x0f, 0xe4, 0x99, 0x93, 0x2b, 0xe0, 0x4d, 0xb7, 0x54, 0x95, 0x10, 0x28, 0x25, 0x21, 0x7b, 0x84,
+	0x90, 0xcc, 0x21, 0x44, 0x41, 0xb7, 0xbf, 0xfa, 0xe9, 0x9c, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x04, 0x28, 0xb3, 0x74, 0x1a, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/adx_error.pb.go b/googleapis/ads/googleads/v3/errors/adx_error.pb.go
new file mode 100644
index 0000000..e7c6f84
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/adx_error.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/adx_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible adx errors.
+type AdxErrorEnum_AdxError int32
+
+const (
+	// Enum unspecified.
+	AdxErrorEnum_UNSPECIFIED AdxErrorEnum_AdxError = 0
+	// The received error code is not known in this version.
+	AdxErrorEnum_UNKNOWN AdxErrorEnum_AdxError = 1
+	// Attempt to use non-AdX feature by AdX customer.
+	AdxErrorEnum_UNSUPPORTED_FEATURE AdxErrorEnum_AdxError = 2
+)
+
+var AdxErrorEnum_AdxError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "UNSUPPORTED_FEATURE",
+}
+
+var AdxErrorEnum_AdxError_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"UNSUPPORTED_FEATURE": 2,
+}
+
+func (x AdxErrorEnum_AdxError) String() string {
+	return proto.EnumName(AdxErrorEnum_AdxError_name, int32(x))
+}
+
+func (AdxErrorEnum_AdxError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8c9a39d67b90bc57, []int{0, 0}
+}
+
+// Container for enum describing possible adx errors.
+type AdxErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdxErrorEnum) Reset()         { *m = AdxErrorEnum{} }
+func (m *AdxErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AdxErrorEnum) ProtoMessage()    {}
+func (*AdxErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8c9a39d67b90bc57, []int{0}
+}
+
+func (m *AdxErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdxErrorEnum.Unmarshal(m, b)
+}
+func (m *AdxErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdxErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AdxErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdxErrorEnum.Merge(m, src)
+}
+func (m *AdxErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AdxErrorEnum.Size(m)
+}
+func (m *AdxErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdxErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdxErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AdxErrorEnum_AdxError", AdxErrorEnum_AdxError_name, AdxErrorEnum_AdxError_value)
+	proto.RegisterType((*AdxErrorEnum)(nil), "google.ads.googleads.v3.errors.AdxErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/adx_error.proto", fileDescriptor_8c9a39d67b90bc57)
+}
+
+var fileDescriptor_8c9a39d67b90bc57 = []byte{
+	// 291 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x18, 0xc7, 0x6d, 0x05, 0x95, 0x4c, 0xb1, 0xd4, 0x83, 0x20, 0xb2, 0x43, 0x1f, 0x20, 0x39, 0xe4,
+	0x16, 0x4f, 0x99, 0xcd, 0xc6, 0x10, 0xba, 0xba, 0xad, 0x15, 0xa4, 0x30, 0xa2, 0x29, 0xa1, 0xb0,
+	0x25, 0xa5, 0xa9, 0x63, 0xcf, 0xe3, 0xd1, 0x47, 0xf1, 0x49, 0xc4, 0xa7, 0x90, 0x36, 0xa6, 0x37,
+	0x3d, 0xe5, 0x97, 0x8f, 0xdf, 0xf7, 0x7d, 0x7f, 0x3e, 0x00, 0xa5, 0xd6, 0x72, 0x5b, 0x22, 0x2e,
+	0x0c, 0xb2, 0xd8, 0xd1, 0x1e, 0xa3, 0xb2, 0x69, 0x74, 0x63, 0x10, 0x17, 0x87, 0x4d, 0x8f, 0xb0,
+	0x6e, 0x74, 0xab, 0xc3, 0xb1, 0x95, 0x20, 0x17, 0x06, 0x0e, 0x3e, 0xdc, 0x63, 0x68, 0xfd, 0x9b,
+	0x5b, 0x37, 0xaf, 0xae, 0x10, 0x57, 0x4a, 0xb7, 0xbc, 0xad, 0xb4, 0x32, 0xb6, 0x3b, 0x7a, 0x04,
+	0xe7, 0x54, 0x1c, 0x58, 0xa7, 0x32, 0xf5, 0xb6, 0x8b, 0x28, 0x38, 0x73, 0xff, 0xf0, 0x12, 0x8c,
+	0xb2, 0x64, 0x95, 0xb2, 0xfb, 0xf9, 0x74, 0xce, 0xe2, 0xe0, 0x28, 0x1c, 0x81, 0xd3, 0x2c, 0x79,
+	0x48, 0x16, 0x4f, 0x49, 0xe0, 0x85, 0xd7, 0xe0, 0x2a, 0x4b, 0x56, 0x59, 0x9a, 0x2e, 0x96, 0x6b,
+	0x16, 0x6f, 0xa6, 0x8c, 0xae, 0xb3, 0x25, 0x0b, 0xfc, 0xc9, 0x97, 0x07, 0xa2, 0x57, 0xbd, 0x83,
+	0xff, 0xe7, 0x9a, 0x5c, 0xb8, 0x3d, 0x69, 0x17, 0x24, 0xf5, 0x9e, 0xe3, 0xdf, 0x06, 0xa9, 0xb7,
+	0x5c, 0x49, 0xa8, 0x1b, 0x89, 0x64, 0xa9, 0xfa, 0x98, 0xee, 0x10, 0x75, 0x65, 0xfe, 0xba, 0xcb,
+	0x9d, 0x7d, 0xde, 0xfd, 0xe3, 0x19, 0xa5, 0x1f, 0xfe, 0x78, 0x66, 0x87, 0x51, 0x61, 0xa0, 0xc5,
+	0x8e, 0x72, 0x0c, 0xfb, 0x95, 0xe6, 0xd3, 0x09, 0x05, 0x15, 0xa6, 0x18, 0x84, 0x22, 0xc7, 0x85,
+	0x15, 0xbe, 0xfd, 0xc8, 0x56, 0x09, 0xa1, 0xc2, 0x10, 0x32, 0x28, 0x84, 0xe4, 0x98, 0x10, 0x2b,
+	0xbd, 0x9c, 0xf4, 0xe9, 0xf0, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xae, 0x7e, 0x51, 0x7c, 0xb4,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/asset_error.pb.go b/googleapis/ads/googleads/v3/errors/asset_error.pb.go
new file mode 100644
index 0000000..ec11d82
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/asset_error.pb.go
@@ -0,0 +1,142 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/asset_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible asset errors.
+type AssetErrorEnum_AssetError int32
+
+const (
+	// Enum unspecified.
+	AssetErrorEnum_UNSPECIFIED AssetErrorEnum_AssetError = 0
+	// The received error code is not known in this version.
+	AssetErrorEnum_UNKNOWN AssetErrorEnum_AssetError = 1
+	// The customer is not whitelisted for this asset type.
+	AssetErrorEnum_CUSTOMER_NOT_WHITELISTED_FOR_ASSET_TYPE AssetErrorEnum_AssetError = 2
+	// Assets are duplicated across operations.
+	AssetErrorEnum_DUPLICATE_ASSET AssetErrorEnum_AssetError = 3
+	// The asset name is duplicated, either across operations or with an
+	// existing asset.
+	AssetErrorEnum_DUPLICATE_ASSET_NAME AssetErrorEnum_AssetError = 4
+	// The Asset.asset_data oneof is empty.
+	AssetErrorEnum_ASSET_DATA_IS_MISSING AssetErrorEnum_AssetError = 5
+	// The asset has a name which is different from an existing duplicate that
+	// represents the same content.
+	AssetErrorEnum_CANNOT_MODIFY_ASSET_NAME AssetErrorEnum_AssetError = 6
+)
+
+var AssetErrorEnum_AssetError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CUSTOMER_NOT_WHITELISTED_FOR_ASSET_TYPE",
+	3: "DUPLICATE_ASSET",
+	4: "DUPLICATE_ASSET_NAME",
+	5: "ASSET_DATA_IS_MISSING",
+	6: "CANNOT_MODIFY_ASSET_NAME",
+}
+
+var AssetErrorEnum_AssetError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CUSTOMER_NOT_WHITELISTED_FOR_ASSET_TYPE": 2,
+	"DUPLICATE_ASSET":                         3,
+	"DUPLICATE_ASSET_NAME":                    4,
+	"ASSET_DATA_IS_MISSING":                   5,
+	"CANNOT_MODIFY_ASSET_NAME":                6,
+}
+
+func (x AssetErrorEnum_AssetError) String() string {
+	return proto.EnumName(AssetErrorEnum_AssetError_name, int32(x))
+}
+
+func (AssetErrorEnum_AssetError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a6381eb5f1114281, []int{0, 0}
+}
+
+// Container for enum describing possible asset errors.
+type AssetErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AssetErrorEnum) Reset()         { *m = AssetErrorEnum{} }
+func (m *AssetErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AssetErrorEnum) ProtoMessage()    {}
+func (*AssetErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a6381eb5f1114281, []int{0}
+}
+
+func (m *AssetErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AssetErrorEnum.Unmarshal(m, b)
+}
+func (m *AssetErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AssetErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AssetErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AssetErrorEnum.Merge(m, src)
+}
+func (m *AssetErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AssetErrorEnum.Size(m)
+}
+func (m *AssetErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AssetErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AssetErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AssetErrorEnum_AssetError", AssetErrorEnum_AssetError_name, AssetErrorEnum_AssetError_value)
+	proto.RegisterType((*AssetErrorEnum)(nil), "google.ads.googleads.v3.errors.AssetErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/asset_error.proto", fileDescriptor_a6381eb5f1114281)
+}
+
+var fileDescriptor_a6381eb5f1114281 = []byte{
+	// 380 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x8b, 0xd4, 0x30,
+	0x14, 0xc7, 0x6d, 0x57, 0x57, 0xc8, 0x82, 0x53, 0xa2, 0xc2, 0x2a, 0xcb, 0x1e, 0x7a, 0xf1, 0x20,
+	0xa4, 0x42, 0x6f, 0xf1, 0x94, 0x6d, 0x33, 0x63, 0x70, 0x9b, 0x96, 0x49, 0x3a, 0xc3, 0x48, 0x21,
+	0x54, 0x5b, 0xca, 0xc0, 0x4c, 0x33, 0x34, 0x75, 0x3e, 0x90, 0x47, 0xbf, 0x84, 0x77, 0x8f, 0x7e,
+	0x8c, 0xf9, 0x14, 0xd2, 0xc6, 0x99, 0x11, 0xc1, 0x3d, 0xe5, 0xff, 0x5e, 0x7e, 0xff, 0xf7, 0x92,
+	0xf7, 0xc0, 0xbb, 0x46, 0xeb, 0x66, 0x53, 0x07, 0x65, 0x65, 0x02, 0x2b, 0x07, 0xb5, 0x0f, 0x83,
+	0xba, 0xeb, 0x74, 0x67, 0x82, 0xd2, 0x98, 0xba, 0x57, 0x63, 0x80, 0x76, 0x9d, 0xee, 0x35, 0xbc,
+	0xb5, 0x18, 0x2a, 0x2b, 0x83, 0x4e, 0x0e, 0xb4, 0x0f, 0x91, 0x75, 0xbc, 0xbe, 0x39, 0x56, 0xdc,
+	0xad, 0x83, 0xb2, 0x6d, 0x75, 0x5f, 0xf6, 0x6b, 0xdd, 0x1a, 0xeb, 0xf6, 0x7f, 0x39, 0xe0, 0x19,
+	0x19, 0x6a, 0xd2, 0x81, 0xa6, 0xed, 0xd7, 0xad, 0xff, 0xc3, 0x01, 0xe0, 0x9c, 0x82, 0x13, 0x70,
+	0x95, 0x73, 0x91, 0xd1, 0x88, 0x4d, 0x19, 0x8d, 0xbd, 0x47, 0xf0, 0x0a, 0x3c, 0xcd, 0xf9, 0x47,
+	0x9e, 0x2e, 0xb9, 0xe7, 0xc0, 0xb7, 0xe0, 0x4d, 0x94, 0x0b, 0x99, 0x26, 0x74, 0xae, 0x78, 0x2a,
+	0xd5, 0xf2, 0x03, 0x93, 0xf4, 0x9e, 0x09, 0x49, 0x63, 0x35, 0x4d, 0xe7, 0x8a, 0x08, 0x41, 0xa5,
+	0x92, 0xab, 0x8c, 0x7a, 0x2e, 0x7c, 0x0e, 0x26, 0x71, 0x9e, 0xdd, 0xb3, 0x88, 0x48, 0x6a, 0x6f,
+	0xbc, 0x0b, 0x78, 0x0d, 0x5e, 0xfc, 0x93, 0x54, 0x9c, 0x24, 0xd4, 0x7b, 0x0c, 0x5f, 0x81, 0x97,
+	0x36, 0x8e, 0x89, 0x24, 0x8a, 0x09, 0x95, 0x30, 0x21, 0x18, 0x9f, 0x79, 0x4f, 0xe0, 0x0d, 0xb8,
+	0x8e, 0x08, 0x1f, 0x1a, 0x26, 0x69, 0xcc, 0xa6, 0xab, 0xbf, 0x8d, 0x97, 0x77, 0x07, 0x07, 0xf8,
+	0x5f, 0xf4, 0x16, 0x3d, 0x3c, 0x99, 0xbb, 0xc9, 0xf9, 0x97, 0xd9, 0x30, 0x8c, 0xcc, 0xf9, 0x14,
+	0xff, 0xb1, 0x34, 0x7a, 0x53, 0xb6, 0x0d, 0xd2, 0x5d, 0x13, 0x34, 0x75, 0x3b, 0x8e, 0xea, 0xb8,
+	0x8e, 0xdd, 0xda, 0xfc, 0x6f, 0x3b, 0xef, 0xed, 0xf1, 0xcd, 0xbd, 0x98, 0x11, 0xf2, 0xdd, 0xbd,
+	0x9d, 0xd9, 0x62, 0xa4, 0x32, 0xc8, 0xca, 0x41, 0x2d, 0x42, 0x34, 0xb6, 0x34, 0x3f, 0x8f, 0x40,
+	0x41, 0x2a, 0x53, 0x9c, 0x80, 0x62, 0x11, 0x16, 0x16, 0x38, 0xb8, 0xbe, 0xcd, 0x62, 0x4c, 0x2a,
+	0x83, 0xf1, 0x09, 0xc1, 0x78, 0x11, 0x62, 0x6c, 0xa1, 0xcf, 0x97, 0xe3, 0xeb, 0xc2, 0xdf, 0x01,
+	0x00, 0x00, 0xff, 0xff, 0xed, 0x6e, 0xea, 0x21, 0x3a, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/authentication_error.pb.go b/googleapis/ads/googleads/v3/errors/authentication_error.pb.go
new file mode 100644
index 0000000..db34e84
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/authentication_error.pb.go
@@ -0,0 +1,208 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/authentication_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible authentication errors.
+type AuthenticationErrorEnum_AuthenticationError int32
+
+const (
+	// Enum unspecified.
+	AuthenticationErrorEnum_UNSPECIFIED AuthenticationErrorEnum_AuthenticationError = 0
+	// The received error code is not known in this version.
+	AuthenticationErrorEnum_UNKNOWN AuthenticationErrorEnum_AuthenticationError = 1
+	// Authentication of the request failed.
+	AuthenticationErrorEnum_AUTHENTICATION_ERROR AuthenticationErrorEnum_AuthenticationError = 2
+	// Client Customer Id is not a number.
+	AuthenticationErrorEnum_CLIENT_CUSTOMER_ID_INVALID AuthenticationErrorEnum_AuthenticationError = 5
+	// No customer found for the provided customer id.
+	AuthenticationErrorEnum_CUSTOMER_NOT_FOUND AuthenticationErrorEnum_AuthenticationError = 8
+	// Client's Google Account is deleted.
+	AuthenticationErrorEnum_GOOGLE_ACCOUNT_DELETED AuthenticationErrorEnum_AuthenticationError = 9
+	// Google account login token in the cookie is invalid.
+	AuthenticationErrorEnum_GOOGLE_ACCOUNT_COOKIE_INVALID AuthenticationErrorEnum_AuthenticationError = 10
+	// A problem occurred during Google account authentication.
+	AuthenticationErrorEnum_GOOGLE_ACCOUNT_AUTHENTICATION_FAILED AuthenticationErrorEnum_AuthenticationError = 25
+	// The user in the google account login token does not match the UserId in
+	// the cookie.
+	AuthenticationErrorEnum_GOOGLE_ACCOUNT_USER_AND_ADS_USER_MISMATCH AuthenticationErrorEnum_AuthenticationError = 12
+	// Login cookie is required for authentication.
+	AuthenticationErrorEnum_LOGIN_COOKIE_REQUIRED AuthenticationErrorEnum_AuthenticationError = 13
+	// User in the cookie is not a valid Ads user.
+	AuthenticationErrorEnum_NOT_ADS_USER AuthenticationErrorEnum_AuthenticationError = 14
+	// Oauth token in the header is not valid.
+	AuthenticationErrorEnum_OAUTH_TOKEN_INVALID AuthenticationErrorEnum_AuthenticationError = 15
+	// Oauth token in the header has expired.
+	AuthenticationErrorEnum_OAUTH_TOKEN_EXPIRED AuthenticationErrorEnum_AuthenticationError = 16
+	// Oauth token in the header has been disabled.
+	AuthenticationErrorEnum_OAUTH_TOKEN_DISABLED AuthenticationErrorEnum_AuthenticationError = 17
+	// Oauth token in the header has been revoked.
+	AuthenticationErrorEnum_OAUTH_TOKEN_REVOKED AuthenticationErrorEnum_AuthenticationError = 18
+	// Oauth token HTTP header is malformed.
+	AuthenticationErrorEnum_OAUTH_TOKEN_HEADER_INVALID AuthenticationErrorEnum_AuthenticationError = 19
+	// Login cookie is not valid.
+	AuthenticationErrorEnum_LOGIN_COOKIE_INVALID AuthenticationErrorEnum_AuthenticationError = 20
+	// User Id in the header is not a valid id.
+	AuthenticationErrorEnum_USER_ID_INVALID AuthenticationErrorEnum_AuthenticationError = 22
+	// An account administrator changed this account's authentication settings.
+	// To access this Google Ads account, enable 2-Step Verification in your
+	// Google account at https://www.google.com/landing/2step.
+	AuthenticationErrorEnum_TWO_STEP_VERIFICATION_NOT_ENROLLED AuthenticationErrorEnum_AuthenticationError = 23
+	// An account administrator changed this account's authentication settings.
+	// To access this Google Ads account, enable Advanced Protection in your
+	// Google account at https://landing.google.com/advancedprotection.
+	AuthenticationErrorEnum_ADVANCED_PROTECTION_NOT_ENROLLED AuthenticationErrorEnum_AuthenticationError = 24
+)
+
+var AuthenticationErrorEnum_AuthenticationError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "AUTHENTICATION_ERROR",
+	5:  "CLIENT_CUSTOMER_ID_INVALID",
+	8:  "CUSTOMER_NOT_FOUND",
+	9:  "GOOGLE_ACCOUNT_DELETED",
+	10: "GOOGLE_ACCOUNT_COOKIE_INVALID",
+	25: "GOOGLE_ACCOUNT_AUTHENTICATION_FAILED",
+	12: "GOOGLE_ACCOUNT_USER_AND_ADS_USER_MISMATCH",
+	13: "LOGIN_COOKIE_REQUIRED",
+	14: "NOT_ADS_USER",
+	15: "OAUTH_TOKEN_INVALID",
+	16: "OAUTH_TOKEN_EXPIRED",
+	17: "OAUTH_TOKEN_DISABLED",
+	18: "OAUTH_TOKEN_REVOKED",
+	19: "OAUTH_TOKEN_HEADER_INVALID",
+	20: "LOGIN_COOKIE_INVALID",
+	22: "USER_ID_INVALID",
+	23: "TWO_STEP_VERIFICATION_NOT_ENROLLED",
+	24: "ADVANCED_PROTECTION_NOT_ENROLLED",
+}
+
+var AuthenticationErrorEnum_AuthenticationError_value = map[string]int32{
+	"UNSPECIFIED":                               0,
+	"UNKNOWN":                                   1,
+	"AUTHENTICATION_ERROR":                      2,
+	"CLIENT_CUSTOMER_ID_INVALID":                5,
+	"CUSTOMER_NOT_FOUND":                        8,
+	"GOOGLE_ACCOUNT_DELETED":                    9,
+	"GOOGLE_ACCOUNT_COOKIE_INVALID":             10,
+	"GOOGLE_ACCOUNT_AUTHENTICATION_FAILED":      25,
+	"GOOGLE_ACCOUNT_USER_AND_ADS_USER_MISMATCH": 12,
+	"LOGIN_COOKIE_REQUIRED":                     13,
+	"NOT_ADS_USER":                              14,
+	"OAUTH_TOKEN_INVALID":                       15,
+	"OAUTH_TOKEN_EXPIRED":                       16,
+	"OAUTH_TOKEN_DISABLED":                      17,
+	"OAUTH_TOKEN_REVOKED":                       18,
+	"OAUTH_TOKEN_HEADER_INVALID":                19,
+	"LOGIN_COOKIE_INVALID":                      20,
+	"USER_ID_INVALID":                           22,
+	"TWO_STEP_VERIFICATION_NOT_ENROLLED":        23,
+	"ADVANCED_PROTECTION_NOT_ENROLLED":          24,
+}
+
+func (x AuthenticationErrorEnum_AuthenticationError) String() string {
+	return proto.EnumName(AuthenticationErrorEnum_AuthenticationError_name, int32(x))
+}
+
+func (AuthenticationErrorEnum_AuthenticationError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_4eadbda3d9e23838, []int{0, 0}
+}
+
+// Container for enum describing possible authentication errors.
+type AuthenticationErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AuthenticationErrorEnum) Reset()         { *m = AuthenticationErrorEnum{} }
+func (m *AuthenticationErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AuthenticationErrorEnum) ProtoMessage()    {}
+func (*AuthenticationErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4eadbda3d9e23838, []int{0}
+}
+
+func (m *AuthenticationErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AuthenticationErrorEnum.Unmarshal(m, b)
+}
+func (m *AuthenticationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AuthenticationErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AuthenticationErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AuthenticationErrorEnum.Merge(m, src)
+}
+func (m *AuthenticationErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AuthenticationErrorEnum.Size(m)
+}
+func (m *AuthenticationErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AuthenticationErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AuthenticationErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AuthenticationErrorEnum_AuthenticationError", AuthenticationErrorEnum_AuthenticationError_name, AuthenticationErrorEnum_AuthenticationError_value)
+	proto.RegisterType((*AuthenticationErrorEnum)(nil), "google.ads.googleads.v3.errors.AuthenticationErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/authentication_error.proto", fileDescriptor_4eadbda3d9e23838)
+}
+
+var fileDescriptor_4eadbda3d9e23838 = []byte{
+	// 560 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xdd, 0x6e, 0xd3, 0x3e,
+	0x14, 0xff, 0xaf, 0xff, 0xf1, 0xe5, 0x0d, 0x66, 0xdc, 0xb1, 0x2f, 0xc1, 0x04, 0xd5, 0x84, 0xe0,
+	0x82, 0xf4, 0x22, 0x57, 0x84, 0x2b, 0x2f, 0x3e, 0xed, 0xac, 0x66, 0x76, 0x48, 0x9c, 0x0c, 0xa1,
+	0x4a, 0x56, 0x58, 0xab, 0x50, 0x69, 0x4b, 0xa6, 0xa6, 0xdb, 0x03, 0x71, 0xc9, 0xa3, 0x20, 0x1e,
+	0x04, 0x71, 0xcb, 0x0b, 0x20, 0x27, 0x4b, 0xd4, 0x85, 0xc1, 0x55, 0x4f, 0xfd, 0xfb, 0x38, 0x3f,
+	0x9f, 0x1c, 0xa3, 0xb7, 0x69, 0x9e, 0xa7, 0x67, 0xd3, 0x7e, 0x32, 0x29, 0xfa, 0x55, 0x69, 0xaa,
+	0x2b, 0xbb, 0x3f, 0x9d, 0xcf, 0xf3, 0x79, 0xd1, 0x4f, 0x2e, 0x17, 0x9f, 0xa7, 0xd9, 0x62, 0x76,
+	0x9a, 0x2c, 0x66, 0x79, 0xa6, 0xcb, 0x53, 0xeb, 0x62, 0x9e, 0x2f, 0x72, 0xb2, 0x5f, 0xf1, 0xad,
+	0x64, 0x52, 0x58, 0x8d, 0xd4, 0xba, 0xb2, 0xad, 0x4a, 0xba, 0xf7, 0xb4, 0xb6, 0xbe, 0x98, 0xf5,
+	0x93, 0x2c, 0xcb, 0x17, 0xa5, 0x45, 0x51, 0xa9, 0x7b, 0x3f, 0x56, 0xd1, 0x36, 0xbd, 0x61, 0x0e,
+	0x46, 0x06, 0xd9, 0xe5, 0x79, 0xef, 0xfb, 0x2a, 0xea, 0xde, 0x82, 0x91, 0x0d, 0xb4, 0x16, 0x89,
+	0xd0, 0x07, 0x97, 0x0f, 0x38, 0x30, 0xfc, 0x1f, 0x59, 0x43, 0xf7, 0x22, 0x31, 0x12, 0xf2, 0x44,
+	0xe0, 0x15, 0xb2, 0x83, 0x36, 0x69, 0xa4, 0x8e, 0x40, 0x28, 0xee, 0x52, 0xc5, 0xa5, 0xd0, 0x10,
+	0x04, 0x32, 0xc0, 0x1d, 0xb2, 0x8f, 0xf6, 0x5c, 0x8f, 0x83, 0x50, 0xda, 0x8d, 0x42, 0x25, 0x8f,
+	0x21, 0xd0, 0x9c, 0x69, 0x2e, 0x62, 0xea, 0x71, 0x86, 0xef, 0x90, 0x2d, 0x44, 0x1a, 0x40, 0x48,
+	0xa5, 0x07, 0x32, 0x12, 0x0c, 0xdf, 0x27, 0x7b, 0x68, 0x6b, 0x28, 0xe5, 0xd0, 0x03, 0x4d, 0x5d,
+	0x57, 0x46, 0x42, 0x69, 0x06, 0x1e, 0x28, 0x60, 0xf8, 0x01, 0x79, 0x81, 0x9e, 0xb5, 0x30, 0x57,
+	0xca, 0x11, 0x87, 0xc6, 0x16, 0x91, 0x57, 0xe8, 0xa0, 0x45, 0x69, 0xe5, 0x1b, 0x50, 0xee, 0x01,
+	0xc3, 0xbb, 0xe4, 0x0d, 0x7a, 0xdd, 0x62, 0x46, 0x21, 0x04, 0x9a, 0x0a, 0xa6, 0x29, 0x0b, 0xab,
+	0x3f, 0xc7, 0x3c, 0x3c, 0xa6, 0xca, 0x3d, 0xc2, 0xeb, 0x64, 0x17, 0x3d, 0xf1, 0xe4, 0x90, 0x8b,
+	0xba, 0x65, 0x00, 0xef, 0x23, 0x1e, 0x00, 0xc3, 0x0f, 0x09, 0x46, 0xeb, 0xe6, 0x06, 0xb5, 0x0a,
+	0x3f, 0x22, 0xdb, 0xa8, 0x2b, 0x4d, 0x5f, 0xad, 0xe4, 0x08, 0x44, 0x13, 0x6f, 0xa3, 0x0d, 0xc0,
+	0x07, 0xbf, 0xf4, 0xc0, 0x66, 0x90, 0xcb, 0x00, 0xe3, 0x21, 0x3d, 0x34, 0x39, 0x1f, 0xb7, 0x25,
+	0x01, 0xc4, 0x72, 0x04, 0x0c, 0x13, 0x33, 0xe1, 0x65, 0xe0, 0x08, 0x28, 0x33, 0x43, 0xbe, 0xee,
+	0xd5, 0x35, 0x96, 0x37, 0x12, 0xd7, 0xc8, 0x26, 0xe9, 0xa2, 0x8d, 0xf2, 0x7a, 0x4b, 0x1f, 0x64,
+	0x8b, 0xbc, 0x44, 0x3d, 0x75, 0x22, 0x75, 0xa8, 0xc0, 0xd7, 0x31, 0x04, 0x7c, 0x50, 0x4f, 0xcc,
+	0xdc, 0x0d, 0x44, 0x20, 0x3d, 0x93, 0x67, 0x9b, 0x1c, 0xa0, 0xe7, 0x94, 0xc5, 0x54, 0xb8, 0xc0,
+	0xb4, 0x1f, 0x48, 0x05, 0xee, 0x9f, 0xac, 0x9d, 0xc3, 0x5f, 0x2b, 0xa8, 0x77, 0x9a, 0x9f, 0x5b,
+	0xff, 0xde, 0xd7, 0xc3, 0x9d, 0x5b, 0x56, 0xce, 0x37, 0xbb, 0xea, 0xaf, 0x7c, 0x64, 0xd7, 0xda,
+	0x34, 0x3f, 0x4b, 0xb2, 0xd4, 0xca, 0xe7, 0x69, 0x3f, 0x9d, 0x66, 0xe5, 0x26, 0xd7, 0xcf, 0xe6,
+	0x62, 0x56, 0xfc, 0xed, 0x15, 0xbd, 0xab, 0x7e, 0xbe, 0x74, 0xfe, 0x1f, 0x52, 0xfa, 0xb5, 0xb3,
+	0x3f, 0xac, 0xcc, 0xe8, 0xa4, 0xb0, 0xaa, 0xd2, 0x54, 0xb1, 0x6d, 0x95, 0x2d, 0x8b, 0x6f, 0x35,
+	0x61, 0x4c, 0x27, 0xc5, 0xb8, 0x21, 0x8c, 0x63, 0x7b, 0x5c, 0x11, 0x7e, 0x76, 0x7a, 0xd5, 0xa9,
+	0xe3, 0xd0, 0x49, 0xe1, 0x38, 0x0d, 0xc5, 0x71, 0x62, 0xdb, 0x71, 0x2a, 0xd2, 0xa7, 0xbb, 0x65,
+	0x3a, 0xfb, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x08, 0x82, 0x1b, 0x1f, 0xe2, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/authorization_error.pb.go b/googleapis/ads/googleads/v3/errors/authorization_error.pb.go
new file mode 100644
index 0000000..690fd36
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/authorization_error.pb.go
@@ -0,0 +1,184 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/authorization_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible authorization errors.
+type AuthorizationErrorEnum_AuthorizationError int32
+
+const (
+	// Enum unspecified.
+	AuthorizationErrorEnum_UNSPECIFIED AuthorizationErrorEnum_AuthorizationError = 0
+	// The received error code is not known in this version.
+	AuthorizationErrorEnum_UNKNOWN AuthorizationErrorEnum_AuthorizationError = 1
+	// User doesn't have permission to access customer. Note: If you're
+	// accessing a client customer, the manager's customer ID must be set in the
+	// `login-customer-id` header. Learn more at
+	// https://developers.google.com/google-ads/api/docs/concepts/call-structure#cid
+	AuthorizationErrorEnum_USER_PERMISSION_DENIED AuthorizationErrorEnum_AuthorizationError = 2
+	// The developer token is not whitelisted.
+	AuthorizationErrorEnum_DEVELOPER_TOKEN_NOT_WHITELISTED AuthorizationErrorEnum_AuthorizationError = 3
+	// The developer token is not allowed with the project sent in the request.
+	AuthorizationErrorEnum_DEVELOPER_TOKEN_PROHIBITED AuthorizationErrorEnum_AuthorizationError = 4
+	// The Google Cloud project sent in the request does not have permission to
+	// access the api.
+	AuthorizationErrorEnum_PROJECT_DISABLED AuthorizationErrorEnum_AuthorizationError = 5
+	// Authorization of the client failed.
+	AuthorizationErrorEnum_AUTHORIZATION_ERROR AuthorizationErrorEnum_AuthorizationError = 6
+	// The user does not have permission to perform this action
+	// (e.g., ADD, UPDATE, REMOVE) on the resource or call a method.
+	AuthorizationErrorEnum_ACTION_NOT_PERMITTED AuthorizationErrorEnum_AuthorizationError = 7
+	// Signup not complete.
+	AuthorizationErrorEnum_INCOMPLETE_SIGNUP AuthorizationErrorEnum_AuthorizationError = 8
+	// The customer can't be used because it isn't enabled.
+	AuthorizationErrorEnum_CUSTOMER_NOT_ENABLED AuthorizationErrorEnum_AuthorizationError = 24
+	// The developer must sign the terms of service. They can be found here:
+	// ads.google.com/aw/apicenter
+	AuthorizationErrorEnum_MISSING_TOS AuthorizationErrorEnum_AuthorizationError = 9
+	// The developer token is not approved. Non-approved developer tokens can
+	// only be used with test accounts.
+	AuthorizationErrorEnum_DEVELOPER_TOKEN_NOT_APPROVED AuthorizationErrorEnum_AuthorizationError = 10
+	// The login customer specified does not have access to the account
+	// specified, so the request is invalid.
+	AuthorizationErrorEnum_INVALID_LOGIN_CUSTOMER_ID_SERVING_CUSTOMER_ID_COMBINATION AuthorizationErrorEnum_AuthorizationError = 11
+	// The developer specified does not have access to the service.
+	AuthorizationErrorEnum_SERVICE_ACCESS_DENIED AuthorizationErrorEnum_AuthorizationError = 12
+)
+
+var AuthorizationErrorEnum_AuthorizationError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "USER_PERMISSION_DENIED",
+	3:  "DEVELOPER_TOKEN_NOT_WHITELISTED",
+	4:  "DEVELOPER_TOKEN_PROHIBITED",
+	5:  "PROJECT_DISABLED",
+	6:  "AUTHORIZATION_ERROR",
+	7:  "ACTION_NOT_PERMITTED",
+	8:  "INCOMPLETE_SIGNUP",
+	24: "CUSTOMER_NOT_ENABLED",
+	9:  "MISSING_TOS",
+	10: "DEVELOPER_TOKEN_NOT_APPROVED",
+	11: "INVALID_LOGIN_CUSTOMER_ID_SERVING_CUSTOMER_ID_COMBINATION",
+	12: "SERVICE_ACCESS_DENIED",
+}
+
+var AuthorizationErrorEnum_AuthorizationError_value = map[string]int32{
+	"UNSPECIFIED":                     0,
+	"UNKNOWN":                         1,
+	"USER_PERMISSION_DENIED":          2,
+	"DEVELOPER_TOKEN_NOT_WHITELISTED": 3,
+	"DEVELOPER_TOKEN_PROHIBITED":      4,
+	"PROJECT_DISABLED":                5,
+	"AUTHORIZATION_ERROR":             6,
+	"ACTION_NOT_PERMITTED":            7,
+	"INCOMPLETE_SIGNUP":               8,
+	"CUSTOMER_NOT_ENABLED":            24,
+	"MISSING_TOS":                     9,
+	"DEVELOPER_TOKEN_NOT_APPROVED":    10,
+	"INVALID_LOGIN_CUSTOMER_ID_SERVING_CUSTOMER_ID_COMBINATION": 11,
+	"SERVICE_ACCESS_DENIED": 12,
+}
+
+func (x AuthorizationErrorEnum_AuthorizationError) String() string {
+	return proto.EnumName(AuthorizationErrorEnum_AuthorizationError_name, int32(x))
+}
+
+func (AuthorizationErrorEnum_AuthorizationError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_92d97e48ae8e8866, []int{0, 0}
+}
+
+// Container for enum describing possible authorization errors.
+type AuthorizationErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AuthorizationErrorEnum) Reset()         { *m = AuthorizationErrorEnum{} }
+func (m *AuthorizationErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*AuthorizationErrorEnum) ProtoMessage()    {}
+func (*AuthorizationErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_92d97e48ae8e8866, []int{0}
+}
+
+func (m *AuthorizationErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AuthorizationErrorEnum.Unmarshal(m, b)
+}
+func (m *AuthorizationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AuthorizationErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *AuthorizationErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AuthorizationErrorEnum.Merge(m, src)
+}
+func (m *AuthorizationErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_AuthorizationErrorEnum.Size(m)
+}
+func (m *AuthorizationErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_AuthorizationErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AuthorizationErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.AuthorizationErrorEnum_AuthorizationError", AuthorizationErrorEnum_AuthorizationError_name, AuthorizationErrorEnum_AuthorizationError_value)
+	proto.RegisterType((*AuthorizationErrorEnum)(nil), "google.ads.googleads.v3.errors.AuthorizationErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/authorization_error.proto", fileDescriptor_92d97e48ae8e8866)
+}
+
+var fileDescriptor_92d97e48ae8e8866 = []byte{
+	// 507 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xcf, 0x6e, 0xd3, 0x40,
+	0x10, 0xc6, 0x69, 0x02, 0x2d, 0x6c, 0x90, 0x30, 0x4b, 0xff, 0x11, 0x55, 0x01, 0x85, 0xbb, 0x7d,
+	0xf0, 0x05, 0x8c, 0x38, 0x6c, 0xec, 0x21, 0x59, 0xea, 0xec, 0x5a, 0xbb, 0xb6, 0x2b, 0x55, 0x91,
+	0x56, 0x86, 0x44, 0x26, 0x52, 0x6b, 0x47, 0x76, 0xda, 0x03, 0x8f, 0xc2, 0x91, 0x23, 0x77, 0x5e,
+	0x82, 0x47, 0xe1, 0xc8, 0x13, 0xa0, 0xdd, 0x25, 0x51, 0x45, 0x81, 0x93, 0x47, 0xb3, 0xbf, 0xef,
+	0x9b, 0x19, 0xcf, 0xa0, 0x97, 0x65, 0x5d, 0x97, 0x17, 0x0b, 0xaf, 0x98, 0xb7, 0x9e, 0x0d, 0x75,
+	0x74, 0xed, 0x7b, 0x8b, 0xa6, 0xa9, 0x9b, 0xd6, 0x2b, 0xae, 0xd6, 0x1f, 0xeb, 0x66, 0xf9, 0xa9,
+	0x58, 0x2f, 0xeb, 0x4a, 0x99, 0xa4, 0xbb, 0x6a, 0xea, 0x75, 0x8d, 0x07, 0x16, 0x77, 0x8b, 0x79,
+	0xeb, 0x6e, 0x95, 0xee, 0xb5, 0xef, 0x5a, 0x65, 0xff, 0x64, 0xe3, 0xbc, 0x5a, 0x7a, 0x45, 0x55,
+	0xd5, 0x6b, 0x63, 0xd1, 0x5a, 0xf5, 0xf0, 0x5b, 0x17, 0x1d, 0x92, 0x9b, 0xde, 0xa0, 0x55, 0x50,
+	0x5d, 0x5d, 0x0e, 0x3f, 0x77, 0x11, 0xbe, 0xfd, 0x84, 0x1f, 0xa1, 0x5e, 0xc6, 0x64, 0x02, 0x21,
+	0x7d, 0x4b, 0x21, 0x72, 0xee, 0xe0, 0x1e, 0xda, 0xcb, 0xd8, 0x29, 0xe3, 0x67, 0xcc, 0xd9, 0xc1,
+	0x7d, 0x74, 0x98, 0x49, 0x10, 0x2a, 0x01, 0x31, 0xa5, 0x52, 0x52, 0xce, 0x54, 0x04, 0x4c, 0x83,
+	0x1d, 0xfc, 0x02, 0x3d, 0x8b, 0x20, 0x87, 0x98, 0x27, 0x20, 0x54, 0xca, 0x4f, 0x81, 0x29, 0xc6,
+	0x53, 0x75, 0x36, 0xa1, 0x29, 0xc4, 0x54, 0xa6, 0x10, 0x39, 0x5d, 0x3c, 0x40, 0xfd, 0x3f, 0xa1,
+	0x44, 0xf0, 0x09, 0x1d, 0x51, 0xfd, 0x7e, 0x17, 0xef, 0x23, 0x27, 0x11, 0xfc, 0x1d, 0x84, 0xa9,
+	0x8a, 0xa8, 0x24, 0xa3, 0x18, 0x22, 0xe7, 0x1e, 0x3e, 0x42, 0x4f, 0x48, 0x96, 0x4e, 0xb8, 0xa0,
+	0xe7, 0x24, 0xd5, 0x45, 0x41, 0x08, 0x2e, 0x9c, 0x5d, 0x7c, 0x8c, 0xf6, 0x49, 0x68, 0x32, 0xba,
+	0x94, 0xe9, 0x2a, 0xd5, 0x46, 0x7b, 0xf8, 0x00, 0x3d, 0xa6, 0x2c, 0xe4, 0xd3, 0x24, 0x86, 0x14,
+	0x94, 0xa4, 0x63, 0x96, 0x25, 0xce, 0x7d, 0x2d, 0x08, 0x33, 0x99, 0xf2, 0x29, 0x08, 0x23, 0x01,
+	0x66, 0x6b, 0x1c, 0xeb, 0xc1, 0xcd, 0x48, 0x6c, 0xac, 0x52, 0x2e, 0x9d, 0x07, 0xf8, 0x39, 0x3a,
+	0xf9, 0xdb, 0x3c, 0x24, 0x49, 0x04, 0xcf, 0x21, 0x72, 0x10, 0x7e, 0x83, 0x5e, 0x51, 0x96, 0x93,
+	0x98, 0x46, 0x2a, 0xe6, 0x63, 0xca, 0xd4, 0xd6, 0x9a, 0x46, 0x4a, 0x82, 0xc8, 0xb5, 0xd9, 0xcd,
+	0x5c, 0xc8, 0xa7, 0x23, 0xca, 0xcc, 0x08, 0x4e, 0x0f, 0x3f, 0x45, 0x07, 0x06, 0x0a, 0x41, 0x91,
+	0x30, 0x04, 0x29, 0x37, 0xff, 0xf2, 0xe1, 0xe8, 0xe7, 0x0e, 0x1a, 0x7e, 0xa8, 0x2f, 0xdd, 0xff,
+	0x2f, 0x7f, 0x74, 0x74, 0x7b, 0x81, 0x89, 0xde, 0x7b, 0xb2, 0x73, 0x1e, 0xfd, 0x96, 0x96, 0xf5,
+	0x45, 0x51, 0x95, 0x6e, 0xdd, 0x94, 0x5e, 0xb9, 0xa8, 0xcc, 0x55, 0x6c, 0x2e, 0x70, 0xb5, 0x6c,
+	0xff, 0x75, 0x90, 0xaf, 0xed, 0xe7, 0x4b, 0xa7, 0x3b, 0x26, 0xe4, 0x6b, 0x67, 0x30, 0xb6, 0x66,
+	0x64, 0xde, 0xba, 0x36, 0xd4, 0x51, 0xee, 0xbb, 0xa6, 0x64, 0xfb, 0x7d, 0x03, 0xcc, 0xc8, 0xbc,
+	0x9d, 0x6d, 0x81, 0x59, 0xee, 0xcf, 0x2c, 0xf0, 0xa3, 0x33, 0xb4, 0xd9, 0x20, 0x20, 0xf3, 0x36,
+	0x08, 0xb6, 0x48, 0x10, 0xe4, 0x7e, 0x10, 0x58, 0xe8, 0xfd, 0xae, 0xe9, 0xce, 0xff, 0x15, 0x00,
+	0x00, 0xff, 0xff, 0x81, 0x68, 0xa4, 0x26, 0x2d, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/bidding_error.pb.go b/googleapis/ads/googleads/v3/errors/bidding_error.pb.go
new file mode 100644
index 0000000..284dfea
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/bidding_error.pb.go
@@ -0,0 +1,245 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/bidding_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible bidding errors.
+type BiddingErrorEnum_BiddingError int32
+
+const (
+	// Enum unspecified.
+	BiddingErrorEnum_UNSPECIFIED BiddingErrorEnum_BiddingError = 0
+	// The received error code is not known in this version.
+	BiddingErrorEnum_UNKNOWN BiddingErrorEnum_BiddingError = 1
+	// Cannot transition to new bidding strategy.
+	BiddingErrorEnum_BIDDING_STRATEGY_TRANSITION_NOT_ALLOWED BiddingErrorEnum_BiddingError = 2
+	// Cannot attach bidding strategy to campaign.
+	BiddingErrorEnum_CANNOT_ATTACH_BIDDING_STRATEGY_TO_CAMPAIGN BiddingErrorEnum_BiddingError = 7
+	// Bidding strategy is not supported or cannot be used as anonymous.
+	BiddingErrorEnum_INVALID_ANONYMOUS_BIDDING_STRATEGY_TYPE BiddingErrorEnum_BiddingError = 10
+	// The type does not match the named strategy's type.
+	BiddingErrorEnum_INVALID_BIDDING_STRATEGY_TYPE BiddingErrorEnum_BiddingError = 14
+	// The bid is invalid.
+	BiddingErrorEnum_INVALID_BID BiddingErrorEnum_BiddingError = 17
+	// Bidding strategy is not available for the account type.
+	BiddingErrorEnum_BIDDING_STRATEGY_NOT_AVAILABLE_FOR_ACCOUNT_TYPE BiddingErrorEnum_BiddingError = 18
+	// Conversion tracking is not enabled for the campaign for VBB transition.
+	BiddingErrorEnum_CONVERSION_TRACKING_NOT_ENABLED BiddingErrorEnum_BiddingError = 19
+	// Not enough conversions tracked for VBB transitions.
+	BiddingErrorEnum_NOT_ENOUGH_CONVERSIONS BiddingErrorEnum_BiddingError = 20
+	// Campaign can not be created with given bidding strategy. It can be
+	// transitioned to the strategy, once eligible.
+	BiddingErrorEnum_CANNOT_CREATE_CAMPAIGN_WITH_BIDDING_STRATEGY BiddingErrorEnum_BiddingError = 21
+	// Cannot target content network only as campaign uses Page One Promoted
+	// bidding strategy.
+	BiddingErrorEnum_CANNOT_TARGET_CONTENT_NETWORK_ONLY_WITH_CAMPAIGN_LEVEL_POP_BIDDING_STRATEGY BiddingErrorEnum_BiddingError = 23
+	// Budget Optimizer and Target Spend bidding strategies are not supported
+	// for campaigns with AdSchedule targeting.
+	BiddingErrorEnum_BIDDING_STRATEGY_NOT_SUPPORTED_WITH_AD_SCHEDULE BiddingErrorEnum_BiddingError = 24
+	// Pay per conversion is not available to all the customer, only few
+	// whitelisted customers can use this.
+	BiddingErrorEnum_PAY_PER_CONVERSION_NOT_AVAILABLE_FOR_CUSTOMER BiddingErrorEnum_BiddingError = 25
+	// Pay per conversion is not allowed with Target CPA.
+	BiddingErrorEnum_PAY_PER_CONVERSION_NOT_ALLOWED_WITH_TARGET_CPA BiddingErrorEnum_BiddingError = 26
+	// Cannot set bidding strategy to Manual CPM for search network only
+	// campaigns.
+	BiddingErrorEnum_BIDDING_STRATEGY_NOT_ALLOWED_FOR_SEARCH_ONLY_CAMPAIGNS BiddingErrorEnum_BiddingError = 27
+	// The bidding strategy is not supported for use in drafts or experiments.
+	BiddingErrorEnum_BIDDING_STRATEGY_NOT_SUPPORTED_IN_DRAFTS_OR_EXPERIMENTS BiddingErrorEnum_BiddingError = 28
+	// Bidding strategy type does not support product type ad group criterion.
+	BiddingErrorEnum_BIDDING_STRATEGY_TYPE_DOES_NOT_SUPPORT_PRODUCT_TYPE_ADGROUP_CRITERION BiddingErrorEnum_BiddingError = 29
+	// Bid amount is too small.
+	BiddingErrorEnum_BID_TOO_SMALL BiddingErrorEnum_BiddingError = 30
+	// Bid amount is too big.
+	BiddingErrorEnum_BID_TOO_BIG BiddingErrorEnum_BiddingError = 31
+	// Bid has too many fractional digit precision.
+	BiddingErrorEnum_BID_TOO_MANY_FRACTIONAL_DIGITS BiddingErrorEnum_BiddingError = 32
+	// Invalid domain name specified.
+	BiddingErrorEnum_INVALID_DOMAIN_NAME BiddingErrorEnum_BiddingError = 33
+	// The field is not compatible with the payment mode.
+	BiddingErrorEnum_NOT_COMPATIBLE_WITH_PAYMENT_MODE BiddingErrorEnum_BiddingError = 34
+	// The field is not compatible with the budget type.
+	BiddingErrorEnum_NOT_COMPATIBLE_WITH_BUDGET_TYPE BiddingErrorEnum_BiddingError = 35
+	// The field is not compatible with the bidding strategy type.
+	BiddingErrorEnum_NOT_COMPATIBLE_WITH_BIDDING_STRATEGY_TYPE BiddingErrorEnum_BiddingError = 36
+	// Bidding strategy type is incompatible with shared budget.
+	BiddingErrorEnum_BIDDING_STRATEGY_TYPE_INCOMPATIBLE_WITH_SHARED_BUDGET BiddingErrorEnum_BiddingError = 37
+)
+
+var BiddingErrorEnum_BiddingError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "BIDDING_STRATEGY_TRANSITION_NOT_ALLOWED",
+	7:  "CANNOT_ATTACH_BIDDING_STRATEGY_TO_CAMPAIGN",
+	10: "INVALID_ANONYMOUS_BIDDING_STRATEGY_TYPE",
+	14: "INVALID_BIDDING_STRATEGY_TYPE",
+	17: "INVALID_BID",
+	18: "BIDDING_STRATEGY_NOT_AVAILABLE_FOR_ACCOUNT_TYPE",
+	19: "CONVERSION_TRACKING_NOT_ENABLED",
+	20: "NOT_ENOUGH_CONVERSIONS",
+	21: "CANNOT_CREATE_CAMPAIGN_WITH_BIDDING_STRATEGY",
+	23: "CANNOT_TARGET_CONTENT_NETWORK_ONLY_WITH_CAMPAIGN_LEVEL_POP_BIDDING_STRATEGY",
+	24: "BIDDING_STRATEGY_NOT_SUPPORTED_WITH_AD_SCHEDULE",
+	25: "PAY_PER_CONVERSION_NOT_AVAILABLE_FOR_CUSTOMER",
+	26: "PAY_PER_CONVERSION_NOT_ALLOWED_WITH_TARGET_CPA",
+	27: "BIDDING_STRATEGY_NOT_ALLOWED_FOR_SEARCH_ONLY_CAMPAIGNS",
+	28: "BIDDING_STRATEGY_NOT_SUPPORTED_IN_DRAFTS_OR_EXPERIMENTS",
+	29: "BIDDING_STRATEGY_TYPE_DOES_NOT_SUPPORT_PRODUCT_TYPE_ADGROUP_CRITERION",
+	30: "BID_TOO_SMALL",
+	31: "BID_TOO_BIG",
+	32: "BID_TOO_MANY_FRACTIONAL_DIGITS",
+	33: "INVALID_DOMAIN_NAME",
+	34: "NOT_COMPATIBLE_WITH_PAYMENT_MODE",
+	35: "NOT_COMPATIBLE_WITH_BUDGET_TYPE",
+	36: "NOT_COMPATIBLE_WITH_BIDDING_STRATEGY_TYPE",
+	37: "BIDDING_STRATEGY_TYPE_INCOMPATIBLE_WITH_SHARED_BUDGET",
+}
+
+var BiddingErrorEnum_BiddingError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"BIDDING_STRATEGY_TRANSITION_NOT_ALLOWED":                                     2,
+	"CANNOT_ATTACH_BIDDING_STRATEGY_TO_CAMPAIGN":                                  7,
+	"INVALID_ANONYMOUS_BIDDING_STRATEGY_TYPE":                                     10,
+	"INVALID_BIDDING_STRATEGY_TYPE":                                               14,
+	"INVALID_BID":                                                                 17,
+	"BIDDING_STRATEGY_NOT_AVAILABLE_FOR_ACCOUNT_TYPE":                             18,
+	"CONVERSION_TRACKING_NOT_ENABLED":                                             19,
+	"NOT_ENOUGH_CONVERSIONS":                                                      20,
+	"CANNOT_CREATE_CAMPAIGN_WITH_BIDDING_STRATEGY":                                21,
+	"CANNOT_TARGET_CONTENT_NETWORK_ONLY_WITH_CAMPAIGN_LEVEL_POP_BIDDING_STRATEGY": 23,
+	"BIDDING_STRATEGY_NOT_SUPPORTED_WITH_AD_SCHEDULE":                             24,
+	"PAY_PER_CONVERSION_NOT_AVAILABLE_FOR_CUSTOMER":                               25,
+	"PAY_PER_CONVERSION_NOT_ALLOWED_WITH_TARGET_CPA":                              26,
+	"BIDDING_STRATEGY_NOT_ALLOWED_FOR_SEARCH_ONLY_CAMPAIGNS":                      27,
+	"BIDDING_STRATEGY_NOT_SUPPORTED_IN_DRAFTS_OR_EXPERIMENTS":                     28,
+	"BIDDING_STRATEGY_TYPE_DOES_NOT_SUPPORT_PRODUCT_TYPE_ADGROUP_CRITERION":       29,
+	"BID_TOO_SMALL":                                         30,
+	"BID_TOO_BIG":                                           31,
+	"BID_TOO_MANY_FRACTIONAL_DIGITS":                        32,
+	"INVALID_DOMAIN_NAME":                                   33,
+	"NOT_COMPATIBLE_WITH_PAYMENT_MODE":                      34,
+	"NOT_COMPATIBLE_WITH_BUDGET_TYPE":                       35,
+	"NOT_COMPATIBLE_WITH_BIDDING_STRATEGY_TYPE":             36,
+	"BIDDING_STRATEGY_TYPE_INCOMPATIBLE_WITH_SHARED_BUDGET": 37,
+}
+
+func (x BiddingErrorEnum_BiddingError) String() string {
+	return proto.EnumName(BiddingErrorEnum_BiddingError_name, int32(x))
+}
+
+func (BiddingErrorEnum_BiddingError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2ffc4bcf5ba70861, []int{0, 0}
+}
+
+// Container for enum describing possible bidding errors.
+type BiddingErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BiddingErrorEnum) Reset()         { *m = BiddingErrorEnum{} }
+func (m *BiddingErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*BiddingErrorEnum) ProtoMessage()    {}
+func (*BiddingErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2ffc4bcf5ba70861, []int{0}
+}
+
+func (m *BiddingErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BiddingErrorEnum.Unmarshal(m, b)
+}
+func (m *BiddingErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BiddingErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *BiddingErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BiddingErrorEnum.Merge(m, src)
+}
+func (m *BiddingErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_BiddingErrorEnum.Size(m)
+}
+func (m *BiddingErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BiddingErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BiddingErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.BiddingErrorEnum_BiddingError", BiddingErrorEnum_BiddingError_name, BiddingErrorEnum_BiddingError_value)
+	proto.RegisterType((*BiddingErrorEnum)(nil), "google.ads.googleads.v3.errors.BiddingErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/bidding_error.proto", fileDescriptor_2ffc4bcf5ba70861)
+}
+
+var fileDescriptor_2ffc4bcf5ba70861 = []byte{
+	// 757 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x54, 0xed, 0x8e, 0xdb, 0x44,
+	0x14, 0x65, 0x17, 0x89, 0x56, 0x53, 0x3e, 0x66, 0xa7, 0x40, 0x61, 0x69, 0xb7, 0x6d, 0x5a, 0x84,
+	0xf8, 0xa8, 0x03, 0x8d, 0x00, 0xe1, 0xfe, 0xba, 0xf6, 0xcc, 0x3a, 0xa3, 0xd8, 0x33, 0xa3, 0x99,
+	0x71, 0x42, 0x50, 0xa4, 0x51, 0x4a, 0x56, 0x51, 0xa4, 0x36, 0x5e, 0xc5, 0x4b, 0x1f, 0x88, 0x9f,
+	0x3c, 0x0a, 0x6f, 0xc0, 0x2b, 0x20, 0xc4, 0x33, 0xa0, 0xf1, 0xc4, 0x21, 0x22, 0x5e, 0xfa, 0x2b,
+	0x37, 0x57, 0xe7, 0x9c, 0xeb, 0x73, 0x7d, 0x7c, 0xd1, 0xd3, 0x65, 0x55, 0x2d, 0x5f, 0x5c, 0xf4,
+	0xe7, 0x8b, 0xba, 0x1f, 0x4a, 0x5f, 0xbd, 0x1a, 0xf4, 0x2f, 0x36, 0x9b, 0x6a, 0x53, 0xf7, 0x9f,
+	0xaf, 0x16, 0x8b, 0xd5, 0x7a, 0xe9, 0x9a, 0xbf, 0xd1, 0xe5, 0xa6, 0xba, 0xaa, 0xc8, 0x59, 0x00,
+	0x46, 0xf3, 0x45, 0x1d, 0xed, 0x38, 0xd1, 0xab, 0x41, 0x14, 0x38, 0xa7, 0x77, 0x5b, 0xcd, 0xcb,
+	0x55, 0x7f, 0xbe, 0x5e, 0x57, 0x57, 0xf3, 0xab, 0x55, 0xb5, 0xae, 0x03, 0xbb, 0xf7, 0xf7, 0x4d,
+	0x84, 0x93, 0xa0, 0xca, 0x3c, 0x9e, 0xad, 0x7f, 0x79, 0xd9, 0xfb, 0xe3, 0x26, 0x7a, 0x7b, 0xbf,
+	0x49, 0xde, 0x43, 0xb7, 0x4a, 0x61, 0x14, 0x4b, 0xf9, 0x39, 0x67, 0x14, 0xbf, 0x41, 0x6e, 0xa1,
+	0x1b, 0xa5, 0x18, 0x09, 0x39, 0x11, 0xf8, 0x88, 0x7c, 0x89, 0x3e, 0x4b, 0x38, 0xa5, 0x5c, 0x64,
+	0xce, 0x58, 0x0d, 0x96, 0x65, 0x53, 0x67, 0x35, 0x08, 0xc3, 0x2d, 0x97, 0xc2, 0x09, 0x69, 0x1d,
+	0xe4, 0xb9, 0x9c, 0x30, 0x8a, 0x8f, 0x49, 0x84, 0xbe, 0x48, 0x41, 0x34, 0x3d, 0x6b, 0x21, 0x1d,
+	0xba, 0x43, 0xaa, 0x74, 0x29, 0x14, 0x0a, 0x78, 0x26, 0xf0, 0x0d, 0x2f, 0xce, 0xc5, 0x18, 0x72,
+	0x4e, 0x1d, 0x08, 0x29, 0xa6, 0x85, 0x2c, 0x4d, 0x07, 0x67, 0xaa, 0x18, 0x46, 0xe4, 0x21, 0xba,
+	0xd7, 0x82, 0xbb, 0x21, 0xef, 0x7a, 0x2b, 0x7b, 0x10, 0x7c, 0x42, 0x06, 0xa8, 0x7f, 0x80, 0x6d,
+	0x1e, 0x6f, 0x0c, 0x3c, 0x87, 0x24, 0x67, 0xee, 0x5c, 0x6a, 0x07, 0x69, 0x2a, 0x4b, 0x61, 0x83,
+	0x0a, 0x21, 0x8f, 0xd0, 0xfd, 0x54, 0x8a, 0x31, 0xd3, 0xc6, 0x3b, 0xb4, 0x1a, 0xd2, 0x91, 0x17,
+	0xf0, 0x3c, 0x26, 0x3c, 0x89, 0xe2, 0xdb, 0xe4, 0x14, 0x7d, 0x18, 0x1a, 0xb2, 0xcc, 0x86, 0xee,
+	0x5f, 0xbc, 0xc1, 0xef, 0x93, 0xaf, 0xd1, 0x57, 0xdb, 0x35, 0xa4, 0x9a, 0x81, 0x65, 0x3b, 0xcb,
+	0x6e, 0xc2, 0xed, 0xe1, 0x52, 0xf0, 0x07, 0x44, 0xa2, 0xd1, 0x96, 0x61, 0x41, 0x67, 0xcc, 0x7a,
+	0x41, 0xcb, 0x84, 0x75, 0x82, 0xd9, 0x89, 0xd4, 0x23, 0x27, 0x45, 0x3e, 0x0d, 0xec, 0x9d, 0x56,
+	0xce, 0xc6, 0x2c, 0x77, 0x4a, 0xaa, 0x43, 0xc1, 0x3b, 0xd7, 0x1a, 0x37, 0xa5, 0x52, 0x52, 0x5b,
+	0x46, 0x83, 0x18, 0x50, 0x67, 0xd2, 0x21, 0xa3, 0x65, 0xce, 0xf0, 0x47, 0xe4, 0x1b, 0xf4, 0x44,
+	0xc1, 0xd4, 0x29, 0xa6, 0xf7, 0x0c, 0x75, 0xec, 0x2b, 0x2d, 0x8d, 0x95, 0x05, 0xd3, 0xf8, 0x63,
+	0xf2, 0x14, 0x45, 0xd7, 0x51, 0x42, 0x2a, 0xc2, 0x9c, 0xd6, 0x95, 0x02, 0x7c, 0x4a, 0x62, 0xf4,
+	0x5d, 0xf7, 0x4b, 0xd9, 0x32, 0xfc, 0x08, 0xc3, 0x40, 0xa7, 0xc3, 0x60, 0xbb, 0x75, 0x6c, 0xf0,
+	0x27, 0xe4, 0x19, 0xfa, 0xfe, 0x35, 0xbe, 0xb8, 0x70, 0x54, 0xc3, 0xb9, 0x35, 0x4e, 0x6a, 0xc7,
+	0x7e, 0x54, 0x4c, 0xf3, 0x82, 0x09, 0x6b, 0xf0, 0x5d, 0xc2, 0x11, 0xeb, 0x4c, 0x8e, 0xa3, 0x92,
+	0x99, 0x7d, 0x19, 0xa7, 0xb4, 0xa4, 0x65, 0x1a, 0x12, 0xe1, 0x80, 0x66, 0x5a, 0x96, 0xca, 0xa5,
+	0x9a, 0x5b, 0xa6, 0xb9, 0x14, 0xf8, 0x1e, 0x39, 0x41, 0xef, 0x24, 0x9c, 0x3a, 0x2b, 0xa5, 0x33,
+	0x05, 0xe4, 0x39, 0x3e, 0xf3, 0xe1, 0x6b, 0x5b, 0x09, 0xcf, 0xf0, 0x7d, 0xd2, 0x43, 0x67, 0x6d,
+	0xa3, 0x00, 0x31, 0x75, 0xe7, 0x1a, 0x52, 0xff, 0xd1, 0x40, 0xee, 0x28, 0xcf, 0xb8, 0x35, 0xf8,
+	0x01, 0xb9, 0x83, 0x6e, 0xb7, 0x89, 0xa5, 0xb2, 0x00, 0x2e, 0x9c, 0x80, 0x82, 0xe1, 0x87, 0xe4,
+	0x31, 0x7a, 0xd0, 0x04, 0x48, 0x16, 0x0a, 0x2c, 0xf7, 0x9b, 0x6f, 0x16, 0xa9, 0x60, 0xea, 0xdd,
+	0xb8, 0x42, 0x52, 0x86, 0x7b, 0x3e, 0xaa, 0x5d, 0xa8, 0xa4, 0xa4, 0x7e, 0xdd, 0x4d, 0x9e, 0x1f,
+	0x91, 0x27, 0xe8, 0xf3, 0x4e, 0x50, 0xe7, 0x47, 0xf4, 0x98, 0xfc, 0x80, 0xbe, 0xed, 0xde, 0x12,
+	0x17, 0xff, 0x95, 0x30, 0x43, 0xd0, 0x8c, 0x6e, 0xc7, 0xe1, 0x4f, 0x93, 0xbf, 0x8e, 0x50, 0xef,
+	0xe7, 0xea, 0x65, 0xf4, 0xff, 0x57, 0x2b, 0x39, 0xd9, 0xbf, 0x3f, 0xca, 0x9f, 0x2a, 0x75, 0xf4,
+	0x13, 0xdd, 0x92, 0x96, 0xd5, 0x8b, 0xf9, 0x7a, 0x19, 0x55, 0x9b, 0x65, 0x7f, 0x79, 0xb1, 0x6e,
+	0x0e, 0x59, 0x7b, 0x2e, 0x2f, 0x57, 0xf5, 0x75, 0xd7, 0xf3, 0x59, 0xf8, 0xf9, 0xf5, 0xf8, 0xcd,
+	0x0c, 0xe0, 0xb7, 0xe3, 0xb3, 0x2c, 0x88, 0xc1, 0xa2, 0x8e, 0x42, 0xe9, 0xab, 0xf1, 0x20, 0x6a,
+	0x46, 0xd6, 0xbf, 0xb7, 0x80, 0x19, 0x2c, 0xea, 0xd9, 0x0e, 0x30, 0x1b, 0x0f, 0x66, 0x01, 0xf0,
+	0xe7, 0x71, 0x2f, 0x74, 0xe3, 0x18, 0x16, 0x75, 0x1c, 0xef, 0x20, 0x71, 0x3c, 0x1e, 0xc4, 0x71,
+	0x00, 0x3d, 0x7f, 0xab, 0x79, 0xba, 0xc1, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x44, 0x79, 0x4b,
+	0x02, 0xda, 0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/bidding_strategy_error.pb.go b/googleapis/ads/googleads/v3/errors/bidding_strategy_error.pb.go
new file mode 100644
index 0000000..884f43e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/bidding_strategy_error.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/bidding_strategy_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible bidding strategy errors.
+type BiddingStrategyErrorEnum_BiddingStrategyError int32
+
+const (
+	// Enum unspecified.
+	BiddingStrategyErrorEnum_UNSPECIFIED BiddingStrategyErrorEnum_BiddingStrategyError = 0
+	// The received error code is not known in this version.
+	BiddingStrategyErrorEnum_UNKNOWN BiddingStrategyErrorEnum_BiddingStrategyError = 1
+	// Each bidding strategy must have a unique name.
+	BiddingStrategyErrorEnum_DUPLICATE_NAME BiddingStrategyErrorEnum_BiddingStrategyError = 2
+	// Bidding strategy type is immutable.
+	BiddingStrategyErrorEnum_CANNOT_CHANGE_BIDDING_STRATEGY_TYPE BiddingStrategyErrorEnum_BiddingStrategyError = 3
+	// Only bidding strategies not linked to campaigns, adgroups or adgroup
+	// criteria can be removed.
+	BiddingStrategyErrorEnum_CANNOT_REMOVE_ASSOCIATED_STRATEGY BiddingStrategyErrorEnum_BiddingStrategyError = 4
+	// The specified bidding strategy is not supported.
+	BiddingStrategyErrorEnum_BIDDING_STRATEGY_NOT_SUPPORTED BiddingStrategyErrorEnum_BiddingStrategyError = 5
+	// The bidding strategy is incompatible with the campaign's bidding
+	// strategy goal type.
+	BiddingStrategyErrorEnum_INCOMPATIBLE_BIDDING_STRATEGY_AND_BIDDING_STRATEGY_GOAL_TYPE BiddingStrategyErrorEnum_BiddingStrategyError = 6
+)
+
+var BiddingStrategyErrorEnum_BiddingStrategyError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DUPLICATE_NAME",
+	3: "CANNOT_CHANGE_BIDDING_STRATEGY_TYPE",
+	4: "CANNOT_REMOVE_ASSOCIATED_STRATEGY",
+	5: "BIDDING_STRATEGY_NOT_SUPPORTED",
+	6: "INCOMPATIBLE_BIDDING_STRATEGY_AND_BIDDING_STRATEGY_GOAL_TYPE",
+}
+
+var BiddingStrategyErrorEnum_BiddingStrategyError_value = map[string]int32{
+	"UNSPECIFIED":                         0,
+	"UNKNOWN":                             1,
+	"DUPLICATE_NAME":                      2,
+	"CANNOT_CHANGE_BIDDING_STRATEGY_TYPE": 3,
+	"CANNOT_REMOVE_ASSOCIATED_STRATEGY":   4,
+	"BIDDING_STRATEGY_NOT_SUPPORTED":      5,
+	"INCOMPATIBLE_BIDDING_STRATEGY_AND_BIDDING_STRATEGY_GOAL_TYPE": 6,
+}
+
+func (x BiddingStrategyErrorEnum_BiddingStrategyError) String() string {
+	return proto.EnumName(BiddingStrategyErrorEnum_BiddingStrategyError_name, int32(x))
+}
+
+func (BiddingStrategyErrorEnum_BiddingStrategyError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_49aa3f7c85e9c4bd, []int{0, 0}
+}
+
+// Container for enum describing possible bidding strategy errors.
+type BiddingStrategyErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BiddingStrategyErrorEnum) Reset()         { *m = BiddingStrategyErrorEnum{} }
+func (m *BiddingStrategyErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*BiddingStrategyErrorEnum) ProtoMessage()    {}
+func (*BiddingStrategyErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_49aa3f7c85e9c4bd, []int{0}
+}
+
+func (m *BiddingStrategyErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BiddingStrategyErrorEnum.Unmarshal(m, b)
+}
+func (m *BiddingStrategyErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BiddingStrategyErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *BiddingStrategyErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BiddingStrategyErrorEnum.Merge(m, src)
+}
+func (m *BiddingStrategyErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_BiddingStrategyErrorEnum.Size(m)
+}
+func (m *BiddingStrategyErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BiddingStrategyErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BiddingStrategyErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.BiddingStrategyErrorEnum_BiddingStrategyError", BiddingStrategyErrorEnum_BiddingStrategyError_name, BiddingStrategyErrorEnum_BiddingStrategyError_value)
+	proto.RegisterType((*BiddingStrategyErrorEnum)(nil), "google.ads.googleads.v3.errors.BiddingStrategyErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/bidding_strategy_error.proto", fileDescriptor_49aa3f7c85e9c4bd)
+}
+
+var fileDescriptor_49aa3f7c85e9c4bd = []byte{
+	// 408 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x8b, 0xd4, 0x30,
+	0x1c, 0xc5, 0x9d, 0xae, 0xae, 0x90, 0x05, 0x2d, 0xc1, 0x83, 0x8a, 0x0c, 0x58, 0x11, 0x6f, 0xe9,
+	0xa1, 0xb7, 0xac, 0x07, 0xd3, 0x26, 0xd6, 0xe0, 0x4c, 0x1a, 0xa6, 0x99, 0x91, 0x95, 0x81, 0xd0,
+	0xb5, 0x43, 0x28, 0xec, 0x36, 0x43, 0x53, 0x17, 0xfc, 0x2c, 0xde, 0x3c, 0xfa, 0x51, 0xfc, 0x28,
+	0x9e, 0x3d, 0x8b, 0x74, 0x32, 0xd3, 0xcb, 0x8e, 0x7b, 0xea, 0xe3, 0xdf, 0xf7, 0x7b, 0xf9, 0xf3,
+	0xfe, 0xe0, 0xdc, 0x58, 0x6b, 0xae, 0x36, 0x71, 0x55, 0xbb, 0xd8, 0xcb, 0x41, 0xdd, 0x24, 0xf1,
+	0xa6, 0xeb, 0x6c, 0xe7, 0xe2, 0xcb, 0xa6, 0xae, 0x9b, 0xd6, 0x68, 0xd7, 0x77, 0x55, 0xbf, 0x31,
+	0xdf, 0xf4, 0x6e, 0x8e, 0xb6, 0x9d, 0xed, 0x2d, 0x9c, 0x7a, 0x02, 0x55, 0xb5, 0x43, 0x23, 0x8c,
+	0x6e, 0x12, 0xe4, 0xe1, 0xe7, 0x2f, 0x0e, 0xe1, 0xdb, 0x26, 0xae, 0xda, 0xd6, 0xf6, 0x55, 0xdf,
+	0xd8, 0xd6, 0x79, 0x3a, 0xfa, 0x1e, 0x80, 0xa7, 0xa9, 0x8f, 0x2f, 0xf7, 0xe9, 0x6c, 0xe0, 0x58,
+	0xfb, 0xf5, 0x3a, 0xfa, 0x3b, 0x01, 0x4f, 0x8e, 0xfd, 0x84, 0x8f, 0xc1, 0xd9, 0x52, 0x94, 0x92,
+	0x65, 0xfc, 0x3d, 0x67, 0x34, 0xbc, 0x07, 0xcf, 0xc0, 0xc3, 0xa5, 0xf8, 0x28, 0x8a, 0x4f, 0x22,
+	0x9c, 0x40, 0x08, 0x1e, 0xd1, 0xa5, 0x9c, 0xf1, 0x8c, 0x28, 0xa6, 0x05, 0x99, 0xb3, 0x30, 0x80,
+	0x6f, 0xc0, 0xab, 0x8c, 0x08, 0x51, 0x28, 0x9d, 0x7d, 0x20, 0x22, 0x67, 0x3a, 0xe5, 0x94, 0x72,
+	0x91, 0xeb, 0x52, 0x2d, 0x88, 0x62, 0xf9, 0x85, 0x56, 0x17, 0x92, 0x85, 0x27, 0xf0, 0x35, 0x78,
+	0xb9, 0x37, 0x2e, 0xd8, 0xbc, 0x58, 0x31, 0x4d, 0xca, 0xb2, 0xc8, 0x38, 0x51, 0x8c, 0x8e, 0xde,
+	0xf0, 0x3e, 0x8c, 0xc0, 0xf4, 0x56, 0xc2, 0x00, 0x95, 0x4b, 0x29, 0x8b, 0x85, 0x62, 0x34, 0x7c,
+	0x00, 0xdf, 0x81, 0xb7, 0x5c, 0x64, 0xc5, 0x5c, 0x12, 0xc5, 0xd3, 0xd9, 0x91, 0x27, 0x89, 0xa0,
+	0xb7, 0x87, 0x79, 0x41, 0x66, 0x7e, 0x99, 0xd3, 0xf4, 0xcf, 0x04, 0x44, 0x5f, 0xec, 0x35, 0xba,
+	0xbb, 0xe2, 0xf4, 0xd9, 0xb1, 0x92, 0xe4, 0xd0, 0xaf, 0x9c, 0x7c, 0xa6, 0x7b, 0xd8, 0xd8, 0xab,
+	0xaa, 0x35, 0xc8, 0x76, 0x26, 0x36, 0x9b, 0x76, 0xd7, 0xfe, 0xe1, 0xd8, 0xdb, 0xc6, 0xfd, 0xef,
+	0xf6, 0xe7, 0xfe, 0xf3, 0x23, 0x38, 0xc9, 0x09, 0xf9, 0x19, 0x4c, 0x73, 0x1f, 0x46, 0x6a, 0x87,
+	0xbc, 0x1c, 0xd4, 0x2a, 0x41, 0xbb, 0x27, 0xdd, 0xaf, 0x83, 0x61, 0x4d, 0x6a, 0xb7, 0x1e, 0x0d,
+	0xeb, 0x55, 0xb2, 0xf6, 0x86, 0xdf, 0x41, 0xe4, 0xa7, 0x18, 0x93, 0xda, 0x61, 0x3c, 0x5a, 0x30,
+	0x5e, 0x25, 0x18, 0x7b, 0xd3, 0xe5, 0xe9, 0x6e, 0xbb, 0xe4, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x32, 0xa5, 0x19, 0xbf, 0x98, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/billing_setup_error.pb.go b/googleapis/ads/googleads/v3/errors/billing_setup_error.pb.go
new file mode 100644
index 0000000..f813492
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/billing_setup_error.pb.go
@@ -0,0 +1,213 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/billing_setup_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible billing setup errors.
+type BillingSetupErrorEnum_BillingSetupError int32
+
+const (
+	// Enum unspecified.
+	BillingSetupErrorEnum_UNSPECIFIED BillingSetupErrorEnum_BillingSetupError = 0
+	// The received error code is not known in this version.
+	BillingSetupErrorEnum_UNKNOWN BillingSetupErrorEnum_BillingSetupError = 1
+	// Cannot specify both an existing payments account and a new payments
+	// account when setting up billing.
+	BillingSetupErrorEnum_CANNOT_USE_EXISTING_AND_NEW_ACCOUNT BillingSetupErrorEnum_BillingSetupError = 2
+	// Cannot cancel an approved billing setup whose start time has passed.
+	BillingSetupErrorEnum_CANNOT_REMOVE_STARTED_BILLING_SETUP BillingSetupErrorEnum_BillingSetupError = 3
+	// Cannot perform a Change of Bill-To (CBT) to the same payments account.
+	BillingSetupErrorEnum_CANNOT_CHANGE_BILLING_TO_SAME_PAYMENTS_ACCOUNT BillingSetupErrorEnum_BillingSetupError = 4
+	// Billing setups can only be used by customers with ENABLED or DRAFT
+	// status.
+	BillingSetupErrorEnum_BILLING_SETUP_NOT_PERMITTED_FOR_CUSTOMER_STATUS BillingSetupErrorEnum_BillingSetupError = 5
+	// Billing setups must either include a correctly formatted existing
+	// payments account id, or a non-empty new payments account name.
+	BillingSetupErrorEnum_INVALID_PAYMENTS_ACCOUNT BillingSetupErrorEnum_BillingSetupError = 6
+	// Only billable and third-party customers can create billing setups.
+	BillingSetupErrorEnum_BILLING_SETUP_NOT_PERMITTED_FOR_CUSTOMER_CATEGORY BillingSetupErrorEnum_BillingSetupError = 7
+	// Billing setup creations can only use NOW for start time type.
+	BillingSetupErrorEnum_INVALID_START_TIME_TYPE BillingSetupErrorEnum_BillingSetupError = 8
+	// Billing setups can only be created for a third-party customer if they do
+	// not already have a setup.
+	BillingSetupErrorEnum_THIRD_PARTY_ALREADY_HAS_BILLING BillingSetupErrorEnum_BillingSetupError = 9
+	// Billing setups cannot be created if there is already a pending billing in
+	// progress.
+	BillingSetupErrorEnum_BILLING_SETUP_IN_PROGRESS BillingSetupErrorEnum_BillingSetupError = 10
+	// Billing setups can only be created by customers who have permission to
+	// setup billings. Users can contact a representative for help setting up
+	// permissions.
+	BillingSetupErrorEnum_NO_SIGNUP_PERMISSION BillingSetupErrorEnum_BillingSetupError = 11
+	// Billing setups cannot be created if there is already a future-approved
+	// billing.
+	BillingSetupErrorEnum_CHANGE_OF_BILL_TO_IN_PROGRESS BillingSetupErrorEnum_BillingSetupError = 12
+	// Requested payments profile not found.
+	BillingSetupErrorEnum_PAYMENTS_PROFILE_NOT_FOUND BillingSetupErrorEnum_BillingSetupError = 13
+	// Requested payments account not found.
+	BillingSetupErrorEnum_PAYMENTS_ACCOUNT_NOT_FOUND BillingSetupErrorEnum_BillingSetupError = 14
+	// Billing setup creation failed because the payments profile is ineligible.
+	BillingSetupErrorEnum_PAYMENTS_PROFILE_INELIGIBLE BillingSetupErrorEnum_BillingSetupError = 15
+	// Billing setup creation failed because the payments account is ineligible.
+	BillingSetupErrorEnum_PAYMENTS_ACCOUNT_INELIGIBLE BillingSetupErrorEnum_BillingSetupError = 16
+	// Billing setup creation failed because the payments profile needs internal
+	// approval.
+	BillingSetupErrorEnum_CUSTOMER_NEEDS_INTERNAL_APPROVAL BillingSetupErrorEnum_BillingSetupError = 17
+	// Payments account has different currency code than the current customer
+	// and hence cannot be used to setup billing.
+	BillingSetupErrorEnum_PAYMENTS_ACCOUNT_INELIGIBLE_CURRENCY_CODE_MISMATCH BillingSetupErrorEnum_BillingSetupError = 19
+)
+
+var BillingSetupErrorEnum_BillingSetupError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "CANNOT_USE_EXISTING_AND_NEW_ACCOUNT",
+	3:  "CANNOT_REMOVE_STARTED_BILLING_SETUP",
+	4:  "CANNOT_CHANGE_BILLING_TO_SAME_PAYMENTS_ACCOUNT",
+	5:  "BILLING_SETUP_NOT_PERMITTED_FOR_CUSTOMER_STATUS",
+	6:  "INVALID_PAYMENTS_ACCOUNT",
+	7:  "BILLING_SETUP_NOT_PERMITTED_FOR_CUSTOMER_CATEGORY",
+	8:  "INVALID_START_TIME_TYPE",
+	9:  "THIRD_PARTY_ALREADY_HAS_BILLING",
+	10: "BILLING_SETUP_IN_PROGRESS",
+	11: "NO_SIGNUP_PERMISSION",
+	12: "CHANGE_OF_BILL_TO_IN_PROGRESS",
+	13: "PAYMENTS_PROFILE_NOT_FOUND",
+	14: "PAYMENTS_ACCOUNT_NOT_FOUND",
+	15: "PAYMENTS_PROFILE_INELIGIBLE",
+	16: "PAYMENTS_ACCOUNT_INELIGIBLE",
+	17: "CUSTOMER_NEEDS_INTERNAL_APPROVAL",
+	19: "PAYMENTS_ACCOUNT_INELIGIBLE_CURRENCY_CODE_MISMATCH",
+}
+
+var BillingSetupErrorEnum_BillingSetupError_value = map[string]int32{
+	"UNSPECIFIED":                                        0,
+	"UNKNOWN":                                            1,
+	"CANNOT_USE_EXISTING_AND_NEW_ACCOUNT":                2,
+	"CANNOT_REMOVE_STARTED_BILLING_SETUP":                3,
+	"CANNOT_CHANGE_BILLING_TO_SAME_PAYMENTS_ACCOUNT":     4,
+	"BILLING_SETUP_NOT_PERMITTED_FOR_CUSTOMER_STATUS":    5,
+	"INVALID_PAYMENTS_ACCOUNT":                           6,
+	"BILLING_SETUP_NOT_PERMITTED_FOR_CUSTOMER_CATEGORY":  7,
+	"INVALID_START_TIME_TYPE":                            8,
+	"THIRD_PARTY_ALREADY_HAS_BILLING":                    9,
+	"BILLING_SETUP_IN_PROGRESS":                          10,
+	"NO_SIGNUP_PERMISSION":                               11,
+	"CHANGE_OF_BILL_TO_IN_PROGRESS":                      12,
+	"PAYMENTS_PROFILE_NOT_FOUND":                         13,
+	"PAYMENTS_ACCOUNT_NOT_FOUND":                         14,
+	"PAYMENTS_PROFILE_INELIGIBLE":                        15,
+	"PAYMENTS_ACCOUNT_INELIGIBLE":                        16,
+	"CUSTOMER_NEEDS_INTERNAL_APPROVAL":                   17,
+	"PAYMENTS_ACCOUNT_INELIGIBLE_CURRENCY_CODE_MISMATCH": 19,
+}
+
+func (x BillingSetupErrorEnum_BillingSetupError) String() string {
+	return proto.EnumName(BillingSetupErrorEnum_BillingSetupError_name, int32(x))
+}
+
+func (BillingSetupErrorEnum_BillingSetupError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ad919e3bbb1ef52f, []int{0, 0}
+}
+
+// Container for enum describing possible billing setup errors.
+type BillingSetupErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BillingSetupErrorEnum) Reset()         { *m = BillingSetupErrorEnum{} }
+func (m *BillingSetupErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*BillingSetupErrorEnum) ProtoMessage()    {}
+func (*BillingSetupErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ad919e3bbb1ef52f, []int{0}
+}
+
+func (m *BillingSetupErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BillingSetupErrorEnum.Unmarshal(m, b)
+}
+func (m *BillingSetupErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BillingSetupErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *BillingSetupErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BillingSetupErrorEnum.Merge(m, src)
+}
+func (m *BillingSetupErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_BillingSetupErrorEnum.Size(m)
+}
+func (m *BillingSetupErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_BillingSetupErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BillingSetupErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.BillingSetupErrorEnum_BillingSetupError", BillingSetupErrorEnum_BillingSetupError_name, BillingSetupErrorEnum_BillingSetupError_value)
+	proto.RegisterType((*BillingSetupErrorEnum)(nil), "google.ads.googleads.v3.errors.BillingSetupErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/billing_setup_error.proto", fileDescriptor_ad919e3bbb1ef52f)
+}
+
+var fileDescriptor_ad919e3bbb1ef52f = []byte{
+	// 617 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xcf, 0x6e, 0xd3, 0x4a,
+	0x14, 0xc6, 0x6f, 0xd3, 0xdb, 0xf6, 0xde, 0x29, 0xd0, 0xe9, 0xf0, 0xaf, 0xf4, 0x2f, 0xa4, 0x48,
+	0xec, 0x1c, 0xd1, 0x08, 0x84, 0xcc, 0x6a, 0x62, 0x9f, 0x38, 0x23, 0xec, 0x19, 0x6b, 0x66, 0x9c,
+	0x12, 0x14, 0x69, 0x94, 0x92, 0x28, 0x8a, 0x94, 0xda, 0x51, 0x9c, 0xf6, 0x81, 0x58, 0xf2, 0x12,
+	0xec, 0x79, 0x03, 0x5e, 0x81, 0x1d, 0x6f, 0x80, 0x6c, 0x27, 0x56, 0xa2, 0x88, 0x8a, 0x95, 0x8f,
+	0x66, 0xbe, 0xef, 0x77, 0xe6, 0x1c, 0xf9, 0x43, 0xef, 0x86, 0x49, 0x32, 0x1c, 0x0f, 0x6a, 0xbd,
+	0x7e, 0x5a, 0x2b, 0xca, 0xac, 0xba, 0xad, 0xd7, 0x06, 0xd3, 0x69, 0x32, 0x4d, 0x6b, 0x57, 0xa3,
+	0xf1, 0x78, 0x14, 0x0f, 0x4d, 0x3a, 0x98, 0xdd, 0x4c, 0x4c, 0x7e, 0x68, 0x4d, 0xa6, 0xc9, 0x2c,
+	0x21, 0xa7, 0x85, 0xdc, 0xea, 0xf5, 0x53, 0xab, 0x74, 0x5a, 0xb7, 0x75, 0xab, 0x70, 0x1e, 0x1e,
+	0x2f, 0xc8, 0x93, 0x51, 0xad, 0x17, 0xc7, 0xc9, 0xac, 0x37, 0x1b, 0x25, 0x71, 0x5a, 0xb8, 0xab,
+	0x3f, 0xb6, 0xd0, 0xe3, 0x46, 0xc1, 0x56, 0x19, 0x1a, 0x32, 0x13, 0xc4, 0x37, 0xd7, 0xd5, 0x6f,
+	0x5b, 0x68, 0x7f, 0xed, 0x86, 0xec, 0xa1, 0xdd, 0x88, 0xab, 0x10, 0x1c, 0xd6, 0x64, 0xe0, 0xe2,
+	0x7f, 0xc8, 0x2e, 0xda, 0x89, 0xf8, 0x07, 0x2e, 0x2e, 0x39, 0xde, 0x20, 0xaf, 0xd0, 0xb9, 0x43,
+	0x39, 0x17, 0xda, 0x44, 0x0a, 0x0c, 0x7c, 0x64, 0x4a, 0x33, 0xee, 0x19, 0xca, 0x5d, 0xc3, 0xe1,
+	0xd2, 0x50, 0xc7, 0x11, 0x11, 0xd7, 0xb8, 0xb2, 0x24, 0x94, 0x10, 0x88, 0x36, 0x18, 0xa5, 0xa9,
+	0xd4, 0xe0, 0x9a, 0x06, 0xf3, 0xfd, 0xcc, 0xa2, 0x40, 0x47, 0x21, 0xde, 0x24, 0x17, 0xc8, 0x9a,
+	0x0b, 0x9d, 0x16, 0xe5, 0x1e, 0x94, 0x02, 0x2d, 0x8c, 0xa2, 0x01, 0x98, 0x90, 0x76, 0x02, 0xe0,
+	0x5a, 0x95, 0xf0, 0x7f, 0x49, 0x1d, 0xd5, 0x56, 0x30, 0x26, 0xb3, 0x87, 0x20, 0x03, 0xa6, 0xb3,
+	0x16, 0x4d, 0x21, 0x8d, 0x13, 0x29, 0x2d, 0x02, 0x90, 0x59, 0x5f, 0x1d, 0x29, 0xbc, 0x45, 0x8e,
+	0xd1, 0x01, 0xe3, 0x6d, 0xea, 0x33, 0x77, 0x1d, 0xb9, 0x4d, 0xde, 0xa0, 0xd7, 0x7f, 0x8d, 0x74,
+	0xa8, 0x06, 0x4f, 0xc8, 0x0e, 0xde, 0x21, 0x47, 0xe8, 0xe9, 0x02, 0x9a, 0x0f, 0x68, 0x34, 0x0b,
+	0xc0, 0xe8, 0x4e, 0x08, 0xf8, 0x3f, 0x72, 0x8e, 0xce, 0x74, 0x8b, 0xc9, 0xac, 0x9f, 0xd4, 0x1d,
+	0x43, 0x7d, 0x09, 0xd4, 0xed, 0x98, 0x16, 0x55, 0x8b, 0x21, 0xf1, 0xff, 0xe4, 0x04, 0x3d, 0x5b,
+	0x6d, 0xcc, 0xb8, 0x09, 0xa5, 0xf0, 0x24, 0x28, 0x85, 0x11, 0x39, 0x40, 0x8f, 0xb8, 0x30, 0x8a,
+	0x79, 0x3c, 0x0a, 0x8b, 0xf7, 0x28, 0xc5, 0x04, 0xc7, 0xbb, 0xe4, 0x05, 0x3a, 0x99, 0x6f, 0x4c,
+	0x34, 0x73, 0x5e, 0xb6, 0xb1, 0x65, 0xf3, 0x3d, 0x72, 0x8a, 0x0e, 0xcb, 0x51, 0x43, 0x29, 0x9a,
+	0xcc, 0x87, 0x7c, 0xae, 0xa6, 0x88, 0xb8, 0x8b, 0xef, 0xaf, 0xdc, 0xcf, 0x57, 0xb1, 0x74, 0xff,
+	0x80, 0x9c, 0xa1, 0xa3, 0x35, 0x3f, 0xe3, 0xe0, 0x33, 0x8f, 0x35, 0x7c, 0xc0, 0x7b, 0x2b, 0x82,
+	0x05, 0x60, 0x49, 0x80, 0xc9, 0x4b, 0xf4, 0xbc, 0x5c, 0x1b, 0x07, 0x70, 0x95, 0x61, 0x5c, 0x83,
+	0xe4, 0xd4, 0x37, 0x34, 0x0c, 0xa5, 0x68, 0x53, 0x1f, 0xef, 0x93, 0xb7, 0xe8, 0xe2, 0x0e, 0x8c,
+	0x71, 0x22, 0x29, 0x81, 0x3b, 0x1d, 0xe3, 0x08, 0x17, 0x4c, 0xc0, 0x54, 0x40, 0xb5, 0xd3, 0xc2,
+	0x0f, 0x1b, 0xbf, 0x36, 0x50, 0xf5, 0x73, 0x72, 0x6d, 0xdd, 0x1d, 0x90, 0xc6, 0x93, 0xb5, 0xbf,
+	0x3c, 0xcc, 0xa2, 0x11, 0x6e, 0x7c, 0x72, 0xe7, 0xce, 0x61, 0x32, 0xee, 0xc5, 0x43, 0x2b, 0x99,
+	0x0e, 0x6b, 0xc3, 0x41, 0x9c, 0x07, 0x67, 0x11, 0xd2, 0xc9, 0x28, 0xfd, 0x53, 0x66, 0xdf, 0x17,
+	0x9f, 0x2f, 0x95, 0x4d, 0x8f, 0xd2, 0xaf, 0x95, 0x53, 0xaf, 0x80, 0xd1, 0x7e, 0x6a, 0x15, 0x65,
+	0x56, 0xb5, 0xeb, 0x56, 0xde, 0x32, 0xfd, 0xbe, 0x10, 0x74, 0x69, 0x3f, 0xed, 0x96, 0x82, 0x6e,
+	0xbb, 0xde, 0x2d, 0x04, 0x3f, 0x2b, 0xd5, 0xe2, 0xd4, 0xb6, 0x69, 0x3f, 0xb5, 0xed, 0x52, 0x62,
+	0xdb, 0xed, 0xba, 0x6d, 0x17, 0xa2, 0xab, 0xed, 0xfc, 0x75, 0xf5, 0xdf, 0x01, 0x00, 0x00, 0xff,
+	0xff, 0x57, 0xfb, 0xa3, 0xfd, 0x50, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/campaign_budget_error.pb.go b/googleapis/ads/googleads/v3/errors/campaign_budget_error.pb.go
new file mode 100644
index 0000000..85c0f71
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/campaign_budget_error.pb.go
@@ -0,0 +1,198 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/campaign_budget_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible campaign budget errors.
+type CampaignBudgetErrorEnum_CampaignBudgetError int32
+
+const (
+	// Enum unspecified.
+	CampaignBudgetErrorEnum_UNSPECIFIED CampaignBudgetErrorEnum_CampaignBudgetError = 0
+	// The received error code is not known in this version.
+	CampaignBudgetErrorEnum_UNKNOWN CampaignBudgetErrorEnum_CampaignBudgetError = 1
+	// The campaign budget cannot be shared.
+	CampaignBudgetErrorEnum_CAMPAIGN_BUDGET_CANNOT_BE_SHARED CampaignBudgetErrorEnum_CampaignBudgetError = 17
+	// The requested campaign budget no longer exists.
+	CampaignBudgetErrorEnum_CAMPAIGN_BUDGET_REMOVED CampaignBudgetErrorEnum_CampaignBudgetError = 2
+	// The campaign budget is associated with at least one campaign, and so the
+	// campaign budget cannot be removed.
+	CampaignBudgetErrorEnum_CAMPAIGN_BUDGET_IN_USE CampaignBudgetErrorEnum_CampaignBudgetError = 3
+	// Customer is not whitelisted for this campaign budget period.
+	CampaignBudgetErrorEnum_CAMPAIGN_BUDGET_PERIOD_NOT_AVAILABLE CampaignBudgetErrorEnum_CampaignBudgetError = 4
+	// This field is not mutable on implicitly shared campaign budgets
+	CampaignBudgetErrorEnum_CANNOT_MODIFY_FIELD_OF_IMPLICITLY_SHARED_CAMPAIGN_BUDGET CampaignBudgetErrorEnum_CampaignBudgetError = 6
+	// Cannot change explicitly shared campaign budgets back to implicitly
+	// shared ones.
+	CampaignBudgetErrorEnum_CANNOT_UPDATE_CAMPAIGN_BUDGET_TO_IMPLICITLY_SHARED CampaignBudgetErrorEnum_CampaignBudgetError = 7
+	// An implicit campaign budget without a name cannot be changed to
+	// explicitly shared campaign budget.
+	CampaignBudgetErrorEnum_CANNOT_UPDATE_CAMPAIGN_BUDGET_TO_EXPLICITLY_SHARED_WITHOUT_NAME CampaignBudgetErrorEnum_CampaignBudgetError = 8
+	// Cannot change an implicitly shared campaign budget to an explicitly
+	// shared one.
+	CampaignBudgetErrorEnum_CANNOT_UPDATE_CAMPAIGN_BUDGET_TO_EXPLICITLY_SHARED CampaignBudgetErrorEnum_CampaignBudgetError = 9
+	// Only explicitly shared campaign budgets can be used with multiple
+	// campaigns.
+	CampaignBudgetErrorEnum_CANNOT_USE_IMPLICITLY_SHARED_CAMPAIGN_BUDGET_WITH_MULTIPLE_CAMPAIGNS CampaignBudgetErrorEnum_CampaignBudgetError = 10
+	// A campaign budget with this name already exists.
+	CampaignBudgetErrorEnum_DUPLICATE_NAME CampaignBudgetErrorEnum_CampaignBudgetError = 11
+	// A money amount was not in the expected currency.
+	CampaignBudgetErrorEnum_MONEY_AMOUNT_IN_WRONG_CURRENCY CampaignBudgetErrorEnum_CampaignBudgetError = 12
+	// A money amount was less than the minimum CPC for currency.
+	CampaignBudgetErrorEnum_MONEY_AMOUNT_LESS_THAN_CURRENCY_MINIMUM_CPC CampaignBudgetErrorEnum_CampaignBudgetError = 13
+	// A money amount was greater than the maximum allowed.
+	CampaignBudgetErrorEnum_MONEY_AMOUNT_TOO_LARGE CampaignBudgetErrorEnum_CampaignBudgetError = 14
+	// A money amount was negative.
+	CampaignBudgetErrorEnum_NEGATIVE_MONEY_AMOUNT CampaignBudgetErrorEnum_CampaignBudgetError = 15
+	// A money amount was not a multiple of a minimum unit.
+	CampaignBudgetErrorEnum_NON_MULTIPLE_OF_MINIMUM_CURRENCY_UNIT CampaignBudgetErrorEnum_CampaignBudgetError = 16
+)
+
+var CampaignBudgetErrorEnum_CampaignBudgetError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	17: "CAMPAIGN_BUDGET_CANNOT_BE_SHARED",
+	2:  "CAMPAIGN_BUDGET_REMOVED",
+	3:  "CAMPAIGN_BUDGET_IN_USE",
+	4:  "CAMPAIGN_BUDGET_PERIOD_NOT_AVAILABLE",
+	6:  "CANNOT_MODIFY_FIELD_OF_IMPLICITLY_SHARED_CAMPAIGN_BUDGET",
+	7:  "CANNOT_UPDATE_CAMPAIGN_BUDGET_TO_IMPLICITLY_SHARED",
+	8:  "CANNOT_UPDATE_CAMPAIGN_BUDGET_TO_EXPLICITLY_SHARED_WITHOUT_NAME",
+	9:  "CANNOT_UPDATE_CAMPAIGN_BUDGET_TO_EXPLICITLY_SHARED",
+	10: "CANNOT_USE_IMPLICITLY_SHARED_CAMPAIGN_BUDGET_WITH_MULTIPLE_CAMPAIGNS",
+	11: "DUPLICATE_NAME",
+	12: "MONEY_AMOUNT_IN_WRONG_CURRENCY",
+	13: "MONEY_AMOUNT_LESS_THAN_CURRENCY_MINIMUM_CPC",
+	14: "MONEY_AMOUNT_TOO_LARGE",
+	15: "NEGATIVE_MONEY_AMOUNT",
+	16: "NON_MULTIPLE_OF_MINIMUM_CURRENCY_UNIT",
+}
+
+var CampaignBudgetErrorEnum_CampaignBudgetError_value = map[string]int32{
+	"UNSPECIFIED":                          0,
+	"UNKNOWN":                              1,
+	"CAMPAIGN_BUDGET_CANNOT_BE_SHARED":     17,
+	"CAMPAIGN_BUDGET_REMOVED":              2,
+	"CAMPAIGN_BUDGET_IN_USE":               3,
+	"CAMPAIGN_BUDGET_PERIOD_NOT_AVAILABLE": 4,
+	"CANNOT_MODIFY_FIELD_OF_IMPLICITLY_SHARED_CAMPAIGN_BUDGET":             6,
+	"CANNOT_UPDATE_CAMPAIGN_BUDGET_TO_IMPLICITLY_SHARED":                   7,
+	"CANNOT_UPDATE_CAMPAIGN_BUDGET_TO_EXPLICITLY_SHARED_WITHOUT_NAME":      8,
+	"CANNOT_UPDATE_CAMPAIGN_BUDGET_TO_EXPLICITLY_SHARED":                   9,
+	"CANNOT_USE_IMPLICITLY_SHARED_CAMPAIGN_BUDGET_WITH_MULTIPLE_CAMPAIGNS": 10,
+	"DUPLICATE_NAME":                              11,
+	"MONEY_AMOUNT_IN_WRONG_CURRENCY":              12,
+	"MONEY_AMOUNT_LESS_THAN_CURRENCY_MINIMUM_CPC": 13,
+	"MONEY_AMOUNT_TOO_LARGE":                      14,
+	"NEGATIVE_MONEY_AMOUNT":                       15,
+	"NON_MULTIPLE_OF_MINIMUM_CURRENCY_UNIT":       16,
+}
+
+func (x CampaignBudgetErrorEnum_CampaignBudgetError) String() string {
+	return proto.EnumName(CampaignBudgetErrorEnum_CampaignBudgetError_name, int32(x))
+}
+
+func (CampaignBudgetErrorEnum_CampaignBudgetError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2c34de9796e76d27, []int{0, 0}
+}
+
+// Container for enum describing possible campaign budget errors.
+type CampaignBudgetErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignBudgetErrorEnum) Reset()         { *m = CampaignBudgetErrorEnum{} }
+func (m *CampaignBudgetErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignBudgetErrorEnum) ProtoMessage()    {}
+func (*CampaignBudgetErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2c34de9796e76d27, []int{0}
+}
+
+func (m *CampaignBudgetErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignBudgetErrorEnum.Unmarshal(m, b)
+}
+func (m *CampaignBudgetErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignBudgetErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignBudgetErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignBudgetErrorEnum.Merge(m, src)
+}
+func (m *CampaignBudgetErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignBudgetErrorEnum.Size(m)
+}
+func (m *CampaignBudgetErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignBudgetErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignBudgetErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CampaignBudgetErrorEnum_CampaignBudgetError", CampaignBudgetErrorEnum_CampaignBudgetError_name, CampaignBudgetErrorEnum_CampaignBudgetError_value)
+	proto.RegisterType((*CampaignBudgetErrorEnum)(nil), "google.ads.googleads.v3.errors.CampaignBudgetErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/campaign_budget_error.proto", fileDescriptor_2c34de9796e76d27)
+}
+
+var fileDescriptor_2c34de9796e76d27 = []byte{
+	// 580 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xd1, 0x6a, 0xd4, 0x40,
+	0x14, 0x86, 0xed, 0xd6, 0xb6, 0x3a, 0xd5, 0x76, 0x1c, 0xd1, 0x6a, 0x95, 0x22, 0x4b, 0x05, 0x45,
+	0x48, 0xc0, 0x80, 0x48, 0x14, 0x64, 0x92, 0xcc, 0x66, 0x07, 0x93, 0x99, 0x90, 0xcc, 0xa4, 0xae,
+	0x2c, 0x0c, 0x69, 0xb3, 0x84, 0x85, 0x36, 0x59, 0x36, 0xdb, 0x3e, 0x90, 0x97, 0x3e, 0x87, 0x57,
+	0x3e, 0x85, 0xd7, 0xde, 0xfa, 0x02, 0x92, 0x64, 0x77, 0x6b, 0xd3, 0x6a, 0xbd, 0xca, 0x61, 0xce,
+	0xff, 0xfd, 0xff, 0x09, 0x33, 0x07, 0x98, 0x59, 0x51, 0x64, 0xc7, 0x23, 0x3d, 0x49, 0x4b, 0xbd,
+	0x29, 0xab, 0xea, 0xcc, 0xd0, 0x47, 0xd3, 0x69, 0x31, 0x2d, 0xf5, 0xa3, 0xe4, 0x64, 0x92, 0x8c,
+	0xb3, 0x5c, 0x1d, 0x9e, 0xa6, 0xd9, 0x68, 0xa6, 0xea, 0x63, 0x6d, 0x32, 0x2d, 0x66, 0x05, 0xda,
+	0x6b, 0x00, 0x2d, 0x49, 0x4b, 0x6d, 0xc9, 0x6a, 0x67, 0x86, 0xd6, 0xb0, 0xbb, 0x4f, 0x17, 0xde,
+	0x93, 0xb1, 0x9e, 0xe4, 0x79, 0x31, 0x4b, 0x66, 0xe3, 0x22, 0x2f, 0x1b, 0xba, 0xfb, 0x63, 0x0d,
+	0xec, 0xd8, 0x73, 0x77, 0xab, 0x36, 0x27, 0x15, 0x46, 0xf2, 0xd3, 0x93, 0xee, 0xb7, 0x35, 0x70,
+	0xff, 0x8a, 0x1e, 0xda, 0x06, 0x9b, 0x92, 0x45, 0x01, 0xb1, 0x69, 0x8f, 0x12, 0x07, 0xde, 0x40,
+	0x9b, 0x60, 0x43, 0xb2, 0x8f, 0x8c, 0x1f, 0x30, 0xb8, 0x82, 0xf6, 0xc1, 0x33, 0x1b, 0xfb, 0x01,
+	0xa6, 0x2e, 0x53, 0x96, 0x74, 0x5c, 0x22, 0x94, 0x8d, 0x19, 0xe3, 0x42, 0x59, 0x44, 0x45, 0x7d,
+	0x1c, 0x12, 0x07, 0xde, 0x43, 0x4f, 0xc0, 0x4e, 0x5b, 0x15, 0x12, 0x9f, 0xc7, 0xc4, 0x81, 0x1d,
+	0xb4, 0x0b, 0x1e, 0xb6, 0x9b, 0x94, 0x29, 0x19, 0x11, 0xb8, 0x8a, 0x5e, 0x80, 0xfd, 0x76, 0x2f,
+	0x20, 0x21, 0xe5, 0x8e, 0xaa, 0x22, 0x70, 0x8c, 0xa9, 0x87, 0x2d, 0x8f, 0xc0, 0x9b, 0xe8, 0x3d,
+	0x78, 0x3b, 0x0f, 0xf6, 0xb9, 0x43, 0x7b, 0x03, 0xd5, 0xa3, 0xc4, 0x73, 0x14, 0xef, 0x29, 0xea,
+	0x07, 0x1e, 0xb5, 0xa9, 0xf0, 0x06, 0xf3, 0x81, 0x54, 0xcb, 0x12, 0xae, 0xa3, 0x37, 0xe0, 0xf5,
+	0x9c, 0x96, 0x81, 0x83, 0x05, 0x69, 0x4b, 0x94, 0xe0, 0x97, 0x7d, 0xe0, 0x06, 0xb2, 0xc1, 0x87,
+	0x6b, 0x39, 0xf2, 0xa9, 0x9d, 0x7f, 0x40, 0x45, 0x9f, 0x4b, 0xa1, 0x18, 0xf6, 0x09, 0xbc, 0xf5,
+	0x5f, 0xe1, 0x97, 0x4c, 0xe0, 0x6d, 0xd4, 0x07, 0xce, 0x82, 0x8b, 0xc8, 0xf5, 0xbf, 0x59, 0xc7,
+	0x2a, 0x5f, 0x7a, 0x82, 0x06, 0xde, 0x79, 0x48, 0x04, 0x01, 0x42, 0x60, 0xcb, 0x91, 0x15, 0x5e,
+	0xa5, 0xd7, 0x53, 0x6d, 0xa2, 0x2e, 0xd8, 0xf3, 0x39, 0x23, 0x03, 0x85, 0x7d, 0x2e, 0x59, 0x7d,
+	0x27, 0x07, 0x21, 0x67, 0xae, 0xb2, 0x65, 0x18, 0x12, 0x66, 0x0f, 0xe0, 0x1d, 0xa4, 0x83, 0x57,
+	0x17, 0x34, 0x1e, 0x89, 0x22, 0x25, 0xfa, 0x98, 0x2d, 0x45, 0xca, 0xa7, 0x8c, 0xfa, 0xd2, 0x57,
+	0x76, 0x60, 0xc3, 0xbb, 0xd5, 0x5d, 0x5f, 0x00, 0x04, 0xe7, 0xca, 0xc3, 0xa1, 0x4b, 0xe0, 0x16,
+	0x7a, 0x0c, 0x1e, 0x30, 0xe2, 0x62, 0x41, 0x63, 0xa2, 0xfe, 0x14, 0xc1, 0x6d, 0xf4, 0x12, 0x3c,
+	0x67, 0x9c, 0x9d, 0xcf, 0xce, 0x7b, 0xe7, 0xbe, 0x8b, 0x20, 0xc9, 0xa8, 0x80, 0xd0, 0xfa, 0xb5,
+	0x02, 0xba, 0x47, 0xc5, 0x89, 0xf6, 0xef, 0x3d, 0xb1, 0x1e, 0x5d, 0xf1, 0xd4, 0x83, 0x6a, 0x47,
+	0x82, 0x95, 0xcf, 0xce, 0x9c, 0xcd, 0x8a, 0xe3, 0x24, 0xcf, 0xb4, 0x62, 0x9a, 0xe9, 0xd9, 0x28,
+	0xaf, 0x37, 0x68, 0xb1, 0xaf, 0x93, 0x71, 0xf9, 0xb7, 0xf5, 0x7d, 0xd7, 0x7c, 0xbe, 0x74, 0x56,
+	0x5d, 0x8c, 0xbf, 0x76, 0xf6, 0xdc, 0xc6, 0x0c, 0xa7, 0xa5, 0xd6, 0x94, 0x55, 0x15, 0x1b, 0x5a,
+	0x1d, 0x59, 0x7e, 0x5f, 0x08, 0x86, 0x38, 0x2d, 0x87, 0x4b, 0xc1, 0x30, 0x36, 0x86, 0x8d, 0xe0,
+	0x67, 0xa7, 0xdb, 0x9c, 0x9a, 0x26, 0x4e, 0x4b, 0xd3, 0x5c, 0x4a, 0x4c, 0x33, 0x36, 0x4c, 0xb3,
+	0x11, 0x1d, 0xae, 0xd7, 0xd3, 0x19, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x48, 0xc0, 0x9d, 0x5e,
+	0x5b, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/campaign_criterion_error.pb.go b/googleapis/ads/googleads/v3/errors/campaign_criterion_error.pb.go
new file mode 100644
index 0000000..a36983d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/campaign_criterion_error.pb.go
@@ -0,0 +1,177 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/campaign_criterion_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible campaign criterion errors.
+type CampaignCriterionErrorEnum_CampaignCriterionError int32
+
+const (
+	// Enum unspecified.
+	CampaignCriterionErrorEnum_UNSPECIFIED CampaignCriterionErrorEnum_CampaignCriterionError = 0
+	// The received error code is not known in this version.
+	CampaignCriterionErrorEnum_UNKNOWN CampaignCriterionErrorEnum_CampaignCriterionError = 1
+	// Concrete type of criterion (keyword v.s. placement) is required for
+	// CREATE and UPDATE operations.
+	CampaignCriterionErrorEnum_CONCRETE_TYPE_REQUIRED CampaignCriterionErrorEnum_CampaignCriterionError = 2
+	// Invalid placement URL.
+	CampaignCriterionErrorEnum_INVALID_PLACEMENT_URL CampaignCriterionErrorEnum_CampaignCriterionError = 3
+	// Criteria type can not be excluded for the campaign by the customer. like
+	// AOL account type cannot target site type criteria
+	CampaignCriterionErrorEnum_CANNOT_EXCLUDE_CRITERIA_TYPE CampaignCriterionErrorEnum_CampaignCriterionError = 4
+	// Cannot set the campaign criterion status for this criteria type.
+	CampaignCriterionErrorEnum_CANNOT_SET_STATUS_FOR_CRITERIA_TYPE CampaignCriterionErrorEnum_CampaignCriterionError = 5
+	// Cannot set the campaign criterion status for an excluded criteria.
+	CampaignCriterionErrorEnum_CANNOT_SET_STATUS_FOR_EXCLUDED_CRITERIA CampaignCriterionErrorEnum_CampaignCriterionError = 6
+	// Cannot target and exclude the same criterion.
+	CampaignCriterionErrorEnum_CANNOT_TARGET_AND_EXCLUDE CampaignCriterionErrorEnum_CampaignCriterionError = 7
+	// The mutate contained too many operations.
+	CampaignCriterionErrorEnum_TOO_MANY_OPERATIONS CampaignCriterionErrorEnum_CampaignCriterionError = 8
+	// This operator cannot be applied to a criterion of this type.
+	CampaignCriterionErrorEnum_OPERATOR_NOT_SUPPORTED_FOR_CRITERION_TYPE CampaignCriterionErrorEnum_CampaignCriterionError = 9
+	// The Shopping campaign sales country is not supported for
+	// ProductSalesChannel targeting.
+	CampaignCriterionErrorEnum_SHOPPING_CAMPAIGN_SALES_COUNTRY_NOT_SUPPORTED_FOR_SALES_CHANNEL CampaignCriterionErrorEnum_CampaignCriterionError = 10
+	// The existing field can't be updated with CREATE operation. It can be
+	// updated with UPDATE operation only.
+	CampaignCriterionErrorEnum_CANNOT_ADD_EXISTING_FIELD CampaignCriterionErrorEnum_CampaignCriterionError = 11
+	// Negative criteria are immutable, so updates are not allowed.
+	CampaignCriterionErrorEnum_CANNOT_UPDATE_NEGATIVE_CRITERION CampaignCriterionErrorEnum_CampaignCriterionError = 12
+)
+
+var CampaignCriterionErrorEnum_CampaignCriterionError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "CONCRETE_TYPE_REQUIRED",
+	3:  "INVALID_PLACEMENT_URL",
+	4:  "CANNOT_EXCLUDE_CRITERIA_TYPE",
+	5:  "CANNOT_SET_STATUS_FOR_CRITERIA_TYPE",
+	6:  "CANNOT_SET_STATUS_FOR_EXCLUDED_CRITERIA",
+	7:  "CANNOT_TARGET_AND_EXCLUDE",
+	8:  "TOO_MANY_OPERATIONS",
+	9:  "OPERATOR_NOT_SUPPORTED_FOR_CRITERION_TYPE",
+	10: "SHOPPING_CAMPAIGN_SALES_COUNTRY_NOT_SUPPORTED_FOR_SALES_CHANNEL",
+	11: "CANNOT_ADD_EXISTING_FIELD",
+	12: "CANNOT_UPDATE_NEGATIVE_CRITERION",
+}
+
+var CampaignCriterionErrorEnum_CampaignCriterionError_value = map[string]int32{
+	"UNSPECIFIED":                               0,
+	"UNKNOWN":                                   1,
+	"CONCRETE_TYPE_REQUIRED":                    2,
+	"INVALID_PLACEMENT_URL":                     3,
+	"CANNOT_EXCLUDE_CRITERIA_TYPE":              4,
+	"CANNOT_SET_STATUS_FOR_CRITERIA_TYPE":       5,
+	"CANNOT_SET_STATUS_FOR_EXCLUDED_CRITERIA":   6,
+	"CANNOT_TARGET_AND_EXCLUDE":                 7,
+	"TOO_MANY_OPERATIONS":                       8,
+	"OPERATOR_NOT_SUPPORTED_FOR_CRITERION_TYPE": 9,
+	"SHOPPING_CAMPAIGN_SALES_COUNTRY_NOT_SUPPORTED_FOR_SALES_CHANNEL": 10,
+	"CANNOT_ADD_EXISTING_FIELD":                                       11,
+	"CANNOT_UPDATE_NEGATIVE_CRITERION":                                12,
+}
+
+func (x CampaignCriterionErrorEnum_CampaignCriterionError) String() string {
+	return proto.EnumName(CampaignCriterionErrorEnum_CampaignCriterionError_name, int32(x))
+}
+
+func (CampaignCriterionErrorEnum_CampaignCriterionError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_05f1ed18896f208f, []int{0, 0}
+}
+
+// Container for enum describing possible campaign criterion errors.
+type CampaignCriterionErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignCriterionErrorEnum) Reset()         { *m = CampaignCriterionErrorEnum{} }
+func (m *CampaignCriterionErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignCriterionErrorEnum) ProtoMessage()    {}
+func (*CampaignCriterionErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_05f1ed18896f208f, []int{0}
+}
+
+func (m *CampaignCriterionErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignCriterionErrorEnum.Unmarshal(m, b)
+}
+func (m *CampaignCriterionErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignCriterionErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignCriterionErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignCriterionErrorEnum.Merge(m, src)
+}
+func (m *CampaignCriterionErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignCriterionErrorEnum.Size(m)
+}
+func (m *CampaignCriterionErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignCriterionErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignCriterionErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CampaignCriterionErrorEnum_CampaignCriterionError", CampaignCriterionErrorEnum_CampaignCriterionError_name, CampaignCriterionErrorEnum_CampaignCriterionError_value)
+	proto.RegisterType((*CampaignCriterionErrorEnum)(nil), "google.ads.googleads.v3.errors.CampaignCriterionErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/campaign_criterion_error.proto", fileDescriptor_05f1ed18896f208f)
+}
+
+var fileDescriptor_05f1ed18896f208f = []byte{
+	// 527 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xd1, 0x6a, 0xd4, 0x4e,
+	0x14, 0xc6, 0xff, 0xdd, 0xfd, 0xdb, 0xea, 0x54, 0x30, 0x8c, 0x58, 0x69, 0xad, 0xa5, 0xac, 0x42,
+	0x11, 0x31, 0xb9, 0xc8, 0x5d, 0x44, 0x64, 0x3a, 0x39, 0x4d, 0x07, 0xd3, 0x99, 0x71, 0x32, 0x59,
+	0xad, 0x2c, 0x0c, 0xb1, 0xbb, 0x84, 0x40, 0x9b, 0x2c, 0xc9, 0xda, 0x07, 0xf2, 0xd2, 0x47, 0xf1,
+	0x01, 0x7c, 0x08, 0xef, 0xf5, 0x5a, 0x92, 0xc9, 0xae, 0x45, 0x56, 0xaf, 0x72, 0x92, 0xf3, 0xfb,
+	0xbe, 0xf3, 0x41, 0x3e, 0xf4, 0x2a, 0xaf, 0xaa, 0xfc, 0x72, 0xe6, 0x65, 0xd3, 0xc6, 0xb3, 0x63,
+	0x3b, 0x5d, 0xfb, 0xde, 0xac, 0xae, 0xab, 0xba, 0xf1, 0x2e, 0xb2, 0xab, 0x79, 0x56, 0xe4, 0xa5,
+	0xb9, 0xa8, 0x8b, 0xc5, 0xac, 0x2e, 0xaa, 0xd2, 0x74, 0x1b, 0x77, 0x5e, 0x57, 0x8b, 0x0a, 0x1f,
+	0x58, 0x8d, 0x9b, 0x4d, 0x1b, 0x77, 0x25, 0x77, 0xaf, 0x7d, 0xd7, 0xca, 0xf7, 0xf6, 0x97, 0xf6,
+	0xf3, 0xc2, 0xcb, 0xca, 0xb2, 0x5a, 0x64, 0x8b, 0xa2, 0x2a, 0x1b, 0xab, 0x1e, 0xfd, 0x18, 0xa2,
+	0x3d, 0xda, 0x1f, 0xa0, 0x4b, 0x7f, 0x68, 0x95, 0x50, 0x7e, 0xba, 0x1a, 0x7d, 0x1b, 0xa2, 0x9d,
+	0xf5, 0x6b, 0x7c, 0x0f, 0x6d, 0xa7, 0x3c, 0x91, 0x40, 0xd9, 0x09, 0x83, 0xd0, 0xf9, 0x0f, 0x6f,
+	0xa3, 0xad, 0x94, 0xbf, 0xe1, 0xe2, 0x1d, 0x77, 0x36, 0xf0, 0x1e, 0xda, 0xa1, 0x82, 0x53, 0x05,
+	0x1a, 0x8c, 0x3e, 0x97, 0x60, 0x14, 0xbc, 0x4d, 0x99, 0x82, 0xd0, 0x19, 0xe0, 0x5d, 0xf4, 0x80,
+	0xf1, 0x31, 0x89, 0x59, 0x68, 0x64, 0x4c, 0x28, 0x9c, 0x01, 0xd7, 0x26, 0x55, 0xb1, 0x33, 0xc4,
+	0x87, 0x68, 0x9f, 0x12, 0xce, 0x85, 0x36, 0xf0, 0x9e, 0xc6, 0x69, 0x08, 0x86, 0x2a, 0xa6, 0x41,
+	0x31, 0xd2, 0xb9, 0x38, 0xff, 0xe3, 0x23, 0xf4, 0xa4, 0x27, 0x12, 0xd0, 0x26, 0xd1, 0x44, 0xa7,
+	0x89, 0x39, 0x11, 0xea, 0x0f, 0xf0, 0x16, 0x7e, 0x8e, 0x8e, 0xd6, 0x83, 0xbd, 0x73, 0xb8, 0x52,
+	0x38, 0x9b, 0xf8, 0x31, 0xda, 0xed, 0x61, 0x4d, 0x54, 0x04, 0xda, 0x10, 0x1e, 0x2e, 0x41, 0x67,
+	0x0b, 0x3f, 0x44, 0xf7, 0xb5, 0x10, 0xe6, 0x8c, 0xf0, 0x73, 0x23, 0x24, 0x28, 0xa2, 0x99, 0xe0,
+	0x89, 0x73, 0x1b, 0xbf, 0x40, 0xcf, 0xec, 0xbb, 0x50, 0xa6, 0x3b, 0x95, 0x4a, 0x29, 0x94, 0x86,
+	0xf0, 0x66, 0x24, 0xc1, 0x6d, 0xa6, 0x3b, 0x98, 0xa2, 0xd7, 0xc9, 0xa9, 0x90, 0x92, 0xf1, 0xc8,
+	0x50, 0x72, 0x26, 0x09, 0x8b, 0xb8, 0x49, 0x48, 0x0c, 0x89, 0xa1, 0x22, 0xe5, 0x5a, 0x9d, 0xaf,
+	0x71, 0xe9, 0xf7, 0xa7, 0x84, 0x73, 0x88, 0x1d, 0x74, 0x23, 0x2b, 0x09, 0xdb, 0x90, 0x2c, 0xd1,
+	0xad, 0xdf, 0x09, 0x83, 0x38, 0x74, 0xb6, 0xf1, 0x53, 0x74, 0xd8, 0xaf, 0x53, 0x19, 0x12, 0x0d,
+	0x86, 0x43, 0x44, 0x34, 0x1b, 0xc3, 0xef, 0x38, 0xce, 0xdd, 0xe3, 0x9f, 0x1b, 0x68, 0x74, 0x51,
+	0x5d, 0xb9, 0xff, 0x2e, 0xcf, 0xf1, 0xa3, 0xf5, 0x3f, 0x5f, 0xb6, 0xdd, 0x91, 0x1b, 0x1f, 0xc2,
+	0x5e, 0x9e, 0x57, 0x97, 0x59, 0x99, 0xbb, 0x55, 0x9d, 0x7b, 0xf9, 0xac, 0xec, 0x9a, 0xb5, 0xac,
+	0xf2, 0xbc, 0x68, 0xfe, 0xd6, 0xec, 0x97, 0xf6, 0xf1, 0x79, 0x30, 0x8c, 0x08, 0xf9, 0x32, 0x38,
+	0x88, 0xac, 0x19, 0x99, 0x36, 0xae, 0x1d, 0xdb, 0x69, 0xec, 0xbb, 0xdd, 0xc9, 0xe6, 0xeb, 0x12,
+	0x98, 0x90, 0x69, 0x33, 0x59, 0x01, 0x93, 0xb1, 0x3f, 0xb1, 0xc0, 0xf7, 0xc1, 0xc8, 0x7e, 0x0d,
+	0x02, 0x32, 0x6d, 0x82, 0x60, 0x85, 0x04, 0xc1, 0xd8, 0x0f, 0x02, 0x0b, 0x7d, 0xdc, 0xec, 0xd2,
+	0xf9, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x46, 0xbc, 0x53, 0xb6, 0x76, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/campaign_draft_error.pb.go b/googleapis/ads/googleads/v3/errors/campaign_draft_error.pb.go
new file mode 100644
index 0000000..ad88665
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/campaign_draft_error.pb.go
@@ -0,0 +1,172 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/campaign_draft_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible campaign draft errors.
+type CampaignDraftErrorEnum_CampaignDraftError int32
+
+const (
+	// Enum unspecified.
+	CampaignDraftErrorEnum_UNSPECIFIED CampaignDraftErrorEnum_CampaignDraftError = 0
+	// The received error code is not known in this version.
+	CampaignDraftErrorEnum_UNKNOWN CampaignDraftErrorEnum_CampaignDraftError = 1
+	// A draft with this name already exists for this campaign.
+	CampaignDraftErrorEnum_DUPLICATE_DRAFT_NAME CampaignDraftErrorEnum_CampaignDraftError = 2
+	// The draft is removed and cannot be transitioned to another status.
+	CampaignDraftErrorEnum_INVALID_STATUS_TRANSITION_FROM_REMOVED CampaignDraftErrorEnum_CampaignDraftError = 3
+	// The draft has been promoted and cannot be transitioned to the specified
+	// status.
+	CampaignDraftErrorEnum_INVALID_STATUS_TRANSITION_FROM_PROMOTED CampaignDraftErrorEnum_CampaignDraftError = 4
+	// The draft has failed to be promoted and cannot be transitioned to the
+	// specified status.
+	CampaignDraftErrorEnum_INVALID_STATUS_TRANSITION_FROM_PROMOTE_FAILED CampaignDraftErrorEnum_CampaignDraftError = 5
+	// This customer is not allowed to create drafts.
+	CampaignDraftErrorEnum_CUSTOMER_CANNOT_CREATE_DRAFT CampaignDraftErrorEnum_CampaignDraftError = 6
+	// This campaign is not allowed to create drafts.
+	CampaignDraftErrorEnum_CAMPAIGN_CANNOT_CREATE_DRAFT CampaignDraftErrorEnum_CampaignDraftError = 7
+	// This modification cannot be made on a draft.
+	CampaignDraftErrorEnum_INVALID_DRAFT_CHANGE CampaignDraftErrorEnum_CampaignDraftError = 8
+	// The draft cannot be transitioned to the specified status from its
+	// current status.
+	CampaignDraftErrorEnum_INVALID_STATUS_TRANSITION CampaignDraftErrorEnum_CampaignDraftError = 9
+	// The campaign has reached the maximum number of drafts that can be created
+	// for a campaign throughout its lifetime. No additional drafts can be
+	// created for this campaign. Removed drafts also count towards this limit.
+	CampaignDraftErrorEnum_MAX_NUMBER_OF_DRAFTS_PER_CAMPAIGN_REACHED CampaignDraftErrorEnum_CampaignDraftError = 10
+	// ListAsyncErrors was called without first promoting the draft.
+	CampaignDraftErrorEnum_LIST_ERRORS_FOR_PROMOTED_DRAFT_ONLY CampaignDraftErrorEnum_CampaignDraftError = 11
+)
+
+var CampaignDraftErrorEnum_CampaignDraftError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "DUPLICATE_DRAFT_NAME",
+	3:  "INVALID_STATUS_TRANSITION_FROM_REMOVED",
+	4:  "INVALID_STATUS_TRANSITION_FROM_PROMOTED",
+	5:  "INVALID_STATUS_TRANSITION_FROM_PROMOTE_FAILED",
+	6:  "CUSTOMER_CANNOT_CREATE_DRAFT",
+	7:  "CAMPAIGN_CANNOT_CREATE_DRAFT",
+	8:  "INVALID_DRAFT_CHANGE",
+	9:  "INVALID_STATUS_TRANSITION",
+	10: "MAX_NUMBER_OF_DRAFTS_PER_CAMPAIGN_REACHED",
+	11: "LIST_ERRORS_FOR_PROMOTED_DRAFT_ONLY",
+}
+
+var CampaignDraftErrorEnum_CampaignDraftError_value = map[string]int32{
+	"UNSPECIFIED":                                   0,
+	"UNKNOWN":                                       1,
+	"DUPLICATE_DRAFT_NAME":                          2,
+	"INVALID_STATUS_TRANSITION_FROM_REMOVED":        3,
+	"INVALID_STATUS_TRANSITION_FROM_PROMOTED":       4,
+	"INVALID_STATUS_TRANSITION_FROM_PROMOTE_FAILED": 5,
+	"CUSTOMER_CANNOT_CREATE_DRAFT":                  6,
+	"CAMPAIGN_CANNOT_CREATE_DRAFT":                  7,
+	"INVALID_DRAFT_CHANGE":                          8,
+	"INVALID_STATUS_TRANSITION":                     9,
+	"MAX_NUMBER_OF_DRAFTS_PER_CAMPAIGN_REACHED":     10,
+	"LIST_ERRORS_FOR_PROMOTED_DRAFT_ONLY":           11,
+}
+
+func (x CampaignDraftErrorEnum_CampaignDraftError) String() string {
+	return proto.EnumName(CampaignDraftErrorEnum_CampaignDraftError_name, int32(x))
+}
+
+func (CampaignDraftErrorEnum_CampaignDraftError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_76fa885900f8cf92, []int{0, 0}
+}
+
+// Container for enum describing possible campaign draft errors.
+type CampaignDraftErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignDraftErrorEnum) Reset()         { *m = CampaignDraftErrorEnum{} }
+func (m *CampaignDraftErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignDraftErrorEnum) ProtoMessage()    {}
+func (*CampaignDraftErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_76fa885900f8cf92, []int{0}
+}
+
+func (m *CampaignDraftErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignDraftErrorEnum.Unmarshal(m, b)
+}
+func (m *CampaignDraftErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignDraftErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignDraftErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignDraftErrorEnum.Merge(m, src)
+}
+func (m *CampaignDraftErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignDraftErrorEnum.Size(m)
+}
+func (m *CampaignDraftErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignDraftErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignDraftErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CampaignDraftErrorEnum_CampaignDraftError", CampaignDraftErrorEnum_CampaignDraftError_name, CampaignDraftErrorEnum_CampaignDraftError_value)
+	proto.RegisterType((*CampaignDraftErrorEnum)(nil), "google.ads.googleads.v3.errors.CampaignDraftErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/campaign_draft_error.proto", fileDescriptor_76fa885900f8cf92)
+}
+
+var fileDescriptor_76fa885900f8cf92 = []byte{
+	// 482 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xdf, 0x8a, 0xd3, 0x40,
+	0x14, 0xc6, 0xdd, 0x56, 0x77, 0x75, 0x7a, 0xe1, 0x30, 0x88, 0xff, 0x58, 0x17, 0xa9, 0xe0, 0xa2,
+	0xb2, 0x09, 0x92, 0x2b, 0xe3, 0xd5, 0x34, 0x33, 0xe9, 0x0e, 0x36, 0x33, 0x61, 0x32, 0x89, 0x7f,
+	0x28, 0x0c, 0x71, 0x53, 0x43, 0x61, 0x9b, 0x29, 0x49, 0xdd, 0x07, 0xf2, 0x52, 0xf0, 0x3d, 0xc4,
+	0x47, 0xf1, 0xd2, 0x27, 0x90, 0x64, 0xda, 0xdc, 0xac, 0xab, 0x5e, 0xe5, 0x70, 0xf2, 0xfb, 0xce,
+	0xf9, 0x0e, 0xf3, 0x81, 0x57, 0xa5, 0x31, 0xe5, 0xf9, 0xc2, 0xcd, 0x8b, 0xc6, 0xb5, 0x65, 0x5b,
+	0x5d, 0x78, 0xee, 0xa2, 0xae, 0x4d, 0xdd, 0xb8, 0x67, 0xf9, 0x6a, 0x9d, 0x2f, 0xcb, 0x4a, 0x17,
+	0x75, 0xfe, 0x69, 0xa3, 0xbb, 0xae, 0xb3, 0xae, 0xcd, 0xc6, 0xa0, 0x23, 0xcb, 0x3b, 0x79, 0xd1,
+	0x38, 0xbd, 0xd4, 0xb9, 0xf0, 0x1c, 0x2b, 0x7d, 0x78, 0xb8, 0x1b, 0xbd, 0x5e, 0xba, 0x79, 0x55,
+	0x99, 0x4d, 0xbe, 0x59, 0x9a, 0xaa, 0xb1, 0xea, 0xf1, 0xf7, 0x21, 0xb8, 0x1b, 0x6c, 0x87, 0x93,
+	0x76, 0x36, 0x6d, 0x55, 0xb4, 0xfa, 0xbc, 0x1a, 0x7f, 0x1b, 0x02, 0x74, 0xf9, 0x17, 0xba, 0x0d,
+	0x46, 0x29, 0x4f, 0x62, 0x1a, 0xb0, 0x90, 0x51, 0x02, 0xaf, 0xa1, 0x11, 0x38, 0x48, 0xf9, 0x1b,
+	0x2e, 0xde, 0x72, 0xb8, 0x87, 0xee, 0x83, 0x3b, 0x24, 0x8d, 0x67, 0x2c, 0xc0, 0x8a, 0x6a, 0x22,
+	0x71, 0xa8, 0x34, 0xc7, 0x11, 0x85, 0x03, 0xf4, 0x1c, 0x3c, 0x65, 0x3c, 0xc3, 0x33, 0x46, 0x74,
+	0xa2, 0xb0, 0x4a, 0x13, 0xad, 0x24, 0xe6, 0x09, 0x53, 0x4c, 0x70, 0x1d, 0x4a, 0x11, 0x69, 0x49,
+	0x23, 0x91, 0x51, 0x02, 0x87, 0xe8, 0x05, 0x38, 0xfe, 0x07, 0x1b, 0x4b, 0x11, 0x09, 0x45, 0x09,
+	0xbc, 0x8e, 0x5e, 0x82, 0x93, 0xff, 0x83, 0x75, 0x88, 0xd9, 0x8c, 0x12, 0x78, 0x03, 0x3d, 0x06,
+	0x87, 0x41, 0x9a, 0x28, 0x11, 0x51, 0xa9, 0x03, 0xcc, 0xb9, 0x50, 0x3a, 0x90, 0xb4, 0xb7, 0x0c,
+	0xf7, 0x3b, 0x02, 0x47, 0x31, 0x66, 0x53, 0xfe, 0x47, 0xe2, 0xa0, 0xbd, 0x74, 0xb7, 0xd6, 0xde,
+	0x19, 0x9c, 0x62, 0x3e, 0xa5, 0xf0, 0x26, 0x7a, 0x04, 0x1e, 0x5c, 0x69, 0x08, 0xde, 0x42, 0x27,
+	0xe0, 0x59, 0x84, 0xdf, 0x69, 0x9e, 0x46, 0x13, 0x2a, 0xb5, 0x08, 0xad, 0x3c, 0xd1, 0x71, 0x67,
+	0x66, 0xbb, 0x53, 0x52, 0x1c, 0x9c, 0x52, 0x02, 0x01, 0x3a, 0x06, 0x4f, 0x66, 0x2c, 0x51, 0x9a,
+	0x4a, 0x29, 0x64, 0xa2, 0x43, 0x21, 0xfb, 0xe3, 0xb7, 0x8b, 0x05, 0x9f, 0xbd, 0x87, 0xa3, 0xc9,
+	0xaf, 0x3d, 0x30, 0x3e, 0x33, 0x2b, 0xe7, 0xef, 0x79, 0x98, 0xdc, 0xbb, 0xfc, 0xa6, 0x71, 0x1b,
+	0x85, 0x78, 0xef, 0x03, 0xd9, 0x4a, 0x4b, 0x73, 0x9e, 0x57, 0xa5, 0x63, 0xea, 0xd2, 0x2d, 0x17,
+	0x55, 0x17, 0x94, 0x5d, 0x2a, 0xd7, 0xcb, 0xe6, 0xaa, 0x90, 0xbe, 0xb6, 0x9f, 0x2f, 0x83, 0xe1,
+	0x14, 0xe3, 0xaf, 0x83, 0xa3, 0xa9, 0x1d, 0x86, 0x8b, 0xc6, 0xb1, 0x65, 0x5b, 0x65, 0x9e, 0xd3,
+	0xad, 0x6c, 0x7e, 0xec, 0x80, 0x39, 0x2e, 0x9a, 0x79, 0x0f, 0xcc, 0x33, 0x6f, 0x6e, 0x81, 0x9f,
+	0x83, 0xb1, 0xed, 0xfa, 0x3e, 0x2e, 0x1a, 0xdf, 0xef, 0x11, 0xdf, 0xcf, 0x3c, 0xdf, 0xb7, 0xd0,
+	0xc7, 0xfd, 0xce, 0x9d, 0xf7, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x37, 0x8b, 0x71, 0x58, 0x41, 0x03,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/campaign_error.pb.go b/googleapis/ads/googleads/v3/errors/campaign_error.pb.go
new file mode 100644
index 0000000..131f221
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/campaign_error.pb.go
@@ -0,0 +1,338 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/campaign_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible campaign errors.
+type CampaignErrorEnum_CampaignError int32
+
+const (
+	// Enum unspecified.
+	CampaignErrorEnum_UNSPECIFIED CampaignErrorEnum_CampaignError = 0
+	// The received error code is not known in this version.
+	CampaignErrorEnum_UNKNOWN CampaignErrorEnum_CampaignError = 1
+	// Cannot target content network.
+	CampaignErrorEnum_CANNOT_TARGET_CONTENT_NETWORK CampaignErrorEnum_CampaignError = 3
+	// Cannot target search network.
+	CampaignErrorEnum_CANNOT_TARGET_SEARCH_NETWORK CampaignErrorEnum_CampaignError = 4
+	// Cannot cover search network without google search network.
+	CampaignErrorEnum_CANNOT_TARGET_SEARCH_NETWORK_WITHOUT_GOOGLE_SEARCH CampaignErrorEnum_CampaignError = 5
+	// Cannot target Google Search network for a CPM campaign.
+	CampaignErrorEnum_CANNOT_TARGET_GOOGLE_SEARCH_FOR_CPM_CAMPAIGN CampaignErrorEnum_CampaignError = 6
+	// Must target at least one network.
+	CampaignErrorEnum_CAMPAIGN_MUST_TARGET_AT_LEAST_ONE_NETWORK CampaignErrorEnum_CampaignError = 7
+	// Only some Google partners are allowed to target partner search network.
+	CampaignErrorEnum_CANNOT_TARGET_PARTNER_SEARCH_NETWORK CampaignErrorEnum_CampaignError = 8
+	// Cannot target content network only as campaign has criteria-level bidding
+	// strategy.
+	CampaignErrorEnum_CANNOT_TARGET_CONTENT_NETWORK_ONLY_WITH_CRITERIA_LEVEL_BIDDING_STRATEGY CampaignErrorEnum_CampaignError = 9
+	// Cannot modify the start or end date such that the campaign duration would
+	// not contain the durations of all runnable trials.
+	CampaignErrorEnum_CAMPAIGN_DURATION_MUST_CONTAIN_ALL_RUNNABLE_TRIALS CampaignErrorEnum_CampaignError = 10
+	// Cannot modify dates, budget or campaign name of a trial campaign.
+	CampaignErrorEnum_CANNOT_MODIFY_FOR_TRIAL_CAMPAIGN CampaignErrorEnum_CampaignError = 11
+	// Trying to modify the name of an active or paused campaign, where the name
+	// is already assigned to another active or paused campaign.
+	CampaignErrorEnum_DUPLICATE_CAMPAIGN_NAME CampaignErrorEnum_CampaignError = 12
+	// Two fields are in conflicting modes.
+	CampaignErrorEnum_INCOMPATIBLE_CAMPAIGN_FIELD CampaignErrorEnum_CampaignError = 13
+	// Campaign name cannot be used.
+	CampaignErrorEnum_INVALID_CAMPAIGN_NAME CampaignErrorEnum_CampaignError = 14
+	// Given status is invalid.
+	CampaignErrorEnum_INVALID_AD_SERVING_OPTIMIZATION_STATUS CampaignErrorEnum_CampaignError = 15
+	// Error in the campaign level tracking URL.
+	CampaignErrorEnum_INVALID_TRACKING_URL CampaignErrorEnum_CampaignError = 16
+	// Cannot set both tracking URL template and tracking setting. A user has
+	// to clear legacy tracking setting in order to add tracking URL template.
+	CampaignErrorEnum_CANNOT_SET_BOTH_TRACKING_URL_TEMPLATE_AND_TRACKING_SETTING CampaignErrorEnum_CampaignError = 17
+	// The maximum number of impressions for Frequency Cap should be an integer
+	// greater than 0.
+	CampaignErrorEnum_MAX_IMPRESSIONS_NOT_IN_RANGE CampaignErrorEnum_CampaignError = 18
+	// Only the Day, Week and Month time units are supported.
+	CampaignErrorEnum_TIME_UNIT_NOT_SUPPORTED CampaignErrorEnum_CampaignError = 19
+	// Operation not allowed on a campaign whose serving status has ended
+	CampaignErrorEnum_INVALID_OPERATION_IF_SERVING_STATUS_HAS_ENDED CampaignErrorEnum_CampaignError = 20
+	// This budget is exclusively linked to a Campaign that is using experiments
+	// so it cannot be shared.
+	CampaignErrorEnum_BUDGET_CANNOT_BE_SHARED CampaignErrorEnum_CampaignError = 21
+	// Campaigns using experiments cannot use a shared budget.
+	CampaignErrorEnum_CAMPAIGN_CANNOT_USE_SHARED_BUDGET CampaignErrorEnum_CampaignError = 22
+	// A different budget cannot be assigned to a campaign when there are
+	// running or scheduled trials.
+	CampaignErrorEnum_CANNOT_CHANGE_BUDGET_ON_CAMPAIGN_WITH_TRIALS CampaignErrorEnum_CampaignError = 23
+	// No link found between the campaign and the label.
+	CampaignErrorEnum_CAMPAIGN_LABEL_DOES_NOT_EXIST CampaignErrorEnum_CampaignError = 24
+	// The label has already been attached to the campaign.
+	CampaignErrorEnum_CAMPAIGN_LABEL_ALREADY_EXISTS CampaignErrorEnum_CampaignError = 25
+	// A ShoppingSetting was not found when creating a shopping campaign.
+	CampaignErrorEnum_MISSING_SHOPPING_SETTING CampaignErrorEnum_CampaignError = 26
+	// The country in shopping setting is not an allowed country.
+	CampaignErrorEnum_INVALID_SHOPPING_SALES_COUNTRY CampaignErrorEnum_CampaignError = 27
+	// The requested channel type is not available according to the customer's
+	// account setting.
+	CampaignErrorEnum_ADVERTISING_CHANNEL_TYPE_NOT_AVAILABLE_FOR_ACCOUNT_TYPE CampaignErrorEnum_CampaignError = 31
+	// The AdvertisingChannelSubType is not a valid subtype of the primary
+	// channel type.
+	CampaignErrorEnum_INVALID_ADVERTISING_CHANNEL_SUB_TYPE CampaignErrorEnum_CampaignError = 32
+	// At least one conversion must be selected.
+	CampaignErrorEnum_AT_LEAST_ONE_CONVERSION_MUST_BE_SELECTED CampaignErrorEnum_CampaignError = 33
+	// Setting ad rotation mode for a campaign is not allowed. Ad rotation mode
+	// at campaign is deprecated.
+	CampaignErrorEnum_CANNOT_SET_AD_ROTATION_MODE CampaignErrorEnum_CampaignError = 34
+	// Trying to change start date on a campaign that has started.
+	CampaignErrorEnum_CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED CampaignErrorEnum_CampaignError = 35
+	// Trying to modify a date into the past.
+	CampaignErrorEnum_CANNOT_SET_DATE_TO_PAST CampaignErrorEnum_CampaignError = 36
+	// Hotel center id in the hotel setting does not match any customer links.
+	CampaignErrorEnum_MISSING_HOTEL_CUSTOMER_LINK CampaignErrorEnum_CampaignError = 37
+	// Hotel center id in the hotel setting must match an active customer link.
+	CampaignErrorEnum_INVALID_HOTEL_CUSTOMER_LINK CampaignErrorEnum_CampaignError = 38
+	// Hotel setting was not found when creating a hotel ads campaign.
+	CampaignErrorEnum_MISSING_HOTEL_SETTING CampaignErrorEnum_CampaignError = 39
+	// A Campaign cannot use shared campaign budgets and be part of a campaign
+	// group.
+	CampaignErrorEnum_CANNOT_USE_SHARED_CAMPAIGN_BUDGET_WHILE_PART_OF_CAMPAIGN_GROUP CampaignErrorEnum_CampaignError = 40
+	// The app ID was not found.
+	CampaignErrorEnum_APP_NOT_FOUND CampaignErrorEnum_CampaignError = 41
+	// Campaign.shopping_setting.enable_local is not supported for the specified
+	// campaign type.
+	CampaignErrorEnum_SHOPPING_ENABLE_LOCAL_NOT_SUPPORTED_FOR_CAMPAIGN_TYPE CampaignErrorEnum_CampaignError = 42
+	// The merchant does not support the creation of campaigns for Shopping
+	// Comparison Listing Ads.
+	CampaignErrorEnum_MERCHANT_NOT_ALLOWED_FOR_COMPARISON_LISTING_ADS CampaignErrorEnum_CampaignError = 43
+	// The App campaign for engagement cannot be created because there aren't
+	// enough installs.
+	CampaignErrorEnum_INSUFFICIENT_APP_INSTALLS_COUNT CampaignErrorEnum_CampaignError = 44
+	// The App campaign for engagement cannot be created because the app is
+	// sensitive.
+	CampaignErrorEnum_SENSITIVE_CATEGORY_APP CampaignErrorEnum_CampaignError = 45
+)
+
+var CampaignErrorEnum_CampaignError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	3:  "CANNOT_TARGET_CONTENT_NETWORK",
+	4:  "CANNOT_TARGET_SEARCH_NETWORK",
+	5:  "CANNOT_TARGET_SEARCH_NETWORK_WITHOUT_GOOGLE_SEARCH",
+	6:  "CANNOT_TARGET_GOOGLE_SEARCH_FOR_CPM_CAMPAIGN",
+	7:  "CAMPAIGN_MUST_TARGET_AT_LEAST_ONE_NETWORK",
+	8:  "CANNOT_TARGET_PARTNER_SEARCH_NETWORK",
+	9:  "CANNOT_TARGET_CONTENT_NETWORK_ONLY_WITH_CRITERIA_LEVEL_BIDDING_STRATEGY",
+	10: "CAMPAIGN_DURATION_MUST_CONTAIN_ALL_RUNNABLE_TRIALS",
+	11: "CANNOT_MODIFY_FOR_TRIAL_CAMPAIGN",
+	12: "DUPLICATE_CAMPAIGN_NAME",
+	13: "INCOMPATIBLE_CAMPAIGN_FIELD",
+	14: "INVALID_CAMPAIGN_NAME",
+	15: "INVALID_AD_SERVING_OPTIMIZATION_STATUS",
+	16: "INVALID_TRACKING_URL",
+	17: "CANNOT_SET_BOTH_TRACKING_URL_TEMPLATE_AND_TRACKING_SETTING",
+	18: "MAX_IMPRESSIONS_NOT_IN_RANGE",
+	19: "TIME_UNIT_NOT_SUPPORTED",
+	20: "INVALID_OPERATION_IF_SERVING_STATUS_HAS_ENDED",
+	21: "BUDGET_CANNOT_BE_SHARED",
+	22: "CAMPAIGN_CANNOT_USE_SHARED_BUDGET",
+	23: "CANNOT_CHANGE_BUDGET_ON_CAMPAIGN_WITH_TRIALS",
+	24: "CAMPAIGN_LABEL_DOES_NOT_EXIST",
+	25: "CAMPAIGN_LABEL_ALREADY_EXISTS",
+	26: "MISSING_SHOPPING_SETTING",
+	27: "INVALID_SHOPPING_SALES_COUNTRY",
+	31: "ADVERTISING_CHANNEL_TYPE_NOT_AVAILABLE_FOR_ACCOUNT_TYPE",
+	32: "INVALID_ADVERTISING_CHANNEL_SUB_TYPE",
+	33: "AT_LEAST_ONE_CONVERSION_MUST_BE_SELECTED",
+	34: "CANNOT_SET_AD_ROTATION_MODE",
+	35: "CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED",
+	36: "CANNOT_SET_DATE_TO_PAST",
+	37: "MISSING_HOTEL_CUSTOMER_LINK",
+	38: "INVALID_HOTEL_CUSTOMER_LINK",
+	39: "MISSING_HOTEL_SETTING",
+	40: "CANNOT_USE_SHARED_CAMPAIGN_BUDGET_WHILE_PART_OF_CAMPAIGN_GROUP",
+	41: "APP_NOT_FOUND",
+	42: "SHOPPING_ENABLE_LOCAL_NOT_SUPPORTED_FOR_CAMPAIGN_TYPE",
+	43: "MERCHANT_NOT_ALLOWED_FOR_COMPARISON_LISTING_ADS",
+	44: "INSUFFICIENT_APP_INSTALLS_COUNT",
+	45: "SENSITIVE_CATEGORY_APP",
+}
+
+var CampaignErrorEnum_CampaignError_value = map[string]int32{
+	"UNSPECIFIED":                   0,
+	"UNKNOWN":                       1,
+	"CANNOT_TARGET_CONTENT_NETWORK": 3,
+	"CANNOT_TARGET_SEARCH_NETWORK":  4,
+	"CANNOT_TARGET_SEARCH_NETWORK_WITHOUT_GOOGLE_SEARCH":                      5,
+	"CANNOT_TARGET_GOOGLE_SEARCH_FOR_CPM_CAMPAIGN":                            6,
+	"CAMPAIGN_MUST_TARGET_AT_LEAST_ONE_NETWORK":                               7,
+	"CANNOT_TARGET_PARTNER_SEARCH_NETWORK":                                    8,
+	"CANNOT_TARGET_CONTENT_NETWORK_ONLY_WITH_CRITERIA_LEVEL_BIDDING_STRATEGY": 9,
+	"CAMPAIGN_DURATION_MUST_CONTAIN_ALL_RUNNABLE_TRIALS":                      10,
+	"CANNOT_MODIFY_FOR_TRIAL_CAMPAIGN":                                        11,
+	"DUPLICATE_CAMPAIGN_NAME":                                                 12,
+	"INCOMPATIBLE_CAMPAIGN_FIELD":                                             13,
+	"INVALID_CAMPAIGN_NAME":                                                   14,
+	"INVALID_AD_SERVING_OPTIMIZATION_STATUS":                                  15,
+	"INVALID_TRACKING_URL":                                                    16,
+	"CANNOT_SET_BOTH_TRACKING_URL_TEMPLATE_AND_TRACKING_SETTING":              17,
+	"MAX_IMPRESSIONS_NOT_IN_RANGE":                                            18,
+	"TIME_UNIT_NOT_SUPPORTED":                                                 19,
+	"INVALID_OPERATION_IF_SERVING_STATUS_HAS_ENDED":                           20,
+	"BUDGET_CANNOT_BE_SHARED":                                                 21,
+	"CAMPAIGN_CANNOT_USE_SHARED_BUDGET":                                       22,
+	"CANNOT_CHANGE_BUDGET_ON_CAMPAIGN_WITH_TRIALS":                            23,
+	"CAMPAIGN_LABEL_DOES_NOT_EXIST":                                           24,
+	"CAMPAIGN_LABEL_ALREADY_EXISTS":                                           25,
+	"MISSING_SHOPPING_SETTING":                                                26,
+	"INVALID_SHOPPING_SALES_COUNTRY":                                          27,
+	"ADVERTISING_CHANNEL_TYPE_NOT_AVAILABLE_FOR_ACCOUNT_TYPE":                 31,
+	"INVALID_ADVERTISING_CHANNEL_SUB_TYPE":                                    32,
+	"AT_LEAST_ONE_CONVERSION_MUST_BE_SELECTED":                                33,
+	"CANNOT_SET_AD_ROTATION_MODE":                                             34,
+	"CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED":                             35,
+	"CANNOT_SET_DATE_TO_PAST":                                                 36,
+	"MISSING_HOTEL_CUSTOMER_LINK":                                             37,
+	"INVALID_HOTEL_CUSTOMER_LINK":                                             38,
+	"MISSING_HOTEL_SETTING":                                                   39,
+	"CANNOT_USE_SHARED_CAMPAIGN_BUDGET_WHILE_PART_OF_CAMPAIGN_GROUP":          40,
+	"APP_NOT_FOUND":                                                           41,
+	"SHOPPING_ENABLE_LOCAL_NOT_SUPPORTED_FOR_CAMPAIGN_TYPE":                   42,
+	"MERCHANT_NOT_ALLOWED_FOR_COMPARISON_LISTING_ADS":                         43,
+	"INSUFFICIENT_APP_INSTALLS_COUNT":                                         44,
+	"SENSITIVE_CATEGORY_APP":                                                  45,
+}
+
+func (x CampaignErrorEnum_CampaignError) String() string {
+	return proto.EnumName(CampaignErrorEnum_CampaignError_name, int32(x))
+}
+
+func (CampaignErrorEnum_CampaignError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1bc27234034fa291, []int{0, 0}
+}
+
+// Container for enum describing possible campaign errors.
+type CampaignErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignErrorEnum) Reset()         { *m = CampaignErrorEnum{} }
+func (m *CampaignErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignErrorEnum) ProtoMessage()    {}
+func (*CampaignErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1bc27234034fa291, []int{0}
+}
+
+func (m *CampaignErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignErrorEnum.Unmarshal(m, b)
+}
+func (m *CampaignErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignErrorEnum.Merge(m, src)
+}
+func (m *CampaignErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignErrorEnum.Size(m)
+}
+func (m *CampaignErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CampaignErrorEnum_CampaignError", CampaignErrorEnum_CampaignError_name, CampaignErrorEnum_CampaignError_value)
+	proto.RegisterType((*CampaignErrorEnum)(nil), "google.ads.googleads.v3.errors.CampaignErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/campaign_error.proto", fileDescriptor_1bc27234034fa291)
+}
+
+var fileDescriptor_1bc27234034fa291 = []byte{
+	// 1065 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x55, 0xef, 0x6e, 0x13, 0x47,
+	0x10, 0x2f, 0xd0, 0x42, 0xbb, 0x34, 0x65, 0xd9, 0xf2, 0x1f, 0x0a, 0xc4, 0x04, 0x1a, 0x20, 0xb1,
+	0xdb, 0x5a, 0x6d, 0x55, 0x23, 0x21, 0x8d, 0x6f, 0xc7, 0xe7, 0x55, 0xf6, 0x76, 0x4f, 0xbb, 0x7b,
+	0x0e, 0x46, 0x91, 0x56, 0x2e, 0x89, 0xac, 0x48, 0xc4, 0x8e, 0xe2, 0x94, 0x67, 0xe9, 0xe7, 0x7e,
+	0xec, 0x87, 0x3e, 0x48, 0x1f, 0xa5, 0x52, 0xdf, 0xa1, 0xda, 0xdb, 0xbb, 0x4b, 0x0c, 0x34, 0x9f,
+	0xbc, 0xde, 0xf9, 0xcd, 0xdc, 0xcc, 0x6f, 0x7e, 0xb3, 0x43, 0xba, 0xd3, 0xf9, 0x7c, 0xfa, 0x76,
+	0xaf, 0x33, 0xd9, 0x5d, 0x74, 0xe2, 0x31, 0x9c, 0xde, 0x75, 0x3b, 0x7b, 0x47, 0x47, 0xf3, 0xa3,
+	0x45, 0xe7, 0xcd, 0xe4, 0xe0, 0x70, 0xb2, 0x3f, 0x9d, 0xf9, 0xf2, 0x7f, 0xfb, 0xf0, 0x68, 0x7e,
+	0x3c, 0x67, 0xf7, 0x23, 0xb2, 0x3d, 0xd9, 0x5d, 0xb4, 0x1b, 0xa7, 0xf6, 0xbb, 0x6e, 0x3b, 0x3a,
+	0xdd, 0xb9, 0x57, 0x07, 0x3d, 0xdc, 0xef, 0x4c, 0x66, 0xb3, 0xf9, 0xf1, 0xe4, 0x78, 0x7f, 0x3e,
+	0x5b, 0x44, 0xef, 0xd6, 0x5f, 0x2b, 0xe4, 0x6a, 0x52, 0x85, 0xc5, 0xe0, 0x80, 0xb3, 0xdf, 0x0e,
+	0x5a, 0xbf, 0xaf, 0x90, 0x95, 0xa5, 0x5b, 0x76, 0x85, 0x5c, 0x2e, 0x94, 0xcd, 0x31, 0x11, 0x03,
+	0x81, 0x9c, 0x7e, 0xc2, 0x2e, 0x93, 0x4b, 0x85, 0xda, 0x52, 0x7a, 0x5b, 0xd1, 0x73, 0x6c, 0x95,
+	0x7c, 0x93, 0x80, 0x52, 0xda, 0x79, 0x07, 0x26, 0x45, 0xe7, 0x13, 0xad, 0x1c, 0x2a, 0xe7, 0x15,
+	0xba, 0x6d, 0x6d, 0xb6, 0xe8, 0x05, 0xf6, 0x90, 0xdc, 0x5b, 0x86, 0x58, 0x04, 0x93, 0x0c, 0x1b,
+	0xc4, 0xa7, 0xec, 0x27, 0xf2, 0xc3, 0x59, 0x08, 0xbf, 0x2d, 0xdc, 0x50, 0x17, 0xce, 0xa7, 0x5a,
+	0xa7, 0x12, 0x2b, 0x2b, 0xfd, 0x8c, 0x7d, 0x47, 0x36, 0x96, 0xfd, 0x96, 0x00, 0x7e, 0xa0, 0x8d,
+	0x4f, 0xf2, 0xcc, 0x27, 0x90, 0xe5, 0x20, 0x52, 0x45, 0x2f, 0xb2, 0x4d, 0xf2, 0xb4, 0xfe, 0xe7,
+	0xb3, 0xc2, 0x36, 0x8e, 0xe0, 0xbc, 0x44, 0xb0, 0xce, 0x6b, 0x85, 0x4d, 0x62, 0x97, 0xd8, 0x3a,
+	0x59, 0x5b, 0xfe, 0x40, 0x0e, 0xc6, 0x29, 0x34, 0xef, 0x97, 0xf0, 0x39, 0xdb, 0x22, 0xe9, 0x99,
+	0x3c, 0x78, 0xad, 0xe4, 0xb8, 0x2c, 0xc4, 0x27, 0x46, 0x38, 0x34, 0x02, 0xbc, 0xc4, 0x11, 0x4a,
+	0xdf, 0x17, 0x9c, 0x0b, 0x95, 0x7a, 0xeb, 0x0c, 0x38, 0x4c, 0xc7, 0xf4, 0x8b, 0xc8, 0x47, 0x95,
+	0x25, 0x2f, 0x0c, 0x38, 0xa1, 0xab, 0x74, 0x43, 0x54, 0x10, 0xca, 0x83, 0x94, 0xde, 0x14, 0x4a,
+	0x41, 0x5f, 0xa2, 0x77, 0x46, 0x80, 0xb4, 0x94, 0xb0, 0x35, 0xf2, 0xb0, 0x4a, 0x22, 0xd3, 0x5c,
+	0x0c, 0xc6, 0x25, 0x03, 0xa5, 0xf5, 0x84, 0x83, 0xcb, 0xec, 0x2e, 0xb9, 0xc9, 0x8b, 0x5c, 0x8a,
+	0x04, 0x1c, 0x36, 0xf7, 0x5e, 0x41, 0x86, 0xf4, 0x4b, 0xf6, 0x80, 0xdc, 0x15, 0x2a, 0xd1, 0x59,
+	0x0e, 0x4e, 0x84, 0xd8, 0x8d, 0x7d, 0x20, 0x50, 0x72, 0xba, 0xc2, 0x6e, 0x93, 0xeb, 0x42, 0x8d,
+	0x40, 0x0a, 0xfe, 0x9e, 0xef, 0x57, 0xec, 0x19, 0x79, 0x52, 0x9b, 0x80, 0x7b, 0x8b, 0x66, 0x14,
+	0xea, 0xd2, 0xb9, 0x13, 0x99, 0x78, 0x1d, 0x8b, 0xb0, 0x0e, 0x5c, 0x61, 0xe9, 0x15, 0x76, 0x8b,
+	0x5c, 0xab, 0xb1, 0xce, 0x40, 0xb2, 0x15, 0x90, 0x85, 0x91, 0x94, 0xb2, 0x97, 0xa4, 0x57, 0x15,
+	0x61, 0xd1, 0xf9, 0xbe, 0x76, 0xc3, 0x25, 0x84, 0x77, 0x98, 0xe5, 0x32, 0xa4, 0x0e, 0xea, 0x94,
+	0xaf, 0x45, 0xe7, 0x84, 0x4a, 0xe9, 0xd5, 0x20, 0xb7, 0x0c, 0x5e, 0x79, 0x91, 0xe5, 0x06, 0xad,
+	0x15, 0x5a, 0x59, 0x1f, 0x82, 0x09, 0xe5, 0x0d, 0xa8, 0x14, 0x29, 0x0b, 0x04, 0x38, 0x91, 0xa1,
+	0x2f, 0x94, 0x70, 0xa5, 0xcd, 0x16, 0x79, 0xae, 0x8d, 0x43, 0x4e, 0xbf, 0x66, 0xdf, 0x93, 0xcd,
+	0x3a, 0x31, 0x9d, 0x63, 0xc5, 0xbd, 0x18, 0x34, 0xe5, 0xc4, 0x0a, 0xfc, 0x10, 0xac, 0x47, 0xc5,
+	0x91, 0xd3, 0x6b, 0x21, 0x5e, 0xbf, 0xe0, 0x65, 0xd3, 0x63, 0xe2, 0x7d, 0xf4, 0x76, 0x08, 0x06,
+	0x39, 0xbd, 0xce, 0x1e, 0x93, 0xd5, 0x86, 0xa7, 0xca, 0x5c, 0xd8, 0xda, 0xee, 0xa3, 0x1f, 0xbd,
+	0x71, 0x4a, 0xca, 0xc9, 0x30, 0xa4, 0x59, 0x59, 0xbc, 0x56, 0x27, 0x34, 0x97, 0xea, 0xa9, 0x9a,
+	0x7d, 0x33, 0x4e, 0x5e, 0x65, 0x91, 0xd0, 0x47, 0xe9, 0xb9, 0xc6, 0x58, 0x2b, 0xbe, 0x12, 0xd6,
+	0xd1, 0x5b, 0x1f, 0x81, 0x80, 0x34, 0x08, 0x7c, 0x1c, 0x11, 0x96, 0xde, 0x66, 0xf7, 0xc8, 0xad,
+	0x4c, 0x58, 0x5b, 0x56, 0x36, 0xd4, 0x79, 0x7e, 0x9a, 0xcb, 0x3b, 0xac, 0x45, 0xee, 0xd7, 0x64,
+	0x9c, 0x58, 0x41, 0xa2, 0xf5, 0x89, 0x2e, 0x94, 0x33, 0x63, 0x7a, 0x97, 0xbd, 0x20, 0x3f, 0x03,
+	0x1f, 0xa1, 0x71, 0xa2, 0x8c, 0x12, 0xd2, 0x57, 0x28, 0xbd, 0x1b, 0xe7, 0x58, 0x26, 0x03, 0x23,
+	0x10, 0xb2, 0xd4, 0x69, 0x50, 0x23, 0x24, 0xa5, 0x67, 0x69, 0xa6, 0x0f, 0xc2, 0x80, 0x9d, 0x48,
+	0xe6, 0xc3, 0x20, 0xb6, 0xe8, 0x47, 0xe4, 0x43, 0xb6, 0x41, 0xd6, 0x97, 0x86, 0x34, 0xd1, 0x6a,
+	0x84, 0xc6, 0x36, 0x93, 0x11, 0x38, 0x47, 0x89, 0x49, 0xe8, 0xe2, 0x6a, 0x90, 0xf1, 0x29, 0x11,
+	0x01, 0xf7, 0x46, 0xbb, 0x6a, 0x8c, 0x34, 0x47, 0xda, 0x62, 0x1d, 0xf2, 0x7c, 0x79, 0x54, 0xac,
+	0x03, 0xe3, 0x3c, 0x0f, 0xc2, 0x12, 0x83, 0x86, 0xa7, 0xf2, 0x16, 0x39, 0x7d, 0x14, 0x9a, 0x7c,
+	0x2a, 0x62, 0x89, 0x73, 0xda, 0xe7, 0x60, 0x1d, 0x5d, 0x0b, 0x9f, 0xab, 0x59, 0x1c, 0x6a, 0x87,
+	0xd2, 0x27, 0x85, 0x75, 0x3a, 0x43, 0xe3, 0xa5, 0x50, 0x5b, 0xf4, 0x71, 0x1c, 0xab, 0x58, 0xe7,
+	0xc7, 0x00, 0x4f, 0xc2, 0x58, 0x2d, 0x47, 0xa8, 0x9b, 0xf0, 0x2d, 0xeb, 0x93, 0x97, 0x1f, 0x0a,
+	0xa7, 0xe9, 0x6b, 0xa5, 0x93, 0xed, 0xa1, 0x90, 0x58, 0x3e, 0x4f, 0x5e, 0x0f, 0x4e, 0xac, 0xa9,
+	0xd1, 0x45, 0x4e, 0xd7, 0xd9, 0x55, 0xb2, 0x02, 0x79, 0x5e, 0xf6, 0x63, 0xa0, 0x0b, 0xc5, 0xe9,
+	0x53, 0xf6, 0x0b, 0xf9, 0xb1, 0xe9, 0x29, 0xc6, 0x87, 0x44, 0xea, 0x04, 0xe4, 0xf2, 0x44, 0xc4,
+	0x47, 0xb4, 0x0e, 0x57, 0xf6, 0xe2, 0x19, 0xeb, 0x92, 0x4e, 0x86, 0x26, 0x34, 0x29, 0xce, 0x0f,
+	0x48, 0xa9, 0xb7, 0x6b, 0x6c, 0x78, 0x3b, 0x8c, 0xb0, 0x5a, 0x79, 0x29, 0x6c, 0x28, 0xc1, 0x03,
+	0xb7, 0xf4, 0x39, 0x7b, 0x44, 0x1e, 0x08, 0x65, 0x8b, 0xc1, 0x40, 0x24, 0x22, 0x3c, 0x8c, 0x21,
+	0x1f, 0xa1, 0xac, 0x03, 0x29, 0x2b, 0x39, 0xd1, 0x0d, 0x76, 0x87, 0xdc, 0xb0, 0xa8, 0xac, 0x70,
+	0x62, 0x14, 0xde, 0x1e, 0x87, 0xa9, 0x36, 0xe3, 0x00, 0xa5, 0x9b, 0xfd, 0x7f, 0xcf, 0x91, 0xd6,
+	0x9b, 0xf9, 0x41, 0xfb, 0xec, 0xad, 0xd7, 0x67, 0x4b, 0xeb, 0x2b, 0x0f, 0xbb, 0x2e, 0x3f, 0xf7,
+	0x9a, 0x57, 0x5e, 0xd3, 0xf9, 0xdb, 0xc9, 0x6c, 0xda, 0x9e, 0x1f, 0x4d, 0x3b, 0xd3, 0xbd, 0x59,
+	0xb9, 0x09, 0xeb, 0x85, 0x7b, 0xb8, 0xbf, 0xf8, 0xbf, 0xfd, 0xfb, 0x22, 0xfe, 0xfc, 0x71, 0xfe,
+	0x42, 0x0a, 0xf0, 0xe7, 0xf9, 0xfb, 0x69, 0x0c, 0x06, 0xbb, 0x8b, 0x76, 0x3c, 0x86, 0xd3, 0xa8,
+	0xdb, 0x2e, 0x3f, 0xb9, 0xf8, 0xbb, 0x06, 0xec, 0xc0, 0xee, 0x62, 0xa7, 0x01, 0xec, 0x8c, 0xba,
+	0x3b, 0x11, 0xf0, 0xcf, 0xf9, 0x56, 0xbc, 0xed, 0xf5, 0x60, 0x77, 0xd1, 0xeb, 0x35, 0x90, 0x5e,
+	0x6f, 0xd4, 0xed, 0xf5, 0x22, 0xe8, 0xd7, 0x8b, 0x65, 0x76, 0xdd, 0xff, 0x02, 0x00, 0x00, 0xff,
+	0xff, 0xbb, 0x55, 0x7e, 0xfc, 0x1c, 0x08, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/campaign_experiment_error.pb.go b/googleapis/ads/googleads/v3/errors/campaign_experiment_error.pb.go
new file mode 100644
index 0000000..e3b924f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/campaign_experiment_error.pb.go
@@ -0,0 +1,175 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/campaign_experiment_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible campaign experiment errors.
+type CampaignExperimentErrorEnum_CampaignExperimentError int32
+
+const (
+	// Enum unspecified.
+	CampaignExperimentErrorEnum_UNSPECIFIED CampaignExperimentErrorEnum_CampaignExperimentError = 0
+	// The received error code is not known in this version.
+	CampaignExperimentErrorEnum_UNKNOWN CampaignExperimentErrorEnum_CampaignExperimentError = 1
+	// An active campaign or experiment with this name already exists.
+	CampaignExperimentErrorEnum_DUPLICATE_NAME CampaignExperimentErrorEnum_CampaignExperimentError = 2
+	// Experiment cannot be updated from the current state to the
+	// requested target state. For example, an experiment can only graduate
+	// if its status is ENABLED.
+	CampaignExperimentErrorEnum_INVALID_TRANSITION CampaignExperimentErrorEnum_CampaignExperimentError = 3
+	// Cannot create an experiment from a campaign using an explicitly shared
+	// budget.
+	CampaignExperimentErrorEnum_CANNOT_CREATE_EXPERIMENT_WITH_SHARED_BUDGET CampaignExperimentErrorEnum_CampaignExperimentError = 4
+	// Cannot create an experiment for a removed base campaign.
+	CampaignExperimentErrorEnum_CANNOT_CREATE_EXPERIMENT_FOR_REMOVED_BASE_CAMPAIGN CampaignExperimentErrorEnum_CampaignExperimentError = 5
+	// Cannot create an experiment from a draft, which has a status other than
+	// proposed.
+	CampaignExperimentErrorEnum_CANNOT_CREATE_EXPERIMENT_FOR_NON_PROPOSED_DRAFT CampaignExperimentErrorEnum_CampaignExperimentError = 6
+	// This customer is not allowed to create an experiment.
+	CampaignExperimentErrorEnum_CUSTOMER_CANNOT_CREATE_EXPERIMENT CampaignExperimentErrorEnum_CampaignExperimentError = 7
+	// This campaign is not allowed to create an experiment.
+	CampaignExperimentErrorEnum_CAMPAIGN_CANNOT_CREATE_EXPERIMENT CampaignExperimentErrorEnum_CampaignExperimentError = 8
+	// Trying to set an experiment duration which overlaps with another
+	// experiment.
+	CampaignExperimentErrorEnum_EXPERIMENT_DURATIONS_MUST_NOT_OVERLAP CampaignExperimentErrorEnum_CampaignExperimentError = 9
+	// All non-removed experiments must start and end within their campaign's
+	// duration.
+	CampaignExperimentErrorEnum_EXPERIMENT_DURATION_MUST_BE_WITHIN_CAMPAIGN_DURATION CampaignExperimentErrorEnum_CampaignExperimentError = 10
+	// The experiment cannot be modified because its status is in a terminal
+	// state, such as REMOVED.
+	CampaignExperimentErrorEnum_CANNOT_MUTATE_EXPERIMENT_DUE_TO_STATUS CampaignExperimentErrorEnum_CampaignExperimentError = 11
+)
+
+var CampaignExperimentErrorEnum_CampaignExperimentError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "DUPLICATE_NAME",
+	3:  "INVALID_TRANSITION",
+	4:  "CANNOT_CREATE_EXPERIMENT_WITH_SHARED_BUDGET",
+	5:  "CANNOT_CREATE_EXPERIMENT_FOR_REMOVED_BASE_CAMPAIGN",
+	6:  "CANNOT_CREATE_EXPERIMENT_FOR_NON_PROPOSED_DRAFT",
+	7:  "CUSTOMER_CANNOT_CREATE_EXPERIMENT",
+	8:  "CAMPAIGN_CANNOT_CREATE_EXPERIMENT",
+	9:  "EXPERIMENT_DURATIONS_MUST_NOT_OVERLAP",
+	10: "EXPERIMENT_DURATION_MUST_BE_WITHIN_CAMPAIGN_DURATION",
+	11: "CANNOT_MUTATE_EXPERIMENT_DUE_TO_STATUS",
+}
+
+var CampaignExperimentErrorEnum_CampaignExperimentError_value = map[string]int32{
+	"UNSPECIFIED":        0,
+	"UNKNOWN":            1,
+	"DUPLICATE_NAME":     2,
+	"INVALID_TRANSITION": 3,
+	"CANNOT_CREATE_EXPERIMENT_WITH_SHARED_BUDGET":          4,
+	"CANNOT_CREATE_EXPERIMENT_FOR_REMOVED_BASE_CAMPAIGN":   5,
+	"CANNOT_CREATE_EXPERIMENT_FOR_NON_PROPOSED_DRAFT":      6,
+	"CUSTOMER_CANNOT_CREATE_EXPERIMENT":                    7,
+	"CAMPAIGN_CANNOT_CREATE_EXPERIMENT":                    8,
+	"EXPERIMENT_DURATIONS_MUST_NOT_OVERLAP":                9,
+	"EXPERIMENT_DURATION_MUST_BE_WITHIN_CAMPAIGN_DURATION": 10,
+	"CANNOT_MUTATE_EXPERIMENT_DUE_TO_STATUS":               11,
+}
+
+func (x CampaignExperimentErrorEnum_CampaignExperimentError) String() string {
+	return proto.EnumName(CampaignExperimentErrorEnum_CampaignExperimentError_name, int32(x))
+}
+
+func (CampaignExperimentErrorEnum_CampaignExperimentError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_f9f22a1dd7457e60, []int{0, 0}
+}
+
+// Container for enum describing possible campaign experiment errors.
+type CampaignExperimentErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignExperimentErrorEnum) Reset()         { *m = CampaignExperimentErrorEnum{} }
+func (m *CampaignExperimentErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignExperimentErrorEnum) ProtoMessage()    {}
+func (*CampaignExperimentErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f9f22a1dd7457e60, []int{0}
+}
+
+func (m *CampaignExperimentErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignExperimentErrorEnum.Unmarshal(m, b)
+}
+func (m *CampaignExperimentErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignExperimentErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignExperimentErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignExperimentErrorEnum.Merge(m, src)
+}
+func (m *CampaignExperimentErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignExperimentErrorEnum.Size(m)
+}
+func (m *CampaignExperimentErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignExperimentErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignExperimentErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CampaignExperimentErrorEnum_CampaignExperimentError", CampaignExperimentErrorEnum_CampaignExperimentError_name, CampaignExperimentErrorEnum_CampaignExperimentError_value)
+	proto.RegisterType((*CampaignExperimentErrorEnum)(nil), "google.ads.googleads.v3.errors.CampaignExperimentErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/campaign_experiment_error.proto", fileDescriptor_f9f22a1dd7457e60)
+}
+
+var fileDescriptor_f9f22a1dd7457e60 = []byte{
+	// 502 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xd1, 0x8b, 0xd3, 0x30,
+	0x1c, 0xc7, 0xbd, 0xed, 0xbc, 0xd3, 0x0c, 0x34, 0xe4, 0x41, 0x41, 0x8f, 0x03, 0x07, 0x27, 0xa8,
+	0xd0, 0x82, 0x15, 0x91, 0x0a, 0x42, 0xd6, 0xfe, 0xb6, 0x0b, 0xae, 0x49, 0x49, 0xd3, 0x9e, 0xc8,
+	0x20, 0xd4, 0x5b, 0x29, 0x83, 0x5b, 0x3b, 0xda, 0x79, 0xf8, 0xe8, 0xdf, 0xe2, 0xa3, 0x7f, 0x8a,
+	0x7f, 0x85, 0xcf, 0xfe, 0x03, 0xbe, 0x4a, 0x9b, 0xad, 0x88, 0xd8, 0x7b, 0xea, 0x8f, 0xe6, 0xf3,
+	0xc9, 0x37, 0x09, 0x5f, 0xf4, 0x2e, 0x2f, 0xcb, 0xfc, 0x2a, 0xb3, 0xd3, 0x65, 0x6d, 0x9b, 0xb1,
+	0x99, 0xae, 0x1d, 0x3b, 0xab, 0xaa, 0xb2, 0xaa, 0xed, 0xcb, 0x74, 0xbd, 0x49, 0x57, 0x79, 0xa1,
+	0xb3, 0x2f, 0x9b, 0xac, 0x5a, 0xad, 0xb3, 0x62, 0xab, 0xdb, 0x25, 0x6b, 0x53, 0x95, 0xdb, 0x92,
+	0x9c, 0x1a, 0xc9, 0x4a, 0x97, 0xb5, 0xd5, 0xf9, 0xd6, 0xb5, 0x63, 0x19, 0xff, 0xd1, 0xc9, 0x7e,
+	0xff, 0xcd, 0xca, 0x4e, 0x8b, 0xa2, 0xdc, 0xa6, 0xdb, 0x55, 0x59, 0xd4, 0xc6, 0x1e, 0x7f, 0x3d,
+	0x44, 0x8f, 0xbd, 0x5d, 0x02, 0x74, 0x01, 0xd0, 0xa8, 0x50, 0x7c, 0x5e, 0x8f, 0x7f, 0x0e, 0xd1,
+	0xc3, 0x9e, 0x75, 0x72, 0x1f, 0x8d, 0x62, 0x1e, 0x85, 0xe0, 0xb1, 0x29, 0x03, 0x1f, 0xdf, 0x22,
+	0x23, 0x74, 0x1c, 0xf3, 0xf7, 0x5c, 0x5c, 0x70, 0x7c, 0x40, 0x08, 0xba, 0xe7, 0xc7, 0xe1, 0x9c,
+	0x79, 0x54, 0x81, 0xe6, 0x34, 0x00, 0x3c, 0x20, 0x0f, 0x10, 0x61, 0x3c, 0xa1, 0x73, 0xe6, 0x6b,
+	0x25, 0x29, 0x8f, 0x98, 0x62, 0x82, 0xe3, 0x21, 0xb1, 0xd1, 0x0b, 0x8f, 0x72, 0x2e, 0x94, 0xf6,
+	0x24, 0x34, 0x3c, 0x7c, 0x08, 0x41, 0xb2, 0x00, 0xb8, 0xd2, 0x17, 0x4c, 0x9d, 0xeb, 0xe8, 0x9c,
+	0x4a, 0xf0, 0xf5, 0x24, 0xf6, 0x67, 0xa0, 0xf0, 0x21, 0x79, 0x8d, 0x5e, 0xf6, 0x0a, 0x53, 0x21,
+	0xb5, 0x84, 0x40, 0x24, 0x8d, 0x40, 0x23, 0xd0, 0x1e, 0x0d, 0x42, 0xca, 0x66, 0x1c, 0xdf, 0x26,
+	0x0e, 0xb2, 0x6f, 0xf4, 0xb8, 0xe0, 0x3a, 0x94, 0x22, 0x14, 0x11, 0xf8, 0xda, 0x97, 0x74, 0xaa,
+	0xf0, 0x11, 0x39, 0x43, 0x4f, 0xbc, 0x38, 0x52, 0x22, 0x00, 0xa9, 0xfb, 0x6c, 0x7c, 0xdc, 0x62,
+	0xbb, 0xa4, 0x7e, 0xec, 0x0e, 0x79, 0x86, 0xce, 0xfe, 0x0a, 0xf5, 0x63, 0x49, 0x9b, 0x47, 0x88,
+	0x74, 0x10, 0x47, 0x4a, 0x37, 0x92, 0x48, 0x40, 0xce, 0x69, 0x88, 0xef, 0x92, 0x37, 0xe8, 0xd5,
+	0x7f, 0x50, 0x43, 0x4e, 0xa0, 0x7d, 0x19, 0xc6, 0xbb, 0xeb, 0x75, 0x00, 0x46, 0xe4, 0x39, 0x7a,
+	0xba, 0x3b, 0x42, 0x10, 0xab, 0x7f, 0xee, 0xe9, 0xc7, 0xa0, 0x95, 0xd0, 0x91, 0xa2, 0x2a, 0x8e,
+	0xf0, 0x68, 0xf2, 0xfb, 0x00, 0x8d, 0x2f, 0xcb, 0xb5, 0x75, 0x73, 0x8f, 0x26, 0x27, 0x3d, 0x35,
+	0x08, 0x9b, 0x1e, 0x85, 0x07, 0x1f, 0xfd, 0x9d, 0x9f, 0x97, 0x57, 0x69, 0x91, 0x5b, 0x65, 0x95,
+	0xdb, 0x79, 0x56, 0xb4, 0x2d, 0xdb, 0xf7, 0x7a, 0xb3, 0xaa, 0xfb, 0x6a, 0xfe, 0xd6, 0x7c, 0xbe,
+	0x0d, 0x86, 0x33, 0x4a, 0xbf, 0x0f, 0x4e, 0x67, 0x66, 0x33, 0xba, 0xac, 0x2d, 0x33, 0x36, 0x53,
+	0xe2, 0x58, 0x6d, 0x64, 0xfd, 0x63, 0x0f, 0x2c, 0xe8, 0xb2, 0x5e, 0x74, 0xc0, 0x22, 0x71, 0x16,
+	0x06, 0xf8, 0x35, 0x18, 0x9b, 0xbf, 0xae, 0x4b, 0x97, 0xb5, 0xeb, 0x76, 0x88, 0xeb, 0x26, 0x8e,
+	0xeb, 0x1a, 0xe8, 0xd3, 0x51, 0x7b, 0x3a, 0xe7, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5c, 0x5e,
+	0x9e, 0xd9, 0x83, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/campaign_feed_error.pb.go b/googleapis/ads/googleads/v3/errors/campaign_feed_error.pb.go
new file mode 100644
index 0000000..f7d39bf
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/campaign_feed_error.pb.go
@@ -0,0 +1,154 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/campaign_feed_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible campaign feed errors.
+type CampaignFeedErrorEnum_CampaignFeedError int32
+
+const (
+	// Enum unspecified.
+	CampaignFeedErrorEnum_UNSPECIFIED CampaignFeedErrorEnum_CampaignFeedError = 0
+	// The received error code is not known in this version.
+	CampaignFeedErrorEnum_UNKNOWN CampaignFeedErrorEnum_CampaignFeedError = 1
+	// An active feed already exists for this campaign and placeholder type.
+	CampaignFeedErrorEnum_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE CampaignFeedErrorEnum_CampaignFeedError = 2
+	// The specified feed is removed.
+	CampaignFeedErrorEnum_CANNOT_CREATE_FOR_REMOVED_FEED CampaignFeedErrorEnum_CampaignFeedError = 4
+	// The CampaignFeed already exists. UPDATE should be used to modify the
+	// existing CampaignFeed.
+	CampaignFeedErrorEnum_CANNOT_CREATE_ALREADY_EXISTING_CAMPAIGN_FEED CampaignFeedErrorEnum_CampaignFeedError = 5
+	// Cannot update removed campaign feed.
+	CampaignFeedErrorEnum_CANNOT_MODIFY_REMOVED_CAMPAIGN_FEED CampaignFeedErrorEnum_CampaignFeedError = 6
+	// Invalid placeholder type.
+	CampaignFeedErrorEnum_INVALID_PLACEHOLDER_TYPE CampaignFeedErrorEnum_CampaignFeedError = 7
+	// Feed mapping for this placeholder type does not exist.
+	CampaignFeedErrorEnum_MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE CampaignFeedErrorEnum_CampaignFeedError = 8
+	// Location CampaignFeeds cannot be created unless there is a location
+	// CustomerFeed for the specified feed.
+	CampaignFeedErrorEnum_NO_EXISTING_LOCATION_CUSTOMER_FEED CampaignFeedErrorEnum_CampaignFeedError = 9
+)
+
+var CampaignFeedErrorEnum_CampaignFeedError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE",
+	4: "CANNOT_CREATE_FOR_REMOVED_FEED",
+	5: "CANNOT_CREATE_ALREADY_EXISTING_CAMPAIGN_FEED",
+	6: "CANNOT_MODIFY_REMOVED_CAMPAIGN_FEED",
+	7: "INVALID_PLACEHOLDER_TYPE",
+	8: "MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE",
+	9: "NO_EXISTING_LOCATION_CUSTOMER_FEED",
+}
+
+var CampaignFeedErrorEnum_CampaignFeedError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE":     2,
+	"CANNOT_CREATE_FOR_REMOVED_FEED":               4,
+	"CANNOT_CREATE_ALREADY_EXISTING_CAMPAIGN_FEED": 5,
+	"CANNOT_MODIFY_REMOVED_CAMPAIGN_FEED":          6,
+	"INVALID_PLACEHOLDER_TYPE":                     7,
+	"MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE":     8,
+	"NO_EXISTING_LOCATION_CUSTOMER_FEED":           9,
+}
+
+func (x CampaignFeedErrorEnum_CampaignFeedError) String() string {
+	return proto.EnumName(CampaignFeedErrorEnum_CampaignFeedError_name, int32(x))
+}
+
+func (CampaignFeedErrorEnum_CampaignFeedError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a4307471cace193a, []int{0, 0}
+}
+
+// Container for enum describing possible campaign feed errors.
+type CampaignFeedErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignFeedErrorEnum) Reset()         { *m = CampaignFeedErrorEnum{} }
+func (m *CampaignFeedErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignFeedErrorEnum) ProtoMessage()    {}
+func (*CampaignFeedErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a4307471cace193a, []int{0}
+}
+
+func (m *CampaignFeedErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignFeedErrorEnum.Unmarshal(m, b)
+}
+func (m *CampaignFeedErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignFeedErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignFeedErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignFeedErrorEnum.Merge(m, src)
+}
+func (m *CampaignFeedErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignFeedErrorEnum.Size(m)
+}
+func (m *CampaignFeedErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignFeedErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignFeedErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CampaignFeedErrorEnum_CampaignFeedError", CampaignFeedErrorEnum_CampaignFeedError_name, CampaignFeedErrorEnum_CampaignFeedError_value)
+	proto.RegisterType((*CampaignFeedErrorEnum)(nil), "google.ads.googleads.v3.errors.CampaignFeedErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/campaign_feed_error.proto", fileDescriptor_a4307471cace193a)
+}
+
+var fileDescriptor_a4307471cace193a = []byte{
+	// 445 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x41, 0x8e, 0xd3, 0x30,
+	0x14, 0x86, 0x69, 0x80, 0x19, 0xf0, 0x2c, 0x28, 0x96, 0x40, 0x08, 0x8d, 0xba, 0x08, 0x12, 0xb0,
+	0x18, 0x39, 0x48, 0xd9, 0xa0, 0xb0, 0xf2, 0x24, 0x4e, 0xb1, 0x48, 0xec, 0x28, 0x49, 0x03, 0x45,
+	0x95, 0xac, 0x30, 0x09, 0x51, 0xa5, 0x69, 0x5c, 0xc5, 0xa5, 0x07, 0x62, 0xc9, 0x51, 0x58, 0x72,
+	0x0c, 0xc4, 0x86, 0x1b, 0x20, 0xc7, 0x6d, 0x50, 0x55, 0x98, 0x55, 0x7e, 0x39, 0xdf, 0xff, 0xbf,
+	0x67, 0xbf, 0x07, 0x5e, 0x37, 0x52, 0x36, 0xd7, 0xb5, 0x53, 0x56, 0xca, 0x31, 0x52, 0xab, 0xad,
+	0xeb, 0xd4, 0x5d, 0x27, 0x3b, 0xe5, 0x5c, 0x95, 0xab, 0x75, 0xb9, 0x6c, 0x5a, 0xf1, 0xb9, 0xae,
+	0x2b, 0xd1, 0x1f, 0xa2, 0x75, 0x27, 0x37, 0x12, 0x4e, 0x0c, 0x8e, 0xca, 0x4a, 0xa1, 0xc1, 0x89,
+	0xb6, 0x2e, 0x32, 0xce, 0xa7, 0xe7, 0xfb, 0xe4, 0xf5, 0xd2, 0x29, 0xdb, 0x56, 0x6e, 0xca, 0xcd,
+	0x52, 0xb6, 0xca, 0xb8, 0xed, 0x5f, 0x16, 0x78, 0xe4, 0xef, 0xb2, 0xc3, 0xba, 0xae, 0x88, 0x36,
+	0x91, 0xf6, 0xcb, 0xca, 0xfe, 0x61, 0x81, 0x87, 0x47, 0x7f, 0xe0, 0x03, 0x70, 0x36, 0x63, 0x59,
+	0x42, 0x7c, 0x1a, 0x52, 0x12, 0x8c, 0x6f, 0xc1, 0x33, 0x70, 0x3a, 0x63, 0xef, 0x18, 0x7f, 0xcf,
+	0xc6, 0x23, 0x78, 0x01, 0x5e, 0x86, 0x84, 0x04, 0x02, 0x47, 0x29, 0xc1, 0xc1, 0x5c, 0x90, 0x0f,
+	0x34, 0xcb, 0x33, 0x11, 0xf2, 0x54, 0x24, 0x11, 0xf6, 0xc9, 0x5b, 0x1e, 0x05, 0x24, 0x15, 0xf9,
+	0x3c, 0x21, 0x63, 0x0b, 0xda, 0x60, 0xe2, 0x63, 0xc6, 0x78, 0x2e, 0xfc, 0x94, 0xe0, 0x9c, 0xf4,
+	0x5c, 0x4a, 0x62, 0x5e, 0x90, 0x40, 0xe8, 0x9c, 0xf1, 0x1d, 0xf8, 0x0a, 0x5c, 0x1c, 0x32, 0x07,
+	0xd1, 0x94, 0x4d, 0x85, 0x8f, 0xe3, 0x04, 0xd3, 0x29, 0x33, 0x8e, 0xbb, 0xf0, 0x05, 0x78, 0xb6,
+	0x73, 0xc4, 0x3c, 0xa0, 0xe1, 0x7c, 0x48, 0x3c, 0x04, 0x4f, 0xe0, 0x39, 0x78, 0x42, 0x59, 0x81,
+	0x23, 0x1a, 0x1c, 0x37, 0x77, 0xaa, 0xaf, 0x12, 0xd3, 0x2c, 0xd3, 0x15, 0x34, 0x1f, 0xe3, 0x24,
+	0xe9, 0xf5, 0xbf, 0xae, 0x72, 0x0f, 0x3e, 0x07, 0x36, 0xe3, 0x7f, 0x7b, 0x8a, 0xb8, 0x8f, 0x73,
+	0xca, 0x99, 0xf0, 0x67, 0x59, 0xce, 0x63, 0x92, 0x9a, 0x9a, 0xf7, 0x2f, 0x7f, 0x8f, 0x80, 0x7d,
+	0x25, 0x57, 0xe8, 0xe6, 0x99, 0x5d, 0x3e, 0x3e, 0x7a, 0xf8, 0x44, 0x4f, 0x2b, 0x19, 0x7d, 0x0c,
+	0x76, 0xce, 0x46, 0x5e, 0x97, 0x6d, 0x83, 0x64, 0xd7, 0x38, 0x4d, 0xdd, 0xf6, 0xb3, 0xdc, 0xef,
+	0xcd, 0x7a, 0xa9, 0xfe, 0xb7, 0x46, 0x6f, 0xcc, 0xe7, 0xab, 0x75, 0x7b, 0x8a, 0xf1, 0x37, 0x6b,
+	0x32, 0x35, 0x61, 0xb8, 0x52, 0xc8, 0x48, 0xad, 0x0a, 0x17, 0xf5, 0x25, 0xd5, 0xf7, 0x3d, 0xb0,
+	0xc0, 0x95, 0x5a, 0x0c, 0xc0, 0xa2, 0x70, 0x17, 0x06, 0xf8, 0x69, 0xd9, 0xe6, 0xd4, 0xf3, 0x70,
+	0xa5, 0x3c, 0x6f, 0x40, 0x3c, 0xaf, 0x70, 0x3d, 0xcf, 0x40, 0x9f, 0x4e, 0xfa, 0xee, 0xdc, 0x3f,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0x6c, 0x14, 0x3d, 0x9c, 0xe3, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/campaign_shared_set_error.pb.go b/googleapis/ads/googleads/v3/errors/campaign_shared_set_error.pb.go
new file mode 100644
index 0000000..bc6525f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/campaign_shared_set_error.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/campaign_shared_set_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible campaign shared set errors.
+type CampaignSharedSetErrorEnum_CampaignSharedSetError int32
+
+const (
+	// Enum unspecified.
+	CampaignSharedSetErrorEnum_UNSPECIFIED CampaignSharedSetErrorEnum_CampaignSharedSetError = 0
+	// The received error code is not known in this version.
+	CampaignSharedSetErrorEnum_UNKNOWN CampaignSharedSetErrorEnum_CampaignSharedSetError = 1
+	// The shared set belongs to another customer and permission isn't granted.
+	CampaignSharedSetErrorEnum_SHARED_SET_ACCESS_DENIED CampaignSharedSetErrorEnum_CampaignSharedSetError = 2
+)
+
+var CampaignSharedSetErrorEnum_CampaignSharedSetError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "SHARED_SET_ACCESS_DENIED",
+}
+
+var CampaignSharedSetErrorEnum_CampaignSharedSetError_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"SHARED_SET_ACCESS_DENIED": 2,
+}
+
+func (x CampaignSharedSetErrorEnum_CampaignSharedSetError) String() string {
+	return proto.EnumName(CampaignSharedSetErrorEnum_CampaignSharedSetError_name, int32(x))
+}
+
+func (CampaignSharedSetErrorEnum_CampaignSharedSetError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6b80018c978188cf, []int{0, 0}
+}
+
+// Container for enum describing possible campaign shared set errors.
+type CampaignSharedSetErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignSharedSetErrorEnum) Reset()         { *m = CampaignSharedSetErrorEnum{} }
+func (m *CampaignSharedSetErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CampaignSharedSetErrorEnum) ProtoMessage()    {}
+func (*CampaignSharedSetErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b80018c978188cf, []int{0}
+}
+
+func (m *CampaignSharedSetErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignSharedSetErrorEnum.Unmarshal(m, b)
+}
+func (m *CampaignSharedSetErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignSharedSetErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CampaignSharedSetErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignSharedSetErrorEnum.Merge(m, src)
+}
+func (m *CampaignSharedSetErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CampaignSharedSetErrorEnum.Size(m)
+}
+func (m *CampaignSharedSetErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignSharedSetErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignSharedSetErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CampaignSharedSetErrorEnum_CampaignSharedSetError", CampaignSharedSetErrorEnum_CampaignSharedSetError_name, CampaignSharedSetErrorEnum_CampaignSharedSetError_value)
+	proto.RegisterType((*CampaignSharedSetErrorEnum)(nil), "google.ads.googleads.v3.errors.CampaignSharedSetErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/campaign_shared_set_error.proto", fileDescriptor_6b80018c978188cf)
+}
+
+var fileDescriptor_6b80018c978188cf = []byte{
+	// 313 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x18, 0xc7, 0x5d, 0x05, 0x85, 0xec, 0xe0, 0xe8, 0x41, 0x64, 0x8e, 0x1d, 0xfa, 0x00, 0xe9, 0xa1,
+	0xb7, 0x08, 0x42, 0xd6, 0xc6, 0x39, 0x84, 0x3a, 0xcc, 0x36, 0x41, 0x0a, 0x21, 0x2e, 0x21, 0x16,
+	0xb6, 0xa4, 0x24, 0x75, 0x0f, 0xe4, 0xd1, 0x47, 0xf1, 0x51, 0x7c, 0x00, 0xcf, 0xd2, 0x66, 0xeb,
+	0x69, 0x7a, 0xea, 0x9f, 0x7e, 0xbf, 0xdf, 0xf7, 0x7d, 0xf9, 0xc0, 0xad, 0x32, 0x46, 0x6d, 0x64,
+	0xcc, 0x85, 0x8b, 0x7d, 0x6c, 0xd2, 0x2e, 0x89, 0xa5, 0xb5, 0xc6, 0xba, 0x78, 0xcd, 0xb7, 0x15,
+	0x2f, 0x95, 0x66, 0xee, 0x8d, 0x5b, 0x29, 0x98, 0x93, 0x35, 0x6b, 0x4b, 0xb0, 0xb2, 0xa6, 0x36,
+	0xe1, 0xd8, 0x4b, 0x90, 0x0b, 0x07, 0x3b, 0x1f, 0xee, 0x12, 0xe8, 0xfd, 0xe1, 0xe8, 0xd0, 0xbf,
+	0x2a, 0x63, 0xae, 0xb5, 0xa9, 0x79, 0x5d, 0x1a, 0xed, 0xbc, 0x1d, 0x59, 0x30, 0x4c, 0xf7, 0x03,
+	0x68, 0xdb, 0x9f, 0xca, 0x9a, 0x34, 0x22, 0xd1, 0xef, 0xdb, 0x68, 0x01, 0x2e, 0x8f, 0x57, 0xc3,
+	0x0b, 0xd0, 0x5f, 0xe6, 0x74, 0x4e, 0xd2, 0xd9, 0xdd, 0x8c, 0x64, 0x83, 0x93, 0xb0, 0x0f, 0xce,
+	0x97, 0xf9, 0x43, 0xfe, 0xf8, 0x9c, 0x0f, 0x7a, 0xe1, 0x08, 0x5c, 0xd1, 0x7b, 0xfc, 0x44, 0x32,
+	0x46, 0xc9, 0x82, 0xe1, 0x34, 0x25, 0x94, 0xb2, 0x8c, 0xe4, 0x0d, 0x1a, 0x4c, 0x7e, 0x7a, 0x20,
+	0x5a, 0x9b, 0x2d, 0xfc, 0x7f, 0xf1, 0xc9, 0xf5, 0xf1, 0xd1, 0xf3, 0x66, 0xef, 0x79, 0xef, 0x25,
+	0xdb, 0xeb, 0xca, 0x6c, 0xb8, 0x56, 0xd0, 0x58, 0x15, 0x2b, 0xa9, 0xdb, 0x57, 0x1d, 0xee, 0x58,
+	0x95, 0xee, 0xaf, 0xb3, 0xde, 0xf8, 0xcf, 0x47, 0x70, 0x3a, 0xc5, 0xf8, 0x33, 0x18, 0x4f, 0x7d,
+	0x33, 0x2c, 0x1c, 0xf4, 0xb1, 0x49, 0xab, 0x04, 0xb6, 0x23, 0xdd, 0xd7, 0x01, 0x28, 0xb0, 0x70,
+	0x45, 0x07, 0x14, 0xab, 0xa4, 0xf0, 0xc0, 0x77, 0x10, 0xf9, 0xbf, 0x08, 0x61, 0xe1, 0x10, 0xea,
+	0x10, 0x84, 0x56, 0x09, 0x42, 0x1e, 0x7a, 0x3d, 0x6b, 0xb7, 0x4b, 0x7e, 0x03, 0x00, 0x00, 0xff,
+	0xff, 0xfd, 0x86, 0x7d, 0x8a, 0xf3, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/change_status_error.pb.go b/googleapis/ads/googleads/v3/errors/change_status_error.pb.go
new file mode 100644
index 0000000..f794f6b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/change_status_error.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/change_status_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible change status errors.
+type ChangeStatusErrorEnum_ChangeStatusError int32
+
+const (
+	// Enum unspecified.
+	ChangeStatusErrorEnum_UNSPECIFIED ChangeStatusErrorEnum_ChangeStatusError = 0
+	// The received error code is not known in this version.
+	ChangeStatusErrorEnum_UNKNOWN ChangeStatusErrorEnum_ChangeStatusError = 1
+	// The requested start date is too old.
+	ChangeStatusErrorEnum_START_DATE_TOO_OLD ChangeStatusErrorEnum_ChangeStatusError = 3
+)
+
+var ChangeStatusErrorEnum_ChangeStatusError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	3: "START_DATE_TOO_OLD",
+}
+
+var ChangeStatusErrorEnum_ChangeStatusError_value = map[string]int32{
+	"UNSPECIFIED":        0,
+	"UNKNOWN":            1,
+	"START_DATE_TOO_OLD": 3,
+}
+
+func (x ChangeStatusErrorEnum_ChangeStatusError) String() string {
+	return proto.EnumName(ChangeStatusErrorEnum_ChangeStatusError_name, int32(x))
+}
+
+func (ChangeStatusErrorEnum_ChangeStatusError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_75754e84c034b454, []int{0, 0}
+}
+
+// Container for enum describing possible change status errors.
+type ChangeStatusErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ChangeStatusErrorEnum) Reset()         { *m = ChangeStatusErrorEnum{} }
+func (m *ChangeStatusErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ChangeStatusErrorEnum) ProtoMessage()    {}
+func (*ChangeStatusErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_75754e84c034b454, []int{0}
+}
+
+func (m *ChangeStatusErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ChangeStatusErrorEnum.Unmarshal(m, b)
+}
+func (m *ChangeStatusErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ChangeStatusErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ChangeStatusErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ChangeStatusErrorEnum.Merge(m, src)
+}
+func (m *ChangeStatusErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ChangeStatusErrorEnum.Size(m)
+}
+func (m *ChangeStatusErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ChangeStatusErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ChangeStatusErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ChangeStatusErrorEnum_ChangeStatusError", ChangeStatusErrorEnum_ChangeStatusError_name, ChangeStatusErrorEnum_ChangeStatusError_value)
+	proto.RegisterType((*ChangeStatusErrorEnum)(nil), "google.ads.googleads.v3.errors.ChangeStatusErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/change_status_error.proto", fileDescriptor_75754e84c034b454)
+}
+
+var fileDescriptor_75754e84c034b454 = []byte{
+	// 305 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0xdd, 0x06, 0x0a, 0xd9, 0xc1, 0x5a, 0x70, 0x07, 0x91, 0x1d, 0xfa, 0x00, 0xc9, 0x21,
+	0x17, 0x89, 0xa7, 0x6c, 0xad, 0xa3, 0x28, 0x6d, 0xb1, 0x5d, 0x05, 0x29, 0x94, 0x6c, 0x2d, 0xb1,
+	0xb0, 0x25, 0xa5, 0xe9, 0xf6, 0x40, 0x1e, 0x7d, 0x14, 0x1f, 0xc5, 0x9b, 0x6f, 0x20, 0x4d, 0x6c,
+	0x2f, 0x43, 0x4f, 0xfd, 0xf8, 0xf7, 0xf7, 0x7d, 0xff, 0x2f, 0x7f, 0x70, 0xc7, 0xa5, 0xe4, 0xbb,
+	0x12, 0xb1, 0x42, 0x21, 0x23, 0x3b, 0x75, 0xc4, 0xa8, 0x6c, 0x1a, 0xd9, 0x28, 0xb4, 0x7d, 0x63,
+	0x82, 0x97, 0xb9, 0x6a, 0x59, 0x7b, 0x50, 0xb9, 0x1e, 0xc2, 0xba, 0x91, 0xad, 0xb4, 0xe7, 0x06,
+	0x87, 0xac, 0x50, 0x70, 0x70, 0xc2, 0x23, 0x86, 0xc6, 0x79, 0x73, 0xdb, 0x27, 0xd7, 0x15, 0x62,
+	0x42, 0xc8, 0x96, 0xb5, 0x95, 0x14, 0xca, 0xb8, 0x9d, 0x0d, 0xb8, 0x5e, 0xea, 0xe8, 0x58, 0x27,
+	0x7b, 0x9d, 0xc7, 0x13, 0x87, 0xbd, 0xe3, 0x83, 0xab, 0x93, 0x1f, 0xf6, 0x25, 0x98, 0xae, 0x83,
+	0x38, 0xf2, 0x96, 0xfe, 0x83, 0xef, 0xb9, 0xd6, 0x99, 0x3d, 0x05, 0x17, 0xeb, 0xe0, 0x31, 0x08,
+	0x5f, 0x02, 0x6b, 0x64, 0xcf, 0x80, 0x1d, 0x27, 0xf4, 0x39, 0xc9, 0x5d, 0x9a, 0x78, 0x79, 0x12,
+	0x86, 0x79, 0xf8, 0xe4, 0x5a, 0x93, 0xc5, 0xf7, 0x08, 0x38, 0x5b, 0xb9, 0x87, 0xff, 0x17, 0x5d,
+	0xcc, 0x4e, 0xf6, 0x45, 0x5d, 0xc5, 0x68, 0xf4, 0xea, 0xfe, 0x3a, 0xb9, 0xdc, 0x31, 0xc1, 0xa1,
+	0x6c, 0x38, 0xe2, 0xa5, 0xd0, 0x0f, 0xe8, 0x8f, 0x55, 0x57, 0xea, 0xaf, 0xdb, 0xdd, 0x9b, 0xcf,
+	0xfb, 0x78, 0xb2, 0xa2, 0xf4, 0x63, 0x3c, 0x5f, 0x99, 0x30, 0x5a, 0x28, 0x68, 0x64, 0xa7, 0x52,
+	0x0c, 0xf5, 0x4a, 0xf5, 0xd9, 0x03, 0x19, 0x2d, 0x54, 0x36, 0x00, 0x59, 0x8a, 0x33, 0x03, 0x7c,
+	0x8d, 0x1d, 0x33, 0x25, 0x84, 0x16, 0x8a, 0x90, 0x01, 0x21, 0x24, 0xc5, 0x84, 0x18, 0x68, 0x73,
+	0xae, 0xdb, 0xe1, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x10, 0x0a, 0xc5, 0x15, 0xd8, 0x01, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/collection_size_error.pb.go b/googleapis/ads/googleads/v3/errors/collection_size_error.pb.go
new file mode 100644
index 0000000..7115e20
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/collection_size_error.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/collection_size_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible collection size errors.
+type CollectionSizeErrorEnum_CollectionSizeError int32
+
+const (
+	// Enum unspecified.
+	CollectionSizeErrorEnum_UNSPECIFIED CollectionSizeErrorEnum_CollectionSizeError = 0
+	// The received error code is not known in this version.
+	CollectionSizeErrorEnum_UNKNOWN CollectionSizeErrorEnum_CollectionSizeError = 1
+	// Too few.
+	CollectionSizeErrorEnum_TOO_FEW CollectionSizeErrorEnum_CollectionSizeError = 2
+	// Too many.
+	CollectionSizeErrorEnum_TOO_MANY CollectionSizeErrorEnum_CollectionSizeError = 3
+)
+
+var CollectionSizeErrorEnum_CollectionSizeError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "TOO_FEW",
+	3: "TOO_MANY",
+}
+
+var CollectionSizeErrorEnum_CollectionSizeError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"TOO_FEW":     2,
+	"TOO_MANY":    3,
+}
+
+func (x CollectionSizeErrorEnum_CollectionSizeError) String() string {
+	return proto.EnumName(CollectionSizeErrorEnum_CollectionSizeError_name, int32(x))
+}
+
+func (CollectionSizeErrorEnum_CollectionSizeError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_04810df5586fcd04, []int{0, 0}
+}
+
+// Container for enum describing possible collection size errors.
+type CollectionSizeErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CollectionSizeErrorEnum) Reset()         { *m = CollectionSizeErrorEnum{} }
+func (m *CollectionSizeErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CollectionSizeErrorEnum) ProtoMessage()    {}
+func (*CollectionSizeErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_04810df5586fcd04, []int{0}
+}
+
+func (m *CollectionSizeErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CollectionSizeErrorEnum.Unmarshal(m, b)
+}
+func (m *CollectionSizeErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CollectionSizeErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CollectionSizeErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CollectionSizeErrorEnum.Merge(m, src)
+}
+func (m *CollectionSizeErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CollectionSizeErrorEnum.Size(m)
+}
+func (m *CollectionSizeErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CollectionSizeErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CollectionSizeErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CollectionSizeErrorEnum_CollectionSizeError", CollectionSizeErrorEnum_CollectionSizeError_name, CollectionSizeErrorEnum_CollectionSizeError_value)
+	proto.RegisterType((*CollectionSizeErrorEnum)(nil), "google.ads.googleads.v3.errors.CollectionSizeErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/collection_size_error.proto", fileDescriptor_04810df5586fcd04)
+}
+
+var fileDescriptor_04810df5586fcd04 = []byte{
+	// 306 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x18, 0xc7, 0x5d, 0x07, 0x2a, 0x99, 0x60, 0xa9, 0x07, 0x45, 0x64, 0x87, 0x3e, 0x40, 0x72, 0xc8,
+	0x2d, 0x9e, 0xb2, 0xad, 0x1b, 0x43, 0xcc, 0x06, 0x73, 0x1b, 0x4a, 0xa1, 0xd4, 0x36, 0x84, 0x40,
+	0x97, 0x94, 0xa6, 0xee, 0xb0, 0xc7, 0xf1, 0xe8, 0xa3, 0xf8, 0x28, 0x5e, 0x7d, 0x01, 0x49, 0x63,
+	0x7b, 0x9a, 0x9e, 0xfa, 0xff, 0xbe, 0xfe, 0x7f, 0xff, 0xef, 0xcb, 0x07, 0x88, 0xd0, 0x5a, 0x14,
+	0x1c, 0xa5, 0xb9, 0x41, 0x4e, 0x5a, 0xb5, 0xc7, 0x88, 0x57, 0x95, 0xae, 0x0c, 0xca, 0x74, 0x51,
+	0xf0, 0xac, 0x96, 0x5a, 0x25, 0x46, 0x1e, 0x78, 0xd2, 0xb4, 0x61, 0x59, 0xe9, 0x5a, 0x07, 0x43,
+	0x07, 0xc0, 0x34, 0x37, 0xb0, 0x63, 0xe1, 0x1e, 0x43, 0xc7, 0xde, 0xde, 0xb5, 0xd9, 0xa5, 0x44,
+	0xa9, 0x52, 0xba, 0x4e, 0x6d, 0x8e, 0x71, 0x74, 0x28, 0xc1, 0xf5, 0xb8, 0x0b, 0x5f, 0xc9, 0x03,
+	0x8f, 0x2c, 0x15, 0xa9, 0xb7, 0x5d, 0xc8, 0xc0, 0xd5, 0x91, 0x5f, 0xc1, 0x25, 0x18, 0xac, 0xd9,
+	0x6a, 0x19, 0x8d, 0xe7, 0xd3, 0x79, 0x34, 0xf1, 0x4f, 0x82, 0x01, 0x38, 0x5b, 0xb3, 0x07, 0xb6,
+	0xd8, 0x32, 0xbf, 0x67, 0x8b, 0xa7, 0xc5, 0x22, 0x99, 0x46, 0x5b, 0xdf, 0x0b, 0x2e, 0xc0, 0xb9,
+	0x2d, 0x1e, 0x29, 0x7b, 0xf6, 0xfb, 0xa3, 0xef, 0x1e, 0x08, 0x33, 0xbd, 0x83, 0xff, 0xef, 0x3b,
+	0xba, 0x39, 0x32, 0x74, 0x69, 0x77, 0x5d, 0xf6, 0x5e, 0x26, 0xbf, 0xac, 0xd0, 0x45, 0xaa, 0x04,
+	0xd4, 0x95, 0x40, 0x82, 0xab, 0xe6, 0x25, 0xed, 0xdd, 0x4a, 0x69, 0xfe, 0x3a, 0xe3, 0xbd, 0xfb,
+	0xbc, 0x7b, 0xfd, 0x19, 0xa5, 0x1f, 0xde, 0x70, 0xe6, 0xc2, 0x68, 0x6e, 0xa0, 0x93, 0x56, 0x6d,
+	0x30, 0x6c, 0x46, 0x9a, 0xcf, 0xd6, 0x10, 0xd3, 0xdc, 0xc4, 0x9d, 0x21, 0xde, 0xe0, 0xd8, 0x19,
+	0xbe, 0xbc, 0xd0, 0x75, 0x09, 0xa1, 0xb9, 0x21, 0xa4, 0xb3, 0x10, 0xb2, 0xc1, 0x84, 0x38, 0xd3,
+	0xeb, 0x69, 0xb3, 0x1d, 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0xed, 0xe7, 0xdb, 0x35, 0xe3, 0x01,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/context_error.pb.go b/googleapis/ads/googleads/v3/errors/context_error.pb.go
new file mode 100644
index 0000000..161ca64
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/context_error.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/context_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible context errors.
+type ContextErrorEnum_ContextError int32
+
+const (
+	// Enum unspecified.
+	ContextErrorEnum_UNSPECIFIED ContextErrorEnum_ContextError = 0
+	// The received error code is not known in this version.
+	ContextErrorEnum_UNKNOWN ContextErrorEnum_ContextError = 1
+	// The operation is not allowed for the given context.
+	ContextErrorEnum_OPERATION_NOT_PERMITTED_FOR_CONTEXT ContextErrorEnum_ContextError = 2
+	// The operation is not allowed for removed resources.
+	ContextErrorEnum_OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE ContextErrorEnum_ContextError = 3
+)
+
+var ContextErrorEnum_ContextError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "OPERATION_NOT_PERMITTED_FOR_CONTEXT",
+	3: "OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE",
+}
+
+var ContextErrorEnum_ContextError_value = map[string]int32{
+	"UNSPECIFIED":                         0,
+	"UNKNOWN":                             1,
+	"OPERATION_NOT_PERMITTED_FOR_CONTEXT": 2,
+	"OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE": 3,
+}
+
+func (x ContextErrorEnum_ContextError) String() string {
+	return proto.EnumName(ContextErrorEnum_ContextError_name, int32(x))
+}
+
+func (ContextErrorEnum_ContextError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_dfeff622d46c8b6d, []int{0, 0}
+}
+
+// Container for enum describing possible context errors.
+type ContextErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ContextErrorEnum) Reset()         { *m = ContextErrorEnum{} }
+func (m *ContextErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ContextErrorEnum) ProtoMessage()    {}
+func (*ContextErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dfeff622d46c8b6d, []int{0}
+}
+
+func (m *ContextErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ContextErrorEnum.Unmarshal(m, b)
+}
+func (m *ContextErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ContextErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ContextErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ContextErrorEnum.Merge(m, src)
+}
+func (m *ContextErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ContextErrorEnum.Size(m)
+}
+func (m *ContextErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ContextErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ContextErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ContextErrorEnum_ContextError", ContextErrorEnum_ContextError_name, ContextErrorEnum_ContextError_value)
+	proto.RegisterType((*ContextErrorEnum)(nil), "google.ads.googleads.v3.errors.ContextErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/context_error.proto", fileDescriptor_dfeff622d46c8b6d)
+}
+
+var fileDescriptor_dfeff622d46c8b6d = []byte{
+	// 336 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xf3, 0x40,
+	0x14, 0x85, 0xff, 0xa4, 0xf0, 0x0b, 0x53, 0xc1, 0x98, 0xa5, 0x48, 0x17, 0x71, 0xe1, 0x46, 0x26,
+	0x62, 0x76, 0xe3, 0x2a, 0x4d, 0x6e, 0x4b, 0x90, 0xce, 0x84, 0x34, 0x8d, 0x22, 0x81, 0x10, 0x9b,
+	0x10, 0x0a, 0xed, 0x4c, 0xc9, 0xc4, 0xe2, 0x1b, 0xf8, 0x12, 0xae, 0x5c, 0xfa, 0x28, 0x3e, 0x8a,
+	0xf8, 0x10, 0x92, 0x8c, 0x2d, 0xdd, 0xd8, 0x55, 0x4e, 0x2e, 0xdf, 0x39, 0x73, 0xcf, 0x45, 0x37,
+	0x95, 0x10, 0xd5, 0xb2, 0xb4, 0xf3, 0x42, 0xda, 0x4a, 0xb6, 0x6a, 0xe3, 0xd8, 0x65, 0x5d, 0x8b,
+	0x5a, 0xda, 0x73, 0xc1, 0x9b, 0xf2, 0xa5, 0xc9, 0xba, 0x5f, 0xbc, 0xae, 0x45, 0x23, 0xcc, 0x81,
+	0x02, 0x71, 0x5e, 0x48, 0xbc, 0xf3, 0xe0, 0x8d, 0x83, 0x95, 0xe7, 0xec, 0x7c, 0x9b, 0xb9, 0x5e,
+	0xd8, 0x39, 0xe7, 0xa2, 0xc9, 0x9b, 0x85, 0xe0, 0x52, 0xb9, 0xad, 0x37, 0x0d, 0x19, 0x9e, 0x4a,
+	0x85, 0x96, 0x07, 0xfe, 0xbc, 0xb2, 0x5e, 0x35, 0x74, 0xbc, 0x3f, 0x34, 0x4f, 0x50, 0x7f, 0x46,
+	0xa7, 0x21, 0x78, 0xc1, 0x28, 0x00, 0xdf, 0xf8, 0x67, 0xf6, 0xd1, 0xd1, 0x8c, 0xde, 0x51, 0x76,
+	0x4f, 0x0d, 0xcd, 0xbc, 0x44, 0x17, 0x2c, 0x84, 0xc8, 0x8d, 0x03, 0x46, 0x33, 0xca, 0xe2, 0x2c,
+	0x84, 0x68, 0x12, 0xc4, 0x31, 0xf8, 0xd9, 0x88, 0x45, 0x99, 0xc7, 0x68, 0x0c, 0x0f, 0xb1, 0xa1,
+	0x9b, 0xd7, 0xe8, 0xea, 0x10, 0x18, 0xc1, 0x84, 0x25, 0xe0, 0x67, 0x11, 0x4c, 0xd9, 0x2c, 0xf2,
+	0xc0, 0xe8, 0x0d, 0xbf, 0x35, 0x64, 0xcd, 0xc5, 0x0a, 0x1f, 0xee, 0x38, 0x3c, 0xdd, 0xdf, 0x36,
+	0x6c, 0x8b, 0x85, 0xda, 0xa3, 0xff, 0x6b, 0xaa, 0xc4, 0x32, 0xe7, 0x15, 0x16, 0x75, 0x65, 0x57,
+	0x25, 0xef, 0x6a, 0x6f, 0x8f, 0xbb, 0x5e, 0xc8, 0xbf, 0x6e, 0x7d, 0xab, 0x3e, 0xef, 0x7a, 0x6f,
+	0xec, 0xba, 0x1f, 0xfa, 0x60, 0xac, 0xc2, 0xdc, 0x42, 0x62, 0x25, 0x5b, 0x95, 0x38, 0xb8, 0x7b,
+	0x52, 0x7e, 0x6e, 0x81, 0xd4, 0x2d, 0x64, 0xba, 0x03, 0xd2, 0xc4, 0x49, 0x15, 0xf0, 0xa5, 0x5b,
+	0x6a, 0x4a, 0x88, 0x5b, 0x48, 0x42, 0x76, 0x08, 0x21, 0x89, 0x43, 0x88, 0x82, 0x9e, 0xfe, 0x77,
+	0xdb, 0x39, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x24, 0x40, 0x75, 0x5a, 0x08, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/conversion_action_error.pb.go b/googleapis/ads/googleads/v3/errors/conversion_action_error.pb.go
new file mode 100644
index 0000000..19b1189
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/conversion_action_error.pb.go
@@ -0,0 +1,163 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/conversion_action_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible conversion action errors.
+type ConversionActionErrorEnum_ConversionActionError int32
+
+const (
+	// Enum unspecified.
+	ConversionActionErrorEnum_UNSPECIFIED ConversionActionErrorEnum_ConversionActionError = 0
+	// The received error code is not known in this version.
+	ConversionActionErrorEnum_UNKNOWN ConversionActionErrorEnum_ConversionActionError = 1
+	// The specified conversion action name already exists.
+	ConversionActionErrorEnum_DUPLICATE_NAME ConversionActionErrorEnum_ConversionActionError = 2
+	// Another conversion action with the specified app id already exists.
+	ConversionActionErrorEnum_DUPLICATE_APP_ID ConversionActionErrorEnum_ConversionActionError = 3
+	// Android first open action conflicts with Google play codeless download
+	// action tracking the same app.
+	ConversionActionErrorEnum_TWO_CONVERSION_ACTIONS_BIDDING_ON_SAME_APP_DOWNLOAD ConversionActionErrorEnum_ConversionActionError = 4
+	// Android first open action conflicts with Google play codeless download
+	// action tracking the same app.
+	ConversionActionErrorEnum_BIDDING_ON_SAME_APP_DOWNLOAD_AS_GLOBAL_ACTION ConversionActionErrorEnum_ConversionActionError = 5
+	// The attribution model cannot be set to DATA_DRIVEN because a data-driven
+	// model has never been generated.
+	ConversionActionErrorEnum_DATA_DRIVEN_MODEL_WAS_NEVER_GENERATED ConversionActionErrorEnum_ConversionActionError = 6
+	// The attribution model cannot be set to DATA_DRIVEN because the
+	// data-driven model is expired.
+	ConversionActionErrorEnum_DATA_DRIVEN_MODEL_EXPIRED ConversionActionErrorEnum_ConversionActionError = 7
+	// The attribution model cannot be set to DATA_DRIVEN because the
+	// data-driven model is stale.
+	ConversionActionErrorEnum_DATA_DRIVEN_MODEL_STALE ConversionActionErrorEnum_ConversionActionError = 8
+	// The attribution model cannot be set to DATA_DRIVEN because the
+	// data-driven model is unavailable or the conversion action was newly
+	// added.
+	ConversionActionErrorEnum_DATA_DRIVEN_MODEL_UNKNOWN ConversionActionErrorEnum_ConversionActionError = 9
+)
+
+var ConversionActionErrorEnum_ConversionActionError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DUPLICATE_NAME",
+	3: "DUPLICATE_APP_ID",
+	4: "TWO_CONVERSION_ACTIONS_BIDDING_ON_SAME_APP_DOWNLOAD",
+	5: "BIDDING_ON_SAME_APP_DOWNLOAD_AS_GLOBAL_ACTION",
+	6: "DATA_DRIVEN_MODEL_WAS_NEVER_GENERATED",
+	7: "DATA_DRIVEN_MODEL_EXPIRED",
+	8: "DATA_DRIVEN_MODEL_STALE",
+	9: "DATA_DRIVEN_MODEL_UNKNOWN",
+}
+
+var ConversionActionErrorEnum_ConversionActionError_value = map[string]int32{
+	"UNSPECIFIED":      0,
+	"UNKNOWN":          1,
+	"DUPLICATE_NAME":   2,
+	"DUPLICATE_APP_ID": 3,
+	"TWO_CONVERSION_ACTIONS_BIDDING_ON_SAME_APP_DOWNLOAD": 4,
+	"BIDDING_ON_SAME_APP_DOWNLOAD_AS_GLOBAL_ACTION":       5,
+	"DATA_DRIVEN_MODEL_WAS_NEVER_GENERATED":               6,
+	"DATA_DRIVEN_MODEL_EXPIRED":                           7,
+	"DATA_DRIVEN_MODEL_STALE":                             8,
+	"DATA_DRIVEN_MODEL_UNKNOWN":                           9,
+}
+
+func (x ConversionActionErrorEnum_ConversionActionError) String() string {
+	return proto.EnumName(ConversionActionErrorEnum_ConversionActionError_name, int32(x))
+}
+
+func (ConversionActionErrorEnum_ConversionActionError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ea0289798a441416, []int{0, 0}
+}
+
+// Container for enum describing possible conversion action errors.
+type ConversionActionErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionActionErrorEnum) Reset()         { *m = ConversionActionErrorEnum{} }
+func (m *ConversionActionErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionActionErrorEnum) ProtoMessage()    {}
+func (*ConversionActionErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ea0289798a441416, []int{0}
+}
+
+func (m *ConversionActionErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionActionErrorEnum.Unmarshal(m, b)
+}
+func (m *ConversionActionErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionActionErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionActionErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionActionErrorEnum.Merge(m, src)
+}
+func (m *ConversionActionErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionActionErrorEnum.Size(m)
+}
+func (m *ConversionActionErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionActionErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionActionErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ConversionActionErrorEnum_ConversionActionError", ConversionActionErrorEnum_ConversionActionError_name, ConversionActionErrorEnum_ConversionActionError_value)
+	proto.RegisterType((*ConversionActionErrorEnum)(nil), "google.ads.googleads.v3.errors.ConversionActionErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/conversion_action_error.proto", fileDescriptor_ea0289798a441416)
+}
+
+var fileDescriptor_ea0289798a441416 = []byte{
+	// 443 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x41, 0x8b, 0xd3, 0x40,
+	0x14, 0xc7, 0x6d, 0x56, 0x77, 0x75, 0x16, 0x74, 0x18, 0x14, 0xd9, 0x55, 0xf7, 0x50, 0xf0, 0xe0,
+	0xc1, 0x09, 0x92, 0x83, 0x10, 0xbd, 0xbc, 0x76, 0xc6, 0x30, 0x98, 0xce, 0x84, 0x24, 0x4d, 0x45,
+	0x0a, 0x43, 0x6c, 0x4a, 0x28, 0xec, 0x66, 0x4a, 0xa6, 0xf6, 0x03, 0x79, 0xf4, 0xa3, 0x78, 0xf3,
+	0x6b, 0x78, 0xf1, 0xe4, 0x5d, 0x92, 0xd9, 0xd6, 0xc3, 0xd6, 0x3d, 0xcd, 0x9f, 0xf7, 0xfe, 0xbf,
+	0x7f, 0xc2, 0x7b, 0x0f, 0xbd, 0xaf, 0x8d, 0xa9, 0x2f, 0x97, 0x7e, 0x59, 0x59, 0xdf, 0xc9, 0x4e,
+	0x6d, 0x03, 0x7f, 0xd9, 0xb6, 0xa6, 0xb5, 0xfe, 0xc2, 0x34, 0xdb, 0x65, 0x6b, 0x57, 0xa6, 0xd1,
+	0xe5, 0x62, 0xd3, 0x3d, 0x7d, 0x83, 0xae, 0x5b, 0xb3, 0x31, 0xe4, 0xc2, 0x21, 0xb4, 0xac, 0x2c,
+	0xdd, 0xd3, 0x74, 0x1b, 0x50, 0x47, 0x9f, 0x3f, 0xdf, 0xa5, 0xaf, 0x57, 0x7e, 0xd9, 0x34, 0x66,
+	0x53, 0x76, 0x11, 0xd6, 0xd1, 0xc3, 0xdf, 0x1e, 0x3a, 0x1b, 0xef, 0xf3, 0xa1, 0x8f, 0xe7, 0x1d,
+	0xc8, 0x9b, 0xaf, 0x57, 0xc3, 0x9f, 0x1e, 0x7a, 0x72, 0xb0, 0x4b, 0x1e, 0xa1, 0xd3, 0xa9, 0xcc,
+	0x12, 0x3e, 0x16, 0x1f, 0x04, 0x67, 0xf8, 0x0e, 0x39, 0x45, 0x27, 0x53, 0xf9, 0x51, 0xaa, 0x99,
+	0xc4, 0x03, 0x42, 0xd0, 0x43, 0x36, 0x4d, 0x62, 0x31, 0x86, 0x9c, 0x6b, 0x09, 0x13, 0x8e, 0x3d,
+	0xf2, 0x18, 0xe1, 0x7f, 0x35, 0x48, 0x12, 0x2d, 0x18, 0x3e, 0x22, 0x6f, 0x51, 0x90, 0xcf, 0x94,
+	0x1e, 0x2b, 0x59, 0xf0, 0x34, 0x13, 0x4a, 0x6a, 0x18, 0xe7, 0x42, 0xc9, 0x4c, 0x8f, 0x04, 0x63,
+	0x42, 0x46, 0x5a, 0x49, 0x9d, 0xc1, 0xc4, 0x21, 0x4c, 0xcd, 0x64, 0xac, 0x80, 0xe1, 0xbb, 0xe4,
+	0x0d, 0x7a, 0x7d, 0x9b, 0x43, 0x43, 0xa6, 0xa3, 0x58, 0x8d, 0x20, 0xbe, 0x0e, 0xc4, 0xf7, 0xc8,
+	0x2b, 0xf4, 0x92, 0x41, 0x0e, 0x9a, 0xa5, 0xa2, 0xe0, 0x52, 0x4f, 0x14, 0xe3, 0xb1, 0x9e, 0x41,
+	0xa6, 0x25, 0x2f, 0x78, 0xaa, 0x23, 0x2e, 0x79, 0x0a, 0x39, 0x67, 0xf8, 0x98, 0xbc, 0x40, 0x67,
+	0x37, 0xad, 0xfc, 0x53, 0x22, 0x52, 0xce, 0xf0, 0x09, 0x79, 0x86, 0x9e, 0xde, 0x6c, 0x67, 0x39,
+	0xc4, 0x1c, 0xdf, 0x3f, 0xcc, 0xee, 0x66, 0xf3, 0x60, 0xf4, 0x67, 0x80, 0x86, 0x0b, 0x73, 0x45,
+	0x6f, 0x5f, 0xdb, 0xe8, 0xfc, 0xe0, 0xdc, 0x93, 0x6e, 0x69, 0xc9, 0xe0, 0x33, 0xbb, 0xa6, 0x6b,
+	0x73, 0x59, 0x36, 0x35, 0x35, 0x6d, 0xed, 0xd7, 0xcb, 0xa6, 0x5f, 0xe9, 0xee, 0x84, 0xd6, 0x2b,
+	0xfb, 0xbf, 0x8b, 0x7a, 0xe7, 0x9e, 0x6f, 0xde, 0x51, 0x04, 0xf0, 0xdd, 0xbb, 0x88, 0x5c, 0x18,
+	0x54, 0x96, 0x3a, 0xd9, 0xa9, 0x22, 0xa0, 0xfd, 0x27, 0xed, 0x8f, 0x9d, 0x61, 0x0e, 0x95, 0x9d,
+	0xef, 0x0d, 0xf3, 0x22, 0x98, 0x3b, 0xc3, 0x2f, 0x6f, 0xe8, 0xaa, 0x61, 0x08, 0x95, 0x0d, 0xc3,
+	0xbd, 0x25, 0x0c, 0x8b, 0x20, 0x0c, 0x9d, 0xe9, 0xcb, 0x71, 0xff, 0x77, 0xc1, 0xdf, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0xd0, 0xeb, 0xf5, 0x4a, 0xee, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/conversion_adjustment_upload_error.pb.go b/googleapis/ads/googleads/v3/errors/conversion_adjustment_upload_error.pb.go
new file mode 100644
index 0000000..f0a6380
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/conversion_adjustment_upload_error.pb.go
@@ -0,0 +1,180 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/conversion_adjustment_upload_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible conversion adjustment upload errors.
+type ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError int32
+
+const (
+	// Not specified.
+	ConversionAdjustmentUploadErrorEnum_UNSPECIFIED ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 0
+	// The received error code is not known in this version.
+	ConversionAdjustmentUploadErrorEnum_UNKNOWN ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 1
+	// The specified conversion action was created too recently.
+	// Please try the upload again after 4-6 hours have passed since the
+	// conversion action was created.
+	ConversionAdjustmentUploadErrorEnum_TOO_RECENT_CONVERSION_ACTION ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 2
+	// No conversion action of a supported ConversionActionType that matches the
+	// provided information can be found for the customer.
+	ConversionAdjustmentUploadErrorEnum_INVALID_CONVERSION_ACTION ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 3
+	// A retraction was already reported for this conversion.
+	ConversionAdjustmentUploadErrorEnum_CONVERSION_ALREADY_RETRACTED ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 4
+	// A conversion for the supplied combination of conversion
+	// action and conversion identifier could not be found.
+	ConversionAdjustmentUploadErrorEnum_CONVERSION_NOT_FOUND ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 5
+	// The specified conversion has already expired. Conversions expire after 55
+	// days, after which adjustments cannot be reported against them.
+	ConversionAdjustmentUploadErrorEnum_CONVERSION_EXPIRED ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 6
+	// The supplied adjustment date time precedes that of the original
+	// conversion.
+	ConversionAdjustmentUploadErrorEnum_ADJUSTMENT_PRECEDES_CONVERSION ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 7
+	// A restatement with a more recent adjustment date time was already
+	// reported for this conversion.
+	ConversionAdjustmentUploadErrorEnum_MORE_RECENT_RESTATEMENT_FOUND ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 8
+	// The conversion was created too recently.
+	ConversionAdjustmentUploadErrorEnum_TOO_RECENT_CONVERSION ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 9
+	// Restatements cannot be reported for a conversion action that always uses
+	// the default value.
+	ConversionAdjustmentUploadErrorEnum_CANNOT_RESTATE_CONVERSION_ACTION_THAT_ALWAYS_USES_DEFAULT_CONVERSION_VALUE ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 10
+	// The request contained more than 2000 adjustments.
+	ConversionAdjustmentUploadErrorEnum_TOO_MANY_ADJUSTMENTS_IN_REQUEST ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 11
+	// The conversion has been adjusted too many times.
+	ConversionAdjustmentUploadErrorEnum_TOO_MANY_ADJUSTMENTS ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError = 12
+)
+
+var ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "TOO_RECENT_CONVERSION_ACTION",
+	3:  "INVALID_CONVERSION_ACTION",
+	4:  "CONVERSION_ALREADY_RETRACTED",
+	5:  "CONVERSION_NOT_FOUND",
+	6:  "CONVERSION_EXPIRED",
+	7:  "ADJUSTMENT_PRECEDES_CONVERSION",
+	8:  "MORE_RECENT_RESTATEMENT_FOUND",
+	9:  "TOO_RECENT_CONVERSION",
+	10: "CANNOT_RESTATE_CONVERSION_ACTION_THAT_ALWAYS_USES_DEFAULT_CONVERSION_VALUE",
+	11: "TOO_MANY_ADJUSTMENTS_IN_REQUEST",
+	12: "TOO_MANY_ADJUSTMENTS",
+}
+
+var ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError_value = map[string]int32{
+	"UNSPECIFIED":                    0,
+	"UNKNOWN":                        1,
+	"TOO_RECENT_CONVERSION_ACTION":   2,
+	"INVALID_CONVERSION_ACTION":      3,
+	"CONVERSION_ALREADY_RETRACTED":   4,
+	"CONVERSION_NOT_FOUND":           5,
+	"CONVERSION_EXPIRED":             6,
+	"ADJUSTMENT_PRECEDES_CONVERSION": 7,
+	"MORE_RECENT_RESTATEMENT_FOUND":  8,
+	"TOO_RECENT_CONVERSION":          9,
+	"CANNOT_RESTATE_CONVERSION_ACTION_THAT_ALWAYS_USES_DEFAULT_CONVERSION_VALUE": 10,
+	"TOO_MANY_ADJUSTMENTS_IN_REQUEST":                                            11,
+	"TOO_MANY_ADJUSTMENTS":                                                       12,
+}
+
+func (x ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError) String() string {
+	return proto.EnumName(ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError_name, int32(x))
+}
+
+func (ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_80983c668085e5a2, []int{0, 0}
+}
+
+// Container for enum describing possible conversion adjustment upload errors.
+type ConversionAdjustmentUploadErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionAdjustmentUploadErrorEnum) Reset()         { *m = ConversionAdjustmentUploadErrorEnum{} }
+func (m *ConversionAdjustmentUploadErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionAdjustmentUploadErrorEnum) ProtoMessage()    {}
+func (*ConversionAdjustmentUploadErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_80983c668085e5a2, []int{0}
+}
+
+func (m *ConversionAdjustmentUploadErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionAdjustmentUploadErrorEnum.Unmarshal(m, b)
+}
+func (m *ConversionAdjustmentUploadErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionAdjustmentUploadErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionAdjustmentUploadErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionAdjustmentUploadErrorEnum.Merge(m, src)
+}
+func (m *ConversionAdjustmentUploadErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionAdjustmentUploadErrorEnum.Size(m)
+}
+func (m *ConversionAdjustmentUploadErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionAdjustmentUploadErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionAdjustmentUploadErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError", ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError_name, ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError_value)
+	proto.RegisterType((*ConversionAdjustmentUploadErrorEnum)(nil), "google.ads.googleads.v3.errors.ConversionAdjustmentUploadErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/conversion_adjustment_upload_error.proto", fileDescriptor_80983c668085e5a2)
+}
+
+var fileDescriptor_80983c668085e5a2 = []byte{
+	// 504 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xd1, 0x6e, 0xd3, 0x30,
+	0x14, 0x86, 0x59, 0x0b, 0x1b, 0xb8, 0x48, 0x58, 0x16, 0x20, 0x86, 0xb6, 0x0e, 0x3a, 0xae, 0x93,
+	0x8b, 0xdc, 0x85, 0x2b, 0x2f, 0x39, 0x2d, 0x19, 0xad, 0x53, 0x12, 0x27, 0xa3, 0xa8, 0x92, 0x15,
+	0x96, 0x2a, 0x2a, 0x6a, 0xe3, 0x2a, 0x6e, 0xfb, 0x40, 0x5c, 0xf2, 0x1e, 0xdc, 0xf0, 0x28, 0x48,
+	0x3c, 0x03, 0xc8, 0xf1, 0x5a, 0x8a, 0x28, 0xec, 0x2a, 0x47, 0xf6, 0x77, 0xfe, 0xff, 0xf7, 0xc9,
+	0x41, 0xbd, 0x42, 0xca, 0x62, 0x36, 0xb1, 0xb3, 0x5c, 0xd9, 0xa6, 0xd4, 0xd5, 0xda, 0xb1, 0x27,
+	0x55, 0x25, 0x2b, 0x65, 0x5f, 0xcb, 0x72, 0x3d, 0xa9, 0xd4, 0x54, 0x96, 0x22, 0xcb, 0x3f, 0xad,
+	0xd4, 0x72, 0x3e, 0x29, 0x97, 0x62, 0xb5, 0x98, 0xc9, 0x2c, 0x17, 0x35, 0x63, 0x2d, 0x2a, 0xb9,
+	0x94, 0xa4, 0x6d, 0xba, 0xad, 0x2c, 0x57, 0xd6, 0x56, 0xc8, 0x5a, 0x3b, 0x96, 0x11, 0x7a, 0x7e,
+	0xb2, 0x31, 0x5a, 0x4c, 0xed, 0xac, 0x2c, 0xe5, 0x32, 0x5b, 0x4e, 0x65, 0xa9, 0x4c, 0x77, 0xe7,
+	0x47, 0x13, 0x9d, 0x7b, 0x5b, 0x2b, 0xba, 0x75, 0x4a, 0x6a, 0x23, 0xd0, 0x12, 0x50, 0xae, 0xe6,
+	0x9d, 0xaf, 0x4d, 0x74, 0x76, 0x0b, 0x47, 0x1e, 0xa1, 0x56, 0xc2, 0xe2, 0x21, 0x78, 0x41, 0x37,
+	0x00, 0x1f, 0xdf, 0x21, 0x2d, 0x74, 0x94, 0xb0, 0xb7, 0x2c, 0xbc, 0x62, 0xf8, 0x80, 0xbc, 0x40,
+	0x27, 0x3c, 0x0c, 0x45, 0x04, 0x1e, 0x30, 0x2e, 0xbc, 0x90, 0xa5, 0x10, 0xc5, 0x41, 0xc8, 0x04,
+	0xf5, 0x78, 0x10, 0x32, 0xdc, 0x20, 0xa7, 0xe8, 0x38, 0x60, 0x29, 0xed, 0x07, 0xfe, 0x9e, 0xeb,
+	0xa6, 0x16, 0xd8, 0x3d, 0xee, 0x47, 0x40, 0xfd, 0x91, 0x88, 0x80, 0x47, 0xd4, 0xe3, 0xe0, 0xe3,
+	0xbb, 0xe4, 0x19, 0x7a, 0xbc, 0x43, 0xb0, 0x90, 0x8b, 0x6e, 0x98, 0x30, 0x1f, 0xdf, 0x23, 0x4f,
+	0x11, 0xd9, 0xb9, 0x81, 0xf7, 0xc3, 0x20, 0x02, 0x1f, 0x1f, 0x92, 0x0e, 0x6a, 0x53, 0xff, 0x32,
+	0x89, 0xf9, 0x40, 0x87, 0x1a, 0xea, 0x70, 0x3e, 0xc4, 0x3b, 0xf6, 0xf8, 0x88, 0xbc, 0x44, 0xa7,
+	0x83, 0x30, 0x82, 0x4d, 0xf2, 0x08, 0x62, 0x4e, 0x39, 0xd4, 0x0d, 0x46, 0xfe, 0x3e, 0x39, 0x46,
+	0x4f, 0xf6, 0xbe, 0x0d, 0x3f, 0x20, 0x0c, 0x5d, 0x7a, 0x94, 0xe9, 0x2c, 0x37, 0x8d, 0x7f, 0xbf,
+	0x4d, 0xf0, 0x37, 0x94, 0x0b, 0xda, 0xbf, 0xa2, 0xa3, 0x58, 0x24, 0x31, 0xc4, 0xc2, 0x87, 0x2e,
+	0x4d, 0xfa, 0x7f, 0x4c, 0x29, 0xa5, 0xfd, 0x04, 0x30, 0x22, 0xe7, 0xe8, 0x4c, 0x5b, 0x0d, 0x28,
+	0x1b, 0x89, 0xdf, 0xd1, 0x63, 0x11, 0x30, 0x11, 0xc1, 0xbb, 0x04, 0x62, 0x8e, 0x5b, 0x7a, 0x10,
+	0xfb, 0x20, 0xfc, 0xf0, 0xe2, 0xe7, 0x01, 0xea, 0x5c, 0xcb, 0xb9, 0xf5, 0xff, 0xa5, 0xb9, 0x78,
+	0x75, 0xcb, 0xbf, 0x1e, 0xea, 0xe5, 0x19, 0x1e, 0x7c, 0xf0, 0x6f, 0x74, 0x0a, 0x39, 0xcb, 0xca,
+	0xc2, 0x92, 0x55, 0x61, 0x17, 0x93, 0xb2, 0x5e, 0xad, 0xcd, 0x56, 0x2f, 0xa6, 0xea, 0x5f, 0x4b,
+	0xfe, 0xda, 0x7c, 0x3e, 0x37, 0x9a, 0x3d, 0x4a, 0xbf, 0x34, 0xda, 0x3d, 0x23, 0x46, 0x73, 0x65,
+	0x99, 0x52, 0x57, 0xa9, 0x63, 0xd5, 0x96, 0xea, 0xdb, 0x06, 0x18, 0xd3, 0x5c, 0x8d, 0xb7, 0xc0,
+	0x38, 0x75, 0xc6, 0x06, 0xf8, 0xde, 0xe8, 0x98, 0x53, 0xd7, 0xa5, 0xb9, 0x72, 0xdd, 0x2d, 0xe2,
+	0xba, 0xa9, 0xe3, 0xba, 0x06, 0xfa, 0x78, 0x58, 0xa7, 0x73, 0x7e, 0x05, 0x00, 0x00, 0xff, 0xff,
+	0x6c, 0xec, 0x4a, 0x41, 0x81, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/conversion_upload_error.pb.go b/googleapis/ads/googleads/v3/errors/conversion_upload_error.pb.go
new file mode 100644
index 0000000..ff41da7
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/conversion_upload_error.pb.go
@@ -0,0 +1,243 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/conversion_upload_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible conversion upload errors.
+type ConversionUploadErrorEnum_ConversionUploadError int32
+
+const (
+	// Enum unspecified.
+	ConversionUploadErrorEnum_UNSPECIFIED ConversionUploadErrorEnum_ConversionUploadError = 0
+	// The received error code is not known in this version.
+	ConversionUploadErrorEnum_UNKNOWN ConversionUploadErrorEnum_ConversionUploadError = 1
+	// The request contained more than 2000 conversions.
+	ConversionUploadErrorEnum_TOO_MANY_CONVERSIONS_IN_REQUEST ConversionUploadErrorEnum_ConversionUploadError = 2
+	// The specified gclid could not be decoded.
+	ConversionUploadErrorEnum_UNPARSEABLE_GCLID ConversionUploadErrorEnum_ConversionUploadError = 3
+	// The specified conversion_date_time is before the event time
+	// associated with the given gclid.
+	ConversionUploadErrorEnum_CONVERSION_PRECEDES_GCLID ConversionUploadErrorEnum_ConversionUploadError = 4
+	// The click associated with the given gclid is either too old to be
+	// imported or occurred outside of the click through lookback window for the
+	// specified conversion action.
+	ConversionUploadErrorEnum_EXPIRED_GCLID ConversionUploadErrorEnum_ConversionUploadError = 5
+	// The click associated with the given gclid occurred too recently. Please
+	// try uploading again after 6 hours have passed since the click occurred.
+	ConversionUploadErrorEnum_TOO_RECENT_GCLID ConversionUploadErrorEnum_ConversionUploadError = 6
+	// The click associated with the given gclid could not be found in the
+	// system. This can happen if Google Click IDs are collected for non Google
+	// Ads clicks.
+	ConversionUploadErrorEnum_GCLID_NOT_FOUND ConversionUploadErrorEnum_ConversionUploadError = 7
+	// The click associated with the given gclid is owned by a customer
+	// account that the uploading customer does not manage.
+	ConversionUploadErrorEnum_UNAUTHORIZED_CUSTOMER ConversionUploadErrorEnum_ConversionUploadError = 8
+	// No upload eligible conversion action that matches the provided
+	// information can be found for the customer.
+	ConversionUploadErrorEnum_INVALID_CONVERSION_ACTION ConversionUploadErrorEnum_ConversionUploadError = 9
+	// The specified conversion action was created too recently.
+	// Please try the upload again after 4-6 hours have passed since the
+	// conversion action was created.
+	ConversionUploadErrorEnum_TOO_RECENT_CONVERSION_ACTION ConversionUploadErrorEnum_ConversionUploadError = 10
+	// The click associated with the given gclid does not contain conversion
+	// tracking information.
+	ConversionUploadErrorEnum_CONVERSION_TRACKING_NOT_ENABLED_AT_IMPRESSION_TIME ConversionUploadErrorEnum_ConversionUploadError = 11
+	// The specified conversion action does not use an external attribution
+	// model, but external_attribution_data was set.
+	ConversionUploadErrorEnum_EXTERNAL_ATTRIBUTION_DATA_SET_FOR_NON_EXTERNALLY_ATTRIBUTED_CONVERSION_ACTION ConversionUploadErrorEnum_ConversionUploadError = 12
+	// The specified conversion action uses an external attribution model, but
+	// external_attribution_data or one of its contained fields was not set.
+	// Both external_attribution_credit and external_attribution_model must be
+	// set for externally attributed conversion actions.
+	ConversionUploadErrorEnum_EXTERNAL_ATTRIBUTION_DATA_NOT_SET_FOR_EXTERNALLY_ATTRIBUTED_CONVERSION_ACTION ConversionUploadErrorEnum_ConversionUploadError = 13
+	// Order IDs are not supported for conversion actions which use an external
+	// attribution model.
+	ConversionUploadErrorEnum_ORDER_ID_NOT_PERMITTED_FOR_EXTERNALLY_ATTRIBUTED_CONVERSION_ACTION ConversionUploadErrorEnum_ConversionUploadError = 14
+	// A conversion with the same order id and conversion action combination
+	// already exists in our system.
+	ConversionUploadErrorEnum_ORDER_ID_ALREADY_IN_USE ConversionUploadErrorEnum_ConversionUploadError = 15
+	// The request contained two or more conversions with the same order id and
+	// conversion action combination.
+	ConversionUploadErrorEnum_DUPLICATE_ORDER_ID ConversionUploadErrorEnum_ConversionUploadError = 16
+	// The call occurred too recently. Please try uploading again after 6 hours
+	// have passed since the call occurred.
+	ConversionUploadErrorEnum_TOO_RECENT_CALL ConversionUploadErrorEnum_ConversionUploadError = 17
+	// The click that initiated the call is too old for this conversion to be
+	// imported.
+	ConversionUploadErrorEnum_EXPIRED_CALL ConversionUploadErrorEnum_ConversionUploadError = 18
+	// The call or the click leading to the call was not found.
+	ConversionUploadErrorEnum_CALL_NOT_FOUND ConversionUploadErrorEnum_ConversionUploadError = 19
+	// The specified conversion_date_time is before the call_start_date_time.
+	ConversionUploadErrorEnum_CONVERSION_PRECEDES_CALL ConversionUploadErrorEnum_ConversionUploadError = 20
+	// The click associated with the call does not contain conversion tracking
+	// information.
+	ConversionUploadErrorEnum_CONVERSION_TRACKING_NOT_ENABLED_AT_CALL_TIME ConversionUploadErrorEnum_ConversionUploadError = 21
+	// The caller’s phone number cannot be parsed. It should be formatted either
+	// as E.164 "+16502531234", International "+64 3-331 6005" or US national
+	// number "6502531234".
+	ConversionUploadErrorEnum_UNPARSEABLE_CALLERS_PHONE_NUMBER ConversionUploadErrorEnum_ConversionUploadError = 22
+)
+
+var ConversionUploadErrorEnum_ConversionUploadError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "TOO_MANY_CONVERSIONS_IN_REQUEST",
+	3:  "UNPARSEABLE_GCLID",
+	4:  "CONVERSION_PRECEDES_GCLID",
+	5:  "EXPIRED_GCLID",
+	6:  "TOO_RECENT_GCLID",
+	7:  "GCLID_NOT_FOUND",
+	8:  "UNAUTHORIZED_CUSTOMER",
+	9:  "INVALID_CONVERSION_ACTION",
+	10: "TOO_RECENT_CONVERSION_ACTION",
+	11: "CONVERSION_TRACKING_NOT_ENABLED_AT_IMPRESSION_TIME",
+	12: "EXTERNAL_ATTRIBUTION_DATA_SET_FOR_NON_EXTERNALLY_ATTRIBUTED_CONVERSION_ACTION",
+	13: "EXTERNAL_ATTRIBUTION_DATA_NOT_SET_FOR_EXTERNALLY_ATTRIBUTED_CONVERSION_ACTION",
+	14: "ORDER_ID_NOT_PERMITTED_FOR_EXTERNALLY_ATTRIBUTED_CONVERSION_ACTION",
+	15: "ORDER_ID_ALREADY_IN_USE",
+	16: "DUPLICATE_ORDER_ID",
+	17: "TOO_RECENT_CALL",
+	18: "EXPIRED_CALL",
+	19: "CALL_NOT_FOUND",
+	20: "CONVERSION_PRECEDES_CALL",
+	21: "CONVERSION_TRACKING_NOT_ENABLED_AT_CALL_TIME",
+	22: "UNPARSEABLE_CALLERS_PHONE_NUMBER",
+}
+
+var ConversionUploadErrorEnum_ConversionUploadError_value = map[string]int32{
+	"UNSPECIFIED":                     0,
+	"UNKNOWN":                         1,
+	"TOO_MANY_CONVERSIONS_IN_REQUEST": 2,
+	"UNPARSEABLE_GCLID":               3,
+	"CONVERSION_PRECEDES_GCLID":       4,
+	"EXPIRED_GCLID":                   5,
+	"TOO_RECENT_GCLID":                6,
+	"GCLID_NOT_FOUND":                 7,
+	"UNAUTHORIZED_CUSTOMER":           8,
+	"INVALID_CONVERSION_ACTION":       9,
+	"TOO_RECENT_CONVERSION_ACTION":    10,
+	"CONVERSION_TRACKING_NOT_ENABLED_AT_IMPRESSION_TIME":                            11,
+	"EXTERNAL_ATTRIBUTION_DATA_SET_FOR_NON_EXTERNALLY_ATTRIBUTED_CONVERSION_ACTION": 12,
+	"EXTERNAL_ATTRIBUTION_DATA_NOT_SET_FOR_EXTERNALLY_ATTRIBUTED_CONVERSION_ACTION": 13,
+	"ORDER_ID_NOT_PERMITTED_FOR_EXTERNALLY_ATTRIBUTED_CONVERSION_ACTION":            14,
+	"ORDER_ID_ALREADY_IN_USE":                      15,
+	"DUPLICATE_ORDER_ID":                           16,
+	"TOO_RECENT_CALL":                              17,
+	"EXPIRED_CALL":                                 18,
+	"CALL_NOT_FOUND":                               19,
+	"CONVERSION_PRECEDES_CALL":                     20,
+	"CONVERSION_TRACKING_NOT_ENABLED_AT_CALL_TIME": 21,
+	"UNPARSEABLE_CALLERS_PHONE_NUMBER":             22,
+}
+
+func (x ConversionUploadErrorEnum_ConversionUploadError) String() string {
+	return proto.EnumName(ConversionUploadErrorEnum_ConversionUploadError_name, int32(x))
+}
+
+func (ConversionUploadErrorEnum_ConversionUploadError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c97ed55609bcddab, []int{0, 0}
+}
+
+// Container for enum describing possible conversion upload errors.
+type ConversionUploadErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ConversionUploadErrorEnum) Reset()         { *m = ConversionUploadErrorEnum{} }
+func (m *ConversionUploadErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ConversionUploadErrorEnum) ProtoMessage()    {}
+func (*ConversionUploadErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c97ed55609bcddab, []int{0}
+}
+
+func (m *ConversionUploadErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionUploadErrorEnum.Unmarshal(m, b)
+}
+func (m *ConversionUploadErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionUploadErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ConversionUploadErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionUploadErrorEnum.Merge(m, src)
+}
+func (m *ConversionUploadErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ConversionUploadErrorEnum.Size(m)
+}
+func (m *ConversionUploadErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionUploadErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionUploadErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ConversionUploadErrorEnum_ConversionUploadError", ConversionUploadErrorEnum_ConversionUploadError_name, ConversionUploadErrorEnum_ConversionUploadError_value)
+	proto.RegisterType((*ConversionUploadErrorEnum)(nil), "google.ads.googleads.v3.errors.ConversionUploadErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/conversion_upload_error.proto", fileDescriptor_c97ed55609bcddab)
+}
+
+var fileDescriptor_c97ed55609bcddab = []byte{
+	// 636 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xcd, 0x6e, 0xd3, 0x40,
+	0x10, 0xa6, 0x29, 0xa4, 0xb0, 0xfd, 0xdb, 0x6e, 0x9b, 0x42, 0x4b, 0x29, 0x55, 0xe0, 0x88, 0x1c,
+	0x44, 0x24, 0x0e, 0x86, 0xcb, 0xc6, 0x9e, 0xa6, 0xab, 0x3a, 0x6b, 0x77, 0xbd, 0x1b, 0xda, 0x2a,
+	0xd2, 0x2a, 0x34, 0x51, 0x14, 0xa9, 0xf5, 0x46, 0x71, 0xdb, 0x07, 0xe2, 0xc8, 0x03, 0xf0, 0x10,
+	0x9c, 0x79, 0x0a, 0xee, 0xdc, 0xd1, 0xda, 0x71, 0x88, 0x44, 0xa8, 0xca, 0x29, 0xa3, 0x99, 0xef,
+	0x67, 0xe2, 0x99, 0x59, 0xf4, 0x71, 0x60, 0xcc, 0xe0, 0xb2, 0x5f, 0xeb, 0xf6, 0xd2, 0x5a, 0x1e,
+	0xda, 0xe8, 0xb6, 0x5e, 0xeb, 0x8f, 0xc7, 0x66, 0x9c, 0xd6, 0x2e, 0x4c, 0x72, 0xdb, 0x1f, 0xa7,
+	0x43, 0x93, 0xe8, 0x9b, 0xd1, 0xa5, 0xe9, 0xf6, 0x74, 0x56, 0x70, 0x46, 0x63, 0x73, 0x6d, 0xc8,
+	0x7e, 0x4e, 0x71, 0xba, 0xbd, 0xd4, 0x99, 0xb2, 0x9d, 0xdb, 0xba, 0x93, 0xb3, 0x77, 0xf7, 0x0a,
+	0xf5, 0xd1, 0xb0, 0xd6, 0x4d, 0x12, 0x73, 0xdd, 0xbd, 0x1e, 0x9a, 0x24, 0xcd, 0xd9, 0xd5, 0x1f,
+	0x65, 0xb4, 0xe3, 0x4d, 0xf5, 0x55, 0x26, 0x0f, 0x96, 0x08, 0xc9, 0xcd, 0x55, 0xf5, 0x5b, 0x19,
+	0x55, 0xe6, 0x56, 0xc9, 0x3a, 0x5a, 0x56, 0x3c, 0x8e, 0xc0, 0x63, 0x87, 0x0c, 0x7c, 0xfc, 0x80,
+	0x2c, 0xa3, 0x25, 0xc5, 0x8f, 0x79, 0xf8, 0x89, 0xe3, 0x05, 0xf2, 0x0a, 0xbd, 0x94, 0x61, 0xa8,
+	0x5b, 0x94, 0x9f, 0x69, 0x2f, 0xe4, 0x6d, 0x10, 0x31, 0x0b, 0x79, 0xac, 0x19, 0xd7, 0x02, 0x4e,
+	0x14, 0xc4, 0x12, 0x97, 0x48, 0x05, 0x6d, 0x28, 0x1e, 0x51, 0x11, 0x03, 0x6d, 0x04, 0xa0, 0x9b,
+	0x5e, 0xc0, 0x7c, 0xbc, 0x48, 0x5e, 0xa0, 0x9d, 0x3f, 0x14, 0x1d, 0x09, 0xf0, 0xc0, 0x87, 0x78,
+	0x52, 0x7e, 0x48, 0x36, 0xd0, 0x2a, 0x9c, 0x46, 0x4c, 0x80, 0x3f, 0x49, 0x3d, 0x22, 0x5b, 0x08,
+	0x5b, 0x37, 0x8b, 0xe4, 0x72, 0x92, 0x2d, 0x93, 0x4d, 0xb4, 0x9e, 0x85, 0x9a, 0x87, 0x52, 0x1f,
+	0x86, 0x8a, 0xfb, 0x78, 0x89, 0xec, 0xa0, 0x8a, 0xe2, 0x54, 0xc9, 0xa3, 0x50, 0xb0, 0x73, 0xf0,
+	0xb5, 0xa7, 0x62, 0x19, 0xb6, 0x40, 0xe0, 0xc7, 0xd6, 0x97, 0xf1, 0x36, 0xb5, 0x8c, 0x19, 0x7f,
+	0xea, 0x49, 0x16, 0x72, 0xfc, 0x84, 0x1c, 0xa0, 0xbd, 0x19, 0x93, 0xbf, 0x11, 0x88, 0xbc, 0x47,
+	0xef, 0x66, 0xd2, 0x52, 0x50, 0xef, 0x98, 0xf1, 0x66, 0x66, 0x0f, 0xdc, 0xfe, 0x45, 0x5f, 0x53,
+	0xa9, 0x59, 0x2b, 0x12, 0x10, 0xe7, 0x10, 0xd6, 0x02, 0xbc, 0x4c, 0x4e, 0x50, 0x0b, 0x4e, 0x25,
+	0x08, 0x4e, 0x03, 0x4d, 0xa5, 0x14, 0xac, 0xa1, 0xac, 0xa2, 0xf6, 0xa9, 0xa4, 0x3a, 0x06, 0xdb,
+	0xbc, 0xd0, 0x3c, 0xe4, 0xba, 0x40, 0x05, 0x67, 0x53, 0x1c, 0xcc, 0x6b, 0x76, 0xe5, 0x6e, 0x49,
+	0xdb, 0x50, 0x21, 0x7b, 0x5f, 0xc9, 0x55, 0x72, 0x88, 0x1a, 0xa1, 0xf0, 0x41, 0xe8, 0xc9, 0x17,
+	0x8d, 0x40, 0xb4, 0x98, 0xb4, 0xe8, 0xff, 0xd1, 0x59, 0x23, 0xcf, 0xd1, 0xd3, 0xa9, 0x0e, 0x0d,
+	0x04, 0x50, 0xff, 0xcc, 0xae, 0x85, 0x8a, 0x01, 0xaf, 0x93, 0x6d, 0x44, 0x7c, 0x15, 0x05, 0xcc,
+	0xa3, 0x12, 0x74, 0x01, 0xc3, 0xd8, 0xce, 0x72, 0xf6, 0xe3, 0xd3, 0x20, 0xc0, 0x1b, 0x04, 0xa3,
+	0x95, 0x62, 0x13, 0xb2, 0x0c, 0x21, 0x04, 0xad, 0xd9, 0x68, 0x66, 0xe2, 0x9b, 0x64, 0x0f, 0x3d,
+	0x9b, 0xb7, 0x4e, 0x19, 0x63, 0x8b, 0xbc, 0x45, 0x6f, 0xee, 0x31, 0xb3, 0x4c, 0x34, 0x9b, 0x56,
+	0x85, 0xbc, 0x46, 0x07, 0xb3, 0x5b, 0x6b, 0x4b, 0x20, 0x62, 0x1d, 0x1d, 0x85, 0x1c, 0x34, 0x57,
+	0xad, 0x06, 0x08, 0xbc, 0xdd, 0xf8, 0xb5, 0x80, 0xaa, 0x17, 0xe6, 0xca, 0xb9, 0xfb, 0x36, 0x1b,
+	0xbb, 0x73, 0x8f, 0x2b, 0xb2, 0x97, 0x19, 0x2d, 0x9c, 0xfb, 0x13, 0xf6, 0xc0, 0x5c, 0x76, 0x93,
+	0x81, 0x63, 0xc6, 0x83, 0xda, 0xa0, 0x9f, 0x64, 0x77, 0x5b, 0xbc, 0x13, 0xa3, 0x61, 0xfa, 0xaf,
+	0x67, 0xe3, 0x43, 0xfe, 0xf3, 0xa5, 0xb4, 0xd8, 0xa4, 0xf4, 0x6b, 0x69, 0xbf, 0x99, 0x8b, 0xd1,
+	0x5e, 0xea, 0xe4, 0xa1, 0x8d, 0xda, 0x75, 0x27, 0xb3, 0x4c, 0xbf, 0x17, 0x80, 0x0e, 0xed, 0xa5,
+	0x9d, 0x29, 0xa0, 0xd3, 0xae, 0x77, 0x72, 0xc0, 0xcf, 0x52, 0x35, 0xcf, 0xba, 0x2e, 0xed, 0xa5,
+	0xae, 0x3b, 0x85, 0xb8, 0x6e, 0xbb, 0xee, 0xba, 0x39, 0xe8, 0x73, 0x39, 0xeb, 0xae, 0xfe, 0x3b,
+	0x00, 0x00, 0xff, 0xff, 0x3a, 0x01, 0x0e, 0x99, 0xd3, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/country_code_error.pb.go b/googleapis/ads/googleads/v3/errors/country_code_error.pb.go
new file mode 100644
index 0000000..b16bd68
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/country_code_error.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/country_code_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing country code errors.
+type CountryCodeErrorEnum_CountryCodeError int32
+
+const (
+	// Enum unspecified.
+	CountryCodeErrorEnum_UNSPECIFIED CountryCodeErrorEnum_CountryCodeError = 0
+	// The received error code is not known in this version.
+	CountryCodeErrorEnum_UNKNOWN CountryCodeErrorEnum_CountryCodeError = 1
+	// The country code is invalid.
+	CountryCodeErrorEnum_INVALID_COUNTRY_CODE CountryCodeErrorEnum_CountryCodeError = 2
+)
+
+var CountryCodeErrorEnum_CountryCodeError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INVALID_COUNTRY_CODE",
+}
+
+var CountryCodeErrorEnum_CountryCodeError_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"INVALID_COUNTRY_CODE": 2,
+}
+
+func (x CountryCodeErrorEnum_CountryCodeError) String() string {
+	return proto.EnumName(CountryCodeErrorEnum_CountryCodeError_name, int32(x))
+}
+
+func (CountryCodeErrorEnum_CountryCodeError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c64e23a252258a7c, []int{0, 0}
+}
+
+// Container for enum describing country code errors.
+type CountryCodeErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CountryCodeErrorEnum) Reset()         { *m = CountryCodeErrorEnum{} }
+func (m *CountryCodeErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CountryCodeErrorEnum) ProtoMessage()    {}
+func (*CountryCodeErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c64e23a252258a7c, []int{0}
+}
+
+func (m *CountryCodeErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CountryCodeErrorEnum.Unmarshal(m, b)
+}
+func (m *CountryCodeErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CountryCodeErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CountryCodeErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CountryCodeErrorEnum.Merge(m, src)
+}
+func (m *CountryCodeErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CountryCodeErrorEnum.Size(m)
+}
+func (m *CountryCodeErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CountryCodeErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CountryCodeErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CountryCodeErrorEnum_CountryCodeError", CountryCodeErrorEnum_CountryCodeError_name, CountryCodeErrorEnum_CountryCodeError_value)
+	proto.RegisterType((*CountryCodeErrorEnum)(nil), "google.ads.googleads.v3.errors.CountryCodeErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/country_code_error.proto", fileDescriptor_c64e23a252258a7c)
+}
+
+var fileDescriptor_c64e23a252258a7c = []byte{
+	// 307 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xd1, 0x4a, 0xf3, 0x30,
+	0x1c, 0xc5, 0xbf, 0xf5, 0x03, 0x85, 0xec, 0xc2, 0x52, 0x26, 0x88, 0xc8, 0x2e, 0xfa, 0x00, 0xc9,
+	0x45, 0x2e, 0x84, 0x78, 0x95, 0xb5, 0x75, 0x54, 0x25, 0x1b, 0xea, 0x2a, 0x4a, 0xa1, 0x74, 0x4b,
+	0x09, 0x83, 0x2d, 0xff, 0x91, 0x74, 0x03, 0x5f, 0xc7, 0x4b, 0x1f, 0xc5, 0x47, 0xf1, 0xca, 0x47,
+	0x90, 0x36, 0xae, 0x17, 0x03, 0xbd, 0xca, 0xe1, 0xf0, 0x3b, 0x27, 0x87, 0x3f, 0xba, 0x54, 0x00,
+	0x6a, 0x55, 0x91, 0x52, 0x5a, 0xe2, 0x64, 0xa3, 0x76, 0x94, 0x54, 0xc6, 0x80, 0xb1, 0x64, 0x01,
+	0x5b, 0x5d, 0x9b, 0xd7, 0x62, 0x01, 0xb2, 0x2a, 0x5a, 0x0f, 0x6f, 0x0c, 0xd4, 0x10, 0x0c, 0x1d,
+	0x8d, 0x4b, 0x69, 0x71, 0x17, 0xc4, 0x3b, 0x8a, 0x5d, 0xf0, 0xfc, 0x62, 0x5f, 0xbc, 0x59, 0x92,
+	0x52, 0x6b, 0xa8, 0xcb, 0x7a, 0x09, 0xda, 0xba, 0x74, 0x38, 0x47, 0x83, 0xc8, 0x35, 0x47, 0x20,
+	0xab, 0xa4, 0x89, 0x24, 0x7a, 0xbb, 0x0e, 0x6f, 0x90, 0x7f, 0xe8, 0x07, 0x27, 0xa8, 0x3f, 0x13,
+	0x0f, 0xd3, 0x24, 0x4a, 0xaf, 0xd3, 0x24, 0xf6, 0xff, 0x05, 0x7d, 0x74, 0x3c, 0x13, 0xb7, 0x62,
+	0xf2, 0x24, 0xfc, 0x5e, 0x70, 0x86, 0x06, 0xa9, 0xc8, 0xf8, 0x5d, 0x1a, 0x17, 0xd1, 0x64, 0x26,
+	0x1e, 0xef, 0x9f, 0x8b, 0x68, 0x12, 0x27, 0xbe, 0x37, 0xfa, 0xea, 0xa1, 0x70, 0x01, 0x6b, 0xfc,
+	0xf7, 0xd0, 0xd1, 0xe9, 0xe1, 0x87, 0xd3, 0x66, 0xe1, 0xb4, 0xf7, 0x12, 0xff, 0x04, 0x15, 0xac,
+	0x4a, 0xad, 0x30, 0x18, 0x45, 0x54, 0xa5, 0xdb, 0xfd, 0xfb, 0x53, 0x6d, 0x96, 0xf6, 0xb7, 0xcb,
+	0x5d, 0xb9, 0xe7, 0xcd, 0xfb, 0x3f, 0xe6, 0xfc, 0xdd, 0x1b, 0x8e, 0x5d, 0x19, 0x97, 0x16, 0x3b,
+	0xd9, 0xa8, 0x8c, 0xe2, 0xf6, 0x4b, 0xfb, 0xb1, 0x07, 0x72, 0x2e, 0x6d, 0xde, 0x01, 0x79, 0x46,
+	0x73, 0x07, 0x7c, 0x7a, 0xa1, 0x73, 0x19, 0xe3, 0xd2, 0x32, 0xd6, 0x21, 0x8c, 0x65, 0x94, 0x31,
+	0x07, 0xcd, 0x8f, 0xda, 0x75, 0xf4, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x0e, 0x92, 0xbb, 0xd6,
+	0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/criterion_error.pb.go b/googleapis/ads/googleads/v3/errors/criterion_error.pb.go
new file mode 100644
index 0000000..d208365
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/criterion_error.pb.go
@@ -0,0 +1,630 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/criterion_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible criterion errors.
+type CriterionErrorEnum_CriterionError int32
+
+const (
+	// Enum unspecified.
+	CriterionErrorEnum_UNSPECIFIED CriterionErrorEnum_CriterionError = 0
+	// The received error code is not known in this version.
+	CriterionErrorEnum_UNKNOWN CriterionErrorEnum_CriterionError = 1
+	// Concrete type of criterion is required for CREATE and UPDATE operations.
+	CriterionErrorEnum_CONCRETE_TYPE_REQUIRED CriterionErrorEnum_CriterionError = 2
+	// The category requested for exclusion is invalid.
+	CriterionErrorEnum_INVALID_EXCLUDED_CATEGORY CriterionErrorEnum_CriterionError = 3
+	// Invalid keyword criteria text.
+	CriterionErrorEnum_INVALID_KEYWORD_TEXT CriterionErrorEnum_CriterionError = 4
+	// Keyword text should be less than 80 chars.
+	CriterionErrorEnum_KEYWORD_TEXT_TOO_LONG CriterionErrorEnum_CriterionError = 5
+	// Keyword text has too many words.
+	CriterionErrorEnum_KEYWORD_HAS_TOO_MANY_WORDS CriterionErrorEnum_CriterionError = 6
+	// Keyword text has invalid characters or symbols.
+	CriterionErrorEnum_KEYWORD_HAS_INVALID_CHARS CriterionErrorEnum_CriterionError = 7
+	// Invalid placement URL.
+	CriterionErrorEnum_INVALID_PLACEMENT_URL CriterionErrorEnum_CriterionError = 8
+	// Invalid user list criterion.
+	CriterionErrorEnum_INVALID_USER_LIST CriterionErrorEnum_CriterionError = 9
+	// Invalid user interest criterion.
+	CriterionErrorEnum_INVALID_USER_INTEREST CriterionErrorEnum_CriterionError = 10
+	// Placement URL has wrong format.
+	CriterionErrorEnum_INVALID_FORMAT_FOR_PLACEMENT_URL CriterionErrorEnum_CriterionError = 11
+	// Placement URL is too long.
+	CriterionErrorEnum_PLACEMENT_URL_IS_TOO_LONG CriterionErrorEnum_CriterionError = 12
+	// Indicates the URL contains an illegal character.
+	CriterionErrorEnum_PLACEMENT_URL_HAS_ILLEGAL_CHAR CriterionErrorEnum_CriterionError = 13
+	// Indicates the URL contains multiple comma separated URLs.
+	CriterionErrorEnum_PLACEMENT_URL_HAS_MULTIPLE_SITES_IN_LINE CriterionErrorEnum_CriterionError = 14
+	// Indicates the domain is blacklisted.
+	CriterionErrorEnum_PLACEMENT_IS_NOT_AVAILABLE_FOR_TARGETING_OR_EXCLUSION CriterionErrorEnum_CriterionError = 15
+	// Invalid topic path.
+	CriterionErrorEnum_INVALID_TOPIC_PATH CriterionErrorEnum_CriterionError = 16
+	// The YouTube Channel Id is invalid.
+	CriterionErrorEnum_INVALID_YOUTUBE_CHANNEL_ID CriterionErrorEnum_CriterionError = 17
+	// The YouTube Video Id is invalid.
+	CriterionErrorEnum_INVALID_YOUTUBE_VIDEO_ID CriterionErrorEnum_CriterionError = 18
+	// Indicates the placement is a YouTube vertical channel, which is no longer
+	// supported.
+	CriterionErrorEnum_YOUTUBE_VERTICAL_CHANNEL_DEPRECATED CriterionErrorEnum_CriterionError = 19
+	// Indicates the placement is a YouTube demographic channel, which is no
+	// longer supported.
+	CriterionErrorEnum_YOUTUBE_DEMOGRAPHIC_CHANNEL_DEPRECATED CriterionErrorEnum_CriterionError = 20
+	// YouTube urls are not supported in Placement criterion. Use YouTubeChannel
+	// and YouTubeVideo criterion instead.
+	CriterionErrorEnum_YOUTUBE_URL_UNSUPPORTED CriterionErrorEnum_CriterionError = 21
+	// Criteria type can not be excluded by the customer, like AOL account type
+	// cannot target site type criteria.
+	CriterionErrorEnum_CANNOT_EXCLUDE_CRITERIA_TYPE CriterionErrorEnum_CriterionError = 22
+	// Criteria type can not be targeted.
+	CriterionErrorEnum_CANNOT_ADD_CRITERIA_TYPE CriterionErrorEnum_CriterionError = 23
+	// Product filter in the product criteria has invalid characters. Operand
+	// and the argument in the filter can not have "==" or "&+".
+	CriterionErrorEnum_INVALID_PRODUCT_FILTER CriterionErrorEnum_CriterionError = 24
+	// Product filter in the product criteria is translated to a string as
+	// operand1==argument1&+operand2==argument2, maximum allowed length for the
+	// string is 255 chars.
+	CriterionErrorEnum_PRODUCT_FILTER_TOO_LONG CriterionErrorEnum_CriterionError = 25
+	// Not allowed to exclude similar user list.
+	CriterionErrorEnum_CANNOT_EXCLUDE_SIMILAR_USER_LIST CriterionErrorEnum_CriterionError = 26
+	// Not allowed to target a closed user list.
+	CriterionErrorEnum_CANNOT_ADD_CLOSED_USER_LIST CriterionErrorEnum_CriterionError = 27
+	// Not allowed to add display only UserLists to search only campaigns.
+	CriterionErrorEnum_CANNOT_ADD_DISPLAY_ONLY_LISTS_TO_SEARCH_ONLY_CAMPAIGNS CriterionErrorEnum_CriterionError = 28
+	// Not allowed to add display only UserLists to search plus campaigns.
+	CriterionErrorEnum_CANNOT_ADD_DISPLAY_ONLY_LISTS_TO_SEARCH_CAMPAIGNS CriterionErrorEnum_CriterionError = 29
+	// Not allowed to add display only UserLists to shopping campaigns.
+	CriterionErrorEnum_CANNOT_ADD_DISPLAY_ONLY_LISTS_TO_SHOPPING_CAMPAIGNS CriterionErrorEnum_CriterionError = 30
+	// Not allowed to add User interests to search only campaigns.
+	CriterionErrorEnum_CANNOT_ADD_USER_INTERESTS_TO_SEARCH_CAMPAIGNS CriterionErrorEnum_CriterionError = 31
+	// Not allowed to set bids for this criterion type in search campaigns
+	CriterionErrorEnum_CANNOT_SET_BIDS_ON_CRITERION_TYPE_IN_SEARCH_CAMPAIGNS CriterionErrorEnum_CriterionError = 32
+	// Final URLs, URL Templates and CustomParameters cannot be set for the
+	// criterion types of Gender, AgeRange, UserList, Placement, MobileApp, and
+	// MobileAppCategory in search campaigns and shopping campaigns.
+	CriterionErrorEnum_CANNOT_ADD_URLS_TO_CRITERION_TYPE_FOR_CAMPAIGN_TYPE CriterionErrorEnum_CriterionError = 33
+	// Invalid custom affinity criterion.
+	CriterionErrorEnum_INVALID_CUSTOM_AFFINITY CriterionErrorEnum_CriterionError = 96
+	// Invalid custom intent criterion.
+	CriterionErrorEnum_INVALID_CUSTOM_INTENT CriterionErrorEnum_CriterionError = 97
+	// IP address is not valid.
+	CriterionErrorEnum_INVALID_IP_ADDRESS CriterionErrorEnum_CriterionError = 34
+	// IP format is not valid.
+	CriterionErrorEnum_INVALID_IP_FORMAT CriterionErrorEnum_CriterionError = 35
+	// Mobile application is not valid.
+	CriterionErrorEnum_INVALID_MOBILE_APP CriterionErrorEnum_CriterionError = 36
+	// Mobile application category is not valid.
+	CriterionErrorEnum_INVALID_MOBILE_APP_CATEGORY CriterionErrorEnum_CriterionError = 37
+	// The CriterionId does not exist or is of the incorrect type.
+	CriterionErrorEnum_INVALID_CRITERION_ID CriterionErrorEnum_CriterionError = 38
+	// The Criterion is not allowed to be targeted.
+	CriterionErrorEnum_CANNOT_TARGET_CRITERION CriterionErrorEnum_CriterionError = 39
+	// The criterion is not allowed to be targeted as it is deprecated.
+	CriterionErrorEnum_CANNOT_TARGET_OBSOLETE_CRITERION CriterionErrorEnum_CriterionError = 40
+	// The CriterionId is not valid for the type.
+	CriterionErrorEnum_CRITERION_ID_AND_TYPE_MISMATCH CriterionErrorEnum_CriterionError = 41
+	// Distance for the radius for the proximity criterion is invalid.
+	CriterionErrorEnum_INVALID_PROXIMITY_RADIUS CriterionErrorEnum_CriterionError = 42
+	// Units for the distance for the radius for the proximity criterion is
+	// invalid.
+	CriterionErrorEnum_INVALID_PROXIMITY_RADIUS_UNITS CriterionErrorEnum_CriterionError = 43
+	// Street address in the address is not valid.
+	CriterionErrorEnum_INVALID_STREETADDRESS_LENGTH CriterionErrorEnum_CriterionError = 44
+	// City name in the address is not valid.
+	CriterionErrorEnum_INVALID_CITYNAME_LENGTH CriterionErrorEnum_CriterionError = 45
+	// Region code in the address is not valid.
+	CriterionErrorEnum_INVALID_REGIONCODE_LENGTH CriterionErrorEnum_CriterionError = 46
+	// Region name in the address is not valid.
+	CriterionErrorEnum_INVALID_REGIONNAME_LENGTH CriterionErrorEnum_CriterionError = 47
+	// Postal code in the address is not valid.
+	CriterionErrorEnum_INVALID_POSTALCODE_LENGTH CriterionErrorEnum_CriterionError = 48
+	// Country code in the address is not valid.
+	CriterionErrorEnum_INVALID_COUNTRY_CODE CriterionErrorEnum_CriterionError = 49
+	// Latitude for the GeoPoint is not valid.
+	CriterionErrorEnum_INVALID_LATITUDE CriterionErrorEnum_CriterionError = 50
+	// Longitude for the GeoPoint is not valid.
+	CriterionErrorEnum_INVALID_LONGITUDE CriterionErrorEnum_CriterionError = 51
+	// The Proximity input is not valid. Both address and geoPoint cannot be
+	// null.
+	CriterionErrorEnum_PROXIMITY_GEOPOINT_AND_ADDRESS_BOTH_CANNOT_BE_NULL CriterionErrorEnum_CriterionError = 52
+	// The Proximity address cannot be geocoded to a valid lat/long.
+	CriterionErrorEnum_INVALID_PROXIMITY_ADDRESS CriterionErrorEnum_CriterionError = 53
+	// User domain name is not valid.
+	CriterionErrorEnum_INVALID_USER_DOMAIN_NAME CriterionErrorEnum_CriterionError = 54
+	// Length of serialized criterion parameter exceeded size limit.
+	CriterionErrorEnum_CRITERION_PARAMETER_TOO_LONG CriterionErrorEnum_CriterionError = 55
+	// Time interval in the AdSchedule overlaps with another AdSchedule.
+	CriterionErrorEnum_AD_SCHEDULE_TIME_INTERVALS_OVERLAP CriterionErrorEnum_CriterionError = 56
+	// AdSchedule time interval cannot span multiple days.
+	CriterionErrorEnum_AD_SCHEDULE_INTERVAL_CANNOT_SPAN_MULTIPLE_DAYS CriterionErrorEnum_CriterionError = 57
+	// AdSchedule time interval specified is invalid, endTime cannot be earlier
+	// than startTime.
+	CriterionErrorEnum_AD_SCHEDULE_INVALID_TIME_INTERVAL CriterionErrorEnum_CriterionError = 58
+	// The number of AdSchedule entries in a day exceeds the limit.
+	CriterionErrorEnum_AD_SCHEDULE_EXCEEDED_INTERVALS_PER_DAY_LIMIT CriterionErrorEnum_CriterionError = 59
+	// CriteriaId does not match the interval of the AdSchedule specified.
+	CriterionErrorEnum_AD_SCHEDULE_CRITERION_ID_MISMATCHING_FIELDS CriterionErrorEnum_CriterionError = 60
+	// Cannot set bid modifier for this criterion type.
+	CriterionErrorEnum_CANNOT_BID_MODIFY_CRITERION_TYPE CriterionErrorEnum_CriterionError = 61
+	// Cannot bid modify criterion, since it is opted out of the campaign.
+	CriterionErrorEnum_CANNOT_BID_MODIFY_CRITERION_CAMPAIGN_OPTED_OUT CriterionErrorEnum_CriterionError = 62
+	// Cannot set bid modifier for a negative criterion.
+	CriterionErrorEnum_CANNOT_BID_MODIFY_NEGATIVE_CRITERION CriterionErrorEnum_CriterionError = 63
+	// Bid Modifier already exists. Use SET operation to update.
+	CriterionErrorEnum_BID_MODIFIER_ALREADY_EXISTS CriterionErrorEnum_CriterionError = 64
+	// Feed Id is not allowed in these Location Groups.
+	CriterionErrorEnum_FEED_ID_NOT_ALLOWED CriterionErrorEnum_CriterionError = 65
+	// The account may not use the requested criteria type. For example, some
+	// accounts are restricted to keywords only.
+	CriterionErrorEnum_ACCOUNT_INELIGIBLE_FOR_CRITERIA_TYPE CriterionErrorEnum_CriterionError = 66
+	// The requested criteria type cannot be used with campaign or ad group
+	// bidding strategy.
+	CriterionErrorEnum_CRITERIA_TYPE_INVALID_FOR_BIDDING_STRATEGY CriterionErrorEnum_CriterionError = 67
+	// The Criterion is not allowed to be excluded.
+	CriterionErrorEnum_CANNOT_EXCLUDE_CRITERION CriterionErrorEnum_CriterionError = 68
+	// The criterion is not allowed to be removed. For example, we cannot remove
+	// any of the device criterion.
+	CriterionErrorEnum_CANNOT_REMOVE_CRITERION CriterionErrorEnum_CriterionError = 69
+	// The combined length of product dimension values of the product scope
+	// criterion is too long.
+	CriterionErrorEnum_PRODUCT_SCOPE_TOO_LONG CriterionErrorEnum_CriterionError = 70
+	// Product scope contains too many dimensions.
+	CriterionErrorEnum_PRODUCT_SCOPE_TOO_MANY_DIMENSIONS CriterionErrorEnum_CriterionError = 71
+	// The combined length of product dimension values of the product partition
+	// criterion is too long.
+	CriterionErrorEnum_PRODUCT_PARTITION_TOO_LONG CriterionErrorEnum_CriterionError = 72
+	// Product partition contains too many dimensions.
+	CriterionErrorEnum_PRODUCT_PARTITION_TOO_MANY_DIMENSIONS CriterionErrorEnum_CriterionError = 73
+	// The product dimension is invalid (e.g. dimension contains illegal value,
+	// dimension type is represented with wrong class, etc). Product dimension
+	// value can not contain "==" or "&+".
+	CriterionErrorEnum_INVALID_PRODUCT_DIMENSION CriterionErrorEnum_CriterionError = 74
+	// Product dimension type is either invalid for campaigns of this type or
+	// cannot be used in the current context. BIDDING_CATEGORY_Lx and
+	// PRODUCT_TYPE_Lx product dimensions must be used in ascending order of
+	// their levels: L1, L2, L3, L4, L5... The levels must be specified
+	// sequentially and start from L1. Furthermore, an "others" product
+	// partition cannot be subdivided with a dimension of the same type but of a
+	// higher level ("others" BIDDING_CATEGORY_L3 can be subdivided with BRAND
+	// but not with BIDDING_CATEGORY_L4).
+	CriterionErrorEnum_INVALID_PRODUCT_DIMENSION_TYPE CriterionErrorEnum_CriterionError = 75
+	// Bidding categories do not form a valid path in the Shopping bidding
+	// category taxonomy.
+	CriterionErrorEnum_INVALID_PRODUCT_BIDDING_CATEGORY CriterionErrorEnum_CriterionError = 76
+	// ShoppingSetting must be added to the campaign before ProductScope
+	// criteria can be added.
+	CriterionErrorEnum_MISSING_SHOPPING_SETTING CriterionErrorEnum_CriterionError = 77
+	// Matching function is invalid.
+	CriterionErrorEnum_INVALID_MATCHING_FUNCTION CriterionErrorEnum_CriterionError = 78
+	// Filter parameters not allowed for location groups targeting.
+	CriterionErrorEnum_LOCATION_FILTER_NOT_ALLOWED CriterionErrorEnum_CriterionError = 79
+	// Feed not found, or the feed is not an enabled location feed.
+	CriterionErrorEnum_INVALID_FEED_FOR_LOCATION_FILTER CriterionErrorEnum_CriterionError = 98
+	// Given location filter parameter is invalid for location groups targeting.
+	CriterionErrorEnum_LOCATION_FILTER_INVALID CriterionErrorEnum_CriterionError = 80
+	// Criteria type cannot be associated with a campaign and its ad group(s)
+	// simultaneously.
+	CriterionErrorEnum_CANNOT_ATTACH_CRITERIA_AT_CAMPAIGN_AND_ADGROUP CriterionErrorEnum_CriterionError = 81
+	// Range represented by hotel length of stay's min nights and max nights
+	// overlaps with an existing criterion.
+	CriterionErrorEnum_HOTEL_LENGTH_OF_STAY_OVERLAPS_WITH_EXISTING_CRITERION CriterionErrorEnum_CriterionError = 82
+	// Range represented by hotel advance booking window's min days and max days
+	// overlaps with an existing criterion.
+	CriterionErrorEnum_HOTEL_ADVANCE_BOOKING_WINDOW_OVERLAPS_WITH_EXISTING_CRITERION CriterionErrorEnum_CriterionError = 83
+	// The field is not allowed to be set when the negative field is set to
+	// true, e.g. we don't allow bids in negative ad group or campaign criteria.
+	CriterionErrorEnum_FIELD_INCOMPATIBLE_WITH_NEGATIVE_TARGETING CriterionErrorEnum_CriterionError = 84
+	// The combination of operand and operator in webpage condition is invalid.
+	CriterionErrorEnum_INVALID_WEBPAGE_CONDITION CriterionErrorEnum_CriterionError = 85
+	// The URL of webpage condition is invalid.
+	CriterionErrorEnum_INVALID_WEBPAGE_CONDITION_URL CriterionErrorEnum_CriterionError = 86
+	// The URL of webpage condition cannot be empty or contain white space.
+	CriterionErrorEnum_WEBPAGE_CONDITION_URL_CANNOT_BE_EMPTY CriterionErrorEnum_CriterionError = 87
+	// The URL of webpage condition contains an unsupported protocol.
+	CriterionErrorEnum_WEBPAGE_CONDITION_URL_UNSUPPORTED_PROTOCOL CriterionErrorEnum_CriterionError = 88
+	// The URL of webpage condition cannot be an IP address.
+	CriterionErrorEnum_WEBPAGE_CONDITION_URL_CANNOT_BE_IP_ADDRESS CriterionErrorEnum_CriterionError = 89
+	// The domain of the URL is not consistent with the domain in campaign
+	// setting.
+	CriterionErrorEnum_WEBPAGE_CONDITION_URL_DOMAIN_NOT_CONSISTENT_WITH_CAMPAIGN_SETTING CriterionErrorEnum_CriterionError = 90
+	// The URL of webpage condition cannot be a public suffix itself.
+	CriterionErrorEnum_WEBPAGE_CONDITION_URL_CANNOT_BE_PUBLIC_SUFFIX CriterionErrorEnum_CriterionError = 91
+	// The URL of webpage condition has an invalid public suffix.
+	CriterionErrorEnum_WEBPAGE_CONDITION_URL_INVALID_PUBLIC_SUFFIX CriterionErrorEnum_CriterionError = 92
+	// Value track parameter is not supported in webpage condition URL.
+	CriterionErrorEnum_WEBPAGE_CONDITION_URL_VALUE_TRACK_VALUE_NOT_SUPPORTED CriterionErrorEnum_CriterionError = 93
+	// Only one URL-EQUALS webpage condition is allowed in a webpage
+	// criterion and it cannot be combined with other conditions.
+	CriterionErrorEnum_WEBPAGE_CRITERION_URL_EQUALS_CAN_HAVE_ONLY_ONE_CONDITION CriterionErrorEnum_CriterionError = 94
+	// A webpage criterion cannot be added to a non-DSA ad group.
+	CriterionErrorEnum_WEBPAGE_CRITERION_NOT_SUPPORTED_ON_NON_DSA_AD_GROUP CriterionErrorEnum_CriterionError = 95
+	// Cannot add positive user list criteria in Smart Display campaigns.
+	CriterionErrorEnum_CANNOT_TARGET_USER_LIST_FOR_SMART_DISPLAY_CAMPAIGNS CriterionErrorEnum_CriterionError = 99
+)
+
+var CriterionErrorEnum_CriterionError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "CONCRETE_TYPE_REQUIRED",
+	3:  "INVALID_EXCLUDED_CATEGORY",
+	4:  "INVALID_KEYWORD_TEXT",
+	5:  "KEYWORD_TEXT_TOO_LONG",
+	6:  "KEYWORD_HAS_TOO_MANY_WORDS",
+	7:  "KEYWORD_HAS_INVALID_CHARS",
+	8:  "INVALID_PLACEMENT_URL",
+	9:  "INVALID_USER_LIST",
+	10: "INVALID_USER_INTEREST",
+	11: "INVALID_FORMAT_FOR_PLACEMENT_URL",
+	12: "PLACEMENT_URL_IS_TOO_LONG",
+	13: "PLACEMENT_URL_HAS_ILLEGAL_CHAR",
+	14: "PLACEMENT_URL_HAS_MULTIPLE_SITES_IN_LINE",
+	15: "PLACEMENT_IS_NOT_AVAILABLE_FOR_TARGETING_OR_EXCLUSION",
+	16: "INVALID_TOPIC_PATH",
+	17: "INVALID_YOUTUBE_CHANNEL_ID",
+	18: "INVALID_YOUTUBE_VIDEO_ID",
+	19: "YOUTUBE_VERTICAL_CHANNEL_DEPRECATED",
+	20: "YOUTUBE_DEMOGRAPHIC_CHANNEL_DEPRECATED",
+	21: "YOUTUBE_URL_UNSUPPORTED",
+	22: "CANNOT_EXCLUDE_CRITERIA_TYPE",
+	23: "CANNOT_ADD_CRITERIA_TYPE",
+	24: "INVALID_PRODUCT_FILTER",
+	25: "PRODUCT_FILTER_TOO_LONG",
+	26: "CANNOT_EXCLUDE_SIMILAR_USER_LIST",
+	27: "CANNOT_ADD_CLOSED_USER_LIST",
+	28: "CANNOT_ADD_DISPLAY_ONLY_LISTS_TO_SEARCH_ONLY_CAMPAIGNS",
+	29: "CANNOT_ADD_DISPLAY_ONLY_LISTS_TO_SEARCH_CAMPAIGNS",
+	30: "CANNOT_ADD_DISPLAY_ONLY_LISTS_TO_SHOPPING_CAMPAIGNS",
+	31: "CANNOT_ADD_USER_INTERESTS_TO_SEARCH_CAMPAIGNS",
+	32: "CANNOT_SET_BIDS_ON_CRITERION_TYPE_IN_SEARCH_CAMPAIGNS",
+	33: "CANNOT_ADD_URLS_TO_CRITERION_TYPE_FOR_CAMPAIGN_TYPE",
+	96: "INVALID_CUSTOM_AFFINITY",
+	97: "INVALID_CUSTOM_INTENT",
+	34: "INVALID_IP_ADDRESS",
+	35: "INVALID_IP_FORMAT",
+	36: "INVALID_MOBILE_APP",
+	37: "INVALID_MOBILE_APP_CATEGORY",
+	38: "INVALID_CRITERION_ID",
+	39: "CANNOT_TARGET_CRITERION",
+	40: "CANNOT_TARGET_OBSOLETE_CRITERION",
+	41: "CRITERION_ID_AND_TYPE_MISMATCH",
+	42: "INVALID_PROXIMITY_RADIUS",
+	43: "INVALID_PROXIMITY_RADIUS_UNITS",
+	44: "INVALID_STREETADDRESS_LENGTH",
+	45: "INVALID_CITYNAME_LENGTH",
+	46: "INVALID_REGIONCODE_LENGTH",
+	47: "INVALID_REGIONNAME_LENGTH",
+	48: "INVALID_POSTALCODE_LENGTH",
+	49: "INVALID_COUNTRY_CODE",
+	50: "INVALID_LATITUDE",
+	51: "INVALID_LONGITUDE",
+	52: "PROXIMITY_GEOPOINT_AND_ADDRESS_BOTH_CANNOT_BE_NULL",
+	53: "INVALID_PROXIMITY_ADDRESS",
+	54: "INVALID_USER_DOMAIN_NAME",
+	55: "CRITERION_PARAMETER_TOO_LONG",
+	56: "AD_SCHEDULE_TIME_INTERVALS_OVERLAP",
+	57: "AD_SCHEDULE_INTERVAL_CANNOT_SPAN_MULTIPLE_DAYS",
+	58: "AD_SCHEDULE_INVALID_TIME_INTERVAL",
+	59: "AD_SCHEDULE_EXCEEDED_INTERVALS_PER_DAY_LIMIT",
+	60: "AD_SCHEDULE_CRITERION_ID_MISMATCHING_FIELDS",
+	61: "CANNOT_BID_MODIFY_CRITERION_TYPE",
+	62: "CANNOT_BID_MODIFY_CRITERION_CAMPAIGN_OPTED_OUT",
+	63: "CANNOT_BID_MODIFY_NEGATIVE_CRITERION",
+	64: "BID_MODIFIER_ALREADY_EXISTS",
+	65: "FEED_ID_NOT_ALLOWED",
+	66: "ACCOUNT_INELIGIBLE_FOR_CRITERIA_TYPE",
+	67: "CRITERIA_TYPE_INVALID_FOR_BIDDING_STRATEGY",
+	68: "CANNOT_EXCLUDE_CRITERION",
+	69: "CANNOT_REMOVE_CRITERION",
+	70: "PRODUCT_SCOPE_TOO_LONG",
+	71: "PRODUCT_SCOPE_TOO_MANY_DIMENSIONS",
+	72: "PRODUCT_PARTITION_TOO_LONG",
+	73: "PRODUCT_PARTITION_TOO_MANY_DIMENSIONS",
+	74: "INVALID_PRODUCT_DIMENSION",
+	75: "INVALID_PRODUCT_DIMENSION_TYPE",
+	76: "INVALID_PRODUCT_BIDDING_CATEGORY",
+	77: "MISSING_SHOPPING_SETTING",
+	78: "INVALID_MATCHING_FUNCTION",
+	79: "LOCATION_FILTER_NOT_ALLOWED",
+	98: "INVALID_FEED_FOR_LOCATION_FILTER",
+	80: "LOCATION_FILTER_INVALID",
+	81: "CANNOT_ATTACH_CRITERIA_AT_CAMPAIGN_AND_ADGROUP",
+	82: "HOTEL_LENGTH_OF_STAY_OVERLAPS_WITH_EXISTING_CRITERION",
+	83: "HOTEL_ADVANCE_BOOKING_WINDOW_OVERLAPS_WITH_EXISTING_CRITERION",
+	84: "FIELD_INCOMPATIBLE_WITH_NEGATIVE_TARGETING",
+	85: "INVALID_WEBPAGE_CONDITION",
+	86: "INVALID_WEBPAGE_CONDITION_URL",
+	87: "WEBPAGE_CONDITION_URL_CANNOT_BE_EMPTY",
+	88: "WEBPAGE_CONDITION_URL_UNSUPPORTED_PROTOCOL",
+	89: "WEBPAGE_CONDITION_URL_CANNOT_BE_IP_ADDRESS",
+	90: "WEBPAGE_CONDITION_URL_DOMAIN_NOT_CONSISTENT_WITH_CAMPAIGN_SETTING",
+	91: "WEBPAGE_CONDITION_URL_CANNOT_BE_PUBLIC_SUFFIX",
+	92: "WEBPAGE_CONDITION_URL_INVALID_PUBLIC_SUFFIX",
+	93: "WEBPAGE_CONDITION_URL_VALUE_TRACK_VALUE_NOT_SUPPORTED",
+	94: "WEBPAGE_CRITERION_URL_EQUALS_CAN_HAVE_ONLY_ONE_CONDITION",
+	95: "WEBPAGE_CRITERION_NOT_SUPPORTED_ON_NON_DSA_AD_GROUP",
+	99: "CANNOT_TARGET_USER_LIST_FOR_SMART_DISPLAY_CAMPAIGNS",
+}
+
+var CriterionErrorEnum_CriterionError_value = map[string]int32{
+	"UNSPECIFIED":                                                       0,
+	"UNKNOWN":                                                           1,
+	"CONCRETE_TYPE_REQUIRED":                                            2,
+	"INVALID_EXCLUDED_CATEGORY":                                         3,
+	"INVALID_KEYWORD_TEXT":                                              4,
+	"KEYWORD_TEXT_TOO_LONG":                                             5,
+	"KEYWORD_HAS_TOO_MANY_WORDS":                                        6,
+	"KEYWORD_HAS_INVALID_CHARS":                                         7,
+	"INVALID_PLACEMENT_URL":                                             8,
+	"INVALID_USER_LIST":                                                 9,
+	"INVALID_USER_INTEREST":                                             10,
+	"INVALID_FORMAT_FOR_PLACEMENT_URL":                                  11,
+	"PLACEMENT_URL_IS_TOO_LONG":                                         12,
+	"PLACEMENT_URL_HAS_ILLEGAL_CHAR":                                    13,
+	"PLACEMENT_URL_HAS_MULTIPLE_SITES_IN_LINE":                          14,
+	"PLACEMENT_IS_NOT_AVAILABLE_FOR_TARGETING_OR_EXCLUSION":             15,
+	"INVALID_TOPIC_PATH":                                                16,
+	"INVALID_YOUTUBE_CHANNEL_ID":                                        17,
+	"INVALID_YOUTUBE_VIDEO_ID":                                          18,
+	"YOUTUBE_VERTICAL_CHANNEL_DEPRECATED":                               19,
+	"YOUTUBE_DEMOGRAPHIC_CHANNEL_DEPRECATED":                            20,
+	"YOUTUBE_URL_UNSUPPORTED":                                           21,
+	"CANNOT_EXCLUDE_CRITERIA_TYPE":                                      22,
+	"CANNOT_ADD_CRITERIA_TYPE":                                          23,
+	"INVALID_PRODUCT_FILTER":                                            24,
+	"PRODUCT_FILTER_TOO_LONG":                                           25,
+	"CANNOT_EXCLUDE_SIMILAR_USER_LIST":                                  26,
+	"CANNOT_ADD_CLOSED_USER_LIST":                                       27,
+	"CANNOT_ADD_DISPLAY_ONLY_LISTS_TO_SEARCH_ONLY_CAMPAIGNS":            28,
+	"CANNOT_ADD_DISPLAY_ONLY_LISTS_TO_SEARCH_CAMPAIGNS":                 29,
+	"CANNOT_ADD_DISPLAY_ONLY_LISTS_TO_SHOPPING_CAMPAIGNS":               30,
+	"CANNOT_ADD_USER_INTERESTS_TO_SEARCH_CAMPAIGNS":                     31,
+	"CANNOT_SET_BIDS_ON_CRITERION_TYPE_IN_SEARCH_CAMPAIGNS":             32,
+	"CANNOT_ADD_URLS_TO_CRITERION_TYPE_FOR_CAMPAIGN_TYPE":               33,
+	"INVALID_CUSTOM_AFFINITY":                                           96,
+	"INVALID_CUSTOM_INTENT":                                             97,
+	"INVALID_IP_ADDRESS":                                                34,
+	"INVALID_IP_FORMAT":                                                 35,
+	"INVALID_MOBILE_APP":                                                36,
+	"INVALID_MOBILE_APP_CATEGORY":                                       37,
+	"INVALID_CRITERION_ID":                                              38,
+	"CANNOT_TARGET_CRITERION":                                           39,
+	"CANNOT_TARGET_OBSOLETE_CRITERION":                                  40,
+	"CRITERION_ID_AND_TYPE_MISMATCH":                                    41,
+	"INVALID_PROXIMITY_RADIUS":                                          42,
+	"INVALID_PROXIMITY_RADIUS_UNITS":                                    43,
+	"INVALID_STREETADDRESS_LENGTH":                                      44,
+	"INVALID_CITYNAME_LENGTH":                                           45,
+	"INVALID_REGIONCODE_LENGTH":                                         46,
+	"INVALID_REGIONNAME_LENGTH":                                         47,
+	"INVALID_POSTALCODE_LENGTH":                                         48,
+	"INVALID_COUNTRY_CODE":                                              49,
+	"INVALID_LATITUDE":                                                  50,
+	"INVALID_LONGITUDE":                                                 51,
+	"PROXIMITY_GEOPOINT_AND_ADDRESS_BOTH_CANNOT_BE_NULL":                52,
+	"INVALID_PROXIMITY_ADDRESS":                                         53,
+	"INVALID_USER_DOMAIN_NAME":                                          54,
+	"CRITERION_PARAMETER_TOO_LONG":                                      55,
+	"AD_SCHEDULE_TIME_INTERVALS_OVERLAP":                                56,
+	"AD_SCHEDULE_INTERVAL_CANNOT_SPAN_MULTIPLE_DAYS":                    57,
+	"AD_SCHEDULE_INVALID_TIME_INTERVAL":                                 58,
+	"AD_SCHEDULE_EXCEEDED_INTERVALS_PER_DAY_LIMIT":                      59,
+	"AD_SCHEDULE_CRITERION_ID_MISMATCHING_FIELDS":                       60,
+	"CANNOT_BID_MODIFY_CRITERION_TYPE":                                  61,
+	"CANNOT_BID_MODIFY_CRITERION_CAMPAIGN_OPTED_OUT":                    62,
+	"CANNOT_BID_MODIFY_NEGATIVE_CRITERION":                              63,
+	"BID_MODIFIER_ALREADY_EXISTS":                                       64,
+	"FEED_ID_NOT_ALLOWED":                                               65,
+	"ACCOUNT_INELIGIBLE_FOR_CRITERIA_TYPE":                              66,
+	"CRITERIA_TYPE_INVALID_FOR_BIDDING_STRATEGY":                        67,
+	"CANNOT_EXCLUDE_CRITERION":                                          68,
+	"CANNOT_REMOVE_CRITERION":                                           69,
+	"PRODUCT_SCOPE_TOO_LONG":                                            70,
+	"PRODUCT_SCOPE_TOO_MANY_DIMENSIONS":                                 71,
+	"PRODUCT_PARTITION_TOO_LONG":                                        72,
+	"PRODUCT_PARTITION_TOO_MANY_DIMENSIONS":                             73,
+	"INVALID_PRODUCT_DIMENSION":                                         74,
+	"INVALID_PRODUCT_DIMENSION_TYPE":                                    75,
+	"INVALID_PRODUCT_BIDDING_CATEGORY":                                  76,
+	"MISSING_SHOPPING_SETTING":                                          77,
+	"INVALID_MATCHING_FUNCTION":                                         78,
+	"LOCATION_FILTER_NOT_ALLOWED":                                       79,
+	"INVALID_FEED_FOR_LOCATION_FILTER":                                  98,
+	"LOCATION_FILTER_INVALID":                                           80,
+	"CANNOT_ATTACH_CRITERIA_AT_CAMPAIGN_AND_ADGROUP":                    81,
+	"HOTEL_LENGTH_OF_STAY_OVERLAPS_WITH_EXISTING_CRITERION":             82,
+	"HOTEL_ADVANCE_BOOKING_WINDOW_OVERLAPS_WITH_EXISTING_CRITERION":     83,
+	"FIELD_INCOMPATIBLE_WITH_NEGATIVE_TARGETING":                        84,
+	"INVALID_WEBPAGE_CONDITION":                                         85,
+	"INVALID_WEBPAGE_CONDITION_URL":                                     86,
+	"WEBPAGE_CONDITION_URL_CANNOT_BE_EMPTY":                             87,
+	"WEBPAGE_CONDITION_URL_UNSUPPORTED_PROTOCOL":                        88,
+	"WEBPAGE_CONDITION_URL_CANNOT_BE_IP_ADDRESS":                        89,
+	"WEBPAGE_CONDITION_URL_DOMAIN_NOT_CONSISTENT_WITH_CAMPAIGN_SETTING": 90,
+	"WEBPAGE_CONDITION_URL_CANNOT_BE_PUBLIC_SUFFIX":                     91,
+	"WEBPAGE_CONDITION_URL_INVALID_PUBLIC_SUFFIX":                       92,
+	"WEBPAGE_CONDITION_URL_VALUE_TRACK_VALUE_NOT_SUPPORTED":             93,
+	"WEBPAGE_CRITERION_URL_EQUALS_CAN_HAVE_ONLY_ONE_CONDITION":          94,
+	"WEBPAGE_CRITERION_NOT_SUPPORTED_ON_NON_DSA_AD_GROUP":               95,
+	"CANNOT_TARGET_USER_LIST_FOR_SMART_DISPLAY_CAMPAIGNS":               99,
+}
+
+func (x CriterionErrorEnum_CriterionError) String() string {
+	return proto.EnumName(CriterionErrorEnum_CriterionError_name, int32(x))
+}
+
+func (CriterionErrorEnum_CriterionError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_333180aa63050caa, []int{0, 0}
+}
+
+// Container for enum describing possible criterion errors.
+type CriterionErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CriterionErrorEnum) Reset()         { *m = CriterionErrorEnum{} }
+func (m *CriterionErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CriterionErrorEnum) ProtoMessage()    {}
+func (*CriterionErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_333180aa63050caa, []int{0}
+}
+
+func (m *CriterionErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CriterionErrorEnum.Unmarshal(m, b)
+}
+func (m *CriterionErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CriterionErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CriterionErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CriterionErrorEnum.Merge(m, src)
+}
+func (m *CriterionErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CriterionErrorEnum.Size(m)
+}
+func (m *CriterionErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CriterionErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CriterionErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CriterionErrorEnum_CriterionError", CriterionErrorEnum_CriterionError_name, CriterionErrorEnum_CriterionError_value)
+	proto.RegisterType((*CriterionErrorEnum)(nil), "google.ads.googleads.v3.errors.CriterionErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/criterion_error.proto", fileDescriptor_333180aa63050caa)
+}
+
+var fileDescriptor_333180aa63050caa = []byte{
+	// 1713 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xdd, 0x76, 0x1b, 0xb7,
+	0x11, 0xae, 0x9d, 0x36, 0x69, 0xe1, 0x36, 0x41, 0xe0, 0xff, 0x1f, 0x29, 0xb6, 0x62, 0x3b, 0x8e,
+	0xe3, 0x50, 0xb1, 0x15, 0x3b, 0x09, 0x93, 0xb4, 0x05, 0x17, 0x43, 0x12, 0x15, 0x16, 0x80, 0x01,
+	0x2c, 0x25, 0xa6, 0x6a, 0x51, 0xc5, 0xf2, 0xd1, 0xd1, 0x39, 0x89, 0xe8, 0x23, 0xb9, 0x79, 0xa0,
+	0x5e, 0xf6, 0x51, 0xf2, 0x16, 0xbd, 0xed, 0x45, 0x9f, 0xa1, 0x67, 0x76, 0x89, 0x25, 0x96, 0x92,
+	0xed, 0x5c, 0x91, 0x67, 0x66, 0x3e, 0x60, 0x06, 0xf3, 0xcd, 0xcf, 0x92, 0xcf, 0xf7, 0x67, 0xb3,
+	0xfd, 0x1f, 0x9e, 0xaf, 0xef, 0xee, 0x1d, 0xaf, 0x37, 0x7f, 0xf1, 0xdf, 0x4f, 0x1b, 0xeb, 0xcf,
+	0x8f, 0x8e, 0x66, 0x47, 0xc7, 0xeb, 0xcf, 0x8e, 0x0e, 0x5e, 0x3e, 0x3f, 0x3a, 0x98, 0x1d, 0xc6,
+	0x5a, 0xd0, 0x7b, 0x71, 0x34, 0x7b, 0x39, 0x63, 0xab, 0x8d, 0x69, 0x6f, 0x77, 0xef, 0xb8, 0xd7,
+	0xa2, 0x7a, 0x3f, 0x6d, 0xf4, 0x1a, 0xd4, 0xb5, 0x1b, 0xe9, 0xd4, 0x17, 0x07, 0xeb, 0xbb, 0x87,
+	0x87, 0xb3, 0x97, 0xbb, 0x2f, 0x0f, 0x66, 0x87, 0xc7, 0x0d, 0x7a, 0xed, 0x3f, 0x2b, 0x84, 0x15,
+	0xe9, 0x5c, 0x40, 0x04, 0x1c, 0xfe, 0xf3, 0xc7, 0xb5, 0x9f, 0x57, 0xc8, 0xbb, 0x5d, 0x31, 0x7b,
+	0x8f, 0x9c, 0xab, 0xb4, 0xb7, 0x50, 0xc8, 0xa1, 0x04, 0x41, 0x7f, 0xc5, 0xce, 0x91, 0x77, 0x2a,
+	0xbd, 0xa9, 0xcd, 0x96, 0xa6, 0x67, 0xd8, 0x35, 0x72, 0xa9, 0x30, 0xba, 0x70, 0x10, 0x20, 0x86,
+	0xa9, 0x85, 0xe8, 0xe0, 0x69, 0x25, 0x1d, 0x08, 0x7a, 0x96, 0xad, 0x90, 0xab, 0x52, 0x4f, 0xb8,
+	0x92, 0x22, 0xc2, 0x76, 0xa1, 0x2a, 0x01, 0x22, 0x16, 0x3c, 0xc0, 0xc8, 0xb8, 0x29, 0x7d, 0x8b,
+	0x5d, 0x21, 0x17, 0x92, 0x7a, 0x13, 0xa6, 0x5b, 0xc6, 0x89, 0x18, 0x60, 0x3b, 0xd0, 0x5f, 0xb3,
+	0xab, 0xe4, 0x62, 0x2e, 0x89, 0xc1, 0x98, 0xa8, 0x8c, 0x1e, 0xd1, 0xdf, 0xb0, 0x55, 0x72, 0x2d,
+	0xa9, 0xc6, 0xdc, 0xd7, 0x9a, 0x92, 0xeb, 0x69, 0x44, 0x89, 0xa7, 0x6f, 0xe3, 0x9d, 0xb9, 0x3e,
+	0x5d, 0x50, 0x8c, 0xb9, 0xf3, 0xf4, 0x1d, 0x3c, 0x39, 0x89, 0xac, 0xe2, 0x05, 0x94, 0xa0, 0x43,
+	0xac, 0x9c, 0xa2, 0xbf, 0x65, 0x17, 0xc9, 0xfb, 0x49, 0x55, 0x79, 0x70, 0x51, 0x49, 0x1f, 0xe8,
+	0xef, 0x72, 0x44, 0x2d, 0x96, 0x3a, 0x80, 0x03, 0x1f, 0x28, 0x61, 0xb7, 0xc9, 0xcd, 0xa4, 0x1a,
+	0x1a, 0x57, 0xf2, 0x80, 0x3f, 0x4b, 0xe7, 0x9e, 0x43, 0x8f, 0x3a, 0xa2, 0x28, 0xfd, 0x22, 0xa0,
+	0xdf, 0xb3, 0x35, 0xb2, 0xda, 0x55, 0xd7, 0x6e, 0x2b, 0x05, 0x23, 0xae, 0x6a, 0xb7, 0xe9, 0x1f,
+	0xd8, 0x03, 0x72, 0xef, 0xa4, 0x4d, 0x59, 0xa9, 0x20, 0xad, 0x82, 0xe8, 0x65, 0x00, 0x8c, 0x34,
+	0x2a, 0xa9, 0x81, 0xbe, 0xcb, 0xbe, 0x22, 0x8f, 0x17, 0xd6, 0xd2, 0x47, 0x6d, 0x42, 0xe4, 0x13,
+	0x2e, 0x15, 0x1f, 0x28, 0xa8, 0x5d, 0x0c, 0xdc, 0x8d, 0x20, 0x48, 0x3d, 0x8a, 0xc6, 0x35, 0xa9,
+	0xf1, 0xd2, 0x68, 0xfa, 0x1e, 0xbb, 0x44, 0x58, 0x8a, 0x28, 0x18, 0x2b, 0x8b, 0x68, 0x79, 0x18,
+	0x53, 0x8a, 0xaf, 0x9e, 0xe4, 0x53, 0x53, 0x85, 0x6a, 0x00, 0xe8, 0x9a, 0xd6, 0xa0, 0xa2, 0x14,
+	0xf4, 0x7d, 0x76, 0x83, 0x5c, 0x59, 0xd6, 0x4f, 0xa4, 0x00, 0x83, 0x5a, 0xc6, 0x3e, 0x22, 0x1f,
+	0xb6, 0x52, 0x70, 0x41, 0x16, 0x4d, 0x64, 0x35, 0x5c, 0x80, 0x75, 0x80, 0xa4, 0x10, 0xf4, 0x3c,
+	0xbb, 0x4f, 0xee, 0x26, 0x43, 0x01, 0xa5, 0x19, 0x39, 0x6e, 0xc7, 0xb2, 0x38, 0xcd, 0xf6, 0x02,
+	0xbb, 0x4e, 0x2e, 0x27, 0x5b, 0x7c, 0x91, 0x4a, 0xfb, 0xca, 0x5a, 0xe3, 0x50, 0x79, 0x91, 0xdd,
+	0x24, 0x37, 0x0a, 0xae, 0x31, 0xf0, 0x39, 0xf1, 0x62, 0xe1, 0x64, 0x00, 0x27, 0x79, 0x4d, 0x52,
+	0x7a, 0x09, 0x3d, 0x9e, 0x5b, 0x70, 0x21, 0x96, 0xb4, 0x97, 0x91, 0xd5, 0x2d, 0x4d, 0x9c, 0x11,
+	0x55, 0x11, 0xe2, 0x50, 0xaa, 0x00, 0x8e, 0x5e, 0xc1, 0x8b, 0xbb, 0xb2, 0x45, 0x36, 0xaf, 0x22,
+	0x25, 0x96, 0x2e, 0xf6, 0xb2, 0x94, 0x8a, 0xbb, 0x8c, 0x53, 0xd7, 0xd8, 0x07, 0xe4, 0x7a, 0x7e,
+	0xb9, 0x32, 0x1e, 0x72, 0xd2, 0x5d, 0x67, 0x7d, 0xf2, 0x24, 0x33, 0x10, 0xd2, 0x5b, 0xc5, 0xa7,
+	0xd1, 0x68, 0x35, 0xad, 0x2d, 0x90, 0x40, 0xd1, 0x03, 0x77, 0xc5, 0xb8, 0x11, 0x16, 0xbc, 0xb4,
+	0x5c, 0x8e, 0xb4, 0xa7, 0x37, 0xd8, 0x63, 0xf2, 0xf0, 0x97, 0x62, 0x17, 0xb0, 0x15, 0xf6, 0x05,
+	0xd9, 0x78, 0x33, 0x6c, 0x6c, 0xac, 0x45, 0xda, 0x2c, 0x80, 0xab, 0xec, 0x21, 0xf9, 0x34, 0x03,
+	0x76, 0x6a, 0xe4, 0xf4, 0xbb, 0x3e, 0x40, 0x86, 0xce, 0x21, 0x1e, 0x42, 0x1c, 0x48, 0xe1, 0xa3,
+	0xd1, 0x29, 0x09, 0x46, 0x37, 0x8d, 0x44, 0xea, 0x93, 0xd0, 0x9b, 0x4b, 0x6e, 0x56, 0x4e, 0xd5,
+	0x77, 0x2c, 0x41, 0x91, 0xe3, 0x09, 0xd4, 0xa4, 0xf4, 0x16, 0xa6, 0xad, 0x6d, 0x06, 0x95, 0x0f,
+	0xa6, 0x8c, 0x7c, 0x38, 0x94, 0x5a, 0x86, 0x29, 0xfd, 0x47, 0x5e, 0xe4, 0x73, 0x25, 0x86, 0xa0,
+	0x03, 0xdd, 0xcd, 0x4b, 0x42, 0x5a, 0xbc, 0xd4, 0x81, 0xf7, 0x74, 0x2d, 0x6f, 0x17, 0xd2, 0xce,
+	0xeb, 0x9f, 0x7e, 0x98, 0x9b, 0x97, 0x66, 0x20, 0x15, 0x44, 0x6e, 0x2d, 0xbd, 0x8d, 0x29, 0x3f,
+	0x29, 0x5f, 0x74, 0xc3, 0x3b, 0x79, 0x37, 0x5c, 0x44, 0x23, 0x05, 0xbd, 0x8b, 0x9e, 0xcf, 0x43,
+	0x6e, 0xea, 0x76, 0xa1, 0xa7, 0x1f, 0x65, 0x84, 0x9b, 0x2b, 0xcd, 0xc0, 0x1b, 0x85, 0xdd, 0x78,
+	0x61, 0x75, 0x0f, 0x9b, 0x4c, 0x7e, 0x68, 0xe4, 0x5a, 0x34, 0x2f, 0x55, 0x4a, 0x5f, 0xf2, 0x50,
+	0x8c, 0xe9, 0xc7, 0x79, 0x0d, 0x5b, 0x67, 0xb6, 0x65, 0x29, 0xc3, 0x34, 0x3a, 0x2e, 0x64, 0xe5,
+	0xe9, 0x7d, 0x3c, 0xe1, 0x55, 0xda, 0x58, 0x69, 0x19, 0x3c, 0xfd, 0x04, 0xab, 0x2e, 0xd9, 0xf8,
+	0xe0, 0x00, 0xc2, 0xfc, 0xb5, 0xa2, 0x02, 0x3d, 0x0a, 0x63, 0xfa, 0xa0, 0x93, 0x04, 0x19, 0xa6,
+	0x9a, 0x97, 0x90, 0x94, 0x9f, 0xe6, 0xe3, 0xc2, 0xc1, 0x48, 0x1a, 0x5d, 0x18, 0xd1, 0xaa, 0x7b,
+	0x27, 0xd5, 0x39, 0x7a, 0x3d, 0x57, 0x5b, 0xe3, 0x03, 0x57, 0x39, 0xfa, 0xb3, 0xce, 0xf3, 0x9a,
+	0x4a, 0x07, 0x37, 0x8d, 0x68, 0x40, 0x1f, 0xb2, 0x0b, 0x84, 0x26, 0x8d, 0xe2, 0x41, 0x86, 0x4a,
+	0x00, 0x7d, 0x94, 0xa7, 0x17, 0x4b, 0xbb, 0x11, 0x6f, 0xb0, 0x27, 0xe4, 0xd1, 0x22, 0xfc, 0x11,
+	0x18, 0x6b, 0xa4, 0x0e, 0xf5, 0x73, 0xa6, 0x58, 0x07, 0x26, 0x20, 0x63, 0xeb, 0x94, 0x0c, 0x20,
+	0xea, 0x4a, 0x29, 0xfa, 0x79, 0xc7, 0xbb, 0x16, 0x9f, 0xc8, 0xf4, 0x38, 0x7f, 0xfb, 0xba, 0x80,
+	0x84, 0x29, 0xb9, 0xd4, 0x11, 0x23, 0xa4, 0x4f, 0xea, 0x6e, 0xd6, 0x66, 0xcf, 0x72, 0xc7, 0x4b,
+	0xe8, 0xb4, 0x9d, 0x2f, 0xd8, 0x5d, 0xb2, 0xc6, 0x45, 0xf4, 0xc5, 0x18, 0x44, 0xa5, 0x20, 0x06,
+	0x59, 0x42, 0x53, 0x84, 0x13, 0xae, 0x7c, 0x34, 0x13, 0x70, 0x8a, 0x5b, 0xfa, 0x25, 0x7b, 0x44,
+	0x7a, 0xb9, 0x5d, 0x32, 0x49, 0xfe, 0x7a, 0xcb, 0xf5, 0x62, 0xae, 0x08, 0x3e, 0xf5, 0xf4, 0x2b,
+	0x76, 0x87, 0xdc, 0xea, 0x62, 0xe6, 0xf3, 0x21, 0xbf, 0x83, 0xf6, 0xd9, 0x67, 0xe4, 0x41, 0x6e,
+	0x06, 0xdb, 0x05, 0x00, 0x0e, 0xfc, 0x85, 0x1b, 0x16, 0x03, 0xe3, 0xd8, 0x4e, 0x4a, 0x19, 0xe8,
+	0xd7, 0x6c, 0x9d, 0x7c, 0x92, 0x23, 0x3a, 0x04, 0x4d, 0xbc, 0xc4, 0x66, 0x33, 0x94, 0xa0, 0x84,
+	0xa7, 0xdf, 0x64, 0x5c, 0x1f, 0xd4, 0x65, 0x24, 0xe4, 0x70, 0xba, 0x54, 0xfa, 0xf4, 0x5b, 0x8c,
+	0xf1, 0x75, 0x56, 0x6d, 0x5f, 0x30, 0x36, 0x80, 0x88, 0xa6, 0x0a, 0xf4, 0x8f, 0xec, 0x1e, 0xb9,
+	0x7d, 0x12, 0xa3, 0x61, 0xc4, 0x83, 0x9c, 0xe4, 0x95, 0xf4, 0x27, 0xac, 0xe3, 0xd6, 0x44, 0x82,
+	0x8b, 0x5c, 0x39, 0xe0, 0x62, 0x1a, 0x61, 0x1b, 0x9b, 0x24, 0xfd, 0x33, 0xbb, 0x4c, 0xce, 0x0f,
+	0x01, 0xe3, 0x16, 0xcd, 0xe0, 0x55, 0xca, 0x6c, 0x81, 0xa0, 0x1c, 0xef, 0xe0, 0x45, 0xcd, 0xbd,
+	0x28, 0x35, 0x28, 0x39, 0x92, 0x69, 0x1c, 0x77, 0xa7, 0xcf, 0x80, 0xf5, 0xc8, 0xfd, 0x8e, 0x28,
+	0x66, 0x5b, 0x06, 0x3a, 0x28, 0xf0, 0x55, 0x7c, 0x70, 0xd8, 0x3c, 0xa6, 0xb4, 0xc8, 0x66, 0xd9,
+	0xd2, 0xb4, 0x33, 0x9a, 0x8a, 0xac, 0x7d, 0x38, 0x28, 0x4d, 0x27, 0x1c, 0xc0, 0x41, 0x97, 0x86,
+	0x99, 0x2f, 0x8c, 0x85, 0x05, 0xa9, 0x86, 0x98, 0xf8, 0x93, 0xba, 0x7a, 0xd9, 0x12, 0xb2, 0x04,
+	0x8d, 0x2b, 0x83, 0xa7, 0x23, 0xdc, 0x0d, 0x92, 0x99, 0xe5, 0x2e, 0xc8, 0x50, 0xe7, 0x22, 0x1d,
+	0x33, 0x66, 0x1f, 0x93, 0x3b, 0xa7, 0xeb, 0x97, 0x8f, 0x92, 0x4b, 0x55, 0x52, 0x43, 0x5a, 0x3d,
+	0xfd, 0xcb, 0x52, 0x0f, 0xea, 0xaa, 0x9b, 0xb7, 0xdb, 0xcc, 0x77, 0xb2, 0x64, 0x93, 0x5e, 0xac,
+	0x6d, 0xb6, 0x0a, 0x5f, 0xac, 0x94, 0xde, 0xd7, 0xef, 0x98, 0x66, 0x9a, 0x87, 0x80, 0x2b, 0x11,
+	0x2d, 0x73, 0x37, 0x16, 0x24, 0xac, 0x74, 0x81, 0x9e, 0x53, 0x8d, 0x14, 0x50, 0xa6, 0xe0, 0x75,
+	0x1c, 0xf3, 0x0d, 0x20, 0xcf, 0xb4, 0xe9, 0xec, 0x85, 0x48, 0x05, 0x4c, 0xdb, 0x12, 0x82, 0x7e,
+	0x8f, 0x79, 0x59, 0x3e, 0x66, 0x8e, 0xa2, 0x36, 0x23, 0x31, 0x0f, 0x81, 0xe3, 0x0c, 0x4c, 0x84,
+	0xe0, 0x61, 0x41, 0xe1, 0xa6, 0xef, 0x8c, 0x9c, 0xa9, 0x2c, 0x7d, 0x8a, 0x53, 0x75, 0x6c, 0x02,
+	0xa8, 0x79, 0xd3, 0x8b, 0x66, 0x18, 0x7d, 0xc0, 0x19, 0xde, 0x94, 0xbf, 0x8f, 0x5b, 0x32, 0x8c,
+	0x1b, 0xa2, 0xd6, 0xcf, 0xd1, 0xd2, 0xc0, 0x31, 0x4e, 0xbe, 0x6d, 0xa0, 0x5c, 0x4c, 0xb8, 0x2e,
+	0x20, 0x0e, 0x8c, 0xd9, 0x44, 0xa3, 0x2d, 0xa9, 0x85, 0xd9, 0x7a, 0xf3, 0x11, 0x1e, 0x49, 0x5b,
+	0x17, 0x6a, 0x94, 0xba, 0x30, 0xa5, 0xe5, 0xa1, 0xa6, 0x77, 0x6d, 0xdf, 0x16, 0x52, 0xbb, 0x77,
+	0xd2, 0x90, 0x3f, 0xf2, 0x16, 0x0c, 0x2c, 0x1f, 0x41, 0x2c, 0x8c, 0x16, 0x35, 0x3d, 0x68, 0xc5,
+	0x6e, 0x91, 0x95, 0x57, 0xaa, 0xeb, 0xc5, 0x7a, 0x82, 0xc4, 0x3a, 0x55, 0x95, 0x75, 0x5f, 0x28,
+	0x6d, 0x98, 0xd2, 0x2d, 0x74, 0xee, 0x74, 0xd3, 0x6c, 0x6d, 0x44, 0xbe, 0x04, 0x53, 0x18, 0x45,
+	0xb7, 0x5f, 0x6d, 0xbf, 0x38, 0x3a, 0x5b, 0x06, 0xa6, 0x0c, 0x08, 0x3f, 0xdd, 0x3e, 0x35, 0x72,
+	0x13, 0x50, 0xe1, 0xa5, 0xc7, 0xad, 0xa2, 0x79, 0x95, 0x36, 0x8b, 0x89, 0x78, 0xdf, 0xe1, 0x2a,
+	0xf5, 0xa6, 0x6b, 0x6d, 0x35, 0x50, 0xb2, 0x88, 0xbe, 0x1a, 0x0e, 0xe5, 0x36, 0xfd, 0x2b, 0x36,
+	0xd1, 0xd3, 0x21, 0x6d, 0x15, 0x74, 0x00, 0x3b, 0xc8, 0x92, 0xd3, 0x01, 0x13, 0xae, 0x2a, 0x88,
+	0xc1, 0xf1, 0x62, 0x73, 0xfe, 0xbf, 0x1e, 0x09, 0xed, 0x56, 0xfd, 0x37, 0xf6, 0x0d, 0xf9, 0xb2,
+	0x85, 0xb6, 0xfd, 0x14, 0xa1, 0xf0, 0xb4, 0xc2, 0x06, 0x5f, 0x70, 0x1d, 0xc7, 0x7c, 0x02, 0xcd,
+	0xd6, 0x68, 0x74, 0x9e, 0xd1, 0xbf, 0xe3, 0xe6, 0x76, 0x12, 0xdd, 0xb9, 0x22, 0xd6, 0x02, 0x1d,
+	0x85, 0xe7, 0x91, 0x8b, 0xd8, 0xf0, 0x3a, 0x66, 0x2b, 0xdf, 0x7c, 0xc5, 0x69, 0x37, 0xe5, 0xba,
+	0xb2, 0x7c, 0xc9, 0x5d, 0x68, 0x17, 0xd6, 0xc5, 0xae, 0xf8, 0x6c, 0xf0, 0xbf, 0x33, 0x64, 0xed,
+	0xd9, 0xec, 0xc7, 0xde, 0xeb, 0x3f, 0x94, 0x07, 0xe7, 0xbb, 0x1f, 0xbc, 0x16, 0xbf, 0x8f, 0xed,
+	0x99, 0xef, 0xc4, 0x1c, 0xb6, 0x3f, 0xfb, 0x61, 0xf7, 0x70, 0xbf, 0x37, 0x3b, 0xda, 0x5f, 0xdf,
+	0x7f, 0x7e, 0x58, 0x7f, 0x3d, 0xa7, 0xaf, 0xf4, 0x17, 0x07, 0xc7, 0xaf, 0xfa, 0x68, 0xff, 0xba,
+	0xf9, 0xf9, 0xd7, 0xd9, 0xb7, 0x46, 0x9c, 0xff, 0xfb, 0xec, 0xea, 0xa8, 0x39, 0x8c, 0xef, 0x1d,
+	0xf7, 0x9a, 0xbf, 0xf8, 0x6f, 0xb2, 0xd1, 0xab, 0xaf, 0x3c, 0xfe, 0x39, 0x19, 0xec, 0xf0, 0xbd,
+	0xe3, 0x9d, 0xd6, 0x60, 0x67, 0xb2, 0xb1, 0xd3, 0x18, 0xfc, 0xf7, 0xec, 0x5a, 0x23, 0xed, 0xf7,
+	0xf9, 0xde, 0x71, 0xbf, 0xdf, 0x9a, 0xf4, 0xfb, 0x93, 0x8d, 0x7e, 0xbf, 0x31, 0xfa, 0xfe, 0xed,
+	0xda, 0xbb, 0x8d, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xe1, 0x23, 0x9a, 0xd9, 0x51, 0x10, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/currency_code_error.pb.go b/googleapis/ads/googleads/v3/errors/currency_code_error.pb.go
new file mode 100644
index 0000000..1b44b69
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/currency_code_error.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/currency_code_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible currency code errors.
+type CurrencyCodeErrorEnum_CurrencyCodeError int32
+
+const (
+	// Enum unspecified.
+	CurrencyCodeErrorEnum_UNSPECIFIED CurrencyCodeErrorEnum_CurrencyCodeError = 0
+	// The received error code is not known in this version.
+	CurrencyCodeErrorEnum_UNKNOWN CurrencyCodeErrorEnum_CurrencyCodeError = 1
+	// The currency code is not supported.
+	CurrencyCodeErrorEnum_UNSUPPORTED CurrencyCodeErrorEnum_CurrencyCodeError = 2
+)
+
+var CurrencyCodeErrorEnum_CurrencyCodeError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "UNSUPPORTED",
+}
+
+var CurrencyCodeErrorEnum_CurrencyCodeError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"UNSUPPORTED": 2,
+}
+
+func (x CurrencyCodeErrorEnum_CurrencyCodeError) String() string {
+	return proto.EnumName(CurrencyCodeErrorEnum_CurrencyCodeError_name, int32(x))
+}
+
+func (CurrencyCodeErrorEnum_CurrencyCodeError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d5840757d969a452, []int{0, 0}
+}
+
+// Container for enum describing possible currency code errors.
+type CurrencyCodeErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CurrencyCodeErrorEnum) Reset()         { *m = CurrencyCodeErrorEnum{} }
+func (m *CurrencyCodeErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CurrencyCodeErrorEnum) ProtoMessage()    {}
+func (*CurrencyCodeErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d5840757d969a452, []int{0}
+}
+
+func (m *CurrencyCodeErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CurrencyCodeErrorEnum.Unmarshal(m, b)
+}
+func (m *CurrencyCodeErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CurrencyCodeErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CurrencyCodeErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CurrencyCodeErrorEnum.Merge(m, src)
+}
+func (m *CurrencyCodeErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CurrencyCodeErrorEnum.Size(m)
+}
+func (m *CurrencyCodeErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CurrencyCodeErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CurrencyCodeErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CurrencyCodeErrorEnum_CurrencyCodeError", CurrencyCodeErrorEnum_CurrencyCodeError_name, CurrencyCodeErrorEnum_CurrencyCodeError_value)
+	proto.RegisterType((*CurrencyCodeErrorEnum)(nil), "google.ads.googleads.v3.errors.CurrencyCodeErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/currency_code_error.proto", fileDescriptor_d5840757d969a452)
+}
+
+var fileDescriptor_d5840757d969a452 = []byte{
+	// 296 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x18, 0xc7, 0x5d, 0x05, 0x85, 0xec, 0xe0, 0x1c, 0xe8, 0x41, 0x64, 0x87, 0x3e, 0x40, 0x72, 0xc8,
+	0x45, 0xe2, 0xa9, 0x6b, 0xeb, 0x18, 0x42, 0x57, 0xd4, 0x56, 0xd0, 0xc2, 0xa8, 0x4d, 0x08, 0x85,
+	0x2d, 0x5f, 0x49, 0xba, 0x81, 0xaf, 0xe3, 0xd1, 0x47, 0xf1, 0x51, 0xbc, 0xf9, 0x06, 0xd2, 0xa6,
+	0xed, 0x65, 0xe8, 0x29, 0x7f, 0xf2, 0xfd, 0xfe, 0xff, 0xef, 0xcf, 0x87, 0x6e, 0x24, 0x80, 0xdc,
+	0x08, 0x92, 0x73, 0x43, 0xac, 0x6c, 0xd4, 0x9e, 0x12, 0xa1, 0x35, 0x68, 0x43, 0x8a, 0x9d, 0xd6,
+	0x42, 0x15, 0xef, 0xeb, 0x02, 0xb8, 0x58, 0xb7, 0x9f, 0xb8, 0xd2, 0x50, 0xc3, 0x74, 0x66, 0x71,
+	0x9c, 0x73, 0x83, 0x07, 0x27, 0xde, 0x53, 0x6c, 0x9d, 0x57, 0xd7, 0x7d, 0x72, 0x55, 0x92, 0x5c,
+	0x29, 0xa8, 0xf3, 0xba, 0x04, 0x65, 0xac, 0xdb, 0x7d, 0x45, 0x17, 0x7e, 0x17, 0xed, 0x03, 0x17,
+	0x61, 0xe3, 0x09, 0xd5, 0x6e, 0xeb, 0xce, 0xd1, 0xf9, 0xc1, 0x60, 0x7a, 0x86, 0xc6, 0x49, 0xf4,
+	0x18, 0x87, 0xfe, 0xf2, 0x6e, 0x19, 0x06, 0x93, 0xa3, 0xe9, 0x18, 0x9d, 0x26, 0xd1, 0x7d, 0xb4,
+	0x7a, 0x8e, 0x26, 0xa3, 0x6e, 0x9a, 0xc4, 0xf1, 0xea, 0xe1, 0x29, 0x0c, 0x26, 0xce, 0xfc, 0x67,
+	0x84, 0xdc, 0x02, 0xb6, 0xf8, 0xff, 0x86, 0xf3, 0xcb, 0x83, 0x45, 0x71, 0xd3, 0x2d, 0x1e, 0xbd,
+	0x04, 0x9d, 0x53, 0xc2, 0x26, 0x57, 0x12, 0x83, 0x96, 0x44, 0x0a, 0xd5, 0x36, 0xef, 0xaf, 0x54,
+	0x95, 0xe6, 0xaf, 0xa3, 0xdd, 0xda, 0xe7, 0xc3, 0x39, 0x5e, 0x78, 0xde, 0xa7, 0x33, 0x5b, 0xd8,
+	0x30, 0x8f, 0x1b, 0x6c, 0x65, 0xa3, 0x52, 0x8a, 0xdb, 0x95, 0xe6, 0xab, 0x07, 0x32, 0x8f, 0x9b,
+	0x6c, 0x00, 0xb2, 0x94, 0x66, 0x16, 0xf8, 0x76, 0x5c, 0xfb, 0xcb, 0x98, 0xc7, 0x0d, 0x63, 0x03,
+	0xc2, 0x58, 0x4a, 0x19, 0xb3, 0xd0, 0xdb, 0x49, 0xdb, 0x8e, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff,
+	0x18, 0x0c, 0xdb, 0x02, 0xd1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/custom_interest_error.pb.go b/googleapis/ads/googleads/v3/errors/custom_interest_error.pb.go
new file mode 100644
index 0000000..0fbd33c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/custom_interest_error.pb.go
@@ -0,0 +1,153 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/custom_interest_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible custom interest errors.
+type CustomInterestErrorEnum_CustomInterestError int32
+
+const (
+	// Enum unspecified.
+	CustomInterestErrorEnum_UNSPECIFIED CustomInterestErrorEnum_CustomInterestError = 0
+	// The received error code is not known in this version.
+	CustomInterestErrorEnum_UNKNOWN CustomInterestErrorEnum_CustomInterestError = 1
+	// Duplicate custom interest name ignoring case.
+	CustomInterestErrorEnum_NAME_ALREADY_USED CustomInterestErrorEnum_CustomInterestError = 2
+	// In the remove custom interest member operation, both member ID and
+	// pair [type, parameter] are not present.
+	CustomInterestErrorEnum_CUSTOM_INTEREST_MEMBER_ID_AND_TYPE_PARAMETER_NOT_PRESENT_IN_REMOVE CustomInterestErrorEnum_CustomInterestError = 3
+	// The pair of [type, parameter] does not exist.
+	CustomInterestErrorEnum_TYPE_AND_PARAMETER_NOT_FOUND CustomInterestErrorEnum_CustomInterestError = 4
+	// The pair of [type, parameter] already exists.
+	CustomInterestErrorEnum_TYPE_AND_PARAMETER_ALREADY_EXISTED CustomInterestErrorEnum_CustomInterestError = 5
+	// Unsupported custom interest member type.
+	CustomInterestErrorEnum_INVALID_CUSTOM_INTEREST_MEMBER_TYPE CustomInterestErrorEnum_CustomInterestError = 6
+	// Cannot remove a custom interest while it's still being targeted.
+	CustomInterestErrorEnum_CANNOT_REMOVE_WHILE_IN_USE CustomInterestErrorEnum_CustomInterestError = 7
+	// Cannot mutate custom interest type.
+	CustomInterestErrorEnum_CANNOT_CHANGE_TYPE CustomInterestErrorEnum_CustomInterestError = 8
+)
+
+var CustomInterestErrorEnum_CustomInterestError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "NAME_ALREADY_USED",
+	3: "CUSTOM_INTEREST_MEMBER_ID_AND_TYPE_PARAMETER_NOT_PRESENT_IN_REMOVE",
+	4: "TYPE_AND_PARAMETER_NOT_FOUND",
+	5: "TYPE_AND_PARAMETER_ALREADY_EXISTED",
+	6: "INVALID_CUSTOM_INTEREST_MEMBER_TYPE",
+	7: "CANNOT_REMOVE_WHILE_IN_USE",
+	8: "CANNOT_CHANGE_TYPE",
+}
+
+var CustomInterestErrorEnum_CustomInterestError_value = map[string]int32{
+	"UNSPECIFIED":       0,
+	"UNKNOWN":           1,
+	"NAME_ALREADY_USED": 2,
+	"CUSTOM_INTEREST_MEMBER_ID_AND_TYPE_PARAMETER_NOT_PRESENT_IN_REMOVE": 3,
+	"TYPE_AND_PARAMETER_NOT_FOUND":                                       4,
+	"TYPE_AND_PARAMETER_ALREADY_EXISTED":                                 5,
+	"INVALID_CUSTOM_INTEREST_MEMBER_TYPE":                                6,
+	"CANNOT_REMOVE_WHILE_IN_USE":                                         7,
+	"CANNOT_CHANGE_TYPE":                                                 8,
+}
+
+func (x CustomInterestErrorEnum_CustomInterestError) String() string {
+	return proto.EnumName(CustomInterestErrorEnum_CustomInterestError_name, int32(x))
+}
+
+func (CustomInterestErrorEnum_CustomInterestError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a0cf933f9a939ad1, []int{0, 0}
+}
+
+// Container for enum describing possible custom interest errors.
+type CustomInterestErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomInterestErrorEnum) Reset()         { *m = CustomInterestErrorEnum{} }
+func (m *CustomInterestErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomInterestErrorEnum) ProtoMessage()    {}
+func (*CustomInterestErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a0cf933f9a939ad1, []int{0}
+}
+
+func (m *CustomInterestErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomInterestErrorEnum.Unmarshal(m, b)
+}
+func (m *CustomInterestErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomInterestErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomInterestErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomInterestErrorEnum.Merge(m, src)
+}
+func (m *CustomInterestErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomInterestErrorEnum.Size(m)
+}
+func (m *CustomInterestErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomInterestErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomInterestErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CustomInterestErrorEnum_CustomInterestError", CustomInterestErrorEnum_CustomInterestError_name, CustomInterestErrorEnum_CustomInterestError_value)
+	proto.RegisterType((*CustomInterestErrorEnum)(nil), "google.ads.googleads.v3.errors.CustomInterestErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/custom_interest_error.proto", fileDescriptor_a0cf933f9a939ad1)
+}
+
+var fileDescriptor_a0cf933f9a939ad1 = []byte{
+	// 447 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x4f, 0x6e, 0xd4, 0x30,
+	0x18, 0xc5, 0x69, 0x0a, 0x2d, 0x72, 0x17, 0x04, 0x23, 0xfe, 0xa8, 0xaa, 0x46, 0x28, 0x48, 0xb0,
+	0x4b, 0x16, 0xd9, 0x99, 0x95, 0x27, 0xfe, 0x66, 0x6a, 0x31, 0x71, 0xa2, 0xfc, 0x2b, 0x45, 0x23,
+	0x59, 0xa1, 0x89, 0xa2, 0x91, 0x3a, 0xf1, 0x28, 0x4e, 0x7b, 0x20, 0x96, 0xdc, 0x81, 0x0b, 0x70,
+	0x03, 0xae, 0xc0, 0x96, 0x0b, 0xa0, 0xc4, 0x33, 0x23, 0x21, 0x4d, 0x59, 0xe5, 0xc9, 0x7e, 0xbf,
+	0xe7, 0xa7, 0x7c, 0x1f, 0x22, 0x8d, 0x52, 0xcd, 0x6d, 0xed, 0x95, 0x95, 0xf6, 0x8c, 0x1c, 0xd4,
+	0xbd, 0xef, 0xd5, 0x5d, 0xa7, 0x3a, 0xed, 0xdd, 0xdc, 0xe9, 0x5e, 0xad, 0xe5, 0xaa, 0xed, 0xeb,
+	0xae, 0xd6, 0xbd, 0x1c, 0x8f, 0xdd, 0x4d, 0xa7, 0x7a, 0x85, 0x27, 0x06, 0x70, 0xcb, 0x4a, 0xbb,
+	0x7b, 0xd6, 0xbd, 0xf7, 0x5d, 0xc3, 0x9e, 0x5f, 0xec, 0xb2, 0x37, 0x2b, 0xaf, 0x6c, 0x5b, 0xd5,
+	0x97, 0xfd, 0x4a, 0xb5, 0xda, 0xd0, 0xce, 0x2f, 0x0b, 0xbd, 0x0e, 0xc6, 0x74, 0xbe, 0x0d, 0x87,
+	0x01, 0x83, 0xf6, 0x6e, 0xed, 0xfc, 0xb0, 0xd0, 0x8b, 0x03, 0x77, 0xf8, 0x19, 0x3a, 0xcb, 0x45,
+	0x1a, 0x43, 0xc0, 0x67, 0x1c, 0x98, 0xfd, 0x08, 0x9f, 0xa1, 0xd3, 0x5c, 0x7c, 0x12, 0xd1, 0x95,
+	0xb0, 0x8f, 0xf0, 0x4b, 0xf4, 0x5c, 0xd0, 0x10, 0x24, 0x5d, 0x24, 0x40, 0xd9, 0xb5, 0xcc, 0x53,
+	0x60, 0xb6, 0x85, 0x67, 0x68, 0x1a, 0xe4, 0x69, 0x16, 0x85, 0x92, 0x8b, 0x0c, 0x12, 0x48, 0x33,
+	0x19, 0x42, 0x38, 0x85, 0x44, 0x72, 0x26, 0xa9, 0x60, 0x32, 0xbb, 0x8e, 0x41, 0xc6, 0x34, 0xa1,
+	0x21, 0x64, 0x90, 0x48, 0x11, 0x65, 0x32, 0x4e, 0x20, 0x05, 0x91, 0x49, 0x2e, 0x64, 0x02, 0x61,
+	0x54, 0x80, 0x7d, 0x8c, 0xdf, 0xa2, 0x8b, 0xd1, 0x39, 0x20, 0xff, 0xba, 0x67, 0x51, 0x2e, 0x98,
+	0xfd, 0x18, 0xbf, 0x47, 0xce, 0x01, 0xc7, 0xae, 0x0e, 0x7c, 0xe6, 0x69, 0x06, 0xcc, 0x7e, 0x82,
+	0x3f, 0xa0, 0x77, 0x5c, 0x14, 0x74, 0xc1, 0x99, 0x7c, 0xa0, 0xd9, 0x10, 0x63, 0x9f, 0xe0, 0x09,
+	0x3a, 0x0f, 0xa8, 0x18, 0x9e, 0x30, 0x2d, 0xe4, 0xd5, 0x25, 0x5f, 0xc0, 0xd0, 0x2a, 0x4f, 0xc1,
+	0x3e, 0xc5, 0xaf, 0x10, 0xde, 0xde, 0x07, 0x97, 0x54, 0xcc, 0xc1, 0x70, 0x4f, 0xa7, 0x7f, 0x8e,
+	0x90, 0x73, 0xa3, 0xd6, 0xee, 0xff, 0x07, 0x34, 0x7d, 0x73, 0xe0, 0x1f, 0xc7, 0xc3, 0x70, 0xe2,
+	0xa3, 0x2f, 0x6c, 0xcb, 0x36, 0xea, 0xb6, 0x6c, 0x1b, 0x57, 0x75, 0x8d, 0xd7, 0xd4, 0xed, 0x38,
+	0xba, 0xdd, 0xa2, 0x6c, 0x56, 0xfa, 0xa1, 0xbd, 0xf9, 0x68, 0x3e, 0xdf, 0xac, 0xe3, 0x39, 0xa5,
+	0xdf, 0xad, 0xc9, 0xdc, 0x84, 0xd1, 0x4a, 0xbb, 0x46, 0x0e, 0xaa, 0xf0, 0xdd, 0xf1, 0x49, 0xfd,
+	0x73, 0x67, 0x58, 0xd2, 0x4a, 0x2f, 0xf7, 0x86, 0x65, 0xe1, 0x2f, 0x8d, 0xe1, 0xb7, 0xe5, 0x98,
+	0x53, 0x42, 0x68, 0xa5, 0x09, 0xd9, 0x5b, 0x08, 0x29, 0x7c, 0x42, 0x8c, 0xe9, 0xeb, 0xc9, 0xd8,
+	0xce, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x53, 0x0c, 0x86, 0xf2, 0xd4, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/customer_client_link_error.pb.go b/googleapis/ads/googleads/v3/errors/customer_client_link_error.pb.go
new file mode 100644
index 0000000..8500092
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/customer_client_link_error.pb.go
@@ -0,0 +1,153 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/customer_client_link_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible CustomerClientLink errors.
+type CustomerClientLinkErrorEnum_CustomerClientLinkError int32
+
+const (
+	// Enum unspecified.
+	CustomerClientLinkErrorEnum_UNSPECIFIED CustomerClientLinkErrorEnum_CustomerClientLinkError = 0
+	// The received error code is not known in this version.
+	CustomerClientLinkErrorEnum_UNKNOWN CustomerClientLinkErrorEnum_CustomerClientLinkError = 1
+	// Trying to manage a client that already in being managed by customer.
+	CustomerClientLinkErrorEnum_CLIENT_ALREADY_INVITED_BY_THIS_MANAGER CustomerClientLinkErrorEnum_CustomerClientLinkError = 2
+	// Already managed by some other manager in the hierarchy.
+	CustomerClientLinkErrorEnum_CLIENT_ALREADY_MANAGED_IN_HIERARCHY CustomerClientLinkErrorEnum_CustomerClientLinkError = 3
+	// Attempt to create a cycle in the hierarchy.
+	CustomerClientLinkErrorEnum_CYCLIC_LINK_NOT_ALLOWED CustomerClientLinkErrorEnum_CustomerClientLinkError = 4
+	// Managed accounts has the maximum number of linked accounts.
+	CustomerClientLinkErrorEnum_CUSTOMER_HAS_TOO_MANY_ACCOUNTS CustomerClientLinkErrorEnum_CustomerClientLinkError = 5
+	// Invitor has the maximum pending invitations.
+	CustomerClientLinkErrorEnum_CLIENT_HAS_TOO_MANY_INVITATIONS CustomerClientLinkErrorEnum_CustomerClientLinkError = 6
+	// Attempt to change hidden status of a link that is not active.
+	CustomerClientLinkErrorEnum_CANNOT_HIDE_OR_UNHIDE_MANAGER_ACCOUNTS CustomerClientLinkErrorEnum_CustomerClientLinkError = 7
+	// Parent manager account has the maximum number of linked accounts.
+	CustomerClientLinkErrorEnum_CUSTOMER_HAS_TOO_MANY_ACCOUNTS_AT_MANAGER CustomerClientLinkErrorEnum_CustomerClientLinkError = 8
+)
+
+var CustomerClientLinkErrorEnum_CustomerClientLinkError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CLIENT_ALREADY_INVITED_BY_THIS_MANAGER",
+	3: "CLIENT_ALREADY_MANAGED_IN_HIERARCHY",
+	4: "CYCLIC_LINK_NOT_ALLOWED",
+	5: "CUSTOMER_HAS_TOO_MANY_ACCOUNTS",
+	6: "CLIENT_HAS_TOO_MANY_INVITATIONS",
+	7: "CANNOT_HIDE_OR_UNHIDE_MANAGER_ACCOUNTS",
+	8: "CUSTOMER_HAS_TOO_MANY_ACCOUNTS_AT_MANAGER",
+}
+
+var CustomerClientLinkErrorEnum_CustomerClientLinkError_value = map[string]int32{
+	"UNSPECIFIED":                               0,
+	"UNKNOWN":                                   1,
+	"CLIENT_ALREADY_INVITED_BY_THIS_MANAGER":    2,
+	"CLIENT_ALREADY_MANAGED_IN_HIERARCHY":       3,
+	"CYCLIC_LINK_NOT_ALLOWED":                   4,
+	"CUSTOMER_HAS_TOO_MANY_ACCOUNTS":            5,
+	"CLIENT_HAS_TOO_MANY_INVITATIONS":           6,
+	"CANNOT_HIDE_OR_UNHIDE_MANAGER_ACCOUNTS":    7,
+	"CUSTOMER_HAS_TOO_MANY_ACCOUNTS_AT_MANAGER": 8,
+}
+
+func (x CustomerClientLinkErrorEnum_CustomerClientLinkError) String() string {
+	return proto.EnumName(CustomerClientLinkErrorEnum_CustomerClientLinkError_name, int32(x))
+}
+
+func (CustomerClientLinkErrorEnum_CustomerClientLinkError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3d9c8f09dbc13801, []int{0, 0}
+}
+
+// Container for enum describing possible CustomeClientLink errors.
+type CustomerClientLinkErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomerClientLinkErrorEnum) Reset()         { *m = CustomerClientLinkErrorEnum{} }
+func (m *CustomerClientLinkErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomerClientLinkErrorEnum) ProtoMessage()    {}
+func (*CustomerClientLinkErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3d9c8f09dbc13801, []int{0}
+}
+
+func (m *CustomerClientLinkErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerClientLinkErrorEnum.Unmarshal(m, b)
+}
+func (m *CustomerClientLinkErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerClientLinkErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomerClientLinkErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerClientLinkErrorEnum.Merge(m, src)
+}
+func (m *CustomerClientLinkErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomerClientLinkErrorEnum.Size(m)
+}
+func (m *CustomerClientLinkErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerClientLinkErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerClientLinkErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CustomerClientLinkErrorEnum_CustomerClientLinkError", CustomerClientLinkErrorEnum_CustomerClientLinkError_name, CustomerClientLinkErrorEnum_CustomerClientLinkError_value)
+	proto.RegisterType((*CustomerClientLinkErrorEnum)(nil), "google.ads.googleads.v3.errors.CustomerClientLinkErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/customer_client_link_error.proto", fileDescriptor_3d9c8f09dbc13801)
+}
+
+var fileDescriptor_3d9c8f09dbc13801 = []byte{
+	// 452 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0x4f, 0x8b, 0xd3, 0x40,
+	0x14, 0xb7, 0x59, 0xdd, 0x95, 0xd9, 0x83, 0x21, 0x97, 0x05, 0x77, 0xa9, 0x90, 0x05, 0x45, 0xc1,
+	0xe4, 0x90, 0x5b, 0x3c, 0xc8, 0x74, 0x32, 0x36, 0xc3, 0x66, 0x27, 0x25, 0x7f, 0xba, 0x44, 0x0a,
+	0x8f, 0xd8, 0x84, 0x10, 0xb6, 0xcd, 0x94, 0x4c, 0x76, 0x3f, 0x90, 0x47, 0x3f, 0x8a, 0xe0, 0x17,
+	0x11, 0x3c, 0x7b, 0x95, 0x64, 0xda, 0x8a, 0x42, 0x7b, 0xca, 0x8f, 0xbc, 0xdf, 0xbf, 0xe4, 0x3d,
+	0xf4, 0xb1, 0x12, 0xa2, 0x5a, 0x95, 0x76, 0x5e, 0x48, 0x5b, 0xc1, 0x1e, 0x3d, 0x3a, 0x76, 0xd9,
+	0xb6, 0xa2, 0x95, 0xf6, 0xf2, 0x41, 0x76, 0x62, 0x5d, 0xb6, 0xb0, 0x5c, 0xd5, 0x65, 0xd3, 0xc1,
+	0xaa, 0x6e, 0xee, 0x61, 0x98, 0x59, 0x9b, 0x56, 0x74, 0xc2, 0x18, 0x2b, 0x95, 0x95, 0x17, 0xd2,
+	0xda, 0x1b, 0x58, 0x8f, 0x8e, 0xa5, 0x0c, 0x5e, 0x5e, 0xed, 0x02, 0x36, 0xb5, 0x9d, 0x37, 0x8d,
+	0xe8, 0xf2, 0xae, 0x16, 0x8d, 0x54, 0x6a, 0xf3, 0x97, 0x86, 0x2e, 0xc9, 0x36, 0x82, 0x0c, 0x09,
+	0x41, 0xdd, 0xdc, 0xd3, 0x5e, 0x4a, 0x9b, 0x87, 0xb5, 0xf9, 0x43, 0x43, 0x17, 0x07, 0xe6, 0xc6,
+	0x0b, 0x74, 0x9e, 0xf2, 0x78, 0x46, 0x09, 0xfb, 0xc4, 0xa8, 0xa7, 0x3f, 0x31, 0xce, 0xd1, 0x59,
+	0xca, 0x6f, 0x78, 0x78, 0xc7, 0xf5, 0x91, 0xf1, 0x0e, 0xbd, 0x26, 0x01, 0xa3, 0x3c, 0x01, 0x1c,
+	0x44, 0x14, 0x7b, 0x19, 0x30, 0x3e, 0x67, 0x09, 0xf5, 0x60, 0x92, 0x41, 0xe2, 0xb3, 0x18, 0x6e,
+	0x31, 0xc7, 0x53, 0x1a, 0xe9, 0x9a, 0xf1, 0x06, 0x5d, 0xff, 0xc7, 0x55, 0x33, 0x0f, 0x18, 0x07,
+	0x9f, 0xd1, 0x08, 0x47, 0xc4, 0xcf, 0xf4, 0x13, 0xe3, 0x12, 0x5d, 0x90, 0x8c, 0x04, 0x8c, 0x40,
+	0xc0, 0xf8, 0x0d, 0xf0, 0xb0, 0x57, 0x04, 0xe1, 0x1d, 0xf5, 0xf4, 0xa7, 0x86, 0x89, 0xc6, 0x24,
+	0x8d, 0x93, 0xf0, 0x96, 0x46, 0xe0, 0xe3, 0x18, 0x92, 0x30, 0xec, 0x7d, 0x32, 0xc0, 0x84, 0x84,
+	0x29, 0x4f, 0x62, 0xfd, 0x99, 0x71, 0x8d, 0x5e, 0x6d, 0x93, 0xfe, 0x61, 0x0c, 0xd5, 0x70, 0xc2,
+	0x42, 0x1e, 0xeb, 0xa7, 0x43, 0x75, 0xcc, 0x7b, 0x73, 0x9f, 0x79, 0x14, 0xc2, 0x08, 0x52, 0x3e,
+	0xa0, 0x6d, 0xe3, 0xbf, 0x86, 0x67, 0xc6, 0x7b, 0xf4, 0xf6, 0x78, 0x28, 0xe0, 0x64, 0xff, 0xa5,
+	0xcf, 0x27, 0xbf, 0x47, 0xc8, 0x5c, 0x8a, 0xb5, 0x75, 0x7c, 0x69, 0x93, 0xab, 0x03, 0xff, 0x7c,
+	0xd6, 0x2f, 0x6d, 0x36, 0xfa, 0xec, 0x6d, 0xf5, 0x95, 0x58, 0xe5, 0x4d, 0x65, 0x89, 0xb6, 0xb2,
+	0xab, 0xb2, 0x19, 0x56, 0xba, 0xbb, 0xa2, 0x4d, 0x2d, 0x0f, 0x1d, 0xd5, 0x07, 0xf5, 0xf8, 0xaa,
+	0x9d, 0x4c, 0x31, 0xfe, 0xa6, 0x8d, 0xa7, 0xca, 0x0c, 0x17, 0xd2, 0x52, 0xb0, 0x47, 0x73, 0xc7,
+	0x1a, 0x22, 0xe5, 0xf7, 0x1d, 0x61, 0x81, 0x0b, 0xb9, 0xd8, 0x13, 0x16, 0x73, 0x67, 0xa1, 0x08,
+	0x3f, 0x35, 0x53, 0xbd, 0x75, 0x5d, 0x5c, 0x48, 0xd7, 0xdd, 0x53, 0x5c, 0x77, 0xee, 0xb8, 0xae,
+	0x22, 0x7d, 0x39, 0x1d, 0xda, 0x39, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb6, 0xb0, 0x49, 0xd9,
+	0xf1, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/customer_error.pb.go b/googleapis/ads/googleads/v3/errors/customer_error.pb.go
new file mode 100644
index 0000000..72d0ab9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/customer_error.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/customer_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Set of errors that are related to requests dealing with Customer.
+// Next id: 26
+type CustomerErrorEnum_CustomerError int32
+
+const (
+	// Enum unspecified.
+	CustomerErrorEnum_UNSPECIFIED CustomerErrorEnum_CustomerError = 0
+	// The received error code is not known in this version.
+	CustomerErrorEnum_UNKNOWN CustomerErrorEnum_CustomerError = 1
+	// Customer status is not allowed to be changed from DRAFT and CLOSED.
+	// Currency code and at least one of country code and time zone needs to be
+	// set when status is changed to ENABLED.
+	CustomerErrorEnum_STATUS_CHANGE_DISALLOWED CustomerErrorEnum_CustomerError = 2
+	// CustomerService cannot get a customer that has not been fully set up.
+	CustomerErrorEnum_ACCOUNT_NOT_SET_UP CustomerErrorEnum_CustomerError = 3
+)
+
+var CustomerErrorEnum_CustomerError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "STATUS_CHANGE_DISALLOWED",
+	3: "ACCOUNT_NOT_SET_UP",
+}
+
+var CustomerErrorEnum_CustomerError_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"STATUS_CHANGE_DISALLOWED": 2,
+	"ACCOUNT_NOT_SET_UP":       3,
+}
+
+func (x CustomerErrorEnum_CustomerError) String() string {
+	return proto.EnumName(CustomerErrorEnum_CustomerError_name, int32(x))
+}
+
+func (CustomerErrorEnum_CustomerError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_355f6e19d610cfcf, []int{0, 0}
+}
+
+// Container for enum describing possible customer errors.
+type CustomerErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomerErrorEnum) Reset()         { *m = CustomerErrorEnum{} }
+func (m *CustomerErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomerErrorEnum) ProtoMessage()    {}
+func (*CustomerErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_355f6e19d610cfcf, []int{0}
+}
+
+func (m *CustomerErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerErrorEnum.Unmarshal(m, b)
+}
+func (m *CustomerErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomerErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerErrorEnum.Merge(m, src)
+}
+func (m *CustomerErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomerErrorEnum.Size(m)
+}
+func (m *CustomerErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CustomerErrorEnum_CustomerError", CustomerErrorEnum_CustomerError_name, CustomerErrorEnum_CustomerError_value)
+	proto.RegisterType((*CustomerErrorEnum)(nil), "google.ads.googleads.v3.errors.CustomerErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/customer_error.proto", fileDescriptor_355f6e19d610cfcf)
+}
+
+var fileDescriptor_355f6e19d610cfcf = []byte{
+	// 321 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0x5d, 0x07, 0x0a, 0x19, 0x62, 0xcd, 0x41, 0x44, 0xc6, 0x0e, 0x7d, 0x80, 0xf4, 0x90,
+	0x5b, 0x3c, 0x65, 0x6d, 0x9c, 0xc3, 0x91, 0x16, 0xda, 0x6e, 0x20, 0x85, 0x52, 0xd7, 0x12, 0x06,
+	0x5b, 0x32, 0x92, 0x6e, 0xf8, 0x3c, 0x1e, 0x7d, 0x14, 0x1f, 0x45, 0xf0, 0x1d, 0xa4, 0xcd, 0x36,
+	0xd8, 0x41, 0x4f, 0xf9, 0xf2, 0xe7, 0xf7, 0x7d, 0xf9, 0xf2, 0x07, 0x58, 0x28, 0x25, 0xd6, 0xb5,
+	0x5f, 0x56, 0xc6, 0xb7, 0xb2, 0x55, 0x7b, 0xec, 0xd7, 0x5a, 0x2b, 0x6d, 0xfc, 0xe5, 0xce, 0x34,
+	0x6a, 0x53, 0xeb, 0xa2, 0xbb, 0xa3, 0xad, 0x56, 0x8d, 0x82, 0x23, 0x4b, 0xa2, 0xb2, 0x32, 0xe8,
+	0x64, 0x42, 0x7b, 0x8c, 0xac, 0xe9, 0x61, 0x78, 0x0c, 0xdd, 0xae, 0xfc, 0x52, 0x4a, 0xd5, 0x94,
+	0xcd, 0x4a, 0x49, 0x63, 0xdd, 0xde, 0x3b, 0xb8, 0x0d, 0x0e, 0xa9, 0xac, 0xe5, 0x99, 0xdc, 0x6d,
+	0xbc, 0x25, 0xb8, 0x3e, 0x1b, 0xc2, 0x1b, 0x30, 0xc8, 0x78, 0x12, 0xb3, 0x60, 0xfa, 0x34, 0x65,
+	0xa1, 0x7b, 0x01, 0x07, 0xe0, 0x2a, 0xe3, 0x2f, 0x3c, 0x5a, 0x70, 0xb7, 0x07, 0x87, 0xe0, 0x3e,
+	0x49, 0x69, 0x9a, 0x25, 0x45, 0xf0, 0x4c, 0xf9, 0x84, 0x15, 0xe1, 0x34, 0xa1, 0xb3, 0x59, 0xb4,
+	0x60, 0xa1, 0xeb, 0xc0, 0x3b, 0x00, 0x69, 0x10, 0x44, 0x19, 0x4f, 0x0b, 0x1e, 0xa5, 0x45, 0xc2,
+	0xd2, 0x22, 0x8b, 0xdd, 0xfe, 0xf8, 0xa7, 0x07, 0xbc, 0xa5, 0xda, 0xa0, 0xff, 0xeb, 0x8f, 0xe1,
+	0x59, 0x93, 0xb8, 0x2d, 0x1d, 0xf7, 0x5e, 0xc3, 0x83, 0x4b, 0xa8, 0x75, 0x29, 0x05, 0x52, 0x5a,
+	0xf8, 0xa2, 0x96, 0xdd, 0x97, 0x8e, 0x9b, 0xdb, 0xae, 0xcc, 0x5f, 0x8b, 0x7c, 0xb4, 0xc7, 0x87,
+	0xd3, 0x9f, 0x50, 0xfa, 0xe9, 0x8c, 0x26, 0x36, 0x8c, 0x56, 0x06, 0x59, 0xd9, 0xaa, 0x39, 0x46,
+	0xdd, 0x93, 0xe6, 0xeb, 0x08, 0xe4, 0xb4, 0x32, 0xf9, 0x09, 0xc8, 0xe7, 0x38, 0xb7, 0xc0, 0xb7,
+	0xe3, 0xd9, 0x29, 0x21, 0xb4, 0x32, 0x84, 0x9c, 0x10, 0x42, 0xe6, 0x98, 0x10, 0x0b, 0xbd, 0x5d,
+	0x76, 0xed, 0xf0, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x29, 0xca, 0x0f, 0x94, 0xe5, 0x01, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/customer_feed_error.pb.go b/googleapis/ads/googleads/v3/errors/customer_feed_error.pb.go
new file mode 100644
index 0000000..1f5857f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/customer_feed_error.pb.go
@@ -0,0 +1,153 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/customer_feed_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible customer feed errors.
+type CustomerFeedErrorEnum_CustomerFeedError int32
+
+const (
+	// Enum unspecified.
+	CustomerFeedErrorEnum_UNSPECIFIED CustomerFeedErrorEnum_CustomerFeedError = 0
+	// The received error code is not known in this version.
+	CustomerFeedErrorEnum_UNKNOWN CustomerFeedErrorEnum_CustomerFeedError = 1
+	// An active feed already exists for this customer and place holder type.
+	CustomerFeedErrorEnum_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE CustomerFeedErrorEnum_CustomerFeedError = 2
+	// The specified feed is removed.
+	CustomerFeedErrorEnum_CANNOT_CREATE_FOR_REMOVED_FEED CustomerFeedErrorEnum_CustomerFeedError = 3
+	// The CustomerFeed already exists. Update should be used to modify the
+	// existing CustomerFeed.
+	CustomerFeedErrorEnum_CANNOT_CREATE_ALREADY_EXISTING_CUSTOMER_FEED CustomerFeedErrorEnum_CustomerFeedError = 4
+	// Cannot update removed customer feed.
+	CustomerFeedErrorEnum_CANNOT_MODIFY_REMOVED_CUSTOMER_FEED CustomerFeedErrorEnum_CustomerFeedError = 5
+	// Invalid placeholder type.
+	CustomerFeedErrorEnum_INVALID_PLACEHOLDER_TYPE CustomerFeedErrorEnum_CustomerFeedError = 6
+	// Feed mapping for this placeholder type does not exist.
+	CustomerFeedErrorEnum_MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE CustomerFeedErrorEnum_CustomerFeedError = 7
+	// Placeholder not allowed at the account level.
+	CustomerFeedErrorEnum_PLACEHOLDER_TYPE_NOT_ALLOWED_ON_CUSTOMER_FEED CustomerFeedErrorEnum_CustomerFeedError = 8
+)
+
+var CustomerFeedErrorEnum_CustomerFeedError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE",
+	3: "CANNOT_CREATE_FOR_REMOVED_FEED",
+	4: "CANNOT_CREATE_ALREADY_EXISTING_CUSTOMER_FEED",
+	5: "CANNOT_MODIFY_REMOVED_CUSTOMER_FEED",
+	6: "INVALID_PLACEHOLDER_TYPE",
+	7: "MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE",
+	8: "PLACEHOLDER_TYPE_NOT_ALLOWED_ON_CUSTOMER_FEED",
+}
+
+var CustomerFeedErrorEnum_CustomerFeedError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE":      2,
+	"CANNOT_CREATE_FOR_REMOVED_FEED":                3,
+	"CANNOT_CREATE_ALREADY_EXISTING_CUSTOMER_FEED":  4,
+	"CANNOT_MODIFY_REMOVED_CUSTOMER_FEED":           5,
+	"INVALID_PLACEHOLDER_TYPE":                      6,
+	"MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE":      7,
+	"PLACEHOLDER_TYPE_NOT_ALLOWED_ON_CUSTOMER_FEED": 8,
+}
+
+func (x CustomerFeedErrorEnum_CustomerFeedError) String() string {
+	return proto.EnumName(CustomerFeedErrorEnum_CustomerFeedError_name, int32(x))
+}
+
+func (CustomerFeedErrorEnum_CustomerFeedError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_4c4e12efa73e50ad, []int{0, 0}
+}
+
+// Container for enum describing possible customer feed errors.
+type CustomerFeedErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomerFeedErrorEnum) Reset()         { *m = CustomerFeedErrorEnum{} }
+func (m *CustomerFeedErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomerFeedErrorEnum) ProtoMessage()    {}
+func (*CustomerFeedErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4c4e12efa73e50ad, []int{0}
+}
+
+func (m *CustomerFeedErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerFeedErrorEnum.Unmarshal(m, b)
+}
+func (m *CustomerFeedErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerFeedErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomerFeedErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerFeedErrorEnum.Merge(m, src)
+}
+func (m *CustomerFeedErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomerFeedErrorEnum.Size(m)
+}
+func (m *CustomerFeedErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerFeedErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerFeedErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CustomerFeedErrorEnum_CustomerFeedError", CustomerFeedErrorEnum_CustomerFeedError_name, CustomerFeedErrorEnum_CustomerFeedError_value)
+	proto.RegisterType((*CustomerFeedErrorEnum)(nil), "google.ads.googleads.v3.errors.CustomerFeedErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/customer_feed_error.proto", fileDescriptor_4c4e12efa73e50ad)
+}
+
+var fileDescriptor_4c4e12efa73e50ad = []byte{
+	// 443 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x41, 0x6f, 0xd3, 0x30,
+	0x14, 0xc7, 0x69, 0x06, 0x1b, 0xf2, 0x0e, 0x14, 0x4b, 0x20, 0x84, 0xa6, 0x1e, 0xc2, 0x01, 0x0e,
+	0xc3, 0x01, 0xe5, 0x82, 0xc2, 0xc9, 0x8b, 0x9d, 0x12, 0x91, 0xd8, 0x51, 0x92, 0x66, 0x14, 0x55,
+	0xb2, 0xc2, 0x12, 0xa2, 0x4a, 0x6b, 0x5c, 0xc5, 0xdd, 0x3e, 0x10, 0x47, 0x3e, 0x0a, 0xdf, 0x81,
+	0x2f, 0xc0, 0x8d, 0x13, 0x57, 0xe4, 0xb8, 0xad, 0xd4, 0x16, 0x76, 0xca, 0x5f, 0x2f, 0xbf, 0xff,
+	0xff, 0x3d, 0xeb, 0x3d, 0xf0, 0xae, 0x91, 0xb2, 0xb9, 0xae, 0x9d, 0xb2, 0x52, 0x8e, 0x91, 0x5a,
+	0xdd, 0xba, 0x4e, 0xdd, 0x75, 0xb2, 0x53, 0xce, 0xd5, 0x8d, 0x5a, 0xc9, 0x45, 0xdd, 0x89, 0xaf,
+	0x75, 0x5d, 0x89, 0xbe, 0x88, 0x96, 0x9d, 0x5c, 0x49, 0x38, 0x32, 0x38, 0x2a, 0x2b, 0x85, 0xb6,
+	0x4e, 0x74, 0xeb, 0x22, 0xe3, 0x7c, 0x7e, 0xb6, 0x49, 0x5e, 0xce, 0x9d, 0xb2, 0x6d, 0xe5, 0xaa,
+	0x5c, 0xcd, 0x65, 0xab, 0x8c, 0xdb, 0xfe, 0x63, 0x81, 0x27, 0xfe, 0x3a, 0x3b, 0xa8, 0xeb, 0x8a,
+	0x6a, 0x13, 0x6d, 0x6f, 0x16, 0xf6, 0x4f, 0x0b, 0x3c, 0x3e, 0xf8, 0x03, 0x1f, 0x81, 0xd3, 0x09,
+	0xcb, 0x12, 0xea, 0x87, 0x41, 0x48, 0xc9, 0xf0, 0x1e, 0x3c, 0x05, 0x27, 0x13, 0xf6, 0x91, 0xf1,
+	0x4b, 0x36, 0x1c, 0xc0, 0x73, 0xf0, 0x2a, 0xa0, 0x94, 0x08, 0x1c, 0xa5, 0x14, 0x93, 0xa9, 0xa0,
+	0x9f, 0xc2, 0x2c, 0xcf, 0x44, 0xc0, 0x53, 0x91, 0x44, 0xd8, 0xa7, 0x1f, 0x78, 0x44, 0x68, 0x2a,
+	0xf2, 0x69, 0x42, 0x87, 0x16, 0xb4, 0xc1, 0xc8, 0xc7, 0x8c, 0xf1, 0x5c, 0xf8, 0x29, 0xc5, 0x39,
+	0xed, 0xb9, 0x94, 0xc6, 0xbc, 0xa0, 0x44, 0xe8, 0x9c, 0xe1, 0x11, 0x7c, 0x03, 0xce, 0x77, 0x99,
+	0x9d, 0xe8, 0x90, 0x8d, 0x85, 0x3f, 0xc9, 0x72, 0x1e, 0xd3, 0xd4, 0x38, 0xee, 0xc3, 0x97, 0xe0,
+	0xc5, 0xda, 0x11, 0x73, 0x12, 0x06, 0xd3, 0x6d, 0xe2, 0x2e, 0xf8, 0x00, 0x9e, 0x81, 0x67, 0x21,
+	0x2b, 0x70, 0x14, 0x92, 0xc3, 0xe1, 0x8e, 0xf5, 0x53, 0xe2, 0x30, 0xcb, 0x74, 0x07, 0xcd, 0xc7,
+	0x38, 0x49, 0x7a, 0xfd, 0xaf, 0xa7, 0x9c, 0xc0, 0xb7, 0xe0, 0xf5, 0x7e, 0x55, 0xe8, 0x11, 0x70,
+	0x14, 0xf1, 0x4b, 0x4a, 0x04, 0x67, 0x7b, 0xed, 0x1f, 0x5e, 0xfc, 0x1e, 0x00, 0xfb, 0x4a, 0x2e,
+	0xd0, 0xdd, 0xeb, 0xbb, 0x78, 0x7a, 0xb0, 0x83, 0x44, 0x2f, 0x2e, 0x19, 0x7c, 0x26, 0x6b, 0x67,
+	0x23, 0xaf, 0xcb, 0xb6, 0x41, 0xb2, 0x6b, 0x9c, 0xa6, 0x6e, 0xfb, 0xb5, 0x6e, 0x4e, 0x68, 0x39,
+	0x57, 0xff, 0xbb, 0xa8, 0xf7, 0xe6, 0xf3, 0xcd, 0x3a, 0x1a, 0x63, 0xfc, 0xdd, 0x1a, 0x8d, 0x4d,
+	0x18, 0xae, 0x14, 0x32, 0x52, 0xab, 0xc2, 0x45, 0x7d, 0x4b, 0xf5, 0x63, 0x03, 0xcc, 0x70, 0xa5,
+	0x66, 0x5b, 0x60, 0x56, 0xb8, 0x33, 0x03, 0xfc, 0xb2, 0x6c, 0x53, 0xf5, 0x3c, 0x5c, 0x29, 0xcf,
+	0xdb, 0x22, 0x9e, 0x57, 0xb8, 0x9e, 0x67, 0xa0, 0x2f, 0xc7, 0xfd, 0x74, 0xee, 0xdf, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0x31, 0x65, 0x3a, 0xc5, 0xee, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/customer_manager_link_error.pb.go b/googleapis/ads/googleads/v3/errors/customer_manager_link_error.pb.go
new file mode 100644
index 0000000..ebd54c3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/customer_manager_link_error.pb.go
@@ -0,0 +1,169 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/customer_manager_link_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible CustomerManagerLink errors.
+type CustomerManagerLinkErrorEnum_CustomerManagerLinkError int32
+
+const (
+	// Enum unspecified.
+	CustomerManagerLinkErrorEnum_UNSPECIFIED CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 0
+	// The received error code is not known in this version.
+	CustomerManagerLinkErrorEnum_UNKNOWN CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 1
+	// No pending invitation.
+	CustomerManagerLinkErrorEnum_NO_PENDING_INVITE CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 2
+	// Attempt to operate on the same client more than once in the same call.
+	CustomerManagerLinkErrorEnum_SAME_CLIENT_MORE_THAN_ONCE_PER_CALL CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 3
+	// Manager account has the maximum number of linked accounts.
+	CustomerManagerLinkErrorEnum_MANAGER_HAS_MAX_NUMBER_OF_LINKED_ACCOUNTS CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 4
+	// If no active user on account it cannot be unlinked from its manager.
+	CustomerManagerLinkErrorEnum_CANNOT_UNLINK_ACCOUNT_WITHOUT_ACTIVE_USER CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 5
+	// Account should have at least one active owner on it before being
+	// unlinked.
+	CustomerManagerLinkErrorEnum_CANNOT_REMOVE_LAST_CLIENT_ACCOUNT_OWNER CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 6
+	// Only account owners may change their permission role.
+	CustomerManagerLinkErrorEnum_CANNOT_CHANGE_ROLE_BY_NON_ACCOUNT_OWNER CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 7
+	// When a client's link to its manager is not active, the link role cannot
+	// be changed.
+	CustomerManagerLinkErrorEnum_CANNOT_CHANGE_ROLE_FOR_NON_ACTIVE_LINK_ACCOUNT CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 8
+	// Attempt to link a child to a parent that contains or will contain
+	// duplicate children.
+	CustomerManagerLinkErrorEnum_DUPLICATE_CHILD_FOUND CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 9
+	// The authorized customer is a test account. It can add no more than the
+	// allowed number of accounts
+	CustomerManagerLinkErrorEnum_TEST_ACCOUNT_LINKS_TOO_MANY_CHILD_ACCOUNTS CustomerManagerLinkErrorEnum_CustomerManagerLinkError = 10
+)
+
+var CustomerManagerLinkErrorEnum_CustomerManagerLinkError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "NO_PENDING_INVITE",
+	3:  "SAME_CLIENT_MORE_THAN_ONCE_PER_CALL",
+	4:  "MANAGER_HAS_MAX_NUMBER_OF_LINKED_ACCOUNTS",
+	5:  "CANNOT_UNLINK_ACCOUNT_WITHOUT_ACTIVE_USER",
+	6:  "CANNOT_REMOVE_LAST_CLIENT_ACCOUNT_OWNER",
+	7:  "CANNOT_CHANGE_ROLE_BY_NON_ACCOUNT_OWNER",
+	8:  "CANNOT_CHANGE_ROLE_FOR_NON_ACTIVE_LINK_ACCOUNT",
+	9:  "DUPLICATE_CHILD_FOUND",
+	10: "TEST_ACCOUNT_LINKS_TOO_MANY_CHILD_ACCOUNTS",
+}
+
+var CustomerManagerLinkErrorEnum_CustomerManagerLinkError_value = map[string]int32{
+	"UNSPECIFIED":                         0,
+	"UNKNOWN":                             1,
+	"NO_PENDING_INVITE":                   2,
+	"SAME_CLIENT_MORE_THAN_ONCE_PER_CALL": 3,
+	"MANAGER_HAS_MAX_NUMBER_OF_LINKED_ACCOUNTS":      4,
+	"CANNOT_UNLINK_ACCOUNT_WITHOUT_ACTIVE_USER":      5,
+	"CANNOT_REMOVE_LAST_CLIENT_ACCOUNT_OWNER":        6,
+	"CANNOT_CHANGE_ROLE_BY_NON_ACCOUNT_OWNER":        7,
+	"CANNOT_CHANGE_ROLE_FOR_NON_ACTIVE_LINK_ACCOUNT": 8,
+	"DUPLICATE_CHILD_FOUND":                          9,
+	"TEST_ACCOUNT_LINKS_TOO_MANY_CHILD_ACCOUNTS":     10,
+}
+
+func (x CustomerManagerLinkErrorEnum_CustomerManagerLinkError) String() string {
+	return proto.EnumName(CustomerManagerLinkErrorEnum_CustomerManagerLinkError_name, int32(x))
+}
+
+func (CustomerManagerLinkErrorEnum_CustomerManagerLinkError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_dd36dd7e52b23e23, []int{0, 0}
+}
+
+// Container for enum describing possible CustomerManagerLink errors.
+type CustomerManagerLinkErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CustomerManagerLinkErrorEnum) Reset()         { *m = CustomerManagerLinkErrorEnum{} }
+func (m *CustomerManagerLinkErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*CustomerManagerLinkErrorEnum) ProtoMessage()    {}
+func (*CustomerManagerLinkErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dd36dd7e52b23e23, []int{0}
+}
+
+func (m *CustomerManagerLinkErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerManagerLinkErrorEnum.Unmarshal(m, b)
+}
+func (m *CustomerManagerLinkErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerManagerLinkErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *CustomerManagerLinkErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerManagerLinkErrorEnum.Merge(m, src)
+}
+func (m *CustomerManagerLinkErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_CustomerManagerLinkErrorEnum.Size(m)
+}
+func (m *CustomerManagerLinkErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerManagerLinkErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerManagerLinkErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.CustomerManagerLinkErrorEnum_CustomerManagerLinkError", CustomerManagerLinkErrorEnum_CustomerManagerLinkError_name, CustomerManagerLinkErrorEnum_CustomerManagerLinkError_value)
+	proto.RegisterType((*CustomerManagerLinkErrorEnum)(nil), "google.ads.googleads.v3.errors.CustomerManagerLinkErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/customer_manager_link_error.proto", fileDescriptor_dd36dd7e52b23e23)
+}
+
+var fileDescriptor_dd36dd7e52b23e23 = []byte{
+	// 517 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xc1, 0x8e, 0x93, 0x50,
+	0x14, 0x86, 0x9d, 0x56, 0x67, 0xf4, 0xce, 0x42, 0x24, 0x99, 0x44, 0xcd, 0x38, 0x8b, 0xba, 0x98,
+	0xa8, 0x11, 0x12, 0xd9, 0xe1, 0xc6, 0xdb, 0xcb, 0x69, 0x4b, 0x06, 0xce, 0x25, 0x70, 0xa1, 0x8e,
+	0x69, 0x72, 0x82, 0xd3, 0x86, 0x34, 0xd3, 0x42, 0x03, 0x9d, 0x79, 0x20, 0x97, 0x6e, 0x7c, 0x0f,
+	0x57, 0x3e, 0x87, 0x4f, 0xe0, 0xd2, 0x50, 0x4a, 0x9d, 0x18, 0xeb, 0x8a, 0x13, 0xce, 0xf7, 0x9f,
+	0xff, 0x0f, 0xfc, 0xec, 0x43, 0x56, 0x14, 0xd9, 0x62, 0x66, 0xa6, 0xd3, 0xca, 0x6c, 0xc6, 0x7a,
+	0xba, 0xb5, 0xcc, 0x59, 0x59, 0x16, 0x65, 0x65, 0x5e, 0xdd, 0x54, 0xeb, 0x62, 0x39, 0x2b, 0x69,
+	0x99, 0xe6, 0x69, 0x36, 0x2b, 0x69, 0x31, 0xcf, 0xaf, 0x69, 0xb3, 0x34, 0x56, 0x65, 0xb1, 0x2e,
+	0xf4, 0xb3, 0x46, 0x66, 0xa4, 0xd3, 0xca, 0xd8, 0x5d, 0x30, 0x6e, 0x2d, 0xa3, 0xb9, 0xf0, 0xfc,
+	0xb4, 0x75, 0x58, 0xcd, 0xcd, 0x34, 0xcf, 0x8b, 0x75, 0xba, 0x9e, 0x17, 0x79, 0xd5, 0xa8, 0x7b,
+	0x3f, 0xba, 0xec, 0x54, 0x6c, 0x3d, 0xfc, 0xc6, 0xc2, 0x9b, 0xe7, 0xd7, 0x50, 0x6b, 0x21, 0xbf,
+	0x59, 0xf6, 0xbe, 0x75, 0xd9, 0xd3, 0x7d, 0x80, 0xfe, 0x98, 0x1d, 0xc7, 0x18, 0x05, 0x20, 0xdc,
+	0x81, 0x0b, 0x8e, 0x76, 0x4f, 0x3f, 0x66, 0x47, 0x31, 0x5e, 0xa0, 0x1c, 0xa3, 0x76, 0xa0, 0x9f,
+	0xb0, 0x27, 0x28, 0x29, 0x00, 0x74, 0x5c, 0x1c, 0x92, 0x8b, 0x89, 0xab, 0x40, 0xeb, 0xe8, 0xe7,
+	0xec, 0x65, 0xc4, 0x7d, 0x20, 0xe1, 0xb9, 0x80, 0x8a, 0x7c, 0x19, 0x02, 0xa9, 0x11, 0x47, 0x92,
+	0x28, 0x80, 0x02, 0x08, 0x49, 0x70, 0xcf, 0xd3, 0xba, 0xfa, 0x5b, 0xf6, 0xca, 0xe7, 0xc8, 0x87,
+	0x10, 0xd2, 0x88, 0x47, 0xe4, 0xf3, 0x8f, 0x84, 0xb1, 0xdf, 0x87, 0x90, 0xe4, 0x80, 0x3c, 0x17,
+	0x2f, 0xc0, 0x21, 0x2e, 0x84, 0x8c, 0x51, 0x45, 0xda, 0xfd, 0x1a, 0x17, 0x1c, 0x51, 0x2a, 0x8a,
+	0xb1, 0xde, 0xb6, 0x3b, 0x1a, 0xbb, 0x6a, 0x24, 0x63, 0x45, 0x5c, 0x28, 0x37, 0x01, 0x8a, 0x23,
+	0x08, 0xb5, 0x07, 0xfa, 0x1b, 0x76, 0xbe, 0xc5, 0x43, 0xf0, 0x65, 0x02, 0xe4, 0xf1, 0x48, 0xb5,
+	0xa1, 0x5a, 0xa9, 0x1c, 0x23, 0x84, 0xda, 0xe1, 0x1d, 0x58, 0x8c, 0x38, 0x0e, 0x81, 0x42, 0xe9,
+	0x01, 0xf5, 0x2f, 0x09, 0x25, 0xfe, 0x05, 0x1f, 0xe9, 0xef, 0x98, 0xf1, 0x0f, 0x78, 0x20, 0xc3,
+	0x2d, 0xbd, 0x49, 0x71, 0x37, 0xa1, 0xf6, 0x50, 0x7f, 0xc6, 0x4e, 0x9c, 0x38, 0xf0, 0x5c, 0xc1,
+	0x15, 0x90, 0x18, 0xb9, 0x9e, 0x43, 0x03, 0x19, 0xa3, 0xa3, 0x3d, 0xd2, 0x0d, 0xf6, 0x5a, 0x41,
+	0xf4, 0x27, 0x53, 0xad, 0x8c, 0x48, 0x49, 0x49, 0x3e, 0xc7, 0xcb, 0x2d, 0xbc, 0xfb, 0x0e, 0xac,
+	0xff, 0xeb, 0x80, 0xf5, 0xae, 0x8a, 0xa5, 0xf1, 0xff, 0x5e, 0xf4, 0x5f, 0xec, 0xfb, 0xab, 0x41,
+	0x5d, 0x8c, 0xe0, 0xe0, 0x93, 0xb3, 0x3d, 0x90, 0x15, 0x8b, 0x34, 0xcf, 0x8c, 0xa2, 0xcc, 0xcc,
+	0x6c, 0x96, 0x6f, 0x6a, 0xd3, 0x56, 0x75, 0x35, 0xaf, 0xf6, 0x35, 0xf7, 0x7d, 0xf3, 0xf8, 0xd2,
+	0xe9, 0x0e, 0x39, 0xff, 0xda, 0x39, 0x1b, 0x36, 0xc7, 0xf8, 0xb4, 0x32, 0x9a, 0xb1, 0x9e, 0x12,
+	0xcb, 0xd8, 0x58, 0x56, 0xdf, 0x5b, 0x60, 0xc2, 0xa7, 0xd5, 0x64, 0x07, 0x4c, 0x12, 0x6b, 0xd2,
+	0x00, 0x3f, 0x3b, 0xbd, 0xe6, 0xad, 0x6d, 0xf3, 0x69, 0x65, 0xdb, 0x3b, 0xc4, 0xb6, 0x13, 0xcb,
+	0xb6, 0x1b, 0xe8, 0xf3, 0xe1, 0x26, 0x9d, 0xf5, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x96, 0xc5, 0xad,
+	0x32, 0x56, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/database_error.pb.go b/googleapis/ads/googleads/v3/errors/database_error.pb.go
new file mode 100644
index 0000000..9814e7f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/database_error.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/database_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible database errors.
+type DatabaseErrorEnum_DatabaseError int32
+
+const (
+	// Enum unspecified.
+	DatabaseErrorEnum_UNSPECIFIED DatabaseErrorEnum_DatabaseError = 0
+	// The received error code is not known in this version.
+	DatabaseErrorEnum_UNKNOWN DatabaseErrorEnum_DatabaseError = 1
+	// Multiple requests were attempting to modify the same resource at once.
+	// Please retry the request.
+	DatabaseErrorEnum_CONCURRENT_MODIFICATION DatabaseErrorEnum_DatabaseError = 2
+	// The request conflicted with existing data. This error will usually be
+	// replaced with a more specific error if the request is retried.
+	DatabaseErrorEnum_DATA_CONSTRAINT_VIOLATION DatabaseErrorEnum_DatabaseError = 3
+	// The data written is too large. Please split the request into smaller
+	// requests.
+	DatabaseErrorEnum_REQUEST_TOO_LARGE DatabaseErrorEnum_DatabaseError = 4
+)
+
+var DatabaseErrorEnum_DatabaseError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CONCURRENT_MODIFICATION",
+	3: "DATA_CONSTRAINT_VIOLATION",
+	4: "REQUEST_TOO_LARGE",
+}
+
+var DatabaseErrorEnum_DatabaseError_value = map[string]int32{
+	"UNSPECIFIED":               0,
+	"UNKNOWN":                   1,
+	"CONCURRENT_MODIFICATION":   2,
+	"DATA_CONSTRAINT_VIOLATION": 3,
+	"REQUEST_TOO_LARGE":         4,
+}
+
+func (x DatabaseErrorEnum_DatabaseError) String() string {
+	return proto.EnumName(DatabaseErrorEnum_DatabaseError_name, int32(x))
+}
+
+func (DatabaseErrorEnum_DatabaseError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_afdc845129054f81, []int{0, 0}
+}
+
+// Container for enum describing possible database errors.
+type DatabaseErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DatabaseErrorEnum) Reset()         { *m = DatabaseErrorEnum{} }
+func (m *DatabaseErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*DatabaseErrorEnum) ProtoMessage()    {}
+func (*DatabaseErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_afdc845129054f81, []int{0}
+}
+
+func (m *DatabaseErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DatabaseErrorEnum.Unmarshal(m, b)
+}
+func (m *DatabaseErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DatabaseErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *DatabaseErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DatabaseErrorEnum.Merge(m, src)
+}
+func (m *DatabaseErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_DatabaseErrorEnum.Size(m)
+}
+func (m *DatabaseErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DatabaseErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DatabaseErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.DatabaseErrorEnum_DatabaseError", DatabaseErrorEnum_DatabaseError_name, DatabaseErrorEnum_DatabaseError_value)
+	proto.RegisterType((*DatabaseErrorEnum)(nil), "google.ads.googleads.v3.errors.DatabaseErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/database_error.proto", fileDescriptor_afdc845129054f81)
+}
+
+var fileDescriptor_afdc845129054f81 = []byte{
+	// 349 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x6a, 0xe3, 0x30,
+	0x14, 0xc6, 0xc7, 0xce, 0x30, 0x03, 0x0a, 0xc3, 0x38, 0x86, 0x52, 0xfa, 0x2f, 0x0b, 0x1f, 0x40,
+	0x5e, 0x78, 0xa7, 0xae, 0x14, 0x5b, 0x09, 0xa6, 0xa9, 0x94, 0x3a, 0xb2, 0x0b, 0xc5, 0x60, 0x94,
+	0xda, 0x98, 0x40, 0x62, 0x05, 0xcb, 0xcd, 0xba, 0xa7, 0xe8, 0x01, 0xba, 0xec, 0x51, 0x7a, 0x94,
+	0x42, 0xef, 0x50, 0x6c, 0x25, 0x81, 0x2c, 0xda, 0x95, 0x3e, 0x3d, 0xfd, 0xbe, 0xa7, 0xf7, 0x3d,
+	0xe0, 0x95, 0x52, 0x96, 0xab, 0xc2, 0x15, 0xb9, 0x72, 0xb5, 0x6c, 0xd5, 0xd6, 0x73, 0x8b, 0xba,
+	0x96, 0xb5, 0x72, 0x73, 0xd1, 0x88, 0x85, 0x50, 0x45, 0xd6, 0xdd, 0xe1, 0xa6, 0x96, 0x8d, 0xb4,
+	0x87, 0x9a, 0x84, 0x22, 0x57, 0xf0, 0x60, 0x82, 0x5b, 0x0f, 0x6a, 0xd3, 0xf9, 0xe5, 0xbe, 0xe9,
+	0x66, 0xe9, 0x8a, 0xaa, 0x92, 0x8d, 0x68, 0x96, 0xb2, 0x52, 0xda, 0xed, 0xbc, 0x18, 0x60, 0x10,
+	0xec, 0xda, 0x92, 0xd6, 0x40, 0xaa, 0xa7, 0xb5, 0xf3, 0x6c, 0x80, 0x7f, 0x47, 0x55, 0xfb, 0x3f,
+	0xe8, 0xc7, 0x74, 0x3e, 0x23, 0x7e, 0x38, 0x0e, 0x49, 0x60, 0xfd, 0xb2, 0xfb, 0xe0, 0x6f, 0x4c,
+	0x6f, 0x28, 0xbb, 0xa7, 0x96, 0x61, 0x5f, 0x80, 0x53, 0x9f, 0x51, 0x3f, 0x8e, 0x22, 0x42, 0x79,
+	0x76, 0xcb, 0x82, 0x70, 0x1c, 0xfa, 0x98, 0x87, 0x8c, 0x5a, 0xa6, 0x7d, 0x05, 0xce, 0x02, 0xcc,
+	0x71, 0xe6, 0x33, 0x3a, 0xe7, 0x11, 0x0e, 0x29, 0xcf, 0x92, 0x90, 0x4d, 0xf5, 0x73, 0xcf, 0x3e,
+	0x01, 0x83, 0x88, 0xdc, 0xc5, 0x64, 0xce, 0x33, 0xce, 0x58, 0x36, 0xc5, 0xd1, 0x84, 0x58, 0xbf,
+	0x47, 0x9f, 0x06, 0x70, 0x1e, 0xe5, 0x1a, 0xfe, 0x9c, 0x6e, 0x64, 0x1f, 0x8d, 0x39, 0x6b, 0x33,
+	0xcd, 0x8c, 0x87, 0x60, 0xe7, 0x2a, 0xe5, 0x4a, 0x54, 0x25, 0x94, 0x75, 0xe9, 0x96, 0x45, 0xd5,
+	0x25, 0xde, 0x2f, 0x76, 0xb3, 0x54, 0xdf, 0xed, 0xf9, 0x5a, 0x1f, 0xaf, 0x66, 0x6f, 0x82, 0xf1,
+	0x9b, 0x39, 0x9c, 0xe8, 0x66, 0x38, 0x57, 0x50, 0xcb, 0x56, 0x25, 0x1e, 0xec, 0xbe, 0x54, 0xef,
+	0x7b, 0x20, 0xc5, 0xb9, 0x4a, 0x0f, 0x40, 0x9a, 0x78, 0xa9, 0x06, 0x3e, 0x4c, 0x47, 0x57, 0x11,
+	0xc2, 0xb9, 0x42, 0xe8, 0x80, 0x20, 0x94, 0x78, 0x08, 0x69, 0x68, 0xf1, 0xa7, 0x9b, 0xce, 0xfb,
+	0x0a, 0x00, 0x00, 0xff, 0xff, 0xbe, 0x9c, 0x92, 0xeb, 0x04, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/date_error.pb.go b/googleapis/ads/googleads/v3/errors/date_error.pb.go
new file mode 100644
index 0000000..fcb6851
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/date_error.pb.go
@@ -0,0 +1,164 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/date_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible date errors.
+type DateErrorEnum_DateError int32
+
+const (
+	// Enum unspecified.
+	DateErrorEnum_UNSPECIFIED DateErrorEnum_DateError = 0
+	// The received error code is not known in this version.
+	DateErrorEnum_UNKNOWN DateErrorEnum_DateError = 1
+	// Given field values do not correspond to a valid date.
+	DateErrorEnum_INVALID_FIELD_VALUES_IN_DATE DateErrorEnum_DateError = 2
+	// Given field values do not correspond to a valid date time.
+	DateErrorEnum_INVALID_FIELD_VALUES_IN_DATE_TIME DateErrorEnum_DateError = 3
+	// The string date's format should be yyyy-mm-dd.
+	DateErrorEnum_INVALID_STRING_DATE DateErrorEnum_DateError = 4
+	// The string date time's format should be yyyy-mm-dd hh:mm:ss.ssssss.
+	DateErrorEnum_INVALID_STRING_DATE_TIME_MICROS DateErrorEnum_DateError = 6
+	// The string date time's format should be yyyy-mm-dd hh:mm:ss.
+	DateErrorEnum_INVALID_STRING_DATE_TIME_SECONDS DateErrorEnum_DateError = 11
+	// The string date time's format should be yyyy-mm-dd hh:mm:ss+|-hh:mm.
+	DateErrorEnum_INVALID_STRING_DATE_TIME_SECONDS_WITH_OFFSET DateErrorEnum_DateError = 12
+	// Date is before allowed minimum.
+	DateErrorEnum_EARLIER_THAN_MINIMUM_DATE DateErrorEnum_DateError = 7
+	// Date is after allowed maximum.
+	DateErrorEnum_LATER_THAN_MAXIMUM_DATE DateErrorEnum_DateError = 8
+	// Date range bounds are not in order.
+	DateErrorEnum_DATE_RANGE_MINIMUM_DATE_LATER_THAN_MAXIMUM_DATE DateErrorEnum_DateError = 9
+	// Both dates in range are null.
+	DateErrorEnum_DATE_RANGE_MINIMUM_AND_MAXIMUM_DATES_BOTH_NULL DateErrorEnum_DateError = 10
+)
+
+var DateErrorEnum_DateError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "INVALID_FIELD_VALUES_IN_DATE",
+	3:  "INVALID_FIELD_VALUES_IN_DATE_TIME",
+	4:  "INVALID_STRING_DATE",
+	6:  "INVALID_STRING_DATE_TIME_MICROS",
+	11: "INVALID_STRING_DATE_TIME_SECONDS",
+	12: "INVALID_STRING_DATE_TIME_SECONDS_WITH_OFFSET",
+	7:  "EARLIER_THAN_MINIMUM_DATE",
+	8:  "LATER_THAN_MAXIMUM_DATE",
+	9:  "DATE_RANGE_MINIMUM_DATE_LATER_THAN_MAXIMUM_DATE",
+	10: "DATE_RANGE_MINIMUM_AND_MAXIMUM_DATES_BOTH_NULL",
+}
+
+var DateErrorEnum_DateError_value = map[string]int32{
+	"UNSPECIFIED":                                     0,
+	"UNKNOWN":                                         1,
+	"INVALID_FIELD_VALUES_IN_DATE":                    2,
+	"INVALID_FIELD_VALUES_IN_DATE_TIME":               3,
+	"INVALID_STRING_DATE":                             4,
+	"INVALID_STRING_DATE_TIME_MICROS":                 6,
+	"INVALID_STRING_DATE_TIME_SECONDS":                11,
+	"INVALID_STRING_DATE_TIME_SECONDS_WITH_OFFSET":    12,
+	"EARLIER_THAN_MINIMUM_DATE":                       7,
+	"LATER_THAN_MAXIMUM_DATE":                         8,
+	"DATE_RANGE_MINIMUM_DATE_LATER_THAN_MAXIMUM_DATE": 9,
+	"DATE_RANGE_MINIMUM_AND_MAXIMUM_DATES_BOTH_NULL":  10,
+}
+
+func (x DateErrorEnum_DateError) String() string {
+	return proto.EnumName(DateErrorEnum_DateError_name, int32(x))
+}
+
+func (DateErrorEnum_DateError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_81086e3ecaa52885, []int{0, 0}
+}
+
+// Container for enum describing possible date errors.
+type DateErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DateErrorEnum) Reset()         { *m = DateErrorEnum{} }
+func (m *DateErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*DateErrorEnum) ProtoMessage()    {}
+func (*DateErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_81086e3ecaa52885, []int{0}
+}
+
+func (m *DateErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DateErrorEnum.Unmarshal(m, b)
+}
+func (m *DateErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DateErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *DateErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DateErrorEnum.Merge(m, src)
+}
+func (m *DateErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_DateErrorEnum.Size(m)
+}
+func (m *DateErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DateErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DateErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.DateErrorEnum_DateError", DateErrorEnum_DateError_name, DateErrorEnum_DateError_value)
+	proto.RegisterType((*DateErrorEnum)(nil), "google.ads.googleads.v3.errors.DateErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/date_error.proto", fileDescriptor_81086e3ecaa52885)
+}
+
+var fileDescriptor_81086e3ecaa52885 = []byte{
+	// 446 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0x4f, 0x6f, 0xd3, 0x30,
+	0x18, 0xc6, 0x69, 0x8b, 0x36, 0xf6, 0x96, 0x3f, 0x91, 0x39, 0x4c, 0xc0, 0x18, 0xa3, 0xc0, 0x0d,
+	0x39, 0x88, 0xdc, 0xc2, 0xc9, 0x6d, 0xdc, 0xd6, 0x22, 0x71, 0xaa, 0xc4, 0xc9, 0x10, 0xaa, 0x64,
+	0x05, 0x12, 0x45, 0x95, 0xb6, 0xb8, 0x8a, 0xc3, 0x3e, 0x10, 0x47, 0x24, 0x3e, 0x03, 0x77, 0xbe,
+	0x09, 0x7c, 0x0a, 0xd4, 0x78, 0x0d, 0x9a, 0xb4, 0x6e, 0xa7, 0x3c, 0xf2, 0xfb, 0xfb, 0xbd, 0xb1,
+	0xe4, 0x07, 0xec, 0x52, 0xa9, 0xf2, 0xac, 0xb0, 0xb3, 0x5c, 0x5f, 0xc6, 0x4d, 0xba, 0x70, 0xec,
+	0xa2, 0xae, 0x55, 0xad, 0xed, 0x3c, 0x6b, 0x0a, 0xd9, 0x66, 0xbc, 0xae, 0x55, 0xa3, 0xd0, 0xb1,
+	0xa1, 0x70, 0x96, 0x6b, 0xdc, 0x09, 0xf8, 0xc2, 0xc1, 0x46, 0x78, 0x7a, 0xb4, 0x5d, 0xb8, 0x5e,
+	0xd9, 0x59, 0x55, 0xa9, 0x26, 0x6b, 0x56, 0xaa, 0xd2, 0xc6, 0x1e, 0xfd, 0x1a, 0xc0, 0x03, 0x2f,
+	0x6b, 0x0a, 0xba, 0x81, 0x69, 0xf5, 0xed, 0x7c, 0xf4, 0x73, 0x00, 0x07, 0xdd, 0x09, 0x7a, 0x04,
+	0xc3, 0x84, 0xc7, 0x0b, 0x3a, 0x61, 0x53, 0x46, 0x3d, 0xeb, 0x0e, 0x1a, 0xc2, 0x7e, 0xc2, 0x3f,
+	0xf2, 0xf0, 0x94, 0x5b, 0x3d, 0x74, 0x02, 0x47, 0x8c, 0xa7, 0xc4, 0x67, 0x9e, 0x9c, 0x32, 0xea,
+	0x7b, 0x32, 0x25, 0x7e, 0x42, 0x63, 0xc9, 0xb8, 0xf4, 0x88, 0xa0, 0x56, 0x1f, 0xbd, 0x81, 0x97,
+	0x37, 0x11, 0x52, 0xb0, 0x80, 0x5a, 0x03, 0x74, 0x08, 0x8f, 0xb7, 0x58, 0x2c, 0x22, 0xc6, 0x67,
+	0xc6, 0xbf, 0x8b, 0x5e, 0xc1, 0x8b, 0x6b, 0x06, 0xad, 0x26, 0x03, 0x36, 0x89, 0xc2, 0xd8, 0xda,
+	0x43, 0xaf, 0xe1, 0x64, 0x27, 0x14, 0xd3, 0x49, 0xc8, 0xbd, 0xd8, 0x1a, 0xa2, 0x77, 0xf0, 0xf6,
+	0x36, 0x4a, 0x9e, 0x32, 0x31, 0x97, 0xe1, 0x74, 0x1a, 0x53, 0x61, 0xdd, 0x47, 0xcf, 0xe1, 0x09,
+	0x25, 0x91, 0xcf, 0x68, 0x24, 0xc5, 0x9c, 0x70, 0x19, 0x30, 0xce, 0x82, 0x24, 0x30, 0x77, 0xdb,
+	0x47, 0xcf, 0xe0, 0xd0, 0x27, 0xa2, 0x1b, 0x92, 0x4f, 0xff, 0x87, 0xf7, 0x90, 0x03, 0x76, 0xbb,
+	0x3e, 0x22, 0x7c, 0x46, 0xaf, 0x98, 0x72, 0x97, 0x74, 0x80, 0xde, 0x03, 0xbe, 0x46, 0x22, 0xdc,
+	0xbb, 0x02, 0xc6, 0x72, 0x1c, 0x8a, 0xb9, 0xe4, 0x89, 0xef, 0x5b, 0x30, 0xfe, 0xd3, 0x83, 0xd1,
+	0x57, 0x75, 0x8e, 0x6f, 0xae, 0xc1, 0xf8, 0x61, 0xf7, 0xa6, 0x8b, 0xcd, 0xc3, 0x2f, 0x7a, 0x9f,
+	0xbd, 0x4b, 0xa3, 0x54, 0x67, 0x59, 0x55, 0x62, 0x55, 0x97, 0x76, 0x59, 0x54, 0x6d, 0x2d, 0xb6,
+	0xcd, 0x5b, 0xaf, 0xf4, 0xae, 0x22, 0x7e, 0x30, 0x9f, 0xef, 0xfd, 0xc1, 0x8c, 0x90, 0x1f, 0xfd,
+	0xe3, 0x99, 0x59, 0x46, 0x72, 0x8d, 0x4d, 0xdc, 0xa4, 0xd4, 0xc1, 0xed, 0x2f, 0xf5, 0xef, 0x2d,
+	0xb0, 0x24, 0xb9, 0x5e, 0x76, 0xc0, 0x32, 0x75, 0x96, 0x06, 0xf8, 0xdb, 0x1f, 0x99, 0x53, 0xd7,
+	0x25, 0xb9, 0x76, 0xdd, 0x0e, 0x71, 0xdd, 0xd4, 0x71, 0x5d, 0x03, 0x7d, 0xd9, 0x6b, 0x6f, 0xe7,
+	0xfc, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x88, 0x64, 0xb3, 0x9a, 0x25, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/date_range_error.pb.go b/googleapis/ads/googleads/v3/errors/date_range_error.pb.go
new file mode 100644
index 0000000..b596e1a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/date_range_error.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/date_range_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible date range errors.
+type DateRangeErrorEnum_DateRangeError int32
+
+const (
+	// Enum unspecified.
+	DateRangeErrorEnum_UNSPECIFIED DateRangeErrorEnum_DateRangeError = 0
+	// The received error code is not known in this version.
+	DateRangeErrorEnum_UNKNOWN DateRangeErrorEnum_DateRangeError = 1
+	// Invalid date.
+	DateRangeErrorEnum_INVALID_DATE DateRangeErrorEnum_DateRangeError = 2
+	// The start date was after the end date.
+	DateRangeErrorEnum_START_DATE_AFTER_END_DATE DateRangeErrorEnum_DateRangeError = 3
+	// Cannot set date to past time
+	DateRangeErrorEnum_CANNOT_SET_DATE_TO_PAST DateRangeErrorEnum_DateRangeError = 4
+	// A date was used that is past the system "last" date.
+	DateRangeErrorEnum_AFTER_MAXIMUM_ALLOWABLE_DATE DateRangeErrorEnum_DateRangeError = 5
+	// Trying to change start date on a resource that has started.
+	DateRangeErrorEnum_CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED DateRangeErrorEnum_DateRangeError = 6
+)
+
+var DateRangeErrorEnum_DateRangeError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INVALID_DATE",
+	3: "START_DATE_AFTER_END_DATE",
+	4: "CANNOT_SET_DATE_TO_PAST",
+	5: "AFTER_MAXIMUM_ALLOWABLE_DATE",
+	6: "CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED",
+}
+
+var DateRangeErrorEnum_DateRangeError_value = map[string]int32{
+	"UNSPECIFIED":                  0,
+	"UNKNOWN":                      1,
+	"INVALID_DATE":                 2,
+	"START_DATE_AFTER_END_DATE":    3,
+	"CANNOT_SET_DATE_TO_PAST":      4,
+	"AFTER_MAXIMUM_ALLOWABLE_DATE": 5,
+	"CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED": 6,
+}
+
+func (x DateRangeErrorEnum_DateRangeError) String() string {
+	return proto.EnumName(DateRangeErrorEnum_DateRangeError_name, int32(x))
+}
+
+func (DateRangeErrorEnum_DateRangeError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a97a5f455042a19e, []int{0, 0}
+}
+
+// Container for enum describing possible date range errors.
+type DateRangeErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DateRangeErrorEnum) Reset()         { *m = DateRangeErrorEnum{} }
+func (m *DateRangeErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*DateRangeErrorEnum) ProtoMessage()    {}
+func (*DateRangeErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a97a5f455042a19e, []int{0}
+}
+
+func (m *DateRangeErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DateRangeErrorEnum.Unmarshal(m, b)
+}
+func (m *DateRangeErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DateRangeErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *DateRangeErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DateRangeErrorEnum.Merge(m, src)
+}
+func (m *DateRangeErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_DateRangeErrorEnum.Size(m)
+}
+func (m *DateRangeErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DateRangeErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DateRangeErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.DateRangeErrorEnum_DateRangeError", DateRangeErrorEnum_DateRangeError_name, DateRangeErrorEnum_DateRangeError_value)
+	proto.RegisterType((*DateRangeErrorEnum)(nil), "google.ads.googleads.v3.errors.DateRangeErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/date_range_error.proto", fileDescriptor_a97a5f455042a19e)
+}
+
+var fileDescriptor_a97a5f455042a19e = []byte{
+	// 390 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xc1, 0x8e, 0x95, 0x30,
+	0x14, 0x86, 0xe5, 0x8e, 0x8e, 0x49, 0xc7, 0x28, 0xa9, 0x0b, 0xa3, 0x8e, 0x13, 0xc3, 0xd6, 0xa4,
+	0x2c, 0x88, 0x9b, 0xba, 0x3a, 0x77, 0x5a, 0x26, 0x44, 0x28, 0x04, 0xb8, 0x8c, 0x1a, 0x92, 0xa6,
+	0x0a, 0x21, 0x37, 0x99, 0xa1, 0x37, 0x14, 0xe7, 0x81, 0x5c, 0xfa, 0x28, 0x6e, 0x7c, 0x0b, 0x17,
+	0x2e, 0x7c, 0x06, 0x03, 0xe5, 0xde, 0x38, 0x0b, 0x67, 0xc5, 0xcf, 0xdf, 0xff, 0x3b, 0xa7, 0x3d,
+	0x07, 0xbd, 0xed, 0xb4, 0xee, 0xae, 0x5a, 0x5f, 0x35, 0xc6, 0xb7, 0x72, 0x52, 0x37, 0x81, 0xdf,
+	0x0e, 0x83, 0x1e, 0x8c, 0xdf, 0xa8, 0xb1, 0x95, 0x83, 0xea, 0xbb, 0x56, 0xce, 0x0e, 0xd9, 0x0d,
+	0x7a, 0xd4, 0xf8, 0xcc, 0x66, 0x89, 0x6a, 0x0c, 0x39, 0x60, 0xe4, 0x26, 0x20, 0x16, 0x7b, 0x71,
+	0xba, 0x2f, 0xbb, 0xdb, 0xfa, 0xaa, 0xef, 0xf5, 0xa8, 0xc6, 0xad, 0xee, 0x8d, 0xa5, 0xbd, 0x5f,
+	0x0e, 0xc2, 0x4c, 0x8d, 0x6d, 0x3e, 0xd5, 0xe5, 0x13, 0xc1, 0xfb, 0xaf, 0xd7, 0xde, 0x4f, 0x07,
+	0x3d, 0xbe, 0x6d, 0xe3, 0x27, 0xe8, 0x64, 0x23, 0x8a, 0x8c, 0x9f, 0x47, 0x61, 0xc4, 0x99, 0x7b,
+	0x0f, 0x9f, 0xa0, 0x87, 0x1b, 0xf1, 0x5e, 0xa4, 0x97, 0xc2, 0x75, 0xb0, 0x8b, 0x1e, 0x45, 0xa2,
+	0x82, 0x38, 0x62, 0x92, 0x41, 0xc9, 0xdd, 0x15, 0x7e, 0x85, 0x9e, 0x17, 0x25, 0xe4, 0xe5, 0xfc,
+	0x2f, 0x21, 0x2c, 0x79, 0x2e, 0xb9, 0x58, 0x8e, 0x8f, 0xf0, 0x4b, 0xf4, 0xec, 0x1c, 0x84, 0x48,
+	0x4b, 0x59, 0xf0, 0x25, 0x53, 0xa6, 0x32, 0x83, 0xa2, 0x74, 0xef, 0xe3, 0xd7, 0xe8, 0xd4, 0x02,
+	0x09, 0x7c, 0x88, 0x92, 0x4d, 0x22, 0x21, 0x8e, 0xd3, 0x4b, 0x58, 0xc7, 0xdc, 0xe2, 0x0f, 0xb0,
+	0x8f, 0xde, 0x2c, 0x78, 0x92, 0xb2, 0x28, 0xfc, 0x28, 0xff, 0xe9, 0x15, 0x85, 0x12, 0xe2, 0x9c,
+	0x03, 0x5b, 0x5c, 0xce, 0xdc, 0xe3, 0xf5, 0x1f, 0x07, 0x79, 0x5f, 0xf4, 0x35, 0xb9, 0x7b, 0x5a,
+	0xeb, 0xa7, 0xb7, 0x5f, 0x9d, 0x4d, 0x43, 0xca, 0x9c, 0x4f, 0x6c, 0xc1, 0x3a, 0x7d, 0xa5, 0xfa,
+	0x8e, 0xe8, 0xa1, 0xf3, 0xbb, 0xb6, 0x9f, 0x47, 0xb8, 0xdf, 0xd5, 0x6e, 0x6b, 0xfe, 0xb7, 0xba,
+	0x77, 0xf6, 0xf3, 0x6d, 0x75, 0x74, 0x01, 0xf0, 0x7d, 0x75, 0x76, 0x61, 0x8b, 0x41, 0x63, 0x88,
+	0x95, 0x93, 0xaa, 0x02, 0x32, 0xb7, 0x34, 0x3f, 0xf6, 0x81, 0x1a, 0x1a, 0x53, 0x1f, 0x02, 0x75,
+	0x15, 0xd4, 0x36, 0xf0, 0x7b, 0xe5, 0x59, 0x97, 0x52, 0x68, 0x0c, 0xa5, 0x87, 0x08, 0xa5, 0x55,
+	0x40, 0xa9, 0x0d, 0x7d, 0x3e, 0x9e, 0x6f, 0x17, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x15,
+	0x6e, 0x6a, 0x57, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/distinct_error.pb.go b/googleapis/ads/googleads/v3/errors/distinct_error.pb.go
new file mode 100644
index 0000000..b489cec
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/distinct_error.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/distinct_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible distinct errors.
+type DistinctErrorEnum_DistinctError int32
+
+const (
+	// Enum unspecified.
+	DistinctErrorEnum_UNSPECIFIED DistinctErrorEnum_DistinctError = 0
+	// The received error code is not known in this version.
+	DistinctErrorEnum_UNKNOWN DistinctErrorEnum_DistinctError = 1
+	// Duplicate element.
+	DistinctErrorEnum_DUPLICATE_ELEMENT DistinctErrorEnum_DistinctError = 2
+	// Duplicate type.
+	DistinctErrorEnum_DUPLICATE_TYPE DistinctErrorEnum_DistinctError = 3
+)
+
+var DistinctErrorEnum_DistinctError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "DUPLICATE_ELEMENT",
+	3: "DUPLICATE_TYPE",
+}
+
+var DistinctErrorEnum_DistinctError_value = map[string]int32{
+	"UNSPECIFIED":       0,
+	"UNKNOWN":           1,
+	"DUPLICATE_ELEMENT": 2,
+	"DUPLICATE_TYPE":    3,
+}
+
+func (x DistinctErrorEnum_DistinctError) String() string {
+	return proto.EnumName(DistinctErrorEnum_DistinctError_name, int32(x))
+}
+
+func (DistinctErrorEnum_DistinctError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_273e984be5b3360c, []int{0, 0}
+}
+
+// Container for enum describing possible distinct errors.
+type DistinctErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DistinctErrorEnum) Reset()         { *m = DistinctErrorEnum{} }
+func (m *DistinctErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*DistinctErrorEnum) ProtoMessage()    {}
+func (*DistinctErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_273e984be5b3360c, []int{0}
+}
+
+func (m *DistinctErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DistinctErrorEnum.Unmarshal(m, b)
+}
+func (m *DistinctErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DistinctErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *DistinctErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DistinctErrorEnum.Merge(m, src)
+}
+func (m *DistinctErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_DistinctErrorEnum.Size(m)
+}
+func (m *DistinctErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_DistinctErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DistinctErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.DistinctErrorEnum_DistinctError", DistinctErrorEnum_DistinctError_name, DistinctErrorEnum_DistinctError_value)
+	proto.RegisterType((*DistinctErrorEnum)(nil), "google.ads.googleads.v3.errors.DistinctErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/distinct_error.proto", fileDescriptor_273e984be5b3360c)
+}
+
+var fileDescriptor_273e984be5b3360c = []byte{
+	// 306 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xdf, 0x4a, 0xc3, 0x30,
+	0x18, 0xc5, 0x5d, 0x07, 0x0a, 0x19, 0x6a, 0x17, 0xf0, 0x46, 0x64, 0x17, 0x7d, 0x80, 0xe4, 0x22,
+	0x77, 0xf1, 0x2a, 0x5b, 0xe3, 0x18, 0xce, 0x5a, 0x70, 0xad, 0x7f, 0x28, 0x8c, 0xba, 0x94, 0x50,
+	0x58, 0x93, 0xd2, 0xd4, 0x3d, 0x90, 0x97, 0x3e, 0x8a, 0x8f, 0x22, 0xf8, 0x0e, 0xd2, 0x66, 0xad,
+	0xec, 0x42, 0xaf, 0x7a, 0xfa, 0xf1, 0x3b, 0xe7, 0x3b, 0xf9, 0x00, 0x91, 0x5a, 0xcb, 0x6d, 0x86,
+	0x53, 0x61, 0xb0, 0x95, 0x8d, 0xda, 0x11, 0x9c, 0x55, 0x95, 0xae, 0x0c, 0x16, 0xb9, 0xa9, 0x73,
+	0xb5, 0xa9, 0xd7, 0xed, 0x3f, 0x2a, 0x2b, 0x5d, 0x6b, 0x38, 0xb1, 0x24, 0x4a, 0x85, 0x41, 0xbd,
+	0x09, 0xed, 0x08, 0xb2, 0xa6, 0xcb, 0xab, 0x2e, 0xb4, 0xcc, 0x71, 0xaa, 0x94, 0xae, 0xd3, 0x3a,
+	0xd7, 0xca, 0x58, 0xb7, 0x57, 0x80, 0xb1, 0xbf, 0x4f, 0xe5, 0x0d, 0xcf, 0xd5, 0x5b, 0xe1, 0x3d,
+	0x81, 0xd3, 0x83, 0x21, 0x3c, 0x07, 0xa3, 0x28, 0x78, 0x08, 0xf9, 0x6c, 0x71, 0xb3, 0xe0, 0xbe,
+	0x7b, 0x04, 0x47, 0xe0, 0x24, 0x0a, 0x6e, 0x83, 0xfb, 0xc7, 0xc0, 0x1d, 0xc0, 0x0b, 0x30, 0xf6,
+	0xa3, 0x70, 0xb9, 0x98, 0xb1, 0x15, 0x5f, 0xf3, 0x25, 0xbf, 0xe3, 0xc1, 0xca, 0x75, 0x20, 0x04,
+	0x67, 0xbf, 0xe3, 0xd5, 0x73, 0xc8, 0xdd, 0xe1, 0xf4, 0x7b, 0x00, 0xbc, 0x8d, 0x2e, 0xd0, 0xff,
+	0x9d, 0xa7, 0xf0, 0x60, 0x7d, 0xd8, 0x34, 0x0d, 0x07, 0x2f, 0xfe, 0xde, 0x25, 0xf5, 0x36, 0x55,
+	0x12, 0xe9, 0x4a, 0x62, 0x99, 0xa9, 0xf6, 0x1d, 0xdd, 0xb9, 0xca, 0xdc, 0xfc, 0x75, 0xbd, 0x6b,
+	0xfb, 0x79, 0x77, 0x86, 0x73, 0xc6, 0x3e, 0x9c, 0xc9, 0xdc, 0x86, 0x31, 0x61, 0x90, 0x95, 0x8d,
+	0x8a, 0x09, 0x6a, 0x57, 0x9a, 0xcf, 0x0e, 0x48, 0x98, 0x30, 0x49, 0x0f, 0x24, 0x31, 0x49, 0x2c,
+	0xf0, 0xe5, 0x78, 0x76, 0x4a, 0x29, 0x13, 0x86, 0xd2, 0x1e, 0xa1, 0x34, 0x26, 0x94, 0x5a, 0xe8,
+	0xf5, 0xb8, 0x6d, 0x47, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x41, 0x9d, 0xfa, 0xda, 0x01,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/enum_error.pb.go b/googleapis/ads/googleads/v3/errors/enum_error.pb.go
new file mode 100644
index 0000000..11dbcb2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/enum_error.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/enum_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible enum errors.
+type EnumErrorEnum_EnumError int32
+
+const (
+	// Enum unspecified.
+	EnumErrorEnum_UNSPECIFIED EnumErrorEnum_EnumError = 0
+	// The received error code is not known in this version.
+	EnumErrorEnum_UNKNOWN EnumErrorEnum_EnumError = 1
+	// The enum value is not permitted.
+	EnumErrorEnum_ENUM_VALUE_NOT_PERMITTED EnumErrorEnum_EnumError = 3
+)
+
+var EnumErrorEnum_EnumError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	3: "ENUM_VALUE_NOT_PERMITTED",
+}
+
+var EnumErrorEnum_EnumError_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"ENUM_VALUE_NOT_PERMITTED": 3,
+}
+
+func (x EnumErrorEnum_EnumError) String() string {
+	return proto.EnumName(EnumErrorEnum_EnumError_name, int32(x))
+}
+
+func (EnumErrorEnum_EnumError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b002669bf1a51dfb, []int{0, 0}
+}
+
+// Container for enum describing possible enum errors.
+type EnumErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EnumErrorEnum) Reset()         { *m = EnumErrorEnum{} }
+func (m *EnumErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*EnumErrorEnum) ProtoMessage()    {}
+func (*EnumErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b002669bf1a51dfb, []int{0}
+}
+
+func (m *EnumErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EnumErrorEnum.Unmarshal(m, b)
+}
+func (m *EnumErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EnumErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *EnumErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EnumErrorEnum.Merge(m, src)
+}
+func (m *EnumErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_EnumErrorEnum.Size(m)
+}
+func (m *EnumErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_EnumErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EnumErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.EnumErrorEnum_EnumError", EnumErrorEnum_EnumError_name, EnumErrorEnum_EnumError_value)
+	proto.RegisterType((*EnumErrorEnum)(nil), "google.ads.googleads.v3.errors.EnumErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/enum_error.proto", fileDescriptor_b002669bf1a51dfb)
+}
+
+var fileDescriptor_b002669bf1a51dfb = []byte{
+	// 295 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4e, 0xb4, 0x30,
+	0x18, 0x86, 0xff, 0x61, 0x92, 0xdf, 0xd8, 0x89, 0x4a, 0x58, 0x19, 0x33, 0x99, 0x05, 0x07, 0x68,
+	0x17, 0xdd, 0xd5, 0x55, 0x47, 0x2a, 0x21, 0x3a, 0x1d, 0xa2, 0x80, 0xc6, 0x90, 0x10, 0x14, 0xd2,
+	0x90, 0x0c, 0x2d, 0xa1, 0xcc, 0x1c, 0xc8, 0xa5, 0x47, 0xf1, 0x26, 0x7a, 0x0a, 0x03, 0x1d, 0xd8,
+	0xe9, 0xaa, 0x4f, 0x9a, 0xe7, 0xfd, 0xbe, 0x37, 0x1f, 0x40, 0x42, 0x29, 0xb1, 0x2b, 0x51, 0x5e,
+	0xe8, 0x23, 0xf6, 0x74, 0xc0, 0xa8, 0x6c, 0x5b, 0xd5, 0x6a, 0x54, 0xca, 0x7d, 0x9d, 0x0d, 0x0c,
+	0x9b, 0x56, 0x75, 0xca, 0x59, 0x19, 0x0b, 0xe6, 0x85, 0x86, 0x53, 0x00, 0x1e, 0x30, 0x34, 0x81,
+	0xab, 0xe5, 0x38, 0xb0, 0xa9, 0x50, 0x2e, 0xa5, 0xea, 0xf2, 0xae, 0x52, 0x52, 0x9b, 0xb4, 0xfb,
+	0x0c, 0xce, 0x98, 0xdc, 0xd7, 0xac, 0x77, 0x7b, 0x70, 0x7d, 0x70, 0x3a, 0x7d, 0x38, 0x17, 0x60,
+	0x11, 0xf3, 0xc7, 0x90, 0xdd, 0x04, 0xb7, 0x01, 0xf3, 0xec, 0x7f, 0xce, 0x02, 0x9c, 0xc4, 0xfc,
+	0x8e, 0x6f, 0x9f, 0xb8, 0x3d, 0x73, 0x96, 0xe0, 0x92, 0xf1, 0x78, 0x93, 0x25, 0xf4, 0x3e, 0x66,
+	0x19, 0xdf, 0x46, 0x59, 0xc8, 0x1e, 0x36, 0x41, 0x14, 0x31, 0xcf, 0x9e, 0xaf, 0xbf, 0x66, 0xc0,
+	0x7d, 0x53, 0x35, 0xfc, 0xbb, 0xde, 0xfa, 0x7c, 0xda, 0x16, 0xf6, 0x85, 0xc2, 0xd9, 0x8b, 0x77,
+	0x4c, 0x08, 0xb5, 0xcb, 0xa5, 0x80, 0xaa, 0x15, 0x48, 0x94, 0x72, 0xa8, 0x3b, 0x5e, 0xa4, 0xa9,
+	0xf4, 0x6f, 0x07, 0xba, 0x36, 0xcf, 0xbb, 0x35, 0xf7, 0x29, 0xfd, 0xb0, 0x56, 0xbe, 0x19, 0x46,
+	0x0b, 0x0d, 0x0d, 0xf6, 0x94, 0x60, 0x38, 0xac, 0xd4, 0x9f, 0xa3, 0x90, 0xd2, 0x42, 0xa7, 0x93,
+	0x90, 0x26, 0x38, 0x35, 0xc2, 0xb7, 0xe5, 0x9a, 0x5f, 0x42, 0x68, 0xa1, 0x09, 0x99, 0x14, 0x42,
+	0x12, 0x4c, 0x88, 0x91, 0x5e, 0xff, 0x0f, 0xed, 0xf0, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa,
+	0x67, 0x63, 0xa3, 0xbd, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/errors.pb.go b/googleapis/ads/googleads/v3/errors/errors.pb.go
new file mode 100644
index 0000000..d947579
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/errors.pb.go
@@ -0,0 +1,2373 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/errors.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Describes how a GoogleAds API call failed. It's returned inside
+// google.rpc.Status.details when a call fails.
+type GoogleAdsFailure struct {
+	// The list of errors that occurred.
+	Errors               []*GoogleAdsError `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *GoogleAdsFailure) Reset()         { *m = GoogleAdsFailure{} }
+func (m *GoogleAdsFailure) String() string { return proto.CompactTextString(m) }
+func (*GoogleAdsFailure) ProtoMessage()    {}
+func (*GoogleAdsFailure) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37c8858a8ef846f0, []int{0}
+}
+
+func (m *GoogleAdsFailure) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GoogleAdsFailure.Unmarshal(m, b)
+}
+func (m *GoogleAdsFailure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GoogleAdsFailure.Marshal(b, m, deterministic)
+}
+func (m *GoogleAdsFailure) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GoogleAdsFailure.Merge(m, src)
+}
+func (m *GoogleAdsFailure) XXX_Size() int {
+	return xxx_messageInfo_GoogleAdsFailure.Size(m)
+}
+func (m *GoogleAdsFailure) XXX_DiscardUnknown() {
+	xxx_messageInfo_GoogleAdsFailure.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GoogleAdsFailure proto.InternalMessageInfo
+
+func (m *GoogleAdsFailure) GetErrors() []*GoogleAdsError {
+	if m != nil {
+		return m.Errors
+	}
+	return nil
+}
+
+// GoogleAds-specific error.
+type GoogleAdsError struct {
+	// An enum value that indicates which error occurred.
+	ErrorCode *ErrorCode `protobuf:"bytes,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"`
+	// A human-readable description of the error.
+	Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
+	// The value that triggered the error.
+	Trigger *common.Value `protobuf:"bytes,3,opt,name=trigger,proto3" json:"trigger,omitempty"`
+	// Describes the part of the request proto that caused the error.
+	Location *ErrorLocation `protobuf:"bytes,4,opt,name=location,proto3" json:"location,omitempty"`
+	// Additional error details, which are returned by certain error codes. Most
+	// error codes do not include details.
+	Details              *ErrorDetails `protobuf:"bytes,5,opt,name=details,proto3" json:"details,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *GoogleAdsError) Reset()         { *m = GoogleAdsError{} }
+func (m *GoogleAdsError) String() string { return proto.CompactTextString(m) }
+func (*GoogleAdsError) ProtoMessage()    {}
+func (*GoogleAdsError) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37c8858a8ef846f0, []int{1}
+}
+
+func (m *GoogleAdsError) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GoogleAdsError.Unmarshal(m, b)
+}
+func (m *GoogleAdsError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GoogleAdsError.Marshal(b, m, deterministic)
+}
+func (m *GoogleAdsError) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GoogleAdsError.Merge(m, src)
+}
+func (m *GoogleAdsError) XXX_Size() int {
+	return xxx_messageInfo_GoogleAdsError.Size(m)
+}
+func (m *GoogleAdsError) XXX_DiscardUnknown() {
+	xxx_messageInfo_GoogleAdsError.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GoogleAdsError proto.InternalMessageInfo
+
+func (m *GoogleAdsError) GetErrorCode() *ErrorCode {
+	if m != nil {
+		return m.ErrorCode
+	}
+	return nil
+}
+
+func (m *GoogleAdsError) GetMessage() string {
+	if m != nil {
+		return m.Message
+	}
+	return ""
+}
+
+func (m *GoogleAdsError) GetTrigger() *common.Value {
+	if m != nil {
+		return m.Trigger
+	}
+	return nil
+}
+
+func (m *GoogleAdsError) GetLocation() *ErrorLocation {
+	if m != nil {
+		return m.Location
+	}
+	return nil
+}
+
+func (m *GoogleAdsError) GetDetails() *ErrorDetails {
+	if m != nil {
+		return m.Details
+	}
+	return nil
+}
+
+// The error reason represented by type and enum.
+type ErrorCode struct {
+	// The list of error enums
+	//
+	// Types that are valid to be assigned to ErrorCode:
+	//	*ErrorCode_RequestError
+	//	*ErrorCode_BiddingStrategyError
+	//	*ErrorCode_UrlFieldError
+	//	*ErrorCode_ListOperationError
+	//	*ErrorCode_QueryError
+	//	*ErrorCode_MutateError
+	//	*ErrorCode_FieldMaskError
+	//	*ErrorCode_AuthorizationError
+	//	*ErrorCode_InternalError
+	//	*ErrorCode_QuotaError
+	//	*ErrorCode_AdError
+	//	*ErrorCode_AdGroupError
+	//	*ErrorCode_CampaignBudgetError
+	//	*ErrorCode_CampaignError
+	//	*ErrorCode_AuthenticationError
+	//	*ErrorCode_AdGroupCriterionError
+	//	*ErrorCode_AdCustomizerError
+	//	*ErrorCode_AdGroupAdError
+	//	*ErrorCode_AdSharingError
+	//	*ErrorCode_AdxError
+	//	*ErrorCode_AssetError
+	//	*ErrorCode_BiddingError
+	//	*ErrorCode_CampaignCriterionError
+	//	*ErrorCode_CollectionSizeError
+	//	*ErrorCode_CountryCodeError
+	//	*ErrorCode_CriterionError
+	//	*ErrorCode_CustomerError
+	//	*ErrorCode_DateError
+	//	*ErrorCode_DateRangeError
+	//	*ErrorCode_DistinctError
+	//	*ErrorCode_FeedAttributeReferenceError
+	//	*ErrorCode_FunctionError
+	//	*ErrorCode_FunctionParsingError
+	//	*ErrorCode_IdError
+	//	*ErrorCode_ImageError
+	//	*ErrorCode_LanguageCodeError
+	//	*ErrorCode_MediaBundleError
+	//	*ErrorCode_MediaUploadError
+	//	*ErrorCode_MediaFileError
+	//	*ErrorCode_MultiplierError
+	//	*ErrorCode_NewResourceCreationError
+	//	*ErrorCode_NotEmptyError
+	//	*ErrorCode_NullError
+	//	*ErrorCode_OperatorError
+	//	*ErrorCode_RangeError
+	//	*ErrorCode_RecommendationError
+	//	*ErrorCode_RegionCodeError
+	//	*ErrorCode_SettingError
+	//	*ErrorCode_StringFormatError
+	//	*ErrorCode_StringLengthError
+	//	*ErrorCode_OperationAccessDeniedError
+	//	*ErrorCode_ResourceAccessDeniedError
+	//	*ErrorCode_ResourceCountLimitExceededError
+	//	*ErrorCode_YoutubeVideoRegistrationError
+	//	*ErrorCode_AdGroupBidModifierError
+	//	*ErrorCode_ContextError
+	//	*ErrorCode_FieldError
+	//	*ErrorCode_SharedSetError
+	//	*ErrorCode_SharedCriterionError
+	//	*ErrorCode_CampaignSharedSetError
+	//	*ErrorCode_ConversionActionError
+	//	*ErrorCode_ConversionAdjustmentUploadError
+	//	*ErrorCode_ConversionUploadError
+	//	*ErrorCode_HeaderError
+	//	*ErrorCode_DatabaseError
+	//	*ErrorCode_PolicyFindingError
+	//	*ErrorCode_EnumError
+	//	*ErrorCode_KeywordPlanError
+	//	*ErrorCode_KeywordPlanCampaignError
+	//	*ErrorCode_KeywordPlanNegativeKeywordError
+	//	*ErrorCode_KeywordPlanAdGroupError
+	//	*ErrorCode_KeywordPlanKeywordError
+	//	*ErrorCode_KeywordPlanIdeaError
+	//	*ErrorCode_AccountBudgetProposalError
+	//	*ErrorCode_UserListError
+	//	*ErrorCode_ChangeStatusError
+	//	*ErrorCode_FeedError
+	//	*ErrorCode_GeoTargetConstantSuggestionError
+	//	*ErrorCode_CampaignDraftError
+	//	*ErrorCode_FeedItemError
+	//	*ErrorCode_LabelError
+	//	*ErrorCode_BillingSetupError
+	//	*ErrorCode_CustomerClientLinkError
+	//	*ErrorCode_CustomerManagerLinkError
+	//	*ErrorCode_FeedMappingError
+	//	*ErrorCode_CustomerFeedError
+	//	*ErrorCode_AdGroupFeedError
+	//	*ErrorCode_CampaignFeedError
+	//	*ErrorCode_CustomInterestError
+	//	*ErrorCode_CampaignExperimentError
+	//	*ErrorCode_ExtensionFeedItemError
+	//	*ErrorCode_AdParameterError
+	//	*ErrorCode_FeedItemValidationError
+	//	*ErrorCode_ExtensionSettingError
+	//	*ErrorCode_FeedItemTargetError
+	//	*ErrorCode_PolicyViolationError
+	//	*ErrorCode_MutateJobError
+	//	*ErrorCode_PartialFailureError
+	//	*ErrorCode_PolicyValidationParameterError
+	//	*ErrorCode_SizeLimitError
+	//	*ErrorCode_NotWhitelistedError
+	//	*ErrorCode_ManagerLinkError
+	//	*ErrorCode_CurrencyCodeError
+	//	*ErrorCode_AccessInvitationError
+	//	*ErrorCode_ReachPlanError
+	//	*ErrorCode_InvoiceError
+	//	*ErrorCode_PaymentsAccountError
+	//	*ErrorCode_TimeZoneError
+	ErrorCode            isErrorCode_ErrorCode `protobuf_oneof:"error_code"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ErrorCode) Reset()         { *m = ErrorCode{} }
+func (m *ErrorCode) String() string { return proto.CompactTextString(m) }
+func (*ErrorCode) ProtoMessage()    {}
+func (*ErrorCode) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37c8858a8ef846f0, []int{2}
+}
+
+func (m *ErrorCode) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ErrorCode.Unmarshal(m, b)
+}
+func (m *ErrorCode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ErrorCode.Marshal(b, m, deterministic)
+}
+func (m *ErrorCode) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ErrorCode.Merge(m, src)
+}
+func (m *ErrorCode) XXX_Size() int {
+	return xxx_messageInfo_ErrorCode.Size(m)
+}
+func (m *ErrorCode) XXX_DiscardUnknown() {
+	xxx_messageInfo_ErrorCode.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ErrorCode proto.InternalMessageInfo
+
+type isErrorCode_ErrorCode interface {
+	isErrorCode_ErrorCode()
+}
+
+type ErrorCode_RequestError struct {
+	RequestError RequestErrorEnum_RequestError `protobuf:"varint,1,opt,name=request_error,json=requestError,proto3,enum=google.ads.googleads.v3.errors.RequestErrorEnum_RequestError,oneof"`
+}
+
+type ErrorCode_BiddingStrategyError struct {
+	BiddingStrategyError BiddingStrategyErrorEnum_BiddingStrategyError `protobuf:"varint,2,opt,name=bidding_strategy_error,json=biddingStrategyError,proto3,enum=google.ads.googleads.v3.errors.BiddingStrategyErrorEnum_BiddingStrategyError,oneof"`
+}
+
+type ErrorCode_UrlFieldError struct {
+	UrlFieldError UrlFieldErrorEnum_UrlFieldError `protobuf:"varint,3,opt,name=url_field_error,json=urlFieldError,proto3,enum=google.ads.googleads.v3.errors.UrlFieldErrorEnum_UrlFieldError,oneof"`
+}
+
+type ErrorCode_ListOperationError struct {
+	ListOperationError ListOperationErrorEnum_ListOperationError `protobuf:"varint,4,opt,name=list_operation_error,json=listOperationError,proto3,enum=google.ads.googleads.v3.errors.ListOperationErrorEnum_ListOperationError,oneof"`
+}
+
+type ErrorCode_QueryError struct {
+	QueryError QueryErrorEnum_QueryError `protobuf:"varint,5,opt,name=query_error,json=queryError,proto3,enum=google.ads.googleads.v3.errors.QueryErrorEnum_QueryError,oneof"`
+}
+
+type ErrorCode_MutateError struct {
+	MutateError MutateErrorEnum_MutateError `protobuf:"varint,7,opt,name=mutate_error,json=mutateError,proto3,enum=google.ads.googleads.v3.errors.MutateErrorEnum_MutateError,oneof"`
+}
+
+type ErrorCode_FieldMaskError struct {
+	FieldMaskError FieldMaskErrorEnum_FieldMaskError `protobuf:"varint,8,opt,name=field_mask_error,json=fieldMaskError,proto3,enum=google.ads.googleads.v3.errors.FieldMaskErrorEnum_FieldMaskError,oneof"`
+}
+
+type ErrorCode_AuthorizationError struct {
+	AuthorizationError AuthorizationErrorEnum_AuthorizationError `protobuf:"varint,9,opt,name=authorization_error,json=authorizationError,proto3,enum=google.ads.googleads.v3.errors.AuthorizationErrorEnum_AuthorizationError,oneof"`
+}
+
+type ErrorCode_InternalError struct {
+	InternalError InternalErrorEnum_InternalError `protobuf:"varint,10,opt,name=internal_error,json=internalError,proto3,enum=google.ads.googleads.v3.errors.InternalErrorEnum_InternalError,oneof"`
+}
+
+type ErrorCode_QuotaError struct {
+	QuotaError QuotaErrorEnum_QuotaError `protobuf:"varint,11,opt,name=quota_error,json=quotaError,proto3,enum=google.ads.googleads.v3.errors.QuotaErrorEnum_QuotaError,oneof"`
+}
+
+type ErrorCode_AdError struct {
+	AdError AdErrorEnum_AdError `protobuf:"varint,12,opt,name=ad_error,json=adError,proto3,enum=google.ads.googleads.v3.errors.AdErrorEnum_AdError,oneof"`
+}
+
+type ErrorCode_AdGroupError struct {
+	AdGroupError AdGroupErrorEnum_AdGroupError `protobuf:"varint,13,opt,name=ad_group_error,json=adGroupError,proto3,enum=google.ads.googleads.v3.errors.AdGroupErrorEnum_AdGroupError,oneof"`
+}
+
+type ErrorCode_CampaignBudgetError struct {
+	CampaignBudgetError CampaignBudgetErrorEnum_CampaignBudgetError `protobuf:"varint,14,opt,name=campaign_budget_error,json=campaignBudgetError,proto3,enum=google.ads.googleads.v3.errors.CampaignBudgetErrorEnum_CampaignBudgetError,oneof"`
+}
+
+type ErrorCode_CampaignError struct {
+	CampaignError CampaignErrorEnum_CampaignError `protobuf:"varint,15,opt,name=campaign_error,json=campaignError,proto3,enum=google.ads.googleads.v3.errors.CampaignErrorEnum_CampaignError,oneof"`
+}
+
+type ErrorCode_AuthenticationError struct {
+	AuthenticationError AuthenticationErrorEnum_AuthenticationError `protobuf:"varint,17,opt,name=authentication_error,json=authenticationError,proto3,enum=google.ads.googleads.v3.errors.AuthenticationErrorEnum_AuthenticationError,oneof"`
+}
+
+type ErrorCode_AdGroupCriterionError struct {
+	AdGroupCriterionError AdGroupCriterionErrorEnum_AdGroupCriterionError `protobuf:"varint,18,opt,name=ad_group_criterion_error,json=adGroupCriterionError,proto3,enum=google.ads.googleads.v3.errors.AdGroupCriterionErrorEnum_AdGroupCriterionError,oneof"`
+}
+
+type ErrorCode_AdCustomizerError struct {
+	AdCustomizerError AdCustomizerErrorEnum_AdCustomizerError `protobuf:"varint,19,opt,name=ad_customizer_error,json=adCustomizerError,proto3,enum=google.ads.googleads.v3.errors.AdCustomizerErrorEnum_AdCustomizerError,oneof"`
+}
+
+type ErrorCode_AdGroupAdError struct {
+	AdGroupAdError AdGroupAdErrorEnum_AdGroupAdError `protobuf:"varint,21,opt,name=ad_group_ad_error,json=adGroupAdError,proto3,enum=google.ads.googleads.v3.errors.AdGroupAdErrorEnum_AdGroupAdError,oneof"`
+}
+
+type ErrorCode_AdSharingError struct {
+	AdSharingError AdSharingErrorEnum_AdSharingError `protobuf:"varint,24,opt,name=ad_sharing_error,json=adSharingError,proto3,enum=google.ads.googleads.v3.errors.AdSharingErrorEnum_AdSharingError,oneof"`
+}
+
+type ErrorCode_AdxError struct {
+	AdxError AdxErrorEnum_AdxError `protobuf:"varint,25,opt,name=adx_error,json=adxError,proto3,enum=google.ads.googleads.v3.errors.AdxErrorEnum_AdxError,oneof"`
+}
+
+type ErrorCode_AssetError struct {
+	AssetError AssetErrorEnum_AssetError `protobuf:"varint,107,opt,name=asset_error,json=assetError,proto3,enum=google.ads.googleads.v3.errors.AssetErrorEnum_AssetError,oneof"`
+}
+
+type ErrorCode_BiddingError struct {
+	BiddingError BiddingErrorEnum_BiddingError `protobuf:"varint,26,opt,name=bidding_error,json=biddingError,proto3,enum=google.ads.googleads.v3.errors.BiddingErrorEnum_BiddingError,oneof"`
+}
+
+type ErrorCode_CampaignCriterionError struct {
+	CampaignCriterionError CampaignCriterionErrorEnum_CampaignCriterionError `protobuf:"varint,29,opt,name=campaign_criterion_error,json=campaignCriterionError,proto3,enum=google.ads.googleads.v3.errors.CampaignCriterionErrorEnum_CampaignCriterionError,oneof"`
+}
+
+type ErrorCode_CollectionSizeError struct {
+	CollectionSizeError CollectionSizeErrorEnum_CollectionSizeError `protobuf:"varint,31,opt,name=collection_size_error,json=collectionSizeError,proto3,enum=google.ads.googleads.v3.errors.CollectionSizeErrorEnum_CollectionSizeError,oneof"`
+}
+
+type ErrorCode_CountryCodeError struct {
+	CountryCodeError CountryCodeErrorEnum_CountryCodeError `protobuf:"varint,109,opt,name=country_code_error,json=countryCodeError,proto3,enum=google.ads.googleads.v3.errors.CountryCodeErrorEnum_CountryCodeError,oneof"`
+}
+
+type ErrorCode_CriterionError struct {
+	CriterionError CriterionErrorEnum_CriterionError `protobuf:"varint,32,opt,name=criterion_error,json=criterionError,proto3,enum=google.ads.googleads.v3.errors.CriterionErrorEnum_CriterionError,oneof"`
+}
+
+type ErrorCode_CustomerError struct {
+	CustomerError CustomerErrorEnum_CustomerError `protobuf:"varint,90,opt,name=customer_error,json=customerError,proto3,enum=google.ads.googleads.v3.errors.CustomerErrorEnum_CustomerError,oneof"`
+}
+
+type ErrorCode_DateError struct {
+	DateError DateErrorEnum_DateError `protobuf:"varint,33,opt,name=date_error,json=dateError,proto3,enum=google.ads.googleads.v3.errors.DateErrorEnum_DateError,oneof"`
+}
+
+type ErrorCode_DateRangeError struct {
+	DateRangeError DateRangeErrorEnum_DateRangeError `protobuf:"varint,34,opt,name=date_range_error,json=dateRangeError,proto3,enum=google.ads.googleads.v3.errors.DateRangeErrorEnum_DateRangeError,oneof"`
+}
+
+type ErrorCode_DistinctError struct {
+	DistinctError DistinctErrorEnum_DistinctError `protobuf:"varint,35,opt,name=distinct_error,json=distinctError,proto3,enum=google.ads.googleads.v3.errors.DistinctErrorEnum_DistinctError,oneof"`
+}
+
+type ErrorCode_FeedAttributeReferenceError struct {
+	FeedAttributeReferenceError FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError `protobuf:"varint,36,opt,name=feed_attribute_reference_error,json=feedAttributeReferenceError,proto3,enum=google.ads.googleads.v3.errors.FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError,oneof"`
+}
+
+type ErrorCode_FunctionError struct {
+	FunctionError FunctionErrorEnum_FunctionError `protobuf:"varint,37,opt,name=function_error,json=functionError,proto3,enum=google.ads.googleads.v3.errors.FunctionErrorEnum_FunctionError,oneof"`
+}
+
+type ErrorCode_FunctionParsingError struct {
+	FunctionParsingError FunctionParsingErrorEnum_FunctionParsingError `protobuf:"varint,38,opt,name=function_parsing_error,json=functionParsingError,proto3,enum=google.ads.googleads.v3.errors.FunctionParsingErrorEnum_FunctionParsingError,oneof"`
+}
+
+type ErrorCode_IdError struct {
+	IdError IdErrorEnum_IdError `protobuf:"varint,39,opt,name=id_error,json=idError,proto3,enum=google.ads.googleads.v3.errors.IdErrorEnum_IdError,oneof"`
+}
+
+type ErrorCode_ImageError struct {
+	ImageError ImageErrorEnum_ImageError `protobuf:"varint,40,opt,name=image_error,json=imageError,proto3,enum=google.ads.googleads.v3.errors.ImageErrorEnum_ImageError,oneof"`
+}
+
+type ErrorCode_LanguageCodeError struct {
+	LanguageCodeError LanguageCodeErrorEnum_LanguageCodeError `protobuf:"varint,110,opt,name=language_code_error,json=languageCodeError,proto3,enum=google.ads.googleads.v3.errors.LanguageCodeErrorEnum_LanguageCodeError,oneof"`
+}
+
+type ErrorCode_MediaBundleError struct {
+	MediaBundleError MediaBundleErrorEnum_MediaBundleError `protobuf:"varint,42,opt,name=media_bundle_error,json=mediaBundleError,proto3,enum=google.ads.googleads.v3.errors.MediaBundleErrorEnum_MediaBundleError,oneof"`
+}
+
+type ErrorCode_MediaUploadError struct {
+	MediaUploadError MediaUploadErrorEnum_MediaUploadError `protobuf:"varint,116,opt,name=media_upload_error,json=mediaUploadError,proto3,enum=google.ads.googleads.v3.errors.MediaUploadErrorEnum_MediaUploadError,oneof"`
+}
+
+type ErrorCode_MediaFileError struct {
+	MediaFileError MediaFileErrorEnum_MediaFileError `protobuf:"varint,86,opt,name=media_file_error,json=mediaFileError,proto3,enum=google.ads.googleads.v3.errors.MediaFileErrorEnum_MediaFileError,oneof"`
+}
+
+type ErrorCode_MultiplierError struct {
+	MultiplierError MultiplierErrorEnum_MultiplierError `protobuf:"varint,44,opt,name=multiplier_error,json=multiplierError,proto3,enum=google.ads.googleads.v3.errors.MultiplierErrorEnum_MultiplierError,oneof"`
+}
+
+type ErrorCode_NewResourceCreationError struct {
+	NewResourceCreationError NewResourceCreationErrorEnum_NewResourceCreationError `protobuf:"varint,45,opt,name=new_resource_creation_error,json=newResourceCreationError,proto3,enum=google.ads.googleads.v3.errors.NewResourceCreationErrorEnum_NewResourceCreationError,oneof"`
+}
+
+type ErrorCode_NotEmptyError struct {
+	NotEmptyError NotEmptyErrorEnum_NotEmptyError `protobuf:"varint,46,opt,name=not_empty_error,json=notEmptyError,proto3,enum=google.ads.googleads.v3.errors.NotEmptyErrorEnum_NotEmptyError,oneof"`
+}
+
+type ErrorCode_NullError struct {
+	NullError NullErrorEnum_NullError `protobuf:"varint,47,opt,name=null_error,json=nullError,proto3,enum=google.ads.googleads.v3.errors.NullErrorEnum_NullError,oneof"`
+}
+
+type ErrorCode_OperatorError struct {
+	OperatorError OperatorErrorEnum_OperatorError `protobuf:"varint,48,opt,name=operator_error,json=operatorError,proto3,enum=google.ads.googleads.v3.errors.OperatorErrorEnum_OperatorError,oneof"`
+}
+
+type ErrorCode_RangeError struct {
+	RangeError RangeErrorEnum_RangeError `protobuf:"varint,49,opt,name=range_error,json=rangeError,proto3,enum=google.ads.googleads.v3.errors.RangeErrorEnum_RangeError,oneof"`
+}
+
+type ErrorCode_RecommendationError struct {
+	RecommendationError RecommendationErrorEnum_RecommendationError `protobuf:"varint,58,opt,name=recommendation_error,json=recommendationError,proto3,enum=google.ads.googleads.v3.errors.RecommendationErrorEnum_RecommendationError,oneof"`
+}
+
+type ErrorCode_RegionCodeError struct {
+	RegionCodeError RegionCodeErrorEnum_RegionCodeError `protobuf:"varint,51,opt,name=region_code_error,json=regionCodeError,proto3,enum=google.ads.googleads.v3.errors.RegionCodeErrorEnum_RegionCodeError,oneof"`
+}
+
+type ErrorCode_SettingError struct {
+	SettingError SettingErrorEnum_SettingError `protobuf:"varint,52,opt,name=setting_error,json=settingError,proto3,enum=google.ads.googleads.v3.errors.SettingErrorEnum_SettingError,oneof"`
+}
+
+type ErrorCode_StringFormatError struct {
+	StringFormatError StringFormatErrorEnum_StringFormatError `protobuf:"varint,53,opt,name=string_format_error,json=stringFormatError,proto3,enum=google.ads.googleads.v3.errors.StringFormatErrorEnum_StringFormatError,oneof"`
+}
+
+type ErrorCode_StringLengthError struct {
+	StringLengthError StringLengthErrorEnum_StringLengthError `protobuf:"varint,54,opt,name=string_length_error,json=stringLengthError,proto3,enum=google.ads.googleads.v3.errors.StringLengthErrorEnum_StringLengthError,oneof"`
+}
+
+type ErrorCode_OperationAccessDeniedError struct {
+	OperationAccessDeniedError OperationAccessDeniedErrorEnum_OperationAccessDeniedError `protobuf:"varint,55,opt,name=operation_access_denied_error,json=operationAccessDeniedError,proto3,enum=google.ads.googleads.v3.errors.OperationAccessDeniedErrorEnum_OperationAccessDeniedError,oneof"`
+}
+
+type ErrorCode_ResourceAccessDeniedError struct {
+	ResourceAccessDeniedError ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError `protobuf:"varint,56,opt,name=resource_access_denied_error,json=resourceAccessDeniedError,proto3,enum=google.ads.googleads.v3.errors.ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError,oneof"`
+}
+
+type ErrorCode_ResourceCountLimitExceededError struct {
+	ResourceCountLimitExceededError ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError `protobuf:"varint,57,opt,name=resource_count_limit_exceeded_error,json=resourceCountLimitExceededError,proto3,enum=google.ads.googleads.v3.errors.ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError,oneof"`
+}
+
+type ErrorCode_YoutubeVideoRegistrationError struct {
+	YoutubeVideoRegistrationError YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError `protobuf:"varint,117,opt,name=youtube_video_registration_error,json=youtubeVideoRegistrationError,proto3,enum=google.ads.googleads.v3.errors.YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError,oneof"`
+}
+
+type ErrorCode_AdGroupBidModifierError struct {
+	AdGroupBidModifierError AdGroupBidModifierErrorEnum_AdGroupBidModifierError `protobuf:"varint,59,opt,name=ad_group_bid_modifier_error,json=adGroupBidModifierError,proto3,enum=google.ads.googleads.v3.errors.AdGroupBidModifierErrorEnum_AdGroupBidModifierError,oneof"`
+}
+
+type ErrorCode_ContextError struct {
+	ContextError ContextErrorEnum_ContextError `protobuf:"varint,60,opt,name=context_error,json=contextError,proto3,enum=google.ads.googleads.v3.errors.ContextErrorEnum_ContextError,oneof"`
+}
+
+type ErrorCode_FieldError struct {
+	FieldError FieldErrorEnum_FieldError `protobuf:"varint,61,opt,name=field_error,json=fieldError,proto3,enum=google.ads.googleads.v3.errors.FieldErrorEnum_FieldError,oneof"`
+}
+
+type ErrorCode_SharedSetError struct {
+	SharedSetError SharedSetErrorEnum_SharedSetError `protobuf:"varint,62,opt,name=shared_set_error,json=sharedSetError,proto3,enum=google.ads.googleads.v3.errors.SharedSetErrorEnum_SharedSetError,oneof"`
+}
+
+type ErrorCode_SharedCriterionError struct {
+	SharedCriterionError SharedCriterionErrorEnum_SharedCriterionError `protobuf:"varint,63,opt,name=shared_criterion_error,json=sharedCriterionError,proto3,enum=google.ads.googleads.v3.errors.SharedCriterionErrorEnum_SharedCriterionError,oneof"`
+}
+
+type ErrorCode_CampaignSharedSetError struct {
+	CampaignSharedSetError CampaignSharedSetErrorEnum_CampaignSharedSetError `protobuf:"varint,64,opt,name=campaign_shared_set_error,json=campaignSharedSetError,proto3,enum=google.ads.googleads.v3.errors.CampaignSharedSetErrorEnum_CampaignSharedSetError,oneof"`
+}
+
+type ErrorCode_ConversionActionError struct {
+	ConversionActionError ConversionActionErrorEnum_ConversionActionError `protobuf:"varint,65,opt,name=conversion_action_error,json=conversionActionError,proto3,enum=google.ads.googleads.v3.errors.ConversionActionErrorEnum_ConversionActionError,oneof"`
+}
+
+type ErrorCode_ConversionAdjustmentUploadError struct {
+	ConversionAdjustmentUploadError ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError `protobuf:"varint,115,opt,name=conversion_adjustment_upload_error,json=conversionAdjustmentUploadError,proto3,enum=google.ads.googleads.v3.errors.ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError,oneof"`
+}
+
+type ErrorCode_ConversionUploadError struct {
+	ConversionUploadError ConversionUploadErrorEnum_ConversionUploadError `protobuf:"varint,111,opt,name=conversion_upload_error,json=conversionUploadError,proto3,enum=google.ads.googleads.v3.errors.ConversionUploadErrorEnum_ConversionUploadError,oneof"`
+}
+
+type ErrorCode_HeaderError struct {
+	HeaderError HeaderErrorEnum_HeaderError `protobuf:"varint,66,opt,name=header_error,json=headerError,proto3,enum=google.ads.googleads.v3.errors.HeaderErrorEnum_HeaderError,oneof"`
+}
+
+type ErrorCode_DatabaseError struct {
+	DatabaseError DatabaseErrorEnum_DatabaseError `protobuf:"varint,67,opt,name=database_error,json=databaseError,proto3,enum=google.ads.googleads.v3.errors.DatabaseErrorEnum_DatabaseError,oneof"`
+}
+
+type ErrorCode_PolicyFindingError struct {
+	PolicyFindingError PolicyFindingErrorEnum_PolicyFindingError `protobuf:"varint,68,opt,name=policy_finding_error,json=policyFindingError,proto3,enum=google.ads.googleads.v3.errors.PolicyFindingErrorEnum_PolicyFindingError,oneof"`
+}
+
+type ErrorCode_EnumError struct {
+	EnumError EnumErrorEnum_EnumError `protobuf:"varint,70,opt,name=enum_error,json=enumError,proto3,enum=google.ads.googleads.v3.errors.EnumErrorEnum_EnumError,oneof"`
+}
+
+type ErrorCode_KeywordPlanError struct {
+	KeywordPlanError KeywordPlanErrorEnum_KeywordPlanError `protobuf:"varint,71,opt,name=keyword_plan_error,json=keywordPlanError,proto3,enum=google.ads.googleads.v3.errors.KeywordPlanErrorEnum_KeywordPlanError,oneof"`
+}
+
+type ErrorCode_KeywordPlanCampaignError struct {
+	KeywordPlanCampaignError KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError `protobuf:"varint,72,opt,name=keyword_plan_campaign_error,json=keywordPlanCampaignError,proto3,enum=google.ads.googleads.v3.errors.KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError,oneof"`
+}
+
+type ErrorCode_KeywordPlanNegativeKeywordError struct {
+	KeywordPlanNegativeKeywordError KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError `protobuf:"varint,73,opt,name=keyword_plan_negative_keyword_error,json=keywordPlanNegativeKeywordError,proto3,enum=google.ads.googleads.v3.errors.KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError,oneof"`
+}
+
+type ErrorCode_KeywordPlanAdGroupError struct {
+	KeywordPlanAdGroupError KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError `protobuf:"varint,74,opt,name=keyword_plan_ad_group_error,json=keywordPlanAdGroupError,proto3,enum=google.ads.googleads.v3.errors.KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError,oneof"`
+}
+
+type ErrorCode_KeywordPlanKeywordError struct {
+	KeywordPlanKeywordError KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError `protobuf:"varint,75,opt,name=keyword_plan_keyword_error,json=keywordPlanKeywordError,proto3,enum=google.ads.googleads.v3.errors.KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError,oneof"`
+}
+
+type ErrorCode_KeywordPlanIdeaError struct {
+	KeywordPlanIdeaError KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError `protobuf:"varint,76,opt,name=keyword_plan_idea_error,json=keywordPlanIdeaError,proto3,enum=google.ads.googleads.v3.errors.KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError,oneof"`
+}
+
+type ErrorCode_AccountBudgetProposalError struct {
+	AccountBudgetProposalError AccountBudgetProposalErrorEnum_AccountBudgetProposalError `protobuf:"varint,77,opt,name=account_budget_proposal_error,json=accountBudgetProposalError,proto3,enum=google.ads.googleads.v3.errors.AccountBudgetProposalErrorEnum_AccountBudgetProposalError,oneof"`
+}
+
+type ErrorCode_UserListError struct {
+	UserListError UserListErrorEnum_UserListError `protobuf:"varint,78,opt,name=user_list_error,json=userListError,proto3,enum=google.ads.googleads.v3.errors.UserListErrorEnum_UserListError,oneof"`
+}
+
+type ErrorCode_ChangeStatusError struct {
+	ChangeStatusError ChangeStatusErrorEnum_ChangeStatusError `protobuf:"varint,79,opt,name=change_status_error,json=changeStatusError,proto3,enum=google.ads.googleads.v3.errors.ChangeStatusErrorEnum_ChangeStatusError,oneof"`
+}
+
+type ErrorCode_FeedError struct {
+	FeedError FeedErrorEnum_FeedError `protobuf:"varint,80,opt,name=feed_error,json=feedError,proto3,enum=google.ads.googleads.v3.errors.FeedErrorEnum_FeedError,oneof"`
+}
+
+type ErrorCode_GeoTargetConstantSuggestionError struct {
+	GeoTargetConstantSuggestionError GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError `protobuf:"varint,81,opt,name=geo_target_constant_suggestion_error,json=geoTargetConstantSuggestionError,proto3,enum=google.ads.googleads.v3.errors.GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError,oneof"`
+}
+
+type ErrorCode_CampaignDraftError struct {
+	CampaignDraftError CampaignDraftErrorEnum_CampaignDraftError `protobuf:"varint,82,opt,name=campaign_draft_error,json=campaignDraftError,proto3,enum=google.ads.googleads.v3.errors.CampaignDraftErrorEnum_CampaignDraftError,oneof"`
+}
+
+type ErrorCode_FeedItemError struct {
+	FeedItemError FeedItemErrorEnum_FeedItemError `protobuf:"varint,83,opt,name=feed_item_error,json=feedItemError,proto3,enum=google.ads.googleads.v3.errors.FeedItemErrorEnum_FeedItemError,oneof"`
+}
+
+type ErrorCode_LabelError struct {
+	LabelError LabelErrorEnum_LabelError `protobuf:"varint,84,opt,name=label_error,json=labelError,proto3,enum=google.ads.googleads.v3.errors.LabelErrorEnum_LabelError,oneof"`
+}
+
+type ErrorCode_BillingSetupError struct {
+	BillingSetupError BillingSetupErrorEnum_BillingSetupError `protobuf:"varint,87,opt,name=billing_setup_error,json=billingSetupError,proto3,enum=google.ads.googleads.v3.errors.BillingSetupErrorEnum_BillingSetupError,oneof"`
+}
+
+type ErrorCode_CustomerClientLinkError struct {
+	CustomerClientLinkError CustomerClientLinkErrorEnum_CustomerClientLinkError `protobuf:"varint,88,opt,name=customer_client_link_error,json=customerClientLinkError,proto3,enum=google.ads.googleads.v3.errors.CustomerClientLinkErrorEnum_CustomerClientLinkError,oneof"`
+}
+
+type ErrorCode_CustomerManagerLinkError struct {
+	CustomerManagerLinkError CustomerManagerLinkErrorEnum_CustomerManagerLinkError `protobuf:"varint,91,opt,name=customer_manager_link_error,json=customerManagerLinkError,proto3,enum=google.ads.googleads.v3.errors.CustomerManagerLinkErrorEnum_CustomerManagerLinkError,oneof"`
+}
+
+type ErrorCode_FeedMappingError struct {
+	FeedMappingError FeedMappingErrorEnum_FeedMappingError `protobuf:"varint,92,opt,name=feed_mapping_error,json=feedMappingError,proto3,enum=google.ads.googleads.v3.errors.FeedMappingErrorEnum_FeedMappingError,oneof"`
+}
+
+type ErrorCode_CustomerFeedError struct {
+	CustomerFeedError CustomerFeedErrorEnum_CustomerFeedError `protobuf:"varint,93,opt,name=customer_feed_error,json=customerFeedError,proto3,enum=google.ads.googleads.v3.errors.CustomerFeedErrorEnum_CustomerFeedError,oneof"`
+}
+
+type ErrorCode_AdGroupFeedError struct {
+	AdGroupFeedError AdGroupFeedErrorEnum_AdGroupFeedError `protobuf:"varint,94,opt,name=ad_group_feed_error,json=adGroupFeedError,proto3,enum=google.ads.googleads.v3.errors.AdGroupFeedErrorEnum_AdGroupFeedError,oneof"`
+}
+
+type ErrorCode_CampaignFeedError struct {
+	CampaignFeedError CampaignFeedErrorEnum_CampaignFeedError `protobuf:"varint,96,opt,name=campaign_feed_error,json=campaignFeedError,proto3,enum=google.ads.googleads.v3.errors.CampaignFeedErrorEnum_CampaignFeedError,oneof"`
+}
+
+type ErrorCode_CustomInterestError struct {
+	CustomInterestError CustomInterestErrorEnum_CustomInterestError `protobuf:"varint,97,opt,name=custom_interest_error,json=customInterestError,proto3,enum=google.ads.googleads.v3.errors.CustomInterestErrorEnum_CustomInterestError,oneof"`
+}
+
+type ErrorCode_CampaignExperimentError struct {
+	CampaignExperimentError CampaignExperimentErrorEnum_CampaignExperimentError `protobuf:"varint,98,opt,name=campaign_experiment_error,json=campaignExperimentError,proto3,enum=google.ads.googleads.v3.errors.CampaignExperimentErrorEnum_CampaignExperimentError,oneof"`
+}
+
+type ErrorCode_ExtensionFeedItemError struct {
+	ExtensionFeedItemError ExtensionFeedItemErrorEnum_ExtensionFeedItemError `protobuf:"varint,100,opt,name=extension_feed_item_error,json=extensionFeedItemError,proto3,enum=google.ads.googleads.v3.errors.ExtensionFeedItemErrorEnum_ExtensionFeedItemError,oneof"`
+}
+
+type ErrorCode_AdParameterError struct {
+	AdParameterError AdParameterErrorEnum_AdParameterError `protobuf:"varint,101,opt,name=ad_parameter_error,json=adParameterError,proto3,enum=google.ads.googleads.v3.errors.AdParameterErrorEnum_AdParameterError,oneof"`
+}
+
+type ErrorCode_FeedItemValidationError struct {
+	FeedItemValidationError FeedItemValidationErrorEnum_FeedItemValidationError `protobuf:"varint,102,opt,name=feed_item_validation_error,json=feedItemValidationError,proto3,enum=google.ads.googleads.v3.errors.FeedItemValidationErrorEnum_FeedItemValidationError,oneof"`
+}
+
+type ErrorCode_ExtensionSettingError struct {
+	ExtensionSettingError ExtensionSettingErrorEnum_ExtensionSettingError `protobuf:"varint,103,opt,name=extension_setting_error,json=extensionSettingError,proto3,enum=google.ads.googleads.v3.errors.ExtensionSettingErrorEnum_ExtensionSettingError,oneof"`
+}
+
+type ErrorCode_FeedItemTargetError struct {
+	FeedItemTargetError FeedItemTargetErrorEnum_FeedItemTargetError `protobuf:"varint,104,opt,name=feed_item_target_error,json=feedItemTargetError,proto3,enum=google.ads.googleads.v3.errors.FeedItemTargetErrorEnum_FeedItemTargetError,oneof"`
+}
+
+type ErrorCode_PolicyViolationError struct {
+	PolicyViolationError PolicyViolationErrorEnum_PolicyViolationError `protobuf:"varint,105,opt,name=policy_violation_error,json=policyViolationError,proto3,enum=google.ads.googleads.v3.errors.PolicyViolationErrorEnum_PolicyViolationError,oneof"`
+}
+
+type ErrorCode_MutateJobError struct {
+	MutateJobError MutateJobErrorEnum_MutateJobError `protobuf:"varint,108,opt,name=mutate_job_error,json=mutateJobError,proto3,enum=google.ads.googleads.v3.errors.MutateJobErrorEnum_MutateJobError,oneof"`
+}
+
+type ErrorCode_PartialFailureError struct {
+	PartialFailureError PartialFailureErrorEnum_PartialFailureError `protobuf:"varint,112,opt,name=partial_failure_error,json=partialFailureError,proto3,enum=google.ads.googleads.v3.errors.PartialFailureErrorEnum_PartialFailureError,oneof"`
+}
+
+type ErrorCode_PolicyValidationParameterError struct {
+	PolicyValidationParameterError PolicyValidationParameterErrorEnum_PolicyValidationParameterError `protobuf:"varint,114,opt,name=policy_validation_parameter_error,json=policyValidationParameterError,proto3,enum=google.ads.googleads.v3.errors.PolicyValidationParameterErrorEnum_PolicyValidationParameterError,oneof"`
+}
+
+type ErrorCode_SizeLimitError struct {
+	SizeLimitError SizeLimitErrorEnum_SizeLimitError `protobuf:"varint,118,opt,name=size_limit_error,json=sizeLimitError,proto3,enum=google.ads.googleads.v3.errors.SizeLimitErrorEnum_SizeLimitError,oneof"`
+}
+
+type ErrorCode_NotWhitelistedError struct {
+	NotWhitelistedError NotWhitelistedErrorEnum_NotWhitelistedError `protobuf:"varint,120,opt,name=not_whitelisted_error,json=notWhitelistedError,proto3,enum=google.ads.googleads.v3.errors.NotWhitelistedErrorEnum_NotWhitelistedError,oneof"`
+}
+
+type ErrorCode_ManagerLinkError struct {
+	ManagerLinkError ManagerLinkErrorEnum_ManagerLinkError `protobuf:"varint,121,opt,name=manager_link_error,json=managerLinkError,proto3,enum=google.ads.googleads.v3.errors.ManagerLinkErrorEnum_ManagerLinkError,oneof"`
+}
+
+type ErrorCode_CurrencyCodeError struct {
+	CurrencyCodeError CurrencyCodeErrorEnum_CurrencyCodeError `protobuf:"varint,122,opt,name=currency_code_error,json=currencyCodeError,proto3,enum=google.ads.googleads.v3.errors.CurrencyCodeErrorEnum_CurrencyCodeError,oneof"`
+}
+
+type ErrorCode_AccessInvitationError struct {
+	AccessInvitationError AccessInvitationErrorEnum_AccessInvitationError `protobuf:"varint,124,opt,name=access_invitation_error,json=accessInvitationError,proto3,enum=google.ads.googleads.v3.errors.AccessInvitationErrorEnum_AccessInvitationError,oneof"`
+}
+
+type ErrorCode_ReachPlanError struct {
+	ReachPlanError ReachPlanErrorEnum_ReachPlanError `protobuf:"varint,125,opt,name=reach_plan_error,json=reachPlanError,proto3,enum=google.ads.googleads.v3.errors.ReachPlanErrorEnum_ReachPlanError,oneof"`
+}
+
+type ErrorCode_InvoiceError struct {
+	InvoiceError InvoiceErrorEnum_InvoiceError `protobuf:"varint,126,opt,name=invoice_error,json=invoiceError,proto3,enum=google.ads.googleads.v3.errors.InvoiceErrorEnum_InvoiceError,oneof"`
+}
+
+type ErrorCode_PaymentsAccountError struct {
+	PaymentsAccountError PaymentsAccountErrorEnum_PaymentsAccountError `protobuf:"varint,127,opt,name=payments_account_error,json=paymentsAccountError,proto3,enum=google.ads.googleads.v3.errors.PaymentsAccountErrorEnum_PaymentsAccountError,oneof"`
+}
+
+type ErrorCode_TimeZoneError struct {
+	TimeZoneError TimeZoneErrorEnum_TimeZoneError `protobuf:"varint,128,opt,name=time_zone_error,json=timeZoneError,proto3,enum=google.ads.googleads.v3.errors.TimeZoneErrorEnum_TimeZoneError,oneof"`
+}
+
+func (*ErrorCode_RequestError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_BiddingStrategyError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_UrlFieldError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ListOperationError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_QueryError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_MutateError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FieldMaskError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AuthorizationError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_InternalError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_QuotaError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdGroupError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CampaignBudgetError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CampaignError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AuthenticationError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdGroupCriterionError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdCustomizerError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdGroupAdError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdSharingError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdxError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AssetError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_BiddingError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CampaignCriterionError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CollectionSizeError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CountryCodeError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CriterionError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CustomerError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_DateError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_DateRangeError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_DistinctError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FeedAttributeReferenceError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FunctionError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FunctionParsingError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_IdError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ImageError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_LanguageCodeError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_MediaBundleError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_MediaUploadError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_MediaFileError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_MultiplierError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_NewResourceCreationError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_NotEmptyError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_NullError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_OperatorError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_RangeError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_RecommendationError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_RegionCodeError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_SettingError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_StringFormatError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_StringLengthError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_OperationAccessDeniedError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ResourceAccessDeniedError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ResourceCountLimitExceededError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_YoutubeVideoRegistrationError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdGroupBidModifierError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ContextError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FieldError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_SharedSetError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_SharedCriterionError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CampaignSharedSetError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ConversionActionError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ConversionAdjustmentUploadError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ConversionUploadError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_HeaderError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_DatabaseError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_PolicyFindingError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_EnumError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_KeywordPlanError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_KeywordPlanCampaignError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_KeywordPlanNegativeKeywordError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_KeywordPlanAdGroupError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_KeywordPlanKeywordError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_KeywordPlanIdeaError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AccountBudgetProposalError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_UserListError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ChangeStatusError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FeedError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_GeoTargetConstantSuggestionError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CampaignDraftError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FeedItemError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_LabelError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_BillingSetupError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CustomerClientLinkError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CustomerManagerLinkError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FeedMappingError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CustomerFeedError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdGroupFeedError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CampaignFeedError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CustomInterestError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CampaignExperimentError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ExtensionFeedItemError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AdParameterError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FeedItemValidationError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ExtensionSettingError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_FeedItemTargetError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_PolicyViolationError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_MutateJobError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_PartialFailureError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_PolicyValidationParameterError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_SizeLimitError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_NotWhitelistedError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ManagerLinkError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_CurrencyCodeError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_AccessInvitationError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_ReachPlanError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_InvoiceError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_PaymentsAccountError) isErrorCode_ErrorCode() {}
+
+func (*ErrorCode_TimeZoneError) isErrorCode_ErrorCode() {}
+
+func (m *ErrorCode) GetErrorCode() isErrorCode_ErrorCode {
+	if m != nil {
+		return m.ErrorCode
+	}
+	return nil
+}
+
+func (m *ErrorCode) GetRequestError() RequestErrorEnum_RequestError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_RequestError); ok {
+		return x.RequestError
+	}
+	return RequestErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetBiddingStrategyError() BiddingStrategyErrorEnum_BiddingStrategyError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_BiddingStrategyError); ok {
+		return x.BiddingStrategyError
+	}
+	return BiddingStrategyErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetUrlFieldError() UrlFieldErrorEnum_UrlFieldError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_UrlFieldError); ok {
+		return x.UrlFieldError
+	}
+	return UrlFieldErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetListOperationError() ListOperationErrorEnum_ListOperationError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ListOperationError); ok {
+		return x.ListOperationError
+	}
+	return ListOperationErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetQueryError() QueryErrorEnum_QueryError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_QueryError); ok {
+		return x.QueryError
+	}
+	return QueryErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetMutateError() MutateErrorEnum_MutateError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_MutateError); ok {
+		return x.MutateError
+	}
+	return MutateErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFieldMaskError() FieldMaskErrorEnum_FieldMaskError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FieldMaskError); ok {
+		return x.FieldMaskError
+	}
+	return FieldMaskErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAuthorizationError() AuthorizationErrorEnum_AuthorizationError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AuthorizationError); ok {
+		return x.AuthorizationError
+	}
+	return AuthorizationErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetInternalError() InternalErrorEnum_InternalError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_InternalError); ok {
+		return x.InternalError
+	}
+	return InternalErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetQuotaError() QuotaErrorEnum_QuotaError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_QuotaError); ok {
+		return x.QuotaError
+	}
+	return QuotaErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdError() AdErrorEnum_AdError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdError); ok {
+		return x.AdError
+	}
+	return AdErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdGroupError() AdGroupErrorEnum_AdGroupError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdGroupError); ok {
+		return x.AdGroupError
+	}
+	return AdGroupErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCampaignBudgetError() CampaignBudgetErrorEnum_CampaignBudgetError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CampaignBudgetError); ok {
+		return x.CampaignBudgetError
+	}
+	return CampaignBudgetErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCampaignError() CampaignErrorEnum_CampaignError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CampaignError); ok {
+		return x.CampaignError
+	}
+	return CampaignErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAuthenticationError() AuthenticationErrorEnum_AuthenticationError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AuthenticationError); ok {
+		return x.AuthenticationError
+	}
+	return AuthenticationErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdGroupCriterionError() AdGroupCriterionErrorEnum_AdGroupCriterionError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdGroupCriterionError); ok {
+		return x.AdGroupCriterionError
+	}
+	return AdGroupCriterionErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdCustomizerError() AdCustomizerErrorEnum_AdCustomizerError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdCustomizerError); ok {
+		return x.AdCustomizerError
+	}
+	return AdCustomizerErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdGroupAdError() AdGroupAdErrorEnum_AdGroupAdError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdGroupAdError); ok {
+		return x.AdGroupAdError
+	}
+	return AdGroupAdErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdSharingError() AdSharingErrorEnum_AdSharingError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdSharingError); ok {
+		return x.AdSharingError
+	}
+	return AdSharingErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdxError() AdxErrorEnum_AdxError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdxError); ok {
+		return x.AdxError
+	}
+	return AdxErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAssetError() AssetErrorEnum_AssetError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AssetError); ok {
+		return x.AssetError
+	}
+	return AssetErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetBiddingError() BiddingErrorEnum_BiddingError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_BiddingError); ok {
+		return x.BiddingError
+	}
+	return BiddingErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCampaignCriterionError() CampaignCriterionErrorEnum_CampaignCriterionError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CampaignCriterionError); ok {
+		return x.CampaignCriterionError
+	}
+	return CampaignCriterionErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCollectionSizeError() CollectionSizeErrorEnum_CollectionSizeError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CollectionSizeError); ok {
+		return x.CollectionSizeError
+	}
+	return CollectionSizeErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCountryCodeError() CountryCodeErrorEnum_CountryCodeError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CountryCodeError); ok {
+		return x.CountryCodeError
+	}
+	return CountryCodeErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCriterionError() CriterionErrorEnum_CriterionError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CriterionError); ok {
+		return x.CriterionError
+	}
+	return CriterionErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCustomerError() CustomerErrorEnum_CustomerError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CustomerError); ok {
+		return x.CustomerError
+	}
+	return CustomerErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetDateError() DateErrorEnum_DateError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_DateError); ok {
+		return x.DateError
+	}
+	return DateErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetDateRangeError() DateRangeErrorEnum_DateRangeError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_DateRangeError); ok {
+		return x.DateRangeError
+	}
+	return DateRangeErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetDistinctError() DistinctErrorEnum_DistinctError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_DistinctError); ok {
+		return x.DistinctError
+	}
+	return DistinctErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFeedAttributeReferenceError() FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FeedAttributeReferenceError); ok {
+		return x.FeedAttributeReferenceError
+	}
+	return FeedAttributeReferenceErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFunctionError() FunctionErrorEnum_FunctionError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FunctionError); ok {
+		return x.FunctionError
+	}
+	return FunctionErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFunctionParsingError() FunctionParsingErrorEnum_FunctionParsingError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FunctionParsingError); ok {
+		return x.FunctionParsingError
+	}
+	return FunctionParsingErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetIdError() IdErrorEnum_IdError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_IdError); ok {
+		return x.IdError
+	}
+	return IdErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetImageError() ImageErrorEnum_ImageError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ImageError); ok {
+		return x.ImageError
+	}
+	return ImageErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetLanguageCodeError() LanguageCodeErrorEnum_LanguageCodeError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_LanguageCodeError); ok {
+		return x.LanguageCodeError
+	}
+	return LanguageCodeErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetMediaBundleError() MediaBundleErrorEnum_MediaBundleError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_MediaBundleError); ok {
+		return x.MediaBundleError
+	}
+	return MediaBundleErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetMediaUploadError() MediaUploadErrorEnum_MediaUploadError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_MediaUploadError); ok {
+		return x.MediaUploadError
+	}
+	return MediaUploadErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetMediaFileError() MediaFileErrorEnum_MediaFileError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_MediaFileError); ok {
+		return x.MediaFileError
+	}
+	return MediaFileErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetMultiplierError() MultiplierErrorEnum_MultiplierError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_MultiplierError); ok {
+		return x.MultiplierError
+	}
+	return MultiplierErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetNewResourceCreationError() NewResourceCreationErrorEnum_NewResourceCreationError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_NewResourceCreationError); ok {
+		return x.NewResourceCreationError
+	}
+	return NewResourceCreationErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetNotEmptyError() NotEmptyErrorEnum_NotEmptyError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_NotEmptyError); ok {
+		return x.NotEmptyError
+	}
+	return NotEmptyErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetNullError() NullErrorEnum_NullError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_NullError); ok {
+		return x.NullError
+	}
+	return NullErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetOperatorError() OperatorErrorEnum_OperatorError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_OperatorError); ok {
+		return x.OperatorError
+	}
+	return OperatorErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetRangeError() RangeErrorEnum_RangeError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_RangeError); ok {
+		return x.RangeError
+	}
+	return RangeErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetRecommendationError() RecommendationErrorEnum_RecommendationError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_RecommendationError); ok {
+		return x.RecommendationError
+	}
+	return RecommendationErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetRegionCodeError() RegionCodeErrorEnum_RegionCodeError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_RegionCodeError); ok {
+		return x.RegionCodeError
+	}
+	return RegionCodeErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetSettingError() SettingErrorEnum_SettingError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_SettingError); ok {
+		return x.SettingError
+	}
+	return SettingErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetStringFormatError() StringFormatErrorEnum_StringFormatError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_StringFormatError); ok {
+		return x.StringFormatError
+	}
+	return StringFormatErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetStringLengthError() StringLengthErrorEnum_StringLengthError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_StringLengthError); ok {
+		return x.StringLengthError
+	}
+	return StringLengthErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetOperationAccessDeniedError() OperationAccessDeniedErrorEnum_OperationAccessDeniedError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_OperationAccessDeniedError); ok {
+		return x.OperationAccessDeniedError
+	}
+	return OperationAccessDeniedErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetResourceAccessDeniedError() ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ResourceAccessDeniedError); ok {
+		return x.ResourceAccessDeniedError
+	}
+	return ResourceAccessDeniedErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetResourceCountLimitExceededError() ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ResourceCountLimitExceededError); ok {
+		return x.ResourceCountLimitExceededError
+	}
+	return ResourceCountLimitExceededErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetYoutubeVideoRegistrationError() YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_YoutubeVideoRegistrationError); ok {
+		return x.YoutubeVideoRegistrationError
+	}
+	return YoutubeVideoRegistrationErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdGroupBidModifierError() AdGroupBidModifierErrorEnum_AdGroupBidModifierError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdGroupBidModifierError); ok {
+		return x.AdGroupBidModifierError
+	}
+	return AdGroupBidModifierErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetContextError() ContextErrorEnum_ContextError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ContextError); ok {
+		return x.ContextError
+	}
+	return ContextErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFieldError() FieldErrorEnum_FieldError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FieldError); ok {
+		return x.FieldError
+	}
+	return FieldErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetSharedSetError() SharedSetErrorEnum_SharedSetError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_SharedSetError); ok {
+		return x.SharedSetError
+	}
+	return SharedSetErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetSharedCriterionError() SharedCriterionErrorEnum_SharedCriterionError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_SharedCriterionError); ok {
+		return x.SharedCriterionError
+	}
+	return SharedCriterionErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCampaignSharedSetError() CampaignSharedSetErrorEnum_CampaignSharedSetError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CampaignSharedSetError); ok {
+		return x.CampaignSharedSetError
+	}
+	return CampaignSharedSetErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetConversionActionError() ConversionActionErrorEnum_ConversionActionError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ConversionActionError); ok {
+		return x.ConversionActionError
+	}
+	return ConversionActionErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetConversionAdjustmentUploadError() ConversionAdjustmentUploadErrorEnum_ConversionAdjustmentUploadError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ConversionAdjustmentUploadError); ok {
+		return x.ConversionAdjustmentUploadError
+	}
+	return ConversionAdjustmentUploadErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetConversionUploadError() ConversionUploadErrorEnum_ConversionUploadError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ConversionUploadError); ok {
+		return x.ConversionUploadError
+	}
+	return ConversionUploadErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetHeaderError() HeaderErrorEnum_HeaderError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_HeaderError); ok {
+		return x.HeaderError
+	}
+	return HeaderErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetDatabaseError() DatabaseErrorEnum_DatabaseError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_DatabaseError); ok {
+		return x.DatabaseError
+	}
+	return DatabaseErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetPolicyFindingError() PolicyFindingErrorEnum_PolicyFindingError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_PolicyFindingError); ok {
+		return x.PolicyFindingError
+	}
+	return PolicyFindingErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetEnumError() EnumErrorEnum_EnumError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_EnumError); ok {
+		return x.EnumError
+	}
+	return EnumErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetKeywordPlanError() KeywordPlanErrorEnum_KeywordPlanError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_KeywordPlanError); ok {
+		return x.KeywordPlanError
+	}
+	return KeywordPlanErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetKeywordPlanCampaignError() KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_KeywordPlanCampaignError); ok {
+		return x.KeywordPlanCampaignError
+	}
+	return KeywordPlanCampaignErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetKeywordPlanNegativeKeywordError() KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_KeywordPlanNegativeKeywordError); ok {
+		return x.KeywordPlanNegativeKeywordError
+	}
+	return KeywordPlanNegativeKeywordErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetKeywordPlanAdGroupError() KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_KeywordPlanAdGroupError); ok {
+		return x.KeywordPlanAdGroupError
+	}
+	return KeywordPlanAdGroupErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetKeywordPlanKeywordError() KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_KeywordPlanKeywordError); ok {
+		return x.KeywordPlanKeywordError
+	}
+	return KeywordPlanKeywordErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetKeywordPlanIdeaError() KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_KeywordPlanIdeaError); ok {
+		return x.KeywordPlanIdeaError
+	}
+	return KeywordPlanIdeaErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAccountBudgetProposalError() AccountBudgetProposalErrorEnum_AccountBudgetProposalError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AccountBudgetProposalError); ok {
+		return x.AccountBudgetProposalError
+	}
+	return AccountBudgetProposalErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetUserListError() UserListErrorEnum_UserListError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_UserListError); ok {
+		return x.UserListError
+	}
+	return UserListErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetChangeStatusError() ChangeStatusErrorEnum_ChangeStatusError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ChangeStatusError); ok {
+		return x.ChangeStatusError
+	}
+	return ChangeStatusErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFeedError() FeedErrorEnum_FeedError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FeedError); ok {
+		return x.FeedError
+	}
+	return FeedErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetGeoTargetConstantSuggestionError() GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_GeoTargetConstantSuggestionError); ok {
+		return x.GeoTargetConstantSuggestionError
+	}
+	return GeoTargetConstantSuggestionErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCampaignDraftError() CampaignDraftErrorEnum_CampaignDraftError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CampaignDraftError); ok {
+		return x.CampaignDraftError
+	}
+	return CampaignDraftErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFeedItemError() FeedItemErrorEnum_FeedItemError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FeedItemError); ok {
+		return x.FeedItemError
+	}
+	return FeedItemErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetLabelError() LabelErrorEnum_LabelError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_LabelError); ok {
+		return x.LabelError
+	}
+	return LabelErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetBillingSetupError() BillingSetupErrorEnum_BillingSetupError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_BillingSetupError); ok {
+		return x.BillingSetupError
+	}
+	return BillingSetupErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCustomerClientLinkError() CustomerClientLinkErrorEnum_CustomerClientLinkError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CustomerClientLinkError); ok {
+		return x.CustomerClientLinkError
+	}
+	return CustomerClientLinkErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCustomerManagerLinkError() CustomerManagerLinkErrorEnum_CustomerManagerLinkError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CustomerManagerLinkError); ok {
+		return x.CustomerManagerLinkError
+	}
+	return CustomerManagerLinkErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFeedMappingError() FeedMappingErrorEnum_FeedMappingError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FeedMappingError); ok {
+		return x.FeedMappingError
+	}
+	return FeedMappingErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCustomerFeedError() CustomerFeedErrorEnum_CustomerFeedError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CustomerFeedError); ok {
+		return x.CustomerFeedError
+	}
+	return CustomerFeedErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdGroupFeedError() AdGroupFeedErrorEnum_AdGroupFeedError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdGroupFeedError); ok {
+		return x.AdGroupFeedError
+	}
+	return AdGroupFeedErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCampaignFeedError() CampaignFeedErrorEnum_CampaignFeedError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CampaignFeedError); ok {
+		return x.CampaignFeedError
+	}
+	return CampaignFeedErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCustomInterestError() CustomInterestErrorEnum_CustomInterestError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CustomInterestError); ok {
+		return x.CustomInterestError
+	}
+	return CustomInterestErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCampaignExperimentError() CampaignExperimentErrorEnum_CampaignExperimentError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CampaignExperimentError); ok {
+		return x.CampaignExperimentError
+	}
+	return CampaignExperimentErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetExtensionFeedItemError() ExtensionFeedItemErrorEnum_ExtensionFeedItemError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ExtensionFeedItemError); ok {
+		return x.ExtensionFeedItemError
+	}
+	return ExtensionFeedItemErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAdParameterError() AdParameterErrorEnum_AdParameterError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AdParameterError); ok {
+		return x.AdParameterError
+	}
+	return AdParameterErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFeedItemValidationError() FeedItemValidationErrorEnum_FeedItemValidationError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FeedItemValidationError); ok {
+		return x.FeedItemValidationError
+	}
+	return FeedItemValidationErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetExtensionSettingError() ExtensionSettingErrorEnum_ExtensionSettingError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ExtensionSettingError); ok {
+		return x.ExtensionSettingError
+	}
+	return ExtensionSettingErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetFeedItemTargetError() FeedItemTargetErrorEnum_FeedItemTargetError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_FeedItemTargetError); ok {
+		return x.FeedItemTargetError
+	}
+	return FeedItemTargetErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetPolicyViolationError() PolicyViolationErrorEnum_PolicyViolationError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_PolicyViolationError); ok {
+		return x.PolicyViolationError
+	}
+	return PolicyViolationErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetMutateJobError() MutateJobErrorEnum_MutateJobError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_MutateJobError); ok {
+		return x.MutateJobError
+	}
+	return MutateJobErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetPartialFailureError() PartialFailureErrorEnum_PartialFailureError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_PartialFailureError); ok {
+		return x.PartialFailureError
+	}
+	return PartialFailureErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetPolicyValidationParameterError() PolicyValidationParameterErrorEnum_PolicyValidationParameterError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_PolicyValidationParameterError); ok {
+		return x.PolicyValidationParameterError
+	}
+	return PolicyValidationParameterErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetSizeLimitError() SizeLimitErrorEnum_SizeLimitError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_SizeLimitError); ok {
+		return x.SizeLimitError
+	}
+	return SizeLimitErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetNotWhitelistedError() NotWhitelistedErrorEnum_NotWhitelistedError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_NotWhitelistedError); ok {
+		return x.NotWhitelistedError
+	}
+	return NotWhitelistedErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetManagerLinkError() ManagerLinkErrorEnum_ManagerLinkError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ManagerLinkError); ok {
+		return x.ManagerLinkError
+	}
+	return ManagerLinkErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetCurrencyCodeError() CurrencyCodeErrorEnum_CurrencyCodeError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_CurrencyCodeError); ok {
+		return x.CurrencyCodeError
+	}
+	return CurrencyCodeErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetAccessInvitationError() AccessInvitationErrorEnum_AccessInvitationError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_AccessInvitationError); ok {
+		return x.AccessInvitationError
+	}
+	return AccessInvitationErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetReachPlanError() ReachPlanErrorEnum_ReachPlanError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_ReachPlanError); ok {
+		return x.ReachPlanError
+	}
+	return ReachPlanErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetInvoiceError() InvoiceErrorEnum_InvoiceError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_InvoiceError); ok {
+		return x.InvoiceError
+	}
+	return InvoiceErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetPaymentsAccountError() PaymentsAccountErrorEnum_PaymentsAccountError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_PaymentsAccountError); ok {
+		return x.PaymentsAccountError
+	}
+	return PaymentsAccountErrorEnum_UNSPECIFIED
+}
+
+func (m *ErrorCode) GetTimeZoneError() TimeZoneErrorEnum_TimeZoneError {
+	if x, ok := m.GetErrorCode().(*ErrorCode_TimeZoneError); ok {
+		return x.TimeZoneError
+	}
+	return TimeZoneErrorEnum_UNSPECIFIED
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ErrorCode) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ErrorCode_RequestError)(nil),
+		(*ErrorCode_BiddingStrategyError)(nil),
+		(*ErrorCode_UrlFieldError)(nil),
+		(*ErrorCode_ListOperationError)(nil),
+		(*ErrorCode_QueryError)(nil),
+		(*ErrorCode_MutateError)(nil),
+		(*ErrorCode_FieldMaskError)(nil),
+		(*ErrorCode_AuthorizationError)(nil),
+		(*ErrorCode_InternalError)(nil),
+		(*ErrorCode_QuotaError)(nil),
+		(*ErrorCode_AdError)(nil),
+		(*ErrorCode_AdGroupError)(nil),
+		(*ErrorCode_CampaignBudgetError)(nil),
+		(*ErrorCode_CampaignError)(nil),
+		(*ErrorCode_AuthenticationError)(nil),
+		(*ErrorCode_AdGroupCriterionError)(nil),
+		(*ErrorCode_AdCustomizerError)(nil),
+		(*ErrorCode_AdGroupAdError)(nil),
+		(*ErrorCode_AdSharingError)(nil),
+		(*ErrorCode_AdxError)(nil),
+		(*ErrorCode_AssetError)(nil),
+		(*ErrorCode_BiddingError)(nil),
+		(*ErrorCode_CampaignCriterionError)(nil),
+		(*ErrorCode_CollectionSizeError)(nil),
+		(*ErrorCode_CountryCodeError)(nil),
+		(*ErrorCode_CriterionError)(nil),
+		(*ErrorCode_CustomerError)(nil),
+		(*ErrorCode_DateError)(nil),
+		(*ErrorCode_DateRangeError)(nil),
+		(*ErrorCode_DistinctError)(nil),
+		(*ErrorCode_FeedAttributeReferenceError)(nil),
+		(*ErrorCode_FunctionError)(nil),
+		(*ErrorCode_FunctionParsingError)(nil),
+		(*ErrorCode_IdError)(nil),
+		(*ErrorCode_ImageError)(nil),
+		(*ErrorCode_LanguageCodeError)(nil),
+		(*ErrorCode_MediaBundleError)(nil),
+		(*ErrorCode_MediaUploadError)(nil),
+		(*ErrorCode_MediaFileError)(nil),
+		(*ErrorCode_MultiplierError)(nil),
+		(*ErrorCode_NewResourceCreationError)(nil),
+		(*ErrorCode_NotEmptyError)(nil),
+		(*ErrorCode_NullError)(nil),
+		(*ErrorCode_OperatorError)(nil),
+		(*ErrorCode_RangeError)(nil),
+		(*ErrorCode_RecommendationError)(nil),
+		(*ErrorCode_RegionCodeError)(nil),
+		(*ErrorCode_SettingError)(nil),
+		(*ErrorCode_StringFormatError)(nil),
+		(*ErrorCode_StringLengthError)(nil),
+		(*ErrorCode_OperationAccessDeniedError)(nil),
+		(*ErrorCode_ResourceAccessDeniedError)(nil),
+		(*ErrorCode_ResourceCountLimitExceededError)(nil),
+		(*ErrorCode_YoutubeVideoRegistrationError)(nil),
+		(*ErrorCode_AdGroupBidModifierError)(nil),
+		(*ErrorCode_ContextError)(nil),
+		(*ErrorCode_FieldError)(nil),
+		(*ErrorCode_SharedSetError)(nil),
+		(*ErrorCode_SharedCriterionError)(nil),
+		(*ErrorCode_CampaignSharedSetError)(nil),
+		(*ErrorCode_ConversionActionError)(nil),
+		(*ErrorCode_ConversionAdjustmentUploadError)(nil),
+		(*ErrorCode_ConversionUploadError)(nil),
+		(*ErrorCode_HeaderError)(nil),
+		(*ErrorCode_DatabaseError)(nil),
+		(*ErrorCode_PolicyFindingError)(nil),
+		(*ErrorCode_EnumError)(nil),
+		(*ErrorCode_KeywordPlanError)(nil),
+		(*ErrorCode_KeywordPlanCampaignError)(nil),
+		(*ErrorCode_KeywordPlanNegativeKeywordError)(nil),
+		(*ErrorCode_KeywordPlanAdGroupError)(nil),
+		(*ErrorCode_KeywordPlanKeywordError)(nil),
+		(*ErrorCode_KeywordPlanIdeaError)(nil),
+		(*ErrorCode_AccountBudgetProposalError)(nil),
+		(*ErrorCode_UserListError)(nil),
+		(*ErrorCode_ChangeStatusError)(nil),
+		(*ErrorCode_FeedError)(nil),
+		(*ErrorCode_GeoTargetConstantSuggestionError)(nil),
+		(*ErrorCode_CampaignDraftError)(nil),
+		(*ErrorCode_FeedItemError)(nil),
+		(*ErrorCode_LabelError)(nil),
+		(*ErrorCode_BillingSetupError)(nil),
+		(*ErrorCode_CustomerClientLinkError)(nil),
+		(*ErrorCode_CustomerManagerLinkError)(nil),
+		(*ErrorCode_FeedMappingError)(nil),
+		(*ErrorCode_CustomerFeedError)(nil),
+		(*ErrorCode_AdGroupFeedError)(nil),
+		(*ErrorCode_CampaignFeedError)(nil),
+		(*ErrorCode_CustomInterestError)(nil),
+		(*ErrorCode_CampaignExperimentError)(nil),
+		(*ErrorCode_ExtensionFeedItemError)(nil),
+		(*ErrorCode_AdParameterError)(nil),
+		(*ErrorCode_FeedItemValidationError)(nil),
+		(*ErrorCode_ExtensionSettingError)(nil),
+		(*ErrorCode_FeedItemTargetError)(nil),
+		(*ErrorCode_PolicyViolationError)(nil),
+		(*ErrorCode_MutateJobError)(nil),
+		(*ErrorCode_PartialFailureError)(nil),
+		(*ErrorCode_PolicyValidationParameterError)(nil),
+		(*ErrorCode_SizeLimitError)(nil),
+		(*ErrorCode_NotWhitelistedError)(nil),
+		(*ErrorCode_ManagerLinkError)(nil),
+		(*ErrorCode_CurrencyCodeError)(nil),
+		(*ErrorCode_AccessInvitationError)(nil),
+		(*ErrorCode_ReachPlanError)(nil),
+		(*ErrorCode_InvoiceError)(nil),
+		(*ErrorCode_PaymentsAccountError)(nil),
+		(*ErrorCode_TimeZoneError)(nil),
+	}
+}
+
+// Describes the part of the request proto that caused the error.
+type ErrorLocation struct {
+	// A field path that indicates which field was invalid in the request.
+	FieldPathElements    []*ErrorLocation_FieldPathElement `protobuf:"bytes,2,rep,name=field_path_elements,json=fieldPathElements,proto3" json:"field_path_elements,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *ErrorLocation) Reset()         { *m = ErrorLocation{} }
+func (m *ErrorLocation) String() string { return proto.CompactTextString(m) }
+func (*ErrorLocation) ProtoMessage()    {}
+func (*ErrorLocation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37c8858a8ef846f0, []int{3}
+}
+
+func (m *ErrorLocation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ErrorLocation.Unmarshal(m, b)
+}
+func (m *ErrorLocation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ErrorLocation.Marshal(b, m, deterministic)
+}
+func (m *ErrorLocation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ErrorLocation.Merge(m, src)
+}
+func (m *ErrorLocation) XXX_Size() int {
+	return xxx_messageInfo_ErrorLocation.Size(m)
+}
+func (m *ErrorLocation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ErrorLocation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ErrorLocation proto.InternalMessageInfo
+
+func (m *ErrorLocation) GetFieldPathElements() []*ErrorLocation_FieldPathElement {
+	if m != nil {
+		return m.FieldPathElements
+	}
+	return nil
+}
+
+// A part of a field path.
+type ErrorLocation_FieldPathElement struct {
+	// The name of a field or a oneof
+	FieldName string `protobuf:"bytes,1,opt,name=field_name,json=fieldName,proto3" json:"field_name,omitempty"`
+	// If field_name is a repeated field, this is the element that failed
+	Index                *wrappers.Int64Value `protobuf:"bytes,2,opt,name=index,proto3" json:"index,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *ErrorLocation_FieldPathElement) Reset()         { *m = ErrorLocation_FieldPathElement{} }
+func (m *ErrorLocation_FieldPathElement) String() string { return proto.CompactTextString(m) }
+func (*ErrorLocation_FieldPathElement) ProtoMessage()    {}
+func (*ErrorLocation_FieldPathElement) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37c8858a8ef846f0, []int{3, 0}
+}
+
+func (m *ErrorLocation_FieldPathElement) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ErrorLocation_FieldPathElement.Unmarshal(m, b)
+}
+func (m *ErrorLocation_FieldPathElement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ErrorLocation_FieldPathElement.Marshal(b, m, deterministic)
+}
+func (m *ErrorLocation_FieldPathElement) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ErrorLocation_FieldPathElement.Merge(m, src)
+}
+func (m *ErrorLocation_FieldPathElement) XXX_Size() int {
+	return xxx_messageInfo_ErrorLocation_FieldPathElement.Size(m)
+}
+func (m *ErrorLocation_FieldPathElement) XXX_DiscardUnknown() {
+	xxx_messageInfo_ErrorLocation_FieldPathElement.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ErrorLocation_FieldPathElement proto.InternalMessageInfo
+
+func (m *ErrorLocation_FieldPathElement) GetFieldName() string {
+	if m != nil {
+		return m.FieldName
+	}
+	return ""
+}
+
+func (m *ErrorLocation_FieldPathElement) GetIndex() *wrappers.Int64Value {
+	if m != nil {
+		return m.Index
+	}
+	return nil
+}
+
+// Additional error details.
+type ErrorDetails struct {
+	// The error code that should have been returned, but wasn't. This is used
+	// when the error code is InternalError.ERROR_CODE_NOT_PUBLISHED.
+	UnpublishedErrorCode string `protobuf:"bytes,1,opt,name=unpublished_error_code,json=unpublishedErrorCode,proto3" json:"unpublished_error_code,omitempty"`
+	// Describes an ad policy violation.
+	PolicyViolationDetails *PolicyViolationDetails `protobuf:"bytes,2,opt,name=policy_violation_details,json=policyViolationDetails,proto3" json:"policy_violation_details,omitempty"`
+	// Describes policy violation findings.
+	PolicyFindingDetails *PolicyFindingDetails `protobuf:"bytes,3,opt,name=policy_finding_details,json=policyFindingDetails,proto3" json:"policy_finding_details,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ErrorDetails) Reset()         { *m = ErrorDetails{} }
+func (m *ErrorDetails) String() string { return proto.CompactTextString(m) }
+func (*ErrorDetails) ProtoMessage()    {}
+func (*ErrorDetails) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37c8858a8ef846f0, []int{4}
+}
+
+func (m *ErrorDetails) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ErrorDetails.Unmarshal(m, b)
+}
+func (m *ErrorDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ErrorDetails.Marshal(b, m, deterministic)
+}
+func (m *ErrorDetails) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ErrorDetails.Merge(m, src)
+}
+func (m *ErrorDetails) XXX_Size() int {
+	return xxx_messageInfo_ErrorDetails.Size(m)
+}
+func (m *ErrorDetails) XXX_DiscardUnknown() {
+	xxx_messageInfo_ErrorDetails.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ErrorDetails proto.InternalMessageInfo
+
+func (m *ErrorDetails) GetUnpublishedErrorCode() string {
+	if m != nil {
+		return m.UnpublishedErrorCode
+	}
+	return ""
+}
+
+func (m *ErrorDetails) GetPolicyViolationDetails() *PolicyViolationDetails {
+	if m != nil {
+		return m.PolicyViolationDetails
+	}
+	return nil
+}
+
+func (m *ErrorDetails) GetPolicyFindingDetails() *PolicyFindingDetails {
+	if m != nil {
+		return m.PolicyFindingDetails
+	}
+	return nil
+}
+
+// Error returned as part of a mutate response.
+// This error indicates single policy violation by some text
+// in one of the fields.
+type PolicyViolationDetails struct {
+	// Human readable description of policy violation.
+	ExternalPolicyDescription string `protobuf:"bytes,2,opt,name=external_policy_description,json=externalPolicyDescription,proto3" json:"external_policy_description,omitempty"`
+	// Unique identifier for this violation.
+	// If policy is exemptible, this key may be used to request exemption.
+	Key *common.PolicyViolationKey `protobuf:"bytes,4,opt,name=key,proto3" json:"key,omitempty"`
+	// Human readable name of the policy.
+	ExternalPolicyName string `protobuf:"bytes,5,opt,name=external_policy_name,json=externalPolicyName,proto3" json:"external_policy_name,omitempty"`
+	// Whether user can file an exemption request for this violation.
+	IsExemptible         bool     `protobuf:"varint,6,opt,name=is_exemptible,json=isExemptible,proto3" json:"is_exemptible,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyViolationDetails) Reset()         { *m = PolicyViolationDetails{} }
+func (m *PolicyViolationDetails) String() string { return proto.CompactTextString(m) }
+func (*PolicyViolationDetails) ProtoMessage()    {}
+func (*PolicyViolationDetails) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37c8858a8ef846f0, []int{5}
+}
+
+func (m *PolicyViolationDetails) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyViolationDetails.Unmarshal(m, b)
+}
+func (m *PolicyViolationDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyViolationDetails.Marshal(b, m, deterministic)
+}
+func (m *PolicyViolationDetails) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyViolationDetails.Merge(m, src)
+}
+func (m *PolicyViolationDetails) XXX_Size() int {
+	return xxx_messageInfo_PolicyViolationDetails.Size(m)
+}
+func (m *PolicyViolationDetails) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyViolationDetails.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyViolationDetails proto.InternalMessageInfo
+
+func (m *PolicyViolationDetails) GetExternalPolicyDescription() string {
+	if m != nil {
+		return m.ExternalPolicyDescription
+	}
+	return ""
+}
+
+func (m *PolicyViolationDetails) GetKey() *common.PolicyViolationKey {
+	if m != nil {
+		return m.Key
+	}
+	return nil
+}
+
+func (m *PolicyViolationDetails) GetExternalPolicyName() string {
+	if m != nil {
+		return m.ExternalPolicyName
+	}
+	return ""
+}
+
+func (m *PolicyViolationDetails) GetIsExemptible() bool {
+	if m != nil {
+		return m.IsExemptible
+	}
+	return false
+}
+
+// Error returned as part of a mutate response.
+// This error indicates one or more policy findings in the fields of a
+// resource.
+type PolicyFindingDetails struct {
+	// The list of policy topics for the resource. Contains the PROHIBITED or
+	// FULLY_LIMITED policy topic entries that prevented the resource from being
+	// saved (among any other entries the resource may also have).
+	PolicyTopicEntries   []*common.PolicyTopicEntry `protobuf:"bytes,1,rep,name=policy_topic_entries,json=policyTopicEntries,proto3" json:"policy_topic_entries,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *PolicyFindingDetails) Reset()         { *m = PolicyFindingDetails{} }
+func (m *PolicyFindingDetails) String() string { return proto.CompactTextString(m) }
+func (*PolicyFindingDetails) ProtoMessage()    {}
+func (*PolicyFindingDetails) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37c8858a8ef846f0, []int{6}
+}
+
+func (m *PolicyFindingDetails) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyFindingDetails.Unmarshal(m, b)
+}
+func (m *PolicyFindingDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyFindingDetails.Marshal(b, m, deterministic)
+}
+func (m *PolicyFindingDetails) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyFindingDetails.Merge(m, src)
+}
+func (m *PolicyFindingDetails) XXX_Size() int {
+	return xxx_messageInfo_PolicyFindingDetails.Size(m)
+}
+func (m *PolicyFindingDetails) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyFindingDetails.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyFindingDetails proto.InternalMessageInfo
+
+func (m *PolicyFindingDetails) GetPolicyTopicEntries() []*common.PolicyTopicEntry {
+	if m != nil {
+		return m.PolicyTopicEntries
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*GoogleAdsFailure)(nil), "google.ads.googleads.v3.errors.GoogleAdsFailure")
+	proto.RegisterType((*GoogleAdsError)(nil), "google.ads.googleads.v3.errors.GoogleAdsError")
+	proto.RegisterType((*ErrorCode)(nil), "google.ads.googleads.v3.errors.ErrorCode")
+	proto.RegisterType((*ErrorLocation)(nil), "google.ads.googleads.v3.errors.ErrorLocation")
+	proto.RegisterType((*ErrorLocation_FieldPathElement)(nil), "google.ads.googleads.v3.errors.ErrorLocation.FieldPathElement")
+	proto.RegisterType((*ErrorDetails)(nil), "google.ads.googleads.v3.errors.ErrorDetails")
+	proto.RegisterType((*PolicyViolationDetails)(nil), "google.ads.googleads.v3.errors.PolicyViolationDetails")
+	proto.RegisterType((*PolicyFindingDetails)(nil), "google.ads.googleads.v3.errors.PolicyFindingDetails")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/errors.proto", fileDescriptor_37c8858a8ef846f0)
+}
+
+var fileDescriptor_37c8858a8ef846f0 = []byte{
+	// 4302 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x5c, 0xcd, 0x73, 0x1c, 0x37,
+	0x76, 0x9f, 0x91, 0x63, 0x5b, 0x82, 0x24, 0x4a, 0x6a, 0xc9, 0x32, 0x2c, 0xad, 0xbd, 0x5a, 0x7a,
+	0x37, 0x51, 0x36, 0x6b, 0xd2, 0x26, 0x65, 0xc9, 0xa2, 0x6c, 0xcb, 0xc3, 0x2f, 0x0d, 0xd7, 0x94,
+	0x4c, 0x37, 0x65, 0x79, 0xd7, 0xab, 0x64, 0x8c, 0xe9, 0xc6, 0x0c, 0x61, 0xf6, 0x97, 0xfb, 0x83,
+	0x22, 0x59, 0xeb, 0x64, 0x93, 0xaa, 0xa4, 0x2a, 0xa9, 0x4a, 0xaa, 0x92, 0x54, 0xe5, 0x90, 0x43,
+	0x0e, 0x3e, 0xee, 0x21, 0x87, 0xe4, 0x90, 0x4b, 0xfe, 0x80, 0x54, 0xfe, 0x8f, 0xe4, 0x90, 0x7b,
+	0xee, 0x29, 0xa0, 0xbf, 0xf0, 0x35, 0x03, 0x74, 0x4e, 0x64, 0xff, 0x80, 0xdf, 0x7b, 0x68, 0x34,
+	0xf0, 0xf0, 0x80, 0x87, 0x37, 0xe0, 0x0f, 0xa6, 0x71, 0x3c, 0x0d, 0xf0, 0x32, 0xf2, 0xb3, 0xe5,
+	0xf2, 0x5f, 0xfa, 0xdf, 0xd1, 0xea, 0x32, 0x4e, 0xd3, 0x38, 0xcd, 0xaa, 0x3f, 0x4b, 0x49, 0x1a,
+	0xe7, 0xb1, 0xf3, 0x56, 0x59, 0x63, 0x09, 0xf9, 0xd9, 0x52, 0x53, 0x79, 0xe9, 0x68, 0x75, 0xa9,
+	0xac, 0x75, 0x63, 0xa6, 0x30, 0x2f, 0x0e, 0xc3, 0x38, 0x5a, 0x4e, 0xe2, 0x80, 0x78, 0x27, 0xa5,
+	0xb0, 0x1b, 0x3f, 0x35, 0x54, 0x3e, 0x42, 0x41, 0x81, 0xab, 0xba, 0x1f, 0x1a, 0x5a, 0x89, 0x3c,
+	0x0f, 0x67, 0xd9, 0x88, 0x44, 0x47, 0x24, 0x47, 0x39, 0x89, 0xa3, 0x11, 0x2b, 0xa8, 0xd8, 0xeb,
+	0x66, 0x76, 0x5c, 0x44, 0xf9, 0x68, 0x5c, 0xf8, 0x53, 0x9c, 0x8f, 0x92, 0x34, 0x4e, 0xe2, 0x0c,
+	0x05, 0x82, 0x8c, 0x0f, 0x4c, 0x32, 0xfc, 0x91, 0x57, 0x64, 0x79, 0x1c, 0x92, 0x53, 0x9c, 0x0a,
+	0xcc, 0x77, 0xcc, 0x4c, 0xbe, 0xfa, 0x5d, 0x73, 0xf5, 0x69, 0x1a, 0x17, 0xc9, 0x48, 0xe2, 0x7d,
+	0x62, 0xcb, 0x1b, 0x13, 0x7f, 0x14, 0xc6, 0x3e, 0x99, 0x10, 0xa9, 0xa1, 0x1f, 0xd9, 0x4a, 0xf0,
+	0x52, 0x92, 0xe3, 0x54, 0xee, 0xe5, 0x55, 0x5b, 0x7a, 0xc7, 0x6e, 0x2d, 0x49, 0x13, 0x8c, 0xc5,
+	0xf7, 0xbd, 0x67, 0x66, 0x26, 0x28, 0x45, 0x21, 0xce, 0xa5, 0xd7, 0x7c, 0xdf, 0x4c, 0xcc, 0x0e,
+	0x50, 0x4a, 0xa2, 0xa9, 0x40, 0x5b, 0x32, 0xd2, 0x8e, 0x85, 0xfa, 0xef, 0x9a, 0xea, 0x67, 0x19,
+	0xce, 0x05, 0xc6, 0x7d, 0x13, 0xa3, 0xc8, 0x0f, 0x70, 0x94, 0x13, 0x4f, 0x1d, 0xe1, 0x1f, 0x58,
+	0x50, 0xe3, 0x94, 0x9c, 0xaa, 0xcc, 0x15, 0x03, 0x73, 0x4c, 0x7c, 0x5f, 0xee, 0x8a, 0x07, 0x96,
+	0x9c, 0x2c, 0x4f, 0x51, 0x8e, 0xa7, 0x27, 0x9d, 0x9a, 0x3a, 0x26, 0x41, 0xc0, 0xc8, 0x38, 0x97,
+	0xc6, 0xca, 0x9a, 0x81, 0xe9, 0xa1, 0x30, 0x41, 0x64, 0x1a, 0xd5, 0xf3, 0xb8, 0xcb, 0xd8, 0x6e,
+	0xb8, 0xfa, 0xb1, 0x7d, 0xdf, 0x96, 0xee, 0xa7, 0x68, 0x92, 0x77, 0x9a, 0x16, 0x0d, 0x95, 0x27,
+	0x7d, 0x6c, 0x4d, 0x3a, 0x4e, 0x70, 0x4a, 0x42, 0x1c, 0xe5, 0x9d, 0x3a, 0xb9, 0xe1, 0x2b, 0xd3,
+	0xca, 0x5a, 0x33, 0x9d, 0x23, 0xd8, 0x1f, 0xc9, 0x83, 0xd8, 0xa8, 0xf9, 0x00, 0x45, 0x53, 0x3c,
+	0xca, 0x72, 0x94, 0x17, 0x59, 0xb7, 0xcf, 0x1b, 0x07, 0x01, 0xf6, 0xd8, 0x00, 0xce, 0xc8, 0x29,
+	0xee, 0x34, 0x8a, 0xbd, 0x38, 0xca, 0xf1, 0xb1, 0xd8, 0xd2, 0x0f, 0xcd, 0x9c, 0x23, 0x9c, 0x66,
+	0x54, 0x1f, 0xf2, 0x94, 0x79, 0xf3, 0xa8, 0x03, 0xdb, 0xff, 0xa6, 0xc8, 0x72, 0xf6, 0x8d, 0x8a,
+	0x24, 0x88, 0x25, 0xbb, 0xdd, 0xa1, 0x19, 0x1a, 0xf6, 0x3d, 0x23, 0xbb, 0x88, 0xf2, 0xf4, 0x64,
+	0xe4, 0xc5, 0xbe, 0xd8, 0x63, 0x77, 0x4c, 0x44, 0xed, 0x3c, 0x30, 0x7e, 0xdd, 0x22, 0x4d, 0x71,
+	0xe4, 0x69, 0xf4, 0x19, 0xbf, 0x2e, 0x5b, 0x3c, 0x47, 0x24, 0xca, 0x71, 0x8a, 0x33, 0xf1, 0x4b,
+	0x3d, 0xb4, 0xe2, 0xe2, 0x74, 0xe4, 0x05, 0x84, 0xf6, 0x72, 0x40, 0xa2, 0xc3, 0x6e, 0x73, 0xb0,
+	0x16, 0xd0, 0xed, 0x5d, 0x2b, 0x92, 0x32, 0x87, 0x3e, 0xb1, 0x65, 0x86, 0x28, 0x42, 0x53, 0x9c,
+	0x76, 0x6f, 0xb0, 0x8f, 0x72, 0x34, 0x46, 0x99, 0xd8, 0xc5, 0xcb, 0x66, 0x12, 0xee, 0xb4, 0x12,
+	0x32, 0x42, 0xca, 0xe6, 0x6b, 0xa7, 0xc6, 0x91, 0x2c, 0x27, 0x91, 0x97, 0x77, 0x6a, 0x1c, 0x8e,
+	0x8a, 0xb0, 0x93, 0x21, 0xc2, 0xc7, 0x39, 0x8e, 0xd8, 0xb4, 0x60, 0xfd, 0x4f, 0x72, 0x1c, 0x76,
+	0x9a, 0x57, 0x2d, 0x3f, 0xc3, 0x79, 0x2e, 0x2f, 0x71, 0x1b, 0x06, 0x36, 0xd3, 0x89, 0xf2, 0x3c,
+	0x25, 0xe3, 0x82, 0x76, 0x12, 0x9e, 0x60, 0x3a, 0xf0, 0xbb, 0x7d, 0x10, 0x65, 0xe0, 0xdc, 0xb1,
+	0x21, 0x28, 0x6f, 0xfa, 0xc0, 0x9a, 0x95, 0xa3, 0x54, 0x5e, 0x18, 0x1f, 0x5a, 0x93, 0x8f, 0x50,
+	0x40, 0x7c, 0xd5, 0x81, 0xb8, 0x67, 0x23, 0x20, 0x44, 0x49, 0x22, 0x77, 0xb1, 0xc9, 0x41, 0x9a,
+	0x10, 0x1c, 0xf8, 0x9d, 0xc6, 0x6b, 0xc9, 0x08, 0x51, 0xd6, 0x6d, 0x32, 0x4d, 0x8a, 0x48, 0xb5,
+	0xef, 0x0f, 0x6c, 0x49, 0x09, 0x4a, 0x33, 0xf9, 0xd5, 0x76, 0x0c, 0xe4, 0x29, 0x8e, 0xeb, 0x6f,
+	0xe1, 0xc5, 0x51, 0x96, 0xa3, 0x28, 0x1f, 0x65, 0xc5, 0x74, 0x8a, 0x33, 0xa5, 0x1d, 0xef, 0x19,
+	0x44, 0x1d, 0x60, 0xe4, 0x77, 0xdc, 0x70, 0x10, 0xbf, 0xd3, 0x77, 0x20, 0x21, 0xea, 0x68, 0x00,
+	0x98, 0x11, 0x8f, 0xa4, 0x0d, 0xd4, 0x8a, 0x91, 0x74, 0x14, 0x13, 0x69, 0x02, 0x99, 0x0c, 0xe9,
+	0x21, 0x3e, 0x79, 0x11, 0xa7, 0xfe, 0x28, 0x09, 0x10, 0x5d, 0x66, 0x35, 0xfb, 0x8b, 0x4e, 0x12,
+	0xb4, 0xae, 0xd8, 0xbd, 0x2e, 0x12, 0xba, 0x18, 0x20, 0x81, 0x48, 0x7c, 0x8c, 0x3a, 0xcd, 0x4b,
+	0x81, 0x5d, 0x3f, 0xf0, 0x02, 0x86, 0x5d, 0x04, 0x44, 0x78, 0x8a, 0x72, 0x72, 0x84, 0xb5, 0x92,
+	0x4c, 0x03, 0x24, 0x40, 0x63, 0xdc, 0x6d, 0xb3, 0x1c, 0xa0, 0x68, 0x5a, 0xd0, 0x51, 0xa5, 0xb8,
+	0x09, 0x26, 0x47, 0x3b, 0x20, 0x59, 0x3e, 0x8a, 0x13, 0x9c, 0x76, 0x37, 0x44, 0x33, 0x17, 0x5b,
+	0x23, 0x11, 0xfb, 0x04, 0x8d, 0xc6, 0x45, 0xe4, 0x07, 0xdd, 0xd6, 0xcf, 0x92, 0x38, 0x21, 0x12,
+	0xcd, 0x4e, 0x9f, 0xc6, 0xd9, 0x33, 0xea, 0x2b, 0x82, 0x9c, 0x24, 0x81, 0xbc, 0xaf, 0x7f, 0xcf,
+	0x48, 0xcb, 0xbb, 0x7a, 0x06, 0x15, 0xe5, 0x9b, 0x78, 0xdc, 0x69, 0xb6, 0x45, 0xf8, 0xc5, 0x28,
+	0xc5, 0x59, 0x5c, 0xa4, 0x1e, 0x1e, 0x79, 0x29, 0x56, 0x3f, 0xa2, 0x69, 0x05, 0x8c, 0xe2, 0x7c,
+	0x84, 0xc3, 0x24, 0x3f, 0xe9, 0xe4, 0x5c, 0x52, 0xd6, 0x8b, 0x03, 0x92, 0x63, 0x3a, 0x7c, 0xa4,
+	0x35, 0xd7, 0xb4, 0x48, 0x47, 0x45, 0x10, 0x74, 0x3a, 0x4d, 0x6a, 0x47, 0x67, 0x75, 0x2a, 0xe5,
+	0xe3, 0x88, 0x48, 0x4a, 0x57, 0xad, 0x64, 0xc4, 0x69, 0xa7, 0xb7, 0x4c, 0x50, 0x9a, 0x13, 0x14,
+	0x8c, 0x26, 0x88, 0x04, 0x45, 0x8a, 0x3b, 0x2d, 0x67, 0x09, 0x3a, 0xa1, 0x1b, 0x94, 0x6c, 0x54,
+	0x9f, 0x85, 0x75, 0x99, 0x94, 0xe5, 0xb1, 0xde, 0x68, 0x42, 0x22, 0xe5, 0xa8, 0x60, 0xdb, 0x8e,
+	0xca, 0xf9, 0x16, 0xfa, 0x43, 0x9b, 0x07, 0x96, 0x72, 0x48, 0x1c, 0xa8, 0x83, 0xca, 0x64, 0xc0,
+	0xbe, 0x2d, 0x70, 0x7a, 0xd2, 0x91, 0x11, 0xe7, 0xa8, 0x13, 0x43, 0x75, 0xa3, 0x4d, 0x73, 0x2c,
+	0xc5, 0xc8, 0x3b, 0x50, 0x97, 0x95, 0xfb, 0x46, 0x9a, 0x17, 0x87, 0x21, 0x8e, 0x34, 0xae, 0xda,
+	0x5d, 0x23, 0x75, 0x4a, 0x29, 0x8a, 0x51, 0x5e, 0x31, 0xf2, 0xbe, 0x2d, 0xe4, 0x3d, 0xdb, 0xc0,
+	0xc8, 0xa9, 0xcc, 0xc0, 0xec, 0x49, 0x32, 0xb4, 0x15, 0x51, 0x8e, 0xd8, 0x80, 0x84, 0x24, 0x1f,
+	0xe1, 0x63, 0x0f, 0x63, 0x5f, 0x92, 0x64, 0x7a, 0x01, 0xdd, 0x0e, 0xc0, 0x34, 0xe2, 0xaa, 0xf3,
+	0x0f, 0xfd, 0x3e, 0xf9, 0x7d, 0x3b, 0xb2, 0x7c, 0x78, 0x62, 0xa4, 0x91, 0x53, 0x5c, 0xbf, 0x67,
+	0x87, 0xe5, 0x36, 0xcb, 0xd9, 0x69, 0xe6, 0x24, 0x4e, 0x43, 0xf4, 0xff, 0x62, 0x06, 0x38, 0x9a,
+	0xe6, 0x07, 0x9d, 0x0c, 0x75, 0x4e, 0x42, 0x3c, 0x3a, 0x8d, 0xa3, 0x6e, 0xa7, 0x0e, 0x45, 0x1a,
+	0x8c, 0x54, 0xbf, 0xdf, 0xc8, 0xca, 0xd8, 0xb2, 0x2e, 0x8d, 0xc0, 0x2d, 0x03, 0xeb, 0x24, 0x2e,
+	0xf2, 0x62, 0x8c, 0x47, 0x47, 0xc4, 0xc7, 0xf1, 0x88, 0x8e, 0x7d, 0x76, 0x5e, 0x29, 0x7f, 0xca,
+	0x2a, 0xe6, 0xb1, 0xcc, 0x9e, 0xc6, 0xc5, 0x64, 0xf9, 0x45, 0x8a, 0x92, 0x04, 0xd7, 0x31, 0x91,
+	0x1b, 0x3f, 0xa8, 0xd5, 0x24, 0x64, 0x19, 0x45, 0x51, 0x5c, 0xc6, 0x1f, 0xaa, 0xd2, 0xc5, 0xaf,
+	0xc0, 0xe5, 0x47, 0xac, 0x7c, 0xe0, 0x67, 0xdb, 0xa5, 0x5d, 0x76, 0xb6, 0xc1, 0x2b, 0x65, 0x13,
+	0x60, 0xff, 0xd6, 0x4b, 0xb7, 0xcf, 0xaf, 0x2c, 0x2d, 0xcd, 0x0f, 0xab, 0x2c, 0x35, 0x12, 0xb6,
+	0xe8, 0xb3, 0x5b, 0xb1, 0x17, 0xff, 0xe3, 0x0c, 0x58, 0x10, 0x8b, 0x9c, 0x21, 0x00, 0xac, 0x90,
+	0xcd, 0x61, 0xd8, 0xbf, 0xd5, 0xbf, 0x7d, 0x7e, 0xe5, 0xf7, 0x4d, 0xe2, 0x19, 0x75, 0x23, 0xf6,
+	0xb1, 0x7b, 0x0e, 0xd7, 0xff, 0x3a, 0x10, 0xbc, 0x1a, 0xe2, 0x2c, 0x43, 0x53, 0x0c, 0xcf, 0xdc,
+	0xea, 0xdf, 0x3e, 0xe7, 0xd6, 0x8f, 0xce, 0x43, 0xf0, 0x6a, 0x9e, 0x92, 0xe9, 0x14, 0xa7, 0xf0,
+	0x25, 0xa6, 0xe0, 0x27, 0x33, 0x15, 0x94, 0x91, 0x9c, 0xa5, 0x67, 0x28, 0x28, 0xb0, 0x5b, 0xb3,
+	0x9c, 0x1d, 0x70, 0x36, 0x88, 0xcb, 0x43, 0x6c, 0xf8, 0x3b, 0x4c, 0xc2, 0x3b, 0x56, 0x4d, 0xdc,
+	0xad, 0x48, 0x6e, 0x43, 0x77, 0xb6, 0xc1, 0xab, 0x3e, 0xce, 0x11, 0x09, 0x32, 0xf8, 0x32, 0x93,
+	0xf4, 0x33, 0x2b, 0x49, 0x9b, 0x25, 0xc7, 0xad, 0xc9, 0x8b, 0xff, 0x7e, 0x00, 0xce, 0x35, 0xdd,
+	0xe0, 0xf8, 0xe0, 0xa2, 0x60, 0xd2, 0x58, 0x47, 0x2e, 0xac, 0x7c, 0x64, 0x92, 0xed, 0x96, 0x24,
+	0x26, 0x68, 0x2b, 0x2a, 0x42, 0x01, 0x18, 0xf6, 0xdc, 0x0b, 0x29, 0xf7, 0xec, 0xfc, 0x79, 0x1f,
+	0x5c, 0xd7, 0x9f, 0x94, 0xb3, 0x1e, 0x5f, 0x58, 0x79, 0x6c, 0xd2, 0xb7, 0x5e, 0xb2, 0xf7, 0x2b,
+	0x72, 0xab, 0x57, 0x57, 0x30, 0xec, 0xb9, 0xd7, 0xc6, 0x1a, 0xdc, 0x21, 0xe0, 0x92, 0x34, 0xed,
+	0xd8, 0x77, 0x5d, 0x58, 0x79, 0x68, 0xd2, 0xff, 0x45, 0x1a, 0x6c, 0x53, 0x56, 0xab, 0x58, 0x40,
+	0x86, 0x3d, 0xf7, 0x62, 0xc1, 0x03, 0xce, 0x77, 0xe0, 0x9a, 0xce, 0x81, 0x67, 0xa3, 0x60, 0x61,
+	0x65, 0xc7, 0xa4, 0x6f, 0x97, 0x64, 0xf9, 0x67, 0x35, 0xb5, 0x55, 0xaa, 0xc2, 0xc3, 0x9e, 0xeb,
+	0x04, 0x0a, 0xea, 0x3c, 0x07, 0xe7, 0xb9, 0xa5, 0x9e, 0x8d, 0x98, 0x85, 0x95, 0xfb, 0x26, 0xad,
+	0x9f, 0x53, 0x4a, 0xab, 0xad, 0x7d, 0x1c, 0xf6, 0x5c, 0xf0, 0x6d, 0xf3, 0xe4, 0x7c, 0x0d, 0x2e,
+	0xf0, 0x9e, 0x34, 0x7c, 0x95, 0x89, 0x7f, 0x60, 0x12, 0xff, 0x98, 0x71, 0x5a, 0xf9, 0xdc, 0xf3,
+	0xb0, 0xe7, 0x9e, 0x0f, 0xdb, 0x47, 0x27, 0x04, 0x97, 0xe5, 0x23, 0x0e, 0x78, 0x96, 0x69, 0x19,
+	0x98, 0xb4, 0xb0, 0x8f, 0xf0, 0x18, 0x65, 0x87, 0xad, 0x22, 0x11, 0x1a, 0xf6, 0xdc, 0x85, 0x89,
+	0x80, 0x38, 0xbf, 0x06, 0x57, 0x35, 0x71, 0x23, 0x78, 0xce, 0xee, 0x63, 0x0d, 0x78, 0x6a, 0xab,
+	0x55, 0x85, 0xe9, 0xc7, 0x42, 0x0a, 0xea, 0x1c, 0x80, 0x05, 0xf1, 0x1c, 0x01, 0x02, 0xbb, 0x51,
+	0xb9, 0x53, 0xb1, 0x5a, 0x9d, 0x02, 0x42, 0x47, 0x25, 0xe1, 0x81, 0x72, 0x58, 0x34, 0xfe, 0x1c,
+	0x3c, 0x6f, 0x3b, 0x2c, 0xe2, 0x1c, 0xf1, 0xc3, 0xa2, 0x7e, 0x2c, 0x87, 0x45, 0xfd, 0xe4, 0xec,
+	0x81, 0xb3, 0xf5, 0x36, 0x0e, 0x5e, 0x60, 0xa2, 0x57, 0x8d, 0x5d, 0xc7, 0xcd, 0xa8, 0x41, 0x33,
+	0x97, 0x5e, 0x45, 0xd5, 0x2c, 0xc2, 0x60, 0x41, 0x3c, 0xeb, 0x80, 0x17, 0xed, 0xec, 0xd3, 0xc0,
+	0x7f, 0x44, 0x49, 0xbc, 0xf0, 0x16, 0xa0, 0xf6, 0x09, 0x71, 0xcf, 0xce, 0x9f, 0xf6, 0xc1, 0x6b,
+	0xda, 0x90, 0x1a, 0x5c, 0x60, 0xea, 0x3e, 0x35, 0xa9, 0xdb, 0xa8, 0xc8, 0xeb, 0x8c, 0xdb, 0x6a,
+	0xd5, 0xe0, 0xc3, 0x9e, 0x7b, 0xd5, 0x53, 0x61, 0x3a, 0x08, 0xc4, 0x43, 0x19, 0x78, 0xc9, 0x6e,
+	0x10, 0xd4, 0x3a, 0x54, 0xad, 0xcd, 0x20, 0xf0, 0x78, 0xc0, 0xf9, 0x4d, 0x1f, 0x5c, 0xd3, 0x05,
+	0x58, 0xe1, 0x15, 0xbb, 0x97, 0x1d, 0x08, 0x5c, 0x71, 0xbc, 0x4b, 0x38, 0x7d, 0x59, 0xa4, 0xc2,
+	0xce, 0x5f, 0xf5, 0x01, 0x9c, 0x15, 0x63, 0x87, 0x0e, 0x6b, 0xc6, 0x67, 0x96, 0x9f, 0x78, 0xa3,
+	0x66, 0x2b, 0xdf, 0x5a, 0x2c, 0x19, 0xf6, 0xdc, 0xd7, 0x90, 0xae, 0xc0, 0x39, 0x01, 0x57, 0x35,
+	0x57, 0x1a, 0xe0, 0x55, 0xd6, 0x8c, 0x47, 0xe6, 0x66, 0x6c, 0x34, 0x4c, 0xbe, 0x09, 0x12, 0x3a,
+	0xec, 0xb9, 0x57, 0x90, 0x0c, 0x3a, 0x11, 0xb8, 0xa2, 0x5c, 0x72, 0x80, 0xaf, 0xd9, 0xd9, 0xb9,
+	0xea, 0x2d, 0xc5, 0x19, 0xc4, 0x43, 0xd4, 0xce, 0x21, 0x01, 0xa1, 0x66, 0x55, 0x8e, 0xf9, 0x43,
+	0x68, 0xab, 0x6e, 0xbf, 0xa4, 0xf1, 0xea, 0x78, 0xa8, 0x54, 0xc7, 0x23, 0xce, 0x53, 0x70, 0xae,
+	0xb9, 0x2b, 0x00, 0xdf, 0x60, 0x7a, 0xde, 0x37, 0xeb, 0x39, 0xe6, 0x35, 0x1c, 0xd7, 0xb2, 0xcf,
+	0xa2, 0xea, 0x7f, 0x6a, 0xc4, 0xb8, 0x1b, 0x05, 0xf0, 0xd0, 0xce, 0x88, 0x0d, 0x28, 0x85, 0x93,
+	0xdc, 0x3c, 0x52, 0x23, 0x86, 0x9a, 0x27, 0xea, 0x11, 0x09, 0x17, 0x01, 0xe0, 0x0d, 0x3b, 0x8b,
+	0x53, 0x39, 0x22, 0x8a, 0x67, 0xd2, 0x58, 0x9c, 0x31, 0xf7, 0xec, 0xfc, 0x75, 0x1f, 0xc0, 0x59,
+	0x81, 0x78, 0xf8, 0x26, 0xd3, 0xf8, 0xb9, 0xed, 0xc4, 0xd7, 0xcc, 0x00, 0x7d, 0xd1, 0xb0, 0xe7,
+	0x5e, 0xf7, 0xb4, 0x25, 0xa5, 0x05, 0xd4, 0x45, 0x9d, 0xe1, 0x0f, 0x2d, 0x2d, 0x60, 0x43, 0xde,
+	0x27, 0xa7, 0xdc, 0x1a, 0xaf, 0xc1, 0x99, 0x05, 0x54, 0x61, 0xa7, 0x00, 0x8e, 0x1a, 0xc3, 0x85,
+	0x21, 0xd3, 0xbf, 0x65, 0xd6, 0xcf, 0x98, 0xd4, 0xa9, 0xe5, 0x95, 0x8b, 0xe0, 0xb0, 0xe7, 0x5e,
+	0xf6, 0x24, 0xcc, 0x09, 0xc0, 0x25, 0xf9, 0x03, 0xdc, 0xb2, 0x9b, 0x12, 0xba, 0x8e, 0x97, 0x3b,
+	0x7c, 0xc1, 0x13, 0x3b, 0x9a, 0x9a, 0x79, 0x21, 0x04, 0x0b, 0xbf, 0xb2, 0x34, 0xf3, 0x15, 0x8b,
+	0xd3, 0xc5, 0x23, 0xcc, 0xcc, 0xf3, 0x80, 0xf3, 0x0b, 0x00, 0xda, 0x30, 0x28, 0xfc, 0x11, 0xd3,
+	0x72, 0xcf, 0xa4, 0x65, 0x53, 0x70, 0xd0, 0x36, 0x39, 0xf7, 0xec, 0x9c, 0xcf, 0x3b, 0x67, 0x72,
+	0xbc, 0x14, 0x2e, 0xda, 0x75, 0x19, 0x95, 0xe8, 0x52, 0x9a, 0xa8, 0xa4, 0x85, 0x68, 0x97, 0xf9,
+	0x02, 0x42, 0xbb, 0x4c, 0x8c, 0xb3, 0xc2, 0xb7, 0xed, 0xba, 0x6c, 0xb3, 0x62, 0x71, 0xba, 0x78,
+	0x84, 0x76, 0x99, 0xcf, 0x03, 0xce, 0xf7, 0x7d, 0xf0, 0xd6, 0xfc, 0x70, 0x27, 0xfc, 0x31, 0x53,
+	0xfd, 0x2b, 0xa3, 0x13, 0x8a, 0xb1, 0x3f, 0xa8, 0x85, 0xb8, 0xb5, 0x0c, 0xce, 0x23, 0x9d, 0x5d,
+	0x3e, 0xec, 0xb9, 0x37, 0x27, 0xb3, 0x8b, 0x69, 0x77, 0x88, 0x61, 0x3c, 0xf8, 0x13, 0xbb, 0xee,
+	0xd8, 0xae, 0x58, 0x5c, 0x2b, 0x78, 0x84, 0x76, 0xc7, 0x84, 0x07, 0xd8, 0xb6, 0x4d, 0x1f, 0xfc,
+	0x83, 0xbf, 0x6b, 0xb7, 0x6d, 0xab, 0x15, 0xec, 0x95, 0x64, 0x55, 0x33, 0x5f, 0x40, 0xb7, 0x6d,
+	0x13, 0x0d, 0x4e, 0xfd, 0xca, 0x3a, 0x90, 0x07, 0x7f, 0xcf, 0xce, 0xaf, 0xdc, 0xe1, 0x56, 0xc5,
+	0x9d, 0xd6, 0xaf, 0x24, 0x7e, 0xb3, 0x84, 0x70, 0xb1, 0x3e, 0x78, 0xdb, 0x6e, 0x09, 0xd9, 0xa1,
+	0x14, 0x4e, 0x6e, 0xf3, 0x48, 0x97, 0x10, 0xd2, 0x3c, 0x51, 0x87, 0x42, 0x13, 0xf6, 0x81, 0x91,
+	0x9d, 0x43, 0xb1, 0x5b, 0x51, 0x45, 0x53, 0xa6, 0xa0, 0xd4, 0xa1, 0x08, 0x64, 0x90, 0xda, 0x50,
+	0x35, 0x86, 0x03, 0x7f, 0x6a, 0x67, 0x43, 0x1f, 0x53, 0xe6, 0x3a, 0x23, 0x72, 0x9b, 0x34, 0x09,
+	0xa4, 0x36, 0x34, 0x94, 0xb0, 0x56, 0x2d, 0x1f, 0xca, 0x81, 0x79, 0x07, 0xb5, 0x5f, 0x30, 0xa2,
+	0xa4, 0x96, 0x03, 0x1b, 0xb5, 0x1c, 0x46, 0x0d, 0x91, 0x1c, 0x78, 0x82, 0xcf, 0xec, 0x0c, 0x11,
+	0x93, 0xbf, 0x4d, 0x94, 0x37, 0x6d, 0x20, 0x6a, 0x88, 0x42, 0x01, 0x71, 0x12, 0x70, 0x59, 0x8e,
+	0x3b, 0xc1, 0x9f, 0x31, 0x75, 0x1b, 0xe6, 0xad, 0x6f, 0xcd, 0xe3, 0xb7, 0xbf, 0x02, 0x36, 0xec,
+	0xb9, 0x97, 0x42, 0x11, 0x72, 0xfe, 0xa1, 0x0f, 0x6e, 0xce, 0x89, 0x24, 0xc1, 0x77, 0x98, 0xf6,
+	0x2f, 0x4c, 0xda, 0x9f, 0xe0, 0x17, 0x6e, 0x25, 0x61, 0xa3, 0x12, 0xd0, 0x36, 0x63, 0x56, 0xe1,
+	0xb0, 0xe7, 0xc2, 0x68, 0x46, 0x99, 0x43, 0xc0, 0x25, 0x29, 0x3e, 0x05, 0x97, 0xec, 0xac, 0xd0,
+	0x93, 0x38, 0xdf, 0xa2, 0x2c, 0xae, 0x01, 0x3c, 0x42, 0xad, 0x50, 0xc4, 0x03, 0x74, 0x1d, 0x6b,
+	0x03, 0x53, 0x70, 0xd9, 0x6e, 0x1d, 0x7b, 0x52, 0x04, 0xdc, 0xae, 0xb8, 0x79, 0xa2, 0xeb, 0x58,
+	0x54, 0x3f, 0x50, 0x4b, 0x2a, 0x46, 0x9f, 0xe0, 0xbb, 0x76, 0xef, 0xf0, 0x59, 0xc5, 0x6a, 0x35,
+	0x08, 0x08, 0x7d, 0x87, 0x98, 0x07, 0xa8, 0xbd, 0xe1, 0x17, 0xcb, 0xf7, 0xec, 0xec, 0x8d, 0xb4,
+	0x50, 0x0a, 0x8b, 0x24, 0x48, 0xdb, 0x05, 0x92, 0x6e, 0xe8, 0x74, 0xb1, 0x10, 0xb8, 0x66, 0xe7,
+	0xbb, 0xb9, 0x02, 0x97, 0x3f, 0xd3, 0x53, 0x70, 0xea, 0xbb, 0xa5, 0x2a, 0xec, 0x7c, 0x0b, 0xae,
+	0x28, 0x21, 0x15, 0xb8, 0x6a, 0x37, 0x37, 0x5c, 0x46, 0x14, 0xcd, 0x9d, 0x84, 0xd1, 0xb9, 0x91,
+	0x8a, 0x10, 0x75, 0xd4, 0x85, 0x60, 0x06, 0xbc, 0x63, 0xe7, 0xa8, 0xef, 0x97, 0xa4, 0x56, 0x17,
+	0x0f, 0x50, 0x47, 0x3d, 0xe3, 0x9e, 0xa9, 0x2d, 0xd7, 0xc4, 0x14, 0xe0, 0xfb, 0x76, 0xb6, 0x7c,
+	0x9f, 0x51, 0xb7, 0x19, 0x93, 0x53, 0x28, 0xa3, 0xd4, 0x96, 0x67, 0x32, 0xc8, 0xa9, 0xe6, 0x83,
+	0x12, 0xf0, 0x6e, 0x17, 0xd5, 0xbb, 0x8c, 0x29, 0xab, 0xe6, 0xd0, 0x56, 0x35, 0x07, 0x3a, 0xff,
+	0xd4, 0x07, 0x6f, 0xce, 0x0d, 0xee, 0xc2, 0x7b, 0xac, 0x15, 0xbf, 0xb4, 0x9b, 0x29, 0x24, 0x8e,
+	0x06, 0x4c, 0xc6, 0x26, 0x13, 0x21, 0x4f, 0x1b, 0x5d, 0xf1, 0xb0, 0xe7, 0xde, 0x88, 0x67, 0x96,
+	0x3a, 0xff, 0xd8, 0x07, 0x3f, 0x98, 0x17, 0x57, 0x83, 0x1f, 0xb0, 0xf6, 0x7d, 0x69, 0x1e, 0x7b,
+	0xa5, 0x0c, 0x7d, 0xf3, 0x66, 0x96, 0x0e, 0x7b, 0xee, 0x1b, 0xe9, 0xac, 0x42, 0xe7, 0x5f, 0xfb,
+	0xe0, 0x6d, 0x8b, 0x88, 0x1d, 0xbc, 0xcf, 0xda, 0xe8, 0xd9, 0xb6, 0x91, 0xed, 0x66, 0x76, 0xa9,
+	0xa0, 0xad, 0x4a, 0x8e, 0xda, 0xd2, 0x19, 0x75, 0x86, 0x3d, 0xf7, 0x87, 0xe9, 0xfc, 0x2a, 0xce,
+	0x6f, 0xfb, 0xe0, 0x96, 0x29, 0x50, 0x04, 0x0b, 0xd6, 0xe4, 0x91, 0xa9, 0xc9, 0xbf, 0x2c, 0xe5,
+	0x3c, 0xa3, 0x62, 0x5c, 0x4e, 0x4a, 0xdb, 0xe0, 0xb9, 0x35, 0x86, 0x3d, 0xf7, 0xcd, 0x93, 0x79,
+	0x15, 0x9c, 0xbf, 0xef, 0x83, 0x9b, 0x73, 0xd2, 0x3c, 0xe0, 0x03, 0xd6, 0xce, 0x7d, 0xcb, 0x33,
+	0x94, 0x75, 0xe2, 0x3f, 0xae, 0xf8, 0xca, 0x61, 0x8a, 0x5c, 0x36, 0xec, 0xb9, 0xaf, 0x23, 0x7d,
+	0x11, 0x35, 0x49, 0xc2, 0xf5, 0x6b, 0xf8, 0xa1, 0x9d, 0x49, 0xda, 0x28, 0x49, 0xfc, 0xc6, 0xb5,
+	0x05, 0xa8, 0x49, 0xf2, 0xb8, 0x67, 0xba, 0x98, 0xf0, 0x11, 0x8c, 0x8f, 0xec, 0x16, 0x13, 0x29,
+	0x7c, 0x21, 0xc4, 0x2e, 0xc0, 0xa4, 0x0d, 0x5c, 0x84, 0xe0, 0xb2, 0x1c, 0xb2, 0x85, 0x1f, 0xdb,
+	0xf9, 0x54, 0xfb, 0x8c, 0xb7, 0xcf, 0x1f, 0xb3, 0x88, 0x10, 0xf5, 0xa9, 0x32, 0x01, 0x61, 0x7b,
+	0x0c, 0x7d, 0x7c, 0x19, 0x3e, 0xb4, 0xdb, 0x63, 0x94, 0x2a, 0x34, 0x7b, 0x71, 0x5d, 0x01, 0xdd,
+	0x63, 0x64, 0x1a, 0xdc, 0xf9, 0x9b, 0x3e, 0x78, 0x63, 0xe6, 0x85, 0x7f, 0xf8, 0x49, 0xb7, 0x13,
+	0x19, 0x4d, 0x47, 0xe8, 0x8b, 0xf8, 0x13, 0x19, 0xb1, 0xc4, 0xf9, 0xcb, 0x3e, 0x78, 0x7d, 0xc6,
+	0xbd, 0x7c, 0x38, 0xb0, 0x3b, 0x21, 0xdd, 0x68, 0xe8, 0x03, 0x69, 0xe3, 0xa7, 0x2d, 0x19, 0xf6,
+	0xdc, 0xd7, 0x3c, 0x5d, 0x81, 0xf3, 0x2f, 0x7d, 0xb0, 0x68, 0xbe, 0xe5, 0x0f, 0x33, 0x3b, 0x7b,
+	0xc6, 0x29, 0x6f, 0x04, 0xc9, 0xee, 0xbf, 0xa1, 0x0e, 0xb5, 0x67, 0xde, 0xfc, 0x2a, 0x72, 0x07,
+	0x0a, 0x2d, 0x8d, 0xbb, 0x76, 0xe0, 0xec, 0xf6, 0x89, 0xad, 0xe2, 0x3a, 0x90, 0x6f, 0xcb, 0xd7,
+	0xe0, 0x02, 0x7f, 0x7b, 0x15, 0xae, 0xdb, 0x05, 0xcc, 0x86, 0x8c, 0xd3, 0x6a, 0xe5, 0x9e, 0x87,
+	0x3d, 0xf7, 0xfc, 0x41, 0xfb, 0xc8, 0x0e, 0x49, 0x84, 0x9b, 0xf2, 0x70, 0xc3, 0xf2, 0x90, 0xa4,
+	0x62, 0x09, 0x07, 0x32, 0x2d, 0xc2, 0x0e, 0x49, 0x78, 0xc0, 0xf9, 0x0e, 0x5c, 0xd3, 0xdd, 0x82,
+	0x82, 0x9b, 0x76, 0xc1, 0xb2, 0x3d, 0xc6, 0xdd, 0x2e, 0xa9, 0xad, 0x52, 0x15, 0x1e, 0xf6, 0x5c,
+	0x27, 0x51, 0x50, 0xba, 0x1d, 0x68, 0x2f, 0xd0, 0xc3, 0x6d, 0xbb, 0xed, 0x00, 0x55, 0xd1, 0xea,
+	0x6a, 0x9e, 0xe8, 0x76, 0x00, 0xd7, 0x0f, 0x74, 0x13, 0xab, 0xde, 0x70, 0x85, 0x8f, 0xec, 0x36,
+	0xb1, 0x9f, 0x96, 0xcc, 0xbd, 0x00, 0x71, 0xd3, 0x4c, 0x06, 0xe9, 0x26, 0xf6, 0x50, 0xc2, 0xd8,
+	0x1e, 0x6f, 0xce, 0xdd, 0x5c, 0x38, 0xb4, 0xdb, 0xe3, 0x71, 0xba, 0xd4, 0x88, 0xd0, 0xac, 0x42,
+	0xba, 0xc7, 0x3b, 0x9c, 0x51, 0xc6, 0xdc, 0x18, 0x8b, 0xab, 0xb3, 0x70, 0xc7, 0x6e, 0xda, 0x73,
+	0x6d, 0x78, 0x52, 0x09, 0xaa, 0x20, 0x6d, 0x3b, 0x75, 0x75, 0xe8, 0xb4, 0x3f, 0x9c, 0x5f, 0x85,
+	0x79, 0x06, 0x73, 0x2e, 0x4b, 0xc3, 0x9f, 0xdb, 0x79, 0x06, 0x5c, 0x4b, 0x94, 0x58, 0xe2, 0x8c,
+	0x32, 0xea, 0x19, 0x1c, 0xea, 0x8b, 0x9c, 0xbf, 0xeb, 0x83, 0x1b, 0xb3, 0xef, 0x31, 0xc3, 0x4f,
+	0x3b, 0x37, 0x6a, 0x5e, 0xd7, 0x49, 0x5d, 0xc6, 0x37, 0x4a, 0xe8, 0xaa, 0xbf, 0xe8, 0x83, 0xd7,
+	0x67, 0x5c, 0xcd, 0x86, 0xbb, 0x76, 0x8b, 0x2f, 0xa7, 0x75, 0xc7, 0xc7, 0x48, 0xdb, 0x9c, 0xa6,
+	0x80, 0x2e, 0xbe, 0x87, 0x1a, 0x9c, 0x6d, 0x37, 0xe6, 0x66, 0x26, 0xc3, 0xc7, 0x76, 0xdb, 0x8d,
+	0x41, 0x29, 0xa4, 0x8c, 0xab, 0xee, 0x55, 0x22, 0x38, 0x97, 0x6e, 0x66, 0x31, 0xdd, 0x6e, 0xa0,
+	0x99, 0xa5, 0xec, 0xe2, 0x88, 0x78, 0xf3, 0x0a, 0x3e, 0xb1, 0xbc, 0x38, 0x92, 0xe1, 0x74, 0x97,
+	0xf0, 0x37, 0x65, 0x04, 0x84, 0x5d, 0x1c, 0xe1, 0x01, 0xba, 0xeb, 0xd3, 0x24, 0x0e, 0xc2, 0xcf,
+	0xec, 0x76, 0x7d, 0x1b, 0x8c, 0xba, 0xcf, 0x98, 0xdc, 0x6a, 0x25, 0xa3, 0x74, 0xd7, 0xe7, 0xc9,
+	0x20, 0x35, 0xad, 0x6d, 0x9e, 0x0e, 0xdc, 0xb3, 0x33, 0xad, 0xdb, 0x98, 0xdf, 0x87, 0x34, 0x4f,
+	0xd4, 0xb4, 0x4e, 0xea, 0x07, 0xe7, 0xdf, 0xfa, 0xe0, 0xc7, 0x36, 0x99, 0x20, 0xf0, 0x73, 0xa6,
+	0x14, 0x1b, 0xaf, 0x89, 0xe1, 0xf8, 0x29, 0x13, 0xb5, 0x51, 0x49, 0xda, 0x6f, 0x04, 0xb5, 0x6d,
+	0x31, 0x55, 0x1a, 0xf6, 0xdc, 0x5b, 0x53, 0x43, 0x1d, 0xba, 0xda, 0xe9, 0x32, 0x5e, 0xa1, 0x6b,
+	0xb7, 0xda, 0xd5, 0x16, 0x75, 0x93, 0x52, 0x55, 0x6f, 0xb0, 0x85, 0xe9, 0x6a, 0xe7, 0x29, 0x28,
+	0x1d, 0x78, 0x52, 0x26, 0x14, 0xdc, 0xb7, 0x3c, 0xed, 0xc7, 0xd8, 0xdf, 0xc9, 0x71, 0x28, 0x7e,
+	0x9b, 0x06, 0x61, 0xa7, 0xfd, 0x3c, 0x40, 0xb7, 0x15, 0x5c, 0x7a, 0x03, 0x7c, 0x6a, 0xb7, 0xad,
+	0xd8, 0xa5, 0x14, 0xfe, 0x98, 0xba, 0x7e, 0xa4, 0xdb, 0x8a, 0xa0, 0x79, 0xa2, 0xc3, 0x5a, 0x93,
+	0xee, 0x0c, 0xbf, 0xb4, 0x1b, 0xd6, 0xeb, 0x25, 0x75, 0x9f, 0x32, 0xf9, 0x08, 0xab, 0x84, 0xd2,
+	0x61, 0x3d, 0x96, 0x41, 0x66, 0x7b, 0x67, 0xe7, 0x4d, 0xc2, 0x5f, 0xd8, 0xd9, 0xde, 0x3a, 0xda,
+	0xb6, 0xc1, 0x04, 0xec, 0x92, 0xe8, 0x50, 0x8d, 0xc4, 0x49, 0x65, 0xd4, 0xf6, 0x7a, 0xfa, 0x22,
+	0xb6, 0xea, 0xcf, 0x49, 0x8e, 0x84, 0xbf, 0xb2, 0x5b, 0xf5, 0x6b, 0xcd, 0x8f, 0x4b, 0x09, 0xfa,
+	0x66, 0xc9, 0x85, 0x74, 0xd5, 0xf7, 0x66, 0x94, 0x51, 0x2f, 0x48, 0xcd, 0x63, 0x83, 0xcf, 0xed,
+	0xbc, 0x20, 0x3a, 0xc4, 0x1e, 0x97, 0x44, 0x71, 0xdc, 0xf1, 0x20, 0xf5, 0x82, 0x26, 0x12, 0xc6,
+	0xcc, 0x9e, 0x9a, 0x65, 0x0a, 0xff, 0xd0, 0xd2, 0xec, 0x55, 0x54, 0xd1, 0x18, 0x29, 0x28, 0x33,
+	0x7b, 0x32, 0xe8, 0x1c, 0xb1, 0xfb, 0x1f, 0xf2, 0x6f, 0x2f, 0xc0, 0x3f, 0xb2, 0x7b, 0xe5, 0x6a,
+	0x99, 0x17, 0x35, 0xcb, 0x20, 0x7d, 0x65, 0x24, 0x61, 0xec, 0x95, 0xd5, 0xe4, 0x74, 0xf8, 0xb5,
+	0xe5, 0x2b, 0x57, 0x54, 0xe9, 0x95, 0x65, 0x94, 0xbd, 0xb2, 0x0c, 0x96, 0xe1, 0x7e, 0x5d, 0x1a,
+	0x32, 0x44, 0x96, 0xe1, 0x7e, 0x46, 0xde, 0xa9, 0xb8, 0x72, 0x97, 0x0b, 0x38, 0x0b, 0xf7, 0xab,
+	0xb0, 0xf3, 0xb7, 0xfc, 0x8e, 0x5b, 0x4e, 0xee, 0x87, 0x63, 0xcb, 0x59, 0x59, 0x7b, 0xac, 0x0d,
+	0x5f, 0x73, 0x0d, 0x4a, 0x2c, 0x63, 0xb3, 0x52, 0x5f, 0xc4, 0x4e, 0x01, 0x66, 0x66, 0xdb, 0x42,
+	0xdf, 0xee, 0x14, 0x60, 0xab, 0x16, 0xa0, 0x9a, 0x60, 0x7d, 0xd1, 0xb0, 0xe7, 0x5e, 0xc7, 0xda,
+	0x12, 0x3a, 0x1b, 0xd5, 0x5f, 0xf7, 0x80, 0xd8, 0x76, 0x68, 0xee, 0xd5, 0x44, 0x7e, 0x68, 0x8a,
+	0x60, 0x39, 0x34, 0x45, 0x8c, 0x99, 0xcc, 0xd9, 0xe9, 0xb0, 0x70, 0x62, 0xf7, 0x71, 0xea, 0x57,
+	0x79, 0xd6, 0xf0, 0xd5, 0xc5, 0x48, 0x2a, 0xa3, 0x1f, 0x67, 0xa2, 0x2f, 0x62, 0x1b, 0xfa, 0x19,
+	0xa9, 0xcc, 0x70, 0x6a, 0xb7, 0xa1, 0x6f, 0xfa, 0x5f, 0x09, 0x02, 0x68, 0x4b, 0xe8, 0x86, 0x1e,
+	0xeb, 0x0a, 0x9c, 0x3f, 0xeb, 0x83, 0xeb, 0xfa, 0x64, 0x63, 0x78, 0x60, 0x37, 0x83, 0xea, 0x0e,
+	0x28, 0xdd, 0x0f, 0xb5, 0x63, 0x38, 0x9c, 0xce, 0xa0, 0x89, 0x0a, 0xb3, 0xb3, 0x33, 0x7d, 0x36,
+	0x10, 0x24, 0x76, 0xee, 0x7b, 0xb9, 0xeb, 0x7e, 0x56, 0x93, 0xe5, 0xed, 0xb8, 0x58, 0x40, 0xdd,
+	0xf7, 0x44, 0x83, 0xb3, 0x30, 0xac, 0x94, 0x25, 0x07, 0x03, 0xcb, 0x30, 0x2c, 0xe3, 0xfd, 0x3c,
+	0x1e, 0xcb, 0xb7, 0x82, 0x6b, 0x88, 0x85, 0x61, 0x05, 0x84, 0x19, 0x2f, 0x6d, 0x02, 0x18, 0x4c,
+	0xec, 0xba, 0x7e, 0xaf, 0x24, 0x57, 0x49, 0x0a, 0xdc, 0x4b, 0xab, 0x38, 0xed, 0xfa, 0x44, 0x85,
+	0x9d, 0x7f, 0xee, 0x83, 0x1f, 0x19, 0x13, 0xba, 0x60, 0xca, 0xda, 0x83, 0x2c, 0xbf, 0x42, 0x23,
+	0x47, 0x33, 0x6b, 0xe7, 0x57, 0x19, 0xf6, 0xdc, 0xb7, 0x92, 0xb9, 0x35, 0xd8, 0xb1, 0xae, 0x94,
+	0x52, 0x03, 0x8f, 0x2c, 0x8f, 0x75, 0xc9, 0x29, 0x2e, 0xe3, 0x05, 0xed, 0xd1, 0xaa, 0x00, 0xb1,
+	0x63, 0x5d, 0x01, 0x61, 0xdf, 0x48, 0x9b, 0x8a, 0x08, 0x8f, 0xed, 0xbe, 0xd1, 0x93, 0x38, 0xff,
+	0xb2, 0xe5, 0x0a, 0xc1, 0x62, 0x19, 0xa7, 0xdf, 0x28, 0x52, 0x61, 0x76, 0x29, 0x41, 0x75, 0xac,
+	0x4e, 0x2c, 0x2f, 0x25, 0xe8, 0x1c, 0x2a, 0x8d, 0x23, 0x75, 0x39, 0x94, 0x1d, 0x28, 0xe6, 0xc9,
+	0x28, 0xbf, 0x0d, 0x02, 0x4f, 0x6d, 0x3d, 0x99, 0x92, 0x2a, 0x5d, 0x64, 0x93, 0xd1, 0xd2, 0x93,
+	0x91, 0x40, 0x66, 0x21, 0x67, 0xfc, 0x3e, 0x18, 0xfc, 0xb5, 0xe5, 0xad, 0x5a, 0x46, 0xdf, 0x69,
+	0xd8, 0xc2, 0xe6, 0x59, 0x2d, 0x61, 0xb7, 0x6a, 0x75, 0x05, 0x74, 0xc0, 0xc9, 0x69, 0x7d, 0xf0,
+	0x3b, 0xbb, 0x01, 0xe7, 0x52, 0x9e, 0x78, 0x92, 0x26, 0x42, 0x74, 0xc0, 0xa5, 0x02, 0xe2, 0xf8,
+	0xe0, 0xa2, 0x90, 0x56, 0x0f, 0xff, 0xd8, 0x2e, 0xf4, 0xb2, 0x53, 0x92, 0xf8, 0x1b, 0xf4, 0x2d,
+	0x30, 0xec, 0xb9, 0x17, 0x08, 0xf7, 0x5c, 0x5a, 0x5c, 0x6d, 0xfe, 0x28, 0xfc, 0x13, 0x4b, 0x8b,
+	0x5b, 0xb1, 0xab, 0xa3, 0x08, 0xde, 0xf8, 0xa8, 0x05, 0xcc, 0xe2, 0x6a, 0x70, 0xe7, 0x1b, 0x70,
+	0x49, 0xca, 0x3a, 0x83, 0xbf, 0xe9, 0xdb, 0xed, 0x0b, 0x9f, 0x92, 0x10, 0x7f, 0x15, 0x47, 0xdc,
+	0x1b, 0x0b, 0x08, 0xdd, 0x17, 0xe6, 0x3c, 0xb0, 0x7e, 0x81, 0x4f, 0xb4, 0x5a, 0xfc, 0xaf, 0x3e,
+	0xb8, 0x28, 0xa4, 0x28, 0x39, 0x11, 0xb8, 0x5a, 0x86, 0xa3, 0x12, 0x94, 0x1f, 0x8c, 0x70, 0x80,
+	0x59, 0x73, 0xe1, 0x19, 0x96, 0xf0, 0xf5, 0x71, 0xa7, 0x74, 0xa7, 0x32, 0x2a, 0xb5, 0x87, 0xf2,
+	0x83, 0xad, 0x52, 0x8c, 0x7b, 0x65, 0x22, 0x21, 0xd9, 0x0d, 0x1f, 0x5c, 0x96, 0xab, 0x39, 0x6f,
+	0x82, 0x32, 0x84, 0x35, 0x8a, 0x50, 0x58, 0x26, 0x83, 0x9d, 0x73, 0xcf, 0x31, 0xe4, 0x09, 0x0a,
+	0xb1, 0xf3, 0x1e, 0x78, 0x99, 0x44, 0x3e, 0x3e, 0x66, 0xd9, 0x46, 0xe7, 0x57, 0x6e, 0xd6, 0x8d,
+	0xaa, 0x13, 0xdd, 0x96, 0x76, 0xa2, 0xfc, 0xee, 0x9d, 0x32, 0x77, 0xab, 0xac, 0xb9, 0xf8, 0xfd,
+	0x19, 0x70, 0x81, 0x4f, 0xa0, 0x72, 0xee, 0x80, 0xeb, 0x45, 0x94, 0x14, 0xe3, 0x80, 0x64, 0x07,
+	0xb5, 0x31, 0x6b, 0x73, 0xcf, 0xce, 0xb9, 0xd7, 0xb8, 0xd2, 0x36, 0xbf, 0x2a, 0x01, 0x50, 0x59,
+	0xa1, 0xeb, 0x34, 0xae, 0xb2, 0x31, 0x77, 0x3b, 0xae, 0xd1, 0x75, 0x42, 0xd7, 0xf5, 0x44, 0x8b,
+	0x3b, 0xdf, 0x34, 0x3e, 0x41, 0x7d, 0x3c, 0x5f, 0xeb, 0x2b, 0x53, 0xd8, 0xee, 0x74, 0x3a, 0xa0,
+	0xaf, 0xb5, 0x5d, 0x4b, 0x34, 0xe8, 0xe2, 0xff, 0xf6, 0xc1, 0x75, 0x7d, 0xf3, 0x9c, 0x8f, 0xc1,
+	0x4d, 0xea, 0x39, 0xb1, 0x9c, 0x96, 0xaa, 0x3d, 0x3e, 0xce, 0xbc, 0x94, 0x24, 0x2c, 0x19, 0xae,
+	0x4c, 0xb4, 0x7b, 0xa3, 0xae, 0x52, 0x0a, 0xd9, 0x6c, 0x2b, 0x38, 0x9b, 0xe0, 0xa5, 0x43, 0x7c,
+	0x52, 0x25, 0xcd, 0xad, 0x98, 0xd2, 0xee, 0xa4, 0x46, 0x7c, 0x8a, 0x4f, 0x5c, 0x4a, 0x77, 0xde,
+	0x05, 0xd7, 0xe4, 0x56, 0xb0, 0x11, 0xf2, 0x32, 0x53, 0xef, 0x88, 0xea, 0xd9, 0x50, 0x79, 0x1b,
+	0x5c, 0x24, 0xd9, 0x08, 0x1f, 0xe3, 0x30, 0xc9, 0xc9, 0x38, 0xc0, 0xf0, 0x95, 0x5b, 0xfd, 0xdb,
+	0x67, 0xdd, 0x0b, 0x24, 0xdb, 0x6a, 0xb0, 0xc5, 0x53, 0x70, 0x4d, 0xd7, 0x4b, 0xce, 0xb8, 0x09,
+	0x8d, 0xe4, 0x71, 0x42, 0xbc, 0x11, 0x8e, 0xf2, 0x94, 0xe0, 0x3a, 0xf9, 0xf1, 0x5d, 0xbb, 0xb7,
+	0x78, 0x4a, 0xa9, 0x5b, 0x51, 0x9e, 0x9e, 0xd4, 0xf1, 0x8f, 0x06, 0x21, 0x38, 0x5b, 0xff, 0x6f,
+	0x16, 0x8b, 0x0b, 0x0d, 0x5f, 0x71, 0xfd, 0x3c, 0x1b, 0x83, 0xd9, 0x1e, 0x1d, 0xe1, 0x7b, 0xfd,
+	0xaf, 0x36, 0xab, 0xea, 0xd3, 0x38, 0x40, 0xd1, 0x74, 0x29, 0x4e, 0xa7, 0xcb, 0x53, 0x1c, 0xb1,
+	0xf1, 0x5f, 0x67, 0x8c, 0x26, 0x24, 0x9b, 0x95, 0x40, 0xfa, 0xa0, 0xfc, 0xf3, 0xfd, 0x99, 0x97,
+	0x1e, 0x0d, 0x06, 0xbf, 0x3d, 0xf3, 0x56, 0x99, 0x8a, 0xb9, 0x34, 0xf0, 0xb9, 0x84, 0xcd, 0xa5,
+	0x67, 0xab, 0xe5, 0x64, 0xce, 0xfe, 0xb3, 0xae, 0xf0, 0x7c, 0xe0, 0x67, 0xcf, 0x9b, 0x0a, 0xcf,
+	0x9f, 0xad, 0x3e, 0x2f, 0x2b, 0xfc, 0xcf, 0x99, 0xc5, 0x12, 0x5d, 0x5b, 0x1b, 0xf8, 0xd9, 0xda,
+	0x5a, 0x53, 0x65, 0x6d, 0xed, 0xd9, 0xea, 0xda, 0x5a, 0x59, 0x69, 0xfc, 0x0a, 0x6b, 0xdd, 0xea,
+	0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x1d, 0x00, 0x9a, 0xb7, 0x53, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/extension_feed_item_error.pb.go b/googleapis/ads/googleads/v3/errors/extension_feed_item_error.pb.go
new file mode 100644
index 0000000..ab021be
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/extension_feed_item_error.pb.go
@@ -0,0 +1,359 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/extension_feed_item_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible extension feed item errors.
+type ExtensionFeedItemErrorEnum_ExtensionFeedItemError int32
+
+const (
+	// Enum unspecified.
+	ExtensionFeedItemErrorEnum_UNSPECIFIED ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 0
+	// The received error code is not known in this version.
+	ExtensionFeedItemErrorEnum_UNKNOWN ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 1
+	// Value is not within the accepted range.
+	ExtensionFeedItemErrorEnum_VALUE_OUT_OF_RANGE ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 2
+	// Url list is too long.
+	ExtensionFeedItemErrorEnum_URL_LIST_TOO_LONG ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 3
+	// Cannot have a geo targeting restriction without having geo targeting.
+	ExtensionFeedItemErrorEnum_CANNOT_HAVE_RESTRICTION_ON_EMPTY_GEO_TARGETING ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 4
+	// Cannot simultaneously set sitelink field with final urls.
+	ExtensionFeedItemErrorEnum_CANNOT_SET_WITH_FINAL_URLS ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 5
+	// Must set field with final urls.
+	ExtensionFeedItemErrorEnum_CANNOT_SET_WITHOUT_FINAL_URLS ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 6
+	// Phone number for a call extension is invalid.
+	ExtensionFeedItemErrorEnum_INVALID_PHONE_NUMBER ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 7
+	// Phone number for a call extension is not supported for the given country
+	// code.
+	ExtensionFeedItemErrorEnum_PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 8
+	// A carrier specific number in short format is not allowed for call
+	// extensions.
+	ExtensionFeedItemErrorEnum_CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 9
+	// Premium rate numbers are not allowed for call extensions.
+	ExtensionFeedItemErrorEnum_PREMIUM_RATE_NUMBER_NOT_ALLOWED ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 10
+	// Phone number type for a call extension is not allowed.
+	// For example, personal number is not allowed for a call extension in
+	// most regions.
+	ExtensionFeedItemErrorEnum_DISALLOWED_NUMBER_TYPE ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 11
+	// Phone number for a call extension does not meet domestic format
+	// requirements.
+	ExtensionFeedItemErrorEnum_INVALID_DOMESTIC_PHONE_NUMBER_FORMAT ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 12
+	// Vanity phone numbers (i.e. those including letters) are not allowed for
+	// call extensions.
+	ExtensionFeedItemErrorEnum_VANITY_PHONE_NUMBER_NOT_ALLOWED ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 13
+	// Call conversion action provided for a call extension is invalid.
+	ExtensionFeedItemErrorEnum_INVALID_CALL_CONVERSION_ACTION ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 14
+	// For a call extension, the customer is not whitelisted for call tracking.
+	ExtensionFeedItemErrorEnum_CUSTOMER_NOT_WHITELISTED_FOR_CALLTRACKING ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 15
+	// Call tracking is not supported for the given country for a call
+	// extension.
+	ExtensionFeedItemErrorEnum_CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 16
+	// Customer hasn't consented for call recording, which is required for
+	// creating/updating call feed items. Please see
+	// https://support.google.com/google-ads/answer/7412639.
+	ExtensionFeedItemErrorEnum_CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 17
+	// App id provided for an app extension is invalid.
+	ExtensionFeedItemErrorEnum_INVALID_APP_ID ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 18
+	// Quotation marks present in the review text for a review extension.
+	ExtensionFeedItemErrorEnum_QUOTES_IN_REVIEW_EXTENSION_SNIPPET ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 19
+	// Hyphen character present in the review text for a review extension.
+	ExtensionFeedItemErrorEnum_HYPHENS_IN_REVIEW_EXTENSION_SNIPPET ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 20
+	// A blacklisted review source name or url was provided for a review
+	// extension.
+	ExtensionFeedItemErrorEnum_REVIEW_EXTENSION_SOURCE_INELIGIBLE ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 21
+	// Review source name should not be found in the review text.
+	ExtensionFeedItemErrorEnum_SOURCE_NAME_IN_REVIEW_EXTENSION_TEXT ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 22
+	// Inconsistent currency codes.
+	ExtensionFeedItemErrorEnum_INCONSISTENT_CURRENCY_CODES ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 23
+	// Price extension cannot have duplicated headers.
+	ExtensionFeedItemErrorEnum_PRICE_EXTENSION_HAS_DUPLICATED_HEADERS ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 24
+	// Price item cannot have duplicated header and description.
+	ExtensionFeedItemErrorEnum_PRICE_ITEM_HAS_DUPLICATED_HEADER_AND_DESCRIPTION ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 25
+	// Price extension has too few items.
+	ExtensionFeedItemErrorEnum_PRICE_EXTENSION_HAS_TOO_FEW_ITEMS ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 26
+	// Price extension has too many items.
+	ExtensionFeedItemErrorEnum_PRICE_EXTENSION_HAS_TOO_MANY_ITEMS ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 27
+	// The input value is not currently supported.
+	ExtensionFeedItemErrorEnum_UNSUPPORTED_VALUE ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 28
+	// The input value is not currently supported in the selected language of an
+	// extension.
+	ExtensionFeedItemErrorEnum_UNSUPPORTED_VALUE_IN_SELECTED_LANGUAGE ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 29
+	// Unknown or unsupported device preference.
+	ExtensionFeedItemErrorEnum_INVALID_DEVICE_PREFERENCE ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 30
+	// Invalid feed item schedule end time (i.e., endHour = 24 and endMinute !=
+	// 0).
+	ExtensionFeedItemErrorEnum_INVALID_SCHEDULE_END ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 31
+	// Date time zone does not match the account's time zone.
+	ExtensionFeedItemErrorEnum_DATE_TIME_MUST_BE_IN_ACCOUNT_TIME_ZONE ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 32
+	// Invalid structured snippet header.
+	ExtensionFeedItemErrorEnum_INVALID_SNIPPETS_HEADER ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 33
+	// Cannot operate on removed feed item.
+	ExtensionFeedItemErrorEnum_CANNOT_OPERATE_ON_REMOVED_FEED_ITEM ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 34
+	// Phone number not supported when call tracking enabled for country.
+	ExtensionFeedItemErrorEnum_PHONE_NUMBER_NOT_SUPPORTED_WITH_CALLTRACKING_FOR_COUNTRY ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 35
+	// Cannot set call_conversion_action while call_conversion_tracking_enabled
+	// is set to true.
+	ExtensionFeedItemErrorEnum_CONFLICTING_CALL_CONVERSION_SETTINGS ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 36
+	// The type of the input extension feed item doesn't match the existing
+	// extension feed item.
+	ExtensionFeedItemErrorEnum_EXTENSION_TYPE_MISMATCH ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 37
+	// The oneof field extension i.e. subtype of extension feed item is
+	// required.
+	ExtensionFeedItemErrorEnum_EXTENSION_SUBTYPE_REQUIRED ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 38
+	// The referenced feed item is not mapped to a supported extension type.
+	ExtensionFeedItemErrorEnum_EXTENSION_TYPE_UNSUPPORTED ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 39
+	// Cannot operate on a Feed with more than one active FeedMapping.
+	ExtensionFeedItemErrorEnum_CANNOT_OPERATE_ON_FEED_WITH_MULTIPLE_MAPPINGS ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 40
+	// Cannot operate on a Feed that has key attributes.
+	ExtensionFeedItemErrorEnum_CANNOT_OPERATE_ON_FEED_WITH_KEY_ATTRIBUTES ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 41
+	// Input price is not in a valid format.
+	ExtensionFeedItemErrorEnum_INVALID_PRICE_FORMAT ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 42
+	// The promotion time is invalid.
+	ExtensionFeedItemErrorEnum_PROMOTION_INVALID_TIME ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 43
+	// This field has too many decimal places specified.
+	ExtensionFeedItemErrorEnum_TOO_MANY_DECIMAL_PLACES_SPECIFIED ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 44
+	// Concrete sub type of ExtensionFeedItem is required for this operation.
+	ExtensionFeedItemErrorEnum_CONCRETE_EXTENSION_TYPE_REQUIRED ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 45
+	// Feed item schedule end time must be after start time.
+	ExtensionFeedItemErrorEnum_SCHEDULE_END_NOT_AFTER_START ExtensionFeedItemErrorEnum_ExtensionFeedItemError = 46
+)
+
+var ExtensionFeedItemErrorEnum_ExtensionFeedItemError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "VALUE_OUT_OF_RANGE",
+	3:  "URL_LIST_TOO_LONG",
+	4:  "CANNOT_HAVE_RESTRICTION_ON_EMPTY_GEO_TARGETING",
+	5:  "CANNOT_SET_WITH_FINAL_URLS",
+	6:  "CANNOT_SET_WITHOUT_FINAL_URLS",
+	7:  "INVALID_PHONE_NUMBER",
+	8:  "PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY",
+	9:  "CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED",
+	10: "PREMIUM_RATE_NUMBER_NOT_ALLOWED",
+	11: "DISALLOWED_NUMBER_TYPE",
+	12: "INVALID_DOMESTIC_PHONE_NUMBER_FORMAT",
+	13: "VANITY_PHONE_NUMBER_NOT_ALLOWED",
+	14: "INVALID_CALL_CONVERSION_ACTION",
+	15: "CUSTOMER_NOT_WHITELISTED_FOR_CALLTRACKING",
+	16: "CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY",
+	17: "CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED",
+	18: "INVALID_APP_ID",
+	19: "QUOTES_IN_REVIEW_EXTENSION_SNIPPET",
+	20: "HYPHENS_IN_REVIEW_EXTENSION_SNIPPET",
+	21: "REVIEW_EXTENSION_SOURCE_INELIGIBLE",
+	22: "SOURCE_NAME_IN_REVIEW_EXTENSION_TEXT",
+	23: "INCONSISTENT_CURRENCY_CODES",
+	24: "PRICE_EXTENSION_HAS_DUPLICATED_HEADERS",
+	25: "PRICE_ITEM_HAS_DUPLICATED_HEADER_AND_DESCRIPTION",
+	26: "PRICE_EXTENSION_HAS_TOO_FEW_ITEMS",
+	27: "PRICE_EXTENSION_HAS_TOO_MANY_ITEMS",
+	28: "UNSUPPORTED_VALUE",
+	29: "UNSUPPORTED_VALUE_IN_SELECTED_LANGUAGE",
+	30: "INVALID_DEVICE_PREFERENCE",
+	31: "INVALID_SCHEDULE_END",
+	32: "DATE_TIME_MUST_BE_IN_ACCOUNT_TIME_ZONE",
+	33: "INVALID_SNIPPETS_HEADER",
+	34: "CANNOT_OPERATE_ON_REMOVED_FEED_ITEM",
+	35: "PHONE_NUMBER_NOT_SUPPORTED_WITH_CALLTRACKING_FOR_COUNTRY",
+	36: "CONFLICTING_CALL_CONVERSION_SETTINGS",
+	37: "EXTENSION_TYPE_MISMATCH",
+	38: "EXTENSION_SUBTYPE_REQUIRED",
+	39: "EXTENSION_TYPE_UNSUPPORTED",
+	40: "CANNOT_OPERATE_ON_FEED_WITH_MULTIPLE_MAPPINGS",
+	41: "CANNOT_OPERATE_ON_FEED_WITH_KEY_ATTRIBUTES",
+	42: "INVALID_PRICE_FORMAT",
+	43: "PROMOTION_INVALID_TIME",
+	44: "TOO_MANY_DECIMAL_PLACES_SPECIFIED",
+	45: "CONCRETE_EXTENSION_TYPE_REQUIRED",
+	46: "SCHEDULE_END_NOT_AFTER_START",
+}
+
+var ExtensionFeedItemErrorEnum_ExtensionFeedItemError_value = map[string]int32{
+	"UNSPECIFIED":        0,
+	"UNKNOWN":            1,
+	"VALUE_OUT_OF_RANGE": 2,
+	"URL_LIST_TOO_LONG":  3,
+	"CANNOT_HAVE_RESTRICTION_ON_EMPTY_GEO_TARGETING":           4,
+	"CANNOT_SET_WITH_FINAL_URLS":                               5,
+	"CANNOT_SET_WITHOUT_FINAL_URLS":                            6,
+	"INVALID_PHONE_NUMBER":                                     7,
+	"PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY":                   8,
+	"CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED":                9,
+	"PREMIUM_RATE_NUMBER_NOT_ALLOWED":                          10,
+	"DISALLOWED_NUMBER_TYPE":                                   11,
+	"INVALID_DOMESTIC_PHONE_NUMBER_FORMAT":                     12,
+	"VANITY_PHONE_NUMBER_NOT_ALLOWED":                          13,
+	"INVALID_CALL_CONVERSION_ACTION":                           14,
+	"CUSTOMER_NOT_WHITELISTED_FOR_CALLTRACKING":                15,
+	"CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY":                   16,
+	"CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED":             17,
+	"INVALID_APP_ID":                                           18,
+	"QUOTES_IN_REVIEW_EXTENSION_SNIPPET":                       19,
+	"HYPHENS_IN_REVIEW_EXTENSION_SNIPPET":                      20,
+	"REVIEW_EXTENSION_SOURCE_INELIGIBLE":                       21,
+	"SOURCE_NAME_IN_REVIEW_EXTENSION_TEXT":                     22,
+	"INCONSISTENT_CURRENCY_CODES":                              23,
+	"PRICE_EXTENSION_HAS_DUPLICATED_HEADERS":                   24,
+	"PRICE_ITEM_HAS_DUPLICATED_HEADER_AND_DESCRIPTION":         25,
+	"PRICE_EXTENSION_HAS_TOO_FEW_ITEMS":                        26,
+	"PRICE_EXTENSION_HAS_TOO_MANY_ITEMS":                       27,
+	"UNSUPPORTED_VALUE":                                        28,
+	"UNSUPPORTED_VALUE_IN_SELECTED_LANGUAGE":                   29,
+	"INVALID_DEVICE_PREFERENCE":                                30,
+	"INVALID_SCHEDULE_END":                                     31,
+	"DATE_TIME_MUST_BE_IN_ACCOUNT_TIME_ZONE":                   32,
+	"INVALID_SNIPPETS_HEADER":                                  33,
+	"CANNOT_OPERATE_ON_REMOVED_FEED_ITEM":                      34,
+	"PHONE_NUMBER_NOT_SUPPORTED_WITH_CALLTRACKING_FOR_COUNTRY": 35,
+	"CONFLICTING_CALL_CONVERSION_SETTINGS":                     36,
+	"EXTENSION_TYPE_MISMATCH":                                  37,
+	"EXTENSION_SUBTYPE_REQUIRED":                               38,
+	"EXTENSION_TYPE_UNSUPPORTED":                               39,
+	"CANNOT_OPERATE_ON_FEED_WITH_MULTIPLE_MAPPINGS":            40,
+	"CANNOT_OPERATE_ON_FEED_WITH_KEY_ATTRIBUTES":               41,
+	"INVALID_PRICE_FORMAT":                                     42,
+	"PROMOTION_INVALID_TIME":                                   43,
+	"TOO_MANY_DECIMAL_PLACES_SPECIFIED":                        44,
+	"CONCRETE_EXTENSION_TYPE_REQUIRED":                         45,
+	"SCHEDULE_END_NOT_AFTER_START":                             46,
+}
+
+func (x ExtensionFeedItemErrorEnum_ExtensionFeedItemError) String() string {
+	return proto.EnumName(ExtensionFeedItemErrorEnum_ExtensionFeedItemError_name, int32(x))
+}
+
+func (ExtensionFeedItemErrorEnum_ExtensionFeedItemError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_9d791ac5581cafbd, []int{0, 0}
+}
+
+// Container for enum describing possible extension feed item error.
+type ExtensionFeedItemErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExtensionFeedItemErrorEnum) Reset()         { *m = ExtensionFeedItemErrorEnum{} }
+func (m *ExtensionFeedItemErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ExtensionFeedItemErrorEnum) ProtoMessage()    {}
+func (*ExtensionFeedItemErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9d791ac5581cafbd, []int{0}
+}
+
+func (m *ExtensionFeedItemErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExtensionFeedItemErrorEnum.Unmarshal(m, b)
+}
+func (m *ExtensionFeedItemErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExtensionFeedItemErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ExtensionFeedItemErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExtensionFeedItemErrorEnum.Merge(m, src)
+}
+func (m *ExtensionFeedItemErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ExtensionFeedItemErrorEnum.Size(m)
+}
+func (m *ExtensionFeedItemErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExtensionFeedItemErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExtensionFeedItemErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ExtensionFeedItemErrorEnum_ExtensionFeedItemError", ExtensionFeedItemErrorEnum_ExtensionFeedItemError_name, ExtensionFeedItemErrorEnum_ExtensionFeedItemError_value)
+	proto.RegisterType((*ExtensionFeedItemErrorEnum)(nil), "google.ads.googleads.v3.errors.ExtensionFeedItemErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/extension_feed_item_error.proto", fileDescriptor_9d791ac5581cafbd)
+}
+
+var fileDescriptor_9d791ac5581cafbd = []byte{
+	// 1087 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x55, 0xdf, 0x72, 0x13, 0x37,
+	0x17, 0xff, 0x08, 0x5f, 0xa1, 0x15, 0x05, 0x84, 0x0a, 0x01, 0x12, 0x08, 0x89, 0x13, 0x02, 0xa4,
+	0x64, 0x4d, 0xeb, 0x5e, 0x74, 0xdc, 0x4e, 0x67, 0x64, 0xed, 0xb1, 0xad, 0x89, 0x56, 0x12, 0x92,
+	0xd6, 0xc6, 0x4c, 0x66, 0x34, 0x69, 0xed, 0x7a, 0x32, 0x43, 0xec, 0x4c, 0xec, 0x32, 0x7d, 0x9e,
+	0x5e, 0xf6, 0x51, 0xfa, 0x00, 0x7d, 0x88, 0xde, 0xb7, 0xd7, 0x1d, 0x69, 0x6d, 0xb3, 0x69, 0x4c,
+	0xae, 0xbc, 0x3e, 0xfa, 0x9d, 0xff, 0xbf, 0x73, 0x0e, 0xfa, 0x61, 0x38, 0x1e, 0x0f, 0xdf, 0x0d,
+	0xaa, 0x47, 0xfd, 0x49, 0xb5, 0xf8, 0x0c, 0x5f, 0xef, 0x6b, 0xd5, 0xc1, 0xd9, 0xd9, 0xf8, 0x6c,
+	0x52, 0x1d, 0xfc, 0x3a, 0x1d, 0x8c, 0x26, 0xc7, 0xe3, 0x91, 0xff, 0x79, 0x30, 0xe8, 0xfb, 0xe3,
+	0xe9, 0xe0, 0xc4, 0xc7, 0xa7, 0xe4, 0xf4, 0x6c, 0x3c, 0x1d, 0x93, 0x8d, 0x42, 0x29, 0x39, 0xea,
+	0x4f, 0x92, 0x85, 0x7e, 0xf2, 0xbe, 0x96, 0x14, 0xfa, 0x6b, 0x8f, 0xe6, 0xf6, 0x4f, 0x8f, 0xab,
+	0x47, 0xa3, 0xd1, 0x78, 0x7a, 0x34, 0x3d, 0x1e, 0x8f, 0x26, 0x85, 0x76, 0xe5, 0xef, 0x9b, 0x68,
+	0x0d, 0xe6, 0x1e, 0x9a, 0x83, 0x41, 0x9f, 0x4f, 0x07, 0x27, 0x10, 0x34, 0x61, 0xf4, 0xcb, 0x49,
+	0xe5, 0xcf, 0x9b, 0x68, 0x75, 0xf9, 0x33, 0xb9, 0x8d, 0x6e, 0xe4, 0xd2, 0x6a, 0x60, 0xbc, 0xc9,
+	0x21, 0xc5, 0xff, 0x23, 0x37, 0xd0, 0xf5, 0x5c, 0x1e, 0x48, 0xd5, 0x95, 0xf8, 0x0a, 0x59, 0x45,
+	0xa4, 0x43, 0x45, 0x0e, 0x5e, 0xe5, 0xce, 0xab, 0xa6, 0x37, 0x54, 0xb6, 0x00, 0xaf, 0x90, 0x7b,
+	0xe8, 0x4e, 0x6e, 0x84, 0x17, 0xdc, 0x3a, 0xef, 0x94, 0xf2, 0x42, 0xc9, 0x16, 0xbe, 0x4a, 0xbe,
+	0x46, 0x09, 0xa3, 0x52, 0x2a, 0xe7, 0xdb, 0xb4, 0x03, 0xde, 0x80, 0x75, 0x86, 0x33, 0xc7, 0x95,
+	0xf4, 0x4a, 0x7a, 0xc8, 0xb4, 0xeb, 0xf9, 0x16, 0x28, 0xef, 0xa8, 0x69, 0x81, 0xe3, 0xb2, 0x85,
+	0xff, 0x4f, 0x36, 0xd0, 0xda, 0x4c, 0xc7, 0x82, 0xf3, 0x5d, 0xee, 0xda, 0xbe, 0xc9, 0x25, 0x15,
+	0x3e, 0x37, 0xc2, 0xe2, 0x4f, 0xc8, 0x16, 0x7a, 0xfc, 0x9f, 0xf7, 0x10, 0x4b, 0x09, 0x72, 0x8d,
+	0x3c, 0x40, 0x77, 0xb9, 0xec, 0x50, 0xc1, 0x53, 0xaf, 0xdb, 0x4a, 0x82, 0x97, 0x79, 0xd6, 0x00,
+	0x83, 0xaf, 0x93, 0x3d, 0xb4, 0x5b, 0x96, 0xf8, 0x68, 0x26, 0xd7, 0x5a, 0x19, 0x07, 0xa9, 0x6f,
+	0x2a, 0xe3, 0x99, 0xca, 0xa5, 0x33, 0x3d, 0xfc, 0x29, 0xd9, 0x47, 0x2f, 0x18, 0x35, 0x86, 0x83,
+	0xf1, 0xb3, 0x7a, 0x30, 0x6f, 0xdb, 0xca, 0xb8, 0xb2, 0x32, 0x15, 0x42, 0x75, 0x21, 0xc5, 0x9f,
+	0x91, 0x6d, 0xf4, 0x44, 0x1b, 0xc8, 0x78, 0x9e, 0x79, 0x43, 0x1d, 0x2c, 0x03, 0x21, 0xb2, 0x86,
+	0x56, 0x53, 0x6e, 0x67, 0xff, 0xe7, 0x10, 0xd7, 0xd3, 0x80, 0x6f, 0x90, 0xe7, 0x68, 0x67, 0x1e,
+	0x75, 0xaa, 0x32, 0xb0, 0x8e, 0xb3, 0x73, 0xe1, 0x87, 0xf0, 0x32, 0xea, 0xf0, 0xe7, 0xc1, 0x55,
+	0x87, 0x4a, 0xee, 0x7a, 0xfe, 0x42, 0x32, 0x73, 0x57, 0x37, 0x49, 0x05, 0x6d, 0xcc, 0xcd, 0x31,
+	0x2a, 0x84, 0x67, 0x4a, 0x76, 0xc0, 0xd8, 0x50, 0x7b, 0x1a, 0x5b, 0x80, 0x6f, 0xc5, 0x14, 0x73,
+	0xeb, 0x54, 0x36, 0xd3, 0xee, 0xb6, 0xb9, 0x83, 0xd0, 0xc4, 0x79, 0x31, 0xa8, 0x10, 0xce, 0x50,
+	0x76, 0x10, 0x5a, 0x73, 0x3b, 0x54, 0xaf, 0x2c, 0xb9, 0xa4, 0x7a, 0x98, 0xbc, 0x42, 0x2f, 0x17,
+	0xa6, 0x99, 0x92, 0x16, 0xa4, 0x5b, 0x98, 0xf4, 0x06, 0x98, 0x32, 0x69, 0x30, 0x61, 0xe0, 0x75,
+	0xce, 0x0d, 0xa4, 0xf8, 0x0e, 0x21, 0xe8, 0xd6, 0x3c, 0x60, 0xaa, 0xb5, 0xe7, 0x29, 0x26, 0x64,
+	0x17, 0x55, 0x5e, 0xe7, 0xca, 0x81, 0xf5, 0x5c, 0x7a, 0x03, 0x1d, 0x0e, 0x5d, 0x0f, 0x6f, 0x1c,
+	0xc8, 0x98, 0x87, 0x95, 0x5c, 0x6b, 0x70, 0xf8, 0x0b, 0xf2, 0x0c, 0x6d, 0xb7, 0x7b, 0xba, 0x0d,
+	0xf2, 0x72, 0xe0, 0xdd, 0x60, 0xf0, 0xe2, 0xab, 0xca, 0x0d, 0x03, 0xcf, 0x25, 0x08, 0xde, 0xe2,
+	0x0d, 0x01, 0xf8, 0x5e, 0x68, 0xc6, 0x4c, 0x2c, 0x69, 0x06, 0x4b, 0x8d, 0x3a, 0x78, 0xe3, 0xf0,
+	0x2a, 0x79, 0x82, 0xd6, 0xb9, 0x0c, 0x19, 0x86, 0xb2, 0x49, 0xe7, 0x59, 0x6e, 0x0c, 0x48, 0xd6,
+	0xf3, 0x4c, 0xa5, 0x60, 0xf1, 0xfd, 0xc8, 0x39, 0xc3, 0x19, 0x94, 0x54, 0xdb, 0xd4, 0xfa, 0x34,
+	0xd7, 0x82, 0x33, 0x1a, 0x2a, 0xd7, 0x06, 0x9a, 0x82, 0xb1, 0xf8, 0x01, 0xf9, 0x06, 0xbd, 0x2a,
+	0xb0, 0xdc, 0x41, 0xb6, 0x1c, 0xe6, 0xa9, 0x4c, 0x7d, 0x0a, 0x96, 0x19, 0xae, 0x63, 0x1b, 0x1f,
+	0x92, 0xa7, 0x68, 0x6b, 0x99, 0x87, 0x30, 0x88, 0x4d, 0xe8, 0x46, 0x5b, 0x16, 0xaf, 0x85, 0xdc,
+	0x3f, 0x06, 0xcb, 0xa8, 0xec, 0xcd, 0x70, 0xeb, 0x71, 0x98, 0xe5, 0x87, 0xbe, 0xc6, 0x81, 0xc7,
+	0x8f, 0x42, 0x1e, 0x17, 0xc4, 0xa1, 0x30, 0x16, 0x04, 0xb0, 0x20, 0x11, 0x54, 0xb6, 0x72, 0xda,
+	0x02, 0xfc, 0x98, 0x3c, 0x46, 0x0f, 0x17, 0x5c, 0x86, 0x4e, 0xf0, 0xa9, 0x0d, 0x34, 0x21, 0x14,
+	0x06, 0xf0, 0x46, 0x79, 0x40, 0x2d, 0x6b, 0x43, 0x9a, 0x0b, 0xf0, 0x20, 0x53, 0xfc, 0x24, 0x38,
+	0x49, 0xc3, 0xf4, 0x38, 0x9e, 0x81, 0xcf, 0x72, 0xeb, 0x7c, 0x23, 0x3a, 0xa1, 0x2c, 0x52, 0xab,
+	0x90, 0xbf, 0x55, 0x12, 0xf0, 0x26, 0x59, 0x47, 0xf7, 0x17, 0x56, 0x8a, 0x06, 0xdb, 0x59, 0x8d,
+	0xf0, 0x56, 0x60, 0xc4, 0x6c, 0x4d, 0x28, 0x0d, 0x71, 0x20, 0x55, 0xe8, 0x61, 0xa6, 0x3a, 0x81,
+	0xaa, 0x00, 0x69, 0x4c, 0x17, 0x57, 0xc8, 0xf7, 0xe8, 0xdb, 0x4b, 0x56, 0x42, 0xdc, 0x3f, 0xe7,
+	0x48, 0x5f, 0xa6, 0xf9, 0x76, 0xe0, 0x09, 0x53, 0xb2, 0x29, 0xc2, 0x56, 0x93, 0xad, 0x0b, 0x93,
+	0x66, 0xc1, 0x05, 0xb9, 0xc5, 0x3b, 0x21, 0xda, 0x12, 0x77, 0x7a, 0x1a, 0x7c, 0xc6, 0x6d, 0x46,
+	0x1d, 0x6b, 0xe3, 0xa7, 0x61, 0xe9, 0x95, 0xf8, 0x98, 0x37, 0xe2, 0xfb, 0x62, 0x36, 0x76, 0xcf,
+	0xbf, 0xc7, 0xc7, 0x52, 0x2b, 0xf0, 0x33, 0xf2, 0x15, 0xda, 0xbf, 0x98, 0x6d, 0xcc, 0x32, 0x26,
+	0x90, 0xe5, 0xc2, 0x71, 0x2d, 0xc0, 0x67, 0x54, 0xeb, 0x18, 0xcf, 0x73, 0x92, 0xa0, 0xbd, 0xcb,
+	0x54, 0x0e, 0xa0, 0xe7, 0xa9, 0x73, 0x86, 0x37, 0x72, 0x07, 0x16, 0xbf, 0x38, 0xb7, 0x54, 0x23,
+	0x8b, 0x66, 0xeb, 0x68, 0x2f, 0x2c, 0x35, 0x6d, 0x54, 0xa6, 0xe2, 0x5e, 0x9f, 0x63, 0x42, 0xa3,
+	0xf0, 0x97, 0x81, 0x9a, 0x0b, 0x7e, 0xa5, 0xc0, 0x78, 0x46, 0x85, 0xd7, 0x82, 0x32, 0xb0, 0xfe,
+	0xc3, 0x91, 0x79, 0x49, 0x76, 0xd0, 0x26, 0x53, 0x92, 0x19, 0x70, 0x65, 0x76, 0x9e, 0xaf, 0xc2,
+	0x3e, 0xd9, 0x44, 0x8f, 0xca, 0x74, 0x29, 0x16, 0x5e, 0xd3, 0x85, 0x05, 0xed, 0xa8, 0x71, 0x38,
+	0x69, 0xfc, 0x73, 0x05, 0x55, 0x7e, 0x1a, 0x9f, 0x24, 0x97, 0x1f, 0xcf, 0xc6, 0xfa, 0xf2, 0xe3,
+	0xa7, 0xc3, 0xed, 0xd4, 0x57, 0xde, 0xa6, 0x33, 0xf5, 0xe1, 0xf8, 0xdd, 0xd1, 0x68, 0x98, 0x8c,
+	0xcf, 0x86, 0xd5, 0xe1, 0x60, 0x14, 0x2f, 0xeb, 0xfc, 0x96, 0x9f, 0x1e, 0x4f, 0x3e, 0x76, 0xda,
+	0xbf, 0x2b, 0x7e, 0x7e, 0x5b, 0xb9, 0xda, 0xa2, 0xf4, 0xf7, 0x95, 0x8d, 0x56, 0x61, 0x8c, 0xf6,
+	0x27, 0x49, 0xf1, 0x19, 0xbe, 0x3a, 0xb5, 0x24, 0xba, 0x9c, 0xfc, 0x31, 0x07, 0x1c, 0xd2, 0xfe,
+	0xe4, 0x70, 0x01, 0x38, 0xec, 0xd4, 0x0e, 0x0b, 0xc0, 0x5f, 0x2b, 0x95, 0x42, 0x5a, 0xaf, 0xd3,
+	0xfe, 0xa4, 0x5e, 0x5f, 0x40, 0xea, 0xf5, 0x4e, 0xad, 0x5e, 0x2f, 0x40, 0x3f, 0x5e, 0x8b, 0xd1,
+	0xd5, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x25, 0x8c, 0x9d, 0xca, 0x77, 0x08, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/extension_setting_error.pb.go b/googleapis/ads/googleads/v3/errors/extension_setting_error.pb.go
new file mode 100644
index 0000000..f5d5c53
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/extension_setting_error.pb.go
@@ -0,0 +1,455 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/extension_setting_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible extension setting errors.
+type ExtensionSettingErrorEnum_ExtensionSettingError int32
+
+const (
+	// Enum unspecified.
+	ExtensionSettingErrorEnum_UNSPECIFIED ExtensionSettingErrorEnum_ExtensionSettingError = 0
+	// The received error code is not known in this version.
+	ExtensionSettingErrorEnum_UNKNOWN ExtensionSettingErrorEnum_ExtensionSettingError = 1
+	// A platform restriction was provided without input extensions or existing
+	// extensions.
+	ExtensionSettingErrorEnum_EXTENSIONS_REQUIRED ExtensionSettingErrorEnum_ExtensionSettingError = 2
+	// The provided feed type does not correspond to the provided extensions.
+	ExtensionSettingErrorEnum_FEED_TYPE_EXTENSION_TYPE_MISMATCH ExtensionSettingErrorEnum_ExtensionSettingError = 3
+	// The provided feed type cannot be used.
+	ExtensionSettingErrorEnum_INVALID_FEED_TYPE ExtensionSettingErrorEnum_ExtensionSettingError = 4
+	// The provided feed type cannot be used at the customer level.
+	ExtensionSettingErrorEnum_INVALID_FEED_TYPE_FOR_CUSTOMER_EXTENSION_SETTING ExtensionSettingErrorEnum_ExtensionSettingError = 5
+	// Cannot change a feed item field on a CREATE operation.
+	ExtensionSettingErrorEnum_CANNOT_CHANGE_FEED_ITEM_ON_CREATE ExtensionSettingErrorEnum_ExtensionSettingError = 6
+	// Cannot update an extension that is not already in this setting.
+	ExtensionSettingErrorEnum_CANNOT_UPDATE_NEWLY_CREATED_EXTENSION ExtensionSettingErrorEnum_ExtensionSettingError = 7
+	// There is no existing AdGroupExtensionSetting for this type.
+	ExtensionSettingErrorEnum_NO_EXISTING_AD_GROUP_EXTENSION_SETTING_FOR_TYPE ExtensionSettingErrorEnum_ExtensionSettingError = 8
+	// There is no existing CampaignExtensionSetting for this type.
+	ExtensionSettingErrorEnum_NO_EXISTING_CAMPAIGN_EXTENSION_SETTING_FOR_TYPE ExtensionSettingErrorEnum_ExtensionSettingError = 9
+	// There is no existing CustomerExtensionSetting for this type.
+	ExtensionSettingErrorEnum_NO_EXISTING_CUSTOMER_EXTENSION_SETTING_FOR_TYPE ExtensionSettingErrorEnum_ExtensionSettingError = 10
+	// The AdGroupExtensionSetting already exists. UPDATE should be used to
+	// modify the existing AdGroupExtensionSetting.
+	ExtensionSettingErrorEnum_AD_GROUP_EXTENSION_SETTING_ALREADY_EXISTS ExtensionSettingErrorEnum_ExtensionSettingError = 11
+	// The CampaignExtensionSetting already exists. UPDATE should be used to
+	// modify the existing CampaignExtensionSetting.
+	ExtensionSettingErrorEnum_CAMPAIGN_EXTENSION_SETTING_ALREADY_EXISTS ExtensionSettingErrorEnum_ExtensionSettingError = 12
+	// The CustomerExtensionSetting already exists. UPDATE should be used to
+	// modify the existing CustomerExtensionSetting.
+	ExtensionSettingErrorEnum_CUSTOMER_EXTENSION_SETTING_ALREADY_EXISTS ExtensionSettingErrorEnum_ExtensionSettingError = 13
+	// An active ad group feed already exists for this place holder type.
+	ExtensionSettingErrorEnum_AD_GROUP_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE ExtensionSettingErrorEnum_ExtensionSettingError = 14
+	// An active campaign feed already exists for this place holder type.
+	ExtensionSettingErrorEnum_CAMPAIGN_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE ExtensionSettingErrorEnum_ExtensionSettingError = 15
+	// An active customer feed already exists for this place holder type.
+	ExtensionSettingErrorEnum_CUSTOMER_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE ExtensionSettingErrorEnum_ExtensionSettingError = 16
+	// Value is not within the accepted range.
+	ExtensionSettingErrorEnum_VALUE_OUT_OF_RANGE ExtensionSettingErrorEnum_ExtensionSettingError = 17
+	// Cannot simultaneously set specified field with final urls.
+	ExtensionSettingErrorEnum_CANNOT_SET_FIELD_WITH_FINAL_URLS ExtensionSettingErrorEnum_ExtensionSettingError = 18
+	// Must set field with final urls.
+	ExtensionSettingErrorEnum_FINAL_URLS_NOT_SET ExtensionSettingErrorEnum_ExtensionSettingError = 19
+	// Phone number for a call extension is invalid.
+	ExtensionSettingErrorEnum_INVALID_PHONE_NUMBER ExtensionSettingErrorEnum_ExtensionSettingError = 20
+	// Phone number for a call extension is not supported for the given country
+	// code.
+	ExtensionSettingErrorEnum_PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY ExtensionSettingErrorEnum_ExtensionSettingError = 21
+	// A carrier specific number in short format is not allowed for call
+	// extensions.
+	ExtensionSettingErrorEnum_CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED ExtensionSettingErrorEnum_ExtensionSettingError = 22
+	// Premium rate numbers are not allowed for call extensions.
+	ExtensionSettingErrorEnum_PREMIUM_RATE_NUMBER_NOT_ALLOWED ExtensionSettingErrorEnum_ExtensionSettingError = 23
+	// Phone number type for a call extension is not allowed.
+	ExtensionSettingErrorEnum_DISALLOWED_NUMBER_TYPE ExtensionSettingErrorEnum_ExtensionSettingError = 24
+	// Phone number for a call extension does not meet domestic format
+	// requirements.
+	ExtensionSettingErrorEnum_INVALID_DOMESTIC_PHONE_NUMBER_FORMAT ExtensionSettingErrorEnum_ExtensionSettingError = 25
+	// Vanity phone numbers (i.e. those including letters) are not allowed for
+	// call extensions.
+	ExtensionSettingErrorEnum_VANITY_PHONE_NUMBER_NOT_ALLOWED ExtensionSettingErrorEnum_ExtensionSettingError = 26
+	// Country code provided for a call extension is invalid.
+	ExtensionSettingErrorEnum_INVALID_COUNTRY_CODE ExtensionSettingErrorEnum_ExtensionSettingError = 27
+	// Call conversion type id provided for a call extension is invalid.
+	ExtensionSettingErrorEnum_INVALID_CALL_CONVERSION_TYPE_ID ExtensionSettingErrorEnum_ExtensionSettingError = 28
+	// For a call extension, the customer is not whitelisted for call tracking.
+	ExtensionSettingErrorEnum_CUSTOMER_NOT_WHITELISTED_FOR_CALLTRACKING ExtensionSettingErrorEnum_ExtensionSettingError = 29
+	// Call tracking is not supported for the given country for a call
+	// extension.
+	ExtensionSettingErrorEnum_CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY ExtensionSettingErrorEnum_ExtensionSettingError = 30
+	// App id provided for an app extension is invalid.
+	ExtensionSettingErrorEnum_INVALID_APP_ID ExtensionSettingErrorEnum_ExtensionSettingError = 31
+	// Quotation marks present in the review text for a review extension.
+	ExtensionSettingErrorEnum_QUOTES_IN_REVIEW_EXTENSION_SNIPPET ExtensionSettingErrorEnum_ExtensionSettingError = 32
+	// Hyphen character present in the review text for a review extension.
+	ExtensionSettingErrorEnum_HYPHENS_IN_REVIEW_EXTENSION_SNIPPET ExtensionSettingErrorEnum_ExtensionSettingError = 33
+	// A blacklisted review source name or url was provided for a review
+	// extension.
+	ExtensionSettingErrorEnum_REVIEW_EXTENSION_SOURCE_NOT_ELIGIBLE ExtensionSettingErrorEnum_ExtensionSettingError = 34
+	// Review source name should not be found in the review text.
+	ExtensionSettingErrorEnum_SOURCE_NAME_IN_REVIEW_EXTENSION_TEXT ExtensionSettingErrorEnum_ExtensionSettingError = 35
+	// Field must be set.
+	ExtensionSettingErrorEnum_MISSING_FIELD ExtensionSettingErrorEnum_ExtensionSettingError = 36
+	// Inconsistent currency codes.
+	ExtensionSettingErrorEnum_INCONSISTENT_CURRENCY_CODES ExtensionSettingErrorEnum_ExtensionSettingError = 37
+	// Price extension cannot have duplicated headers.
+	ExtensionSettingErrorEnum_PRICE_EXTENSION_HAS_DUPLICATED_HEADERS ExtensionSettingErrorEnum_ExtensionSettingError = 38
+	// Price item cannot have duplicated header and description.
+	ExtensionSettingErrorEnum_PRICE_ITEM_HAS_DUPLICATED_HEADER_AND_DESCRIPTION ExtensionSettingErrorEnum_ExtensionSettingError = 39
+	// Price extension has too few items
+	ExtensionSettingErrorEnum_PRICE_EXTENSION_HAS_TOO_FEW_ITEMS ExtensionSettingErrorEnum_ExtensionSettingError = 40
+	// Price extension has too many items
+	ExtensionSettingErrorEnum_PRICE_EXTENSION_HAS_TOO_MANY_ITEMS ExtensionSettingErrorEnum_ExtensionSettingError = 41
+	// The input value is not currently supported.
+	ExtensionSettingErrorEnum_UNSUPPORTED_VALUE ExtensionSettingErrorEnum_ExtensionSettingError = 42
+	// Unknown or unsupported device preference.
+	ExtensionSettingErrorEnum_INVALID_DEVICE_PREFERENCE ExtensionSettingErrorEnum_ExtensionSettingError = 43
+	// Invalid feed item schedule end time (i.e., endHour = 24 and
+	// endMinute != 0).
+	ExtensionSettingErrorEnum_INVALID_SCHEDULE_END ExtensionSettingErrorEnum_ExtensionSettingError = 45
+	// Date time zone does not match the account's time zone.
+	ExtensionSettingErrorEnum_DATE_TIME_MUST_BE_IN_ACCOUNT_TIME_ZONE ExtensionSettingErrorEnum_ExtensionSettingError = 47
+	// Overlapping feed item schedule times (e.g., 7-10AM and 8-11AM) are not
+	// allowed.
+	ExtensionSettingErrorEnum_OVERLAPPING_SCHEDULES_NOT_ALLOWED ExtensionSettingErrorEnum_ExtensionSettingError = 48
+	// Feed item schedule end time must be after start time.
+	ExtensionSettingErrorEnum_SCHEDULE_END_NOT_AFTER_START ExtensionSettingErrorEnum_ExtensionSettingError = 49
+	// There are too many feed item schedules per day.
+	ExtensionSettingErrorEnum_TOO_MANY_SCHEDULES_PER_DAY ExtensionSettingErrorEnum_ExtensionSettingError = 50
+	// Cannot edit the same extension feed item more than once in the same
+	// request.
+	ExtensionSettingErrorEnum_DUPLICATE_EXTENSION_FEED_ITEM_EDIT ExtensionSettingErrorEnum_ExtensionSettingError = 51
+	// Invalid structured snippet header.
+	ExtensionSettingErrorEnum_INVALID_SNIPPETS_HEADER ExtensionSettingErrorEnum_ExtensionSettingError = 52
+	// Phone number with call tracking enabled is not supported for the
+	// specified country.
+	ExtensionSettingErrorEnum_PHONE_NUMBER_NOT_SUPPORTED_WITH_CALLTRACKING_FOR_COUNTRY ExtensionSettingErrorEnum_ExtensionSettingError = 53
+	// The targeted adgroup must belong to the targeted campaign.
+	ExtensionSettingErrorEnum_CAMPAIGN_TARGETING_MISMATCH ExtensionSettingErrorEnum_ExtensionSettingError = 54
+	// The feed used by the ExtensionSetting is removed and cannot be operated
+	// on. Remove the ExtensionSetting to allow a new one to be created using
+	// an active feed.
+	ExtensionSettingErrorEnum_CANNOT_OPERATE_ON_REMOVED_FEED ExtensionSettingErrorEnum_ExtensionSettingError = 55
+	// The ExtensionFeedItem type is required for this operation.
+	ExtensionSettingErrorEnum_EXTENSION_TYPE_REQUIRED ExtensionSettingErrorEnum_ExtensionSettingError = 56
+	// The matching function that links the extension feed to the customer,
+	// campaign, or ad group is not compatible with the ExtensionSetting
+	// services.
+	ExtensionSettingErrorEnum_INCOMPATIBLE_UNDERLYING_MATCHING_FUNCTION ExtensionSettingErrorEnum_ExtensionSettingError = 57
+	// Start date must be before end date.
+	ExtensionSettingErrorEnum_START_DATE_AFTER_END_DATE ExtensionSettingErrorEnum_ExtensionSettingError = 58
+	// Input price is not in a valid format.
+	ExtensionSettingErrorEnum_INVALID_PRICE_FORMAT ExtensionSettingErrorEnum_ExtensionSettingError = 59
+	// The promotion time is invalid.
+	ExtensionSettingErrorEnum_PROMOTION_INVALID_TIME ExtensionSettingErrorEnum_ExtensionSettingError = 60
+	// Cannot set both percent discount and money discount fields.
+	ExtensionSettingErrorEnum_PROMOTION_CANNOT_SET_PERCENT_DISCOUNT_AND_MONEY_DISCOUNT ExtensionSettingErrorEnum_ExtensionSettingError = 61
+	// Cannot set both promotion code and orders over amount fields.
+	ExtensionSettingErrorEnum_PROMOTION_CANNOT_SET_PROMOTION_CODE_AND_ORDERS_OVER_AMOUNT ExtensionSettingErrorEnum_ExtensionSettingError = 62
+	// This field has too many decimal places specified.
+	ExtensionSettingErrorEnum_TOO_MANY_DECIMAL_PLACES_SPECIFIED ExtensionSettingErrorEnum_ExtensionSettingError = 63
+	// The language code is not valid.
+	ExtensionSettingErrorEnum_INVALID_LANGUAGE_CODE ExtensionSettingErrorEnum_ExtensionSettingError = 64
+	// The language is not supported.
+	ExtensionSettingErrorEnum_UNSUPPORTED_LANGUAGE ExtensionSettingErrorEnum_ExtensionSettingError = 65
+	// Customer hasn't consented for call recording, which is required for
+	// adding/updating call extensions. Please see
+	// https://support.google.com/google-ads/answer/7412639.
+	ExtensionSettingErrorEnum_CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED ExtensionSettingErrorEnum_ExtensionSettingError = 66
+	// The UPDATE operation does not specify any fields other than the resource
+	// name in the update mask.
+	ExtensionSettingErrorEnum_EXTENSION_SETTING_UPDATE_IS_A_NOOP ExtensionSettingErrorEnum_ExtensionSettingError = 67
+)
+
+var ExtensionSettingErrorEnum_ExtensionSettingError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "EXTENSIONS_REQUIRED",
+	3:  "FEED_TYPE_EXTENSION_TYPE_MISMATCH",
+	4:  "INVALID_FEED_TYPE",
+	5:  "INVALID_FEED_TYPE_FOR_CUSTOMER_EXTENSION_SETTING",
+	6:  "CANNOT_CHANGE_FEED_ITEM_ON_CREATE",
+	7:  "CANNOT_UPDATE_NEWLY_CREATED_EXTENSION",
+	8:  "NO_EXISTING_AD_GROUP_EXTENSION_SETTING_FOR_TYPE",
+	9:  "NO_EXISTING_CAMPAIGN_EXTENSION_SETTING_FOR_TYPE",
+	10: "NO_EXISTING_CUSTOMER_EXTENSION_SETTING_FOR_TYPE",
+	11: "AD_GROUP_EXTENSION_SETTING_ALREADY_EXISTS",
+	12: "CAMPAIGN_EXTENSION_SETTING_ALREADY_EXISTS",
+	13: "CUSTOMER_EXTENSION_SETTING_ALREADY_EXISTS",
+	14: "AD_GROUP_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE",
+	15: "CAMPAIGN_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE",
+	16: "CUSTOMER_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE",
+	17: "VALUE_OUT_OF_RANGE",
+	18: "CANNOT_SET_FIELD_WITH_FINAL_URLS",
+	19: "FINAL_URLS_NOT_SET",
+	20: "INVALID_PHONE_NUMBER",
+	21: "PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY",
+	22: "CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED",
+	23: "PREMIUM_RATE_NUMBER_NOT_ALLOWED",
+	24: "DISALLOWED_NUMBER_TYPE",
+	25: "INVALID_DOMESTIC_PHONE_NUMBER_FORMAT",
+	26: "VANITY_PHONE_NUMBER_NOT_ALLOWED",
+	27: "INVALID_COUNTRY_CODE",
+	28: "INVALID_CALL_CONVERSION_TYPE_ID",
+	29: "CUSTOMER_NOT_WHITELISTED_FOR_CALLTRACKING",
+	30: "CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY",
+	31: "INVALID_APP_ID",
+	32: "QUOTES_IN_REVIEW_EXTENSION_SNIPPET",
+	33: "HYPHENS_IN_REVIEW_EXTENSION_SNIPPET",
+	34: "REVIEW_EXTENSION_SOURCE_NOT_ELIGIBLE",
+	35: "SOURCE_NAME_IN_REVIEW_EXTENSION_TEXT",
+	36: "MISSING_FIELD",
+	37: "INCONSISTENT_CURRENCY_CODES",
+	38: "PRICE_EXTENSION_HAS_DUPLICATED_HEADERS",
+	39: "PRICE_ITEM_HAS_DUPLICATED_HEADER_AND_DESCRIPTION",
+	40: "PRICE_EXTENSION_HAS_TOO_FEW_ITEMS",
+	41: "PRICE_EXTENSION_HAS_TOO_MANY_ITEMS",
+	42: "UNSUPPORTED_VALUE",
+	43: "INVALID_DEVICE_PREFERENCE",
+	45: "INVALID_SCHEDULE_END",
+	47: "DATE_TIME_MUST_BE_IN_ACCOUNT_TIME_ZONE",
+	48: "OVERLAPPING_SCHEDULES_NOT_ALLOWED",
+	49: "SCHEDULE_END_NOT_AFTER_START",
+	50: "TOO_MANY_SCHEDULES_PER_DAY",
+	51: "DUPLICATE_EXTENSION_FEED_ITEM_EDIT",
+	52: "INVALID_SNIPPETS_HEADER",
+	53: "PHONE_NUMBER_NOT_SUPPORTED_WITH_CALLTRACKING_FOR_COUNTRY",
+	54: "CAMPAIGN_TARGETING_MISMATCH",
+	55: "CANNOT_OPERATE_ON_REMOVED_FEED",
+	56: "EXTENSION_TYPE_REQUIRED",
+	57: "INCOMPATIBLE_UNDERLYING_MATCHING_FUNCTION",
+	58: "START_DATE_AFTER_END_DATE",
+	59: "INVALID_PRICE_FORMAT",
+	60: "PROMOTION_INVALID_TIME",
+	61: "PROMOTION_CANNOT_SET_PERCENT_DISCOUNT_AND_MONEY_DISCOUNT",
+	62: "PROMOTION_CANNOT_SET_PROMOTION_CODE_AND_ORDERS_OVER_AMOUNT",
+	63: "TOO_MANY_DECIMAL_PLACES_SPECIFIED",
+	64: "INVALID_LANGUAGE_CODE",
+	65: "UNSUPPORTED_LANGUAGE",
+	66: "CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED",
+	67: "EXTENSION_SETTING_UPDATE_IS_A_NOOP",
+}
+
+var ExtensionSettingErrorEnum_ExtensionSettingError_value = map[string]int32{
+	"UNSPECIFIED":                       0,
+	"UNKNOWN":                           1,
+	"EXTENSIONS_REQUIRED":               2,
+	"FEED_TYPE_EXTENSION_TYPE_MISMATCH": 3,
+	"INVALID_FEED_TYPE":                 4,
+	"INVALID_FEED_TYPE_FOR_CUSTOMER_EXTENSION_SETTING":           5,
+	"CANNOT_CHANGE_FEED_ITEM_ON_CREATE":                          6,
+	"CANNOT_UPDATE_NEWLY_CREATED_EXTENSION":                      7,
+	"NO_EXISTING_AD_GROUP_EXTENSION_SETTING_FOR_TYPE":            8,
+	"NO_EXISTING_CAMPAIGN_EXTENSION_SETTING_FOR_TYPE":            9,
+	"NO_EXISTING_CUSTOMER_EXTENSION_SETTING_FOR_TYPE":            10,
+	"AD_GROUP_EXTENSION_SETTING_ALREADY_EXISTS":                  11,
+	"CAMPAIGN_EXTENSION_SETTING_ALREADY_EXISTS":                  12,
+	"CUSTOMER_EXTENSION_SETTING_ALREADY_EXISTS":                  13,
+	"AD_GROUP_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE":          14,
+	"CAMPAIGN_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE":          15,
+	"CUSTOMER_FEED_ALREADY_EXISTS_FOR_PLACEHOLDER_TYPE":          16,
+	"VALUE_OUT_OF_RANGE":                                         17,
+	"CANNOT_SET_FIELD_WITH_FINAL_URLS":                           18,
+	"FINAL_URLS_NOT_SET":                                         19,
+	"INVALID_PHONE_NUMBER":                                       20,
+	"PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY":                     21,
+	"CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED":                  22,
+	"PREMIUM_RATE_NUMBER_NOT_ALLOWED":                            23,
+	"DISALLOWED_NUMBER_TYPE":                                     24,
+	"INVALID_DOMESTIC_PHONE_NUMBER_FORMAT":                       25,
+	"VANITY_PHONE_NUMBER_NOT_ALLOWED":                            26,
+	"INVALID_COUNTRY_CODE":                                       27,
+	"INVALID_CALL_CONVERSION_TYPE_ID":                            28,
+	"CUSTOMER_NOT_WHITELISTED_FOR_CALLTRACKING":                  29,
+	"CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY":                     30,
+	"INVALID_APP_ID":                                             31,
+	"QUOTES_IN_REVIEW_EXTENSION_SNIPPET":                         32,
+	"HYPHENS_IN_REVIEW_EXTENSION_SNIPPET":                        33,
+	"REVIEW_EXTENSION_SOURCE_NOT_ELIGIBLE":                       34,
+	"SOURCE_NAME_IN_REVIEW_EXTENSION_TEXT":                       35,
+	"MISSING_FIELD":                                              36,
+	"INCONSISTENT_CURRENCY_CODES":                                37,
+	"PRICE_EXTENSION_HAS_DUPLICATED_HEADERS":                     38,
+	"PRICE_ITEM_HAS_DUPLICATED_HEADER_AND_DESCRIPTION":           39,
+	"PRICE_EXTENSION_HAS_TOO_FEW_ITEMS":                          40,
+	"PRICE_EXTENSION_HAS_TOO_MANY_ITEMS":                         41,
+	"UNSUPPORTED_VALUE":                                          42,
+	"INVALID_DEVICE_PREFERENCE":                                  43,
+	"INVALID_SCHEDULE_END":                                       45,
+	"DATE_TIME_MUST_BE_IN_ACCOUNT_TIME_ZONE":                     47,
+	"OVERLAPPING_SCHEDULES_NOT_ALLOWED":                          48,
+	"SCHEDULE_END_NOT_AFTER_START":                               49,
+	"TOO_MANY_SCHEDULES_PER_DAY":                                 50,
+	"DUPLICATE_EXTENSION_FEED_ITEM_EDIT":                         51,
+	"INVALID_SNIPPETS_HEADER":                                    52,
+	"PHONE_NUMBER_NOT_SUPPORTED_WITH_CALLTRACKING_FOR_COUNTRY":   53,
+	"CAMPAIGN_TARGETING_MISMATCH":                                54,
+	"CANNOT_OPERATE_ON_REMOVED_FEED":                             55,
+	"EXTENSION_TYPE_REQUIRED":                                    56,
+	"INCOMPATIBLE_UNDERLYING_MATCHING_FUNCTION":                  57,
+	"START_DATE_AFTER_END_DATE":                                  58,
+	"INVALID_PRICE_FORMAT":                                       59,
+	"PROMOTION_INVALID_TIME":                                     60,
+	"PROMOTION_CANNOT_SET_PERCENT_DISCOUNT_AND_MONEY_DISCOUNT":   61,
+	"PROMOTION_CANNOT_SET_PROMOTION_CODE_AND_ORDERS_OVER_AMOUNT": 62,
+	"TOO_MANY_DECIMAL_PLACES_SPECIFIED":                          63,
+	"INVALID_LANGUAGE_CODE":                                      64,
+	"UNSUPPORTED_LANGUAGE":                                       65,
+	"CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED":               66,
+	"EXTENSION_SETTING_UPDATE_IS_A_NOOP":                         67,
+}
+
+func (x ExtensionSettingErrorEnum_ExtensionSettingError) String() string {
+	return proto.EnumName(ExtensionSettingErrorEnum_ExtensionSettingError_name, int32(x))
+}
+
+func (ExtensionSettingErrorEnum_ExtensionSettingError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a1c5b67ed36c3d9a, []int{0, 0}
+}
+
+// Container for enum describing validation errors of extension settings.
+type ExtensionSettingErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExtensionSettingErrorEnum) Reset()         { *m = ExtensionSettingErrorEnum{} }
+func (m *ExtensionSettingErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ExtensionSettingErrorEnum) ProtoMessage()    {}
+func (*ExtensionSettingErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a1c5b67ed36c3d9a, []int{0}
+}
+
+func (m *ExtensionSettingErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExtensionSettingErrorEnum.Unmarshal(m, b)
+}
+func (m *ExtensionSettingErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExtensionSettingErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ExtensionSettingErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExtensionSettingErrorEnum.Merge(m, src)
+}
+func (m *ExtensionSettingErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ExtensionSettingErrorEnum.Size(m)
+}
+func (m *ExtensionSettingErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExtensionSettingErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExtensionSettingErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ExtensionSettingErrorEnum_ExtensionSettingError", ExtensionSettingErrorEnum_ExtensionSettingError_name, ExtensionSettingErrorEnum_ExtensionSettingError_value)
+	proto.RegisterType((*ExtensionSettingErrorEnum)(nil), "google.ads.googleads.v3.errors.ExtensionSettingErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/extension_setting_error.proto", fileDescriptor_a1c5b67ed36c3d9a)
+}
+
+var fileDescriptor_a1c5b67ed36c3d9a = []byte{
+	// 1312 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0x5d, 0x73, 0x53, 0xb7,
+	0x16, 0xbd, 0x84, 0x7b, 0xe1, 0x5e, 0x71, 0x01, 0x21, 0x08, 0x90, 0x00, 0x01, 0xc2, 0x37, 0x2d,
+	0x36, 0xd4, 0xd0, 0x52, 0x43, 0x69, 0x95, 0xa3, 0x6d, 0x5b, 0xc3, 0x39, 0x92, 0x90, 0x74, 0x1c,
+	0xcc, 0x64, 0x46, 0x93, 0x36, 0x99, 0x4c, 0x66, 0xc0, 0x66, 0xe2, 0x94, 0xe9, 0x4f, 0xe9, 0x73,
+	0x1f, 0xfb, 0x53, 0xfa, 0x53, 0xfa, 0xde, 0x97, 0x3e, 0x75, 0xb6, 0xce, 0x87, 0x9d, 0x2f, 0x0f,
+	0x4f, 0xf6, 0x91, 0xd6, 0xda, 0x7b, 0x6b, 0x6b, 0x69, 0x49, 0xe4, 0xe5, 0xd6, 0x68, 0xb4, 0xf5,
+	0x7e, 0xb3, 0xb9, 0xbe, 0x31, 0x6e, 0x16, 0x7f, 0xf1, 0xdf, 0xa7, 0x56, 0x73, 0x73, 0x67, 0x67,
+	0xb4, 0x33, 0x6e, 0x6e, 0xfe, 0xb2, 0xbb, 0x39, 0x1c, 0x6f, 0x8f, 0x86, 0x61, 0xbc, 0xb9, 0xbb,
+	0xbb, 0x3d, 0xdc, 0x0a, 0x71, 0xa2, 0xf1, 0x71, 0x67, 0xb4, 0x3b, 0x62, 0x4b, 0x05, 0xa5, 0xb1,
+	0xbe, 0x31, 0x6e, 0xd4, 0xec, 0xc6, 0xa7, 0x56, 0xa3, 0x60, 0x2f, 0x5e, 0xad, 0xa2, 0x7f, 0xdc,
+	0x6e, 0xae, 0x0f, 0x87, 0xa3, 0xdd, 0xf5, 0xdd, 0xed, 0xd1, 0x70, 0x5c, 0xb0, 0x97, 0x7f, 0xbd,
+	0x40, 0x16, 0xa0, 0x8a, 0xef, 0x8a, 0xf0, 0x80, 0x44, 0x18, 0xfe, 0xfc, 0x61, 0xf9, 0xef, 0xf3,
+	0x64, 0xfe, 0xd0, 0x59, 0x76, 0x96, 0x9c, 0xca, 0x95, 0x33, 0x90, 0xc8, 0x8e, 0x04, 0x41, 0xff,
+	0xc5, 0x4e, 0x91, 0x93, 0xb9, 0x7a, 0xad, 0xf4, 0xaa, 0xa2, 0xc7, 0xd8, 0x25, 0x72, 0x1e, 0xde,
+	0x7a, 0x50, 0x4e, 0x6a, 0xe5, 0x82, 0x85, 0x37, 0xb9, 0xb4, 0x20, 0xe8, 0x1c, 0xbb, 0x43, 0x6e,
+	0x76, 0x00, 0x44, 0xf0, 0x03, 0x03, 0xa1, 0x86, 0x14, 0x9f, 0x99, 0x74, 0x19, 0xf7, 0x49, 0x8f,
+	0x1e, 0x67, 0xf3, 0xe4, 0x9c, 0x54, 0x7d, 0x9e, 0x4a, 0x11, 0x6a, 0x38, 0xfd, 0x37, 0x7b, 0x4a,
+	0x1e, 0x1f, 0x18, 0x0e, 0x1d, 0x6d, 0x43, 0x92, 0x3b, 0xaf, 0x33, 0xb0, 0x53, 0x21, 0x1d, 0x78,
+	0x2f, 0x55, 0x97, 0xfe, 0x07, 0x73, 0x26, 0x5c, 0x29, 0xed, 0x43, 0xd2, 0xe3, 0xaa, 0x0b, 0x05,
+	0x57, 0x7a, 0xc8, 0x82, 0x56, 0x21, 0xb1, 0xc0, 0x3d, 0xd0, 0x13, 0xec, 0x01, 0xb9, 0x53, 0xc2,
+	0x72, 0x23, 0xb8, 0x87, 0xa0, 0x60, 0x35, 0x1d, 0x94, 0xf3, 0x62, 0x12, 0x99, 0x9e, 0x64, 0x2d,
+	0xd2, 0x54, 0x3a, 0xc0, 0x5b, 0xe9, 0x30, 0x45, 0xe0, 0x22, 0x74, 0xad, 0xce, 0xcd, 0xc1, 0xec,
+	0xb1, 0xb8, 0x58, 0xfc, 0x7f, 0xf7, 0x93, 0x12, 0x9e, 0x19, 0x2e, 0xbb, 0x6a, 0x16, 0xe9, 0x7f,
+	0x07, 0x48, 0x47, 0xae, 0x73, 0x42, 0x22, 0xec, 0x11, 0x79, 0x30, 0xa3, 0x24, 0x9e, 0x5a, 0xe0,
+	0x62, 0x50, 0x04, 0x75, 0xf4, 0x14, 0xc2, 0x67, 0x14, 0xb3, 0x0f, 0xfe, 0xff, 0x08, 0x3f, 0xba,
+	0x8c, 0x7d, 0xf0, 0xd3, 0xec, 0x19, 0x79, 0x52, 0x17, 0x13, 0x1b, 0xbf, 0x17, 0x11, 0xeb, 0x36,
+	0x29, 0x4f, 0xa0, 0xa7, 0x53, 0x01, 0xe5, 0x1a, 0xce, 0x20, 0xad, 0x2e, 0xea, 0xb3, 0x69, 0x67,
+	0x23, 0xad, 0x2a, 0xee, 0xb3, 0x69, 0x94, 0x5d, 0x24, 0xac, 0xcf, 0xd3, 0x1c, 0x82, 0xce, 0x7d,
+	0xd0, 0x9d, 0x60, 0x51, 0x27, 0xf4, 0x1c, 0xbb, 0x4d, 0x6e, 0x94, 0x9a, 0x70, 0xe0, 0x43, 0x47,
+	0x42, 0x2a, 0xc2, 0xaa, 0xf4, 0xbd, 0xd0, 0x91, 0x8a, 0xa7, 0x21, 0xb7, 0xa9, 0xa3, 0x0c, 0xd9,
+	0x93, 0xef, 0x50, 0xa2, 0xe9, 0x79, 0x76, 0x99, 0x5c, 0xa8, 0xe4, 0x6a, 0x7a, 0x5a, 0x41, 0x50,
+	0x79, 0xb6, 0x02, 0x96, 0x5e, 0x60, 0x0f, 0xc9, 0xdd, 0xe9, 0x91, 0x82, 0x93, 0x1b, 0xa3, 0x2d,
+	0x4a, 0x2d, 0x2a, 0x5a, 0xe7, 0xca, 0xdb, 0x01, 0x9d, 0x2f, 0xb6, 0xc7, 0x5a, 0x09, 0x36, 0x94,
+	0xe7, 0x2d, 0x09, 0xae, 0xa7, 0xad, 0x9f, 0x26, 0xf3, 0x34, 0xd5, 0xab, 0x20, 0xe8, 0x45, 0x76,
+	0x8b, 0x5c, 0x37, 0x16, 0x32, 0x99, 0x67, 0xc1, 0x46, 0x15, 0x1f, 0x04, 0x5d, 0x62, 0x8b, 0xe4,
+	0xa2, 0x90, 0xae, 0xfc, 0xae, 0x20, 0xb1, 0x17, 0x97, 0xd9, 0x7d, 0x72, 0xbb, 0xaa, 0x5a, 0xe8,
+	0x0c, 0x9c, 0x97, 0xc9, 0x9e, 0xf2, 0xb1, 0xbc, 0x8c, 0x7b, 0xba, 0x80, 0xa9, 0xfa, 0x5c, 0x49,
+	0x3f, 0x08, 0x07, 0x16, 0x53, 0xa5, 0x5a, 0x9c, 0x6e, 0x42, 0xb9, 0xa6, 0x90, 0x68, 0x01, 0xf4,
+	0x0a, 0xd2, 0xeb, 0x19, 0x9e, 0xa6, 0x21, 0xd1, 0xaa, 0x0f, 0x76, 0xe2, 0x07, 0x52, 0xd0, 0xab,
+	0x7b, 0xd4, 0x86, 0x81, 0x57, 0x7b, 0xd2, 0x43, 0x2a, 0x5d, 0xdd, 0x27, 0x9e, 0xa6, 0xde, 0xf2,
+	0xe4, 0x35, 0x9e, 0xf5, 0x6b, 0xd8, 0xd8, 0xe9, 0x91, 0x19, 0x8d, 0x5d, 0x62, 0x8c, 0x9c, 0xa9,
+	0xf2, 0x73, 0x63, 0x30, 0xdd, 0x75, 0x76, 0x97, 0x2c, 0xbf, 0xc9, 0xb5, 0x07, 0x17, 0xa4, 0x0a,
+	0x16, 0xfa, 0x12, 0x56, 0xa7, 0x45, 0xae, 0xa4, 0x31, 0xe0, 0xe9, 0x0d, 0x76, 0x8f, 0xdc, 0xea,
+	0x0d, 0x4c, 0x0f, 0xd4, 0x6c, 0xe0, 0x4d, 0xec, 0xe6, 0xc1, 0x59, 0x9d, 0xdb, 0x04, 0x62, 0x6d,
+	0x90, 0xca, 0xae, 0x5c, 0x49, 0x81, 0x2e, 0x23, 0xb2, 0x9a, 0xe0, 0x19, 0x1c, 0x1a, 0xd6, 0xc3,
+	0x5b, 0x4f, 0x6f, 0xb1, 0x73, 0xe4, 0x74, 0x26, 0x9d, 0x8b, 0xa7, 0x1e, 0x25, 0x49, 0x6f, 0xb3,
+	0xeb, 0xe4, 0x8a, 0x54, 0x89, 0x56, 0x0e, 0x3b, 0xa3, 0x7c, 0x48, 0x72, 0x6b, 0x41, 0x25, 0x45,
+	0xaf, 0x1d, 0xbd, 0x13, 0x15, 0x67, 0x65, 0x32, 0x6d, 0xba, 0x3d, 0xee, 0x82, 0xc8, 0x4d, 0x2a,
+	0x93, 0x68, 0x70, 0x3d, 0xe0, 0x02, 0xac, 0xa3, 0x77, 0xd1, 0x66, 0x0b, 0x6c, 0xf4, 0xc8, 0x43,
+	0x61, 0x81, 0x2b, 0x11, 0x04, 0xb8, 0xc4, 0x4a, 0xe3, 0xd1, 0x14, 0xef, 0xa1, 0xcd, 0x1e, 0x96,
+	0xc1, 0x6b, 0x1d, 0x3a, 0xb0, 0x1a, 0x63, 0x39, 0x7a, 0x1f, 0x3b, 0x7c, 0x14, 0x2c, 0xe3, 0x6a,
+	0x50, 0xe2, 0x1e, 0xe0, 0x15, 0x90, 0xab, 0xc9, 0xd6, 0xc5, 0xe3, 0x49, 0x1f, 0xb2, 0x6b, 0x64,
+	0xa1, 0x56, 0x27, 0xf4, 0x31, 0x8e, 0xb1, 0xd0, 0x01, 0x5c, 0x2c, 0xd0, 0x2f, 0xa6, 0xd5, 0xe6,
+	0x92, 0x1e, 0x88, 0x3c, 0x85, 0x00, 0x4a, 0xd0, 0x47, 0xd8, 0x80, 0xe8, 0xea, 0x5e, 0x66, 0x10,
+	0xb2, 0xdc, 0xf9, 0xb0, 0x12, 0x9b, 0xcc, 0x93, 0xa8, 0x88, 0x62, 0xfc, 0x9d, 0x56, 0x40, 0x9b,
+	0xb8, 0x14, 0xdd, 0x07, 0x9b, 0x72, 0x63, 0xb0, 0xc9, 0x55, 0x24, 0xb7, 0x47, 0xda, 0x8f, 0xd9,
+	0x0d, 0x72, 0x75, 0x3a, 0x49, 0x31, 0xdb, 0xf1, 0x78, 0x50, 0x3d, 0xb7, 0x9e, 0x3e, 0x61, 0x4b,
+	0x64, 0xb1, 0x5e, 0xd8, 0x24, 0x8a, 0x01, 0x1b, 0x04, 0x1f, 0xd0, 0xaf, 0xb0, 0x19, 0x75, 0x6b,
+	0xa7, 0x1a, 0x32, 0xb9, 0xa0, 0x40, 0x48, 0x4f, 0x5b, 0xec, 0x0a, 0xb9, 0x54, 0x2f, 0xab, 0x90,
+	0x96, 0x2b, 0x37, 0x82, 0x3e, 0x65, 0x2f, 0xc9, 0xf3, 0x19, 0x66, 0x12, 0xed, 0x6a, 0xcf, 0x99,
+	0x98, 0x3e, 0x05, 0xcf, 0x50, 0x39, 0xb5, 0xd1, 0x7a, 0x6e, 0xbb, 0x10, 0x6d, 0xbc, 0xbe, 0x8b,
+	0xbf, 0x66, 0xcb, 0x64, 0xa9, 0xf4, 0x40, 0x6d, 0x20, 0x5a, 0x8a, 0x46, 0x69, 0x66, 0xba, 0x0f,
+	0xc5, 0x35, 0x4c, 0xbf, 0xc1, 0xfa, 0xf6, 0x5d, 0xe6, 0xf5, 0x9d, 0xff, 0x1c, 0x8f, 0x30, 0x6a,
+	0x33, 0x33, 0xdc, 0xa3, 0xd4, 0x43, 0xae, 0x04, 0xd8, 0x74, 0x10, 0xd3, 0x60, 0x8e, 0x58, 0x53,
+	0xae, 0x92, 0xa8, 0xa3, 0x6f, 0x71, 0x87, 0x63, 0xfb, 0x42, 0xdc, 0xae, 0xa2, 0x9f, 0xd8, 0x5d,
+	0xfc, 0xa4, 0xed, 0x3d, 0xa6, 0x1a, 0x75, 0x54, 0xda, 0xd1, 0x0b, 0x34, 0x35, 0x63, 0x75, 0xa6,
+	0x31, 0x4e, 0xa8, 0x30, 0xb8, 0xad, 0xf4, 0x65, 0xec, 0x51, 0x3d, 0x37, 0x65, 0xe9, 0x06, 0x6c,
+	0x82, 0xe7, 0x45, 0x48, 0x57, 0xc8, 0x00, 0x75, 0x9d, 0x69, 0x05, 0x83, 0x7a, 0x88, 0x7e, 0xc7,
+	0x5e, 0x91, 0xf6, 0xe1, 0xec, 0xc9, 0xa0, 0x16, 0x10, 0xb9, 0xda, 0xe2, 0x21, 0x0a, 0x28, 0x9f,
+	0xc0, 0xb3, 0xc8, 0x7f, 0x85, 0x7a, 0xaa, 0x65, 0x20, 0x20, 0x91, 0x19, 0x4f, 0x8b, 0x5b, 0xc8,
+	0x85, 0xc9, 0x13, 0xea, 0x7b, 0xb6, 0x40, 0xe6, 0xab, 0xb2, 0x53, 0xae, 0xba, 0x39, 0xef, 0x42,
+	0xe1, 0x95, 0x3f, 0xe0, 0xaa, 0xa7, 0x4f, 0x43, 0x35, 0x4d, 0x39, 0x7b, 0x4c, 0xbe, 0xac, 0x0d,
+	0x12, 0x0d, 0x00, 0x57, 0x53, 0x19, 0x63, 0xb0, 0x90, 0x68, 0x2b, 0xb0, 0xc1, 0xf5, 0x7e, 0xac,
+	0xa0, 0xe8, 0x0e, 0xde, 0xdb, 0xe5, 0x9b, 0x47, 0xba, 0xc0, 0x83, 0xd2, 0xda, 0xd0, 0x64, 0xe5,
+	0xaf, 0x63, 0x64, 0xf9, 0xa7, 0xd1, 0x87, 0xc6, 0xec, 0xf7, 0xe5, 0xca, 0xe2, 0xa1, 0x0f, 0x44,
+	0x83, 0xaf, 0x4b, 0x73, 0xec, 0x9d, 0x28, 0xd9, 0x5b, 0xa3, 0xf7, 0xeb, 0xc3, 0xad, 0xc6, 0x68,
+	0x67, 0xab, 0xb9, 0xb5, 0x39, 0x8c, 0x6f, 0xcf, 0xea, 0xad, 0xfb, 0x71, 0x7b, 0x7c, 0xd4, 0xd3,
+	0xf7, 0x45, 0xf1, 0xf3, 0xdb, 0xdc, 0xf1, 0x2e, 0xe7, 0xbf, 0xcf, 0x2d, 0x75, 0x8b, 0x60, 0x7c,
+	0x63, 0xdc, 0x28, 0xfe, 0xe2, 0xbf, 0x7e, 0xab, 0x11, 0x53, 0x8e, 0xff, 0xa8, 0x00, 0x6b, 0x7c,
+	0x63, 0xbc, 0x56, 0x03, 0xd6, 0xfa, 0xad, 0xb5, 0x02, 0xf0, 0xe7, 0xdc, 0x72, 0x31, 0xda, 0x6e,
+	0xf3, 0x8d, 0x71, 0xbb, 0x5d, 0x43, 0xda, 0xed, 0x7e, 0xab, 0xdd, 0x2e, 0x40, 0x3f, 0x9e, 0x88,
+	0xd5, 0xb5, 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0xcc, 0x32, 0x81, 0x8f, 0x97, 0x0b, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/feed_attribute_reference_error.pb.go b/googleapis/ads/googleads/v3/errors/feed_attribute_reference_error.pb.go
new file mode 100644
index 0000000..59afab9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/feed_attribute_reference_error.pb.go
@@ -0,0 +1,131 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/feed_attribute_reference_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible feed attribute reference errors.
+type FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError int32
+
+const (
+	// Enum unspecified.
+	FeedAttributeReferenceErrorEnum_UNSPECIFIED FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError = 0
+	// The received error code is not known in this version.
+	FeedAttributeReferenceErrorEnum_UNKNOWN FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError = 1
+	// A feed referenced by ID has been removed.
+	FeedAttributeReferenceErrorEnum_CANNOT_REFERENCE_REMOVED_FEED FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError = 2
+	// There is no enabled feed with the given name.
+	FeedAttributeReferenceErrorEnum_INVALID_FEED_NAME FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError = 3
+	// There is no feed attribute in an enabled feed with the given name.
+	FeedAttributeReferenceErrorEnum_INVALID_FEED_ATTRIBUTE_NAME FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError = 4
+)
+
+var FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CANNOT_REFERENCE_REMOVED_FEED",
+	3: "INVALID_FEED_NAME",
+	4: "INVALID_FEED_ATTRIBUTE_NAME",
+}
+
+var FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError_value = map[string]int32{
+	"UNSPECIFIED":                   0,
+	"UNKNOWN":                       1,
+	"CANNOT_REFERENCE_REMOVED_FEED": 2,
+	"INVALID_FEED_NAME":             3,
+	"INVALID_FEED_ATTRIBUTE_NAME":   4,
+}
+
+func (x FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError) String() string {
+	return proto.EnumName(FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError_name, int32(x))
+}
+
+func (FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fc8d6ce7179580a8, []int{0, 0}
+}
+
+// Container for enum describing possible feed attribute reference errors.
+type FeedAttributeReferenceErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedAttributeReferenceErrorEnum) Reset()         { *m = FeedAttributeReferenceErrorEnum{} }
+func (m *FeedAttributeReferenceErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedAttributeReferenceErrorEnum) ProtoMessage()    {}
+func (*FeedAttributeReferenceErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc8d6ce7179580a8, []int{0}
+}
+
+func (m *FeedAttributeReferenceErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedAttributeReferenceErrorEnum.Unmarshal(m, b)
+}
+func (m *FeedAttributeReferenceErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedAttributeReferenceErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedAttributeReferenceErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedAttributeReferenceErrorEnum.Merge(m, src)
+}
+func (m *FeedAttributeReferenceErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedAttributeReferenceErrorEnum.Size(m)
+}
+func (m *FeedAttributeReferenceErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedAttributeReferenceErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedAttributeReferenceErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError", FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError_name, FeedAttributeReferenceErrorEnum_FeedAttributeReferenceError_value)
+	proto.RegisterType((*FeedAttributeReferenceErrorEnum)(nil), "google.ads.googleads.v3.errors.FeedAttributeReferenceErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/feed_attribute_reference_error.proto", fileDescriptor_fc8d6ce7179580a8)
+}
+
+var fileDescriptor_fc8d6ce7179580a8 = []byte{
+	// 363 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x6e, 0xa3, 0x30,
+	0x14, 0x86, 0x07, 0x32, 0x9a, 0x91, 0x9c, 0xc5, 0x30, 0x48, 0xdd, 0x34, 0x6d, 0xd2, 0x72, 0x00,
+	0xb3, 0x60, 0xe7, 0xae, 0x1c, 0x30, 0x11, 0x6a, 0xe3, 0x44, 0x94, 0x50, 0xa9, 0x42, 0x42, 0x24,
+	0x38, 0x08, 0x29, 0xc1, 0x91, 0x4d, 0x72, 0x94, 0x1e, 0xa0, 0xcb, 0x1e, 0xa1, 0x47, 0xe8, 0x51,
+	0x7a, 0x85, 0x6e, 0x2a, 0x70, 0x89, 0xd4, 0x45, 0xb3, 0xf2, 0xaf, 0xe7, 0xef, 0xfd, 0xff, 0xd3,
+	0x7b, 0xc0, 0x2d, 0x38, 0x2f, 0x36, 0xcc, 0xce, 0x72, 0x69, 0x2b, 0xd9, 0xa8, 0x83, 0x63, 0x33,
+	0x21, 0xb8, 0x90, 0xf6, 0x9a, 0xb1, 0x3c, 0xcd, 0xea, 0x5a, 0x94, 0xcb, 0x7d, 0xcd, 0x52, 0xc1,
+	0xd6, 0x4c, 0xb0, 0x6a, 0xc5, 0xd2, 0xf6, 0x1f, 0xee, 0x04, 0xaf, 0xb9, 0x39, 0x54, 0x9d, 0x30,
+	0xcb, 0x25, 0x3c, 0x9a, 0xc0, 0x83, 0x03, 0x95, 0xc9, 0xf9, 0x45, 0x17, 0xb2, 0x2b, 0xed, 0xac,
+	0xaa, 0x78, 0x9d, 0xd5, 0x25, 0xaf, 0xa4, 0xea, 0xb6, 0x5e, 0x35, 0x30, 0xf2, 0x19, 0xcb, 0x71,
+	0x97, 0x12, 0x76, 0x21, 0xa4, 0x69, 0x27, 0xd5, 0x7e, 0x6b, 0x3d, 0x69, 0x60, 0x70, 0x82, 0x31,
+	0xff, 0x81, 0xfe, 0x82, 0xde, 0xcf, 0x89, 0x1b, 0xf8, 0x01, 0xf1, 0x8c, 0x5f, 0x66, 0x1f, 0xfc,
+	0x5d, 0xd0, 0x5b, 0x3a, 0x7b, 0xa0, 0x86, 0x66, 0x5e, 0x83, 0x4b, 0x17, 0x53, 0x3a, 0x8b, 0xd2,
+	0x90, 0xf8, 0x24, 0x24, 0xd4, 0x25, 0x69, 0x48, 0xa6, 0xb3, 0x98, 0x78, 0xa9, 0x4f, 0x88, 0x67,
+	0xe8, 0xe6, 0x19, 0xf8, 0x1f, 0xd0, 0x18, 0xdf, 0x05, 0xaa, 0x92, 0x52, 0x3c, 0x25, 0x46, 0xcf,
+	0x1c, 0x81, 0xc1, 0xb7, 0x32, 0x8e, 0xa2, 0x30, 0x18, 0x2f, 0x22, 0xa2, 0x80, 0xdf, 0xe3, 0x0f,
+	0x0d, 0x58, 0x2b, 0xbe, 0x85, 0xa7, 0x37, 0x30, 0xbe, 0x3a, 0x31, 0xfc, 0xbc, 0xd9, 0xc2, 0x5c,
+	0x7b, 0xf4, 0xbe, 0x3c, 0x0a, 0xbe, 0xc9, 0xaa, 0x02, 0x72, 0x51, 0xd8, 0x05, 0xab, 0xda, 0x1d,
+	0x75, 0xa7, 0xd9, 0x95, 0xf2, 0xa7, 0x4b, 0xdd, 0xa8, 0xe7, 0x59, 0xef, 0x4d, 0x30, 0x7e, 0xd1,
+	0x87, 0x13, 0x65, 0x86, 0x73, 0x09, 0x95, 0x6c, 0x54, 0xec, 0xc0, 0x36, 0x52, 0xbe, 0x75, 0x40,
+	0x82, 0x73, 0x99, 0x1c, 0x81, 0x24, 0x76, 0x12, 0x05, 0xbc, 0xeb, 0x96, 0xaa, 0x22, 0x84, 0x73,
+	0x89, 0xd0, 0x11, 0x41, 0x28, 0x76, 0x10, 0x52, 0xd0, 0xf2, 0x4f, 0x3b, 0x9d, 0xf3, 0x19, 0x00,
+	0x00, 0xff, 0xff, 0x21, 0x68, 0x14, 0x5f, 0x46, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/feed_error.pb.go b/googleapis/ads/googleads/v3/errors/feed_error.pb.go
new file mode 100644
index 0000000..69161ab
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/feed_error.pb.go
@@ -0,0 +1,226 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/feed_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible feed errors.
+type FeedErrorEnum_FeedError int32
+
+const (
+	// Enum unspecified.
+	FeedErrorEnum_UNSPECIFIED FeedErrorEnum_FeedError = 0
+	// The received error code is not known in this version.
+	FeedErrorEnum_UNKNOWN FeedErrorEnum_FeedError = 1
+	// The names of the FeedAttributes must be unique.
+	FeedErrorEnum_ATTRIBUTE_NAMES_NOT_UNIQUE FeedErrorEnum_FeedError = 2
+	// The attribute list must be an exact copy of the existing list if the
+	// attribute ID's are present.
+	FeedErrorEnum_ATTRIBUTES_DO_NOT_MATCH_EXISTING_ATTRIBUTES FeedErrorEnum_FeedError = 3
+	// Cannot specify USER origin for a system generated feed.
+	FeedErrorEnum_CANNOT_SPECIFY_USER_ORIGIN_FOR_SYSTEM_FEED FeedErrorEnum_FeedError = 4
+	// Cannot specify GOOGLE origin for a non-system generated feed.
+	FeedErrorEnum_CANNOT_SPECIFY_GOOGLE_ORIGIN_FOR_NON_SYSTEM_FEED FeedErrorEnum_FeedError = 5
+	// Cannot specify feed attributes for system feed.
+	FeedErrorEnum_CANNOT_SPECIFY_FEED_ATTRIBUTES_FOR_SYSTEM_FEED FeedErrorEnum_FeedError = 6
+	// Cannot update FeedAttributes on feed with origin GOOGLE.
+	FeedErrorEnum_CANNOT_UPDATE_FEED_ATTRIBUTES_WITH_ORIGIN_GOOGLE FeedErrorEnum_FeedError = 7
+	// The given ID refers to a removed Feed. Removed Feeds are immutable.
+	FeedErrorEnum_FEED_REMOVED FeedErrorEnum_FeedError = 8
+	// The origin of the feed is not valid for the client.
+	FeedErrorEnum_INVALID_ORIGIN_VALUE FeedErrorEnum_FeedError = 9
+	// A user can only create and modify feeds with USER origin.
+	FeedErrorEnum_FEED_ORIGIN_IS_NOT_USER FeedErrorEnum_FeedError = 10
+	// Invalid auth token for the given email.
+	FeedErrorEnum_INVALID_AUTH_TOKEN_FOR_EMAIL FeedErrorEnum_FeedError = 11
+	// Invalid email specified.
+	FeedErrorEnum_INVALID_EMAIL FeedErrorEnum_FeedError = 12
+	// Feed name matches that of another active Feed.
+	FeedErrorEnum_DUPLICATE_FEED_NAME FeedErrorEnum_FeedError = 13
+	// Name of feed is not allowed.
+	FeedErrorEnum_INVALID_FEED_NAME FeedErrorEnum_FeedError = 14
+	// Missing OAuthInfo.
+	FeedErrorEnum_MISSING_OAUTH_INFO FeedErrorEnum_FeedError = 15
+	// New FeedAttributes must not affect the unique key.
+	FeedErrorEnum_NEW_ATTRIBUTE_CANNOT_BE_PART_OF_UNIQUE_KEY FeedErrorEnum_FeedError = 16
+	// Too many FeedAttributes for a Feed.
+	FeedErrorEnum_TOO_MANY_ATTRIBUTES FeedErrorEnum_FeedError = 17
+	// The business account is not valid.
+	FeedErrorEnum_INVALID_BUSINESS_ACCOUNT FeedErrorEnum_FeedError = 18
+	// Business account cannot access Google My Business account.
+	FeedErrorEnum_BUSINESS_ACCOUNT_CANNOT_ACCESS_LOCATION_ACCOUNT FeedErrorEnum_FeedError = 19
+	// Invalid chain ID provided for affiliate location feed.
+	FeedErrorEnum_INVALID_AFFILIATE_CHAIN_ID FeedErrorEnum_FeedError = 20
+	// There is already a feed with the given system feed generation data.
+	FeedErrorEnum_DUPLICATE_SYSTEM_FEED FeedErrorEnum_FeedError = 21
+	// An error occurred accessing GMB account.
+	FeedErrorEnum_GMB_ACCESS_ERROR FeedErrorEnum_FeedError = 22
+	// A customer cannot have both LOCATION and AFFILIATE_LOCATION feeds.
+	FeedErrorEnum_CANNOT_HAVE_LOCATION_AND_AFFILIATE_LOCATION_FEEDS FeedErrorEnum_FeedError = 23
+)
+
+var FeedErrorEnum_FeedError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "ATTRIBUTE_NAMES_NOT_UNIQUE",
+	3:  "ATTRIBUTES_DO_NOT_MATCH_EXISTING_ATTRIBUTES",
+	4:  "CANNOT_SPECIFY_USER_ORIGIN_FOR_SYSTEM_FEED",
+	5:  "CANNOT_SPECIFY_GOOGLE_ORIGIN_FOR_NON_SYSTEM_FEED",
+	6:  "CANNOT_SPECIFY_FEED_ATTRIBUTES_FOR_SYSTEM_FEED",
+	7:  "CANNOT_UPDATE_FEED_ATTRIBUTES_WITH_ORIGIN_GOOGLE",
+	8:  "FEED_REMOVED",
+	9:  "INVALID_ORIGIN_VALUE",
+	10: "FEED_ORIGIN_IS_NOT_USER",
+	11: "INVALID_AUTH_TOKEN_FOR_EMAIL",
+	12: "INVALID_EMAIL",
+	13: "DUPLICATE_FEED_NAME",
+	14: "INVALID_FEED_NAME",
+	15: "MISSING_OAUTH_INFO",
+	16: "NEW_ATTRIBUTE_CANNOT_BE_PART_OF_UNIQUE_KEY",
+	17: "TOO_MANY_ATTRIBUTES",
+	18: "INVALID_BUSINESS_ACCOUNT",
+	19: "BUSINESS_ACCOUNT_CANNOT_ACCESS_LOCATION_ACCOUNT",
+	20: "INVALID_AFFILIATE_CHAIN_ID",
+	21: "DUPLICATE_SYSTEM_FEED",
+	22: "GMB_ACCESS_ERROR",
+	23: "CANNOT_HAVE_LOCATION_AND_AFFILIATE_LOCATION_FEEDS",
+}
+
+var FeedErrorEnum_FeedError_value = map[string]int32{
+	"UNSPECIFIED":                0,
+	"UNKNOWN":                    1,
+	"ATTRIBUTE_NAMES_NOT_UNIQUE": 2,
+	"ATTRIBUTES_DO_NOT_MATCH_EXISTING_ATTRIBUTES":      3,
+	"CANNOT_SPECIFY_USER_ORIGIN_FOR_SYSTEM_FEED":       4,
+	"CANNOT_SPECIFY_GOOGLE_ORIGIN_FOR_NON_SYSTEM_FEED": 5,
+	"CANNOT_SPECIFY_FEED_ATTRIBUTES_FOR_SYSTEM_FEED":   6,
+	"CANNOT_UPDATE_FEED_ATTRIBUTES_WITH_ORIGIN_GOOGLE": 7,
+	"FEED_REMOVED":                                      8,
+	"INVALID_ORIGIN_VALUE":                              9,
+	"FEED_ORIGIN_IS_NOT_USER":                           10,
+	"INVALID_AUTH_TOKEN_FOR_EMAIL":                      11,
+	"INVALID_EMAIL":                                     12,
+	"DUPLICATE_FEED_NAME":                               13,
+	"INVALID_FEED_NAME":                                 14,
+	"MISSING_OAUTH_INFO":                                15,
+	"NEW_ATTRIBUTE_CANNOT_BE_PART_OF_UNIQUE_KEY":        16,
+	"TOO_MANY_ATTRIBUTES":                               17,
+	"INVALID_BUSINESS_ACCOUNT":                          18,
+	"BUSINESS_ACCOUNT_CANNOT_ACCESS_LOCATION_ACCOUNT":   19,
+	"INVALID_AFFILIATE_CHAIN_ID":                        20,
+	"DUPLICATE_SYSTEM_FEED":                             21,
+	"GMB_ACCESS_ERROR":                                  22,
+	"CANNOT_HAVE_LOCATION_AND_AFFILIATE_LOCATION_FEEDS": 23,
+}
+
+func (x FeedErrorEnum_FeedError) String() string {
+	return proto.EnumName(FeedErrorEnum_FeedError_name, int32(x))
+}
+
+func (FeedErrorEnum_FeedError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_541b0c4a2999424f, []int{0, 0}
+}
+
+// Container for enum describing possible feed errors.
+type FeedErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedErrorEnum) Reset()         { *m = FeedErrorEnum{} }
+func (m *FeedErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedErrorEnum) ProtoMessage()    {}
+func (*FeedErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_541b0c4a2999424f, []int{0}
+}
+
+func (m *FeedErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedErrorEnum.Unmarshal(m, b)
+}
+func (m *FeedErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedErrorEnum.Merge(m, src)
+}
+func (m *FeedErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedErrorEnum.Size(m)
+}
+func (m *FeedErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FeedErrorEnum_FeedError", FeedErrorEnum_FeedError_name, FeedErrorEnum_FeedError_value)
+	proto.RegisterType((*FeedErrorEnum)(nil), "google.ads.googleads.v3.errors.FeedErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/feed_error.proto", fileDescriptor_541b0c4a2999424f)
+}
+
+var fileDescriptor_541b0c4a2999424f = []byte{
+	// 652 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xcd, 0x6e, 0xd4, 0x3a,
+	0x14, 0xbe, 0x9d, 0xde, 0x3b, 0xbd, 0x75, 0xff, 0x5c, 0xf7, 0xf7, 0xf6, 0x56, 0x15, 0x9a, 0x25,
+	0x48, 0x09, 0x30, 0xb0, 0x09, 0x2b, 0x4f, 0xe2, 0x64, 0xac, 0x26, 0xf6, 0x10, 0x3b, 0x29, 0x83,
+	0x46, 0xb2, 0x06, 0x12, 0x46, 0x95, 0xda, 0x49, 0x35, 0x29, 0x7d, 0x20, 0x96, 0xac, 0x79, 0x06,
+	0x16, 0xbc, 0x09, 0x3c, 0x05, 0x72, 0xfe, 0x26, 0xb4, 0x82, 0x55, 0x8e, 0x3e, 0x7f, 0xdf, 0xf9,
+	0x8e, 0xcf, 0xc9, 0x31, 0x30, 0x67, 0x59, 0x36, 0xbb, 0x4a, 0xcd, 0x69, 0x92, 0x57, 0xa1, 0x8e,
+	0xee, 0xfa, 0x66, 0xba, 0x58, 0x64, 0x8b, 0xdc, 0xfc, 0x90, 0xa6, 0x89, 0x2a, 0x62, 0xe3, 0x66,
+	0x91, 0xdd, 0x66, 0xe8, 0xac, 0x64, 0x19, 0xd3, 0x24, 0x37, 0x1a, 0x81, 0x71, 0xd7, 0x37, 0x4a,
+	0xc1, 0xc9, 0x69, 0x9d, 0xf0, 0xe6, 0xd2, 0x9c, 0xce, 0xe7, 0xd9, 0xed, 0xf4, 0xf6, 0x32, 0x9b,
+	0xe7, 0xa5, 0xba, 0xf7, 0xb5, 0x0b, 0xb6, 0xdc, 0x34, 0x4d, 0x88, 0x26, 0x93, 0xf9, 0xc7, 0xeb,
+	0xde, 0x97, 0x2e, 0x58, 0x6f, 0x10, 0xb4, 0x03, 0x36, 0x22, 0x26, 0x46, 0xc4, 0xa6, 0x2e, 0x25,
+	0x0e, 0xfc, 0x0b, 0x6d, 0x80, 0xb5, 0x88, 0x9d, 0x33, 0x7e, 0xc1, 0xe0, 0x0a, 0x3a, 0x03, 0x27,
+	0x58, 0xca, 0x90, 0x0e, 0x22, 0x49, 0x14, 0xc3, 0x01, 0x11, 0x8a, 0x71, 0xa9, 0x22, 0x46, 0x5f,
+	0x47, 0x04, 0x76, 0x90, 0x09, 0x9e, 0x34, 0xe7, 0x42, 0x39, 0xbc, 0x38, 0x0d, 0xb0, 0xb4, 0x87,
+	0x8a, 0xbc, 0xa1, 0x42, 0x52, 0xe6, 0xa9, 0x25, 0x01, 0xae, 0x22, 0x03, 0x3c, 0xb6, 0x31, 0xd3,
+	0xac, 0xd2, 0x73, 0xac, 0x22, 0x41, 0x42, 0xc5, 0x43, 0xea, 0x51, 0xa6, 0x5c, 0x1e, 0x2a, 0x31,
+	0x16, 0x92, 0x04, 0xca, 0x25, 0xc4, 0x81, 0x7f, 0xa3, 0x17, 0xe0, 0xe9, 0x3d, 0xbe, 0xc7, 0xb9,
+	0xe7, 0x93, 0xb6, 0x82, 0x71, 0xf6, 0x8b, 0xea, 0x1f, 0xf4, 0x1c, 0x18, 0xf7, 0x54, 0xfa, 0xa0,
+	0x55, 0xc9, 0x03, 0xa7, 0x6e, 0xcb, 0x29, 0x1a, 0x39, 0x58, 0x92, 0x07, 0x92, 0x0b, 0x2a, 0x87,
+	0xb5, 0x6d, 0x59, 0x04, 0x5c, 0x43, 0x10, 0x6c, 0x16, 0xbc, 0x90, 0x04, 0x3c, 0x26, 0x0e, 0xfc,
+	0x17, 0x1d, 0x83, 0x7d, 0xca, 0x62, 0xec, 0x53, 0xa7, 0x26, 0xc7, 0xd8, 0x8f, 0x08, 0x5c, 0x47,
+	0xff, 0x83, 0xa3, 0x82, 0x5b, 0xc1, 0xb4, 0xea, 0xa5, 0x20, 0x21, 0x04, 0xe8, 0x11, 0x38, 0xad,
+	0x65, 0x38, 0x92, 0x43, 0x25, 0xf9, 0x39, 0x29, 0xaf, 0x47, 0x02, 0x4c, 0x7d, 0xb8, 0x81, 0x76,
+	0xc1, 0x56, 0xcd, 0x28, 0xa1, 0x4d, 0x74, 0x04, 0xf6, 0x9c, 0x68, 0xe4, 0x53, 0xbb, 0xa9, 0x57,
+	0xcf, 0x08, 0x6e, 0xa1, 0x03, 0xb0, 0x5b, 0x73, 0x97, 0xf0, 0x36, 0x3a, 0x04, 0x28, 0xa0, 0x42,
+	0xe8, 0xa9, 0xf0, 0xc2, 0x85, 0x32, 0x97, 0xc3, 0x1d, 0x3d, 0x15, 0x46, 0x2e, 0x96, 0x97, 0x55,
+	0x55, 0x27, 0x06, 0x44, 0x8d, 0x70, 0x28, 0x15, 0x77, 0xab, 0x91, 0xab, 0x73, 0x32, 0x86, 0x50,
+	0xfb, 0x4a, 0xce, 0x55, 0x80, 0xd9, 0xb8, 0x3d, 0xde, 0x5d, 0x74, 0x0a, 0x8e, 0x6b, 0xdf, 0x41,
+	0x24, 0x28, 0x23, 0x42, 0x28, 0x6c, 0xdb, 0x3c, 0x62, 0x12, 0x22, 0xd4, 0x07, 0xe6, 0x7d, 0xb4,
+	0x76, 0xc2, 0xb6, 0xad, 0x51, 0x9f, 0xdb, 0x58, 0x52, 0xce, 0x1a, 0xd1, 0x9e, 0xfe, 0x05, 0x9b,
+	0xc6, 0xb8, 0x2e, 0xf5, 0xa9, 0xbe, 0xab, 0x3d, 0xc4, 0xba, 0x83, 0x0e, 0xdc, 0x47, 0xff, 0x81,
+	0x83, 0x65, 0x0f, 0xda, 0x23, 0x3d, 0x40, 0xfb, 0x00, 0x7a, 0xc1, 0xa0, 0xce, 0x4d, 0xc2, 0x90,
+	0x87, 0xf0, 0x10, 0xbd, 0x04, 0xcf, 0x2a, 0xd3, 0x21, 0x8e, 0x49, 0xcb, 0x92, 0xb5, 0x1d, 0x1a,
+	0x58, 0xe7, 0x12, 0xf0, 0x68, 0xf0, 0x7d, 0x05, 0xf4, 0xde, 0x67, 0xd7, 0xc6, 0x9f, 0xb7, 0x71,
+	0xb0, 0xdd, 0xac, 0xd6, 0x48, 0xef, 0xdf, 0x68, 0xe5, 0xad, 0x53, 0x29, 0x66, 0xd9, 0xd5, 0x74,
+	0x3e, 0x33, 0xb2, 0xc5, 0xcc, 0x9c, 0xa5, 0xf3, 0x62, 0x3b, 0xeb, 0x07, 0xe0, 0xe6, 0x32, 0xff,
+	0xdd, 0x7b, 0xf0, 0xaa, 0xfc, 0x7c, 0xea, 0xac, 0x7a, 0x18, 0x7f, 0xee, 0x9c, 0x79, 0x65, 0x32,
+	0x9c, 0xe4, 0x46, 0x19, 0xea, 0x28, 0xee, 0x1b, 0x85, 0x65, 0xfe, 0xad, 0x26, 0x4c, 0x70, 0x92,
+	0x4f, 0x1a, 0xc2, 0x24, 0xee, 0x4f, 0x4a, 0xc2, 0x8f, 0x4e, 0xaf, 0x44, 0x2d, 0x0b, 0x27, 0xb9,
+	0x65, 0x35, 0x14, 0xcb, 0x8a, 0xfb, 0x96, 0x55, 0x92, 0xde, 0x75, 0x8b, 0xea, 0xfa, 0x3f, 0x03,
+	0x00, 0x00, 0xff, 0xff, 0x73, 0x9c, 0x6a, 0x3e, 0xac, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/feed_item_error.pb.go b/googleapis/ads/googleads/v3/errors/feed_item_error.pb.go
new file mode 100644
index 0000000..041ce9b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/feed_item_error.pb.go
@@ -0,0 +1,163 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/feed_item_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible feed item errors.
+type FeedItemErrorEnum_FeedItemError int32
+
+const (
+	// Enum unspecified.
+	FeedItemErrorEnum_UNSPECIFIED FeedItemErrorEnum_FeedItemError = 0
+	// The received error code is not known in this version.
+	FeedItemErrorEnum_UNKNOWN FeedItemErrorEnum_FeedItemError = 1
+	// Cannot convert the feed attribute value from string to its real type.
+	FeedItemErrorEnum_CANNOT_CONVERT_ATTRIBUTE_VALUE_FROM_STRING FeedItemErrorEnum_FeedItemError = 2
+	// Cannot operate on removed feed item.
+	FeedItemErrorEnum_CANNOT_OPERATE_ON_REMOVED_FEED_ITEM FeedItemErrorEnum_FeedItemError = 3
+	// Date time zone does not match the account's time zone.
+	FeedItemErrorEnum_DATE_TIME_MUST_BE_IN_ACCOUNT_TIME_ZONE FeedItemErrorEnum_FeedItemError = 4
+	// Feed item with the key attributes could not be found.
+	FeedItemErrorEnum_KEY_ATTRIBUTES_NOT_FOUND FeedItemErrorEnum_FeedItemError = 5
+	// Url feed attribute value is not valid.
+	FeedItemErrorEnum_INVALID_URL FeedItemErrorEnum_FeedItemError = 6
+	// Some key attributes are missing.
+	FeedItemErrorEnum_MISSING_KEY_ATTRIBUTES FeedItemErrorEnum_FeedItemError = 7
+	// Feed item has same key attributes as another feed item.
+	FeedItemErrorEnum_KEY_ATTRIBUTES_NOT_UNIQUE FeedItemErrorEnum_FeedItemError = 8
+	// Cannot modify key attributes on an existing feed item.
+	FeedItemErrorEnum_CANNOT_MODIFY_KEY_ATTRIBUTE_VALUE FeedItemErrorEnum_FeedItemError = 9
+	// The feed attribute value is too large.
+	FeedItemErrorEnum_SIZE_TOO_LARGE_FOR_MULTI_VALUE_ATTRIBUTE FeedItemErrorEnum_FeedItemError = 10
+)
+
+var FeedItemErrorEnum_FeedItemError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "CANNOT_CONVERT_ATTRIBUTE_VALUE_FROM_STRING",
+	3:  "CANNOT_OPERATE_ON_REMOVED_FEED_ITEM",
+	4:  "DATE_TIME_MUST_BE_IN_ACCOUNT_TIME_ZONE",
+	5:  "KEY_ATTRIBUTES_NOT_FOUND",
+	6:  "INVALID_URL",
+	7:  "MISSING_KEY_ATTRIBUTES",
+	8:  "KEY_ATTRIBUTES_NOT_UNIQUE",
+	9:  "CANNOT_MODIFY_KEY_ATTRIBUTE_VALUE",
+	10: "SIZE_TOO_LARGE_FOR_MULTI_VALUE_ATTRIBUTE",
+}
+
+var FeedItemErrorEnum_FeedItemError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CANNOT_CONVERT_ATTRIBUTE_VALUE_FROM_STRING": 2,
+	"CANNOT_OPERATE_ON_REMOVED_FEED_ITEM":        3,
+	"DATE_TIME_MUST_BE_IN_ACCOUNT_TIME_ZONE":     4,
+	"KEY_ATTRIBUTES_NOT_FOUND":                   5,
+	"INVALID_URL":                                6,
+	"MISSING_KEY_ATTRIBUTES":                     7,
+	"KEY_ATTRIBUTES_NOT_UNIQUE":                  8,
+	"CANNOT_MODIFY_KEY_ATTRIBUTE_VALUE":          9,
+	"SIZE_TOO_LARGE_FOR_MULTI_VALUE_ATTRIBUTE":   10,
+}
+
+func (x FeedItemErrorEnum_FeedItemError) String() string {
+	return proto.EnumName(FeedItemErrorEnum_FeedItemError_name, int32(x))
+}
+
+func (FeedItemErrorEnum_FeedItemError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ff8d93b72f70d82b, []int{0, 0}
+}
+
+// Container for enum describing possible feed item errors.
+type FeedItemErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemErrorEnum) Reset()         { *m = FeedItemErrorEnum{} }
+func (m *FeedItemErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemErrorEnum) ProtoMessage()    {}
+func (*FeedItemErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ff8d93b72f70d82b, []int{0}
+}
+
+func (m *FeedItemErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemErrorEnum.Unmarshal(m, b)
+}
+func (m *FeedItemErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemErrorEnum.Merge(m, src)
+}
+func (m *FeedItemErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemErrorEnum.Size(m)
+}
+func (m *FeedItemErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FeedItemErrorEnum_FeedItemError", FeedItemErrorEnum_FeedItemError_name, FeedItemErrorEnum_FeedItemError_value)
+	proto.RegisterType((*FeedItemErrorEnum)(nil), "google.ads.googleads.v3.errors.FeedItemErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/feed_item_error.proto", fileDescriptor_ff8d93b72f70d82b)
+}
+
+var fileDescriptor_ff8d93b72f70d82b = []byte{
+	// 486 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xdf, 0x8a, 0xd3, 0x4e,
+	0x18, 0xfd, 0xb5, 0xfd, 0xb9, 0xab, 0xb3, 0x88, 0xe3, 0x5c, 0x88, 0x2e, 0xeb, 0x82, 0x15, 0xff,
+	0xb0, 0x48, 0x72, 0x11, 0xaf, 0xe2, 0xd5, 0xb4, 0xf9, 0x52, 0x86, 0x6d, 0x66, 0x6a, 0x32, 0x13,
+	0xd9, 0x52, 0xf8, 0xa8, 0x26, 0x86, 0xc2, 0x36, 0x29, 0x4d, 0xdc, 0x57, 0xf0, 0x3d, 0xbc, 0xf4,
+	0x51, 0x7c, 0x14, 0xc1, 0x0b, 0xdf, 0x40, 0xd2, 0x69, 0x2b, 0x05, 0xf5, 0x2a, 0x87, 0x93, 0x73,
+	0xce, 0x37, 0x33, 0xe7, 0x23, 0xaf, 0x8b, 0xaa, 0x2a, 0xae, 0x73, 0x77, 0x9e, 0xd5, 0xae, 0x85,
+	0x2d, 0xba, 0xf1, 0xdc, 0x7c, 0xbd, 0xae, 0xd6, 0xb5, 0xfb, 0x31, 0xcf, 0x33, 0x5c, 0x34, 0xf9,
+	0x12, 0x37, 0x84, 0xb3, 0x5a, 0x57, 0x4d, 0xc5, 0xce, 0xad, 0xd4, 0x99, 0x67, 0xb5, 0xb3, 0x77,
+	0x39, 0x37, 0x9e, 0x63, 0x5d, 0xa7, 0x67, 0xbb, 0xd4, 0xd5, 0xc2, 0x9d, 0x97, 0x65, 0xd5, 0xcc,
+	0x9b, 0x45, 0x55, 0xd6, 0xd6, 0xdd, 0xff, 0xdc, 0x23, 0xf7, 0xc3, 0x3c, 0xcf, 0x44, 0x93, 0x2f,
+	0xa1, 0x35, 0x40, 0xf9, 0x69, 0xd9, 0xff, 0xd9, 0x25, 0x77, 0x0f, 0x58, 0x76, 0x8f, 0x9c, 0x18,
+	0x99, 0x4c, 0x60, 0x28, 0x42, 0x01, 0x01, 0xfd, 0x8f, 0x9d, 0x90, 0x63, 0x23, 0x2f, 0xa5, 0x7a,
+	0x27, 0x69, 0x87, 0x39, 0xe4, 0x62, 0xc8, 0xa5, 0x54, 0x1a, 0x87, 0x4a, 0xa6, 0x10, 0x6b, 0xe4,
+	0x5a, 0xc7, 0x62, 0x60, 0x34, 0x60, 0xca, 0xc7, 0x06, 0x30, 0x8c, 0x55, 0x84, 0x89, 0x8e, 0x85,
+	0x1c, 0xd1, 0x2e, 0x7b, 0x41, 0x9e, 0x6e, 0xf5, 0x6a, 0x02, 0x31, 0xd7, 0x80, 0x4a, 0x62, 0x0c,
+	0x91, 0x4a, 0x21, 0xc0, 0x10, 0x20, 0x40, 0xa1, 0x21, 0xa2, 0x3d, 0x76, 0x41, 0x9e, 0x07, 0xed,
+	0x6f, 0x2d, 0x22, 0xc0, 0xc8, 0x24, 0x1a, 0x07, 0x80, 0x42, 0x22, 0x1f, 0x0e, 0x95, 0x91, 0xda,
+	0xf2, 0x53, 0x25, 0x81, 0xfe, 0xcf, 0xce, 0xc8, 0xc3, 0x4b, 0xb8, 0xfa, 0x3d, 0x39, 0xc1, 0x76,
+	0x40, 0xa8, 0x8c, 0x0c, 0xe8, 0xad, 0xf6, 0x02, 0x42, 0xa6, 0x7c, 0x2c, 0x02, 0x34, 0xf1, 0x98,
+	0x1e, 0xb1, 0x53, 0xf2, 0x20, 0x12, 0x49, 0x22, 0xe4, 0x08, 0x0f, 0x6d, 0xf4, 0x98, 0x3d, 0x26,
+	0x8f, 0xfe, 0x10, 0x65, 0xa4, 0x78, 0x6b, 0x80, 0xde, 0x66, 0xcf, 0xc8, 0x93, 0xed, 0xf1, 0x23,
+	0x15, 0x88, 0xf0, 0xea, 0x30, 0xc0, 0xde, 0x98, 0xde, 0x61, 0xaf, 0xc8, 0xcb, 0x44, 0x4c, 0x01,
+	0xb5, 0x52, 0x38, 0xe6, 0xf1, 0x08, 0x30, 0x54, 0x31, 0x46, 0x66, 0xac, 0xc5, 0xf6, 0x55, 0xf6,
+	0x1e, 0x4a, 0x06, 0x3f, 0x3a, 0xa4, 0xff, 0xa1, 0x5a, 0x3a, 0xff, 0xae, 0x73, 0xc0, 0x0e, 0x7a,
+	0x99, 0xb4, 0x25, 0x4e, 0x3a, 0xd3, 0x60, 0xeb, 0x2a, 0xaa, 0xeb, 0x79, 0x59, 0x38, 0xd5, 0xba,
+	0x70, 0x8b, 0xbc, 0xdc, 0x54, 0xbc, 0x5b, 0xa5, 0xd5, 0xa2, 0xfe, 0xdb, 0x66, 0xbd, 0xb1, 0x9f,
+	0x2f, 0xdd, 0xde, 0x88, 0xf3, 0xaf, 0xdd, 0xf3, 0x91, 0x0d, 0xe3, 0x59, 0xed, 0x58, 0xd8, 0xa2,
+	0xd4, 0x73, 0x36, 0x23, 0xeb, 0x6f, 0x3b, 0xc1, 0x8c, 0x67, 0xf5, 0x6c, 0x2f, 0x98, 0xa5, 0xde,
+	0xcc, 0x0a, 0xbe, 0x77, 0xfb, 0x96, 0xf5, 0x7d, 0x9e, 0xd5, 0xbe, 0xbf, 0x97, 0xf8, 0x7e, 0xea,
+	0xf9, 0xbe, 0x15, 0xbd, 0x3f, 0xda, 0x9c, 0xce, 0xfb, 0x15, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x5a,
+	0xb4, 0xe8, 0xf6, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/feed_item_target_error.pb.go b/googleapis/ads/googleads/v3/errors/feed_item_target_error.pb.go
new file mode 100644
index 0000000..1f1480a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/feed_item_target_error.pb.go
@@ -0,0 +1,161 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/feed_item_target_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible feed item target errors.
+type FeedItemTargetErrorEnum_FeedItemTargetError int32
+
+const (
+	// Enum unspecified.
+	FeedItemTargetErrorEnum_UNSPECIFIED FeedItemTargetErrorEnum_FeedItemTargetError = 0
+	// The received error code is not known in this version.
+	FeedItemTargetErrorEnum_UNKNOWN FeedItemTargetErrorEnum_FeedItemTargetError = 1
+	// On CREATE, the FeedItemTarget must have a populated field in the oneof
+	// target.
+	FeedItemTargetErrorEnum_MUST_SET_TARGET_ONEOF_ON_CREATE FeedItemTargetErrorEnum_FeedItemTargetError = 2
+	// The specified feed item target already exists, so it cannot be added.
+	FeedItemTargetErrorEnum_FEED_ITEM_TARGET_ALREADY_EXISTS FeedItemTargetErrorEnum_FeedItemTargetError = 3
+	// The schedules for a given feed item cannot overlap.
+	FeedItemTargetErrorEnum_FEED_ITEM_SCHEDULES_CANNOT_OVERLAP FeedItemTargetErrorEnum_FeedItemTargetError = 4
+	// Too many targets of a given type were added for a single feed item.
+	FeedItemTargetErrorEnum_TARGET_LIMIT_EXCEEDED_FOR_GIVEN_TYPE FeedItemTargetErrorEnum_FeedItemTargetError = 5
+	// Too many AdSchedules are enabled for the feed item for the given day.
+	FeedItemTargetErrorEnum_TOO_MANY_SCHEDULES_PER_DAY FeedItemTargetErrorEnum_FeedItemTargetError = 6
+	// A feed item may either have an enabled campaign target or an enabled ad
+	// group target.
+	FeedItemTargetErrorEnum_CANNOT_HAVE_ENABLED_CAMPAIGN_AND_ENABLED_AD_GROUP_TARGETS FeedItemTargetErrorEnum_FeedItemTargetError = 7
+	// Duplicate ad schedules aren't allowed.
+	FeedItemTargetErrorEnum_DUPLICATE_AD_SCHEDULE FeedItemTargetErrorEnum_FeedItemTargetError = 8
+	// Duplicate keywords aren't allowed.
+	FeedItemTargetErrorEnum_DUPLICATE_KEYWORD FeedItemTargetErrorEnum_FeedItemTargetError = 9
+)
+
+var FeedItemTargetErrorEnum_FeedItemTargetError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "MUST_SET_TARGET_ONEOF_ON_CREATE",
+	3: "FEED_ITEM_TARGET_ALREADY_EXISTS",
+	4: "FEED_ITEM_SCHEDULES_CANNOT_OVERLAP",
+	5: "TARGET_LIMIT_EXCEEDED_FOR_GIVEN_TYPE",
+	6: "TOO_MANY_SCHEDULES_PER_DAY",
+	7: "CANNOT_HAVE_ENABLED_CAMPAIGN_AND_ENABLED_AD_GROUP_TARGETS",
+	8: "DUPLICATE_AD_SCHEDULE",
+	9: "DUPLICATE_KEYWORD",
+}
+
+var FeedItemTargetErrorEnum_FeedItemTargetError_value = map[string]int32{
+	"UNSPECIFIED":                                               0,
+	"UNKNOWN":                                                   1,
+	"MUST_SET_TARGET_ONEOF_ON_CREATE":                           2,
+	"FEED_ITEM_TARGET_ALREADY_EXISTS":                           3,
+	"FEED_ITEM_SCHEDULES_CANNOT_OVERLAP":                        4,
+	"TARGET_LIMIT_EXCEEDED_FOR_GIVEN_TYPE":                      5,
+	"TOO_MANY_SCHEDULES_PER_DAY":                                6,
+	"CANNOT_HAVE_ENABLED_CAMPAIGN_AND_ENABLED_AD_GROUP_TARGETS": 7,
+	"DUPLICATE_AD_SCHEDULE":                                     8,
+	"DUPLICATE_KEYWORD":                                         9,
+}
+
+func (x FeedItemTargetErrorEnum_FeedItemTargetError) String() string {
+	return proto.EnumName(FeedItemTargetErrorEnum_FeedItemTargetError_name, int32(x))
+}
+
+func (FeedItemTargetErrorEnum_FeedItemTargetError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3b604c6468bb0176, []int{0, 0}
+}
+
+// Container for enum describing possible feed item target errors.
+type FeedItemTargetErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemTargetErrorEnum) Reset()         { *m = FeedItemTargetErrorEnum{} }
+func (m *FeedItemTargetErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemTargetErrorEnum) ProtoMessage()    {}
+func (*FeedItemTargetErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3b604c6468bb0176, []int{0}
+}
+
+func (m *FeedItemTargetErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemTargetErrorEnum.Unmarshal(m, b)
+}
+func (m *FeedItemTargetErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemTargetErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemTargetErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemTargetErrorEnum.Merge(m, src)
+}
+func (m *FeedItemTargetErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemTargetErrorEnum.Size(m)
+}
+func (m *FeedItemTargetErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemTargetErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemTargetErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FeedItemTargetErrorEnum_FeedItemTargetError", FeedItemTargetErrorEnum_FeedItemTargetError_name, FeedItemTargetErrorEnum_FeedItemTargetError_value)
+	proto.RegisterType((*FeedItemTargetErrorEnum)(nil), "google.ads.googleads.v3.errors.FeedItemTargetErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/feed_item_target_error.proto", fileDescriptor_3b604c6468bb0176)
+}
+
+var fileDescriptor_3b604c6468bb0176 = []byte{
+	// 490 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xc1, 0x6e, 0xd3, 0x4c,
+	0x14, 0x85, 0xff, 0xb8, 0x3f, 0x2d, 0x4c, 0x17, 0x18, 0xa3, 0x0a, 0xa8, 0x50, 0x90, 0x02, 0x42,
+	0xac, 0xec, 0x85, 0x57, 0xb8, 0x62, 0x31, 0xf1, 0xdc, 0xb8, 0x56, 0x9d, 0x19, 0xcb, 0x1e, 0xbb,
+	0x0d, 0x8a, 0x74, 0x65, 0xb0, 0xb1, 0x22, 0x35, 0x76, 0x64, 0x9b, 0x3e, 0x10, 0x4b, 0x1e, 0x85,
+	0xa7, 0x60, 0xcd, 0x96, 0x2d, 0x0b, 0xe4, 0x4c, 0x9c, 0xb2, 0x28, 0xac, 0xe6, 0xe8, 0xde, 0xef,
+	0x9c, 0x19, 0xe9, 0x0c, 0x39, 0x2b, 0xeb, 0xba, 0xbc, 0x2e, 0xac, 0x2c, 0x6f, 0x2d, 0x25, 0x7b,
+	0x75, 0x63, 0x5b, 0x45, 0xd3, 0xd4, 0x4d, 0x6b, 0x7d, 0x2a, 0x8a, 0x1c, 0x57, 0x5d, 0xb1, 0xc6,
+	0x2e, 0x6b, 0xca, 0xa2, 0xc3, 0xed, 0xdc, 0xdc, 0x34, 0x75, 0x57, 0x1b, 0x63, 0xe5, 0x30, 0xb3,
+	0xbc, 0x35, 0xf7, 0x66, 0xf3, 0xc6, 0x36, 0x95, 0xf9, 0xf4, 0xf9, 0x10, 0xbe, 0x59, 0x59, 0x59,
+	0x55, 0xd5, 0x5d, 0xd6, 0xad, 0xea, 0xaa, 0x55, 0xee, 0xc9, 0x2f, 0x8d, 0x3c, 0x99, 0x15, 0x45,
+	0xee, 0x77, 0xc5, 0x5a, 0x6e, 0xc3, 0xa1, 0xb7, 0x41, 0xf5, 0x79, 0x3d, 0xf9, 0xae, 0x91, 0xc7,
+	0x77, 0xec, 0x8c, 0x87, 0xe4, 0x38, 0xe1, 0x71, 0x08, 0xae, 0x3f, 0xf3, 0x81, 0xe9, 0xff, 0x19,
+	0xc7, 0xe4, 0x28, 0xe1, 0x17, 0x5c, 0x5c, 0x72, 0x7d, 0x64, 0xbc, 0x24, 0x2f, 0xe6, 0x49, 0x2c,
+	0x31, 0x06, 0x89, 0x92, 0x46, 0x1e, 0x48, 0x14, 0x1c, 0xc4, 0x0c, 0x05, 0x47, 0x37, 0x02, 0x2a,
+	0x41, 0xd7, 0x7a, 0x68, 0x06, 0xc0, 0xd0, 0x97, 0x30, 0x1f, 0x28, 0x1a, 0x44, 0x40, 0xd9, 0x02,
+	0xe1, 0xca, 0x8f, 0x65, 0xac, 0x1f, 0x18, 0xaf, 0xc9, 0xe4, 0x16, 0x8a, 0xdd, 0x73, 0x60, 0x49,
+	0x00, 0x31, 0xba, 0x94, 0x73, 0x21, 0x51, 0xa4, 0x10, 0x05, 0x34, 0xd4, 0xff, 0x37, 0xde, 0x90,
+	0x57, 0xbb, 0x88, 0xc0, 0x9f, 0xfb, 0x12, 0xe1, 0xca, 0x05, 0x60, 0xc0, 0x70, 0x26, 0x22, 0xf4,
+	0xfc, 0x14, 0x38, 0xca, 0x45, 0x08, 0xfa, 0x3d, 0x63, 0x4c, 0x4e, 0xa5, 0x10, 0x38, 0xa7, 0x7c,
+	0xf1, 0x47, 0x60, 0x08, 0x11, 0x32, 0xba, 0xd0, 0x0f, 0x8d, 0x77, 0xe4, 0xed, 0x2e, 0xfd, 0x9c,
+	0xa6, 0x80, 0xc0, 0xe9, 0x34, 0x00, 0x86, 0x2e, 0x9d, 0x87, 0xd4, 0xf7, 0x38, 0x52, 0xce, 0xf6,
+	0x43, 0xca, 0xd0, 0x8b, 0x44, 0x12, 0xee, 0x9e, 0x1f, 0xeb, 0x47, 0xc6, 0x33, 0x72, 0xc2, 0x92,
+	0x30, 0xf0, 0x5d, 0x2a, 0xa1, 0xdf, 0x0f, 0x57, 0xe8, 0xf7, 0x8d, 0x13, 0xf2, 0xe8, 0x76, 0x75,
+	0x01, 0x8b, 0x4b, 0x11, 0x31, 0xfd, 0xc1, 0xf4, 0xe7, 0x88, 0x4c, 0x3e, 0xd6, 0x6b, 0xf3, 0xdf,
+	0x1d, 0x4e, 0x9f, 0xde, 0x51, 0x43, 0xd8, 0xf7, 0x17, 0x8e, 0xde, 0xb3, 0x9d, 0xb7, 0xac, 0xaf,
+	0xb3, 0xaa, 0x34, 0xeb, 0xa6, 0xb4, 0xca, 0xa2, 0xda, 0xb6, 0x3b, 0x7c, 0xa6, 0xcd, 0xaa, 0xfd,
+	0xdb, 0xdf, 0x3a, 0x53, 0xc7, 0x17, 0xed, 0xc0, 0xa3, 0xf4, 0xab, 0x36, 0xf6, 0x54, 0x18, 0xcd,
+	0x5b, 0x53, 0xc9, 0x5e, 0xa5, 0xb6, 0xb9, 0xbd, 0xb2, 0xfd, 0x36, 0x00, 0x4b, 0x9a, 0xb7, 0xcb,
+	0x3d, 0xb0, 0x4c, 0xed, 0xa5, 0x02, 0x7e, 0x68, 0x13, 0x35, 0x75, 0x1c, 0x9a, 0xb7, 0x8e, 0xb3,
+	0x47, 0x1c, 0x27, 0xb5, 0x1d, 0x47, 0x41, 0x1f, 0x0e, 0xb7, 0xaf, 0xb3, 0x7f, 0x07, 0x00, 0x00,
+	0xff, 0xff, 0xf7, 0x53, 0x0c, 0x48, 0xf8, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/feed_item_validation_error.pb.go b/googleapis/ads/googleads/v3/errors/feed_item_validation_error.pb.go
new file mode 100644
index 0000000..15cb23d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/feed_item_validation_error.pb.go
@@ -0,0 +1,607 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/feed_item_validation_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The possible validation errors of a feed item.
+type FeedItemValidationErrorEnum_FeedItemValidationError int32
+
+const (
+	// No value has been specified.
+	FeedItemValidationErrorEnum_UNSPECIFIED FeedItemValidationErrorEnum_FeedItemValidationError = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedItemValidationErrorEnum_UNKNOWN FeedItemValidationErrorEnum_FeedItemValidationError = 1
+	// String is too short.
+	FeedItemValidationErrorEnum_STRING_TOO_SHORT FeedItemValidationErrorEnum_FeedItemValidationError = 2
+	// String is too long.
+	FeedItemValidationErrorEnum_STRING_TOO_LONG FeedItemValidationErrorEnum_FeedItemValidationError = 3
+	// Value is not provided.
+	FeedItemValidationErrorEnum_VALUE_NOT_SPECIFIED FeedItemValidationErrorEnum_FeedItemValidationError = 4
+	// Phone number format is invalid for region.
+	FeedItemValidationErrorEnum_INVALID_DOMESTIC_PHONE_NUMBER_FORMAT FeedItemValidationErrorEnum_FeedItemValidationError = 5
+	// String does not represent a phone number.
+	FeedItemValidationErrorEnum_INVALID_PHONE_NUMBER FeedItemValidationErrorEnum_FeedItemValidationError = 6
+	// Phone number format is not compatible with country code.
+	FeedItemValidationErrorEnum_PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY FeedItemValidationErrorEnum_FeedItemValidationError = 7
+	// Premium rate number is not allowed.
+	FeedItemValidationErrorEnum_PREMIUM_RATE_NUMBER_NOT_ALLOWED FeedItemValidationErrorEnum_FeedItemValidationError = 8
+	// Phone number type is not allowed.
+	FeedItemValidationErrorEnum_DISALLOWED_NUMBER_TYPE FeedItemValidationErrorEnum_FeedItemValidationError = 9
+	// Specified value is outside of the valid range.
+	FeedItemValidationErrorEnum_VALUE_OUT_OF_RANGE FeedItemValidationErrorEnum_FeedItemValidationError = 10
+	// Call tracking is not supported in the selected country.
+	FeedItemValidationErrorEnum_CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY FeedItemValidationErrorEnum_FeedItemValidationError = 11
+	// Customer is not whitelisted for call tracking.
+	FeedItemValidationErrorEnum_CUSTOMER_NOT_WHITELISTED_FOR_CALLTRACKING FeedItemValidationErrorEnum_FeedItemValidationError = 12
+	// Country code is invalid.
+	FeedItemValidationErrorEnum_INVALID_COUNTRY_CODE FeedItemValidationErrorEnum_FeedItemValidationError = 13
+	// The specified mobile app id is invalid.
+	FeedItemValidationErrorEnum_INVALID_APP_ID FeedItemValidationErrorEnum_FeedItemValidationError = 14
+	// Some required field attributes are missing.
+	FeedItemValidationErrorEnum_MISSING_ATTRIBUTES_FOR_FIELDS FeedItemValidationErrorEnum_FeedItemValidationError = 15
+	// Invalid email button type for email extension.
+	FeedItemValidationErrorEnum_INVALID_TYPE_ID FeedItemValidationErrorEnum_FeedItemValidationError = 16
+	// Email address is invalid.
+	FeedItemValidationErrorEnum_INVALID_EMAIL_ADDRESS FeedItemValidationErrorEnum_FeedItemValidationError = 17
+	// The HTTPS URL in email extension is invalid.
+	FeedItemValidationErrorEnum_INVALID_HTTPS_URL FeedItemValidationErrorEnum_FeedItemValidationError = 18
+	// Delivery address is missing from email extension.
+	FeedItemValidationErrorEnum_MISSING_DELIVERY_ADDRESS FeedItemValidationErrorEnum_FeedItemValidationError = 19
+	// FeedItem scheduling start date comes after end date.
+	FeedItemValidationErrorEnum_START_DATE_AFTER_END_DATE FeedItemValidationErrorEnum_FeedItemValidationError = 20
+	// FeedItem scheduling start time is missing.
+	FeedItemValidationErrorEnum_MISSING_FEED_ITEM_START_TIME FeedItemValidationErrorEnum_FeedItemValidationError = 21
+	// FeedItem scheduling end time is missing.
+	FeedItemValidationErrorEnum_MISSING_FEED_ITEM_END_TIME FeedItemValidationErrorEnum_FeedItemValidationError = 22
+	// Cannot compute system attributes on a FeedItem that has no FeedItemId.
+	FeedItemValidationErrorEnum_MISSING_FEED_ITEM_ID FeedItemValidationErrorEnum_FeedItemValidationError = 23
+	// Call extension vanity phone numbers are not supported.
+	FeedItemValidationErrorEnum_VANITY_PHONE_NUMBER_NOT_ALLOWED FeedItemValidationErrorEnum_FeedItemValidationError = 24
+	// Invalid review text.
+	FeedItemValidationErrorEnum_INVALID_REVIEW_EXTENSION_SNIPPET FeedItemValidationErrorEnum_FeedItemValidationError = 25
+	// Invalid format for numeric value in ad parameter.
+	FeedItemValidationErrorEnum_INVALID_NUMBER_FORMAT FeedItemValidationErrorEnum_FeedItemValidationError = 26
+	// Invalid format for date value in ad parameter.
+	FeedItemValidationErrorEnum_INVALID_DATE_FORMAT FeedItemValidationErrorEnum_FeedItemValidationError = 27
+	// Invalid format for price value in ad parameter.
+	FeedItemValidationErrorEnum_INVALID_PRICE_FORMAT FeedItemValidationErrorEnum_FeedItemValidationError = 28
+	// Unrecognized type given for value in ad parameter.
+	FeedItemValidationErrorEnum_UNKNOWN_PLACEHOLDER_FIELD FeedItemValidationErrorEnum_FeedItemValidationError = 29
+	// Enhanced sitelinks must have both description lines specified.
+	FeedItemValidationErrorEnum_MISSING_ENHANCED_SITELINK_DESCRIPTION_LINE FeedItemValidationErrorEnum_FeedItemValidationError = 30
+	// Review source is ineligible.
+	FeedItemValidationErrorEnum_REVIEW_EXTENSION_SOURCE_INELIGIBLE FeedItemValidationErrorEnum_FeedItemValidationError = 31
+	// Review text cannot contain hyphens or dashes.
+	FeedItemValidationErrorEnum_HYPHENS_IN_REVIEW_EXTENSION_SNIPPET FeedItemValidationErrorEnum_FeedItemValidationError = 32
+	// Review text cannot contain double quote characters.
+	FeedItemValidationErrorEnum_DOUBLE_QUOTES_IN_REVIEW_EXTENSION_SNIPPET FeedItemValidationErrorEnum_FeedItemValidationError = 33
+	// Review text cannot contain quote characters.
+	FeedItemValidationErrorEnum_QUOTES_IN_REVIEW_EXTENSION_SNIPPET FeedItemValidationErrorEnum_FeedItemValidationError = 34
+	// Parameters are encoded in the wrong format.
+	FeedItemValidationErrorEnum_INVALID_FORM_ENCODED_PARAMS FeedItemValidationErrorEnum_FeedItemValidationError = 35
+	// URL parameter name must contain only letters, numbers, underscores, and
+	// dashes.
+	FeedItemValidationErrorEnum_INVALID_URL_PARAMETER_NAME FeedItemValidationErrorEnum_FeedItemValidationError = 36
+	// Cannot find address location.
+	FeedItemValidationErrorEnum_NO_GEOCODING_RESULT FeedItemValidationErrorEnum_FeedItemValidationError = 37
+	// Review extension text has source name.
+	FeedItemValidationErrorEnum_SOURCE_NAME_IN_REVIEW_EXTENSION_TEXT FeedItemValidationErrorEnum_FeedItemValidationError = 38
+	// Some phone numbers can be shorter than usual. Some of these short numbers
+	// are carrier-specific, and we disallow those in ad extensions because they
+	// will not be available to all users.
+	FeedItemValidationErrorEnum_CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED FeedItemValidationErrorEnum_FeedItemValidationError = 39
+	// Triggered when a request references a placeholder field id that does not
+	// exist.
+	FeedItemValidationErrorEnum_INVALID_PLACEHOLDER_FIELD_ID FeedItemValidationErrorEnum_FeedItemValidationError = 40
+	// URL contains invalid ValueTrack tags or format.
+	FeedItemValidationErrorEnum_INVALID_URL_TAG FeedItemValidationErrorEnum_FeedItemValidationError = 41
+	// Provided list exceeds acceptable size.
+	FeedItemValidationErrorEnum_LIST_TOO_LONG FeedItemValidationErrorEnum_FeedItemValidationError = 42
+	// Certain combinations of attributes aren't allowed to be specified in the
+	// same feed item.
+	FeedItemValidationErrorEnum_INVALID_ATTRIBUTES_COMBINATION FeedItemValidationErrorEnum_FeedItemValidationError = 43
+	// An attribute has the same value repeatedly.
+	FeedItemValidationErrorEnum_DUPLICATE_VALUES FeedItemValidationErrorEnum_FeedItemValidationError = 44
+	// Advertisers can link a conversion action with a phone number to indicate
+	// that sufficiently long calls forwarded to that phone number should be
+	// counted as conversions of the specified type.  This is an error message
+	// indicating that the conversion action specified is invalid (e.g., the
+	// conversion action does not exist within the appropriate Google Ads
+	// account, or it is a type of conversion not appropriate to phone call
+	// conversions).
+	FeedItemValidationErrorEnum_INVALID_CALL_CONVERSION_ACTION_ID FeedItemValidationErrorEnum_FeedItemValidationError = 45
+	// Tracking template requires final url to be set.
+	FeedItemValidationErrorEnum_CANNOT_SET_WITHOUT_FINAL_URLS FeedItemValidationErrorEnum_FeedItemValidationError = 46
+	// An app id was provided that doesn't exist in the given app store.
+	FeedItemValidationErrorEnum_APP_ID_DOESNT_EXIST_IN_APP_STORE FeedItemValidationErrorEnum_FeedItemValidationError = 47
+	// Invalid U2 final url.
+	FeedItemValidationErrorEnum_INVALID_FINAL_URL FeedItemValidationErrorEnum_FeedItemValidationError = 48
+	// Invalid U2 tracking url.
+	FeedItemValidationErrorEnum_INVALID_TRACKING_URL FeedItemValidationErrorEnum_FeedItemValidationError = 49
+	// Final URL should start from App download URL.
+	FeedItemValidationErrorEnum_INVALID_FINAL_URL_FOR_APP_DOWNLOAD_URL FeedItemValidationErrorEnum_FeedItemValidationError = 50
+	// List provided is too short.
+	FeedItemValidationErrorEnum_LIST_TOO_SHORT FeedItemValidationErrorEnum_FeedItemValidationError = 51
+	// User Action field has invalid value.
+	FeedItemValidationErrorEnum_INVALID_USER_ACTION FeedItemValidationErrorEnum_FeedItemValidationError = 52
+	// Type field has invalid value.
+	FeedItemValidationErrorEnum_INVALID_TYPE_NAME FeedItemValidationErrorEnum_FeedItemValidationError = 53
+	// Change status for event is invalid.
+	FeedItemValidationErrorEnum_INVALID_EVENT_CHANGE_STATUS FeedItemValidationErrorEnum_FeedItemValidationError = 54
+	// The header of a structured snippets extension is not one of the valid
+	// headers.
+	FeedItemValidationErrorEnum_INVALID_SNIPPETS_HEADER FeedItemValidationErrorEnum_FeedItemValidationError = 55
+	// Android app link is not formatted correctly
+	FeedItemValidationErrorEnum_INVALID_ANDROID_APP_LINK FeedItemValidationErrorEnum_FeedItemValidationError = 56
+	// Phone number incompatible with call tracking for country.
+	FeedItemValidationErrorEnum_NUMBER_TYPE_WITH_CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY FeedItemValidationErrorEnum_FeedItemValidationError = 57
+	// The input is identical to a reserved keyword
+	FeedItemValidationErrorEnum_RESERVED_KEYWORD_OTHER FeedItemValidationErrorEnum_FeedItemValidationError = 58
+	// Each option label in the message extension must be unique.
+	FeedItemValidationErrorEnum_DUPLICATE_OPTION_LABELS FeedItemValidationErrorEnum_FeedItemValidationError = 59
+	// Each option prefill in the message extension must be unique.
+	FeedItemValidationErrorEnum_DUPLICATE_OPTION_PREFILLS FeedItemValidationErrorEnum_FeedItemValidationError = 60
+	// In message extensions, the number of optional labels and optional
+	// prefills must be the same.
+	FeedItemValidationErrorEnum_UNEQUAL_LIST_LENGTHS FeedItemValidationErrorEnum_FeedItemValidationError = 61
+	// All currency codes in an ad extension must be the same.
+	FeedItemValidationErrorEnum_INCONSISTENT_CURRENCY_CODES FeedItemValidationErrorEnum_FeedItemValidationError = 62
+	// Headers in price extension are not unique.
+	FeedItemValidationErrorEnum_PRICE_EXTENSION_HAS_DUPLICATED_HEADERS FeedItemValidationErrorEnum_FeedItemValidationError = 63
+	// Header and description in an item are the same.
+	FeedItemValidationErrorEnum_ITEM_HAS_DUPLICATED_HEADER_AND_DESCRIPTION FeedItemValidationErrorEnum_FeedItemValidationError = 64
+	// Price extension has too few items.
+	FeedItemValidationErrorEnum_PRICE_EXTENSION_HAS_TOO_FEW_ITEMS FeedItemValidationErrorEnum_FeedItemValidationError = 65
+	// The given value is not supported.
+	FeedItemValidationErrorEnum_UNSUPPORTED_VALUE FeedItemValidationErrorEnum_FeedItemValidationError = 66
+	// Invalid final mobile url.
+	FeedItemValidationErrorEnum_INVALID_FINAL_MOBILE_URL FeedItemValidationErrorEnum_FeedItemValidationError = 67
+	// The given string value of Label contains invalid characters
+	FeedItemValidationErrorEnum_INVALID_KEYWORDLESS_AD_RULE_LABEL FeedItemValidationErrorEnum_FeedItemValidationError = 68
+	// The given URL contains value track parameters.
+	FeedItemValidationErrorEnum_VALUE_TRACK_PARAMETER_NOT_SUPPORTED FeedItemValidationErrorEnum_FeedItemValidationError = 69
+	// The given value is not supported in the selected language of an
+	// extension.
+	FeedItemValidationErrorEnum_UNSUPPORTED_VALUE_IN_SELECTED_LANGUAGE FeedItemValidationErrorEnum_FeedItemValidationError = 70
+	// The iOS app link is not formatted correctly.
+	FeedItemValidationErrorEnum_INVALID_IOS_APP_LINK FeedItemValidationErrorEnum_FeedItemValidationError = 71
+	// iOS app link or iOS app store id is missing.
+	FeedItemValidationErrorEnum_MISSING_IOS_APP_LINK_OR_IOS_APP_STORE_ID FeedItemValidationErrorEnum_FeedItemValidationError = 72
+	// Promotion time is invalid.
+	FeedItemValidationErrorEnum_PROMOTION_INVALID_TIME FeedItemValidationErrorEnum_FeedItemValidationError = 73
+	// Both the percent off and money amount off fields are set.
+	FeedItemValidationErrorEnum_PROMOTION_CANNOT_SET_PERCENT_OFF_AND_MONEY_AMOUNT_OFF FeedItemValidationErrorEnum_FeedItemValidationError = 74
+	// Both the promotion code and orders over amount fields are set.
+	FeedItemValidationErrorEnum_PROMOTION_CANNOT_SET_PROMOTION_CODE_AND_ORDERS_OVER_AMOUNT FeedItemValidationErrorEnum_FeedItemValidationError = 75
+	// Too many decimal places are specified.
+	FeedItemValidationErrorEnum_TOO_MANY_DECIMAL_PLACES_SPECIFIED FeedItemValidationErrorEnum_FeedItemValidationError = 76
+	// Ad Customizers are present and not allowed.
+	FeedItemValidationErrorEnum_AD_CUSTOMIZERS_NOT_ALLOWED FeedItemValidationErrorEnum_FeedItemValidationError = 77
+	// Language code is not valid.
+	FeedItemValidationErrorEnum_INVALID_LANGUAGE_CODE FeedItemValidationErrorEnum_FeedItemValidationError = 78
+	// Language is not supported.
+	FeedItemValidationErrorEnum_UNSUPPORTED_LANGUAGE FeedItemValidationErrorEnum_FeedItemValidationError = 79
+	// IF Function is present and not allowed.
+	FeedItemValidationErrorEnum_IF_FUNCTION_NOT_ALLOWED FeedItemValidationErrorEnum_FeedItemValidationError = 80
+	// Final url suffix is not valid.
+	FeedItemValidationErrorEnum_INVALID_FINAL_URL_SUFFIX FeedItemValidationErrorEnum_FeedItemValidationError = 81
+	// Final url suffix contains an invalid tag.
+	FeedItemValidationErrorEnum_INVALID_TAG_IN_FINAL_URL_SUFFIX FeedItemValidationErrorEnum_FeedItemValidationError = 82
+	// Final url suffix is formatted incorrectly.
+	FeedItemValidationErrorEnum_INVALID_FINAL_URL_SUFFIX_FORMAT FeedItemValidationErrorEnum_FeedItemValidationError = 83
+	// Consent for call recording, which is required for the use of call
+	// extensions, was not provided by the advertiser. Please see
+	// https://support.google.com/google-ads/answer/7412639.
+	FeedItemValidationErrorEnum_CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED FeedItemValidationErrorEnum_FeedItemValidationError = 84
+	// Multiple message delivery options are set.
+	FeedItemValidationErrorEnum_ONLY_ONE_DELIVERY_OPTION_IS_ALLOWED FeedItemValidationErrorEnum_FeedItemValidationError = 85
+	// No message delivery option is set.
+	FeedItemValidationErrorEnum_NO_DELIVERY_OPTION_IS_SET FeedItemValidationErrorEnum_FeedItemValidationError = 86
+	// String value of conversion reporting state field is not valid.
+	FeedItemValidationErrorEnum_INVALID_CONVERSION_REPORTING_STATE FeedItemValidationErrorEnum_FeedItemValidationError = 87
+	// Image size is not right.
+	FeedItemValidationErrorEnum_IMAGE_SIZE_WRONG FeedItemValidationErrorEnum_FeedItemValidationError = 88
+	// Email delivery is not supported in the country specified in the country
+	// code field.
+	FeedItemValidationErrorEnum_EMAIL_DELIVERY_NOT_AVAILABLE_IN_COUNTRY FeedItemValidationErrorEnum_FeedItemValidationError = 89
+	// Auto reply is not supported in the country specified in the country code
+	// field.
+	FeedItemValidationErrorEnum_AUTO_REPLY_NOT_AVAILABLE_IN_COUNTRY FeedItemValidationErrorEnum_FeedItemValidationError = 90
+	// Invalid value specified for latitude.
+	FeedItemValidationErrorEnum_INVALID_LATITUDE_VALUE FeedItemValidationErrorEnum_FeedItemValidationError = 91
+	// Invalid value specified for longitude.
+	FeedItemValidationErrorEnum_INVALID_LONGITUDE_VALUE FeedItemValidationErrorEnum_FeedItemValidationError = 92
+	// Too many label fields provided.
+	FeedItemValidationErrorEnum_TOO_MANY_LABELS FeedItemValidationErrorEnum_FeedItemValidationError = 93
+	// Invalid image url.
+	FeedItemValidationErrorEnum_INVALID_IMAGE_URL FeedItemValidationErrorEnum_FeedItemValidationError = 94
+	// Latitude value is missing.
+	FeedItemValidationErrorEnum_MISSING_LATITUDE_VALUE FeedItemValidationErrorEnum_FeedItemValidationError = 95
+	// Longitude value is missing.
+	FeedItemValidationErrorEnum_MISSING_LONGITUDE_VALUE FeedItemValidationErrorEnum_FeedItemValidationError = 96
+	// Unable to find address.
+	FeedItemValidationErrorEnum_ADDRESS_NOT_FOUND FeedItemValidationErrorEnum_FeedItemValidationError = 97
+	// Cannot target provided address.
+	FeedItemValidationErrorEnum_ADDRESS_NOT_TARGETABLE FeedItemValidationErrorEnum_FeedItemValidationError = 98
+)
+
+var FeedItemValidationErrorEnum_FeedItemValidationError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "STRING_TOO_SHORT",
+	3:  "STRING_TOO_LONG",
+	4:  "VALUE_NOT_SPECIFIED",
+	5:  "INVALID_DOMESTIC_PHONE_NUMBER_FORMAT",
+	6:  "INVALID_PHONE_NUMBER",
+	7:  "PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY",
+	8:  "PREMIUM_RATE_NUMBER_NOT_ALLOWED",
+	9:  "DISALLOWED_NUMBER_TYPE",
+	10: "VALUE_OUT_OF_RANGE",
+	11: "CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY",
+	12: "CUSTOMER_NOT_WHITELISTED_FOR_CALLTRACKING",
+	13: "INVALID_COUNTRY_CODE",
+	14: "INVALID_APP_ID",
+	15: "MISSING_ATTRIBUTES_FOR_FIELDS",
+	16: "INVALID_TYPE_ID",
+	17: "INVALID_EMAIL_ADDRESS",
+	18: "INVALID_HTTPS_URL",
+	19: "MISSING_DELIVERY_ADDRESS",
+	20: "START_DATE_AFTER_END_DATE",
+	21: "MISSING_FEED_ITEM_START_TIME",
+	22: "MISSING_FEED_ITEM_END_TIME",
+	23: "MISSING_FEED_ITEM_ID",
+	24: "VANITY_PHONE_NUMBER_NOT_ALLOWED",
+	25: "INVALID_REVIEW_EXTENSION_SNIPPET",
+	26: "INVALID_NUMBER_FORMAT",
+	27: "INVALID_DATE_FORMAT",
+	28: "INVALID_PRICE_FORMAT",
+	29: "UNKNOWN_PLACEHOLDER_FIELD",
+	30: "MISSING_ENHANCED_SITELINK_DESCRIPTION_LINE",
+	31: "REVIEW_EXTENSION_SOURCE_INELIGIBLE",
+	32: "HYPHENS_IN_REVIEW_EXTENSION_SNIPPET",
+	33: "DOUBLE_QUOTES_IN_REVIEW_EXTENSION_SNIPPET",
+	34: "QUOTES_IN_REVIEW_EXTENSION_SNIPPET",
+	35: "INVALID_FORM_ENCODED_PARAMS",
+	36: "INVALID_URL_PARAMETER_NAME",
+	37: "NO_GEOCODING_RESULT",
+	38: "SOURCE_NAME_IN_REVIEW_EXTENSION_TEXT",
+	39: "CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED",
+	40: "INVALID_PLACEHOLDER_FIELD_ID",
+	41: "INVALID_URL_TAG",
+	42: "LIST_TOO_LONG",
+	43: "INVALID_ATTRIBUTES_COMBINATION",
+	44: "DUPLICATE_VALUES",
+	45: "INVALID_CALL_CONVERSION_ACTION_ID",
+	46: "CANNOT_SET_WITHOUT_FINAL_URLS",
+	47: "APP_ID_DOESNT_EXIST_IN_APP_STORE",
+	48: "INVALID_FINAL_URL",
+	49: "INVALID_TRACKING_URL",
+	50: "INVALID_FINAL_URL_FOR_APP_DOWNLOAD_URL",
+	51: "LIST_TOO_SHORT",
+	52: "INVALID_USER_ACTION",
+	53: "INVALID_TYPE_NAME",
+	54: "INVALID_EVENT_CHANGE_STATUS",
+	55: "INVALID_SNIPPETS_HEADER",
+	56: "INVALID_ANDROID_APP_LINK",
+	57: "NUMBER_TYPE_WITH_CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY",
+	58: "RESERVED_KEYWORD_OTHER",
+	59: "DUPLICATE_OPTION_LABELS",
+	60: "DUPLICATE_OPTION_PREFILLS",
+	61: "UNEQUAL_LIST_LENGTHS",
+	62: "INCONSISTENT_CURRENCY_CODES",
+	63: "PRICE_EXTENSION_HAS_DUPLICATED_HEADERS",
+	64: "ITEM_HAS_DUPLICATED_HEADER_AND_DESCRIPTION",
+	65: "PRICE_EXTENSION_HAS_TOO_FEW_ITEMS",
+	66: "UNSUPPORTED_VALUE",
+	67: "INVALID_FINAL_MOBILE_URL",
+	68: "INVALID_KEYWORDLESS_AD_RULE_LABEL",
+	69: "VALUE_TRACK_PARAMETER_NOT_SUPPORTED",
+	70: "UNSUPPORTED_VALUE_IN_SELECTED_LANGUAGE",
+	71: "INVALID_IOS_APP_LINK",
+	72: "MISSING_IOS_APP_LINK_OR_IOS_APP_STORE_ID",
+	73: "PROMOTION_INVALID_TIME",
+	74: "PROMOTION_CANNOT_SET_PERCENT_OFF_AND_MONEY_AMOUNT_OFF",
+	75: "PROMOTION_CANNOT_SET_PROMOTION_CODE_AND_ORDERS_OVER_AMOUNT",
+	76: "TOO_MANY_DECIMAL_PLACES_SPECIFIED",
+	77: "AD_CUSTOMIZERS_NOT_ALLOWED",
+	78: "INVALID_LANGUAGE_CODE",
+	79: "UNSUPPORTED_LANGUAGE",
+	80: "IF_FUNCTION_NOT_ALLOWED",
+	81: "INVALID_FINAL_URL_SUFFIX",
+	82: "INVALID_TAG_IN_FINAL_URL_SUFFIX",
+	83: "INVALID_FINAL_URL_SUFFIX_FORMAT",
+	84: "CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED",
+	85: "ONLY_ONE_DELIVERY_OPTION_IS_ALLOWED",
+	86: "NO_DELIVERY_OPTION_IS_SET",
+	87: "INVALID_CONVERSION_REPORTING_STATE",
+	88: "IMAGE_SIZE_WRONG",
+	89: "EMAIL_DELIVERY_NOT_AVAILABLE_IN_COUNTRY",
+	90: "AUTO_REPLY_NOT_AVAILABLE_IN_COUNTRY",
+	91: "INVALID_LATITUDE_VALUE",
+	92: "INVALID_LONGITUDE_VALUE",
+	93: "TOO_MANY_LABELS",
+	94: "INVALID_IMAGE_URL",
+	95: "MISSING_LATITUDE_VALUE",
+	96: "MISSING_LONGITUDE_VALUE",
+	97: "ADDRESS_NOT_FOUND",
+	98: "ADDRESS_NOT_TARGETABLE",
+}
+
+var FeedItemValidationErrorEnum_FeedItemValidationError_value = map[string]int32{
+	"UNSPECIFIED":                                                0,
+	"UNKNOWN":                                                    1,
+	"STRING_TOO_SHORT":                                           2,
+	"STRING_TOO_LONG":                                            3,
+	"VALUE_NOT_SPECIFIED":                                        4,
+	"INVALID_DOMESTIC_PHONE_NUMBER_FORMAT":                       5,
+	"INVALID_PHONE_NUMBER":                                       6,
+	"PHONE_NUMBER_NOT_SUPPORTED_FOR_COUNTRY":                     7,
+	"PREMIUM_RATE_NUMBER_NOT_ALLOWED":                            8,
+	"DISALLOWED_NUMBER_TYPE":                                     9,
+	"VALUE_OUT_OF_RANGE":                                         10,
+	"CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY":                     11,
+	"CUSTOMER_NOT_WHITELISTED_FOR_CALLTRACKING":                  12,
+	"INVALID_COUNTRY_CODE":                                       13,
+	"INVALID_APP_ID":                                             14,
+	"MISSING_ATTRIBUTES_FOR_FIELDS":                              15,
+	"INVALID_TYPE_ID":                                            16,
+	"INVALID_EMAIL_ADDRESS":                                      17,
+	"INVALID_HTTPS_URL":                                          18,
+	"MISSING_DELIVERY_ADDRESS":                                   19,
+	"START_DATE_AFTER_END_DATE":                                  20,
+	"MISSING_FEED_ITEM_START_TIME":                               21,
+	"MISSING_FEED_ITEM_END_TIME":                                 22,
+	"MISSING_FEED_ITEM_ID":                                       23,
+	"VANITY_PHONE_NUMBER_NOT_ALLOWED":                            24,
+	"INVALID_REVIEW_EXTENSION_SNIPPET":                           25,
+	"INVALID_NUMBER_FORMAT":                                      26,
+	"INVALID_DATE_FORMAT":                                        27,
+	"INVALID_PRICE_FORMAT":                                       28,
+	"UNKNOWN_PLACEHOLDER_FIELD":                                  29,
+	"MISSING_ENHANCED_SITELINK_DESCRIPTION_LINE":                 30,
+	"REVIEW_EXTENSION_SOURCE_INELIGIBLE":                         31,
+	"HYPHENS_IN_REVIEW_EXTENSION_SNIPPET":                        32,
+	"DOUBLE_QUOTES_IN_REVIEW_EXTENSION_SNIPPET":                  33,
+	"QUOTES_IN_REVIEW_EXTENSION_SNIPPET":                         34,
+	"INVALID_FORM_ENCODED_PARAMS":                                35,
+	"INVALID_URL_PARAMETER_NAME":                                 36,
+	"NO_GEOCODING_RESULT":                                        37,
+	"SOURCE_NAME_IN_REVIEW_EXTENSION_TEXT":                       38,
+	"CARRIER_SPECIFIC_SHORT_NUMBER_NOT_ALLOWED":                  39,
+	"INVALID_PLACEHOLDER_FIELD_ID":                               40,
+	"INVALID_URL_TAG":                                            41,
+	"LIST_TOO_LONG":                                              42,
+	"INVALID_ATTRIBUTES_COMBINATION":                             43,
+	"DUPLICATE_VALUES":                                           44,
+	"INVALID_CALL_CONVERSION_ACTION_ID":                          45,
+	"CANNOT_SET_WITHOUT_FINAL_URLS":                              46,
+	"APP_ID_DOESNT_EXIST_IN_APP_STORE":                           47,
+	"INVALID_FINAL_URL":                                          48,
+	"INVALID_TRACKING_URL":                                       49,
+	"INVALID_FINAL_URL_FOR_APP_DOWNLOAD_URL":                     50,
+	"LIST_TOO_SHORT":                                             51,
+	"INVALID_USER_ACTION":                                        52,
+	"INVALID_TYPE_NAME":                                          53,
+	"INVALID_EVENT_CHANGE_STATUS":                                54,
+	"INVALID_SNIPPETS_HEADER":                                    55,
+	"INVALID_ANDROID_APP_LINK":                                   56,
+	"NUMBER_TYPE_WITH_CALLTRACKING_NOT_SUPPORTED_FOR_COUNTRY":    57,
+	"RESERVED_KEYWORD_OTHER":                                     58,
+	"DUPLICATE_OPTION_LABELS":                                    59,
+	"DUPLICATE_OPTION_PREFILLS":                                  60,
+	"UNEQUAL_LIST_LENGTHS":                                       61,
+	"INCONSISTENT_CURRENCY_CODES":                                62,
+	"PRICE_EXTENSION_HAS_DUPLICATED_HEADERS":                     63,
+	"ITEM_HAS_DUPLICATED_HEADER_AND_DESCRIPTION":                 64,
+	"PRICE_EXTENSION_HAS_TOO_FEW_ITEMS":                          65,
+	"UNSUPPORTED_VALUE":                                          66,
+	"INVALID_FINAL_MOBILE_URL":                                   67,
+	"INVALID_KEYWORDLESS_AD_RULE_LABEL":                          68,
+	"VALUE_TRACK_PARAMETER_NOT_SUPPORTED":                        69,
+	"UNSUPPORTED_VALUE_IN_SELECTED_LANGUAGE":                     70,
+	"INVALID_IOS_APP_LINK":                                       71,
+	"MISSING_IOS_APP_LINK_OR_IOS_APP_STORE_ID":                   72,
+	"PROMOTION_INVALID_TIME":                                     73,
+	"PROMOTION_CANNOT_SET_PERCENT_OFF_AND_MONEY_AMOUNT_OFF":      74,
+	"PROMOTION_CANNOT_SET_PROMOTION_CODE_AND_ORDERS_OVER_AMOUNT": 75,
+	"TOO_MANY_DECIMAL_PLACES_SPECIFIED":                          76,
+	"AD_CUSTOMIZERS_NOT_ALLOWED":                                 77,
+	"INVALID_LANGUAGE_CODE":                                      78,
+	"UNSUPPORTED_LANGUAGE":                                       79,
+	"IF_FUNCTION_NOT_ALLOWED":                                    80,
+	"INVALID_FINAL_URL_SUFFIX":                                   81,
+	"INVALID_TAG_IN_FINAL_URL_SUFFIX":                            82,
+	"INVALID_FINAL_URL_SUFFIX_FORMAT":                            83,
+	"CUSTOMER_CONSENT_FOR_CALL_RECORDING_REQUIRED":               84,
+	"ONLY_ONE_DELIVERY_OPTION_IS_ALLOWED":                        85,
+	"NO_DELIVERY_OPTION_IS_SET":                                  86,
+	"INVALID_CONVERSION_REPORTING_STATE":                         87,
+	"IMAGE_SIZE_WRONG":                                           88,
+	"EMAIL_DELIVERY_NOT_AVAILABLE_IN_COUNTRY":                    89,
+	"AUTO_REPLY_NOT_AVAILABLE_IN_COUNTRY":                        90,
+	"INVALID_LATITUDE_VALUE":                                     91,
+	"INVALID_LONGITUDE_VALUE":                                    92,
+	"TOO_MANY_LABELS":                                            93,
+	"INVALID_IMAGE_URL":                                          94,
+	"MISSING_LATITUDE_VALUE":                                     95,
+	"MISSING_LONGITUDE_VALUE":                                    96,
+	"ADDRESS_NOT_FOUND":                                          97,
+	"ADDRESS_NOT_TARGETABLE":                                     98,
+}
+
+func (x FeedItemValidationErrorEnum_FeedItemValidationError) String() string {
+	return proto.EnumName(FeedItemValidationErrorEnum_FeedItemValidationError_name, int32(x))
+}
+
+func (FeedItemValidationErrorEnum_FeedItemValidationError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_40745eedd4c58492, []int{0, 0}
+}
+
+// Container for enum describing possible validation errors of a feed item.
+type FeedItemValidationErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedItemValidationErrorEnum) Reset()         { *m = FeedItemValidationErrorEnum{} }
+func (m *FeedItemValidationErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedItemValidationErrorEnum) ProtoMessage()    {}
+func (*FeedItemValidationErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_40745eedd4c58492, []int{0}
+}
+
+func (m *FeedItemValidationErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemValidationErrorEnum.Unmarshal(m, b)
+}
+func (m *FeedItemValidationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemValidationErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedItemValidationErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemValidationErrorEnum.Merge(m, src)
+}
+func (m *FeedItemValidationErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedItemValidationErrorEnum.Size(m)
+}
+func (m *FeedItemValidationErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemValidationErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemValidationErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FeedItemValidationErrorEnum_FeedItemValidationError", FeedItemValidationErrorEnum_FeedItemValidationError_name, FeedItemValidationErrorEnum_FeedItemValidationError_value)
+	proto.RegisterType((*FeedItemValidationErrorEnum)(nil), "google.ads.googleads.v3.errors.FeedItemValidationErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/feed_item_validation_error.proto", fileDescriptor_40745eedd4c58492)
+}
+
+var fileDescriptor_40745eedd4c58492 = []byte{
+	// 1665 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0x6d, 0x73, 0x1b, 0xb7,
+	0x11, 0xae, 0x9d, 0x36, 0x69, 0xe1, 0x26, 0x86, 0xe1, 0x57, 0xd9, 0xb2, 0x6c, 0xcb, 0x8e, 0xed,
+	0x38, 0x0e, 0x95, 0x56, 0x4d, 0xd3, 0xd0, 0x6d, 0x52, 0xf0, 0xb0, 0x47, 0xa2, 0xc2, 0x01, 0x67,
+	0x00, 0x47, 0x8a, 0xaa, 0x5a, 0x54, 0x29, 0x59, 0x8d, 0x66, 0x2c, 0xd1, 0x23, 0xaa, 0xfe, 0x41,
+	0xfd, 0xd8, 0x3f, 0xd2, 0x99, 0xfe, 0x91, 0xce, 0xf4, 0x0f, 0xf4, 0x6b, 0x67, 0x71, 0x2f, 0x3c,
+	0x89, 0x92, 0x27, 0x9f, 0x44, 0x01, 0xbb, 0x0b, 0xec, 0xb3, 0xcf, 0x3e, 0x8b, 0x23, 0xdf, 0xed,
+	0xcf, 0x66, 0xfb, 0x6f, 0xa6, 0x1b, 0x7b, 0x93, 0xf9, 0x46, 0xf9, 0x13, 0x7f, 0xbd, 0xdb, 0xdc,
+	0x98, 0x1e, 0x1f, 0xcf, 0x8e, 0xe7, 0x1b, 0x7f, 0x9b, 0x4e, 0x27, 0xe1, 0xe0, 0x64, 0x7a, 0x18,
+	0xde, 0xed, 0xbd, 0x39, 0x98, 0xec, 0x9d, 0x1c, 0xcc, 0x8e, 0x42, 0xdc, 0xeb, 0xbc, 0x3d, 0x9e,
+	0x9d, 0xcc, 0xd8, 0x5a, 0xe9, 0xd5, 0xd9, 0x9b, 0xcc, 0x3b, 0x4d, 0x80, 0xce, 0xbb, 0xcd, 0x4e,
+	0x19, 0xe0, 0xee, 0x6a, 0x7d, 0xc0, 0xdb, 0x83, 0x8d, 0xbd, 0xa3, 0xa3, 0xd9, 0x49, 0x0c, 0x31,
+	0x2f, 0xbd, 0xd7, 0xff, 0xb3, 0x42, 0xee, 0xa5, 0xd3, 0xe9, 0x44, 0x9e, 0x4c, 0x0f, 0x87, 0xcd,
+	0x01, 0x80, 0xae, 0x70, 0xf4, 0xf7, 0xc3, 0xf5, 0x7f, 0xad, 0x90, 0xdb, 0x17, 0xec, 0xb3, 0xab,
+	0xe4, 0x4a, 0xa1, 0x5d, 0x0e, 0x89, 0x4c, 0x25, 0x08, 0xfa, 0x23, 0x76, 0x85, 0x7c, 0x54, 0xe8,
+	0x2d, 0x6d, 0x46, 0x9a, 0x5e, 0x62, 0x37, 0x08, 0x75, 0xde, 0x4a, 0xdd, 0x0f, 0xde, 0x98, 0xe0,
+	0x06, 0xc6, 0x7a, 0x7a, 0x99, 0x5d, 0x27, 0x57, 0x5b, 0xab, 0xca, 0xe8, 0x3e, 0xfd, 0x80, 0xdd,
+	0x26, 0xd7, 0x87, 0x5c, 0x15, 0x10, 0xb4, 0xf1, 0x61, 0x11, 0xf0, 0xc7, 0xec, 0x39, 0x79, 0x22,
+	0xf5, 0x90, 0x2b, 0x29, 0x82, 0x30, 0x19, 0x38, 0x2f, 0x93, 0x90, 0x0f, 0x8c, 0x86, 0xa0, 0x8b,
+	0xac, 0x07, 0x36, 0xa4, 0xc6, 0x66, 0xdc, 0xd3, 0x9f, 0xb0, 0x3b, 0xe4, 0x46, 0x6d, 0xd9, 0x36,
+	0xa0, 0x1f, 0xb2, 0x17, 0xe4, 0xe9, 0x29, 0x97, 0x78, 0x46, 0x91, 0xe7, 0xc6, 0x7a, 0x10, 0x18,
+	0x20, 0x24, 0xa6, 0xd0, 0xde, 0x8e, 0xe9, 0x47, 0xec, 0x31, 0x79, 0x90, 0x5b, 0xc8, 0x64, 0x91,
+	0x05, 0xcb, 0xfd, 0x29, 0x17, 0xae, 0x94, 0x19, 0x81, 0xa0, 0x3f, 0x65, 0x77, 0xc9, 0x2d, 0x21,
+	0x5d, 0xf5, 0x7f, 0x6d, 0xe2, 0xc7, 0x39, 0xd0, 0x9f, 0xb1, 0x5b, 0x84, 0x95, 0x99, 0x98, 0xc2,
+	0x07, 0x93, 0x06, 0xcb, 0x75, 0x1f, 0x28, 0xc1, 0x4b, 0x24, 0x5c, 0x29, 0x6f, 0x79, 0xb2, 0x85,
+	0xc9, 0x5f, 0x7c, 0x89, 0x2b, 0xec, 0x0b, 0xf2, 0x59, 0x52, 0x38, 0x6f, 0xb2, 0xea, 0xe4, 0xd1,
+	0x40, 0x7a, 0x50, 0xd2, 0x35, 0x96, 0xad, 0x40, 0xf4, 0xe7, 0xed, 0xcc, 0xab, 0x18, 0x21, 0x31,
+	0x02, 0xe8, 0xc7, 0x8c, 0x91, 0x4f, 0xea, 0x1d, 0x9e, 0xe7, 0x41, 0x0a, 0xfa, 0x09, 0x7b, 0x44,
+	0xee, 0x67, 0xd2, 0x39, 0xbc, 0x03, 0xf7, 0xde, 0xca, 0x5e, 0xe1, 0xc1, 0xc5, 0xb0, 0xa9, 0x04,
+	0x25, 0x1c, 0xbd, 0x8a, 0x25, 0xaa, 0xdd, 0x30, 0x2b, 0xf4, 0xa3, 0x6c, 0x85, 0xdc, 0xac, 0x17,
+	0x21, 0xe3, 0x52, 0x05, 0x2e, 0x84, 0x05, 0xe7, 0xe8, 0x35, 0x76, 0x93, 0x5c, 0xab, 0xb7, 0x06,
+	0xde, 0xe7, 0x2e, 0x14, 0x56, 0x51, 0xc6, 0x56, 0xc9, 0x9d, 0xfa, 0x24, 0x01, 0x4a, 0x0e, 0xc1,
+	0x8e, 0x1b, 0xa7, 0xeb, 0xec, 0x3e, 0x59, 0x71, 0x9e, 0x5b, 0x1f, 0x04, 0xe2, 0xcc, 0x53, 0x0f,
+	0x36, 0x80, 0x16, 0xf1, 0x5f, 0x7a, 0x83, 0x3d, 0x24, 0xab, 0xb5, 0x73, 0x0a, 0x20, 0x82, 0xf4,
+	0x90, 0x85, 0xd2, 0xc1, 0xcb, 0x0c, 0xe8, 0x4d, 0xb6, 0x46, 0xee, 0x2e, 0x5b, 0x60, 0x84, 0xb8,
+	0x7f, 0x0b, 0x61, 0x59, 0xde, 0x97, 0x82, 0xde, 0xc6, 0x22, 0x0f, 0xb9, 0x96, 0x7e, 0x1c, 0x96,
+	0x78, 0x51, 0x17, 0xf9, 0x0e, 0x7b, 0x42, 0x1e, 0xd6, 0x49, 0x59, 0x18, 0x4a, 0x18, 0x05, 0xd8,
+	0xf6, 0xa0, 0x9d, 0x34, 0x3a, 0x38, 0x2d, 0xf3, 0x1c, 0x3c, 0x5d, 0x69, 0xa3, 0x72, 0x9a, 0x90,
+	0x77, 0x91, 0xd3, 0x0d, 0x75, 0x31, 0xc5, 0x6a, 0xe3, 0xde, 0x29, 0xa6, 0x5a, 0x99, 0x34, 0x3b,
+	0xab, 0x88, 0x49, 0xd5, 0x3e, 0x21, 0x57, 0x3c, 0x81, 0x81, 0x51, 0x02, 0xaa, 0xc2, 0xd0, 0xfb,
+	0xac, 0x43, 0x5e, 0xd4, 0x19, 0x81, 0x1e, 0x70, 0x9d, 0x80, 0x08, 0x2e, 0x52, 0x43, 0x6f, 0x05,
+	0x01, 0x2e, 0xb1, 0x32, 0xf7, 0x78, 0x3f, 0x25, 0x35, 0xd0, 0x35, 0xf6, 0x94, 0xac, 0x2f, 0x5f,
+	0xdd, 0x14, 0x36, 0x81, 0x20, 0x35, 0x28, 0xd9, 0x97, 0x3d, 0x05, 0xf4, 0x01, 0x7b, 0x46, 0x1e,
+	0x0f, 0xc6, 0xf9, 0x00, 0xb4, 0x0b, 0x52, 0x5f, 0x9c, 0xed, 0x43, 0x24, 0xa6, 0x30, 0x45, 0x4f,
+	0x41, 0x78, 0x5d, 0x18, 0xa4, 0xcd, 0xfb, 0xcc, 0x1f, 0xe1, 0xf9, 0x3f, 0xc0, 0x6e, 0x9d, 0x3d,
+	0x20, 0xf7, 0x6a, 0x40, 0x10, 0x8a, 0x00, 0x1a, 0xf9, 0x2b, 0x42, 0xce, 0x2d, 0xcf, 0x1c, 0x7d,
+	0x8c, 0xa5, 0xae, 0x0d, 0x0a, 0xab, 0xca, 0x75, 0x40, 0xc2, 0x68, 0x9e, 0x01, 0x7d, 0x82, 0x50,
+	0x6b, 0x13, 0xfa, 0x60, 0x12, 0x23, 0x10, 0x1d, 0x0b, 0xae, 0x50, 0x9e, 0x7e, 0x8a, 0xf2, 0x51,
+	0x25, 0x8c, 0x96, 0xe7, 0x5e, 0xc3, 0xc3, 0xb6, 0xa7, 0x4f, 0x63, 0xcf, 0x71, 0x6b, 0x25, 0xd8,
+	0x5a, 0x7f, 0x92, 0x52, 0xb2, 0xce, 0x63, 0xc7, 0x33, 0xa4, 0x67, 0x53, 0xc3, 0xb3, 0x95, 0x42,
+	0x92, 0x3d, 0x6f, 0x37, 0x11, 0xde, 0xd9, 0xf3, 0x3e, 0xfd, 0x8c, 0x5d, 0x23, 0x1f, 0x63, 0x1f,
+	0x2f, 0xa4, 0xef, 0x05, 0x5b, 0x27, 0x6b, 0x4d, 0x8f, 0x2e, 0xfa, 0x31, 0x31, 0x59, 0x4f, 0x6a,
+	0x8e, 0xd5, 0xa4, 0x9f, 0xa3, 0x92, 0x8a, 0x22, 0x57, 0x32, 0x41, 0x1e, 0x45, 0x79, 0x71, 0xf4,
+	0x25, 0xfb, 0x94, 0x3c, 0x6a, 0xfa, 0x9e, 0x2b, 0x15, 0x12, 0xa3, 0x87, 0x60, 0x63, 0x52, 0x3c,
+	0x89, 0x3c, 0x90, 0x82, 0x7e, 0x81, 0x0d, 0x9f, 0x70, 0x1d, 0xf5, 0x06, 0x7c, 0x18, 0x49, 0x3f,
+	0x40, 0x69, 0x4a, 0xa5, 0xe6, 0x0a, 0x6f, 0xe6, 0x68, 0x07, 0xb9, 0x5e, 0xea, 0x43, 0x10, 0x06,
+	0x9c, 0xf6, 0x01, 0xb6, 0xf1, 0x96, 0x52, 0x47, 0xd9, 0x70, 0xde, 0x58, 0xa0, 0x1b, 0xed, 0x36,
+	0x6f, 0xbc, 0xe9, 0x97, 0x6d, 0x3a, 0x37, 0xea, 0x86, 0x3b, 0xbf, 0x40, 0xcd, 0x5b, 0x72, 0x88,
+	0x4a, 0x83, 0x51, 0x85, 0x19, 0x69, 0x65, 0x78, 0x44, 0x87, 0xfe, 0x12, 0xa5, 0xaa, 0x41, 0xa6,
+	0x1c, 0x15, 0x9b, 0xed, 0x0e, 0x2a, 0x1c, 0xd8, 0x2a, 0x2b, 0xfa, 0xab, 0xf6, 0x4d, 0xa2, 0x40,
+	0x45, 0x1a, 0x7c, 0xd5, 0xe6, 0x11, 0x0c, 0x41, 0xfb, 0x90, 0x0c, 0x50, 0x7d, 0x51, 0x36, 0x7c,
+	0xe1, 0xe8, 0xaf, 0xd9, 0x3d, 0x72, 0xbb, 0x36, 0xa8, 0xd8, 0xe7, 0xc2, 0x00, 0xb8, 0x00, 0x4b,
+	0xbf, 0x46, 0xb9, 0x6a, 0x0a, 0xa1, 0x85, 0x35, 0x95, 0x68, 0x62, 0x73, 0xd1, 0xdf, 0xb0, 0x57,
+	0xe4, 0xeb, 0x96, 0xd0, 0x47, 0x18, 0xc3, 0x0f, 0x14, 0xf4, 0x6f, 0x70, 0x60, 0x58, 0x70, 0x60,
+	0x87, 0x20, 0xc2, 0x16, 0x8c, 0x47, 0xc6, 0x8a, 0x60, 0xfc, 0x00, 0x2c, 0xed, 0xe2, 0x9d, 0x16,
+	0xb5, 0x35, 0x55, 0xff, 0xf2, 0x1e, 0x28, 0x47, 0x5f, 0xa1, 0x20, 0x2c, 0x6d, 0xe6, 0x16, 0x52,
+	0xa9, 0x94, 0xa3, 0xbf, 0x45, 0xe8, 0x0b, 0x0d, 0xaf, 0x0b, 0xae, 0x42, 0x04, 0x4f, 0x81, 0xee,
+	0xfb, 0x81, 0xa3, 0xbf, 0x2b, 0xa1, 0x48, 0x8c, 0x76, 0x38, 0x35, 0x10, 0x89, 0xc2, 0x5a, 0xd0,
+	0x49, 0x39, 0x19, 0x1c, 0xfd, 0x36, 0x0e, 0xc5, 0x28, 0x3e, 0x8b, 0x4e, 0x18, 0x70, 0x17, 0x9a,
+	0xd3, 0x44, 0x05, 0x8c, 0xa3, 0xdf, 0xa1, 0xee, 0x44, 0xf1, 0x3c, 0xd7, 0x00, 0xc1, 0x6a, 0x8b,
+	0x0f, 0xfd, 0x3d, 0x12, 0xf3, 0xbc, 0xd8, 0x58, 0xda, 0x14, 0x46, 0x51, 0x88, 0x1d, 0xe5, 0x58,
+	0xc5, 0x42, 0x2f, 0x20, 0x8b, 0xbc, 0xa6, 0xbd, 0x76, 0x1d, 0x4a, 0xd6, 0x64, 0xa6, 0x27, 0x15,
+	0x44, 0x9e, 0x24, 0x6d, 0xd2, 0x57, 0x48, 0x2a, 0x70, 0x2e, 0x70, 0x11, 0x6c, 0xa1, 0xa0, 0x44,
+	0x8e, 0x0a, 0x94, 0xb4, 0x72, 0x0c, 0xc7, 0xfa, 0xb4, 0x15, 0xa3, 0x5d, 0x26, 0x0a, 0x88, 0xc3,
+	0xd2, 0x25, 0x90, 0xf8, 0x0e, 0x14, 0x24, 0xb8, 0xa2, 0xb8, 0xee, 0x17, 0xbc, 0x0f, 0x34, 0x6d,
+	0x33, 0x5d, 0x1a, 0xb7, 0x60, 0x47, 0x9f, 0xbd, 0x24, 0xcf, 0x6b, 0x65, 0x6e, 0xef, 0x04, 0x63,
+	0x9b, 0xff, 0x63, 0x17, 0x61, 0x47, 0x0e, 0x90, 0x0e, 0xb9, 0x35, 0x99, 0x29, 0x7b, 0xb4, 0x26,
+	0x32, 0x4e, 0x2d, 0xc9, 0xbe, 0x21, 0x5f, 0x2d, 0xf6, 0x5a, 0x7d, 0x9b, 0x83, 0x4d, 0xb0, 0x90,
+	0x26, 0x4d, 0x23, 0xe2, 0x99, 0xd1, 0x30, 0x0e, 0x3c, 0x43, 0x8e, 0xe1, 0x22, 0xfd, 0x03, 0xfb,
+	0x96, 0x74, 0xcf, 0x77, 0x5d, 0x2c, 0x1a, 0x01, 0xd1, 0xdb, 0x58, 0x2c, 0x6d, 0x30, 0x43, 0xac,
+	0x5f, 0x8c, 0x41, 0xb7, 0x10, 0x5a, 0x2c, 0x51, 0xc6, 0xf5, 0x38, 0x08, 0x48, 0x64, 0xc6, 0x55,
+	0x29, 0x6e, 0xae, 0xf5, 0x24, 0x53, 0x28, 0xc6, 0x5c, 0x84, 0xf2, 0x81, 0x22, 0x77, 0x30, 0x4c,
+	0x5b, 0x1a, 0xb3, 0xf6, 0x48, 0xac, 0xb1, 0x2b, 0xdf, 0x23, 0xba, 0xe4, 0xeb, 0x02, 0xec, 0x06,
+	0x5a, 0x13, 0x3b, 0x33, 0x0d, 0x69, 0xa1, 0x4b, 0xe1, 0x6a, 0x47, 0xcc, 0x97, 0x19, 0x81, 0x3a,
+	0xe2, 0x8a, 0x34, 0x95, 0xdb, 0xf4, 0x35, 0x4e, 0xf3, 0x06, 0x43, 0xde, 0xc7, 0xda, 0x2d, 0x19,
+	0xd9, 0xb6, 0xd1, 0xd9, 0xdd, 0x7a, 0xfc, 0x3a, 0xf6, 0x25, 0x79, 0xd9, 0xbc, 0xbb, 0xb0, 0x77,
+	0x10, 0xef, 0xfa, 0xbd, 0x15, 0x2c, 0x24, 0xc6, 0x56, 0xd3, 0xe5, 0x75, 0x21, 0x2d, 0x08, 0xea,
+	0x91, 0x66, 0x46, 0xab, 0x71, 0xc0, 0x57, 0x44, 0xf3, 0xc6, 0xa9, 0xfa, 0x54, 0xba, 0x26, 0x85,
+	0x02, 0x1b, 0x59, 0x9b, 0xf3, 0x4c, 0x1c, 0x78, 0x3a, 0xc4, 0x49, 0xb9, 0x78, 0xc2, 0x35, 0x2a,
+	0x6e, 0x01, 0x81, 0xc2, 0x23, 0x51, 0xc1, 0x80, 0x8e, 0x70, 0x10, 0xc8, 0x0c, 0x01, 0x75, 0x72,
+	0x07, 0xc2, 0xc8, 0xe2, 0x08, 0xd9, 0x66, 0x9f, 0x93, 0x67, 0xe5, 0x93, 0xac, 0x89, 0x1f, 0xf1,
+	0x1b, 0x72, 0xa9, 0x38, 0x0e, 0x6b, 0xa9, 0x1b, 0x2d, 0x1a, 0xe3, 0x95, 0x79, 0xe1, 0x0d, 0x06,
+	0x57, 0xef, 0x31, 0xdc, 0x41, 0x96, 0x2e, 0xea, 0xe8, 0xa5, 0x2f, 0x44, 0x35, 0x7b, 0xe8, 0x1f,
+	0xdb, 0x42, 0x8a, 0x63, 0xac, 0xbd, 0xb9, 0x8b, 0x93, 0xaf, 0xe1, 0x51, 0xa5, 0x64, 0x7f, 0x6a,
+	0x4b, 0x76, 0x99, 0x01, 0xb6, 0xf3, 0x9f, 0xf1, 0x90, 0xba, 0x71, 0xce, 0x1c, 0x12, 0xf0, 0x90,
+	0x66, 0xef, 0xcc, 0x21, 0x7f, 0xc1, 0x78, 0xd5, 0x5b, 0x32, 0xe6, 0x90, 0x9a, 0x42, 0x0b, 0xba,
+	0x87, 0xf1, 0xda, 0xcb, 0x9e, 0xdb, 0x3e, 0x78, 0xcc, 0x8d, 0x7e, 0xdf, 0xfb, 0xdf, 0x25, 0xb2,
+	0xfe, 0xd7, 0xd9, 0x61, 0xe7, 0xfd, 0x9f, 0x4b, 0xbd, 0xd5, 0x0b, 0xbe, 0x76, 0x72, 0xfc, 0x5c,
+	0xca, 0x2f, 0xed, 0x88, 0xca, 0x7f, 0x7f, 0xf6, 0x66, 0xef, 0x68, 0xbf, 0x33, 0x3b, 0xde, 0xdf,
+	0xd8, 0x9f, 0x1e, 0xc5, 0x8f, 0xa9, 0xfa, 0xfb, 0xed, 0xed, 0xc1, 0xfc, 0xa2, 0xcf, 0xb9, 0x57,
+	0xe5, 0x9f, 0x7f, 0x5c, 0xfe, 0xa0, 0xcf, 0xf9, 0x3f, 0x2f, 0xaf, 0xf5, 0xcb, 0x60, 0x7c, 0x32,
+	0xef, 0x94, 0x3f, 0xf1, 0xd7, 0x70, 0xb3, 0x13, 0x8f, 0x9c, 0xff, 0xbb, 0x36, 0xd8, 0xe5, 0x93,
+	0xf9, 0x6e, 0x63, 0xb0, 0x3b, 0xdc, 0xdc, 0x2d, 0x0d, 0xfe, 0x7b, 0x79, 0xbd, 0x5c, 0xed, 0x76,
+	0xf9, 0x64, 0xde, 0xed, 0x36, 0x26, 0xdd, 0xee, 0x70, 0xb3, 0xdb, 0x2d, 0x8d, 0xbe, 0xff, 0x30,
+	0xde, 0x6e, 0xf3, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6a, 0x84, 0x4d, 0xa4, 0x6b, 0x0e, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/feed_mapping_error.pb.go b/googleapis/ads/googleads/v3/errors/feed_mapping_error.pb.go
new file mode 100644
index 0000000..ad0de76
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/feed_mapping_error.pb.go
@@ -0,0 +1,205 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/feed_mapping_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible feed item errors.
+type FeedMappingErrorEnum_FeedMappingError int32
+
+const (
+	// Enum unspecified.
+	FeedMappingErrorEnum_UNSPECIFIED FeedMappingErrorEnum_FeedMappingError = 0
+	// The received error code is not known in this version.
+	FeedMappingErrorEnum_UNKNOWN FeedMappingErrorEnum_FeedMappingError = 1
+	// The given placeholder field does not exist.
+	FeedMappingErrorEnum_INVALID_PLACEHOLDER_FIELD FeedMappingErrorEnum_FeedMappingError = 2
+	// The given criterion field does not exist.
+	FeedMappingErrorEnum_INVALID_CRITERION_FIELD FeedMappingErrorEnum_FeedMappingError = 3
+	// The given placeholder type does not exist.
+	FeedMappingErrorEnum_INVALID_PLACEHOLDER_TYPE FeedMappingErrorEnum_FeedMappingError = 4
+	// The given criterion type does not exist.
+	FeedMappingErrorEnum_INVALID_CRITERION_TYPE FeedMappingErrorEnum_FeedMappingError = 5
+	// A feed mapping must contain at least one attribute field mapping.
+	FeedMappingErrorEnum_NO_ATTRIBUTE_FIELD_MAPPINGS FeedMappingErrorEnum_FeedMappingError = 7
+	// The type of the feed attribute referenced in the attribute field mapping
+	// must match the type of the placeholder field.
+	FeedMappingErrorEnum_FEED_ATTRIBUTE_TYPE_MISMATCH FeedMappingErrorEnum_FeedMappingError = 8
+	// A feed mapping for a system generated feed cannot be operated on.
+	FeedMappingErrorEnum_CANNOT_OPERATE_ON_MAPPINGS_FOR_SYSTEM_GENERATED_FEED FeedMappingErrorEnum_FeedMappingError = 9
+	// Only one feed mapping for a placeholder type is allowed per feed or
+	// customer (depending on the placeholder type).
+	FeedMappingErrorEnum_MULTIPLE_MAPPINGS_FOR_PLACEHOLDER_TYPE FeedMappingErrorEnum_FeedMappingError = 10
+	// Only one feed mapping for a criterion type is allowed per customer.
+	FeedMappingErrorEnum_MULTIPLE_MAPPINGS_FOR_CRITERION_TYPE FeedMappingErrorEnum_FeedMappingError = 11
+	// Only one feed attribute mapping for a placeholder field is allowed
+	// (depending on the placeholder type).
+	FeedMappingErrorEnum_MULTIPLE_MAPPINGS_FOR_PLACEHOLDER_FIELD FeedMappingErrorEnum_FeedMappingError = 12
+	// Only one feed attribute mapping for a criterion field is allowed
+	// (depending on the criterion type).
+	FeedMappingErrorEnum_MULTIPLE_MAPPINGS_FOR_CRITERION_FIELD FeedMappingErrorEnum_FeedMappingError = 13
+	// This feed mapping may not contain any explicit attribute field mappings.
+	FeedMappingErrorEnum_UNEXPECTED_ATTRIBUTE_FIELD_MAPPINGS FeedMappingErrorEnum_FeedMappingError = 14
+	// Location placeholder feed mappings can only be created for Places feeds.
+	FeedMappingErrorEnum_LOCATION_PLACEHOLDER_ONLY_FOR_PLACES_FEEDS FeedMappingErrorEnum_FeedMappingError = 15
+	// Mappings for typed feeds cannot be modified.
+	FeedMappingErrorEnum_CANNOT_MODIFY_MAPPINGS_FOR_TYPED_FEED FeedMappingErrorEnum_FeedMappingError = 16
+	// The given placeholder type can only be mapped to system generated feeds.
+	FeedMappingErrorEnum_INVALID_PLACEHOLDER_TYPE_FOR_NON_SYSTEM_GENERATED_FEED FeedMappingErrorEnum_FeedMappingError = 17
+	// The given placeholder type cannot be mapped to a system generated feed
+	// with the given type.
+	FeedMappingErrorEnum_INVALID_PLACEHOLDER_TYPE_FOR_SYSTEM_GENERATED_FEED_TYPE FeedMappingErrorEnum_FeedMappingError = 18
+	// The "field" oneof was not set in an AttributeFieldMapping.
+	FeedMappingErrorEnum_ATTRIBUTE_FIELD_MAPPING_MISSING_FIELD FeedMappingErrorEnum_FeedMappingError = 19
+)
+
+var FeedMappingErrorEnum_FeedMappingError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "INVALID_PLACEHOLDER_FIELD",
+	3:  "INVALID_CRITERION_FIELD",
+	4:  "INVALID_PLACEHOLDER_TYPE",
+	5:  "INVALID_CRITERION_TYPE",
+	7:  "NO_ATTRIBUTE_FIELD_MAPPINGS",
+	8:  "FEED_ATTRIBUTE_TYPE_MISMATCH",
+	9:  "CANNOT_OPERATE_ON_MAPPINGS_FOR_SYSTEM_GENERATED_FEED",
+	10: "MULTIPLE_MAPPINGS_FOR_PLACEHOLDER_TYPE",
+	11: "MULTIPLE_MAPPINGS_FOR_CRITERION_TYPE",
+	12: "MULTIPLE_MAPPINGS_FOR_PLACEHOLDER_FIELD",
+	13: "MULTIPLE_MAPPINGS_FOR_CRITERION_FIELD",
+	14: "UNEXPECTED_ATTRIBUTE_FIELD_MAPPINGS",
+	15: "LOCATION_PLACEHOLDER_ONLY_FOR_PLACES_FEEDS",
+	16: "CANNOT_MODIFY_MAPPINGS_FOR_TYPED_FEED",
+	17: "INVALID_PLACEHOLDER_TYPE_FOR_NON_SYSTEM_GENERATED_FEED",
+	18: "INVALID_PLACEHOLDER_TYPE_FOR_SYSTEM_GENERATED_FEED_TYPE",
+	19: "ATTRIBUTE_FIELD_MAPPING_MISSING_FIELD",
+}
+
+var FeedMappingErrorEnum_FeedMappingError_value = map[string]int32{
+	"UNSPECIFIED":                  0,
+	"UNKNOWN":                      1,
+	"INVALID_PLACEHOLDER_FIELD":    2,
+	"INVALID_CRITERION_FIELD":      3,
+	"INVALID_PLACEHOLDER_TYPE":     4,
+	"INVALID_CRITERION_TYPE":       5,
+	"NO_ATTRIBUTE_FIELD_MAPPINGS":  7,
+	"FEED_ATTRIBUTE_TYPE_MISMATCH": 8,
+	"CANNOT_OPERATE_ON_MAPPINGS_FOR_SYSTEM_GENERATED_FEED":    9,
+	"MULTIPLE_MAPPINGS_FOR_PLACEHOLDER_TYPE":                  10,
+	"MULTIPLE_MAPPINGS_FOR_CRITERION_TYPE":                    11,
+	"MULTIPLE_MAPPINGS_FOR_PLACEHOLDER_FIELD":                 12,
+	"MULTIPLE_MAPPINGS_FOR_CRITERION_FIELD":                   13,
+	"UNEXPECTED_ATTRIBUTE_FIELD_MAPPINGS":                     14,
+	"LOCATION_PLACEHOLDER_ONLY_FOR_PLACES_FEEDS":              15,
+	"CANNOT_MODIFY_MAPPINGS_FOR_TYPED_FEED":                   16,
+	"INVALID_PLACEHOLDER_TYPE_FOR_NON_SYSTEM_GENERATED_FEED":  17,
+	"INVALID_PLACEHOLDER_TYPE_FOR_SYSTEM_GENERATED_FEED_TYPE": 18,
+	"ATTRIBUTE_FIELD_MAPPING_MISSING_FIELD":                   19,
+}
+
+func (x FeedMappingErrorEnum_FeedMappingError) String() string {
+	return proto.EnumName(FeedMappingErrorEnum_FeedMappingError_name, int32(x))
+}
+
+func (FeedMappingErrorEnum_FeedMappingError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a10df35593e929d8, []int{0, 0}
+}
+
+// Container for enum describing possible feed item errors.
+type FeedMappingErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FeedMappingErrorEnum) Reset()         { *m = FeedMappingErrorEnum{} }
+func (m *FeedMappingErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FeedMappingErrorEnum) ProtoMessage()    {}
+func (*FeedMappingErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a10df35593e929d8, []int{0}
+}
+
+func (m *FeedMappingErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedMappingErrorEnum.Unmarshal(m, b)
+}
+func (m *FeedMappingErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedMappingErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FeedMappingErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedMappingErrorEnum.Merge(m, src)
+}
+func (m *FeedMappingErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FeedMappingErrorEnum.Size(m)
+}
+func (m *FeedMappingErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedMappingErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedMappingErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FeedMappingErrorEnum_FeedMappingError", FeedMappingErrorEnum_FeedMappingError_name, FeedMappingErrorEnum_FeedMappingError_value)
+	proto.RegisterType((*FeedMappingErrorEnum)(nil), "google.ads.googleads.v3.errors.FeedMappingErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/feed_mapping_error.proto", fileDescriptor_a10df35593e929d8)
+}
+
+var fileDescriptor_a10df35593e929d8 = []byte{
+	// 568 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0xcd, 0x6e, 0xd3, 0x4c,
+	0x14, 0xfd, 0x9a, 0x7e, 0x6d, 0x61, 0x0a, 0xd4, 0x0c, 0xff, 0x6d, 0x29, 0x28, 0xfc, 0x14, 0x8a,
+	0x64, 0x2f, 0x8c, 0x28, 0x72, 0x57, 0x13, 0x7b, 0x9c, 0x8e, 0xb0, 0x67, 0x2c, 0x7b, 0x12, 0x08,
+	0x8a, 0x34, 0x32, 0xd8, 0x58, 0x91, 0x1a, 0x3b, 0x8a, 0x43, 0x1f, 0x84, 0x47, 0x60, 0xc9, 0xa3,
+	0xf0, 0x28, 0xac, 0xd8, 0xb2, 0x43, 0xe3, 0x49, 0x42, 0x93, 0x26, 0xed, 0x6a, 0xae, 0xe6, 0x9e,
+	0x73, 0xe6, 0xde, 0x63, 0x1f, 0x70, 0x98, 0x15, 0x45, 0x76, 0x92, 0x1a, 0x71, 0x52, 0x1a, 0xaa,
+	0x94, 0xd5, 0xa9, 0x69, 0xa4, 0xc3, 0x61, 0x31, 0x2c, 0x8d, 0x2f, 0x69, 0x9a, 0x88, 0x7e, 0x3c,
+	0x18, 0xf4, 0xf2, 0x4c, 0x54, 0x77, 0xfa, 0x60, 0x58, 0x8c, 0x0a, 0xb8, 0xa7, 0xd0, 0x7a, 0x9c,
+	0x94, 0xfa, 0x94, 0xa8, 0x9f, 0x9a, 0xba, 0x22, 0x6e, 0xef, 0x4e, 0x84, 0x07, 0x3d, 0x23, 0xce,
+	0xf3, 0x62, 0x14, 0x8f, 0x7a, 0x45, 0x5e, 0x2a, 0x76, 0xfd, 0xdb, 0x3a, 0xb8, 0xed, 0xa6, 0x69,
+	0xe2, 0x2b, 0x65, 0x2c, 0x39, 0x38, 0xff, 0xda, 0xaf, 0xff, 0x59, 0x03, 0xda, 0x7c, 0x03, 0x6e,
+	0x81, 0xcd, 0x16, 0x8d, 0x02, 0x6c, 0x13, 0x97, 0x60, 0x47, 0xfb, 0x0f, 0x6e, 0x82, 0x8d, 0x16,
+	0x7d, 0x47, 0xd9, 0x7b, 0xaa, 0xad, 0xc0, 0x87, 0xe0, 0x01, 0xa1, 0x6d, 0xe4, 0x11, 0x47, 0x04,
+	0x1e, 0xb2, 0xf1, 0x31, 0xf3, 0x1c, 0x1c, 0x0a, 0x97, 0x60, 0xcf, 0xd1, 0x6a, 0x70, 0x07, 0xdc,
+	0x9b, 0xb4, 0xed, 0x90, 0x70, 0x1c, 0x12, 0x46, 0xc7, 0xcd, 0x55, 0xb8, 0x0b, 0xee, 0x2f, 0xe2,
+	0xf2, 0x4e, 0x80, 0xb5, 0xff, 0xe1, 0x36, 0xb8, 0x7b, 0x9e, 0x5a, 0xf5, 0xd6, 0xe0, 0x23, 0xb0,
+	0x43, 0x99, 0x40, 0x9c, 0x87, 0xa4, 0xd1, 0xe2, 0x58, 0x29, 0x0a, 0x1f, 0x05, 0x01, 0xa1, 0xcd,
+	0x48, 0xdb, 0x80, 0x8f, 0xc1, 0xae, 0x8b, 0xb1, 0x73, 0x06, 0x22, 0x99, 0xc2, 0x27, 0x91, 0x8f,
+	0xb8, 0x7d, 0xac, 0x5d, 0x81, 0x6f, 0xc1, 0x6b, 0x1b, 0x51, 0xca, 0xb8, 0x60, 0x01, 0x0e, 0x11,
+	0xc7, 0x82, 0xd1, 0xa9, 0x82, 0x70, 0x59, 0x28, 0xa2, 0x4e, 0xc4, 0xb1, 0x2f, 0x9a, 0x98, 0x56,
+	0x7d, 0x47, 0x48, 0x45, 0xed, 0x2a, 0x3c, 0x00, 0xcf, 0xfd, 0x96, 0xc7, 0x49, 0xe0, 0xe1, 0x59,
+	0xc2, 0xb9, 0x25, 0x00, 0x7c, 0x01, 0x9e, 0x2e, 0xc6, 0xce, 0xad, 0xb4, 0x09, 0x5f, 0x81, 0xfd,
+	0xcb, 0x55, 0x95, 0x73, 0xd7, 0xe0, 0x4b, 0xf0, 0xec, 0x32, 0x59, 0x05, 0xbd, 0x0e, 0xf7, 0xc1,
+	0x93, 0x16, 0xc5, 0x1f, 0x02, 0x6c, 0xf3, 0x19, 0x3f, 0xe6, 0x2c, 0xbb, 0x01, 0x75, 0x70, 0xe0,
+	0x31, 0x1b, 0x71, 0x49, 0x3e, 0xfb, 0x26, 0xa3, 0x5e, 0xe7, 0xdf, 0x20, 0x51, 0xe5, 0x42, 0xa4,
+	0x6d, 0xc9, 0x19, 0xc6, 0x06, 0xfa, 0xcc, 0x21, 0x6e, 0x67, 0x76, 0x10, 0xb9, 0xd5, 0xd8, 0x31,
+	0x0d, 0x5a, 0xe0, 0xcd, 0xb2, 0x0f, 0x5d, 0x81, 0x29, 0xa3, 0x4b, 0xdc, 0xbe, 0x09, 0x8f, 0xc0,
+	0xe1, 0x85, 0xdc, 0x85, 0x3c, 0x65, 0x2a, 0x94, 0x33, 0x2e, 0xd9, 0x58, 0xfe, 0x0a, 0x91, 0x3c,
+	0x95, 0x4f, 0xb7, 0x1a, 0xbf, 0x57, 0x40, 0xfd, 0x73, 0xd1, 0xd7, 0x2f, 0x4e, 0x56, 0xe3, 0xce,
+	0x7c, 0x3e, 0x02, 0x19, 0xa9, 0x60, 0xe5, 0xa3, 0x33, 0x26, 0x66, 0xc5, 0x49, 0x9c, 0x67, 0x7a,
+	0x31, 0xcc, 0x8c, 0x2c, 0xcd, 0xab, 0xc0, 0x4d, 0xb2, 0x3d, 0xe8, 0x95, 0xcb, 0xa2, 0x7e, 0xa4,
+	0x8e, 0xef, 0xb5, 0xd5, 0x26, 0x42, 0x3f, 0x6a, 0x7b, 0x4d, 0x25, 0x86, 0x92, 0x52, 0x57, 0xa5,
+	0xac, 0xda, 0xa6, 0x5e, 0x3d, 0x59, 0xfe, 0x9c, 0x00, 0xba, 0x28, 0x29, 0xbb, 0x53, 0x40, 0xb7,
+	0x6d, 0x76, 0x15, 0xe0, 0x57, 0xad, 0xae, 0x6e, 0x2d, 0x0b, 0x25, 0xa5, 0x65, 0x4d, 0x21, 0x96,
+	0xd5, 0x36, 0x2d, 0x4b, 0x81, 0x3e, 0xad, 0x57, 0xd3, 0x99, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff,
+	0xa5, 0xc4, 0xae, 0xc3, 0x87, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/field_error.pb.go b/googleapis/ads/googleads/v3/errors/field_error.pb.go
new file mode 100644
index 0000000..5420aff
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/field_error.pb.go
@@ -0,0 +1,149 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/field_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible field errors.
+type FieldErrorEnum_FieldError int32
+
+const (
+	// Enum unspecified.
+	FieldErrorEnum_UNSPECIFIED FieldErrorEnum_FieldError = 0
+	// The received error code is not known in this version.
+	FieldErrorEnum_UNKNOWN FieldErrorEnum_FieldError = 1
+	// The required field was not present.
+	FieldErrorEnum_REQUIRED FieldErrorEnum_FieldError = 2
+	// The field attempted to be mutated is immutable.
+	FieldErrorEnum_IMMUTABLE_FIELD FieldErrorEnum_FieldError = 3
+	// The field's value is invalid.
+	FieldErrorEnum_INVALID_VALUE FieldErrorEnum_FieldError = 4
+	// The field cannot be set.
+	FieldErrorEnum_VALUE_MUST_BE_UNSET FieldErrorEnum_FieldError = 5
+	// The required repeated field was empty.
+	FieldErrorEnum_REQUIRED_NONEMPTY_LIST FieldErrorEnum_FieldError = 6
+	// The field cannot be cleared.
+	FieldErrorEnum_FIELD_CANNOT_BE_CLEARED FieldErrorEnum_FieldError = 7
+	// The field's value is on a blacklist for this field.
+	FieldErrorEnum_BLACKLISTED_VALUE FieldErrorEnum_FieldError = 8
+)
+
+var FieldErrorEnum_FieldError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "REQUIRED",
+	3: "IMMUTABLE_FIELD",
+	4: "INVALID_VALUE",
+	5: "VALUE_MUST_BE_UNSET",
+	6: "REQUIRED_NONEMPTY_LIST",
+	7: "FIELD_CANNOT_BE_CLEARED",
+	8: "BLACKLISTED_VALUE",
+}
+
+var FieldErrorEnum_FieldError_value = map[string]int32{
+	"UNSPECIFIED":             0,
+	"UNKNOWN":                 1,
+	"REQUIRED":                2,
+	"IMMUTABLE_FIELD":         3,
+	"INVALID_VALUE":           4,
+	"VALUE_MUST_BE_UNSET":     5,
+	"REQUIRED_NONEMPTY_LIST":  6,
+	"FIELD_CANNOT_BE_CLEARED": 7,
+	"BLACKLISTED_VALUE":       8,
+}
+
+func (x FieldErrorEnum_FieldError) String() string {
+	return proto.EnumName(FieldErrorEnum_FieldError_name, int32(x))
+}
+
+func (FieldErrorEnum_FieldError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_94b0ac14134331cc, []int{0, 0}
+}
+
+// Container for enum describing possible field errors.
+type FieldErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FieldErrorEnum) Reset()         { *m = FieldErrorEnum{} }
+func (m *FieldErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FieldErrorEnum) ProtoMessage()    {}
+func (*FieldErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_94b0ac14134331cc, []int{0}
+}
+
+func (m *FieldErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FieldErrorEnum.Unmarshal(m, b)
+}
+func (m *FieldErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FieldErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FieldErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FieldErrorEnum.Merge(m, src)
+}
+func (m *FieldErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FieldErrorEnum.Size(m)
+}
+func (m *FieldErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FieldErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FieldErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FieldErrorEnum_FieldError", FieldErrorEnum_FieldError_name, FieldErrorEnum_FieldError_value)
+	proto.RegisterType((*FieldErrorEnum)(nil), "google.ads.googleads.v3.errors.FieldErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/field_error.proto", fileDescriptor_94b0ac14134331cc)
+}
+
+var fileDescriptor_94b0ac14134331cc = []byte{
+	// 392 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xdf, 0x6e, 0xd3, 0x30,
+	0x14, 0xc6, 0x49, 0x06, 0xdb, 0xe4, 0x01, 0xcd, 0x3c, 0xc1, 0xa4, 0x81, 0x76, 0x91, 0x07, 0x70,
+	0x90, 0x72, 0x67, 0xae, 0x9c, 0xc4, 0x9d, 0xac, 0x26, 0x6e, 0x68, 0xfe, 0x20, 0x50, 0x24, 0x2b,
+	0x90, 0x10, 0x45, 0x6a, 0xe3, 0x2a, 0x2e, 0x7d, 0x20, 0x2e, 0x79, 0x13, 0x78, 0x06, 0x9e, 0xa0,
+	0x4f, 0x81, 0x12, 0x93, 0xf6, 0x8a, 0x5d, 0xf9, 0xf3, 0xd1, 0xef, 0xfb, 0x8e, 0x7d, 0x0e, 0x78,
+	0xd7, 0x48, 0xd9, 0xac, 0x6b, 0xa7, 0xac, 0x94, 0xa3, 0xe5, 0xa0, 0xf6, 0xae, 0x53, 0xf7, 0xbd,
+	0xec, 0x95, 0xf3, 0xad, 0xad, 0xd7, 0x95, 0x18, 0x2f, 0x68, 0xdb, 0xcb, 0x9d, 0x84, 0xf7, 0x1a,
+	0x43, 0x65, 0xa5, 0xd0, 0xd1, 0x81, 0xf6, 0x2e, 0xd2, 0x8e, 0xbb, 0xb7, 0x53, 0xe2, 0xb6, 0x75,
+	0xca, 0xae, 0x93, 0xbb, 0x72, 0xd7, 0xca, 0x4e, 0x69, 0xb7, 0xfd, 0xc7, 0x00, 0x2f, 0xe7, 0x43,
+	0x26, 0x1d, 0x68, 0xda, 0x7d, 0xdf, 0xd8, 0xbf, 0x0c, 0x00, 0x4e, 0x25, 0x38, 0x03, 0x57, 0x19,
+	0x4f, 0x62, 0xea, 0xb3, 0x39, 0xa3, 0x81, 0xf5, 0x04, 0x5e, 0x81, 0x8b, 0x8c, 0x2f, 0xf8, 0xf2,
+	0x23, 0xb7, 0x0c, 0xf8, 0x1c, 0x5c, 0xae, 0xe8, 0x87, 0x8c, 0xad, 0x68, 0x60, 0x99, 0xf0, 0x06,
+	0xcc, 0x58, 0x14, 0x65, 0x29, 0xf1, 0x42, 0x2a, 0xe6, 0x8c, 0x86, 0x81, 0x75, 0x06, 0xaf, 0xc1,
+	0x0b, 0xc6, 0x73, 0x12, 0xb2, 0x40, 0xe4, 0x24, 0xcc, 0xa8, 0xf5, 0x14, 0xde, 0x82, 0x9b, 0x51,
+	0x8a, 0x28, 0x4b, 0x52, 0xe1, 0x51, 0x91, 0xf1, 0x84, 0xa6, 0xd6, 0x33, 0x78, 0x07, 0x5e, 0x4f,
+	0x71, 0x82, 0x2f, 0x39, 0x8d, 0xe2, 0xf4, 0x93, 0x08, 0x59, 0x92, 0x5a, 0xe7, 0xf0, 0x0d, 0xb8,
+	0x1d, 0x23, 0x85, 0x4f, 0x38, 0x5f, 0x8e, 0x36, 0x3f, 0xa4, 0x64, 0xe8, 0x7c, 0x01, 0x5f, 0x81,
+	0x6b, 0x2f, 0x24, 0xfe, 0x62, 0x60, 0xe9, 0xd4, 0xe8, 0xd2, 0x3b, 0x18, 0xc0, 0xfe, 0x2a, 0x37,
+	0xe8, 0xf1, 0x19, 0x79, 0xb3, 0xd3, 0x7f, 0xe3, 0x61, 0x2c, 0xb1, 0xf1, 0x39, 0xf8, 0x67, 0x69,
+	0xe4, 0xba, 0xec, 0x1a, 0x24, 0xfb, 0xc6, 0x69, 0xea, 0x6e, 0x1c, 0xda, 0xb4, 0x98, 0x6d, 0xab,
+	0xfe, 0xb7, 0xa7, 0xf7, 0xfa, 0xf8, 0x61, 0x9e, 0x3d, 0x10, 0xf2, 0xd3, 0xbc, 0x7f, 0xd0, 0x61,
+	0xa4, 0x52, 0x48, 0xcb, 0x41, 0xe5, 0x2e, 0x1a, 0x5b, 0xaa, 0xdf, 0x13, 0x50, 0x90, 0x4a, 0x15,
+	0x47, 0xa0, 0xc8, 0xdd, 0x42, 0x03, 0x07, 0xd3, 0xd6, 0x55, 0x8c, 0x49, 0xa5, 0x30, 0x3e, 0x22,
+	0x18, 0xe7, 0x2e, 0xc6, 0x1a, 0xfa, 0x72, 0x3e, 0xbe, 0xce, 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff,
+	0xd4, 0x06, 0x14, 0x1f, 0x44, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/field_mask_error.pb.go b/googleapis/ads/googleads/v3/errors/field_mask_error.pb.go
new file mode 100644
index 0000000..1ff5d96
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/field_mask_error.pb.go
@@ -0,0 +1,136 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/field_mask_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible field mask errors.
+type FieldMaskErrorEnum_FieldMaskError int32
+
+const (
+	// Enum unspecified.
+	FieldMaskErrorEnum_UNSPECIFIED FieldMaskErrorEnum_FieldMaskError = 0
+	// The received error code is not known in this version.
+	FieldMaskErrorEnum_UNKNOWN FieldMaskErrorEnum_FieldMaskError = 1
+	// The field mask must be provided for update operations.
+	FieldMaskErrorEnum_FIELD_MASK_MISSING FieldMaskErrorEnum_FieldMaskError = 5
+	// The field mask must be empty for create and remove operations.
+	FieldMaskErrorEnum_FIELD_MASK_NOT_ALLOWED FieldMaskErrorEnum_FieldMaskError = 4
+	// The field mask contained an invalid field.
+	FieldMaskErrorEnum_FIELD_NOT_FOUND FieldMaskErrorEnum_FieldMaskError = 2
+	// The field mask updated a field with subfields. Fields with subfields may
+	// be cleared, but not updated. To fix this, the field mask should select
+	// all the subfields of the invalid field.
+	FieldMaskErrorEnum_FIELD_HAS_SUBFIELDS FieldMaskErrorEnum_FieldMaskError = 3
+)
+
+var FieldMaskErrorEnum_FieldMaskError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	5: "FIELD_MASK_MISSING",
+	4: "FIELD_MASK_NOT_ALLOWED",
+	2: "FIELD_NOT_FOUND",
+	3: "FIELD_HAS_SUBFIELDS",
+}
+
+var FieldMaskErrorEnum_FieldMaskError_value = map[string]int32{
+	"UNSPECIFIED":            0,
+	"UNKNOWN":                1,
+	"FIELD_MASK_MISSING":     5,
+	"FIELD_MASK_NOT_ALLOWED": 4,
+	"FIELD_NOT_FOUND":        2,
+	"FIELD_HAS_SUBFIELDS":    3,
+}
+
+func (x FieldMaskErrorEnum_FieldMaskError) String() string {
+	return proto.EnumName(FieldMaskErrorEnum_FieldMaskError_name, int32(x))
+}
+
+func (FieldMaskErrorEnum_FieldMaskError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_dfa5de1d9c38d5db, []int{0, 0}
+}
+
+// Container for enum describing possible field mask errors.
+type FieldMaskErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FieldMaskErrorEnum) Reset()         { *m = FieldMaskErrorEnum{} }
+func (m *FieldMaskErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FieldMaskErrorEnum) ProtoMessage()    {}
+func (*FieldMaskErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dfa5de1d9c38d5db, []int{0}
+}
+
+func (m *FieldMaskErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FieldMaskErrorEnum.Unmarshal(m, b)
+}
+func (m *FieldMaskErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FieldMaskErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FieldMaskErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FieldMaskErrorEnum.Merge(m, src)
+}
+func (m *FieldMaskErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FieldMaskErrorEnum.Size(m)
+}
+func (m *FieldMaskErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FieldMaskErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FieldMaskErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FieldMaskErrorEnum_FieldMaskError", FieldMaskErrorEnum_FieldMaskError_name, FieldMaskErrorEnum_FieldMaskError_value)
+	proto.RegisterType((*FieldMaskErrorEnum)(nil), "google.ads.googleads.v3.errors.FieldMaskErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/field_mask_error.proto", fileDescriptor_dfa5de1d9c38d5db)
+}
+
+var fileDescriptor_dfa5de1d9c38d5db = []byte{
+	// 352 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xdf, 0x4a, 0xc3, 0x30,
+	0x14, 0xc6, 0x6d, 0xe7, 0x1f, 0xc8, 0xc0, 0x95, 0x0c, 0x26, 0x0c, 0xd9, 0x45, 0x1f, 0x20, 0xbd,
+	0x28, 0xde, 0xc4, 0xab, 0xcc, 0xb6, 0xb3, 0x6c, 0x4b, 0x07, 0xb1, 0x1b, 0x48, 0xa1, 0x44, 0x5b,
+	0x4b, 0xd9, 0xd6, 0x8c, 0x66, 0xee, 0x39, 0x7c, 0x06, 0x6f, 0x04, 0x1f, 0xc5, 0x47, 0xf1, 0xc2,
+	0x67, 0x90, 0x36, 0xae, 0xb8, 0x0b, 0xbd, 0xca, 0x97, 0x2f, 0xbf, 0xef, 0xe4, 0x9c, 0x03, 0xae,
+	0x32, 0x21, 0xb2, 0x55, 0x6a, 0xf1, 0x44, 0x5a, 0x4a, 0x56, 0x6a, 0x67, 0x5b, 0x69, 0x59, 0x8a,
+	0x52, 0x5a, 0x4f, 0x79, 0xba, 0x4a, 0xe2, 0x35, 0x97, 0xcb, 0xb8, 0x76, 0xd0, 0xa6, 0x14, 0x5b,
+	0x01, 0x07, 0x8a, 0x45, 0x3c, 0x91, 0xa8, 0x89, 0xa1, 0x9d, 0x8d, 0x54, 0xac, 0x7f, 0xb9, 0x2f,
+	0xbb, 0xc9, 0x2d, 0x5e, 0x14, 0x62, 0xcb, 0xb7, 0xb9, 0x28, 0xa4, 0x4a, 0x9b, 0x6f, 0x1a, 0x80,
+	0x5e, 0x55, 0x78, 0xca, 0xe5, 0xd2, 0xad, 0x12, 0x6e, 0xf1, 0xbc, 0x36, 0x5f, 0x34, 0x70, 0x7e,
+	0x68, 0xc3, 0x0e, 0x68, 0x87, 0x94, 0xcd, 0xdc, 0x1b, 0xdf, 0xf3, 0x5d, 0xc7, 0x38, 0x82, 0x6d,
+	0x70, 0x16, 0xd2, 0x31, 0x0d, 0x16, 0xd4, 0xd0, 0x60, 0x0f, 0x40, 0xcf, 0x77, 0x27, 0x4e, 0x3c,
+	0x25, 0x6c, 0x1c, 0x4f, 0x7d, 0xc6, 0x7c, 0x3a, 0x32, 0x4e, 0x60, 0x1f, 0xf4, 0x7e, 0xf9, 0x34,
+	0xb8, 0x8b, 0xc9, 0x64, 0x12, 0x2c, 0x5c, 0xc7, 0x38, 0x86, 0x5d, 0xd0, 0x51, 0x6f, 0x95, 0xed,
+	0x05, 0x21, 0x75, 0x0c, 0x1d, 0x5e, 0x80, 0xae, 0x32, 0x6f, 0x09, 0x8b, 0x59, 0x38, 0xac, 0x2f,
+	0xcc, 0x68, 0x0d, 0xbf, 0x34, 0x60, 0x3e, 0x8a, 0x35, 0xfa, 0x7f, 0xdc, 0x61, 0xf7, 0xb0, 0xed,
+	0x59, 0x35, 0xe5, 0x4c, 0xbb, 0x77, 0x7e, 0x62, 0x99, 0x58, 0xf1, 0x22, 0x43, 0xa2, 0xcc, 0xac,
+	0x2c, 0x2d, 0xea, 0x1d, 0xec, 0x97, 0xbd, 0xc9, 0xe5, 0x5f, 0xbb, 0xbf, 0x56, 0xc7, 0xab, 0xde,
+	0x1a, 0x11, 0xf2, 0xae, 0x0f, 0x46, 0xaa, 0x18, 0x49, 0x24, 0x52, 0xb2, 0x52, 0x73, 0x1b, 0xd5,
+	0x5f, 0xca, 0x8f, 0x3d, 0x10, 0x91, 0x44, 0x46, 0x0d, 0x10, 0xcd, 0xed, 0x48, 0x01, 0x9f, 0xba,
+	0xa9, 0x5c, 0x8c, 0x49, 0x22, 0x31, 0x6e, 0x10, 0x8c, 0xe7, 0x36, 0xc6, 0x0a, 0x7a, 0x38, 0xad,
+	0xbb, 0xb3, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xe3, 0x09, 0xaf, 0x5a, 0x18, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/function_error.pb.go b/googleapis/ads/googleads/v3/errors/function_error.pb.go
new file mode 100644
index 0000000..4083fff
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/function_error.pb.go
@@ -0,0 +1,195 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/function_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible function errors.
+type FunctionErrorEnum_FunctionError int32
+
+const (
+	// Enum unspecified.
+	FunctionErrorEnum_UNSPECIFIED FunctionErrorEnum_FunctionError = 0
+	// The received error code is not known in this version.
+	FunctionErrorEnum_UNKNOWN FunctionErrorEnum_FunctionError = 1
+	// The format of the function is not recognized as a supported function
+	// format.
+	FunctionErrorEnum_INVALID_FUNCTION_FORMAT FunctionErrorEnum_FunctionError = 2
+	// Operand data types do not match.
+	FunctionErrorEnum_DATA_TYPE_MISMATCH FunctionErrorEnum_FunctionError = 3
+	// The operands cannot be used together in a conjunction.
+	FunctionErrorEnum_INVALID_CONJUNCTION_OPERANDS FunctionErrorEnum_FunctionError = 4
+	// Invalid numer of Operands.
+	FunctionErrorEnum_INVALID_NUMBER_OF_OPERANDS FunctionErrorEnum_FunctionError = 5
+	// Operand Type not supported.
+	FunctionErrorEnum_INVALID_OPERAND_TYPE FunctionErrorEnum_FunctionError = 6
+	// Operator not supported.
+	FunctionErrorEnum_INVALID_OPERATOR FunctionErrorEnum_FunctionError = 7
+	// Request context type not supported.
+	FunctionErrorEnum_INVALID_REQUEST_CONTEXT_TYPE FunctionErrorEnum_FunctionError = 8
+	// The matching function is not allowed for call placeholders
+	FunctionErrorEnum_INVALID_FUNCTION_FOR_CALL_PLACEHOLDER FunctionErrorEnum_FunctionError = 9
+	// The matching function is not allowed for the specified placeholder
+	FunctionErrorEnum_INVALID_FUNCTION_FOR_PLACEHOLDER FunctionErrorEnum_FunctionError = 10
+	// Invalid operand.
+	FunctionErrorEnum_INVALID_OPERAND FunctionErrorEnum_FunctionError = 11
+	// Missing value for the constant operand.
+	FunctionErrorEnum_MISSING_CONSTANT_OPERAND_VALUE FunctionErrorEnum_FunctionError = 12
+	// The value of the constant operand is invalid.
+	FunctionErrorEnum_INVALID_CONSTANT_OPERAND_VALUE FunctionErrorEnum_FunctionError = 13
+	// Invalid function nesting.
+	FunctionErrorEnum_INVALID_NESTING FunctionErrorEnum_FunctionError = 14
+	// The Feed ID was different from another Feed ID in the same function.
+	FunctionErrorEnum_MULTIPLE_FEED_IDS_NOT_SUPPORTED FunctionErrorEnum_FunctionError = 15
+	// The matching function is invalid for use with a feed with a fixed schema.
+	FunctionErrorEnum_INVALID_FUNCTION_FOR_FEED_WITH_FIXED_SCHEMA FunctionErrorEnum_FunctionError = 16
+	// Invalid attribute name.
+	FunctionErrorEnum_INVALID_ATTRIBUTE_NAME FunctionErrorEnum_FunctionError = 17
+)
+
+var FunctionErrorEnum_FunctionError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "INVALID_FUNCTION_FORMAT",
+	3:  "DATA_TYPE_MISMATCH",
+	4:  "INVALID_CONJUNCTION_OPERANDS",
+	5:  "INVALID_NUMBER_OF_OPERANDS",
+	6:  "INVALID_OPERAND_TYPE",
+	7:  "INVALID_OPERATOR",
+	8:  "INVALID_REQUEST_CONTEXT_TYPE",
+	9:  "INVALID_FUNCTION_FOR_CALL_PLACEHOLDER",
+	10: "INVALID_FUNCTION_FOR_PLACEHOLDER",
+	11: "INVALID_OPERAND",
+	12: "MISSING_CONSTANT_OPERAND_VALUE",
+	13: "INVALID_CONSTANT_OPERAND_VALUE",
+	14: "INVALID_NESTING",
+	15: "MULTIPLE_FEED_IDS_NOT_SUPPORTED",
+	16: "INVALID_FUNCTION_FOR_FEED_WITH_FIXED_SCHEMA",
+	17: "INVALID_ATTRIBUTE_NAME",
+}
+
+var FunctionErrorEnum_FunctionError_value = map[string]int32{
+	"UNSPECIFIED":                                 0,
+	"UNKNOWN":                                     1,
+	"INVALID_FUNCTION_FORMAT":                     2,
+	"DATA_TYPE_MISMATCH":                          3,
+	"INVALID_CONJUNCTION_OPERANDS":                4,
+	"INVALID_NUMBER_OF_OPERANDS":                  5,
+	"INVALID_OPERAND_TYPE":                        6,
+	"INVALID_OPERATOR":                            7,
+	"INVALID_REQUEST_CONTEXT_TYPE":                8,
+	"INVALID_FUNCTION_FOR_CALL_PLACEHOLDER":       9,
+	"INVALID_FUNCTION_FOR_PLACEHOLDER":            10,
+	"INVALID_OPERAND":                             11,
+	"MISSING_CONSTANT_OPERAND_VALUE":              12,
+	"INVALID_CONSTANT_OPERAND_VALUE":              13,
+	"INVALID_NESTING":                             14,
+	"MULTIPLE_FEED_IDS_NOT_SUPPORTED":             15,
+	"INVALID_FUNCTION_FOR_FEED_WITH_FIXED_SCHEMA": 16,
+	"INVALID_ATTRIBUTE_NAME":                      17,
+}
+
+func (x FunctionErrorEnum_FunctionError) String() string {
+	return proto.EnumName(FunctionErrorEnum_FunctionError_name, int32(x))
+}
+
+func (FunctionErrorEnum_FunctionError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6dede647b246289c, []int{0, 0}
+}
+
+// Container for enum describing possible function errors.
+type FunctionErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FunctionErrorEnum) Reset()         { *m = FunctionErrorEnum{} }
+func (m *FunctionErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FunctionErrorEnum) ProtoMessage()    {}
+func (*FunctionErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6dede647b246289c, []int{0}
+}
+
+func (m *FunctionErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FunctionErrorEnum.Unmarshal(m, b)
+}
+func (m *FunctionErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FunctionErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FunctionErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FunctionErrorEnum.Merge(m, src)
+}
+func (m *FunctionErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FunctionErrorEnum.Size(m)
+}
+func (m *FunctionErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FunctionErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FunctionErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FunctionErrorEnum_FunctionError", FunctionErrorEnum_FunctionError_name, FunctionErrorEnum_FunctionError_value)
+	proto.RegisterType((*FunctionErrorEnum)(nil), "google.ads.googleads.v3.errors.FunctionErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/function_error.proto", fileDescriptor_6dede647b246289c)
+}
+
+var fileDescriptor_6dede647b246289c = []byte{
+	// 539 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0xc1, 0x6e, 0xd3, 0x40,
+	0x10, 0x86, 0x49, 0x1a, 0x5a, 0xd8, 0x50, 0xb2, 0x5d, 0xaa, 0x82, 0x42, 0x15, 0xaa, 0x00, 0x07,
+	0x84, 0x64, 0x1f, 0x7c, 0x33, 0xa7, 0x8d, 0x3d, 0x4e, 0x16, 0xec, 0xb5, 0xb1, 0xd7, 0x69, 0x41,
+	0x91, 0x56, 0xa1, 0x09, 0x56, 0xa4, 0xd6, 0x8e, 0xe2, 0xb4, 0x0f, 0xc4, 0x11, 0x9e, 0x82, 0x2b,
+	0x8f, 0x82, 0xc4, 0x3b, 0x20, 0x7b, 0xe3, 0x90, 0xa0, 0xc0, 0xc9, 0xe3, 0x99, 0xef, 0x9f, 0x7f,
+	0x76, 0x35, 0x8b, 0x8c, 0x24, 0xcb, 0x92, 0xab, 0xa9, 0x3e, 0x9e, 0xe4, 0xba, 0x0a, 0x8b, 0xe8,
+	0xd6, 0xd0, 0xa7, 0x8b, 0x45, 0xb6, 0xc8, 0xf5, 0xcf, 0x37, 0xe9, 0xe5, 0x72, 0x96, 0xa5, 0xb2,
+	0xfc, 0xd7, 0xe6, 0x8b, 0x6c, 0x99, 0x91, 0x8e, 0x22, 0xb5, 0xf1, 0x24, 0xd7, 0xd6, 0x22, 0xed,
+	0xd6, 0xd0, 0x94, 0xa8, 0x7d, 0x5a, 0x35, 0x9d, 0xcf, 0xf4, 0x71, 0x9a, 0x66, 0xcb, 0x71, 0xd1,
+	0x22, 0x57, 0xea, 0xee, 0xf7, 0x06, 0x3a, 0x72, 0x56, 0x6d, 0xa1, 0x10, 0x40, 0x7a, 0x73, 0xdd,
+	0xfd, 0xd6, 0x40, 0x87, 0x5b, 0x59, 0xd2, 0x42, 0xcd, 0x98, 0x47, 0x01, 0x58, 0xcc, 0x61, 0x60,
+	0xe3, 0x3b, 0xa4, 0x89, 0x0e, 0x62, 0xfe, 0x8e, 0xfb, 0xe7, 0x1c, 0xd7, 0xc8, 0x53, 0xf4, 0x98,
+	0xf1, 0x21, 0x75, 0x99, 0x2d, 0x9d, 0x98, 0x5b, 0x82, 0xf9, 0x5c, 0x3a, 0x7e, 0xe8, 0x51, 0x81,
+	0xeb, 0xe4, 0x04, 0x11, 0x9b, 0x0a, 0x2a, 0xc5, 0x87, 0x00, 0xa4, 0xc7, 0x22, 0x8f, 0x0a, 0x6b,
+	0x80, 0xf7, 0xc8, 0x19, 0x3a, 0xad, 0x44, 0x96, 0xcf, 0xdf, 0x56, 0x3a, 0x3f, 0x80, 0x90, 0x72,
+	0x3b, 0xc2, 0x0d, 0xd2, 0x41, 0xed, 0x8a, 0xe0, 0xb1, 0xd7, 0x83, 0x50, 0xfa, 0xce, 0x9f, 0xfa,
+	0x5d, 0xf2, 0x04, 0x1d, 0x57, 0xf5, 0x55, 0xb6, 0x34, 0xc1, 0xfb, 0xe4, 0x18, 0xe1, 0xad, 0x8a,
+	0xf0, 0x43, 0x7c, 0xb0, 0xe9, 0x18, 0xc2, 0xfb, 0x18, 0x22, 0x51, 0x38, 0x0b, 0xb8, 0x10, 0x4a,
+	0x77, 0x8f, 0xbc, 0x42, 0x2f, 0x77, 0x1d, 0x44, 0x5a, 0xd4, 0x75, 0x65, 0xe0, 0x52, 0x0b, 0x06,
+	0xbe, 0x6b, 0x43, 0x88, 0xef, 0x93, 0x17, 0xe8, 0x6c, 0x27, 0xba, 0x49, 0x21, 0xf2, 0x08, 0xb5,
+	0xfe, 0x1a, 0x11, 0x37, 0x49, 0x17, 0x75, 0x3c, 0x16, 0x45, 0x8c, 0xf7, 0x0b, 0xff, 0x48, 0x50,
+	0x2e, 0xd6, 0x07, 0x18, 0x52, 0x37, 0x06, 0xfc, 0xa0, 0x60, 0x36, 0x6e, 0x67, 0x17, 0x73, 0xb8,
+	0xd9, 0x9c, 0x43, 0x24, 0x18, 0xef, 0xe3, 0x87, 0xe4, 0x39, 0x7a, 0xe6, 0xc5, 0xae, 0x60, 0x81,
+	0x0b, 0xd2, 0x01, 0xb0, 0x25, 0xb3, 0x23, 0xc9, 0x7d, 0x21, 0xa3, 0x38, 0x08, 0xfc, 0x50, 0x80,
+	0x8d, 0x5b, 0x44, 0x47, 0xaf, 0x77, 0x0e, 0x5f, 0x0a, 0xce, 0x99, 0x18, 0x48, 0x87, 0x5d, 0x80,
+	0x2d, 0x23, 0x6b, 0x00, 0x1e, 0xc5, 0x98, 0xb4, 0xd1, 0x49, 0x25, 0xa0, 0x42, 0x84, 0xac, 0x17,
+	0x0b, 0x90, 0x9c, 0x7a, 0x80, 0x8f, 0x7a, 0xbf, 0x6a, 0xa8, 0x7b, 0x99, 0x5d, 0x6b, 0xff, 0x5f,
+	0xc4, 0x1e, 0xd9, 0xda, 0xa8, 0xa0, 0x58, 0xbf, 0xa0, 0xf6, 0xd1, 0x5e, 0xa9, 0x92, 0xec, 0x6a,
+	0x9c, 0x26, 0x5a, 0xb6, 0x48, 0xf4, 0x64, 0x9a, 0x96, 0xcb, 0x59, 0xbd, 0x81, 0xf9, 0x2c, 0xff,
+	0xd7, 0x93, 0x78, 0xa3, 0x3e, 0x5f, 0xea, 0x7b, 0x7d, 0x4a, 0xbf, 0xd6, 0x3b, 0x7d, 0xd5, 0x8c,
+	0x4e, 0x72, 0x4d, 0x85, 0x45, 0x34, 0x34, 0xb4, 0xd2, 0x32, 0xff, 0x51, 0x01, 0x23, 0x3a, 0xc9,
+	0x47, 0x6b, 0x60, 0x34, 0x34, 0x46, 0x0a, 0xf8, 0x59, 0xef, 0xaa, 0xac, 0x69, 0xd2, 0x49, 0x6e,
+	0x9a, 0x6b, 0xc4, 0x34, 0x87, 0x86, 0x69, 0x2a, 0xe8, 0xd3, 0x7e, 0x39, 0x9d, 0xf1, 0x3b, 0x00,
+	0x00, 0xff, 0xff, 0x9e, 0x8b, 0xb5, 0x38, 0xaf, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/function_parsing_error.pb.go b/googleapis/ads/googleads/v3/errors/function_parsing_error.pb.go
new file mode 100644
index 0000000..deabb92
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/function_parsing_error.pb.go
@@ -0,0 +1,171 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/function_parsing_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible function parsing errors.
+type FunctionParsingErrorEnum_FunctionParsingError int32
+
+const (
+	// Enum unspecified.
+	FunctionParsingErrorEnum_UNSPECIFIED FunctionParsingErrorEnum_FunctionParsingError = 0
+	// The received error code is not known in this version.
+	FunctionParsingErrorEnum_UNKNOWN FunctionParsingErrorEnum_FunctionParsingError = 1
+	// Unexpected end of function string.
+	FunctionParsingErrorEnum_NO_MORE_INPUT FunctionParsingErrorEnum_FunctionParsingError = 2
+	// Could not find an expected character.
+	FunctionParsingErrorEnum_EXPECTED_CHARACTER FunctionParsingErrorEnum_FunctionParsingError = 3
+	// Unexpected separator character.
+	FunctionParsingErrorEnum_UNEXPECTED_SEPARATOR FunctionParsingErrorEnum_FunctionParsingError = 4
+	// Unmatched left bracket or parenthesis.
+	FunctionParsingErrorEnum_UNMATCHED_LEFT_BRACKET FunctionParsingErrorEnum_FunctionParsingError = 5
+	// Unmatched right bracket or parenthesis.
+	FunctionParsingErrorEnum_UNMATCHED_RIGHT_BRACKET FunctionParsingErrorEnum_FunctionParsingError = 6
+	// Functions are nested too deeply.
+	FunctionParsingErrorEnum_TOO_MANY_NESTED_FUNCTIONS FunctionParsingErrorEnum_FunctionParsingError = 7
+	// Missing right-hand-side operand.
+	FunctionParsingErrorEnum_MISSING_RIGHT_HAND_OPERAND FunctionParsingErrorEnum_FunctionParsingError = 8
+	// Invalid operator/function name.
+	FunctionParsingErrorEnum_INVALID_OPERATOR_NAME FunctionParsingErrorEnum_FunctionParsingError = 9
+	// Feed attribute operand's argument is not an integer.
+	FunctionParsingErrorEnum_FEED_ATTRIBUTE_OPERAND_ARGUMENT_NOT_INTEGER FunctionParsingErrorEnum_FunctionParsingError = 10
+	// Missing function operands.
+	FunctionParsingErrorEnum_NO_OPERANDS FunctionParsingErrorEnum_FunctionParsingError = 11
+	// Function had too many operands.
+	FunctionParsingErrorEnum_TOO_MANY_OPERANDS FunctionParsingErrorEnum_FunctionParsingError = 12
+)
+
+var FunctionParsingErrorEnum_FunctionParsingError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "NO_MORE_INPUT",
+	3:  "EXPECTED_CHARACTER",
+	4:  "UNEXPECTED_SEPARATOR",
+	5:  "UNMATCHED_LEFT_BRACKET",
+	6:  "UNMATCHED_RIGHT_BRACKET",
+	7:  "TOO_MANY_NESTED_FUNCTIONS",
+	8:  "MISSING_RIGHT_HAND_OPERAND",
+	9:  "INVALID_OPERATOR_NAME",
+	10: "FEED_ATTRIBUTE_OPERAND_ARGUMENT_NOT_INTEGER",
+	11: "NO_OPERANDS",
+	12: "TOO_MANY_OPERANDS",
+}
+
+var FunctionParsingErrorEnum_FunctionParsingError_value = map[string]int32{
+	"UNSPECIFIED":                                 0,
+	"UNKNOWN":                                     1,
+	"NO_MORE_INPUT":                               2,
+	"EXPECTED_CHARACTER":                          3,
+	"UNEXPECTED_SEPARATOR":                        4,
+	"UNMATCHED_LEFT_BRACKET":                      5,
+	"UNMATCHED_RIGHT_BRACKET":                     6,
+	"TOO_MANY_NESTED_FUNCTIONS":                   7,
+	"MISSING_RIGHT_HAND_OPERAND":                  8,
+	"INVALID_OPERATOR_NAME":                       9,
+	"FEED_ATTRIBUTE_OPERAND_ARGUMENT_NOT_INTEGER": 10,
+	"NO_OPERANDS":                                 11,
+	"TOO_MANY_OPERANDS":                           12,
+}
+
+func (x FunctionParsingErrorEnum_FunctionParsingError) String() string {
+	return proto.EnumName(FunctionParsingErrorEnum_FunctionParsingError_name, int32(x))
+}
+
+func (FunctionParsingErrorEnum_FunctionParsingError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_48110c2fcce1f98f, []int{0, 0}
+}
+
+// Container for enum describing possible function parsing errors.
+type FunctionParsingErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FunctionParsingErrorEnum) Reset()         { *m = FunctionParsingErrorEnum{} }
+func (m *FunctionParsingErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*FunctionParsingErrorEnum) ProtoMessage()    {}
+func (*FunctionParsingErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_48110c2fcce1f98f, []int{0}
+}
+
+func (m *FunctionParsingErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FunctionParsingErrorEnum.Unmarshal(m, b)
+}
+func (m *FunctionParsingErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FunctionParsingErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *FunctionParsingErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FunctionParsingErrorEnum.Merge(m, src)
+}
+func (m *FunctionParsingErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_FunctionParsingErrorEnum.Size(m)
+}
+func (m *FunctionParsingErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_FunctionParsingErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FunctionParsingErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.FunctionParsingErrorEnum_FunctionParsingError", FunctionParsingErrorEnum_FunctionParsingError_name, FunctionParsingErrorEnum_FunctionParsingError_value)
+	proto.RegisterType((*FunctionParsingErrorEnum)(nil), "google.ads.googleads.v3.errors.FunctionParsingErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/function_parsing_error.proto", fileDescriptor_48110c2fcce1f98f)
+}
+
+var fileDescriptor_48110c2fcce1f98f = []byte{
+	// 487 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x4f, 0x6f, 0xd3, 0x30,
+	0x18, 0xc6, 0x69, 0x0b, 0x1b, 0xb8, 0x20, 0x3c, 0x6b, 0x1b, 0x6b, 0x81, 0x1e, 0x7a, 0x45, 0x4a,
+	0x0e, 0xb9, 0x65, 0x27, 0x37, 0x79, 0x9b, 0x5a, 0x5b, 0xec, 0xc8, 0x71, 0xca, 0x1f, 0x55, 0xb2,
+	0xc2, 0x5a, 0xa2, 0x4a, 0x5b, 0x52, 0x25, 0xdd, 0x3e, 0x00, 0x1f, 0x85, 0x23, 0x1f, 0x85, 0xef,
+	0xc1, 0x85, 0x33, 0x1f, 0x00, 0xa5, 0x6e, 0xb2, 0xcb, 0xd8, 0x29, 0xaf, 0xde, 0xe7, 0xf9, 0x3d,
+	0xb1, 0xfc, 0x18, 0x9d, 0x67, 0x45, 0x91, 0x5d, 0xaf, 0xec, 0x74, 0x59, 0xd9, 0x66, 0xac, 0xa7,
+	0x3b, 0xc7, 0x5e, 0x95, 0x65, 0x51, 0x56, 0xf6, 0xb7, 0xdb, 0xfc, 0x6a, 0xbb, 0x2e, 0x72, 0xbd,
+	0x49, 0xcb, 0x6a, 0x9d, 0x67, 0x7a, 0xb7, 0xb7, 0x36, 0x65, 0xb1, 0x2d, 0xc8, 0xc8, 0x10, 0x56,
+	0xba, 0xac, 0xac, 0x16, 0xb6, 0xee, 0x1c, 0xcb, 0xc0, 0xc3, 0x77, 0x4d, 0xf8, 0x66, 0x6d, 0xa7,
+	0x79, 0x5e, 0x6c, 0xd3, 0x3a, 0xaa, 0x32, 0xf4, 0xf8, 0x7b, 0x0f, 0x9d, 0x4d, 0xf7, 0xf1, 0x91,
+	0x49, 0x87, 0x9a, 0x83, 0xfc, 0xf6, 0x66, 0xfc, 0xbb, 0x8b, 0x8e, 0x1f, 0x12, 0xc9, 0x6b, 0xd4,
+	0x4f, 0x78, 0x1c, 0x81, 0xc7, 0xa6, 0x0c, 0x7c, 0xfc, 0x84, 0xf4, 0xd1, 0x61, 0xc2, 0x2f, 0xb8,
+	0xf8, 0xc8, 0x71, 0x87, 0x1c, 0xa1, 0x57, 0x5c, 0xe8, 0x50, 0x48, 0xd0, 0x8c, 0x47, 0x89, 0xc2,
+	0x5d, 0x72, 0x8a, 0x08, 0x7c, 0x8a, 0xc0, 0x53, 0xe0, 0x6b, 0x6f, 0x46, 0x25, 0xf5, 0x14, 0x48,
+	0xdc, 0x23, 0x67, 0xe8, 0x38, 0xe1, 0xad, 0x12, 0x43, 0x44, 0x25, 0x55, 0x42, 0xe2, 0xa7, 0x64,
+	0x88, 0x4e, 0x13, 0x1e, 0x52, 0xe5, 0xcd, 0xc0, 0xd7, 0x97, 0x30, 0x55, 0x7a, 0x22, 0xa9, 0x77,
+	0x01, 0x0a, 0x3f, 0x23, 0x6f, 0xd1, 0x9b, 0x7b, 0x4d, 0xb2, 0x60, 0x76, 0x2f, 0x1e, 0x90, 0xf7,
+	0x68, 0xa0, 0x84, 0xd0, 0x21, 0xe5, 0x9f, 0x35, 0x87, 0xb8, 0xce, 0x9d, 0x26, 0xdc, 0x53, 0x4c,
+	0xf0, 0x18, 0x1f, 0x92, 0x11, 0x1a, 0x86, 0x2c, 0x8e, 0x19, 0x0f, 0xf6, 0xe4, 0x8c, 0x72, 0x5f,
+	0x8b, 0x08, 0x24, 0xe5, 0x3e, 0x7e, 0x4e, 0x06, 0xe8, 0x84, 0xf1, 0x39, 0xbd, 0x64, 0xfb, 0xa5,
+	0x12, 0x52, 0x73, 0x1a, 0x02, 0x7e, 0x41, 0x6c, 0xf4, 0x61, 0x0a, 0xe0, 0x6b, 0xaa, 0x94, 0x64,
+	0x93, 0x44, 0x41, 0x83, 0x69, 0x2a, 0x83, 0x24, 0x04, 0xae, 0x34, 0x17, 0x4a, 0x33, 0xae, 0x20,
+	0x00, 0x89, 0x51, 0x7d, 0x4d, 0x5c, 0x34, 0xa6, 0x18, 0xf7, 0xc9, 0x09, 0x3a, 0x6a, 0xcf, 0xd6,
+	0xae, 0x5f, 0x4e, 0xfe, 0x76, 0xd0, 0xf8, 0xaa, 0xb8, 0xb1, 0x1e, 0x6f, 0x72, 0x32, 0x78, 0xa8,
+	0x8b, 0xa8, 0xae, 0x31, 0xea, 0x7c, 0xf1, 0xf7, 0x70, 0x56, 0x5c, 0xa7, 0x79, 0x66, 0x15, 0x65,
+	0x66, 0x67, 0xab, 0x7c, 0x57, 0x72, 0xf3, 0xa6, 0x36, 0xeb, 0xea, 0x7f, 0x4f, 0xec, 0xdc, 0x7c,
+	0x7e, 0x74, 0x7b, 0x01, 0xa5, 0x3f, 0xbb, 0xa3, 0xc0, 0x84, 0xd1, 0x65, 0x65, 0x99, 0xb1, 0x9e,
+	0xe6, 0x8e, 0xb5, 0xfb, 0x65, 0xf5, 0xab, 0x31, 0x2c, 0xe8, 0xb2, 0x5a, 0xb4, 0x86, 0xc5, 0xdc,
+	0x59, 0x18, 0xc3, 0x9f, 0xee, 0xd8, 0x6c, 0x5d, 0x97, 0x2e, 0x2b, 0xd7, 0x6d, 0x2d, 0xae, 0x3b,
+	0x77, 0x5c, 0xd7, 0x98, 0xbe, 0x1e, 0xec, 0x4e, 0xe7, 0xfc, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xc3,
+	0x2b, 0xe9, 0x1a, 0xff, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/geo_target_constant_suggestion_error.pb.go b/googleapis/ads/googleads/v3/errors/geo_target_constant_suggestion_error.pb.go
new file mode 100644
index 0000000..1c5f857
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/geo_target_constant_suggestion_error.pb.go
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/geo_target_constant_suggestion_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible geo target constant suggestion errors.
+type GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError int32
+
+const (
+	// Enum unspecified.
+	GeoTargetConstantSuggestionErrorEnum_UNSPECIFIED GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 0
+	// The received error code is not known in this version.
+	GeoTargetConstantSuggestionErrorEnum_UNKNOWN GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 1
+	// A location name cannot be greater than 300 characters.
+	GeoTargetConstantSuggestionErrorEnum_LOCATION_NAME_SIZE_LIMIT GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 2
+	// At most 25 location names can be specified in a SuggestGeoTargetConstants
+	// method.
+	GeoTargetConstantSuggestionErrorEnum_LOCATION_NAME_LIMIT GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 3
+	// The country code is invalid.
+	GeoTargetConstantSuggestionErrorEnum_INVALID_COUNTRY_CODE GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 4
+	// Geo target constant resource names or location names must be provided in
+	// the request.
+	GeoTargetConstantSuggestionErrorEnum_REQUEST_PARAMETERS_UNSET GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 5
+)
+
+var GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "LOCATION_NAME_SIZE_LIMIT",
+	3: "LOCATION_NAME_LIMIT",
+	4: "INVALID_COUNTRY_CODE",
+	5: "REQUEST_PARAMETERS_UNSET",
+}
+
+var GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"LOCATION_NAME_SIZE_LIMIT": 2,
+	"LOCATION_NAME_LIMIT":      3,
+	"INVALID_COUNTRY_CODE":     4,
+	"REQUEST_PARAMETERS_UNSET": 5,
+}
+
+func (x GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError) String() string {
+	return proto.EnumName(GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_name, int32(x))
+}
+
+func (GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_15abcc5da870aafb, []int{0, 0}
+}
+
+// Container for enum describing possible geo target constant suggestion errors.
+type GeoTargetConstantSuggestionErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GeoTargetConstantSuggestionErrorEnum) Reset()         { *m = GeoTargetConstantSuggestionErrorEnum{} }
+func (m *GeoTargetConstantSuggestionErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*GeoTargetConstantSuggestionErrorEnum) ProtoMessage()    {}
+func (*GeoTargetConstantSuggestionErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_15abcc5da870aafb, []int{0}
+}
+
+func (m *GeoTargetConstantSuggestionErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GeoTargetConstantSuggestionErrorEnum.Unmarshal(m, b)
+}
+func (m *GeoTargetConstantSuggestionErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GeoTargetConstantSuggestionErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *GeoTargetConstantSuggestionErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GeoTargetConstantSuggestionErrorEnum.Merge(m, src)
+}
+func (m *GeoTargetConstantSuggestionErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_GeoTargetConstantSuggestionErrorEnum.Size(m)
+}
+func (m *GeoTargetConstantSuggestionErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_GeoTargetConstantSuggestionErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GeoTargetConstantSuggestionErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError", GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_name, GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_value)
+	proto.RegisterType((*GeoTargetConstantSuggestionErrorEnum)(nil), "google.ads.googleads.v3.errors.GeoTargetConstantSuggestionErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/geo_target_constant_suggestion_error.proto", fileDescriptor_15abcc5da870aafb)
+}
+
+var fileDescriptor_15abcc5da870aafb = []byte{
+	// 386 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xcf, 0xaa, 0xd4, 0x30,
+	0x14, 0xc6, 0x6d, 0xaf, 0x7f, 0x20, 0x77, 0x61, 0xa9, 0x82, 0x17, 0xb9, 0x0c, 0x52, 0x74, 0x9b,
+	0x2e, 0xba, 0x8b, 0xab, 0x4c, 0x1b, 0x87, 0xe0, 0x4c, 0x5a, 0xfb, 0x4f, 0x1c, 0x0a, 0xa1, 0x4e,
+	0x4b, 0x18, 0x98, 0x49, 0x86, 0xa6, 0x33, 0x6b, 0x9f, 0xc5, 0xa5, 0x1b, 0xdf, 0xc3, 0x27, 0xf0,
+	0x19, 0x7c, 0x0a, 0x69, 0x33, 0x53, 0x70, 0xe1, 0x9d, 0x55, 0x3e, 0x72, 0xbe, 0xf3, 0xfb, 0x92,
+	0x73, 0x00, 0x15, 0x4a, 0x89, 0x5d, 0xeb, 0xd7, 0x8d, 0xf6, 0x8d, 0x1c, 0xd4, 0x29, 0xf0, 0xdb,
+	0xae, 0x53, 0x9d, 0xf6, 0x45, 0xab, 0x78, 0x5f, 0x77, 0xa2, 0xed, 0xf9, 0x46, 0x49, 0xdd, 0xd7,
+	0xb2, 0xe7, 0xfa, 0x28, 0x44, 0xab, 0xfb, 0xad, 0x92, 0x7c, 0x74, 0xc1, 0x43, 0xa7, 0x7a, 0xe5,
+	0xce, 0x4c, 0x3f, 0xac, 0x1b, 0x0d, 0x27, 0x14, 0x3c, 0x05, 0xd0, 0xa0, 0x5e, 0xdf, 0x5f, 0xa2,
+	0x0e, 0x5b, 0xbf, 0x96, 0x52, 0xf5, 0xf5, 0x80, 0xd0, 0xa6, 0xdb, 0xfb, 0x6d, 0x81, 0xb7, 0x8b,
+	0x56, 0xe5, 0x63, 0x56, 0x78, 0x8e, 0xca, 0xa6, 0x24, 0x32, 0x30, 0x88, 0x3c, 0xee, 0xbd, 0x9f,
+	0x16, 0x78, 0x73, 0xcd, 0xe8, 0x3e, 0x07, 0xb7, 0x05, 0xcb, 0x12, 0x12, 0xd2, 0x0f, 0x94, 0x44,
+	0xce, 0x23, 0xf7, 0x16, 0x3c, 0x2b, 0xd8, 0x47, 0x16, 0x7f, 0x66, 0x8e, 0xe5, 0xde, 0x83, 0xbb,
+	0x65, 0x1c, 0xe2, 0x9c, 0xc6, 0x8c, 0x33, 0xbc, 0x22, 0x3c, 0xa3, 0x6b, 0xc2, 0x97, 0x74, 0x45,
+	0x73, 0xc7, 0x76, 0x5f, 0x81, 0x17, 0xff, 0x56, 0x4d, 0xe1, 0xc6, 0xbd, 0x03, 0x2f, 0x29, 0x2b,
+	0xf1, 0x92, 0x46, 0x3c, 0x8c, 0x0b, 0x96, 0xa7, 0x5f, 0x78, 0x18, 0x47, 0xc4, 0x79, 0x3c, 0x00,
+	0x53, 0xf2, 0xa9, 0x20, 0x59, 0xce, 0x13, 0x9c, 0xe2, 0x15, 0xc9, 0x49, 0x9a, 0xf1, 0x82, 0x65,
+	0x24, 0x77, 0x9e, 0xcc, 0xbf, 0xd9, 0xc0, 0xdb, 0xa8, 0x3d, 0x7c, 0x78, 0x3e, 0xf3, 0x77, 0xd7,
+	0x7e, 0x95, 0x0c, 0x83, 0x4a, 0xac, 0x75, 0x74, 0x06, 0x09, 0xb5, 0xab, 0xa5, 0x80, 0xaa, 0x13,
+	0xbe, 0x68, 0xe5, 0x38, 0xc6, 0xcb, 0x0e, 0x0f, 0x5b, 0xfd, 0xbf, 0x95, 0xbe, 0x37, 0xc7, 0x77,
+	0xfb, 0x66, 0x81, 0xf1, 0x0f, 0x7b, 0xb6, 0x30, 0x30, 0xdc, 0x68, 0x68, 0xe4, 0xa0, 0xca, 0x00,
+	0x8e, 0x91, 0xfa, 0xd7, 0xc5, 0x50, 0xe1, 0x46, 0x57, 0x93, 0xa1, 0x2a, 0x83, 0xca, 0x18, 0xfe,
+	0xd8, 0x9e, 0xb9, 0x45, 0x08, 0x37, 0x1a, 0xa1, 0xc9, 0x82, 0x50, 0x19, 0x20, 0x64, 0x4c, 0x5f,
+	0x9f, 0x8e, 0xaf, 0x0b, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0x0a, 0x60, 0x53, 0x5d, 0x6f, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/header_error.pb.go b/googleapis/ads/googleads/v3/errors/header_error.pb.go
new file mode 100644
index 0000000..e7f62e5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/header_error.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/header_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible header errors.
+type HeaderErrorEnum_HeaderError int32
+
+const (
+	// Enum unspecified.
+	HeaderErrorEnum_UNSPECIFIED HeaderErrorEnum_HeaderError = 0
+	// The received error code is not known in this version.
+	HeaderErrorEnum_UNKNOWN HeaderErrorEnum_HeaderError = 1
+	// The login customer id could not be validated.
+	HeaderErrorEnum_INVALID_LOGIN_CUSTOMER_ID HeaderErrorEnum_HeaderError = 3
+)
+
+var HeaderErrorEnum_HeaderError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	3: "INVALID_LOGIN_CUSTOMER_ID",
+}
+
+var HeaderErrorEnum_HeaderError_value = map[string]int32{
+	"UNSPECIFIED":               0,
+	"UNKNOWN":                   1,
+	"INVALID_LOGIN_CUSTOMER_ID": 3,
+}
+
+func (x HeaderErrorEnum_HeaderError) String() string {
+	return proto.EnumName(HeaderErrorEnum_HeaderError_name, int32(x))
+}
+
+func (HeaderErrorEnum_HeaderError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_312d60bf0fc920b6, []int{0, 0}
+}
+
+// Container for enum describing possible header errors.
+type HeaderErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HeaderErrorEnum) Reset()         { *m = HeaderErrorEnum{} }
+func (m *HeaderErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*HeaderErrorEnum) ProtoMessage()    {}
+func (*HeaderErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_312d60bf0fc920b6, []int{0}
+}
+
+func (m *HeaderErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HeaderErrorEnum.Unmarshal(m, b)
+}
+func (m *HeaderErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HeaderErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *HeaderErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HeaderErrorEnum.Merge(m, src)
+}
+func (m *HeaderErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_HeaderErrorEnum.Size(m)
+}
+func (m *HeaderErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_HeaderErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HeaderErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.HeaderErrorEnum_HeaderError", HeaderErrorEnum_HeaderError_name, HeaderErrorEnum_HeaderError_value)
+	proto.RegisterType((*HeaderErrorEnum)(nil), "google.ads.googleads.v3.errors.HeaderErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/header_error.proto", fileDescriptor_312d60bf0fc920b6)
+}
+
+var fileDescriptor_312d60bf0fc920b6 = []byte{
+	// 300 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0xdd, 0x06, 0x0a, 0xd9, 0x61, 0xa5, 0x37, 0x45, 0x77, 0xe8, 0x03, 0x24, 0x48, 0x6e,
+	0xf1, 0x94, 0xad, 0x75, 0x46, 0x67, 0x36, 0x9c, 0xab, 0x20, 0x95, 0x12, 0x4d, 0x89, 0x83, 0x2d,
+	0x19, 0x49, 0xdd, 0x03, 0x79, 0xf4, 0x51, 0x7c, 0x14, 0x7d, 0x09, 0x69, 0x63, 0xcb, 0x2e, 0x7a,
+	0xca, 0x97, 0x3f, 0xbf, 0xef, 0xfb, 0x7f, 0xfc, 0xc1, 0xb9, 0x32, 0x46, 0xad, 0x0b, 0x24, 0xa4,
+	0x43, 0x5e, 0x56, 0x6a, 0x87, 0x51, 0x61, 0xad, 0xb1, 0x0e, 0xbd, 0x16, 0x42, 0x16, 0x36, 0xaf,
+	0x7f, 0x70, 0x6b, 0x4d, 0x69, 0xc2, 0xa1, 0xe7, 0xa0, 0x90, 0x0e, 0xb6, 0x16, 0xb8, 0xc3, 0xd0,
+	0x5b, 0x4e, 0x4e, 0x9b, 0xc8, 0xed, 0x0a, 0x09, 0xad, 0x4d, 0x29, 0xca, 0x95, 0xd1, 0xce, 0xbb,
+	0xa3, 0x27, 0x30, 0xb8, 0xaa, 0x33, 0x93, 0x8a, 0x4e, 0xf4, 0xdb, 0x26, 0xba, 0x06, 0xfd, 0xbd,
+	0x51, 0x38, 0x00, 0xfd, 0x25, 0x5f, 0xcc, 0x93, 0x31, 0xbb, 0x64, 0x49, 0x1c, 0x1c, 0x84, 0x7d,
+	0x70, 0xb4, 0xe4, 0x37, 0x7c, 0xf6, 0xc0, 0x83, 0x4e, 0x78, 0x06, 0x8e, 0x19, 0x4f, 0xe9, 0x94,
+	0xc5, 0xf9, 0x74, 0x36, 0x61, 0x3c, 0x1f, 0x2f, 0x17, 0xf7, 0xb3, 0xdb, 0xe4, 0x2e, 0x67, 0x71,
+	0xd0, 0x1b, 0x7d, 0x77, 0x40, 0xf4, 0x62, 0x36, 0xf0, 0xff, 0x8e, 0xa3, 0x60, 0x6f, 0xe1, 0xbc,
+	0xea, 0x35, 0xef, 0x3c, 0xc6, 0xbf, 0x1e, 0x65, 0xd6, 0x42, 0x2b, 0x68, 0xac, 0x42, 0xaa, 0xd0,
+	0x75, 0xeb, 0xe6, 0x34, 0xdb, 0x95, 0xfb, 0xeb, 0x52, 0x17, 0xfe, 0x79, 0xef, 0xf6, 0x26, 0x94,
+	0x7e, 0x74, 0x87, 0x13, 0x1f, 0x46, 0xa5, 0x83, 0x5e, 0x56, 0x2a, 0xc5, 0xb0, 0x5e, 0xe9, 0x3e,
+	0x1b, 0x20, 0xa3, 0xd2, 0x65, 0x2d, 0x90, 0xa5, 0x38, 0xf3, 0xc0, 0x57, 0x37, 0xf2, 0x53, 0x42,
+	0xa8, 0x74, 0x84, 0xb4, 0x08, 0x21, 0x29, 0x26, 0xc4, 0x43, 0xcf, 0x87, 0x75, 0x3b, 0xfc, 0x13,
+	0x00, 0x00, 0xff, 0xff, 0xfb, 0x94, 0xbc, 0x71, 0xc6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/id_error.pb.go b/googleapis/ads/googleads/v3/errors/id_error.pb.go
new file mode 100644
index 0000000..3c3c5fc
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/id_error.pb.go
@@ -0,0 +1,118 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/id_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible id errors.
+type IdErrorEnum_IdError int32
+
+const (
+	// Enum unspecified.
+	IdErrorEnum_UNSPECIFIED IdErrorEnum_IdError = 0
+	// The received error code is not known in this version.
+	IdErrorEnum_UNKNOWN IdErrorEnum_IdError = 1
+	// Id not found
+	IdErrorEnum_NOT_FOUND IdErrorEnum_IdError = 2
+)
+
+var IdErrorEnum_IdError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "NOT_FOUND",
+}
+
+var IdErrorEnum_IdError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"NOT_FOUND":   2,
+}
+
+func (x IdErrorEnum_IdError) String() string {
+	return proto.EnumName(IdErrorEnum_IdError_name, int32(x))
+}
+
+func (IdErrorEnum_IdError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_bbd2ce57bfc4276b, []int{0, 0}
+}
+
+// Container for enum describing possible id errors.
+type IdErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *IdErrorEnum) Reset()         { *m = IdErrorEnum{} }
+func (m *IdErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*IdErrorEnum) ProtoMessage()    {}
+func (*IdErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bbd2ce57bfc4276b, []int{0}
+}
+
+func (m *IdErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_IdErrorEnum.Unmarshal(m, b)
+}
+func (m *IdErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_IdErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *IdErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_IdErrorEnum.Merge(m, src)
+}
+func (m *IdErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_IdErrorEnum.Size(m)
+}
+func (m *IdErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_IdErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_IdErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.IdErrorEnum_IdError", IdErrorEnum_IdError_name, IdErrorEnum_IdError_value)
+	proto.RegisterType((*IdErrorEnum)(nil), "google.ads.googleads.v3.errors.IdErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/id_error.proto", fileDescriptor_bbd2ce57bfc4276b)
+}
+
+var fileDescriptor_bbd2ce57bfc4276b = []byte{
+	// 279 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x18, 0xc7, 0x6d, 0x05, 0x87, 0xa9, 0x62, 0xe9, 0x51, 0x64, 0x87, 0xde, 0x4d, 0x0e, 0x01, 0x0f,
+	0xf1, 0xd4, 0xd9, 0x6e, 0x14, 0x21, 0x2d, 0x68, 0x2b, 0x48, 0x61, 0x54, 0x53, 0x42, 0x61, 0x4b,
+	0x4a, 0x53, 0xf7, 0x40, 0x1e, 0x7d, 0x14, 0x5f, 0x44, 0xf0, 0x29, 0xa4, 0xfd, 0xda, 0xde, 0xdc,
+	0x29, 0xbf, 0x84, 0x5f, 0xfe, 0xdf, 0x3f, 0x41, 0xb7, 0x52, 0x6b, 0xb9, 0xab, 0x48, 0x29, 0x0c,
+	0x01, 0xec, 0xe9, 0x40, 0x49, 0xd5, 0xb6, 0xba, 0x35, 0xa4, 0x16, 0xdb, 0x81, 0x70, 0xd3, 0xea,
+	0x4e, 0x7b, 0x4b, 0x70, 0x70, 0x29, 0x0c, 0x9e, 0x75, 0x7c, 0xa0, 0x18, 0xf4, 0xeb, 0x9b, 0x29,
+	0xae, 0xa9, 0x49, 0xa9, 0x94, 0xee, 0xca, 0xae, 0xd6, 0xca, 0xc0, 0x6d, 0x3f, 0x42, 0x4e, 0x2c,
+	0xa2, 0xde, 0x8c, 0xd4, 0xc7, 0xde, 0xbf, 0x43, 0x8b, 0x71, 0xeb, 0x5d, 0x21, 0x27, 0xe3, 0x4f,
+	0x69, 0xf4, 0x10, 0xaf, 0xe3, 0x28, 0x74, 0x4f, 0x3c, 0x07, 0x2d, 0x32, 0xfe, 0xc8, 0x93, 0x17,
+	0xee, 0x5a, 0xde, 0x25, 0x3a, 0xe7, 0xc9, 0xf3, 0x76, 0x9d, 0x64, 0x3c, 0x74, 0xed, 0xd5, 0x8f,
+	0x85, 0xfc, 0x77, 0xbd, 0xc7, 0xc7, 0xbb, 0xac, 0x2e, 0xc6, 0xf0, 0xb4, 0x9f, 0x9d, 0x5a, 0xaf,
+	0xe1, 0xe8, 0x4b, 0xbd, 0x2b, 0x95, 0xc4, 0xba, 0x95, 0x44, 0x56, 0x6a, 0x68, 0x36, 0x3d, 0xbd,
+	0xa9, 0xcd, 0x7f, 0x3f, 0x71, 0x0f, 0xcb, 0xa7, 0x7d, 0xba, 0x09, 0x82, 0x2f, 0x7b, 0xb9, 0x81,
+	0xb0, 0x40, 0x18, 0x0c, 0xd8, 0x53, 0x4e, 0xf1, 0x30, 0xd2, 0x7c, 0x4f, 0x42, 0x11, 0x08, 0x53,
+	0xcc, 0x42, 0x91, 0xd3, 0x02, 0x84, 0x5f, 0xdb, 0x87, 0x53, 0xc6, 0x02, 0x61, 0x18, 0x9b, 0x15,
+	0xc6, 0x72, 0xca, 0x18, 0x48, 0x6f, 0x67, 0x43, 0x3b, 0xfa, 0x17, 0x00, 0x00, 0xff, 0xff, 0x3d,
+	0xdf, 0x17, 0xb0, 0xa6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/image_error.pb.go b/googleapis/ads/googleads/v3/errors/image_error.pb.go
new file mode 100644
index 0000000..a6974e3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/image_error.pb.go
@@ -0,0 +1,302 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/image_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible image errors.
+type ImageErrorEnum_ImageError int32
+
+const (
+	// Enum unspecified.
+	ImageErrorEnum_UNSPECIFIED ImageErrorEnum_ImageError = 0
+	// The received error code is not known in this version.
+	ImageErrorEnum_UNKNOWN ImageErrorEnum_ImageError = 1
+	// The image is not valid.
+	ImageErrorEnum_INVALID_IMAGE ImageErrorEnum_ImageError = 2
+	// The image could not be stored.
+	ImageErrorEnum_STORAGE_ERROR ImageErrorEnum_ImageError = 3
+	// There was a problem with the request.
+	ImageErrorEnum_BAD_REQUEST ImageErrorEnum_ImageError = 4
+	// The image is not of legal dimensions.
+	ImageErrorEnum_UNEXPECTED_SIZE ImageErrorEnum_ImageError = 5
+	// Animated image are not permitted.
+	ImageErrorEnum_ANIMATED_NOT_ALLOWED ImageErrorEnum_ImageError = 6
+	// Animation is too long.
+	ImageErrorEnum_ANIMATION_TOO_LONG ImageErrorEnum_ImageError = 7
+	// There was an error on the server.
+	ImageErrorEnum_SERVER_ERROR ImageErrorEnum_ImageError = 8
+	// Image cannot be in CMYK color format.
+	ImageErrorEnum_CMYK_JPEG_NOT_ALLOWED ImageErrorEnum_ImageError = 9
+	// Flash images are not permitted.
+	ImageErrorEnum_FLASH_NOT_ALLOWED ImageErrorEnum_ImageError = 10
+	// Flash images must support clickTag.
+	ImageErrorEnum_FLASH_WITHOUT_CLICKTAG ImageErrorEnum_ImageError = 11
+	// A flash error has occurred after fixing the click tag.
+	ImageErrorEnum_FLASH_ERROR_AFTER_FIXING_CLICK_TAG ImageErrorEnum_ImageError = 12
+	// Unacceptable visual effects.
+	ImageErrorEnum_ANIMATED_VISUAL_EFFECT ImageErrorEnum_ImageError = 13
+	// There was a problem with the flash image.
+	ImageErrorEnum_FLASH_ERROR ImageErrorEnum_ImageError = 14
+	// Incorrect image layout.
+	ImageErrorEnum_LAYOUT_PROBLEM ImageErrorEnum_ImageError = 15
+	// There was a problem reading the image file.
+	ImageErrorEnum_PROBLEM_READING_IMAGE_FILE ImageErrorEnum_ImageError = 16
+	// There was an error storing the image.
+	ImageErrorEnum_ERROR_STORING_IMAGE ImageErrorEnum_ImageError = 17
+	// The aspect ratio of the image is not allowed.
+	ImageErrorEnum_ASPECT_RATIO_NOT_ALLOWED ImageErrorEnum_ImageError = 18
+	// Flash cannot have network objects.
+	ImageErrorEnum_FLASH_HAS_NETWORK_OBJECTS ImageErrorEnum_ImageError = 19
+	// Flash cannot have network methods.
+	ImageErrorEnum_FLASH_HAS_NETWORK_METHODS ImageErrorEnum_ImageError = 20
+	// Flash cannot have a Url.
+	ImageErrorEnum_FLASH_HAS_URL ImageErrorEnum_ImageError = 21
+	// Flash cannot use mouse tracking.
+	ImageErrorEnum_FLASH_HAS_MOUSE_TRACKING ImageErrorEnum_ImageError = 22
+	// Flash cannot have a random number.
+	ImageErrorEnum_FLASH_HAS_RANDOM_NUM ImageErrorEnum_ImageError = 23
+	// Ad click target cannot be '_self'.
+	ImageErrorEnum_FLASH_SELF_TARGETS ImageErrorEnum_ImageError = 24
+	// GetUrl method should only use '_blank'.
+	ImageErrorEnum_FLASH_BAD_GETURL_TARGET ImageErrorEnum_ImageError = 25
+	// Flash version is not supported.
+	ImageErrorEnum_FLASH_VERSION_NOT_SUPPORTED ImageErrorEnum_ImageError = 26
+	// Flash movies need to have hard coded click URL or clickTAG
+	ImageErrorEnum_FLASH_WITHOUT_HARD_CODED_CLICK_URL ImageErrorEnum_ImageError = 27
+	// Uploaded flash file is corrupted.
+	ImageErrorEnum_INVALID_FLASH_FILE ImageErrorEnum_ImageError = 28
+	// Uploaded flash file can be parsed, but the click tag can not be fixed
+	// properly.
+	ImageErrorEnum_FAILED_TO_FIX_CLICK_TAG_IN_FLASH ImageErrorEnum_ImageError = 29
+	// Flash movie accesses network resources
+	ImageErrorEnum_FLASH_ACCESSES_NETWORK_RESOURCES ImageErrorEnum_ImageError = 30
+	// Flash movie attempts to call external javascript code
+	ImageErrorEnum_FLASH_EXTERNAL_JS_CALL ImageErrorEnum_ImageError = 31
+	// Flash movie attempts to call flash system commands
+	ImageErrorEnum_FLASH_EXTERNAL_FS_CALL ImageErrorEnum_ImageError = 32
+	// Image file is too large.
+	ImageErrorEnum_FILE_TOO_LARGE ImageErrorEnum_ImageError = 33
+	// Image data is too large.
+	ImageErrorEnum_IMAGE_DATA_TOO_LARGE ImageErrorEnum_ImageError = 34
+	// Error while processing the image.
+	ImageErrorEnum_IMAGE_PROCESSING_ERROR ImageErrorEnum_ImageError = 35
+	// Image is too small.
+	ImageErrorEnum_IMAGE_TOO_SMALL ImageErrorEnum_ImageError = 36
+	// Input was invalid.
+	ImageErrorEnum_INVALID_INPUT ImageErrorEnum_ImageError = 37
+	// There was a problem reading the image file.
+	ImageErrorEnum_PROBLEM_READING_FILE ImageErrorEnum_ImageError = 38
+	// Image constraints are violated, but details like ASPECT_RATIO_NOT_ALLOWED
+	// can't be provided. This happens when asset spec contains more than one
+	// constraint and different criteria of different constraints are violated.
+	ImageErrorEnum_IMAGE_CONSTRAINTS_VIOLATED ImageErrorEnum_ImageError = 39
+)
+
+var ImageErrorEnum_ImageError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "INVALID_IMAGE",
+	3:  "STORAGE_ERROR",
+	4:  "BAD_REQUEST",
+	5:  "UNEXPECTED_SIZE",
+	6:  "ANIMATED_NOT_ALLOWED",
+	7:  "ANIMATION_TOO_LONG",
+	8:  "SERVER_ERROR",
+	9:  "CMYK_JPEG_NOT_ALLOWED",
+	10: "FLASH_NOT_ALLOWED",
+	11: "FLASH_WITHOUT_CLICKTAG",
+	12: "FLASH_ERROR_AFTER_FIXING_CLICK_TAG",
+	13: "ANIMATED_VISUAL_EFFECT",
+	14: "FLASH_ERROR",
+	15: "LAYOUT_PROBLEM",
+	16: "PROBLEM_READING_IMAGE_FILE",
+	17: "ERROR_STORING_IMAGE",
+	18: "ASPECT_RATIO_NOT_ALLOWED",
+	19: "FLASH_HAS_NETWORK_OBJECTS",
+	20: "FLASH_HAS_NETWORK_METHODS",
+	21: "FLASH_HAS_URL",
+	22: "FLASH_HAS_MOUSE_TRACKING",
+	23: "FLASH_HAS_RANDOM_NUM",
+	24: "FLASH_SELF_TARGETS",
+	25: "FLASH_BAD_GETURL_TARGET",
+	26: "FLASH_VERSION_NOT_SUPPORTED",
+	27: "FLASH_WITHOUT_HARD_CODED_CLICK_URL",
+	28: "INVALID_FLASH_FILE",
+	29: "FAILED_TO_FIX_CLICK_TAG_IN_FLASH",
+	30: "FLASH_ACCESSES_NETWORK_RESOURCES",
+	31: "FLASH_EXTERNAL_JS_CALL",
+	32: "FLASH_EXTERNAL_FS_CALL",
+	33: "FILE_TOO_LARGE",
+	34: "IMAGE_DATA_TOO_LARGE",
+	35: "IMAGE_PROCESSING_ERROR",
+	36: "IMAGE_TOO_SMALL",
+	37: "INVALID_INPUT",
+	38: "PROBLEM_READING_FILE",
+	39: "IMAGE_CONSTRAINTS_VIOLATED",
+}
+
+var ImageErrorEnum_ImageError_value = map[string]int32{
+	"UNSPECIFIED":                        0,
+	"UNKNOWN":                            1,
+	"INVALID_IMAGE":                      2,
+	"STORAGE_ERROR":                      3,
+	"BAD_REQUEST":                        4,
+	"UNEXPECTED_SIZE":                    5,
+	"ANIMATED_NOT_ALLOWED":               6,
+	"ANIMATION_TOO_LONG":                 7,
+	"SERVER_ERROR":                       8,
+	"CMYK_JPEG_NOT_ALLOWED":              9,
+	"FLASH_NOT_ALLOWED":                  10,
+	"FLASH_WITHOUT_CLICKTAG":             11,
+	"FLASH_ERROR_AFTER_FIXING_CLICK_TAG": 12,
+	"ANIMATED_VISUAL_EFFECT":             13,
+	"FLASH_ERROR":                        14,
+	"LAYOUT_PROBLEM":                     15,
+	"PROBLEM_READING_IMAGE_FILE":         16,
+	"ERROR_STORING_IMAGE":                17,
+	"ASPECT_RATIO_NOT_ALLOWED":           18,
+	"FLASH_HAS_NETWORK_OBJECTS":          19,
+	"FLASH_HAS_NETWORK_METHODS":          20,
+	"FLASH_HAS_URL":                      21,
+	"FLASH_HAS_MOUSE_TRACKING":           22,
+	"FLASH_HAS_RANDOM_NUM":               23,
+	"FLASH_SELF_TARGETS":                 24,
+	"FLASH_BAD_GETURL_TARGET":            25,
+	"FLASH_VERSION_NOT_SUPPORTED":        26,
+	"FLASH_WITHOUT_HARD_CODED_CLICK_URL": 27,
+	"INVALID_FLASH_FILE":                 28,
+	"FAILED_TO_FIX_CLICK_TAG_IN_FLASH":   29,
+	"FLASH_ACCESSES_NETWORK_RESOURCES":   30,
+	"FLASH_EXTERNAL_JS_CALL":             31,
+	"FLASH_EXTERNAL_FS_CALL":             32,
+	"FILE_TOO_LARGE":                     33,
+	"IMAGE_DATA_TOO_LARGE":               34,
+	"IMAGE_PROCESSING_ERROR":             35,
+	"IMAGE_TOO_SMALL":                    36,
+	"INVALID_INPUT":                      37,
+	"PROBLEM_READING_FILE":               38,
+	"IMAGE_CONSTRAINTS_VIOLATED":         39,
+}
+
+func (x ImageErrorEnum_ImageError) String() string {
+	return proto.EnumName(ImageErrorEnum_ImageError_name, int32(x))
+}
+
+func (ImageErrorEnum_ImageError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_276eefc416298097, []int{0, 0}
+}
+
+// Container for enum describing possible image errors.
+type ImageErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ImageErrorEnum) Reset()         { *m = ImageErrorEnum{} }
+func (m *ImageErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ImageErrorEnum) ProtoMessage()    {}
+func (*ImageErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_276eefc416298097, []int{0}
+}
+
+func (m *ImageErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageErrorEnum.Unmarshal(m, b)
+}
+func (m *ImageErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ImageErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageErrorEnum.Merge(m, src)
+}
+func (m *ImageErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ImageErrorEnum.Size(m)
+}
+func (m *ImageErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ImageErrorEnum_ImageError", ImageErrorEnum_ImageError_name, ImageErrorEnum_ImageError_value)
+	proto.RegisterType((*ImageErrorEnum)(nil), "google.ads.googleads.v3.errors.ImageErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/image_error.proto", fileDescriptor_276eefc416298097)
+}
+
+var fileDescriptor_276eefc416298097 = []byte{
+	// 801 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xcd, 0x6e, 0x1b, 0x37,
+	0x10, 0xae, 0x9d, 0x36, 0x71, 0xe9, 0xc4, 0xa6, 0xe9, 0xf8, 0xdf, 0x71, 0x52, 0x35, 0x4d, 0x6f,
+	0x52, 0x01, 0xdd, 0xd4, 0x13, 0xb5, 0x3b, 0xbb, 0xa2, 0xc5, 0x25, 0xb7, 0x24, 0x57, 0x76, 0x02,
+	0x03, 0x84, 0x5a, 0x19, 0x82, 0x81, 0x58, 0x6b, 0x68, 0xdd, 0xbc, 0x4a, 0xef, 0x3d, 0xe6, 0x51,
+	0xfa, 0x28, 0x79, 0x8a, 0x62, 0x96, 0x92, 0x36, 0x2e, 0xd2, 0x9c, 0x44, 0xcd, 0xf7, 0xf1, 0x9b,
+	0xe1, 0x7c, 0xb3, 0x43, 0x7e, 0x99, 0x96, 0xe5, 0xf4, 0xfd, 0x75, 0x67, 0x3c, 0xa9, 0x3a, 0xe1,
+	0x88, 0xa7, 0x0f, 0xdd, 0xce, 0xf5, 0x7c, 0x5e, 0xce, 0xab, 0xce, 0xcd, 0xed, 0x78, 0x7a, 0xed,
+	0xeb, 0x3f, 0xed, 0xbb, 0x79, 0x79, 0x5f, 0xb2, 0xb3, 0x40, 0x6b, 0x8f, 0x27, 0x55, 0x7b, 0x75,
+	0xa3, 0xfd, 0xa1, 0xdb, 0x0e, 0x37, 0x8e, 0x4f, 0x97, 0x8a, 0x77, 0x37, 0x9d, 0xf1, 0x6c, 0x56,
+	0xde, 0x8f, 0xef, 0x6f, 0xca, 0x59, 0x15, 0x6e, 0xb7, 0x3e, 0x6e, 0x90, 0x2d, 0x81, 0x9a, 0x80,
+	0x6c, 0x98, 0xfd, 0x79, 0xdb, 0xfa, 0x6b, 0x83, 0x90, 0x26, 0xc4, 0xb6, 0xc9, 0x66, 0xa1, 0x6c,
+	0x0e, 0x91, 0x48, 0x04, 0xc4, 0xf4, 0x1b, 0xb6, 0x49, 0x9e, 0x14, 0x6a, 0xa8, 0xf4, 0x85, 0xa2,
+	0x6b, 0x6c, 0x87, 0x3c, 0x13, 0x6a, 0xc4, 0xa5, 0x88, 0xbd, 0xc8, 0x78, 0x0a, 0x74, 0x1d, 0x43,
+	0xd6, 0x69, 0xc3, 0x53, 0xf0, 0x60, 0x8c, 0x36, 0xf4, 0x11, 0x6a, 0xf4, 0x79, 0xec, 0x0d, 0xfc,
+	0x56, 0x80, 0x75, 0xf4, 0x5b, 0xb6, 0x4b, 0xb6, 0x0b, 0x05, 0x97, 0x39, 0x44, 0x0e, 0x62, 0x6f,
+	0xc5, 0x3b, 0xa0, 0xdf, 0xb1, 0x43, 0xf2, 0x9c, 0x2b, 0x91, 0x71, 0x0c, 0x29, 0xed, 0x3c, 0x97,
+	0x52, 0x5f, 0x40, 0x4c, 0x1f, 0xb3, 0x7d, 0xc2, 0x02, 0x22, 0xb4, 0xf2, 0x4e, 0x6b, 0x2f, 0xb5,
+	0x4a, 0xe9, 0x13, 0x46, 0xc9, 0x53, 0x0b, 0x66, 0x04, 0x66, 0x91, 0x69, 0x83, 0x1d, 0x91, 0xbd,
+	0x28, 0x7b, 0x3b, 0xf4, 0xe7, 0x39, 0xa4, 0x0f, 0x44, 0xbe, 0x67, 0x7b, 0x64, 0x27, 0x91, 0xdc,
+	0x0e, 0x1e, 0x84, 0x09, 0x3b, 0x26, 0xfb, 0x21, 0x7c, 0x21, 0xdc, 0x40, 0x17, 0xce, 0x47, 0x52,
+	0x44, 0x43, 0xc7, 0x53, 0xba, 0xc9, 0xde, 0x90, 0x56, 0xc0, 0x6a, 0x79, 0xcf, 0x13, 0x07, 0xc6,
+	0x27, 0xe2, 0x52, 0xa8, 0x34, 0xd0, 0x3c, 0xf2, 0x9e, 0xa2, 0xc6, 0xaa, 0xf2, 0x91, 0xb0, 0x05,
+	0x97, 0x1e, 0x92, 0x04, 0x22, 0x47, 0x9f, 0xe1, 0xdb, 0x3f, 0xd3, 0xa0, 0x5b, 0x8c, 0x91, 0x2d,
+	0xc9, 0xdf, 0x62, 0xa6, 0xdc, 0xe8, 0xbe, 0x84, 0x8c, 0x6e, 0xb3, 0x33, 0x72, 0xbc, 0xf8, 0xe3,
+	0x0d, 0xf0, 0x18, 0xf5, 0xeb, 0x76, 0xfa, 0x44, 0x48, 0xa0, 0x94, 0x1d, 0x90, 0xdd, 0x50, 0x02,
+	0x76, 0x76, 0x85, 0xd2, 0x1d, 0x76, 0x4a, 0x0e, 0x39, 0x9a, 0xe3, 0xbc, 0xc1, 0xee, 0x3c, 0x78,
+	0x1b, 0x63, 0x2f, 0xc8, 0x51, 0xc8, 0x3d, 0xe0, 0xd6, 0x2b, 0x70, 0x17, 0xda, 0x0c, 0xbd, 0xee,
+	0x9f, 0x43, 0xe4, 0x2c, 0xdd, 0xfd, 0x32, 0x9c, 0x81, 0x1b, 0xe8, 0xd8, 0xd2, 0xe7, 0x68, 0x64,
+	0x03, 0x17, 0x46, 0xd2, 0x3d, 0x4c, 0xd7, 0x84, 0x32, 0x5d, 0x58, 0xf0, 0xce, 0xf0, 0x68, 0x28,
+	0x54, 0x4a, 0xf7, 0xd1, 0xc0, 0x06, 0x35, 0x5c, 0xc5, 0x3a, 0xf3, 0xaa, 0xc8, 0xe8, 0x01, 0x1a,
+	0x18, 0x10, 0x0b, 0x32, 0xf1, 0x8e, 0x9b, 0x14, 0x9c, 0xa5, 0x87, 0xec, 0x84, 0x1c, 0x84, 0x38,
+	0x8e, 0x47, 0x0a, 0xae, 0x30, 0x72, 0x81, 0xd2, 0x23, 0xf6, 0x92, 0x9c, 0x04, 0x70, 0x04, 0xc6,
+	0xa2, 0xf3, 0xf8, 0x38, 0x5b, 0xe4, 0xb9, 0x36, 0x0e, 0x62, 0x7a, 0xdc, 0xd8, 0xb3, 0xb4, 0x6e,
+	0xc0, 0x4d, 0xec, 0x23, 0x1d, 0x43, 0xbc, 0xb0, 0x07, 0xab, 0x3e, 0xc1, 0xec, 0xcb, 0x21, 0x0d,
+	0xfc, 0xba, 0xab, 0xa7, 0xec, 0x35, 0x79, 0x95, 0x70, 0x21, 0x21, 0xf6, 0x4e, 0xa3, 0xad, 0x8d,
+	0xa7, 0x5e, 0xa8, 0x40, 0xa5, 0x2f, 0x6a, 0x56, 0x7d, 0x8b, 0x47, 0x11, 0x58, 0x0b, 0x4d, 0xab,
+	0x0c, 0x58, 0x5d, 0x98, 0x08, 0x2c, 0x3d, 0x6b, 0xc6, 0x08, 0x2e, 0x1d, 0x18, 0xc5, 0xa5, 0x3f,
+	0xb7, 0x3e, 0xe2, 0x52, 0xd2, 0x97, 0x5f, 0xc0, 0x92, 0x05, 0xf6, 0x0a, 0xa7, 0x01, 0xab, 0x09,
+	0x53, 0x8d, 0x2f, 0xa7, 0x3f, 0x60, 0x1f, 0x83, 0xfb, 0x31, 0x77, 0xfc, 0x33, 0xa4, 0x85, 0x4a,
+	0x01, 0xc9, 0x8d, 0xc6, 0x62, 0x70, 0x14, 0xc2, 0x5c, 0xfd, 0x88, 0xdf, 0x54, 0xc0, 0xf0, 0x82,
+	0xcd, 0x50, 0xfe, 0xf5, 0x83, 0xef, 0x53, 0xe5, 0x85, 0xa3, 0x3f, 0xa1, 0xfa, 0x7f, 0x67, 0xad,
+	0xee, 0xc7, 0x1b, 0x9c, 0xc2, 0xa0, 0x10, 0x69, 0x65, 0x9d, 0xe1, 0x42, 0x39, 0xeb, 0x47, 0x42,
+	0x4b, 0x1c, 0x6c, 0xfa, 0x73, 0xff, 0xd3, 0x1a, 0x69, 0xfd, 0x51, 0xde, 0xb6, 0xbf, 0xbe, 0x71,
+	0xfa, 0xdb, 0xcd, 0xf6, 0xc8, 0x71, 0xc9, 0xe4, 0x6b, 0xef, 0xe2, 0xc5, 0x95, 0x69, 0xf9, 0x7e,
+	0x3c, 0x9b, 0xb6, 0xcb, 0xf9, 0xb4, 0x33, 0xbd, 0x9e, 0xd5, 0x2b, 0x68, 0xb9, 0xe6, 0xee, 0x6e,
+	0xaa, 0xff, 0xdb, 0x7a, 0xbf, 0x86, 0x9f, 0xbf, 0xd7, 0x1f, 0xa5, 0x9c, 0x7f, 0x5c, 0x3f, 0x4b,
+	0x83, 0x18, 0x9f, 0x54, 0xed, 0x70, 0xc4, 0xd3, 0xa8, 0xdb, 0xae, 0x53, 0x56, 0xff, 0x2c, 0x09,
+	0x57, 0x7c, 0x52, 0x5d, 0xad, 0x08, 0x57, 0xa3, 0xee, 0x55, 0x20, 0x7c, 0x5a, 0x6f, 0x85, 0x68,
+	0xaf, 0xc7, 0x27, 0x55, 0xaf, 0xb7, 0xa2, 0xf4, 0x7a, 0xa3, 0x6e, 0xaf, 0x17, 0x48, 0xbf, 0x3f,
+	0xae, 0xab, 0xeb, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xbb, 0xeb, 0x84, 0xf4, 0x92, 0x05, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/internal_error.pb.go b/googleapis/ads/googleads/v3/errors/internal_error.pb.go
new file mode 100644
index 0000000..d06fab5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/internal_error.pb.go
@@ -0,0 +1,136 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/internal_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible internal errors.
+type InternalErrorEnum_InternalError int32
+
+const (
+	// Enum unspecified.
+	InternalErrorEnum_UNSPECIFIED InternalErrorEnum_InternalError = 0
+	// The received error code is not known in this version.
+	InternalErrorEnum_UNKNOWN InternalErrorEnum_InternalError = 1
+	// Google Ads API encountered unexpected internal error.
+	InternalErrorEnum_INTERNAL_ERROR InternalErrorEnum_InternalError = 2
+	// The intended error code doesn't exist in specified API version. It will
+	// be released in a future API version.
+	InternalErrorEnum_ERROR_CODE_NOT_PUBLISHED InternalErrorEnum_InternalError = 3
+	// Google Ads API encountered an unexpected transient error. The user
+	// should retry their request in these cases.
+	InternalErrorEnum_TRANSIENT_ERROR InternalErrorEnum_InternalError = 4
+	// The request took longer than a deadline.
+	InternalErrorEnum_DEADLINE_EXCEEDED InternalErrorEnum_InternalError = 5
+)
+
+var InternalErrorEnum_InternalError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INTERNAL_ERROR",
+	3: "ERROR_CODE_NOT_PUBLISHED",
+	4: "TRANSIENT_ERROR",
+	5: "DEADLINE_EXCEEDED",
+}
+
+var InternalErrorEnum_InternalError_value = map[string]int32{
+	"UNSPECIFIED":              0,
+	"UNKNOWN":                  1,
+	"INTERNAL_ERROR":           2,
+	"ERROR_CODE_NOT_PUBLISHED": 3,
+	"TRANSIENT_ERROR":          4,
+	"DEADLINE_EXCEEDED":        5,
+}
+
+func (x InternalErrorEnum_InternalError) String() string {
+	return proto.EnumName(InternalErrorEnum_InternalError_name, int32(x))
+}
+
+func (InternalErrorEnum_InternalError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a22b88d5b68074b5, []int{0, 0}
+}
+
+// Container for enum describing possible internal errors.
+type InternalErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *InternalErrorEnum) Reset()         { *m = InternalErrorEnum{} }
+func (m *InternalErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*InternalErrorEnum) ProtoMessage()    {}
+func (*InternalErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a22b88d5b68074b5, []int{0}
+}
+
+func (m *InternalErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_InternalErrorEnum.Unmarshal(m, b)
+}
+func (m *InternalErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_InternalErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *InternalErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_InternalErrorEnum.Merge(m, src)
+}
+func (m *InternalErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_InternalErrorEnum.Size(m)
+}
+func (m *InternalErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_InternalErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_InternalErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.InternalErrorEnum_InternalError", InternalErrorEnum_InternalError_name, InternalErrorEnum_InternalError_value)
+	proto.RegisterType((*InternalErrorEnum)(nil), "google.ads.googleads.v3.errors.InternalErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/internal_error.proto", fileDescriptor_a22b88d5b68074b5)
+}
+
+var fileDescriptor_a22b88d5b68074b5 = []byte{
+	// 351 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xd1, 0x4a, 0xf3, 0x30,
+	0x14, 0xc7, 0xbf, 0x76, 0x9f, 0x0a, 0x19, 0xba, 0x2e, 0x22, 0x88, 0x8c, 0x5d, 0xf4, 0x01, 0xd2,
+	0x8b, 0xde, 0xc5, 0xab, 0x6c, 0x89, 0xb3, 0x38, 0xd2, 0xd2, 0x75, 0x53, 0xa4, 0x50, 0xaa, 0x2d,
+	0xa5, 0xb0, 0x25, 0xa3, 0xa9, 0x7b, 0x09, 0x9f, 0x42, 0x2f, 0x7d, 0x14, 0x1f, 0x45, 0xf0, 0x1d,
+	0xa4, 0xcd, 0x36, 0xd8, 0x85, 0x5e, 0xf5, 0xdf, 0xc3, 0xef, 0x77, 0x72, 0xce, 0x01, 0x6e, 0x21,
+	0x65, 0xb1, 0xcc, 0x9d, 0x34, 0x53, 0x8e, 0x8e, 0x4d, 0xda, 0xb8, 0x4e, 0x5e, 0x55, 0xb2, 0x52,
+	0x4e, 0x29, 0xea, 0xbc, 0x12, 0xe9, 0x32, 0x69, 0xff, 0xd1, 0xba, 0x92, 0xb5, 0x84, 0x43, 0x4d,
+	0xa2, 0x34, 0x53, 0x68, 0x2f, 0xa1, 0x8d, 0x8b, 0xb4, 0x74, 0x35, 0xd8, 0x35, 0x5d, 0x97, 0x4e,
+	0x2a, 0x84, 0xac, 0xd3, 0xba, 0x94, 0x42, 0x69, 0xdb, 0x7e, 0x33, 0x40, 0xdf, 0xdb, 0xb6, 0x65,
+	0x8d, 0xc0, 0xc4, 0xcb, 0xca, 0x7e, 0x35, 0xc0, 0xe9, 0x41, 0x15, 0xf6, 0x40, 0x77, 0xce, 0x67,
+	0x01, 0x1b, 0x7b, 0x37, 0x1e, 0xa3, 0xd6, 0x3f, 0xd8, 0x05, 0x27, 0x73, 0x7e, 0xc7, 0xfd, 0x7b,
+	0x6e, 0x19, 0x10, 0x82, 0x33, 0x8f, 0x47, 0x2c, 0xe4, 0x64, 0x9a, 0xb0, 0x30, 0xf4, 0x43, 0xcb,
+	0x84, 0x03, 0x70, 0xd9, 0xc6, 0x64, 0xec, 0x53, 0x96, 0x70, 0x3f, 0x4a, 0x82, 0xf9, 0x68, 0xea,
+	0xcd, 0x6e, 0x19, 0xb5, 0x3a, 0xf0, 0x1c, 0xf4, 0xa2, 0x90, 0xf0, 0x99, 0xc7, 0x78, 0xb4, 0x55,
+	0xfe, 0xc3, 0x0b, 0xd0, 0xa7, 0x8c, 0xd0, 0xa9, 0xc7, 0x59, 0xc2, 0x1e, 0xc6, 0x8c, 0x51, 0x46,
+	0xad, 0xa3, 0xd1, 0xb7, 0x01, 0xec, 0x67, 0xb9, 0x42, 0x7f, 0x2f, 0x3a, 0x82, 0x07, 0x13, 0x07,
+	0xcd, 0x7a, 0x81, 0xf1, 0x48, 0xb7, 0x56, 0x21, 0x97, 0xa9, 0x28, 0x90, 0xac, 0x0a, 0xa7, 0xc8,
+	0x45, 0xbb, 0xfc, 0xee, 0xc6, 0xeb, 0x52, 0xfd, 0x76, 0xf2, 0x6b, 0xfd, 0x79, 0x37, 0x3b, 0x13,
+	0x42, 0x3e, 0xcc, 0xe1, 0x44, 0x37, 0x23, 0x99, 0x42, 0x3a, 0x36, 0x69, 0xe1, 0xa2, 0xf6, 0x49,
+	0xf5, 0xb9, 0x03, 0x62, 0x92, 0xa9, 0x78, 0x0f, 0xc4, 0x0b, 0x37, 0xd6, 0xc0, 0x97, 0x69, 0xeb,
+	0x2a, 0xc6, 0x24, 0x53, 0x18, 0xef, 0x11, 0x8c, 0x17, 0x2e, 0xc6, 0x1a, 0x7a, 0x3a, 0x6e, 0xa7,
+	0x73, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5c, 0xe4, 0x1f, 0x5f, 0x0f, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/invoice_error.pb.go b/googleapis/ads/googleads/v3/errors/invoice_error.pb.go
new file mode 100644
index 0000000..dcdff9a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/invoice_error.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/invoice_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible invoice errors.
+type InvoiceErrorEnum_InvoiceError int32
+
+const (
+	// Enum unspecified.
+	InvoiceErrorEnum_UNSPECIFIED InvoiceErrorEnum_InvoiceError = 0
+	// The received error code is not known in this version.
+	InvoiceErrorEnum_UNKNOWN InvoiceErrorEnum_InvoiceError = 1
+	// Cannot request invoices issued before 2019-01-01.
+	InvoiceErrorEnum_YEAR_MONTH_TOO_OLD InvoiceErrorEnum_InvoiceError = 2
+	// Cannot request invoices for customer who doesn't receive invoices.
+	InvoiceErrorEnum_NOT_INVOICED_CUSTOMER InvoiceErrorEnum_InvoiceError = 3
+)
+
+var InvoiceErrorEnum_InvoiceError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "YEAR_MONTH_TOO_OLD",
+	3: "NOT_INVOICED_CUSTOMER",
+}
+
+var InvoiceErrorEnum_InvoiceError_value = map[string]int32{
+	"UNSPECIFIED":           0,
+	"UNKNOWN":               1,
+	"YEAR_MONTH_TOO_OLD":    2,
+	"NOT_INVOICED_CUSTOMER": 3,
+}
+
+func (x InvoiceErrorEnum_InvoiceError) String() string {
+	return proto.EnumName(InvoiceErrorEnum_InvoiceError_name, int32(x))
+}
+
+func (InvoiceErrorEnum_InvoiceError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_971f5ea52cc1e028, []int{0, 0}
+}
+
+// Container for enum describing possible invoice errors.
+type InvoiceErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *InvoiceErrorEnum) Reset()         { *m = InvoiceErrorEnum{} }
+func (m *InvoiceErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*InvoiceErrorEnum) ProtoMessage()    {}
+func (*InvoiceErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_971f5ea52cc1e028, []int{0}
+}
+
+func (m *InvoiceErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_InvoiceErrorEnum.Unmarshal(m, b)
+}
+func (m *InvoiceErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_InvoiceErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *InvoiceErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_InvoiceErrorEnum.Merge(m, src)
+}
+func (m *InvoiceErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_InvoiceErrorEnum.Size(m)
+}
+func (m *InvoiceErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_InvoiceErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_InvoiceErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.InvoiceErrorEnum_InvoiceError", InvoiceErrorEnum_InvoiceError_name, InvoiceErrorEnum_InvoiceError_value)
+	proto.RegisterType((*InvoiceErrorEnum)(nil), "google.ads.googleads.v3.errors.InvoiceErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/invoice_error.proto", fileDescriptor_971f5ea52cc1e028)
+}
+
+var fileDescriptor_971f5ea52cc1e028 = []byte{
+	// 318 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xd1, 0x4a, 0xf3, 0x30,
+	0x1c, 0xc5, 0xbf, 0x75, 0xf0, 0x09, 0x99, 0x60, 0x2d, 0x28, 0x28, 0xb2, 0x8b, 0x3e, 0x40, 0x02,
+	0xe6, 0x2e, 0x5e, 0x65, 0x6b, 0x9c, 0x45, 0x97, 0x8c, 0xad, 0xab, 0x28, 0x85, 0x50, 0xd7, 0x12,
+	0x0a, 0x5b, 0x32, 0x9a, 0xb9, 0x07, 0xf2, 0xd2, 0x47, 0xf1, 0x51, 0xc4, 0x87, 0x90, 0x36, 0x6e,
+	0xec, 0x46, 0xaf, 0x72, 0xf2, 0xe7, 0x77, 0x4e, 0x4e, 0xfe, 0xe0, 0x5a, 0x19, 0xa3, 0x96, 0x25,
+	0xca, 0x0b, 0x8b, 0x9c, 0x6c, 0xd4, 0x16, 0xa3, 0xb2, 0xae, 0x4d, 0x6d, 0x51, 0xa5, 0xb7, 0xa6,
+	0x5a, 0x94, 0xb2, 0xbd, 0xc2, 0x75, 0x6d, 0x36, 0x26, 0xe8, 0x3b, 0x10, 0xe6, 0x85, 0x85, 0x7b,
+	0x0f, 0xdc, 0x62, 0xe8, 0x3c, 0x97, 0x57, 0xbb, 0xcc, 0x75, 0x85, 0x72, 0xad, 0xcd, 0x26, 0xdf,
+	0x54, 0x46, 0x5b, 0xe7, 0x0e, 0x2d, 0xf0, 0x63, 0x17, 0xca, 0x1a, 0x9c, 0xe9, 0xd7, 0x55, 0x28,
+	0xc1, 0xf1, 0xe1, 0x2c, 0x38, 0x01, 0xbd, 0x39, 0x9f, 0x4d, 0xd8, 0x30, 0xbe, 0x8d, 0x59, 0xe4,
+	0xff, 0x0b, 0x7a, 0xe0, 0x68, 0xce, 0xef, 0xb9, 0x78, 0xe4, 0x7e, 0x27, 0x38, 0x07, 0xc1, 0x13,
+	0xa3, 0x53, 0x39, 0x16, 0x3c, 0xb9, 0x93, 0x89, 0x10, 0x52, 0x3c, 0x44, 0xbe, 0x17, 0x5c, 0x80,
+	0x33, 0x2e, 0x12, 0x19, 0xf3, 0x54, 0xc4, 0x43, 0x16, 0xc9, 0xe1, 0x7c, 0x96, 0x88, 0x31, 0x9b,
+	0xfa, 0xdd, 0xc1, 0x57, 0x07, 0x84, 0x0b, 0xb3, 0x82, 0x7f, 0x37, 0x1f, 0x9c, 0x1e, 0xb6, 0x98,
+	0x34, 0x75, 0x27, 0x9d, 0xe7, 0xe8, 0xc7, 0xa4, 0xcc, 0x32, 0xd7, 0x0a, 0x9a, 0x5a, 0x21, 0x55,
+	0xea, 0xf6, 0x33, 0xbb, 0x95, 0xad, 0x2b, 0xfb, 0xdb, 0x06, 0x6f, 0xdc, 0xf1, 0xe6, 0x75, 0x47,
+	0x94, 0xbe, 0x7b, 0xfd, 0x91, 0x0b, 0xa3, 0x85, 0x85, 0x4e, 0x36, 0x2a, 0xc5, 0xb0, 0x7d, 0xd2,
+	0x7e, 0xec, 0x80, 0x8c, 0x16, 0x36, 0xdb, 0x03, 0x59, 0x8a, 0x33, 0x07, 0x7c, 0x7a, 0xa1, 0x9b,
+	0x12, 0x42, 0x0b, 0x4b, 0xc8, 0x1e, 0x21, 0x24, 0xc5, 0x84, 0x38, 0xe8, 0xe5, 0x7f, 0xdb, 0x0e,
+	0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x0d, 0x0d, 0x7e, 0xde, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/keyword_plan_ad_group_error.pb.go b/googleapis/ads/googleads/v3/errors/keyword_plan_ad_group_error.pb.go
new file mode 100644
index 0000000..725b878
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/keyword_plan_ad_group_error.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/keyword_plan_ad_group_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible errors from applying a keyword plan ad group.
+type KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError int32
+
+const (
+	// Enum unspecified.
+	KeywordPlanAdGroupErrorEnum_UNSPECIFIED KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError = 0
+	// The received error code is not known in this version.
+	KeywordPlanAdGroupErrorEnum_UNKNOWN KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError = 1
+	// The keyword plan ad group name is missing, empty, longer than allowed
+	// limit or contains invalid chars.
+	KeywordPlanAdGroupErrorEnum_INVALID_NAME KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError = 2
+	// The keyword plan ad group name is duplicate to an existing keyword plan
+	// AdGroup name or other keyword plan AdGroup name in the request.
+	KeywordPlanAdGroupErrorEnum_DUPLICATE_NAME KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError = 3
+)
+
+var KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INVALID_NAME",
+	3: "DUPLICATE_NAME",
+}
+
+var KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"INVALID_NAME":   2,
+	"DUPLICATE_NAME": 3,
+}
+
+func (x KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError) String() string {
+	return proto.EnumName(KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError_name, int32(x))
+}
+
+func (KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ac04c755a98bdfee, []int{0, 0}
+}
+
+// Container for enum describing possible errors from applying a keyword plan
+// ad group.
+type KeywordPlanAdGroupErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordPlanAdGroupErrorEnum) Reset()         { *m = KeywordPlanAdGroupErrorEnum{} }
+func (m *KeywordPlanAdGroupErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanAdGroupErrorEnum) ProtoMessage()    {}
+func (*KeywordPlanAdGroupErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ac04c755a98bdfee, []int{0}
+}
+
+func (m *KeywordPlanAdGroupErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanAdGroupErrorEnum.Unmarshal(m, b)
+}
+func (m *KeywordPlanAdGroupErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanAdGroupErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanAdGroupErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanAdGroupErrorEnum.Merge(m, src)
+}
+func (m *KeywordPlanAdGroupErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanAdGroupErrorEnum.Size(m)
+}
+func (m *KeywordPlanAdGroupErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanAdGroupErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanAdGroupErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError", KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError_name, KeywordPlanAdGroupErrorEnum_KeywordPlanAdGroupError_value)
+	proto.RegisterType((*KeywordPlanAdGroupErrorEnum)(nil), "google.ads.googleads.v3.errors.KeywordPlanAdGroupErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/keyword_plan_ad_group_error.proto", fileDescriptor_ac04c755a98bdfee)
+}
+
+var fileDescriptor_ac04c755a98bdfee = []byte{
+	// 324 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcd, 0x4a, 0xf3, 0x40,
+	0x14, 0xfd, 0x9a, 0xc2, 0x27, 0x4c, 0x45, 0x43, 0x36, 0x82, 0x96, 0x2e, 0xf2, 0x00, 0x93, 0x45,
+	0x76, 0xe3, 0xc6, 0x69, 0x13, 0x4b, 0x68, 0x1d, 0x03, 0xda, 0x08, 0x12, 0x09, 0xa3, 0x13, 0x86,
+	0x62, 0x3a, 0x13, 0x66, 0xda, 0x8a, 0xe0, 0xd3, 0xb8, 0xf4, 0x51, 0x7c, 0x14, 0x5f, 0xc0, 0xad,
+	0x24, 0xd7, 0x76, 0x17, 0x57, 0x73, 0x98, 0x7b, 0x7e, 0xee, 0xb9, 0xe8, 0x42, 0x6a, 0x2d, 0xab,
+	0x32, 0xe0, 0xc2, 0x06, 0x00, 0x1b, 0xb4, 0x0d, 0x83, 0xd2, 0x18, 0x6d, 0x6c, 0xf0, 0x5c, 0xbe,
+	0xbe, 0x68, 0x23, 0x8a, 0xba, 0xe2, 0xaa, 0xe0, 0xa2, 0x90, 0x46, 0x6f, 0xea, 0xa2, 0x1d, 0xe2,
+	0xda, 0xe8, 0xb5, 0xf6, 0x46, 0x20, 0xc3, 0x5c, 0x58, 0xbc, 0x77, 0xc0, 0xdb, 0x10, 0x83, 0xc3,
+	0xe9, 0x70, 0x97, 0x50, 0x2f, 0x03, 0xae, 0x94, 0x5e, 0xf3, 0xf5, 0x52, 0x2b, 0x0b, 0x6a, 0xff,
+	0x0d, 0x9d, 0xcd, 0x20, 0x22, 0xad, 0xb8, 0xa2, 0x62, 0xda, 0xf8, 0xc7, 0x8d, 0x32, 0x56, 0x9b,
+	0x95, 0xff, 0x80, 0x4e, 0x3a, 0xc6, 0xde, 0x31, 0x1a, 0x2c, 0xd8, 0x4d, 0x1a, 0x4f, 0x92, 0xcb,
+	0x24, 0x8e, 0xdc, 0x7f, 0xde, 0x00, 0x1d, 0x2c, 0xd8, 0x8c, 0x5d, 0xdf, 0x31, 0xb7, 0xe7, 0xb9,
+	0xe8, 0x30, 0x61, 0x19, 0x9d, 0x27, 0x51, 0xc1, 0xe8, 0x55, 0xec, 0x3a, 0x9e, 0x87, 0x8e, 0xa2,
+	0x45, 0x3a, 0x4f, 0x26, 0xf4, 0x36, 0x86, 0xbf, 0xfe, 0xf8, 0xbb, 0x87, 0xfc, 0x27, 0xbd, 0xc2,
+	0x7f, 0x57, 0x18, 0x0f, 0x3b, 0x76, 0x48, 0x9b, 0x0a, 0x69, 0xef, 0x3e, 0xfa, 0xd5, 0x4b, 0x5d,
+	0x71, 0x25, 0xb1, 0x36, 0x32, 0x90, 0xa5, 0x6a, 0x0b, 0xee, 0x8e, 0x5a, 0x2f, 0x6d, 0xd7, 0x8d,
+	0xcf, 0xe1, 0x79, 0x77, 0xfa, 0x53, 0x4a, 0x3f, 0x9c, 0xd1, 0x14, 0xcc, 0xa8, 0xb0, 0x18, 0x60,
+	0x83, 0xb2, 0x10, 0xb7, 0x91, 0xf6, 0x73, 0x47, 0xc8, 0xa9, 0xb0, 0xf9, 0x9e, 0x90, 0x67, 0x61,
+	0x0e, 0x84, 0x2f, 0xc7, 0x87, 0x5f, 0x42, 0xa8, 0xb0, 0x84, 0xec, 0x29, 0x84, 0x64, 0x21, 0x21,
+	0x40, 0x7a, 0xfc, 0xdf, 0x6e, 0x17, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x36, 0x45, 0x78, 0xc9,
+	0x00, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/keyword_plan_campaign_error.pb.go b/googleapis/ads/googleads/v3/errors/keyword_plan_campaign_error.pb.go
new file mode 100644
index 0000000..612a5b1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/keyword_plan_campaign_error.pb.go
@@ -0,0 +1,142 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/keyword_plan_campaign_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible errors from applying a keyword plan campaign.
+type KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError int32
+
+const (
+	// Enum unspecified.
+	KeywordPlanCampaignErrorEnum_UNSPECIFIED KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 0
+	// The received error code is not known in this version.
+	KeywordPlanCampaignErrorEnum_UNKNOWN KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 1
+	// A keyword plan campaign name is missing, empty, longer than allowed limit
+	// or contains invalid chars.
+	KeywordPlanCampaignErrorEnum_INVALID_NAME KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 2
+	// A keyword plan campaign contains one or more untargetable languages.
+	KeywordPlanCampaignErrorEnum_INVALID_LANGUAGES KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 3
+	// A keyword plan campaign contains one or more invalid geo targets.
+	KeywordPlanCampaignErrorEnum_INVALID_GEOS KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 4
+	// The keyword plan campaign name is duplicate to an existing keyword plan
+	// campaign name or other keyword plan campaign name in the request.
+	KeywordPlanCampaignErrorEnum_DUPLICATE_NAME KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 5
+	// The number of geo targets in the keyword plan campaign exceeds limits.
+	KeywordPlanCampaignErrorEnum_MAX_GEOS_EXCEEDED KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 6
+)
+
+var KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INVALID_NAME",
+	3: "INVALID_LANGUAGES",
+	4: "INVALID_GEOS",
+	5: "DUPLICATE_NAME",
+	6: "MAX_GEOS_EXCEEDED",
+}
+
+var KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_value = map[string]int32{
+	"UNSPECIFIED":       0,
+	"UNKNOWN":           1,
+	"INVALID_NAME":      2,
+	"INVALID_LANGUAGES": 3,
+	"INVALID_GEOS":      4,
+	"DUPLICATE_NAME":    5,
+	"MAX_GEOS_EXCEEDED": 6,
+}
+
+func (x KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError) String() string {
+	return proto.EnumName(KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_name, int32(x))
+}
+
+func (KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_919a79ad2f4c50d2, []int{0, 0}
+}
+
+// Container for enum describing possible errors from applying a keyword plan
+// campaign.
+type KeywordPlanCampaignErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordPlanCampaignErrorEnum) Reset()         { *m = KeywordPlanCampaignErrorEnum{} }
+func (m *KeywordPlanCampaignErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanCampaignErrorEnum) ProtoMessage()    {}
+func (*KeywordPlanCampaignErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_919a79ad2f4c50d2, []int{0}
+}
+
+func (m *KeywordPlanCampaignErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanCampaignErrorEnum.Unmarshal(m, b)
+}
+func (m *KeywordPlanCampaignErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanCampaignErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanCampaignErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanCampaignErrorEnum.Merge(m, src)
+}
+func (m *KeywordPlanCampaignErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanCampaignErrorEnum.Size(m)
+}
+func (m *KeywordPlanCampaignErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanCampaignErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanCampaignErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError", KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_name, KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_value)
+	proto.RegisterType((*KeywordPlanCampaignErrorEnum)(nil), "google.ads.googleads.v3.errors.KeywordPlanCampaignErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/keyword_plan_campaign_error.proto", fileDescriptor_919a79ad2f4c50d2)
+}
+
+var fileDescriptor_919a79ad2f4c50d2 = []byte{
+	// 366 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xc1, 0x4e, 0xab, 0x40,
+	0x18, 0x85, 0x2f, 0xf4, 0xde, 0xde, 0x64, 0x7a, 0x73, 0x45, 0x12, 0x13, 0x63, 0x6a, 0x17, 0x3c,
+	0xc0, 0xb0, 0x60, 0x37, 0x6e, 0x9c, 0xc2, 0x48, 0x48, 0x5b, 0x4a, 0x52, 0xc1, 0xc6, 0x90, 0x90,
+	0xb1, 0x10, 0x42, 0xa4, 0x33, 0x84, 0xa9, 0x35, 0xbe, 0x8c, 0x0b, 0x97, 0xbe, 0x84, 0x7b, 0x1f,
+	0xc5, 0x27, 0x70, 0x69, 0x60, 0x4a, 0xe3, 0xa6, 0xae, 0x38, 0xf9, 0xf9, 0xce, 0x39, 0xf0, 0xff,
+	0xe0, 0x32, 0xe7, 0x3c, 0x2f, 0x33, 0x93, 0xa6, 0xc2, 0x94, 0xb2, 0x51, 0x5b, 0xcb, 0xcc, 0xea,
+	0x9a, 0xd7, 0xc2, 0xbc, 0xcf, 0x9e, 0x1e, 0x79, 0x9d, 0x26, 0x55, 0x49, 0x59, 0xb2, 0xa2, 0xeb,
+	0x8a, 0x16, 0x39, 0x4b, 0xda, 0x97, 0xb0, 0xaa, 0xf9, 0x86, 0xeb, 0x23, 0x69, 0x83, 0x34, 0x15,
+	0x70, 0x9f, 0x00, 0xb7, 0x16, 0x94, 0x09, 0x67, 0xc3, 0xae, 0xa1, 0x2a, 0x4c, 0xca, 0x18, 0xdf,
+	0xd0, 0x4d, 0xc1, 0x99, 0x90, 0x6e, 0xe3, 0x4d, 0x01, 0xc3, 0x89, 0xec, 0x08, 0x4a, 0xca, 0xec,
+	0x5d, 0x03, 0x69, 0xbc, 0x84, 0x3d, 0xac, 0x8d, 0x67, 0x05, 0x9c, 0x1e, 0x02, 0xf4, 0x23, 0x30,
+	0x08, 0xfd, 0x45, 0x40, 0x6c, 0xef, 0xca, 0x23, 0x8e, 0xf6, 0x4b, 0x1f, 0x80, 0xbf, 0xa1, 0x3f,
+	0xf1, 0xe7, 0x37, 0xbe, 0xa6, 0xe8, 0x1a, 0xf8, 0xe7, 0xf9, 0x11, 0x9e, 0x7a, 0x4e, 0xe2, 0xe3,
+	0x19, 0xd1, 0x54, 0xfd, 0x04, 0x1c, 0x77, 0x93, 0x29, 0xf6, 0xdd, 0x10, 0xbb, 0x64, 0xa1, 0xf5,
+	0xbe, 0x83, 0x2e, 0x99, 0x2f, 0xb4, 0xdf, 0xba, 0x0e, 0xfe, 0x3b, 0x61, 0x30, 0xf5, 0x6c, 0x7c,
+	0x4d, 0xa4, 0xf9, 0x4f, 0x63, 0x9e, 0xe1, 0x65, 0x4b, 0x24, 0x64, 0x69, 0x13, 0xe2, 0x10, 0x47,
+	0xeb, 0x8f, 0x3f, 0x15, 0x60, 0xac, 0xf8, 0x1a, 0xfe, 0xbc, 0x86, 0xf1, 0xf9, 0xa1, 0x9f, 0x08,
+	0x9a, 0x3d, 0x04, 0xca, 0xad, 0xb3, 0x0b, 0xc8, 0x79, 0x49, 0x59, 0x0e, 0x79, 0x9d, 0x9b, 0x79,
+	0xc6, 0xda, 0x2d, 0x75, 0x97, 0xa9, 0x0a, 0x71, 0xe8, 0x50, 0x17, 0xf2, 0xf1, 0xa2, 0xf6, 0x5c,
+	0x8c, 0x5f, 0xd5, 0x91, 0x2b, 0xc3, 0x70, 0x2a, 0xa0, 0x94, 0x8d, 0x8a, 0x2c, 0xd8, 0x56, 0x8a,
+	0xf7, 0x0e, 0x88, 0x71, 0x2a, 0xe2, 0x3d, 0x10, 0x47, 0x56, 0x2c, 0x81, 0x0f, 0xd5, 0x90, 0x53,
+	0x84, 0x70, 0x2a, 0x10, 0xda, 0x23, 0x08, 0x45, 0x16, 0x42, 0x12, 0xba, 0xeb, 0xb7, 0x5f, 0x67,
+	0x7d, 0x05, 0x00, 0x00, 0xff, 0xff, 0x8e, 0xd2, 0x49, 0x66, 0x45, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/keyword_plan_error.pb.go b/googleapis/ads/googleads/v3/errors/keyword_plan_error.pb.go
new file mode 100644
index 0000000..5195401
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/keyword_plan_error.pb.go
@@ -0,0 +1,187 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/keyword_plan_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible errors from applying a keyword plan.
+type KeywordPlanErrorEnum_KeywordPlanError int32
+
+const (
+	// Enum unspecified.
+	KeywordPlanErrorEnum_UNSPECIFIED KeywordPlanErrorEnum_KeywordPlanError = 0
+	// The received error code is not known in this version.
+	KeywordPlanErrorEnum_UNKNOWN KeywordPlanErrorEnum_KeywordPlanError = 1
+	// The plan's bid multiplier value is outside the valid range.
+	KeywordPlanErrorEnum_BID_MULTIPLIER_OUT_OF_RANGE KeywordPlanErrorEnum_KeywordPlanError = 2
+	// The plan's bid value is too high.
+	KeywordPlanErrorEnum_BID_TOO_HIGH KeywordPlanErrorEnum_KeywordPlanError = 3
+	// The plan's bid value is too low.
+	KeywordPlanErrorEnum_BID_TOO_LOW KeywordPlanErrorEnum_KeywordPlanError = 4
+	// The plan's cpc bid is not a multiple of the minimum billable unit.
+	KeywordPlanErrorEnum_BID_TOO_MANY_FRACTIONAL_DIGITS KeywordPlanErrorEnum_KeywordPlanError = 5
+	// The plan's daily budget value is too low.
+	KeywordPlanErrorEnum_DAILY_BUDGET_TOO_LOW KeywordPlanErrorEnum_KeywordPlanError = 6
+	// The plan's daily budget is not a multiple of the minimum billable unit.
+	KeywordPlanErrorEnum_DAILY_BUDGET_TOO_MANY_FRACTIONAL_DIGITS KeywordPlanErrorEnum_KeywordPlanError = 7
+	// The input has an invalid value.
+	KeywordPlanErrorEnum_INVALID_VALUE KeywordPlanErrorEnum_KeywordPlanError = 8
+	// The plan has no keyword.
+	KeywordPlanErrorEnum_KEYWORD_PLAN_HAS_NO_KEYWORDS KeywordPlanErrorEnum_KeywordPlanError = 9
+	// The plan is not enabled and API cannot provide mutation, forecast or
+	// stats.
+	KeywordPlanErrorEnum_KEYWORD_PLAN_NOT_ENABLED KeywordPlanErrorEnum_KeywordPlanError = 10
+	// The requested plan cannot be found for providing forecast or stats.
+	KeywordPlanErrorEnum_KEYWORD_PLAN_NOT_FOUND KeywordPlanErrorEnum_KeywordPlanError = 11
+	// The plan is missing a cpc bid.
+	KeywordPlanErrorEnum_MISSING_BID KeywordPlanErrorEnum_KeywordPlanError = 13
+	// The plan is missing required forecast_period field.
+	KeywordPlanErrorEnum_MISSING_FORECAST_PERIOD KeywordPlanErrorEnum_KeywordPlanError = 14
+	// The plan's forecast_period has invalid forecast date range.
+	KeywordPlanErrorEnum_INVALID_FORECAST_DATE_RANGE KeywordPlanErrorEnum_KeywordPlanError = 15
+	// The plan's name is invalid.
+	KeywordPlanErrorEnum_INVALID_NAME KeywordPlanErrorEnum_KeywordPlanError = 16
+)
+
+var KeywordPlanErrorEnum_KeywordPlanError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "BID_MULTIPLIER_OUT_OF_RANGE",
+	3:  "BID_TOO_HIGH",
+	4:  "BID_TOO_LOW",
+	5:  "BID_TOO_MANY_FRACTIONAL_DIGITS",
+	6:  "DAILY_BUDGET_TOO_LOW",
+	7:  "DAILY_BUDGET_TOO_MANY_FRACTIONAL_DIGITS",
+	8:  "INVALID_VALUE",
+	9:  "KEYWORD_PLAN_HAS_NO_KEYWORDS",
+	10: "KEYWORD_PLAN_NOT_ENABLED",
+	11: "KEYWORD_PLAN_NOT_FOUND",
+	13: "MISSING_BID",
+	14: "MISSING_FORECAST_PERIOD",
+	15: "INVALID_FORECAST_DATE_RANGE",
+	16: "INVALID_NAME",
+}
+
+var KeywordPlanErrorEnum_KeywordPlanError_value = map[string]int32{
+	"UNSPECIFIED":                             0,
+	"UNKNOWN":                                 1,
+	"BID_MULTIPLIER_OUT_OF_RANGE":             2,
+	"BID_TOO_HIGH":                            3,
+	"BID_TOO_LOW":                             4,
+	"BID_TOO_MANY_FRACTIONAL_DIGITS":          5,
+	"DAILY_BUDGET_TOO_LOW":                    6,
+	"DAILY_BUDGET_TOO_MANY_FRACTIONAL_DIGITS": 7,
+	"INVALID_VALUE":                           8,
+	"KEYWORD_PLAN_HAS_NO_KEYWORDS":            9,
+	"KEYWORD_PLAN_NOT_ENABLED":                10,
+	"KEYWORD_PLAN_NOT_FOUND":                  11,
+	"MISSING_BID":                             13,
+	"MISSING_FORECAST_PERIOD":                 14,
+	"INVALID_FORECAST_DATE_RANGE":             15,
+	"INVALID_NAME":                            16,
+}
+
+func (x KeywordPlanErrorEnum_KeywordPlanError) String() string {
+	return proto.EnumName(KeywordPlanErrorEnum_KeywordPlanError_name, int32(x))
+}
+
+func (KeywordPlanErrorEnum_KeywordPlanError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_93fd9cdbc08c3d07, []int{0, 0}
+}
+
+// Container for enum describing possible errors from applying a keyword plan
+// resource (keyword plan, keyword plan campaign, keyword plan ad group or
+// keyword plan keyword) or KeywordPlanService RPC.
+type KeywordPlanErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordPlanErrorEnum) Reset()         { *m = KeywordPlanErrorEnum{} }
+func (m *KeywordPlanErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanErrorEnum) ProtoMessage()    {}
+func (*KeywordPlanErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_93fd9cdbc08c3d07, []int{0}
+}
+
+func (m *KeywordPlanErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanErrorEnum.Unmarshal(m, b)
+}
+func (m *KeywordPlanErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanErrorEnum.Merge(m, src)
+}
+func (m *KeywordPlanErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanErrorEnum.Size(m)
+}
+func (m *KeywordPlanErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.KeywordPlanErrorEnum_KeywordPlanError", KeywordPlanErrorEnum_KeywordPlanError_name, KeywordPlanErrorEnum_KeywordPlanError_value)
+	proto.RegisterType((*KeywordPlanErrorEnum)(nil), "google.ads.googleads.v3.errors.KeywordPlanErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/keyword_plan_error.proto", fileDescriptor_93fd9cdbc08c3d07)
+}
+
+var fileDescriptor_93fd9cdbc08c3d07 = []byte{
+	// 506 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x4f, 0x6f, 0xd3, 0x30,
+	0x18, 0xc6, 0x69, 0x0b, 0x1b, 0xb8, 0x8c, 0x19, 0x6b, 0xc0, 0xb4, 0x55, 0x05, 0xf5, 0xc2, 0x01,
+	0x29, 0x39, 0xe4, 0x80, 0x14, 0x4e, 0x4e, 0xed, 0xa6, 0x56, 0x53, 0x3b, 0xca, 0x9f, 0x56, 0x45,
+	0x95, 0xac, 0x40, 0xaa, 0xa8, 0xa2, 0x8b, 0xab, 0xa4, 0x0c, 0xf1, 0x75, 0x38, 0x72, 0xe1, 0x6b,
+	0x20, 0x3e, 0x0a, 0x27, 0x3e, 0x02, 0x4a, 0xdd, 0x44, 0x62, 0xd3, 0x38, 0xe5, 0xd5, 0xf3, 0xfe,
+	0x9e, 0x27, 0x8e, 0xf3, 0x80, 0xb7, 0x99, 0x52, 0xd9, 0x66, 0x65, 0x26, 0x69, 0x69, 0xea, 0xb1,
+	0x9a, 0xae, 0x2d, 0x73, 0x55, 0x14, 0xaa, 0x28, 0xcd, 0x4f, 0xab, 0xaf, 0x5f, 0x54, 0x91, 0xca,
+	0xed, 0x26, 0xc9, 0xe5, 0x5e, 0x33, 0xb6, 0x85, 0xda, 0x29, 0xd4, 0xd7, 0xb4, 0x91, 0xa4, 0xa5,
+	0xd1, 0x18, 0x8d, 0x6b, 0xcb, 0xd0, 0xc6, 0x8b, 0x5e, 0x1d, 0xbc, 0x5d, 0x9b, 0x49, 0x9e, 0xab,
+	0x5d, 0xb2, 0x5b, 0xab, 0xbc, 0xd4, 0xee, 0xc1, 0xcf, 0x0e, 0x38, 0x9b, 0xe8, 0x68, 0x7f, 0x93,
+	0xe4, 0xb4, 0xf2, 0xd0, 0xfc, 0xf3, 0xd5, 0xe0, 0x47, 0x07, 0xc0, 0x9b, 0x0b, 0x74, 0x0a, 0xba,
+	0x31, 0x0f, 0x7d, 0x3a, 0x64, 0x23, 0x46, 0x09, 0xbc, 0x87, 0xba, 0xe0, 0x38, 0xe6, 0x13, 0x2e,
+	0xe6, 0x1c, 0xb6, 0xd0, 0x4b, 0x70, 0xe9, 0x30, 0x22, 0xa7, 0xb1, 0x17, 0x31, 0xdf, 0x63, 0x34,
+	0x90, 0x22, 0x8e, 0xa4, 0x18, 0xc9, 0x00, 0x73, 0x97, 0xc2, 0x36, 0x82, 0xe0, 0x71, 0x05, 0x44,
+	0x42, 0xc8, 0x31, 0x73, 0xc7, 0xb0, 0x53, 0x05, 0xd6, 0x8a, 0x27, 0xe6, 0xf0, 0x3e, 0x1a, 0x80,
+	0x7e, 0x2d, 0x4c, 0x31, 0x5f, 0xc8, 0x51, 0x80, 0x87, 0x11, 0x13, 0x1c, 0x7b, 0x92, 0x30, 0x97,
+	0x45, 0x21, 0x7c, 0x80, 0xce, 0xc1, 0x19, 0xc1, 0xcc, 0x5b, 0x48, 0x27, 0x26, 0x2e, 0x8d, 0x1a,
+	0xf7, 0x11, 0x7a, 0x03, 0x5e, 0xdf, 0xda, 0xdc, 0x11, 0x73, 0x8c, 0x9e, 0x82, 0x13, 0xc6, 0x67,
+	0xd8, 0x63, 0x44, 0xce, 0xb0, 0x17, 0x53, 0xf8, 0x10, 0xbd, 0x02, 0xbd, 0x09, 0x5d, 0xcc, 0x45,
+	0x40, 0xa4, 0xef, 0x61, 0x2e, 0xc7, 0x38, 0x94, 0x5c, 0xc8, 0x83, 0x16, 0xc2, 0x47, 0xa8, 0x07,
+	0xce, 0xff, 0x21, 0xb8, 0x88, 0x24, 0xe5, 0xd8, 0xf1, 0x28, 0x81, 0x00, 0x5d, 0x80, 0xe7, 0xb7,
+	0xb6, 0x23, 0x11, 0x73, 0x02, 0xbb, 0xd5, 0xa7, 0x4e, 0x59, 0x18, 0x32, 0xee, 0x4a, 0x87, 0x11,
+	0x78, 0x82, 0x2e, 0xc1, 0x8b, 0x5a, 0x18, 0x89, 0x80, 0x0e, 0x71, 0x18, 0x49, 0x9f, 0x06, 0x4c,
+	0x10, 0xf8, 0xa4, 0xba, 0xcb, 0xfa, 0x70, 0xcd, 0x92, 0xe0, 0x88, 0x1e, 0xee, 0xf2, 0xb4, 0xba,
+	0xcb, 0x1a, 0xe0, 0x78, 0x4a, 0x21, 0x74, 0xfe, 0xb4, 0xc0, 0xe0, 0xa3, 0xba, 0x32, 0xfe, 0xdf,
+	0x07, 0xe7, 0xd9, 0xcd, 0xbf, 0xea, 0x57, 0x45, 0xf0, 0x5b, 0xef, 0xc9, 0xc1, 0x98, 0xa9, 0x4d,
+	0x92, 0x67, 0x86, 0x2a, 0x32, 0x33, 0x5b, 0xe5, 0xfb, 0x9a, 0xd4, 0x8d, 0xdc, 0xae, 0xcb, 0xbb,
+	0x0a, 0xfa, 0x4e, 0x3f, 0xbe, 0xb5, 0x3b, 0x2e, 0xc6, 0xdf, 0xdb, 0x7d, 0x57, 0x87, 0xe1, 0xb4,
+	0x34, 0xf4, 0x58, 0x4d, 0x33, 0xcb, 0xd8, 0xbf, 0xb2, 0xfc, 0x55, 0x03, 0x4b, 0x9c, 0x96, 0xcb,
+	0x06, 0x58, 0xce, 0xac, 0xa5, 0x06, 0x7e, 0xb7, 0x07, 0x5a, 0xb5, 0x6d, 0x9c, 0x96, 0xb6, 0xdd,
+	0x20, 0xb6, 0x3d, 0xb3, 0x6c, 0x5b, 0x43, 0x1f, 0x8e, 0xf6, 0xa7, 0xb3, 0xfe, 0x06, 0x00, 0x00,
+	0xff, 0xff, 0xec, 0x38, 0x0a, 0xed, 0x3d, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/keyword_plan_idea_error.pb.go b/googleapis/ads/googleads/v3/errors/keyword_plan_idea_error.pb.go
new file mode 100644
index 0000000..f0ee61b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/keyword_plan_idea_error.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/keyword_plan_idea_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible errors from KeywordPlanIdeaService.
+type KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError int32
+
+const (
+	// Enum unspecified.
+	KeywordPlanIdeaErrorEnum_UNSPECIFIED KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError = 0
+	// The received error code is not known in this version.
+	KeywordPlanIdeaErrorEnum_UNKNOWN KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError = 1
+	// Error when crawling the input URL.
+	KeywordPlanIdeaErrorEnum_URL_CRAWL_ERROR KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError = 2
+	// The input has an invalid value.
+	KeywordPlanIdeaErrorEnum_INVALID_VALUE KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError = 3
+)
+
+var KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "URL_CRAWL_ERROR",
+	3: "INVALID_VALUE",
+}
+
+var KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError_value = map[string]int32{
+	"UNSPECIFIED":     0,
+	"UNKNOWN":         1,
+	"URL_CRAWL_ERROR": 2,
+	"INVALID_VALUE":   3,
+}
+
+func (x KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError) String() string {
+	return proto.EnumName(KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError_name, int32(x))
+}
+
+func (KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8882a7b91aa207aa, []int{0, 0}
+}
+
+// Container for enum describing possible errors from KeywordPlanIdeaService.
+type KeywordPlanIdeaErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordPlanIdeaErrorEnum) Reset()         { *m = KeywordPlanIdeaErrorEnum{} }
+func (m *KeywordPlanIdeaErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanIdeaErrorEnum) ProtoMessage()    {}
+func (*KeywordPlanIdeaErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8882a7b91aa207aa, []int{0}
+}
+
+func (m *KeywordPlanIdeaErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanIdeaErrorEnum.Unmarshal(m, b)
+}
+func (m *KeywordPlanIdeaErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanIdeaErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanIdeaErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanIdeaErrorEnum.Merge(m, src)
+}
+func (m *KeywordPlanIdeaErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanIdeaErrorEnum.Size(m)
+}
+func (m *KeywordPlanIdeaErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanIdeaErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanIdeaErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError", KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError_name, KeywordPlanIdeaErrorEnum_KeywordPlanIdeaError_value)
+	proto.RegisterType((*KeywordPlanIdeaErrorEnum)(nil), "google.ads.googleads.v3.errors.KeywordPlanIdeaErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/keyword_plan_idea_error.proto", fileDescriptor_8882a7b91aa207aa)
+}
+
+var fileDescriptor_8882a7b91aa207aa = []byte{
+	// 324 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
+	0x1c, 0xc6, 0x5d, 0x07, 0x0a, 0x19, 0xb2, 0x5a, 0x3d, 0xa8, 0xc8, 0x0e, 0x7d, 0x80, 0xf4, 0xd0,
+	0x5b, 0xf4, 0x92, 0x6d, 0x75, 0x94, 0x95, 0xae, 0x54, 0xda, 0x81, 0x14, 0x4a, 0x34, 0x21, 0x14,
+	0xbb, 0xa4, 0x24, 0x73, 0xea, 0xeb, 0x78, 0xf4, 0x51, 0x7c, 0x14, 0xcf, 0x3e, 0x80, 0xb4, 0x71,
+	0x3b, 0x4d, 0x4f, 0xf9, 0xc8, 0xff, 0xfb, 0x7d, 0xf9, 0xf2, 0x07, 0x37, 0x5c, 0x4a, 0x5e, 0x33,
+	0x8f, 0x50, 0xed, 0x19, 0xd9, 0xaa, 0x8d, 0xef, 0x31, 0xa5, 0xa4, 0xd2, 0xde, 0x13, 0x7b, 0x7b,
+	0x91, 0x8a, 0x96, 0x4d, 0x4d, 0x44, 0x59, 0x51, 0x46, 0xca, 0x6e, 0x00, 0x1b, 0x25, 0xd7, 0xd2,
+	0x19, 0x19, 0x04, 0x12, 0xaa, 0xe1, 0x8e, 0x86, 0x1b, 0x1f, 0x1a, 0xfa, 0xf2, 0x6a, 0x9b, 0xde,
+	0x54, 0x1e, 0x11, 0x42, 0xae, 0xc9, 0xba, 0x92, 0x42, 0x1b, 0xda, 0x7d, 0x05, 0xe7, 0x73, 0x13,
+	0x9f, 0xd4, 0x44, 0x84, 0x94, 0x91, 0xa0, 0xc5, 0x02, 0xf1, 0xbc, 0x72, 0x0b, 0x70, 0xb6, 0x6f,
+	0xe6, 0x0c, 0xc1, 0x20, 0x8b, 0xef, 0x92, 0x60, 0x12, 0xde, 0x86, 0xc1, 0xd4, 0x3e, 0x70, 0x06,
+	0xe0, 0x28, 0x8b, 0xe7, 0xf1, 0x62, 0x19, 0xdb, 0x3d, 0xe7, 0x14, 0x0c, 0xb3, 0x34, 0x2a, 0x27,
+	0x29, 0x5e, 0x46, 0x65, 0x90, 0xa6, 0x8b, 0xd4, 0xb6, 0x9c, 0x13, 0x70, 0x1c, 0xc6, 0x39, 0x8e,
+	0xc2, 0x69, 0x99, 0xe3, 0x28, 0x0b, 0xec, 0xfe, 0xf8, 0xbb, 0x07, 0xdc, 0x47, 0xb9, 0x82, 0xff,
+	0xd7, 0x1f, 0x5f, 0xec, 0xab, 0x90, 0xb4, 0xdd, 0x93, 0xde, 0xfd, 0xf4, 0x17, 0xe6, 0xb2, 0x26,
+	0x82, 0x43, 0xa9, 0xb8, 0xc7, 0x99, 0xe8, 0x7e, 0xb6, 0xdd, 0x64, 0x53, 0xe9, 0xbf, 0x16, 0x7b,
+	0x6d, 0x8e, 0x77, 0xab, 0x3f, 0xc3, 0xf8, 0xc3, 0x1a, 0xcd, 0x4c, 0x18, 0xa6, 0x1a, 0x1a, 0xd9,
+	0xaa, 0xdc, 0x87, 0xdd, 0x93, 0xfa, 0x73, 0x6b, 0x28, 0x30, 0xd5, 0xc5, 0xce, 0x50, 0xe4, 0x7e,
+	0x61, 0x0c, 0x5f, 0x96, 0x6b, 0x6e, 0x11, 0xc2, 0x54, 0x23, 0xb4, 0xb3, 0x20, 0x94, 0xfb, 0x08,
+	0x19, 0xd3, 0xc3, 0x61, 0xd7, 0xce, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x72, 0x8f, 0x66, 0x11,
+	0xf5, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/keyword_plan_keyword_error.pb.go b/googleapis/ads/googleads/v3/errors/keyword_plan_keyword_error.pb.go
new file mode 100644
index 0000000..8ca67fb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/keyword_plan_keyword_error.pb.go
@@ -0,0 +1,147 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/keyword_plan_keyword_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible errors from applying a keyword plan keyword.
+type KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError int32
+
+const (
+	// Enum unspecified.
+	KeywordPlanKeywordErrorEnum_UNSPECIFIED KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError = 0
+	// The received error code is not known in this version.
+	KeywordPlanKeywordErrorEnum_UNKNOWN KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError = 1
+	// A keyword or negative keyword has invalid match type.
+	KeywordPlanKeywordErrorEnum_INVALID_KEYWORD_MATCH_TYPE KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError = 2
+	// A keyword or negative keyword with same text and match type already
+	// exists.
+	KeywordPlanKeywordErrorEnum_DUPLICATE_KEYWORD KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError = 3
+	// Keyword or negative keyword text exceeds the allowed limit.
+	KeywordPlanKeywordErrorEnum_KEYWORD_TEXT_TOO_LONG KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError = 4
+	// Keyword or negative keyword text has invalid characters or symbols.
+	KeywordPlanKeywordErrorEnum_KEYWORD_HAS_INVALID_CHARS KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError = 5
+	// Keyword or negative keyword text has too many words.
+	KeywordPlanKeywordErrorEnum_KEYWORD_HAS_TOO_MANY_WORDS KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError = 6
+	// Keyword or negative keyword has invalid text.
+	KeywordPlanKeywordErrorEnum_INVALID_KEYWORD_TEXT KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError = 7
+)
+
+var KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INVALID_KEYWORD_MATCH_TYPE",
+	3: "DUPLICATE_KEYWORD",
+	4: "KEYWORD_TEXT_TOO_LONG",
+	5: "KEYWORD_HAS_INVALID_CHARS",
+	6: "KEYWORD_HAS_TOO_MANY_WORDS",
+	7: "INVALID_KEYWORD_TEXT",
+}
+
+var KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError_value = map[string]int32{
+	"UNSPECIFIED":                0,
+	"UNKNOWN":                    1,
+	"INVALID_KEYWORD_MATCH_TYPE": 2,
+	"DUPLICATE_KEYWORD":          3,
+	"KEYWORD_TEXT_TOO_LONG":      4,
+	"KEYWORD_HAS_INVALID_CHARS":  5,
+	"KEYWORD_HAS_TOO_MANY_WORDS": 6,
+	"INVALID_KEYWORD_TEXT":       7,
+}
+
+func (x KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError) String() string {
+	return proto.EnumName(KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError_name, int32(x))
+}
+
+func (KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0ba4e4719ffcf21f, []int{0, 0}
+}
+
+// Container for enum describing possible errors from applying a keyword or a
+// negative keyword from a keyword plan.
+type KeywordPlanKeywordErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordPlanKeywordErrorEnum) Reset()         { *m = KeywordPlanKeywordErrorEnum{} }
+func (m *KeywordPlanKeywordErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanKeywordErrorEnum) ProtoMessage()    {}
+func (*KeywordPlanKeywordErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ba4e4719ffcf21f, []int{0}
+}
+
+func (m *KeywordPlanKeywordErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanKeywordErrorEnum.Unmarshal(m, b)
+}
+func (m *KeywordPlanKeywordErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanKeywordErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanKeywordErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanKeywordErrorEnum.Merge(m, src)
+}
+func (m *KeywordPlanKeywordErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanKeywordErrorEnum.Size(m)
+}
+func (m *KeywordPlanKeywordErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanKeywordErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanKeywordErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError", KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError_name, KeywordPlanKeywordErrorEnum_KeywordPlanKeywordError_value)
+	proto.RegisterType((*KeywordPlanKeywordErrorEnum)(nil), "google.ads.googleads.v3.errors.KeywordPlanKeywordErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/keyword_plan_keyword_error.proto", fileDescriptor_0ba4e4719ffcf21f)
+}
+
+var fileDescriptor_0ba4e4719ffcf21f = []byte{
+	// 394 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xcd, 0x6e, 0xd3, 0x30,
+	0x00, 0xa6, 0x19, 0x6c, 0x92, 0x77, 0xc0, 0x58, 0x4c, 0xb0, 0x31, 0x7a, 0xc8, 0x03, 0x38, 0x87,
+	0xdc, 0xcc, 0x01, 0x79, 0x89, 0x69, 0xa3, 0x76, 0x49, 0xb4, 0xa4, 0x19, 0x45, 0x91, 0xac, 0x40,
+	0xa2, 0xa8, 0x22, 0xb3, 0xa3, 0xb8, 0x0c, 0x71, 0xe5, 0x51, 0x38, 0xf2, 0x28, 0x3c, 0x06, 0x47,
+	0x5e, 0x80, 0x2b, 0x72, 0x5c, 0x57, 0x08, 0xa9, 0x9c, 0xf2, 0xc5, 0xdf, 0x9f, 0xf5, 0x19, 0xbc,
+	0x6e, 0xa5, 0x6c, 0xbb, 0xc6, 0xab, 0x6a, 0xe5, 0x19, 0xa8, 0xd1, 0xbd, 0xef, 0x35, 0xc3, 0x20,
+	0x07, 0xe5, 0x7d, 0x6c, 0xbe, 0x7c, 0x96, 0x43, 0xcd, 0xfb, 0xae, 0x12, 0xdc, 0xfe, 0x8c, 0x1c,
+	0xee, 0x07, 0xb9, 0x95, 0x68, 0x6a, 0x5c, 0xb8, 0xaa, 0x15, 0xde, 0x07, 0xe0, 0x7b, 0x1f, 0x9b,
+	0x80, 0x8b, 0x4b, 0x5b, 0xd0, 0x6f, 0xbc, 0x4a, 0x08, 0xb9, 0xad, 0xb6, 0x1b, 0x29, 0x94, 0x71,
+	0xbb, 0x5f, 0x1d, 0xf0, 0x62, 0x61, 0x52, 0xd3, 0xae, 0x12, 0x3b, 0xc8, 0xb4, 0x95, 0x89, 0x4f,
+	0x77, 0xee, 0xcf, 0x09, 0x78, 0x76, 0x80, 0x47, 0x8f, 0xc1, 0xe9, 0x2a, 0xce, 0x52, 0x16, 0x44,
+	0x6f, 0x22, 0x16, 0xc2, 0x07, 0xe8, 0x14, 0x9c, 0xac, 0xe2, 0x45, 0x9c, 0xdc, 0xc6, 0x70, 0x82,
+	0xa6, 0xe0, 0x22, 0x8a, 0x0b, 0xba, 0x8c, 0x42, 0xbe, 0x60, 0xeb, 0xdb, 0xe4, 0x26, 0xe4, 0xd7,
+	0x34, 0x0f, 0xe6, 0x3c, 0x5f, 0xa7, 0x0c, 0x3a, 0xe8, 0x0c, 0x3c, 0x09, 0x57, 0xe9, 0x32, 0x0a,
+	0x68, 0xce, 0xac, 0x02, 0x1e, 0xa1, 0x73, 0x70, 0x66, 0xe5, 0x39, 0x7b, 0x9b, 0xf3, 0x3c, 0x49,
+	0xf8, 0x32, 0x89, 0x67, 0xf0, 0x21, 0x7a, 0x09, 0xce, 0x2d, 0x35, 0xa7, 0x19, 0xb7, 0xe9, 0xc1,
+	0x9c, 0xde, 0x64, 0xf0, 0x91, 0x2e, 0xfc, 0x9b, 0xd6, 0xc6, 0x6b, 0x1a, 0xaf, 0xb9, 0x3e, 0xc9,
+	0xe0, 0x31, 0x7a, 0x0e, 0x9e, 0xfe, 0x7b, 0x21, 0xdd, 0x00, 0x4f, 0xae, 0x7e, 0x4f, 0x80, 0xfb,
+	0x41, 0xde, 0xe1, 0xff, 0x2f, 0x79, 0x75, 0x79, 0x60, 0x88, 0x54, 0x2f, 0x99, 0x4e, 0xde, 0x85,
+	0x3b, 0x7f, 0x2b, 0xbb, 0x4a, 0xb4, 0x58, 0x0e, 0xad, 0xd7, 0x36, 0x62, 0xdc, 0xd9, 0x3e, 0x6d,
+	0xbf, 0x51, 0x87, 0x5e, 0xfa, 0x95, 0xf9, 0x7c, 0x73, 0x8e, 0x66, 0x94, 0x7e, 0x77, 0xa6, 0x33,
+	0x13, 0x46, 0x6b, 0x85, 0x0d, 0xd4, 0xa8, 0xf0, 0xf1, 0x58, 0xa9, 0x7e, 0x58, 0x41, 0x49, 0x6b,
+	0x55, 0xee, 0x05, 0x65, 0xe1, 0x97, 0x46, 0xf0, 0xcb, 0x71, 0xcd, 0x29, 0x21, 0xb4, 0x56, 0x84,
+	0xec, 0x25, 0x84, 0x14, 0x3e, 0x21, 0x46, 0xf4, 0xfe, 0x78, 0xbc, 0x9d, 0xff, 0x27, 0x00, 0x00,
+	0xff, 0xff, 0x49, 0xc0, 0xcb, 0xc7, 0x86, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/keyword_plan_negative_keyword_error.pb.go b/googleapis/ads/googleads/v3/errors/keyword_plan_negative_keyword_error.pb.go
new file mode 100644
index 0000000..ee75e25
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/keyword_plan_negative_keyword_error.pb.go
@@ -0,0 +1,117 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/keyword_plan_negative_keyword_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible errors from applying a keyword plan negative
+// keyword.
+type KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError int32
+
+const (
+	// Enum unspecified.
+	KeywordPlanNegativeKeywordErrorEnum_UNSPECIFIED KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError = 0
+	// The received error code is not known in this version.
+	KeywordPlanNegativeKeywordErrorEnum_UNKNOWN KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError = 1
+)
+
+var KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+}
+
+var KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+}
+
+func (x KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) String() string {
+	return proto.EnumName(KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_name, int32(x))
+}
+
+func (KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1d72670cdea957a8, []int{0, 0}
+}
+
+// Container for enum describing possible errors from applying a keyword plan
+// negative keyword.
+type KeywordPlanNegativeKeywordErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordPlanNegativeKeywordErrorEnum) Reset()         { *m = KeywordPlanNegativeKeywordErrorEnum{} }
+func (m *KeywordPlanNegativeKeywordErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanNegativeKeywordErrorEnum) ProtoMessage()    {}
+func (*KeywordPlanNegativeKeywordErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1d72670cdea957a8, []int{0}
+}
+
+func (m *KeywordPlanNegativeKeywordErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanNegativeKeywordErrorEnum.Unmarshal(m, b)
+}
+func (m *KeywordPlanNegativeKeywordErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanNegativeKeywordErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanNegativeKeywordErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanNegativeKeywordErrorEnum.Merge(m, src)
+}
+func (m *KeywordPlanNegativeKeywordErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanNegativeKeywordErrorEnum.Size(m)
+}
+func (m *KeywordPlanNegativeKeywordErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanNegativeKeywordErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanNegativeKeywordErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError", KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_name, KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_value)
+	proto.RegisterType((*KeywordPlanNegativeKeywordErrorEnum)(nil), "google.ads.googleads.v3.errors.KeywordPlanNegativeKeywordErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/keyword_plan_negative_keyword_error.proto", fileDescriptor_1d72670cdea957a8)
+}
+
+var fileDescriptor_1d72670cdea957a8 = []byte{
+	// 296 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x41, 0x4b, 0xc3, 0x30,
+	0x18, 0x86, 0xdd, 0x04, 0x85, 0xec, 0xe0, 0xe8, 0x51, 0x64, 0x42, 0xf5, 0x9c, 0x1c, 0x72, 0x8b,
+	0x07, 0xe9, 0x5c, 0x9d, 0x63, 0x50, 0x0b, 0xb2, 0x0a, 0x52, 0x28, 0xd1, 0xc4, 0x50, 0xec, 0x92,
+	0x92, 0xd4, 0x8a, 0x7f, 0xc7, 0xa3, 0x3f, 0xc5, 0x9f, 0xe2, 0x9f, 0x50, 0xda, 0xaf, 0xed, 0x4d,
+	0x77, 0xca, 0xcb, 0xc7, 0xf3, 0xbd, 0xef, 0x9b, 0x0f, 0xdd, 0x28, 0x63, 0x54, 0x21, 0x09, 0x17,
+	0x8e, 0x80, 0x6c, 0x54, 0x4d, 0x89, 0xb4, 0xd6, 0x58, 0x47, 0x5e, 0xe4, 0xfb, 0x9b, 0xb1, 0x22,
+	0x2b, 0x0b, 0xae, 0x33, 0x2d, 0x15, 0xaf, 0xf2, 0x5a, 0x66, 0xfd, 0xb4, 0x85, 0x70, 0x69, 0x4d,
+	0x65, 0xbc, 0x19, 0xac, 0x63, 0x2e, 0x1c, 0x1e, 0x9c, 0x70, 0x4d, 0x31, 0x38, 0x1d, 0x9f, 0xf4,
+	0x49, 0x65, 0x4e, 0xb8, 0xd6, 0xa6, 0xe2, 0x55, 0x6e, 0xb4, 0x83, 0x6d, 0xff, 0x19, 0x9d, 0xad,
+	0xc1, 0x34, 0x2e, 0xb8, 0x8e, 0xba, 0xa0, 0x6e, 0x14, 0x36, 0x0e, 0xa1, 0x7e, 0xdd, 0xfa, 0x97,
+	0xe8, 0x74, 0x07, 0xe6, 0x1d, 0xa1, 0xc9, 0x26, 0xba, 0x8b, 0xc3, 0xab, 0xd5, 0xf5, 0x2a, 0x5c,
+	0x4c, 0xf7, 0xbc, 0x09, 0x3a, 0xdc, 0x44, 0xeb, 0xe8, 0xf6, 0x3e, 0x9a, 0x8e, 0xe6, 0x3f, 0x23,
+	0xe4, 0x3f, 0x99, 0x2d, 0xfe, 0xbf, 0xec, 0xfc, 0x7c, 0x47, 0x4a, 0xdc, 0x94, 0x8e, 0x47, 0x0f,
+	0x8b, 0xce, 0x47, 0x99, 0x82, 0x6b, 0x85, 0x8d, 0x55, 0x44, 0x49, 0xdd, 0x7e, 0xa9, 0x3f, 0x67,
+	0x99, 0xbb, 0xbf, 0xae, 0x7b, 0x01, 0xcf, 0xc7, 0x78, 0x7f, 0x19, 0x04, 0x9f, 0xe3, 0xd9, 0x12,
+	0xcc, 0x02, 0xe1, 0x30, 0xc8, 0x46, 0x25, 0x14, 0xb7, 0x91, 0xee, 0xab, 0x07, 0xd2, 0x40, 0xb8,
+	0x74, 0x00, 0xd2, 0x84, 0xa6, 0x00, 0x7c, 0x8f, 0x7d, 0x98, 0x32, 0x16, 0x08, 0xc7, 0xd8, 0x80,
+	0x30, 0x96, 0x50, 0xc6, 0x00, 0x7a, 0x3c, 0x68, 0xdb, 0xd1, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x8a, 0x92, 0x1d, 0x9d, 0xfa, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/label_error.pb.go b/googleapis/ads/googleads/v3/errors/label_error.pb.go
new file mode 100644
index 0000000..6446a7d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/label_error.pb.go
@@ -0,0 +1,164 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/label_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible label errors.
+type LabelErrorEnum_LabelError int32
+
+const (
+	// Enum unspecified.
+	LabelErrorEnum_UNSPECIFIED LabelErrorEnum_LabelError = 0
+	// The received error code is not known in this version.
+	LabelErrorEnum_UNKNOWN LabelErrorEnum_LabelError = 1
+	// An inactive label cannot be applied.
+	LabelErrorEnum_CANNOT_APPLY_INACTIVE_LABEL LabelErrorEnum_LabelError = 2
+	// A label cannot be applied to a disabled ad group criterion.
+	LabelErrorEnum_CANNOT_APPLY_LABEL_TO_DISABLED_AD_GROUP_CRITERION LabelErrorEnum_LabelError = 3
+	// A label cannot be applied to a negative ad group criterion.
+	LabelErrorEnum_CANNOT_APPLY_LABEL_TO_NEGATIVE_AD_GROUP_CRITERION LabelErrorEnum_LabelError = 4
+	// Cannot apply more than 50 labels per resource.
+	LabelErrorEnum_EXCEEDED_LABEL_LIMIT_PER_TYPE LabelErrorEnum_LabelError = 5
+	// Labels from a manager account cannot be applied to campaign, ad group,
+	// ad group ad, or ad group criterion resources.
+	LabelErrorEnum_INVALID_RESOURCE_FOR_MANAGER_LABEL LabelErrorEnum_LabelError = 6
+	// Label names must be unique.
+	LabelErrorEnum_DUPLICATE_NAME LabelErrorEnum_LabelError = 7
+	// Label names cannot be empty.
+	LabelErrorEnum_INVALID_LABEL_NAME LabelErrorEnum_LabelError = 8
+	// Labels cannot be applied to a draft.
+	LabelErrorEnum_CANNOT_ATTACH_LABEL_TO_DRAFT LabelErrorEnum_LabelError = 9
+	// Labels not from a manager account cannot be applied to the customer
+	// resource.
+	LabelErrorEnum_CANNOT_ATTACH_NON_MANAGER_LABEL_TO_CUSTOMER LabelErrorEnum_LabelError = 10
+)
+
+var LabelErrorEnum_LabelError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "CANNOT_APPLY_INACTIVE_LABEL",
+	3:  "CANNOT_APPLY_LABEL_TO_DISABLED_AD_GROUP_CRITERION",
+	4:  "CANNOT_APPLY_LABEL_TO_NEGATIVE_AD_GROUP_CRITERION",
+	5:  "EXCEEDED_LABEL_LIMIT_PER_TYPE",
+	6:  "INVALID_RESOURCE_FOR_MANAGER_LABEL",
+	7:  "DUPLICATE_NAME",
+	8:  "INVALID_LABEL_NAME",
+	9:  "CANNOT_ATTACH_LABEL_TO_DRAFT",
+	10: "CANNOT_ATTACH_NON_MANAGER_LABEL_TO_CUSTOMER",
+}
+
+var LabelErrorEnum_LabelError_value = map[string]int32{
+	"UNSPECIFIED":                 0,
+	"UNKNOWN":                     1,
+	"CANNOT_APPLY_INACTIVE_LABEL": 2,
+	"CANNOT_APPLY_LABEL_TO_DISABLED_AD_GROUP_CRITERION": 3,
+	"CANNOT_APPLY_LABEL_TO_NEGATIVE_AD_GROUP_CRITERION": 4,
+	"EXCEEDED_LABEL_LIMIT_PER_TYPE":                     5,
+	"INVALID_RESOURCE_FOR_MANAGER_LABEL":                6,
+	"DUPLICATE_NAME":                                    7,
+	"INVALID_LABEL_NAME":                                8,
+	"CANNOT_ATTACH_LABEL_TO_DRAFT":                      9,
+	"CANNOT_ATTACH_NON_MANAGER_LABEL_TO_CUSTOMER":       10,
+}
+
+func (x LabelErrorEnum_LabelError) String() string {
+	return proto.EnumName(LabelErrorEnum_LabelError_name, int32(x))
+}
+
+func (LabelErrorEnum_LabelError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7ab0c51c11d34350, []int{0, 0}
+}
+
+// Container for enum describing possible label errors.
+type LabelErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LabelErrorEnum) Reset()         { *m = LabelErrorEnum{} }
+func (m *LabelErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*LabelErrorEnum) ProtoMessage()    {}
+func (*LabelErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7ab0c51c11d34350, []int{0}
+}
+
+func (m *LabelErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LabelErrorEnum.Unmarshal(m, b)
+}
+func (m *LabelErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LabelErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *LabelErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LabelErrorEnum.Merge(m, src)
+}
+func (m *LabelErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_LabelErrorEnum.Size(m)
+}
+func (m *LabelErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_LabelErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LabelErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.LabelErrorEnum_LabelError", LabelErrorEnum_LabelError_name, LabelErrorEnum_LabelError_value)
+	proto.RegisterType((*LabelErrorEnum)(nil), "google.ads.googleads.v3.errors.LabelErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/label_error.proto", fileDescriptor_7ab0c51c11d34350)
+}
+
+var fileDescriptor_7ab0c51c11d34350 = []byte{
+	// 465 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xc1, 0x6e, 0xd3, 0x40,
+	0x10, 0x40, 0x69, 0x02, 0x2d, 0x6c, 0xa5, 0xd6, 0xda, 0x03, 0x07, 0x28, 0x05, 0x72, 0xe0, 0x82,
+	0x64, 0x83, 0x2c, 0x2e, 0xe6, 0x34, 0xb1, 0x27, 0x66, 0x85, 0xb3, 0xb6, 0x36, 0x6b, 0x43, 0x51,
+	0xa4, 0x95, 0x8b, 0x23, 0x2b, 0x52, 0xea, 0x8d, 0xec, 0xd0, 0x1f, 0xe0, 0x1f, 0xf8, 0x00, 0x8e,
+	0x7c, 0x0a, 0x9f, 0xd2, 0xaf, 0x40, 0xf6, 0xc6, 0x29, 0x91, 0x28, 0x27, 0x8f, 0x47, 0xef, 0xcd,
+	0xcc, 0x6a, 0x86, 0xbc, 0x29, 0xb5, 0x2e, 0x57, 0x0b, 0x27, 0x2f, 0x1a, 0xc7, 0x84, 0x6d, 0x74,
+	0xed, 0x3a, 0x8b, 0xba, 0xd6, 0x75, 0xe3, 0xac, 0xf2, 0xcb, 0xc5, 0x4a, 0x75, 0x3f, 0xf6, 0xba,
+	0xd6, 0x1b, 0x4d, 0xcf, 0x0d, 0x66, 0xe7, 0x45, 0x63, 0xef, 0x0c, 0xfb, 0xda, 0xb5, 0x8d, 0xf1,
+	0xe4, 0xac, 0xaf, 0xb8, 0x5e, 0x3a, 0x79, 0x55, 0xe9, 0x4d, 0xbe, 0x59, 0xea, 0xaa, 0x31, 0xf6,
+	0xe8, 0xc7, 0x90, 0x9c, 0x44, 0x6d, 0x4d, 0x6c, 0x69, 0xac, 0xbe, 0x5d, 0x8d, 0xbe, 0x0f, 0x09,
+	0xb9, 0x4d, 0xd1, 0x53, 0x72, 0x9c, 0xf2, 0x59, 0x82, 0x3e, 0x9b, 0x30, 0x0c, 0xac, 0x7b, 0xf4,
+	0x98, 0x1c, 0xa5, 0xfc, 0x23, 0x8f, 0x3f, 0x71, 0xeb, 0x80, 0x3e, 0x27, 0x4f, 0x7d, 0xe0, 0x3c,
+	0x96, 0x0a, 0x92, 0x24, 0xba, 0x50, 0x8c, 0x83, 0x2f, 0x59, 0x86, 0x2a, 0x82, 0x31, 0x46, 0xd6,
+	0x80, 0xbe, 0x23, 0x6f, 0xf7, 0x80, 0x2e, 0xaf, 0x64, 0xac, 0x02, 0x36, 0x83, 0x71, 0x84, 0x81,
+	0x82, 0x40, 0x85, 0x22, 0x4e, 0x13, 0xe5, 0x0b, 0x26, 0x51, 0xb0, 0x98, 0x5b, 0xc3, 0xbb, 0x35,
+	0x8e, 0x21, 0x74, 0x0d, 0xfe, 0xa1, 0xdd, 0xa7, 0x2f, 0xc9, 0x33, 0xfc, 0xec, 0x23, 0x06, 0x18,
+	0x6c, 0x95, 0x88, 0x4d, 0x99, 0x54, 0x09, 0x0a, 0x25, 0x2f, 0x12, 0xb4, 0x1e, 0xd0, 0x57, 0x64,
+	0xc4, 0x78, 0x06, 0x11, 0x0b, 0x94, 0xc0, 0x59, 0x9c, 0x0a, 0x1f, 0xd5, 0x24, 0x16, 0x6a, 0x0a,
+	0x1c, 0x42, 0x14, 0xdb, 0xc1, 0x0f, 0x29, 0x25, 0x27, 0x41, 0x9a, 0x44, 0xcc, 0x07, 0x89, 0x8a,
+	0xc3, 0x14, 0xad, 0x23, 0xfa, 0x98, 0xd0, 0xde, 0x35, 0xd5, 0xbb, 0xfc, 0x43, 0xfa, 0x82, 0x9c,
+	0xf5, 0xd3, 0x4a, 0x09, 0xfe, 0x87, 0xbf, 0x5e, 0x29, 0x60, 0x22, 0xad, 0x47, 0xd4, 0x21, 0xaf,
+	0xf7, 0x09, 0x1e, 0xf3, 0xfd, 0x96, 0x2d, 0xed, 0xa7, 0x33, 0x19, 0x4f, 0x51, 0x58, 0x64, 0x7c,
+	0x73, 0x40, 0x46, 0x5f, 0xf5, 0x95, 0xfd, 0xff, 0xed, 0x8e, 0x4f, 0x6f, 0x37, 0x95, 0xb4, 0x0b,
+	0x4d, 0x0e, 0xbe, 0x04, 0x5b, 0xa5, 0xd4, 0xab, 0xbc, 0x2a, 0x6d, 0x5d, 0x97, 0x4e, 0xb9, 0xa8,
+	0xba, 0x75, 0xf7, 0x27, 0xb5, 0x5e, 0x36, 0x77, 0x5d, 0xd8, 0x7b, 0xf3, 0xf9, 0x39, 0x18, 0x86,
+	0x00, 0xbf, 0x06, 0xe7, 0xa1, 0x29, 0x06, 0x45, 0x63, 0x9b, 0xb0, 0x8d, 0x32, 0xd7, 0xee, 0x5a,
+	0x36, 0xbf, 0x7b, 0x60, 0x0e, 0x45, 0x33, 0xdf, 0x01, 0xf3, 0xcc, 0x9d, 0x1b, 0xe0, 0x66, 0x30,
+	0x32, 0x59, 0xcf, 0x83, 0xa2, 0xf1, 0xbc, 0x1d, 0xe2, 0x79, 0x99, 0xeb, 0x79, 0x06, 0xba, 0x3c,
+	0xec, 0xa6, 0x73, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x13, 0xda, 0x7d, 0x22, 0xfe, 0x02, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/language_code_error.pb.go b/googleapis/ads/googleads/v3/errors/language_code_error.pb.go
new file mode 100644
index 0000000..a4abf64
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/language_code_error.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/language_code_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing language code errors.
+type LanguageCodeErrorEnum_LanguageCodeError int32
+
+const (
+	// Enum unspecified.
+	LanguageCodeErrorEnum_UNSPECIFIED LanguageCodeErrorEnum_LanguageCodeError = 0
+	// The received error code is not known in this version.
+	LanguageCodeErrorEnum_UNKNOWN LanguageCodeErrorEnum_LanguageCodeError = 1
+	// The input language code is not recognized.
+	LanguageCodeErrorEnum_LANGUAGE_CODE_NOT_FOUND LanguageCodeErrorEnum_LanguageCodeError = 2
+	// The language is not allowed to use.
+	LanguageCodeErrorEnum_INVALID_LANGUAGE_CODE LanguageCodeErrorEnum_LanguageCodeError = 3
+)
+
+var LanguageCodeErrorEnum_LanguageCodeError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "LANGUAGE_CODE_NOT_FOUND",
+	3: "INVALID_LANGUAGE_CODE",
+}
+
+var LanguageCodeErrorEnum_LanguageCodeError_value = map[string]int32{
+	"UNSPECIFIED":             0,
+	"UNKNOWN":                 1,
+	"LANGUAGE_CODE_NOT_FOUND": 2,
+	"INVALID_LANGUAGE_CODE":   3,
+}
+
+func (x LanguageCodeErrorEnum_LanguageCodeError) String() string {
+	return proto.EnumName(LanguageCodeErrorEnum_LanguageCodeError_name, int32(x))
+}
+
+func (LanguageCodeErrorEnum_LanguageCodeError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1a902c8bd78e0aea, []int{0, 0}
+}
+
+// Container for enum describing language code errors.
+type LanguageCodeErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LanguageCodeErrorEnum) Reset()         { *m = LanguageCodeErrorEnum{} }
+func (m *LanguageCodeErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*LanguageCodeErrorEnum) ProtoMessage()    {}
+func (*LanguageCodeErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a902c8bd78e0aea, []int{0}
+}
+
+func (m *LanguageCodeErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LanguageCodeErrorEnum.Unmarshal(m, b)
+}
+func (m *LanguageCodeErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LanguageCodeErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *LanguageCodeErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LanguageCodeErrorEnum.Merge(m, src)
+}
+func (m *LanguageCodeErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_LanguageCodeErrorEnum.Size(m)
+}
+func (m *LanguageCodeErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_LanguageCodeErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LanguageCodeErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.LanguageCodeErrorEnum_LanguageCodeError", LanguageCodeErrorEnum_LanguageCodeError_name, LanguageCodeErrorEnum_LanguageCodeError_value)
+	proto.RegisterType((*LanguageCodeErrorEnum)(nil), "google.ads.googleads.v3.errors.LanguageCodeErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/language_code_error.proto", fileDescriptor_1a902c8bd78e0aea)
+}
+
+var fileDescriptor_1a902c8bd78e0aea = []byte{
+	// 326 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xcf, 0x4a, 0xf3, 0x40,
+	0x14, 0xc5, 0xbf, 0xa4, 0xf0, 0x09, 0xd3, 0x85, 0x31, 0x50, 0xc5, 0x3f, 0x74, 0x91, 0x07, 0x98,
+	0x2c, 0xb2, 0x91, 0x71, 0x35, 0x6d, 0xd2, 0x10, 0x2c, 0x93, 0x82, 0x26, 0x82, 0x04, 0x42, 0xec,
+	0x0c, 0x43, 0xa0, 0x9d, 0x5b, 0x32, 0x6d, 0x1f, 0xc0, 0x47, 0x71, 0xe9, 0xa3, 0xf8, 0x28, 0xee,
+	0x7c, 0x03, 0x49, 0xa6, 0x2d, 0x48, 0xd1, 0x55, 0x0e, 0x37, 0xbf, 0x73, 0xe7, 0x9e, 0x83, 0x6e,
+	0x25, 0x80, 0x5c, 0x08, 0xbf, 0xe2, 0xda, 0x37, 0xb2, 0x55, 0xdb, 0xc0, 0x17, 0x4d, 0x03, 0x8d,
+	0xf6, 0x17, 0x95, 0x92, 0x9b, 0x4a, 0x8a, 0x72, 0x0e, 0x5c, 0x94, 0xdd, 0x10, 0xaf, 0x1a, 0x58,
+	0x83, 0x3b, 0x34, 0x38, 0xae, 0xb8, 0xc6, 0x07, 0x27, 0xde, 0x06, 0xd8, 0x38, 0xaf, 0x6e, 0xf6,
+	0x9b, 0x57, 0xb5, 0x5f, 0x29, 0x05, 0xeb, 0x6a, 0x5d, 0x83, 0xd2, 0xc6, 0xed, 0xbd, 0x5a, 0x68,
+	0x30, 0xdd, 0xed, 0x1e, 0x03, 0x17, 0x51, 0x6b, 0x8a, 0xd4, 0x66, 0xe9, 0xd5, 0xe8, 0xec, 0xe8,
+	0x87, 0x7b, 0x8a, 0xfa, 0x19, 0x7b, 0x98, 0x45, 0xe3, 0x64, 0x92, 0x44, 0xa1, 0xf3, 0xcf, 0xed,
+	0xa3, 0x93, 0x8c, 0xdd, 0xb3, 0xf4, 0x89, 0x39, 0x96, 0x7b, 0x8d, 0x2e, 0xa6, 0x94, 0xc5, 0x19,
+	0x8d, 0xa3, 0x72, 0x9c, 0x86, 0x51, 0xc9, 0xd2, 0xc7, 0x72, 0x92, 0x66, 0x2c, 0x74, 0x6c, 0xf7,
+	0x12, 0x0d, 0x12, 0x96, 0xd3, 0x69, 0x12, 0x96, 0x3f, 0x20, 0xa7, 0x37, 0xfa, 0xb2, 0x90, 0x37,
+	0x87, 0x25, 0xfe, 0x3b, 0xc9, 0xe8, 0xfc, 0xe8, 0x9e, 0x59, 0x9b, 0x61, 0x66, 0x3d, 0x87, 0x3b,
+	0xa7, 0x84, 0xb6, 0x27, 0x0c, 0x8d, 0xf4, 0xa5, 0x50, 0x5d, 0xc2, 0x7d, 0x9b, 0xab, 0x5a, 0xff,
+	0x56, 0xee, 0x9d, 0xf9, 0xbc, 0xd9, 0xbd, 0x98, 0xd2, 0x77, 0x7b, 0x18, 0x9b, 0x65, 0x94, 0x6b,
+	0x6c, 0x64, 0xab, 0xf2, 0x00, 0x77, 0x4f, 0xea, 0x8f, 0x3d, 0x50, 0x50, 0xae, 0x8b, 0x03, 0x50,
+	0xe4, 0x41, 0x61, 0x80, 0x4f, 0xdb, 0x33, 0x53, 0x42, 0x28, 0xd7, 0x84, 0x1c, 0x10, 0x42, 0xf2,
+	0x80, 0x10, 0x03, 0xbd, 0xfc, 0xef, 0xae, 0x0b, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0xa9, 0xa5,
+	0x9d, 0xc0, 0xf9, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/list_operation_error.pb.go b/googleapis/ads/googleads/v3/errors/list_operation_error.pb.go
new file mode 100644
index 0000000..3a64520
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/list_operation_error.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/list_operation_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible list operation errors.
+type ListOperationErrorEnum_ListOperationError int32
+
+const (
+	// Enum unspecified.
+	ListOperationErrorEnum_UNSPECIFIED ListOperationErrorEnum_ListOperationError = 0
+	// The received error code is not known in this version.
+	ListOperationErrorEnum_UNKNOWN ListOperationErrorEnum_ListOperationError = 1
+	// Field required in value is missing.
+	ListOperationErrorEnum_REQUIRED_FIELD_MISSING ListOperationErrorEnum_ListOperationError = 7
+	// Duplicate or identical value is sent in multiple list operations.
+	ListOperationErrorEnum_DUPLICATE_VALUES ListOperationErrorEnum_ListOperationError = 8
+)
+
+var ListOperationErrorEnum_ListOperationError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	7: "REQUIRED_FIELD_MISSING",
+	8: "DUPLICATE_VALUES",
+}
+
+var ListOperationErrorEnum_ListOperationError_value = map[string]int32{
+	"UNSPECIFIED":            0,
+	"UNKNOWN":                1,
+	"REQUIRED_FIELD_MISSING": 7,
+	"DUPLICATE_VALUES":       8,
+}
+
+func (x ListOperationErrorEnum_ListOperationError) String() string {
+	return proto.EnumName(ListOperationErrorEnum_ListOperationError_name, int32(x))
+}
+
+func (ListOperationErrorEnum_ListOperationError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_4d4bd5dcfdab7508, []int{0, 0}
+}
+
+// Container for enum describing possible list operation errors.
+type ListOperationErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListOperationErrorEnum) Reset()         { *m = ListOperationErrorEnum{} }
+func (m *ListOperationErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ListOperationErrorEnum) ProtoMessage()    {}
+func (*ListOperationErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d4bd5dcfdab7508, []int{0}
+}
+
+func (m *ListOperationErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListOperationErrorEnum.Unmarshal(m, b)
+}
+func (m *ListOperationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListOperationErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ListOperationErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListOperationErrorEnum.Merge(m, src)
+}
+func (m *ListOperationErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ListOperationErrorEnum.Size(m)
+}
+func (m *ListOperationErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListOperationErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListOperationErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ListOperationErrorEnum_ListOperationError", ListOperationErrorEnum_ListOperationError_name, ListOperationErrorEnum_ListOperationError_value)
+	proto.RegisterType((*ListOperationErrorEnum)(nil), "google.ads.googleads.v3.errors.ListOperationErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/list_operation_error.proto", fileDescriptor_4d4bd5dcfdab7508)
+}
+
+var fileDescriptor_4d4bd5dcfdab7508 = []byte{
+	// 327 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xf3, 0x40,
+	0x14, 0x85, 0xff, 0xf6, 0x07, 0x2b, 0xd3, 0x85, 0x21, 0x48, 0x85, 0x22, 0x5d, 0xe4, 0x01, 0x26,
+	0x8b, 0xac, 0x1c, 0x57, 0xd3, 0x66, 0x5a, 0x06, 0x63, 0x1a, 0x1b, 0x13, 0x41, 0x02, 0x21, 0x3a,
+	0x61, 0x08, 0xb4, 0x33, 0x61, 0x26, 0x76, 0xe9, 0xc3, 0xb8, 0xf4, 0x51, 0x7c, 0x14, 0x97, 0x3e,
+	0x81, 0x24, 0x63, 0xba, 0x29, 0xba, 0xca, 0xe1, 0xe6, 0x3b, 0x67, 0xce, 0xbd, 0xe0, 0x8a, 0x4b,
+	0xc9, 0xb7, 0xa5, 0x5b, 0x30, 0xed, 0x1a, 0xd9, 0xaa, 0xbd, 0xe7, 0x96, 0x4a, 0x49, 0xa5, 0xdd,
+	0x6d, 0xa5, 0x9b, 0x5c, 0xd6, 0xa5, 0x2a, 0x9a, 0x4a, 0x8a, 0xbc, 0x9b, 0xc2, 0x5a, 0xc9, 0x46,
+	0xda, 0x33, 0xc3, 0xc3, 0x82, 0x69, 0x78, 0xb0, 0xc2, 0xbd, 0x07, 0x8d, 0x75, 0x7a, 0xd9, 0x47,
+	0xd7, 0x95, 0x5b, 0x08, 0x21, 0x9b, 0x2e, 0x42, 0x1b, 0xb7, 0xf3, 0x0a, 0x26, 0x41, 0xa5, 0x9b,
+	0x75, 0x1f, 0x4d, 0x5a, 0x13, 0x11, 0x2f, 0x3b, 0x87, 0x01, 0xfb, 0xf8, 0x8f, 0x7d, 0x06, 0xc6,
+	0x49, 0x18, 0x47, 0x64, 0x41, 0x97, 0x94, 0xf8, 0xd6, 0x3f, 0x7b, 0x0c, 0x46, 0x49, 0x78, 0x13,
+	0xae, 0x1f, 0x42, 0x6b, 0x60, 0x4f, 0xc1, 0x64, 0x43, 0xee, 0x12, 0xba, 0x21, 0x7e, 0xbe, 0xa4,
+	0x24, 0xf0, 0xf3, 0x5b, 0x1a, 0xc7, 0x34, 0x5c, 0x59, 0x23, 0xfb, 0x1c, 0x58, 0x7e, 0x12, 0x05,
+	0x74, 0x81, 0xef, 0x49, 0x9e, 0xe2, 0x20, 0x21, 0xb1, 0x75, 0x3a, 0xff, 0x1a, 0x00, 0xe7, 0x59,
+	0xee, 0xe0, 0xdf, 0x4b, 0xcc, 0x2f, 0x8e, 0xab, 0x44, 0x6d, 0xff, 0x68, 0xf0, 0xe8, 0xff, 0x58,
+	0xb9, 0xdc, 0x16, 0x82, 0x43, 0xa9, 0xb8, 0xcb, 0x4b, 0xd1, 0x6d, 0xd7, 0x9f, 0xb2, 0xae, 0xf4,
+	0x6f, 0x97, 0xbd, 0x36, 0x9f, 0xb7, 0xe1, 0xff, 0x15, 0xc6, 0xef, 0xc3, 0xd9, 0xca, 0x84, 0x61,
+	0xa6, 0xa1, 0x91, 0xad, 0x4a, 0x3d, 0xd8, 0x3d, 0xa9, 0x3f, 0x7a, 0x20, 0xc3, 0x4c, 0x67, 0x07,
+	0x20, 0x4b, 0xbd, 0xcc, 0x00, 0x9f, 0x43, 0xc7, 0x4c, 0x11, 0xc2, 0x4c, 0x23, 0x74, 0x40, 0x10,
+	0x4a, 0x3d, 0x84, 0x0c, 0xf4, 0x74, 0xd2, 0xb5, 0xf3, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0xdf,
+	0x04, 0xee, 0x90, 0xf6, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/manager_link_error.pb.go b/googleapis/ads/googleads/v3/errors/manager_link_error.pb.go
new file mode 100644
index 0000000..82a7ede
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/manager_link_error.pb.go
@@ -0,0 +1,193 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/manager_link_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible ManagerLink errors.
+type ManagerLinkErrorEnum_ManagerLinkError int32
+
+const (
+	// Enum unspecified.
+	ManagerLinkErrorEnum_UNSPECIFIED ManagerLinkErrorEnum_ManagerLinkError = 0
+	// The received error code is not known in this version.
+	ManagerLinkErrorEnum_UNKNOWN ManagerLinkErrorEnum_ManagerLinkError = 1
+	// The manager and client have incompatible account types.
+	ManagerLinkErrorEnum_ACCOUNTS_NOT_COMPATIBLE_FOR_LINKING ManagerLinkErrorEnum_ManagerLinkError = 2
+	// Client is already linked to too many managers.
+	ManagerLinkErrorEnum_TOO_MANY_MANAGERS ManagerLinkErrorEnum_ManagerLinkError = 3
+	// Manager has too many pending invitations.
+	ManagerLinkErrorEnum_TOO_MANY_INVITES ManagerLinkErrorEnum_ManagerLinkError = 4
+	// Client is already invited by this manager.
+	ManagerLinkErrorEnum_ALREADY_INVITED_BY_THIS_MANAGER ManagerLinkErrorEnum_ManagerLinkError = 5
+	// The client is already managed by this manager.
+	ManagerLinkErrorEnum_ALREADY_MANAGED_BY_THIS_MANAGER ManagerLinkErrorEnum_ManagerLinkError = 6
+	// Client is already managed in hierarchy.
+	ManagerLinkErrorEnum_ALREADY_MANAGED_IN_HIERARCHY ManagerLinkErrorEnum_ManagerLinkError = 7
+	// Manger and sub-manager to be linked have duplicate client.
+	ManagerLinkErrorEnum_DUPLICATE_CHILD_FOUND ManagerLinkErrorEnum_ManagerLinkError = 8
+	// Client has no active user that can access the client account.
+	ManagerLinkErrorEnum_CLIENT_HAS_NO_ADMIN_USER ManagerLinkErrorEnum_ManagerLinkError = 9
+	// Adding this link would exceed the maximum hierarchy depth.
+	ManagerLinkErrorEnum_MAX_DEPTH_EXCEEDED ManagerLinkErrorEnum_ManagerLinkError = 10
+	// Adding this link will create a cycle.
+	ManagerLinkErrorEnum_CYCLE_NOT_ALLOWED ManagerLinkErrorEnum_ManagerLinkError = 11
+	// Manager account has the maximum number of linked clients.
+	ManagerLinkErrorEnum_TOO_MANY_ACCOUNTS ManagerLinkErrorEnum_ManagerLinkError = 12
+	// Parent manager account has the maximum number of linked clients.
+	ManagerLinkErrorEnum_TOO_MANY_ACCOUNTS_AT_MANAGER ManagerLinkErrorEnum_ManagerLinkError = 13
+	// The account is not authorized owner.
+	ManagerLinkErrorEnum_NON_OWNER_USER_CANNOT_MODIFY_LINK ManagerLinkErrorEnum_ManagerLinkError = 14
+	// Your manager account is suspended, and you are no longer allowed to link
+	// to clients.
+	ManagerLinkErrorEnum_SUSPENDED_ACCOUNT_CANNOT_ADD_CLIENTS ManagerLinkErrorEnum_ManagerLinkError = 15
+	// You are not allowed to move a client to a manager that is not under your
+	// current hierarchy.
+	ManagerLinkErrorEnum_CLIENT_OUTSIDE_TREE ManagerLinkErrorEnum_ManagerLinkError = 16
+)
+
+var ManagerLinkErrorEnum_ManagerLinkError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "ACCOUNTS_NOT_COMPATIBLE_FOR_LINKING",
+	3:  "TOO_MANY_MANAGERS",
+	4:  "TOO_MANY_INVITES",
+	5:  "ALREADY_INVITED_BY_THIS_MANAGER",
+	6:  "ALREADY_MANAGED_BY_THIS_MANAGER",
+	7:  "ALREADY_MANAGED_IN_HIERARCHY",
+	8:  "DUPLICATE_CHILD_FOUND",
+	9:  "CLIENT_HAS_NO_ADMIN_USER",
+	10: "MAX_DEPTH_EXCEEDED",
+	11: "CYCLE_NOT_ALLOWED",
+	12: "TOO_MANY_ACCOUNTS",
+	13: "TOO_MANY_ACCOUNTS_AT_MANAGER",
+	14: "NON_OWNER_USER_CANNOT_MODIFY_LINK",
+	15: "SUSPENDED_ACCOUNT_CANNOT_ADD_CLIENTS",
+	16: "CLIENT_OUTSIDE_TREE",
+}
+
+var ManagerLinkErrorEnum_ManagerLinkError_value = map[string]int32{
+	"UNSPECIFIED":                          0,
+	"UNKNOWN":                              1,
+	"ACCOUNTS_NOT_COMPATIBLE_FOR_LINKING":  2,
+	"TOO_MANY_MANAGERS":                    3,
+	"TOO_MANY_INVITES":                     4,
+	"ALREADY_INVITED_BY_THIS_MANAGER":      5,
+	"ALREADY_MANAGED_BY_THIS_MANAGER":      6,
+	"ALREADY_MANAGED_IN_HIERARCHY":         7,
+	"DUPLICATE_CHILD_FOUND":                8,
+	"CLIENT_HAS_NO_ADMIN_USER":             9,
+	"MAX_DEPTH_EXCEEDED":                   10,
+	"CYCLE_NOT_ALLOWED":                    11,
+	"TOO_MANY_ACCOUNTS":                    12,
+	"TOO_MANY_ACCOUNTS_AT_MANAGER":         13,
+	"NON_OWNER_USER_CANNOT_MODIFY_LINK":    14,
+	"SUSPENDED_ACCOUNT_CANNOT_ADD_CLIENTS": 15,
+	"CLIENT_OUTSIDE_TREE":                  16,
+}
+
+func (x ManagerLinkErrorEnum_ManagerLinkError) String() string {
+	return proto.EnumName(ManagerLinkErrorEnum_ManagerLinkError_name, int32(x))
+}
+
+func (ManagerLinkErrorEnum_ManagerLinkError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_aba35d6dfea2fe63, []int{0, 0}
+}
+
+// Container for enum describing possible ManagerLink errors.
+type ManagerLinkErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ManagerLinkErrorEnum) Reset()         { *m = ManagerLinkErrorEnum{} }
+func (m *ManagerLinkErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ManagerLinkErrorEnum) ProtoMessage()    {}
+func (*ManagerLinkErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aba35d6dfea2fe63, []int{0}
+}
+
+func (m *ManagerLinkErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ManagerLinkErrorEnum.Unmarshal(m, b)
+}
+func (m *ManagerLinkErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ManagerLinkErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ManagerLinkErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ManagerLinkErrorEnum.Merge(m, src)
+}
+func (m *ManagerLinkErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ManagerLinkErrorEnum.Size(m)
+}
+func (m *ManagerLinkErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ManagerLinkErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ManagerLinkErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ManagerLinkErrorEnum_ManagerLinkError", ManagerLinkErrorEnum_ManagerLinkError_name, ManagerLinkErrorEnum_ManagerLinkError_value)
+	proto.RegisterType((*ManagerLinkErrorEnum)(nil), "google.ads.googleads.v3.errors.ManagerLinkErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/manager_link_error.proto", fileDescriptor_aba35d6dfea2fe63)
+}
+
+var fileDescriptor_aba35d6dfea2fe63 = []byte{
+	// 556 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xdf, 0x6e, 0xd3, 0x3e,
+	0x14, 0xc7, 0x7f, 0xeb, 0xf6, 0xdb, 0xc0, 0x03, 0x66, 0xcc, 0xc6, 0x3f, 0x4d, 0x03, 0x3a, 0x10,
+	0x5c, 0xa5, 0x17, 0xbd, 0x40, 0x0a, 0x57, 0xae, 0x7d, 0xda, 0x58, 0x4b, 0xec, 0x28, 0x71, 0xba,
+	0x15, 0x55, 0xb2, 0x02, 0xad, 0xa2, 0x6a, 0x5b, 0x32, 0x25, 0x63, 0x8f, 0xc2, 0x03, 0x70, 0xc9,
+	0xa3, 0xf0, 0x28, 0x5c, 0xf1, 0x02, 0x48, 0x28, 0xf1, 0x52, 0x41, 0x27, 0xb8, 0x49, 0x8e, 0xbe,
+	0xfe, 0x7c, 0x8f, 0x7d, 0x8e, 0xbe, 0xe8, 0x6d, 0x56, 0x14, 0xd9, 0xd9, 0xbc, 0x97, 0xce, 0xaa,
+	0x9e, 0x2d, 0xeb, 0xea, 0xaa, 0xdf, 0x9b, 0x97, 0x65, 0x51, 0x56, 0xbd, 0xf3, 0x34, 0x4f, 0xb3,
+	0x79, 0x69, 0xce, 0x16, 0xf9, 0xa9, 0x69, 0x34, 0xe7, 0xa2, 0x2c, 0x2e, 0x0b, 0x72, 0x60, 0x69,
+	0x27, 0x9d, 0x55, 0xce, 0xd2, 0xe8, 0x5c, 0xf5, 0x1d, 0x6b, 0x7c, 0xba, 0xdf, 0x36, 0xbe, 0x58,
+	0xf4, 0xd2, 0x3c, 0x2f, 0x2e, 0xd3, 0xcb, 0x45, 0x91, 0x57, 0xd6, 0xdd, 0xfd, 0xbc, 0x81, 0x76,
+	0x03, 0xdb, 0xda, 0x5f, 0xe4, 0xa7, 0x50, 0x7b, 0x20, 0xff, 0x74, 0xde, 0xfd, 0xb9, 0x8e, 0xf0,
+	0xea, 0x01, 0xd9, 0x41, 0xdb, 0x89, 0x8c, 0x43, 0x60, 0x62, 0x28, 0x80, 0xe3, 0xff, 0xc8, 0x36,
+	0xda, 0x4a, 0xe4, 0x91, 0x54, 0xc7, 0x12, 0xaf, 0x91, 0xd7, 0xe8, 0x90, 0x32, 0xa6, 0x12, 0xa9,
+	0x63, 0x23, 0x95, 0x36, 0x4c, 0x05, 0x21, 0xd5, 0x62, 0xe0, 0x83, 0x19, 0xaa, 0xc8, 0xf8, 0x42,
+	0x1e, 0x09, 0x39, 0xc2, 0x1d, 0xb2, 0x87, 0xee, 0x6b, 0xa5, 0x4c, 0x40, 0xe5, 0xa4, 0xfe, 0xd0,
+	0x11, 0x44, 0x31, 0x5e, 0x27, 0xbb, 0x08, 0x2f, 0x65, 0x21, 0xc7, 0x42, 0x43, 0x8c, 0x37, 0xc8,
+	0x21, 0x7a, 0x46, 0xfd, 0x08, 0x28, 0x6f, 0x45, 0x6e, 0x06, 0x13, 0xa3, 0x3d, 0x11, 0xb7, 0x5e,
+	0xfc, 0xff, 0xef, 0x90, 0x15, 0x6f, 0x42, 0x9b, 0xe4, 0x39, 0xda, 0x5f, 0x85, 0x84, 0x34, 0x9e,
+	0x80, 0x88, 0x46, 0xcc, 0x9b, 0xe0, 0x2d, 0xf2, 0x04, 0xed, 0xf1, 0x24, 0xf4, 0x05, 0xa3, 0x1a,
+	0x0c, 0xf3, 0x84, 0xcf, 0xcd, 0x50, 0x25, 0x92, 0xe3, 0x5b, 0x64, 0x1f, 0x3d, 0x66, 0xbe, 0x00,
+	0xa9, 0x8d, 0x47, 0xeb, 0xf1, 0x0c, 0xe5, 0x81, 0x90, 0x26, 0x89, 0x21, 0xc2, 0xb7, 0xc9, 0x43,
+	0x44, 0x02, 0x7a, 0x62, 0x38, 0x84, 0xda, 0x33, 0x70, 0xc2, 0x00, 0x38, 0x70, 0x8c, 0xea, 0x49,
+	0xd9, 0x84, 0xf9, 0xd0, 0xec, 0x83, 0xfa, 0xbe, 0x3a, 0x06, 0x8e, 0xb7, 0xff, 0x58, 0x40, 0xbb,
+	0x32, 0x7c, 0xa7, 0x7e, 0xe0, 0x0d, 0xd9, 0x50, 0xbd, 0x1c, 0xe1, 0x2e, 0x79, 0x85, 0x5e, 0x48,
+	0x25, 0x8d, 0x3a, 0x96, 0x10, 0x35, 0x77, 0x1b, 0x46, 0x65, 0xdd, 0x3b, 0x50, 0x5c, 0x0c, 0x27,
+	0xcd, 0x8e, 0xf1, 0x3d, 0xf2, 0x06, 0xbd, 0x8c, 0x93, 0x38, 0x04, 0xc9, 0x81, 0xb7, 0x9d, 0x5a,
+	0x92, 0x72, 0x6e, 0xec, 0x24, 0x31, 0xde, 0x21, 0x8f, 0xd0, 0x83, 0xeb, 0xb1, 0x54, 0xa2, 0x63,
+	0xc1, 0xc1, 0xe8, 0x08, 0x00, 0xe3, 0xc1, 0x8f, 0x35, 0xd4, 0xfd, 0x58, 0x9c, 0x3b, 0xff, 0x4e,
+	0xd7, 0x60, 0x6f, 0x35, 0x23, 0x61, 0x1d, 0xab, 0x70, 0xed, 0x3d, 0xbf, 0x36, 0x66, 0xc5, 0x59,
+	0x9a, 0x67, 0x4e, 0x51, 0x66, 0xbd, 0x6c, 0x9e, 0x37, 0xa1, 0x6b, 0xf3, 0x7d, 0xb1, 0xa8, 0xfe,
+	0x16, 0xf7, 0x77, 0xf6, 0xf7, 0xa5, 0xb3, 0x3e, 0xa2, 0xf4, 0x6b, 0xe7, 0x60, 0x64, 0x9b, 0xd1,
+	0x59, 0xe5, 0xd8, 0xb2, 0xae, 0xc6, 0x7d, 0xa7, 0xb9, 0xb2, 0xfa, 0xd6, 0x02, 0x53, 0x3a, 0xab,
+	0xa6, 0x4b, 0x60, 0x3a, 0xee, 0x4f, 0x2d, 0xf0, 0xbd, 0xd3, 0xb5, 0xaa, 0xeb, 0xd2, 0x59, 0xe5,
+	0xba, 0x4b, 0xc4, 0x75, 0xc7, 0x7d, 0xd7, 0xb5, 0xd0, 0x87, 0xcd, 0xe6, 0x75, 0xfd, 0x5f, 0x01,
+	0x00, 0x00, 0xff, 0xff, 0x75, 0x31, 0x98, 0x66, 0x8b, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/media_bundle_error.pb.go b/googleapis/ads/googleads/v3/errors/media_bundle_error.pb.go
new file mode 100644
index 0000000..fa97896
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/media_bundle_error.pb.go
@@ -0,0 +1,225 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/media_bundle_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible media bundle errors.
+type MediaBundleErrorEnum_MediaBundleError int32
+
+const (
+	// Enum unspecified.
+	MediaBundleErrorEnum_UNSPECIFIED MediaBundleErrorEnum_MediaBundleError = 0
+	// The received error code is not known in this version.
+	MediaBundleErrorEnum_UNKNOWN MediaBundleErrorEnum_MediaBundleError = 1
+	// There was a problem with the request.
+	MediaBundleErrorEnum_BAD_REQUEST MediaBundleErrorEnum_MediaBundleError = 3
+	// HTML5 ads using DoubleClick Studio created ZIP files are not supported.
+	MediaBundleErrorEnum_DOUBLECLICK_BUNDLE_NOT_ALLOWED MediaBundleErrorEnum_MediaBundleError = 4
+	// Cannot reference URL external to the media bundle.
+	MediaBundleErrorEnum_EXTERNAL_URL_NOT_ALLOWED MediaBundleErrorEnum_MediaBundleError = 5
+	// Media bundle file is too large.
+	MediaBundleErrorEnum_FILE_TOO_LARGE MediaBundleErrorEnum_MediaBundleError = 6
+	// ZIP file from Google Web Designer is not published.
+	MediaBundleErrorEnum_GOOGLE_WEB_DESIGNER_ZIP_FILE_NOT_PUBLISHED MediaBundleErrorEnum_MediaBundleError = 7
+	// Input was invalid.
+	MediaBundleErrorEnum_INVALID_INPUT MediaBundleErrorEnum_MediaBundleError = 8
+	// There was a problem with the media bundle.
+	MediaBundleErrorEnum_INVALID_MEDIA_BUNDLE MediaBundleErrorEnum_MediaBundleError = 9
+	// There was a problem with one or more of the media bundle entries.
+	MediaBundleErrorEnum_INVALID_MEDIA_BUNDLE_ENTRY MediaBundleErrorEnum_MediaBundleError = 10
+	// The media bundle contains a file with an unknown mime type
+	MediaBundleErrorEnum_INVALID_MIME_TYPE MediaBundleErrorEnum_MediaBundleError = 11
+	// The media bundle contain an invalid asset path.
+	MediaBundleErrorEnum_INVALID_PATH MediaBundleErrorEnum_MediaBundleError = 12
+	// HTML5 ad is trying to reference an asset not in .ZIP file
+	MediaBundleErrorEnum_INVALID_URL_REFERENCE MediaBundleErrorEnum_MediaBundleError = 13
+	// Media data is too large.
+	MediaBundleErrorEnum_MEDIA_DATA_TOO_LARGE MediaBundleErrorEnum_MediaBundleError = 14
+	// The media bundle contains no primary entry.
+	MediaBundleErrorEnum_MISSING_PRIMARY_MEDIA_BUNDLE_ENTRY MediaBundleErrorEnum_MediaBundleError = 15
+	// There was an error on the server.
+	MediaBundleErrorEnum_SERVER_ERROR MediaBundleErrorEnum_MediaBundleError = 16
+	// The image could not be stored.
+	MediaBundleErrorEnum_STORAGE_ERROR MediaBundleErrorEnum_MediaBundleError = 17
+	// Media bundle created with the Swiffy tool is not allowed.
+	MediaBundleErrorEnum_SWIFFY_BUNDLE_NOT_ALLOWED MediaBundleErrorEnum_MediaBundleError = 18
+	// The media bundle contains too many files.
+	MediaBundleErrorEnum_TOO_MANY_FILES MediaBundleErrorEnum_MediaBundleError = 19
+	// The media bundle is not of legal dimensions.
+	MediaBundleErrorEnum_UNEXPECTED_SIZE MediaBundleErrorEnum_MediaBundleError = 20
+	// Google Web Designer not created for "Google Ads" environment.
+	MediaBundleErrorEnum_UNSUPPORTED_GOOGLE_WEB_DESIGNER_ENVIRONMENT MediaBundleErrorEnum_MediaBundleError = 21
+	// Unsupported HTML5 feature in HTML5 asset.
+	MediaBundleErrorEnum_UNSUPPORTED_HTML5_FEATURE MediaBundleErrorEnum_MediaBundleError = 22
+	// URL in HTML5 entry is not ssl compliant.
+	MediaBundleErrorEnum_URL_IN_MEDIA_BUNDLE_NOT_SSL_COMPLIANT MediaBundleErrorEnum_MediaBundleError = 23
+	// Custom exits not allowed in HTML5 entry.
+	MediaBundleErrorEnum_CUSTOM_EXIT_NOT_ALLOWED MediaBundleErrorEnum_MediaBundleError = 24
+)
+
+var MediaBundleErrorEnum_MediaBundleError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	3:  "BAD_REQUEST",
+	4:  "DOUBLECLICK_BUNDLE_NOT_ALLOWED",
+	5:  "EXTERNAL_URL_NOT_ALLOWED",
+	6:  "FILE_TOO_LARGE",
+	7:  "GOOGLE_WEB_DESIGNER_ZIP_FILE_NOT_PUBLISHED",
+	8:  "INVALID_INPUT",
+	9:  "INVALID_MEDIA_BUNDLE",
+	10: "INVALID_MEDIA_BUNDLE_ENTRY",
+	11: "INVALID_MIME_TYPE",
+	12: "INVALID_PATH",
+	13: "INVALID_URL_REFERENCE",
+	14: "MEDIA_DATA_TOO_LARGE",
+	15: "MISSING_PRIMARY_MEDIA_BUNDLE_ENTRY",
+	16: "SERVER_ERROR",
+	17: "STORAGE_ERROR",
+	18: "SWIFFY_BUNDLE_NOT_ALLOWED",
+	19: "TOO_MANY_FILES",
+	20: "UNEXPECTED_SIZE",
+	21: "UNSUPPORTED_GOOGLE_WEB_DESIGNER_ENVIRONMENT",
+	22: "UNSUPPORTED_HTML5_FEATURE",
+	23: "URL_IN_MEDIA_BUNDLE_NOT_SSL_COMPLIANT",
+	24: "CUSTOM_EXIT_NOT_ALLOWED",
+}
+
+var MediaBundleErrorEnum_MediaBundleError_value = map[string]int32{
+	"UNSPECIFIED":                    0,
+	"UNKNOWN":                        1,
+	"BAD_REQUEST":                    3,
+	"DOUBLECLICK_BUNDLE_NOT_ALLOWED": 4,
+	"EXTERNAL_URL_NOT_ALLOWED":       5,
+	"FILE_TOO_LARGE":                 6,
+	"GOOGLE_WEB_DESIGNER_ZIP_FILE_NOT_PUBLISHED": 7,
+	"INVALID_INPUT":                               8,
+	"INVALID_MEDIA_BUNDLE":                        9,
+	"INVALID_MEDIA_BUNDLE_ENTRY":                  10,
+	"INVALID_MIME_TYPE":                           11,
+	"INVALID_PATH":                                12,
+	"INVALID_URL_REFERENCE":                       13,
+	"MEDIA_DATA_TOO_LARGE":                        14,
+	"MISSING_PRIMARY_MEDIA_BUNDLE_ENTRY":          15,
+	"SERVER_ERROR":                                16,
+	"STORAGE_ERROR":                               17,
+	"SWIFFY_BUNDLE_NOT_ALLOWED":                   18,
+	"TOO_MANY_FILES":                              19,
+	"UNEXPECTED_SIZE":                             20,
+	"UNSUPPORTED_GOOGLE_WEB_DESIGNER_ENVIRONMENT": 21,
+	"UNSUPPORTED_HTML5_FEATURE":                   22,
+	"URL_IN_MEDIA_BUNDLE_NOT_SSL_COMPLIANT":       23,
+	"CUSTOM_EXIT_NOT_ALLOWED":                     24,
+}
+
+func (x MediaBundleErrorEnum_MediaBundleError) String() string {
+	return proto.EnumName(MediaBundleErrorEnum_MediaBundleError_name, int32(x))
+}
+
+func (MediaBundleErrorEnum_MediaBundleError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_13a0331a34c9b73f, []int{0, 0}
+}
+
+// Container for enum describing possible media bundle errors.
+type MediaBundleErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MediaBundleErrorEnum) Reset()         { *m = MediaBundleErrorEnum{} }
+func (m *MediaBundleErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*MediaBundleErrorEnum) ProtoMessage()    {}
+func (*MediaBundleErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_13a0331a34c9b73f, []int{0}
+}
+
+func (m *MediaBundleErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaBundleErrorEnum.Unmarshal(m, b)
+}
+func (m *MediaBundleErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaBundleErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *MediaBundleErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaBundleErrorEnum.Merge(m, src)
+}
+func (m *MediaBundleErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_MediaBundleErrorEnum.Size(m)
+}
+func (m *MediaBundleErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaBundleErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaBundleErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.MediaBundleErrorEnum_MediaBundleError", MediaBundleErrorEnum_MediaBundleError_name, MediaBundleErrorEnum_MediaBundleError_value)
+	proto.RegisterType((*MediaBundleErrorEnum)(nil), "google.ads.googleads.v3.errors.MediaBundleErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/media_bundle_error.proto", fileDescriptor_13a0331a34c9b73f)
+}
+
+var fileDescriptor_13a0331a34c9b73f = []byte{
+	// 643 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xdb, 0x4e, 0x1b, 0x3b,
+	0x14, 0x3d, 0xc0, 0x01, 0xce, 0x31, 0x37, 0x63, 0xc8, 0xe1, 0x72, 0x68, 0x1e, 0x22, 0xb5, 0x52,
+	0x5b, 0x69, 0xf2, 0x10, 0x55, 0x95, 0xa6, 0x4f, 0x9e, 0xcc, 0xce, 0x60, 0xe1, 0xb1, 0xa7, 0xb6,
+	0x27, 0x21, 0x28, 0x92, 0x15, 0x9a, 0x28, 0x8a, 0x04, 0x19, 0x94, 0x01, 0x7e, 0xa7, 0x52, 0x1f,
+	0xfb, 0x05, 0xfd, 0x86, 0x7e, 0x4a, 0x9f, 0xfa, 0x09, 0x95, 0x67, 0x48, 0x04, 0x28, 0xed, 0x93,
+	0xb7, 0xd6, 0x5e, 0x6b, 0xed, 0x8b, 0xbc, 0xd1, 0xfb, 0x51, 0x96, 0x8d, 0xae, 0x86, 0xf5, 0xfe,
+	0x20, 0xaf, 0x97, 0xa1, 0x8b, 0xee, 0x1b, 0xf5, 0xe1, 0x74, 0x9a, 0x4d, 0xf3, 0xfa, 0xf5, 0x70,
+	0x30, 0xee, 0xdb, 0xcb, 0xbb, 0xc9, 0xe0, 0x6a, 0x68, 0x0b, 0xcc, 0xbb, 0x99, 0x66, 0xb7, 0x19,
+	0xa9, 0x96, 0x6c, 0xaf, 0x3f, 0xc8, 0xbd, 0xb9, 0xd0, 0xbb, 0x6f, 0x78, 0xa5, 0xf0, 0xf8, 0x64,
+	0x66, 0x7c, 0x33, 0xae, 0xf7, 0x27, 0x93, 0xec, 0xb6, 0x7f, 0x3b, 0xce, 0x26, 0x79, 0xa9, 0xae,
+	0x7d, 0x5b, 0x45, 0xfb, 0xb1, 0xb3, 0x0e, 0x0a, 0x67, 0x70, 0x1a, 0x98, 0xdc, 0x5d, 0xd7, 0x3e,
+	0xaf, 0x22, 0xfc, 0x3c, 0x41, 0x76, 0xd0, 0x46, 0x2a, 0x74, 0x02, 0x4d, 0xd6, 0x62, 0x10, 0xe2,
+	0xbf, 0xc8, 0x06, 0x5a, 0x4f, 0xc5, 0x99, 0x90, 0x1d, 0x81, 0x97, 0x5c, 0x36, 0xa0, 0xa1, 0x55,
+	0xf0, 0x31, 0x05, 0x6d, 0xf0, 0x0a, 0xa9, 0xa1, 0x6a, 0x28, 0xd3, 0x80, 0x43, 0x93, 0xb3, 0xe6,
+	0x99, 0x0d, 0x52, 0x11, 0x72, 0xb0, 0x42, 0x1a, 0x4b, 0x39, 0x97, 0x1d, 0x08, 0xf1, 0xdf, 0xe4,
+	0x04, 0x1d, 0xc2, 0xb9, 0x01, 0x25, 0x28, 0xb7, 0xa9, 0xe2, 0x4f, 0xb2, 0xab, 0x84, 0xa0, 0xed,
+	0x16, 0xe3, 0x60, 0x8d, 0x94, 0x96, 0x53, 0x15, 0x01, 0x5e, 0x23, 0x1e, 0x7a, 0x13, 0x49, 0x19,
+	0x71, 0xb0, 0x1d, 0x08, 0x6c, 0x08, 0x9a, 0x45, 0x02, 0x94, 0xbd, 0x60, 0x89, 0x2d, 0xb8, 0xce,
+	0x21, 0x49, 0x03, 0xce, 0xf4, 0x29, 0x84, 0x78, 0x9d, 0xec, 0xa2, 0x2d, 0x26, 0xda, 0x94, 0xb3,
+	0xd0, 0x32, 0x91, 0xa4, 0x06, 0xff, 0x43, 0x0e, 0xd1, 0xfe, 0x0c, 0x8a, 0x21, 0x64, 0xf4, 0xa1,
+	0x35, 0xfc, 0x2f, 0xa9, 0xa2, 0xe3, 0x45, 0x19, 0x0b, 0xc2, 0xa8, 0x2e, 0x46, 0xa4, 0x82, 0x76,
+	0xe7, 0x79, 0x16, 0x83, 0x35, 0xdd, 0x04, 0xf0, 0x06, 0xc1, 0x68, 0x73, 0x06, 0x27, 0xd4, 0x9c,
+	0xe2, 0x4d, 0x72, 0x84, 0x2a, 0x33, 0xc4, 0x8d, 0xa5, 0xa0, 0x05, 0x0a, 0x44, 0x13, 0xf0, 0x96,
+	0xab, 0x5e, 0x7a, 0x87, 0xd4, 0xd0, 0x47, 0xa3, 0x6d, 0x93, 0x57, 0xa8, 0x16, 0x33, 0xad, 0x99,
+	0x88, 0x6c, 0xa2, 0x58, 0x4c, 0x55, 0x77, 0x51, 0x17, 0x3b, 0xae, 0x9c, 0x06, 0xd5, 0x06, 0x65,
+	0x41, 0x29, 0xa9, 0x30, 0x76, 0x43, 0x6a, 0x23, 0x15, 0x8d, 0xe0, 0x01, 0xda, 0x25, 0x2f, 0xd0,
+	0x91, 0xee, 0xb0, 0x56, 0xab, 0xbb, 0x68, 0xf1, 0xc4, 0xad, 0xd6, 0x95, 0x8e, 0xa9, 0xe8, 0x16,
+	0x7b, 0xd3, 0x78, 0x8f, 0xec, 0xa1, 0x9d, 0x54, 0xc0, 0x79, 0x02, 0x4d, 0x03, 0xa1, 0xd5, 0xec,
+	0x02, 0xf0, 0x3e, 0xa9, 0xa3, 0xb7, 0xa9, 0xd0, 0x69, 0x92, 0x48, 0xe5, 0xd0, 0x45, 0xbb, 0x07,
+	0xd1, 0x66, 0x4a, 0x8a, 0x18, 0x84, 0xc1, 0x15, 0x57, 0xf8, 0xb1, 0xe0, 0xd4, 0xc4, 0xfc, 0x9d,
+	0x6d, 0x01, 0x35, 0xa9, 0x02, 0xfc, 0x1f, 0x79, 0x8d, 0x5e, 0xba, 0x8d, 0x30, 0xf1, 0x74, 0x36,
+	0xd7, 0x9d, 0xd6, 0xdc, 0x36, 0x65, 0x9c, 0x70, 0x46, 0x85, 0xc1, 0x07, 0xe4, 0x7f, 0x74, 0xd0,
+	0x4c, 0xb5, 0x91, 0xb1, 0x85, 0x73, 0x66, 0x9e, 0x0c, 0x70, 0x18, 0xfc, 0x5c, 0x42, 0xb5, 0x4f,
+	0xd9, 0xb5, 0xf7, 0xe7, 0xff, 0x1f, 0x54, 0x9e, 0xff, 0xe2, 0xc4, 0x7d, 0xfc, 0x64, 0xe9, 0x22,
+	0x7c, 0x10, 0x8e, 0xb2, 0xab, 0xfe, 0x64, 0xe4, 0x65, 0xd3, 0x51, 0x7d, 0x34, 0x9c, 0x14, 0x67,
+	0x31, 0xbb, 0xc0, 0x9b, 0x71, 0xfe, 0xbb, 0x83, 0xfc, 0x50, 0x3e, 0x5f, 0x96, 0x57, 0x22, 0x4a,
+	0xbf, 0x2e, 0x57, 0xa3, 0xd2, 0x8c, 0x0e, 0x72, 0xaf, 0x0c, 0x5d, 0xd4, 0x6e, 0x78, 0x45, 0xc9,
+	0xfc, 0xfb, 0x8c, 0xd0, 0xa3, 0x83, 0xbc, 0x37, 0x27, 0xf4, 0xda, 0x8d, 0x5e, 0x49, 0xf8, 0xb1,
+	0x5c, 0x2b, 0x51, 0xdf, 0xa7, 0x83, 0xdc, 0xf7, 0xe7, 0x14, 0xdf, 0x6f, 0x37, 0x7c, 0xbf, 0x24,
+	0x5d, 0xae, 0x15, 0xdd, 0x35, 0x7e, 0x05, 0x00, 0x00, 0xff, 0xff, 0x97, 0xf5, 0xa9, 0xdd, 0x2d,
+	0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/media_file_error.pb.go b/googleapis/ads/googleads/v3/errors/media_file_error.pb.go
new file mode 100644
index 0000000..7e363ac
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/media_file_error.pb.go
@@ -0,0 +1,230 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/media_file_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible media file errors.
+type MediaFileErrorEnum_MediaFileError int32
+
+const (
+	// Enum unspecified.
+	MediaFileErrorEnum_UNSPECIFIED MediaFileErrorEnum_MediaFileError = 0
+	// The received error code is not known in this version.
+	MediaFileErrorEnum_UNKNOWN MediaFileErrorEnum_MediaFileError = 1
+	// Cannot create a standard icon type.
+	MediaFileErrorEnum_CANNOT_CREATE_STANDARD_ICON MediaFileErrorEnum_MediaFileError = 2
+	// May only select Standard Icons alone.
+	MediaFileErrorEnum_CANNOT_SELECT_STANDARD_ICON_WITH_OTHER_TYPES MediaFileErrorEnum_MediaFileError = 3
+	// Image contains both a media file ID and data.
+	MediaFileErrorEnum_CANNOT_SPECIFY_MEDIA_FILE_ID_AND_DATA MediaFileErrorEnum_MediaFileError = 4
+	// A media file with given type and reference ID already exists.
+	MediaFileErrorEnum_DUPLICATE_MEDIA MediaFileErrorEnum_MediaFileError = 5
+	// A required field was not specified or is an empty string.
+	MediaFileErrorEnum_EMPTY_FIELD MediaFileErrorEnum_MediaFileError = 6
+	// A media file may only be modified once per call.
+	MediaFileErrorEnum_RESOURCE_REFERENCED_IN_MULTIPLE_OPS MediaFileErrorEnum_MediaFileError = 7
+	// Field is not supported for the media sub type.
+	MediaFileErrorEnum_FIELD_NOT_SUPPORTED_FOR_MEDIA_SUB_TYPE MediaFileErrorEnum_MediaFileError = 8
+	// The media file ID is invalid.
+	MediaFileErrorEnum_INVALID_MEDIA_FILE_ID MediaFileErrorEnum_MediaFileError = 9
+	// The media subtype is invalid.
+	MediaFileErrorEnum_INVALID_MEDIA_SUB_TYPE MediaFileErrorEnum_MediaFileError = 10
+	// The media file type is invalid.
+	MediaFileErrorEnum_INVALID_MEDIA_FILE_TYPE MediaFileErrorEnum_MediaFileError = 11
+	// The mimetype is invalid.
+	MediaFileErrorEnum_INVALID_MIME_TYPE MediaFileErrorEnum_MediaFileError = 12
+	// The media reference ID is invalid.
+	MediaFileErrorEnum_INVALID_REFERENCE_ID MediaFileErrorEnum_MediaFileError = 13
+	// The YouTube video ID is invalid.
+	MediaFileErrorEnum_INVALID_YOU_TUBE_ID MediaFileErrorEnum_MediaFileError = 14
+	// Media file has failed transcoding
+	MediaFileErrorEnum_MEDIA_FILE_FAILED_TRANSCODING MediaFileErrorEnum_MediaFileError = 15
+	// Media file has not been transcoded.
+	MediaFileErrorEnum_MEDIA_NOT_TRANSCODED MediaFileErrorEnum_MediaFileError = 16
+	// The media type does not match the actual media file's type.
+	MediaFileErrorEnum_MEDIA_TYPE_DOES_NOT_MATCH_MEDIA_FILE_TYPE MediaFileErrorEnum_MediaFileError = 17
+	// None of the fields have been specified.
+	MediaFileErrorEnum_NO_FIELDS_SPECIFIED MediaFileErrorEnum_MediaFileError = 18
+	// One of reference ID or media file ID must be specified.
+	MediaFileErrorEnum_NULL_REFERENCE_ID_AND_MEDIA_ID MediaFileErrorEnum_MediaFileError = 19
+	// The string has too many characters.
+	MediaFileErrorEnum_TOO_LONG MediaFileErrorEnum_MediaFileError = 20
+	// The specified type is not supported.
+	MediaFileErrorEnum_UNSUPPORTED_TYPE MediaFileErrorEnum_MediaFileError = 21
+	// YouTube is unavailable for requesting video data.
+	MediaFileErrorEnum_YOU_TUBE_SERVICE_UNAVAILABLE MediaFileErrorEnum_MediaFileError = 22
+	// The YouTube video has a non positive duration.
+	MediaFileErrorEnum_YOU_TUBE_VIDEO_HAS_NON_POSITIVE_DURATION MediaFileErrorEnum_MediaFileError = 23
+	// The YouTube video ID is syntactically valid but the video was not found.
+	MediaFileErrorEnum_YOU_TUBE_VIDEO_NOT_FOUND MediaFileErrorEnum_MediaFileError = 24
+)
+
+var MediaFileErrorEnum_MediaFileError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "CANNOT_CREATE_STANDARD_ICON",
+	3:  "CANNOT_SELECT_STANDARD_ICON_WITH_OTHER_TYPES",
+	4:  "CANNOT_SPECIFY_MEDIA_FILE_ID_AND_DATA",
+	5:  "DUPLICATE_MEDIA",
+	6:  "EMPTY_FIELD",
+	7:  "RESOURCE_REFERENCED_IN_MULTIPLE_OPS",
+	8:  "FIELD_NOT_SUPPORTED_FOR_MEDIA_SUB_TYPE",
+	9:  "INVALID_MEDIA_FILE_ID",
+	10: "INVALID_MEDIA_SUB_TYPE",
+	11: "INVALID_MEDIA_FILE_TYPE",
+	12: "INVALID_MIME_TYPE",
+	13: "INVALID_REFERENCE_ID",
+	14: "INVALID_YOU_TUBE_ID",
+	15: "MEDIA_FILE_FAILED_TRANSCODING",
+	16: "MEDIA_NOT_TRANSCODED",
+	17: "MEDIA_TYPE_DOES_NOT_MATCH_MEDIA_FILE_TYPE",
+	18: "NO_FIELDS_SPECIFIED",
+	19: "NULL_REFERENCE_ID_AND_MEDIA_ID",
+	20: "TOO_LONG",
+	21: "UNSUPPORTED_TYPE",
+	22: "YOU_TUBE_SERVICE_UNAVAILABLE",
+	23: "YOU_TUBE_VIDEO_HAS_NON_POSITIVE_DURATION",
+	24: "YOU_TUBE_VIDEO_NOT_FOUND",
+}
+
+var MediaFileErrorEnum_MediaFileError_value = map[string]int32{
+	"UNSPECIFIED":                 0,
+	"UNKNOWN":                     1,
+	"CANNOT_CREATE_STANDARD_ICON": 2,
+	"CANNOT_SELECT_STANDARD_ICON_WITH_OTHER_TYPES": 3,
+	"CANNOT_SPECIFY_MEDIA_FILE_ID_AND_DATA":        4,
+	"DUPLICATE_MEDIA":                              5,
+	"EMPTY_FIELD":                                  6,
+	"RESOURCE_REFERENCED_IN_MULTIPLE_OPS":          7,
+	"FIELD_NOT_SUPPORTED_FOR_MEDIA_SUB_TYPE":       8,
+	"INVALID_MEDIA_FILE_ID":                        9,
+	"INVALID_MEDIA_SUB_TYPE":                       10,
+	"INVALID_MEDIA_FILE_TYPE":                      11,
+	"INVALID_MIME_TYPE":                            12,
+	"INVALID_REFERENCE_ID":                         13,
+	"INVALID_YOU_TUBE_ID":                          14,
+	"MEDIA_FILE_FAILED_TRANSCODING":                15,
+	"MEDIA_NOT_TRANSCODED":                         16,
+	"MEDIA_TYPE_DOES_NOT_MATCH_MEDIA_FILE_TYPE":    17,
+	"NO_FIELDS_SPECIFIED":                          18,
+	"NULL_REFERENCE_ID_AND_MEDIA_ID":               19,
+	"TOO_LONG":                                     20,
+	"UNSUPPORTED_TYPE":                             21,
+	"YOU_TUBE_SERVICE_UNAVAILABLE":                 22,
+	"YOU_TUBE_VIDEO_HAS_NON_POSITIVE_DURATION":     23,
+	"YOU_TUBE_VIDEO_NOT_FOUND":                     24,
+}
+
+func (x MediaFileErrorEnum_MediaFileError) String() string {
+	return proto.EnumName(MediaFileErrorEnum_MediaFileError_name, int32(x))
+}
+
+func (MediaFileErrorEnum_MediaFileError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a6f239b6b744c564, []int{0, 0}
+}
+
+// Container for enum describing possible media file errors.
+type MediaFileErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MediaFileErrorEnum) Reset()         { *m = MediaFileErrorEnum{} }
+func (m *MediaFileErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*MediaFileErrorEnum) ProtoMessage()    {}
+func (*MediaFileErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a6f239b6b744c564, []int{0}
+}
+
+func (m *MediaFileErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaFileErrorEnum.Unmarshal(m, b)
+}
+func (m *MediaFileErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaFileErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *MediaFileErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaFileErrorEnum.Merge(m, src)
+}
+func (m *MediaFileErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_MediaFileErrorEnum.Size(m)
+}
+func (m *MediaFileErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaFileErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaFileErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.MediaFileErrorEnum_MediaFileError", MediaFileErrorEnum_MediaFileError_name, MediaFileErrorEnum_MediaFileError_value)
+	proto.RegisterType((*MediaFileErrorEnum)(nil), "google.ads.googleads.v3.errors.MediaFileErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/media_file_error.proto", fileDescriptor_a6f239b6b744c564)
+}
+
+var fileDescriptor_a6f239b6b744c564 = []byte{
+	// 672 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xcb, 0x6e, 0xd3, 0x40,
+	0x14, 0xa5, 0x29, 0xa4, 0x65, 0x5a, 0xda, 0xe9, 0xa4, 0x2f, 0xda, 0x52, 0x20, 0x88, 0x47, 0x51,
+	0x71, 0x90, 0x22, 0x36, 0x66, 0x35, 0xf1, 0x5c, 0x27, 0x23, 0x9c, 0x19, 0xcb, 0x1e, 0xbb, 0x0a,
+	0x8a, 0x34, 0x0a, 0x24, 0x44, 0x91, 0xd2, 0xb8, 0x8a, 0x4b, 0xd7, 0xfc, 0x05, 0x7b, 0x96, 0x7c,
+	0x0a, 0x9f, 0xc2, 0x82, 0x6f, 0x40, 0xf6, 0x24, 0x2e, 0xe1, 0xb5, 0xca, 0xd5, 0x3d, 0xe7, 0xdc,
+	0x73, 0xee, 0xc4, 0x17, 0xbd, 0x1a, 0x26, 0xc9, 0x70, 0x3c, 0xa8, 0xf5, 0xfa, 0x69, 0xcd, 0x94,
+	0x59, 0x75, 0x55, 0xaf, 0x0d, 0xa6, 0xd3, 0x64, 0x9a, 0xd6, 0xce, 0x07, 0xfd, 0x51, 0x4f, 0x7f,
+	0x18, 0x8d, 0x07, 0x3a, 0xef, 0x58, 0x17, 0xd3, 0xe4, 0x32, 0x21, 0xc7, 0x86, 0x6b, 0xf5, 0xfa,
+	0xa9, 0x55, 0xc8, 0xac, 0xab, 0xba, 0x65, 0x64, 0x07, 0x47, 0xf3, 0xb1, 0x17, 0xa3, 0x5a, 0x6f,
+	0x32, 0x49, 0x2e, 0x7b, 0x97, 0xa3, 0x64, 0x92, 0x1a, 0x75, 0xf5, 0x73, 0x19, 0x91, 0x76, 0x36,
+	0xd8, 0x1d, 0x8d, 0x07, 0x90, 0x29, 0x60, 0xf2, 0xf1, 0xbc, 0xfa, 0xa9, 0x8c, 0x36, 0x16, 0xdb,
+	0x64, 0x13, 0xad, 0x45, 0x22, 0xf4, 0xc1, 0xe1, 0x2e, 0x07, 0x86, 0x6f, 0x90, 0x35, 0xb4, 0x12,
+	0x89, 0x37, 0x42, 0x9e, 0x09, 0xbc, 0x44, 0xee, 0xa3, 0x43, 0x87, 0x0a, 0x21, 0x95, 0x76, 0x02,
+	0xa0, 0x0a, 0x74, 0xa8, 0xa8, 0x60, 0x34, 0x60, 0x9a, 0x3b, 0x52, 0xe0, 0x12, 0x79, 0x89, 0x4e,
+	0x67, 0x84, 0x10, 0x3c, 0x70, 0xd4, 0x22, 0x41, 0x9f, 0x71, 0xd5, 0xd2, 0x52, 0xb5, 0x20, 0xd0,
+	0xaa, 0xe3, 0x43, 0x88, 0x97, 0xc9, 0x09, 0x7a, 0x3c, 0x57, 0xe4, 0xae, 0x1d, 0xdd, 0x06, 0xc6,
+	0xa9, 0x76, 0xb9, 0x07, 0x9a, 0x33, 0x4d, 0x05, 0xd3, 0x8c, 0x2a, 0x8a, 0x6f, 0x92, 0x0a, 0xda,
+	0x64, 0x91, 0xef, 0x71, 0x27, 0x73, 0xce, 0x59, 0xf8, 0x56, 0x16, 0x18, 0xda, 0xbe, 0xea, 0x68,
+	0x97, 0x83, 0xc7, 0x70, 0x99, 0x3c, 0x45, 0x8f, 0x02, 0x08, 0x65, 0x14, 0x38, 0xa0, 0x03, 0x70,
+	0x21, 0x00, 0xe1, 0x00, 0xd3, 0x5c, 0xe8, 0x76, 0xe4, 0x29, 0xee, 0x7b, 0xa0, 0xa5, 0x1f, 0xe2,
+	0x15, 0xf2, 0x1c, 0x3d, 0xc9, 0x35, 0x3a, 0x37, 0x8f, 0x7c, 0x5f, 0x06, 0x0a, 0x98, 0x76, 0x65,
+	0x30, 0x8b, 0x10, 0x46, 0x8d, 0x3c, 0x26, 0x5e, 0x25, 0x77, 0xd1, 0x0e, 0x17, 0x31, 0xf5, 0x38,
+	0x5b, 0x8c, 0x87, 0x6f, 0x93, 0x03, 0xb4, 0xbb, 0x08, 0x15, 0x32, 0x44, 0x0e, 0xd1, 0xde, 0x5f,
+	0x64, 0x39, 0xb8, 0x46, 0x76, 0xd0, 0x56, 0x01, 0xf2, 0xf6, 0xac, 0xbd, 0x4e, 0xf6, 0xd1, 0xf6,
+	0xbc, 0x5d, 0xc4, 0xcf, 0x9c, 0xee, 0x90, 0x3d, 0x54, 0x99, 0x23, 0x1d, 0x19, 0x69, 0x15, 0x35,
+	0x72, 0x60, 0x83, 0x3c, 0x44, 0xf7, 0x7e, 0x19, 0xef, 0x52, 0xee, 0x01, 0xd3, 0x2a, 0xa0, 0x22,
+	0x74, 0x24, 0xe3, 0xa2, 0x89, 0x37, 0xb3, 0xa9, 0x86, 0x92, 0x2d, 0x3b, 0x87, 0x80, 0x61, 0x4c,
+	0x5e, 0xa0, 0x13, 0x83, 0x64, 0xfe, 0x9a, 0x49, 0x08, 0x73, 0x4e, 0x9b, 0x2a, 0xa7, 0xf5, 0x47,
+	0xea, 0xad, 0x2c, 0x84, 0x90, 0xe6, 0xb1, 0x43, 0x7d, 0xfd, 0xa1, 0x10, 0x52, 0x45, 0xc7, 0x22,
+	0xf2, 0xbc, 0x85, 0xd0, 0xf9, 0xbf, 0x67, 0x66, 0x70, 0x86, 0x2b, 0x64, 0x1d, 0xad, 0x2a, 0x29,
+	0xb5, 0x27, 0x45, 0x13, 0x6f, 0x93, 0x6d, 0x84, 0x23, 0x71, 0xfd, 0xf0, 0xb9, 0xc1, 0x0e, 0x79,
+	0x80, 0x8e, 0x8a, 0xed, 0x42, 0x08, 0x62, 0xee, 0x80, 0x8e, 0x04, 0x8d, 0x29, 0xf7, 0x68, 0xc3,
+	0x03, 0xbc, 0x4b, 0x4e, 0xd1, 0xb3, 0x82, 0x11, 0x73, 0x06, 0x52, 0xb7, 0x68, 0x16, 0x5a, 0x68,
+	0x5f, 0x86, 0x5c, 0xf1, 0x18, 0x34, 0x8b, 0x02, 0xaa, 0xb8, 0x14, 0x78, 0x8f, 0x1c, 0xa1, 0xfd,
+	0xdf, 0xd8, 0xd9, 0x7a, 0xae, 0x8c, 0x04, 0xc3, 0xfb, 0x8d, 0x1f, 0x4b, 0xa8, 0xfa, 0x3e, 0x39,
+	0xb7, 0xfe, 0x7f, 0x5e, 0x8d, 0xca, 0xe2, 0x99, 0xf8, 0xd9, 0x55, 0xf9, 0x4b, 0x6f, 0xd9, 0x4c,
+	0x36, 0x4c, 0xc6, 0xbd, 0xc9, 0xd0, 0x4a, 0xa6, 0xc3, 0xda, 0x70, 0x30, 0xc9, 0x6f, 0x6e, 0x7e,
+	0xdc, 0x17, 0xa3, 0xf4, 0x5f, 0xb7, 0xfe, 0xda, 0xfc, 0x7c, 0x29, 0x2d, 0x37, 0x29, 0xfd, 0x5a,
+	0x3a, 0x6e, 0x9a, 0x61, 0xb4, 0x9f, 0x5a, 0xa6, 0xcc, 0xaa, 0xb8, 0x6e, 0xe5, 0x96, 0xe9, 0xb7,
+	0x39, 0xa1, 0x4b, 0xfb, 0x69, 0xb7, 0x20, 0x74, 0xe3, 0x7a, 0xd7, 0x10, 0xbe, 0x97, 0xaa, 0xa6,
+	0x6b, 0xdb, 0xb4, 0x9f, 0xda, 0x76, 0x41, 0xb1, 0xed, 0xb8, 0x6e, 0xdb, 0x86, 0xf4, 0xae, 0x9c,
+	0xa7, 0xab, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xa7, 0x9e, 0xce, 0x44, 0x88, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/media_upload_error.pb.go b/googleapis/ads/googleads/v3/errors/media_upload_error.pb.go
new file mode 100644
index 0000000..a3421f9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/media_upload_error.pb.go
@@ -0,0 +1,151 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/media_upload_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible media uploading errors.
+type MediaUploadErrorEnum_MediaUploadError int32
+
+const (
+	// Enum unspecified.
+	MediaUploadErrorEnum_UNSPECIFIED MediaUploadErrorEnum_MediaUploadError = 0
+	// The received error code is not known in this version.
+	MediaUploadErrorEnum_UNKNOWN MediaUploadErrorEnum_MediaUploadError = 1
+	// The uploaded file is too big.
+	MediaUploadErrorEnum_FILE_TOO_BIG MediaUploadErrorEnum_MediaUploadError = 2
+	// Image data is unparseable.
+	MediaUploadErrorEnum_UNPARSEABLE_IMAGE MediaUploadErrorEnum_MediaUploadError = 3
+	// Animated images are not allowed.
+	MediaUploadErrorEnum_ANIMATED_IMAGE_NOT_ALLOWED MediaUploadErrorEnum_MediaUploadError = 4
+	// The image or media bundle format is not allowed.
+	MediaUploadErrorEnum_FORMAT_NOT_ALLOWED MediaUploadErrorEnum_MediaUploadError = 5
+	// Cannot reference URL external to the media bundle.
+	MediaUploadErrorEnum_EXTERNAL_URL_NOT_ALLOWED MediaUploadErrorEnum_MediaUploadError = 6
+	// HTML5 ad is trying to reference an asset not in .ZIP file.
+	MediaUploadErrorEnum_INVALID_URL_REFERENCE MediaUploadErrorEnum_MediaUploadError = 7
+	// The media bundle contains no primary entry.
+	MediaUploadErrorEnum_MISSING_PRIMARY_MEDIA_BUNDLE_ENTRY MediaUploadErrorEnum_MediaUploadError = 8
+)
+
+var MediaUploadErrorEnum_MediaUploadError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "FILE_TOO_BIG",
+	3: "UNPARSEABLE_IMAGE",
+	4: "ANIMATED_IMAGE_NOT_ALLOWED",
+	5: "FORMAT_NOT_ALLOWED",
+	6: "EXTERNAL_URL_NOT_ALLOWED",
+	7: "INVALID_URL_REFERENCE",
+	8: "MISSING_PRIMARY_MEDIA_BUNDLE_ENTRY",
+}
+
+var MediaUploadErrorEnum_MediaUploadError_value = map[string]int32{
+	"UNSPECIFIED":                        0,
+	"UNKNOWN":                            1,
+	"FILE_TOO_BIG":                       2,
+	"UNPARSEABLE_IMAGE":                  3,
+	"ANIMATED_IMAGE_NOT_ALLOWED":         4,
+	"FORMAT_NOT_ALLOWED":                 5,
+	"EXTERNAL_URL_NOT_ALLOWED":           6,
+	"INVALID_URL_REFERENCE":              7,
+	"MISSING_PRIMARY_MEDIA_BUNDLE_ENTRY": 8,
+}
+
+func (x MediaUploadErrorEnum_MediaUploadError) String() string {
+	return proto.EnumName(MediaUploadErrorEnum_MediaUploadError_name, int32(x))
+}
+
+func (MediaUploadErrorEnum_MediaUploadError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_982d4add0547991f, []int{0, 0}
+}
+
+// Container for enum describing possible media uploading errors.
+type MediaUploadErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MediaUploadErrorEnum) Reset()         { *m = MediaUploadErrorEnum{} }
+func (m *MediaUploadErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*MediaUploadErrorEnum) ProtoMessage()    {}
+func (*MediaUploadErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_982d4add0547991f, []int{0}
+}
+
+func (m *MediaUploadErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaUploadErrorEnum.Unmarshal(m, b)
+}
+func (m *MediaUploadErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaUploadErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *MediaUploadErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaUploadErrorEnum.Merge(m, src)
+}
+func (m *MediaUploadErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_MediaUploadErrorEnum.Size(m)
+}
+func (m *MediaUploadErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaUploadErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaUploadErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.MediaUploadErrorEnum_MediaUploadError", MediaUploadErrorEnum_MediaUploadError_name, MediaUploadErrorEnum_MediaUploadError_value)
+	proto.RegisterType((*MediaUploadErrorEnum)(nil), "google.ads.googleads.v3.errors.MediaUploadErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/media_upload_error.proto", fileDescriptor_982d4add0547991f)
+}
+
+var fileDescriptor_982d4add0547991f = []byte{
+	// 421 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xcf, 0x8a, 0xd3, 0x40,
+	0x1c, 0xb6, 0x59, 0xdd, 0x95, 0x59, 0xc1, 0x71, 0xb0, 0xa2, 0xcb, 0xd2, 0x43, 0x0e, 0x1e, 0x27,
+	0x87, 0x1c, 0x84, 0x78, 0x9a, 0x6c, 0x7e, 0x0d, 0x83, 0xc9, 0x24, 0x4c, 0x93, 0xae, 0x2b, 0x85,
+	0x21, 0x9a, 0x12, 0x0a, 0x6d, 0x26, 0x64, 0xba, 0xfb, 0x12, 0xbe, 0x85, 0x47, 0x1f, 0xc5, 0x47,
+	0xf1, 0x24, 0x3e, 0x81, 0x24, 0x63, 0x0b, 0xbb, 0xa0, 0xa7, 0x7c, 0x7c, 0xff, 0x32, 0x7c, 0x3f,
+	0xf4, 0xae, 0xd1, 0xba, 0xd9, 0xae, 0xbd, 0xaa, 0x36, 0x9e, 0x85, 0x03, 0xba, 0xf3, 0xbd, 0x75,
+	0xdf, 0xeb, 0xde, 0x78, 0xbb, 0x75, 0xbd, 0xa9, 0xd4, 0x6d, 0xb7, 0xd5, 0x55, 0xad, 0x46, 0x8e,
+	0x76, 0xbd, 0xde, 0x6b, 0x32, 0xb3, 0x6e, 0x5a, 0xd5, 0x86, 0x1e, 0x83, 0xf4, 0xce, 0xa7, 0x36,
+	0x78, 0x71, 0x79, 0x28, 0xee, 0x36, 0x5e, 0xd5, 0xb6, 0x7a, 0x5f, 0xed, 0x37, 0xba, 0x35, 0x36,
+	0xed, 0x7e, 0x75, 0xd0, 0xcb, 0x74, 0xa8, 0x2e, 0xc7, 0x66, 0x18, 0x32, 0xd0, 0xde, 0xee, 0xdc,
+	0xdf, 0x13, 0x84, 0x1f, 0x0a, 0xe4, 0x39, 0x3a, 0x2f, 0xc5, 0x22, 0x87, 0x2b, 0x3e, 0xe7, 0x10,
+	0xe1, 0x47, 0xe4, 0x1c, 0x9d, 0x95, 0xe2, 0x83, 0xc8, 0xae, 0x05, 0x9e, 0x10, 0x8c, 0x9e, 0xcd,
+	0x79, 0x02, 0xaa, 0xc8, 0x32, 0x15, 0xf2, 0x18, 0x3b, 0x64, 0x8a, 0x5e, 0x94, 0x22, 0x67, 0x72,
+	0x01, 0x2c, 0x4c, 0x40, 0xf1, 0x94, 0xc5, 0x80, 0x4f, 0xc8, 0x0c, 0x5d, 0x30, 0xc1, 0x53, 0x56,
+	0x40, 0x64, 0x39, 0x25, 0xb2, 0x42, 0xb1, 0x24, 0xc9, 0xae, 0x21, 0xc2, 0x8f, 0xc9, 0x2b, 0x44,
+	0xe6, 0x99, 0x4c, 0x59, 0x71, 0x8f, 0x7f, 0x42, 0x2e, 0xd1, 0x6b, 0xf8, 0x58, 0x80, 0x14, 0x2c,
+	0x51, 0xa5, 0x4c, 0xee, 0xa9, 0xa7, 0xe4, 0x0d, 0x9a, 0x72, 0xb1, 0x64, 0x09, 0x8f, 0x46, 0x51,
+	0xc2, 0x1c, 0x24, 0x88, 0x2b, 0xc0, 0x67, 0xe4, 0x2d, 0x72, 0x53, 0xbe, 0x58, 0x70, 0x11, 0xab,
+	0x5c, 0xf2, 0x94, 0xc9, 0x1b, 0x95, 0x42, 0xc4, 0x99, 0x0a, 0x4b, 0x11, 0x25, 0xa0, 0x40, 0x14,
+	0xf2, 0x06, 0x3f, 0x0d, 0x7f, 0x4d, 0x90, 0xfb, 0x45, 0xef, 0xe8, 0xff, 0x27, 0x0d, 0xa7, 0x0f,
+	0x87, 0xc9, 0x87, 0x2d, 0xf3, 0xc9, 0xa7, 0xe8, 0x6f, 0xb0, 0xd1, 0xdb, 0xaa, 0x6d, 0xa8, 0xee,
+	0x1b, 0xaf, 0x59, 0xb7, 0xe3, 0xd2, 0x87, 0xa3, 0x76, 0x1b, 0xf3, 0xaf, 0x1b, 0xbf, 0xb7, 0x9f,
+	0x6f, 0xce, 0x49, 0xcc, 0xd8, 0x77, 0x67, 0x16, 0xdb, 0x32, 0x56, 0x1b, 0x6a, 0xe1, 0x80, 0x96,
+	0x3e, 0x1d, 0x7f, 0x69, 0x7e, 0x1c, 0x0c, 0x2b, 0x56, 0x9b, 0xd5, 0xd1, 0xb0, 0x5a, 0xfa, 0x2b,
+	0x6b, 0xf8, 0xe9, 0xb8, 0x96, 0x0d, 0x02, 0x56, 0x9b, 0x20, 0x38, 0x5a, 0x82, 0x60, 0xe9, 0x07,
+	0x81, 0x35, 0x7d, 0x3e, 0x1d, 0x5f, 0xe7, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x42, 0x05, 0x58,
+	0x25, 0x80, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/multiplier_error.pb.go b/googleapis/ads/googleads/v3/errors/multiplier_error.pb.go
new file mode 100644
index 0000000..d679a6d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/multiplier_error.pb.go
@@ -0,0 +1,178 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/multiplier_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible multiplier errors.
+type MultiplierErrorEnum_MultiplierError int32
+
+const (
+	// Enum unspecified.
+	MultiplierErrorEnum_UNSPECIFIED MultiplierErrorEnum_MultiplierError = 0
+	// The received error code is not known in this version.
+	MultiplierErrorEnum_UNKNOWN MultiplierErrorEnum_MultiplierError = 1
+	// Multiplier value is too high
+	MultiplierErrorEnum_MULTIPLIER_TOO_HIGH MultiplierErrorEnum_MultiplierError = 2
+	// Multiplier value is too low
+	MultiplierErrorEnum_MULTIPLIER_TOO_LOW MultiplierErrorEnum_MultiplierError = 3
+	// Too many fractional digits
+	MultiplierErrorEnum_TOO_MANY_FRACTIONAL_DIGITS MultiplierErrorEnum_MultiplierError = 4
+	// A multiplier cannot be set for this bidding strategy
+	MultiplierErrorEnum_MULTIPLIER_NOT_ALLOWED_FOR_BIDDING_STRATEGY MultiplierErrorEnum_MultiplierError = 5
+	// A multiplier cannot be set when there is no base bid (e.g., content max
+	// cpc)
+	MultiplierErrorEnum_MULTIPLIER_NOT_ALLOWED_WHEN_BASE_BID_IS_MISSING MultiplierErrorEnum_MultiplierError = 6
+	// A bid multiplier must be specified
+	MultiplierErrorEnum_NO_MULTIPLIER_SPECIFIED MultiplierErrorEnum_MultiplierError = 7
+	// Multiplier causes bid to exceed daily budget
+	MultiplierErrorEnum_MULTIPLIER_CAUSES_BID_TO_EXCEED_DAILY_BUDGET MultiplierErrorEnum_MultiplierError = 8
+	// Multiplier causes bid to exceed monthly budget
+	MultiplierErrorEnum_MULTIPLIER_CAUSES_BID_TO_EXCEED_MONTHLY_BUDGET MultiplierErrorEnum_MultiplierError = 9
+	// Multiplier causes bid to exceed custom budget
+	MultiplierErrorEnum_MULTIPLIER_CAUSES_BID_TO_EXCEED_CUSTOM_BUDGET MultiplierErrorEnum_MultiplierError = 10
+	// Multiplier causes bid to exceed maximum allowed bid
+	MultiplierErrorEnum_MULTIPLIER_CAUSES_BID_TO_EXCEED_MAX_ALLOWED_BID MultiplierErrorEnum_MultiplierError = 11
+	// Multiplier causes bid to become less than the minimum bid allowed
+	MultiplierErrorEnum_BID_LESS_THAN_MIN_ALLOWED_BID_WITH_MULTIPLIER MultiplierErrorEnum_MultiplierError = 12
+	// Multiplier type (cpc vs. cpm) needs to match campaign's bidding strategy
+	MultiplierErrorEnum_MULTIPLIER_AND_BIDDING_STRATEGY_TYPE_MISMATCH MultiplierErrorEnum_MultiplierError = 13
+)
+
+var MultiplierErrorEnum_MultiplierError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "MULTIPLIER_TOO_HIGH",
+	3:  "MULTIPLIER_TOO_LOW",
+	4:  "TOO_MANY_FRACTIONAL_DIGITS",
+	5:  "MULTIPLIER_NOT_ALLOWED_FOR_BIDDING_STRATEGY",
+	6:  "MULTIPLIER_NOT_ALLOWED_WHEN_BASE_BID_IS_MISSING",
+	7:  "NO_MULTIPLIER_SPECIFIED",
+	8:  "MULTIPLIER_CAUSES_BID_TO_EXCEED_DAILY_BUDGET",
+	9:  "MULTIPLIER_CAUSES_BID_TO_EXCEED_MONTHLY_BUDGET",
+	10: "MULTIPLIER_CAUSES_BID_TO_EXCEED_CUSTOM_BUDGET",
+	11: "MULTIPLIER_CAUSES_BID_TO_EXCEED_MAX_ALLOWED_BID",
+	12: "BID_LESS_THAN_MIN_ALLOWED_BID_WITH_MULTIPLIER",
+	13: "MULTIPLIER_AND_BIDDING_STRATEGY_TYPE_MISMATCH",
+}
+
+var MultiplierErrorEnum_MultiplierError_value = map[string]int32{
+	"UNSPECIFIED":                0,
+	"UNKNOWN":                    1,
+	"MULTIPLIER_TOO_HIGH":        2,
+	"MULTIPLIER_TOO_LOW":         3,
+	"TOO_MANY_FRACTIONAL_DIGITS": 4,
+	"MULTIPLIER_NOT_ALLOWED_FOR_BIDDING_STRATEGY":     5,
+	"MULTIPLIER_NOT_ALLOWED_WHEN_BASE_BID_IS_MISSING": 6,
+	"NO_MULTIPLIER_SPECIFIED":                         7,
+	"MULTIPLIER_CAUSES_BID_TO_EXCEED_DAILY_BUDGET":    8,
+	"MULTIPLIER_CAUSES_BID_TO_EXCEED_MONTHLY_BUDGET":  9,
+	"MULTIPLIER_CAUSES_BID_TO_EXCEED_CUSTOM_BUDGET":   10,
+	"MULTIPLIER_CAUSES_BID_TO_EXCEED_MAX_ALLOWED_BID": 11,
+	"BID_LESS_THAN_MIN_ALLOWED_BID_WITH_MULTIPLIER":   12,
+	"MULTIPLIER_AND_BIDDING_STRATEGY_TYPE_MISMATCH":   13,
+}
+
+func (x MultiplierErrorEnum_MultiplierError) String() string {
+	return proto.EnumName(MultiplierErrorEnum_MultiplierError_name, int32(x))
+}
+
+func (MultiplierErrorEnum_MultiplierError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6fca1f045fa667f7, []int{0, 0}
+}
+
+// Container for enum describing possible multiplier errors.
+type MultiplierErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MultiplierErrorEnum) Reset()         { *m = MultiplierErrorEnum{} }
+func (m *MultiplierErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*MultiplierErrorEnum) ProtoMessage()    {}
+func (*MultiplierErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6fca1f045fa667f7, []int{0}
+}
+
+func (m *MultiplierErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MultiplierErrorEnum.Unmarshal(m, b)
+}
+func (m *MultiplierErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MultiplierErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *MultiplierErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MultiplierErrorEnum.Merge(m, src)
+}
+func (m *MultiplierErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_MultiplierErrorEnum.Size(m)
+}
+func (m *MultiplierErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MultiplierErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MultiplierErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.MultiplierErrorEnum_MultiplierError", MultiplierErrorEnum_MultiplierError_name, MultiplierErrorEnum_MultiplierError_value)
+	proto.RegisterType((*MultiplierErrorEnum)(nil), "google.ads.googleads.v3.errors.MultiplierErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/multiplier_error.proto", fileDescriptor_6fca1f045fa667f7)
+}
+
+var fileDescriptor_6fca1f045fa667f7 = []byte{
+	// 521 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xc1, 0x8e, 0xd3, 0x30,
+	0x10, 0x86, 0x69, 0xb7, 0xec, 0x82, 0x0b, 0x5a, 0xcb, 0x8b, 0x58, 0x69, 0x41, 0x3d, 0xf4, 0x0a,
+	0x24, 0x40, 0xc4, 0x25, 0x9c, 0x9c, 0xd8, 0x4d, 0x2c, 0x12, 0xbb, 0xaa, 0x9d, 0x76, 0x8b, 0x2a,
+	0x59, 0x85, 0x56, 0x51, 0xa5, 0x36, 0xa9, 0x92, 0xee, 0x3e, 0x10, 0x47, 0x5e, 0x80, 0x77, 0xe0,
+	0xc2, 0x7b, 0x70, 0xe1, 0x15, 0x50, 0x6a, 0xda, 0xad, 0x02, 0xcb, 0x9e, 0x32, 0x19, 0xff, 0xdf,
+	0x8c, 0x67, 0xf4, 0x1b, 0xbc, 0x4b, 0xf3, 0x3c, 0x5d, 0xce, 0xed, 0xe9, 0xac, 0xb4, 0x4d, 0x58,
+	0x45, 0xd7, 0x8e, 0x3d, 0x2f, 0x8a, 0xbc, 0x28, 0xed, 0xd5, 0xd5, 0x72, 0xb3, 0x58, 0x2f, 0x17,
+	0xf3, 0x42, 0x6f, 0x33, 0xd6, 0xba, 0xc8, 0x37, 0x39, 0xea, 0x18, 0xad, 0x35, 0x9d, 0x95, 0xd6,
+	0x1e, 0xb3, 0xae, 0x1d, 0xcb, 0x60, 0x17, 0xcf, 0x77, 0x65, 0xd7, 0x0b, 0x7b, 0x9a, 0x65, 0xf9,
+	0x66, 0xba, 0x59, 0xe4, 0x59, 0x69, 0xe8, 0xee, 0x8f, 0x16, 0x38, 0x8b, 0xf7, 0x85, 0x69, 0x85,
+	0xd0, 0xec, 0x6a, 0xd5, 0xfd, 0xd6, 0x02, 0xa7, 0xb5, 0x3c, 0x3a, 0x05, 0xed, 0x84, 0xcb, 0x3e,
+	0xf5, 0x59, 0x8f, 0x51, 0x02, 0xef, 0xa1, 0x36, 0x38, 0x49, 0xf8, 0x07, 0x2e, 0x46, 0x1c, 0x36,
+	0xd0, 0x39, 0x38, 0x8b, 0x93, 0x48, 0xb1, 0x7e, 0xc4, 0xe8, 0x40, 0x2b, 0x21, 0x74, 0xc8, 0x82,
+	0x10, 0x36, 0xd1, 0x53, 0x80, 0x6a, 0x07, 0x91, 0x18, 0xc1, 0x23, 0xd4, 0x01, 0x17, 0xd5, 0x4f,
+	0x8c, 0xf9, 0x58, 0xf7, 0x06, 0xd8, 0x57, 0x4c, 0x70, 0x1c, 0x69, 0xc2, 0x02, 0xa6, 0x24, 0x6c,
+	0x21, 0x1b, 0xbc, 0x38, 0xe0, 0xb8, 0x50, 0x1a, 0x47, 0x91, 0x18, 0x51, 0xa2, 0x7b, 0x62, 0xa0,
+	0x3d, 0x46, 0x08, 0xe3, 0x81, 0x96, 0x6a, 0x80, 0x15, 0x0d, 0xc6, 0xf0, 0x3e, 0x72, 0x80, 0x7d,
+	0x0b, 0x30, 0x0a, 0x29, 0xd7, 0x1e, 0x96, 0xb4, 0xc2, 0x34, 0x93, 0x3a, 0x66, 0x52, 0x32, 0x1e,
+	0xc0, 0x63, 0xf4, 0x0c, 0x9c, 0x73, 0xa1, 0x0f, 0xb8, 0x9b, 0x01, 0x4f, 0xd0, 0x6b, 0xf0, 0xf2,
+	0xe0, 0xc4, 0xc7, 0x89, 0xa4, 0x72, 0x5b, 0x42, 0x09, 0x4d, 0x2f, 0x7d, 0x4a, 0x89, 0x26, 0x98,
+	0x45, 0x63, 0xed, 0x25, 0x24, 0xa0, 0x0a, 0x3e, 0x40, 0x6f, 0x81, 0x75, 0x17, 0x11, 0x0b, 0xae,
+	0xc2, 0x1b, 0xe6, 0x21, 0x7a, 0x03, 0x5e, 0xdd, 0xc5, 0xf8, 0x89, 0x54, 0x22, 0xde, 0x21, 0xa0,
+	0x36, 0xea, 0xbf, 0xdb, 0xe0, 0xcb, 0xfd, 0xfc, 0x1e, 0x23, 0xb0, 0x5d, 0xf5, 0xa9, 0x24, 0x11,
+	0x95, 0x52, 0xab, 0x10, 0x73, 0x1d, 0x33, 0x7e, 0x28, 0xd1, 0x23, 0xa6, 0xc2, 0x83, 0x55, 0xc0,
+	0x47, 0xb5, 0xab, 0x61, 0x4e, 0xfe, 0xda, 0xbb, 0x56, 0xe3, 0x3e, 0xad, 0xf6, 0x19, 0x63, 0xe5,
+	0x87, 0xf0, 0xb1, 0xf7, 0xab, 0x01, 0xba, 0x9f, 0xf3, 0x95, 0xf5, 0x7f, 0x5b, 0x7a, 0x4f, 0x6a,
+	0xee, 0xea, 0x57, 0x76, 0xec, 0x37, 0x3e, 0x92, 0x3f, 0x5c, 0x9a, 0x2f, 0xa7, 0x59, 0x6a, 0xe5,
+	0x45, 0x6a, 0xa7, 0xf3, 0x6c, 0x6b, 0xd6, 0xdd, 0xab, 0x58, 0x2f, 0xca, 0xdb, 0x1e, 0xc9, 0x7b,
+	0xf3, 0xf9, 0xd2, 0x3c, 0x0a, 0x30, 0xfe, 0xda, 0xec, 0x04, 0xa6, 0x18, 0x9e, 0x95, 0x96, 0x09,
+	0xab, 0x68, 0xe8, 0x58, 0xdb, 0x96, 0xe5, 0xf7, 0x9d, 0x60, 0x82, 0x67, 0xe5, 0x64, 0x2f, 0x98,
+	0x0c, 0x9d, 0x89, 0x11, 0xfc, 0x6c, 0x76, 0x4d, 0xd6, 0x75, 0xf1, 0xac, 0x74, 0xdd, 0xbd, 0xc4,
+	0x75, 0x87, 0x8e, 0xeb, 0x1a, 0xd1, 0xa7, 0xe3, 0xed, 0xed, 0x9c, 0xdf, 0x01, 0x00, 0x00, 0xff,
+	0xff, 0x59, 0x40, 0x32, 0xd8, 0xc1, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/mutate_error.pb.go b/googleapis/ads/googleads/v3/errors/mutate_error.pb.go
new file mode 100644
index 0000000..26077b0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/mutate_error.pb.go
@@ -0,0 +1,146 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/mutate_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible mutate errors.
+type MutateErrorEnum_MutateError int32
+
+const (
+	// Enum unspecified.
+	MutateErrorEnum_UNSPECIFIED MutateErrorEnum_MutateError = 0
+	// The received error code is not known in this version.
+	MutateErrorEnum_UNKNOWN MutateErrorEnum_MutateError = 1
+	// Requested resource was not found.
+	MutateErrorEnum_RESOURCE_NOT_FOUND MutateErrorEnum_MutateError = 3
+	// Cannot mutate the same resource twice in one request.
+	MutateErrorEnum_ID_EXISTS_IN_MULTIPLE_MUTATES MutateErrorEnum_MutateError = 7
+	// The field's contents don't match another field that represents the same
+	// data.
+	MutateErrorEnum_INCONSISTENT_FIELD_VALUES MutateErrorEnum_MutateError = 8
+	// Mutates are not allowed for the requested resource.
+	MutateErrorEnum_MUTATE_NOT_ALLOWED MutateErrorEnum_MutateError = 9
+	// The resource isn't in Google Ads. It belongs to another ads system.
+	MutateErrorEnum_RESOURCE_NOT_IN_GOOGLE_ADS MutateErrorEnum_MutateError = 10
+	// The resource being created already exists.
+	MutateErrorEnum_RESOURCE_ALREADY_EXISTS MutateErrorEnum_MutateError = 11
+)
+
+var MutateErrorEnum_MutateError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	3:  "RESOURCE_NOT_FOUND",
+	7:  "ID_EXISTS_IN_MULTIPLE_MUTATES",
+	8:  "INCONSISTENT_FIELD_VALUES",
+	9:  "MUTATE_NOT_ALLOWED",
+	10: "RESOURCE_NOT_IN_GOOGLE_ADS",
+	11: "RESOURCE_ALREADY_EXISTS",
+}
+
+var MutateErrorEnum_MutateError_value = map[string]int32{
+	"UNSPECIFIED":                   0,
+	"UNKNOWN":                       1,
+	"RESOURCE_NOT_FOUND":            3,
+	"ID_EXISTS_IN_MULTIPLE_MUTATES": 7,
+	"INCONSISTENT_FIELD_VALUES":     8,
+	"MUTATE_NOT_ALLOWED":            9,
+	"RESOURCE_NOT_IN_GOOGLE_ADS":    10,
+	"RESOURCE_ALREADY_EXISTS":       11,
+}
+
+func (x MutateErrorEnum_MutateError) String() string {
+	return proto.EnumName(MutateErrorEnum_MutateError_name, int32(x))
+}
+
+func (MutateErrorEnum_MutateError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_29e86d4daa207c30, []int{0, 0}
+}
+
+// Container for enum describing possible mutate errors.
+type MutateErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateErrorEnum) Reset()         { *m = MutateErrorEnum{} }
+func (m *MutateErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*MutateErrorEnum) ProtoMessage()    {}
+func (*MutateErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_29e86d4daa207c30, []int{0}
+}
+
+func (m *MutateErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateErrorEnum.Unmarshal(m, b)
+}
+func (m *MutateErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *MutateErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateErrorEnum.Merge(m, src)
+}
+func (m *MutateErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_MutateErrorEnum.Size(m)
+}
+func (m *MutateErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.MutateErrorEnum_MutateError", MutateErrorEnum_MutateError_name, MutateErrorEnum_MutateError_value)
+	proto.RegisterType((*MutateErrorEnum)(nil), "google.ads.googleads.v3.errors.MutateErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/mutate_error.proto", fileDescriptor_29e86d4daa207c30)
+}
+
+var fileDescriptor_29e86d4daa207c30 = []byte{
+	// 399 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x8e, 0xd3, 0x30,
+	0x18, 0x85, 0x49, 0x47, 0x62, 0xc0, 0x5d, 0x8c, 0xe5, 0x05, 0x88, 0x81, 0xa9, 0x44, 0x0f, 0xe0,
+	0x08, 0x65, 0x67, 0x56, 0x9e, 0xda, 0xad, 0x2c, 0x5c, 0xbb, 0xaa, 0x93, 0x0e, 0xa0, 0x4a, 0x56,
+	0x20, 0x51, 0x54, 0x69, 0x1a, 0x57, 0x71, 0x66, 0x0e, 0xc4, 0x92, 0xa3, 0x70, 0x04, 0x8e, 0x00,
+	0x12, 0x67, 0x40, 0x89, 0xa7, 0x51, 0x59, 0x30, 0xab, 0xbc, 0xd8, 0xdf, 0x7b, 0xfe, 0xf5, 0x7e,
+	0xf0, 0xae, 0x72, 0xae, 0xba, 0x2d, 0xe3, 0xbc, 0xf0, 0x71, 0x90, 0x9d, 0xba, 0x4f, 0xe2, 0xb2,
+	0x69, 0x5c, 0xe3, 0xe3, 0xfd, 0x5d, 0x9b, 0xb7, 0xa5, 0xed, 0xff, 0xf0, 0xa1, 0x71, 0xad, 0x43,
+	0x93, 0xc0, 0xe1, 0xbc, 0xf0, 0x78, 0xb0, 0xe0, 0xfb, 0x04, 0x07, 0xcb, 0xe5, 0x9b, 0x63, 0xe4,
+	0x61, 0x17, 0xe7, 0x75, 0xed, 0xda, 0xbc, 0xdd, 0xb9, 0xda, 0x07, 0xf7, 0xf4, 0x4f, 0x04, 0x2e,
+	0x96, 0x7d, 0x28, 0xef, 0x70, 0x5e, 0xdf, 0xed, 0xa7, 0x3f, 0x23, 0x30, 0x3e, 0x39, 0x43, 0x17,
+	0x60, 0x9c, 0x29, 0xb3, 0xe2, 0x33, 0x31, 0x17, 0x9c, 0xc1, 0x27, 0x68, 0x0c, 0xce, 0x33, 0xf5,
+	0x41, 0xe9, 0x1b, 0x05, 0x23, 0xf4, 0x02, 0xa0, 0x35, 0x37, 0x3a, 0x5b, 0xcf, 0xb8, 0x55, 0x3a,
+	0xb5, 0x73, 0x9d, 0x29, 0x06, 0xcf, 0xd0, 0x5b, 0x70, 0x25, 0x98, 0xe5, 0x1f, 0x85, 0x49, 0x8d,
+	0x15, 0xca, 0x2e, 0x33, 0x99, 0x8a, 0x95, 0xe4, 0x76, 0x99, 0xa5, 0x34, 0xe5, 0x06, 0x9e, 0xa3,
+	0x2b, 0xf0, 0x4a, 0xa8, 0x99, 0x56, 0x46, 0x98, 0x94, 0xab, 0xd4, 0xce, 0x05, 0x97, 0xcc, 0x6e,
+	0xa8, 0xcc, 0xb8, 0x81, 0xcf, 0xba, 0xe4, 0xc0, 0xf6, 0xb9, 0x54, 0x4a, 0x7d, 0xc3, 0x19, 0x7c,
+	0x8e, 0x26, 0xe0, 0xf2, 0x9f, 0x17, 0x85, 0xb2, 0x0b, 0xad, 0x17, 0x92, 0x5b, 0xca, 0x0c, 0x04,
+	0xe8, 0x35, 0x78, 0x39, 0xdc, 0x53, 0xb9, 0xe6, 0x94, 0x7d, 0x7a, 0x98, 0x03, 0x8e, 0xaf, 0x7f,
+	0x47, 0x60, 0xfa, 0xd5, 0xed, 0xf1, 0xe3, 0xad, 0x5d, 0xc3, 0x93, 0x02, 0x56, 0x5d, 0x53, 0xab,
+	0xe8, 0x33, 0x7b, 0xf0, 0x54, 0xee, 0x36, 0xaf, 0x2b, 0xec, 0x9a, 0x2a, 0xae, 0xca, 0xba, 0xef,
+	0xf1, 0xb8, 0xac, 0xc3, 0xce, 0xff, 0x6f, 0x77, 0xef, 0xc3, 0xe7, 0xdb, 0xe8, 0x6c, 0x41, 0xe9,
+	0xf7, 0xd1, 0x64, 0x11, 0xc2, 0x68, 0xe1, 0x71, 0x90, 0x9d, 0xda, 0x24, 0xb8, 0x7f, 0xd2, 0xff,
+	0x38, 0x02, 0x5b, 0x5a, 0xf8, 0xed, 0x00, 0x6c, 0x37, 0xc9, 0x36, 0x00, 0xbf, 0x46, 0xd3, 0x70,
+	0x4a, 0x08, 0x2d, 0x3c, 0x21, 0x03, 0x42, 0xc8, 0x26, 0x21, 0x24, 0x40, 0x5f, 0x9e, 0xf6, 0xd3,
+	0x25, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x09, 0x19, 0x3b, 0x84, 0x58, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/mutate_job_error.pb.go b/googleapis/ads/googleads/v3/errors/mutate_job_error.pb.go
new file mode 100644
index 0000000..883a95c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/mutate_job_error.pb.go
@@ -0,0 +1,142 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/mutate_job_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible request errors.
+type MutateJobErrorEnum_MutateJobError int32
+
+const (
+	// Enum unspecified.
+	MutateJobErrorEnum_UNSPECIFIED MutateJobErrorEnum_MutateJobError = 0
+	// The received error code is not known in this version.
+	MutateJobErrorEnum_UNKNOWN MutateJobErrorEnum_MutateJobError = 1
+	// The mutate job cannot add more operations or run after it has started
+	// running.
+	MutateJobErrorEnum_CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING MutateJobErrorEnum_MutateJobError = 2
+	// The operations for an AddMutateJobOperations request were empty.
+	MutateJobErrorEnum_EMPTY_OPERATIONS MutateJobErrorEnum_MutateJobError = 3
+	// The sequence token for an AddMutateJobOperations request was invalid.
+	MutateJobErrorEnum_INVALID_SEQUENCE_TOKEN MutateJobErrorEnum_MutateJobError = 4
+	// Mutate Job Results can only be retrieved once the job is finished.
+	MutateJobErrorEnum_RESULTS_NOT_READY MutateJobErrorEnum_MutateJobError = 5
+	// The page size for ListMutateJobResults was invalid.
+	MutateJobErrorEnum_INVALID_PAGE_SIZE MutateJobErrorEnum_MutateJobError = 6
+)
+
+var MutateJobErrorEnum_MutateJobError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING",
+	3: "EMPTY_OPERATIONS",
+	4: "INVALID_SEQUENCE_TOKEN",
+	5: "RESULTS_NOT_READY",
+	6: "INVALID_PAGE_SIZE",
+}
+
+var MutateJobErrorEnum_MutateJobError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING": 2,
+	"EMPTY_OPERATIONS":                           3,
+	"INVALID_SEQUENCE_TOKEN":                     4,
+	"RESULTS_NOT_READY":                          5,
+	"INVALID_PAGE_SIZE":                          6,
+}
+
+func (x MutateJobErrorEnum_MutateJobError) String() string {
+	return proto.EnumName(MutateJobErrorEnum_MutateJobError_name, int32(x))
+}
+
+func (MutateJobErrorEnum_MutateJobError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fa41785fa27c2e49, []int{0, 0}
+}
+
+// Container for enum describing possible mutate job errors.
+type MutateJobErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateJobErrorEnum) Reset()         { *m = MutateJobErrorEnum{} }
+func (m *MutateJobErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*MutateJobErrorEnum) ProtoMessage()    {}
+func (*MutateJobErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fa41785fa27c2e49, []int{0}
+}
+
+func (m *MutateJobErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateJobErrorEnum.Unmarshal(m, b)
+}
+func (m *MutateJobErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateJobErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *MutateJobErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateJobErrorEnum.Merge(m, src)
+}
+func (m *MutateJobErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_MutateJobErrorEnum.Size(m)
+}
+func (m *MutateJobErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateJobErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateJobErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.MutateJobErrorEnum_MutateJobError", MutateJobErrorEnum_MutateJobError_name, MutateJobErrorEnum_MutateJobError_value)
+	proto.RegisterType((*MutateJobErrorEnum)(nil), "google.ads.googleads.v3.errors.MutateJobErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/mutate_job_error.proto", fileDescriptor_fa41785fa27c2e49)
+}
+
+var fileDescriptor_fa41785fa27c2e49 = []byte{
+	// 398 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x4f, 0x6e, 0xd4, 0x30,
+	0x18, 0xc5, 0xc9, 0x14, 0x8a, 0xe4, 0x4a, 0x60, 0xcc, 0x9f, 0x45, 0x85, 0xba, 0x98, 0x25, 0x0b,
+	0x67, 0x11, 0xb1, 0x31, 0x2b, 0xcf, 0xc4, 0x13, 0xb9, 0xed, 0x38, 0x21, 0x76, 0x82, 0xa6, 0x8a,
+	0x64, 0x65, 0x48, 0x14, 0x0d, 0xea, 0xc4, 0xa3, 0x38, 0xed, 0x81, 0x58, 0x72, 0x08, 0x0e, 0xc0,
+	0x9e, 0x4b, 0xb0, 0xe0, 0x0c, 0x28, 0x31, 0x19, 0xa9, 0x0b, 0x58, 0xe5, 0xe9, 0xe9, 0xfd, 0xbe,
+	0x2f, 0x7e, 0x1f, 0x78, 0xdf, 0x18, 0xd3, 0xdc, 0xd6, 0x7e, 0x59, 0x59, 0xdf, 0xc9, 0x41, 0xdd,
+	0x07, 0x7e, 0xdd, 0x75, 0xa6, 0xb3, 0xfe, 0xfe, 0xae, 0x2f, 0xfb, 0x5a, 0x7f, 0x31, 0x5b, 0x3d,
+	0x3a, 0xf8, 0xd0, 0x99, 0xde, 0xa0, 0x0b, 0x97, 0xc5, 0x65, 0x65, 0xf1, 0x11, 0xc3, 0xf7, 0x01,
+	0x76, 0xd8, 0xf9, 0xdb, 0x69, 0xec, 0x61, 0xe7, 0x97, 0x6d, 0x6b, 0xfa, 0xb2, 0xdf, 0x99, 0xd6,
+	0x3a, 0x7a, 0xfe, 0xd3, 0x03, 0x68, 0x3d, 0x0e, 0xbe, 0x34, 0x5b, 0x36, 0x10, 0xac, 0xbd, 0xdb,
+	0xcf, 0xbf, 0x7b, 0xe0, 0xd9, 0x43, 0x1b, 0x3d, 0x07, 0x67, 0x99, 0x90, 0x09, 0x5b, 0xf2, 0x15,
+	0x67, 0x21, 0x7c, 0x84, 0xce, 0xc0, 0xd3, 0x4c, 0x5c, 0x89, 0xf8, 0x93, 0x80, 0x1e, 0xc2, 0xe0,
+	0xdd, 0x92, 0x0a, 0x11, 0x2b, 0xbd, 0x8e, 0x43, 0xbe, 0xda, 0xe8, 0xcb, 0x78, 0xa1, 0xe9, 0x4a,
+	0xb1, 0x74, 0x54, 0x52, 0xd1, 0x54, 0x49, 0x9d, 0x66, 0x42, 0x70, 0x11, 0xc1, 0x19, 0x7a, 0x05,
+	0x20, 0x5b, 0x27, 0x6a, 0xa3, 0xe3, 0x84, 0xa5, 0x54, 0xf1, 0x58, 0x48, 0x78, 0x82, 0xce, 0xc1,
+	0x1b, 0x2e, 0x72, 0x7a, 0xcd, 0x43, 0x2d, 0xd9, 0xc7, 0x8c, 0x89, 0x25, 0xd3, 0x2a, 0xbe, 0x62,
+	0x02, 0x3e, 0x46, 0xaf, 0xc1, 0x8b, 0x94, 0xc9, 0xec, 0x5a, 0x49, 0x3d, 0xac, 0x49, 0x19, 0x0d,
+	0x37, 0xf0, 0xc9, 0x60, 0x4f, 0x48, 0x42, 0x23, 0xa6, 0x25, 0xbf, 0x61, 0xf0, 0x74, 0xf1, 0xdb,
+	0x03, 0xf3, 0xcf, 0x66, 0x8f, 0xff, 0x5f, 0xce, 0xe2, 0xe5, 0xc3, 0x47, 0x26, 0x43, 0x27, 0x89,
+	0x77, 0x13, 0xfe, 0xc5, 0x1a, 0x73, 0x5b, 0xb6, 0x0d, 0x36, 0x5d, 0xe3, 0x37, 0x75, 0x3b, 0x36,
+	0x36, 0x9d, 0xe6, 0xb0, 0xb3, 0xff, 0xba, 0xd4, 0x07, 0xf7, 0xf9, 0x3a, 0x3b, 0x89, 0x28, 0xfd,
+	0x36, 0xbb, 0x88, 0xdc, 0x30, 0x5a, 0x59, 0xec, 0xe4, 0xa0, 0xf2, 0x00, 0x8f, 0x2b, 0xed, 0x8f,
+	0x29, 0x50, 0xd0, 0xca, 0x16, 0xc7, 0x40, 0x91, 0x07, 0x85, 0x0b, 0xfc, 0x9a, 0xcd, 0x9d, 0x4b,
+	0x08, 0xad, 0x2c, 0x21, 0xc7, 0x08, 0x21, 0x79, 0x40, 0x88, 0x0b, 0x6d, 0x4f, 0xc7, 0xbf, 0x0b,
+	0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x60, 0x66, 0xf4, 0xa3, 0x46, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/new_resource_creation_error.pb.go b/googleapis/ads/googleads/v3/errors/new_resource_creation_error.pb.go
new file mode 100644
index 0000000..0d822f8
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/new_resource_creation_error.pb.go
@@ -0,0 +1,132 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/new_resource_creation_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible new resource creation errors.
+type NewResourceCreationErrorEnum_NewResourceCreationError int32
+
+const (
+	// Enum unspecified.
+	NewResourceCreationErrorEnum_UNSPECIFIED NewResourceCreationErrorEnum_NewResourceCreationError = 0
+	// The received error code is not known in this version.
+	NewResourceCreationErrorEnum_UNKNOWN NewResourceCreationErrorEnum_NewResourceCreationError = 1
+	// Do not set the id field while creating new resources.
+	NewResourceCreationErrorEnum_CANNOT_SET_ID_FOR_CREATE NewResourceCreationErrorEnum_NewResourceCreationError = 2
+	// Creating more than one resource with the same temp ID is not allowed.
+	NewResourceCreationErrorEnum_DUPLICATE_TEMP_IDS NewResourceCreationErrorEnum_NewResourceCreationError = 3
+	// Parent resource with specified temp ID failed validation, so no
+	// validation will be done for this child resource.
+	NewResourceCreationErrorEnum_TEMP_ID_RESOURCE_HAD_ERRORS NewResourceCreationErrorEnum_NewResourceCreationError = 4
+)
+
+var NewResourceCreationErrorEnum_NewResourceCreationError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CANNOT_SET_ID_FOR_CREATE",
+	3: "DUPLICATE_TEMP_IDS",
+	4: "TEMP_ID_RESOURCE_HAD_ERRORS",
+}
+
+var NewResourceCreationErrorEnum_NewResourceCreationError_value = map[string]int32{
+	"UNSPECIFIED":                 0,
+	"UNKNOWN":                     1,
+	"CANNOT_SET_ID_FOR_CREATE":    2,
+	"DUPLICATE_TEMP_IDS":          3,
+	"TEMP_ID_RESOURCE_HAD_ERRORS": 4,
+}
+
+func (x NewResourceCreationErrorEnum_NewResourceCreationError) String() string {
+	return proto.EnumName(NewResourceCreationErrorEnum_NewResourceCreationError_name, int32(x))
+}
+
+func (NewResourceCreationErrorEnum_NewResourceCreationError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_629e6b04c6296440, []int{0, 0}
+}
+
+// Container for enum describing possible new resource creation errors.
+type NewResourceCreationErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *NewResourceCreationErrorEnum) Reset()         { *m = NewResourceCreationErrorEnum{} }
+func (m *NewResourceCreationErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*NewResourceCreationErrorEnum) ProtoMessage()    {}
+func (*NewResourceCreationErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_629e6b04c6296440, []int{0}
+}
+
+func (m *NewResourceCreationErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_NewResourceCreationErrorEnum.Unmarshal(m, b)
+}
+func (m *NewResourceCreationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_NewResourceCreationErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *NewResourceCreationErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_NewResourceCreationErrorEnum.Merge(m, src)
+}
+func (m *NewResourceCreationErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_NewResourceCreationErrorEnum.Size(m)
+}
+func (m *NewResourceCreationErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_NewResourceCreationErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_NewResourceCreationErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.NewResourceCreationErrorEnum_NewResourceCreationError", NewResourceCreationErrorEnum_NewResourceCreationError_name, NewResourceCreationErrorEnum_NewResourceCreationError_value)
+	proto.RegisterType((*NewResourceCreationErrorEnum)(nil), "google.ads.googleads.v3.errors.NewResourceCreationErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/new_resource_creation_error.proto", fileDescriptor_629e6b04c6296440)
+}
+
+var fileDescriptor_629e6b04c6296440 = []byte{
+	// 366 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x4f, 0x6e, 0xa3, 0x30,
+	0x14, 0xc6, 0x07, 0x32, 0x9a, 0x91, 0x9c, 0xc5, 0x20, 0x16, 0xa3, 0x68, 0x26, 0x93, 0x91, 0x38,
+	0x80, 0x59, 0xb0, 0xf3, 0x6c, 0xc6, 0x01, 0x27, 0x45, 0x6d, 0x01, 0x19, 0x48, 0xa5, 0x0a, 0xc9,
+	0xa2, 0xc1, 0x42, 0x91, 0x12, 0x1c, 0xd9, 0xf9, 0x73, 0x8c, 0xde, 0xa1, 0xcb, 0xae, 0x7a, 0x8e,
+	0x1e, 0xa5, 0x27, 0xe8, 0xb2, 0x02, 0x93, 0xec, 0xd2, 0x15, 0x1f, 0xf6, 0xef, 0x7d, 0xdf, 0x7b,
+	0x7e, 0xe0, 0x7f, 0x2d, 0x44, 0xbd, 0xe6, 0x6e, 0x59, 0x29, 0x57, 0xcb, 0x56, 0x1d, 0x3c, 0x97,
+	0x4b, 0x29, 0xa4, 0x72, 0x1b, 0x7e, 0x64, 0x92, 0x2b, 0xb1, 0x97, 0x4b, 0xce, 0x96, 0x92, 0x97,
+	0xbb, 0x95, 0x68, 0x58, 0x77, 0x09, 0xb7, 0x52, 0xec, 0x84, 0x3d, 0xd1, 0x65, 0xb0, 0xac, 0x14,
+	0x3c, 0x3b, 0xc0, 0x83, 0x07, 0xb5, 0xc3, 0xaf, 0xf1, 0x29, 0x61, 0xbb, 0x72, 0xcb, 0xa6, 0x11,
+	0xbb, 0xce, 0x42, 0xe9, 0x6a, 0xe7, 0xc5, 0x00, 0xe3, 0x88, 0x1f, 0x69, 0x1f, 0xe1, 0xf7, 0x09,
+	0xa4, 0xad, 0x25, 0xcd, 0x7e, 0xe3, 0x3c, 0x1a, 0x60, 0x74, 0x09, 0xb0, 0x7f, 0x80, 0x61, 0x1e,
+	0xa5, 0x09, 0xf1, 0xc3, 0x59, 0x48, 0x02, 0xeb, 0x8b, 0x3d, 0x04, 0xdf, 0xf3, 0xe8, 0x3a, 0x8a,
+	0xef, 0x22, 0xcb, 0xb0, 0xc7, 0x60, 0xe4, 0xe3, 0x28, 0x8a, 0x33, 0x96, 0x92, 0x8c, 0x85, 0x01,
+	0x9b, 0xc5, 0x94, 0xf9, 0x94, 0xe0, 0x8c, 0x58, 0xa6, 0xfd, 0x13, 0xd8, 0x41, 0x9e, 0xdc, 0x84,
+	0x3e, 0xce, 0x08, 0xcb, 0xc8, 0x6d, 0xc2, 0xc2, 0x20, 0xb5, 0x06, 0xf6, 0x5f, 0xf0, 0xbb, 0xff,
+	0x63, 0x94, 0xa4, 0x71, 0x4e, 0x7d, 0xc2, 0xae, 0x70, 0xc0, 0x08, 0xa5, 0x31, 0x4d, 0xad, 0xaf,
+	0xd3, 0x77, 0x03, 0x38, 0x4b, 0xb1, 0x81, 0x9f, 0xcf, 0x3d, 0xfd, 0x73, 0xa9, 0xeb, 0xa4, 0x1d,
+	0x3c, 0x31, 0xee, 0x83, 0xde, 0xa0, 0x16, 0xeb, 0xb2, 0xa9, 0xa1, 0x90, 0xb5, 0x5b, 0xf3, 0xa6,
+	0x7b, 0x96, 0xd3, 0x2a, 0xb6, 0x2b, 0x75, 0x69, 0x33, 0xff, 0xf4, 0xe7, 0xc9, 0x1c, 0xcc, 0x31,
+	0x7e, 0x36, 0x27, 0x73, 0x6d, 0x86, 0x2b, 0x05, 0xb5, 0x6c, 0xd5, 0xc2, 0x83, 0x5d, 0xa4, 0x7a,
+	0x3d, 0x01, 0x05, 0xae, 0x54, 0x71, 0x06, 0x8a, 0x85, 0x57, 0x68, 0xe0, 0xcd, 0x74, 0xf4, 0x29,
+	0x42, 0xb8, 0x52, 0x08, 0x9d, 0x11, 0x84, 0x16, 0x1e, 0x42, 0x1a, 0x7a, 0xf8, 0xd6, 0x75, 0xe7,
+	0x7d, 0x04, 0x00, 0x00, 0xff, 0xff, 0x61, 0xf5, 0xa1, 0xda, 0x36, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/not_empty_error.pb.go b/googleapis/ads/googleads/v3/errors/not_empty_error.pb.go
new file mode 100644
index 0000000..7d02dfd
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/not_empty_error.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/not_empty_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible not empty errors.
+type NotEmptyErrorEnum_NotEmptyError int32
+
+const (
+	// Enum unspecified.
+	NotEmptyErrorEnum_UNSPECIFIED NotEmptyErrorEnum_NotEmptyError = 0
+	// The received error code is not known in this version.
+	NotEmptyErrorEnum_UNKNOWN NotEmptyErrorEnum_NotEmptyError = 1
+	// Empty list.
+	NotEmptyErrorEnum_EMPTY_LIST NotEmptyErrorEnum_NotEmptyError = 2
+)
+
+var NotEmptyErrorEnum_NotEmptyError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "EMPTY_LIST",
+}
+
+var NotEmptyErrorEnum_NotEmptyError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"EMPTY_LIST":  2,
+}
+
+func (x NotEmptyErrorEnum_NotEmptyError) String() string {
+	return proto.EnumName(NotEmptyErrorEnum_NotEmptyError_name, int32(x))
+}
+
+func (NotEmptyErrorEnum_NotEmptyError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_b44457b47b4528e8, []int{0, 0}
+}
+
+// Container for enum describing possible not empty errors.
+type NotEmptyErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *NotEmptyErrorEnum) Reset()         { *m = NotEmptyErrorEnum{} }
+func (m *NotEmptyErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*NotEmptyErrorEnum) ProtoMessage()    {}
+func (*NotEmptyErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b44457b47b4528e8, []int{0}
+}
+
+func (m *NotEmptyErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_NotEmptyErrorEnum.Unmarshal(m, b)
+}
+func (m *NotEmptyErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_NotEmptyErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *NotEmptyErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_NotEmptyErrorEnum.Merge(m, src)
+}
+func (m *NotEmptyErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_NotEmptyErrorEnum.Size(m)
+}
+func (m *NotEmptyErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_NotEmptyErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_NotEmptyErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.NotEmptyErrorEnum_NotEmptyError", NotEmptyErrorEnum_NotEmptyError_name, NotEmptyErrorEnum_NotEmptyError_value)
+	proto.RegisterType((*NotEmptyErrorEnum)(nil), "google.ads.googleads.v3.errors.NotEmptyErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/not_empty_error.proto", fileDescriptor_b44457b47b4528e8)
+}
+
+var fileDescriptor_b44457b47b4528e8 = []byte{
+	// 293 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4a, 0xc4, 0x30,
+	0x18, 0x85, 0x9d, 0x0a, 0x0a, 0x19, 0xd4, 0xda, 0xa5, 0xc8, 0x2c, 0x7a, 0x80, 0x64, 0x11, 0x57,
+	0x11, 0x17, 0x1d, 0x27, 0x0e, 0x45, 0xad, 0xc5, 0x99, 0xa9, 0x28, 0x85, 0x52, 0x6d, 0x09, 0x85,
+	0x69, 0xfe, 0xd2, 0xc4, 0x01, 0xaf, 0xe3, 0xd2, 0xa3, 0x78, 0x14, 0xc1, 0x3b, 0x48, 0x1a, 0x5b,
+	0x98, 0x85, 0xae, 0xf2, 0x78, 0x7c, 0xef, 0xe5, 0xf1, 0xa3, 0x33, 0x01, 0x20, 0xd6, 0x25, 0xc9,
+	0x0b, 0x45, 0xac, 0x34, 0x6a, 0x43, 0x49, 0xd9, 0xb6, 0xd0, 0x2a, 0x22, 0x41, 0x67, 0x65, 0xdd,
+	0xe8, 0xb7, 0xac, 0x33, 0x70, 0xd3, 0x82, 0x06, 0x6f, 0x62, 0x51, 0x9c, 0x17, 0x0a, 0x0f, 0x29,
+	0xbc, 0xa1, 0xd8, 0xa6, 0x4e, 0x4e, 0xfb, 0xd6, 0xa6, 0x22, 0xb9, 0x94, 0xa0, 0x73, 0x5d, 0x81,
+	0x54, 0x36, 0xed, 0xdf, 0xa3, 0xe3, 0x08, 0x34, 0x37, 0xad, 0xdc, 0xf0, 0x5c, 0xbe, 0xd6, 0xfe,
+	0x05, 0x3a, 0xd8, 0x32, 0xbd, 0x23, 0x34, 0x5e, 0x45, 0x8b, 0x98, 0x5f, 0x86, 0x57, 0x21, 0x9f,
+	0xb9, 0x3b, 0xde, 0x18, 0xed, 0xaf, 0xa2, 0xeb, 0xe8, 0xee, 0x21, 0x72, 0x47, 0xde, 0x21, 0x42,
+	0xfc, 0x36, 0x5e, 0x3e, 0x66, 0x37, 0xe1, 0x62, 0xe9, 0x3a, 0xd3, 0xef, 0x11, 0xf2, 0x5f, 0xa0,
+	0xc6, 0xff, 0x0f, 0x9b, 0x7a, 0x5b, 0x7f, 0xc4, 0x66, 0x4e, 0x3c, 0x7a, 0x9a, 0xfd, 0xa6, 0x04,
+	0xac, 0x73, 0x29, 0x30, 0xb4, 0x82, 0x88, 0x52, 0x76, 0x63, 0xfb, 0xa3, 0x34, 0x95, 0xfa, 0xeb,
+	0x46, 0xe7, 0xf6, 0x79, 0x77, 0x76, 0xe7, 0x41, 0xf0, 0xe1, 0x4c, 0xe6, 0xb6, 0x2c, 0x28, 0x14,
+	0xb6, 0xd2, 0xa8, 0x84, 0xe2, 0xee, 0x4b, 0xf5, 0xd9, 0x03, 0x69, 0x50, 0xa8, 0x74, 0x00, 0xd2,
+	0x84, 0xa6, 0x16, 0xf8, 0x72, 0x7c, 0xeb, 0x32, 0x16, 0x14, 0x8a, 0xb1, 0x01, 0x61, 0x2c, 0xa1,
+	0x8c, 0x59, 0xe8, 0x79, 0xaf, 0x5b, 0x47, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x9b, 0x97, 0xe0,
+	0x28, 0xc0, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/not_whitelisted_error.pb.go b/googleapis/ads/googleads/v3/errors/not_whitelisted_error.pb.go
new file mode 100644
index 0000000..c7d5c92
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/not_whitelisted_error.pb.go
@@ -0,0 +1,121 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/not_whitelisted_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible not whitelisted errors.
+type NotWhitelistedErrorEnum_NotWhitelistedError int32
+
+const (
+	// Enum unspecified.
+	NotWhitelistedErrorEnum_UNSPECIFIED NotWhitelistedErrorEnum_NotWhitelistedError = 0
+	// The received error code is not known in this version.
+	NotWhitelistedErrorEnum_UNKNOWN NotWhitelistedErrorEnum_NotWhitelistedError = 1
+	// Customer is not whitelisted for accessing this feature.
+	NotWhitelistedErrorEnum_CUSTOMER_NOT_WHITELISTED_FOR_THIS_FEATURE NotWhitelistedErrorEnum_NotWhitelistedError = 2
+)
+
+var NotWhitelistedErrorEnum_NotWhitelistedError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CUSTOMER_NOT_WHITELISTED_FOR_THIS_FEATURE",
+}
+
+var NotWhitelistedErrorEnum_NotWhitelistedError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CUSTOMER_NOT_WHITELISTED_FOR_THIS_FEATURE": 2,
+}
+
+func (x NotWhitelistedErrorEnum_NotWhitelistedError) String() string {
+	return proto.EnumName(NotWhitelistedErrorEnum_NotWhitelistedError_name, int32(x))
+}
+
+func (NotWhitelistedErrorEnum_NotWhitelistedError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_ff351e315ddc124d, []int{0, 0}
+}
+
+// Container for enum describing possible not whitelisted errors.
+type NotWhitelistedErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *NotWhitelistedErrorEnum) Reset()         { *m = NotWhitelistedErrorEnum{} }
+func (m *NotWhitelistedErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*NotWhitelistedErrorEnum) ProtoMessage()    {}
+func (*NotWhitelistedErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ff351e315ddc124d, []int{0}
+}
+
+func (m *NotWhitelistedErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_NotWhitelistedErrorEnum.Unmarshal(m, b)
+}
+func (m *NotWhitelistedErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_NotWhitelistedErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *NotWhitelistedErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_NotWhitelistedErrorEnum.Merge(m, src)
+}
+func (m *NotWhitelistedErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_NotWhitelistedErrorEnum.Size(m)
+}
+func (m *NotWhitelistedErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_NotWhitelistedErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_NotWhitelistedErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.NotWhitelistedErrorEnum_NotWhitelistedError", NotWhitelistedErrorEnum_NotWhitelistedError_name, NotWhitelistedErrorEnum_NotWhitelistedError_value)
+	proto.RegisterType((*NotWhitelistedErrorEnum)(nil), "google.ads.googleads.v3.errors.NotWhitelistedErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/not_whitelisted_error.proto", fileDescriptor_ff351e315ddc124d)
+}
+
+var fileDescriptor_ff351e315ddc124d = []byte{
+	// 328 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xb1, 0x4e, 0xc3, 0x30,
+	0x14, 0x45, 0x69, 0x90, 0x40, 0x72, 0x07, 0xaa, 0x30, 0x80, 0x10, 0xea, 0x90, 0x8d, 0x01, 0x67,
+	0xc8, 0x66, 0xa6, 0xb4, 0x75, 0xdb, 0x08, 0x48, 0xaa, 0x26, 0x69, 0x25, 0x14, 0xc9, 0x4a, 0x71,
+	0x64, 0x22, 0xb5, 0x7e, 0x55, 0x6c, 0xca, 0xc4, 0xcf, 0x30, 0xf2, 0x29, 0x7c, 0x0a, 0x2b, 0x3f,
+	0x80, 0x12, 0xd3, 0xb2, 0x14, 0xa6, 0x5c, 0xbd, 0xdc, 0x73, 0x7d, 0xdf, 0x43, 0x44, 0x00, 0x88,
+	0x65, 0xe1, 0xe6, 0x5c, 0xb9, 0x46, 0xd6, 0x6a, 0xe3, 0xb9, 0x45, 0x55, 0x41, 0xa5, 0x5c, 0x09,
+	0x9a, 0xbd, 0x3c, 0x95, 0xba, 0x58, 0x96, 0x4a, 0x17, 0x9c, 0x35, 0x63, 0xbc, 0xae, 0x40, 0x83,
+	0xdd, 0x35, 0x00, 0xce, 0xb9, 0xc2, 0x3b, 0x16, 0x6f, 0x3c, 0x6c, 0xd8, 0x8b, 0xcb, 0x6d, 0xf6,
+	0xba, 0x74, 0x73, 0x29, 0x41, 0xe7, 0xba, 0x04, 0xa9, 0x0c, 0xed, 0xbc, 0xa2, 0xb3, 0x10, 0xf4,
+	0xfc, 0x37, 0x9b, 0xd6, 0x14, 0x95, 0xcf, 0x2b, 0x67, 0x81, 0x4e, 0xf7, 0xfc, 0xb2, 0x4f, 0x50,
+	0x3b, 0x0d, 0xe3, 0x09, 0xed, 0x07, 0xc3, 0x80, 0x0e, 0x3a, 0x07, 0x76, 0x1b, 0x1d, 0xa7, 0xe1,
+	0x6d, 0x18, 0xcd, 0xc3, 0x4e, 0xcb, 0xbe, 0x46, 0x57, 0xfd, 0x34, 0x4e, 0xa2, 0x7b, 0x3a, 0x65,
+	0x61, 0x94, 0xb0, 0xf9, 0x38, 0x48, 0xe8, 0x5d, 0x10, 0x27, 0x74, 0xc0, 0x86, 0xd1, 0x94, 0x25,
+	0xe3, 0x20, 0x66, 0x43, 0xea, 0x27, 0xe9, 0x94, 0x76, 0xac, 0xde, 0x57, 0x0b, 0x39, 0x8f, 0xb0,
+	0xc2, 0xff, 0xef, 0xd0, 0x3b, 0xdf, 0x53, 0x64, 0x52, 0xf7, 0x9f, 0xb4, 0x1e, 0x06, 0x3f, 0xac,
+	0x80, 0x65, 0x2e, 0x05, 0x86, 0x4a, 0xb8, 0xa2, 0x90, 0xcd, 0x76, 0xdb, 0x5b, 0xae, 0x4b, 0xf5,
+	0xd7, 0x69, 0x6f, 0xcc, 0xe7, 0xcd, 0x3a, 0x1c, 0xf9, 0xfe, 0xbb, 0xd5, 0x1d, 0x99, 0x30, 0x9f,
+	0x2b, 0x6c, 0x64, 0xad, 0x66, 0x1e, 0x6e, 0x9e, 0x54, 0x1f, 0x5b, 0x43, 0xe6, 0x73, 0x95, 0xed,
+	0x0c, 0xd9, 0xcc, 0xcb, 0x8c, 0xe1, 0xd3, 0x72, 0xcc, 0x94, 0x10, 0x9f, 0x2b, 0x42, 0x76, 0x16,
+	0x42, 0x66, 0x1e, 0x21, 0xc6, 0xb4, 0x38, 0x6a, 0xda, 0x79, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0x73, 0xc3, 0x90, 0x71, 0xf7, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/null_error.pb.go b/googleapis/ads/googleads/v3/errors/null_error.pb.go
new file mode 100644
index 0000000..f2a4af6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/null_error.pb.go
@@ -0,0 +1,118 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/null_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible null errors.
+type NullErrorEnum_NullError int32
+
+const (
+	// Enum unspecified.
+	NullErrorEnum_UNSPECIFIED NullErrorEnum_NullError = 0
+	// The received error code is not known in this version.
+	NullErrorEnum_UNKNOWN NullErrorEnum_NullError = 1
+	// Specified list/container must not contain any null elements
+	NullErrorEnum_NULL_CONTENT NullErrorEnum_NullError = 2
+)
+
+var NullErrorEnum_NullError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "NULL_CONTENT",
+}
+
+var NullErrorEnum_NullError_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"NULL_CONTENT": 2,
+}
+
+func (x NullErrorEnum_NullError) String() string {
+	return proto.EnumName(NullErrorEnum_NullError_name, int32(x))
+}
+
+func (NullErrorEnum_NullError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7b038dfbd21869d6, []int{0, 0}
+}
+
+// Container for enum describing possible null errors.
+type NullErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *NullErrorEnum) Reset()         { *m = NullErrorEnum{} }
+func (m *NullErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*NullErrorEnum) ProtoMessage()    {}
+func (*NullErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7b038dfbd21869d6, []int{0}
+}
+
+func (m *NullErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_NullErrorEnum.Unmarshal(m, b)
+}
+func (m *NullErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_NullErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *NullErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_NullErrorEnum.Merge(m, src)
+}
+func (m *NullErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_NullErrorEnum.Size(m)
+}
+func (m *NullErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_NullErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_NullErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.NullErrorEnum_NullError", NullErrorEnum_NullError_name, NullErrorEnum_NullError_value)
+	proto.RegisterType((*NullErrorEnum)(nil), "google.ads.googleads.v3.errors.NullErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/null_error.proto", fileDescriptor_7b038dfbd21869d6)
+}
+
+var fileDescriptor_7b038dfbd21869d6 = []byte{
+	// 285 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xdf, 0x4a, 0xc3, 0x30,
+	0x14, 0xc6, 0x5d, 0x05, 0xc5, 0xcc, 0x3f, 0xa5, 0x97, 0x22, 0xbb, 0xe8, 0x03, 0x24, 0x17, 0xb9,
+	0xcb, 0xae, 0xba, 0xad, 0x8e, 0x61, 0xc9, 0x0a, 0xae, 0x15, 0xa4, 0x30, 0xaa, 0x2d, 0xa1, 0x90,
+	0xe5, 0x94, 0xa6, 0xdd, 0x03, 0x79, 0xe9, 0xa3, 0xf8, 0x26, 0xfa, 0x14, 0xd2, 0x66, 0xcd, 0x9d,
+	0x5e, 0xe5, 0x47, 0xf8, 0x7d, 0xe7, 0x7c, 0x1c, 0x44, 0x04, 0x80, 0x90, 0x25, 0xc9, 0x0b, 0x7d,
+	0xc2, 0x9e, 0x8e, 0x94, 0x94, 0x4d, 0x03, 0x8d, 0x26, 0xaa, 0x93, 0x72, 0x3f, 0x30, 0xae, 0x1b,
+	0x68, 0xc1, 0x9b, 0x19, 0x0b, 0xe7, 0x85, 0xc6, 0x36, 0x80, 0x8f, 0x14, 0x9b, 0xc0, 0xfd, 0xc3,
+	0x38, 0xb0, 0xae, 0x48, 0xae, 0x14, 0xb4, 0x79, 0x5b, 0x81, 0xd2, 0x26, 0xed, 0x47, 0xe8, 0x86,
+	0x77, 0x52, 0x86, 0xbd, 0x1b, 0xaa, 0xee, 0xe0, 0xcf, 0xd1, 0x95, 0xfd, 0xf0, 0xee, 0xd0, 0x34,
+	0xe1, 0xcf, 0x71, 0xb8, 0xdc, 0x3c, 0x6e, 0xc2, 0x95, 0x7b, 0xe6, 0x4d, 0xd1, 0x65, 0xc2, 0x9f,
+	0xf8, 0xf6, 0x85, 0xbb, 0x13, 0xcf, 0x45, 0xd7, 0x3c, 0x89, 0xa2, 0xfd, 0x72, 0xcb, 0x77, 0x21,
+	0xdf, 0xb9, 0xce, 0xe2, 0x7b, 0x82, 0xfc, 0x77, 0x38, 0xe0, 0xff, 0x2b, 0x2d, 0x6e, 0xed, 0x86,
+	0xb8, 0x2f, 0x11, 0x4f, 0x5e, 0x57, 0xa7, 0x84, 0x00, 0x99, 0x2b, 0x81, 0xa1, 0x11, 0x44, 0x94,
+	0x6a, 0xa8, 0x38, 0x5e, 0xa1, 0xae, 0xf4, 0x5f, 0x47, 0x99, 0x9b, 0xe7, 0xc3, 0x39, 0x5f, 0x07,
+	0xc1, 0xa7, 0x33, 0x5b, 0x9b, 0x61, 0x41, 0xa1, 0xb1, 0xc1, 0x9e, 0x52, 0x8a, 0x87, 0x95, 0xfa,
+	0x6b, 0x14, 0xb2, 0xa0, 0xd0, 0x99, 0x15, 0xb2, 0x94, 0x66, 0x46, 0xf8, 0x71, 0x7c, 0xf3, 0xcb,
+	0x58, 0x50, 0x68, 0xc6, 0xac, 0xc2, 0x58, 0x4a, 0x19, 0x33, 0xd2, 0xdb, 0xc5, 0xd0, 0x8e, 0xfe,
+	0x06, 0x00, 0x00, 0xff, 0xff, 0x79, 0x9c, 0x26, 0x48, 0xb1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/operation_access_denied_error.pb.go b/googleapis/ads/googleads/v3/errors/operation_access_denied_error.pb.go
new file mode 100644
index 0000000..009c33b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/operation_access_denied_error.pb.go
@@ -0,0 +1,164 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/operation_access_denied_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible operation access denied errors.
+type OperationAccessDeniedErrorEnum_OperationAccessDeniedError int32
+
+const (
+	// Enum unspecified.
+	OperationAccessDeniedErrorEnum_UNSPECIFIED OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 0
+	// The received error code is not known in this version.
+	OperationAccessDeniedErrorEnum_UNKNOWN OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 1
+	// Unauthorized invocation of a service's method (get, mutate, etc.)
+	OperationAccessDeniedErrorEnum_ACTION_NOT_PERMITTED OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 2
+	// Unauthorized CREATE operation in invoking a service's mutate method.
+	OperationAccessDeniedErrorEnum_CREATE_OPERATION_NOT_PERMITTED OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 3
+	// Unauthorized REMOVE operation in invoking a service's mutate method.
+	OperationAccessDeniedErrorEnum_REMOVE_OPERATION_NOT_PERMITTED OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 4
+	// Unauthorized UPDATE operation in invoking a service's mutate method.
+	OperationAccessDeniedErrorEnum_UPDATE_OPERATION_NOT_PERMITTED OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 5
+	// A mutate action is not allowed on this campaign, from this client.
+	OperationAccessDeniedErrorEnum_MUTATE_ACTION_NOT_PERMITTED_FOR_CLIENT OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 6
+	// This operation is not permitted on this campaign type
+	OperationAccessDeniedErrorEnum_OPERATION_NOT_PERMITTED_FOR_CAMPAIGN_TYPE OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 7
+	// A CREATE operation may not set status to REMOVED.
+	OperationAccessDeniedErrorEnum_CREATE_AS_REMOVED_NOT_PERMITTED OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 8
+	// This operation is not allowed because the campaign or adgroup is removed.
+	OperationAccessDeniedErrorEnum_OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 9
+	// This operation is not permitted on this ad group type.
+	OperationAccessDeniedErrorEnum_OPERATION_NOT_PERMITTED_FOR_AD_GROUP_TYPE OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 10
+	// The mutate is not allowed for this customer.
+	OperationAccessDeniedErrorEnum_MUTATE_NOT_PERMITTED_FOR_CUSTOMER OperationAccessDeniedErrorEnum_OperationAccessDeniedError = 11
+)
+
+var OperationAccessDeniedErrorEnum_OperationAccessDeniedError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "ACTION_NOT_PERMITTED",
+	3:  "CREATE_OPERATION_NOT_PERMITTED",
+	4:  "REMOVE_OPERATION_NOT_PERMITTED",
+	5:  "UPDATE_OPERATION_NOT_PERMITTED",
+	6:  "MUTATE_ACTION_NOT_PERMITTED_FOR_CLIENT",
+	7:  "OPERATION_NOT_PERMITTED_FOR_CAMPAIGN_TYPE",
+	8:  "CREATE_AS_REMOVED_NOT_PERMITTED",
+	9:  "OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE",
+	10: "OPERATION_NOT_PERMITTED_FOR_AD_GROUP_TYPE",
+	11: "MUTATE_NOT_PERMITTED_FOR_CUSTOMER",
+}
+
+var OperationAccessDeniedErrorEnum_OperationAccessDeniedError_value = map[string]int32{
+	"UNSPECIFIED":                                  0,
+	"UNKNOWN":                                      1,
+	"ACTION_NOT_PERMITTED":                         2,
+	"CREATE_OPERATION_NOT_PERMITTED":               3,
+	"REMOVE_OPERATION_NOT_PERMITTED":               4,
+	"UPDATE_OPERATION_NOT_PERMITTED":               5,
+	"MUTATE_ACTION_NOT_PERMITTED_FOR_CLIENT":       6,
+	"OPERATION_NOT_PERMITTED_FOR_CAMPAIGN_TYPE":    7,
+	"CREATE_AS_REMOVED_NOT_PERMITTED":              8,
+	"OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE": 9,
+	"OPERATION_NOT_PERMITTED_FOR_AD_GROUP_TYPE":    10,
+	"MUTATE_NOT_PERMITTED_FOR_CUSTOMER":            11,
+}
+
+func (x OperationAccessDeniedErrorEnum_OperationAccessDeniedError) String() string {
+	return proto.EnumName(OperationAccessDeniedErrorEnum_OperationAccessDeniedError_name, int32(x))
+}
+
+func (OperationAccessDeniedErrorEnum_OperationAccessDeniedError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_df7a6e22c97aafa3, []int{0, 0}
+}
+
+// Container for enum describing possible operation access denied errors.
+type OperationAccessDeniedErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OperationAccessDeniedErrorEnum) Reset()         { *m = OperationAccessDeniedErrorEnum{} }
+func (m *OperationAccessDeniedErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*OperationAccessDeniedErrorEnum) ProtoMessage()    {}
+func (*OperationAccessDeniedErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df7a6e22c97aafa3, []int{0}
+}
+
+func (m *OperationAccessDeniedErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OperationAccessDeniedErrorEnum.Unmarshal(m, b)
+}
+func (m *OperationAccessDeniedErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OperationAccessDeniedErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *OperationAccessDeniedErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OperationAccessDeniedErrorEnum.Merge(m, src)
+}
+func (m *OperationAccessDeniedErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_OperationAccessDeniedErrorEnum.Size(m)
+}
+func (m *OperationAccessDeniedErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_OperationAccessDeniedErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OperationAccessDeniedErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.OperationAccessDeniedErrorEnum_OperationAccessDeniedError", OperationAccessDeniedErrorEnum_OperationAccessDeniedError_name, OperationAccessDeniedErrorEnum_OperationAccessDeniedError_value)
+	proto.RegisterType((*OperationAccessDeniedErrorEnum)(nil), "google.ads.googleads.v3.errors.OperationAccessDeniedErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/operation_access_denied_error.proto", fileDescriptor_df7a6e22c97aafa3)
+}
+
+var fileDescriptor_df7a6e22c97aafa3 = []byte{
+	// 448 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xc1, 0x8a, 0xd3, 0x40,
+	0x1c, 0xc6, 0x6d, 0xab, 0xbb, 0x3a, 0x3d, 0x18, 0x06, 0x0f, 0xb2, 0x48, 0x17, 0x23, 0x0a, 0x8a,
+	0x4e, 0x84, 0xdc, 0xe2, 0x69, 0x9a, 0xcc, 0x96, 0xa0, 0x99, 0x19, 0xa6, 0x93, 0x8a, 0x52, 0x18,
+	0x62, 0x13, 0x42, 0x61, 0x37, 0x13, 0x32, 0x75, 0x1f, 0xc8, 0xa3, 0x4f, 0x22, 0x3e, 0x8a, 0xbe,
+	0x81, 0x27, 0x49, 0xa6, 0xe9, 0x41, 0x9a, 0x7a, 0xca, 0x9f, 0xe4, 0xf7, 0xff, 0xbe, 0xef, 0x4f,
+	0x3e, 0x30, 0x2f, 0xb5, 0x2e, 0xaf, 0x0b, 0x2f, 0xcb, 0x8d, 0x67, 0xc7, 0x76, 0xba, 0xf5, 0xbd,
+	0xa2, 0x69, 0x74, 0x63, 0x3c, 0x5d, 0x17, 0x4d, 0xb6, 0xdb, 0xea, 0x4a, 0x65, 0x9b, 0x4d, 0x61,
+	0x8c, 0xca, 0x8b, 0x6a, 0x5b, 0xe4, 0xaa, 0xfb, 0x8c, 0xea, 0x46, 0xef, 0x34, 0x9c, 0xd9, 0x45,
+	0x94, 0xe5, 0x06, 0x1d, 0x34, 0xd0, 0xad, 0x8f, 0xac, 0xc6, 0xc5, 0x93, 0xde, 0xa3, 0xde, 0x7a,
+	0x59, 0x55, 0xe9, 0x5d, 0x27, 0x68, 0xec, 0xb6, 0xfb, 0x7b, 0x02, 0x66, 0xac, 0x77, 0xc1, 0x9d,
+	0x49, 0xd4, 0x79, 0x90, 0x76, 0x9b, 0x54, 0x5f, 0x6f, 0xdc, 0x1f, 0x13, 0x70, 0x31, 0x8c, 0xc0,
+	0x87, 0x60, 0x9a, 0xd2, 0x25, 0x27, 0x61, 0x7c, 0x15, 0x93, 0xc8, 0xb9, 0x03, 0xa7, 0xe0, 0x3c,
+	0xa5, 0xef, 0x29, 0xfb, 0x48, 0x9d, 0x11, 0x7c, 0x0c, 0x1e, 0xe1, 0x50, 0xc6, 0x8c, 0x2a, 0xca,
+	0xa4, 0xe2, 0x44, 0x24, 0xb1, 0x94, 0x24, 0x72, 0xc6, 0xd0, 0x05, 0xb3, 0x50, 0x10, 0x2c, 0x89,
+	0x62, 0x9c, 0x08, 0x7c, 0x84, 0x99, 0xb4, 0x8c, 0x20, 0x09, 0x5b, 0x0d, 0x33, 0x77, 0x5b, 0x26,
+	0xe5, 0xd1, 0x29, 0x9d, 0x7b, 0xf0, 0x15, 0x78, 0x91, 0xa4, 0xb2, 0x65, 0x8e, 0x85, 0x51, 0x57,
+	0x4c, 0xa8, 0xf0, 0x43, 0x4c, 0xa8, 0x74, 0xce, 0xe0, 0x1b, 0xf0, 0x72, 0x40, 0xc8, 0x72, 0x38,
+	0xe1, 0x38, 0x5e, 0x50, 0x25, 0x3f, 0x71, 0xe2, 0x9c, 0xc3, 0x67, 0xe0, 0x72, 0x7f, 0x06, 0x5e,
+	0x2a, 0x1b, 0x36, 0xfa, 0xc7, 0xff, 0x3e, 0x7c, 0x0b, 0x5e, 0x9f, 0xd2, 0xec, 0xd7, 0x04, 0x59,
+	0xb2, 0x54, 0x84, 0xc4, 0x79, 0xf0, 0xbf, 0x14, 0x38, 0x52, 0x0b, 0xc1, 0x52, 0x6e, 0x53, 0x00,
+	0xf8, 0x1c, 0x3c, 0xdd, 0x1f, 0x78, 0x24, 0x71, 0xba, 0x94, 0x2c, 0x21, 0xc2, 0x99, 0xce, 0xff,
+	0x8c, 0x80, 0xbb, 0xd1, 0x37, 0xe8, 0x74, 0x65, 0xe6, 0x97, 0xc3, 0xbf, 0x9b, 0xb7, 0xad, 0xe1,
+	0xa3, 0xcf, 0xd1, 0x5e, 0xa2, 0xd4, 0xd7, 0x59, 0x55, 0x22, 0xdd, 0x94, 0x5e, 0x59, 0x54, 0x5d,
+	0xa7, 0xfa, 0x26, 0xd7, 0x5b, 0x33, 0x54, 0xec, 0x77, 0xf6, 0xf1, 0x6d, 0x3c, 0x59, 0x60, 0xfc,
+	0x7d, 0x3c, 0x5b, 0x58, 0x31, 0x9c, 0x1b, 0x64, 0xc7, 0x76, 0x5a, 0xf9, 0xa8, 0xb3, 0x34, 0x3f,
+	0x7b, 0x60, 0x8d, 0x73, 0xb3, 0x3e, 0x00, 0xeb, 0x95, 0xbf, 0xb6, 0xc0, 0xaf, 0xb1, 0x6b, 0xdf,
+	0x06, 0x01, 0xce, 0x4d, 0x10, 0x1c, 0x90, 0x20, 0x58, 0xf9, 0x41, 0x60, 0xa1, 0x2f, 0x67, 0x5d,
+	0x3a, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x47, 0x53, 0x4a, 0x75, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/operator_error.pb.go b/googleapis/ads/googleads/v3/errors/operator_error.pb.go
new file mode 100644
index 0000000..ce723df
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/operator_error.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/operator_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible operator errors.
+type OperatorErrorEnum_OperatorError int32
+
+const (
+	// Enum unspecified.
+	OperatorErrorEnum_UNSPECIFIED OperatorErrorEnum_OperatorError = 0
+	// The received error code is not known in this version.
+	OperatorErrorEnum_UNKNOWN OperatorErrorEnum_OperatorError = 1
+	// Operator not supported.
+	OperatorErrorEnum_OPERATOR_NOT_SUPPORTED OperatorErrorEnum_OperatorError = 2
+)
+
+var OperatorErrorEnum_OperatorError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "OPERATOR_NOT_SUPPORTED",
+}
+
+var OperatorErrorEnum_OperatorError_value = map[string]int32{
+	"UNSPECIFIED":            0,
+	"UNKNOWN":                1,
+	"OPERATOR_NOT_SUPPORTED": 2,
+}
+
+func (x OperatorErrorEnum_OperatorError) String() string {
+	return proto.EnumName(OperatorErrorEnum_OperatorError_name, int32(x))
+}
+
+func (OperatorErrorEnum_OperatorError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_1f0a54780911972f, []int{0, 0}
+}
+
+// Container for enum describing possible operator errors.
+type OperatorErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OperatorErrorEnum) Reset()         { *m = OperatorErrorEnum{} }
+func (m *OperatorErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*OperatorErrorEnum) ProtoMessage()    {}
+func (*OperatorErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1f0a54780911972f, []int{0}
+}
+
+func (m *OperatorErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OperatorErrorEnum.Unmarshal(m, b)
+}
+func (m *OperatorErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OperatorErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *OperatorErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OperatorErrorEnum.Merge(m, src)
+}
+func (m *OperatorErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_OperatorErrorEnum.Size(m)
+}
+func (m *OperatorErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_OperatorErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OperatorErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.OperatorErrorEnum_OperatorError", OperatorErrorEnum_OperatorError_name, OperatorErrorEnum_OperatorError_value)
+	proto.RegisterType((*OperatorErrorEnum)(nil), "google.ads.googleads.v3.errors.OperatorErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/operator_error.proto", fileDescriptor_1f0a54780911972f)
+}
+
+var fileDescriptor_1f0a54780911972f = []byte{
+	// 300 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xcf, 0x4a, 0x33, 0x31,
+	0x14, 0xc5, 0xbf, 0xce, 0x07, 0x0a, 0x29, 0x62, 0x9d, 0x85, 0x8b, 0x22, 0x5d, 0xcc, 0x03, 0x24,
+	0x8b, 0xec, 0xe2, 0x2a, 0xb5, 0xb1, 0x14, 0x61, 0x12, 0xfa, 0x4f, 0x90, 0xc1, 0x12, 0x9d, 0x21,
+	0x14, 0xda, 0xdc, 0x21, 0x19, 0xfb, 0x40, 0x2e, 0x7d, 0x14, 0x1f, 0x45, 0xf0, 0x1d, 0x64, 0x26,
+	0x9d, 0x81, 0x2e, 0x74, 0x95, 0x93, 0xcb, 0xef, 0x9c, 0x7b, 0xb8, 0x88, 0x1a, 0x00, 0xb3, 0x2b,
+	0x88, 0xce, 0x3d, 0x09, 0xb2, 0x56, 0x07, 0x4a, 0x0a, 0xe7, 0xc0, 0x79, 0x02, 0x65, 0xe1, 0x74,
+	0x05, 0x6e, 0xd3, 0xfc, 0x71, 0xe9, 0xa0, 0x82, 0x78, 0x14, 0x48, 0xac, 0x73, 0x8f, 0x3b, 0x13,
+	0x3e, 0x50, 0x1c, 0x4c, 0xc3, 0x9b, 0x36, 0xb4, 0xdc, 0x12, 0x6d, 0x2d, 0x54, 0xba, 0xda, 0x82,
+	0xf5, 0xc1, 0x9d, 0x3c, 0xa3, 0x2b, 0x79, 0x4c, 0x15, 0x35, 0x2f, 0xec, 0xdb, 0x3e, 0x99, 0xa1,
+	0x8b, 0x93, 0x61, 0x7c, 0x89, 0xfa, 0xab, 0x74, 0xa1, 0xc4, 0xdd, 0xec, 0x7e, 0x26, 0x26, 0x83,
+	0x7f, 0x71, 0x1f, 0x9d, 0xaf, 0xd2, 0x87, 0x54, 0x3e, 0xa6, 0x83, 0x5e, 0x3c, 0x44, 0xd7, 0x52,
+	0x89, 0x39, 0x5f, 0xca, 0xf9, 0x26, 0x95, 0xcb, 0xcd, 0x62, 0xa5, 0x94, 0x9c, 0x2f, 0xc5, 0x64,
+	0x10, 0x8d, 0xbf, 0x7b, 0x28, 0x79, 0x85, 0x3d, 0xfe, 0xbb, 0xe4, 0x38, 0x3e, 0xd9, 0xa7, 0xea,
+	0x6a, 0xaa, 0xf7, 0x34, 0x39, 0xba, 0x0c, 0xec, 0xb4, 0x35, 0x18, 0x9c, 0x21, 0xa6, 0xb0, 0x4d,
+	0xf1, 0xf6, 0x3e, 0xe5, 0xd6, 0xff, 0x76, 0xae, 0xdb, 0xf0, 0xbc, 0x47, 0xff, 0xa7, 0x9c, 0x7f,
+	0x44, 0xa3, 0x69, 0x08, 0xe3, 0xb9, 0xc7, 0x41, 0xd6, 0x6a, 0x4d, 0x71, 0xb3, 0xd2, 0x7f, 0xb6,
+	0x40, 0xc6, 0x73, 0x9f, 0x75, 0x40, 0xb6, 0xa6, 0x59, 0x00, 0xbe, 0xa2, 0x24, 0x4c, 0x19, 0xe3,
+	0xb9, 0x67, 0xac, 0x43, 0x18, 0x5b, 0x53, 0xc6, 0x02, 0xf4, 0x72, 0xd6, 0xb4, 0xa3, 0x3f, 0x01,
+	0x00, 0x00, 0xff, 0xff, 0x53, 0xbe, 0x42, 0x33, 0xcb, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/partial_failure_error.pb.go b/googleapis/ads/googleads/v3/errors/partial_failure_error.pb.go
new file mode 100644
index 0000000..6982f70
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/partial_failure_error.pb.go
@@ -0,0 +1,121 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/partial_failure_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible partial failure errors.
+type PartialFailureErrorEnum_PartialFailureError int32
+
+const (
+	// Enum unspecified.
+	PartialFailureErrorEnum_UNSPECIFIED PartialFailureErrorEnum_PartialFailureError = 0
+	// The received error code is not known in this version.
+	PartialFailureErrorEnum_UNKNOWN PartialFailureErrorEnum_PartialFailureError = 1
+	// The partial failure field was false in the request.
+	// This method requires this field be set to true.
+	PartialFailureErrorEnum_PARTIAL_FAILURE_MODE_REQUIRED PartialFailureErrorEnum_PartialFailureError = 2
+)
+
+var PartialFailureErrorEnum_PartialFailureError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "PARTIAL_FAILURE_MODE_REQUIRED",
+}
+
+var PartialFailureErrorEnum_PartialFailureError_value = map[string]int32{
+	"UNSPECIFIED":                   0,
+	"UNKNOWN":                       1,
+	"PARTIAL_FAILURE_MODE_REQUIRED": 2,
+}
+
+func (x PartialFailureErrorEnum_PartialFailureError) String() string {
+	return proto.EnumName(PartialFailureErrorEnum_PartialFailureError_name, int32(x))
+}
+
+func (PartialFailureErrorEnum_PartialFailureError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6ff0908682efac2c, []int{0, 0}
+}
+
+// Container for enum describing possible partial failure errors.
+type PartialFailureErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PartialFailureErrorEnum) Reset()         { *m = PartialFailureErrorEnum{} }
+func (m *PartialFailureErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*PartialFailureErrorEnum) ProtoMessage()    {}
+func (*PartialFailureErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ff0908682efac2c, []int{0}
+}
+
+func (m *PartialFailureErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PartialFailureErrorEnum.Unmarshal(m, b)
+}
+func (m *PartialFailureErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PartialFailureErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *PartialFailureErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PartialFailureErrorEnum.Merge(m, src)
+}
+func (m *PartialFailureErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_PartialFailureErrorEnum.Size(m)
+}
+func (m *PartialFailureErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PartialFailureErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PartialFailureErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.PartialFailureErrorEnum_PartialFailureError", PartialFailureErrorEnum_PartialFailureError_name, PartialFailureErrorEnum_PartialFailureError_value)
+	proto.RegisterType((*PartialFailureErrorEnum)(nil), "google.ads.googleads.v3.errors.PartialFailureErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/partial_failure_error.proto", fileDescriptor_6ff0908682efac2c)
+}
+
+var fileDescriptor_6ff0908682efac2c = []byte{
+	// 314 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4e, 0x83, 0x40,
+	0x14, 0x86, 0x2d, 0x26, 0x9a, 0x4c, 0x17, 0x36, 0xb8, 0xd0, 0x18, 0x6d, 0x22, 0x07, 0x18, 0x16,
+	0xec, 0xc6, 0xd5, 0x54, 0xa6, 0x0d, 0xb1, 0x52, 0x44, 0xc1, 0xc4, 0x90, 0x90, 0x51, 0x70, 0x42,
+	0x42, 0x67, 0x70, 0x86, 0xf6, 0x40, 0x2e, 0x3d, 0x8a, 0x47, 0x71, 0xeb, 0x05, 0x0c, 0x3c, 0xdb,
+	0x55, 0x75, 0xc5, 0x9f, 0xc7, 0xff, 0xfd, 0xef, 0x9f, 0x87, 0x88, 0x50, 0x4a, 0xd4, 0xa5, 0xcb,
+	0x0b, 0xe3, 0x82, 0xec, 0xd4, 0xda, 0x73, 0x4b, 0xad, 0x95, 0x36, 0x6e, 0xc3, 0x75, 0x5b, 0xf1,
+	0x3a, 0x7f, 0xe5, 0x55, 0xbd, 0xd2, 0x65, 0xde, 0x8f, 0x71, 0xa3, 0x55, 0xab, 0xec, 0x31, 0x00,
+	0x98, 0x17, 0x06, 0x6f, 0x59, 0xbc, 0xf6, 0x30, 0xb0, 0x67, 0xe7, 0x9b, 0xec, 0xa6, 0x72, 0xb9,
+	0x94, 0xaa, 0xe5, 0x6d, 0xa5, 0xa4, 0x01, 0xda, 0x79, 0x43, 0x27, 0x11, 0x84, 0x4f, 0x21, 0x9b,
+	0x75, 0x14, 0x93, 0xab, 0xa5, 0x93, 0xa2, 0xe3, 0x1d, 0xbf, 0xec, 0x23, 0x34, 0x4c, 0xc2, 0xfb,
+	0x88, 0x5d, 0x07, 0xd3, 0x80, 0xf9, 0xa3, 0x3d, 0x7b, 0x88, 0x0e, 0x93, 0xf0, 0x26, 0x5c, 0x3c,
+	0x86, 0xa3, 0x81, 0x7d, 0x89, 0x2e, 0x22, 0x1a, 0x3f, 0x04, 0x74, 0x9e, 0x4f, 0x69, 0x30, 0x4f,
+	0x62, 0x96, 0xdf, 0x2e, 0x7c, 0x96, 0xc7, 0xec, 0x2e, 0x09, 0x62, 0xe6, 0x8f, 0xac, 0xc9, 0xf7,
+	0x00, 0x39, 0x2f, 0x6a, 0x89, 0xff, 0xef, 0x3d, 0x39, 0xdd, 0xb1, 0x3c, 0xea, 0x3a, 0x47, 0x83,
+	0x27, 0xff, 0x97, 0x15, 0xaa, 0xe6, 0x52, 0x60, 0xa5, 0x85, 0x2b, 0x4a, 0xd9, 0xbf, 0x68, 0x73,
+	0xbf, 0xa6, 0x32, 0x7f, 0x9d, 0xf3, 0x0a, 0x3e, 0xef, 0xd6, 0xfe, 0x8c, 0xd2, 0x0f, 0x6b, 0x3c,
+	0x83, 0x30, 0x5a, 0x18, 0x0c, 0xb2, 0x53, 0xa9, 0x87, 0xfb, 0x95, 0xe6, 0x73, 0x63, 0xc8, 0x68,
+	0x61, 0xb2, 0xad, 0x21, 0x4b, 0xbd, 0x0c, 0x0c, 0x5f, 0x96, 0x03, 0x53, 0x42, 0x68, 0x61, 0x08,
+	0xd9, 0x5a, 0x08, 0x49, 0x3d, 0x42, 0xc0, 0xf4, 0x7c, 0xd0, 0xb7, 0xf3, 0x7e, 0x02, 0x00, 0x00,
+	0xff, 0xff, 0x77, 0x25, 0x10, 0x84, 0xeb, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/payments_account_error.pb.go b/googleapis/ads/googleads/v3/errors/payments_account_error.pb.go
new file mode 100644
index 0000000..3b77d00
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/payments_account_error.pb.go
@@ -0,0 +1,121 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/payments_account_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible errors in payments account service.
+type PaymentsAccountErrorEnum_PaymentsAccountError int32
+
+const (
+	// Enum unspecified.
+	PaymentsAccountErrorEnum_UNSPECIFIED PaymentsAccountErrorEnum_PaymentsAccountError = 0
+	// The received error code is not known in this version.
+	PaymentsAccountErrorEnum_UNKNOWN PaymentsAccountErrorEnum_PaymentsAccountError = 1
+	// Manager customers are not supported for payments account service.
+	PaymentsAccountErrorEnum_NOT_SUPPORTED_FOR_MANAGER_CUSTOMER PaymentsAccountErrorEnum_PaymentsAccountError = 2
+)
+
+var PaymentsAccountErrorEnum_PaymentsAccountError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "NOT_SUPPORTED_FOR_MANAGER_CUSTOMER",
+}
+
+var PaymentsAccountErrorEnum_PaymentsAccountError_value = map[string]int32{
+	"UNSPECIFIED":                        0,
+	"UNKNOWN":                            1,
+	"NOT_SUPPORTED_FOR_MANAGER_CUSTOMER": 2,
+}
+
+func (x PaymentsAccountErrorEnum_PaymentsAccountError) String() string {
+	return proto.EnumName(PaymentsAccountErrorEnum_PaymentsAccountError_name, int32(x))
+}
+
+func (PaymentsAccountErrorEnum_PaymentsAccountError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_4aeb35bbf3b6a431, []int{0, 0}
+}
+
+// Container for enum describing possible errors in payments account service.
+type PaymentsAccountErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PaymentsAccountErrorEnum) Reset()         { *m = PaymentsAccountErrorEnum{} }
+func (m *PaymentsAccountErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*PaymentsAccountErrorEnum) ProtoMessage()    {}
+func (*PaymentsAccountErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4aeb35bbf3b6a431, []int{0}
+}
+
+func (m *PaymentsAccountErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PaymentsAccountErrorEnum.Unmarshal(m, b)
+}
+func (m *PaymentsAccountErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PaymentsAccountErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *PaymentsAccountErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PaymentsAccountErrorEnum.Merge(m, src)
+}
+func (m *PaymentsAccountErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_PaymentsAccountErrorEnum.Size(m)
+}
+func (m *PaymentsAccountErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PaymentsAccountErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PaymentsAccountErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.PaymentsAccountErrorEnum_PaymentsAccountError", PaymentsAccountErrorEnum_PaymentsAccountError_name, PaymentsAccountErrorEnum_PaymentsAccountError_value)
+	proto.RegisterType((*PaymentsAccountErrorEnum)(nil), "google.ads.googleads.v3.errors.PaymentsAccountErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/payments_account_error.proto", fileDescriptor_4aeb35bbf3b6a431)
+}
+
+var fileDescriptor_4aeb35bbf3b6a431 = []byte{
+	// 322 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xb1, 0x6a, 0xeb, 0x30,
+	0x18, 0x85, 0x6f, 0x7c, 0xa1, 0x05, 0x65, 0x68, 0x30, 0x1d, 0xda, 0x52, 0x32, 0x78, 0xe8, 0x28,
+	0x0f, 0xda, 0x94, 0x49, 0x49, 0x94, 0x10, 0x4a, 0x64, 0xe1, 0xc4, 0x29, 0x14, 0x83, 0x50, 0x63,
+	0x23, 0x02, 0x89, 0x64, 0x2c, 0x27, 0xb4, 0xaf, 0xd3, 0xb1, 0x8f, 0xd2, 0x47, 0xe9, 0xdc, 0x07,
+	0x28, 0xb6, 0x12, 0x4f, 0x69, 0x27, 0x1d, 0x7e, 0x9d, 0xef, 0xe8, 0xe8, 0x07, 0x03, 0x65, 0x8c,
+	0xda, 0xe6, 0xa1, 0xcc, 0x6c, 0xe8, 0x64, 0xad, 0x0e, 0x28, 0xcc, 0xcb, 0xd2, 0x94, 0x36, 0x2c,
+	0xe4, 0xdb, 0x2e, 0xd7, 0x95, 0x15, 0x72, 0xbd, 0x36, 0x7b, 0x5d, 0x89, 0x66, 0x0e, 0x8b, 0xd2,
+	0x54, 0xc6, 0xef, 0x3b, 0x02, 0xca, 0xcc, 0xc2, 0x16, 0x86, 0x07, 0x04, 0x1d, 0x7c, 0x77, 0x7f,
+	0x0a, 0x2f, 0x36, 0xa1, 0xd4, 0xda, 0x54, 0xb2, 0xda, 0x18, 0x6d, 0x1d, 0x1d, 0xbc, 0x82, 0x1b,
+	0x7e, 0x4c, 0x27, 0x2e, 0x9c, 0xd6, 0x18, 0xd5, 0xfb, 0x5d, 0x90, 0x82, 0xeb, 0x73, 0x77, 0xfe,
+	0x15, 0xe8, 0x26, 0x6c, 0xc1, 0xe9, 0x68, 0x36, 0x99, 0xd1, 0x71, 0xef, 0x9f, 0xdf, 0x05, 0x97,
+	0x09, 0x7b, 0x64, 0xd1, 0x13, 0xeb, 0x75, 0xfc, 0x07, 0x10, 0xb0, 0x68, 0x29, 0x16, 0x09, 0xe7,
+	0x51, 0xbc, 0xa4, 0x63, 0x31, 0x89, 0x62, 0x31, 0x27, 0x8c, 0x4c, 0x69, 0x2c, 0x46, 0xc9, 0x62,
+	0x19, 0xcd, 0x69, 0xdc, 0xf3, 0x86, 0xdf, 0x1d, 0x10, 0xac, 0xcd, 0x0e, 0xfe, 0x5d, 0x7f, 0x78,
+	0x7b, 0xae, 0x02, 0xaf, 0xbb, 0xf3, 0xce, 0xf3, 0xf8, 0x08, 0x2b, 0xb3, 0x95, 0x5a, 0x41, 0x53,
+	0xaa, 0x50, 0xe5, 0xba, 0xf9, 0xd9, 0x69, 0x91, 0xc5, 0xc6, 0xfe, 0xb6, 0xd7, 0x81, 0x3b, 0xde,
+	0xbd, 0xff, 0x53, 0x42, 0x3e, 0xbc, 0xfe, 0xd4, 0x85, 0x91, 0xcc, 0x42, 0x27, 0x6b, 0xb5, 0x42,
+	0xb0, 0x79, 0xd2, 0x7e, 0x9e, 0x0c, 0x29, 0xc9, 0x6c, 0xda, 0x1a, 0xd2, 0x15, 0x4a, 0x9d, 0xe1,
+	0xcb, 0x0b, 0xdc, 0x14, 0x63, 0x92, 0x59, 0x8c, 0x5b, 0x0b, 0xc6, 0x2b, 0x84, 0xb1, 0x33, 0xbd,
+	0x5c, 0x34, 0xed, 0xd0, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x74, 0x12, 0x6c, 0xf4, 0x01,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/policy_finding_error.pb.go b/googleapis/ads/googleads/v3/errors/policy_finding_error.pb.go
new file mode 100644
index 0000000..8bc774f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/policy_finding_error.pb.go
@@ -0,0 +1,126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/policy_finding_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible policy finding errors.
+type PolicyFindingErrorEnum_PolicyFindingError int32
+
+const (
+	// Enum unspecified.
+	PolicyFindingErrorEnum_UNSPECIFIED PolicyFindingErrorEnum_PolicyFindingError = 0
+	// The received error code is not known in this version.
+	PolicyFindingErrorEnum_UNKNOWN PolicyFindingErrorEnum_PolicyFindingError = 1
+	// The resource has been disapproved since the policy summary includes
+	// policy topics of type PROHIBITED.
+	PolicyFindingErrorEnum_POLICY_FINDING PolicyFindingErrorEnum_PolicyFindingError = 2
+	// The given policy topic does not exist.
+	PolicyFindingErrorEnum_POLICY_TOPIC_NOT_FOUND PolicyFindingErrorEnum_PolicyFindingError = 3
+)
+
+var PolicyFindingErrorEnum_PolicyFindingError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "POLICY_FINDING",
+	3: "POLICY_TOPIC_NOT_FOUND",
+}
+
+var PolicyFindingErrorEnum_PolicyFindingError_value = map[string]int32{
+	"UNSPECIFIED":            0,
+	"UNKNOWN":                1,
+	"POLICY_FINDING":         2,
+	"POLICY_TOPIC_NOT_FOUND": 3,
+}
+
+func (x PolicyFindingErrorEnum_PolicyFindingError) String() string {
+	return proto.EnumName(PolicyFindingErrorEnum_PolicyFindingError_name, int32(x))
+}
+
+func (PolicyFindingErrorEnum_PolicyFindingError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_f57e9417b2a9ec9c, []int{0, 0}
+}
+
+// Container for enum describing possible policy finding errors.
+type PolicyFindingErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyFindingErrorEnum) Reset()         { *m = PolicyFindingErrorEnum{} }
+func (m *PolicyFindingErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*PolicyFindingErrorEnum) ProtoMessage()    {}
+func (*PolicyFindingErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f57e9417b2a9ec9c, []int{0}
+}
+
+func (m *PolicyFindingErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyFindingErrorEnum.Unmarshal(m, b)
+}
+func (m *PolicyFindingErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyFindingErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *PolicyFindingErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyFindingErrorEnum.Merge(m, src)
+}
+func (m *PolicyFindingErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_PolicyFindingErrorEnum.Size(m)
+}
+func (m *PolicyFindingErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyFindingErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyFindingErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.PolicyFindingErrorEnum_PolicyFindingError", PolicyFindingErrorEnum_PolicyFindingError_name, PolicyFindingErrorEnum_PolicyFindingError_value)
+	proto.RegisterType((*PolicyFindingErrorEnum)(nil), "google.ads.googleads.v3.errors.PolicyFindingErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/policy_finding_error.proto", fileDescriptor_f57e9417b2a9ec9c)
+}
+
+var fileDescriptor_f57e9417b2a9ec9c = []byte{
+	// 324 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4b, 0xfb, 0x30,
+	0x18, 0xc6, 0xff, 0xeb, 0xe0, 0x2f, 0x64, 0xa0, 0x25, 0x87, 0x09, 0x43, 0x76, 0xe8, 0x07, 0x48,
+	0x0f, 0x39, 0x19, 0x4f, 0xdd, 0xda, 0x8e, 0xa0, 0xa4, 0x01, 0xb7, 0x89, 0x52, 0x28, 0xdd, 0x32,
+	0x43, 0x60, 0x4b, 0x4a, 0x33, 0x07, 0x82, 0x9f, 0xc6, 0xa3, 0x1f, 0xc5, 0x8f, 0xe2, 0xd1, 0x4f,
+	0x20, 0x6d, 0xb6, 0x5d, 0x86, 0x9e, 0xfa, 0xf0, 0xf6, 0xf7, 0x3c, 0x79, 0xde, 0x17, 0x5c, 0x4b,
+	0x63, 0xe4, 0x7a, 0x15, 0x96, 0xc2, 0x86, 0x4e, 0x36, 0x6a, 0x87, 0xc3, 0x55, 0x5d, 0x9b, 0xda,
+	0x86, 0x95, 0x59, 0xab, 0xe5, 0x6b, 0xf1, 0xac, 0xb4, 0x50, 0x5a, 0x16, 0xed, 0x14, 0x55, 0xb5,
+	0xd9, 0x1a, 0x38, 0x74, 0x3c, 0x2a, 0x85, 0x45, 0x47, 0x2b, 0xda, 0x61, 0xe4, 0xac, 0x83, 0xab,
+	0x43, 0x74, 0xa5, 0xc2, 0x52, 0x6b, 0xb3, 0x2d, 0xb7, 0xca, 0x68, 0xeb, 0xdc, 0xc1, 0x1b, 0xe8,
+	0xf3, 0x36, 0x3b, 0x75, 0xd1, 0x49, 0x63, 0x4a, 0xf4, 0xcb, 0x26, 0x58, 0x00, 0x78, 0xfa, 0x07,
+	0x5e, 0x80, 0xde, 0x8c, 0xdd, 0xf3, 0x64, 0x4c, 0x53, 0x9a, 0xc4, 0xfe, 0x3f, 0xd8, 0x03, 0x67,
+	0x33, 0x76, 0xcb, 0xb2, 0x07, 0xe6, 0x77, 0x20, 0x04, 0xe7, 0x3c, 0xbb, 0xa3, 0xe3, 0xc7, 0x22,
+	0xa5, 0x2c, 0xa6, 0x6c, 0xe2, 0x7b, 0x70, 0x00, 0xfa, 0xfb, 0xd9, 0x34, 0xe3, 0x74, 0x5c, 0xb0,
+	0x6c, 0x5a, 0xa4, 0xd9, 0x8c, 0xc5, 0x7e, 0x77, 0xf4, 0xdd, 0x01, 0xc1, 0xd2, 0x6c, 0xd0, 0xdf,
+	0x2b, 0x8c, 0x2e, 0x4f, 0x8b, 0xf0, 0xa6, 0x3d, 0xef, 0x3c, 0xc5, 0x7b, 0xab, 0x34, 0xeb, 0x52,
+	0x4b, 0x64, 0x6a, 0x19, 0xca, 0x95, 0x6e, 0x77, 0x3b, 0x1c, 0xb2, 0x52, 0xf6, 0xb7, 0xbb, 0xde,
+	0xb8, 0xcf, 0xbb, 0xd7, 0x9d, 0x44, 0xd1, 0x87, 0x37, 0x9c, 0xb8, 0xb0, 0x48, 0x58, 0xe4, 0x64,
+	0xa3, 0xe6, 0x18, 0xb5, 0x4f, 0xda, 0xcf, 0x03, 0x90, 0x47, 0xc2, 0xe6, 0x47, 0x20, 0x9f, 0xe3,
+	0xdc, 0x01, 0x5f, 0x5e, 0xe0, 0xa6, 0x84, 0x44, 0xc2, 0x12, 0x72, 0x44, 0x08, 0x99, 0x63, 0x42,
+	0x1c, 0xb4, 0xf8, 0xdf, 0xb6, 0xc3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x42, 0x34, 0x20,
+	0xf4, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/policy_validation_parameter_error.pb.go b/googleapis/ads/googleads/v3/errors/policy_validation_parameter_error.pb.go
new file mode 100644
index 0000000..320ba46
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/policy_validation_parameter_error.pb.go
@@ -0,0 +1,134 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/policy_validation_parameter_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible policy validation parameter errors.
+type PolicyValidationParameterErrorEnum_PolicyValidationParameterError int32
+
+const (
+	// Enum unspecified.
+	PolicyValidationParameterErrorEnum_UNSPECIFIED PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 0
+	// The received error code is not known in this version.
+	PolicyValidationParameterErrorEnum_UNKNOWN PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 1
+	// Ignorable policy topics are not supported for the ad type.
+	PolicyValidationParameterErrorEnum_UNSUPPORTED_AD_TYPE_FOR_IGNORABLE_POLICY_TOPICS PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 2
+	// Exempt policy violation keys are not supported for the ad type.
+	PolicyValidationParameterErrorEnum_UNSUPPORTED_AD_TYPE_FOR_EXEMPT_POLICY_VIOLATION_KEYS PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 3
+	// Cannot set ignorable policy topics and exempt policy violation keys in
+	// the same policy violation parameter.
+	PolicyValidationParameterErrorEnum_CANNOT_SET_BOTH_IGNORABLE_POLICY_TOPICS_AND_EXEMPT_POLICY_VIOLATION_KEYS PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 4
+)
+
+var PolicyValidationParameterErrorEnum_PolicyValidationParameterError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "UNSUPPORTED_AD_TYPE_FOR_IGNORABLE_POLICY_TOPICS",
+	3: "UNSUPPORTED_AD_TYPE_FOR_EXEMPT_POLICY_VIOLATION_KEYS",
+	4: "CANNOT_SET_BOTH_IGNORABLE_POLICY_TOPICS_AND_EXEMPT_POLICY_VIOLATION_KEYS",
+}
+
+var PolicyValidationParameterErrorEnum_PolicyValidationParameterError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"UNSUPPORTED_AD_TYPE_FOR_IGNORABLE_POLICY_TOPICS":                          2,
+	"UNSUPPORTED_AD_TYPE_FOR_EXEMPT_POLICY_VIOLATION_KEYS":                     3,
+	"CANNOT_SET_BOTH_IGNORABLE_POLICY_TOPICS_AND_EXEMPT_POLICY_VIOLATION_KEYS": 4,
+}
+
+func (x PolicyValidationParameterErrorEnum_PolicyValidationParameterError) String() string {
+	return proto.EnumName(PolicyValidationParameterErrorEnum_PolicyValidationParameterError_name, int32(x))
+}
+
+func (PolicyValidationParameterErrorEnum_PolicyValidationParameterError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_55f02adfac78c457, []int{0, 0}
+}
+
+// Container for enum describing possible policy validation parameter errors.
+type PolicyValidationParameterErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyValidationParameterErrorEnum) Reset()         { *m = PolicyValidationParameterErrorEnum{} }
+func (m *PolicyValidationParameterErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*PolicyValidationParameterErrorEnum) ProtoMessage()    {}
+func (*PolicyValidationParameterErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_55f02adfac78c457, []int{0}
+}
+
+func (m *PolicyValidationParameterErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyValidationParameterErrorEnum.Unmarshal(m, b)
+}
+func (m *PolicyValidationParameterErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyValidationParameterErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *PolicyValidationParameterErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyValidationParameterErrorEnum.Merge(m, src)
+}
+func (m *PolicyValidationParameterErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_PolicyValidationParameterErrorEnum.Size(m)
+}
+func (m *PolicyValidationParameterErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyValidationParameterErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyValidationParameterErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.PolicyValidationParameterErrorEnum_PolicyValidationParameterError", PolicyValidationParameterErrorEnum_PolicyValidationParameterError_name, PolicyValidationParameterErrorEnum_PolicyValidationParameterError_value)
+	proto.RegisterType((*PolicyValidationParameterErrorEnum)(nil), "google.ads.googleads.v3.errors.PolicyValidationParameterErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/policy_validation_parameter_error.proto", fileDescriptor_55f02adfac78c457)
+}
+
+var fileDescriptor_55f02adfac78c457 = []byte{
+	// 390 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xb1, 0xaa, 0xdb, 0x30,
+	0x18, 0x85, 0x1b, 0xdf, 0xd2, 0x82, 0xee, 0xd0, 0xe0, 0xb1, 0x94, 0x0c, 0xee, 0x2e, 0x0f, 0xee,
+	0x50, 0xd4, 0x49, 0x89, 0x95, 0x5c, 0x73, 0x53, 0x49, 0xc4, 0x8a, 0xdb, 0x14, 0x83, 0x50, 0xaf,
+	0x8d, 0x31, 0x38, 0x96, 0xb1, 0xdc, 0x40, 0x5f, 0x27, 0x63, 0x1f, 0xa5, 0x8f, 0xd2, 0x57, 0x28,
+	0x94, 0x62, 0xeb, 0xda, 0x5b, 0x3c, 0xe9, 0x20, 0xce, 0xf9, 0x8e, 0xf8, 0xf5, 0x83, 0x6d, 0xa1,
+	0x75, 0x51, 0xe5, 0xbe, 0xca, 0x8c, 0x6f, 0x65, 0xaf, 0x2e, 0x81, 0x9f, 0xb7, 0xad, 0x6e, 0x8d,
+	0xdf, 0xe8, 0xaa, 0x7c, 0xfa, 0x29, 0x2f, 0xaa, 0x2a, 0x33, 0xd5, 0x95, 0xba, 0x96, 0x8d, 0x6a,
+	0xd5, 0x39, 0xef, 0xf2, 0x56, 0x0e, 0x16, 0xd8, 0xb4, 0xba, 0xd3, 0xee, 0xca, 0x86, 0xa1, 0xca,
+	0x0c, 0x9c, 0x38, 0xf0, 0x12, 0x40, 0xcb, 0x79, 0xfb, 0x6e, 0xec, 0x69, 0x4a, 0x5f, 0xd5, 0xb5,
+	0xee, 0x06, 0x98, 0xb1, 0x69, 0xef, 0xea, 0x00, 0x8f, 0x0f, 0x4d, 0xc9, 0x54, 0xc4, 0xc7, 0x1e,
+	0xd2, 0x13, 0x48, 0xfd, 0xe3, 0xec, 0xfd, 0x5d, 0x80, 0xd5, 0xbc, 0xcd, 0x7d, 0x03, 0xee, 0x8f,
+	0x34, 0xe6, 0x64, 0x13, 0x6d, 0x23, 0x12, 0x2e, 0x5f, 0xb8, 0xf7, 0xe0, 0xf5, 0x91, 0x3e, 0x52,
+	0xf6, 0x85, 0x2e, 0x17, 0x6e, 0x00, 0xfc, 0x23, 0x8d, 0x8f, 0x9c, 0xb3, 0x83, 0x20, 0xa1, 0xc4,
+	0xa1, 0x14, 0x27, 0x4e, 0xe4, 0x96, 0x1d, 0x64, 0xb4, 0xa3, 0xec, 0x80, 0xd7, 0x7b, 0x22, 0x39,
+	0xdb, 0x47, 0x9b, 0x93, 0x14, 0x8c, 0x47, 0x9b, 0x78, 0xe9, 0xb8, 0x1f, 0xc1, 0x87, 0x5b, 0x21,
+	0xf2, 0x95, 0x7c, 0xe6, 0x62, 0x4c, 0x24, 0x11, 0xdb, 0x63, 0x11, 0x31, 0x2a, 0x1f, 0xc9, 0x29,
+	0x5e, 0xde, 0xb9, 0x7b, 0xf0, 0xb0, 0xc1, 0x94, 0x32, 0x21, 0x63, 0x22, 0xe4, 0x9a, 0x89, 0x87,
+	0x5b, 0x35, 0x12, 0xd3, 0x70, 0x9e, 0xf6, 0x72, 0xfd, 0x6f, 0x01, 0xbc, 0x27, 0x7d, 0x86, 0xf3,
+	0x93, 0x5e, 0xbf, 0x9f, 0x9f, 0x10, 0xef, 0x07, 0xce, 0x17, 0xdf, 0xc2, 0x67, 0x4c, 0xa1, 0x2b,
+	0x55, 0x17, 0x50, 0xb7, 0x85, 0x5f, 0xe4, 0xf5, 0xf0, 0x1d, 0xe3, 0x22, 0x34, 0xa5, 0xb9, 0xb5,
+	0x17, 0x9f, 0xec, 0x71, 0x75, 0xee, 0x76, 0x18, 0xff, 0x72, 0x56, 0x3b, 0x0b, 0xc3, 0x99, 0x81,
+	0x56, 0xf6, 0x2a, 0x09, 0xe0, 0x50, 0x69, 0x7e, 0x8f, 0x86, 0x14, 0x67, 0x26, 0x9d, 0x0c, 0x69,
+	0x12, 0xa4, 0xd6, 0xf0, 0xc7, 0xf1, 0xec, 0x2d, 0x42, 0x38, 0x33, 0x08, 0x4d, 0x16, 0x84, 0x92,
+	0x00, 0x21, 0x6b, 0xfa, 0xfe, 0x6a, 0x78, 0x5d, 0xf0, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xaf, 0xfc,
+	0xe9, 0xc6, 0xb4, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/policy_violation_error.pb.go b/googleapis/ads/googleads/v3/errors/policy_violation_error.pb.go
new file mode 100644
index 0000000..559f1ac
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/policy_violation_error.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/policy_violation_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible policy violation errors.
+type PolicyViolationErrorEnum_PolicyViolationError int32
+
+const (
+	// Enum unspecified.
+	PolicyViolationErrorEnum_UNSPECIFIED PolicyViolationErrorEnum_PolicyViolationError = 0
+	// The received error code is not known in this version.
+	PolicyViolationErrorEnum_UNKNOWN PolicyViolationErrorEnum_PolicyViolationError = 1
+	// A policy was violated. See PolicyViolationDetails for more detail.
+	PolicyViolationErrorEnum_POLICY_ERROR PolicyViolationErrorEnum_PolicyViolationError = 2
+)
+
+var PolicyViolationErrorEnum_PolicyViolationError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "POLICY_ERROR",
+}
+
+var PolicyViolationErrorEnum_PolicyViolationError_value = map[string]int32{
+	"UNSPECIFIED":  0,
+	"UNKNOWN":      1,
+	"POLICY_ERROR": 2,
+}
+
+func (x PolicyViolationErrorEnum_PolicyViolationError) String() string {
+	return proto.EnumName(PolicyViolationErrorEnum_PolicyViolationError_name, int32(x))
+}
+
+func (PolicyViolationErrorEnum_PolicyViolationError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a359cb15eb993566, []int{0, 0}
+}
+
+// Container for enum describing possible policy violation errors.
+type PolicyViolationErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PolicyViolationErrorEnum) Reset()         { *m = PolicyViolationErrorEnum{} }
+func (m *PolicyViolationErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*PolicyViolationErrorEnum) ProtoMessage()    {}
+func (*PolicyViolationErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a359cb15eb993566, []int{0}
+}
+
+func (m *PolicyViolationErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PolicyViolationErrorEnum.Unmarshal(m, b)
+}
+func (m *PolicyViolationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PolicyViolationErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *PolicyViolationErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PolicyViolationErrorEnum.Merge(m, src)
+}
+func (m *PolicyViolationErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_PolicyViolationErrorEnum.Size(m)
+}
+func (m *PolicyViolationErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_PolicyViolationErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PolicyViolationErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.PolicyViolationErrorEnum_PolicyViolationError", PolicyViolationErrorEnum_PolicyViolationError_name, PolicyViolationErrorEnum_PolicyViolationError_value)
+	proto.RegisterType((*PolicyViolationErrorEnum)(nil), "google.ads.googleads.v3.errors.PolicyViolationErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/policy_violation_error.proto", fileDescriptor_a359cb15eb993566)
+}
+
+var fileDescriptor_a359cb15eb993566 = []byte{
+	// 301 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0x84, 0x40,
+	0x18, 0xc7, 0x5b, 0x83, 0x82, 0xd9, 0x20, 0x91, 0x0e, 0x15, 0xb1, 0x07, 0x1f, 0x60, 0xe6, 0x30,
+	0xb7, 0xd9, 0x93, 0xbb, 0xeb, 0x2e, 0x52, 0xa8, 0x18, 0x6b, 0x14, 0x82, 0xb8, 0xab, 0x0c, 0x82,
+	0x3b, 0x9f, 0x38, 0x26, 0xf4, 0x3a, 0x1d, 0x7b, 0x94, 0x1e, 0xa5, 0x73, 0x0f, 0x10, 0xce, 0xa4,
+	0xa7, 0xad, 0x93, 0x7f, 0x3e, 0xff, 0xbf, 0xff, 0xf7, 0x9f, 0x0f, 0xcd, 0x39, 0x00, 0xaf, 0x0a,
+	0x92, 0xe5, 0x92, 0x68, 0xd9, 0xab, 0x8e, 0x92, 0xa2, 0x69, 0xa0, 0x91, 0xa4, 0x86, 0xaa, 0xdc,
+	0xbf, 0xa5, 0x5d, 0x09, 0x55, 0xd6, 0x96, 0x20, 0x52, 0x35, 0xc7, 0x75, 0x03, 0x2d, 0x58, 0x33,
+	0x4d, 0xe0, 0x2c, 0x97, 0x78, 0x84, 0x71, 0x47, 0xb1, 0x86, 0x6f, 0xef, 0x86, 0xf0, 0xba, 0x24,
+	0x99, 0x10, 0xd0, 0xaa, 0x08, 0xa9, 0x69, 0x7b, 0x87, 0xae, 0x43, 0x95, 0x1e, 0x0f, 0xe1, 0x6e,
+	0x8f, 0xb9, 0xe2, 0xf5, 0x60, 0xaf, 0xd1, 0xd5, 0xb1, 0x7f, 0xd6, 0x25, 0x9a, 0x6e, 0xfd, 0xc7,
+	0xd0, 0x5d, 0x7a, 0x6b, 0xcf, 0x5d, 0x99, 0x27, 0xd6, 0x14, 0x9d, 0x6f, 0xfd, 0x7b, 0x3f, 0x78,
+	0xf2, 0xcd, 0x89, 0x65, 0xa2, 0x8b, 0x30, 0x78, 0xf0, 0x96, 0xcf, 0xa9, 0x1b, 0x45, 0x41, 0x64,
+	0x1a, 0x8b, 0xef, 0x09, 0xb2, 0xf7, 0x70, 0xc0, 0xff, 0x17, 0x5d, 0xdc, 0x1c, 0x5b, 0x16, 0xf6,
+	0x2d, 0xc3, 0xc9, 0xcb, 0xea, 0x17, 0xe6, 0x50, 0x65, 0x82, 0x63, 0x68, 0x38, 0xe1, 0x85, 0x50,
+	0x6f, 0x18, 0x4e, 0x56, 0x97, 0xf2, 0xaf, 0x0b, 0xce, 0xf5, 0xe7, 0xdd, 0x38, 0xdd, 0x38, 0xce,
+	0x87, 0x31, 0xdb, 0xe8, 0x30, 0x27, 0x97, 0x58, 0xcb, 0x5e, 0xc5, 0x14, 0xab, 0x95, 0xf2, 0x73,
+	0x30, 0x24, 0x4e, 0x2e, 0x93, 0xd1, 0x90, 0xc4, 0x34, 0xd1, 0x86, 0x2f, 0xc3, 0xd6, 0x53, 0xc6,
+	0x9c, 0x5c, 0x32, 0x36, 0x5a, 0x18, 0x8b, 0x29, 0x63, 0xda, 0xb4, 0x3b, 0x53, 0xed, 0xe8, 0x4f,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0xed, 0x8e, 0x0c, 0xa1, 0xde, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/query_error.pb.go b/googleapis/ads/googleads/v3/errors/query_error.pb.go
new file mode 100644
index 0000000..9c6a29e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/query_error.pb.go
@@ -0,0 +1,385 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/query_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible query errors.
+type QueryErrorEnum_QueryError int32
+
+const (
+	// Name unspecified.
+	QueryErrorEnum_UNSPECIFIED QueryErrorEnum_QueryError = 0
+	// The received error code is not known in this version.
+	QueryErrorEnum_UNKNOWN QueryErrorEnum_QueryError = 1
+	// Returned if all other query error reasons are not applicable.
+	QueryErrorEnum_QUERY_ERROR QueryErrorEnum_QueryError = 50
+	// A condition used in the query references an invalid enum constant.
+	QueryErrorEnum_BAD_ENUM_CONSTANT QueryErrorEnum_QueryError = 18
+	// Query contains an invalid escape sequence.
+	QueryErrorEnum_BAD_ESCAPE_SEQUENCE QueryErrorEnum_QueryError = 7
+	// Field name is invalid.
+	QueryErrorEnum_BAD_FIELD_NAME QueryErrorEnum_QueryError = 12
+	// Limit value is invalid (i.e. not a number)
+	QueryErrorEnum_BAD_LIMIT_VALUE QueryErrorEnum_QueryError = 15
+	// Encountered number can not be parsed.
+	QueryErrorEnum_BAD_NUMBER QueryErrorEnum_QueryError = 5
+	// Invalid operator encountered.
+	QueryErrorEnum_BAD_OPERATOR QueryErrorEnum_QueryError = 3
+	// Parameter unknown or not supported.
+	QueryErrorEnum_BAD_PARAMETER_NAME QueryErrorEnum_QueryError = 61
+	// Parameter have invalid value.
+	QueryErrorEnum_BAD_PARAMETER_VALUE QueryErrorEnum_QueryError = 62
+	// Invalid resource type was specified in the FROM clause.
+	QueryErrorEnum_BAD_RESOURCE_TYPE_IN_FROM_CLAUSE QueryErrorEnum_QueryError = 45
+	// Non-ASCII symbol encountered outside of strings.
+	QueryErrorEnum_BAD_SYMBOL QueryErrorEnum_QueryError = 2
+	// Value is invalid.
+	QueryErrorEnum_BAD_VALUE QueryErrorEnum_QueryError = 4
+	// Date filters fail to restrict date to a range smaller than 31 days.
+	// Applicable if the query is segmented by date.
+	QueryErrorEnum_DATE_RANGE_TOO_WIDE QueryErrorEnum_QueryError = 36
+	// Filters on date/week/month/quarter have a start date after
+	// end date.
+	QueryErrorEnum_DATE_RANGE_TOO_NARROW QueryErrorEnum_QueryError = 60
+	// Expected AND between values with BETWEEN operator.
+	QueryErrorEnum_EXPECTED_AND QueryErrorEnum_QueryError = 30
+	// Expecting ORDER BY to have BY.
+	QueryErrorEnum_EXPECTED_BY QueryErrorEnum_QueryError = 14
+	// There was no dimension field selected.
+	QueryErrorEnum_EXPECTED_DIMENSION_FIELD_IN_SELECT_CLAUSE QueryErrorEnum_QueryError = 37
+	// Missing filters on date related fields.
+	QueryErrorEnum_EXPECTED_FILTERS_ON_DATE_RANGE QueryErrorEnum_QueryError = 55
+	// Missing FROM clause.
+	QueryErrorEnum_EXPECTED_FROM QueryErrorEnum_QueryError = 44
+	// The operator used in the conditions requires the value to be a list.
+	QueryErrorEnum_EXPECTED_LIST QueryErrorEnum_QueryError = 41
+	// Fields used in WHERE or ORDER BY clauses are missing from the SELECT
+	// clause.
+	QueryErrorEnum_EXPECTED_REFERENCED_FIELD_IN_SELECT_CLAUSE QueryErrorEnum_QueryError = 16
+	// SELECT is missing at the beginning of query.
+	QueryErrorEnum_EXPECTED_SELECT QueryErrorEnum_QueryError = 13
+	// A list was passed as a value to a condition whose operator expects a
+	// single value.
+	QueryErrorEnum_EXPECTED_SINGLE_VALUE QueryErrorEnum_QueryError = 42
+	// Missing one or both values with BETWEEN operator.
+	QueryErrorEnum_EXPECTED_VALUE_WITH_BETWEEN_OPERATOR QueryErrorEnum_QueryError = 29
+	// Invalid date format. Expected 'YYYY-MM-DD'.
+	QueryErrorEnum_INVALID_DATE_FORMAT QueryErrorEnum_QueryError = 38
+	// Value passed was not a string when it should have been. I.e., it was a
+	// number or unquoted literal.
+	QueryErrorEnum_INVALID_STRING_VALUE QueryErrorEnum_QueryError = 57
+	// A String value passed to the BETWEEN operator does not parse as a date.
+	QueryErrorEnum_INVALID_VALUE_WITH_BETWEEN_OPERATOR QueryErrorEnum_QueryError = 26
+	// The value passed to the DURING operator is not a Date range literal
+	QueryErrorEnum_INVALID_VALUE_WITH_DURING_OPERATOR QueryErrorEnum_QueryError = 22
+	// A non-string value was passed to the LIKE operator.
+	QueryErrorEnum_INVALID_VALUE_WITH_LIKE_OPERATOR QueryErrorEnum_QueryError = 56
+	// An operator was provided that is inapplicable to the field being
+	// filtered.
+	QueryErrorEnum_OPERATOR_FIELD_MISMATCH QueryErrorEnum_QueryError = 35
+	// A Condition was found with an empty list.
+	QueryErrorEnum_PROHIBITED_EMPTY_LIST_IN_CONDITION QueryErrorEnum_QueryError = 28
+	// A condition used in the query references an unsupported enum constant.
+	QueryErrorEnum_PROHIBITED_ENUM_CONSTANT QueryErrorEnum_QueryError = 54
+	// Fields that are not allowed to be selected together were included in
+	// the SELECT clause.
+	QueryErrorEnum_PROHIBITED_FIELD_COMBINATION_IN_SELECT_CLAUSE QueryErrorEnum_QueryError = 31
+	// A field that is not orderable was included in the ORDER BY clause.
+	QueryErrorEnum_PROHIBITED_FIELD_IN_ORDER_BY_CLAUSE QueryErrorEnum_QueryError = 40
+	// A field that is not selectable was included in the SELECT clause.
+	QueryErrorEnum_PROHIBITED_FIELD_IN_SELECT_CLAUSE QueryErrorEnum_QueryError = 23
+	// A field that is not filterable was included in the WHERE clause.
+	QueryErrorEnum_PROHIBITED_FIELD_IN_WHERE_CLAUSE QueryErrorEnum_QueryError = 24
+	// Resource type specified in the FROM clause is not supported by this
+	// service.
+	QueryErrorEnum_PROHIBITED_RESOURCE_TYPE_IN_FROM_CLAUSE QueryErrorEnum_QueryError = 43
+	// A field that comes from an incompatible resource was included in the
+	// SELECT clause.
+	QueryErrorEnum_PROHIBITED_RESOURCE_TYPE_IN_SELECT_CLAUSE QueryErrorEnum_QueryError = 48
+	// A field that comes from an incompatible resource was included in the
+	// WHERE clause.
+	QueryErrorEnum_PROHIBITED_RESOURCE_TYPE_IN_WHERE_CLAUSE QueryErrorEnum_QueryError = 58
+	// A metric incompatible with the main resource or other selected
+	// segmenting resources was included in the SELECT or WHERE clause.
+	QueryErrorEnum_PROHIBITED_METRIC_IN_SELECT_OR_WHERE_CLAUSE QueryErrorEnum_QueryError = 49
+	// A segment incompatible with the main resource or other selected
+	// segmenting resources was included in the SELECT or WHERE clause.
+	QueryErrorEnum_PROHIBITED_SEGMENT_IN_SELECT_OR_WHERE_CLAUSE QueryErrorEnum_QueryError = 51
+	// A segment in the SELECT clause is incompatible with a metric in the
+	// SELECT or WHERE clause.
+	QueryErrorEnum_PROHIBITED_SEGMENT_WITH_METRIC_IN_SELECT_OR_WHERE_CLAUSE QueryErrorEnum_QueryError = 53
+	// The value passed to the limit clause is too low.
+	QueryErrorEnum_LIMIT_VALUE_TOO_LOW QueryErrorEnum_QueryError = 25
+	// Query has a string containing a newline character.
+	QueryErrorEnum_PROHIBITED_NEWLINE_IN_STRING QueryErrorEnum_QueryError = 8
+	// List contains values of different types.
+	QueryErrorEnum_PROHIBITED_VALUE_COMBINATION_IN_LIST QueryErrorEnum_QueryError = 10
+	// The values passed to the BETWEEN operator are not of the same type.
+	QueryErrorEnum_PROHIBITED_VALUE_COMBINATION_WITH_BETWEEN_OPERATOR QueryErrorEnum_QueryError = 21
+	// Query contains unterminated string.
+	QueryErrorEnum_STRING_NOT_TERMINATED QueryErrorEnum_QueryError = 6
+	// Too many segments are specified in SELECT clause.
+	QueryErrorEnum_TOO_MANY_SEGMENTS QueryErrorEnum_QueryError = 34
+	// Query is incomplete and cannot be parsed.
+	QueryErrorEnum_UNEXPECTED_END_OF_QUERY QueryErrorEnum_QueryError = 9
+	// FROM clause cannot be specified in this query.
+	QueryErrorEnum_UNEXPECTED_FROM_CLAUSE QueryErrorEnum_QueryError = 47
+	// Query contains one or more unrecognized fields.
+	QueryErrorEnum_UNRECOGNIZED_FIELD QueryErrorEnum_QueryError = 32
+	// Query has an unexpected extra part.
+	QueryErrorEnum_UNEXPECTED_INPUT QueryErrorEnum_QueryError = 11
+	// Metrics cannot be requested for a manager account. To retrieve metrics,
+	// issue separate requests against each client account under the manager
+	// account.
+	QueryErrorEnum_REQUESTED_METRICS_FOR_MANAGER QueryErrorEnum_QueryError = 59
+)
+
+var QueryErrorEnum_QueryError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	50: "QUERY_ERROR",
+	18: "BAD_ENUM_CONSTANT",
+	7:  "BAD_ESCAPE_SEQUENCE",
+	12: "BAD_FIELD_NAME",
+	15: "BAD_LIMIT_VALUE",
+	5:  "BAD_NUMBER",
+	3:  "BAD_OPERATOR",
+	61: "BAD_PARAMETER_NAME",
+	62: "BAD_PARAMETER_VALUE",
+	45: "BAD_RESOURCE_TYPE_IN_FROM_CLAUSE",
+	2:  "BAD_SYMBOL",
+	4:  "BAD_VALUE",
+	36: "DATE_RANGE_TOO_WIDE",
+	60: "DATE_RANGE_TOO_NARROW",
+	30: "EXPECTED_AND",
+	14: "EXPECTED_BY",
+	37: "EXPECTED_DIMENSION_FIELD_IN_SELECT_CLAUSE",
+	55: "EXPECTED_FILTERS_ON_DATE_RANGE",
+	44: "EXPECTED_FROM",
+	41: "EXPECTED_LIST",
+	16: "EXPECTED_REFERENCED_FIELD_IN_SELECT_CLAUSE",
+	13: "EXPECTED_SELECT",
+	42: "EXPECTED_SINGLE_VALUE",
+	29: "EXPECTED_VALUE_WITH_BETWEEN_OPERATOR",
+	38: "INVALID_DATE_FORMAT",
+	57: "INVALID_STRING_VALUE",
+	26: "INVALID_VALUE_WITH_BETWEEN_OPERATOR",
+	22: "INVALID_VALUE_WITH_DURING_OPERATOR",
+	56: "INVALID_VALUE_WITH_LIKE_OPERATOR",
+	35: "OPERATOR_FIELD_MISMATCH",
+	28: "PROHIBITED_EMPTY_LIST_IN_CONDITION",
+	54: "PROHIBITED_ENUM_CONSTANT",
+	31: "PROHIBITED_FIELD_COMBINATION_IN_SELECT_CLAUSE",
+	40: "PROHIBITED_FIELD_IN_ORDER_BY_CLAUSE",
+	23: "PROHIBITED_FIELD_IN_SELECT_CLAUSE",
+	24: "PROHIBITED_FIELD_IN_WHERE_CLAUSE",
+	43: "PROHIBITED_RESOURCE_TYPE_IN_FROM_CLAUSE",
+	48: "PROHIBITED_RESOURCE_TYPE_IN_SELECT_CLAUSE",
+	58: "PROHIBITED_RESOURCE_TYPE_IN_WHERE_CLAUSE",
+	49: "PROHIBITED_METRIC_IN_SELECT_OR_WHERE_CLAUSE",
+	51: "PROHIBITED_SEGMENT_IN_SELECT_OR_WHERE_CLAUSE",
+	53: "PROHIBITED_SEGMENT_WITH_METRIC_IN_SELECT_OR_WHERE_CLAUSE",
+	25: "LIMIT_VALUE_TOO_LOW",
+	8:  "PROHIBITED_NEWLINE_IN_STRING",
+	10: "PROHIBITED_VALUE_COMBINATION_IN_LIST",
+	21: "PROHIBITED_VALUE_COMBINATION_WITH_BETWEEN_OPERATOR",
+	6:  "STRING_NOT_TERMINATED",
+	34: "TOO_MANY_SEGMENTS",
+	9:  "UNEXPECTED_END_OF_QUERY",
+	47: "UNEXPECTED_FROM_CLAUSE",
+	32: "UNRECOGNIZED_FIELD",
+	11: "UNEXPECTED_INPUT",
+	59: "REQUESTED_METRICS_FOR_MANAGER",
+}
+
+var QueryErrorEnum_QueryError_value = map[string]int32{
+	"UNSPECIFIED":                      0,
+	"UNKNOWN":                          1,
+	"QUERY_ERROR":                      50,
+	"BAD_ENUM_CONSTANT":                18,
+	"BAD_ESCAPE_SEQUENCE":              7,
+	"BAD_FIELD_NAME":                   12,
+	"BAD_LIMIT_VALUE":                  15,
+	"BAD_NUMBER":                       5,
+	"BAD_OPERATOR":                     3,
+	"BAD_PARAMETER_NAME":               61,
+	"BAD_PARAMETER_VALUE":              62,
+	"BAD_RESOURCE_TYPE_IN_FROM_CLAUSE": 45,
+	"BAD_SYMBOL":                       2,
+	"BAD_VALUE":                        4,
+	"DATE_RANGE_TOO_WIDE":              36,
+	"DATE_RANGE_TOO_NARROW":            60,
+	"EXPECTED_AND":                     30,
+	"EXPECTED_BY":                      14,
+	"EXPECTED_DIMENSION_FIELD_IN_SELECT_CLAUSE":                37,
+	"EXPECTED_FILTERS_ON_DATE_RANGE":                           55,
+	"EXPECTED_FROM":                                            44,
+	"EXPECTED_LIST":                                            41,
+	"EXPECTED_REFERENCED_FIELD_IN_SELECT_CLAUSE":               16,
+	"EXPECTED_SELECT":                                          13,
+	"EXPECTED_SINGLE_VALUE":                                    42,
+	"EXPECTED_VALUE_WITH_BETWEEN_OPERATOR":                     29,
+	"INVALID_DATE_FORMAT":                                      38,
+	"INVALID_STRING_VALUE":                                     57,
+	"INVALID_VALUE_WITH_BETWEEN_OPERATOR":                      26,
+	"INVALID_VALUE_WITH_DURING_OPERATOR":                       22,
+	"INVALID_VALUE_WITH_LIKE_OPERATOR":                         56,
+	"OPERATOR_FIELD_MISMATCH":                                  35,
+	"PROHIBITED_EMPTY_LIST_IN_CONDITION":                       28,
+	"PROHIBITED_ENUM_CONSTANT":                                 54,
+	"PROHIBITED_FIELD_COMBINATION_IN_SELECT_CLAUSE":            31,
+	"PROHIBITED_FIELD_IN_ORDER_BY_CLAUSE":                      40,
+	"PROHIBITED_FIELD_IN_SELECT_CLAUSE":                        23,
+	"PROHIBITED_FIELD_IN_WHERE_CLAUSE":                         24,
+	"PROHIBITED_RESOURCE_TYPE_IN_FROM_CLAUSE":                  43,
+	"PROHIBITED_RESOURCE_TYPE_IN_SELECT_CLAUSE":                48,
+	"PROHIBITED_RESOURCE_TYPE_IN_WHERE_CLAUSE":                 58,
+	"PROHIBITED_METRIC_IN_SELECT_OR_WHERE_CLAUSE":              49,
+	"PROHIBITED_SEGMENT_IN_SELECT_OR_WHERE_CLAUSE":             51,
+	"PROHIBITED_SEGMENT_WITH_METRIC_IN_SELECT_OR_WHERE_CLAUSE": 53,
+	"LIMIT_VALUE_TOO_LOW":                                      25,
+	"PROHIBITED_NEWLINE_IN_STRING":                             8,
+	"PROHIBITED_VALUE_COMBINATION_IN_LIST":                     10,
+	"PROHIBITED_VALUE_COMBINATION_WITH_BETWEEN_OPERATOR":       21,
+	"STRING_NOT_TERMINATED":                                    6,
+	"TOO_MANY_SEGMENTS":                                        34,
+	"UNEXPECTED_END_OF_QUERY":                                  9,
+	"UNEXPECTED_FROM_CLAUSE":                                   47,
+	"UNRECOGNIZED_FIELD":                                       32,
+	"UNEXPECTED_INPUT":                                         11,
+	"REQUESTED_METRICS_FOR_MANAGER":                            59,
+}
+
+func (x QueryErrorEnum_QueryError) String() string {
+	return proto.EnumName(QueryErrorEnum_QueryError_name, int32(x))
+}
+
+func (QueryErrorEnum_QueryError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c9d0f0ce5b4b6acb, []int{0, 0}
+}
+
+// Container for enum describing possible query errors.
+type QueryErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *QueryErrorEnum) Reset()         { *m = QueryErrorEnum{} }
+func (m *QueryErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*QueryErrorEnum) ProtoMessage()    {}
+func (*QueryErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c9d0f0ce5b4b6acb, []int{0}
+}
+
+func (m *QueryErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_QueryErrorEnum.Unmarshal(m, b)
+}
+func (m *QueryErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_QueryErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *QueryErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_QueryErrorEnum.Merge(m, src)
+}
+func (m *QueryErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_QueryErrorEnum.Size(m)
+}
+func (m *QueryErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_QueryErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_QueryErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.QueryErrorEnum_QueryError", QueryErrorEnum_QueryError_name, QueryErrorEnum_QueryError_value)
+	proto.RegisterType((*QueryErrorEnum)(nil), "google.ads.googleads.v3.errors.QueryErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/query_error.proto", fileDescriptor_c9d0f0ce5b4b6acb)
+}
+
+var fileDescriptor_c9d0f0ce5b4b6acb = []byte{
+	// 981 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0x6f, 0x73, 0xd3, 0xc6,
+	0x13, 0xfe, 0x25, 0xfc, 0x0a, 0x65, 0x43, 0x92, 0xe3, 0x20, 0x7f, 0x48, 0x43, 0x1a, 0x4c, 0x80,
+	0x40, 0x12, 0x3b, 0xe0, 0x29, 0xa5, 0x86, 0x76, 0xe6, 0x24, 0xad, 0x9d, 0x1b, 0xa4, 0x3b, 0xe5,
+	0x74, 0x8a, 0x6b, 0x26, 0x33, 0x37, 0x69, 0x93, 0xf1, 0x64, 0x06, 0xac, 0xd4, 0x0e, 0xcc, 0xf4,
+	0xeb, 0xf4, 0x65, 0x3f, 0x45, 0x5f, 0xf7, 0x6d, 0xbf, 0x05, 0x9f, 0xa2, 0x73, 0x92, 0x25, 0xcb,
+	0x60, 0xdc, 0x57, 0xd2, 0xed, 0x3e, 0xcf, 0x73, 0x7b, 0x7b, 0xbb, 0xb7, 0xb0, 0xdf, 0x4d, 0x92,
+	0xee, 0xdb, 0xb3, 0xda, 0xc9, 0xe9, 0xa0, 0x96, 0xfd, 0xda, 0xbf, 0x0f, 0xf5, 0xda, 0x59, 0xbf,
+	0x9f, 0xf4, 0x07, 0xb5, 0xdf, 0xde, 0x9f, 0xf5, 0x7f, 0x37, 0xe9, 0xa2, 0x7a, 0xd1, 0x4f, 0x2e,
+	0x13, 0xba, 0x91, 0xc1, 0xaa, 0x27, 0xa7, 0x83, 0x6a, 0xc1, 0xa8, 0x7e, 0xa8, 0x57, 0x33, 0xc6,
+	0xda, 0x7a, 0xae, 0x78, 0x71, 0x5e, 0x3b, 0xe9, 0xf5, 0x92, 0xcb, 0x93, 0xcb, 0xf3, 0xa4, 0x37,
+	0xc8, 0xd8, 0x95, 0x7f, 0xe6, 0x61, 0xe1, 0xd0, 0x6a, 0xa2, 0x45, 0x63, 0xef, 0xfd, 0xbb, 0xca,
+	0x5f, 0xf3, 0x00, 0x23, 0x13, 0x5d, 0x84, 0xb9, 0x58, 0x44, 0x21, 0xba, 0xbc, 0xc9, 0xd1, 0x23,
+	0xff, 0xa3, 0x73, 0x70, 0x2d, 0x16, 0xaf, 0x85, 0x6c, 0x0b, 0x32, 0x63, 0xbd, 0x87, 0x31, 0xaa,
+	0x8e, 0x41, 0xa5, 0xa4, 0x22, 0xcf, 0xe8, 0x12, 0xdc, 0x74, 0x98, 0x67, 0x50, 0xc4, 0x81, 0x71,
+	0xa5, 0x88, 0x34, 0x13, 0x9a, 0x50, 0xba, 0x02, 0xb7, 0x52, 0x73, 0xe4, 0xb2, 0x10, 0x4d, 0x84,
+	0x87, 0x31, 0x0a, 0x17, 0xc9, 0x35, 0x4a, 0x61, 0xc1, 0x3a, 0x9a, 0x1c, 0x7d, 0xcf, 0x08, 0x16,
+	0x20, 0xb9, 0x41, 0x6f, 0xc1, 0xa2, 0xb5, 0xf9, 0x3c, 0xe0, 0xda, 0x1c, 0x31, 0x3f, 0x46, 0xb2,
+	0x48, 0x17, 0x00, 0xac, 0x51, 0xc4, 0x81, 0x83, 0x8a, 0x7c, 0x45, 0x09, 0xdc, 0xb0, 0x6b, 0x19,
+	0xa2, 0x62, 0x5a, 0x2a, 0x72, 0x85, 0x2e, 0x03, 0xb5, 0x96, 0x90, 0x29, 0x16, 0xa0, 0x46, 0x95,
+	0xc9, 0xfd, 0x98, 0xef, 0x3d, 0xb2, 0x67, 0x92, 0x3f, 0xd1, 0x2d, 0xd8, 0xb4, 0x0e, 0x85, 0x91,
+	0x8c, 0x95, 0x8b, 0x46, 0x77, 0x42, 0x34, 0x5c, 0x98, 0xa6, 0x92, 0x81, 0x71, 0x7d, 0x16, 0x47,
+	0x48, 0xf6, 0xf2, 0x8d, 0xa3, 0x4e, 0xe0, 0x48, 0x9f, 0xcc, 0xd2, 0x79, 0xb8, 0x6e, 0xd7, 0x99,
+	0xc8, 0xff, 0xad, 0xba, 0xc7, 0x34, 0x1a, 0xc5, 0x44, 0x0b, 0x8d, 0x96, 0xd2, 0xb4, 0xb9, 0x87,
+	0x64, 0x8b, 0xde, 0x81, 0xa5, 0x4f, 0x1c, 0x82, 0x29, 0x25, 0xdb, 0xe4, 0x95, 0x8d, 0x1d, 0x7f,
+	0x0e, 0xd1, 0xd5, 0xe8, 0x19, 0x26, 0x3c, 0xb2, 0x61, 0xf3, 0x58, 0x58, 0x9c, 0x0e, 0x59, 0xa0,
+	0x7b, 0xf0, 0xb8, 0x30, 0x78, 0x3c, 0x40, 0x11, 0x71, 0x29, 0x86, 0x69, 0xe2, 0xc2, 0x44, 0xe8,
+	0xa3, 0xab, 0xf3, 0x20, 0x1f, 0xd0, 0x0a, 0x6c, 0x14, 0xf0, 0x26, 0xf7, 0x35, 0xaa, 0xc8, 0x48,
+	0x61, 0x46, 0x01, 0x90, 0xef, 0xe9, 0x4d, 0x98, 0x1f, 0x61, 0x94, 0x0c, 0xc8, 0xee, 0x98, 0xc9,
+	0xe7, 0x91, 0x26, 0x8f, 0x69, 0x15, 0x9e, 0x14, 0x26, 0x85, 0x4d, 0x54, 0xf6, 0xa2, 0xbc, 0x2f,
+	0xed, 0x4c, 0xec, 0x65, 0x15, 0xf8, 0xcc, 0x47, 0xe6, 0xed, 0xd9, 0x47, 0x46, 0x2e, 0x5a, 0x3e,
+	0x0e, 0xf3, 0xf5, 0x84, 0x6e, 0xc3, 0x56, 0xe1, 0x4a, 0x6d, 0xa6, 0xcd, 0xf5, 0x81, 0x71, 0x50,
+	0xb7, 0x11, 0xc5, 0xe8, 0x3e, 0xef, 0xda, 0xcc, 0x72, 0x71, 0xc4, 0x7c, 0xee, 0x65, 0xe7, 0x68,
+	0x4a, 0x15, 0x30, 0x4d, 0x1e, 0xd2, 0x55, 0xb8, 0x9d, 0x3b, 0x22, 0xad, 0xb8, 0x68, 0x0d, 0xc5,
+	0x7f, 0xa0, 0x8f, 0xe0, 0x7e, 0xee, 0x99, 0xa6, 0xbd, 0x46, 0x1f, 0x42, 0x65, 0x02, 0xd0, 0x8b,
+	0x53, 0xb5, 0x02, 0xb7, 0x6c, 0x4b, 0x64, 0x02, 0xce, 0xe7, 0xaf, 0x71, 0x84, 0x7a, 0x41, 0xbf,
+	0x81, 0x95, 0x7c, 0x35, 0x4c, 0x54, 0xc0, 0xa3, 0x80, 0x69, 0xf7, 0x80, 0xdc, 0xb7, 0x5b, 0x85,
+	0x4a, 0x1e, 0x70, 0x87, 0xdb, 0x23, 0x63, 0x10, 0xea, 0x4e, 0x9a, 0x6b, 0x9b, 0x4c, 0x57, 0x0a,
+	0x8f, 0x6b, 0x2e, 0x05, 0x59, 0xa7, 0xeb, 0xb0, 0x5a, 0xc6, 0x8d, 0x35, 0xd0, 0x73, 0xfa, 0x14,
+	0xf6, 0x4a, 0xde, 0x6c, 0x13, 0x57, 0x06, 0x0e, 0x17, 0xcc, 0xf2, 0x3f, 0xbf, 0x99, 0x6f, 0x6d,
+	0x32, 0x3e, 0xa3, 0x70, 0x61, 0xa4, 0xf2, 0x50, 0x19, 0xa7, 0x93, 0x03, 0xb7, 0xe9, 0x03, 0xb8,
+	0x37, 0x09, 0x38, 0xae, 0xb7, 0x62, 0x73, 0x31, 0x09, 0xd6, 0x3e, 0x40, 0x85, 0x39, 0x6a, 0x95,
+	0xee, 0xc0, 0xa3, 0x12, 0x6a, 0x6a, 0x6f, 0xed, 0xd8, 0x2a, 0x9f, 0x06, 0x1e, 0x8f, 0x60, 0x9f,
+	0xee, 0xc2, 0xf6, 0x34, 0xf8, 0x58, 0x24, 0x0d, 0x5a, 0x83, 0x9d, 0x12, 0x3a, 0x40, 0xad, 0xb8,
+	0x5b, 0x52, 0x95, 0x6a, 0x9c, 0xf0, 0x94, 0xee, 0xc3, 0x6e, 0x89, 0x10, 0x61, 0x2b, 0x40, 0xa1,
+	0xa7, 0x30, 0xea, 0xf4, 0x15, 0xbc, 0x98, 0xc0, 0x48, 0x6b, 0xe4, 0x3f, 0xf7, 0xfb, 0xce, 0x16,
+	0x78, 0xe9, 0x8d, 0x4b, 0x9f, 0x08, 0x5f, 0xb6, 0xc9, 0x1d, 0xba, 0x09, 0xeb, 0x25, 0x59, 0x81,
+	0x6d, 0x9f, 0x8b, 0x2c, 0x21, 0x69, 0xb9, 0x93, 0xaf, 0x6d, 0x17, 0x95, 0x10, 0x19, 0xff, 0x93,
+	0x72, 0x48, 0xfb, 0x19, 0xe8, 0x73, 0x78, 0x36, 0x15, 0x39, 0xb9, 0x43, 0x96, 0x6c, 0x0b, 0x0f,
+	0x9b, 0x4b, 0x48, 0x6d, 0x34, 0xaa, 0xc0, 0x32, 0xd0, 0x23, 0x57, 0xed, 0x1b, 0x6f, 0x63, 0x0d,
+	0x98, 0xe8, 0xe4, 0x67, 0x8e, 0x48, 0xc5, 0x76, 0x41, 0x2c, 0x8a, 0xde, 0x46, 0xe1, 0x19, 0xd9,
+	0x34, 0xe9, 0x74, 0x20, 0xd7, 0xe9, 0x1a, 0x2c, 0x97, 0x9c, 0xe5, 0x2a, 0xa8, 0xd9, 0x87, 0x3b,
+	0x16, 0x0a, 0x5d, 0xd9, 0x12, 0xfc, 0x4d, 0x5e, 0x5a, 0x64, 0x93, 0xde, 0x06, 0x52, 0xe2, 0x70,
+	0x11, 0xc6, 0x9a, 0xcc, 0xd1, 0x7b, 0x70, 0x57, 0xd9, 0xf9, 0x11, 0x8d, 0x6e, 0x35, 0xb2, 0x6f,
+	0x83, 0x8d, 0x87, 0xb5, 0x50, 0x91, 0x97, 0xce, 0xc7, 0x19, 0xa8, 0xfc, 0x9a, 0xbc, 0xab, 0x4e,
+	0x1f, 0x8d, 0xce, 0xe2, 0x68, 0xcc, 0x85, 0x76, 0x1a, 0x86, 0x33, 0x6f, 0xbc, 0x21, 0xa5, 0x9b,
+	0xbc, 0x3d, 0xe9, 0x75, 0xab, 0x49, 0xbf, 0x5b, 0xeb, 0x9e, 0xf5, 0xd2, 0x59, 0x99, 0xcf, 0xe3,
+	0x8b, 0xf3, 0xc1, 0x97, 0xc6, 0xf3, 0xcb, 0xec, 0xf3, 0xc7, 0xec, 0x95, 0x16, 0x63, 0x7f, 0xce,
+	0x6e, 0xb4, 0x32, 0x31, 0x76, 0x3a, 0xa8, 0x66, 0xbf, 0xf6, 0xef, 0xa8, 0x5e, 0x4d, 0xb7, 0x1c,
+	0xfc, 0x9d, 0x03, 0x8e, 0xd9, 0xe9, 0xe0, 0xb8, 0x00, 0x1c, 0x1f, 0xd5, 0x8f, 0x33, 0xc0, 0xc7,
+	0xd9, 0x4a, 0x66, 0x6d, 0x34, 0xd8, 0xe9, 0xa0, 0xd1, 0x28, 0x20, 0x8d, 0xc6, 0x51, 0xbd, 0xd1,
+	0xc8, 0x40, 0xbf, 0x5c, 0x4d, 0xa3, 0xab, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x37, 0x99,
+	0x77, 0x3b, 0x08, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/quota_error.pb.go b/googleapis/ads/googleads/v3/errors/quota_error.pb.go
new file mode 100644
index 0000000..9f9bab3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/quota_error.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/quota_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible quota errors.
+type QuotaErrorEnum_QuotaError int32
+
+const (
+	// Enum unspecified.
+	QuotaErrorEnum_UNSPECIFIED QuotaErrorEnum_QuotaError = 0
+	// The received error code is not known in this version.
+	QuotaErrorEnum_UNKNOWN QuotaErrorEnum_QuotaError = 1
+	// Too many requests.
+	QuotaErrorEnum_RESOURCE_EXHAUSTED QuotaErrorEnum_QuotaError = 2
+	// Access is prohibited.
+	QuotaErrorEnum_ACCESS_PROHIBITED QuotaErrorEnum_QuotaError = 3
+	// Too many requests in a short amount of time.
+	QuotaErrorEnum_RESOURCE_TEMPORARILY_EXHAUSTED QuotaErrorEnum_QuotaError = 4
+)
+
+var QuotaErrorEnum_QuotaError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "RESOURCE_EXHAUSTED",
+	3: "ACCESS_PROHIBITED",
+	4: "RESOURCE_TEMPORARILY_EXHAUSTED",
+}
+
+var QuotaErrorEnum_QuotaError_value = map[string]int32{
+	"UNSPECIFIED":                    0,
+	"UNKNOWN":                        1,
+	"RESOURCE_EXHAUSTED":             2,
+	"ACCESS_PROHIBITED":              3,
+	"RESOURCE_TEMPORARILY_EXHAUSTED": 4,
+}
+
+func (x QuotaErrorEnum_QuotaError) String() string {
+	return proto.EnumName(QuotaErrorEnum_QuotaError_name, int32(x))
+}
+
+func (QuotaErrorEnum_QuotaError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_74f0d03d4b2122e8, []int{0, 0}
+}
+
+// Container for enum describing possible quota errors.
+type QuotaErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *QuotaErrorEnum) Reset()         { *m = QuotaErrorEnum{} }
+func (m *QuotaErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*QuotaErrorEnum) ProtoMessage()    {}
+func (*QuotaErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_74f0d03d4b2122e8, []int{0}
+}
+
+func (m *QuotaErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_QuotaErrorEnum.Unmarshal(m, b)
+}
+func (m *QuotaErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_QuotaErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *QuotaErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_QuotaErrorEnum.Merge(m, src)
+}
+func (m *QuotaErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_QuotaErrorEnum.Size(m)
+}
+func (m *QuotaErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_QuotaErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_QuotaErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.QuotaErrorEnum_QuotaError", QuotaErrorEnum_QuotaError_name, QuotaErrorEnum_QuotaError_value)
+	proto.RegisterType((*QuotaErrorEnum)(nil), "google.ads.googleads.v3.errors.QuotaErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/quota_error.proto", fileDescriptor_74f0d03d4b2122e8)
+}
+
+var fileDescriptor_74f0d03d4b2122e8 = []byte{
+	// 333 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4e, 0x83, 0x40,
+	0x18, 0xc5, 0x85, 0x1a, 0x4d, 0xa6, 0x89, 0xad, 0x93, 0xe8, 0xc2, 0x98, 0x2e, 0x38, 0xc0, 0x60,
+	0xc2, 0x6e, 0x5c, 0x4d, 0xe9, 0xd8, 0x12, 0x15, 0x10, 0x4a, 0xfd, 0x13, 0x92, 0x06, 0xa5, 0x99,
+	0x34, 0x69, 0x67, 0x2a, 0x43, 0xbb, 0xf3, 0x0c, 0xde, 0xc1, 0xa5, 0x47, 0xf1, 0x28, 0x3d, 0x85,
+	0x19, 0x46, 0xa8, 0x1b, 0x5d, 0xf1, 0xf8, 0xf2, 0x7b, 0x6f, 0xbe, 0xf7, 0x81, 0x0b, 0x26, 0x04,
+	0x5b, 0xcc, 0xec, 0x2c, 0x97, 0xb6, 0x96, 0x4a, 0x6d, 0x1c, 0x7b, 0x56, 0x14, 0xa2, 0x90, 0xf6,
+	0xeb, 0x5a, 0x94, 0xd9, 0xb4, 0xfa, 0x41, 0xab, 0x42, 0x94, 0x02, 0xf6, 0x34, 0x86, 0xb2, 0x5c,
+	0xa2, 0xc6, 0x81, 0x36, 0x0e, 0xd2, 0x8e, 0xb3, 0xf3, 0x3a, 0x71, 0x35, 0xb7, 0x33, 0xce, 0x45,
+	0x99, 0x95, 0x73, 0xc1, 0xa5, 0x76, 0x5b, 0xef, 0x06, 0x38, 0xba, 0x53, 0x99, 0x54, 0xd1, 0x94,
+	0xaf, 0x97, 0xd6, 0x1b, 0x00, 0xbb, 0x09, 0xec, 0x80, 0x76, 0xe2, 0xc7, 0x21, 0x75, 0xbd, 0x2b,
+	0x8f, 0x0e, 0xba, 0x7b, 0xb0, 0x0d, 0x0e, 0x13, 0xff, 0xda, 0x0f, 0xee, 0xfd, 0xae, 0x01, 0x4f,
+	0x01, 0x8c, 0x68, 0x1c, 0x24, 0x91, 0x4b, 0xa7, 0xf4, 0x61, 0x44, 0x92, 0x78, 0x4c, 0x07, 0x5d,
+	0x13, 0x9e, 0x80, 0x63, 0xe2, 0xba, 0x34, 0x8e, 0xa7, 0x61, 0x14, 0x8c, 0xbc, 0xbe, 0xa7, 0xc6,
+	0x2d, 0x68, 0x81, 0x5e, 0x83, 0x8f, 0xe9, 0x6d, 0x18, 0x44, 0x24, 0xf2, 0x6e, 0x1e, 0x7f, 0x59,
+	0xf7, 0xfb, 0x5b, 0x03, 0x58, 0x2f, 0x62, 0x89, 0xfe, 0xaf, 0xd5, 0xef, 0xec, 0x76, 0x0c, 0x55,
+	0x93, 0xd0, 0x78, 0x1a, 0xfc, 0x58, 0x98, 0x58, 0x64, 0x9c, 0x21, 0x51, 0x30, 0x9b, 0xcd, 0x78,
+	0xd5, 0xb3, 0xbe, 0xe5, 0x6a, 0x2e, 0xff, 0x3a, 0xed, 0xa5, 0xfe, 0x7c, 0x98, 0xad, 0x21, 0x21,
+	0x9f, 0x66, 0x6f, 0xa8, 0xc3, 0x48, 0x2e, 0x91, 0x96, 0x4a, 0x4d, 0x1c, 0x54, 0x3d, 0x29, 0xbf,
+	0x6a, 0x20, 0x25, 0xb9, 0x4c, 0x1b, 0x20, 0x9d, 0x38, 0xa9, 0x06, 0xb6, 0xa6, 0xa5, 0xa7, 0x18,
+	0x93, 0x5c, 0x62, 0xdc, 0x20, 0x18, 0x4f, 0x1c, 0x8c, 0x35, 0xf4, 0x7c, 0x50, 0x6d, 0xe7, 0x7c,
+	0x07, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x06, 0xb6, 0xd1, 0xf7, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/range_error.pb.go b/googleapis/ads/googleads/v3/errors/range_error.pb.go
new file mode 100644
index 0000000..e7c950c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/range_error.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/range_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible range errors.
+type RangeErrorEnum_RangeError int32
+
+const (
+	// Enum unspecified.
+	RangeErrorEnum_UNSPECIFIED RangeErrorEnum_RangeError = 0
+	// The received error code is not known in this version.
+	RangeErrorEnum_UNKNOWN RangeErrorEnum_RangeError = 1
+	// Too low.
+	RangeErrorEnum_TOO_LOW RangeErrorEnum_RangeError = 2
+	// Too high.
+	RangeErrorEnum_TOO_HIGH RangeErrorEnum_RangeError = 3
+)
+
+var RangeErrorEnum_RangeError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "TOO_LOW",
+	3: "TOO_HIGH",
+}
+
+var RangeErrorEnum_RangeError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"TOO_LOW":     2,
+	"TOO_HIGH":    3,
+}
+
+func (x RangeErrorEnum_RangeError) String() string {
+	return proto.EnumName(RangeErrorEnum_RangeError_name, int32(x))
+}
+
+func (RangeErrorEnum_RangeError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2ccd0a5d18cd27d7, []int{0, 0}
+}
+
+// Container for enum describing possible range errors.
+type RangeErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *RangeErrorEnum) Reset()         { *m = RangeErrorEnum{} }
+func (m *RangeErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*RangeErrorEnum) ProtoMessage()    {}
+func (*RangeErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2ccd0a5d18cd27d7, []int{0}
+}
+
+func (m *RangeErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RangeErrorEnum.Unmarshal(m, b)
+}
+func (m *RangeErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RangeErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *RangeErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RangeErrorEnum.Merge(m, src)
+}
+func (m *RangeErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_RangeErrorEnum.Size(m)
+}
+func (m *RangeErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_RangeErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RangeErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.RangeErrorEnum_RangeError", RangeErrorEnum_RangeError_name, RangeErrorEnum_RangeError_value)
+	proto.RegisterType((*RangeErrorEnum)(nil), "google.ads.googleads.v3.errors.RangeErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/range_error.proto", fileDescriptor_2ccd0a5d18cd27d7)
+}
+
+var fileDescriptor_2ccd0a5d18cd27d7 = []byte{
+	// 290 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xd1, 0x4a, 0xc3, 0x30,
+	0x18, 0x85, 0x6d, 0x07, 0x2a, 0x99, 0xb8, 0xd2, 0x4b, 0x91, 0x5d, 0xf4, 0x01, 0x12, 0x21, 0x77,
+	0xf1, 0xaa, 0x73, 0xb5, 0x2b, 0x4a, 0x5b, 0xd4, 0xb5, 0x20, 0x85, 0x11, 0x4d, 0x09, 0x85, 0x2d,
+	0x29, 0x49, 0xdd, 0x03, 0x79, 0xe9, 0xa3, 0xf8, 0x28, 0x7b, 0x0a, 0x49, 0x63, 0xbb, 0x2b, 0xbd,
+	0xca, 0xf9, 0xc3, 0x77, 0xce, 0x7f, 0xf8, 0xc1, 0x0d, 0x97, 0x92, 0x6f, 0x6b, 0x44, 0x99, 0x46,
+	0x56, 0x1a, 0xb5, 0xc7, 0xa8, 0x56, 0x4a, 0x2a, 0x8d, 0x14, 0x15, 0xbc, 0xde, 0xf4, 0x03, 0x6c,
+	0x95, 0xec, 0xa4, 0x3f, 0xb7, 0x18, 0xa4, 0x4c, 0xc3, 0xd1, 0x01, 0xf7, 0x18, 0x5a, 0xc7, 0xd5,
+	0xf5, 0x90, 0xd8, 0x36, 0x88, 0x0a, 0x21, 0x3b, 0xda, 0x35, 0x52, 0x68, 0xeb, 0x0e, 0x4a, 0x70,
+	0xf9, 0x64, 0x22, 0x23, 0x03, 0x47, 0xe2, 0x63, 0x17, 0x44, 0x00, 0x1c, 0x7f, 0xfc, 0x19, 0x98,
+	0xae, 0xd3, 0xe7, 0x3c, 0xba, 0x4b, 0xee, 0x93, 0x68, 0xe9, 0x9d, 0xf8, 0x53, 0x70, 0xb6, 0x4e,
+	0x1f, 0xd2, 0xac, 0x4c, 0x3d, 0xc7, 0x0c, 0x2f, 0x59, 0xb6, 0x79, 0xcc, 0x4a, 0xcf, 0xf5, 0x2f,
+	0xc0, 0xb9, 0x19, 0x56, 0x49, 0xbc, 0xf2, 0x26, 0x8b, 0x83, 0x03, 0x82, 0x77, 0xb9, 0x83, 0xff,
+	0xb7, 0x5b, 0xcc, 0x8e, 0xbb, 0x72, 0x53, 0x28, 0x77, 0x5e, 0x97, 0xbf, 0x16, 0x2e, 0xb7, 0x54,
+	0x70, 0x28, 0x15, 0x47, 0xbc, 0x16, 0x7d, 0xdd, 0xe1, 0x24, 0x6d, 0xa3, 0xff, 0xba, 0xd0, 0xad,
+	0x7d, 0x3e, 0xdd, 0x49, 0x1c, 0x86, 0x5f, 0xee, 0x3c, 0xb6, 0x61, 0x21, 0xd3, 0xd0, 0x4a, 0xa3,
+	0x0a, 0x0c, 0xfb, 0x95, 0xfa, 0x7b, 0x00, 0xaa, 0x90, 0xe9, 0x6a, 0x04, 0xaa, 0x02, 0x57, 0x16,
+	0x38, 0xb8, 0x81, 0xfd, 0x25, 0x24, 0x64, 0x9a, 0x90, 0x11, 0x21, 0xa4, 0xc0, 0x84, 0x58, 0xe8,
+	0xed, 0xb4, 0x6f, 0x87, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xcb, 0xe5, 0x3f, 0xbe, 0x01,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/reach_plan_error.pb.go b/googleapis/ads/googleads/v3/errors/reach_plan_error.pb.go
new file mode 100644
index 0000000..79a6cb9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/reach_plan_error.pb.go
@@ -0,0 +1,115 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/reach_plan_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible errors from ReachPlanService.
+type ReachPlanErrorEnum_ReachPlanError int32
+
+const (
+	// Enum unspecified.
+	ReachPlanErrorEnum_UNSPECIFIED ReachPlanErrorEnum_ReachPlanError = 0
+	// The received error code is not known in this version.
+	ReachPlanErrorEnum_UNKNOWN ReachPlanErrorEnum_ReachPlanError = 1
+)
+
+var ReachPlanErrorEnum_ReachPlanError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+}
+
+var ReachPlanErrorEnum_ReachPlanError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+}
+
+func (x ReachPlanErrorEnum_ReachPlanError) String() string {
+	return proto.EnumName(ReachPlanErrorEnum_ReachPlanError_name, int32(x))
+}
+
+func (ReachPlanErrorEnum_ReachPlanError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8373892c2e751e6f, []int{0, 0}
+}
+
+// Container for enum describing possible errors returned from
+// the ReachPlanService.
+type ReachPlanErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ReachPlanErrorEnum) Reset()         { *m = ReachPlanErrorEnum{} }
+func (m *ReachPlanErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ReachPlanErrorEnum) ProtoMessage()    {}
+func (*ReachPlanErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8373892c2e751e6f, []int{0}
+}
+
+func (m *ReachPlanErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ReachPlanErrorEnum.Unmarshal(m, b)
+}
+func (m *ReachPlanErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ReachPlanErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ReachPlanErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ReachPlanErrorEnum.Merge(m, src)
+}
+func (m *ReachPlanErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ReachPlanErrorEnum.Size(m)
+}
+func (m *ReachPlanErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ReachPlanErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ReachPlanErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ReachPlanErrorEnum_ReachPlanError", ReachPlanErrorEnum_ReachPlanError_name, ReachPlanErrorEnum_ReachPlanError_value)
+	proto.RegisterType((*ReachPlanErrorEnum)(nil), "google.ads.googleads.v3.errors.ReachPlanErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/reach_plan_error.proto", fileDescriptor_8373892c2e751e6f)
+}
+
+var fileDescriptor_8373892c2e751e6f = []byte{
+	// 280 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4a, 0xc3, 0x40,
+	0x18, 0x85, 0x4d, 0x04, 0x85, 0x29, 0x68, 0x89, 0x3b, 0x91, 0x2e, 0x72, 0x80, 0x99, 0xc5, 0xe0,
+	0x66, 0x5c, 0xa5, 0x26, 0x96, 0x22, 0xc4, 0xa0, 0x34, 0x82, 0x04, 0xca, 0xd8, 0x84, 0x31, 0x90,
+	0xce, 0x1f, 0x66, 0x62, 0x0f, 0xe4, 0xd2, 0xa3, 0x78, 0x14, 0x17, 0x9e, 0x41, 0x26, 0xbf, 0x09,
+	0x74, 0x61, 0x57, 0xf3, 0x78, 0x7c, 0xef, 0xcd, 0xe3, 0x27, 0xd7, 0x0a, 0x40, 0x35, 0x15, 0x93,
+	0xa5, 0x65, 0x28, 0x9d, 0xda, 0x71, 0x56, 0x19, 0x03, 0xc6, 0x32, 0x53, 0xc9, 0xcd, 0xdb, 0xba,
+	0x6d, 0xa4, 0x5e, 0xf7, 0x0e, 0x6d, 0x0d, 0x74, 0x10, 0xcc, 0x90, 0xa5, 0xb2, 0xb4, 0x74, 0x8c,
+	0xd1, 0x1d, 0xa7, 0x18, 0xbb, 0xbc, 0x1a, 0x6a, 0xdb, 0x9a, 0x49, 0xad, 0xa1, 0x93, 0x5d, 0x0d,
+	0xda, 0x62, 0x3a, 0x8c, 0x49, 0xf0, 0xe8, 0x7a, 0xb3, 0x46, 0xea, 0xc4, 0x05, 0x12, 0xfd, 0xbe,
+	0x0d, 0x29, 0x39, 0xdb, 0x77, 0x83, 0x73, 0x32, 0x59, 0xa5, 0x4f, 0x59, 0x72, 0xbb, 0xbc, 0x5b,
+	0x26, 0xf1, 0xf4, 0x28, 0x98, 0x90, 0xd3, 0x55, 0x7a, 0x9f, 0x3e, 0x3c, 0xa7, 0x53, 0x6f, 0xfe,
+	0xe3, 0x91, 0x70, 0x03, 0x5b, 0x7a, 0x78, 0xca, 0xfc, 0x62, 0xbf, 0x34, 0x73, 0x0b, 0x32, 0xef,
+	0x25, 0xfe, 0x8b, 0x29, 0x68, 0xa4, 0x56, 0x14, 0x8c, 0x62, 0xaa, 0xd2, 0xfd, 0xbe, 0xe1, 0x10,
+	0x6d, 0x6d, 0xff, 0xbb, 0xcb, 0x0d, 0x3e, 0x1f, 0xfe, 0xf1, 0x22, 0x8a, 0x3e, 0xfd, 0xd9, 0x02,
+	0xcb, 0xa2, 0xd2, 0x52, 0x94, 0x4e, 0xe5, 0x9c, 0xf6, 0x5f, 0xda, 0xaf, 0x01, 0x28, 0xa2, 0xd2,
+	0x16, 0x23, 0x50, 0xe4, 0xbc, 0x40, 0xe0, 0xdb, 0x0f, 0xd1, 0x15, 0x22, 0x2a, 0xad, 0x10, 0x23,
+	0x22, 0x44, 0xce, 0x85, 0x40, 0xe8, 0xf5, 0xa4, 0x5f, 0xc7, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff,
+	0x97, 0x50, 0x2d, 0x4b, 0xb4, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/recommendation_error.pb.go b/googleapis/ads/googleads/v3/errors/recommendation_error.pb.go
new file mode 100644
index 0000000..6a8d844
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/recommendation_error.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/recommendation_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible errors from applying a recommendation.
+type RecommendationErrorEnum_RecommendationError int32
+
+const (
+	// Enum unspecified.
+	RecommendationErrorEnum_UNSPECIFIED RecommendationErrorEnum_RecommendationError = 0
+	// The received error code is not known in this version.
+	RecommendationErrorEnum_UNKNOWN RecommendationErrorEnum_RecommendationError = 1
+	// The specified budget amount is too low e.g. lower than minimum currency
+	// unit or lower than ad group minimum cost-per-click.
+	RecommendationErrorEnum_BUDGET_AMOUNT_TOO_SMALL RecommendationErrorEnum_RecommendationError = 2
+	// The specified budget amount is too large.
+	RecommendationErrorEnum_BUDGET_AMOUNT_TOO_LARGE RecommendationErrorEnum_RecommendationError = 3
+	// The specified budget amount is not a valid amount. e.g. not a multiple
+	// of minimum currency unit.
+	RecommendationErrorEnum_INVALID_BUDGET_AMOUNT RecommendationErrorEnum_RecommendationError = 4
+	// The specified keyword or ad violates ad policy.
+	RecommendationErrorEnum_POLICY_ERROR RecommendationErrorEnum_RecommendationError = 5
+	// The specified bid amount is not valid. e.g. too many fractional digits,
+	// or negative amount.
+	RecommendationErrorEnum_INVALID_BID_AMOUNT RecommendationErrorEnum_RecommendationError = 6
+	// The number of keywords in ad group have reached the maximum allowed.
+	RecommendationErrorEnum_ADGROUP_KEYWORD_LIMIT RecommendationErrorEnum_RecommendationError = 7
+	// The recommendation requested to apply has already been applied.
+	RecommendationErrorEnum_RECOMMENDATION_ALREADY_APPLIED RecommendationErrorEnum_RecommendationError = 8
+	// The recommendation requested to apply has been invalidated.
+	RecommendationErrorEnum_RECOMMENDATION_INVALIDATED RecommendationErrorEnum_RecommendationError = 9
+	// The number of operations in a single request exceeds the maximum allowed.
+	RecommendationErrorEnum_TOO_MANY_OPERATIONS RecommendationErrorEnum_RecommendationError = 10
+	// There are no operations in the request.
+	RecommendationErrorEnum_NO_OPERATIONS RecommendationErrorEnum_RecommendationError = 11
+	// Operations with multiple recommendation types are not supported when
+	// partial failure mode is not enabled.
+	RecommendationErrorEnum_DIFFERENT_TYPES_NOT_SUPPORTED RecommendationErrorEnum_RecommendationError = 12
+	// Request contains multiple operations with the same resource_name.
+	RecommendationErrorEnum_DUPLICATE_RESOURCE_NAME RecommendationErrorEnum_RecommendationError = 13
+	// The recommendation requested to dismiss has already been dismissed.
+	RecommendationErrorEnum_RECOMMENDATION_ALREADY_DISMISSED RecommendationErrorEnum_RecommendationError = 14
+	// The recommendation apply request was malformed and invalid.
+	RecommendationErrorEnum_INVALID_APPLY_REQUEST RecommendationErrorEnum_RecommendationError = 15
+)
+
+var RecommendationErrorEnum_RecommendationError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "BUDGET_AMOUNT_TOO_SMALL",
+	3:  "BUDGET_AMOUNT_TOO_LARGE",
+	4:  "INVALID_BUDGET_AMOUNT",
+	5:  "POLICY_ERROR",
+	6:  "INVALID_BID_AMOUNT",
+	7:  "ADGROUP_KEYWORD_LIMIT",
+	8:  "RECOMMENDATION_ALREADY_APPLIED",
+	9:  "RECOMMENDATION_INVALIDATED",
+	10: "TOO_MANY_OPERATIONS",
+	11: "NO_OPERATIONS",
+	12: "DIFFERENT_TYPES_NOT_SUPPORTED",
+	13: "DUPLICATE_RESOURCE_NAME",
+	14: "RECOMMENDATION_ALREADY_DISMISSED",
+	15: "INVALID_APPLY_REQUEST",
+}
+
+var RecommendationErrorEnum_RecommendationError_value = map[string]int32{
+	"UNSPECIFIED":                      0,
+	"UNKNOWN":                          1,
+	"BUDGET_AMOUNT_TOO_SMALL":          2,
+	"BUDGET_AMOUNT_TOO_LARGE":          3,
+	"INVALID_BUDGET_AMOUNT":            4,
+	"POLICY_ERROR":                     5,
+	"INVALID_BID_AMOUNT":               6,
+	"ADGROUP_KEYWORD_LIMIT":            7,
+	"RECOMMENDATION_ALREADY_APPLIED":   8,
+	"RECOMMENDATION_INVALIDATED":       9,
+	"TOO_MANY_OPERATIONS":              10,
+	"NO_OPERATIONS":                    11,
+	"DIFFERENT_TYPES_NOT_SUPPORTED":    12,
+	"DUPLICATE_RESOURCE_NAME":          13,
+	"RECOMMENDATION_ALREADY_DISMISSED": 14,
+	"INVALID_APPLY_REQUEST":            15,
+}
+
+func (x RecommendationErrorEnum_RecommendationError) String() string {
+	return proto.EnumName(RecommendationErrorEnum_RecommendationError_name, int32(x))
+}
+
+func (RecommendationErrorEnum_RecommendationError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_222bd14d82b9986e, []int{0, 0}
+}
+
+// Container for enum describing possible errors from applying a recommendation.
+type RecommendationErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *RecommendationErrorEnum) Reset()         { *m = RecommendationErrorEnum{} }
+func (m *RecommendationErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*RecommendationErrorEnum) ProtoMessage()    {}
+func (*RecommendationErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_222bd14d82b9986e, []int{0}
+}
+
+func (m *RecommendationErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RecommendationErrorEnum.Unmarshal(m, b)
+}
+func (m *RecommendationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RecommendationErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *RecommendationErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RecommendationErrorEnum.Merge(m, src)
+}
+func (m *RecommendationErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_RecommendationErrorEnum.Size(m)
+}
+func (m *RecommendationErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_RecommendationErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RecommendationErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.RecommendationErrorEnum_RecommendationError", RecommendationErrorEnum_RecommendationError_name, RecommendationErrorEnum_RecommendationError_value)
+	proto.RegisterType((*RecommendationErrorEnum)(nil), "google.ads.googleads.v3.errors.RecommendationErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/recommendation_error.proto", fileDescriptor_222bd14d82b9986e)
+}
+
+var fileDescriptor_222bd14d82b9986e = []byte{
+	// 516 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xd1, 0x6e, 0xd3, 0x3e,
+	0x14, 0xc6, 0xff, 0x6d, 0xff, 0x6c, 0xe0, 0x6e, 0xcc, 0x78, 0x82, 0xc2, 0x80, 0x0a, 0x2a, 0xae,
+	0x93, 0x8b, 0x5c, 0x11, 0xae, 0xdc, 0xfa, 0xb4, 0xb2, 0x96, 0xd8, 0xc6, 0x49, 0x3a, 0x05, 0x55,
+	0xb2, 0xca, 0x52, 0x45, 0x95, 0xd6, 0xa4, 0x4a, 0xca, 0x1e, 0x88, 0x4b, 0x1e, 0x82, 0x07, 0xe0,
+	0x11, 0x78, 0x04, 0x6e, 0x79, 0x01, 0x94, 0x64, 0xad, 0x36, 0xd4, 0x71, 0x95, 0xa3, 0xe3, 0xdf,
+	0xf7, 0xf9, 0x1c, 0xe7, 0x43, 0xef, 0xd3, 0x3c, 0x4f, 0xaf, 0x16, 0xf6, 0x3c, 0x29, 0xed, 0xa6,
+	0xac, 0xaa, 0x6b, 0xc7, 0x5e, 0x14, 0x45, 0x5e, 0x94, 0x76, 0xb1, 0xb8, 0xcc, 0x57, 0xab, 0x45,
+	0x96, 0xcc, 0x37, 0xcb, 0x3c, 0x33, 0x75, 0xd7, 0x5a, 0x17, 0xf9, 0x26, 0x27, 0xfd, 0x86, 0xb7,
+	0xe6, 0x49, 0x69, 0xed, 0xa4, 0xd6, 0xb5, 0x63, 0x35, 0xd2, 0xb3, 0x57, 0x5b, 0xeb, 0xf5, 0xd2,
+	0x9e, 0x67, 0x59, 0xbe, 0xa9, 0x2d, 0xca, 0x46, 0x3d, 0xf8, 0xd9, 0x41, 0x3d, 0x7d, 0xc7, 0x1c,
+	0x2a, 0x19, 0x64, 0x5f, 0x56, 0x83, 0xef, 0x1d, 0x74, 0xba, 0xe7, 0x8c, 0x9c, 0xa0, 0x6e, 0x24,
+	0x02, 0x05, 0x23, 0x3e, 0xe6, 0xc0, 0xf0, 0x7f, 0xa4, 0x8b, 0x0e, 0x23, 0x71, 0x2e, 0xe4, 0x85,
+	0xc0, 0x2d, 0xf2, 0x12, 0xf5, 0x86, 0x11, 0x9b, 0x40, 0x68, 0xa8, 0x2f, 0x23, 0x11, 0x9a, 0x50,
+	0x4a, 0x13, 0xf8, 0xd4, 0xf3, 0x70, 0x7b, 0xff, 0xa1, 0x47, 0xf5, 0x04, 0x70, 0x87, 0xbc, 0x40,
+	0x4f, 0xb9, 0x98, 0x52, 0x8f, 0x33, 0x73, 0x07, 0xc2, 0xff, 0x13, 0x8c, 0x8e, 0x94, 0xf4, 0xf8,
+	0x28, 0x36, 0xa0, 0xb5, 0xd4, 0xf8, 0x01, 0x79, 0x86, 0xc8, 0x0e, 0xe6, 0x6c, 0x4b, 0x1e, 0x54,
+	0x26, 0x94, 0x4d, 0xb4, 0x8c, 0x94, 0x39, 0x87, 0xf8, 0x42, 0x6a, 0x66, 0x3c, 0xee, 0xf3, 0x10,
+	0x1f, 0x92, 0x01, 0xea, 0x6b, 0x18, 0x49, 0xdf, 0x07, 0xc1, 0x68, 0xc8, 0xa5, 0x30, 0xd4, 0xd3,
+	0x40, 0x59, 0x6c, 0xa8, 0x52, 0x5e, 0xb5, 0xca, 0x43, 0xd2, 0x47, 0x67, 0x7f, 0x31, 0x37, 0xb7,
+	0xd0, 0x10, 0x18, 0x7e, 0x44, 0x7a, 0xe8, 0xb4, 0x1a, 0xd9, 0xa7, 0x22, 0x36, 0x52, 0x81, 0xae,
+	0x99, 0x00, 0x23, 0xf2, 0x04, 0x1d, 0x0b, 0x79, 0xbb, 0xd5, 0x25, 0x6f, 0xd1, 0x6b, 0xc6, 0xc7,
+	0x63, 0xd0, 0x50, 0x2d, 0x1a, 0x2b, 0x08, 0x8c, 0x90, 0xa1, 0x09, 0x22, 0xa5, 0xa4, 0xae, 0xec,
+	0x8e, 0xaa, 0xf7, 0x60, 0x91, 0xf2, 0xf8, 0x88, 0x86, 0x60, 0x34, 0x04, 0x32, 0xd2, 0x23, 0x30,
+	0x82, 0xfa, 0x80, 0x8f, 0xc9, 0x3b, 0xf4, 0xe6, 0x9e, 0x79, 0x19, 0x0f, 0x7c, 0x1e, 0x04, 0xc0,
+	0xf0, 0xe3, 0xdb, 0xaf, 0x56, 0xad, 0x11, 0x1b, 0x0d, 0x1f, 0x23, 0x08, 0x42, 0x7c, 0x32, 0xfc,
+	0xdd, 0x42, 0x83, 0xcb, 0x7c, 0x65, 0xfd, 0x3b, 0x21, 0xc3, 0xe7, 0x7b, 0x7e, 0xb2, 0xaa, 0xd2,
+	0xa1, 0x5a, 0x9f, 0xd8, 0x8d, 0x36, 0xcd, 0xaf, 0xe6, 0x59, 0x6a, 0xe5, 0x45, 0x6a, 0xa7, 0x8b,
+	0xac, 0xce, 0xce, 0x36, 0xa8, 0xeb, 0x65, 0x79, 0x5f, 0x6e, 0x3f, 0x34, 0x9f, 0xaf, 0xed, 0xce,
+	0x84, 0xd2, 0x6f, 0xed, 0xfe, 0xa4, 0x31, 0xa3, 0x49, 0x69, 0x35, 0x65, 0x55, 0x4d, 0x1d, 0xab,
+	0xbe, 0xb2, 0xfc, 0xb1, 0x05, 0x66, 0x34, 0x29, 0x67, 0x3b, 0x60, 0x36, 0x75, 0x66, 0x0d, 0xf0,
+	0xab, 0x3d, 0x68, 0xba, 0xae, 0x4b, 0x93, 0xd2, 0x75, 0x77, 0x88, 0xeb, 0x4e, 0x1d, 0xd7, 0x6d,
+	0xa0, 0xcf, 0x07, 0xf5, 0x74, 0xce, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x84, 0x41, 0x6b, 0x56,
+	0x54, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/region_code_error.pb.go b/googleapis/ads/googleads/v3/errors/region_code_error.pb.go
new file mode 100644
index 0000000..8b75314
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/region_code_error.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/region_code_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible region code errors.
+type RegionCodeErrorEnum_RegionCodeError int32
+
+const (
+	// Enum unspecified.
+	RegionCodeErrorEnum_UNSPECIFIED RegionCodeErrorEnum_RegionCodeError = 0
+	// The received error code is not known in this version.
+	RegionCodeErrorEnum_UNKNOWN RegionCodeErrorEnum_RegionCodeError = 1
+	// Invalid region code.
+	RegionCodeErrorEnum_INVALID_REGION_CODE RegionCodeErrorEnum_RegionCodeError = 2
+)
+
+var RegionCodeErrorEnum_RegionCodeError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "INVALID_REGION_CODE",
+}
+
+var RegionCodeErrorEnum_RegionCodeError_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"INVALID_REGION_CODE": 2,
+}
+
+func (x RegionCodeErrorEnum_RegionCodeError) String() string {
+	return proto.EnumName(RegionCodeErrorEnum_RegionCodeError_name, int32(x))
+}
+
+func (RegionCodeErrorEnum_RegionCodeError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_82b26e9ba20863ce, []int{0, 0}
+}
+
+// Container for enum describing possible region code errors.
+type RegionCodeErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *RegionCodeErrorEnum) Reset()         { *m = RegionCodeErrorEnum{} }
+func (m *RegionCodeErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*RegionCodeErrorEnum) ProtoMessage()    {}
+func (*RegionCodeErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_82b26e9ba20863ce, []int{0}
+}
+
+func (m *RegionCodeErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RegionCodeErrorEnum.Unmarshal(m, b)
+}
+func (m *RegionCodeErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RegionCodeErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *RegionCodeErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RegionCodeErrorEnum.Merge(m, src)
+}
+func (m *RegionCodeErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_RegionCodeErrorEnum.Size(m)
+}
+func (m *RegionCodeErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_RegionCodeErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RegionCodeErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.RegionCodeErrorEnum_RegionCodeError", RegionCodeErrorEnum_RegionCodeError_name, RegionCodeErrorEnum_RegionCodeError_value)
+	proto.RegisterType((*RegionCodeErrorEnum)(nil), "google.ads.googleads.v3.errors.RegionCodeErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/region_code_error.proto", fileDescriptor_82b26e9ba20863ce)
+}
+
+var fileDescriptor_82b26e9ba20863ce = []byte{
+	// 302 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4a, 0x03, 0x31,
+	0x18, 0x85, 0xed, 0x08, 0x0a, 0xe9, 0xa2, 0x65, 0x2a, 0x08, 0x22, 0x5d, 0xcc, 0x01, 0x92, 0x45,
+	0xc0, 0x45, 0x5c, 0xa5, 0x9d, 0x58, 0x07, 0x25, 0x2d, 0x95, 0x8e, 0x20, 0x03, 0xc3, 0xd8, 0x84,
+	0x30, 0xd0, 0xe6, 0x2f, 0x49, 0xed, 0x81, 0x5c, 0x7a, 0x14, 0x8f, 0xe2, 0xc6, 0x2b, 0xc8, 0x4c,
+	0x6c, 0x17, 0x05, 0x5d, 0xe5, 0xf1, 0xf8, 0xde, 0xcb, 0xe3, 0x47, 0x37, 0x06, 0xc0, 0xac, 0x34,
+	0xa9, 0x94, 0x27, 0x41, 0x36, 0x6a, 0x47, 0x89, 0x76, 0x0e, 0x9c, 0x27, 0x4e, 0x9b, 0x1a, 0x6c,
+	0xb9, 0x04, 0xa5, 0xcb, 0xd6, 0xc2, 0x1b, 0x07, 0x5b, 0x88, 0x87, 0x01, 0xc6, 0x95, 0xf2, 0xf8,
+	0x90, 0xc3, 0x3b, 0x8a, 0x43, 0xee, 0xea, 0x7a, 0xdf, 0xbb, 0xa9, 0x49, 0x65, 0x2d, 0x6c, 0xab,
+	0x6d, 0x0d, 0xd6, 0x87, 0x74, 0x52, 0xa2, 0xc1, 0xbc, 0x2d, 0x1e, 0x83, 0xd2, 0xa2, 0x49, 0x08,
+	0xfb, 0xb6, 0x4e, 0xee, 0x51, 0xef, 0xc8, 0x8e, 0x7b, 0xa8, 0xbb, 0x90, 0x4f, 0x33, 0x31, 0xce,
+	0xee, 0x32, 0x91, 0xf6, 0x4f, 0xe2, 0x2e, 0x3a, 0x5f, 0xc8, 0x07, 0x39, 0x7d, 0x96, 0xfd, 0x4e,
+	0x7c, 0x89, 0x06, 0x99, 0xcc, 0xf9, 0x63, 0x96, 0x96, 0x73, 0x31, 0xc9, 0xa6, 0xb2, 0x1c, 0x4f,
+	0x53, 0xd1, 0x8f, 0x46, 0xdf, 0x1d, 0x94, 0x2c, 0x61, 0x8d, 0xff, 0x5f, 0x39, 0xba, 0x38, 0xfa,
+	0x6e, 0xd6, 0xac, 0x9b, 0x75, 0x5e, 0xd2, 0xdf, 0x9c, 0x81, 0x55, 0x65, 0x0d, 0x06, 0x67, 0x88,
+	0xd1, 0xb6, 0xdd, 0xbe, 0xbf, 0xd2, 0xa6, 0xf6, 0x7f, 0x1d, 0xed, 0x36, 0x3c, 0xef, 0xd1, 0xe9,
+	0x84, 0xf3, 0x8f, 0x68, 0x38, 0x09, 0x65, 0x5c, 0x79, 0x1c, 0x64, 0xa3, 0x72, 0x8a, 0xdb, 0x2f,
+	0xfd, 0xe7, 0x1e, 0x28, 0xb8, 0xf2, 0xc5, 0x01, 0x28, 0x72, 0x5a, 0x04, 0xe0, 0x2b, 0x4a, 0x82,
+	0xcb, 0x18, 0x57, 0x9e, 0xb1, 0x03, 0xc2, 0x58, 0x4e, 0x19, 0x0b, 0xd0, 0xeb, 0x59, 0xbb, 0x8e,
+	0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x6c, 0xd3, 0xa4, 0x21, 0xd1, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/request_error.pb.go b/googleapis/ads/googleads/v3/errors/request_error.pb.go
new file mode 100644
index 0000000..f742113
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/request_error.pb.go
@@ -0,0 +1,232 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/request_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible request errors.
+type RequestErrorEnum_RequestError int32
+
+const (
+	// Enum unspecified.
+	RequestErrorEnum_UNSPECIFIED RequestErrorEnum_RequestError = 0
+	// The received error code is not known in this version.
+	RequestErrorEnum_UNKNOWN RequestErrorEnum_RequestError = 1
+	// Resource name is required for this request.
+	RequestErrorEnum_RESOURCE_NAME_MISSING RequestErrorEnum_RequestError = 3
+	// Resource name provided is malformed.
+	RequestErrorEnum_RESOURCE_NAME_MALFORMED RequestErrorEnum_RequestError = 4
+	// Resource name provided is malformed.
+	RequestErrorEnum_BAD_RESOURCE_ID RequestErrorEnum_RequestError = 17
+	// Customer ID is invalid.
+	RequestErrorEnum_INVALID_CUSTOMER_ID RequestErrorEnum_RequestError = 16
+	// Mutate operation should have either create, update, or remove specified.
+	RequestErrorEnum_OPERATION_REQUIRED RequestErrorEnum_RequestError = 5
+	// Requested resource not found.
+	RequestErrorEnum_RESOURCE_NOT_FOUND RequestErrorEnum_RequestError = 6
+	// Next page token specified in user request is invalid.
+	RequestErrorEnum_INVALID_PAGE_TOKEN RequestErrorEnum_RequestError = 7
+	// Next page token specified in user request has expired.
+	RequestErrorEnum_EXPIRED_PAGE_TOKEN RequestErrorEnum_RequestError = 8
+	// Page size specified in user request is invalid.
+	RequestErrorEnum_INVALID_PAGE_SIZE RequestErrorEnum_RequestError = 22
+	// Required field is missing.
+	RequestErrorEnum_REQUIRED_FIELD_MISSING RequestErrorEnum_RequestError = 9
+	// The field cannot be modified because it's immutable. It's also possible
+	// that the field can be modified using 'create' operation but not 'update'.
+	RequestErrorEnum_IMMUTABLE_FIELD RequestErrorEnum_RequestError = 11
+	// Received too many entries in request.
+	RequestErrorEnum_TOO_MANY_MUTATE_OPERATIONS RequestErrorEnum_RequestError = 13
+	// Request cannot be executed by a manager account.
+	RequestErrorEnum_CANNOT_BE_EXECUTED_BY_MANAGER_ACCOUNT RequestErrorEnum_RequestError = 14
+	// Mutate request was attempting to modify a readonly field.
+	// For instance, Budget fields can be requested for Ad Group,
+	// but are read-only for adGroups:mutate.
+	RequestErrorEnum_CANNOT_MODIFY_FOREIGN_FIELD RequestErrorEnum_RequestError = 15
+	// Enum value is not permitted.
+	RequestErrorEnum_INVALID_ENUM_VALUE RequestErrorEnum_RequestError = 18
+	// The developer-token parameter is required for all requests.
+	RequestErrorEnum_DEVELOPER_TOKEN_PARAMETER_MISSING RequestErrorEnum_RequestError = 19
+	// The login-customer-id parameter is required for this request.
+	RequestErrorEnum_LOGIN_CUSTOMER_ID_PARAMETER_MISSING RequestErrorEnum_RequestError = 20
+	// page_token is set in the validate only request
+	RequestErrorEnum_VALIDATE_ONLY_REQUEST_HAS_PAGE_TOKEN RequestErrorEnum_RequestError = 21
+	// return_summary_row cannot be enabled if request did not select any
+	// metrics field.
+	RequestErrorEnum_CANNOT_RETURN_SUMMARY_ROW_FOR_REQUEST_WITHOUT_METRICS RequestErrorEnum_RequestError = 29
+	// return_summary_row should not be enabled for validate only requests.
+	RequestErrorEnum_CANNOT_RETURN_SUMMARY_ROW_FOR_VALIDATE_ONLY_REQUESTS RequestErrorEnum_RequestError = 30
+	// return_summary_row parameter value should be the same between requests
+	// with page_token field set and their original request.
+	RequestErrorEnum_INCONSISTENT_RETURN_SUMMARY_ROW_VALUE RequestErrorEnum_RequestError = 31
+	// The total results count cannot be returned if it was not requested in the
+	// original request.
+	RequestErrorEnum_TOTAL_RESULTS_COUNT_NOT_ORIGINALLY_REQUESTED RequestErrorEnum_RequestError = 32
+)
+
+var RequestErrorEnum_RequestError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	3:  "RESOURCE_NAME_MISSING",
+	4:  "RESOURCE_NAME_MALFORMED",
+	17: "BAD_RESOURCE_ID",
+	16: "INVALID_CUSTOMER_ID",
+	5:  "OPERATION_REQUIRED",
+	6:  "RESOURCE_NOT_FOUND",
+	7:  "INVALID_PAGE_TOKEN",
+	8:  "EXPIRED_PAGE_TOKEN",
+	22: "INVALID_PAGE_SIZE",
+	9:  "REQUIRED_FIELD_MISSING",
+	11: "IMMUTABLE_FIELD",
+	13: "TOO_MANY_MUTATE_OPERATIONS",
+	14: "CANNOT_BE_EXECUTED_BY_MANAGER_ACCOUNT",
+	15: "CANNOT_MODIFY_FOREIGN_FIELD",
+	18: "INVALID_ENUM_VALUE",
+	19: "DEVELOPER_TOKEN_PARAMETER_MISSING",
+	20: "LOGIN_CUSTOMER_ID_PARAMETER_MISSING",
+	21: "VALIDATE_ONLY_REQUEST_HAS_PAGE_TOKEN",
+	29: "CANNOT_RETURN_SUMMARY_ROW_FOR_REQUEST_WITHOUT_METRICS",
+	30: "CANNOT_RETURN_SUMMARY_ROW_FOR_VALIDATE_ONLY_REQUESTS",
+	31: "INCONSISTENT_RETURN_SUMMARY_ROW_VALUE",
+	32: "TOTAL_RESULTS_COUNT_NOT_ORIGINALLY_REQUESTED",
+}
+
+var RequestErrorEnum_RequestError_value = map[string]int32{
+	"UNSPECIFIED":                                           0,
+	"UNKNOWN":                                               1,
+	"RESOURCE_NAME_MISSING":                                 3,
+	"RESOURCE_NAME_MALFORMED":                               4,
+	"BAD_RESOURCE_ID":                                       17,
+	"INVALID_CUSTOMER_ID":                                   16,
+	"OPERATION_REQUIRED":                                    5,
+	"RESOURCE_NOT_FOUND":                                    6,
+	"INVALID_PAGE_TOKEN":                                    7,
+	"EXPIRED_PAGE_TOKEN":                                    8,
+	"INVALID_PAGE_SIZE":                                     22,
+	"REQUIRED_FIELD_MISSING":                                9,
+	"IMMUTABLE_FIELD":                                       11,
+	"TOO_MANY_MUTATE_OPERATIONS":                            13,
+	"CANNOT_BE_EXECUTED_BY_MANAGER_ACCOUNT":                 14,
+	"CANNOT_MODIFY_FOREIGN_FIELD":                           15,
+	"INVALID_ENUM_VALUE":                                    18,
+	"DEVELOPER_TOKEN_PARAMETER_MISSING":                     19,
+	"LOGIN_CUSTOMER_ID_PARAMETER_MISSING":                   20,
+	"VALIDATE_ONLY_REQUEST_HAS_PAGE_TOKEN":                  21,
+	"CANNOT_RETURN_SUMMARY_ROW_FOR_REQUEST_WITHOUT_METRICS": 29,
+	"CANNOT_RETURN_SUMMARY_ROW_FOR_VALIDATE_ONLY_REQUESTS":  30,
+	"INCONSISTENT_RETURN_SUMMARY_ROW_VALUE":                 31,
+	"TOTAL_RESULTS_COUNT_NOT_ORIGINALLY_REQUESTED":          32,
+}
+
+func (x RequestErrorEnum_RequestError) String() string {
+	return proto.EnumName(RequestErrorEnum_RequestError_name, int32(x))
+}
+
+func (RequestErrorEnum_RequestError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_7bc15dc4a4456f34, []int{0, 0}
+}
+
+// Container for enum describing possible request errors.
+type RequestErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *RequestErrorEnum) Reset()         { *m = RequestErrorEnum{} }
+func (m *RequestErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*RequestErrorEnum) ProtoMessage()    {}
+func (*RequestErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7bc15dc4a4456f34, []int{0}
+}
+
+func (m *RequestErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RequestErrorEnum.Unmarshal(m, b)
+}
+func (m *RequestErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RequestErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *RequestErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RequestErrorEnum.Merge(m, src)
+}
+func (m *RequestErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_RequestErrorEnum.Size(m)
+}
+func (m *RequestErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_RequestErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RequestErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.RequestErrorEnum_RequestError", RequestErrorEnum_RequestError_name, RequestErrorEnum_RequestError_value)
+	proto.RegisterType((*RequestErrorEnum)(nil), "google.ads.googleads.v3.errors.RequestErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/request_error.proto", fileDescriptor_7bc15dc4a4456f34)
+}
+
+var fileDescriptor_7bc15dc4a4456f34 = []byte{
+	// 661 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xe1, 0x4e, 0x13, 0x41,
+	0x10, 0x16, 0xd0, 0xa2, 0x8b, 0xca, 0xb2, 0x08, 0x44, 0xd0, 0xa2, 0x55, 0xa2, 0x26, 0xe6, 0x6a,
+	0xac, 0x26, 0x7a, 0xfe, 0xda, 0xde, 0x4d, 0x8f, 0x0d, 0x77, 0xbb, 0x75, 0x6f, 0xb7, 0x50, 0xd2,
+	0x64, 0x53, 0x6d, 0xd3, 0x90, 0x40, 0x0f, 0x7b, 0x85, 0x87, 0xf0, 0x25, 0x4c, 0xfc, 0xe9, 0xa3,
+	0xf8, 0x28, 0xc6, 0x87, 0x30, 0x7b, 0xd7, 0x1e, 0xd5, 0x20, 0xbf, 0x6e, 0x6e, 0xe6, 0xfb, 0x66,
+	0xbe, 0x99, 0xec, 0x87, 0x5e, 0x0f, 0x92, 0x64, 0x70, 0xdc, 0xaf, 0x76, 0x7b, 0x69, 0x35, 0x0f,
+	0x6d, 0x74, 0x5e, 0xab, 0xf6, 0x47, 0xa3, 0x64, 0x94, 0x56, 0x47, 0xfd, 0x2f, 0x67, 0xfd, 0x74,
+	0x6c, 0xb2, 0x5f, 0xe7, 0x74, 0x94, 0x8c, 0x13, 0x52, 0xce, 0x81, 0x4e, 0xb7, 0x97, 0x3a, 0x05,
+	0xc7, 0x39, 0xaf, 0x39, 0x39, 0x67, 0xf3, 0xc1, 0xb4, 0xe7, 0xe9, 0x51, 0xb5, 0x3b, 0x1c, 0x26,
+	0xe3, 0xee, 0xf8, 0x28, 0x19, 0xa6, 0x39, 0xbb, 0xf2, 0xad, 0x84, 0xb0, 0xcc, 0xbb, 0x82, 0xc5,
+	0xc3, 0xf0, 0xec, 0xa4, 0xf2, 0xb5, 0x84, 0x6e, 0xcf, 0x26, 0xc9, 0x32, 0x5a, 0xd2, 0x3c, 0x6e,
+	0x82, 0xc7, 0x1a, 0x0c, 0x7c, 0x7c, 0x8d, 0x2c, 0xa1, 0x45, 0xcd, 0xf7, 0xb8, 0xd8, 0xe7, 0x78,
+	0x8e, 0xdc, 0x47, 0x6b, 0x12, 0x62, 0xa1, 0xa5, 0x07, 0x86, 0xd3, 0x08, 0x4c, 0xc4, 0xe2, 0x98,
+	0xf1, 0x00, 0x2f, 0x90, 0x2d, 0xb4, 0xf1, 0x4f, 0x89, 0x86, 0x0d, 0x21, 0x23, 0xf0, 0xf1, 0x75,
+	0xb2, 0x8a, 0x96, 0xeb, 0xd4, 0x37, 0x05, 0x80, 0xf9, 0x78, 0x85, 0x6c, 0xa0, 0x55, 0xc6, 0x5b,
+	0x34, 0x64, 0xbe, 0xf1, 0x74, 0xac, 0x44, 0x04, 0xd2, 0x16, 0x30, 0x59, 0x47, 0x44, 0x34, 0x41,
+	0x52, 0xc5, 0x04, 0x37, 0x12, 0x3e, 0x6a, 0x26, 0xc1, 0xc7, 0x37, 0x6c, 0xfe, 0x62, 0x84, 0x50,
+	0xa6, 0x21, 0x34, 0xf7, 0x71, 0xc9, 0xe6, 0xa7, 0x8d, 0x9a, 0x34, 0x00, 0xa3, 0xc4, 0x1e, 0x70,
+	0xbc, 0x68, 0xf3, 0x70, 0xd0, 0xb4, 0xe4, 0xd9, 0xfc, 0x4d, 0xb2, 0x86, 0x56, 0xfe, 0xc2, 0xc7,
+	0xec, 0x10, 0xf0, 0x3a, 0xd9, 0x44, 0xeb, 0xd3, 0x61, 0xa6, 0xc1, 0x20, 0xf4, 0x8b, 0xed, 0x6e,
+	0xd9, 0x05, 0x58, 0x14, 0x69, 0x45, 0xeb, 0x21, 0xe4, 0x45, 0xbc, 0x44, 0xca, 0x68, 0x53, 0x09,
+	0x61, 0x22, 0xca, 0xdb, 0xc6, 0xd6, 0x14, 0x98, 0x42, 0x77, 0x8c, 0xef, 0x90, 0x17, 0x68, 0xc7,
+	0xa3, 0xdc, 0x2a, 0xad, 0x83, 0x81, 0x03, 0xf0, 0xb4, 0x02, 0xdf, 0xd4, 0xdb, 0x96, 0x41, 0x03,
+	0x90, 0x86, 0x7a, 0x9e, 0xd0, 0x5c, 0xe1, 0xbb, 0x64, 0x1b, 0x6d, 0x4d, 0xa0, 0x91, 0xf0, 0x59,
+	0xa3, 0x6d, 0x1a, 0x42, 0x02, 0x0b, 0xf8, 0x64, 0xd6, 0xf2, 0xec, 0x8e, 0xc0, 0x75, 0x64, 0x5a,
+	0x34, 0xd4, 0x80, 0x09, 0xd9, 0x41, 0x8f, 0x7d, 0x68, 0x41, 0x68, 0x07, 0xe7, 0x0b, 0x9a, 0x26,
+	0x95, 0x34, 0x02, 0x05, 0xb2, 0xd0, 0xbf, 0x4a, 0x9e, 0xa1, 0x27, 0xa1, 0x08, 0x18, 0x9f, 0xbd,
+	0xf4, 0x25, 0xc0, 0x7b, 0xe4, 0x39, 0x7a, 0x9a, 0x4d, 0xc9, 0x96, 0xe1, 0x61, 0x3b, 0xbb, 0x3f,
+	0xc4, 0xca, 0xec, 0xd2, 0x78, 0xf6, 0x8a, 0x6b, 0xe4, 0x3d, 0x7a, 0x3b, 0x91, 0x2c, 0x41, 0x69,
+	0xc9, 0x4d, 0xac, 0xa3, 0x88, 0xca, 0xb6, 0x91, 0x62, 0xdf, 0xca, 0x2f, 0x98, 0xfb, 0x4c, 0xed,
+	0x0a, 0xad, 0x4c, 0x04, 0x4a, 0x32, 0x2f, 0xc6, 0x0f, 0xc9, 0x3b, 0xf4, 0xe6, 0x6a, 0xea, 0xa5,
+	0x12, 0x62, 0x5c, 0xb6, 0x27, 0x65, 0xdc, 0x13, 0x3c, 0x66, 0xb1, 0x02, 0x7e, 0x29, 0x3f, 0xbf,
+	0xcc, 0x36, 0x79, 0x85, 0x5e, 0x2a, 0xa1, 0x68, 0x68, 0x5f, 0x9d, 0x0e, 0x55, 0x6c, 0xb2, 0x5b,
+	0x67, 0x0f, 0x47, 0x48, 0x16, 0x30, 0x4e, 0xc3, 0x8b, 0xde, 0xe0, 0xe3, 0x47, 0xf5, 0xdf, 0x73,
+	0xa8, 0xf2, 0x39, 0x39, 0x71, 0xae, 0xb6, 0x59, 0x7d, 0x65, 0xd6, 0x30, 0x4d, 0xeb, 0xad, 0xe6,
+	0xdc, 0xa1, 0x3f, 0x21, 0x0d, 0x92, 0xe3, 0xee, 0x70, 0xe0, 0x24, 0xa3, 0x41, 0x75, 0xd0, 0x1f,
+	0x66, 0xce, 0x9b, 0xfa, 0xfb, 0xf4, 0x28, 0xfd, 0x9f, 0xdd, 0x3f, 0xe4, 0x9f, 0xef, 0xf3, 0x0b,
+	0x01, 0xa5, 0x3f, 0xe6, 0xcb, 0x41, 0xde, 0x8c, 0xf6, 0x52, 0x27, 0x0f, 0x6d, 0xd4, 0xaa, 0x39,
+	0xd9, 0xc8, 0xf4, 0xe7, 0x14, 0xd0, 0xa1, 0xbd, 0xb4, 0x53, 0x00, 0x3a, 0xad, 0x5a, 0x27, 0x07,
+	0xfc, 0x9a, 0xaf, 0xe4, 0x59, 0xd7, 0xa5, 0xbd, 0xd4, 0x75, 0x0b, 0x88, 0xeb, 0xb6, 0x6a, 0xae,
+	0x9b, 0x83, 0x3e, 0x95, 0x32, 0x75, 0xb5, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x31, 0x5a, 0x4d,
+	0x14, 0x8b, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/resource_access_denied_error.pb.go b/googleapis/ads/googleads/v3/errors/resource_access_denied_error.pb.go
new file mode 100644
index 0000000..f472de6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/resource_access_denied_error.pb.go
@@ -0,0 +1,120 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/resource_access_denied_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible resource access denied errors.
+type ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError int32
+
+const (
+	// Enum unspecified.
+	ResourceAccessDeniedErrorEnum_UNSPECIFIED ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError = 0
+	// The received error code is not known in this version.
+	ResourceAccessDeniedErrorEnum_UNKNOWN ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError = 1
+	// User did not have write access.
+	ResourceAccessDeniedErrorEnum_WRITE_ACCESS_DENIED ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError = 3
+)
+
+var ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	3: "WRITE_ACCESS_DENIED",
+}
+
+var ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError_value = map[string]int32{
+	"UNSPECIFIED":         0,
+	"UNKNOWN":             1,
+	"WRITE_ACCESS_DENIED": 3,
+}
+
+func (x ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError) String() string {
+	return proto.EnumName(ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError_name, int32(x))
+}
+
+func (ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2995c18210d516d0, []int{0, 0}
+}
+
+// Container for enum describing possible resource access denied errors.
+type ResourceAccessDeniedErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ResourceAccessDeniedErrorEnum) Reset()         { *m = ResourceAccessDeniedErrorEnum{} }
+func (m *ResourceAccessDeniedErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ResourceAccessDeniedErrorEnum) ProtoMessage()    {}
+func (*ResourceAccessDeniedErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2995c18210d516d0, []int{0}
+}
+
+func (m *ResourceAccessDeniedErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResourceAccessDeniedErrorEnum.Unmarshal(m, b)
+}
+func (m *ResourceAccessDeniedErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResourceAccessDeniedErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ResourceAccessDeniedErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResourceAccessDeniedErrorEnum.Merge(m, src)
+}
+func (m *ResourceAccessDeniedErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ResourceAccessDeniedErrorEnum.Size(m)
+}
+func (m *ResourceAccessDeniedErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResourceAccessDeniedErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResourceAccessDeniedErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError", ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError_name, ResourceAccessDeniedErrorEnum_ResourceAccessDeniedError_value)
+	proto.RegisterType((*ResourceAccessDeniedErrorEnum)(nil), "google.ads.googleads.v3.errors.ResourceAccessDeniedErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/resource_access_denied_error.proto", fileDescriptor_2995c18210d516d0)
+}
+
+var fileDescriptor_2995c18210d516d0 = []byte{
+	// 310 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x6a, 0x02, 0x31,
+	0x18, 0x85, 0xab, 0x42, 0x0b, 0x71, 0x51, 0x99, 0x2e, 0x4a, 0x4b, 0xeb, 0x62, 0x0e, 0x90, 0x2c,
+	0xb2, 0x4b, 0x57, 0xd1, 0x49, 0x45, 0x0a, 0x53, 0xd1, 0xaa, 0x50, 0x06, 0x86, 0x74, 0x12, 0xc2,
+	0x80, 0x26, 0x92, 0x5f, 0x3d, 0x50, 0x97, 0x3d, 0x4a, 0x8f, 0xd2, 0x1b, 0x74, 0x57, 0x26, 0x51,
+	0x77, 0x76, 0x95, 0x47, 0xf2, 0xfd, 0xef, 0xbd, 0xfc, 0x88, 0x1b, 0xe7, 0xcc, 0x4a, 0x13, 0xa9,
+	0x80, 0x44, 0xd9, 0xa8, 0x3d, 0x25, 0xda, 0x7b, 0xe7, 0x81, 0x78, 0x0d, 0x6e, 0xe7, 0x2b, 0x5d,
+	0xca, 0xaa, 0xd2, 0x00, 0xa5, 0xd2, 0xb6, 0xd6, 0xaa, 0x0c, 0xaf, 0x78, 0xe3, 0xdd, 0xd6, 0x25,
+	0xfd, 0x38, 0x87, 0xa5, 0x02, 0x7c, 0xb2, 0xc0, 0x7b, 0x8a, 0xa3, 0xc5, 0xfd, 0xc3, 0x31, 0x62,
+	0x53, 0x13, 0x69, 0xad, 0xdb, 0xca, 0x6d, 0xed, 0x2c, 0xc4, 0xe9, 0x14, 0xd0, 0xe3, 0xf4, 0x90,
+	0xc1, 0x43, 0x44, 0x16, 0x12, 0x44, 0x33, 0x2b, 0xec, 0x6e, 0x9d, 0x4e, 0xd1, 0xdd, 0x59, 0x20,
+	0xb9, 0x46, 0xdd, 0x79, 0x3e, 0x9b, 0x88, 0xe1, 0xf8, 0x79, 0x2c, 0xb2, 0xde, 0x45, 0xd2, 0x45,
+	0x57, 0xf3, 0xfc, 0x25, 0x7f, 0x5d, 0xe6, 0xbd, 0x56, 0x72, 0x8b, 0x6e, 0x96, 0xd3, 0xf1, 0x9b,
+	0x28, 0xf9, 0x70, 0x28, 0x66, 0xb3, 0x32, 0x13, 0x79, 0x43, 0x75, 0x06, 0xbf, 0x2d, 0x94, 0x56,
+	0x6e, 0x8d, 0xff, 0x6f, 0x3e, 0xe8, 0x9f, 0x0d, 0x9e, 0x34, 0xdd, 0x27, 0xad, 0xf7, 0xec, 0xe0,
+	0x60, 0xdc, 0x4a, 0x5a, 0x83, 0x9d, 0x37, 0xc4, 0x68, 0x1b, 0x7e, 0x76, 0x5c, 0xe7, 0xa6, 0x86,
+	0x73, 0xdb, 0x7d, 0x8a, 0xc7, 0x67, 0xbb, 0x33, 0xe2, 0xfc, 0xab, 0xdd, 0x1f, 0x45, 0x33, 0xae,
+	0x00, 0x47, 0xd9, 0xa8, 0x05, 0xc5, 0x21, 0x12, 0xbe, 0x8f, 0x40, 0xc1, 0x15, 0x14, 0x27, 0xa0,
+	0x58, 0xd0, 0x22, 0x02, 0x3f, 0xed, 0x34, 0xde, 0x32, 0xc6, 0x15, 0x30, 0x76, 0x42, 0x18, 0x5b,
+	0x50, 0xc6, 0x22, 0xf4, 0x71, 0x19, 0xda, 0xd1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xee, 0x24,
+	0x4d, 0x25, 0xfa, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/resource_count_limit_exceeded_error.pb.go b/googleapis/ads/googleads/v3/errors/resource_count_limit_exceeded_error.pb.go
new file mode 100644
index 0000000..027e199
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/resource_count_limit_exceeded_error.pb.go
@@ -0,0 +1,182 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/resource_count_limit_exceeded_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible resource count limit exceeded errors.
+type ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError int32
+
+const (
+	// Enum unspecified.
+	ResourceCountLimitExceededErrorEnum_UNSPECIFIED ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 0
+	// The received error code is not known in this version.
+	ResourceCountLimitExceededErrorEnum_UNKNOWN ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 1
+	// Indicates that this request would exceed the number of allowed resources
+	// for the Google Ads account. The exact resource type and limit being
+	// checked can be inferred from accountLimitType.
+	ResourceCountLimitExceededErrorEnum_ACCOUNT_LIMIT ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 2
+	// Indicates that this request would exceed the number of allowed resources
+	// in a Campaign. The exact resource type and limit being checked can be
+	// inferred from accountLimitType, and the numeric id of the
+	// Campaign involved is given by enclosingId.
+	ResourceCountLimitExceededErrorEnum_CAMPAIGN_LIMIT ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 3
+	// Indicates that this request would exceed the number of allowed resources
+	// in an ad group. The exact resource type and limit being checked can be
+	// inferred from accountLimitType, and the numeric id of the
+	// ad group involved is given by enclosingId.
+	ResourceCountLimitExceededErrorEnum_ADGROUP_LIMIT ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 4
+	// Indicates that this request would exceed the number of allowed resources
+	// in an ad group ad. The exact resource type and limit being checked can
+	// be inferred from accountLimitType, and the enclosingId
+	// contains the ad group id followed by the ad id, separated by a single
+	// comma (,).
+	ResourceCountLimitExceededErrorEnum_AD_GROUP_AD_LIMIT ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 5
+	// Indicates that this request would exceed the number of allowed resources
+	// in an ad group criterion. The exact resource type and limit being checked
+	// can be inferred from accountLimitType, and the
+	// enclosingId contains the ad group id followed by the
+	// criterion id, separated by a single comma (,).
+	ResourceCountLimitExceededErrorEnum_AD_GROUP_CRITERION_LIMIT ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 6
+	// Indicates that this request would exceed the number of allowed resources
+	// in this shared set. The exact resource type and limit being checked can
+	// be inferred from accountLimitType, and the numeric id of the
+	// shared set involved is given by enclosingId.
+	ResourceCountLimitExceededErrorEnum_SHARED_SET_LIMIT ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 7
+	// Exceeds a limit related to a matching function.
+	ResourceCountLimitExceededErrorEnum_MATCHING_FUNCTION_LIMIT ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 8
+	// The response for this request would exceed the maximum number of rows
+	// that can be returned.
+	ResourceCountLimitExceededErrorEnum_RESPONSE_ROW_LIMIT_EXCEEDED ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 9
+	// This request would exceed a limit on the number of allowed resources.
+	// The details of which type of limit was exceeded will eventually be
+	// returned in ErrorDetails.
+	ResourceCountLimitExceededErrorEnum_RESOURCE_LIMIT ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError = 10
+)
+
+var ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "ACCOUNT_LIMIT",
+	3:  "CAMPAIGN_LIMIT",
+	4:  "ADGROUP_LIMIT",
+	5:  "AD_GROUP_AD_LIMIT",
+	6:  "AD_GROUP_CRITERION_LIMIT",
+	7:  "SHARED_SET_LIMIT",
+	8:  "MATCHING_FUNCTION_LIMIT",
+	9:  "RESPONSE_ROW_LIMIT_EXCEEDED",
+	10: "RESOURCE_LIMIT",
+}
+
+var ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError_value = map[string]int32{
+	"UNSPECIFIED":                 0,
+	"UNKNOWN":                     1,
+	"ACCOUNT_LIMIT":               2,
+	"CAMPAIGN_LIMIT":              3,
+	"ADGROUP_LIMIT":               4,
+	"AD_GROUP_AD_LIMIT":           5,
+	"AD_GROUP_CRITERION_LIMIT":    6,
+	"SHARED_SET_LIMIT":            7,
+	"MATCHING_FUNCTION_LIMIT":     8,
+	"RESPONSE_ROW_LIMIT_EXCEEDED": 9,
+	"RESOURCE_LIMIT":              10,
+}
+
+func (x ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError) String() string {
+	return proto.EnumName(ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError_name, int32(x))
+}
+
+func (ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_637849f04cc1d370, []int{0, 0}
+}
+
+// Container for enum describing possible resource count limit exceeded errors.
+type ResourceCountLimitExceededErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ResourceCountLimitExceededErrorEnum) Reset()         { *m = ResourceCountLimitExceededErrorEnum{} }
+func (m *ResourceCountLimitExceededErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*ResourceCountLimitExceededErrorEnum) ProtoMessage()    {}
+func (*ResourceCountLimitExceededErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_637849f04cc1d370, []int{0}
+}
+
+func (m *ResourceCountLimitExceededErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResourceCountLimitExceededErrorEnum.Unmarshal(m, b)
+}
+func (m *ResourceCountLimitExceededErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResourceCountLimitExceededErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *ResourceCountLimitExceededErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResourceCountLimitExceededErrorEnum.Merge(m, src)
+}
+func (m *ResourceCountLimitExceededErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_ResourceCountLimitExceededErrorEnum.Size(m)
+}
+func (m *ResourceCountLimitExceededErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResourceCountLimitExceededErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResourceCountLimitExceededErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError", ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError_name, ResourceCountLimitExceededErrorEnum_ResourceCountLimitExceededError_value)
+	proto.RegisterType((*ResourceCountLimitExceededErrorEnum)(nil), "google.ads.googleads.v3.errors.ResourceCountLimitExceededErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/resource_count_limit_exceeded_error.proto", fileDescriptor_637849f04cc1d370)
+}
+
+var fileDescriptor_637849f04cc1d370 = []byte{
+	// 440 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xd1, 0x6e, 0xd3, 0x30,
+	0x18, 0x85, 0x69, 0x06, 0x1b, 0x78, 0x02, 0x32, 0x0b, 0x04, 0x62, 0xd3, 0x26, 0x15, 0xae, 0x9d,
+	0x8b, 0xdc, 0x85, 0x2b, 0xcf, 0xf1, 0xd2, 0x88, 0xd5, 0x89, 0x9c, 0xa4, 0x43, 0xa8, 0x92, 0x15,
+	0x1a, 0x2b, 0x8a, 0xd4, 0xc6, 0x55, 0x9c, 0x4e, 0x3c, 0x09, 0x0f, 0xc0, 0x25, 0x0f, 0xc1, 0x03,
+	0xf0, 0x28, 0xbc, 0x04, 0x28, 0x71, 0x52, 0xae, 0xa0, 0x57, 0xf9, 0x75, 0xf4, 0x9d, 0x73, 0xac,
+	0xfc, 0x3f, 0x98, 0x95, 0x4a, 0x95, 0x6b, 0xe9, 0xe4, 0x85, 0x76, 0xcc, 0xd8, 0x4d, 0xf7, 0xae,
+	0x23, 0x9b, 0x46, 0x35, 0xda, 0x69, 0xa4, 0x56, 0xbb, 0x66, 0x25, 0xc5, 0x4a, 0xed, 0xea, 0x56,
+	0xac, 0xab, 0x4d, 0xd5, 0x0a, 0xf9, 0x65, 0x25, 0x65, 0x21, 0x0b, 0xd1, 0x43, 0x68, 0xdb, 0xa8,
+	0x56, 0xc1, 0x4b, 0x63, 0x47, 0x79, 0xa1, 0xd1, 0x3e, 0x09, 0xdd, 0xbb, 0xc8, 0x24, 0xbd, 0xb9,
+	0x18, 0x9b, 0xb6, 0x95, 0x93, 0xd7, 0xb5, 0x6a, 0xf3, 0xb6, 0x52, 0xb5, 0x36, 0xee, 0xe9, 0x0f,
+	0x0b, 0xbc, 0xe5, 0x43, 0x17, 0xe9, 0xaa, 0x6e, 0xbb, 0x26, 0x3a, 0x14, 0xd1, 0x2e, 0x82, 0xd6,
+	0xbb, 0xcd, 0xf4, 0xab, 0x05, 0xae, 0x0e, 0x70, 0xf0, 0x39, 0x38, 0xcd, 0x58, 0x12, 0x53, 0x12,
+	0xde, 0x84, 0xd4, 0xb7, 0x1f, 0xc0, 0x53, 0x70, 0x92, 0xb1, 0x0f, 0x2c, 0xba, 0x63, 0xf6, 0x04,
+	0x9e, 0x81, 0xa7, 0x98, 0x90, 0x28, 0x63, 0xa9, 0xb8, 0x0d, 0xe7, 0x61, 0x6a, 0x5b, 0x10, 0x82,
+	0x67, 0x04, 0xcf, 0x63, 0x1c, 0x06, 0x6c, 0xd0, 0x8e, 0x7a, 0xcc, 0x0f, 0x78, 0x94, 0xc5, 0x83,
+	0xf4, 0x10, 0xbe, 0x04, 0x67, 0xd8, 0x17, 0x46, 0xc3, 0xfe, 0x20, 0x3f, 0x82, 0x17, 0xe0, 0xf5,
+	0x5e, 0x26, 0x3c, 0x4c, 0x29, 0x0f, 0xa3, 0x31, 0xe7, 0x18, 0xbe, 0x00, 0x76, 0x32, 0xc3, 0x9c,
+	0xfa, 0x22, 0xa1, 0x63, 0xe3, 0x09, 0x3c, 0x07, 0xaf, 0xe6, 0x38, 0x25, 0xb3, 0x90, 0x05, 0xe2,
+	0x26, 0x63, 0x24, 0xfd, 0x6b, 0x79, 0x0c, 0xaf, 0xc0, 0x39, 0xa7, 0x49, 0x1c, 0xb1, 0x84, 0x0a,
+	0x1e, 0xdd, 0x19, 0x5d, 0xd0, 0x8f, 0x84, 0x52, 0x9f, 0xfa, 0xf6, 0x93, 0xee, 0xbd, 0x9c, 0x26,
+	0x51, 0xc6, 0x09, 0x1d, 0x4c, 0xe0, 0xfa, 0xf7, 0x04, 0x4c, 0x57, 0x6a, 0x83, 0xfe, 0xbf, 0x85,
+	0xeb, 0x77, 0x07, 0x7e, 0x5e, 0xdc, 0x6d, 0x23, 0x9e, 0x7c, 0xf2, 0x87, 0x9c, 0x52, 0xad, 0xf3,
+	0xba, 0x44, 0xaa, 0x29, 0x9d, 0x52, 0xd6, 0xfd, 0xae, 0xc6, 0x3b, 0xd9, 0x56, 0xfa, 0x5f, 0x67,
+	0xf3, 0xde, 0x7c, 0xbe, 0x59, 0x47, 0x01, 0xc6, 0xdf, 0xad, 0xcb, 0xc0, 0x84, 0xe1, 0x42, 0x23,
+	0x33, 0x76, 0xd3, 0xc2, 0x45, 0x7d, 0xa5, 0xfe, 0x39, 0x02, 0x4b, 0x5c, 0xe8, 0xe5, 0x1e, 0x58,
+	0x2e, 0xdc, 0xa5, 0x01, 0x7e, 0x59, 0x53, 0xa3, 0x7a, 0x1e, 0x2e, 0xb4, 0xe7, 0xed, 0x11, 0xcf,
+	0x5b, 0xb8, 0x9e, 0x67, 0xa0, 0xcf, 0xc7, 0xfd, 0xeb, 0xdc, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0xa5, 0x01, 0x0f, 0x4c, 0xd3, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/setting_error.pb.go b/googleapis/ads/googleads/v3/errors/setting_error.pb.go
new file mode 100644
index 0000000..43ac592
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/setting_error.pb.go
@@ -0,0 +1,179 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/setting_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible setting errors.
+type SettingErrorEnum_SettingError int32
+
+const (
+	// Enum unspecified.
+	SettingErrorEnum_UNSPECIFIED SettingErrorEnum_SettingError = 0
+	// The received error code is not known in this version.
+	SettingErrorEnum_UNKNOWN SettingErrorEnum_SettingError = 1
+	// The campaign setting is not available for this Google Ads account.
+	SettingErrorEnum_SETTING_TYPE_IS_NOT_AVAILABLE SettingErrorEnum_SettingError = 3
+	// The setting is not compatible with the campaign.
+	SettingErrorEnum_SETTING_TYPE_IS_NOT_COMPATIBLE_WITH_CAMPAIGN SettingErrorEnum_SettingError = 4
+	// The supplied TargetingSetting contains an invalid CriterionTypeGroup. See
+	// CriterionTypeGroup documentation for CriterionTypeGroups allowed
+	// in Campaign or AdGroup TargetingSettings.
+	SettingErrorEnum_TARGETING_SETTING_CONTAINS_INVALID_CRITERION_TYPE_GROUP SettingErrorEnum_SettingError = 5
+	// TargetingSetting must not explicitly
+	// set any of the Demographic CriterionTypeGroups (AGE_RANGE, GENDER,
+	// PARENT, INCOME_RANGE) to false (it's okay to not set them at all, in
+	// which case the system will set them to true automatically).
+	SettingErrorEnum_TARGETING_SETTING_DEMOGRAPHIC_CRITERION_TYPE_GROUPS_MUST_BE_SET_TO_TARGET_ALL SettingErrorEnum_SettingError = 6
+	// TargetingSetting cannot change any of
+	// the Demographic CriterionTypeGroups (AGE_RANGE, GENDER, PARENT,
+	// INCOME_RANGE) from true to false.
+	SettingErrorEnum_TARGETING_SETTING_CANNOT_CHANGE_TARGET_ALL_TO_FALSE_FOR_DEMOGRAPHIC_CRITERION_TYPE_GROUP SettingErrorEnum_SettingError = 7
+	// At least one feed id should be present.
+	SettingErrorEnum_DYNAMIC_SEARCH_ADS_SETTING_AT_LEAST_ONE_FEED_ID_MUST_BE_PRESENT SettingErrorEnum_SettingError = 8
+	// The supplied DynamicSearchAdsSetting contains an invalid domain name.
+	SettingErrorEnum_DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_INVALID_DOMAIN_NAME SettingErrorEnum_SettingError = 9
+	// The supplied DynamicSearchAdsSetting contains a subdomain name.
+	SettingErrorEnum_DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_SUBDOMAIN_NAME SettingErrorEnum_SettingError = 10
+	// The supplied DynamicSearchAdsSetting contains an invalid language code.
+	SettingErrorEnum_DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_INVALID_LANGUAGE_CODE SettingErrorEnum_SettingError = 11
+	// TargetingSettings in search campaigns should not have
+	// CriterionTypeGroup.PLACEMENT set to targetAll.
+	SettingErrorEnum_TARGET_ALL_IS_NOT_ALLOWED_FOR_PLACEMENT_IN_SEARCH_CAMPAIGN SettingErrorEnum_SettingError = 12
+)
+
+var SettingErrorEnum_SettingError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	3:  "SETTING_TYPE_IS_NOT_AVAILABLE",
+	4:  "SETTING_TYPE_IS_NOT_COMPATIBLE_WITH_CAMPAIGN",
+	5:  "TARGETING_SETTING_CONTAINS_INVALID_CRITERION_TYPE_GROUP",
+	6:  "TARGETING_SETTING_DEMOGRAPHIC_CRITERION_TYPE_GROUPS_MUST_BE_SET_TO_TARGET_ALL",
+	7:  "TARGETING_SETTING_CANNOT_CHANGE_TARGET_ALL_TO_FALSE_FOR_DEMOGRAPHIC_CRITERION_TYPE_GROUP",
+	8:  "DYNAMIC_SEARCH_ADS_SETTING_AT_LEAST_ONE_FEED_ID_MUST_BE_PRESENT",
+	9:  "DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_INVALID_DOMAIN_NAME",
+	10: "DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_SUBDOMAIN_NAME",
+	11: "DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_INVALID_LANGUAGE_CODE",
+	12: "TARGET_ALL_IS_NOT_ALLOWED_FOR_PLACEMENT_IN_SEARCH_CAMPAIGN",
+}
+
+var SettingErrorEnum_SettingError_value = map[string]int32{
+	"UNSPECIFIED":                   0,
+	"UNKNOWN":                       1,
+	"SETTING_TYPE_IS_NOT_AVAILABLE": 3,
+	"SETTING_TYPE_IS_NOT_COMPATIBLE_WITH_CAMPAIGN":                                             4,
+	"TARGETING_SETTING_CONTAINS_INVALID_CRITERION_TYPE_GROUP":                                  5,
+	"TARGETING_SETTING_DEMOGRAPHIC_CRITERION_TYPE_GROUPS_MUST_BE_SET_TO_TARGET_ALL":            6,
+	"TARGETING_SETTING_CANNOT_CHANGE_TARGET_ALL_TO_FALSE_FOR_DEMOGRAPHIC_CRITERION_TYPE_GROUP": 7,
+	"DYNAMIC_SEARCH_ADS_SETTING_AT_LEAST_ONE_FEED_ID_MUST_BE_PRESENT":                          8,
+	"DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_INVALID_DOMAIN_NAME":                                  9,
+	"DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_SUBDOMAIN_NAME":                                       10,
+	"DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_INVALID_LANGUAGE_CODE":                                11,
+	"TARGET_ALL_IS_NOT_ALLOWED_FOR_PLACEMENT_IN_SEARCH_CAMPAIGN":                               12,
+}
+
+func (x SettingErrorEnum_SettingError) String() string {
+	return proto.EnumName(SettingErrorEnum_SettingError_name, int32(x))
+}
+
+func (SettingErrorEnum_SettingError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_92dd27a02f2d7da1, []int{0, 0}
+}
+
+// Container for enum describing possible setting errors.
+type SettingErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SettingErrorEnum) Reset()         { *m = SettingErrorEnum{} }
+func (m *SettingErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*SettingErrorEnum) ProtoMessage()    {}
+func (*SettingErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_92dd27a02f2d7da1, []int{0}
+}
+
+func (m *SettingErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SettingErrorEnum.Unmarshal(m, b)
+}
+func (m *SettingErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SettingErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *SettingErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SettingErrorEnum.Merge(m, src)
+}
+func (m *SettingErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_SettingErrorEnum.Size(m)
+}
+func (m *SettingErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SettingErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SettingErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.SettingErrorEnum_SettingError", SettingErrorEnum_SettingError_name, SettingErrorEnum_SettingError_value)
+	proto.RegisterType((*SettingErrorEnum)(nil), "google.ads.googleads.v3.errors.SettingErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/setting_error.proto", fileDescriptor_92dd27a02f2d7da1)
+}
+
+var fileDescriptor_92dd27a02f2d7da1 = []byte{
+	// 551 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0xe1, 0x6a, 0x13, 0x41,
+	0x10, 0xc7, 0x6d, 0x6b, 0x5b, 0xdd, 0x16, 0x3c, 0xf7, 0xa3, 0x68, 0xc1, 0x7c, 0x96, 0x8b, 0x34,
+	0xa0, 0x78, 0x45, 0x65, 0x72, 0x37, 0xb9, 0x2c, 0xee, 0xed, 0x9e, 0xb7, 0x9b, 0xd4, 0x4a, 0x60,
+	0x88, 0x26, 0x1c, 0x81, 0xf6, 0xae, 0xe4, 0x62, 0x1f, 0xc8, 0x4f, 0xe2, 0x3b, 0xf8, 0x02, 0x3e,
+	0x8a, 0xf8, 0x10, 0x72, 0xb7, 0x26, 0x04, 0x1a, 0xab, 0x7e, 0xca, 0x64, 0xf9, 0xff, 0xfe, 0xff,
+	0xb9, 0x61, 0x86, 0x1d, 0xe7, 0x65, 0x99, 0x9f, 0x4f, 0xdb, 0xe3, 0x49, 0xd5, 0x76, 0x65, 0x5d,
+	0x5d, 0x75, 0xda, 0xd3, 0xf9, 0xbc, 0x9c, 0x57, 0xed, 0x6a, 0xba, 0x58, 0xcc, 0x8a, 0x9c, 0x9a,
+	0xbf, 0xfe, 0xe5, 0xbc, 0x5c, 0x94, 0xfc, 0xc8, 0x09, 0xfd, 0xf1, 0xa4, 0xf2, 0x57, 0x8c, 0x7f,
+	0xd5, 0xf1, 0x1d, 0xf3, 0xe0, 0xe1, 0xd2, 0xf3, 0x72, 0xd6, 0x1e, 0x17, 0x45, 0xb9, 0x18, 0x2f,
+	0x66, 0x65, 0x51, 0x39, 0xba, 0xf5, 0x6d, 0x97, 0x79, 0xc6, 0xb9, 0x62, 0xad, 0xc7, 0xe2, 0xd3,
+	0x45, 0xeb, 0xcb, 0x2e, 0x3b, 0x5c, 0x7f, 0xe4, 0xf7, 0xd8, 0xc1, 0x40, 0x99, 0x14, 0x43, 0xd1,
+	0x13, 0x18, 0x79, 0xb7, 0xf8, 0x01, 0xdb, 0x1f, 0xa8, 0x37, 0x4a, 0x9f, 0x2a, 0x6f, 0x8b, 0x3f,
+	0x66, 0x8f, 0x0c, 0x5a, 0x2b, 0x54, 0x4c, 0xf6, 0x2c, 0x45, 0x12, 0x86, 0x94, 0xb6, 0x04, 0x43,
+	0x10, 0x12, 0xba, 0x12, 0xbd, 0x1d, 0xfe, 0x94, 0x3d, 0xd9, 0x24, 0x09, 0x75, 0x92, 0x82, 0x15,
+	0x5d, 0x89, 0x74, 0x2a, 0x6c, 0x9f, 0x42, 0x48, 0x52, 0x10, 0xb1, 0xf2, 0x6e, 0xf3, 0x13, 0xf6,
+	0xdc, 0x42, 0x16, 0x63, 0xc3, 0x2c, 0xd9, 0x50, 0x2b, 0x0b, 0x42, 0x19, 0x12, 0x6a, 0x08, 0x52,
+	0x44, 0x14, 0x66, 0xc2, 0x62, 0x26, 0xb4, 0x72, 0xb6, 0x71, 0xa6, 0x07, 0xa9, 0xb7, 0xcb, 0xdf,
+	0xb2, 0xe4, 0x3a, 0x1c, 0x61, 0xa2, 0xe3, 0x0c, 0xd2, 0xbe, 0x08, 0x37, 0x72, 0x86, 0x92, 0x81,
+	0xb1, 0xd4, 0xc5, 0x9a, 0x20, 0xab, 0xc9, 0x59, 0x10, 0x48, 0xe9, 0xed, 0xf1, 0x11, 0x7b, 0xb7,
+	0xa1, 0x1f, 0x50, 0xcd, 0x67, 0xf4, 0x41, 0xc5, 0xb8, 0xa6, 0xaf, 0xe9, 0x1e, 0x48, 0x83, 0xd4,
+	0xd3, 0xd9, 0x5f, 0x83, 0xbd, 0x7d, 0x1e, 0xb2, 0xd7, 0xd1, 0x99, 0x82, 0x44, 0x84, 0x64, 0x10,
+	0xb2, 0xb0, 0x4f, 0x10, 0x99, 0x55, 0x0c, 0x58, 0x92, 0x08, 0xc6, 0x92, 0x56, 0x48, 0x3d, 0xc4,
+	0x88, 0x44, 0xb4, 0x6a, 0x36, 0xcd, 0xd0, 0xa0, 0xb2, 0xde, 0x9d, 0x7a, 0x64, 0x37, 0x98, 0x5c,
+	0x9b, 0x5d, 0xa4, 0x13, 0x10, 0x8a, 0x14, 0x24, 0xe8, 0xdd, 0xe5, 0xcf, 0xd8, 0xf1, 0xbf, 0xc0,
+	0x66, 0xd0, 0x5d, 0xe7, 0x18, 0x7f, 0xc9, 0x5e, 0xfc, 0x4f, 0xa8, 0x04, 0x15, 0x0f, 0x20, 0x46,
+	0x0a, 0x75, 0x84, 0xde, 0x01, 0x7f, 0xc5, 0x82, 0xb5, 0xb1, 0x2d, 0x37, 0x47, 0x4a, 0x7d, 0x8a,
+	0x51, 0x33, 0xbc, 0x54, 0x42, 0x88, 0x09, 0x2a, 0x4b, 0x42, 0x2d, 0x13, 0x56, 0x6b, 0x72, 0xd8,
+	0xfd, 0xb9, 0xc5, 0x5a, 0x1f, 0xcb, 0x0b, 0xff, 0xe6, 0x23, 0xe8, 0xde, 0x5f, 0x5f, 0xe7, 0xb4,
+	0xde, 0xfc, 0x74, 0xeb, 0x7d, 0xf4, 0x1b, 0xca, 0xcb, 0xf3, 0x71, 0x91, 0xfb, 0xe5, 0x3c, 0x6f,
+	0xe7, 0xd3, 0xa2, 0xb9, 0x8b, 0xe5, 0xf5, 0x5d, 0xce, 0xaa, 0x3f, 0x1d, 0xe3, 0x89, 0xfb, 0xf9,
+	0xbc, 0xbd, 0x13, 0x03, 0x7c, 0xdd, 0x3e, 0x8a, 0x9d, 0x19, 0x4c, 0x2a, 0xdf, 0x95, 0x75, 0x35,
+	0xec, 0xf8, 0x4d, 0x64, 0xf5, 0x7d, 0x29, 0x18, 0xc1, 0xa4, 0x1a, 0xad, 0x04, 0xa3, 0x61, 0x67,
+	0xe4, 0x04, 0x3f, 0xb6, 0x5b, 0xee, 0x35, 0x08, 0x60, 0x52, 0x05, 0xc1, 0x4a, 0x12, 0x04, 0xc3,
+	0x4e, 0x10, 0x38, 0xd1, 0x87, 0xbd, 0xa6, 0xbb, 0xce, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x51,
+	0x92, 0x3e, 0xf8, 0x29, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/shared_criterion_error.pb.go b/googleapis/ads/googleads/v3/errors/shared_criterion_error.pb.go
new file mode 100644
index 0000000..a332d1d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/shared_criterion_error.pb.go
@@ -0,0 +1,121 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/shared_criterion_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible shared criterion errors.
+type SharedCriterionErrorEnum_SharedCriterionError int32
+
+const (
+	// Enum unspecified.
+	SharedCriterionErrorEnum_UNSPECIFIED SharedCriterionErrorEnum_SharedCriterionError = 0
+	// The received error code is not known in this version.
+	SharedCriterionErrorEnum_UNKNOWN SharedCriterionErrorEnum_SharedCriterionError = 1
+	// The criterion is not appropriate for the shared set type.
+	SharedCriterionErrorEnum_CRITERION_TYPE_NOT_ALLOWED_FOR_SHARED_SET_TYPE SharedCriterionErrorEnum_SharedCriterionError = 2
+)
+
+var SharedCriterionErrorEnum_SharedCriterionError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CRITERION_TYPE_NOT_ALLOWED_FOR_SHARED_SET_TYPE",
+}
+
+var SharedCriterionErrorEnum_SharedCriterionError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CRITERION_TYPE_NOT_ALLOWED_FOR_SHARED_SET_TYPE": 2,
+}
+
+func (x SharedCriterionErrorEnum_SharedCriterionError) String() string {
+	return proto.EnumName(SharedCriterionErrorEnum_SharedCriterionError_name, int32(x))
+}
+
+func (SharedCriterionErrorEnum_SharedCriterionError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c4025b0e5768e09e, []int{0, 0}
+}
+
+// Container for enum describing possible shared criterion errors.
+type SharedCriterionErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SharedCriterionErrorEnum) Reset()         { *m = SharedCriterionErrorEnum{} }
+func (m *SharedCriterionErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*SharedCriterionErrorEnum) ProtoMessage()    {}
+func (*SharedCriterionErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4025b0e5768e09e, []int{0}
+}
+
+func (m *SharedCriterionErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SharedCriterionErrorEnum.Unmarshal(m, b)
+}
+func (m *SharedCriterionErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SharedCriterionErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *SharedCriterionErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SharedCriterionErrorEnum.Merge(m, src)
+}
+func (m *SharedCriterionErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_SharedCriterionErrorEnum.Size(m)
+}
+func (m *SharedCriterionErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SharedCriterionErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SharedCriterionErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.SharedCriterionErrorEnum_SharedCriterionError", SharedCriterionErrorEnum_SharedCriterionError_name, SharedCriterionErrorEnum_SharedCriterionError_value)
+	proto.RegisterType((*SharedCriterionErrorEnum)(nil), "google.ads.googleads.v3.errors.SharedCriterionErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/shared_criterion_error.proto", fileDescriptor_c4025b0e5768e09e)
+}
+
+var fileDescriptor_c4025b0e5768e09e = []byte{
+	// 331 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4e, 0xf3, 0x30,
+	0x10, 0x85, 0xff, 0xe4, 0x97, 0x40, 0x72, 0x17, 0x54, 0x11, 0x0b, 0x40, 0xa8, 0x8b, 0x1c, 0xc0,
+	0x91, 0xc8, 0xce, 0x5d, 0xb9, 0x8d, 0x5b, 0x22, 0xaa, 0x24, 0x4a, 0xd2, 0x56, 0xa0, 0x48, 0x56,
+	0x68, 0xa2, 0x34, 0x52, 0x6b, 0x57, 0x76, 0xe8, 0x09, 0x38, 0x09, 0x4b, 0x8e, 0xc2, 0x51, 0x58,
+	0x73, 0x00, 0x14, 0x9b, 0x64, 0x55, 0x58, 0xf9, 0x69, 0xe6, 0x7d, 0xcf, 0x33, 0x03, 0xc6, 0x15,
+	0xe7, 0xd5, 0xae, 0x74, 0xf2, 0x42, 0x3a, 0x5a, 0xb6, 0xea, 0xe8, 0x3a, 0xa5, 0x10, 0x5c, 0x48,
+	0x47, 0x6e, 0x73, 0x51, 0x16, 0x74, 0x23, 0xea, 0xa6, 0x14, 0x35, 0x67, 0x54, 0xd5, 0xe1, 0x41,
+	0xf0, 0x86, 0x5b, 0x23, 0x4d, 0xc0, 0xbc, 0x90, 0xb0, 0x87, 0xe1, 0xd1, 0x85, 0x1a, 0xbe, 0xb9,
+	0xed, 0xc2, 0x0f, 0xb5, 0x93, 0x33, 0xc6, 0x9b, 0xbc, 0xa9, 0x39, 0x93, 0x9a, 0xb6, 0x5f, 0x0d,
+	0x70, 0x95, 0xa8, 0xf8, 0x69, 0x97, 0x4e, 0x5a, 0x8e, 0xb0, 0x97, 0xbd, 0xbd, 0x05, 0x97, 0xa7,
+	0x7a, 0xd6, 0x05, 0x18, 0x2c, 0x83, 0x24, 0x22, 0x53, 0x7f, 0xe6, 0x13, 0x6f, 0xf8, 0xcf, 0x1a,
+	0x80, 0xf3, 0x65, 0xf0, 0x10, 0x84, 0xeb, 0x60, 0x68, 0x58, 0x77, 0x00, 0x4e, 0x63, 0x3f, 0x25,
+	0xb1, 0x1f, 0x06, 0x34, 0x7d, 0x8c, 0x08, 0x0d, 0xc2, 0x94, 0xe2, 0xc5, 0x22, 0x5c, 0x13, 0x8f,
+	0xce, 0xc2, 0x98, 0x26, 0xf7, 0x38, 0x26, 0x1e, 0x4d, 0x48, 0xaa, 0xfa, 0x43, 0x73, 0xf2, 0x65,
+	0x00, 0x7b, 0xc3, 0xf7, 0xf0, 0xef, 0x5d, 0x26, 0xd7, 0xa7, 0xc6, 0x89, 0xda, 0x45, 0x22, 0xe3,
+	0xc9, 0xfb, 0x81, 0x2b, 0xbe, 0xcb, 0x59, 0x05, 0xb9, 0xa8, 0x9c, 0xaa, 0x64, 0x6a, 0xcd, 0xee,
+	0xaa, 0x87, 0x5a, 0xfe, 0x76, 0xe4, 0xb1, 0x7e, 0xde, 0xcc, 0xff, 0x73, 0x8c, 0xdf, 0xcd, 0xd1,
+	0x5c, 0x87, 0xe1, 0x42, 0x42, 0x2d, 0x5b, 0xb5, 0x72, 0xa1, 0xfa, 0x52, 0x7e, 0x74, 0x86, 0x0c,
+	0x17, 0x32, 0xeb, 0x0d, 0xd9, 0xca, 0xcd, 0xb4, 0xe1, 0xd3, 0xb4, 0x75, 0x15, 0x21, 0x5c, 0x48,
+	0x84, 0x7a, 0x0b, 0x42, 0x2b, 0x17, 0x21, 0x6d, 0x7a, 0x3e, 0x53, 0xd3, 0xb9, 0xdf, 0x01, 0x00,
+	0x00, 0xff, 0xff, 0xc5, 0x8d, 0x33, 0x50, 0x01, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/shared_set_error.pb.go b/googleapis/ads/googleads/v3/errors/shared_set_error.pb.go
new file mode 100644
index 0000000..711741b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/shared_set_error.pb.go
@@ -0,0 +1,136 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/shared_set_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible shared set errors.
+type SharedSetErrorEnum_SharedSetError int32
+
+const (
+	// Enum unspecified.
+	SharedSetErrorEnum_UNSPECIFIED SharedSetErrorEnum_SharedSetError = 0
+	// The received error code is not known in this version.
+	SharedSetErrorEnum_UNKNOWN SharedSetErrorEnum_SharedSetError = 1
+	// The customer cannot create this type of shared set.
+	SharedSetErrorEnum_CUSTOMER_CANNOT_CREATE_SHARED_SET_OF_THIS_TYPE SharedSetErrorEnum_SharedSetError = 2
+	// A shared set with this name already exists.
+	SharedSetErrorEnum_DUPLICATE_NAME SharedSetErrorEnum_SharedSetError = 3
+	// Removed shared sets cannot be mutated.
+	SharedSetErrorEnum_SHARED_SET_REMOVED SharedSetErrorEnum_SharedSetError = 4
+	// The shared set cannot be removed because it is in use.
+	SharedSetErrorEnum_SHARED_SET_IN_USE SharedSetErrorEnum_SharedSetError = 5
+)
+
+var SharedSetErrorEnum_SharedSetError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "CUSTOMER_CANNOT_CREATE_SHARED_SET_OF_THIS_TYPE",
+	3: "DUPLICATE_NAME",
+	4: "SHARED_SET_REMOVED",
+	5: "SHARED_SET_IN_USE",
+}
+
+var SharedSetErrorEnum_SharedSetError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"CUSTOMER_CANNOT_CREATE_SHARED_SET_OF_THIS_TYPE": 2,
+	"DUPLICATE_NAME":     3,
+	"SHARED_SET_REMOVED": 4,
+	"SHARED_SET_IN_USE":  5,
+}
+
+func (x SharedSetErrorEnum_SharedSetError) String() string {
+	return proto.EnumName(SharedSetErrorEnum_SharedSetError_name, int32(x))
+}
+
+func (SharedSetErrorEnum_SharedSetError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fd9cfde91a5a7f46, []int{0, 0}
+}
+
+// Container for enum describing possible shared set errors.
+type SharedSetErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SharedSetErrorEnum) Reset()         { *m = SharedSetErrorEnum{} }
+func (m *SharedSetErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*SharedSetErrorEnum) ProtoMessage()    {}
+func (*SharedSetErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fd9cfde91a5a7f46, []int{0}
+}
+
+func (m *SharedSetErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SharedSetErrorEnum.Unmarshal(m, b)
+}
+func (m *SharedSetErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SharedSetErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *SharedSetErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SharedSetErrorEnum.Merge(m, src)
+}
+func (m *SharedSetErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_SharedSetErrorEnum.Size(m)
+}
+func (m *SharedSetErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SharedSetErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SharedSetErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.SharedSetErrorEnum_SharedSetError", SharedSetErrorEnum_SharedSetError_name, SharedSetErrorEnum_SharedSetError_value)
+	proto.RegisterType((*SharedSetErrorEnum)(nil), "google.ads.googleads.v3.errors.SharedSetErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/shared_set_error.proto", fileDescriptor_fd9cfde91a5a7f46)
+}
+
+var fileDescriptor_fd9cfde91a5a7f46 = []byte{
+	// 372 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xdf, 0x8a, 0x9b, 0x40,
+	0x18, 0xc5, 0xab, 0xe9, 0x1f, 0x98, 0x40, 0x6a, 0xa7, 0xb4, 0x17, 0xa5, 0xe4, 0xc2, 0x07, 0x18,
+	0xa1, 0xd2, 0x9b, 0xe9, 0xd5, 0x44, 0x27, 0x89, 0xb4, 0x19, 0xc5, 0x51, 0x4b, 0x8b, 0x30, 0xd8,
+	0x2a, 0x6e, 0x20, 0x71, 0x82, 0xe3, 0xe6, 0x81, 0x16, 0xf6, 0x66, 0x9f, 0x61, 0x9f, 0x60, 0x1f,
+	0x65, 0x2f, 0xf6, 0x19, 0x16, 0x9d, 0x4d, 0x48, 0x2e, 0x76, 0xaf, 0x3c, 0x1c, 0x7e, 0xe7, 0x38,
+	0xdf, 0xf7, 0x81, 0xef, 0xb5, 0x94, 0xf5, 0xa6, 0x72, 0x8a, 0x52, 0x39, 0x5a, 0xf6, 0x6a, 0xef,
+	0x3a, 0x55, 0xdb, 0xca, 0x56, 0x39, 0xea, 0xa2, 0x68, 0xab, 0x52, 0xa8, 0xaa, 0x13, 0x83, 0x83,
+	0x76, 0xad, 0xec, 0x24, 0x9c, 0x6a, 0x16, 0x15, 0xa5, 0x42, 0xc7, 0x18, 0xda, 0xbb, 0x48, 0xc7,
+	0xbe, 0x7c, 0x3d, 0xd4, 0xee, 0xd6, 0x4e, 0xd1, 0x34, 0xb2, 0x2b, 0xba, 0xb5, 0x6c, 0x94, 0x4e,
+	0xdb, 0xb7, 0x06, 0x80, 0x7c, 0x28, 0xe6, 0x55, 0x47, 0xfb, 0x04, 0x6d, 0x2e, 0xb7, 0xf6, 0xb5,
+	0x01, 0x26, 0xe7, 0x36, 0x7c, 0x0f, 0xc6, 0x29, 0xe3, 0x11, 0xf5, 0x82, 0x79, 0x40, 0x7d, 0xeb,
+	0x15, 0x1c, 0x83, 0x77, 0x29, 0xfb, 0xc9, 0xc2, 0xdf, 0xcc, 0x32, 0xe0, 0x37, 0x80, 0xbc, 0x94,
+	0x27, 0xe1, 0x8a, 0xc6, 0xc2, 0x23, 0x8c, 0x85, 0x89, 0xf0, 0x62, 0x4a, 0x12, 0x2a, 0xf8, 0x92,
+	0xc4, 0xd4, 0x17, 0x9c, 0x26, 0x22, 0x9c, 0x8b, 0x64, 0x19, 0x70, 0x91, 0xfc, 0x89, 0xa8, 0x65,
+	0x42, 0x08, 0x26, 0x7e, 0x1a, 0xfd, 0x0a, 0xbc, 0x1e, 0x63, 0x64, 0x45, 0xad, 0x11, 0xfc, 0x0c,
+	0xe0, 0x49, 0x20, 0xa6, 0xab, 0x30, 0xa3, 0xbe, 0xf5, 0x1a, 0x7e, 0x02, 0x1f, 0x4e, 0xfc, 0x80,
+	0x89, 0x94, 0x53, 0xeb, 0xcd, 0xec, 0xc1, 0x00, 0xf6, 0x7f, 0xb9, 0x45, 0x2f, 0xef, 0x60, 0xf6,
+	0xf1, 0x7c, 0x96, 0xa8, 0x1f, 0x3d, 0x32, 0xfe, 0xfa, 0x4f, 0xb1, 0x5a, 0x6e, 0x8a, 0xa6, 0x46,
+	0xb2, 0xad, 0x9d, 0xba, 0x6a, 0x86, 0xc5, 0x1c, 0x2e, 0xb0, 0x5b, 0xab, 0xe7, 0x0e, 0xf2, 0x43,
+	0x7f, 0xae, 0xcc, 0xd1, 0x82, 0x90, 0x1b, 0x73, 0xba, 0xd0, 0x65, 0xa4, 0x54, 0x48, 0xcb, 0x5e,
+	0x65, 0x2e, 0x1a, 0x7e, 0xa9, 0xee, 0x0e, 0x40, 0x4e, 0x4a, 0x95, 0x1f, 0x81, 0x3c, 0x73, 0x73,
+	0x0d, 0xdc, 0x9b, 0xb6, 0x76, 0x31, 0x26, 0xa5, 0xc2, 0xf8, 0x88, 0x60, 0x9c, 0xb9, 0x18, 0x6b,
+	0xe8, 0xdf, 0xdb, 0xe1, 0x75, 0xee, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xea, 0x14, 0x99,
+	0x2d, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/size_limit_error.pb.go b/googleapis/ads/googleads/v3/errors/size_limit_error.pb.go
new file mode 100644
index 0000000..0149f1b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/size_limit_error.pb.go
@@ -0,0 +1,125 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/size_limit_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible size limit errors.
+type SizeLimitErrorEnum_SizeLimitError int32
+
+const (
+	// Enum unspecified.
+	SizeLimitErrorEnum_UNSPECIFIED SizeLimitErrorEnum_SizeLimitError = 0
+	// The received error code is not known in this version.
+	SizeLimitErrorEnum_UNKNOWN SizeLimitErrorEnum_SizeLimitError = 1
+	// The number of entries in the request exceeds the system limit.
+	SizeLimitErrorEnum_REQUEST_SIZE_LIMIT_EXCEEDED SizeLimitErrorEnum_SizeLimitError = 2
+	// The number of entries in the response exceeds the system limit.
+	SizeLimitErrorEnum_RESPONSE_SIZE_LIMIT_EXCEEDED SizeLimitErrorEnum_SizeLimitError = 3
+)
+
+var SizeLimitErrorEnum_SizeLimitError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "REQUEST_SIZE_LIMIT_EXCEEDED",
+	3: "RESPONSE_SIZE_LIMIT_EXCEEDED",
+}
+
+var SizeLimitErrorEnum_SizeLimitError_value = map[string]int32{
+	"UNSPECIFIED":                  0,
+	"UNKNOWN":                      1,
+	"REQUEST_SIZE_LIMIT_EXCEEDED":  2,
+	"RESPONSE_SIZE_LIMIT_EXCEEDED": 3,
+}
+
+func (x SizeLimitErrorEnum_SizeLimitError) String() string {
+	return proto.EnumName(SizeLimitErrorEnum_SizeLimitError_name, int32(x))
+}
+
+func (SizeLimitErrorEnum_SizeLimitError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2576de26de4e0e5e, []int{0, 0}
+}
+
+// Container for enum describing possible size limit errors.
+type SizeLimitErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SizeLimitErrorEnum) Reset()         { *m = SizeLimitErrorEnum{} }
+func (m *SizeLimitErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*SizeLimitErrorEnum) ProtoMessage()    {}
+func (*SizeLimitErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2576de26de4e0e5e, []int{0}
+}
+
+func (m *SizeLimitErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SizeLimitErrorEnum.Unmarshal(m, b)
+}
+func (m *SizeLimitErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SizeLimitErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *SizeLimitErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SizeLimitErrorEnum.Merge(m, src)
+}
+func (m *SizeLimitErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_SizeLimitErrorEnum.Size(m)
+}
+func (m *SizeLimitErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_SizeLimitErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SizeLimitErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.SizeLimitErrorEnum_SizeLimitError", SizeLimitErrorEnum_SizeLimitError_name, SizeLimitErrorEnum_SizeLimitError_value)
+	proto.RegisterType((*SizeLimitErrorEnum)(nil), "google.ads.googleads.v3.errors.SizeLimitErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/size_limit_error.proto", fileDescriptor_2576de26de4e0e5e)
+}
+
+var fileDescriptor_2576de26de4e0e5e = []byte{
+	// 328 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xf3, 0x40,
+	0x14, 0x85, 0xff, 0xa4, 0xf0, 0x0b, 0x53, 0xd0, 0x12, 0x77, 0x5a, 0xaa, 0xe4, 0x01, 0x26, 0x8b,
+	0xe0, 0x66, 0x5c, 0xa5, 0xcd, 0xb5, 0x04, 0x6b, 0x1a, 0x3b, 0x6d, 0x95, 0x12, 0x08, 0xd1, 0x84,
+	0x61, 0xa0, 0x9d, 0xa9, 0x99, 0xd8, 0x45, 0x5f, 0xc0, 0xf7, 0x70, 0xe9, 0xa3, 0xf8, 0x28, 0x2e,
+	0x7c, 0x06, 0x49, 0xc6, 0x06, 0x0a, 0xea, 0x6a, 0x0e, 0x97, 0xef, 0x9c, 0xb9, 0xe7, 0xa2, 0x0b,
+	0x26, 0x25, 0x5b, 0xe6, 0x4e, 0x9a, 0x29, 0x47, 0xcb, 0x4a, 0x6d, 0x5c, 0x27, 0x2f, 0x0a, 0x59,
+	0x28, 0x47, 0xf1, 0x6d, 0x9e, 0x2c, 0xf9, 0x8a, 0x97, 0x49, 0x3d, 0xc1, 0xeb, 0x42, 0x96, 0xd2,
+	0xea, 0x69, 0x16, 0xa7, 0x99, 0xc2, 0x8d, 0x0d, 0x6f, 0x5c, 0xac, 0x6d, 0x27, 0xdd, 0x5d, 0xec,
+	0x9a, 0x3b, 0xa9, 0x10, 0xb2, 0x4c, 0x4b, 0x2e, 0x85, 0xd2, 0x6e, 0xfb, 0xc5, 0x40, 0x16, 0xe5,
+	0xdb, 0x7c, 0x54, 0xe5, 0x42, 0xe5, 0x00, 0xf1, 0xbc, 0xb2, 0x9f, 0xd0, 0xe1, 0xfe, 0xd4, 0x3a,
+	0x42, 0xed, 0x59, 0x48, 0x23, 0x18, 0x04, 0x57, 0x01, 0xf8, 0x9d, 0x7f, 0x56, 0x1b, 0x1d, 0xcc,
+	0xc2, 0xeb, 0x70, 0x7c, 0x17, 0x76, 0x0c, 0xeb, 0x0c, 0x9d, 0x4e, 0xe0, 0x76, 0x06, 0x74, 0x9a,
+	0xd0, 0x60, 0x01, 0xc9, 0x28, 0xb8, 0x09, 0xa6, 0x09, 0xdc, 0x0f, 0x00, 0x7c, 0xf0, 0x3b, 0xa6,
+	0x75, 0x8e, 0xba, 0x13, 0xa0, 0xd1, 0x38, 0xa4, 0xf0, 0x23, 0xd1, 0xea, 0x7f, 0x1a, 0xc8, 0x7e,
+	0x94, 0x2b, 0xfc, 0x77, 0x9d, 0xfe, 0xf1, 0xfe, 0x5e, 0x51, 0xd5, 0x22, 0x32, 0x16, 0xfe, 0xb7,
+	0x8d, 0xc9, 0x65, 0x2a, 0x18, 0x96, 0x05, 0x73, 0x58, 0x2e, 0xea, 0x8e, 0xbb, 0x63, 0xae, 0xb9,
+	0xfa, 0xed, 0xb6, 0x97, 0xfa, 0x79, 0x35, 0x5b, 0x43, 0xcf, 0x7b, 0x33, 0x7b, 0x43, 0x1d, 0xe6,
+	0x65, 0x0a, 0x6b, 0x59, 0xa9, 0xb9, 0x8b, 0xeb, 0x2f, 0xd5, 0xfb, 0x0e, 0x88, 0xbd, 0x4c, 0xc5,
+	0x0d, 0x10, 0xcf, 0xdd, 0x58, 0x03, 0x1f, 0xa6, 0xad, 0xa7, 0x84, 0x78, 0x99, 0x22, 0xa4, 0x41,
+	0x08, 0x99, 0xbb, 0x84, 0x68, 0xe8, 0xe1, 0x7f, 0xbd, 0x9d, 0xfb, 0x15, 0x00, 0x00, 0xff, 0xff,
+	0xda, 0x18, 0x3a, 0xb9, 0xf8, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/string_format_error.pb.go b/googleapis/ads/googleads/v3/errors/string_format_error.pb.go
new file mode 100644
index 0000000..c4305e8
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/string_format_error.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/string_format_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible string format errors.
+type StringFormatErrorEnum_StringFormatError int32
+
+const (
+	// Enum unspecified.
+	StringFormatErrorEnum_UNSPECIFIED StringFormatErrorEnum_StringFormatError = 0
+	// The received error code is not known in this version.
+	StringFormatErrorEnum_UNKNOWN StringFormatErrorEnum_StringFormatError = 1
+	// The input string value contains disallowed characters.
+	StringFormatErrorEnum_ILLEGAL_CHARS StringFormatErrorEnum_StringFormatError = 2
+	// The input string value is invalid for the associated field.
+	StringFormatErrorEnum_INVALID_FORMAT StringFormatErrorEnum_StringFormatError = 3
+)
+
+var StringFormatErrorEnum_StringFormatError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ILLEGAL_CHARS",
+	3: "INVALID_FORMAT",
+}
+
+var StringFormatErrorEnum_StringFormatError_value = map[string]int32{
+	"UNSPECIFIED":    0,
+	"UNKNOWN":        1,
+	"ILLEGAL_CHARS":  2,
+	"INVALID_FORMAT": 3,
+}
+
+func (x StringFormatErrorEnum_StringFormatError) String() string {
+	return proto.EnumName(StringFormatErrorEnum_StringFormatError_name, int32(x))
+}
+
+func (StringFormatErrorEnum_StringFormatError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_550e7d5be9ec8b30, []int{0, 0}
+}
+
+// Container for enum describing possible string format errors.
+type StringFormatErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StringFormatErrorEnum) Reset()         { *m = StringFormatErrorEnum{} }
+func (m *StringFormatErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*StringFormatErrorEnum) ProtoMessage()    {}
+func (*StringFormatErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_550e7d5be9ec8b30, []int{0}
+}
+
+func (m *StringFormatErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StringFormatErrorEnum.Unmarshal(m, b)
+}
+func (m *StringFormatErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StringFormatErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *StringFormatErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StringFormatErrorEnum.Merge(m, src)
+}
+func (m *StringFormatErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_StringFormatErrorEnum.Size(m)
+}
+func (m *StringFormatErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_StringFormatErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StringFormatErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.StringFormatErrorEnum_StringFormatError", StringFormatErrorEnum_StringFormatError_name, StringFormatErrorEnum_StringFormatError_value)
+	proto.RegisterType((*StringFormatErrorEnum)(nil), "google.ads.googleads.v3.errors.StringFormatErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/string_format_error.proto", fileDescriptor_550e7d5be9ec8b30)
+}
+
+var fileDescriptor_550e7d5be9ec8b30 = []byte{
+	// 319 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xb1, 0x4e, 0xf3, 0x30,
+	0x14, 0x85, 0xff, 0xa6, 0xd2, 0x8f, 0xe4, 0x0a, 0x48, 0x2d, 0xc1, 0x80, 0x50, 0x87, 0x3c, 0x80,
+	0x3d, 0x78, 0x41, 0x66, 0x72, 0xdb, 0xb4, 0x44, 0x84, 0xb4, 0x6a, 0x69, 0x40, 0x28, 0x52, 0x64,
+	0x48, 0xb1, 0x22, 0xb5, 0x76, 0xb1, 0x43, 0x1f, 0x88, 0x91, 0x47, 0xe1, 0x51, 0xd8, 0x78, 0x03,
+	0x14, 0x9b, 0x66, 0xa9, 0x60, 0xca, 0xd1, 0xcd, 0x77, 0xce, 0x3d, 0xbe, 0xe0, 0x42, 0x28, 0x25,
+	0x56, 0x4b, 0xcc, 0x0b, 0x83, 0x9d, 0xac, 0xd5, 0x96, 0xe0, 0xa5, 0xd6, 0x4a, 0x1b, 0x6c, 0x2a,
+	0x5d, 0x4a, 0x91, 0x3f, 0x2b, 0xbd, 0xe6, 0x55, 0x6e, 0x87, 0x68, 0xa3, 0x55, 0xa5, 0x60, 0xcf,
+	0xe1, 0x88, 0x17, 0x06, 0x35, 0x4e, 0xb4, 0x25, 0xc8, 0x39, 0xcf, 0xce, 0x77, 0xc9, 0x9b, 0x12,
+	0x73, 0x29, 0x55, 0xc5, 0xab, 0x52, 0x49, 0xe3, 0xdc, 0xc1, 0x0b, 0x38, 0x99, 0xdb, 0xe8, 0x91,
+	0x4d, 0x0e, 0x6b, 0x4f, 0x28, 0x5f, 0xd7, 0xc1, 0x3d, 0xe8, 0xee, 0xfd, 0x80, 0xc7, 0xa0, 0xb3,
+	0x48, 0xe6, 0xd3, 0x70, 0x10, 0x8d, 0xa2, 0x70, 0xe8, 0xff, 0x83, 0x1d, 0x70, 0xb0, 0x48, 0xae,
+	0x93, 0xc9, 0x5d, 0xe2, 0xb7, 0x60, 0x17, 0x1c, 0x46, 0x71, 0x1c, 0x8e, 0x59, 0x9c, 0x0f, 0xae,
+	0xd8, 0x6c, 0xee, 0x7b, 0x10, 0x82, 0xa3, 0x28, 0x49, 0x59, 0x1c, 0x0d, 0xf3, 0xd1, 0x64, 0x76,
+	0xc3, 0x6e, 0xfd, 0x76, 0xff, 0xab, 0x05, 0x82, 0x27, 0xb5, 0x46, 0x7f, 0xf7, 0xee, 0x9f, 0xee,
+	0xad, 0x9f, 0xd6, 0x8d, 0xa7, 0xad, 0x87, 0xe1, 0x8f, 0x53, 0xa8, 0x15, 0x97, 0x02, 0x29, 0x2d,
+	0xb0, 0x58, 0x4a, 0xfb, 0x9e, 0xdd, 0xed, 0x36, 0xa5, 0xf9, 0xed, 0x94, 0x97, 0xee, 0xf3, 0xe6,
+	0xb5, 0xc7, 0x8c, 0xbd, 0x7b, 0xbd, 0xb1, 0x0b, 0x63, 0x85, 0x41, 0x4e, 0xd6, 0x2a, 0x25, 0xc8,
+	0xae, 0x34, 0x1f, 0x3b, 0x20, 0x63, 0x85, 0xc9, 0x1a, 0x20, 0x4b, 0x49, 0xe6, 0x80, 0x4f, 0x2f,
+	0x70, 0x53, 0x4a, 0x59, 0x61, 0x28, 0x6d, 0x10, 0x4a, 0x53, 0x42, 0xa9, 0x83, 0x1e, 0xff, 0xdb,
+	0x76, 0xe4, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xc4, 0x5c, 0x61, 0x8e, 0xe7, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/string_length_error.pb.go b/googleapis/ads/googleads/v3/errors/string_length_error.pb.go
new file mode 100644
index 0000000..3ee61d4
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/string_length_error.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/string_length_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible string length errors.
+type StringLengthErrorEnum_StringLengthError int32
+
+const (
+	// Enum unspecified.
+	StringLengthErrorEnum_UNSPECIFIED StringLengthErrorEnum_StringLengthError = 0
+	// The received error code is not known in this version.
+	StringLengthErrorEnum_UNKNOWN StringLengthErrorEnum_StringLengthError = 1
+	// The specified field should have a least one non-whitespace character in
+	// it.
+	StringLengthErrorEnum_EMPTY StringLengthErrorEnum_StringLengthError = 4
+	// Too short.
+	StringLengthErrorEnum_TOO_SHORT StringLengthErrorEnum_StringLengthError = 2
+	// Too long.
+	StringLengthErrorEnum_TOO_LONG StringLengthErrorEnum_StringLengthError = 3
+)
+
+var StringLengthErrorEnum_StringLengthError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	4: "EMPTY",
+	2: "TOO_SHORT",
+	3: "TOO_LONG",
+}
+
+var StringLengthErrorEnum_StringLengthError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"EMPTY":       4,
+	"TOO_SHORT":   2,
+	"TOO_LONG":    3,
+}
+
+func (x StringLengthErrorEnum_StringLengthError) String() string {
+	return proto.EnumName(StringLengthErrorEnum_StringLengthError_name, int32(x))
+}
+
+func (StringLengthErrorEnum_StringLengthError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_529ee6d26aa7d91e, []int{0, 0}
+}
+
+// Container for enum describing possible string length errors.
+type StringLengthErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StringLengthErrorEnum) Reset()         { *m = StringLengthErrorEnum{} }
+func (m *StringLengthErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*StringLengthErrorEnum) ProtoMessage()    {}
+func (*StringLengthErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_529ee6d26aa7d91e, []int{0}
+}
+
+func (m *StringLengthErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StringLengthErrorEnum.Unmarshal(m, b)
+}
+func (m *StringLengthErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StringLengthErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *StringLengthErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StringLengthErrorEnum.Merge(m, src)
+}
+func (m *StringLengthErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_StringLengthErrorEnum.Size(m)
+}
+func (m *StringLengthErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_StringLengthErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StringLengthErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.StringLengthErrorEnum_StringLengthError", StringLengthErrorEnum_StringLengthError_name, StringLengthErrorEnum_StringLengthError_value)
+	proto.RegisterType((*StringLengthErrorEnum)(nil), "google.ads.googleads.v3.errors.StringLengthErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/string_length_error.proto", fileDescriptor_529ee6d26aa7d91e)
+}
+
+var fileDescriptor_529ee6d26aa7d91e = []byte{
+	// 320 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4b, 0x4e, 0xf3, 0x30,
+	0x14, 0x85, 0xff, 0xa6, 0x3f, 0x8f, 0xba, 0x20, 0x82, 0x25, 0x18, 0x20, 0xd4, 0x41, 0x16, 0x60,
+	0x0f, 0x3c, 0x41, 0x66, 0x94, 0xd2, 0x50, 0x2a, 0x4a, 0x12, 0xd1, 0x07, 0x2a, 0x8a, 0x14, 0x05,
+	0x12, 0x99, 0x48, 0xa9, 0x1d, 0xd9, 0xa1, 0x0b, 0x62, 0xc8, 0x52, 0x58, 0x0a, 0x33, 0x76, 0x80,
+	0x62, 0x93, 0x4c, 0x2a, 0x18, 0xf9, 0xf8, 0xfa, 0x3b, 0xe7, 0x5e, 0x5f, 0x70, 0xc1, 0x84, 0x60,
+	0x45, 0x86, 0x93, 0x54, 0x61, 0x23, 0x6b, 0xb5, 0x21, 0x38, 0x93, 0x52, 0x48, 0x85, 0x55, 0x25,
+	0x73, 0xce, 0xe2, 0x22, 0xe3, 0xac, 0x7a, 0x89, 0x75, 0x11, 0x95, 0x52, 0x54, 0x02, 0x0e, 0x0c,
+	0x8e, 0x92, 0x54, 0xa1, 0xd6, 0x89, 0x36, 0x04, 0x19, 0xe7, 0xd9, 0x79, 0x93, 0x5c, 0xe6, 0x38,
+	0xe1, 0x5c, 0x54, 0x49, 0x95, 0x0b, 0xae, 0x8c, 0xdb, 0x91, 0xe0, 0x64, 0xa6, 0xa3, 0xa7, 0x3a,
+	0xd9, 0xab, 0x3d, 0x1e, 0x7f, 0x5d, 0x3b, 0x2b, 0x70, 0xbc, 0xf5, 0x00, 0x8f, 0x40, 0x7f, 0xe1,
+	0xcf, 0x42, 0xef, 0x6a, 0x72, 0x3d, 0xf1, 0x46, 0xf6, 0x3f, 0xd8, 0x07, 0x7b, 0x0b, 0xff, 0xd6,
+	0x0f, 0x1e, 0x7c, 0xbb, 0x03, 0x7b, 0x60, 0xc7, 0xbb, 0x0b, 0xe7, 0x2b, 0xfb, 0x3f, 0x3c, 0x04,
+	0xbd, 0x79, 0x10, 0xc4, 0xb3, 0x9b, 0xe0, 0x7e, 0x6e, 0x5b, 0xf0, 0x00, 0xec, 0xd7, 0xd7, 0x69,
+	0xe0, 0x8f, 0xed, 0xee, 0xf0, 0xab, 0x03, 0x9c, 0x67, 0xb1, 0x46, 0x7f, 0x0f, 0x3e, 0x3c, 0xdd,
+	0xea, 0x1f, 0xd6, 0x23, 0x87, 0x9d, 0xc7, 0xd1, 0x8f, 0x93, 0x89, 0x22, 0xe1, 0x0c, 0x09, 0xc9,
+	0x30, 0xcb, 0xb8, 0xfe, 0x50, 0xb3, 0xbc, 0x32, 0x57, 0xbf, 0xed, 0xf2, 0xd2, 0x1c, 0x6f, 0x56,
+	0x77, 0xec, 0xba, 0xef, 0xd6, 0x60, 0x6c, 0xc2, 0xdc, 0x54, 0x21, 0x23, 0x6b, 0xb5, 0x24, 0x48,
+	0xb7, 0x54, 0x1f, 0x0d, 0x10, 0xb9, 0xa9, 0x8a, 0x5a, 0x20, 0x5a, 0x92, 0xc8, 0x00, 0x9f, 0x96,
+	0x63, 0xaa, 0x94, 0xba, 0xa9, 0xa2, 0xb4, 0x45, 0x28, 0x5d, 0x12, 0x4a, 0x0d, 0xf4, 0xb4, 0xab,
+	0xa7, 0x23, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x13, 0x23, 0x37, 0x69, 0xe8, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/time_zone_error.pb.go b/googleapis/ads/googleads/v3/errors/time_zone_error.pb.go
new file mode 100644
index 0000000..b7bba56
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/time_zone_error.pb.go
@@ -0,0 +1,119 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/time_zone_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible currency code errors.
+type TimeZoneErrorEnum_TimeZoneError int32
+
+const (
+	// Enum unspecified.
+	TimeZoneErrorEnum_UNSPECIFIED TimeZoneErrorEnum_TimeZoneError = 0
+	// The received error code is not known in this version.
+	TimeZoneErrorEnum_UNKNOWN TimeZoneErrorEnum_TimeZoneError = 1
+	// Time zone is not valid.
+	TimeZoneErrorEnum_INVALID_TIME_ZONE TimeZoneErrorEnum_TimeZoneError = 5
+)
+
+var TimeZoneErrorEnum_TimeZoneError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	5: "INVALID_TIME_ZONE",
+}
+
+var TimeZoneErrorEnum_TimeZoneError_value = map[string]int32{
+	"UNSPECIFIED":       0,
+	"UNKNOWN":           1,
+	"INVALID_TIME_ZONE": 5,
+}
+
+func (x TimeZoneErrorEnum_TimeZoneError) String() string {
+	return proto.EnumName(TimeZoneErrorEnum_TimeZoneError_name, int32(x))
+}
+
+func (TimeZoneErrorEnum_TimeZoneError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8e4bfbe09bff50c3, []int{0, 0}
+}
+
+// Container for enum describing possible time zone errors.
+type TimeZoneErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TimeZoneErrorEnum) Reset()         { *m = TimeZoneErrorEnum{} }
+func (m *TimeZoneErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*TimeZoneErrorEnum) ProtoMessage()    {}
+func (*TimeZoneErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8e4bfbe09bff50c3, []int{0}
+}
+
+func (m *TimeZoneErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TimeZoneErrorEnum.Unmarshal(m, b)
+}
+func (m *TimeZoneErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TimeZoneErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *TimeZoneErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TimeZoneErrorEnum.Merge(m, src)
+}
+func (m *TimeZoneErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_TimeZoneErrorEnum.Size(m)
+}
+func (m *TimeZoneErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_TimeZoneErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TimeZoneErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.TimeZoneErrorEnum_TimeZoneError", TimeZoneErrorEnum_TimeZoneError_name, TimeZoneErrorEnum_TimeZoneError_value)
+	proto.RegisterType((*TimeZoneErrorEnum)(nil), "google.ads.googleads.v3.errors.TimeZoneErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/time_zone_error.proto", fileDescriptor_8e4bfbe09bff50c3)
+}
+
+var fileDescriptor_8e4bfbe09bff50c3 = []byte{
+	// 302 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xf3, 0x40,
+	0x14, 0x85, 0xff, 0xf6, 0x47, 0x85, 0x29, 0x62, 0x1b, 0x70, 0x23, 0xd2, 0x45, 0x1e, 0x60, 0x66,
+	0x31, 0xae, 0xc6, 0xd5, 0xd4, 0x8c, 0x25, 0xa8, 0xd3, 0x82, 0x6d, 0xc4, 0x12, 0x08, 0xd1, 0x0c,
+	0x43, 0xa0, 0x99, 0x1b, 0x32, 0xb1, 0x0b, 0x1f, 0xc7, 0xa5, 0x8f, 0xe2, 0xa3, 0x08, 0xbe, 0x83,
+	0x24, 0x63, 0x02, 0x5d, 0xe8, 0xea, 0x1e, 0x0e, 0xdf, 0xb9, 0xf7, 0x70, 0xd1, 0x85, 0x06, 0xd0,
+	0x5b, 0x45, 0xd2, 0xcc, 0x12, 0x27, 0x1b, 0xb5, 0xa3, 0x44, 0x55, 0x15, 0x54, 0x96, 0xd4, 0x79,
+	0xa1, 0x92, 0x57, 0x30, 0x2a, 0x69, 0x0d, 0x5c, 0x56, 0x50, 0x83, 0x37, 0x75, 0x28, 0x4e, 0x33,
+	0x8b, 0xfb, 0x14, 0xde, 0x51, 0xec, 0x52, 0x67, 0xe7, 0xdd, 0xd6, 0x32, 0x27, 0xa9, 0x31, 0x50,
+	0xa7, 0x75, 0x0e, 0xc6, 0xba, 0xb4, 0xff, 0x88, 0x26, 0xab, 0xbc, 0x50, 0x1b, 0x30, 0x4a, 0x34,
+	0xbc, 0x30, 0x2f, 0x85, 0x1f, 0xa0, 0xe3, 0x3d, 0xd3, 0x3b, 0x41, 0xa3, 0xb5, 0xbc, 0x5f, 0x8a,
+	0xab, 0xf0, 0x3a, 0x14, 0xc1, 0xf8, 0x9f, 0x37, 0x42, 0x47, 0x6b, 0x79, 0x23, 0x17, 0x0f, 0x72,
+	0x3c, 0xf0, 0x4e, 0xd1, 0x24, 0x94, 0x11, 0xbf, 0x0d, 0x83, 0x64, 0x15, 0xde, 0x89, 0x64, 0xb3,
+	0x90, 0x62, 0x7c, 0x30, 0xfb, 0x1a, 0x20, 0xff, 0x19, 0x0a, 0xfc, 0x77, 0xbf, 0x99, 0xb7, 0x77,
+	0x6a, 0xd9, 0xb4, 0x5a, 0x0e, 0x36, 0xc1, 0x4f, 0x4a, 0xc3, 0x36, 0x35, 0x1a, 0x43, 0xa5, 0x89,
+	0x56, 0xa6, 0xed, 0xdc, 0xfd, 0xa6, 0xcc, 0xed, 0x6f, 0xaf, 0xba, 0x74, 0xe3, 0x6d, 0xf8, 0x7f,
+	0xce, 0xf9, 0xfb, 0x70, 0x3a, 0x77, 0xcb, 0x78, 0x66, 0xb1, 0x93, 0x8d, 0x8a, 0x28, 0x6e, 0x4f,
+	0xda, 0x8f, 0x0e, 0x88, 0x79, 0x66, 0xe3, 0x1e, 0x88, 0x23, 0x1a, 0x3b, 0xe0, 0x73, 0xe8, 0x3b,
+	0x97, 0x31, 0x9e, 0x59, 0xc6, 0x7a, 0x84, 0xb1, 0x88, 0x32, 0xe6, 0xa0, 0xa7, 0xc3, 0xb6, 0x1d,
+	0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x34, 0x85, 0x53, 0x87, 0xc7, 0x01, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/url_field_error.pb.go b/googleapis/ads/googleads/v3/errors/url_field_error.pb.go
new file mode 100644
index 0000000..c2cc5ad
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/url_field_error.pb.go
@@ -0,0 +1,374 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/url_field_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible url field errors.
+type UrlFieldErrorEnum_UrlFieldError int32
+
+const (
+	// Enum unspecified.
+	UrlFieldErrorEnum_UNSPECIFIED UrlFieldErrorEnum_UrlFieldError = 0
+	// The received error code is not known in this version.
+	UrlFieldErrorEnum_UNKNOWN UrlFieldErrorEnum_UrlFieldError = 1
+	// The tracking url template is invalid.
+	UrlFieldErrorEnum_INVALID_TRACKING_URL_TEMPLATE UrlFieldErrorEnum_UrlFieldError = 2
+	// The tracking url template contains invalid tag.
+	UrlFieldErrorEnum_INVALID_TAG_IN_TRACKING_URL_TEMPLATE UrlFieldErrorEnum_UrlFieldError = 3
+	// The tracking url template must contain at least one tag (e.g. {lpurl}),
+	// This applies only to tracking url template associated with website ads or
+	// product ads.
+	UrlFieldErrorEnum_MISSING_TRACKING_URL_TEMPLATE_TAG UrlFieldErrorEnum_UrlFieldError = 4
+	// The tracking url template must start with a valid protocol (or lpurl
+	// tag).
+	UrlFieldErrorEnum_MISSING_PROTOCOL_IN_TRACKING_URL_TEMPLATE UrlFieldErrorEnum_UrlFieldError = 5
+	// The tracking url template starts with an invalid protocol.
+	UrlFieldErrorEnum_INVALID_PROTOCOL_IN_TRACKING_URL_TEMPLATE UrlFieldErrorEnum_UrlFieldError = 6
+	// The tracking url template contains illegal characters.
+	UrlFieldErrorEnum_MALFORMED_TRACKING_URL_TEMPLATE UrlFieldErrorEnum_UrlFieldError = 7
+	// The tracking url template must contain a host name (or lpurl tag).
+	UrlFieldErrorEnum_MISSING_HOST_IN_TRACKING_URL_TEMPLATE UrlFieldErrorEnum_UrlFieldError = 8
+	// The tracking url template has an invalid or missing top level domain
+	// extension.
+	UrlFieldErrorEnum_INVALID_TLD_IN_TRACKING_URL_TEMPLATE UrlFieldErrorEnum_UrlFieldError = 9
+	// The tracking url template contains nested occurrences of the same
+	// conditional tag (i.e. {ifmobile:{ifmobile:x}}).
+	UrlFieldErrorEnum_REDUNDANT_NESTED_TRACKING_URL_TEMPLATE_TAG UrlFieldErrorEnum_UrlFieldError = 10
+	// The final url is invalid.
+	UrlFieldErrorEnum_INVALID_FINAL_URL UrlFieldErrorEnum_UrlFieldError = 11
+	// The final url contains invalid tag.
+	UrlFieldErrorEnum_INVALID_TAG_IN_FINAL_URL UrlFieldErrorEnum_UrlFieldError = 12
+	// The final url contains nested occurrences of the same conditional tag
+	// (i.e. {ifmobile:{ifmobile:x}}).
+	UrlFieldErrorEnum_REDUNDANT_NESTED_FINAL_URL_TAG UrlFieldErrorEnum_UrlFieldError = 13
+	// The final url must start with a valid protocol.
+	UrlFieldErrorEnum_MISSING_PROTOCOL_IN_FINAL_URL UrlFieldErrorEnum_UrlFieldError = 14
+	// The final url starts with an invalid protocol.
+	UrlFieldErrorEnum_INVALID_PROTOCOL_IN_FINAL_URL UrlFieldErrorEnum_UrlFieldError = 15
+	// The final url contains illegal characters.
+	UrlFieldErrorEnum_MALFORMED_FINAL_URL UrlFieldErrorEnum_UrlFieldError = 16
+	// The final url must contain a host name.
+	UrlFieldErrorEnum_MISSING_HOST_IN_FINAL_URL UrlFieldErrorEnum_UrlFieldError = 17
+	// The tracking url template has an invalid or missing top level domain
+	// extension.
+	UrlFieldErrorEnum_INVALID_TLD_IN_FINAL_URL UrlFieldErrorEnum_UrlFieldError = 18
+	// The final mobile url is invalid.
+	UrlFieldErrorEnum_INVALID_FINAL_MOBILE_URL UrlFieldErrorEnum_UrlFieldError = 19
+	// The final mobile url contains invalid tag.
+	UrlFieldErrorEnum_INVALID_TAG_IN_FINAL_MOBILE_URL UrlFieldErrorEnum_UrlFieldError = 20
+	// The final mobile url contains nested occurrences of the same conditional
+	// tag (i.e. {ifmobile:{ifmobile:x}}).
+	UrlFieldErrorEnum_REDUNDANT_NESTED_FINAL_MOBILE_URL_TAG UrlFieldErrorEnum_UrlFieldError = 21
+	// The final mobile url must start with a valid protocol.
+	UrlFieldErrorEnum_MISSING_PROTOCOL_IN_FINAL_MOBILE_URL UrlFieldErrorEnum_UrlFieldError = 22
+	// The final mobile url starts with an invalid protocol.
+	UrlFieldErrorEnum_INVALID_PROTOCOL_IN_FINAL_MOBILE_URL UrlFieldErrorEnum_UrlFieldError = 23
+	// The final mobile url contains illegal characters.
+	UrlFieldErrorEnum_MALFORMED_FINAL_MOBILE_URL UrlFieldErrorEnum_UrlFieldError = 24
+	// The final mobile url must contain a host name.
+	UrlFieldErrorEnum_MISSING_HOST_IN_FINAL_MOBILE_URL UrlFieldErrorEnum_UrlFieldError = 25
+	// The tracking url template has an invalid or missing top level domain
+	// extension.
+	UrlFieldErrorEnum_INVALID_TLD_IN_FINAL_MOBILE_URL UrlFieldErrorEnum_UrlFieldError = 26
+	// The final app url is invalid.
+	UrlFieldErrorEnum_INVALID_FINAL_APP_URL UrlFieldErrorEnum_UrlFieldError = 27
+	// The final app url contains invalid tag.
+	UrlFieldErrorEnum_INVALID_TAG_IN_FINAL_APP_URL UrlFieldErrorEnum_UrlFieldError = 28
+	// The final app url contains nested occurrences of the same conditional tag
+	// (i.e. {ifmobile:{ifmobile:x}}).
+	UrlFieldErrorEnum_REDUNDANT_NESTED_FINAL_APP_URL_TAG UrlFieldErrorEnum_UrlFieldError = 29
+	// More than one app url found for the same OS type.
+	UrlFieldErrorEnum_MULTIPLE_APP_URLS_FOR_OSTYPE UrlFieldErrorEnum_UrlFieldError = 30
+	// The OS type given for an app url is not valid.
+	UrlFieldErrorEnum_INVALID_OSTYPE UrlFieldErrorEnum_UrlFieldError = 31
+	// The protocol given for an app url is not valid. (E.g. "android-app://")
+	UrlFieldErrorEnum_INVALID_PROTOCOL_FOR_APP_URL UrlFieldErrorEnum_UrlFieldError = 32
+	// The package id (app id) given for an app url is not valid.
+	UrlFieldErrorEnum_INVALID_PACKAGE_ID_FOR_APP_URL UrlFieldErrorEnum_UrlFieldError = 33
+	// The number of url custom parameters for an resource exceeds the maximum
+	// limit allowed.
+	UrlFieldErrorEnum_URL_CUSTOM_PARAMETERS_COUNT_EXCEEDS_LIMIT UrlFieldErrorEnum_UrlFieldError = 34
+	// An invalid character appears in the parameter key.
+	UrlFieldErrorEnum_INVALID_CHARACTERS_IN_URL_CUSTOM_PARAMETER_KEY UrlFieldErrorEnum_UrlFieldError = 39
+	// An invalid character appears in the parameter value.
+	UrlFieldErrorEnum_INVALID_CHARACTERS_IN_URL_CUSTOM_PARAMETER_VALUE UrlFieldErrorEnum_UrlFieldError = 40
+	// The url custom parameter value fails url tag validation.
+	UrlFieldErrorEnum_INVALID_TAG_IN_URL_CUSTOM_PARAMETER_VALUE UrlFieldErrorEnum_UrlFieldError = 41
+	// The custom parameter contains nested occurrences of the same conditional
+	// tag (i.e. {ifmobile:{ifmobile:x}}).
+	UrlFieldErrorEnum_REDUNDANT_NESTED_URL_CUSTOM_PARAMETER_TAG UrlFieldErrorEnum_UrlFieldError = 42
+	// The protocol (http:// or https://) is missing.
+	UrlFieldErrorEnum_MISSING_PROTOCOL UrlFieldErrorEnum_UrlFieldError = 43
+	// Unsupported protocol in URL. Only http and https are supported.
+	UrlFieldErrorEnum_INVALID_PROTOCOL UrlFieldErrorEnum_UrlFieldError = 52
+	// The url is invalid.
+	UrlFieldErrorEnum_INVALID_URL UrlFieldErrorEnum_UrlFieldError = 44
+	// Destination Url is deprecated.
+	UrlFieldErrorEnum_DESTINATION_URL_DEPRECATED UrlFieldErrorEnum_UrlFieldError = 45
+	// The url contains invalid tag.
+	UrlFieldErrorEnum_INVALID_TAG_IN_URL UrlFieldErrorEnum_UrlFieldError = 46
+	// The url must contain at least one tag (e.g. {lpurl}), This applies only
+	// to urls associated with website ads or product ads.
+	UrlFieldErrorEnum_MISSING_URL_TAG UrlFieldErrorEnum_UrlFieldError = 47
+	// Duplicate url id.
+	UrlFieldErrorEnum_DUPLICATE_URL_ID UrlFieldErrorEnum_UrlFieldError = 48
+	// Invalid url id.
+	UrlFieldErrorEnum_INVALID_URL_ID UrlFieldErrorEnum_UrlFieldError = 49
+	// The final url suffix cannot begin with '?' or '&' characters and must be
+	// a valid query string.
+	UrlFieldErrorEnum_FINAL_URL_SUFFIX_MALFORMED UrlFieldErrorEnum_UrlFieldError = 50
+	// The final url suffix cannot contain {lpurl} related or {ignore} tags.
+	UrlFieldErrorEnum_INVALID_TAG_IN_FINAL_URL_SUFFIX UrlFieldErrorEnum_UrlFieldError = 51
+	// The top level domain is invalid, e.g, not a public top level domain
+	// listed in publicsuffix.org.
+	UrlFieldErrorEnum_INVALID_TOP_LEVEL_DOMAIN UrlFieldErrorEnum_UrlFieldError = 53
+	// Malformed top level domain in URL.
+	UrlFieldErrorEnum_MALFORMED_TOP_LEVEL_DOMAIN UrlFieldErrorEnum_UrlFieldError = 54
+	// Malformed URL.
+	UrlFieldErrorEnum_MALFORMED_URL UrlFieldErrorEnum_UrlFieldError = 55
+	// No host found in URL.
+	UrlFieldErrorEnum_MISSING_HOST UrlFieldErrorEnum_UrlFieldError = 56
+	// Custom parameter value cannot be null.
+	UrlFieldErrorEnum_NULL_CUSTOM_PARAMETER_VALUE UrlFieldErrorEnum_UrlFieldError = 57
+)
+
+var UrlFieldErrorEnum_UrlFieldError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "INVALID_TRACKING_URL_TEMPLATE",
+	3:  "INVALID_TAG_IN_TRACKING_URL_TEMPLATE",
+	4:  "MISSING_TRACKING_URL_TEMPLATE_TAG",
+	5:  "MISSING_PROTOCOL_IN_TRACKING_URL_TEMPLATE",
+	6:  "INVALID_PROTOCOL_IN_TRACKING_URL_TEMPLATE",
+	7:  "MALFORMED_TRACKING_URL_TEMPLATE",
+	8:  "MISSING_HOST_IN_TRACKING_URL_TEMPLATE",
+	9:  "INVALID_TLD_IN_TRACKING_URL_TEMPLATE",
+	10: "REDUNDANT_NESTED_TRACKING_URL_TEMPLATE_TAG",
+	11: "INVALID_FINAL_URL",
+	12: "INVALID_TAG_IN_FINAL_URL",
+	13: "REDUNDANT_NESTED_FINAL_URL_TAG",
+	14: "MISSING_PROTOCOL_IN_FINAL_URL",
+	15: "INVALID_PROTOCOL_IN_FINAL_URL",
+	16: "MALFORMED_FINAL_URL",
+	17: "MISSING_HOST_IN_FINAL_URL",
+	18: "INVALID_TLD_IN_FINAL_URL",
+	19: "INVALID_FINAL_MOBILE_URL",
+	20: "INVALID_TAG_IN_FINAL_MOBILE_URL",
+	21: "REDUNDANT_NESTED_FINAL_MOBILE_URL_TAG",
+	22: "MISSING_PROTOCOL_IN_FINAL_MOBILE_URL",
+	23: "INVALID_PROTOCOL_IN_FINAL_MOBILE_URL",
+	24: "MALFORMED_FINAL_MOBILE_URL",
+	25: "MISSING_HOST_IN_FINAL_MOBILE_URL",
+	26: "INVALID_TLD_IN_FINAL_MOBILE_URL",
+	27: "INVALID_FINAL_APP_URL",
+	28: "INVALID_TAG_IN_FINAL_APP_URL",
+	29: "REDUNDANT_NESTED_FINAL_APP_URL_TAG",
+	30: "MULTIPLE_APP_URLS_FOR_OSTYPE",
+	31: "INVALID_OSTYPE",
+	32: "INVALID_PROTOCOL_FOR_APP_URL",
+	33: "INVALID_PACKAGE_ID_FOR_APP_URL",
+	34: "URL_CUSTOM_PARAMETERS_COUNT_EXCEEDS_LIMIT",
+	39: "INVALID_CHARACTERS_IN_URL_CUSTOM_PARAMETER_KEY",
+	40: "INVALID_CHARACTERS_IN_URL_CUSTOM_PARAMETER_VALUE",
+	41: "INVALID_TAG_IN_URL_CUSTOM_PARAMETER_VALUE",
+	42: "REDUNDANT_NESTED_URL_CUSTOM_PARAMETER_TAG",
+	43: "MISSING_PROTOCOL",
+	52: "INVALID_PROTOCOL",
+	44: "INVALID_URL",
+	45: "DESTINATION_URL_DEPRECATED",
+	46: "INVALID_TAG_IN_URL",
+	47: "MISSING_URL_TAG",
+	48: "DUPLICATE_URL_ID",
+	49: "INVALID_URL_ID",
+	50: "FINAL_URL_SUFFIX_MALFORMED",
+	51: "INVALID_TAG_IN_FINAL_URL_SUFFIX",
+	53: "INVALID_TOP_LEVEL_DOMAIN",
+	54: "MALFORMED_TOP_LEVEL_DOMAIN",
+	55: "MALFORMED_URL",
+	56: "MISSING_HOST",
+	57: "NULL_CUSTOM_PARAMETER_VALUE",
+}
+
+var UrlFieldErrorEnum_UrlFieldError_value = map[string]int32{
+	"UNSPECIFIED":                                      0,
+	"UNKNOWN":                                          1,
+	"INVALID_TRACKING_URL_TEMPLATE":                    2,
+	"INVALID_TAG_IN_TRACKING_URL_TEMPLATE":             3,
+	"MISSING_TRACKING_URL_TEMPLATE_TAG":                4,
+	"MISSING_PROTOCOL_IN_TRACKING_URL_TEMPLATE":        5,
+	"INVALID_PROTOCOL_IN_TRACKING_URL_TEMPLATE":        6,
+	"MALFORMED_TRACKING_URL_TEMPLATE":                  7,
+	"MISSING_HOST_IN_TRACKING_URL_TEMPLATE":            8,
+	"INVALID_TLD_IN_TRACKING_URL_TEMPLATE":             9,
+	"REDUNDANT_NESTED_TRACKING_URL_TEMPLATE_TAG":       10,
+	"INVALID_FINAL_URL":                                11,
+	"INVALID_TAG_IN_FINAL_URL":                         12,
+	"REDUNDANT_NESTED_FINAL_URL_TAG":                   13,
+	"MISSING_PROTOCOL_IN_FINAL_URL":                    14,
+	"INVALID_PROTOCOL_IN_FINAL_URL":                    15,
+	"MALFORMED_FINAL_URL":                              16,
+	"MISSING_HOST_IN_FINAL_URL":                        17,
+	"INVALID_TLD_IN_FINAL_URL":                         18,
+	"INVALID_FINAL_MOBILE_URL":                         19,
+	"INVALID_TAG_IN_FINAL_MOBILE_URL":                  20,
+	"REDUNDANT_NESTED_FINAL_MOBILE_URL_TAG":            21,
+	"MISSING_PROTOCOL_IN_FINAL_MOBILE_URL":             22,
+	"INVALID_PROTOCOL_IN_FINAL_MOBILE_URL":             23,
+	"MALFORMED_FINAL_MOBILE_URL":                       24,
+	"MISSING_HOST_IN_FINAL_MOBILE_URL":                 25,
+	"INVALID_TLD_IN_FINAL_MOBILE_URL":                  26,
+	"INVALID_FINAL_APP_URL":                            27,
+	"INVALID_TAG_IN_FINAL_APP_URL":                     28,
+	"REDUNDANT_NESTED_FINAL_APP_URL_TAG":               29,
+	"MULTIPLE_APP_URLS_FOR_OSTYPE":                     30,
+	"INVALID_OSTYPE":                                   31,
+	"INVALID_PROTOCOL_FOR_APP_URL":                     32,
+	"INVALID_PACKAGE_ID_FOR_APP_URL":                   33,
+	"URL_CUSTOM_PARAMETERS_COUNT_EXCEEDS_LIMIT":        34,
+	"INVALID_CHARACTERS_IN_URL_CUSTOM_PARAMETER_KEY":   39,
+	"INVALID_CHARACTERS_IN_URL_CUSTOM_PARAMETER_VALUE": 40,
+	"INVALID_TAG_IN_URL_CUSTOM_PARAMETER_VALUE":        41,
+	"REDUNDANT_NESTED_URL_CUSTOM_PARAMETER_TAG":        42,
+	"MISSING_PROTOCOL":                                 43,
+	"INVALID_PROTOCOL":                                 52,
+	"INVALID_URL":                                      44,
+	"DESTINATION_URL_DEPRECATED":                       45,
+	"INVALID_TAG_IN_URL":                               46,
+	"MISSING_URL_TAG":                                  47,
+	"DUPLICATE_URL_ID":                                 48,
+	"INVALID_URL_ID":                                   49,
+	"FINAL_URL_SUFFIX_MALFORMED":                       50,
+	"INVALID_TAG_IN_FINAL_URL_SUFFIX":                  51,
+	"INVALID_TOP_LEVEL_DOMAIN":                         53,
+	"MALFORMED_TOP_LEVEL_DOMAIN":                       54,
+	"MALFORMED_URL":                                    55,
+	"MISSING_HOST":                                     56,
+	"NULL_CUSTOM_PARAMETER_VALUE":                      57,
+}
+
+func (x UrlFieldErrorEnum_UrlFieldError) String() string {
+	return proto.EnumName(UrlFieldErrorEnum_UrlFieldError_name, int32(x))
+}
+
+func (UrlFieldErrorEnum_UrlFieldError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_fda0f9682a3a1a06, []int{0, 0}
+}
+
+// Container for enum describing possible url field errors.
+type UrlFieldErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UrlFieldErrorEnum) Reset()         { *m = UrlFieldErrorEnum{} }
+func (m *UrlFieldErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*UrlFieldErrorEnum) ProtoMessage()    {}
+func (*UrlFieldErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fda0f9682a3a1a06, []int{0}
+}
+
+func (m *UrlFieldErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UrlFieldErrorEnum.Unmarshal(m, b)
+}
+func (m *UrlFieldErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UrlFieldErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *UrlFieldErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UrlFieldErrorEnum.Merge(m, src)
+}
+func (m *UrlFieldErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_UrlFieldErrorEnum.Size(m)
+}
+func (m *UrlFieldErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UrlFieldErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UrlFieldErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.UrlFieldErrorEnum_UrlFieldError", UrlFieldErrorEnum_UrlFieldError_name, UrlFieldErrorEnum_UrlFieldError_value)
+	proto.RegisterType((*UrlFieldErrorEnum)(nil), "google.ads.googleads.v3.errors.UrlFieldErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/url_field_error.proto", fileDescriptor_fda0f9682a3a1a06)
+}
+
+var fileDescriptor_fda0f9682a3a1a06 = []byte{
+	// 865 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x96, 0xdd, 0x6e, 0xdb, 0x36,
+	0x14, 0xc7, 0x97, 0x74, 0x6b, 0xb7, 0x93, 0x26, 0x61, 0x4e, 0x9a, 0xb6, 0x49, 0x13, 0x27, 0xf1,
+	0xda, 0xad, 0xe9, 0x56, 0xb9, 0xab, 0xb3, 0x2f, 0xef, 0x8a, 0x91, 0x68, 0x97, 0x08, 0x45, 0x09,
+	0x12, 0xe5, 0xb5, 0x43, 0x00, 0xc2, 0x9b, 0x33, 0x23, 0x80, 0x6b, 0x05, 0x56, 0xda, 0xe7, 0x19,
+	0x76, 0xb9, 0x07, 0xd8, 0x43, 0xec, 0x51, 0x06, 0xec, 0x1d, 0x06, 0x4a, 0x96, 0x25, 0x3b, 0x56,
+	0x86, 0x5d, 0x99, 0x38, 0xe7, 0x77, 0x3e, 0xf8, 0x3f, 0x22, 0x69, 0x38, 0x1e, 0xc4, 0xf1, 0x60,
+	0x78, 0xde, 0xe8, 0xf5, 0x93, 0x46, 0xb6, 0x34, 0xab, 0xf7, 0xcd, 0xc6, 0xf9, 0x78, 0x1c, 0x8f,
+	0x93, 0xc6, 0xbb, 0xf1, 0x50, 0xff, 0x7a, 0x71, 0x3e, 0xec, 0xeb, 0xd4, 0x60, 0x5d, 0x8e, 0xe3,
+	0xab, 0x18, 0x6b, 0x19, 0x6a, 0xf5, 0xfa, 0x89, 0x35, 0x8d, 0xb2, 0xde, 0x37, 0xad, 0x2c, 0x6a,
+	0x67, 0x37, 0xcf, 0x7a, 0x79, 0xd1, 0xe8, 0x8d, 0x46, 0xf1, 0x55, 0xef, 0xea, 0x22, 0x1e, 0x25,
+	0x59, 0x74, 0xfd, 0xcf, 0x35, 0xd8, 0x88, 0xc6, 0xc3, 0xb6, 0x49, 0xcb, 0x4c, 0x00, 0x1b, 0xbd,
+	0x7b, 0x5b, 0xff, 0x6d, 0x0d, 0x56, 0x67, 0xac, 0xb8, 0x0e, 0x2b, 0x91, 0x0c, 0x7d, 0x66, 0xf3,
+	0x36, 0x67, 0x0e, 0xf9, 0x00, 0x57, 0xe0, 0x4e, 0x24, 0x4f, 0xa5, 0xf7, 0xa3, 0x24, 0x4b, 0x78,
+	0x08, 0x7b, 0x5c, 0x76, 0xa9, 0xe0, 0x8e, 0x56, 0x01, 0xb5, 0x4f, 0xb9, 0xec, 0xe8, 0x28, 0x10,
+	0x5a, 0x31, 0xd7, 0x17, 0x54, 0x31, 0xb2, 0x8c, 0x4f, 0xe1, 0xf1, 0x14, 0xa1, 0x1d, 0xcd, 0x65,
+	0x05, 0x79, 0x0b, 0x9f, 0xc0, 0xa1, 0xcb, 0xc3, 0xd0, 0x78, 0x16, 0x22, 0x26, 0x9e, 0x7c, 0x88,
+	0xcf, 0xe1, 0x28, 0xc7, 0xfc, 0xc0, 0x53, 0x9e, 0xed, 0x89, 0xea, 0xac, 0x1f, 0x19, 0x3c, 0xaf,
+	0xff, 0xdf, 0xf8, 0x6d, 0xfc, 0x14, 0xf6, 0x5d, 0x2a, 0xda, 0x5e, 0xe0, 0xb2, 0xaa, 0x3d, 0xdd,
+	0xc1, 0x23, 0x78, 0x92, 0xb7, 0xf0, 0xca, 0x0b, 0x55, 0x75, 0xbe, 0x8f, 0x67, 0xb6, 0x2f, 0x9c,
+	0x6a, 0xf2, 0x13, 0xb4, 0xe0, 0x59, 0xc0, 0x9c, 0x48, 0x3a, 0x54, 0x2a, 0x2d, 0x59, 0xa8, 0xaa,
+	0x1a, 0x48, 0x75, 0x00, 0xdc, 0x82, 0x8d, 0x3c, 0x73, 0x9b, 0x4b, 0x2a, 0x0c, 0x43, 0x56, 0x70,
+	0x17, 0x1e, 0xce, 0xe9, 0x5d, 0x78, 0xef, 0x62, 0x1d, 0x6a, 0xd7, 0x8a, 0x4c, 0xfd, 0x69, 0xe2,
+	0x55, 0x33, 0xd4, 0x45, 0x02, 0x17, 0x69, 0xd6, 0xca, 0x73, 0x5f, 0x8c, 0xac, 0xe3, 0x03, 0xd8,
+	0x2c, 0x84, 0x2c, 0x1c, 0x04, 0xf7, 0x60, 0x7b, 0x5e, 0xbc, 0xc2, 0xbd, 0x31, 0xd3, 0x7f, 0x26,
+	0x58, 0xe1, 0xc5, 0xb2, 0x37, 0x33, 0xbb, 0xde, 0x09, 0x17, 0x2c, 0xf5, 0x6e, 0x9a, 0xe1, 0x2d,
+	0xdc, 0x7b, 0x09, 0xba, 0x67, 0x86, 0x57, 0x21, 0x41, 0x81, 0xa5, 0x4a, 0x6c, 0x99, 0xe1, 0x55,
+	0x2b, 0x51, 0x4a, 0x7a, 0xbf, 0x3c, 0xe6, 0x1b, 0xc9, 0x07, 0x58, 0x83, 0x9d, 0x79, 0x5d, 0x4a,
+	0xfe, 0x87, 0xf8, 0x18, 0x0e, 0x16, 0xcb, 0x53, 0xa2, 0xb6, 0x67, 0x76, 0x5a, 0x56, 0xa9, 0x04,
+	0xed, 0xe0, 0x36, 0x6c, 0xcd, 0x8a, 0x45, 0x7d, 0x3f, 0x75, 0x3d, 0xc2, 0x03, 0xd8, 0x5d, 0xa8,
+	0x54, 0x4e, 0xec, 0xe2, 0x67, 0x50, 0xaf, 0x90, 0x69, 0xc2, 0xa4, 0x1a, 0xed, 0x99, 0x4c, 0x6e,
+	0x24, 0x14, 0xf7, 0x05, 0xcb, 0x3d, 0xa1, 0x6e, 0x7b, 0x81, 0xf6, 0x42, 0xf5, 0xc6, 0x67, 0xa4,
+	0x86, 0x08, 0x6b, 0x79, 0xad, 0x89, 0x6d, 0xbf, 0x5c, 0x7f, 0xaa, 0x97, 0x09, 0xca, 0xeb, 0x1f,
+	0x98, 0x2f, 0x75, 0x4a, 0x50, 0xfb, 0x94, 0x76, 0x98, 0x36, 0xfb, 0x28, 0x31, 0x87, 0xe6, 0x6c,
+	0x9b, 0x46, 0xec, 0x28, 0x54, 0x9e, 0xab, 0x7d, 0x1a, 0x50, 0x97, 0x29, 0x16, 0x84, 0xda, 0xf6,
+	0x22, 0xa9, 0x34, 0x7b, 0x6d, 0x33, 0xe6, 0x84, 0x5a, 0x70, 0x97, 0x2b, 0x52, 0xc7, 0x97, 0x60,
+	0xe5, 0x29, 0xed, 0x57, 0x34, 0xa0, 0x76, 0xca, 0x72, 0xa9, 0x17, 0x25, 0xd1, 0xa7, 0xec, 0x0d,
+	0xf9, 0x1c, 0x8f, 0xe1, 0xc5, 0xff, 0x88, 0xe9, 0x52, 0x11, 0x31, 0xf2, 0xb4, 0x7c, 0xe9, 0x4c,
+	0xe4, 0xbd, 0x01, 0x3f, 0x32, 0xf8, 0x35, 0xad, 0x17, 0x06, 0x18, 0xc9, 0x9f, 0xe1, 0x3d, 0x20,
+	0xf3, 0x9f, 0x25, 0xf9, 0xc2, 0x58, 0xe7, 0x25, 0x25, 0xc7, 0xe6, 0xfe, 0xce, 0xad, 0x46, 0xb3,
+	0x2f, 0xcd, 0xf7, 0xe7, 0xb0, 0x50, 0x71, 0x49, 0x15, 0xf7, 0xb2, 0xbe, 0x1c, 0xe6, 0x07, 0xcc,
+	0xa6, 0x8a, 0x39, 0xe4, 0x39, 0xde, 0x07, 0xbc, 0xde, 0x3a, 0xb1, 0x70, 0x13, 0xd6, 0xf3, 0xa2,
+	0xf9, 0xf0, 0x1b, 0xa6, 0xa6, 0x13, 0xf9, 0x82, 0x9b, 0xe0, 0xd4, 0xcc, 0x1d, 0xf2, 0xa2, 0x3c,
+	0xf0, 0x89, 0xed, 0x2b, 0x53, 0xb6, 0xb8, 0x67, 0xc2, 0xa8, 0xdd, 0xe6, 0xaf, 0xf5, 0xf4, 0x1c,
+	0x90, 0x97, 0x95, 0x47, 0xb7, 0xc0, 0x49, 0x73, 0xe6, 0x6e, 0xf0, 0x7c, 0x2d, 0x58, 0x97, 0x09,
+	0xed, 0x78, 0x2e, 0xe5, 0x92, 0x7c, 0x3d, 0x7b, 0xb2, 0xae, 0xf9, 0xbf, 0xc1, 0x0d, 0x58, 0x2d,
+	0xfc, 0x66, 0x53, 0xdf, 0x22, 0x81, 0xbb, 0xe5, 0xc3, 0x46, 0xbe, 0xc3, 0x7d, 0x78, 0x24, 0x23,
+	0x51, 0x39, 0xab, 0xef, 0x4f, 0xfe, 0x59, 0x82, 0xfa, 0x2f, 0xf1, 0x5b, 0xeb, 0xe6, 0xd7, 0xf7,
+	0x04, 0x67, 0x9e, 0x51, 0xdf, 0xbc, 0xb9, 0xfe, 0xd2, 0x4f, 0xce, 0x24, 0x6a, 0x10, 0x0f, 0x7b,
+	0xa3, 0x81, 0x15, 0x8f, 0x07, 0x8d, 0xc1, 0xf9, 0x28, 0x7d, 0x91, 0xf3, 0x97, 0xff, 0xf2, 0x22,
+	0xa9, 0xfa, 0x23, 0xf0, 0x43, 0xf6, 0xf3, 0xfb, 0xf2, 0xad, 0x0e, 0xa5, 0x7f, 0x2c, 0xd7, 0x3a,
+	0x59, 0x32, 0xda, 0x4f, 0xac, 0x6c, 0x69, 0x56, 0xdd, 0xa6, 0x95, 0x96, 0x4c, 0xfe, 0xca, 0x81,
+	0x33, 0xda, 0x4f, 0xce, 0xa6, 0xc0, 0x59, 0xb7, 0x79, 0x96, 0x01, 0x7f, 0x2f, 0xd7, 0x33, 0x6b,
+	0xab, 0x45, 0xfb, 0x49, 0xab, 0x35, 0x45, 0x5a, 0xad, 0x6e, 0xb3, 0xd5, 0xca, 0xa0, 0x9f, 0x6f,
+	0xa7, 0xdd, 0x35, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xcf, 0x6b, 0x07, 0xa5, 0x08, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/user_list_error.pb.go b/googleapis/ads/googleads/v3/errors/user_list_error.pb.go
new file mode 100644
index 0000000..c6feb4d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/user_list_error.pb.go
@@ -0,0 +1,254 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/user_list_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing possible user list errors.
+type UserListErrorEnum_UserListError int32
+
+const (
+	// Enum unspecified.
+	UserListErrorEnum_UNSPECIFIED UserListErrorEnum_UserListError = 0
+	// The received error code is not known in this version.
+	UserListErrorEnum_UNKNOWN UserListErrorEnum_UserListError = 1
+	// Creating and updating external remarketing user lists is not supported.
+	UserListErrorEnum_EXTERNAL_REMARKETING_USER_LIST_MUTATE_NOT_SUPPORTED UserListErrorEnum_UserListError = 2
+	// Concrete type of user list is required.
+	UserListErrorEnum_CONCRETE_TYPE_REQUIRED UserListErrorEnum_UserListError = 3
+	// Creating/updating user list conversion types requires specifying the
+	// conversion type Id.
+	UserListErrorEnum_CONVERSION_TYPE_ID_REQUIRED UserListErrorEnum_UserListError = 4
+	// Remarketing user list cannot have duplicate conversion types.
+	UserListErrorEnum_DUPLICATE_CONVERSION_TYPES UserListErrorEnum_UserListError = 5
+	// Conversion type is invalid/unknown.
+	UserListErrorEnum_INVALID_CONVERSION_TYPE UserListErrorEnum_UserListError = 6
+	// User list description is empty or invalid.
+	UserListErrorEnum_INVALID_DESCRIPTION UserListErrorEnum_UserListError = 7
+	// User list name is empty or invalid.
+	UserListErrorEnum_INVALID_NAME UserListErrorEnum_UserListError = 8
+	// Type of the UserList does not match.
+	UserListErrorEnum_INVALID_TYPE UserListErrorEnum_UserListError = 9
+	// Embedded logical user lists are not allowed.
+	UserListErrorEnum_CAN_NOT_ADD_LOGICAL_LIST_AS_LOGICAL_LIST_OPERAND UserListErrorEnum_UserListError = 10
+	// User list rule operand is invalid.
+	UserListErrorEnum_INVALID_USER_LIST_LOGICAL_RULE_OPERAND UserListErrorEnum_UserListError = 11
+	// Name is already being used for another user list for the account.
+	UserListErrorEnum_NAME_ALREADY_USED UserListErrorEnum_UserListError = 12
+	// Name is required when creating a new conversion type.
+	UserListErrorEnum_NEW_CONVERSION_TYPE_NAME_REQUIRED UserListErrorEnum_UserListError = 13
+	// The given conversion type name has been used.
+	UserListErrorEnum_CONVERSION_TYPE_NAME_ALREADY_USED UserListErrorEnum_UserListError = 14
+	// Only an owner account may edit a user list.
+	UserListErrorEnum_OWNERSHIP_REQUIRED_FOR_SET UserListErrorEnum_UserListError = 15
+	// Creating user list without setting type in oneof user_list field, or
+	// creating/updating read-only user list types is not allowed.
+	UserListErrorEnum_USER_LIST_MUTATE_NOT_SUPPORTED UserListErrorEnum_UserListError = 16
+	// Rule is invalid.
+	UserListErrorEnum_INVALID_RULE UserListErrorEnum_UserListError = 17
+	// The specified date range is empty.
+	UserListErrorEnum_INVALID_DATE_RANGE UserListErrorEnum_UserListError = 27
+	// A UserList which is privacy sensitive or legal rejected cannot be mutated
+	// by external users.
+	UserListErrorEnum_CAN_NOT_MUTATE_SENSITIVE_USERLIST UserListErrorEnum_UserListError = 28
+	// Maximum number of rulebased user lists a customer can have.
+	UserListErrorEnum_MAX_NUM_RULEBASED_USERLISTS UserListErrorEnum_UserListError = 29
+	// BasicUserList's billable record field cannot be modified once it is set.
+	UserListErrorEnum_CANNOT_MODIFY_BILLABLE_RECORD_COUNT UserListErrorEnum_UserListError = 30
+	// crm_based_user_list.app_id field must be set when upload_key_type is
+	// MOBILE_ADVERTISING_ID.
+	UserListErrorEnum_APP_ID_NOT_SET UserListErrorEnum_UserListError = 31
+	// Name of the user list is reserved for system generated lists and cannot
+	// be used.
+	UserListErrorEnum_USERLIST_NAME_IS_RESERVED_FOR_SYSTEM_LIST UserListErrorEnum_UserListError = 32
+	// Advertiser needs to be whitelisted to use remarketing lists created from
+	// advertiser uploaded data (e.g., Customer Match lists).
+	UserListErrorEnum_ADVERTISER_NOT_WHITELISTED_FOR_USING_UPLOADED_DATA UserListErrorEnum_UserListError = 33
+	// The provided rule_type is not supported for the user list.
+	UserListErrorEnum_RULE_TYPE_IS_NOT_SUPPORTED UserListErrorEnum_UserListError = 34
+	// Similar user list cannot be used as a logical user list operand.
+	UserListErrorEnum_CAN_NOT_ADD_A_SIMILAR_USERLIST_AS_LOGICAL_LIST_OPERAND UserListErrorEnum_UserListError = 35
+	// Logical user list should not have a mix of CRM based user list and other
+	// types of lists in its rules.
+	UserListErrorEnum_CAN_NOT_MIX_CRM_BASED_IN_LOGICAL_LIST_WITH_OTHER_LISTS UserListErrorEnum_UserListError = 36
+)
+
+var UserListErrorEnum_UserListError_name = map[int32]string{
+	0:  "UNSPECIFIED",
+	1:  "UNKNOWN",
+	2:  "EXTERNAL_REMARKETING_USER_LIST_MUTATE_NOT_SUPPORTED",
+	3:  "CONCRETE_TYPE_REQUIRED",
+	4:  "CONVERSION_TYPE_ID_REQUIRED",
+	5:  "DUPLICATE_CONVERSION_TYPES",
+	6:  "INVALID_CONVERSION_TYPE",
+	7:  "INVALID_DESCRIPTION",
+	8:  "INVALID_NAME",
+	9:  "INVALID_TYPE",
+	10: "CAN_NOT_ADD_LOGICAL_LIST_AS_LOGICAL_LIST_OPERAND",
+	11: "INVALID_USER_LIST_LOGICAL_RULE_OPERAND",
+	12: "NAME_ALREADY_USED",
+	13: "NEW_CONVERSION_TYPE_NAME_REQUIRED",
+	14: "CONVERSION_TYPE_NAME_ALREADY_USED",
+	15: "OWNERSHIP_REQUIRED_FOR_SET",
+	16: "USER_LIST_MUTATE_NOT_SUPPORTED",
+	17: "INVALID_RULE",
+	27: "INVALID_DATE_RANGE",
+	28: "CAN_NOT_MUTATE_SENSITIVE_USERLIST",
+	29: "MAX_NUM_RULEBASED_USERLISTS",
+	30: "CANNOT_MODIFY_BILLABLE_RECORD_COUNT",
+	31: "APP_ID_NOT_SET",
+	32: "USERLIST_NAME_IS_RESERVED_FOR_SYSTEM_LIST",
+	33: "ADVERTISER_NOT_WHITELISTED_FOR_USING_UPLOADED_DATA",
+	34: "RULE_TYPE_IS_NOT_SUPPORTED",
+	35: "CAN_NOT_ADD_A_SIMILAR_USERLIST_AS_LOGICAL_LIST_OPERAND",
+	36: "CAN_NOT_MIX_CRM_BASED_IN_LOGICAL_LIST_WITH_OTHER_LISTS",
+}
+
+var UserListErrorEnum_UserListError_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"EXTERNAL_REMARKETING_USER_LIST_MUTATE_NOT_SUPPORTED":    2,
+	"CONCRETE_TYPE_REQUIRED":                                 3,
+	"CONVERSION_TYPE_ID_REQUIRED":                            4,
+	"DUPLICATE_CONVERSION_TYPES":                             5,
+	"INVALID_CONVERSION_TYPE":                                6,
+	"INVALID_DESCRIPTION":                                    7,
+	"INVALID_NAME":                                           8,
+	"INVALID_TYPE":                                           9,
+	"CAN_NOT_ADD_LOGICAL_LIST_AS_LOGICAL_LIST_OPERAND":       10,
+	"INVALID_USER_LIST_LOGICAL_RULE_OPERAND":                 11,
+	"NAME_ALREADY_USED":                                      12,
+	"NEW_CONVERSION_TYPE_NAME_REQUIRED":                      13,
+	"CONVERSION_TYPE_NAME_ALREADY_USED":                      14,
+	"OWNERSHIP_REQUIRED_FOR_SET":                             15,
+	"USER_LIST_MUTATE_NOT_SUPPORTED":                         16,
+	"INVALID_RULE":                                           17,
+	"INVALID_DATE_RANGE":                                     27,
+	"CAN_NOT_MUTATE_SENSITIVE_USERLIST":                      28,
+	"MAX_NUM_RULEBASED_USERLISTS":                            29,
+	"CANNOT_MODIFY_BILLABLE_RECORD_COUNT":                    30,
+	"APP_ID_NOT_SET":                                         31,
+	"USERLIST_NAME_IS_RESERVED_FOR_SYSTEM_LIST":              32,
+	"ADVERTISER_NOT_WHITELISTED_FOR_USING_UPLOADED_DATA":     33,
+	"RULE_TYPE_IS_NOT_SUPPORTED":                             34,
+	"CAN_NOT_ADD_A_SIMILAR_USERLIST_AS_LOGICAL_LIST_OPERAND": 35,
+	"CAN_NOT_MIX_CRM_BASED_IN_LOGICAL_LIST_WITH_OTHER_LISTS": 36,
+}
+
+func (x UserListErrorEnum_UserListError) String() string {
+	return proto.EnumName(UserListErrorEnum_UserListError_name, int32(x))
+}
+
+func (UserListErrorEnum_UserListError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_94d23c47a73d2df0, []int{0, 0}
+}
+
+// Container for enum describing possible user list errors.
+type UserListErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UserListErrorEnum) Reset()         { *m = UserListErrorEnum{} }
+func (m *UserListErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*UserListErrorEnum) ProtoMessage()    {}
+func (*UserListErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_94d23c47a73d2df0, []int{0}
+}
+
+func (m *UserListErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListErrorEnum.Unmarshal(m, b)
+}
+func (m *UserListErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *UserListErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListErrorEnum.Merge(m, src)
+}
+func (m *UserListErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_UserListErrorEnum.Size(m)
+}
+func (m *UserListErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.UserListErrorEnum_UserListError", UserListErrorEnum_UserListError_name, UserListErrorEnum_UserListError_value)
+	proto.RegisterType((*UserListErrorEnum)(nil), "google.ads.googleads.v3.errors.UserListErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/user_list_error.proto", fileDescriptor_94d23c47a73d2df0)
+}
+
+var fileDescriptor_94d23c47a73d2df0 = []byte{
+	// 741 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x54, 0xed, 0x6e, 0x23, 0x35,
+	0x14, 0xa5, 0x59, 0xd8, 0x80, 0xbb, 0x1f, 0xae, 0x11, 0xbb, 0x52, 0xbb, 0x64, 0xd9, 0x2c, 0x1f,
+	0x02, 0x89, 0x09, 0x22, 0x55, 0x91, 0x86, 0x5f, 0xce, 0xf8, 0x36, 0xb1, 0x3a, 0xe3, 0x19, 0x6c,
+	0xcf, 0xa4, 0x41, 0x91, 0xac, 0x40, 0xa2, 0x28, 0x52, 0x9b, 0xa9, 0x32, 0x69, 0x1f, 0x88, 0x9f,
+	0x3c, 0x0a, 0x0f, 0xc0, 0x43, 0x20, 0x78, 0x07, 0x64, 0x4f, 0x66, 0x9a, 0x44, 0x94, 0xfd, 0x15,
+	0xc7, 0xf7, 0x9c, 0xe3, 0x7b, 0xcf, 0xbd, 0x73, 0xd1, 0xe9, 0x3c, 0xcf, 0xe7, 0x57, 0xb3, 0xce,
+	0x64, 0x5a, 0x74, 0xca, 0xa3, 0x3d, 0xdd, 0x75, 0x3b, 0xb3, 0xd5, 0x2a, 0x5f, 0x15, 0x9d, 0xdb,
+	0x62, 0xb6, 0x32, 0x57, 0x8b, 0x62, 0x6d, 0xdc, 0x85, 0x77, 0xb3, 0xca, 0xd7, 0x39, 0x69, 0x95,
+	0x50, 0x6f, 0x32, 0x2d, 0xbc, 0x9a, 0xe5, 0xdd, 0x75, 0xbd, 0x92, 0x75, 0xfc, 0xaa, 0x52, 0xbd,
+	0x59, 0x74, 0x26, 0xcb, 0x65, 0xbe, 0x9e, 0xac, 0x17, 0xf9, 0xb2, 0x28, 0xd9, 0xed, 0xbf, 0x9b,
+	0xe8, 0x28, 0x2d, 0x66, 0xab, 0x70, 0x51, 0xac, 0xc1, 0x12, 0x60, 0x79, 0x7b, 0xdd, 0xfe, 0xb3,
+	0x89, 0x9e, 0xee, 0xdc, 0x92, 0xe7, 0xe8, 0x30, 0x15, 0x2a, 0x81, 0x80, 0x9f, 0x73, 0x60, 0xf8,
+	0x3d, 0x72, 0x88, 0x9a, 0xa9, 0xb8, 0x10, 0xf1, 0x50, 0xe0, 0x03, 0xf2, 0x03, 0xea, 0xc2, 0xa5,
+	0x06, 0x29, 0x68, 0x68, 0x24, 0x44, 0x54, 0x5e, 0x80, 0xe6, 0xa2, 0x6f, 0x52, 0x05, 0xd2, 0x84,
+	0x5c, 0x69, 0x13, 0xa5, 0x9a, 0x6a, 0x30, 0x22, 0xd6, 0x46, 0xa5, 0x49, 0x12, 0x4b, 0x0d, 0x0c,
+	0x37, 0xc8, 0x31, 0x7a, 0x11, 0xc4, 0x22, 0x90, 0xa0, 0xc1, 0xe8, 0x51, 0x02, 0x46, 0xc2, 0x4f,
+	0x29, 0x97, 0xc0, 0xf0, 0x23, 0xf2, 0x1a, 0x9d, 0x04, 0xb1, 0xc8, 0x40, 0x2a, 0x1e, 0x8b, 0x32,
+	0xca, 0xd9, 0x3d, 0xe0, 0x7d, 0xd2, 0x42, 0xc7, 0x2c, 0x4d, 0x42, 0x1e, 0x58, 0xe5, 0x3d, 0xa8,
+	0xc2, 0x1f, 0x90, 0x13, 0xf4, 0x92, 0x8b, 0x8c, 0x86, 0x9c, 0xed, 0x47, 0xf1, 0x63, 0xf2, 0x12,
+	0x7d, 0x5c, 0x05, 0x19, 0xa8, 0x40, 0xf2, 0x44, 0xf3, 0x58, 0xe0, 0x26, 0xc1, 0xe8, 0x49, 0x15,
+	0x10, 0x34, 0x02, 0xfc, 0xe1, 0xf6, 0x8d, 0x23, 0x7f, 0x44, 0x4e, 0xd1, 0x77, 0x01, 0x15, 0xae,
+	0x1a, 0xca, 0x98, 0x09, 0xe3, 0x3e, 0x0f, 0x68, 0x58, 0x56, 0x4a, 0xd5, 0xee, 0xff, 0x38, 0x01,
+	0x49, 0x05, 0xc3, 0x88, 0x7c, 0x83, 0xbe, 0xac, 0x74, 0xee, 0x8d, 0xa9, 0xb0, 0x32, 0x0d, 0xa1,
+	0xc6, 0x1e, 0x92, 0x4f, 0xd0, 0x91, 0x7d, 0xdd, 0xd0, 0x50, 0x02, 0x65, 0x23, 0x4b, 0x60, 0xf8,
+	0x09, 0xf9, 0x02, 0xbd, 0x11, 0x30, 0xdc, 0x2f, 0xc7, 0x25, 0x7a, 0xef, 0xcc, 0x53, 0x0b, 0xfb,
+	0x4f, 0xc8, 0x8e, 0xda, 0x33, 0x6b, 0x60, 0x3c, 0x14, 0x20, 0xd5, 0x80, 0x27, 0x35, 0xdd, 0x9c,
+	0xc7, 0xd2, 0x28, 0xd0, 0xf8, 0x39, 0x69, 0xa3, 0xd6, 0x3b, 0x3a, 0x88, 0xb7, 0xcd, 0xb1, 0x25,
+	0xe0, 0x23, 0xf2, 0x02, 0x91, 0xda, 0x59, 0xcb, 0x90, 0x54, 0xf4, 0x01, 0x9f, 0xb8, 0xa4, 0x36,
+	0xa6, 0x6d, 0xb4, 0x14, 0x08, 0xc5, 0x35, 0xcf, 0xc0, 0xf9, 0x61, 0x5f, 0xc1, 0xaf, 0x6c, 0xdb,
+	0x23, 0x7a, 0x69, 0x44, 0x1a, 0x39, 0xc1, 0x1e, 0x55, 0xc0, 0xea, 0xb8, 0xc2, 0x9f, 0x92, 0xaf,
+	0xd0, 0xdb, 0x80, 0x0a, 0x27, 0x13, 0x33, 0x7e, 0x3e, 0x32, 0x3d, 0x1e, 0x86, 0xb4, 0x17, 0x5a,
+	0x07, 0x82, 0x58, 0xda, 0x66, 0xa7, 0x42, 0xe3, 0x16, 0x21, 0xe8, 0x19, 0x4d, 0x12, 0x3b, 0x34,
+	0x2e, 0x69, 0xd0, 0xf8, 0x35, 0xf9, 0x16, 0x7d, 0x5d, 0x69, 0x95, 0x96, 0x70, 0x65, 0x24, 0x28,
+	0x90, 0x59, 0x55, 0xf9, 0x48, 0x69, 0x88, 0x5c, 0xc9, 0xf8, 0x33, 0x72, 0x86, 0xbe, 0xa7, 0x2c,
+	0x03, 0xa9, 0xb9, 0xf5, 0xc1, 0xca, 0x0c, 0x07, 0x5c, 0x83, 0x8d, 0x6e, 0xf0, 0xa9, 0x72, 0x83,
+	0x9e, 0x84, 0x31, 0x65, 0xe0, 0x2a, 0xa6, 0xf8, 0x8d, 0x75, 0xd6, 0x35, 0xb4, 0x9c, 0x5a, 0xb5,
+	0xe7, 0x5a, 0x9b, 0xf8, 0xe8, 0x6c, 0x7b, 0x80, 0xa8, 0x51, 0x3c, 0xe2, 0x21, 0x95, 0x75, 0xa1,
+	0x0f, 0x8e, 0xd1, 0xdb, 0x6d, 0x6e, 0xc4, 0x2f, 0x4d, 0x20, 0x23, 0x53, 0x9a, 0xc4, 0xc5, 0x2e,
+	0x65, 0xc8, 0xf5, 0xc0, 0xc4, 0x7a, 0xb0, 0xe9, 0xa0, 0xc2, 0x9f, 0xf7, 0xfe, 0x39, 0x40, 0xed,
+	0x5f, 0xf3, 0x6b, 0xef, 0xff, 0x77, 0x46, 0x8f, 0xec, 0x7c, 0xfc, 0x89, 0xdd, 0x14, 0xc9, 0xc1,
+	0xcf, 0x6c, 0xc3, 0x9a, 0xe7, 0x57, 0x93, 0xe5, 0xdc, 0xcb, 0x57, 0xf3, 0xce, 0x7c, 0xb6, 0x74,
+	0x7b, 0xa4, 0xda, 0x57, 0x37, 0x8b, 0xe2, 0xa1, 0xf5, 0xf5, 0x63, 0xf9, 0xf3, 0x5b, 0xe3, 0x51,
+	0x9f, 0xd2, 0xdf, 0x1b, 0xad, 0x7e, 0x29, 0x46, 0xa7, 0x85, 0x57, 0x1e, 0xed, 0x29, 0xeb, 0x7a,
+	0xee, 0xc9, 0xe2, 0x8f, 0x0a, 0x30, 0xa6, 0xd3, 0x62, 0x5c, 0x03, 0xc6, 0x59, 0x77, 0x5c, 0x02,
+	0xfe, 0x6a, 0xb4, 0xcb, 0x5b, 0xdf, 0xa7, 0xd3, 0xc2, 0xf7, 0x6b, 0x88, 0xef, 0x67, 0x5d, 0xdf,
+	0x2f, 0x41, 0xbf, 0x3c, 0x76, 0xd9, 0x75, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x4c, 0x0e,
+	0x3e, 0x5b, 0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/errors/youtube_video_registration_error.pb.go b/googleapis/ads/googleads/v3/errors/youtube_video_registration_error.pb.go
new file mode 100644
index 0000000..3a2933f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/errors/youtube_video_registration_error.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/errors/youtube_video_registration_error.proto
+
+package errors
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Enum describing YouTube video registration errors.
+type YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError int32
+
+const (
+	// Enum unspecified.
+	YoutubeVideoRegistrationErrorEnum_UNSPECIFIED YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError = 0
+	// The received error code is not known in this version.
+	YoutubeVideoRegistrationErrorEnum_UNKNOWN YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError = 1
+	// Video to be registered wasn't found.
+	YoutubeVideoRegistrationErrorEnum_VIDEO_NOT_FOUND YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError = 2
+	// Video to be registered is not accessible (e.g. private).
+	YoutubeVideoRegistrationErrorEnum_VIDEO_NOT_ACCESSIBLE YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError = 3
+	// Video to be registered is not eligible (e.g. mature content).
+	YoutubeVideoRegistrationErrorEnum_VIDEO_NOT_ELIGIBLE YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError = 4
+)
+
+var YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "VIDEO_NOT_FOUND",
+	3: "VIDEO_NOT_ACCESSIBLE",
+	4: "VIDEO_NOT_ELIGIBLE",
+}
+
+var YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError_value = map[string]int32{
+	"UNSPECIFIED":          0,
+	"UNKNOWN":              1,
+	"VIDEO_NOT_FOUND":      2,
+	"VIDEO_NOT_ACCESSIBLE": 3,
+	"VIDEO_NOT_ELIGIBLE":   4,
+}
+
+func (x YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError) String() string {
+	return proto.EnumName(YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError_name, int32(x))
+}
+
+func (YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_37f72673454cf2d4, []int{0, 0}
+}
+
+// Container for enum describing YouTube video registration errors.
+type YoutubeVideoRegistrationErrorEnum struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *YoutubeVideoRegistrationErrorEnum) Reset()         { *m = YoutubeVideoRegistrationErrorEnum{} }
+func (m *YoutubeVideoRegistrationErrorEnum) String() string { return proto.CompactTextString(m) }
+func (*YoutubeVideoRegistrationErrorEnum) ProtoMessage()    {}
+func (*YoutubeVideoRegistrationErrorEnum) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37f72673454cf2d4, []int{0}
+}
+
+func (m *YoutubeVideoRegistrationErrorEnum) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_YoutubeVideoRegistrationErrorEnum.Unmarshal(m, b)
+}
+func (m *YoutubeVideoRegistrationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_YoutubeVideoRegistrationErrorEnum.Marshal(b, m, deterministic)
+}
+func (m *YoutubeVideoRegistrationErrorEnum) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_YoutubeVideoRegistrationErrorEnum.Merge(m, src)
+}
+func (m *YoutubeVideoRegistrationErrorEnum) XXX_Size() int {
+	return xxx_messageInfo_YoutubeVideoRegistrationErrorEnum.Size(m)
+}
+func (m *YoutubeVideoRegistrationErrorEnum) XXX_DiscardUnknown() {
+	xxx_messageInfo_YoutubeVideoRegistrationErrorEnum.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_YoutubeVideoRegistrationErrorEnum proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.errors.YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError", YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError_name, YoutubeVideoRegistrationErrorEnum_YoutubeVideoRegistrationError_value)
+	proto.RegisterType((*YoutubeVideoRegistrationErrorEnum)(nil), "google.ads.googleads.v3.errors.YoutubeVideoRegistrationErrorEnum")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/errors/youtube_video_registration_error.proto", fileDescriptor_37f72673454cf2d4)
+}
+
+var fileDescriptor_37f72673454cf2d4 = []byte{
+	// 344 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xc1, 0x4a, 0xc3, 0x40,
+	0x10, 0x86, 0x4d, 0x2a, 0x0a, 0xdb, 0x43, 0xc3, 0x2a, 0x22, 0xa2, 0x05, 0xf3, 0x00, 0x9b, 0x43,
+	0x6e, 0xeb, 0x29, 0x6d, 0xb6, 0x25, 0x58, 0x92, 0x62, 0x6d, 0x44, 0x09, 0x84, 0xd4, 0x84, 0x25,
+	0xd0, 0x66, 0xca, 0x6e, 0x5a, 0xf0, 0xee, 0x93, 0x78, 0xec, 0xa3, 0xf8, 0x28, 0xbe, 0x83, 0x20,
+	0xd9, 0xb5, 0xad, 0x17, 0x7b, 0xca, 0xcf, 0xe4, 0x9b, 0xff, 0x9f, 0xd9, 0x41, 0x8c, 0x03, 0xf0,
+	0x79, 0xe1, 0x64, 0xb9, 0x74, 0xb4, 0x6c, 0xd4, 0xda, 0x75, 0x0a, 0x21, 0x40, 0x48, 0xe7, 0x0d,
+	0x56, 0xf5, 0x6a, 0x56, 0xa4, 0xeb, 0x32, 0x2f, 0x20, 0x15, 0x05, 0x2f, 0x65, 0x2d, 0xb2, 0xba,
+	0x84, 0x2a, 0x55, 0x04, 0x59, 0x0a, 0xa8, 0x01, 0x77, 0x75, 0x2f, 0xc9, 0x72, 0x49, 0x76, 0x36,
+	0x64, 0xed, 0x12, 0x6d, 0x73, 0x75, 0xbd, 0x8d, 0x59, 0x96, 0x4e, 0x56, 0x55, 0x50, 0x2b, 0x0b,
+	0xa9, 0xbb, 0xed, 0x8d, 0x81, 0x6e, 0x9f, 0x75, 0x50, 0xdc, 0xe4, 0x3c, 0xfc, 0x89, 0x61, 0x8d,
+	0x01, 0xab, 0x56, 0x0b, 0xfb, 0xdd, 0x40, 0x37, 0x07, 0x29, 0xdc, 0x41, 0xed, 0x69, 0x38, 0x19,
+	0xb3, 0x7e, 0x30, 0x08, 0x98, 0x6f, 0x1d, 0xe1, 0x36, 0x3a, 0x9d, 0x86, 0xf7, 0x61, 0xf4, 0x14,
+	0x5a, 0x06, 0x3e, 0x43, 0x9d, 0x38, 0xf0, 0x59, 0x94, 0x86, 0xd1, 0x63, 0x3a, 0x88, 0xa6, 0xa1,
+	0x6f, 0x99, 0xf8, 0x12, 0x9d, 0xef, 0x8b, 0x5e, 0xbf, 0xcf, 0x26, 0x93, 0xa0, 0x37, 0x62, 0x56,
+	0x0b, 0x5f, 0x20, 0xbc, 0xff, 0xc3, 0x46, 0xc1, 0x50, 0xd5, 0x8f, 0x7b, 0xdf, 0x06, 0xb2, 0x5f,
+	0x61, 0x41, 0x0e, 0x6f, 0xdc, 0xb3, 0x0f, 0x8e, 0x3a, 0x6e, 0xf6, 0x1e, 0x1b, 0x2f, 0xfe, 0xaf,
+	0x0b, 0x87, 0x79, 0x56, 0x71, 0x02, 0x82, 0x3b, 0xbc, 0xa8, 0xd4, 0xab, 0x6c, 0xcf, 0xb1, 0x2c,
+	0xe5, 0x7f, 0xd7, 0xb9, 0xd3, 0x9f, 0x0f, 0xb3, 0x35, 0xf4, 0xbc, 0x8d, 0xd9, 0x1d, 0x6a, 0x33,
+	0x2f, 0x97, 0x44, 0xcb, 0x46, 0xc5, 0x2e, 0x51, 0x91, 0xf2, 0x73, 0x0b, 0x24, 0x5e, 0x2e, 0x93,
+	0x1d, 0x90, 0xc4, 0x6e, 0xa2, 0x81, 0x2f, 0xd3, 0xd6, 0x55, 0x4a, 0xbd, 0x5c, 0x52, 0xba, 0x43,
+	0x28, 0x8d, 0x5d, 0x4a, 0x35, 0x34, 0x3b, 0x51, 0xd3, 0xb9, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0xf2, 0xe2, 0x8c, 0xd1, 0x3a, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/account_budget.pb.go b/googleapis/ads/googleads/v3/resources/account_budget.pb.go
new file mode 100644
index 0000000..f085eb0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/account_budget.pb.go
@@ -0,0 +1,724 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/account_budget.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An account-level budget. It contains information about the budget itself,
+// as well as the most recently approved changes to the budget and proposed
+// changes that are pending approval. The proposed changes that are pending
+// approval, if any, are found in 'pending_proposal'.  Effective details about
+// the budget are found in fields prefixed 'approved_', 'adjusted_' and those
+// without a prefix.  Since some effective details may differ from what the user
+// had originally requested (e.g. spending limit), these differences are
+// juxtaposed via 'proposed_', 'approved_', and possibly 'adjusted_' fields.
+//
+// This resource is mutated using AccountBudgetProposal and cannot be mutated
+// directly. A budget may have at most one pending proposal at any given time.
+// It is read through pending_proposal.
+//
+// Once approved, a budget may be subject to adjustments, such as credit
+// adjustments.  Adjustments create differences between the 'approved' and
+// 'adjusted' fields, which would otherwise be identical.
+type AccountBudget struct {
+	// The resource name of the account-level budget.
+	// AccountBudget resource names have the form:
+	//
+	// `customers/{customer_id}/accountBudgets/{account_budget_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the account-level budget.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The resource name of the billing setup associated with this account-level
+	// budget.  BillingSetup resource names have the form:
+	//
+	// `customers/{customer_id}/billingSetups/{billing_setup_id}`
+	BillingSetup *wrappers.StringValue `protobuf:"bytes,3,opt,name=billing_setup,json=billingSetup,proto3" json:"billing_setup,omitempty"`
+	// The status of this account-level budget.
+	Status enums.AccountBudgetStatusEnum_AccountBudgetStatus `protobuf:"varint,4,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.AccountBudgetStatusEnum_AccountBudgetStatus" json:"status,omitempty"`
+	// The name of the account-level budget.
+	Name *wrappers.StringValue `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
+	// The proposed start time of the account-level budget in
+	// yyyy-MM-dd HH:mm:ss format.  If a start time type of NOW was proposed,
+	// this is the time of request.
+	ProposedStartDateTime *wrappers.StringValue `protobuf:"bytes,6,opt,name=proposed_start_date_time,json=proposedStartDateTime,proto3" json:"proposed_start_date_time,omitempty"`
+	// The approved start time of the account-level budget in yyyy-MM-dd HH:mm:ss
+	// format.
+	//
+	// For example, if a new budget is approved after the proposed start time,
+	// the approved start time is the time of approval.
+	ApprovedStartDateTime *wrappers.StringValue `protobuf:"bytes,7,opt,name=approved_start_date_time,json=approvedStartDateTime,proto3" json:"approved_start_date_time,omitempty"`
+	// The total adjustments amount.
+	//
+	// An example of an adjustment is courtesy credits.
+	TotalAdjustmentsMicros *wrappers.Int64Value `protobuf:"bytes,18,opt,name=total_adjustments_micros,json=totalAdjustmentsMicros,proto3" json:"total_adjustments_micros,omitempty"`
+	// The value of Ads that have been served, in micros.
+	//
+	// This includes overdelivery costs, in which case a credit might be
+	// automatically applied to the budget (see total_adjustments_micros).
+	AmountServedMicros *wrappers.Int64Value `protobuf:"bytes,19,opt,name=amount_served_micros,json=amountServedMicros,proto3" json:"amount_served_micros,omitempty"`
+	// A purchase order number is a value that helps users reference this budget
+	// in their monthly invoices.
+	PurchaseOrderNumber *wrappers.StringValue `protobuf:"bytes,20,opt,name=purchase_order_number,json=purchaseOrderNumber,proto3" json:"purchase_order_number,omitempty"`
+	// Notes associated with the budget.
+	Notes *wrappers.StringValue `protobuf:"bytes,21,opt,name=notes,proto3" json:"notes,omitempty"`
+	// The pending proposal to modify this budget, if applicable.
+	PendingProposal *AccountBudget_PendingAccountBudgetProposal `protobuf:"bytes,22,opt,name=pending_proposal,json=pendingProposal,proto3" json:"pending_proposal,omitempty"`
+	// The proposed end time of the account-level budget.
+	//
+	// Types that are valid to be assigned to ProposedEndTime:
+	//	*AccountBudget_ProposedEndDateTime
+	//	*AccountBudget_ProposedEndTimeType
+	ProposedEndTime isAccountBudget_ProposedEndTime `protobuf_oneof:"proposed_end_time"`
+	// The approved end time of the account-level budget.
+	//
+	// For example, if a budget's end time is updated and the proposal is approved
+	// after the proposed end time, the approved end time is the time of approval.
+	//
+	// Types that are valid to be assigned to ApprovedEndTime:
+	//	*AccountBudget_ApprovedEndDateTime
+	//	*AccountBudget_ApprovedEndTimeType
+	ApprovedEndTime isAccountBudget_ApprovedEndTime `protobuf_oneof:"approved_end_time"`
+	// The proposed spending limit.
+	//
+	// Types that are valid to be assigned to ProposedSpendingLimit:
+	//	*AccountBudget_ProposedSpendingLimitMicros
+	//	*AccountBudget_ProposedSpendingLimitType
+	ProposedSpendingLimit isAccountBudget_ProposedSpendingLimit `protobuf_oneof:"proposed_spending_limit"`
+	// The approved spending limit.
+	//
+	// For example, if the amount already spent by the account exceeds the
+	// proposed spending limit at the time the proposal is approved, the approved
+	// spending limit is set to the amount already spent.
+	//
+	// Types that are valid to be assigned to ApprovedSpendingLimit:
+	//	*AccountBudget_ApprovedSpendingLimitMicros
+	//	*AccountBudget_ApprovedSpendingLimitType
+	ApprovedSpendingLimit isAccountBudget_ApprovedSpendingLimit `protobuf_oneof:"approved_spending_limit"`
+	// The spending limit after adjustments have been applied.  Adjustments are
+	// stored in total_adjustments_micros.
+	//
+	// This value has the final say on how much the account is allowed to spend.
+	//
+	// Types that are valid to be assigned to AdjustedSpendingLimit:
+	//	*AccountBudget_AdjustedSpendingLimitMicros
+	//	*AccountBudget_AdjustedSpendingLimitType
+	AdjustedSpendingLimit isAccountBudget_AdjustedSpendingLimit `protobuf_oneof:"adjusted_spending_limit"`
+	XXX_NoUnkeyedLiteral  struct{}                              `json:"-"`
+	XXX_unrecognized      []byte                                `json:"-"`
+	XXX_sizecache         int32                                 `json:"-"`
+}
+
+func (m *AccountBudget) Reset()         { *m = AccountBudget{} }
+func (m *AccountBudget) String() string { return proto.CompactTextString(m) }
+func (*AccountBudget) ProtoMessage()    {}
+func (*AccountBudget) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b0ff171752da1201, []int{0}
+}
+
+func (m *AccountBudget) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccountBudget.Unmarshal(m, b)
+}
+func (m *AccountBudget) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccountBudget.Marshal(b, m, deterministic)
+}
+func (m *AccountBudget) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccountBudget.Merge(m, src)
+}
+func (m *AccountBudget) XXX_Size() int {
+	return xxx_messageInfo_AccountBudget.Size(m)
+}
+func (m *AccountBudget) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccountBudget.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccountBudget proto.InternalMessageInfo
+
+func (m *AccountBudget) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AccountBudget) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetBillingSetup() *wrappers.StringValue {
+	if m != nil {
+		return m.BillingSetup
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetStatus() enums.AccountBudgetStatusEnum_AccountBudgetStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.AccountBudgetStatusEnum_UNSPECIFIED
+}
+
+func (m *AccountBudget) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetProposedStartDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ProposedStartDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetApprovedStartDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ApprovedStartDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetTotalAdjustmentsMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TotalAdjustmentsMicros
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetAmountServedMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.AmountServedMicros
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetPurchaseOrderNumber() *wrappers.StringValue {
+	if m != nil {
+		return m.PurchaseOrderNumber
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetNotes() *wrappers.StringValue {
+	if m != nil {
+		return m.Notes
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetPendingProposal() *AccountBudget_PendingAccountBudgetProposal {
+	if m != nil {
+		return m.PendingProposal
+	}
+	return nil
+}
+
+type isAccountBudget_ProposedEndTime interface {
+	isAccountBudget_ProposedEndTime()
+}
+
+type AccountBudget_ProposedEndDateTime struct {
+	ProposedEndDateTime *wrappers.StringValue `protobuf:"bytes,8,opt,name=proposed_end_date_time,json=proposedEndDateTime,proto3,oneof"`
+}
+
+type AccountBudget_ProposedEndTimeType struct {
+	ProposedEndTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,9,opt,name=proposed_end_time_type,json=proposedEndTimeType,proto3,enum=google.ads.googleads.v3.enums.TimeTypeEnum_TimeType,oneof"`
+}
+
+func (*AccountBudget_ProposedEndDateTime) isAccountBudget_ProposedEndTime() {}
+
+func (*AccountBudget_ProposedEndTimeType) isAccountBudget_ProposedEndTime() {}
+
+func (m *AccountBudget) GetProposedEndTime() isAccountBudget_ProposedEndTime {
+	if m != nil {
+		return m.ProposedEndTime
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetProposedEndDateTime() *wrappers.StringValue {
+	if x, ok := m.GetProposedEndTime().(*AccountBudget_ProposedEndDateTime); ok {
+		return x.ProposedEndDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetProposedEndTimeType() enums.TimeTypeEnum_TimeType {
+	if x, ok := m.GetProposedEndTime().(*AccountBudget_ProposedEndTimeType); ok {
+		return x.ProposedEndTimeType
+	}
+	return enums.TimeTypeEnum_UNSPECIFIED
+}
+
+type isAccountBudget_ApprovedEndTime interface {
+	isAccountBudget_ApprovedEndTime()
+}
+
+type AccountBudget_ApprovedEndDateTime struct {
+	ApprovedEndDateTime *wrappers.StringValue `protobuf:"bytes,10,opt,name=approved_end_date_time,json=approvedEndDateTime,proto3,oneof"`
+}
+
+type AccountBudget_ApprovedEndTimeType struct {
+	ApprovedEndTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,11,opt,name=approved_end_time_type,json=approvedEndTimeType,proto3,enum=google.ads.googleads.v3.enums.TimeTypeEnum_TimeType,oneof"`
+}
+
+func (*AccountBudget_ApprovedEndDateTime) isAccountBudget_ApprovedEndTime() {}
+
+func (*AccountBudget_ApprovedEndTimeType) isAccountBudget_ApprovedEndTime() {}
+
+func (m *AccountBudget) GetApprovedEndTime() isAccountBudget_ApprovedEndTime {
+	if m != nil {
+		return m.ApprovedEndTime
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetApprovedEndDateTime() *wrappers.StringValue {
+	if x, ok := m.GetApprovedEndTime().(*AccountBudget_ApprovedEndDateTime); ok {
+		return x.ApprovedEndDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetApprovedEndTimeType() enums.TimeTypeEnum_TimeType {
+	if x, ok := m.GetApprovedEndTime().(*AccountBudget_ApprovedEndTimeType); ok {
+		return x.ApprovedEndTimeType
+	}
+	return enums.TimeTypeEnum_UNSPECIFIED
+}
+
+type isAccountBudget_ProposedSpendingLimit interface {
+	isAccountBudget_ProposedSpendingLimit()
+}
+
+type AccountBudget_ProposedSpendingLimitMicros struct {
+	ProposedSpendingLimitMicros *wrappers.Int64Value `protobuf:"bytes,12,opt,name=proposed_spending_limit_micros,json=proposedSpendingLimitMicros,proto3,oneof"`
+}
+
+type AccountBudget_ProposedSpendingLimitType struct {
+	ProposedSpendingLimitType enums.SpendingLimitTypeEnum_SpendingLimitType `protobuf:"varint,13,opt,name=proposed_spending_limit_type,json=proposedSpendingLimitType,proto3,enum=google.ads.googleads.v3.enums.SpendingLimitTypeEnum_SpendingLimitType,oneof"`
+}
+
+func (*AccountBudget_ProposedSpendingLimitMicros) isAccountBudget_ProposedSpendingLimit() {}
+
+func (*AccountBudget_ProposedSpendingLimitType) isAccountBudget_ProposedSpendingLimit() {}
+
+func (m *AccountBudget) GetProposedSpendingLimit() isAccountBudget_ProposedSpendingLimit {
+	if m != nil {
+		return m.ProposedSpendingLimit
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetProposedSpendingLimitMicros() *wrappers.Int64Value {
+	if x, ok := m.GetProposedSpendingLimit().(*AccountBudget_ProposedSpendingLimitMicros); ok {
+		return x.ProposedSpendingLimitMicros
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetProposedSpendingLimitType() enums.SpendingLimitTypeEnum_SpendingLimitType {
+	if x, ok := m.GetProposedSpendingLimit().(*AccountBudget_ProposedSpendingLimitType); ok {
+		return x.ProposedSpendingLimitType
+	}
+	return enums.SpendingLimitTypeEnum_UNSPECIFIED
+}
+
+type isAccountBudget_ApprovedSpendingLimit interface {
+	isAccountBudget_ApprovedSpendingLimit()
+}
+
+type AccountBudget_ApprovedSpendingLimitMicros struct {
+	ApprovedSpendingLimitMicros *wrappers.Int64Value `protobuf:"bytes,14,opt,name=approved_spending_limit_micros,json=approvedSpendingLimitMicros,proto3,oneof"`
+}
+
+type AccountBudget_ApprovedSpendingLimitType struct {
+	ApprovedSpendingLimitType enums.SpendingLimitTypeEnum_SpendingLimitType `protobuf:"varint,15,opt,name=approved_spending_limit_type,json=approvedSpendingLimitType,proto3,enum=google.ads.googleads.v3.enums.SpendingLimitTypeEnum_SpendingLimitType,oneof"`
+}
+
+func (*AccountBudget_ApprovedSpendingLimitMicros) isAccountBudget_ApprovedSpendingLimit() {}
+
+func (*AccountBudget_ApprovedSpendingLimitType) isAccountBudget_ApprovedSpendingLimit() {}
+
+func (m *AccountBudget) GetApprovedSpendingLimit() isAccountBudget_ApprovedSpendingLimit {
+	if m != nil {
+		return m.ApprovedSpendingLimit
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetApprovedSpendingLimitMicros() *wrappers.Int64Value {
+	if x, ok := m.GetApprovedSpendingLimit().(*AccountBudget_ApprovedSpendingLimitMicros); ok {
+		return x.ApprovedSpendingLimitMicros
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetApprovedSpendingLimitType() enums.SpendingLimitTypeEnum_SpendingLimitType {
+	if x, ok := m.GetApprovedSpendingLimit().(*AccountBudget_ApprovedSpendingLimitType); ok {
+		return x.ApprovedSpendingLimitType
+	}
+	return enums.SpendingLimitTypeEnum_UNSPECIFIED
+}
+
+type isAccountBudget_AdjustedSpendingLimit interface {
+	isAccountBudget_AdjustedSpendingLimit()
+}
+
+type AccountBudget_AdjustedSpendingLimitMicros struct {
+	AdjustedSpendingLimitMicros *wrappers.Int64Value `protobuf:"bytes,16,opt,name=adjusted_spending_limit_micros,json=adjustedSpendingLimitMicros,proto3,oneof"`
+}
+
+type AccountBudget_AdjustedSpendingLimitType struct {
+	AdjustedSpendingLimitType enums.SpendingLimitTypeEnum_SpendingLimitType `protobuf:"varint,17,opt,name=adjusted_spending_limit_type,json=adjustedSpendingLimitType,proto3,enum=google.ads.googleads.v3.enums.SpendingLimitTypeEnum_SpendingLimitType,oneof"`
+}
+
+func (*AccountBudget_AdjustedSpendingLimitMicros) isAccountBudget_AdjustedSpendingLimit() {}
+
+func (*AccountBudget_AdjustedSpendingLimitType) isAccountBudget_AdjustedSpendingLimit() {}
+
+func (m *AccountBudget) GetAdjustedSpendingLimit() isAccountBudget_AdjustedSpendingLimit {
+	if m != nil {
+		return m.AdjustedSpendingLimit
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetAdjustedSpendingLimitMicros() *wrappers.Int64Value {
+	if x, ok := m.GetAdjustedSpendingLimit().(*AccountBudget_AdjustedSpendingLimitMicros); ok {
+		return x.AdjustedSpendingLimitMicros
+	}
+	return nil
+}
+
+func (m *AccountBudget) GetAdjustedSpendingLimitType() enums.SpendingLimitTypeEnum_SpendingLimitType {
+	if x, ok := m.GetAdjustedSpendingLimit().(*AccountBudget_AdjustedSpendingLimitType); ok {
+		return x.AdjustedSpendingLimitType
+	}
+	return enums.SpendingLimitTypeEnum_UNSPECIFIED
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AccountBudget) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AccountBudget_ProposedEndDateTime)(nil),
+		(*AccountBudget_ProposedEndTimeType)(nil),
+		(*AccountBudget_ApprovedEndDateTime)(nil),
+		(*AccountBudget_ApprovedEndTimeType)(nil),
+		(*AccountBudget_ProposedSpendingLimitMicros)(nil),
+		(*AccountBudget_ProposedSpendingLimitType)(nil),
+		(*AccountBudget_ApprovedSpendingLimitMicros)(nil),
+		(*AccountBudget_ApprovedSpendingLimitType)(nil),
+		(*AccountBudget_AdjustedSpendingLimitMicros)(nil),
+		(*AccountBudget_AdjustedSpendingLimitType)(nil),
+	}
+}
+
+// A pending proposal associated with the enclosing account-level budget,
+// if applicable.
+type AccountBudget_PendingAccountBudgetProposal struct {
+	// The resource name of the proposal.
+	// AccountBudgetProposal resource names have the form:
+	//
+	// `customers/{customer_id}/accountBudgetProposals/{account_budget_proposal_id}`
+	AccountBudgetProposal *wrappers.StringValue `protobuf:"bytes,1,opt,name=account_budget_proposal,json=accountBudgetProposal,proto3" json:"account_budget_proposal,omitempty"`
+	// The type of this proposal, e.g. END to end the budget associated
+	// with this proposal.
+	ProposalType enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType `protobuf:"varint,2,opt,name=proposal_type,json=proposalType,proto3,enum=google.ads.googleads.v3.enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType" json:"proposal_type,omitempty"`
+	// The name to assign to the account-level budget.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The start time in yyyy-MM-dd HH:mm:ss format.
+	StartDateTime *wrappers.StringValue `protobuf:"bytes,4,opt,name=start_date_time,json=startDateTime,proto3" json:"start_date_time,omitempty"`
+	// A purchase order number is a value that helps users reference this budget
+	// in their monthly invoices.
+	PurchaseOrderNumber *wrappers.StringValue `protobuf:"bytes,9,opt,name=purchase_order_number,json=purchaseOrderNumber,proto3" json:"purchase_order_number,omitempty"`
+	// Notes associated with this budget.
+	Notes *wrappers.StringValue `protobuf:"bytes,10,opt,name=notes,proto3" json:"notes,omitempty"`
+	// The time when this account-level budget proposal was created.
+	// Formatted as yyyy-MM-dd HH:mm:ss.
+	CreationDateTime *wrappers.StringValue `protobuf:"bytes,11,opt,name=creation_date_time,json=creationDateTime,proto3" json:"creation_date_time,omitempty"`
+	// The end time of the account-level budget.
+	//
+	// Types that are valid to be assigned to EndTime:
+	//	*AccountBudget_PendingAccountBudgetProposal_EndDateTime
+	//	*AccountBudget_PendingAccountBudgetProposal_EndTimeType
+	EndTime isAccountBudget_PendingAccountBudgetProposal_EndTime `protobuf_oneof:"end_time"`
+	// The spending limit.
+	//
+	// Types that are valid to be assigned to SpendingLimit:
+	//	*AccountBudget_PendingAccountBudgetProposal_SpendingLimitMicros
+	//	*AccountBudget_PendingAccountBudgetProposal_SpendingLimitType
+	SpendingLimit        isAccountBudget_PendingAccountBudgetProposal_SpendingLimit `protobuf_oneof:"spending_limit"`
+	XXX_NoUnkeyedLiteral struct{}                                                   `json:"-"`
+	XXX_unrecognized     []byte                                                     `json:"-"`
+	XXX_sizecache        int32                                                      `json:"-"`
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) Reset() {
+	*m = AccountBudget_PendingAccountBudgetProposal{}
+}
+func (m *AccountBudget_PendingAccountBudgetProposal) String() string {
+	return proto.CompactTextString(m)
+}
+func (*AccountBudget_PendingAccountBudgetProposal) ProtoMessage() {}
+func (*AccountBudget_PendingAccountBudgetProposal) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b0ff171752da1201, []int{0, 0}
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccountBudget_PendingAccountBudgetProposal.Unmarshal(m, b)
+}
+func (m *AccountBudget_PendingAccountBudgetProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccountBudget_PendingAccountBudgetProposal.Marshal(b, m, deterministic)
+}
+func (m *AccountBudget_PendingAccountBudgetProposal) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccountBudget_PendingAccountBudgetProposal.Merge(m, src)
+}
+func (m *AccountBudget_PendingAccountBudgetProposal) XXX_Size() int {
+	return xxx_messageInfo_AccountBudget_PendingAccountBudgetProposal.Size(m)
+}
+func (m *AccountBudget_PendingAccountBudgetProposal) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccountBudget_PendingAccountBudgetProposal.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccountBudget_PendingAccountBudgetProposal proto.InternalMessageInfo
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetAccountBudgetProposal() *wrappers.StringValue {
+	if m != nil {
+		return m.AccountBudgetProposal
+	}
+	return nil
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetProposalType() enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType {
+	if m != nil {
+		return m.ProposalType
+	}
+	return enums.AccountBudgetProposalTypeEnum_UNSPECIFIED
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetStartDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetPurchaseOrderNumber() *wrappers.StringValue {
+	if m != nil {
+		return m.PurchaseOrderNumber
+	}
+	return nil
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetNotes() *wrappers.StringValue {
+	if m != nil {
+		return m.Notes
+	}
+	return nil
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetCreationDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.CreationDateTime
+	}
+	return nil
+}
+
+type isAccountBudget_PendingAccountBudgetProposal_EndTime interface {
+	isAccountBudget_PendingAccountBudgetProposal_EndTime()
+}
+
+type AccountBudget_PendingAccountBudgetProposal_EndDateTime struct {
+	EndDateTime *wrappers.StringValue `protobuf:"bytes,5,opt,name=end_date_time,json=endDateTime,proto3,oneof"`
+}
+
+type AccountBudget_PendingAccountBudgetProposal_EndTimeType struct {
+	EndTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,6,opt,name=end_time_type,json=endTimeType,proto3,enum=google.ads.googleads.v3.enums.TimeTypeEnum_TimeType,oneof"`
+}
+
+func (*AccountBudget_PendingAccountBudgetProposal_EndDateTime) isAccountBudget_PendingAccountBudgetProposal_EndTime() {
+}
+
+func (*AccountBudget_PendingAccountBudgetProposal_EndTimeType) isAccountBudget_PendingAccountBudgetProposal_EndTime() {
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetEndTime() isAccountBudget_PendingAccountBudgetProposal_EndTime {
+	if m != nil {
+		return m.EndTime
+	}
+	return nil
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetEndDateTime() *wrappers.StringValue {
+	if x, ok := m.GetEndTime().(*AccountBudget_PendingAccountBudgetProposal_EndDateTime); ok {
+		return x.EndDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetEndTimeType() enums.TimeTypeEnum_TimeType {
+	if x, ok := m.GetEndTime().(*AccountBudget_PendingAccountBudgetProposal_EndTimeType); ok {
+		return x.EndTimeType
+	}
+	return enums.TimeTypeEnum_UNSPECIFIED
+}
+
+type isAccountBudget_PendingAccountBudgetProposal_SpendingLimit interface {
+	isAccountBudget_PendingAccountBudgetProposal_SpendingLimit()
+}
+
+type AccountBudget_PendingAccountBudgetProposal_SpendingLimitMicros struct {
+	SpendingLimitMicros *wrappers.Int64Value `protobuf:"bytes,7,opt,name=spending_limit_micros,json=spendingLimitMicros,proto3,oneof"`
+}
+
+type AccountBudget_PendingAccountBudgetProposal_SpendingLimitType struct {
+	SpendingLimitType enums.SpendingLimitTypeEnum_SpendingLimitType `protobuf:"varint,8,opt,name=spending_limit_type,json=spendingLimitType,proto3,enum=google.ads.googleads.v3.enums.SpendingLimitTypeEnum_SpendingLimitType,oneof"`
+}
+
+func (*AccountBudget_PendingAccountBudgetProposal_SpendingLimitMicros) isAccountBudget_PendingAccountBudgetProposal_SpendingLimit() {
+}
+
+func (*AccountBudget_PendingAccountBudgetProposal_SpendingLimitType) isAccountBudget_PendingAccountBudgetProposal_SpendingLimit() {
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetSpendingLimit() isAccountBudget_PendingAccountBudgetProposal_SpendingLimit {
+	if m != nil {
+		return m.SpendingLimit
+	}
+	return nil
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetSpendingLimitMicros() *wrappers.Int64Value {
+	if x, ok := m.GetSpendingLimit().(*AccountBudget_PendingAccountBudgetProposal_SpendingLimitMicros); ok {
+		return x.SpendingLimitMicros
+	}
+	return nil
+}
+
+func (m *AccountBudget_PendingAccountBudgetProposal) GetSpendingLimitType() enums.SpendingLimitTypeEnum_SpendingLimitType {
+	if x, ok := m.GetSpendingLimit().(*AccountBudget_PendingAccountBudgetProposal_SpendingLimitType); ok {
+		return x.SpendingLimitType
+	}
+	return enums.SpendingLimitTypeEnum_UNSPECIFIED
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AccountBudget_PendingAccountBudgetProposal) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AccountBudget_PendingAccountBudgetProposal_EndDateTime)(nil),
+		(*AccountBudget_PendingAccountBudgetProposal_EndTimeType)(nil),
+		(*AccountBudget_PendingAccountBudgetProposal_SpendingLimitMicros)(nil),
+		(*AccountBudget_PendingAccountBudgetProposal_SpendingLimitType)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*AccountBudget)(nil), "google.ads.googleads.v3.resources.AccountBudget")
+	proto.RegisterType((*AccountBudget_PendingAccountBudgetProposal)(nil), "google.ads.googleads.v3.resources.AccountBudget.PendingAccountBudgetProposal")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/account_budget.proto", fileDescriptor_b0ff171752da1201)
+}
+
+var fileDescriptor_b0ff171752da1201 = []byte{
+	// 1054 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xdd, 0x6e, 0xdb, 0x36,
+	0x14, 0x9e, 0x1c, 0xe7, 0x8f, 0x89, 0xf3, 0x23, 0x37, 0xa9, 0x9c, 0x04, 0x45, 0xba, 0xa1, 0x43,
+	0x80, 0x61, 0xd2, 0x10, 0x07, 0x1d, 0xe6, 0xdd, 0xcc, 0x46, 0xbb, 0x66, 0xc1, 0xd2, 0x65, 0x72,
+	0xe6, 0x8b, 0x22, 0x98, 0x40, 0x5b, 0x9c, 0xa6, 0xcd, 0x22, 0x05, 0x92, 0xca, 0x5a, 0x04, 0x7d,
+	0x80, 0xbe, 0xc6, 0x2e, 0xf7, 0x20, 0xbb, 0xd8, 0xa3, 0xf4, 0x25, 0x56, 0x88, 0x12, 0x69, 0xcb,
+	0x96, 0x22, 0x15, 0xc9, 0x1d, 0x45, 0x9e, 0xef, 0x3b, 0xe7, 0x23, 0x79, 0xce, 0xa1, 0xc0, 0x53,
+	0x8f, 0x10, 0x6f, 0x8c, 0x2c, 0xe8, 0x32, 0x2b, 0x19, 0xc6, 0xa3, 0xeb, 0xb6, 0x45, 0x11, 0x23,
+	0x11, 0x1d, 0x21, 0x66, 0xc1, 0xd1, 0x88, 0x44, 0x98, 0x3b, 0xc3, 0xc8, 0xf5, 0x10, 0x37, 0x43,
+	0x4a, 0x38, 0xd1, 0x1f, 0x27, 0xc6, 0x26, 0x74, 0x99, 0xa9, 0x70, 0xe6, 0x75, 0xdb, 0x54, 0xb8,
+	0xbd, 0xef, 0x8a, 0xa8, 0x11, 0x8e, 0x82, 0x59, 0x5a, 0x27, 0xa4, 0x24, 0x24, 0x0c, 0x8e, 0x1d,
+	0xfe, 0x26, 0x44, 0x89, 0x93, 0xbd, 0x6f, 0x3e, 0x8a, 0x81, 0x71, 0xc8, 0x23, 0x96, 0x42, 0xbf,
+	0xbe, 0x1d, 0xca, 0x42, 0x84, 0x5d, 0x1f, 0x7b, 0xce, 0xd8, 0x0f, 0x7c, 0x3e, 0xed, 0xf3, 0xcb,
+	0xdb, 0x81, 0xdc, 0x0f, 0xd0, 0xb4, 0x79, 0x4b, 0x9a, 0x87, 0xbe, 0xda, 0xb2, 0x74, 0xe9, 0x51,
+	0xba, 0x24, 0xbe, 0x86, 0xd1, 0x6f, 0xd6, 0x5f, 0x14, 0x86, 0x21, 0xa2, 0x32, 0xc4, 0x83, 0x29,
+	0x28, 0xc4, 0x98, 0x70, 0xc8, 0x7d, 0x82, 0xd3, 0xd5, 0x4f, 0xdf, 0xb5, 0x40, 0xa3, 0x9b, 0x08,
+	0xec, 0x09, 0x7d, 0xfa, 0x67, 0xa0, 0x21, 0x3d, 0x38, 0x18, 0x06, 0xc8, 0xd0, 0x0e, 0xb5, 0xa3,
+	0x55, 0x7b, 0x5d, 0x4e, 0xbe, 0x84, 0x01, 0xd2, 0xbf, 0x00, 0x35, 0xdf, 0x35, 0x6a, 0x87, 0xda,
+	0xd1, 0xda, 0xf1, 0x7e, 0x7a, 0x32, 0xa6, 0x8c, 0xc0, 0xfc, 0x01, 0xf3, 0xa7, 0x27, 0x03, 0x38,
+	0x8e, 0x90, 0x5d, 0xf3, 0x5d, 0xbd, 0x0b, 0x1a, 0x43, 0x7f, 0x3c, 0x8e, 0xf7, 0x81, 0x21, 0x1e,
+	0x85, 0xc6, 0x82, 0xc0, 0x1d, 0xcc, 0xe1, 0xfa, 0x9c, 0xfa, 0xd8, 0x4b, 0x80, 0xeb, 0x29, 0xa4,
+	0x1f, 0x23, 0xf4, 0x21, 0x58, 0x4a, 0xf6, 0xdd, 0xa8, 0x1f, 0x6a, 0x47, 0x1b, 0xc7, 0x67, 0x66,
+	0xd1, 0xc5, 0x10, 0xfb, 0x67, 0x66, 0x24, 0xf5, 0x05, 0xf2, 0x39, 0x8e, 0x82, 0xbc, 0x79, 0x3b,
+	0x65, 0xd6, 0xbf, 0x02, 0x75, 0xa1, 0x77, 0xb1, 0x42, 0x74, 0xc2, 0x52, 0xff, 0x05, 0x18, 0xc9,
+	0x7d, 0x42, 0x6e, 0x7c, 0x2d, 0x28, 0x77, 0x5c, 0xc8, 0x91, 0x13, 0x1f, 0x9e, 0xb1, 0x54, 0x81,
+	0x65, 0x47, 0xa2, 0xfb, 0x31, 0xf8, 0x19, 0xe4, 0xe8, 0xd2, 0x4f, 0x68, 0x61, 0x18, 0x52, 0x72,
+	0x9d, 0x43, 0xbb, 0x5c, 0x85, 0x56, 0xa2, 0xe7, 0x68, 0x39, 0xe1, 0x70, 0xec, 0x40, 0xf7, 0x8f,
+	0x88, 0xf1, 0x00, 0x61, 0xce, 0x9c, 0xc0, 0x1f, 0x51, 0xc2, 0x0c, 0xbd, 0xfc, 0x24, 0x77, 0x05,
+	0xb8, 0x3b, 0xc1, 0x9e, 0x0b, 0xa8, 0x7e, 0x0e, 0x1e, 0xc0, 0x40, 0x24, 0x08, 0x43, 0x34, 0x0e,
+	0x39, 0xa5, 0x6c, 0x96, 0x53, 0xea, 0x09, 0xb0, 0x2f, 0x70, 0x29, 0xdd, 0x05, 0xd8, 0x09, 0x23,
+	0x3a, 0xfa, 0x1d, 0x32, 0xe4, 0x10, 0xea, 0x22, 0xea, 0xe0, 0x28, 0x18, 0x22, 0x6a, 0x3c, 0xa8,
+	0xa0, 0xbc, 0x29, 0xa1, 0x3f, 0xc5, 0xc8, 0x97, 0x02, 0xa8, 0x1f, 0x83, 0x45, 0x4c, 0x38, 0x62,
+	0xc6, 0x4e, 0x05, 0x86, 0xc4, 0x54, 0x7f, 0x0d, 0xb6, 0x64, 0xea, 0xca, 0x8a, 0x61, 0xec, 0x0a,
+	0xf8, 0xb9, 0x59, 0x5a, 0x92, 0xb2, 0xb7, 0xcc, 0xbc, 0x48, 0x88, 0x32, 0x93, 0x17, 0x29, 0xa9,
+	0xbd, 0x99, 0xba, 0x91, 0x13, 0x7a, 0x1f, 0xec, 0xaa, 0x3b, 0x85, 0xb0, 0x3b, 0x75, 0xf4, 0x2b,
+	0xe5, 0xe1, 0x9f, 0x7e, 0x62, 0x37, 0x25, 0xfa, 0x39, 0x76, 0xd5, 0xd1, 0xff, 0x39, 0x43, 0xaa,
+	0xca, 0x8b, 0xb1, 0x2a, 0xd2, 0xe9, 0xa4, 0x24, 0x9d, 0x62, 0x92, 0xcb, 0x37, 0x21, 0x12, 0x39,
+	0x24, 0x3f, 0x66, 0x9c, 0xc9, 0xe9, 0x58, 0x81, 0xba, 0xbe, 0x59, 0x05, 0xa0, 0x82, 0x02, 0xcd,
+	0x6e, 0x4a, 0xf4, 0x8c, 0x82, 0x0c, 0xe9, 0x44, 0xc1, 0xda, 0x1d, 0x14, 0x64, 0x9d, 0x29, 0x05,
+	0x43, 0xf0, 0x68, 0x92, 0xd7, 0xd9, 0x12, 0x9e, 0x5e, 0xee, 0xf5, 0xd2, 0xcb, 0x7d, 0x5a, 0xb3,
+	0xf7, 0x55, 0x7a, 0xa7, 0x1c, 0x3f, 0xc6, 0x14, 0xe9, 0x3d, 0x7f, 0xa7, 0x81, 0x83, 0x22, 0x27,
+	0x42, 0x57, 0x43, 0xe8, 0xfa, 0xbe, 0x44, 0x57, 0x86, 0x5a, 0x09, 0x9c, 0x9b, 0x3d, 0xad, 0xd9,
+	0xad, 0xdc, 0x68, 0xa4, 0xde, 0x49, 0xc1, 0xc9, 0xd5, 0xbb, 0x51, 0xae, 0x77, 0xc1, 0xde, 0x57,
+	0x75, 0xa7, 0x40, 0x6f, 0x91, 0x13, 0xa1, 0x77, 0xf3, 0x5e, 0xf5, 0x2e, 0xd8, 0xad, 0xdc, 0x68,
+	0x94, 0x5e, 0x51, 0xc7, 0x0a, 0xf5, 0x6e, 0x95, 0xeb, 0xad, 0xdb, 0xfb, 0x92, 0xa4, 0x50, 0x6f,
+	0x81, 0x13, 0xa1, 0x77, 0xfb, 0x5e, 0xf5, 0xd6, 0xed, 0x56, 0x6e, 0x34, 0xf1, 0xe2, 0xde, 0xbf,
+	0xcb, 0xe0, 0xe0, 0xb6, 0x2a, 0xa4, 0x5f, 0x82, 0x87, 0x05, 0xef, 0x24, 0xd1, 0xfd, 0xcb, 0x1b,
+	0x4e, 0x2e, 0xeb, 0x0d, 0x68, 0x64, 0x9e, 0x5b, 0xe2, 0xbd, 0xb0, 0x71, 0x3c, 0xf8, 0x98, 0xde,
+	0x2d, 0xc9, 0x94, 0xf4, 0xc2, 0x55, 0x7b, 0x3d, 0x9c, 0xfa, 0x52, 0xdd, 0x7c, 0xa1, 0x72, 0x37,
+	0x7f, 0x06, 0x36, 0x67, 0xbb, 0x6d, 0xbd, 0x02, 0xb8, 0xc1, 0x32, 0x5d, 0xb6, 0xb0, 0x7f, 0xad,
+	0xde, 0xb9, 0x7f, 0x81, 0xea, 0xfd, 0xeb, 0x0c, 0xe8, 0x23, 0x8a, 0xc4, 0x4b, 0x6f, 0x4a, 0xce,
+	0x5a, 0x05, 0x82, 0x2d, 0x89, 0x53, 0x8a, 0x7a, 0xa0, 0x91, 0x2d, 0xe3, 0x8b, 0x95, 0x1a, 0xd1,
+	0x1a, 0x9a, 0x2a, 0xdf, 0xaf, 0x12, 0x8e, 0x49, 0xd5, 0x5e, 0xba, 0x53, 0xdf, 0x89, 0xb9, 0x55,
+	0xb5, 0xfe, 0x19, 0xec, 0xe4, 0x27, 0xf1, 0x72, 0x79, 0x12, 0x6b, 0x76, 0x93, 0xe5, 0x24, 0xef,
+	0x6b, 0xd0, 0xcc, 0x4b, 0xd9, 0x95, 0x7b, 0x4d, 0x59, 0xcd, 0xde, 0x66, 0xb3, 0x93, 0x3d, 0x00,
+	0x56, 0xe4, 0x46, 0xf5, 0xb6, 0xc0, 0x46, 0x36, 0x8a, 0x0e, 0x7c, 0xdf, 0xfd, 0x15, 0x7c, 0x3e,
+	0xf1, 0x99, 0x8e, 0x42, 0x9f, 0x99, 0x23, 0x12, 0x58, 0xd9, 0x87, 0xfc, 0xc9, 0x28, 0x62, 0x9c,
+	0x04, 0x88, 0x32, 0xeb, 0x46, 0x0e, 0xdf, 0x5a, 0x99, 0x54, 0x65, 0xd6, 0x4d, 0x36, 0xef, 0xdf,
+	0xf6, 0x9a, 0x60, 0x7b, 0xee, 0xa9, 0x10, 0x4f, 0xce, 0x75, 0xdf, 0x5e, 0x0b, 0x3c, 0x2c, 0x68,
+	0x60, 0xf1, 0x52, 0x41, 0xad, 0x17, 0x4b, 0xf9, 0x65, 0xb1, 0xf7, 0xbf, 0x06, 0x9e, 0x8c, 0x48,
+	0x50, 0xfe, 0xc0, 0xea, 0xe9, 0xb3, 0x55, 0x80, 0x93, 0x0b, 0xed, 0xd5, 0x59, 0x0a, 0xf4, 0xc8,
+	0x18, 0x62, 0xcf, 0x24, 0xd4, 0xb3, 0x3c, 0x84, 0xc5, 0xb1, 0x5b, 0x93, 0x9d, 0xba, 0xe5, 0x1f,
+	0xf4, 0x5b, 0x35, 0xfa, 0xbb, 0xb6, 0xf0, 0xa2, 0xdb, 0xfd, 0xa7, 0xf6, 0xf8, 0x45, 0x42, 0xd9,
+	0x75, 0x99, 0x99, 0x0c, 0xe3, 0xd1, 0xa0, 0x6d, 0xda, 0xd2, 0xf2, 0x3f, 0x69, 0x73, 0xd5, 0x75,
+	0xd9, 0x95, 0xb2, 0xb9, 0x1a, 0xb4, 0xaf, 0x94, 0xcd, 0xfb, 0xda, 0x93, 0x64, 0xa1, 0xd3, 0xe9,
+	0xba, 0xac, 0xd3, 0x51, 0x56, 0x9d, 0xce, 0xa0, 0xdd, 0xe9, 0x28, 0xbb, 0xe1, 0x92, 0x08, 0xb6,
+	0xfd, 0x21, 0x00, 0x00, 0xff, 0xff, 0x51, 0xdf, 0xb3, 0x5b, 0x2f, 0x0f, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/account_budget_proposal.pb.go b/googleapis/ads/googleads/v3/resources/account_budget_proposal.pb.go
new file mode 100644
index 0000000..24fffdc
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/account_budget_proposal.pb.go
@@ -0,0 +1,486 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/account_budget_proposal.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An account-level budget proposal.
+//
+// All fields prefixed with 'proposed' may not necessarily be applied directly.
+// For example, proposed spending limits may be adjusted before their
+// application.  This is true if the 'proposed' field has an 'approved'
+// counterpart, e.g. spending limits.
+//
+// Please note that the proposal type (proposal_type) changes which fields are
+// required and which must remain empty.
+type AccountBudgetProposal struct {
+	// The resource name of the proposal.
+	// AccountBudgetProposal resource names have the form:
+	//
+	// `customers/{customer_id}/accountBudgetProposals/{account_budget_proposal_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the proposal.
+	Id *wrappers.Int64Value `protobuf:"bytes,14,opt,name=id,proto3" json:"id,omitempty"`
+	// The resource name of the billing setup associated with this proposal.
+	BillingSetup *wrappers.StringValue `protobuf:"bytes,2,opt,name=billing_setup,json=billingSetup,proto3" json:"billing_setup,omitempty"`
+	// The resource name of the account-level budget associated with this
+	// proposal.
+	AccountBudget *wrappers.StringValue `protobuf:"bytes,3,opt,name=account_budget,json=accountBudget,proto3" json:"account_budget,omitempty"`
+	// The type of this proposal, e.g. END to end the budget associated with this
+	// proposal.
+	ProposalType enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType `protobuf:"varint,4,opt,name=proposal_type,json=proposalType,proto3,enum=google.ads.googleads.v3.enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType" json:"proposal_type,omitempty"`
+	// The status of this proposal.
+	// When a new proposal is created, the status defaults to PENDING.
+	Status enums.AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus `protobuf:"varint,15,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus" json:"status,omitempty"`
+	// The name to assign to the account-level budget.
+	ProposedName *wrappers.StringValue `protobuf:"bytes,5,opt,name=proposed_name,json=proposedName,proto3" json:"proposed_name,omitempty"`
+	// The approved start date time in yyyy-mm-dd hh:mm:ss format.
+	ApprovedStartDateTime *wrappers.StringValue `protobuf:"bytes,20,opt,name=approved_start_date_time,json=approvedStartDateTime,proto3" json:"approved_start_date_time,omitempty"`
+	// A purchase order number is a value that enables the user to help them
+	// reference this budget in their monthly invoices.
+	ProposedPurchaseOrderNumber *wrappers.StringValue `protobuf:"bytes,12,opt,name=proposed_purchase_order_number,json=proposedPurchaseOrderNumber,proto3" json:"proposed_purchase_order_number,omitempty"`
+	// Notes associated with this budget.
+	ProposedNotes *wrappers.StringValue `protobuf:"bytes,13,opt,name=proposed_notes,json=proposedNotes,proto3" json:"proposed_notes,omitempty"`
+	// The date time when this account-level budget proposal was created, which is
+	// not the same as its approval date time, if applicable.
+	CreationDateTime *wrappers.StringValue `protobuf:"bytes,16,opt,name=creation_date_time,json=creationDateTime,proto3" json:"creation_date_time,omitempty"`
+	// The date time when this account-level budget was approved, if applicable.
+	ApprovalDateTime *wrappers.StringValue `protobuf:"bytes,17,opt,name=approval_date_time,json=approvalDateTime,proto3" json:"approval_date_time,omitempty"`
+	// The proposed start date time of the account-level budget, which cannot be
+	// in the past.
+	//
+	// Types that are valid to be assigned to ProposedStartTime:
+	//	*AccountBudgetProposal_ProposedStartDateTime
+	//	*AccountBudgetProposal_ProposedStartTimeType
+	ProposedStartTime isAccountBudgetProposal_ProposedStartTime `protobuf_oneof:"proposed_start_time"`
+	// The proposed end date time of the account-level budget, which cannot be in
+	// the past.
+	//
+	// Types that are valid to be assigned to ProposedEndTime:
+	//	*AccountBudgetProposal_ProposedEndDateTime
+	//	*AccountBudgetProposal_ProposedEndTimeType
+	ProposedEndTime isAccountBudgetProposal_ProposedEndTime `protobuf_oneof:"proposed_end_time"`
+	// The approved end date time of the account-level budget.
+	//
+	// Types that are valid to be assigned to ApprovedEndTime:
+	//	*AccountBudgetProposal_ApprovedEndDateTime
+	//	*AccountBudgetProposal_ApprovedEndTimeType
+	ApprovedEndTime isAccountBudgetProposal_ApprovedEndTime `protobuf_oneof:"approved_end_time"`
+	// The proposed spending limit.
+	//
+	// Types that are valid to be assigned to ProposedSpendingLimit:
+	//	*AccountBudgetProposal_ProposedSpendingLimitMicros
+	//	*AccountBudgetProposal_ProposedSpendingLimitType
+	ProposedSpendingLimit isAccountBudgetProposal_ProposedSpendingLimit `protobuf_oneof:"proposed_spending_limit"`
+	// The approved spending limit.
+	//
+	// Types that are valid to be assigned to ApprovedSpendingLimit:
+	//	*AccountBudgetProposal_ApprovedSpendingLimitMicros
+	//	*AccountBudgetProposal_ApprovedSpendingLimitType
+	ApprovedSpendingLimit isAccountBudgetProposal_ApprovedSpendingLimit `protobuf_oneof:"approved_spending_limit"`
+	XXX_NoUnkeyedLiteral  struct{}                                      `json:"-"`
+	XXX_unrecognized      []byte                                        `json:"-"`
+	XXX_sizecache         int32                                         `json:"-"`
+}
+
+func (m *AccountBudgetProposal) Reset()         { *m = AccountBudgetProposal{} }
+func (m *AccountBudgetProposal) String() string { return proto.CompactTextString(m) }
+func (*AccountBudgetProposal) ProtoMessage()    {}
+func (*AccountBudgetProposal) Descriptor() ([]byte, []int) {
+	return fileDescriptor_97474d5a9610a949, []int{0}
+}
+
+func (m *AccountBudgetProposal) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccountBudgetProposal.Unmarshal(m, b)
+}
+func (m *AccountBudgetProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccountBudgetProposal.Marshal(b, m, deterministic)
+}
+func (m *AccountBudgetProposal) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccountBudgetProposal.Merge(m, src)
+}
+func (m *AccountBudgetProposal) XXX_Size() int {
+	return xxx_messageInfo_AccountBudgetProposal.Size(m)
+}
+func (m *AccountBudgetProposal) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccountBudgetProposal.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccountBudgetProposal proto.InternalMessageInfo
+
+func (m *AccountBudgetProposal) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AccountBudgetProposal) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetBillingSetup() *wrappers.StringValue {
+	if m != nil {
+		return m.BillingSetup
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetAccountBudget() *wrappers.StringValue {
+	if m != nil {
+		return m.AccountBudget
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetProposalType() enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType {
+	if m != nil {
+		return m.ProposalType
+	}
+	return enums.AccountBudgetProposalTypeEnum_UNSPECIFIED
+}
+
+func (m *AccountBudgetProposal) GetStatus() enums.AccountBudgetProposalStatusEnum_AccountBudgetProposalStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.AccountBudgetProposalStatusEnum_UNSPECIFIED
+}
+
+func (m *AccountBudgetProposal) GetProposedName() *wrappers.StringValue {
+	if m != nil {
+		return m.ProposedName
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetApprovedStartDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ApprovedStartDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetProposedPurchaseOrderNumber() *wrappers.StringValue {
+	if m != nil {
+		return m.ProposedPurchaseOrderNumber
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetProposedNotes() *wrappers.StringValue {
+	if m != nil {
+		return m.ProposedNotes
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetCreationDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.CreationDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetApprovalDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ApprovalDateTime
+	}
+	return nil
+}
+
+type isAccountBudgetProposal_ProposedStartTime interface {
+	isAccountBudgetProposal_ProposedStartTime()
+}
+
+type AccountBudgetProposal_ProposedStartDateTime struct {
+	ProposedStartDateTime *wrappers.StringValue `protobuf:"bytes,18,opt,name=proposed_start_date_time,json=proposedStartDateTime,proto3,oneof"`
+}
+
+type AccountBudgetProposal_ProposedStartTimeType struct {
+	ProposedStartTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,7,opt,name=proposed_start_time_type,json=proposedStartTimeType,proto3,enum=google.ads.googleads.v3.enums.TimeTypeEnum_TimeType,oneof"`
+}
+
+func (*AccountBudgetProposal_ProposedStartDateTime) isAccountBudgetProposal_ProposedStartTime() {}
+
+func (*AccountBudgetProposal_ProposedStartTimeType) isAccountBudgetProposal_ProposedStartTime() {}
+
+func (m *AccountBudgetProposal) GetProposedStartTime() isAccountBudgetProposal_ProposedStartTime {
+	if m != nil {
+		return m.ProposedStartTime
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetProposedStartDateTime() *wrappers.StringValue {
+	if x, ok := m.GetProposedStartTime().(*AccountBudgetProposal_ProposedStartDateTime); ok {
+		return x.ProposedStartDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetProposedStartTimeType() enums.TimeTypeEnum_TimeType {
+	if x, ok := m.GetProposedStartTime().(*AccountBudgetProposal_ProposedStartTimeType); ok {
+		return x.ProposedStartTimeType
+	}
+	return enums.TimeTypeEnum_UNSPECIFIED
+}
+
+type isAccountBudgetProposal_ProposedEndTime interface {
+	isAccountBudgetProposal_ProposedEndTime()
+}
+
+type AccountBudgetProposal_ProposedEndDateTime struct {
+	ProposedEndDateTime *wrappers.StringValue `protobuf:"bytes,19,opt,name=proposed_end_date_time,json=proposedEndDateTime,proto3,oneof"`
+}
+
+type AccountBudgetProposal_ProposedEndTimeType struct {
+	ProposedEndTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,9,opt,name=proposed_end_time_type,json=proposedEndTimeType,proto3,enum=google.ads.googleads.v3.enums.TimeTypeEnum_TimeType,oneof"`
+}
+
+func (*AccountBudgetProposal_ProposedEndDateTime) isAccountBudgetProposal_ProposedEndTime() {}
+
+func (*AccountBudgetProposal_ProposedEndTimeType) isAccountBudgetProposal_ProposedEndTime() {}
+
+func (m *AccountBudgetProposal) GetProposedEndTime() isAccountBudgetProposal_ProposedEndTime {
+	if m != nil {
+		return m.ProposedEndTime
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetProposedEndDateTime() *wrappers.StringValue {
+	if x, ok := m.GetProposedEndTime().(*AccountBudgetProposal_ProposedEndDateTime); ok {
+		return x.ProposedEndDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetProposedEndTimeType() enums.TimeTypeEnum_TimeType {
+	if x, ok := m.GetProposedEndTime().(*AccountBudgetProposal_ProposedEndTimeType); ok {
+		return x.ProposedEndTimeType
+	}
+	return enums.TimeTypeEnum_UNSPECIFIED
+}
+
+type isAccountBudgetProposal_ApprovedEndTime interface {
+	isAccountBudgetProposal_ApprovedEndTime()
+}
+
+type AccountBudgetProposal_ApprovedEndDateTime struct {
+	ApprovedEndDateTime *wrappers.StringValue `protobuf:"bytes,21,opt,name=approved_end_date_time,json=approvedEndDateTime,proto3,oneof"`
+}
+
+type AccountBudgetProposal_ApprovedEndTimeType struct {
+	ApprovedEndTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,22,opt,name=approved_end_time_type,json=approvedEndTimeType,proto3,enum=google.ads.googleads.v3.enums.TimeTypeEnum_TimeType,oneof"`
+}
+
+func (*AccountBudgetProposal_ApprovedEndDateTime) isAccountBudgetProposal_ApprovedEndTime() {}
+
+func (*AccountBudgetProposal_ApprovedEndTimeType) isAccountBudgetProposal_ApprovedEndTime() {}
+
+func (m *AccountBudgetProposal) GetApprovedEndTime() isAccountBudgetProposal_ApprovedEndTime {
+	if m != nil {
+		return m.ApprovedEndTime
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetApprovedEndDateTime() *wrappers.StringValue {
+	if x, ok := m.GetApprovedEndTime().(*AccountBudgetProposal_ApprovedEndDateTime); ok {
+		return x.ApprovedEndDateTime
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetApprovedEndTimeType() enums.TimeTypeEnum_TimeType {
+	if x, ok := m.GetApprovedEndTime().(*AccountBudgetProposal_ApprovedEndTimeType); ok {
+		return x.ApprovedEndTimeType
+	}
+	return enums.TimeTypeEnum_UNSPECIFIED
+}
+
+type isAccountBudgetProposal_ProposedSpendingLimit interface {
+	isAccountBudgetProposal_ProposedSpendingLimit()
+}
+
+type AccountBudgetProposal_ProposedSpendingLimitMicros struct {
+	ProposedSpendingLimitMicros *wrappers.Int64Value `protobuf:"bytes,10,opt,name=proposed_spending_limit_micros,json=proposedSpendingLimitMicros,proto3,oneof"`
+}
+
+type AccountBudgetProposal_ProposedSpendingLimitType struct {
+	ProposedSpendingLimitType enums.SpendingLimitTypeEnum_SpendingLimitType `protobuf:"varint,11,opt,name=proposed_spending_limit_type,json=proposedSpendingLimitType,proto3,enum=google.ads.googleads.v3.enums.SpendingLimitTypeEnum_SpendingLimitType,oneof"`
+}
+
+func (*AccountBudgetProposal_ProposedSpendingLimitMicros) isAccountBudgetProposal_ProposedSpendingLimit() {
+}
+
+func (*AccountBudgetProposal_ProposedSpendingLimitType) isAccountBudgetProposal_ProposedSpendingLimit() {
+}
+
+func (m *AccountBudgetProposal) GetProposedSpendingLimit() isAccountBudgetProposal_ProposedSpendingLimit {
+	if m != nil {
+		return m.ProposedSpendingLimit
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetProposedSpendingLimitMicros() *wrappers.Int64Value {
+	if x, ok := m.GetProposedSpendingLimit().(*AccountBudgetProposal_ProposedSpendingLimitMicros); ok {
+		return x.ProposedSpendingLimitMicros
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetProposedSpendingLimitType() enums.SpendingLimitTypeEnum_SpendingLimitType {
+	if x, ok := m.GetProposedSpendingLimit().(*AccountBudgetProposal_ProposedSpendingLimitType); ok {
+		return x.ProposedSpendingLimitType
+	}
+	return enums.SpendingLimitTypeEnum_UNSPECIFIED
+}
+
+type isAccountBudgetProposal_ApprovedSpendingLimit interface {
+	isAccountBudgetProposal_ApprovedSpendingLimit()
+}
+
+type AccountBudgetProposal_ApprovedSpendingLimitMicros struct {
+	ApprovedSpendingLimitMicros *wrappers.Int64Value `protobuf:"bytes,23,opt,name=approved_spending_limit_micros,json=approvedSpendingLimitMicros,proto3,oneof"`
+}
+
+type AccountBudgetProposal_ApprovedSpendingLimitType struct {
+	ApprovedSpendingLimitType enums.SpendingLimitTypeEnum_SpendingLimitType `protobuf:"varint,24,opt,name=approved_spending_limit_type,json=approvedSpendingLimitType,proto3,enum=google.ads.googleads.v3.enums.SpendingLimitTypeEnum_SpendingLimitType,oneof"`
+}
+
+func (*AccountBudgetProposal_ApprovedSpendingLimitMicros) isAccountBudgetProposal_ApprovedSpendingLimit() {
+}
+
+func (*AccountBudgetProposal_ApprovedSpendingLimitType) isAccountBudgetProposal_ApprovedSpendingLimit() {
+}
+
+func (m *AccountBudgetProposal) GetApprovedSpendingLimit() isAccountBudgetProposal_ApprovedSpendingLimit {
+	if m != nil {
+		return m.ApprovedSpendingLimit
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetApprovedSpendingLimitMicros() *wrappers.Int64Value {
+	if x, ok := m.GetApprovedSpendingLimit().(*AccountBudgetProposal_ApprovedSpendingLimitMicros); ok {
+		return x.ApprovedSpendingLimitMicros
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposal) GetApprovedSpendingLimitType() enums.SpendingLimitTypeEnum_SpendingLimitType {
+	if x, ok := m.GetApprovedSpendingLimit().(*AccountBudgetProposal_ApprovedSpendingLimitType); ok {
+		return x.ApprovedSpendingLimitType
+	}
+	return enums.SpendingLimitTypeEnum_UNSPECIFIED
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AccountBudgetProposal) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AccountBudgetProposal_ProposedStartDateTime)(nil),
+		(*AccountBudgetProposal_ProposedStartTimeType)(nil),
+		(*AccountBudgetProposal_ProposedEndDateTime)(nil),
+		(*AccountBudgetProposal_ProposedEndTimeType)(nil),
+		(*AccountBudgetProposal_ApprovedEndDateTime)(nil),
+		(*AccountBudgetProposal_ApprovedEndTimeType)(nil),
+		(*AccountBudgetProposal_ProposedSpendingLimitMicros)(nil),
+		(*AccountBudgetProposal_ProposedSpendingLimitType)(nil),
+		(*AccountBudgetProposal_ApprovedSpendingLimitMicros)(nil),
+		(*AccountBudgetProposal_ApprovedSpendingLimitType)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*AccountBudgetProposal)(nil), "google.ads.googleads.v3.resources.AccountBudgetProposal")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/account_budget_proposal.proto", fileDescriptor_97474d5a9610a949)
+}
+
+var fileDescriptor_97474d5a9610a949 = []byte{
+	// 886 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xdf, 0x6e, 0xdc, 0x44,
+	0x14, 0xc6, 0x59, 0x27, 0x14, 0x75, 0x9a, 0x0d, 0x8d, 0x97, 0x6d, 0x9d, 0x3f, 0xaa, 0x52, 0x50,
+	0xa5, 0x48, 0x08, 0x5b, 0xea, 0x56, 0x20, 0x99, 0x0b, 0xf0, 0x42, 0x68, 0x88, 0xa0, 0x44, 0xde,
+	0xb2, 0x48, 0x55, 0x24, 0x6b, 0xd6, 0x1e, 0x8c, 0x85, 0x3d, 0x63, 0xcd, 0x8c, 0x53, 0x95, 0xa8,
+	0xd7, 0x88, 0xd7, 0xe0, 0x92, 0x47, 0xe1, 0x1d, 0x78, 0x81, 0x3e, 0x05, 0x9a, 0xb1, 0x67, 0xd6,
+	0xce, 0xda, 0x59, 0xab, 0xe9, 0xdd, 0xac, 0xcf, 0xf9, 0xbe, 0x33, 0xbf, 0x39, 0x67, 0xbc, 0x06,
+	0x5f, 0xc5, 0x84, 0xc4, 0x29, 0x72, 0x60, 0xc4, 0x9c, 0x72, 0x29, 0x56, 0x17, 0x13, 0x87, 0x22,
+	0x46, 0x0a, 0x1a, 0x22, 0xe6, 0xc0, 0x30, 0x24, 0x05, 0xe6, 0xc1, 0xa2, 0x88, 0x62, 0xc4, 0x83,
+	0x9c, 0x92, 0x9c, 0x30, 0x98, 0xda, 0x39, 0x25, 0x9c, 0x98, 0x0f, 0x4b, 0x95, 0x0d, 0x23, 0x66,
+	0x6b, 0x03, 0xfb, 0x62, 0x62, 0x6b, 0x83, 0xbd, 0x69, 0x57, 0x0d, 0x84, 0x8b, 0xac, 0xd3, 0x3f,
+	0x60, 0x1c, 0xf2, 0x82, 0x95, 0x65, 0xf6, 0xbe, 0x7e, 0x3b, 0x0f, 0xfe, 0x2a, 0x47, 0x95, 0xc3,
+	0x17, 0xd7, 0x3b, 0xb0, 0x1c, 0xe1, 0x28, 0xc1, 0x71, 0x90, 0x26, 0x59, 0xc2, 0xeb, 0xc2, 0xcf,
+	0xae, 0x17, 0xf2, 0x24, 0x43, 0xf5, 0xf4, 0x5d, 0x95, 0x9e, 0x27, 0xfa, 0x10, 0xab, 0xd0, 0x83,
+	0x2a, 0x24, 0x7f, 0x2d, 0x8a, 0x5f, 0x9d, 0x97, 0x14, 0xe6, 0x39, 0xa2, 0x0a, 0xf2, 0xa0, 0x26,
+	0x85, 0x18, 0x13, 0x0e, 0x79, 0x42, 0x70, 0x15, 0xfd, 0xf8, 0xbf, 0x1d, 0x30, 0xf6, 0x4a, 0xce,
+	0xa9, 0xc4, 0x3c, 0xab, 0x28, 0xcd, 0x4f, 0xc0, 0x50, 0x55, 0x0a, 0x30, 0xcc, 0x90, 0x35, 0x38,
+	0x1c, 0x1c, 0xdd, 0xf6, 0xb7, 0xd4, 0xc3, 0x67, 0x30, 0x43, 0xe6, 0xa7, 0xc0, 0x48, 0x22, 0x6b,
+	0xfb, 0x70, 0x70, 0x74, 0xe7, 0xf1, 0x7e, 0xd5, 0x2a, 0x5b, 0xed, 0xc4, 0xfe, 0x1e, 0xf3, 0xcf,
+	0x9f, 0xcc, 0x61, 0x5a, 0x20, 0xdf, 0x48, 0x22, 0xd3, 0x03, 0xc3, 0x45, 0x92, 0xa6, 0xe2, 0x3c,
+	0x18, 0xe2, 0x45, 0x6e, 0x19, 0x52, 0x77, 0xb0, 0xa2, 0x9b, 0x71, 0x9a, 0xe0, 0xb8, 0x14, 0x6e,
+	0x55, 0x92, 0x99, 0x50, 0x98, 0xdf, 0x80, 0xed, 0x66, 0x57, 0xac, 0x8d, 0x1e, 0x1e, 0x43, 0x58,
+	0x27, 0x34, 0x2f, 0xc1, 0xb0, 0xd1, 0x4b, 0x6b, 0xf3, 0x70, 0x70, 0xb4, 0xfd, 0x78, 0x6e, 0x77,
+	0x4d, 0x9d, 0xec, 0x89, 0xdd, 0x7a, 0x4c, 0xcf, 0x5f, 0xe5, 0xe8, 0x18, 0x17, 0x59, 0x77, 0xd4,
+	0xdf, 0xca, 0x6b, 0xbf, 0x4c, 0x0a, 0x6e, 0x95, 0x33, 0x68, 0x7d, 0x28, 0xab, 0xbe, 0x78, 0x9b,
+	0xaa, 0x33, 0xe9, 0xd0, 0x5d, 0xb7, 0x8c, 0xfb, 0x55, 0x25, 0x71, 0xf0, 0xe5, 0x1e, 0x50, 0x54,
+	0xb6, 0xf2, 0xfd, 0x3e, 0x07, 0xaf, 0x24, 0xb2, 0xd1, 0x3f, 0x03, 0x0b, 0xe6, 0x39, 0x25, 0x17,
+	0x28, 0x12, 0x77, 0x88, 0xf2, 0x20, 0x82, 0x1c, 0x05, 0x62, 0x4e, 0xad, 0x8f, 0x7a, 0xb8, 0x8d,
+	0x95, 0x7a, 0x26, 0xc4, 0xdf, 0x42, 0x8e, 0x9e, 0x27, 0x19, 0x32, 0x21, 0x78, 0xa0, 0x77, 0x96,
+	0x17, 0x34, 0xfc, 0x0d, 0x32, 0x14, 0x10, 0x1a, 0x21, 0x1a, 0xe0, 0x22, 0x5b, 0x20, 0x6a, 0x6d,
+	0xf5, 0x30, 0xdf, 0x57, 0x1e, 0x67, 0x95, 0xc5, 0x4f, 0xc2, 0xe1, 0x99, 0x34, 0x10, 0x23, 0xb3,
+	0x84, 0x27, 0x1c, 0x31, 0x6b, 0xd8, 0x67, 0x64, 0x34, 0xbd, 0x90, 0x98, 0xa7, 0xc0, 0x0c, 0x29,
+	0x92, 0x37, 0xa7, 0x06, 0x7e, 0xb7, 0x87, 0xd1, 0x5d, 0xa5, 0xd3, 0xcc, 0xa7, 0xc0, 0x2c, 0x0f,
+	0x03, 0xa6, 0x35, 0xaf, 0x9d, 0x3e, 0x5e, 0x4a, 0xa7, 0xbd, 0x7e, 0x01, 0x96, 0x86, 0xbb, 0xda,
+	0x16, 0x73, 0xbd, 0xe3, 0xc9, 0x7b, 0xfe, 0x58, 0xe9, 0x9b, 0x8d, 0x21, 0x2b, 0xc6, 0xfa, 0x95,
+	0x64, 0x7d, 0x20, 0x07, 0xf7, 0xc9, 0x9a, 0xc1, 0x15, 0x36, 0xfa, 0x76, 0xa8, 0x1f, 0x2b, 0x05,
+	0x55, 0xc0, 0x9c, 0x81, 0x7b, 0xba, 0x20, 0xc2, 0x51, 0x8d, 0x63, 0xd4, 0x83, 0x63, 0xe0, 0x8f,
+	0x94, 0xfa, 0x18, 0x47, 0x9a, 0xe2, 0xf7, 0x2b, 0xa6, 0x4b, 0x86, 0xdb, 0x37, 0x60, 0x68, 0x16,
+	0xab, 0x13, 0xe8, 0x2b, 0xd2, 0x24, 0x18, 0xf7, 0x20, 0x30, 0xfc, 0x91, 0x52, 0x5f, 0x21, 0x68,
+	0x98, 0x2e, 0x09, 0xee, 0xdd, 0x80, 0xa0, 0x59, 0x4c, 0x13, 0x2c, 0x6a, 0xb7, 0xf1, 0xca, 0x5f,
+	0x57, 0x96, 0x84, 0x94, 0x30, 0x0b, 0xac, 0x7d, 0xd3, 0x9f, 0x6c, 0x2c, 0xaf, 0xe3, 0xac, 0xf2,
+	0xf8, 0x41, 0x58, 0xfc, 0x28, 0x1d, 0xcc, 0xbf, 0x06, 0xe0, 0xa0, 0xab, 0x88, 0xe4, 0xba, 0x23,
+	0xb9, 0xbe, 0x5b, 0xc3, 0xd5, 0xb0, 0xd6, 0x80, 0x2b, 0x4f, 0x4f, 0x36, 0xfc, 0xdd, 0xd6, 0xdd,
+	0x28, 0xde, 0xe5, 0x4b, 0xad, 0x95, 0xf7, 0xfe, 0x7a, 0xde, 0x4d, 0x7f, 0x5f, 0xbf, 0xdb, 0x3a,
+	0x78, 0xbb, 0x8a, 0x48, 0x5e, 0xeb, 0x9d, 0xf2, 0x6e, 0xfa, 0xbb, 0xad, 0xbb, 0x11, 0x41, 0xf7,
+	0x8f, 0x37, 0xde, 0x4b, 0x50, 0x73, 0xaf, 0x56, 0x79, 0xc2, 0xec, 0x90, 0x64, 0x4e, 0xfb, 0x77,
+	0xc0, 0x71, 0x58, 0x30, 0x4e, 0x32, 0x44, 0x99, 0x73, 0xa9, 0x96, 0xaf, 0x1d, 0xd8, 0x96, 0xcb,
+	0x9c, 0xcb, 0x8e, 0x6f, 0xa6, 0xd7, 0xd3, 0x31, 0x18, 0xb5, 0xbc, 0x50, 0xa6, 0x23, 0xb0, 0xb3,
+	0x72, 0x43, 0xc5, 0xc3, 0x95, 0xa1, 0x9f, 0xee, 0x82, 0xfb, 0x1d, 0x73, 0x23, 0x42, 0x1d, 0x47,
+	0x3c, 0xfd, 0xd3, 0x00, 0x8f, 0x42, 0x92, 0xd9, 0x6b, 0x3f, 0x28, 0xa7, 0x7b, 0xad, 0xf8, 0x67,
+	0xa2, 0xe3, 0x67, 0x83, 0x17, 0xa7, 0x95, 0x41, 0x4c, 0x52, 0x88, 0x63, 0x9b, 0xd0, 0xd8, 0x89,
+	0x11, 0x96, 0xf3, 0xe0, 0x2c, 0x8f, 0xf1, 0x9a, 0x2f, 0xde, 0x2f, 0xf5, 0xea, 0x6f, 0x63, 0xe3,
+	0xa9, 0xe7, 0xfd, 0x63, 0x3c, 0x7c, 0x5a, 0x5a, 0x7a, 0x11, 0xb3, 0xcb, 0xa5, 0x58, 0xcd, 0x27,
+	0xb6, 0xaf, 0x32, 0xff, 0x55, 0x39, 0xe7, 0x5e, 0xc4, 0xce, 0x75, 0xce, 0xf9, 0x7c, 0x72, 0xae,
+	0x73, 0xde, 0x18, 0x8f, 0xca, 0x80, 0xeb, 0x7a, 0x11, 0x73, 0x5d, 0x9d, 0xe5, 0xba, 0xf3, 0x89,
+	0xeb, 0xea, 0xbc, 0xc5, 0x2d, 0xb9, 0xd9, 0xc9, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x38, 0xa1,
+	0xad, 0x73, 0x9d, 0x0b, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad.pb.go b/googleapis/ads/googleads/v3/resources/ad.pb.go
new file mode 100644
index 0000000..5e47fd0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad.pb.go
@@ -0,0 +1,595 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad.
+type Ad struct {
+	// The resource name of the ad.
+	// Ad resource names have the form:
+	//
+	// `customers/{customer_id}/ads/{ad_id}`
+	ResourceName string `protobuf:"bytes,37,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the ad.
+	Id *wrappers.Int64Value `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	// The list of possible final URLs after all cross-domain redirects for the
+	// ad.
+	FinalUrls []*wrappers.StringValue `protobuf:"bytes,2,rep,name=final_urls,json=finalUrls,proto3" json:"final_urls,omitempty"`
+	// A list of final app URLs that will be used on mobile if the user has the
+	// specific app installed.
+	FinalAppUrls []*common.FinalAppUrl `protobuf:"bytes,35,rep,name=final_app_urls,json=finalAppUrls,proto3" json:"final_app_urls,omitempty"`
+	// The list of possible final mobile URLs after all cross-domain redirects
+	// for the ad.
+	FinalMobileUrls []*wrappers.StringValue `protobuf:"bytes,16,rep,name=final_mobile_urls,json=finalMobileUrls,proto3" json:"final_mobile_urls,omitempty"`
+	// The URL template for constructing a tracking URL.
+	TrackingUrlTemplate *wrappers.StringValue `protobuf:"bytes,12,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	// The suffix to use when constructing a final URL.
+	FinalUrlSuffix *wrappers.StringValue `protobuf:"bytes,38,opt,name=final_url_suffix,json=finalUrlSuffix,proto3" json:"final_url_suffix,omitempty"`
+	// The list of mappings that can be used to substitute custom parameter tags
+	// in a `tracking_url_template`, `final_urls`, or `mobile_final_urls`.
+	UrlCustomParameters []*common.CustomParameter `protobuf:"bytes,10,rep,name=url_custom_parameters,json=urlCustomParameters,proto3" json:"url_custom_parameters,omitempty"`
+	// The URL that appears in the ad description for some ad formats.
+	DisplayUrl *wrappers.StringValue `protobuf:"bytes,4,opt,name=display_url,json=displayUrl,proto3" json:"display_url,omitempty"`
+	// The type of ad.
+	Type enums.AdTypeEnum_AdType `protobuf:"varint,5,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.AdTypeEnum_AdType" json:"type,omitempty"`
+	// Indicates if this ad was automatically added by Google Ads and not by a
+	// user. For example, this could happen when ads are automatically created as
+	// suggestions for new ads based on knowledge of how existing ads are
+	// performing.
+	AddedByGoogleAds *wrappers.BoolValue `protobuf:"bytes,19,opt,name=added_by_google_ads,json=addedByGoogleAds,proto3" json:"added_by_google_ads,omitempty"`
+	// The device preference for the ad. You can only specify a preference for
+	// mobile devices. When this preference is set the ad will be preferred over
+	// other ads when being displayed on a mobile device. The ad can still be
+	// displayed on other device types, e.g. if no other ads are available.
+	// If unspecified (no device preference), all devices are targeted.
+	// This is only supported by some ad types.
+	DevicePreference enums.DeviceEnum_Device `protobuf:"varint,20,opt,name=device_preference,json=devicePreference,proto3,enum=google.ads.googleads.v3.enums.DeviceEnum_Device" json:"device_preference,omitempty"`
+	// Additional URLs for the ad that are tagged with a unique identifier that
+	// can be referenced from other fields in the ad.
+	UrlCollections []*common.UrlCollection `protobuf:"bytes,26,rep,name=url_collections,json=urlCollections,proto3" json:"url_collections,omitempty"`
+	// The name of the ad. This is only used to be able to identify the ad. It
+	// does not need to be unique and does not affect the served ad.
+	Name *wrappers.StringValue `protobuf:"bytes,23,opt,name=name,proto3" json:"name,omitempty"`
+	// If this ad is system managed, then this field will indicate the source.
+	// This field is read-only.
+	SystemManagedResourceSource enums.SystemManagedResourceSourceEnum_SystemManagedResourceSource `protobuf:"varint,27,opt,name=system_managed_resource_source,json=systemManagedResourceSource,proto3,enum=google.ads.googleads.v3.enums.SystemManagedResourceSourceEnum_SystemManagedResourceSource" json:"system_managed_resource_source,omitempty"`
+	// Details pertinent to the ad type. Exactly one value must be set.
+	//
+	// Types that are valid to be assigned to AdData:
+	//	*Ad_TextAd
+	//	*Ad_ExpandedTextAd
+	//	*Ad_CallOnlyAd
+	//	*Ad_ExpandedDynamicSearchAd
+	//	*Ad_HotelAd
+	//	*Ad_ShoppingSmartAd
+	//	*Ad_ShoppingProductAd
+	//	*Ad_GmailAd
+	//	*Ad_ImageAd
+	//	*Ad_VideoAd
+	//	*Ad_ResponsiveSearchAd
+	//	*Ad_LegacyResponsiveDisplayAd
+	//	*Ad_AppAd
+	//	*Ad_LegacyAppInstallAd
+	//	*Ad_ResponsiveDisplayAd
+	//	*Ad_DisplayUploadAd
+	//	*Ad_AppEngagementAd
+	//	*Ad_ShoppingComparisonListingAd
+	AdData               isAd_AdData `protobuf_oneof:"ad_data"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *Ad) Reset()         { *m = Ad{} }
+func (m *Ad) String() string { return proto.CompactTextString(m) }
+func (*Ad) ProtoMessage()    {}
+func (*Ad) Descriptor() ([]byte, []int) {
+	return fileDescriptor_65b02bf52a660238, []int{0}
+}
+
+func (m *Ad) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Ad.Unmarshal(m, b)
+}
+func (m *Ad) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Ad.Marshal(b, m, deterministic)
+}
+func (m *Ad) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Ad.Merge(m, src)
+}
+func (m *Ad) XXX_Size() int {
+	return xxx_messageInfo_Ad.Size(m)
+}
+func (m *Ad) XXX_DiscardUnknown() {
+	xxx_messageInfo_Ad.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Ad proto.InternalMessageInfo
+
+func (m *Ad) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *Ad) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Ad) GetFinalUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrls
+	}
+	return nil
+}
+
+func (m *Ad) GetFinalAppUrls() []*common.FinalAppUrl {
+	if m != nil {
+		return m.FinalAppUrls
+	}
+	return nil
+}
+
+func (m *Ad) GetFinalMobileUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalMobileUrls
+	}
+	return nil
+}
+
+func (m *Ad) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func (m *Ad) GetFinalUrlSuffix() *wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrlSuffix
+	}
+	return nil
+}
+
+func (m *Ad) GetUrlCustomParameters() []*common.CustomParameter {
+	if m != nil {
+		return m.UrlCustomParameters
+	}
+	return nil
+}
+
+func (m *Ad) GetDisplayUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.DisplayUrl
+	}
+	return nil
+}
+
+func (m *Ad) GetType() enums.AdTypeEnum_AdType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.AdTypeEnum_UNSPECIFIED
+}
+
+func (m *Ad) GetAddedByGoogleAds() *wrappers.BoolValue {
+	if m != nil {
+		return m.AddedByGoogleAds
+	}
+	return nil
+}
+
+func (m *Ad) GetDevicePreference() enums.DeviceEnum_Device {
+	if m != nil {
+		return m.DevicePreference
+	}
+	return enums.DeviceEnum_UNSPECIFIED
+}
+
+func (m *Ad) GetUrlCollections() []*common.UrlCollection {
+	if m != nil {
+		return m.UrlCollections
+	}
+	return nil
+}
+
+func (m *Ad) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *Ad) GetSystemManagedResourceSource() enums.SystemManagedResourceSourceEnum_SystemManagedResourceSource {
+	if m != nil {
+		return m.SystemManagedResourceSource
+	}
+	return enums.SystemManagedResourceSourceEnum_UNSPECIFIED
+}
+
+type isAd_AdData interface {
+	isAd_AdData()
+}
+
+type Ad_TextAd struct {
+	TextAd *common.TextAdInfo `protobuf:"bytes,6,opt,name=text_ad,json=textAd,proto3,oneof"`
+}
+
+type Ad_ExpandedTextAd struct {
+	ExpandedTextAd *common.ExpandedTextAdInfo `protobuf:"bytes,7,opt,name=expanded_text_ad,json=expandedTextAd,proto3,oneof"`
+}
+
+type Ad_CallOnlyAd struct {
+	CallOnlyAd *common.CallOnlyAdInfo `protobuf:"bytes,13,opt,name=call_only_ad,json=callOnlyAd,proto3,oneof"`
+}
+
+type Ad_ExpandedDynamicSearchAd struct {
+	ExpandedDynamicSearchAd *common.ExpandedDynamicSearchAdInfo `protobuf:"bytes,14,opt,name=expanded_dynamic_search_ad,json=expandedDynamicSearchAd,proto3,oneof"`
+}
+
+type Ad_HotelAd struct {
+	HotelAd *common.HotelAdInfo `protobuf:"bytes,15,opt,name=hotel_ad,json=hotelAd,proto3,oneof"`
+}
+
+type Ad_ShoppingSmartAd struct {
+	ShoppingSmartAd *common.ShoppingSmartAdInfo `protobuf:"bytes,17,opt,name=shopping_smart_ad,json=shoppingSmartAd,proto3,oneof"`
+}
+
+type Ad_ShoppingProductAd struct {
+	ShoppingProductAd *common.ShoppingProductAdInfo `protobuf:"bytes,18,opt,name=shopping_product_ad,json=shoppingProductAd,proto3,oneof"`
+}
+
+type Ad_GmailAd struct {
+	GmailAd *common.GmailAdInfo `protobuf:"bytes,21,opt,name=gmail_ad,json=gmailAd,proto3,oneof"`
+}
+
+type Ad_ImageAd struct {
+	ImageAd *common.ImageAdInfo `protobuf:"bytes,22,opt,name=image_ad,json=imageAd,proto3,oneof"`
+}
+
+type Ad_VideoAd struct {
+	VideoAd *common.VideoAdInfo `protobuf:"bytes,24,opt,name=video_ad,json=videoAd,proto3,oneof"`
+}
+
+type Ad_ResponsiveSearchAd struct {
+	ResponsiveSearchAd *common.ResponsiveSearchAdInfo `protobuf:"bytes,25,opt,name=responsive_search_ad,json=responsiveSearchAd,proto3,oneof"`
+}
+
+type Ad_LegacyResponsiveDisplayAd struct {
+	LegacyResponsiveDisplayAd *common.LegacyResponsiveDisplayAdInfo `protobuf:"bytes,28,opt,name=legacy_responsive_display_ad,json=legacyResponsiveDisplayAd,proto3,oneof"`
+}
+
+type Ad_AppAd struct {
+	AppAd *common.AppAdInfo `protobuf:"bytes,29,opt,name=app_ad,json=appAd,proto3,oneof"`
+}
+
+type Ad_LegacyAppInstallAd struct {
+	LegacyAppInstallAd *common.LegacyAppInstallAdInfo `protobuf:"bytes,30,opt,name=legacy_app_install_ad,json=legacyAppInstallAd,proto3,oneof"`
+}
+
+type Ad_ResponsiveDisplayAd struct {
+	ResponsiveDisplayAd *common.ResponsiveDisplayAdInfo `protobuf:"bytes,31,opt,name=responsive_display_ad,json=responsiveDisplayAd,proto3,oneof"`
+}
+
+type Ad_DisplayUploadAd struct {
+	DisplayUploadAd *common.DisplayUploadAdInfo `protobuf:"bytes,33,opt,name=display_upload_ad,json=displayUploadAd,proto3,oneof"`
+}
+
+type Ad_AppEngagementAd struct {
+	AppEngagementAd *common.AppEngagementAdInfo `protobuf:"bytes,34,opt,name=app_engagement_ad,json=appEngagementAd,proto3,oneof"`
+}
+
+type Ad_ShoppingComparisonListingAd struct {
+	ShoppingComparisonListingAd *common.ShoppingComparisonListingAdInfo `protobuf:"bytes,36,opt,name=shopping_comparison_listing_ad,json=shoppingComparisonListingAd,proto3,oneof"`
+}
+
+func (*Ad_TextAd) isAd_AdData() {}
+
+func (*Ad_ExpandedTextAd) isAd_AdData() {}
+
+func (*Ad_CallOnlyAd) isAd_AdData() {}
+
+func (*Ad_ExpandedDynamicSearchAd) isAd_AdData() {}
+
+func (*Ad_HotelAd) isAd_AdData() {}
+
+func (*Ad_ShoppingSmartAd) isAd_AdData() {}
+
+func (*Ad_ShoppingProductAd) isAd_AdData() {}
+
+func (*Ad_GmailAd) isAd_AdData() {}
+
+func (*Ad_ImageAd) isAd_AdData() {}
+
+func (*Ad_VideoAd) isAd_AdData() {}
+
+func (*Ad_ResponsiveSearchAd) isAd_AdData() {}
+
+func (*Ad_LegacyResponsiveDisplayAd) isAd_AdData() {}
+
+func (*Ad_AppAd) isAd_AdData() {}
+
+func (*Ad_LegacyAppInstallAd) isAd_AdData() {}
+
+func (*Ad_ResponsiveDisplayAd) isAd_AdData() {}
+
+func (*Ad_DisplayUploadAd) isAd_AdData() {}
+
+func (*Ad_AppEngagementAd) isAd_AdData() {}
+
+func (*Ad_ShoppingComparisonListingAd) isAd_AdData() {}
+
+func (m *Ad) GetAdData() isAd_AdData {
+	if m != nil {
+		return m.AdData
+	}
+	return nil
+}
+
+func (m *Ad) GetTextAd() *common.TextAdInfo {
+	if x, ok := m.GetAdData().(*Ad_TextAd); ok {
+		return x.TextAd
+	}
+	return nil
+}
+
+func (m *Ad) GetExpandedTextAd() *common.ExpandedTextAdInfo {
+	if x, ok := m.GetAdData().(*Ad_ExpandedTextAd); ok {
+		return x.ExpandedTextAd
+	}
+	return nil
+}
+
+func (m *Ad) GetCallOnlyAd() *common.CallOnlyAdInfo {
+	if x, ok := m.GetAdData().(*Ad_CallOnlyAd); ok {
+		return x.CallOnlyAd
+	}
+	return nil
+}
+
+func (m *Ad) GetExpandedDynamicSearchAd() *common.ExpandedDynamicSearchAdInfo {
+	if x, ok := m.GetAdData().(*Ad_ExpandedDynamicSearchAd); ok {
+		return x.ExpandedDynamicSearchAd
+	}
+	return nil
+}
+
+func (m *Ad) GetHotelAd() *common.HotelAdInfo {
+	if x, ok := m.GetAdData().(*Ad_HotelAd); ok {
+		return x.HotelAd
+	}
+	return nil
+}
+
+func (m *Ad) GetShoppingSmartAd() *common.ShoppingSmartAdInfo {
+	if x, ok := m.GetAdData().(*Ad_ShoppingSmartAd); ok {
+		return x.ShoppingSmartAd
+	}
+	return nil
+}
+
+func (m *Ad) GetShoppingProductAd() *common.ShoppingProductAdInfo {
+	if x, ok := m.GetAdData().(*Ad_ShoppingProductAd); ok {
+		return x.ShoppingProductAd
+	}
+	return nil
+}
+
+func (m *Ad) GetGmailAd() *common.GmailAdInfo {
+	if x, ok := m.GetAdData().(*Ad_GmailAd); ok {
+		return x.GmailAd
+	}
+	return nil
+}
+
+func (m *Ad) GetImageAd() *common.ImageAdInfo {
+	if x, ok := m.GetAdData().(*Ad_ImageAd); ok {
+		return x.ImageAd
+	}
+	return nil
+}
+
+func (m *Ad) GetVideoAd() *common.VideoAdInfo {
+	if x, ok := m.GetAdData().(*Ad_VideoAd); ok {
+		return x.VideoAd
+	}
+	return nil
+}
+
+func (m *Ad) GetResponsiveSearchAd() *common.ResponsiveSearchAdInfo {
+	if x, ok := m.GetAdData().(*Ad_ResponsiveSearchAd); ok {
+		return x.ResponsiveSearchAd
+	}
+	return nil
+}
+
+func (m *Ad) GetLegacyResponsiveDisplayAd() *common.LegacyResponsiveDisplayAdInfo {
+	if x, ok := m.GetAdData().(*Ad_LegacyResponsiveDisplayAd); ok {
+		return x.LegacyResponsiveDisplayAd
+	}
+	return nil
+}
+
+func (m *Ad) GetAppAd() *common.AppAdInfo {
+	if x, ok := m.GetAdData().(*Ad_AppAd); ok {
+		return x.AppAd
+	}
+	return nil
+}
+
+func (m *Ad) GetLegacyAppInstallAd() *common.LegacyAppInstallAdInfo {
+	if x, ok := m.GetAdData().(*Ad_LegacyAppInstallAd); ok {
+		return x.LegacyAppInstallAd
+	}
+	return nil
+}
+
+func (m *Ad) GetResponsiveDisplayAd() *common.ResponsiveDisplayAdInfo {
+	if x, ok := m.GetAdData().(*Ad_ResponsiveDisplayAd); ok {
+		return x.ResponsiveDisplayAd
+	}
+	return nil
+}
+
+func (m *Ad) GetDisplayUploadAd() *common.DisplayUploadAdInfo {
+	if x, ok := m.GetAdData().(*Ad_DisplayUploadAd); ok {
+		return x.DisplayUploadAd
+	}
+	return nil
+}
+
+func (m *Ad) GetAppEngagementAd() *common.AppEngagementAdInfo {
+	if x, ok := m.GetAdData().(*Ad_AppEngagementAd); ok {
+		return x.AppEngagementAd
+	}
+	return nil
+}
+
+func (m *Ad) GetShoppingComparisonListingAd() *common.ShoppingComparisonListingAdInfo {
+	if x, ok := m.GetAdData().(*Ad_ShoppingComparisonListingAd); ok {
+		return x.ShoppingComparisonListingAd
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Ad) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Ad_TextAd)(nil),
+		(*Ad_ExpandedTextAd)(nil),
+		(*Ad_CallOnlyAd)(nil),
+		(*Ad_ExpandedDynamicSearchAd)(nil),
+		(*Ad_HotelAd)(nil),
+		(*Ad_ShoppingSmartAd)(nil),
+		(*Ad_ShoppingProductAd)(nil),
+		(*Ad_GmailAd)(nil),
+		(*Ad_ImageAd)(nil),
+		(*Ad_VideoAd)(nil),
+		(*Ad_ResponsiveSearchAd)(nil),
+		(*Ad_LegacyResponsiveDisplayAd)(nil),
+		(*Ad_AppAd)(nil),
+		(*Ad_LegacyAppInstallAd)(nil),
+		(*Ad_ResponsiveDisplayAd)(nil),
+		(*Ad_DisplayUploadAd)(nil),
+		(*Ad_AppEngagementAd)(nil),
+		(*Ad_ShoppingComparisonListingAd)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*Ad)(nil), "google.ads.googleads.v3.resources.Ad")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad.proto", fileDescriptor_65b02bf52a660238)
+}
+
+var fileDescriptor_65b02bf52a660238 = []byte{
+	// 1293 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x97, 0xdd, 0x72, 0xd4, 0x36,
+	0x14, 0xc7, 0xbb, 0x01, 0x92, 0x22, 0x42, 0x3e, 0x14, 0x52, 0x4c, 0x12, 0x68, 0x80, 0xd2, 0x49,
+	0x61, 0xea, 0x65, 0xb2, 0x85, 0xce, 0x2c, 0x65, 0xa8, 0x43, 0x02, 0x49, 0x07, 0xda, 0x74, 0x97,
+	0xe4, 0x82, 0x49, 0xeb, 0x51, 0x2c, 0xad, 0xe3, 0x22, 0x4b, 0x1a, 0xc9, 0x4e, 0xb3, 0x65, 0x98,
+	0xe9, 0x55, 0x5f, 0x83, 0x99, 0x5e, 0xf6, 0x51, 0xfa, 0x28, 0x5c, 0xf7, 0x01, 0x3a, 0x92, 0x6c,
+	0x6d, 0x36, 0x61, 0x63, 0xdf, 0x24, 0xfa, 0x38, 0xff, 0xdf, 0xff, 0xe8, 0xc8, 0x92, 0xbd, 0xe0,
+	0x6e, 0xcc, 0x79, 0x4c, 0x49, 0x13, 0x61, 0xd5, 0xb4, 0x4d, 0xdd, 0x3a, 0x6c, 0x35, 0x25, 0x51,
+	0x3c, 0x97, 0x11, 0x51, 0x4d, 0x84, 0x7d, 0x21, 0x79, 0xc6, 0xe1, 0x4d, 0x1b, 0xe0, 0x23, 0xac,
+	0x7c, 0x17, 0xeb, 0x1f, 0xb6, 0x7c, 0x17, 0xbb, 0xb0, 0x3a, 0x0a, 0x17, 0xf1, 0x34, 0xe5, 0xac,
+	0x89, 0x70, 0x98, 0xf5, 0x05, 0x09, 0x13, 0xd6, 0xe3, 0xca, 0x62, 0x17, 0x1e, 0x54, 0x68, 0xa2,
+	0x5c, 0x65, 0x3c, 0x0d, 0x05, 0x92, 0x28, 0x25, 0x19, 0x91, 0x85, 0xac, 0xca, 0xaa, 0x97, 0x30,
+	0x44, 0x43, 0x24, 0x44, 0x98, 0x4b, 0x5a, 0x68, 0x5a, 0x15, 0x9a, 0x5c, 0xd2, 0x30, 0xe2, 0x94,
+	0x92, 0x28, 0x4b, 0x38, 0x2b, 0x44, 0xf7, 0x46, 0x89, 0x08, 0xcb, 0x53, 0x55, 0x2e, 0xa9, 0x08,
+	0xbe, 0x7b, 0x76, 0x30, 0x26, 0x87, 0x49, 0x54, 0xc6, 0x7e, 0x7f, 0x76, 0xac, 0xea, 0xab, 0x8c,
+	0xa4, 0x61, 0x8a, 0x18, 0x8a, 0x09, 0x0e, 0x09, 0xcb, 0x92, 0xac, 0x1f, 0xda, 0x4a, 0x17, 0x84,
+	0x6b, 0x25, 0x41, 0x24, 0x6e, 0xc3, 0x8a, 0xa9, 0x1b, 0xc5, 0x94, 0xe9, 0xed, 0xe7, 0xbd, 0xe6,
+	0xef, 0x12, 0x09, 0x41, 0x64, 0x59, 0xf5, 0xa5, 0x63, 0x52, 0xc4, 0x18, 0xcf, 0x90, 0x5e, 0x72,
+	0x31, 0x7b, 0xeb, 0xfd, 0x55, 0x30, 0x16, 0x60, 0x78, 0x1b, 0x5c, 0x2e, 0xb1, 0x21, 0x43, 0x29,
+	0xf1, 0xee, 0x2c, 0x37, 0x56, 0x2e, 0x76, 0x26, 0xcb, 0xc1, 0x1f, 0x51, 0x4a, 0xe0, 0x3d, 0x30,
+	0x96, 0x60, 0xaf, 0xb1, 0xdc, 0x58, 0xb9, 0xb4, 0xba, 0x58, 0x3c, 0x18, 0x7e, 0x69, 0xeb, 0x6f,
+	0xb1, 0xec, 0xe1, 0x37, 0xbb, 0x88, 0xe6, 0xa4, 0x33, 0x96, 0x60, 0xf8, 0x08, 0x00, 0xbb, 0x31,
+	0xb9, 0xa4, 0xca, 0x1b, 0x5b, 0x3e, 0xb7, 0x72, 0x69, 0x75, 0xe9, 0x94, 0xa8, 0x9b, 0xc9, 0x84,
+	0xc5, 0x56, 0x75, 0xd1, 0xc4, 0xef, 0x48, 0xaa, 0xe0, 0xcf, 0x60, 0x6a, 0x68, 0x57, 0x95, 0x77,
+	0xdb, 0x00, 0xee, 0xf9, 0xa3, 0x9e, 0x4c, 0xbb, 0xaf, 0xfe, 0x33, 0xad, 0x0a, 0x84, 0xd8, 0x91,
+	0xb4, 0x33, 0xd9, 0x1b, 0x74, 0x14, 0xdc, 0x04, 0xb3, 0x16, 0x99, 0xf2, 0xfd, 0x84, 0x12, 0x4b,
+	0x9d, 0xa9, 0x91, 0xd6, 0xb4, 0x91, 0xbd, 0x34, 0x2a, 0x43, 0xda, 0x06, 0xf3, 0x99, 0x44, 0xd1,
+	0x9b, 0x84, 0xc5, 0x9a, 0x12, 0x66, 0x24, 0x15, 0x14, 0x65, 0xc4, 0x9b, 0x34, 0x95, 0x39, 0x9b,
+	0x36, 0x57, 0x4a, 0x77, 0x24, 0x7d, 0x55, 0x08, 0xe1, 0x33, 0x30, 0xe3, 0x6a, 0x15, 0xaa, 0xbc,
+	0xd7, 0x4b, 0x8e, 0xbc, 0x2f, 0x6b, 0xc0, 0xa6, 0xca, 0x8a, 0x75, 0x8d, 0x06, 0x46, 0x60, 0xde,
+	0x3c, 0xd8, 0x27, 0xce, 0x91, 0xf2, 0x80, 0x59, 0x67, 0xb3, 0xaa, 0x7a, 0x4f, 0x8d, 0x70, 0xbb,
+	0xd4, 0x75, 0xe6, 0x72, 0x49, 0x4f, 0x8c, 0x29, 0xf8, 0x18, 0x5c, 0xc2, 0x89, 0x12, 0x14, 0xf5,
+	0x75, 0xba, 0xde, 0xf9, 0x1a, 0x79, 0x82, 0x42, 0xb0, 0x23, 0x29, 0x5c, 0x07, 0xe7, 0xf5, 0x29,
+	0xf2, 0x2e, 0x2c, 0x37, 0x56, 0xa6, 0x56, 0xef, 0x8f, 0x4c, 0xc9, 0x1c, 0x0d, 0x3f, 0xc0, 0xaf,
+	0xfa, 0x82, 0x6c, 0xb0, 0x3c, 0x2d, 0x9a, 0x1d, 0xa3, 0x86, 0x5b, 0x60, 0x0e, 0x61, 0x4c, 0x70,
+	0xb8, 0xdf, 0x0f, 0xad, 0x2c, 0x44, 0x58, 0x79, 0x73, 0x26, 0x99, 0x85, 0x53, 0xc9, 0xac, 0x71,
+	0x4e, 0x6d, 0x2a, 0x33, 0x46, 0xb6, 0xd6, 0x7f, 0x6e, 0x22, 0x02, 0xac, 0xe0, 0x2f, 0x60, 0xd6,
+	0x1e, 0xd6, 0x50, 0x48, 0xd2, 0x23, 0x92, 0xb0, 0x88, 0x78, 0x57, 0x6a, 0x65, 0xb7, 0x6e, 0x74,
+	0x26, 0x3b, 0xdb, 0xec, 0xcc, 0x58, 0xd4, 0xb6, 0x23, 0xc1, 0x5d, 0x30, 0x3d, 0x7c, 0xd9, 0x28,
+	0x6f, 0xc1, 0xec, 0xc6, 0xd7, 0x55, 0xbb, 0xb1, 0x23, 0xe9, 0x53, 0xa7, 0xea, 0x4c, 0xe5, 0xc7,
+	0xbb, 0x0a, 0xde, 0x07, 0xe7, 0xcd, 0x41, 0xbd, 0x5a, 0xa3, 0xfe, 0x26, 0x12, 0xbe, 0x6f, 0x80,
+	0x1b, 0x27, 0xae, 0x1a, 0x77, 0xe6, 0xed, 0x3f, 0x6f, 0xd1, 0x2c, 0xfb, 0x75, 0xc5, 0xb2, 0xbb,
+	0x06, 0xf2, 0xd2, 0x32, 0x3a, 0x05, 0xa2, 0x6b, 0xfe, 0x9a, 0x5a, 0x9c, 0x31, 0xdf, 0x59, 0x54,
+	0xa3, 0x27, 0xe1, 0x06, 0x98, 0xc8, 0xc8, 0x51, 0x16, 0x22, 0xec, 0x8d, 0x9b, 0x65, 0xdd, 0xad,
+	0xaa, 0xd1, 0x2b, 0x72, 0x94, 0x05, 0x78, 0x8b, 0xf5, 0xf8, 0xe6, 0x27, 0x9d, 0xf1, 0xcc, 0xf4,
+	0xe0, 0xaf, 0x60, 0x86, 0x1c, 0x09, 0xc4, 0xf4, 0xf3, 0x51, 0xf2, 0x26, 0x0c, 0x6f, 0xb5, 0x8a,
+	0xb7, 0x51, 0xe8, 0x86, 0xb8, 0x53, 0x64, 0x68, 0x14, 0x76, 0xc0, 0x64, 0x84, 0x28, 0x0d, 0x39,
+	0xa3, 0x7d, 0xcd, 0xbe, 0x6c, 0xd8, 0x7e, 0xe5, 0xe9, 0x42, 0x94, 0xfe, 0xc4, 0x68, 0xdf, 0x71,
+	0x41, 0xe4, 0x46, 0xe0, 0x1f, 0x60, 0xc1, 0xe5, 0x8c, 0xfb, 0x0c, 0xa5, 0x49, 0x14, 0x2a, 0x82,
+	0x64, 0x74, 0xa0, 0x1d, 0xa6, 0x8c, 0xc3, 0xa3, 0xba, 0xd9, 0xaf, 0x5b, 0x40, 0xd7, 0xe8, 0x9d,
+	0xdd, 0x55, 0xf2, 0xf1, 0x69, 0xb8, 0x09, 0x3e, 0x3d, 0xe0, 0x19, 0xa1, 0xda, 0x69, 0xda, 0x38,
+	0x55, 0xde, 0xb3, 0x9b, 0x3a, 0xde, 0x91, 0x27, 0x0e, 0x6c, 0x17, 0x22, 0x30, 0xab, 0x0e, 0xb8,
+	0x10, 0xfa, 0x6a, 0x54, 0x29, 0x92, 0xa6, 0xf4, 0xb3, 0x06, 0xd9, 0xaa, 0x42, 0x76, 0x0b, 0x61,
+	0x57, 0xeb, 0x1c, 0x7a, 0x5a, 0x0d, 0x0f, 0xc3, 0x18, 0xcc, 0x39, 0x0b, 0x21, 0x39, 0xce, 0x23,
+	0x63, 0x02, 0x8d, 0xc9, 0x83, 0xba, 0x26, 0xdb, 0x56, 0xe9, 0x6c, 0x5c, 0xda, 0x6e, 0x42, 0x57,
+	0x25, 0x4e, 0x51, 0x62, 0xaa, 0x32, 0x5f, 0xaf, 0x2a, 0xcf, 0x75, 0xfc, 0xa0, 0x2a, 0xb1, 0xed,
+	0x6a, 0x52, 0x92, 0xa2, 0x58, 0x5f, 0x51, 0xde, 0x67, 0xf5, 0x48, 0x5b, 0x3a, 0x7e, 0x40, 0x4a,
+	0x6c, 0x57, 0x93, 0x0e, 0x13, 0x4c, 0xb8, 0x26, 0x79, 0xf5, 0x48, 0xbb, 0x3a, 0x7e, 0x40, 0x3a,
+	0xb4, 0x5d, 0xf8, 0x1b, 0xb8, 0x22, 0x89, 0x12, 0x9c, 0xa9, 0xe4, 0x90, 0x1c, 0x7b, 0xd2, 0xae,
+	0x19, 0xea, 0xc3, 0x2a, 0x6a, 0xc7, 0x69, 0x4f, 0x3c, 0x64, 0x50, 0x9e, 0x9a, 0x81, 0x7f, 0x36,
+	0xc0, 0x12, 0x25, 0x31, 0x8a, 0xfa, 0xe1, 0x31, 0xcf, 0xf2, 0x25, 0x82, 0xb0, 0xb7, 0x64, 0x4c,
+	0x1f, 0x57, 0x99, 0xbe, 0x30, 0x8c, 0x81, 0xf5, 0xba, 0x25, 0x38, 0xef, 0x6b, 0x74, 0x54, 0x00,
+	0x5c, 0x03, 0xe3, 0xfa, 0x53, 0x02, 0x61, 0xef, 0xba, 0xf1, 0xfa, 0xaa, 0xca, 0x2b, 0x10, 0xc2,
+	0x71, 0x2f, 0x20, 0xdd, 0x81, 0x6f, 0xc0, 0x7c, 0xb1, 0x0a, 0x8d, 0x4a, 0x98, 0xca, 0xf4, 0x25,
+	0x80, 0xb0, 0x77, 0xa3, 0x5e, 0xcd, 0x6c, 0xfa, 0x81, 0x10, 0x5b, 0x56, 0x3a, 0xa8, 0x19, 0x3d,
+	0x35, 0x03, 0x53, 0x30, 0xff, 0xf1, 0x5a, 0x7d, 0x6e, 0xcc, 0xbe, 0xad, 0xbf, 0x41, 0x27, 0xab,
+	0x34, 0x27, 0x3f, 0x52, 0x1f, 0x04, 0x66, 0xdd, 0x4b, 0x5d, 0x50, 0x8e, 0xb0, 0xb6, 0xba, 0x59,
+	0xef, 0xe0, 0x16, 0x94, 0x1d, 0xa3, 0x1b, 0x1c, 0x5c, 0x3c, 0x3c, 0xac, 0x2d, 0x74, 0xdd, 0x08,
+	0x8b, 0x51, 0x4c, 0x52, 0xc2, 0xcc, 0xb1, 0xbd, 0x55, 0xcf, 0x22, 0x10, 0x62, 0xc3, 0xe9, 0x06,
+	0x16, 0x68, 0x78, 0x18, 0xfe, 0xa5, 0xdf, 0x70, 0xe5, 0xe5, 0x10, 0xf1, 0x54, 0x20, 0x99, 0x28,
+	0xce, 0x42, 0x9a, 0xa8, 0x4c, 0x0f, 0x21, 0xec, 0x7d, 0x61, 0x0c, 0x9f, 0xd4, 0xbd, 0x27, 0x9e,
+	0x3a, 0xc8, 0x0b, 0xcb, 0x70, 0xe6, 0x8b, 0x6a, 0x74, 0x48, 0xfb, 0xc9, 0x87, 0xe0, 0x3b, 0xb0,
+	0x38, 0x00, 0x17, 0x2d, 0x91, 0x28, 0x6d, 0xd0, 0x0c, 0x30, 0xbc, 0x6e, 0x3f, 0xd2, 0x88, 0x54,
+	0xcd, 0xb7, 0x65, 0xf3, 0x9d, 0xf9, 0x81, 0xf0, 0x16, 0xe1, 0x77, 0x6b, 0x17, 0xc1, 0x04, 0xc2,
+	0x21, 0x46, 0x19, 0x5a, 0xfb, 0xaf, 0x01, 0xee, 0x44, 0x3c, 0xf5, 0x2b, 0x7f, 0x93, 0xad, 0x4d,
+	0x04, 0x78, 0x5b, 0xbf, 0xfe, 0xb7, 0x1b, 0xaf, 0x7f, 0x28, 0xa2, 0x63, 0x4e, 0x11, 0x8b, 0x7d,
+	0x2e, 0xe3, 0x66, 0x4c, 0x98, 0xf9, 0x38, 0x68, 0x0e, 0x92, 0x39, 0xe3, 0xc7, 0xe0, 0x23, 0xd7,
+	0xfa, 0x7b, 0xec, 0xdc, 0xf3, 0x20, 0xf8, 0x67, 0xec, 0xa6, 0xfd, 0x64, 0xf2, 0x03, 0xac, 0x7c,
+	0xf7, 0xf5, 0xe4, 0xef, 0xb6, 0xfc, 0xf2, 0x25, 0xae, 0xfe, 0x2d, 0x63, 0xf6, 0x02, 0xac, 0xf6,
+	0x5c, 0xcc, 0xde, 0x6e, 0x6b, 0xcf, 0xc5, 0x7c, 0x18, 0xbb, 0x63, 0x27, 0xda, 0xed, 0x00, 0xab,
+	0x76, 0xdb, 0x45, 0xb5, 0xdb, 0xbb, 0xad, 0x76, 0xdb, 0xc5, 0xed, 0x8f, 0x9b, 0x64, 0x5b, 0xff,
+	0x07, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x92, 0xc5, 0xb4, 0xb8, 0x0e, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group.pb.go b/googleapis/ads/googleads/v3/resources/ad_group.pb.go
new file mode 100644
index 0000000..2b1b26a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group.pb.go
@@ -0,0 +1,399 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad group.
+type AdGroup struct {
+	// The resource name of the ad group.
+	// Ad group resource names have the form:
+	//
+	// `customers/{customer_id}/adGroups/{ad_group_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the ad group.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the ad group.
+	//
+	// This field is required and should not be empty when creating new ad
+	// groups.
+	//
+	// It must contain fewer than 255 UTF-8 full-width characters.
+	//
+	// It must not contain any null (code point 0x0), NL line feed
+	// (code point 0xA) or carriage return (code point 0xD) characters.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The status of the ad group.
+	Status enums.AdGroupStatusEnum_AdGroupStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.AdGroupStatusEnum_AdGroupStatus" json:"status,omitempty"`
+	// The type of the ad group.
+	Type enums.AdGroupTypeEnum_AdGroupType `protobuf:"varint,12,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.AdGroupTypeEnum_AdGroupType" json:"type,omitempty"`
+	// The ad rotation mode of the ad group.
+	AdRotationMode enums.AdGroupAdRotationModeEnum_AdGroupAdRotationMode `protobuf:"varint,22,opt,name=ad_rotation_mode,json=adRotationMode,proto3,enum=google.ads.googleads.v3.enums.AdGroupAdRotationModeEnum_AdGroupAdRotationMode" json:"ad_rotation_mode,omitempty"`
+	// For draft or experiment ad groups, this field is the resource name of the
+	// base ad group from which this ad group was created. If a draft or
+	// experiment ad group does not have a base ad group, then this field is null.
+	//
+	// For base ad groups, this field equals the ad group resource name.
+	//
+	// This field is read-only.
+	BaseAdGroup *wrappers.StringValue `protobuf:"bytes,18,opt,name=base_ad_group,json=baseAdGroup,proto3" json:"base_ad_group,omitempty"`
+	// The URL template for constructing a tracking URL.
+	TrackingUrlTemplate *wrappers.StringValue `protobuf:"bytes,13,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	// The list of mappings used to substitute custom parameter tags in a
+	// `tracking_url_template`, `final_urls`, or `mobile_final_urls`.
+	UrlCustomParameters []*common.CustomParameter `protobuf:"bytes,6,rep,name=url_custom_parameters,json=urlCustomParameters,proto3" json:"url_custom_parameters,omitempty"`
+	// The campaign to which the ad group belongs.
+	Campaign *wrappers.StringValue `protobuf:"bytes,10,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// The maximum CPC (cost-per-click) bid.
+	CpcBidMicros *wrappers.Int64Value `protobuf:"bytes,14,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
+	// The maximum CPM (cost-per-thousand viewable impressions) bid.
+	CpmBidMicros *wrappers.Int64Value `protobuf:"bytes,15,opt,name=cpm_bid_micros,json=cpmBidMicros,proto3" json:"cpm_bid_micros,omitempty"`
+	// The target CPA (cost-per-acquisition).
+	TargetCpaMicros *wrappers.Int64Value `protobuf:"bytes,27,opt,name=target_cpa_micros,json=targetCpaMicros,proto3" json:"target_cpa_micros,omitempty"`
+	// The CPV (cost-per-view) bid.
+	CpvBidMicros *wrappers.Int64Value `protobuf:"bytes,17,opt,name=cpv_bid_micros,json=cpvBidMicros,proto3" json:"cpv_bid_micros,omitempty"`
+	// Average amount in micros that the advertiser is willing to pay for every
+	// thousand times the ad is shown.
+	TargetCpmMicros *wrappers.Int64Value `protobuf:"bytes,26,opt,name=target_cpm_micros,json=targetCpmMicros,proto3" json:"target_cpm_micros,omitempty"`
+	// The target ROAS (return-on-ad-spend) override. If the ad group's campaign
+	// bidding strategy is a standard Target ROAS strategy, then this field
+	// overrides the target ROAS specified in the campaign's bidding strategy.
+	// Otherwise, this value is ignored.
+	TargetRoas *wrappers.DoubleValue `protobuf:"bytes,30,opt,name=target_roas,json=targetRoas,proto3" json:"target_roas,omitempty"`
+	// The percent cpc bid amount, expressed as a fraction of the advertised price
+	// for some good or service. The valid range for the fraction is [0,1) and the
+	// value stored here is 1,000,000 * [fraction].
+	PercentCpcBidMicros *wrappers.Int64Value `protobuf:"bytes,20,opt,name=percent_cpc_bid_micros,json=percentCpcBidMicros,proto3" json:"percent_cpc_bid_micros,omitempty"`
+	// Settings for the Display Campaign Optimizer, initially termed "Explorer".
+	ExplorerAutoOptimizerSetting *common.ExplorerAutoOptimizerSetting `protobuf:"bytes,21,opt,name=explorer_auto_optimizer_setting,json=explorerAutoOptimizerSetting,proto3" json:"explorer_auto_optimizer_setting,omitempty"`
+	// Allows advertisers to specify a targeting dimension on which to place
+	// absolute bids. This is only applicable for campaigns that target only the
+	// display network and not search.
+	DisplayCustomBidDimension enums.TargetingDimensionEnum_TargetingDimension `protobuf:"varint,23,opt,name=display_custom_bid_dimension,json=displayCustomBidDimension,proto3,enum=google.ads.googleads.v3.enums.TargetingDimensionEnum_TargetingDimension" json:"display_custom_bid_dimension,omitempty"`
+	// URL template for appending params to Final URL.
+	FinalUrlSuffix *wrappers.StringValue `protobuf:"bytes,24,opt,name=final_url_suffix,json=finalUrlSuffix,proto3" json:"final_url_suffix,omitempty"`
+	// Setting for targeting related features.
+	TargetingSetting *common.TargetingSetting `protobuf:"bytes,25,opt,name=targeting_setting,json=targetingSetting,proto3" json:"targeting_setting,omitempty"`
+	// The effective target CPA (cost-per-acquisition).
+	// This field is read-only.
+	EffectiveTargetCpaMicros *wrappers.Int64Value `protobuf:"bytes,28,opt,name=effective_target_cpa_micros,json=effectiveTargetCpaMicros,proto3" json:"effective_target_cpa_micros,omitempty"`
+	// Source of the effective target CPA.
+	// This field is read-only.
+	EffectiveTargetCpaSource enums.BiddingSourceEnum_BiddingSource `protobuf:"varint,29,opt,name=effective_target_cpa_source,json=effectiveTargetCpaSource,proto3,enum=google.ads.googleads.v3.enums.BiddingSourceEnum_BiddingSource" json:"effective_target_cpa_source,omitempty"`
+	// The effective target ROAS (return-on-ad-spend).
+	// This field is read-only.
+	EffectiveTargetRoas *wrappers.DoubleValue `protobuf:"bytes,31,opt,name=effective_target_roas,json=effectiveTargetRoas,proto3" json:"effective_target_roas,omitempty"`
+	// Source of the effective target ROAS.
+	// This field is read-only.
+	EffectiveTargetRoasSource enums.BiddingSourceEnum_BiddingSource `protobuf:"varint,32,opt,name=effective_target_roas_source,json=effectiveTargetRoasSource,proto3,enum=google.ads.googleads.v3.enums.BiddingSourceEnum_BiddingSource" json:"effective_target_roas_source,omitempty"`
+	// The resource names of labels attached to this ad group.
+	Labels               []*wrappers.StringValue `protobuf:"bytes,33,rep,name=labels,proto3" json:"labels,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *AdGroup) Reset()         { *m = AdGroup{} }
+func (m *AdGroup) String() string { return proto.CompactTextString(m) }
+func (*AdGroup) ProtoMessage()    {}
+func (*AdGroup) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3478586bae6468dc, []int{0}
+}
+
+func (m *AdGroup) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroup.Unmarshal(m, b)
+}
+func (m *AdGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroup.Marshal(b, m, deterministic)
+}
+func (m *AdGroup) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroup.Merge(m, src)
+}
+func (m *AdGroup) XXX_Size() int {
+	return xxx_messageInfo_AdGroup.Size(m)
+}
+func (m *AdGroup) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroup.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroup proto.InternalMessageInfo
+
+func (m *AdGroup) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroup) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *AdGroup) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *AdGroup) GetStatus() enums.AdGroupStatusEnum_AdGroupStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.AdGroupStatusEnum_UNSPECIFIED
+}
+
+func (m *AdGroup) GetType() enums.AdGroupTypeEnum_AdGroupType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.AdGroupTypeEnum_UNSPECIFIED
+}
+
+func (m *AdGroup) GetAdRotationMode() enums.AdGroupAdRotationModeEnum_AdGroupAdRotationMode {
+	if m != nil {
+		return m.AdRotationMode
+	}
+	return enums.AdGroupAdRotationModeEnum_UNSPECIFIED
+}
+
+func (m *AdGroup) GetBaseAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.BaseAdGroup
+	}
+	return nil
+}
+
+func (m *AdGroup) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func (m *AdGroup) GetUrlCustomParameters() []*common.CustomParameter {
+	if m != nil {
+		return m.UrlCustomParameters
+	}
+	return nil
+}
+
+func (m *AdGroup) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *AdGroup) GetCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroup) GetCpmBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpmBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroup) GetTargetCpaMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TargetCpaMicros
+	}
+	return nil
+}
+
+func (m *AdGroup) GetCpvBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpvBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroup) GetTargetCpmMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TargetCpmMicros
+	}
+	return nil
+}
+
+func (m *AdGroup) GetTargetRoas() *wrappers.DoubleValue {
+	if m != nil {
+		return m.TargetRoas
+	}
+	return nil
+}
+
+func (m *AdGroup) GetPercentCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.PercentCpcBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroup) GetExplorerAutoOptimizerSetting() *common.ExplorerAutoOptimizerSetting {
+	if m != nil {
+		return m.ExplorerAutoOptimizerSetting
+	}
+	return nil
+}
+
+func (m *AdGroup) GetDisplayCustomBidDimension() enums.TargetingDimensionEnum_TargetingDimension {
+	if m != nil {
+		return m.DisplayCustomBidDimension
+	}
+	return enums.TargetingDimensionEnum_UNSPECIFIED
+}
+
+func (m *AdGroup) GetFinalUrlSuffix() *wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrlSuffix
+	}
+	return nil
+}
+
+func (m *AdGroup) GetTargetingSetting() *common.TargetingSetting {
+	if m != nil {
+		return m.TargetingSetting
+	}
+	return nil
+}
+
+func (m *AdGroup) GetEffectiveTargetCpaMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.EffectiveTargetCpaMicros
+	}
+	return nil
+}
+
+func (m *AdGroup) GetEffectiveTargetCpaSource() enums.BiddingSourceEnum_BiddingSource {
+	if m != nil {
+		return m.EffectiveTargetCpaSource
+	}
+	return enums.BiddingSourceEnum_UNSPECIFIED
+}
+
+func (m *AdGroup) GetEffectiveTargetRoas() *wrappers.DoubleValue {
+	if m != nil {
+		return m.EffectiveTargetRoas
+	}
+	return nil
+}
+
+func (m *AdGroup) GetEffectiveTargetRoasSource() enums.BiddingSourceEnum_BiddingSource {
+	if m != nil {
+		return m.EffectiveTargetRoasSource
+	}
+	return enums.BiddingSourceEnum_UNSPECIFIED
+}
+
+func (m *AdGroup) GetLabels() []*wrappers.StringValue {
+	if m != nil {
+		return m.Labels
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AdGroup)(nil), "google.ads.googleads.v3.resources.AdGroup")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group.proto", fileDescriptor_3478586bae6468dc)
+}
+
+var fileDescriptor_3478586bae6468dc = []byte{
+	// 1026 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xdd, 0x6e, 0xe4, 0x34,
+	0x14, 0xc7, 0x35, 0x6d, 0x29, 0xe0, 0x7e, 0x6c, 0x9b, 0xd2, 0x25, 0x6d, 0x87, 0xdd, 0x29, 0x68,
+	0xa5, 0x4a, 0x48, 0x49, 0xe9, 0x2c, 0x0b, 0x0a, 0x2c, 0x22, 0x6d, 0x97, 0x02, 0x62, 0xbb, 0x55,
+	0xda, 0xed, 0xc5, 0xaa, 0x28, 0xf2, 0xc4, 0x9e, 0xc8, 0x22, 0x89, 0x23, 0xdb, 0x29, 0x2d, 0xab,
+	0x8a, 0x0b, 0xae, 0x78, 0x0d, 0x2e, 0x79, 0x06, 0x9e, 0x80, 0x47, 0xd9, 0x37, 0xe0, 0x0e, 0xc5,
+	0x1f, 0x99, 0x8f, 0x76, 0x26, 0x41, 0xe2, 0xce, 0xf1, 0x39, 0xff, 0x9f, 0x8f, 0xed, 0x73, 0x7c,
+	0x02, 0x76, 0x63, 0x4a, 0xe3, 0x04, 0xbb, 0x10, 0x71, 0x57, 0x0d, 0xcb, 0xd1, 0x65, 0xd7, 0x65,
+	0x98, 0xd3, 0x82, 0x45, 0x98, 0xbb, 0x10, 0x85, 0x31, 0xa3, 0x45, 0xee, 0xe4, 0x8c, 0x0a, 0x6a,
+	0x6d, 0x2b, 0x37, 0x07, 0x22, 0xee, 0x54, 0x0a, 0xe7, 0xb2, 0xeb, 0x54, 0x8a, 0xcd, 0x4f, 0x27,
+	0x41, 0x23, 0x9a, 0xa6, 0x34, 0x73, 0xa3, 0x82, 0x0b, 0x9a, 0x86, 0x39, 0x64, 0x30, 0xc5, 0x02,
+	0x33, 0x45, 0xde, 0x3c, 0xac, 0x91, 0xe1, 0xab, 0x3c, 0xa1, 0x0c, 0xb3, 0x10, 0x16, 0x82, 0x86,
+	0x34, 0x17, 0x24, 0x25, 0xbf, 0x60, 0x16, 0x72, 0x2c, 0x04, 0xc9, 0x62, 0x4d, 0x79, 0x52, 0x43,
+	0x11, 0x90, 0xc5, 0xb8, 0xf4, 0x1f, 0xd3, 0x3d, 0x9d, 0xa4, 0xc3, 0x59, 0x91, 0x0e, 0x4e, 0x21,
+	0x84, 0x28, 0x64, 0x54, 0x40, 0x41, 0x68, 0x16, 0xa6, 0x14, 0x61, 0x2d, 0xef, 0x36, 0x94, 0x73,
+	0x01, 0x45, 0xc1, 0xb5, 0xe8, 0x93, 0x86, 0x22, 0x71, 0x9d, 0x9b, 0x75, 0xf6, 0xa6, 0x4b, 0x7a,
+	0x04, 0x21, 0xb9, 0x37, 0x79, 0x15, 0x5a, 0xf3, 0xd9, 0x74, 0xcd, 0xe0, 0x44, 0x10, 0x49, 0x71,
+	0xc6, 0x09, 0xcd, 0xb4, 0x70, 0xc3, 0x08, 0x73, 0x52, 0x25, 0x84, 0x36, 0x3d, 0xd0, 0x26, 0xf9,
+	0xd5, 0x2b, 0xfa, 0xee, 0xcf, 0x0c, 0xe6, 0x39, 0x66, 0x66, 0x6b, 0xed, 0x21, 0x29, 0xcc, 0x32,
+	0x7d, 0x62, 0xda, 0xfa, 0xe1, 0x5f, 0xab, 0xe0, 0x6d, 0x1f, 0x1d, 0x95, 0x9b, 0xb3, 0x3e, 0x02,
+	0x4b, 0x86, 0x1d, 0x66, 0x30, 0xc5, 0x76, 0xab, 0xd3, 0xda, 0x79, 0x37, 0x58, 0x34, 0x93, 0xc7,
+	0x30, 0xc5, 0xd6, 0xc7, 0x60, 0x86, 0x20, 0x7b, 0xb6, 0xd3, 0xda, 0x59, 0xd8, 0xdb, 0xd2, 0x79,
+	0xe7, 0x98, 0xb5, 0x9d, 0xef, 0x32, 0xf1, 0xe4, 0xf1, 0x39, 0x4c, 0x0a, 0x1c, 0xcc, 0x10, 0x64,
+	0xed, 0x82, 0x39, 0x09, 0x9a, 0x93, 0xee, 0xed, 0x5b, 0xee, 0xa7, 0x82, 0x91, 0x2c, 0x56, 0xfe,
+	0xd2, 0xd3, 0x3a, 0x07, 0xf3, 0xea, 0x62, 0xec, 0xb7, 0x3a, 0xad, 0x9d, 0xe5, 0xbd, 0xaf, 0x9c,
+	0x49, 0x59, 0x2e, 0x8f, 0xcc, 0xd1, 0xb1, 0x9f, 0x4a, 0xcd, 0xb3, 0xac, 0x48, 0x47, 0x67, 0x02,
+	0x4d, 0xb3, 0x8e, 0xc1, 0x5c, 0x79, 0x77, 0xf6, 0xa2, 0xa4, 0x7a, 0xcd, 0xa8, 0x67, 0xd7, 0x39,
+	0x1e, 0x66, 0x96, 0xdf, 0x81, 0xe4, 0x58, 0x57, 0x60, 0x65, 0x3c, 0xff, 0xec, 0xfb, 0x92, 0x7d,
+	0xdc, 0x8c, 0xed, 0xa3, 0x40, 0x8b, 0x9f, 0x53, 0x34, 0xb2, 0xca, 0xa8, 0x25, 0x58, 0x86, 0x23,
+	0xdf, 0xd6, 0xd7, 0x60, 0xa9, 0x07, 0x39, 0x0e, 0x4d, 0x4e, 0xda, 0x56, 0x83, 0xc3, 0x5d, 0x28,
+	0x25, 0xe6, 0x9e, 0x4f, 0xc0, 0xba, 0x60, 0x30, 0xfa, 0xa9, 0x4c, 0xb4, 0x82, 0x25, 0xa1, 0xc0,
+	0x69, 0x9e, 0x40, 0x81, 0xed, 0xa5, 0x06, 0xa4, 0x35, 0x23, 0x7d, 0xc9, 0x92, 0x33, 0x2d, 0xb4,
+	0x22, 0xb0, 0x5e, 0x82, 0xc6, 0x9f, 0x13, 0x6e, 0xcf, 0x77, 0x66, 0x77, 0x16, 0xf6, 0xdc, 0x89,
+	0x47, 0xa2, 0x9e, 0x02, 0xe7, 0x40, 0x0a, 0x4f, 0x8c, 0x2e, 0x58, 0x2b, 0x58, 0x32, 0x36, 0xc7,
+	0xad, 0xcf, 0xc1, 0x3b, 0x11, 0x4c, 0x73, 0x48, 0xe2, 0xcc, 0x06, 0x0d, 0x22, 0xad, 0xbc, 0x2d,
+	0x1f, 0x2c, 0x47, 0x79, 0x14, 0xf6, 0x08, 0x0a, 0x53, 0x12, 0x31, 0xca, 0xed, 0xe5, 0xfa, 0xfc,
+	0x5d, 0x8c, 0xf2, 0x68, 0x9f, 0xa0, 0xe7, 0x52, 0xa0, 0x10, 0xe9, 0x30, 0xe2, 0x5e, 0x23, 0x44,
+	0x3a, 0x40, 0x1c, 0x81, 0x55, 0x55, 0xe0, 0x61, 0x94, 0x43, 0x43, 0xd9, 0xaa, 0xa7, 0xdc, 0x53,
+	0xaa, 0x83, 0x1c, 0x0e, 0xc7, 0x72, 0x39, 0x1c, 0xcb, 0x6a, 0xa3, 0x58, 0x2e, 0xef, 0x8e, 0x25,
+	0x35, 0x94, 0xcd, 0xff, 0x10, 0x4b, 0xaa, 0x41, 0x4f, 0xc1, 0x82, 0x06, 0x31, 0x0a, 0xb9, 0xfd,
+	0x60, 0xc2, 0xbd, 0x1c, 0xd2, 0xa2, 0x97, 0x60, 0xc5, 0x00, 0x4a, 0x10, 0x50, 0xc8, 0xad, 0x13,
+	0x70, 0x3f, 0xc7, 0x2c, 0xc2, 0x59, 0x19, 0xc8, 0xc8, 0x0d, 0xbd, 0x57, 0x1f, 0xcc, 0x9a, 0x96,
+	0x1e, 0x0c, 0x5f, 0xd4, 0x6f, 0x2d, 0xf0, 0xb0, 0xa6, 0x3f, 0xd9, 0xeb, 0x92, 0xfd, 0x65, 0x5d,
+	0x56, 0x3e, 0xd3, 0x18, 0xbf, 0x10, 0xf4, 0x85, 0x81, 0x9c, 0x2a, 0x46, 0xd0, 0xc6, 0x53, 0xac,
+	0xd6, 0xef, 0x2d, 0xd0, 0x46, 0x84, 0xe7, 0x09, 0xbc, 0x36, 0x55, 0x51, 0xee, 0xad, 0x7a, 0xd6,
+	0xed, 0xf7, 0xe5, 0x5b, 0xf1, 0x6d, 0xcd, 0x5b, 0x71, 0x66, 0x1a, 0xc2, 0xa1, 0x11, 0xca, 0x87,
+	0xe2, 0xf6, 0x74, 0xb0, 0xa1, 0x57, 0x53, 0x55, 0xb3, 0x4f, 0x50, 0x65, 0xb2, 0xbe, 0x01, 0x2b,
+	0x7d, 0x92, 0xc1, 0x44, 0xd6, 0x3a, 0x2f, 0xfa, 0x7d, 0x72, 0x65, 0xdb, 0x0d, 0xea, 0x67, 0x59,
+	0xaa, 0x5e, 0xb2, 0xe4, 0x54, 0x6a, 0xac, 0x1f, 0x4d, 0xce, 0x0c, 0xb5, 0x6c, 0x7b, 0x43, 0x82,
+	0x76, 0xeb, 0x8e, 0xb2, 0x8a, 0xd8, 0x1c, 0xdf, 0x8a, 0x18, 0x9b, 0xb1, 0x5e, 0x81, 0x2d, 0xdc,
+	0xef, 0xe3, 0x48, 0x90, 0x4b, 0x1c, 0xde, 0x2e, 0x94, 0x76, 0x7d, 0x3e, 0xd8, 0x95, 0xfe, 0x6c,
+	0xac, 0x62, 0x6e, 0x26, 0xb0, 0x55, 0x5f, 0xb3, 0x3f, 0x68, 0xd4, 0x6a, 0xf6, 0x55, 0x47, 0x3f,
+	0x95, 0x1a, 0x79, 0x0f, 0x23, 0x33, 0x77, 0x2d, 0xaf, 0x2c, 0xe5, 0x83, 0x7b, 0x6b, 0x79, 0x59,
+	0x2e, 0x0f, 0x1b, 0x94, 0xcb, 0xda, 0x18, 0x56, 0xd6, 0xcd, 0xaf, 0xa0, 0x7d, 0x27, 0xd1, 0xec,
+	0xa8, 0xf3, 0xbf, 0xec, 0x68, 0xe3, 0x8e, 0xa5, 0xf5, 0x96, 0x1e, 0x83, 0xf9, 0x04, 0xf6, 0x70,
+	0xc2, 0xed, 0x6d, 0xf9, 0xc4, 0x4f, 0x4f, 0x25, 0xed, 0xeb, 0xbd, 0x78, 0xe3, 0xff, 0x00, 0x3a,
+	0x83, 0x48, 0xf4, 0x28, 0x27, 0xbc, 0x4c, 0x14, 0xd7, 0x34, 0xa8, 0x1d, 0x55, 0x32, 0x98, 0x71,
+	0xf7, 0xb5, 0x19, 0xde, 0xb8, 0x50, 0x59, 0xb9, 0xfb, 0xda, 0xb4, 0xbe, 0x9b, 0xfd, 0x7f, 0x5a,
+	0xe0, 0x51, 0x44, 0x53, 0xa7, 0xf6, 0x57, 0x78, 0x7f, 0x51, 0xc3, 0x4f, 0xca, 0xf8, 0x4e, 0x5a,
+	0xaf, 0xbe, 0xd7, 0x92, 0x98, 0x26, 0x30, 0x8b, 0x1d, 0xca, 0x62, 0x37, 0xc6, 0x99, 0x8c, 0xde,
+	0x1d, 0x84, 0x35, 0xe5, 0x77, 0xfc, 0x8b, 0x6a, 0xf4, 0xc7, 0xcc, 0xec, 0x91, 0xef, 0xff, 0x39,
+	0xb3, 0x7d, 0xa4, 0x90, 0x3e, 0xe2, 0x8e, 0x1a, 0x96, 0xa3, 0xf3, 0xae, 0x13, 0x18, 0xcf, 0xbf,
+	0x8d, 0xcf, 0x85, 0x8f, 0xf8, 0x45, 0xe5, 0x73, 0x71, 0xde, 0xbd, 0xa8, 0x7c, 0xde, 0xcc, 0x3c,
+	0x52, 0x06, 0xcf, 0xf3, 0x11, 0xf7, 0xbc, 0xca, 0xcb, 0xf3, 0xce, 0xbb, 0x9e, 0x57, 0xf9, 0xf5,
+	0xe6, 0x65, 0xb0, 0xdd, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x0f, 0xe9, 0xf5, 0xae, 0x3a, 0x0c,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_ad.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_ad.pb.go
new file mode 100644
index 0000000..3ebda82
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_ad.pb.go
@@ -0,0 +1,228 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_ad.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad group ad.
+type AdGroupAd struct {
+	// The resource name of the ad.
+	// Ad group ad resource names have the form:
+	//
+	// `customers/{customer_id}/adGroupAds/{ad_group_id}~{ad_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The status of the ad.
+	Status enums.AdGroupAdStatusEnum_AdGroupAdStatus `protobuf:"varint,3,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.AdGroupAdStatusEnum_AdGroupAdStatus" json:"status,omitempty"`
+	// The ad group to which the ad belongs.
+	AdGroup *wrappers.StringValue `protobuf:"bytes,4,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// The ad.
+	Ad *Ad `protobuf:"bytes,5,opt,name=ad,proto3" json:"ad,omitempty"`
+	// Policy information for the ad.
+	PolicySummary *AdGroupAdPolicySummary `protobuf:"bytes,6,opt,name=policy_summary,json=policySummary,proto3" json:"policy_summary,omitempty"`
+	// Overall ad strength for this ad group ad.
+	AdStrength           enums.AdStrengthEnum_AdStrength `protobuf:"varint,7,opt,name=ad_strength,json=adStrength,proto3,enum=google.ads.googleads.v3.enums.AdStrengthEnum_AdStrength" json:"ad_strength,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *AdGroupAd) Reset()         { *m = AdGroupAd{} }
+func (m *AdGroupAd) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAd) ProtoMessage()    {}
+func (*AdGroupAd) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1ed4b3c949da8cd1, []int{0}
+}
+
+func (m *AdGroupAd) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAd.Unmarshal(m, b)
+}
+func (m *AdGroupAd) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAd.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAd) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAd.Merge(m, src)
+}
+func (m *AdGroupAd) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAd.Size(m)
+}
+func (m *AdGroupAd) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAd.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAd proto.InternalMessageInfo
+
+func (m *AdGroupAd) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupAd) GetStatus() enums.AdGroupAdStatusEnum_AdGroupAdStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.AdGroupAdStatusEnum_UNSPECIFIED
+}
+
+func (m *AdGroupAd) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *AdGroupAd) GetAd() *Ad {
+	if m != nil {
+		return m.Ad
+	}
+	return nil
+}
+
+func (m *AdGroupAd) GetPolicySummary() *AdGroupAdPolicySummary {
+	if m != nil {
+		return m.PolicySummary
+	}
+	return nil
+}
+
+func (m *AdGroupAd) GetAdStrength() enums.AdStrengthEnum_AdStrength {
+	if m != nil {
+		return m.AdStrength
+	}
+	return enums.AdStrengthEnum_UNSPECIFIED
+}
+
+// Contains policy information for an ad.
+type AdGroupAdPolicySummary struct {
+	// The list of policy findings for this ad.
+	PolicyTopicEntries []*common.PolicyTopicEntry `protobuf:"bytes,1,rep,name=policy_topic_entries,json=policyTopicEntries,proto3" json:"policy_topic_entries,omitempty"`
+	// Where in the review process this ad is.
+	ReviewStatus enums.PolicyReviewStatusEnum_PolicyReviewStatus `protobuf:"varint,2,opt,name=review_status,json=reviewStatus,proto3,enum=google.ads.googleads.v3.enums.PolicyReviewStatusEnum_PolicyReviewStatus" json:"review_status,omitempty"`
+	// The overall approval status of this ad, calculated based on the status of
+	// its individual policy topic entries.
+	ApprovalStatus       enums.PolicyApprovalStatusEnum_PolicyApprovalStatus `protobuf:"varint,3,opt,name=approval_status,json=approvalStatus,proto3,enum=google.ads.googleads.v3.enums.PolicyApprovalStatusEnum_PolicyApprovalStatus" json:"approval_status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
+	XXX_unrecognized     []byte                                              `json:"-"`
+	XXX_sizecache        int32                                               `json:"-"`
+}
+
+func (m *AdGroupAdPolicySummary) Reset()         { *m = AdGroupAdPolicySummary{} }
+func (m *AdGroupAdPolicySummary) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAdPolicySummary) ProtoMessage()    {}
+func (*AdGroupAdPolicySummary) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1ed4b3c949da8cd1, []int{1}
+}
+
+func (m *AdGroupAdPolicySummary) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAdPolicySummary.Unmarshal(m, b)
+}
+func (m *AdGroupAdPolicySummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAdPolicySummary.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAdPolicySummary) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAdPolicySummary.Merge(m, src)
+}
+func (m *AdGroupAdPolicySummary) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAdPolicySummary.Size(m)
+}
+func (m *AdGroupAdPolicySummary) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAdPolicySummary.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAdPolicySummary proto.InternalMessageInfo
+
+func (m *AdGroupAdPolicySummary) GetPolicyTopicEntries() []*common.PolicyTopicEntry {
+	if m != nil {
+		return m.PolicyTopicEntries
+	}
+	return nil
+}
+
+func (m *AdGroupAdPolicySummary) GetReviewStatus() enums.PolicyReviewStatusEnum_PolicyReviewStatus {
+	if m != nil {
+		return m.ReviewStatus
+	}
+	return enums.PolicyReviewStatusEnum_UNSPECIFIED
+}
+
+func (m *AdGroupAdPolicySummary) GetApprovalStatus() enums.PolicyApprovalStatusEnum_PolicyApprovalStatus {
+	if m != nil {
+		return m.ApprovalStatus
+	}
+	return enums.PolicyApprovalStatusEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*AdGroupAd)(nil), "google.ads.googleads.v3.resources.AdGroupAd")
+	proto.RegisterType((*AdGroupAdPolicySummary)(nil), "google.ads.googleads.v3.resources.AdGroupAdPolicySummary")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_ad.proto", fileDescriptor_1ed4b3c949da8cd1)
+}
+
+var fileDescriptor_1ed4b3c949da8cd1 = []byte{
+	// 638 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xd1, 0x6a, 0xd4, 0x4c,
+	0x14, 0x26, 0x69, 0xff, 0xf6, 0xef, 0xd4, 0xae, 0x10, 0x44, 0x62, 0x29, 0xb2, 0xad, 0x14, 0x16,
+	0xc5, 0x19, 0x69, 0x50, 0x6b, 0xbc, 0x4a, 0xa1, 0x54, 0x44, 0xa4, 0x64, 0x65, 0xc1, 0xb2, 0xb0,
+	0x4e, 0x93, 0x31, 0x06, 0x36, 0x33, 0xc3, 0xcc, 0x64, 0xcb, 0x52, 0xfa, 0x10, 0xbe, 0x82, 0x97,
+	0x3e, 0x8a, 0x8f, 0xe1, 0x65, 0x5f, 0xc1, 0x1b, 0x49, 0x66, 0x26, 0xbb, 0xdb, 0xba, 0xdd, 0xbd,
+	0x3b, 0x33, 0xe7, 0xfb, 0xbe, 0xc9, 0xf9, 0xce, 0x39, 0x01, 0x41, 0xc6, 0x58, 0x36, 0x24, 0x08,
+	0xa7, 0x12, 0xe9, 0xb0, 0x8a, 0x46, 0x01, 0x12, 0x44, 0xb2, 0x52, 0x24, 0x44, 0x22, 0x9c, 0x0e,
+	0x32, 0xc1, 0x4a, 0x3e, 0xc0, 0x29, 0xe4, 0x82, 0x29, 0xe6, 0xed, 0x6a, 0x24, 0xc4, 0xa9, 0x84,
+	0x0d, 0x09, 0x8e, 0x02, 0xd8, 0x90, 0xb6, 0x9f, 0xcd, 0xd3, 0x4d, 0x58, 0x51, 0x30, 0x8a, 0x38,
+	0x1b, 0xe6, 0xc9, 0x58, 0xeb, 0x6d, 0xbf, 0x9a, 0x07, 0x26, 0xb4, 0x2c, 0x66, 0x3e, 0x60, 0x20,
+	0x15, 0x56, 0xa5, 0x34, 0x3c, 0xb4, 0x90, 0x27, 0x95, 0x20, 0x34, 0x53, 0xdf, 0x0c, 0x21, 0xbc,
+	0x9b, 0xa0, 0x3f, 0x6a, 0x80, 0x39, 0x17, 0x6c, 0x84, 0x87, 0xb3, 0x8f, 0x1d, 0x2e, 0xc5, 0x15,
+	0x64, 0x94, 0x93, 0x8b, 0x59, 0xe6, 0xd3, 0x65, 0x3c, 0x36, 0xd8, 0x47, 0x16, 0xcb, 0xf3, 0x26,
+	0x6d, 0x52, 0x8f, 0x4d, 0xaa, 0x3e, 0x9d, 0x97, 0x5f, 0xd1, 0x85, 0xc0, 0x9c, 0x13, 0x61, 0x9f,
+	0xd9, 0x99, 0xa2, 0x62, 0x4a, 0x99, 0xc2, 0x2a, 0x67, 0xd4, 0x64, 0xf7, 0xbe, 0xaf, 0x82, 0x8d,
+	0x28, 0x3d, 0xa9, 0x7c, 0x8c, 0x52, 0xef, 0x09, 0xd8, 0xb2, 0xea, 0x03, 0x8a, 0x0b, 0xe2, 0x3b,
+	0x6d, 0xa7, 0xb3, 0x11, 0xdf, 0xb3, 0x97, 0x1f, 0x71, 0x41, 0xbc, 0x33, 0xb0, 0xa6, 0xeb, 0xf0,
+	0x57, 0xda, 0x4e, 0xa7, 0x75, 0x70, 0x04, 0xe7, 0xf5, 0xbd, 0xb6, 0x00, 0x36, 0xf2, 0xdd, 0x9a,
+	0x75, 0x4c, 0xcb, 0xe2, 0xe6, 0x5d, 0x6c, 0x14, 0xbd, 0xd7, 0xe0, 0x7f, 0xdb, 0x56, 0x7f, 0xb5,
+	0xed, 0x74, 0x36, 0x0f, 0x76, 0xac, 0xba, 0xad, 0x0f, 0x76, 0x95, 0xc8, 0x69, 0xd6, 0xc3, 0xc3,
+	0x92, 0xc4, 0xeb, 0x58, 0x0b, 0x79, 0x2f, 0x81, 0x8b, 0x53, 0xff, 0xbf, 0x9a, 0xb2, 0x0f, 0x17,
+	0x0e, 0x22, 0x8c, 0xd2, 0xd8, 0xc5, 0xa9, 0xf7, 0x05, 0xb4, 0x4c, 0x87, 0x64, 0x59, 0x14, 0x58,
+	0x8c, 0xfd, 0xb5, 0x5a, 0xe2, 0xcd, 0x52, 0x12, 0xa6, 0x86, 0xd3, 0x5a, 0xa1, 0xab, 0x05, 0xe2,
+	0x2d, 0x3e, 0x7d, 0xf4, 0x3e, 0x83, 0xcd, 0xa9, 0x81, 0xf3, 0xd7, 0x6b, 0xcb, 0x0e, 0x17, 0x5a,
+	0xd6, 0x35, 0x04, 0xe3, 0x96, 0x3d, 0xc6, 0x00, 0x37, 0x71, 0xd8, 0xbb, 0x8e, 0xba, 0x60, 0x6f,
+	0x42, 0x37, 0x11, 0xcf, 0x25, 0x4c, 0x58, 0x81, 0x26, 0x6d, 0x7d, 0x9e, 0x94, 0x52, 0xb1, 0x82,
+	0x08, 0x89, 0x2e, 0x6d, 0x78, 0x85, 0xb0, 0xcd, 0x4b, 0x74, 0x39, 0xb5, 0x4b, 0x57, 0x7b, 0xbf,
+	0x5d, 0xf0, 0xf0, 0xdf, 0xc5, 0x79, 0xe7, 0xe0, 0x81, 0xf1, 0x4b, 0x31, 0x9e, 0x27, 0x03, 0x42,
+	0x95, 0xc8, 0x89, 0xf4, 0x9d, 0xf6, 0x4a, 0x67, 0xf3, 0xe0, 0xc5, 0xdc, 0xb2, 0xf4, 0x7a, 0x43,
+	0x2d, 0xf6, 0xa9, 0xa2, 0x1e, 0x53, 0x25, 0xc6, 0xb1, 0xc7, 0x67, 0x6f, 0x72, 0x22, 0xbd, 0xa2,
+	0x1a, 0xc2, 0xa9, 0x75, 0xf1, 0xdd, 0xda, 0xb3, 0x77, 0x0b, 0x3c, 0xd3, 0xda, 0x71, 0xcd, 0x9c,
+	0x9a, 0xb4, 0xdb, 0xd7, 0xd5, 0x38, 0x4f, 0x4e, 0x5e, 0x09, 0xee, 0xdf, 0xd8, 0x6c, 0x33, 0xd7,
+	0x1f, 0x96, 0x7a, 0x30, 0x32, 0xdc, 0x5b, 0x4f, 0xce, 0x26, 0xe2, 0x16, 0x9e, 0x39, 0x1f, 0xfd,
+	0x71, 0xc0, 0x7e, 0xc2, 0x8a, 0xc5, 0x73, 0x76, 0xd4, 0x9a, 0xf4, 0xa2, 0x5a, 0x81, 0x53, 0xe7,
+	0xec, 0xbd, 0x21, 0x65, 0x6c, 0x88, 0x69, 0x06, 0x99, 0xc8, 0x50, 0x46, 0x68, 0xbd, 0x20, 0x68,
+	0x32, 0x04, 0x77, 0xfc, 0x58, 0xde, 0x36, 0xd1, 0x0f, 0x77, 0xe5, 0x24, 0x8a, 0x7e, 0xba, 0xbb,
+	0x27, 0x5a, 0x32, 0x4a, 0x25, 0xd4, 0x61, 0x15, 0xf5, 0x02, 0x18, 0x5b, 0xe4, 0x2f, 0x8b, 0xe9,
+	0x47, 0xa9, 0xec, 0x37, 0x98, 0x7e, 0x2f, 0xe8, 0x37, 0x98, 0x6b, 0x77, 0x5f, 0x27, 0xc2, 0x30,
+	0x4a, 0x65, 0x18, 0x36, 0xa8, 0x30, 0xec, 0x05, 0x61, 0xd8, 0xe0, 0xce, 0xd7, 0xea, 0x8f, 0x0d,
+	0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x23, 0x16, 0x17, 0x68, 0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_ad_asset_view.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_ad_asset_view.pb.go
new file mode 100644
index 0000000..ec7ac41
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_ad_asset_view.pb.go
@@ -0,0 +1,230 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_ad_asset_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A link between an AdGroupAd and an Asset.
+type AdGroupAdAssetView struct {
+	// The resource name of the ad group ad asset view.
+	// Ad group ad asset view resource names have the form:
+	//
+	// `customers/{customer_id}/adGroupAdAssets/{AdGroupAdAsset.ad_group_id}~{AdGroupAdAsset.ad.ad_id}~{AdGroupAdAsset.asset_id}~{AdGroupAdAsset.asset_field_type}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ad group ad to which the asset is linked.
+	AdGroupAd *wrappers.StringValue `protobuf:"bytes,5,opt,name=ad_group_ad,json=adGroupAd,proto3" json:"ad_group_ad,omitempty"`
+	// The asset which is linked to the ad group ad.
+	Asset *wrappers.StringValue `protobuf:"bytes,6,opt,name=asset,proto3" json:"asset,omitempty"`
+	// Role that the asset takes in the ad.
+	FieldType enums.AssetFieldTypeEnum_AssetFieldType `protobuf:"varint,2,opt,name=field_type,json=fieldType,proto3,enum=google.ads.googleads.v3.enums.AssetFieldTypeEnum_AssetFieldType" json:"field_type,omitempty"`
+	// Policy information for the ad group ad asset.
+	PolicySummary *AdGroupAdAssetPolicySummary `protobuf:"bytes,3,opt,name=policy_summary,json=policySummary,proto3" json:"policy_summary,omitempty"`
+	// Performance of an asset linkage.
+	PerformanceLabel     enums.AssetPerformanceLabelEnum_AssetPerformanceLabel `protobuf:"varint,4,opt,name=performance_label,json=performanceLabel,proto3,enum=google.ads.googleads.v3.enums.AssetPerformanceLabelEnum_AssetPerformanceLabel" json:"performance_label,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                              `json:"-"`
+	XXX_unrecognized     []byte                                                `json:"-"`
+	XXX_sizecache        int32                                                 `json:"-"`
+}
+
+func (m *AdGroupAdAssetView) Reset()         { *m = AdGroupAdAssetView{} }
+func (m *AdGroupAdAssetView) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAdAssetView) ProtoMessage()    {}
+func (*AdGroupAdAssetView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ebd5d6a40ca3c8d6, []int{0}
+}
+
+func (m *AdGroupAdAssetView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAdAssetView.Unmarshal(m, b)
+}
+func (m *AdGroupAdAssetView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAdAssetView.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAdAssetView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAdAssetView.Merge(m, src)
+}
+func (m *AdGroupAdAssetView) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAdAssetView.Size(m)
+}
+func (m *AdGroupAdAssetView) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAdAssetView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAdAssetView proto.InternalMessageInfo
+
+func (m *AdGroupAdAssetView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupAdAssetView) GetAdGroupAd() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupAd
+	}
+	return nil
+}
+
+func (m *AdGroupAdAssetView) GetAsset() *wrappers.StringValue {
+	if m != nil {
+		return m.Asset
+	}
+	return nil
+}
+
+func (m *AdGroupAdAssetView) GetFieldType() enums.AssetFieldTypeEnum_AssetFieldType {
+	if m != nil {
+		return m.FieldType
+	}
+	return enums.AssetFieldTypeEnum_UNSPECIFIED
+}
+
+func (m *AdGroupAdAssetView) GetPolicySummary() *AdGroupAdAssetPolicySummary {
+	if m != nil {
+		return m.PolicySummary
+	}
+	return nil
+}
+
+func (m *AdGroupAdAssetView) GetPerformanceLabel() enums.AssetPerformanceLabelEnum_AssetPerformanceLabel {
+	if m != nil {
+		return m.PerformanceLabel
+	}
+	return enums.AssetPerformanceLabelEnum_UNSPECIFIED
+}
+
+// Contains policy information for an ad group ad asset.
+type AdGroupAdAssetPolicySummary struct {
+	// The list of policy findings for the ad group ad asset.
+	PolicyTopicEntries []*common.PolicyTopicEntry `protobuf:"bytes,1,rep,name=policy_topic_entries,json=policyTopicEntries,proto3" json:"policy_topic_entries,omitempty"`
+	// Where in the review process this ad group ad asset is.
+	ReviewStatus enums.PolicyReviewStatusEnum_PolicyReviewStatus `protobuf:"varint,2,opt,name=review_status,json=reviewStatus,proto3,enum=google.ads.googleads.v3.enums.PolicyReviewStatusEnum_PolicyReviewStatus" json:"review_status,omitempty"`
+	// The overall approval status of this ad group ad asset, calculated based on
+	// the status of its individual policy topic entries.
+	ApprovalStatus       enums.PolicyApprovalStatusEnum_PolicyApprovalStatus `protobuf:"varint,3,opt,name=approval_status,json=approvalStatus,proto3,enum=google.ads.googleads.v3.enums.PolicyApprovalStatusEnum_PolicyApprovalStatus" json:"approval_status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
+	XXX_unrecognized     []byte                                              `json:"-"`
+	XXX_sizecache        int32                                               `json:"-"`
+}
+
+func (m *AdGroupAdAssetPolicySummary) Reset()         { *m = AdGroupAdAssetPolicySummary{} }
+func (m *AdGroupAdAssetPolicySummary) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAdAssetPolicySummary) ProtoMessage()    {}
+func (*AdGroupAdAssetPolicySummary) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ebd5d6a40ca3c8d6, []int{1}
+}
+
+func (m *AdGroupAdAssetPolicySummary) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAdAssetPolicySummary.Unmarshal(m, b)
+}
+func (m *AdGroupAdAssetPolicySummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAdAssetPolicySummary.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAdAssetPolicySummary) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAdAssetPolicySummary.Merge(m, src)
+}
+func (m *AdGroupAdAssetPolicySummary) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAdAssetPolicySummary.Size(m)
+}
+func (m *AdGroupAdAssetPolicySummary) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAdAssetPolicySummary.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAdAssetPolicySummary proto.InternalMessageInfo
+
+func (m *AdGroupAdAssetPolicySummary) GetPolicyTopicEntries() []*common.PolicyTopicEntry {
+	if m != nil {
+		return m.PolicyTopicEntries
+	}
+	return nil
+}
+
+func (m *AdGroupAdAssetPolicySummary) GetReviewStatus() enums.PolicyReviewStatusEnum_PolicyReviewStatus {
+	if m != nil {
+		return m.ReviewStatus
+	}
+	return enums.PolicyReviewStatusEnum_UNSPECIFIED
+}
+
+func (m *AdGroupAdAssetPolicySummary) GetApprovalStatus() enums.PolicyApprovalStatusEnum_PolicyApprovalStatus {
+	if m != nil {
+		return m.ApprovalStatus
+	}
+	return enums.PolicyApprovalStatusEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*AdGroupAdAssetView)(nil), "google.ads.googleads.v3.resources.AdGroupAdAssetView")
+	proto.RegisterType((*AdGroupAdAssetPolicySummary)(nil), "google.ads.googleads.v3.resources.AdGroupAdAssetPolicySummary")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_ad_asset_view.proto", fileDescriptor_ebd5d6a40ca3c8d6)
+}
+
+var fileDescriptor_ebd5d6a40ca3c8d6 = []byte{
+	// 672 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x95, 0x5d, 0x6b, 0xdb, 0x3c,
+	0x14, 0xc7, 0x49, 0xfa, 0x02, 0x55, 0x9f, 0xe6, 0xd9, 0xcc, 0x60, 0x5e, 0x57, 0x46, 0xda, 0x51,
+	0x08, 0x14, 0xe4, 0x91, 0xec, 0x62, 0xb8, 0x5b, 0x99, 0x0b, 0x5d, 0xc7, 0x28, 0x25, 0xb8, 0x25,
+	0x17, 0x23, 0x60, 0x14, 0x5b, 0x31, 0x06, 0xeb, 0x05, 0xc9, 0x4e, 0x09, 0xa5, 0x77, 0xfb, 0x24,
+	0xbb, 0xdc, 0x47, 0xd9, 0xb7, 0xd8, 0xd5, 0xa0, 0x9f, 0x62, 0x58, 0x92, 0x9d, 0xb7, 0xa6, 0xcd,
+	0xdd, 0x91, 0xce, 0xf9, 0x9d, 0x23, 0xfd, 0xcf, 0x91, 0x0d, 0x4e, 0x62, 0xc6, 0xe2, 0x14, 0x3b,
+	0x28, 0x92, 0x8e, 0x36, 0x0b, 0x6b, 0xd4, 0x71, 0x04, 0x96, 0x2c, 0x17, 0x21, 0x96, 0x0e, 0x8a,
+	0x82, 0x58, 0xb0, 0x9c, 0x07, 0x28, 0x0a, 0x90, 0x94, 0x38, 0x0b, 0x46, 0x09, 0xbe, 0x81, 0x5c,
+	0xb0, 0x8c, 0x59, 0xfb, 0x1a, 0x82, 0x28, 0x92, 0xb0, 0xe2, 0xe1, 0xa8, 0x03, 0x2b, 0x7e, 0xf7,
+	0x68, 0x59, 0x89, 0x90, 0x11, 0xc2, 0xa8, 0xc3, 0x59, 0x9a, 0x84, 0x63, 0x9d, 0x6f, 0xf7, 0xfd,
+	0xb2, 0x60, 0x4c, 0x73, 0x22, 0x1d, 0x5d, 0x7f, 0x98, 0xe0, 0x34, 0x0a, 0xb2, 0x31, 0xc7, 0x86,
+	0x3a, 0x5e, 0x85, 0xe2, 0x58, 0x0c, 0x99, 0x20, 0x88, 0x86, 0x38, 0x48, 0xd1, 0x00, 0xa7, 0x06,
+	0x76, 0x1f, 0x87, 0xf5, 0xf1, 0x02, 0xc4, 0xb9, 0x60, 0x23, 0x94, 0x06, 0x32, 0x43, 0x59, 0x2e,
+	0x0d, 0xfb, 0x61, 0x25, 0x56, 0xe0, 0x42, 0xb1, 0x59, 0xf2, 0x55, 0x49, 0xf2, 0xa4, 0xd2, 0xda,
+	0xb8, 0xde, 0x18, 0x97, 0x5a, 0x0d, 0xf2, 0xa1, 0x73, 0x23, 0x10, 0xe7, 0x58, 0x94, 0xe8, 0xde,
+	0x14, 0x8a, 0x28, 0x65, 0x19, 0xca, 0x12, 0x46, 0x8d, 0xf7, 0xe0, 0xcf, 0x3a, 0xb0, 0xbc, 0xe8,
+	0xbc, 0xe8, 0x98, 0x17, 0x79, 0xc5, 0xcd, 0x7b, 0x09, 0xbe, 0xb1, 0xde, 0x82, 0x9d, 0xb2, 0x4c,
+	0x40, 0x11, 0xc1, 0x76, 0xad, 0x59, 0x6b, 0x6d, 0xf9, 0xff, 0x95, 0x9b, 0x97, 0x88, 0x60, 0xeb,
+	0x23, 0xd8, 0x9e, 0xea, 0xb6, 0xbd, 0xd1, 0xac, 0xb5, 0xb6, 0xdb, 0x7b, 0xa6, 0xb1, 0xb0, 0x3c,
+	0x0f, 0xbc, 0xca, 0x44, 0x42, 0xe3, 0x1e, 0x4a, 0x73, 0xec, 0x6f, 0xa1, 0xb2, 0x96, 0xd5, 0x06,
+	0x1b, 0x4a, 0x69, 0x7b, 0x73, 0x05, 0x4e, 0x87, 0x5a, 0x01, 0x00, 0x93, 0x6e, 0xda, 0xf5, 0x66,
+	0xad, 0xd5, 0x68, 0x7f, 0x86, 0xcb, 0x86, 0x4a, 0xa9, 0x0a, 0xd5, 0xa5, 0xbe, 0x14, 0xd4, 0xf5,
+	0x98, 0xe3, 0x33, 0x9a, 0x93, 0xb9, 0x2d, 0x7f, 0x6b, 0x58, 0x9a, 0x16, 0x06, 0x0d, 0xd3, 0x05,
+	0x99, 0x13, 0x82, 0xc4, 0xd8, 0x5e, 0x53, 0xa7, 0x3b, 0x81, 0x4f, 0x4e, 0x2e, 0x9c, 0x95, 0xb1,
+	0xab, 0xd2, 0x5c, 0xe9, 0x2c, 0xfe, 0x0e, 0x9f, 0x5e, 0x5a, 0xb7, 0xe0, 0xf9, 0xc2, 0x7c, 0xd9,
+	0xeb, 0xea, 0x3a, 0x97, 0xab, 0x5c, 0xa7, 0x3b, 0x81, 0x2f, 0x0a, 0x76, 0x72, 0xab, 0x79, 0x8f,
+	0xff, 0x8c, 0xcf, 0xed, 0xb8, 0xec, 0xde, 0x4b, 0xc1, 0xd1, 0x24, 0xb5, 0xb1, 0x78, 0x22, 0x61,
+	0xc8, 0x88, 0xf3, 0xc0, 0x34, 0x7c, 0x0a, 0x73, 0x99, 0x31, 0x82, 0x85, 0x74, 0x6e, 0x4b, 0xf3,
+	0xce, 0x41, 0x33, 0x81, 0xd2, 0xb9, 0x7d, 0xf8, 0xe9, 0xdf, 0x1d, 0xfc, 0xad, 0x83, 0xd7, 0x8f,
+	0x88, 0x63, 0x0d, 0xc0, 0x0b, 0x23, 0x7a, 0xc6, 0x78, 0x12, 0x06, 0x98, 0x66, 0x22, 0xc1, 0xd2,
+	0xae, 0x35, 0xd7, 0x5a, 0xdb, 0xed, 0x77, 0x4b, 0x05, 0xd1, 0x5f, 0x04, 0xa8, 0x93, 0x5d, 0x17,
+	0xe8, 0x19, 0xcd, 0xc4, 0xd8, 0xb7, 0xf8, 0xec, 0x4e, 0x82, 0xa5, 0x45, 0x8a, 0x81, 0x9e, 0x7a,
+	0x57, 0x66, 0x78, 0xbe, 0x3e, 0xa1, 0xb6, 0xce, 0xed, 0x2b, 0xf2, 0x4a, 0x81, 0x4a, 0xea, 0xc5,
+	0xed, 0xe2, 0x69, 0x4c, 0x56, 0x56, 0x0e, 0xfe, 0x9f, 0xfb, 0x04, 0xa8, 0x41, 0x6a, 0xb4, 0x2f,
+	0x56, 0x2a, 0xe8, 0x19, 0x76, 0xa1, 0xe4, 0xac, 0xc3, 0x6f, 0xa0, 0x99, 0xf5, 0xe9, 0x8f, 0x3a,
+	0x38, 0x0c, 0x19, 0x79, 0x7a, 0x58, 0x4f, 0x5f, 0x2e, 0xb6, 0xb9, 0x5b, 0x3c, 0xbc, 0x6e, 0xed,
+	0xfb, 0x37, 0x43, 0xc7, 0x2c, 0x45, 0x34, 0x86, 0x4c, 0xc4, 0x4e, 0x8c, 0xa9, 0x7a, 0x96, 0xce,
+	0x64, 0x56, 0x1e, 0xf9, 0x07, 0x1c, 0x57, 0xd6, 0xcf, 0xfa, 0xda, 0xb9, 0xe7, 0xfd, 0xaa, 0xef,
+	0x9f, 0xeb, 0x94, 0x5e, 0x24, 0xa1, 0x36, 0x0b, 0xab, 0xd7, 0x81, 0x7e, 0x19, 0xf9, 0xbb, 0x8c,
+	0xe9, 0x7b, 0x91, 0xec, 0x57, 0x31, 0xfd, 0x5e, 0xa7, 0x5f, 0xc5, 0xdc, 0xd7, 0x0f, 0xb5, 0xc3,
+	0x75, 0xbd, 0x48, 0xba, 0x6e, 0x15, 0xe5, 0xba, 0xbd, 0x8e, 0xeb, 0x56, 0x71, 0x83, 0x4d, 0x75,
+	0xd8, 0xce, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x43, 0x05, 0xe1, 0xaf, 0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_ad_label.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_ad_label.pb.go
new file mode 100644
index 0000000..b89170d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_ad_label.pb.go
@@ -0,0 +1,122 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_ad_label.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A relationship between an ad group ad and a label.
+type AdGroupAdLabel struct {
+	// The resource name of the ad group ad label.
+	// Ad group ad label resource names have the form:
+	// `customers/{customer_id}/adGroupAdLabels/{ad_group_id}~{ad_id}~{label_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ad group ad to which the label is attached.
+	AdGroupAd *wrappers.StringValue `protobuf:"bytes,2,opt,name=ad_group_ad,json=adGroupAd,proto3" json:"ad_group_ad,omitempty"`
+	// The label assigned to the ad group ad.
+	Label                *wrappers.StringValue `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AdGroupAdLabel) Reset()         { *m = AdGroupAdLabel{} }
+func (m *AdGroupAdLabel) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAdLabel) ProtoMessage()    {}
+func (*AdGroupAdLabel) Descriptor() ([]byte, []int) {
+	return fileDescriptor_668144ba7a9ba42f, []int{0}
+}
+
+func (m *AdGroupAdLabel) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAdLabel.Unmarshal(m, b)
+}
+func (m *AdGroupAdLabel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAdLabel.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAdLabel) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAdLabel.Merge(m, src)
+}
+func (m *AdGroupAdLabel) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAdLabel.Size(m)
+}
+func (m *AdGroupAdLabel) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAdLabel.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAdLabel proto.InternalMessageInfo
+
+func (m *AdGroupAdLabel) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupAdLabel) GetAdGroupAd() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupAd
+	}
+	return nil
+}
+
+func (m *AdGroupAdLabel) GetLabel() *wrappers.StringValue {
+	if m != nil {
+		return m.Label
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AdGroupAdLabel)(nil), "google.ads.googleads.v3.resources.AdGroupAdLabel")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_ad_label.proto", fileDescriptor_668144ba7a9ba42f)
+}
+
+var fileDescriptor_668144ba7a9ba42f = []byte{
+	// 386 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x4f, 0x6b, 0xdb, 0x30,
+	0x18, 0xc6, 0xb1, 0xc3, 0x06, 0x71, 0xb6, 0x1d, 0xbc, 0x4b, 0x16, 0xc2, 0x48, 0x36, 0xc2, 0x72,
+	0x92, 0x20, 0xbe, 0x6c, 0xda, 0x2e, 0xca, 0x25, 0x30, 0x4a, 0x09, 0x29, 0xf8, 0x50, 0x0c, 0x46,
+	0xb1, 0x14, 0x61, 0xb0, 0x2d, 0x23, 0xd9, 0xe9, 0x21, 0x04, 0xfa, 0x0d, 0xfa, 0x1d, 0x7a, 0xec,
+	0x47, 0xe9, 0x47, 0xc9, 0xa7, 0x28, 0xfe, 0x23, 0x25, 0x69, 0xa1, 0xed, 0xed, 0xb1, 0xdf, 0xdf,
+	0xf3, 0xbe, 0xcf, 0x2b, 0xc9, 0xf9, 0xc3, 0x85, 0xe0, 0x09, 0x83, 0x84, 0x2a, 0xd8, 0xc8, 0x4a,
+	0x6d, 0x3d, 0x28, 0x99, 0x12, 0xa5, 0x8c, 0x98, 0x82, 0x84, 0x86, 0x5c, 0x8a, 0x32, 0x0f, 0x09,
+	0x0d, 0x13, 0xb2, 0x66, 0x09, 0xc8, 0xa5, 0x28, 0x84, 0x3b, 0x6e, 0x78, 0x40, 0xa8, 0x02, 0xc6,
+	0x0a, 0xb6, 0x1e, 0x30, 0xd6, 0xc1, 0x37, 0xdd, 0x3d, 0x8f, 0x4d, 0xc3, 0xc6, 0x3d, 0xf8, 0xde,
+	0x96, 0xea, 0xaf, 0x75, 0xb9, 0x81, 0x37, 0x92, 0xe4, 0x39, 0x93, 0xaa, 0xad, 0x0f, 0x4f, 0xac,
+	0x24, 0xcb, 0x44, 0x41, 0x8a, 0x58, 0x64, 0x6d, 0xf5, 0xc7, 0x9d, 0xed, 0x7c, 0xc1, 0x74, 0x51,
+	0xc5, 0xc2, 0xf4, 0xa2, 0x0a, 0xe5, 0xfe, 0x74, 0x3e, 0xeb, 0x11, 0x61, 0x46, 0x52, 0xd6, 0xb7,
+	0x46, 0xd6, 0xb4, 0xbb, 0xfa, 0xa4, 0x7f, 0x5e, 0x92, 0x94, 0xb9, 0xff, 0x9c, 0xde, 0xc9, 0x3a,
+	0x7d, 0x7b, 0x64, 0x4d, 0x7b, 0xb3, 0x61, 0x1b, 0x1f, 0xe8, 0x2c, 0xe0, 0xaa, 0x90, 0x71, 0xc6,
+	0x7d, 0x92, 0x94, 0x6c, 0xd5, 0x25, 0x7a, 0x8e, 0x3b, 0x73, 0x3e, 0xd4, 0x07, 0xd0, 0xef, 0xbc,
+	0xc3, 0xd7, 0xa0, 0x68, 0x73, 0xc0, 0x91, 0xf3, 0xeb, 0x78, 0x3e, 0xad, 0xca, 0x63, 0x05, 0x22,
+	0x91, 0xc2, 0x67, 0x4b, 0xfc, 0x8e, 0x4a, 0x55, 0x88, 0x94, 0x49, 0x05, 0x77, 0x5a, 0xee, 0x21,
+	0x39, 0x83, 0x14, 0xdc, 0xbd, 0xb8, 0x92, 0xfd, 0xfc, 0xd6, 0x76, 0x26, 0x91, 0x48, 0xc1, 0x9b,
+	0x97, 0x32, 0xff, 0x7a, 0x3e, 0x73, 0x59, 0x85, 0x5f, 0x5a, 0xd7, 0xff, 0x5b, 0x27, 0x17, 0x09,
+	0xc9, 0x38, 0x10, 0x92, 0x43, 0xce, 0xb2, 0x7a, 0x35, 0x78, 0x0c, 0xfd, 0xca, 0x43, 0xf9, 0x6b,
+	0xd4, 0xbd, 0xdd, 0x59, 0x60, 0xfc, 0x60, 0x8f, 0x17, 0x4d, 0x4b, 0x4c, 0x15, 0x68, 0x64, 0xa5,
+	0x7c, 0x0f, 0xac, 0x34, 0xf9, 0xa8, 0x99, 0x00, 0x53, 0x15, 0x18, 0x26, 0xf0, 0xbd, 0xc0, 0x30,
+	0x07, 0x7b, 0xd2, 0x14, 0x10, 0xc2, 0x54, 0x21, 0x64, 0x28, 0x84, 0x7c, 0x0f, 0x21, 0xc3, 0xad,
+	0x3f, 0xd6, 0x61, 0xbd, 0xa7, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa9, 0xbe, 0x8e, 0xe2, 0xd4, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_audience_view.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_audience_view.pb.go
new file mode 100644
index 0000000..7bedf49
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_audience_view.pb.go
@@ -0,0 +1,103 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_audience_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad group audience view.
+// Includes performance data from interests and remarketing lists for Display
+// Network and YouTube Network ads, and remarketing lists for search ads (RLSA),
+// aggregated at the audience level.
+type AdGroupAudienceView struct {
+	// The resource name of the ad group audience view.
+	// Ad group audience view resource names have the form:
+	//
+	// `customers/{customer_id}/adGroupAudienceViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdGroupAudienceView) Reset()         { *m = AdGroupAudienceView{} }
+func (m *AdGroupAudienceView) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAudienceView) ProtoMessage()    {}
+func (*AdGroupAudienceView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8a6b1c14a61738, []int{0}
+}
+
+func (m *AdGroupAudienceView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAudienceView.Unmarshal(m, b)
+}
+func (m *AdGroupAudienceView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAudienceView.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAudienceView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAudienceView.Merge(m, src)
+}
+func (m *AdGroupAudienceView) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAudienceView.Size(m)
+}
+func (m *AdGroupAudienceView) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAudienceView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAudienceView proto.InternalMessageInfo
+
+func (m *AdGroupAudienceView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*AdGroupAudienceView)(nil), "google.ads.googleads.v3.resources.AdGroupAudienceView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_audience_view.proto", fileDescriptor_4d8a6b1c14a61738)
+}
+
+var fileDescriptor_4d8a6b1c14a61738 = []byte{
+	// 326 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xbf, 0x6a, 0xf3, 0x30,
+	0x14, 0xc5, 0xb1, 0x3f, 0xf8, 0xa0, 0xa6, 0x5d, 0xd2, 0x25, 0x0d, 0x1d, 0x9a, 0x96, 0x40, 0x87,
+	0x22, 0x0d, 0xde, 0x54, 0x28, 0x28, 0x4b, 0xa0, 0x43, 0x09, 0x19, 0x3c, 0x14, 0x83, 0x51, 0x2d,
+	0x21, 0x0c, 0xb1, 0xae, 0xd1, 0xb5, 0x93, 0x21, 0x64, 0xec, 0x8b, 0x74, 0xec, 0xd6, 0xd7, 0xe8,
+	0xa3, 0xe4, 0x29, 0x8a, 0xa3, 0x58, 0x29, 0xd4, 0xb4, 0xdb, 0x41, 0xf7, 0x77, 0xce, 0xfd, 0xa3,
+	0xe8, 0x41, 0x03, 0xe8, 0xa5, 0xa2, 0x42, 0x22, 0x75, 0xb2, 0x55, 0xab, 0x98, 0x5a, 0x85, 0xd0,
+	0xd8, 0x5c, 0x21, 0x15, 0x32, 0xd3, 0x16, 0x9a, 0x2a, 0x13, 0x8d, 0x2c, 0x94, 0xc9, 0x55, 0xb6,
+	0x2a, 0xd4, 0x9a, 0x54, 0x16, 0x6a, 0x18, 0x8c, 0x9d, 0x89, 0x08, 0x89, 0xc4, 0xfb, 0xc9, 0x2a,
+	0x26, 0xde, 0x3f, 0xba, 0xe8, 0x5a, 0x54, 0x85, 0x4f, 0x75, 0xee, 0xd1, 0xe5, 0xb7, 0x92, 0x30,
+	0x06, 0x6a, 0x51, 0x17, 0x60, 0xd0, 0x55, 0xaf, 0x3f, 0x82, 0xe8, 0x9c, 0xcb, 0x59, 0xdb, 0x9b,
+	0x1f, 0x5a, 0x27, 0x85, 0x5a, 0x0f, 0x6e, 0xa2, 0xb3, 0x2e, 0x27, 0x33, 0xa2, 0x54, 0xc3, 0xe0,
+	0x2a, 0xb8, 0x3d, 0x59, 0x9c, 0x76, 0x8f, 0x4f, 0xa2, 0x54, 0xac, 0xd9, 0x71, 0x1b, 0xdd, 0x1d,
+	0x47, 0x3a, 0xa8, 0xaa, 0x40, 0x92, 0x43, 0x49, 0xfb, 0x72, 0xa7, 0x79, 0x83, 0x35, 0x94, 0xca,
+	0x22, 0xdd, 0x74, 0x72, 0x4b, 0xc5, 0x4f, 0x12, 0xe9, 0xa6, 0xff, 0x28, 0xdb, 0xe9, 0x6b, 0x18,
+	0x4d, 0x72, 0x28, 0xc9, 0x9f, 0x67, 0x99, 0x0e, 0x7b, 0x46, 0x98, 0xb7, 0x7b, 0xcf, 0x83, 0xe7,
+	0xc7, 0x83, 0x5d, 0xc3, 0x52, 0x18, 0x4d, 0xc0, 0x6a, 0xaa, 0x95, 0xd9, 0x5f, 0x85, 0x1e, 0x17,
+	0xf9, 0xe5, 0xd3, 0xee, 0xbd, 0x7a, 0x0b, 0xff, 0xcd, 0x38, 0x7f, 0x0f, 0xc7, 0x33, 0x17, 0xc9,
+	0x25, 0x12, 0x27, 0x5b, 0x95, 0xc4, 0x64, 0xd1, 0x91, 0x9f, 0x1d, 0x93, 0x72, 0x89, 0xa9, 0x67,
+	0xd2, 0x24, 0x4e, 0x3d, 0xb3, 0x0b, 0x27, 0xae, 0xc0, 0x18, 0x97, 0xc8, 0x98, 0xa7, 0x18, 0x4b,
+	0x62, 0xc6, 0x3c, 0xf7, 0xf2, 0x7f, 0x3f, 0x6c, 0xfc, 0x15, 0x00, 0x00, 0xff, 0xff, 0xa6, 0xf2,
+	0x24, 0x30, 0x60, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_bid_modifier.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_bid_modifier.pb.go
new file mode 100644
index 0000000..7968cea
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_bid_modifier.pb.go
@@ -0,0 +1,293 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_bid_modifier.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Represents an ad group bid modifier.
+type AdGroupBidModifier struct {
+	// The resource name of the ad group bid modifier.
+	// Ad group bid modifier resource names have the form:
+	//
+	// `customers/{customer_id}/adGroupBidModifiers/{ad_group_id}~{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ad group to which this criterion belongs.
+	AdGroup *wrappers.StringValue `protobuf:"bytes,2,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// The ID of the criterion to bid modify.
+	//
+	// This field is ignored for mutates.
+	CriterionId *wrappers.Int64Value `protobuf:"bytes,3,opt,name=criterion_id,json=criterionId,proto3" json:"criterion_id,omitempty"`
+	// The modifier for the bid when the criterion matches. The modifier must be
+	// in the range: 0.1 - 10.0. The range is 1.0 - 6.0 for PreferredContent.
+	// Use 0 to opt out of a Device type.
+	BidModifier *wrappers.DoubleValue `protobuf:"bytes,4,opt,name=bid_modifier,json=bidModifier,proto3" json:"bid_modifier,omitempty"`
+	// The base ad group from which this draft/trial adgroup bid modifier was
+	// created. If ad_group is a base ad group then this field will be equal to
+	// ad_group. If the ad group was created in the draft or trial and has no
+	// corresponding base ad group, then this field will be null.
+	// This field is readonly.
+	BaseAdGroup *wrappers.StringValue `protobuf:"bytes,9,opt,name=base_ad_group,json=baseAdGroup,proto3" json:"base_ad_group,omitempty"`
+	// Bid modifier source.
+	BidModifierSource enums.BidModifierSourceEnum_BidModifierSource `protobuf:"varint,10,opt,name=bid_modifier_source,json=bidModifierSource,proto3,enum=google.ads.googleads.v3.enums.BidModifierSourceEnum_BidModifierSource" json:"bid_modifier_source,omitempty"`
+	// The criterion of this ad group bid modifier.
+	//
+	// Types that are valid to be assigned to Criterion:
+	//	*AdGroupBidModifier_HotelDateSelectionType
+	//	*AdGroupBidModifier_HotelAdvanceBookingWindow
+	//	*AdGroupBidModifier_HotelLengthOfStay
+	//	*AdGroupBidModifier_HotelCheckInDay
+	//	*AdGroupBidModifier_Device
+	//	*AdGroupBidModifier_PreferredContent
+	Criterion            isAdGroupBidModifier_Criterion `protobuf_oneof:"criterion"`
+	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
+	XXX_unrecognized     []byte                         `json:"-"`
+	XXX_sizecache        int32                          `json:"-"`
+}
+
+func (m *AdGroupBidModifier) Reset()         { *m = AdGroupBidModifier{} }
+func (m *AdGroupBidModifier) String() string { return proto.CompactTextString(m) }
+func (*AdGroupBidModifier) ProtoMessage()    {}
+func (*AdGroupBidModifier) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d9b50cb17f277d0c, []int{0}
+}
+
+func (m *AdGroupBidModifier) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupBidModifier.Unmarshal(m, b)
+}
+func (m *AdGroupBidModifier) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupBidModifier.Marshal(b, m, deterministic)
+}
+func (m *AdGroupBidModifier) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupBidModifier.Merge(m, src)
+}
+func (m *AdGroupBidModifier) XXX_Size() int {
+	return xxx_messageInfo_AdGroupBidModifier.Size(m)
+}
+func (m *AdGroupBidModifier) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupBidModifier.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupBidModifier proto.InternalMessageInfo
+
+func (m *AdGroupBidModifier) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupBidModifier) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetCriterionId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CriterionId
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetBidModifier() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BidModifier
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetBaseAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.BaseAdGroup
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetBidModifierSource() enums.BidModifierSourceEnum_BidModifierSource {
+	if m != nil {
+		return m.BidModifierSource
+	}
+	return enums.BidModifierSourceEnum_UNSPECIFIED
+}
+
+type isAdGroupBidModifier_Criterion interface {
+	isAdGroupBidModifier_Criterion()
+}
+
+type AdGroupBidModifier_HotelDateSelectionType struct {
+	HotelDateSelectionType *common.HotelDateSelectionTypeInfo `protobuf:"bytes,5,opt,name=hotel_date_selection_type,json=hotelDateSelectionType,proto3,oneof"`
+}
+
+type AdGroupBidModifier_HotelAdvanceBookingWindow struct {
+	HotelAdvanceBookingWindow *common.HotelAdvanceBookingWindowInfo `protobuf:"bytes,6,opt,name=hotel_advance_booking_window,json=hotelAdvanceBookingWindow,proto3,oneof"`
+}
+
+type AdGroupBidModifier_HotelLengthOfStay struct {
+	HotelLengthOfStay *common.HotelLengthOfStayInfo `protobuf:"bytes,7,opt,name=hotel_length_of_stay,json=hotelLengthOfStay,proto3,oneof"`
+}
+
+type AdGroupBidModifier_HotelCheckInDay struct {
+	HotelCheckInDay *common.HotelCheckInDayInfo `protobuf:"bytes,8,opt,name=hotel_check_in_day,json=hotelCheckInDay,proto3,oneof"`
+}
+
+type AdGroupBidModifier_Device struct {
+	Device *common.DeviceInfo `protobuf:"bytes,11,opt,name=device,proto3,oneof"`
+}
+
+type AdGroupBidModifier_PreferredContent struct {
+	PreferredContent *common.PreferredContentInfo `protobuf:"bytes,12,opt,name=preferred_content,json=preferredContent,proto3,oneof"`
+}
+
+func (*AdGroupBidModifier_HotelDateSelectionType) isAdGroupBidModifier_Criterion() {}
+
+func (*AdGroupBidModifier_HotelAdvanceBookingWindow) isAdGroupBidModifier_Criterion() {}
+
+func (*AdGroupBidModifier_HotelLengthOfStay) isAdGroupBidModifier_Criterion() {}
+
+func (*AdGroupBidModifier_HotelCheckInDay) isAdGroupBidModifier_Criterion() {}
+
+func (*AdGroupBidModifier_Device) isAdGroupBidModifier_Criterion() {}
+
+func (*AdGroupBidModifier_PreferredContent) isAdGroupBidModifier_Criterion() {}
+
+func (m *AdGroupBidModifier) GetCriterion() isAdGroupBidModifier_Criterion {
+	if m != nil {
+		return m.Criterion
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetHotelDateSelectionType() *common.HotelDateSelectionTypeInfo {
+	if x, ok := m.GetCriterion().(*AdGroupBidModifier_HotelDateSelectionType); ok {
+		return x.HotelDateSelectionType
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetHotelAdvanceBookingWindow() *common.HotelAdvanceBookingWindowInfo {
+	if x, ok := m.GetCriterion().(*AdGroupBidModifier_HotelAdvanceBookingWindow); ok {
+		return x.HotelAdvanceBookingWindow
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetHotelLengthOfStay() *common.HotelLengthOfStayInfo {
+	if x, ok := m.GetCriterion().(*AdGroupBidModifier_HotelLengthOfStay); ok {
+		return x.HotelLengthOfStay
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetHotelCheckInDay() *common.HotelCheckInDayInfo {
+	if x, ok := m.GetCriterion().(*AdGroupBidModifier_HotelCheckInDay); ok {
+		return x.HotelCheckInDay
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetDevice() *common.DeviceInfo {
+	if x, ok := m.GetCriterion().(*AdGroupBidModifier_Device); ok {
+		return x.Device
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifier) GetPreferredContent() *common.PreferredContentInfo {
+	if x, ok := m.GetCriterion().(*AdGroupBidModifier_PreferredContent); ok {
+		return x.PreferredContent
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupBidModifier) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupBidModifier_HotelDateSelectionType)(nil),
+		(*AdGroupBidModifier_HotelAdvanceBookingWindow)(nil),
+		(*AdGroupBidModifier_HotelLengthOfStay)(nil),
+		(*AdGroupBidModifier_HotelCheckInDay)(nil),
+		(*AdGroupBidModifier_Device)(nil),
+		(*AdGroupBidModifier_PreferredContent)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*AdGroupBidModifier)(nil), "google.ads.googleads.v3.resources.AdGroupBidModifier")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_bid_modifier.proto", fileDescriptor_d9b50cb17f277d0c)
+}
+
+var fileDescriptor_d9b50cb17f277d0c = []byte{
+	// 739 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x95, 0xdf, 0x6e, 0xdb, 0x36,
+	0x14, 0xc6, 0x67, 0x67, 0x4b, 0x62, 0xda, 0xd9, 0x16, 0x6d, 0xd8, 0x94, 0x2c, 0x18, 0x92, 0x0d,
+	0x01, 0x82, 0x0d, 0x93, 0x80, 0x38, 0x5b, 0x00, 0x0d, 0xd9, 0x22, 0xc7, 0x6d, 0xe2, 0xa2, 0x7f,
+	0x02, 0xbb, 0x70, 0x81, 0xc2, 0x00, 0x41, 0x89, 0xb4, 0x2c, 0xc4, 0x22, 0x05, 0x92, 0xb2, 0x61,
+	0x04, 0x01, 0x7a, 0xd1, 0x27, 0x69, 0xef, 0xfa, 0x28, 0x7d, 0x94, 0x3c, 0x45, 0x21, 0x91, 0x52,
+	0xdc, 0xd8, 0x6e, 0x7c, 0x77, 0xcc, 0x73, 0x7e, 0xdf, 0x77, 0x78, 0x28, 0xd2, 0xe0, 0x24, 0x60,
+	0x2c, 0x18, 0x12, 0x1b, 0x61, 0x61, 0xab, 0x30, 0x8d, 0x46, 0x75, 0x9b, 0x13, 0xc1, 0x12, 0xee,
+	0x13, 0x61, 0x23, 0x0c, 0x03, 0xce, 0x92, 0x18, 0x7a, 0x21, 0x86, 0x11, 0xc3, 0x61, 0x3f, 0x24,
+	0xdc, 0x8a, 0x39, 0x93, 0xcc, 0xd8, 0x53, 0x8c, 0x85, 0xb0, 0xb0, 0x0a, 0xdc, 0x1a, 0xd5, 0xad,
+	0x02, 0xdf, 0xfe, 0x6b, 0x91, 0x83, 0xcf, 0xa2, 0x88, 0x51, 0xdb, 0xe7, 0xa1, 0x24, 0x3c, 0x44,
+	0x4a, 0x71, 0xfb, 0x78, 0x51, 0x39, 0xa1, 0x49, 0x24, 0xec, 0xe9, 0x1e, 0xa0, 0xb2, 0xd0, 0xe0,
+	0x56, 0x0e, 0xc6, 0x61, 0xd1, 0xbc, 0x4e, 0xfd, 0xaa, 0x53, 0xd9, 0x2f, 0x2f, 0xe9, 0xdb, 0x63,
+	0x8e, 0xe2, 0x98, 0x70, 0xa1, 0xf3, 0x3b, 0x53, 0x28, 0xa2, 0x94, 0x49, 0x24, 0x43, 0x46, 0x75,
+	0xf6, 0xb7, 0xf7, 0x15, 0x60, 0xb8, 0xf8, 0x3c, 0x1d, 0x41, 0x23, 0xc4, 0xcf, 0xb4, 0xb9, 0xf1,
+	0x3b, 0xd8, 0xc8, 0x6d, 0x20, 0x45, 0x11, 0x31, 0x4b, 0xbb, 0xa5, 0x83, 0x4a, 0xbb, 0x96, 0x2f,
+	0x3e, 0x47, 0x11, 0x31, 0x8e, 0xc1, 0x7a, 0x3e, 0x3e, 0xb3, 0xbc, 0x5b, 0x3a, 0xa8, 0x1e, 0xee,
+	0xe8, 0x39, 0x59, 0x79, 0x33, 0x56, 0x47, 0xf2, 0x90, 0x06, 0x5d, 0x34, 0x4c, 0x48, 0x7b, 0x0d,
+	0x29, 0x23, 0xe3, 0x3f, 0x50, 0xd3, 0x83, 0x61, 0x14, 0x86, 0xd8, 0x5c, 0xc9, 0xe0, 0x5f, 0x66,
+	0xe0, 0x16, 0x95, 0xff, 0x1c, 0x29, 0xb6, 0x5a, 0x00, 0x2d, 0x6c, 0xfc, 0x0f, 0x6a, 0xd3, 0xa3,
+	0x32, 0xbf, 0x5e, 0x60, 0xde, 0x64, 0x89, 0x37, 0x24, 0x5a, 0xc0, 0x9b, 0xda, 0xde, 0x29, 0xd8,
+	0xf0, 0x90, 0x20, 0xb0, 0x68, 0xbf, 0xb2, 0x44, 0xfb, 0xd5, 0x14, 0xd1, 0xb3, 0x32, 0x46, 0xe0,
+	0x87, 0x39, 0xa7, 0x65, 0x82, 0xdd, 0xd2, 0xc1, 0xb7, 0x87, 0x8f, 0xad, 0x45, 0x5f, 0x4e, 0x76,
+	0xce, 0xd6, 0xd4, 0xa4, 0x3b, 0x19, 0xf7, 0x88, 0x26, 0xd1, 0xec, 0x6a, 0x7b, 0xd3, 0xbb, 0xbf,
+	0x64, 0x8c, 0xc1, 0xd6, 0x80, 0x49, 0x32, 0x84, 0x18, 0x49, 0x02, 0x05, 0x19, 0x12, 0x3f, 0x3d,
+	0x4e, 0x28, 0x27, 0x31, 0x31, 0xbf, 0xc9, 0x76, 0xe1, 0x2c, 0x74, 0x57, 0x1f, 0xa5, 0x75, 0x91,
+	0x0a, 0x34, 0x91, 0x24, 0x9d, 0x1c, 0x7f, 0x39, 0x89, 0x49, 0x8b, 0xf6, 0xd9, 0xc5, 0x57, 0xed,
+	0x9f, 0x06, 0x73, 0xb3, 0xc6, 0x9b, 0x12, 0xd8, 0x51, 0xce, 0x08, 0x8f, 0x10, 0xf5, 0x09, 0xf4,
+	0x18, 0xbb, 0x0a, 0x69, 0x00, 0xc7, 0x21, 0xc5, 0x6c, 0x6c, 0xae, 0x66, 0xe6, 0x27, 0x4b, 0x99,
+	0xbb, 0x4a, 0xa2, 0xa1, 0x14, 0x5e, 0x65, 0x02, 0xda, 0x5f, 0x6d, 0x6f, 0x5e, 0x81, 0x31, 0x00,
+	0x3f, 0xaa, 0x0e, 0x86, 0x84, 0x06, 0x72, 0x00, 0x59, 0x1f, 0x0a, 0x89, 0x26, 0xe6, 0x5a, 0xe6,
+	0xfc, 0xf7, 0x52, 0xce, 0x4f, 0x33, 0xf4, 0x45, 0xbf, 0x23, 0xd1, 0x44, 0x3b, 0x6e, 0x0e, 0xee,
+	0x27, 0x0c, 0x0f, 0x18, 0xca, 0xc9, 0x1f, 0x10, 0xff, 0x0a, 0x86, 0x14, 0x62, 0x34, 0x31, 0xd7,
+	0x33, 0x9f, 0xfa, 0x52, 0x3e, 0x67, 0x29, 0xd8, 0xa2, 0xcd, 0xc2, 0xe5, 0xbb, 0xc1, 0xe7, 0xcb,
+	0x46, 0x13, 0xac, 0x62, 0x32, 0x0a, 0x7d, 0x62, 0x56, 0x33, 0xdd, 0x3f, 0x1e, 0xd2, 0x6d, 0x66,
+	0xd5, 0x5a, 0x4e, 0xb3, 0x86, 0x0f, 0x36, 0x63, 0x4e, 0xfa, 0x84, 0x73, 0x82, 0xa1, 0xcf, 0xa8,
+	0x24, 0x54, 0x9a, 0xb5, 0x4c, 0xf0, 0xe8, 0x21, 0xc1, 0xcb, 0x1c, 0x3c, 0x53, 0x9c, 0x96, 0xfe,
+	0x3e, 0xbe, 0xb7, 0xee, 0xf0, 0x5b, 0x97, 0x81, 0x3f, 0xef, 0x24, 0x74, 0x14, 0x87, 0x22, 0x95,
+	0xb2, 0xe7, 0xbc, 0x1f, 0xa7, 0x7e, 0x22, 0x24, 0x8b, 0x08, 0x17, 0xf6, 0x75, 0x1e, 0xde, 0xd8,
+	0x68, 0xa6, 0x50, 0xd8, 0xd7, 0x73, 0x5f, 0xe0, 0x9b, 0x46, 0x15, 0x54, 0x8a, 0x2b, 0xdf, 0x78,
+	0x5b, 0x06, 0xfb, 0x3e, 0x8b, 0xac, 0x07, 0x1f, 0xe4, 0xc6, 0xcf, 0xb3, 0xcd, 0x5c, 0xa6, 0x97,
+	0xf9, 0xb2, 0xf4, 0xfa, 0x89, 0xa6, 0x03, 0x36, 0x44, 0x34, 0xb0, 0x18, 0x0f, 0xec, 0x80, 0xd0,
+	0xec, 0xaa, 0xdb, 0x77, 0x3b, 0xfa, 0xc2, 0x9f, 0xc5, 0xbf, 0x45, 0xf4, 0xae, 0xbc, 0x72, 0xee,
+	0xba, 0x1f, 0xca, 0x7b, 0xe7, 0x4a, 0xd2, 0xc5, 0xc2, 0x52, 0x61, 0x1a, 0x75, 0xeb, 0x56, 0x3b,
+	0xaf, 0xfc, 0x98, 0xd7, 0xf4, 0x5c, 0x2c, 0x7a, 0x45, 0x4d, 0xaf, 0x5b, 0xef, 0x15, 0x35, 0xb7,
+	0xe5, 0x7d, 0x95, 0x70, 0x1c, 0x17, 0x0b, 0xc7, 0x29, 0xaa, 0x1c, 0xa7, 0x5b, 0x77, 0x9c, 0xa2,
+	0xce, 0x5b, 0xcd, 0x9a, 0xad, 0x7f, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x6a, 0xf7, 0x63, 0xec, 0xd8,
+	0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_criterion.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_criterion.pb.go
new file mode 100644
index 0000000..3eab7eb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_criterion.pb.go
@@ -0,0 +1,893 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_criterion.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad group criterion.
+type AdGroupCriterion struct {
+	// The resource name of the ad group criterion.
+	// Ad group criterion resource names have the form:
+	//
+	// `customers/{customer_id}/adGroupCriteria/{ad_group_id}~{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the criterion.
+	//
+	// This field is ignored for mutates.
+	CriterionId *wrappers.Int64Value `protobuf:"bytes,26,opt,name=criterion_id,json=criterionId,proto3" json:"criterion_id,omitempty"`
+	// The status of the criterion.
+	Status enums.AdGroupCriterionStatusEnum_AdGroupCriterionStatus `protobuf:"varint,3,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.AdGroupCriterionStatusEnum_AdGroupCriterionStatus" json:"status,omitempty"`
+	// Information regarding the quality of the criterion.
+	QualityInfo *AdGroupCriterion_QualityInfo `protobuf:"bytes,4,opt,name=quality_info,json=qualityInfo,proto3" json:"quality_info,omitempty"`
+	// The ad group to which the criterion belongs.
+	AdGroup *wrappers.StringValue `protobuf:"bytes,5,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// The type of the criterion.
+	Type enums.CriterionTypeEnum_CriterionType `protobuf:"varint,25,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.CriterionTypeEnum_CriterionType" json:"type,omitempty"`
+	// Whether to target (`false`) or exclude (`true`) the criterion.
+	//
+	// This field is immutable. To switch a criterion from positive to negative,
+	// remove then re-add it.
+	Negative *wrappers.BoolValue `protobuf:"bytes,31,opt,name=negative,proto3" json:"negative,omitempty"`
+	// Serving status of the criterion.
+	SystemServingStatus enums.CriterionSystemServingStatusEnum_CriterionSystemServingStatus `protobuf:"varint,52,opt,name=system_serving_status,json=systemServingStatus,proto3,enum=google.ads.googleads.v3.enums.CriterionSystemServingStatusEnum_CriterionSystemServingStatus" json:"system_serving_status,omitempty"`
+	// Approval status of the criterion.
+	ApprovalStatus enums.AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus `protobuf:"varint,53,opt,name=approval_status,json=approvalStatus,proto3,enum=google.ads.googleads.v3.enums.AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus" json:"approval_status,omitempty"`
+	// The modifier for the bid when the criterion matches. The modifier must be
+	// in the range: 0.1 - 10.0. Most targetable criteria types support modifiers.
+	BidModifier *wrappers.DoubleValue `protobuf:"bytes,44,opt,name=bid_modifier,json=bidModifier,proto3" json:"bid_modifier,omitempty"`
+	// The CPC (cost-per-click) bid.
+	CpcBidMicros *wrappers.Int64Value `protobuf:"bytes,16,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
+	// The CPM (cost-per-thousand viewable impressions) bid.
+	CpmBidMicros *wrappers.Int64Value `protobuf:"bytes,17,opt,name=cpm_bid_micros,json=cpmBidMicros,proto3" json:"cpm_bid_micros,omitempty"`
+	// The CPV (cost-per-view) bid.
+	CpvBidMicros *wrappers.Int64Value `protobuf:"bytes,24,opt,name=cpv_bid_micros,json=cpvBidMicros,proto3" json:"cpv_bid_micros,omitempty"`
+	// The CPC bid amount, expressed as a fraction of the advertised price
+	// for some good or service. The valid range for the fraction is [0,1) and the
+	// value stored here is 1,000,000 * [fraction].
+	PercentCpcBidMicros *wrappers.Int64Value `protobuf:"bytes,33,opt,name=percent_cpc_bid_micros,json=percentCpcBidMicros,proto3" json:"percent_cpc_bid_micros,omitempty"`
+	// The effective CPC (cost-per-click) bid.
+	EffectiveCpcBidMicros *wrappers.Int64Value `protobuf:"bytes,18,opt,name=effective_cpc_bid_micros,json=effectiveCpcBidMicros,proto3" json:"effective_cpc_bid_micros,omitempty"`
+	// The effective CPM (cost-per-thousand viewable impressions) bid.
+	EffectiveCpmBidMicros *wrappers.Int64Value `protobuf:"bytes,19,opt,name=effective_cpm_bid_micros,json=effectiveCpmBidMicros,proto3" json:"effective_cpm_bid_micros,omitempty"`
+	// The effective CPV (cost-per-view) bid.
+	EffectiveCpvBidMicros *wrappers.Int64Value `protobuf:"bytes,20,opt,name=effective_cpv_bid_micros,json=effectiveCpvBidMicros,proto3" json:"effective_cpv_bid_micros,omitempty"`
+	// The effective Percent CPC bid amount.
+	EffectivePercentCpcBidMicros *wrappers.Int64Value `protobuf:"bytes,34,opt,name=effective_percent_cpc_bid_micros,json=effectivePercentCpcBidMicros,proto3" json:"effective_percent_cpc_bid_micros,omitempty"`
+	// Source of the effective CPC bid.
+	EffectiveCpcBidSource enums.BiddingSourceEnum_BiddingSource `protobuf:"varint,21,opt,name=effective_cpc_bid_source,json=effectiveCpcBidSource,proto3,enum=google.ads.googleads.v3.enums.BiddingSourceEnum_BiddingSource" json:"effective_cpc_bid_source,omitempty"`
+	// Source of the effective CPM bid.
+	EffectiveCpmBidSource enums.BiddingSourceEnum_BiddingSource `protobuf:"varint,22,opt,name=effective_cpm_bid_source,json=effectiveCpmBidSource,proto3,enum=google.ads.googleads.v3.enums.BiddingSourceEnum_BiddingSource" json:"effective_cpm_bid_source,omitempty"`
+	// Source of the effective CPV bid.
+	EffectiveCpvBidSource enums.BiddingSourceEnum_BiddingSource `protobuf:"varint,23,opt,name=effective_cpv_bid_source,json=effectiveCpvBidSource,proto3,enum=google.ads.googleads.v3.enums.BiddingSourceEnum_BiddingSource" json:"effective_cpv_bid_source,omitempty"`
+	// Source of the effective Percent CPC bid.
+	EffectivePercentCpcBidSource enums.BiddingSourceEnum_BiddingSource `protobuf:"varint,35,opt,name=effective_percent_cpc_bid_source,json=effectivePercentCpcBidSource,proto3,enum=google.ads.googleads.v3.enums.BiddingSourceEnum_BiddingSource" json:"effective_percent_cpc_bid_source,omitempty"`
+	// Estimates for criterion bids at various positions.
+	PositionEstimates *AdGroupCriterion_PositionEstimates `protobuf:"bytes,10,opt,name=position_estimates,json=positionEstimates,proto3" json:"position_estimates,omitempty"`
+	// The list of possible final URLs after all cross-domain redirects for the
+	// ad.
+	FinalUrls []*wrappers.StringValue `protobuf:"bytes,11,rep,name=final_urls,json=finalUrls,proto3" json:"final_urls,omitempty"`
+	// The list of possible final mobile URLs after all cross-domain redirects.
+	FinalMobileUrls []*wrappers.StringValue `protobuf:"bytes,51,rep,name=final_mobile_urls,json=finalMobileUrls,proto3" json:"final_mobile_urls,omitempty"`
+	// URL template for appending params to final URL.
+	FinalUrlSuffix *wrappers.StringValue `protobuf:"bytes,50,opt,name=final_url_suffix,json=finalUrlSuffix,proto3" json:"final_url_suffix,omitempty"`
+	// The URL template for constructing a tracking URL.
+	TrackingUrlTemplate *wrappers.StringValue `protobuf:"bytes,13,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	// The list of mappings used to substitute custom parameter tags in a
+	// `tracking_url_template`, `final_urls`, or `mobile_final_urls`.
+	UrlCustomParameters []*common.CustomParameter `protobuf:"bytes,14,rep,name=url_custom_parameters,json=urlCustomParameters,proto3" json:"url_custom_parameters,omitempty"`
+	// The ad group criterion.
+	//
+	// Exactly one must be set.
+	//
+	// Types that are valid to be assigned to Criterion:
+	//	*AdGroupCriterion_Keyword
+	//	*AdGroupCriterion_Placement
+	//	*AdGroupCriterion_MobileAppCategory
+	//	*AdGroupCriterion_MobileApplication
+	//	*AdGroupCriterion_ListingGroup
+	//	*AdGroupCriterion_AgeRange
+	//	*AdGroupCriterion_Gender
+	//	*AdGroupCriterion_IncomeRange
+	//	*AdGroupCriterion_ParentalStatus
+	//	*AdGroupCriterion_UserList
+	//	*AdGroupCriterion_YoutubeVideo
+	//	*AdGroupCriterion_YoutubeChannel
+	//	*AdGroupCriterion_Topic
+	//	*AdGroupCriterion_UserInterest
+	//	*AdGroupCriterion_Webpage
+	//	*AdGroupCriterion_AppPaymentModel
+	//	*AdGroupCriterion_CustomAffinity
+	//	*AdGroupCriterion_CustomIntent
+	Criterion            isAdGroupCriterion_Criterion `protobuf_oneof:"criterion"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *AdGroupCriterion) Reset()         { *m = AdGroupCriterion{} }
+func (m *AdGroupCriterion) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterion) ProtoMessage()    {}
+func (*AdGroupCriterion) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dbeea8b4a62ffe2f, []int{0}
+}
+
+func (m *AdGroupCriterion) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterion.Unmarshal(m, b)
+}
+func (m *AdGroupCriterion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterion.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterion) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterion.Merge(m, src)
+}
+func (m *AdGroupCriterion) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterion.Size(m)
+}
+func (m *AdGroupCriterion) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterion.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterion proto.InternalMessageInfo
+
+func (m *AdGroupCriterion) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupCriterion) GetCriterionId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CriterionId
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetStatus() enums.AdGroupCriterionStatusEnum_AdGroupCriterionStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.AdGroupCriterionStatusEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion) GetQualityInfo() *AdGroupCriterion_QualityInfo {
+	if m != nil {
+		return m.QualityInfo
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetType() enums.CriterionTypeEnum_CriterionType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.CriterionTypeEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion) GetNegative() *wrappers.BoolValue {
+	if m != nil {
+		return m.Negative
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetSystemServingStatus() enums.CriterionSystemServingStatusEnum_CriterionSystemServingStatus {
+	if m != nil {
+		return m.SystemServingStatus
+	}
+	return enums.CriterionSystemServingStatusEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion) GetApprovalStatus() enums.AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus {
+	if m != nil {
+		return m.ApprovalStatus
+	}
+	return enums.AdGroupCriterionApprovalStatusEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion) GetBidModifier() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BidModifier
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetCpmBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpmBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetCpvBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpvBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetPercentCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.PercentCpcBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetEffectiveCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.EffectiveCpcBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetEffectiveCpmBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.EffectiveCpmBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetEffectiveCpvBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.EffectiveCpvBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetEffectivePercentCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.EffectivePercentCpcBidMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetEffectiveCpcBidSource() enums.BiddingSourceEnum_BiddingSource {
+	if m != nil {
+		return m.EffectiveCpcBidSource
+	}
+	return enums.BiddingSourceEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion) GetEffectiveCpmBidSource() enums.BiddingSourceEnum_BiddingSource {
+	if m != nil {
+		return m.EffectiveCpmBidSource
+	}
+	return enums.BiddingSourceEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion) GetEffectiveCpvBidSource() enums.BiddingSourceEnum_BiddingSource {
+	if m != nil {
+		return m.EffectiveCpvBidSource
+	}
+	return enums.BiddingSourceEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion) GetEffectivePercentCpcBidSource() enums.BiddingSourceEnum_BiddingSource {
+	if m != nil {
+		return m.EffectivePercentCpcBidSource
+	}
+	return enums.BiddingSourceEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion) GetPositionEstimates() *AdGroupCriterion_PositionEstimates {
+	if m != nil {
+		return m.PositionEstimates
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetFinalUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrls
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetFinalMobileUrls() []*wrappers.StringValue {
+	if m != nil {
+		return m.FinalMobileUrls
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetFinalUrlSuffix() *wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrlSuffix
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetUrlCustomParameters() []*common.CustomParameter {
+	if m != nil {
+		return m.UrlCustomParameters
+	}
+	return nil
+}
+
+type isAdGroupCriterion_Criterion interface {
+	isAdGroupCriterion_Criterion()
+}
+
+type AdGroupCriterion_Keyword struct {
+	Keyword *common.KeywordInfo `protobuf:"bytes,27,opt,name=keyword,proto3,oneof"`
+}
+
+type AdGroupCriterion_Placement struct {
+	Placement *common.PlacementInfo `protobuf:"bytes,28,opt,name=placement,proto3,oneof"`
+}
+
+type AdGroupCriterion_MobileAppCategory struct {
+	MobileAppCategory *common.MobileAppCategoryInfo `protobuf:"bytes,29,opt,name=mobile_app_category,json=mobileAppCategory,proto3,oneof"`
+}
+
+type AdGroupCriterion_MobileApplication struct {
+	MobileApplication *common.MobileApplicationInfo `protobuf:"bytes,30,opt,name=mobile_application,json=mobileApplication,proto3,oneof"`
+}
+
+type AdGroupCriterion_ListingGroup struct {
+	ListingGroup *common.ListingGroupInfo `protobuf:"bytes,32,opt,name=listing_group,json=listingGroup,proto3,oneof"`
+}
+
+type AdGroupCriterion_AgeRange struct {
+	AgeRange *common.AgeRangeInfo `protobuf:"bytes,36,opt,name=age_range,json=ageRange,proto3,oneof"`
+}
+
+type AdGroupCriterion_Gender struct {
+	Gender *common.GenderInfo `protobuf:"bytes,37,opt,name=gender,proto3,oneof"`
+}
+
+type AdGroupCriterion_IncomeRange struct {
+	IncomeRange *common.IncomeRangeInfo `protobuf:"bytes,38,opt,name=income_range,json=incomeRange,proto3,oneof"`
+}
+
+type AdGroupCriterion_ParentalStatus struct {
+	ParentalStatus *common.ParentalStatusInfo `protobuf:"bytes,39,opt,name=parental_status,json=parentalStatus,proto3,oneof"`
+}
+
+type AdGroupCriterion_UserList struct {
+	UserList *common.UserListInfo `protobuf:"bytes,42,opt,name=user_list,json=userList,proto3,oneof"`
+}
+
+type AdGroupCriterion_YoutubeVideo struct {
+	YoutubeVideo *common.YouTubeVideoInfo `protobuf:"bytes,40,opt,name=youtube_video,json=youtubeVideo,proto3,oneof"`
+}
+
+type AdGroupCriterion_YoutubeChannel struct {
+	YoutubeChannel *common.YouTubeChannelInfo `protobuf:"bytes,41,opt,name=youtube_channel,json=youtubeChannel,proto3,oneof"`
+}
+
+type AdGroupCriterion_Topic struct {
+	Topic *common.TopicInfo `protobuf:"bytes,43,opt,name=topic,proto3,oneof"`
+}
+
+type AdGroupCriterion_UserInterest struct {
+	UserInterest *common.UserInterestInfo `protobuf:"bytes,45,opt,name=user_interest,json=userInterest,proto3,oneof"`
+}
+
+type AdGroupCriterion_Webpage struct {
+	Webpage *common.WebpageInfo `protobuf:"bytes,46,opt,name=webpage,proto3,oneof"`
+}
+
+type AdGroupCriterion_AppPaymentModel struct {
+	AppPaymentModel *common.AppPaymentModelInfo `protobuf:"bytes,47,opt,name=app_payment_model,json=appPaymentModel,proto3,oneof"`
+}
+
+type AdGroupCriterion_CustomAffinity struct {
+	CustomAffinity *common.CustomAffinityInfo `protobuf:"bytes,48,opt,name=custom_affinity,json=customAffinity,proto3,oneof"`
+}
+
+type AdGroupCriterion_CustomIntent struct {
+	CustomIntent *common.CustomIntentInfo `protobuf:"bytes,49,opt,name=custom_intent,json=customIntent,proto3,oneof"`
+}
+
+func (*AdGroupCriterion_Keyword) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_Placement) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_MobileAppCategory) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_MobileApplication) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_ListingGroup) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_AgeRange) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_Gender) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_IncomeRange) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_ParentalStatus) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_UserList) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_YoutubeVideo) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_YoutubeChannel) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_Topic) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_UserInterest) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_Webpage) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_AppPaymentModel) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_CustomAffinity) isAdGroupCriterion_Criterion() {}
+
+func (*AdGroupCriterion_CustomIntent) isAdGroupCriterion_Criterion() {}
+
+func (m *AdGroupCriterion) GetCriterion() isAdGroupCriterion_Criterion {
+	if m != nil {
+		return m.Criterion
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetKeyword() *common.KeywordInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_Keyword); ok {
+		return x.Keyword
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetPlacement() *common.PlacementInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_Placement); ok {
+		return x.Placement
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetMobileAppCategory() *common.MobileAppCategoryInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_MobileAppCategory); ok {
+		return x.MobileAppCategory
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetMobileApplication() *common.MobileApplicationInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_MobileApplication); ok {
+		return x.MobileApplication
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetListingGroup() *common.ListingGroupInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_ListingGroup); ok {
+		return x.ListingGroup
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetAgeRange() *common.AgeRangeInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_AgeRange); ok {
+		return x.AgeRange
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetGender() *common.GenderInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_Gender); ok {
+		return x.Gender
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetIncomeRange() *common.IncomeRangeInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_IncomeRange); ok {
+		return x.IncomeRange
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetParentalStatus() *common.ParentalStatusInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_ParentalStatus); ok {
+		return x.ParentalStatus
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetUserList() *common.UserListInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_UserList); ok {
+		return x.UserList
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetYoutubeVideo() *common.YouTubeVideoInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_YoutubeVideo); ok {
+		return x.YoutubeVideo
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetYoutubeChannel() *common.YouTubeChannelInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_YoutubeChannel); ok {
+		return x.YoutubeChannel
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetTopic() *common.TopicInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_Topic); ok {
+		return x.Topic
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetUserInterest() *common.UserInterestInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_UserInterest); ok {
+		return x.UserInterest
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetWebpage() *common.WebpageInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_Webpage); ok {
+		return x.Webpage
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetAppPaymentModel() *common.AppPaymentModelInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_AppPaymentModel); ok {
+		return x.AppPaymentModel
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetCustomAffinity() *common.CustomAffinityInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_CustomAffinity); ok {
+		return x.CustomAffinity
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion) GetCustomIntent() *common.CustomIntentInfo {
+	if x, ok := m.GetCriterion().(*AdGroupCriterion_CustomIntent); ok {
+		return x.CustomIntent
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupCriterion) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupCriterion_Keyword)(nil),
+		(*AdGroupCriterion_Placement)(nil),
+		(*AdGroupCriterion_MobileAppCategory)(nil),
+		(*AdGroupCriterion_MobileApplication)(nil),
+		(*AdGroupCriterion_ListingGroup)(nil),
+		(*AdGroupCriterion_AgeRange)(nil),
+		(*AdGroupCriterion_Gender)(nil),
+		(*AdGroupCriterion_IncomeRange)(nil),
+		(*AdGroupCriterion_ParentalStatus)(nil),
+		(*AdGroupCriterion_UserList)(nil),
+		(*AdGroupCriterion_YoutubeVideo)(nil),
+		(*AdGroupCriterion_YoutubeChannel)(nil),
+		(*AdGroupCriterion_Topic)(nil),
+		(*AdGroupCriterion_UserInterest)(nil),
+		(*AdGroupCriterion_Webpage)(nil),
+		(*AdGroupCriterion_AppPaymentModel)(nil),
+		(*AdGroupCriterion_CustomAffinity)(nil),
+		(*AdGroupCriterion_CustomIntent)(nil),
+	}
+}
+
+// A container for ad group criterion quality information.
+type AdGroupCriterion_QualityInfo struct {
+	// The quality score.
+	//
+	// This field may not be populated if Google does not have enough
+	// information to determine a value.
+	QualityScore *wrappers.Int32Value `protobuf:"bytes,1,opt,name=quality_score,json=qualityScore,proto3" json:"quality_score,omitempty"`
+	// The performance of the ad compared to other advertisers.
+	CreativeQualityScore enums.QualityScoreBucketEnum_QualityScoreBucket `protobuf:"varint,2,opt,name=creative_quality_score,json=creativeQualityScore,proto3,enum=google.ads.googleads.v3.enums.QualityScoreBucketEnum_QualityScoreBucket" json:"creative_quality_score,omitempty"`
+	// The quality score of the landing page.
+	PostClickQualityScore enums.QualityScoreBucketEnum_QualityScoreBucket `protobuf:"varint,3,opt,name=post_click_quality_score,json=postClickQualityScore,proto3,enum=google.ads.googleads.v3.enums.QualityScoreBucketEnum_QualityScoreBucket" json:"post_click_quality_score,omitempty"`
+	// The click-through rate compared to that of other advertisers.
+	SearchPredictedCtr   enums.QualityScoreBucketEnum_QualityScoreBucket `protobuf:"varint,4,opt,name=search_predicted_ctr,json=searchPredictedCtr,proto3,enum=google.ads.googleads.v3.enums.QualityScoreBucketEnum_QualityScoreBucket" json:"search_predicted_ctr,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                        `json:"-"`
+	XXX_unrecognized     []byte                                          `json:"-"`
+	XXX_sizecache        int32                                           `json:"-"`
+}
+
+func (m *AdGroupCriterion_QualityInfo) Reset()         { *m = AdGroupCriterion_QualityInfo{} }
+func (m *AdGroupCriterion_QualityInfo) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterion_QualityInfo) ProtoMessage()    {}
+func (*AdGroupCriterion_QualityInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dbeea8b4a62ffe2f, []int{0, 0}
+}
+
+func (m *AdGroupCriterion_QualityInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterion_QualityInfo.Unmarshal(m, b)
+}
+func (m *AdGroupCriterion_QualityInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterion_QualityInfo.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterion_QualityInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterion_QualityInfo.Merge(m, src)
+}
+func (m *AdGroupCriterion_QualityInfo) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterion_QualityInfo.Size(m)
+}
+func (m *AdGroupCriterion_QualityInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterion_QualityInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterion_QualityInfo proto.InternalMessageInfo
+
+func (m *AdGroupCriterion_QualityInfo) GetQualityScore() *wrappers.Int32Value {
+	if m != nil {
+		return m.QualityScore
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion_QualityInfo) GetCreativeQualityScore() enums.QualityScoreBucketEnum_QualityScoreBucket {
+	if m != nil {
+		return m.CreativeQualityScore
+	}
+	return enums.QualityScoreBucketEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion_QualityInfo) GetPostClickQualityScore() enums.QualityScoreBucketEnum_QualityScoreBucket {
+	if m != nil {
+		return m.PostClickQualityScore
+	}
+	return enums.QualityScoreBucketEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterion_QualityInfo) GetSearchPredictedCtr() enums.QualityScoreBucketEnum_QualityScoreBucket {
+	if m != nil {
+		return m.SearchPredictedCtr
+	}
+	return enums.QualityScoreBucketEnum_UNSPECIFIED
+}
+
+// Estimates for criterion bids at various positions.
+type AdGroupCriterion_PositionEstimates struct {
+	// The estimate of the CPC bid required for ad to be shown on first
+	// page of search results.
+	FirstPageCpcMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=first_page_cpc_micros,json=firstPageCpcMicros,proto3" json:"first_page_cpc_micros,omitempty"`
+	// The estimate of the CPC bid required for ad to be displayed in first
+	// position, at the top of the first page of search results.
+	FirstPositionCpcMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=first_position_cpc_micros,json=firstPositionCpcMicros,proto3" json:"first_position_cpc_micros,omitempty"`
+	// The estimate of the CPC bid required for ad to be displayed at the top
+	// of the first page of search results.
+	TopOfPageCpcMicros *wrappers.Int64Value `protobuf:"bytes,3,opt,name=top_of_page_cpc_micros,json=topOfPageCpcMicros,proto3" json:"top_of_page_cpc_micros,omitempty"`
+	// Estimate of how many clicks per week you might get by changing your
+	// keyword bid to the value in first_position_cpc_micros.
+	EstimatedAddClicksAtFirstPositionCpc *wrappers.Int64Value `protobuf:"bytes,4,opt,name=estimated_add_clicks_at_first_position_cpc,json=estimatedAddClicksAtFirstPositionCpc,proto3" json:"estimated_add_clicks_at_first_position_cpc,omitempty"`
+	// Estimate of how your cost per week might change when changing your
+	// keyword bid to the value in first_position_cpc_micros.
+	EstimatedAddCostAtFirstPositionCpc *wrappers.Int64Value `protobuf:"bytes,5,opt,name=estimated_add_cost_at_first_position_cpc,json=estimatedAddCostAtFirstPositionCpc,proto3" json:"estimated_add_cost_at_first_position_cpc,omitempty"`
+	XXX_NoUnkeyedLiteral               struct{}             `json:"-"`
+	XXX_unrecognized                   []byte               `json:"-"`
+	XXX_sizecache                      int32                `json:"-"`
+}
+
+func (m *AdGroupCriterion_PositionEstimates) Reset()         { *m = AdGroupCriterion_PositionEstimates{} }
+func (m *AdGroupCriterion_PositionEstimates) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterion_PositionEstimates) ProtoMessage()    {}
+func (*AdGroupCriterion_PositionEstimates) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dbeea8b4a62ffe2f, []int{0, 1}
+}
+
+func (m *AdGroupCriterion_PositionEstimates) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterion_PositionEstimates.Unmarshal(m, b)
+}
+func (m *AdGroupCriterion_PositionEstimates) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterion_PositionEstimates.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterion_PositionEstimates) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterion_PositionEstimates.Merge(m, src)
+}
+func (m *AdGroupCriterion_PositionEstimates) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterion_PositionEstimates.Size(m)
+}
+func (m *AdGroupCriterion_PositionEstimates) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterion_PositionEstimates.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterion_PositionEstimates proto.InternalMessageInfo
+
+func (m *AdGroupCriterion_PositionEstimates) GetFirstPageCpcMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.FirstPageCpcMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion_PositionEstimates) GetFirstPositionCpcMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.FirstPositionCpcMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion_PositionEstimates) GetTopOfPageCpcMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TopOfPageCpcMicros
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion_PositionEstimates) GetEstimatedAddClicksAtFirstPositionCpc() *wrappers.Int64Value {
+	if m != nil {
+		return m.EstimatedAddClicksAtFirstPositionCpc
+	}
+	return nil
+}
+
+func (m *AdGroupCriterion_PositionEstimates) GetEstimatedAddCostAtFirstPositionCpc() *wrappers.Int64Value {
+	if m != nil {
+		return m.EstimatedAddCostAtFirstPositionCpc
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AdGroupCriterion)(nil), "google.ads.googleads.v3.resources.AdGroupCriterion")
+	proto.RegisterType((*AdGroupCriterion_QualityInfo)(nil), "google.ads.googleads.v3.resources.AdGroupCriterion.QualityInfo")
+	proto.RegisterType((*AdGroupCriterion_PositionEstimates)(nil), "google.ads.googleads.v3.resources.AdGroupCriterion.PositionEstimates")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_criterion.proto", fileDescriptor_dbeea8b4a62ffe2f)
+}
+
+var fileDescriptor_dbeea8b4a62ffe2f = []byte{
+	// 1749 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x98, 0xdd, 0x72, 0x1b, 0xb7,
+	0x15, 0xc7, 0x4b, 0x29, 0x76, 0x2c, 0x48, 0x96, 0x2d, 0xc8, 0x52, 0x61, 0xc5, 0x4d, 0x65, 0x27,
+	0x6e, 0x65, 0x27, 0x26, 0x53, 0x31, 0x4e, 0x5b, 0x66, 0x9a, 0x94, 0x52, 0x6c, 0x59, 0x4d, 0x95,
+	0x30, 0x94, 0xac, 0x4c, 0x3b, 0xea, 0x6c, 0xc1, 0x5d, 0x70, 0x8d, 0xf1, 0xee, 0x02, 0x06, 0xb0,
+	0x74, 0xd9, 0x4c, 0x3a, 0xd3, 0x5e, 0x74, 0xa6, 0x77, 0x7d, 0x86, 0x5e, 0xf6, 0xa2, 0x0f, 0xd2,
+	0x9b, 0xbe, 0x47, 0x1e, 0xa0, 0xd7, 0x1d, 0x7c, 0x91, 0x4b, 0x52, 0xe4, 0x52, 0x1d, 0xdd, 0xed,
+	0x62, 0xcf, 0xff, 0x77, 0x0e, 0x0e, 0xce, 0x62, 0x0f, 0x16, 0x34, 0x62, 0xc6, 0xe2, 0x84, 0xd4,
+	0x70, 0x24, 0x6b, 0xf6, 0x52, 0x5f, 0xf5, 0xea, 0x35, 0x41, 0x24, 0xcb, 0x45, 0x48, 0x64, 0x0d,
+	0x47, 0x41, 0x2c, 0x58, 0xce, 0x83, 0x50, 0x50, 0x45, 0x04, 0x65, 0x59, 0x95, 0x0b, 0xa6, 0x18,
+	0xbc, 0x6b, 0x05, 0x55, 0x1c, 0xc9, 0xea, 0x40, 0x5b, 0xed, 0xd5, 0xab, 0x03, 0xed, 0xd6, 0xa3,
+	0x69, 0xf8, 0x90, 0xa5, 0x29, 0xcb, 0x6a, 0x0e, 0x89, 0x2d, 0x71, 0xeb, 0x71, 0x99, 0x79, 0x2e,
+	0x15, 0x4b, 0x03, 0x8e, 0x05, 0x4e, 0x89, 0x22, 0xc2, 0xc9, 0x9e, 0x4e, 0x93, 0x91, 0x2c, 0x4f,
+	0xcf, 0x9b, 0x40, 0x80, 0x39, 0x17, 0xac, 0x87, 0x93, 0x40, 0x2a, 0xac, 0x72, 0xe9, 0x38, 0xbf,
+	0xb8, 0x30, 0x67, 0x44, 0xbe, 0x3b, 0x5b, 0xde, 0xa1, 0x51, 0x44, 0xb3, 0x38, 0xb0, 0xb9, 0x71,
+	0x9a, 0xfd, 0xd9, 0x9a, 0x82, 0xa7, 0xbe, 0x54, 0x24, 0x0d, 0x24, 0x11, 0x3d, 0x03, 0xb9, 0x80,
+	0xe3, 0x21, 0x44, 0xf5, 0xb9, 0x77, 0xfc, 0xb3, 0xd9, 0x9a, 0x57, 0x39, 0x4e, 0xa8, 0xea, 0x07,
+	0x32, 0x64, 0x82, 0x04, 0x9d, 0x3c, 0x7c, 0x49, 0x94, 0x53, 0xde, 0xf6, 0x4a, 0x4e, 0x07, 0x55,
+	0xe2, 0x1e, 0xbd, 0xed, 0x1e, 0x99, 0xbb, 0x4e, 0xde, 0xad, 0xbd, 0x16, 0x98, 0x73, 0x22, 0x7c,
+	0xa0, 0x77, 0x0a, 0x52, 0x9c, 0x65, 0x4c, 0x61, 0x45, 0x59, 0xe6, 0x9e, 0xde, 0xfb, 0xd7, 0x0e,
+	0xb8, 0xd9, 0x8c, 0x0e, 0x74, 0x8a, 0xf7, 0x7d, 0xc8, 0xf0, 0x1d, 0x70, 0xdd, 0x3b, 0x09, 0x32,
+	0x9c, 0x12, 0x54, 0xd9, 0xae, 0xec, 0x2c, 0xb5, 0x57, 0xfc, 0xe0, 0x17, 0x38, 0x25, 0xf0, 0x13,
+	0xb0, 0x32, 0x9c, 0x24, 0x8d, 0xd0, 0xd6, 0x76, 0x65, 0x67, 0x79, 0xf7, 0x2d, 0x57, 0x95, 0x55,
+	0x1f, 0x4e, 0xf5, 0x30, 0x53, 0x1f, 0x7d, 0x78, 0x8a, 0x93, 0x9c, 0xb4, 0x97, 0x07, 0x82, 0xc3,
+	0x08, 0xbe, 0x00, 0x57, 0x6d, 0x42, 0xd1, 0xe2, 0x76, 0x65, 0x67, 0x75, 0xb7, 0x55, 0x9d, 0x56,
+	0xda, 0x26, 0x3b, 0xd5, 0xf1, 0x28, 0x8f, 0x8d, 0xf8, 0x49, 0x96, 0xa7, 0x53, 0x1e, 0xb5, 0x1d,
+	0x1f, 0x76, 0xc0, 0x8a, 0x4f, 0x2d, 0xcd, 0xba, 0x0c, 0xbd, 0x61, 0x22, 0xfd, 0xb4, 0x5a, 0xfa,
+	0x2a, 0x4d, 0x80, 0xab, 0x5f, 0x59, 0xce, 0x61, 0xd6, 0x65, 0xed, 0xe5, 0x57, 0xc3, 0x1b, 0xf8,
+	0x53, 0x70, 0xcd, 0x97, 0x2a, 0xba, 0x62, 0xf8, 0x77, 0x26, 0x32, 0x71, 0xac, 0x04, 0xcd, 0x62,
+	0x9b, 0x8a, 0x37, 0xb1, 0x45, 0xc3, 0x36, 0x78, 0x43, 0x57, 0x08, 0xba, 0x6d, 0x92, 0xf0, 0x49,
+	0x49, 0x12, 0x06, 0x91, 0x9c, 0xf4, 0x39, 0x31, 0x73, 0x1f, 0x19, 0x69, 0x1b, 0x16, 0xfc, 0x08,
+	0x5c, 0xcb, 0x48, 0x8c, 0x15, 0xed, 0x11, 0xf4, 0x43, 0x13, 0xcc, 0xd6, 0x44, 0x30, 0x7b, 0x8c,
+	0x25, 0x36, 0x94, 0x81, 0x2d, 0xfc, 0x7b, 0x05, 0x6c, 0x9c, 0x5b, 0xf3, 0xe8, 0x43, 0x13, 0xdd,
+	0xd9, 0xbc, 0xd1, 0x1d, 0x1b, 0xc8, 0xb1, 0x65, 0x14, 0x16, 0x6a, 0x96, 0x41, 0x7b, 0x5d, 0x4e,
+	0x0e, 0xc2, 0xbf, 0x55, 0xc0, 0x8d, 0xb1, 0x8d, 0x03, 0x3d, 0x36, 0xc1, 0xfc, 0xfe, 0x82, 0xf5,
+	0xd2, 0x74, 0x94, 0x19, 0x75, 0x33, 0x6a, 0xd2, 0x5e, 0xc5, 0x23, 0xf7, 0xf0, 0x53, 0xb0, 0xd2,
+	0xa1, 0x51, 0x90, 0xb2, 0x88, 0x76, 0x29, 0x11, 0xe8, 0xfd, 0x29, 0xeb, 0xfc, 0x19, 0xcb, 0x3b,
+	0x09, 0x71, 0x25, 0xdf, 0xa1, 0xd1, 0x91, 0x13, 0xc0, 0x26, 0x58, 0x0d, 0x79, 0x18, 0x18, 0x08,
+	0x0d, 0x05, 0x93, 0xe8, 0x66, 0xf9, 0x4b, 0xb3, 0x12, 0xf2, 0x70, 0x8f, 0x46, 0x47, 0x46, 0x60,
+	0x11, 0x69, 0x11, 0xb1, 0x36, 0x17, 0x22, 0x1d, 0x43, 0xf4, 0x8a, 0x08, 0x34, 0x17, 0xa2, 0x37,
+	0x44, 0xb4, 0xc0, 0x26, 0x27, 0x22, 0x24, 0x99, 0x0a, 0xc6, 0x26, 0x74, 0xb7, 0x1c, 0xb5, 0xee,
+	0xa4, 0xfb, 0xc5, 0x79, 0x9d, 0x00, 0x44, 0xba, 0x5d, 0x12, 0xea, 0x3a, 0x1c, 0x67, 0xc2, 0x72,
+	0xe6, 0xc6, 0x40, 0x3c, 0x8b, 0x3a, 0x92, 0xb7, 0xf5, 0x8b, 0x51, 0xd3, 0xa9, 0xd4, 0x91, 0x54,
+	0xde, 0xba, 0x18, 0xb5, 0x90, 0xd3, 0x10, 0x6c, 0x0f, 0xa9, 0x53, 0xb2, 0x7b, 0xaf, 0x9c, 0x7e,
+	0x67, 0x00, 0x69, 0x9d, 0x93, 0xe6, 0xd7, 0xe7, 0xa5, 0xd9, 0xee, 0x76, 0x68, 0x63, 0xae, 0x1d,
+	0x68, 0xcf, 0x7e, 0x51, 0x8f, 0x8d, 0xc6, 0xbc, 0x45, 0x23, 0x23, 0x13, 0x2b, 0x61, 0x87, 0xc7,
+	0x1d, 0xa7, 0x45, 0xc7, 0x9b, 0x97, 0xee, 0x38, 0x9d, 0xea, 0xb8, 0x57, 0x74, 0xfc, 0xfd, 0x4b,
+	0x77, 0xdc, 0x1b, 0x3a, 0xfe, 0x6b, 0x65, 0xd6, 0x82, 0xba, 0x08, 0xde, 0xb9, 0x94, 0x08, 0xa6,
+	0xac, 0xb9, 0x0b, 0x44, 0x01, 0xc8, 0x99, 0xa4, 0xfa, 0xab, 0x1f, 0x10, 0xa9, 0x68, 0x8a, 0x15,
+	0x91, 0x08, 0x98, 0x52, 0x7a, 0xf2, 0xff, 0x7c, 0x04, 0x5b, 0x8e, 0xf6, 0xc4, 0xc3, 0xda, 0x6b,
+	0x7c, 0x7c, 0x08, 0x7e, 0x0c, 0x40, 0x97, 0x66, 0x38, 0x09, 0x72, 0x91, 0x48, 0xb4, 0xbc, 0xbd,
+	0x58, 0xfa, 0x49, 0x5c, 0x32, 0xf6, 0xcf, 0x45, 0x22, 0xe1, 0x33, 0xb0, 0x66, 0xc5, 0x29, 0xeb,
+	0xd0, 0x84, 0x58, 0x46, 0x7d, 0x0e, 0xc6, 0x0d, 0x23, 0x3b, 0x32, 0x2a, 0x43, 0x7a, 0x0a, 0x6e,
+	0x0e, 0xc2, 0x08, 0x64, 0xde, 0xed, 0xd2, 0x3f, 0xa0, 0xdd, 0x39, 0xbe, 0xcf, 0xab, 0x3e, 0x98,
+	0x63, 0xa3, 0x81, 0x2d, 0xb0, 0xa1, 0x04, 0x0e, 0x5f, 0xea, 0x6f, 0xa2, 0x46, 0x29, 0x92, 0xf2,
+	0x04, 0x2b, 0x82, 0xae, 0xcf, 0x01, 0x5b, 0xf7, 0xd2, 0xe7, 0x22, 0x39, 0x71, 0x42, 0x18, 0x82,
+	0x0d, 0x0d, 0x1a, 0x6f, 0xaf, 0x25, 0x5a, 0x35, 0xf3, 0xac, 0x4d, 0x5d, 0x19, 0xdb, 0x97, 0x57,
+	0xf7, 0x8d, 0xb0, 0xe5, 0x75, 0xed, 0xf5, 0x5c, 0x24, 0x63, 0x63, 0x12, 0x1e, 0x80, 0x37, 0x5f,
+	0x92, 0xfe, 0x6b, 0x26, 0x22, 0xf4, 0x96, 0x09, 0xf4, 0xbd, 0x32, 0xec, 0xe7, 0xd6, 0x5c, 0x37,
+	0x35, 0xcf, 0xbe, 0xd7, 0xf6, 0x6a, 0x78, 0x04, 0x96, 0x78, 0x82, 0x43, 0x92, 0x92, 0x4c, 0xa1,
+	0x3b, 0x06, 0xf5, 0xa8, 0x0c, 0xd5, 0xf2, 0x02, 0x07, 0x1b, 0x12, 0x60, 0x0c, 0xd6, 0xdd, 0xd2,
+	0x62, 0xce, 0x83, 0x10, 0x2b, 0x12, 0x33, 0xd1, 0x47, 0x3f, 0x30, 0xe0, 0xc7, 0x65, 0x60, 0xbb,
+	0xbe, 0x4d, 0xce, 0xf7, 0x9d, 0xd0, 0x39, 0x58, 0x4b, 0xc7, 0x1f, 0xc0, 0x2e, 0x80, 0x43, 0x47,
+	0x09, 0x0d, 0x4d, 0xf3, 0x8b, 0xde, 0xbe, 0xa0, 0x1f, 0x2f, 0x9c, 0xf0, 0xe3, 0x1f, 0xc0, 0xaf,
+	0xc1, 0xf5, 0x84, 0x4a, 0xa5, 0xcb, 0xc3, 0x36, 0x81, 0xdb, 0xc6, 0xc5, 0x07, 0x65, 0x2e, 0x7e,
+	0x6d, 0x45, 0xe6, 0x0d, 0x73, 0xf4, 0x95, 0xa4, 0x30, 0x06, 0x3f, 0x07, 0x4b, 0x38, 0x26, 0x81,
+	0xc0, 0x59, 0x4c, 0xd0, 0xbb, 0x06, 0xfa, 0x7e, 0x19, 0xb4, 0x19, 0x93, 0xb6, 0xb6, 0x77, 0xc0,
+	0x6b, 0xd8, 0xdd, 0xc3, 0xcf, 0xc0, 0xd5, 0x98, 0x64, 0x11, 0x11, 0xe8, 0xbe, 0x21, 0x3d, 0x2c,
+	0x23, 0x1d, 0x18, 0x6b, 0xc7, 0x71, 0x5a, 0x78, 0x02, 0x56, 0x68, 0x16, 0xb2, 0xd4, 0x47, 0xf5,
+	0x23, 0xc3, 0x2a, 0x2d, 0xd8, 0x43, 0xa3, 0x29, 0x06, 0xb6, 0x4c, 0x87, 0x43, 0xf0, 0x77, 0xe0,
+	0x06, 0xc7, 0x82, 0x64, 0x6a, 0xd8, 0xe8, 0xfd, 0xd8, 0x80, 0x77, 0x4b, 0xeb, 0xcc, 0xc9, 0x6c,
+	0x9b, 0xe6, 0xd8, 0xab, 0x7c, 0x64, 0x54, 0xe7, 0x31, 0x97, 0x44, 0x04, 0x3a, 0xb9, 0xe8, 0xe1,
+	0x7c, 0x79, 0x7c, 0x2e, 0x89, 0xd0, 0x0b, 0xe4, 0xf3, 0x98, 0xbb, 0x7b, 0xbd, 0xda, 0x7d, 0x96,
+	0xab, 0xbc, 0x43, 0x82, 0x1e, 0x8d, 0x08, 0x43, 0x3b, 0xf3, 0xad, 0xf6, 0x6f, 0x58, 0x7e, 0x92,
+	0x77, 0xc8, 0xa9, 0xd6, 0xf8, 0xd5, 0x76, 0x20, 0x33, 0xa6, 0x93, 0xe0, 0xc1, 0xe1, 0x0b, 0x9c,
+	0x65, 0x24, 0x41, 0x0f, 0xe6, 0x4b, 0x82, 0x43, 0xef, 0x5b, 0x95, 0x4f, 0x82, 0x83, 0xb9, 0x51,
+	0xd8, 0x04, 0x57, 0x14, 0xe3, 0x34, 0x44, 0xef, 0x19, 0xe8, 0x83, 0x32, 0xe8, 0x89, 0x36, 0x76,
+	0x2c, 0xab, 0xd4, 0x53, 0x37, 0x79, 0xa4, 0x99, 0x22, 0x82, 0x48, 0x85, 0x1e, 0xcd, 0x37, 0x75,
+	0x9d, 0xcb, 0x43, 0xa7, 0xf1, 0x53, 0xcf, 0x0b, 0x63, 0x7a, 0xab, 0x7a, 0x4d, 0x3a, 0x1c, 0xc7,
+	0x04, 0x55, 0xe7, 0xdb, 0xaa, 0xbe, 0xb6, 0xe6, 0x7e, 0xab, 0x72, 0x6a, 0x88, 0xc1, 0x9a, 0xde,
+	0x54, 0x38, 0xee, 0xeb, 0xad, 0x46, 0xb7, 0xeb, 0x24, 0x41, 0x35, 0x83, 0xac, 0x97, 0xbe, 0x39,
+	0x9c, 0xb7, 0xac, 0xee, 0x48, 0xcb, 0x1c, 0x5a, 0x9f, 0x40, 0x8a, 0xc3, 0x7a, 0x99, 0xdc, 0xbe,
+	0x8d, 0xbb, 0x5d, 0x9a, 0x51, 0xd5, 0x47, 0x1f, 0xcc, 0xb7, 0x4c, 0x76, 0x87, 0x6e, 0x3a, 0x95,
+	0x5f, 0xa6, 0x70, 0x64, 0x54, 0xe7, 0xd8, 0xe1, 0x75, 0x96, 0x33, 0x85, 0x7e, 0x32, 0x5f, 0x8e,
+	0x2d, 0xfc, 0xd0, 0x68, 0x7c, 0x8e, 0xc3, 0xc2, 0xd8, 0xd6, 0x7f, 0x16, 0xc1, 0x72, 0xe1, 0x08,
+	0x0b, 0x7f, 0x09, 0xae, 0x8f, 0xfc, 0x74, 0x30, 0x07, 0xfd, 0x29, 0x0d, 0x66, 0x7d, 0xd7, 0x9d,
+	0x04, 0x9c, 0xe2, 0x58, 0x0b, 0xe0, 0x9f, 0xc0, 0x66, 0x28, 0x88, 0x39, 0x3e, 0x06, 0xa3, 0xa8,
+	0x05, 0xd3, 0xda, 0x3c, 0x2b, 0x69, 0x6d, 0xbe, 0x2a, 0xc0, 0xf6, 0xcc, 0x1f, 0x0f, 0xd3, 0xdf,
+	0x4c, 0x0e, 0xb7, 0x6f, 0x79, 0x3f, 0xc5, 0x67, 0xf0, 0xcf, 0x15, 0x80, 0x38, 0x93, 0x2a, 0x08,
+	0x13, 0x1a, 0xbe, 0x1c, 0x0b, 0x61, 0xf1, 0x92, 0x43, 0xd8, 0xd0, 0x9e, 0xf6, 0xb5, 0xa3, 0x91,
+	0x18, 0xfe, 0x08, 0x6e, 0x49, 0x82, 0x45, 0xf8, 0x22, 0xe0, 0x82, 0x44, 0x34, 0x54, 0x24, 0x0a,
+	0x42, 0x25, 0xcc, 0x7f, 0x86, 0xcb, 0x74, 0x0f, 0xad, 0x97, 0x96, 0x77, 0xb2, 0xaf, 0xc4, 0xd6,
+	0x7f, 0x17, 0xc1, 0xda, 0x44, 0x3f, 0x06, 0xbf, 0x00, 0x1b, 0x5d, 0x2a, 0xa4, 0x0a, 0xf4, 0x0b,
+	0x61, 0x7a, 0x4e, 0x77, 0x80, 0xa8, 0x94, 0x1f, 0x20, 0xa0, 0x51, 0xb6, 0x70, 0xac, 0x1b, 0x78,
+	0x77, 0x6c, 0x38, 0x05, 0xb7, 0x1d, 0xcf, 0x37, 0x92, 0x05, 0xe6, 0x42, 0x39, 0x73, 0xd3, 0x32,
+	0x9d, 0x78, 0xc8, 0xfd, 0x12, 0x6c, 0x2a, 0xc6, 0x03, 0xd6, 0x9d, 0x08, 0x74, 0x71, 0x8e, 0x40,
+	0x15, 0xe3, 0x5f, 0x76, 0x47, 0x03, 0xcd, 0xc1, 0x43, 0xdf, 0xe2, 0x46, 0x01, 0x8e, 0x22, 0x5b,
+	0x16, 0x32, 0xc0, 0x2a, 0x98, 0x9c, 0x80, 0xfb, 0x11, 0x34, 0xd3, 0xc9, 0xbb, 0x03, 0x5c, 0x33,
+	0x8a, 0xcc, 0xd2, 0xcb, 0xa6, 0x7a, 0x3a, 0x36, 0x1b, 0xf8, 0x0a, 0xec, 0x8c, 0xb9, 0xd5, 0x25,
+	0x79, 0xbe, 0xd3, 0x2b, 0xe5, 0x4e, 0xef, 0x8d, 0x38, 0x65, 0x52, 0x4d, 0xba, 0x6c, 0xd0, 0xef,
+	0x9a, 0x5d, 0xf0, 0x60, 0x58, 0x4f, 0xee, 0x8a, 0x53, 0xa9, 0x77, 0x83, 0xda, 0xc4, 0x3f, 0xbd,
+	0x9f, 0xdb, 0x8d, 0x80, 0x08, 0x59, 0xfb, 0xc6, 0x5f, 0x7e, 0x5b, 0xc3, 0x23, 0x66, 0xb8, 0xf6,
+	0xcd, 0xe4, 0xff, 0xd6, 0x6f, 0xf7, 0x96, 0xc1, 0xd2, 0xe0, 0x6e, 0xef, 0x2f, 0x0b, 0xe0, 0x7e,
+	0xc8, 0xd2, 0xf2, 0x73, 0xc3, 0xde, 0xc6, 0x78, 0x0c, 0x2d, 0x3d, 0xd5, 0x56, 0xe5, 0xb7, 0xbf,
+	0x72, 0xda, 0x98, 0x25, 0x38, 0x8b, 0xab, 0x4c, 0xc4, 0xb5, 0x98, 0x64, 0x26, 0x11, 0xb5, 0xe1,
+	0x34, 0x66, 0xfc, 0x1e, 0xff, 0x78, 0x70, 0xf5, 0x8f, 0x85, 0xc5, 0x83, 0x66, 0xf3, 0x9f, 0x0b,
+	0x77, 0x0f, 0x2c, 0xb2, 0x19, 0xc9, 0xaa, 0xbd, 0xd4, 0x57, 0xa7, 0xf5, 0x6a, 0xdb, 0x5b, 0xfe,
+	0xdb, 0xdb, 0x9c, 0x35, 0x23, 0x79, 0x36, 0xb0, 0x39, 0x3b, 0xad, 0x9f, 0x0d, 0x6c, 0xbe, 0x5b,
+	0xb8, 0x6f, 0x1f, 0x34, 0x1a, 0xcd, 0x48, 0x36, 0x1a, 0x03, 0xab, 0x46, 0xe3, 0xb4, 0xde, 0x68,
+	0x0c, 0xec, 0x3a, 0x57, 0x4d, 0xb0, 0xf5, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x85, 0xc4, 0x27,
+	0x91, 0xca, 0x17, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_criterion_label.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_criterion_label.pb.go
new file mode 100644
index 0000000..0e9f288
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_criterion_label.pb.go
@@ -0,0 +1,122 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_criterion_label.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A relationship between an ad group criterion and a label.
+type AdGroupCriterionLabel struct {
+	// The resource name of the ad group criterion label.
+	// Ad group criterion label resource names have the form:
+	// `customers/{customer_id}/adGroupCriterionLabels/{ad_group_id}~{criterion_id}~{label_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ad group criterion to which the label is attached.
+	AdGroupCriterion *wrappers.StringValue `protobuf:"bytes,2,opt,name=ad_group_criterion,json=adGroupCriterion,proto3" json:"ad_group_criterion,omitempty"`
+	// The label assigned to the ad group criterion.
+	Label                *wrappers.StringValue `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AdGroupCriterionLabel) Reset()         { *m = AdGroupCriterionLabel{} }
+func (m *AdGroupCriterionLabel) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterionLabel) ProtoMessage()    {}
+func (*AdGroupCriterionLabel) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f4fb81627fc685a6, []int{0}
+}
+
+func (m *AdGroupCriterionLabel) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterionLabel.Unmarshal(m, b)
+}
+func (m *AdGroupCriterionLabel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterionLabel.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterionLabel) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterionLabel.Merge(m, src)
+}
+func (m *AdGroupCriterionLabel) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterionLabel.Size(m)
+}
+func (m *AdGroupCriterionLabel) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterionLabel.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterionLabel proto.InternalMessageInfo
+
+func (m *AdGroupCriterionLabel) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupCriterionLabel) GetAdGroupCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupCriterion
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionLabel) GetLabel() *wrappers.StringValue {
+	if m != nil {
+		return m.Label
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AdGroupCriterionLabel)(nil), "google.ads.googleads.v3.resources.AdGroupCriterionLabel")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_criterion_label.proto", fileDescriptor_f4fb81627fc685a6)
+}
+
+var fileDescriptor_f4fb81627fc685a6 = []byte{
+	// 390 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0xdf, 0x4a, 0xf3, 0x30,
+	0x1c, 0xa5, 0x1d, 0xdf, 0x07, 0x5f, 0x3f, 0x05, 0x29, 0x08, 0x73, 0x0c, 0xd9, 0x94, 0xc1, 0xae,
+	0x12, 0x58, 0xef, 0xe2, 0x8d, 0x9d, 0xe0, 0x60, 0x88, 0x8c, 0x09, 0xbd, 0x90, 0x42, 0xc9, 0xda,
+	0x18, 0x0a, 0x6d, 0x52, 0x92, 0x76, 0x0a, 0x63, 0xd7, 0xbe, 0x87, 0x97, 0xbe, 0x81, 0xaf, 0xe0,
+	0xa3, 0xec, 0x29, 0xa4, 0x7f, 0x12, 0x87, 0xce, 0x3f, 0x77, 0xa7, 0xfd, 0x9d, 0x73, 0x7e, 0xe7,
+	0x24, 0xb1, 0xce, 0x29, 0xe7, 0x34, 0x21, 0x10, 0x47, 0x12, 0xd6, 0xb0, 0x44, 0x4b, 0x07, 0x0a,
+	0x22, 0x79, 0x21, 0x42, 0x22, 0x21, 0x8e, 0x02, 0x2a, 0x78, 0x91, 0x05, 0xa1, 0x88, 0x73, 0x22,
+	0x62, 0xce, 0x82, 0x04, 0x2f, 0x48, 0x02, 0x32, 0xc1, 0x73, 0x6e, 0xf7, 0x6b, 0x19, 0xc0, 0x91,
+	0x04, 0xda, 0x01, 0x2c, 0x1d, 0xa0, 0x1d, 0x3a, 0x47, 0x6a, 0x49, 0x16, 0x6b, 0xdf, 0x5a, 0xdd,
+	0x39, 0x6e, 0x46, 0xd5, 0xd7, 0xa2, 0xb8, 0x83, 0xf7, 0x02, 0x67, 0x19, 0x11, 0xb2, 0x99, 0x77,
+	0xb7, 0xa4, 0x98, 0x31, 0x9e, 0xe3, 0x3c, 0xe6, 0xac, 0x99, 0x9e, 0xbc, 0x98, 0xd6, 0xa1, 0x1b,
+	0x4d, 0xca, 0x74, 0x17, 0x2a, 0xdc, 0x55, 0x99, 0xcd, 0x3e, 0xb5, 0xf6, 0xd5, 0xa6, 0x80, 0xe1,
+	0x94, 0xb4, 0x8d, 0x9e, 0x31, 0xfc, 0x37, 0xdf, 0x53, 0x3f, 0xaf, 0x71, 0x4a, 0xec, 0xa9, 0x65,
+	0x7f, 0x2e, 0xd7, 0x36, 0x7b, 0xc6, 0xf0, 0xff, 0xa8, 0xdb, 0x94, 0x01, 0x2a, 0x19, 0xb8, 0xc9,
+	0x45, 0xcc, 0xa8, 0x87, 0x93, 0x82, 0xcc, 0x0f, 0xf0, 0x87, 0xad, 0xf6, 0xc8, 0xfa, 0x53, 0x9d,
+	0x4a, 0xbb, 0xf5, 0x0b, 0x79, 0x4d, 0x45, 0xab, 0x8d, 0xfb, 0x60, 0x6d, 0x1d, 0x5a, 0x83, 0xb2,
+	0x58, 0x82, 0x90, 0xa7, 0x70, 0x77, 0xb3, 0xcb, 0xb0, 0x90, 0x39, 0x4f, 0x89, 0x90, 0x70, 0xa5,
+	0xe0, 0x1a, 0xe2, 0x5d, 0x5c, 0x09, 0x57, 0x5f, 0x5d, 0xde, 0x7a, 0xfc, 0x68, 0x5a, 0x83, 0x90,
+	0xa7, 0xe0, 0xc7, 0xeb, 0x1b, 0x77, 0x76, 0x06, 0x99, 0x95, 0xc5, 0x66, 0xc6, 0xed, 0xb4, 0x31,
+	0xa0, 0x3c, 0xc1, 0x8c, 0x02, 0x2e, 0x28, 0xa4, 0x84, 0x55, 0xb5, 0xe1, 0x7b, 0xa1, 0x6f, 0x1e,
+	0xd8, 0x99, 0x46, 0x4f, 0x66, 0x6b, 0xe2, 0xba, 0xcf, 0x66, 0x7f, 0x52, 0x5b, 0xba, 0x91, 0x04,
+	0x35, 0x2c, 0x91, 0xe7, 0x80, 0xb9, 0x62, 0xbe, 0x2a, 0x8e, 0xef, 0x46, 0xd2, 0xd7, 0x1c, 0xdf,
+	0x73, 0x7c, 0xcd, 0xd9, 0x98, 0x83, 0x7a, 0x80, 0x90, 0x1b, 0x49, 0x84, 0x34, 0x0b, 0x21, 0xcf,
+	0x41, 0x48, 0xf3, 0x16, 0x7f, 0xab, 0xb0, 0xce, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, 0xec,
+	0x97, 0xa1, 0x0c, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_criterion_simulation.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_criterion_simulation.pb.go
new file mode 100644
index 0000000..d53f2f6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_criterion_simulation.pb.go
@@ -0,0 +1,216 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_criterion_simulation.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad group criterion simulation. Supported combinations of advertising
+// channel type, criterion type, simulation type, and simulation modification
+// method are detailed below respectively.
+//
+// 1. DISPLAY - KEYWORD - CPC_BID - UNIFORM
+// 2. SEARCH - KEYWORD - CPC_BID - UNIFORM
+// 3. SHOPPING - LISTING_GROUP - CPC_BID - UNIFORM
+type AdGroupCriterionSimulation struct {
+	// The resource name of the ad group criterion simulation.
+	// Ad group criterion simulation resource names have the form:
+	//
+	// `customers/{customer_id}/adGroupCriterionSimulations/{ad_group_id}~{criterion_id}~{type}~{modification_method}~{start_date}~{end_date}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// AdGroup ID of the simulation.
+	AdGroupId *wrappers.Int64Value `protobuf:"bytes,2,opt,name=ad_group_id,json=adGroupId,proto3" json:"ad_group_id,omitempty"`
+	// Criterion ID of the simulation.
+	CriterionId *wrappers.Int64Value `protobuf:"bytes,3,opt,name=criterion_id,json=criterionId,proto3" json:"criterion_id,omitempty"`
+	// The field that the simulation modifies.
+	Type enums.SimulationTypeEnum_SimulationType `protobuf:"varint,4,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.SimulationTypeEnum_SimulationType" json:"type,omitempty"`
+	// How the simulation modifies the field.
+	ModificationMethod enums.SimulationModificationMethodEnum_SimulationModificationMethod `protobuf:"varint,5,opt,name=modification_method,json=modificationMethod,proto3,enum=google.ads.googleads.v3.enums.SimulationModificationMethodEnum_SimulationModificationMethod" json:"modification_method,omitempty"`
+	// First day on which the simulation is based, in YYYY-MM-DD format.
+	StartDate *wrappers.StringValue `protobuf:"bytes,6,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"`
+	// Last day on which the simulation is based, in YYYY-MM-DD format.
+	EndDate *wrappers.StringValue `protobuf:"bytes,7,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"`
+	// List of simulation points.
+	//
+	// Types that are valid to be assigned to PointList:
+	//	*AdGroupCriterionSimulation_CpcBidPointList
+	PointList            isAdGroupCriterionSimulation_PointList `protobuf_oneof:"point_list"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *AdGroupCriterionSimulation) Reset()         { *m = AdGroupCriterionSimulation{} }
+func (m *AdGroupCriterionSimulation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterionSimulation) ProtoMessage()    {}
+func (*AdGroupCriterionSimulation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_79b2fc18b4f92e57, []int{0}
+}
+
+func (m *AdGroupCriterionSimulation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterionSimulation.Unmarshal(m, b)
+}
+func (m *AdGroupCriterionSimulation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterionSimulation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterionSimulation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterionSimulation.Merge(m, src)
+}
+func (m *AdGroupCriterionSimulation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterionSimulation.Size(m)
+}
+func (m *AdGroupCriterionSimulation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterionSimulation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterionSimulation proto.InternalMessageInfo
+
+func (m *AdGroupCriterionSimulation) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupCriterionSimulation) GetAdGroupId() *wrappers.Int64Value {
+	if m != nil {
+		return m.AdGroupId
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionSimulation) GetCriterionId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CriterionId
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionSimulation) GetType() enums.SimulationTypeEnum_SimulationType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.SimulationTypeEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterionSimulation) GetModificationMethod() enums.SimulationModificationMethodEnum_SimulationModificationMethod {
+	if m != nil {
+		return m.ModificationMethod
+	}
+	return enums.SimulationModificationMethodEnum_UNSPECIFIED
+}
+
+func (m *AdGroupCriterionSimulation) GetStartDate() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDate
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionSimulation) GetEndDate() *wrappers.StringValue {
+	if m != nil {
+		return m.EndDate
+	}
+	return nil
+}
+
+type isAdGroupCriterionSimulation_PointList interface {
+	isAdGroupCriterionSimulation_PointList()
+}
+
+type AdGroupCriterionSimulation_CpcBidPointList struct {
+	CpcBidPointList *common.CpcBidSimulationPointList `protobuf:"bytes,8,opt,name=cpc_bid_point_list,json=cpcBidPointList,proto3,oneof"`
+}
+
+func (*AdGroupCriterionSimulation_CpcBidPointList) isAdGroupCriterionSimulation_PointList() {}
+
+func (m *AdGroupCriterionSimulation) GetPointList() isAdGroupCriterionSimulation_PointList {
+	if m != nil {
+		return m.PointList
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionSimulation) GetCpcBidPointList() *common.CpcBidSimulationPointList {
+	if x, ok := m.GetPointList().(*AdGroupCriterionSimulation_CpcBidPointList); ok {
+		return x.CpcBidPointList
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupCriterionSimulation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupCriterionSimulation_CpcBidPointList)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*AdGroupCriterionSimulation)(nil), "google.ads.googleads.v3.resources.AdGroupCriterionSimulation")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_criterion_simulation.proto", fileDescriptor_79b2fc18b4f92e57)
+}
+
+var fileDescriptor_79b2fc18b4f92e57 = []byte{
+	// 605 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdf, 0x4e, 0xd4, 0x4e,
+	0x14, 0xfe, 0x75, 0xe1, 0xc7, 0x9f, 0x01, 0x35, 0xa9, 0x37, 0x15, 0x89, 0x82, 0x86, 0x84, 0xab,
+	0x99, 0x84, 0x1a, 0x8d, 0x25, 0x31, 0x76, 0x91, 0x20, 0x46, 0xcc, 0xa6, 0x90, 0xbd, 0x30, 0x9b,
+	0x34, 0x43, 0x67, 0x28, 0x93, 0x6c, 0x67, 0x9a, 0x99, 0x29, 0x86, 0x10, 0xae, 0xbd, 0x50, 0xdf,
+	0xc1, 0x78, 0xe9, 0xa3, 0xf8, 0x28, 0x3c, 0x85, 0xe9, 0xb4, 0x9d, 0x12, 0xb0, 0xcb, 0xde, 0x9d,
+	0x9e, 0xf3, 0x7d, 0xdf, 0x39, 0xe7, 0x3b, 0xbb, 0x03, 0x76, 0x53, 0x21, 0xd2, 0x31, 0x45, 0x98,
+	0x28, 0x54, 0x85, 0x65, 0x74, 0xe6, 0x23, 0x49, 0x95, 0x28, 0x64, 0x42, 0x15, 0xc2, 0x24, 0x4e,
+	0xa5, 0x28, 0xf2, 0x38, 0x91, 0x4c, 0x53, 0xc9, 0x04, 0x8f, 0x15, 0xcb, 0x8a, 0x31, 0xd6, 0x4c,
+	0x70, 0x98, 0x4b, 0xa1, 0x85, 0xbb, 0x5e, 0x71, 0x21, 0x26, 0x0a, 0x5a, 0x19, 0x78, 0xe6, 0x43,
+	0x2b, 0xb3, 0x82, 0xba, 0x3a, 0x25, 0x22, 0xcb, 0x04, 0x47, 0x37, 0x35, 0x57, 0xfa, 0x5d, 0x04,
+	0xca, 0x8b, 0x4c, 0x5d, 0xc3, 0xc7, 0x99, 0x20, 0xec, 0x84, 0x25, 0xf5, 0x07, 0xd5, 0xa7, 0x82,
+	0xd4, 0x1a, 0xfe, 0xd4, 0x1a, 0xfa, 0x3c, 0xa7, 0x35, 0xe9, 0x51, 0x43, 0xca, 0x99, 0xb5, 0xa1,
+	0x2e, 0x3d, 0xa9, 0x4b, 0xe6, 0xeb, 0xb8, 0x38, 0x41, 0x5f, 0x24, 0xce, 0x73, 0x2a, 0x55, 0x5d,
+	0x5f, 0xbd, 0x46, 0xc5, 0x9c, 0x0b, 0x6d, 0xc4, 0xeb, 0xea, 0xb3, 0x9f, 0x73, 0x60, 0x25, 0x24,
+	0x7b, 0xa5, 0x99, 0x3b, 0x8d, 0x97, 0x87, 0x76, 0x04, 0xf7, 0x39, 0xb8, 0xd7, 0xb4, 0x8b, 0x39,
+	0xce, 0xa8, 0xe7, 0xac, 0x39, 0x9b, 0x8b, 0xd1, 0x72, 0x93, 0xfc, 0x84, 0x33, 0xea, 0x6e, 0x83,
+	0x25, 0x7b, 0x10, 0x46, 0xbc, 0xde, 0x9a, 0xb3, 0xb9, 0xb4, 0xf5, 0xb8, 0x36, 0x1d, 0x36, 0x73,
+	0xc1, 0x7d, 0xae, 0x5f, 0xbe, 0x18, 0xe2, 0x71, 0x41, 0xa3, 0x45, 0x5c, 0xb5, 0xdc, 0x27, 0xee,
+	0x1b, 0xb0, 0xdc, 0x1e, 0x91, 0x11, 0x6f, 0xe6, 0x6e, 0xf6, 0x92, 0x25, 0xec, 0x13, 0xf7, 0x08,
+	0xcc, 0x96, 0x3e, 0x79, 0xb3, 0x6b, 0xce, 0xe6, 0xfd, 0xad, 0xb7, 0xb0, 0xeb, 0xea, 0xc6, 0x5d,
+	0xd8, 0xae, 0x76, 0x74, 0x9e, 0xd3, 0x5d, 0x5e, 0x64, 0x37, 0x52, 0x91, 0x51, 0x73, 0x7f, 0x38,
+	0xe0, 0xe1, 0x3f, 0x4e, 0xe8, 0xfd, 0x6f, 0xba, 0x8c, 0xa6, 0xee, 0x72, 0x70, 0x4d, 0xe3, 0xc0,
+	0x48, 0xdc, 0xe8, 0x79, 0x1b, 0x10, 0xb9, 0xd9, 0xad, 0x9c, 0xbb, 0x0d, 0x80, 0xd2, 0x58, 0xea,
+	0x98, 0x60, 0x4d, 0xbd, 0x39, 0xe3, 0xd1, 0xea, 0x2d, 0x8f, 0x0e, 0xb5, 0x64, 0x3c, 0xad, 0x2d,
+	0x36, 0xf8, 0x77, 0x58, 0x53, 0xf7, 0x15, 0x58, 0xa0, 0x9c, 0x54, 0xd4, 0xf9, 0x29, 0xa8, 0xf3,
+	0x94, 0x13, 0x43, 0x3c, 0x05, 0x6e, 0x92, 0x27, 0xf1, 0x31, 0x23, 0x71, 0x2e, 0x18, 0xd7, 0xf1,
+	0x98, 0x29, 0xed, 0x2d, 0x18, 0x89, 0xd7, 0x9d, 0x1e, 0x54, 0x7f, 0x1e, 0xb8, 0x93, 0x27, 0x7d,
+	0x46, 0xda, 0x4d, 0x07, 0xa5, 0xc2, 0x47, 0xa6, 0xf4, 0xfb, 0xff, 0xa2, 0x07, 0x89, 0x29, 0xda,
+	0x54, 0xf0, 0xcd, 0xb9, 0x0a, 0xbf, 0x3a, 0xc0, 0x6f, 0x85, 0xea, 0x28, 0x67, 0xaa, 0x14, 0x44,
+	0x13, 0x7e, 0xa3, 0x83, 0xa4, 0x50, 0x5a, 0x64, 0x54, 0x2a, 0x74, 0xd1, 0x84, 0x97, 0x08, 0x77,
+	0x12, 0x14, 0xba, 0x98, 0xf8, 0x7e, 0x5c, 0xf6, 0x97, 0x01, 0x68, 0xf7, 0xed, 0x7f, 0xef, 0x81,
+	0x8d, 0x44, 0x64, 0xf0, 0xce, 0xf7, 0xa4, 0xff, 0xb4, 0x7b, 0xca, 0x41, 0x69, 0xf4, 0xc0, 0xf9,
+	0xfc, 0xa1, 0x56, 0x49, 0xc5, 0x18, 0xf3, 0x14, 0x0a, 0x99, 0xa2, 0x94, 0x72, 0x73, 0x06, 0xd4,
+	0xae, 0x3c, 0xe1, 0xed, 0xdb, 0xb6, 0xd1, 0xaf, 0xde, 0xcc, 0x5e, 0x18, 0xfe, 0xee, 0xad, 0xef,
+	0x55, 0x92, 0x21, 0x51, 0xb0, 0x0a, 0xcb, 0x68, 0xe8, 0xc3, 0xa8, 0x41, 0xfe, 0x69, 0x30, 0xa3,
+	0x90, 0xa8, 0x91, 0xc5, 0x8c, 0x86, 0xfe, 0xc8, 0x62, 0xae, 0x7a, 0x1b, 0x55, 0x21, 0x08, 0x42,
+	0xa2, 0x82, 0xc0, 0xa2, 0x82, 0x60, 0xe8, 0x07, 0x81, 0xc5, 0x1d, 0xcf, 0x99, 0x61, 0xfd, 0xbf,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0x16, 0x8a, 0x0a, 0x2e, 0xa7, 0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_extension_setting.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_extension_setting.pb.go
new file mode 100644
index 0000000..3943b1a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_extension_setting.pb.go
@@ -0,0 +1,155 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_extension_setting.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad group extension setting.
+type AdGroupExtensionSetting struct {
+	// The resource name of the ad group extension setting.
+	// AdGroupExtensionSetting resource names have the form:
+	//
+	// `customers/{customer_id}/adGroupExtensionSettings/{ad_group_id}~{extension_type}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The extension type of the ad group extension setting.
+	ExtensionType enums.ExtensionTypeEnum_ExtensionType `protobuf:"varint,2,opt,name=extension_type,json=extensionType,proto3,enum=google.ads.googleads.v3.enums.ExtensionTypeEnum_ExtensionType" json:"extension_type,omitempty"`
+	// The resource name of the ad group. The linked extension feed items will
+	// serve under this ad group.
+	// AdGroup resource names have the form:
+	//
+	// `customers/{customer_id}/adGroups/{ad_group_id}`
+	AdGroup *wrappers.StringValue `protobuf:"bytes,3,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// The resource names of the extension feed items to serve under the ad group.
+	// ExtensionFeedItem resource names have the form:
+	//
+	// `customers/{customer_id}/extensionFeedItems/{feed_item_id}`
+	ExtensionFeedItems []*wrappers.StringValue `protobuf:"bytes,4,rep,name=extension_feed_items,json=extensionFeedItems,proto3" json:"extension_feed_items,omitempty"`
+	// The device for which the extensions will serve. Optional.
+	Device               enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice `protobuf:"varint,5,opt,name=device,proto3,enum=google.ads.googleads.v3.enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice" json:"device,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                `json:"-"`
+	XXX_unrecognized     []byte                                                  `json:"-"`
+	XXX_sizecache        int32                                                   `json:"-"`
+}
+
+func (m *AdGroupExtensionSetting) Reset()         { *m = AdGroupExtensionSetting{} }
+func (m *AdGroupExtensionSetting) String() string { return proto.CompactTextString(m) }
+func (*AdGroupExtensionSetting) ProtoMessage()    {}
+func (*AdGroupExtensionSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5bcbdad332356d2f, []int{0}
+}
+
+func (m *AdGroupExtensionSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupExtensionSetting.Unmarshal(m, b)
+}
+func (m *AdGroupExtensionSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupExtensionSetting.Marshal(b, m, deterministic)
+}
+func (m *AdGroupExtensionSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupExtensionSetting.Merge(m, src)
+}
+func (m *AdGroupExtensionSetting) XXX_Size() int {
+	return xxx_messageInfo_AdGroupExtensionSetting.Size(m)
+}
+func (m *AdGroupExtensionSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupExtensionSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupExtensionSetting proto.InternalMessageInfo
+
+func (m *AdGroupExtensionSetting) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupExtensionSetting) GetExtensionType() enums.ExtensionTypeEnum_ExtensionType {
+	if m != nil {
+		return m.ExtensionType
+	}
+	return enums.ExtensionTypeEnum_UNSPECIFIED
+}
+
+func (m *AdGroupExtensionSetting) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *AdGroupExtensionSetting) GetExtensionFeedItems() []*wrappers.StringValue {
+	if m != nil {
+		return m.ExtensionFeedItems
+	}
+	return nil
+}
+
+func (m *AdGroupExtensionSetting) GetDevice() enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice {
+	if m != nil {
+		return m.Device
+	}
+	return enums.ExtensionSettingDeviceEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*AdGroupExtensionSetting)(nil), "google.ads.googleads.v3.resources.AdGroupExtensionSetting")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_extension_setting.proto", fileDescriptor_5bcbdad332356d2f)
+}
+
+var fileDescriptor_5bcbdad332356d2f = []byte{
+	// 496 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x41, 0x6b, 0xd4, 0x40,
+	0x14, 0x26, 0xbb, 0xb5, 0x6a, 0xb4, 0x3d, 0x04, 0xc1, 0x58, 0x16, 0xd9, 0x2a, 0x85, 0x3d, 0xcd,
+	0xc8, 0xe6, 0x20, 0x44, 0x11, 0xb2, 0x58, 0x17, 0x7b, 0x28, 0x4b, 0x2a, 0x7b, 0x90, 0x85, 0x30,
+	0xcd, 0xbc, 0xc6, 0xc0, 0x66, 0x26, 0xcc, 0x4c, 0x56, 0x4b, 0xa9, 0xe0, 0xd1, 0xff, 0xe0, 0xc9,
+	0xa3, 0x3f, 0xc5, 0x9f, 0xd2, 0x5f, 0x21, 0xc9, 0x64, 0x66, 0xbb, 0x68, 0x6c, 0x6f, 0xdf, 0xcc,
+	0xfb, 0xbe, 0xef, 0xbd, 0xef, 0x0d, 0xe3, 0x4e, 0x32, 0xce, 0xb3, 0x25, 0x60, 0x42, 0x25, 0xd6,
+	0xb0, 0x46, 0xab, 0x00, 0x0b, 0x90, 0xbc, 0x12, 0x29, 0x48, 0x4c, 0x68, 0x92, 0x09, 0x5e, 0x95,
+	0x09, 0x7c, 0x51, 0xc0, 0x64, 0xce, 0x59, 0x22, 0x41, 0xa9, 0x9c, 0x65, 0xa8, 0x14, 0x5c, 0x71,
+	0x6f, 0x5f, 0x0b, 0x11, 0xa1, 0x12, 0x59, 0x0f, 0xb4, 0x0a, 0x90, 0xf5, 0xd8, 0x7b, 0xdd, 0xd5,
+	0x06, 0x58, 0x55, 0x48, 0xfc, 0x97, 0x73, 0x42, 0x61, 0x95, 0xa7, 0xa0, 0x1b, 0xec, 0x8d, 0x6f,
+	0xab, 0x56, 0xe7, 0xa5, 0xd1, 0x3c, 0x31, 0x9a, 0x32, 0xb7, 0x59, 0xda, 0xd2, 0xd3, 0xb6, 0xd4,
+	0x9c, 0x4e, 0xab, 0x33, 0xfc, 0x59, 0x90, 0xb2, 0x04, 0x21, 0xdb, 0xfa, 0xe0, 0x9a, 0x94, 0x30,
+	0xc6, 0x15, 0x51, 0x39, 0x67, 0x6d, 0xf5, 0xd9, 0x8f, 0x2d, 0xf7, 0x71, 0x44, 0xa7, 0xf5, 0x46,
+	0x0e, 0x4d, 0xe3, 0x13, 0x3d, 0xb5, 0xf7, 0xdc, 0xdd, 0x31, 0xbd, 0x12, 0x46, 0x0a, 0xf0, 0x9d,
+	0xa1, 0x33, 0xba, 0x1f, 0x3f, 0x34, 0x97, 0xc7, 0xa4, 0x00, 0x0f, 0xdc, 0xdd, 0xcd, 0x89, 0xfd,
+	0xde, 0xd0, 0x19, 0xed, 0x8e, 0xdf, 0xa0, 0xae, 0x3d, 0x36, 0x31, 0x91, 0xed, 0xf6, 0xe1, 0xbc,
+	0x84, 0x43, 0x56, 0x15, 0x9b, 0x37, 0xf1, 0x0e, 0x5c, 0x3f, 0x7a, 0x2f, 0xdd, 0x7b, 0xe6, 0xe5,
+	0xfc, 0xfe, 0xd0, 0x19, 0x3d, 0x18, 0x0f, 0x4c, 0x03, 0x13, 0x1c, 0x9d, 0x28, 0x91, 0xb3, 0x6c,
+	0x4e, 0x96, 0x15, 0xc4, 0x77, 0x89, 0x0e, 0xe5, 0x1d, 0xbb, 0x8f, 0xd6, 0xf3, 0x9d, 0x01, 0xd0,
+	0x24, 0x57, 0x50, 0x48, 0x7f, 0x6b, 0xd8, 0xbf, 0xd1, 0xc4, 0xb3, 0xca, 0x77, 0x00, 0xf4, 0x7d,
+	0xad, 0xf3, 0x3e, 0xb9, 0xdb, 0xfa, 0x35, 0xfd, 0x3b, 0x4d, 0xce, 0xd9, 0x6d, 0x73, 0xb6, 0x5b,
+	0x7d, 0xdb, 0x88, 0x37, 0x03, 0x6f, 0x94, 0xe2, 0xd6, 0x3f, 0xfc, 0xe6, 0x5c, 0x45, 0x5f, 0xdd,
+	0x17, 0x6b, 0xcf, 0x16, 0x95, 0xb9, 0x44, 0x29, 0x2f, 0x70, 0xd7, 0xb3, 0x1d, 0xa5, 0x95, 0x54,
+	0xbc, 0x00, 0x21, 0xf1, 0x85, 0x81, 0x97, 0x98, 0xfc, 0x9b, 0x2d, 0xf1, 0x45, 0xf7, 0x8f, 0xb8,
+	0x9c, 0x7c, 0xef, 0xb9, 0x07, 0x29, 0x2f, 0xd0, 0x8d, 0x7f, 0x62, 0x32, 0xe8, 0x18, 0x67, 0x56,
+	0x2f, 0x76, 0xe6, 0x7c, 0x3c, 0x6a, 0x2d, 0x32, 0xbe, 0x24, 0x2c, 0x43, 0x5c, 0x64, 0x38, 0x03,
+	0xd6, 0xac, 0x1d, 0xaf, 0x83, 0xfd, 0xe7, 0xe7, 0xbe, 0xb2, 0xe8, 0x67, 0xaf, 0x3f, 0x8d, 0xa2,
+	0x5f, 0xbd, 0xfd, 0xa9, 0xb6, 0x8c, 0xa8, 0x44, 0x1a, 0xd6, 0x68, 0x1e, 0xa0, 0xd8, 0x30, 0x7f,
+	0x1b, 0xce, 0x22, 0xa2, 0x72, 0x61, 0x39, 0x8b, 0x79, 0xb0, 0xb0, 0x9c, 0xab, 0xde, 0x81, 0x2e,
+	0x84, 0x61, 0x44, 0x65, 0x18, 0x5a, 0x56, 0x18, 0xce, 0x83, 0x30, 0xb4, 0xbc, 0xd3, 0xed, 0x66,
+	0xd8, 0xe0, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe8, 0x43, 0xd1, 0xd8, 0x65, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_feed.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_feed.pb.go
new file mode 100644
index 0000000..237f079
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_feed.pb.go
@@ -0,0 +1,165 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_feed.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad group feed.
+type AdGroupFeed struct {
+	// The resource name of the ad group feed.
+	// Ad group feed resource names have the form:
+	//
+	// `customers/{customer_id}/adGroupFeeds/{ad_group_id}~{feed_id}
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The feed being linked to the ad group.
+	Feed *wrappers.StringValue `protobuf:"bytes,2,opt,name=feed,proto3" json:"feed,omitempty"`
+	// The ad group being linked to the feed.
+	AdGroup *wrappers.StringValue `protobuf:"bytes,3,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// Indicates which placeholder types the feed may populate under the connected
+	// ad group. Required.
+	PlaceholderTypes []enums.PlaceholderTypeEnum_PlaceholderType `protobuf:"varint,4,rep,packed,name=placeholder_types,json=placeholderTypes,proto3,enum=google.ads.googleads.v3.enums.PlaceholderTypeEnum_PlaceholderType" json:"placeholder_types,omitempty"`
+	// Matching function associated with the AdGroupFeed.
+	// The matching function is used to filter the set of feed items selected.
+	// Required.
+	MatchingFunction *common.MatchingFunction `protobuf:"bytes,5,opt,name=matching_function,json=matchingFunction,proto3" json:"matching_function,omitempty"`
+	// Status of the ad group feed.
+	// This field is read-only.
+	Status               enums.FeedLinkStatusEnum_FeedLinkStatus `protobuf:"varint,6,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.FeedLinkStatusEnum_FeedLinkStatus" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *AdGroupFeed) Reset()         { *m = AdGroupFeed{} }
+func (m *AdGroupFeed) String() string { return proto.CompactTextString(m) }
+func (*AdGroupFeed) ProtoMessage()    {}
+func (*AdGroupFeed) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9221b5cf8e75124f, []int{0}
+}
+
+func (m *AdGroupFeed) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupFeed.Unmarshal(m, b)
+}
+func (m *AdGroupFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupFeed.Marshal(b, m, deterministic)
+}
+func (m *AdGroupFeed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupFeed.Merge(m, src)
+}
+func (m *AdGroupFeed) XXX_Size() int {
+	return xxx_messageInfo_AdGroupFeed.Size(m)
+}
+func (m *AdGroupFeed) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupFeed.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupFeed proto.InternalMessageInfo
+
+func (m *AdGroupFeed) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupFeed) GetFeed() *wrappers.StringValue {
+	if m != nil {
+		return m.Feed
+	}
+	return nil
+}
+
+func (m *AdGroupFeed) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *AdGroupFeed) GetPlaceholderTypes() []enums.PlaceholderTypeEnum_PlaceholderType {
+	if m != nil {
+		return m.PlaceholderTypes
+	}
+	return nil
+}
+
+func (m *AdGroupFeed) GetMatchingFunction() *common.MatchingFunction {
+	if m != nil {
+		return m.MatchingFunction
+	}
+	return nil
+}
+
+func (m *AdGroupFeed) GetStatus() enums.FeedLinkStatusEnum_FeedLinkStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.FeedLinkStatusEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*AdGroupFeed)(nil), "google.ads.googleads.v3.resources.AdGroupFeed")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_feed.proto", fileDescriptor_9221b5cf8e75124f)
+}
+
+var fileDescriptor_9221b5cf8e75124f = []byte{
+	// 533 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x5d, 0x6b, 0xd4, 0x4c,
+	0x18, 0x25, 0xbb, 0xfb, 0xee, 0xab, 0x53, 0x2d, 0xdb, 0x5c, 0xc5, 0x52, 0x64, 0xab, 0x16, 0xf6,
+	0x6a, 0xa6, 0x6e, 0xfc, 0x80, 0x78, 0x63, 0x16, 0xec, 0x82, 0xa8, 0x2c, 0xa9, 0x2c, 0x2a, 0x2b,
+	0x61, 0x9a, 0x99, 0x4d, 0x43, 0x33, 0x1f, 0xcc, 0x24, 0x95, 0x52, 0xfa, 0x67, 0x04, 0x6f, 0xfc,
+	0x29, 0xfe, 0x94, 0xfe, 0x07, 0x41, 0x92, 0x4c, 0xb2, 0x1f, 0xb2, 0xb6, 0x77, 0x27, 0xcf, 0x9c,
+	0xf3, 0xcc, 0x79, 0x9e, 0x93, 0x01, 0xcf, 0x63, 0x21, 0xe2, 0x94, 0x22, 0x4c, 0x34, 0xaa, 0x60,
+	0x81, 0xce, 0x5d, 0xa4, 0xa8, 0x16, 0xb9, 0x8a, 0xa8, 0x46, 0x98, 0x84, 0xb1, 0x12, 0xb9, 0x0c,
+	0xe7, 0x94, 0x12, 0x28, 0x95, 0xc8, 0x84, 0xbd, 0x5f, 0x71, 0x21, 0x26, 0x1a, 0x36, 0x32, 0x78,
+	0xee, 0xc2, 0x46, 0xb6, 0xfb, 0x62, 0x53, 0xe7, 0x48, 0x30, 0x26, 0x38, 0x62, 0x38, 0x8b, 0x4e,
+	0x13, 0x1e, 0x87, 0xf3, 0x9c, 0x47, 0x59, 0x22, 0x78, 0xd5, 0x7a, 0xf7, 0xd9, 0x26, 0x1d, 0xe5,
+	0x39, 0xd3, 0xa8, 0x30, 0x11, 0xa6, 0x09, 0x3f, 0x0b, 0x75, 0x86, 0xb3, 0x5c, 0xdf, 0x4e, 0x25,
+	0x53, 0x1c, 0xd1, 0x53, 0x91, 0x12, 0xaa, 0xc2, 0xec, 0x42, 0x52, 0xa3, 0x7a, 0x50, 0xab, 0x64,
+	0xd2, 0x0c, 0x6c, 0x8e, 0x1e, 0x9a, 0xa3, 0xf2, 0xeb, 0x24, 0x9f, 0xa3, 0x6f, 0x0a, 0x4b, 0x49,
+	0x55, 0x7d, 0xe1, 0xde, 0x92, 0x14, 0x73, 0x2e, 0x32, 0x5c, 0xcc, 0x60, 0x4e, 0x1f, 0xfd, 0xe8,
+	0x80, 0x2d, 0x9f, 0x8c, 0x8b, 0xb5, 0x1d, 0x51, 0x4a, 0xec, 0xc7, 0xe0, 0x7e, 0xdd, 0x3f, 0xe4,
+	0x98, 0x51, 0xc7, 0xea, 0x5b, 0x83, 0xbb, 0xc1, 0xbd, 0xba, 0xf8, 0x01, 0x33, 0x6a, 0x1f, 0x82,
+	0x4e, 0x31, 0x9d, 0xd3, 0xea, 0x5b, 0x83, 0xad, 0xe1, 0x9e, 0x59, 0x2c, 0xac, 0x1d, 0xc0, 0xe3,
+	0x4c, 0x25, 0x3c, 0x9e, 0xe2, 0x34, 0xa7, 0x41, 0xc9, 0xb4, 0x5f, 0x82, 0x3b, 0x75, 0x3a, 0x4e,
+	0xfb, 0x16, 0xaa, 0xff, 0x71, 0xe5, 0xc9, 0x16, 0x60, 0x67, 0x7d, 0x25, 0xda, 0xe9, 0xf4, 0xdb,
+	0x83, 0xed, 0xe1, 0x08, 0x6e, 0xca, 0xb6, 0x5c, 0x25, 0x9c, 0x2c, 0x74, 0x1f, 0x2f, 0x24, 0x7d,
+	0xc3, 0x73, 0xb6, 0x5e, 0x0b, 0x7a, 0x72, 0xb5, 0xa0, 0xed, 0xaf, 0x60, 0xe7, 0xaf, 0xc0, 0x9d,
+	0xff, 0x4a, 0xcb, 0x87, 0x1b, 0x2f, 0xac, 0xfe, 0x14, 0xf8, 0xde, 0x08, 0x8f, 0x8c, 0x2e, 0xe8,
+	0xb1, 0xb5, 0x8a, 0xfd, 0x09, 0x74, 0xab, 0xdf, 0xc1, 0xe9, 0xf6, 0xad, 0xc1, 0xf6, 0xf0, 0xf5,
+	0x0d, 0x43, 0x14, 0xa1, 0xbc, 0x4b, 0xf8, 0xd9, 0x71, 0x29, 0x2a, 0x67, 0x58, 0x2d, 0x05, 0xa6,
+	0x9f, 0x37, 0xbb, 0xf6, 0x3f, 0x83, 0x27, 0x8b, 0x16, 0x06, 0xc9, 0x44, 0x17, 0xf6, 0xd0, 0x72,
+	0xc8, 0x4f, 0xa3, 0x5c, 0x67, 0x82, 0x51, 0xa5, 0xd1, 0x65, 0x0d, 0xaf, 0x10, 0x5e, 0x30, 0x34,
+	0xba, 0x5c, 0x79, 0x4c, 0x57, 0xa3, 0xdf, 0x16, 0x38, 0x88, 0x04, 0x83, 0x37, 0x3e, 0xa7, 0x51,
+	0x6f, 0xe9, 0xa6, 0x49, 0x91, 0xed, 0xc4, 0xfa, 0xf2, 0xd6, 0xc8, 0x62, 0x91, 0x62, 0x1e, 0x43,
+	0xa1, 0x62, 0x14, 0x53, 0x5e, 0x26, 0x8f, 0x16, 0x3e, 0xff, 0xf1, 0xb6, 0x5f, 0x35, 0xe8, 0x7b,
+	0xab, 0x3d, 0xf6, 0xfd, 0x9f, 0xad, 0xfd, 0x71, 0xd5, 0xd2, 0x27, 0x1a, 0x56, 0xb0, 0x40, 0x53,
+	0x17, 0x06, 0x35, 0xf3, 0x57, 0xcd, 0x99, 0xf9, 0x44, 0xcf, 0x1a, 0xce, 0x6c, 0xea, 0xce, 0x1a,
+	0xce, 0x75, 0xeb, 0xa0, 0x3a, 0xf0, 0x3c, 0x9f, 0x68, 0xcf, 0x6b, 0x58, 0x9e, 0x37, 0x75, 0x3d,
+	0xaf, 0xe1, 0x9d, 0x74, 0x4b, 0xb3, 0xee, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x27, 0x72,
+	0x73, 0x87, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_label.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_label.pb.go
new file mode 100644
index 0000000..2fd274d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_label.pb.go
@@ -0,0 +1,121 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_label.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A relationship between an ad group and a label.
+type AdGroupLabel struct {
+	// The resource name of the ad group label.
+	// Ad group label resource names have the form:
+	// `customers/{customer_id}/adGroupLabels/{ad_group_id}~{label_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ad group to which the label is attached.
+	AdGroup *wrappers.StringValue `protobuf:"bytes,2,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// The label assigned to the ad group.
+	Label                *wrappers.StringValue `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AdGroupLabel) Reset()         { *m = AdGroupLabel{} }
+func (m *AdGroupLabel) String() string { return proto.CompactTextString(m) }
+func (*AdGroupLabel) ProtoMessage()    {}
+func (*AdGroupLabel) Descriptor() ([]byte, []int) {
+	return fileDescriptor_cc4fee60b3e79c3f, []int{0}
+}
+
+func (m *AdGroupLabel) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupLabel.Unmarshal(m, b)
+}
+func (m *AdGroupLabel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupLabel.Marshal(b, m, deterministic)
+}
+func (m *AdGroupLabel) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupLabel.Merge(m, src)
+}
+func (m *AdGroupLabel) XXX_Size() int {
+	return xxx_messageInfo_AdGroupLabel.Size(m)
+}
+func (m *AdGroupLabel) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupLabel.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupLabel proto.InternalMessageInfo
+
+func (m *AdGroupLabel) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupLabel) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *AdGroupLabel) GetLabel() *wrappers.StringValue {
+	if m != nil {
+		return m.Label
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AdGroupLabel)(nil), "google.ads.googleads.v3.resources.AdGroupLabel")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_label.proto", fileDescriptor_cc4fee60b3e79c3f)
+}
+
+var fileDescriptor_cc4fee60b3e79c3f = []byte{
+	// 376 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcf, 0x4a, 0xf3, 0x40,
+	0x14, 0xc5, 0x49, 0xca, 0xf7, 0x2f, 0x5f, 0x5d, 0x98, 0x55, 0x2d, 0x45, 0x5a, 0xa5, 0xd0, 0xd5,
+	0x0c, 0x34, 0xa0, 0x30, 0xae, 0xd2, 0x4d, 0x41, 0x44, 0x4a, 0x85, 0x2c, 0x24, 0x10, 0xa6, 0xc9,
+	0x38, 0x04, 0x92, 0x99, 0x30, 0x93, 0xd4, 0x45, 0xe9, 0xc2, 0x57, 0x71, 0xe9, 0xa3, 0xf8, 0x28,
+	0x7d, 0x08, 0x91, 0x64, 0x32, 0xd3, 0x76, 0xa3, 0xee, 0x4e, 0x72, 0x7f, 0xe7, 0xde, 0x73, 0x73,
+	0xe3, 0x5c, 0x51, 0xce, 0x69, 0x46, 0x20, 0x4e, 0x24, 0x54, 0xb2, 0x56, 0x6b, 0x0f, 0x0a, 0x22,
+	0x79, 0x25, 0x62, 0x22, 0x21, 0x4e, 0x22, 0x2a, 0x78, 0x55, 0x44, 0x19, 0x5e, 0x91, 0x0c, 0x14,
+	0x82, 0x97, 0xdc, 0x1d, 0x29, 0x18, 0xe0, 0x44, 0x02, 0xe3, 0x03, 0x6b, 0x0f, 0x18, 0x5f, 0xff,
+	0x4c, 0xb7, 0x2e, 0x52, 0xd3, 0x4d, 0xb9, 0xfb, 0xe7, 0x6d, 0xa9, 0x79, 0x5a, 0x55, 0x4f, 0xf0,
+	0x59, 0xe0, 0xa2, 0x20, 0x42, 0xb6, 0xf5, 0xc1, 0x81, 0x15, 0x33, 0xc6, 0x4b, 0x5c, 0xa6, 0x9c,
+	0xb5, 0xd5, 0x8b, 0x17, 0xdb, 0xe9, 0xfa, 0xc9, 0xbc, 0xce, 0x74, 0x57, 0x47, 0x72, 0x2f, 0x9d,
+	0x13, 0x3d, 0x20, 0x62, 0x38, 0x27, 0x3d, 0x6b, 0x68, 0x4d, 0xfe, 0x2d, 0xbb, 0xfa, 0xe5, 0x3d,
+	0xce, 0x89, 0x7b, 0xed, 0xfc, 0xd5, 0x9b, 0xf4, 0xec, 0xa1, 0x35, 0xf9, 0x3f, 0x1d, 0xb4, 0xc9,
+	0x81, 0x8e, 0x01, 0x1e, 0x4a, 0x91, 0x32, 0x1a, 0xe0, 0xac, 0x22, 0xcb, 0x3f, 0x58, 0x8d, 0x70,
+	0xa7, 0xce, 0xaf, 0x66, 0xf3, 0x5e, 0xe7, 0x07, 0x2e, 0x85, 0xa2, 0x68, 0xe7, 0x87, 0xce, 0x78,
+	0xff, 0x61, 0x5a, 0x55, 0xa4, 0x12, 0xc4, 0x3c, 0x87, 0x47, 0xe9, 0xbd, 0xb8, 0x92, 0x25, 0xcf,
+	0x89, 0x90, 0x70, 0xa3, 0xe5, 0x16, 0xe2, 0x03, 0x44, 0xc2, 0xcd, 0xf1, 0x11, 0xb6, 0xb3, 0x0f,
+	0xcb, 0x19, 0xc7, 0x3c, 0x07, 0xdf, 0x9e, 0x61, 0x76, 0x7a, 0x38, 0x6c, 0x51, 0x67, 0x5e, 0x58,
+	0x8f, 0xb7, 0xad, 0x8f, 0xf2, 0x0c, 0x33, 0x0a, 0xb8, 0xa0, 0x90, 0x12, 0xd6, 0x6c, 0x04, 0xf7,
+	0x59, 0xbf, 0xf8, 0x2b, 0x6e, 0x8c, 0x7a, 0xb5, 0x3b, 0x73, 0xdf, 0x7f, 0xb3, 0x47, 0x73, 0xd5,
+	0xd2, 0x4f, 0x24, 0x50, 0xb2, 0x56, 0x81, 0x07, 0x96, 0x9a, 0x7c, 0xd7, 0x4c, 0xe8, 0x27, 0x32,
+	0x34, 0x4c, 0x18, 0x78, 0xa1, 0x61, 0x76, 0xf6, 0x58, 0x15, 0x10, 0xf2, 0x13, 0x89, 0x90, 0xa1,
+	0x10, 0x0a, 0x3c, 0x84, 0x0c, 0xb7, 0xfa, 0xdd, 0x84, 0xf5, 0x3e, 0x03, 0x00, 0x00, 0xff, 0xff,
+	0x54, 0x2f, 0x32, 0x48, 0xc1, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_group_simulation.pb.go b/googleapis/ads/googleads/v3/resources/ad_group_simulation.pb.go
new file mode 100644
index 0000000..32eb9ef
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_group_simulation.pb.go
@@ -0,0 +1,243 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_group_simulation.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad group simulation. Supported combinations of advertising
+// channel type, simulation type and simulation modification method is
+// detailed below respectively.
+//
+// 1. SEARCH - CPC_BID - DEFAULT
+// 2. SEARCH - CPC_BID - UNIFORM
+// 3. SEARCH - TARGET_CPA - UNIFORM
+// 4. DISPLAY - CPC_BID - DEFAULT
+// 5. DISPLAY - CPC_BID - UNIFORM
+// 6. DISPLAY - TARGET_CPA - UNIFORM
+// 7. VIDEO - CPV_BID - DEFAULT
+// 8. VIDEO - CPV_BID - UNIFORM
+type AdGroupSimulation struct {
+	// The resource name of the ad group simulation.
+	// Ad group simulation resource names have the form:
+	//
+	// `customers/{customer_id}/adGroupSimulations/{ad_group_id}~{type}~{modification_method}~{start_date}~{end_date}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Ad group id of the simulation.
+	AdGroupId *wrappers.Int64Value `protobuf:"bytes,2,opt,name=ad_group_id,json=adGroupId,proto3" json:"ad_group_id,omitempty"`
+	// The field that the simulation modifies.
+	Type enums.SimulationTypeEnum_SimulationType `protobuf:"varint,3,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.SimulationTypeEnum_SimulationType" json:"type,omitempty"`
+	// How the simulation modifies the field.
+	ModificationMethod enums.SimulationModificationMethodEnum_SimulationModificationMethod `protobuf:"varint,4,opt,name=modification_method,json=modificationMethod,proto3,enum=google.ads.googleads.v3.enums.SimulationModificationMethodEnum_SimulationModificationMethod" json:"modification_method,omitempty"`
+	// First day on which the simulation is based, in YYYY-MM-DD format.
+	StartDate *wrappers.StringValue `protobuf:"bytes,5,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"`
+	// Last day on which the simulation is based, in YYYY-MM-DD format
+	EndDate *wrappers.StringValue `protobuf:"bytes,6,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"`
+	// List of simulation points.
+	//
+	// Types that are valid to be assigned to PointList:
+	//	*AdGroupSimulation_CpcBidPointList
+	//	*AdGroupSimulation_CpvBidPointList
+	//	*AdGroupSimulation_TargetCpaPointList
+	PointList            isAdGroupSimulation_PointList `protobuf_oneof:"point_list"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *AdGroupSimulation) Reset()         { *m = AdGroupSimulation{} }
+func (m *AdGroupSimulation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupSimulation) ProtoMessage()    {}
+func (*AdGroupSimulation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bfe8b62d7d533dcc, []int{0}
+}
+
+func (m *AdGroupSimulation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupSimulation.Unmarshal(m, b)
+}
+func (m *AdGroupSimulation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupSimulation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupSimulation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupSimulation.Merge(m, src)
+}
+func (m *AdGroupSimulation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupSimulation.Size(m)
+}
+func (m *AdGroupSimulation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupSimulation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupSimulation proto.InternalMessageInfo
+
+func (m *AdGroupSimulation) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdGroupSimulation) GetAdGroupId() *wrappers.Int64Value {
+	if m != nil {
+		return m.AdGroupId
+	}
+	return nil
+}
+
+func (m *AdGroupSimulation) GetType() enums.SimulationTypeEnum_SimulationType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.SimulationTypeEnum_UNSPECIFIED
+}
+
+func (m *AdGroupSimulation) GetModificationMethod() enums.SimulationModificationMethodEnum_SimulationModificationMethod {
+	if m != nil {
+		return m.ModificationMethod
+	}
+	return enums.SimulationModificationMethodEnum_UNSPECIFIED
+}
+
+func (m *AdGroupSimulation) GetStartDate() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDate
+	}
+	return nil
+}
+
+func (m *AdGroupSimulation) GetEndDate() *wrappers.StringValue {
+	if m != nil {
+		return m.EndDate
+	}
+	return nil
+}
+
+type isAdGroupSimulation_PointList interface {
+	isAdGroupSimulation_PointList()
+}
+
+type AdGroupSimulation_CpcBidPointList struct {
+	CpcBidPointList *common.CpcBidSimulationPointList `protobuf:"bytes,8,opt,name=cpc_bid_point_list,json=cpcBidPointList,proto3,oneof"`
+}
+
+type AdGroupSimulation_CpvBidPointList struct {
+	CpvBidPointList *common.CpvBidSimulationPointList `protobuf:"bytes,10,opt,name=cpv_bid_point_list,json=cpvBidPointList,proto3,oneof"`
+}
+
+type AdGroupSimulation_TargetCpaPointList struct {
+	TargetCpaPointList *common.TargetCpaSimulationPointList `protobuf:"bytes,9,opt,name=target_cpa_point_list,json=targetCpaPointList,proto3,oneof"`
+}
+
+func (*AdGroupSimulation_CpcBidPointList) isAdGroupSimulation_PointList() {}
+
+func (*AdGroupSimulation_CpvBidPointList) isAdGroupSimulation_PointList() {}
+
+func (*AdGroupSimulation_TargetCpaPointList) isAdGroupSimulation_PointList() {}
+
+func (m *AdGroupSimulation) GetPointList() isAdGroupSimulation_PointList {
+	if m != nil {
+		return m.PointList
+	}
+	return nil
+}
+
+func (m *AdGroupSimulation) GetCpcBidPointList() *common.CpcBidSimulationPointList {
+	if x, ok := m.GetPointList().(*AdGroupSimulation_CpcBidPointList); ok {
+		return x.CpcBidPointList
+	}
+	return nil
+}
+
+func (m *AdGroupSimulation) GetCpvBidPointList() *common.CpvBidSimulationPointList {
+	if x, ok := m.GetPointList().(*AdGroupSimulation_CpvBidPointList); ok {
+		return x.CpvBidPointList
+	}
+	return nil
+}
+
+func (m *AdGroupSimulation) GetTargetCpaPointList() *common.TargetCpaSimulationPointList {
+	if x, ok := m.GetPointList().(*AdGroupSimulation_TargetCpaPointList); ok {
+		return x.TargetCpaPointList
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupSimulation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupSimulation_CpcBidPointList)(nil),
+		(*AdGroupSimulation_CpvBidPointList)(nil),
+		(*AdGroupSimulation_TargetCpaPointList)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*AdGroupSimulation)(nil), "google.ads.googleads.v3.resources.AdGroupSimulation")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_group_simulation.proto", fileDescriptor_bfe8b62d7d533dcc)
+}
+
+var fileDescriptor_bfe8b62d7d533dcc = []byte{
+	// 620 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdd, 0x6e, 0xd3, 0x30,
+	0x14, 0xa6, 0xdd, 0xd8, 0x8f, 0x37, 0x40, 0x04, 0x81, 0xc2, 0x98, 0xd0, 0x06, 0x9a, 0x34, 0x71,
+	0x61, 0x4b, 0x0b, 0x02, 0x91, 0x82, 0x44, 0x3a, 0xd0, 0x18, 0x62, 0x68, 0xca, 0xa6, 0x5e, 0xa0,
+	0x4a, 0x91, 0x17, 0x7b, 0x99, 0x45, 0x63, 0x9b, 0xd8, 0x29, 0x9a, 0xa6, 0x5d, 0x71, 0xcd, 0x2d,
+	0x0f, 0xc0, 0x25, 0x8f, 0xc2, 0xa3, 0xec, 0x29, 0x50, 0x9c, 0xc4, 0x2d, 0xed, 0xba, 0xf5, 0xee,
+	0xe4, 0x9c, 0xef, 0xc7, 0xe7, 0xab, 0x6b, 0xd0, 0x4a, 0x84, 0x48, 0x7a, 0x14, 0x61, 0xa2, 0x50,
+	0x59, 0x16, 0x55, 0xdf, 0x43, 0x19, 0x55, 0x22, 0xcf, 0x62, 0xaa, 0x10, 0x26, 0x51, 0x92, 0x89,
+	0x5c, 0x46, 0x8a, 0xa5, 0x79, 0x0f, 0x6b, 0x26, 0x38, 0x94, 0x99, 0xd0, 0xc2, 0x59, 0x2f, 0x19,
+	0x10, 0x13, 0x05, 0x2d, 0x19, 0xf6, 0x3d, 0x68, 0xc9, 0x2b, 0x68, 0x92, 0x7e, 0x2c, 0xd2, 0x54,
+	0x70, 0x34, 0xaa, 0xb9, 0xd2, 0x9e, 0x44, 0xa0, 0x3c, 0x4f, 0xd5, 0x10, 0x3e, 0x4a, 0x05, 0x61,
+	0xc7, 0x2c, 0xae, 0x3e, 0xa8, 0x3e, 0x11, 0xa4, 0xd2, 0xf0, 0xa6, 0xd6, 0xd0, 0xa7, 0x92, 0x56,
+	0xa4, 0x87, 0x35, 0x49, 0x32, 0xbb, 0x7c, 0x35, 0x7a, 0x5c, 0x8d, 0xcc, 0xd7, 0x51, 0x7e, 0x8c,
+	0xbe, 0x67, 0x58, 0x4a, 0x9a, 0xa9, 0x6a, 0xbe, 0x3a, 0x44, 0xc5, 0x9c, 0x0b, 0x6d, 0xc4, 0xab,
+	0xe9, 0x93, 0x5f, 0xf3, 0xe0, 0x6e, 0x40, 0x76, 0x8a, 0x08, 0x0f, 0xac, 0xb3, 0xf3, 0x14, 0xdc,
+	0xaa, 0x5d, 0x22, 0x8e, 0x53, 0xea, 0x36, 0xd6, 0x1a, 0x9b, 0x8b, 0xe1, 0x72, 0xdd, 0xfc, 0x8c,
+	0x53, 0xea, 0xb4, 0xc0, 0x92, 0x4d, 0x9f, 0x11, 0xb7, 0xb9, 0xd6, 0xd8, 0x5c, 0xda, 0x7a, 0x54,
+	0x65, 0x0d, 0xeb, 0xe3, 0xc0, 0x5d, 0xae, 0x5f, 0x3c, 0xef, 0xe0, 0x5e, 0x4e, 0xc3, 0x45, 0x5c,
+	0x3a, 0xed, 0x12, 0xe7, 0x10, 0xcc, 0x16, 0xeb, 0xb9, 0x33, 0x6b, 0x8d, 0xcd, 0xdb, 0x5b, 0x6f,
+	0xe1, 0xa4, 0x1f, 0xcb, 0x84, 0x02, 0x07, 0x47, 0x3b, 0x3c, 0x95, 0xf4, 0x3d, 0xcf, 0xd3, 0x91,
+	0x56, 0x68, 0xd4, 0x9c, 0x9f, 0x0d, 0x70, 0xef, 0x92, 0xe4, 0xdd, 0x59, 0xe3, 0xd2, 0x9d, 0xda,
+	0x65, 0x6f, 0x48, 0x63, 0xcf, 0x48, 0x8c, 0x78, 0x8e, 0x03, 0x42, 0x27, 0x1d, 0xeb, 0x39, 0x2d,
+	0x00, 0x94, 0xc6, 0x99, 0x8e, 0x08, 0xd6, 0xd4, 0xbd, 0x69, 0x12, 0x5a, 0x1d, 0x4b, 0xe8, 0x40,
+	0x67, 0x8c, 0x27, 0x55, 0x44, 0x06, 0xff, 0x0e, 0x6b, 0xea, 0xbc, 0x04, 0x0b, 0x94, 0x93, 0x92,
+	0x3a, 0x37, 0x05, 0x75, 0x9e, 0x72, 0x62, 0x88, 0x27, 0xc0, 0x89, 0x65, 0x1c, 0x1d, 0x31, 0x12,
+	0x49, 0xc1, 0xb8, 0x8e, 0x7a, 0x4c, 0x69, 0x77, 0xc1, 0x48, 0xbc, 0x9a, 0x98, 0x41, 0x79, 0xe7,
+	0xe1, 0xb6, 0x8c, 0xdb, 0x8c, 0x0c, 0x36, 0xdd, 0x2f, 0x14, 0x3e, 0x31, 0xa5, 0x3f, 0xdc, 0x08,
+	0xef, 0xc4, 0x66, 0x68, 0x5b, 0xa5, 0x53, 0x7f, 0xd4, 0x09, 0x4c, 0xeb, 0xd4, 0xbf, 0xca, 0xa9,
+	0xff, 0x9f, 0xd3, 0x37, 0x70, 0x5f, 0xe3, 0x2c, 0xa1, 0x3a, 0x8a, 0x25, 0x1e, 0x36, 0x5b, 0x34,
+	0x66, 0xaf, 0xaf, 0x33, 0x3b, 0x34, 0xe4, 0x6d, 0x89, 0x2f, 0xf7, 0x73, 0x74, 0x3d, 0xb7, 0x5d,
+	0x9f, 0x5f, 0x04, 0x5f, 0xc1, 0xb3, 0x81, 0x58, 0x55, 0x49, 0xa6, 0x0a, 0x51, 0x34, 0xfe, 0xaf,
+	0x79, 0x13, 0xe7, 0x4a, 0x8b, 0x94, 0x66, 0x0a, 0x9d, 0xd5, 0xe5, 0x39, 0xc2, 0xa3, 0x38, 0x85,
+	0xce, 0x2e, 0x79, 0xb5, 0xce, 0xdb, 0xcb, 0x00, 0x0c, 0xf6, 0x6a, 0xff, 0x68, 0x82, 0x8d, 0x58,
+	0xa4, 0xf0, 0xda, 0x57, 0xac, 0xfd, 0x60, 0xec, 0x24, 0xfb, 0xc5, 0xf5, 0xd8, 0x6f, 0x7c, 0xf9,
+	0x58, 0x91, 0x13, 0xd1, 0xc3, 0x3c, 0x81, 0x22, 0x4b, 0x50, 0x42, 0xb9, 0xb9, 0x3c, 0x68, 0xb0,
+	0xcd, 0x15, 0xcf, 0x6b, 0xcb, 0x56, 0xbf, 0x9b, 0x33, 0x3b, 0x41, 0xf0, 0xa7, 0xb9, 0xbe, 0x53,
+	0x4a, 0x06, 0x44, 0xc1, 0xb2, 0x2c, 0xaa, 0x8e, 0x07, 0xc3, 0x1a, 0xf9, 0xb7, 0xc6, 0x74, 0x03,
+	0xa2, 0xba, 0x16, 0xd3, 0xed, 0x78, 0x5d, 0x8b, 0xb9, 0x68, 0x6e, 0x94, 0x03, 0xdf, 0x0f, 0x88,
+	0xf2, 0x7d, 0x8b, 0xf2, 0xfd, 0x8e, 0xe7, 0xfb, 0x16, 0x77, 0x34, 0x67, 0x0e, 0xeb, 0xfd, 0x0b,
+	0x00, 0x00, 0xff, 0xff, 0x6a, 0x12, 0x59, 0x22, 0x0a, 0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_parameter.pb.go b/googleapis/ads/googleads/v3/resources/ad_parameter.pb.go
new file mode 100644
index 0000000..7a5a2fe
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_parameter.pb.go
@@ -0,0 +1,151 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_parameter.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad parameter that is used to update numeric values (such as prices or
+// inventory levels) in any text line of an ad (including URLs). There can
+// be a maximum of two AdParameters per ad group criterion. (One with
+// parameter_index = 1 and one with parameter_index = 2.)
+// In the ad the parameters are referenced by a placeholder of the form
+// "{param#:value}". E.g. "{param1:$17}"
+type AdParameter struct {
+	// The resource name of the ad parameter.
+	// Ad parameter resource names have the form:
+	//
+	// `customers/{customer_id}/adParameters/{ad_group_id}~{criterion_id}~{parameter_index}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ad group criterion that this ad parameter belongs to.
+	AdGroupCriterion *wrappers.StringValue `protobuf:"bytes,2,opt,name=ad_group_criterion,json=adGroupCriterion,proto3" json:"ad_group_criterion,omitempty"`
+	// The unique index of this ad parameter. Must be either 1 or 2.
+	ParameterIndex *wrappers.Int64Value `protobuf:"bytes,3,opt,name=parameter_index,json=parameterIndex,proto3" json:"parameter_index,omitempty"`
+	// Numeric value to insert into the ad text. The following restrictions
+	//  apply:
+	//  - Can use comma or period as a separator, with an optional period or
+	//    comma (respectively) for fractional values. For example, 1,000,000.00
+	//    and 2.000.000,10 are valid.
+	//  - Can be prepended or appended with a currency symbol. For example,
+	//    $99.99 is valid.
+	//  - Can be prepended or appended with a currency code. For example, 99.99USD
+	//    and EUR200 are valid.
+	//  - Can use '%'. For example, 1.0% and 1,0% are valid.
+	//  - Can use plus or minus. For example, -10.99 and 25+ are valid.
+	//  - Can use '/' between two numbers. For example 4/1 and 0.95/0.45 are
+	//    valid.
+	InsertionText        *wrappers.StringValue `protobuf:"bytes,4,opt,name=insertion_text,json=insertionText,proto3" json:"insertion_text,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *AdParameter) Reset()         { *m = AdParameter{} }
+func (m *AdParameter) String() string { return proto.CompactTextString(m) }
+func (*AdParameter) ProtoMessage()    {}
+func (*AdParameter) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a57ac7fdbdfa053, []int{0}
+}
+
+func (m *AdParameter) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdParameter.Unmarshal(m, b)
+}
+func (m *AdParameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdParameter.Marshal(b, m, deterministic)
+}
+func (m *AdParameter) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdParameter.Merge(m, src)
+}
+func (m *AdParameter) XXX_Size() int {
+	return xxx_messageInfo_AdParameter.Size(m)
+}
+func (m *AdParameter) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdParameter.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdParameter proto.InternalMessageInfo
+
+func (m *AdParameter) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AdParameter) GetAdGroupCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupCriterion
+	}
+	return nil
+}
+
+func (m *AdParameter) GetParameterIndex() *wrappers.Int64Value {
+	if m != nil {
+		return m.ParameterIndex
+	}
+	return nil
+}
+
+func (m *AdParameter) GetInsertionText() *wrappers.StringValue {
+	if m != nil {
+		return m.InsertionText
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*AdParameter)(nil), "google.ads.googleads.v3.resources.AdParameter")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_parameter.proto", fileDescriptor_1a57ac7fdbdfa053)
+}
+
+var fileDescriptor_1a57ac7fdbdfa053 = []byte{
+	// 429 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x5f, 0x6b, 0xd5, 0x30,
+	0x18, 0xc6, 0x69, 0x27, 0x82, 0x99, 0x9b, 0xa3, 0x57, 0xc7, 0x39, 0x64, 0x53, 0x07, 0xbb, 0x4a,
+	0xc4, 0x0e, 0x2f, 0xe2, 0x55, 0x37, 0xe1, 0xb0, 0x5d, 0xc8, 0xe1, 0x28, 0x45, 0xb4, 0x50, 0xb2,
+	0xe6, 0x35, 0x04, 0x4e, 0x93, 0x92, 0xa4, 0xf3, 0xc0, 0xd8, 0x97, 0xf1, 0xd2, 0x8f, 0xe2, 0x07,
+	0xf1, 0x62, 0xdf, 0x41, 0x90, 0xfe, 0x49, 0x4e, 0x41, 0x50, 0xef, 0x9e, 0xf6, 0x7d, 0x7e, 0x4f,
+	0x9f, 0xe4, 0x2d, 0x3a, 0x15, 0x5a, 0x8b, 0x15, 0x10, 0xc6, 0x2d, 0x19, 0x64, 0xa7, 0xae, 0x53,
+	0x62, 0xc0, 0xea, 0xd6, 0x54, 0x60, 0x09, 0xe3, 0x65, 0xc3, 0x0c, 0xab, 0xc1, 0x81, 0xc1, 0x8d,
+	0xd1, 0x4e, 0x27, 0x47, 0x83, 0x15, 0x33, 0x6e, 0x71, 0xa0, 0xf0, 0x75, 0x8a, 0x03, 0xb5, 0xff,
+	0xd8, 0x07, 0x37, 0x32, 0x64, 0x0d, 0xf4, 0xfe, 0xd3, 0x71, 0xd4, 0x3f, 0x5d, 0xb5, 0x5f, 0xc8,
+	0x57, 0xc3, 0x9a, 0x06, 0x8c, 0x1d, 0xe7, 0x07, 0x13, 0x94, 0x29, 0xa5, 0x1d, 0x73, 0x52, 0xab,
+	0x71, 0xfa, 0xec, 0x67, 0x8c, 0xb6, 0x33, 0xbe, 0xf0, 0x8d, 0x92, 0xe7, 0x68, 0xc7, 0xe7, 0x97,
+	0x8a, 0xd5, 0x30, 0x8b, 0x0e, 0xa3, 0x93, 0x07, 0xcb, 0x87, 0xfe, 0xe5, 0x3b, 0x56, 0x43, 0x72,
+	0x89, 0x12, 0xc6, 0x4b, 0x61, 0x74, 0xdb, 0x94, 0x95, 0x91, 0x0e, 0x8c, 0xd4, 0x6a, 0x16, 0x1f,
+	0x46, 0x27, 0xdb, 0xaf, 0x0e, 0xc6, 0x23, 0x60, 0xdf, 0x07, 0xbf, 0x77, 0x46, 0x2a, 0x91, 0xb3,
+	0x55, 0x0b, 0xcb, 0x3d, 0xc6, 0xe7, 0x1d, 0x76, 0xee, 0xa9, 0xe4, 0x2d, 0x7a, 0x14, 0xee, 0xa3,
+	0x94, 0x8a, 0xc3, 0x7a, 0xb6, 0xd5, 0x07, 0x3d, 0xf9, 0x23, 0xe8, 0x42, 0xb9, 0xd7, 0xa7, 0x43,
+	0xce, 0x6e, 0x60, 0x2e, 0x3a, 0x24, 0x39, 0x47, 0xbb, 0x52, 0x59, 0x30, 0xdd, 0xd1, 0x4a, 0x07,
+	0x6b, 0x37, 0xbb, 0xf7, 0x1f, 0x6d, 0x76, 0x02, 0xf3, 0x01, 0xd6, 0x8e, 0x7e, 0xbe, 0xcb, 0x3e,
+	0xa2, 0x17, 0x9b, 0x0d, 0x8c, 0xaa, 0x91, 0x16, 0x57, 0xba, 0x26, 0xd3, 0x6b, 0x7a, 0x59, 0xb5,
+	0xd6, 0xe9, 0x1a, 0x8c, 0x25, 0x37, 0x5e, 0xde, 0x12, 0xb6, 0x71, 0x58, 0x72, 0x33, 0xdd, 0xf4,
+	0xed, 0xd9, 0xaf, 0x08, 0x1d, 0x57, 0xba, 0xc6, 0xff, 0xdc, 0xf5, 0xd9, 0xde, 0xe4, 0x43, 0x8b,
+	0xae, 0xf6, 0x22, 0xfa, 0x74, 0x39, 0x62, 0x42, 0xaf, 0x98, 0x12, 0x58, 0x1b, 0x41, 0x04, 0xa8,
+	0xfe, 0x50, 0x64, 0x53, 0xf3, 0x2f, 0xff, 0xdd, 0x9b, 0xa0, 0xbe, 0xc5, 0x5b, 0xf3, 0x2c, 0xfb,
+	0x1e, 0x1f, 0xcd, 0x87, 0xc8, 0x8c, 0x5b, 0x3c, 0xc8, 0x4e, 0xe5, 0x29, 0x5e, 0x7a, 0xe7, 0x0f,
+	0xef, 0x29, 0x32, 0x6e, 0x8b, 0xe0, 0x29, 0xf2, 0xb4, 0x08, 0x9e, 0xbb, 0xf8, 0x78, 0x18, 0x50,
+	0x9a, 0x71, 0x4b, 0x69, 0x70, 0x51, 0x9a, 0xa7, 0x94, 0x06, 0xdf, 0xd5, 0xfd, 0xbe, 0x6c, 0xfa,
+	0x3b, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xde, 0xba, 0xe5, 0x23, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/ad_schedule_view.pb.go b/googleapis/ads/googleads/v3/resources/ad_schedule_view.pb.go
new file mode 100644
index 0000000..b2e17ae
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/ad_schedule_view.pb.go
@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/ad_schedule_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An ad schedule view summarizes the performance of campaigns by
+// AdSchedule criteria.
+type AdScheduleView struct {
+	// The resource name of the ad schedule view.
+	// AdSchedule view resource names have the form:
+	//
+	// `customers/{customer_id}/adScheduleViews/{campaign_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AdScheduleView) Reset()         { *m = AdScheduleView{} }
+func (m *AdScheduleView) String() string { return proto.CompactTextString(m) }
+func (*AdScheduleView) ProtoMessage()    {}
+func (*AdScheduleView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_99aaa568f8d5a785, []int{0}
+}
+
+func (m *AdScheduleView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdScheduleView.Unmarshal(m, b)
+}
+func (m *AdScheduleView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdScheduleView.Marshal(b, m, deterministic)
+}
+func (m *AdScheduleView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdScheduleView.Merge(m, src)
+}
+func (m *AdScheduleView) XXX_Size() int {
+	return xxx_messageInfo_AdScheduleView.Size(m)
+}
+func (m *AdScheduleView) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdScheduleView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdScheduleView proto.InternalMessageInfo
+
+func (m *AdScheduleView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*AdScheduleView)(nil), "google.ads.googleads.v3.resources.AdScheduleView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/ad_schedule_view.proto", fileDescriptor_99aaa568f8d5a785)
+}
+
+var fileDescriptor_99aaa568f8d5a785 = []byte{
+	// 319 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xb1, 0x4a, 0x03, 0x41,
+	0x10, 0x86, 0xb9, 0x13, 0x04, 0x0f, 0xb5, 0x88, 0x8d, 0x06, 0x0b, 0xa3, 0x04, 0xad, 0x76, 0x8b,
+	0x2b, 0x94, 0xb5, 0xda, 0x34, 0x01, 0x0b, 0x09, 0x11, 0xae, 0x90, 0x83, 0xb0, 0xb9, 0x1d, 0xce,
+	0x83, 0xdc, 0x4e, 0xb8, 0xb9, 0x24, 0x45, 0x08, 0xf8, 0x20, 0x56, 0x96, 0x3e, 0x8a, 0x8f, 0x92,
+	0xa7, 0x90, 0x64, 0xb3, 0x1b, 0x93, 0x42, 0xbb, 0x8f, 0x9b, 0x6f, 0xfe, 0x99, 0xb9, 0x8d, 0x1e,
+	0x72, 0xc4, 0x7c, 0x04, 0x5c, 0x69, 0xe2, 0x16, 0x57, 0x34, 0x8d, 0x79, 0x05, 0x84, 0x93, 0x2a,
+	0x03, 0xe2, 0x4a, 0x0f, 0x28, 0x7b, 0x03, 0x3d, 0x19, 0xc1, 0x60, 0x5a, 0xc0, 0x8c, 0x8d, 0x2b,
+	0xac, 0xb1, 0xd1, 0xb2, 0x3a, 0x53, 0x9a, 0x98, 0xef, 0x64, 0xd3, 0x98, 0xf9, 0xce, 0xe6, 0x85,
+	0x0b, 0x1f, 0x17, 0x3e, 0xcf, 0x76, 0x37, 0x2f, 0x7f, 0x95, 0x94, 0x31, 0x58, 0xab, 0xba, 0x40,
+	0x43, 0xb6, 0x7a, 0xfd, 0x11, 0x44, 0xa7, 0x52, 0xbf, 0x6c, 0xa6, 0x26, 0x05, 0xcc, 0x1a, 0x37,
+	0xd1, 0x89, 0x8b, 0x18, 0x18, 0x55, 0xc2, 0x79, 0x70, 0x15, 0xdc, 0x1d, 0xf5, 0x8f, 0xdd, 0xc7,
+	0x67, 0x55, 0x82, 0x80, 0xa5, 0x1c, 0x46, 0xb7, 0xdb, 0x6d, 0x36, 0x34, 0x2e, 0x88, 0x65, 0x58,
+	0xf2, 0xbd, 0xc8, 0xfb, 0x6c, 0x42, 0x35, 0x96, 0x50, 0x11, 0x9f, 0x3b, 0x5c, 0x70, 0xb5, 0x23,
+	0x11, 0x9f, 0xef, 0xdf, 0xbf, 0xe8, 0xbc, 0x87, 0x51, 0x3b, 0xc3, 0x92, 0xfd, 0xfb, 0x07, 0x3a,
+	0x67, 0xbb, 0x23, 0x7b, 0xab, 0xeb, 0x7a, 0xc1, 0xeb, 0xd3, 0xa6, 0x33, 0xc7, 0x91, 0x32, 0x39,
+	0xc3, 0x2a, 0xe7, 0x39, 0x98, 0xf5, 0xed, 0x7c, 0xbb, 0xf3, 0x1f, 0x8f, 0xf2, 0xe8, 0xe9, 0x33,
+	0x3c, 0xe8, 0x4a, 0xf9, 0x15, 0xb6, 0xba, 0x36, 0x52, 0x6a, 0x62, 0x16, 0x57, 0x94, 0xc4, 0xac,
+	0xef, 0xcc, 0x6f, 0xe7, 0xa4, 0x52, 0x53, 0xea, 0x9d, 0x34, 0x89, 0x53, 0xef, 0x2c, 0xc3, 0xb6,
+	0x2d, 0x08, 0x21, 0x35, 0x09, 0xe1, 0x2d, 0x21, 0x92, 0x58, 0x08, 0xef, 0x0d, 0x0f, 0xd7, 0xcb,
+	0xc6, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd3, 0x6d, 0xce, 0x2d, 0x40, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/age_range_view.pb.go b/googleapis/ads/googleads/v3/resources/age_range_view.pb.go
new file mode 100644
index 0000000..9d53e09
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/age_range_view.pb.go
@@ -0,0 +1,99 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/age_range_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An age range view.
+type AgeRangeView struct {
+	// The resource name of the age range view.
+	// Age range view resource names have the form:
+	//
+	// `customers/{customer_id}/ageRangeViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AgeRangeView) Reset()         { *m = AgeRangeView{} }
+func (m *AgeRangeView) String() string { return proto.CompactTextString(m) }
+func (*AgeRangeView) ProtoMessage()    {}
+func (*AgeRangeView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b1b9693e56ac43d6, []int{0}
+}
+
+func (m *AgeRangeView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AgeRangeView.Unmarshal(m, b)
+}
+func (m *AgeRangeView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AgeRangeView.Marshal(b, m, deterministic)
+}
+func (m *AgeRangeView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AgeRangeView.Merge(m, src)
+}
+func (m *AgeRangeView) XXX_Size() int {
+	return xxx_messageInfo_AgeRangeView.Size(m)
+}
+func (m *AgeRangeView) XXX_DiscardUnknown() {
+	xxx_messageInfo_AgeRangeView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AgeRangeView proto.InternalMessageInfo
+
+func (m *AgeRangeView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*AgeRangeView)(nil), "google.ads.googleads.v3.resources.AgeRangeView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/age_range_view.proto", fileDescriptor_b1b9693e56ac43d6)
+}
+
+var fileDescriptor_b1b9693e56ac43d6 = []byte{
+	// 315 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xb1, 0x4a, 0x03, 0x41,
+	0x10, 0x86, 0xb9, 0x08, 0x82, 0x47, 0x2c, 0x4c, 0xa5, 0xc1, 0xc2, 0x28, 0x01, 0xab, 0xdd, 0x62,
+	0xc1, 0x62, 0xad, 0x36, 0x4d, 0xc0, 0x42, 0x42, 0x8a, 0x2b, 0xe4, 0xe0, 0x58, 0xef, 0x86, 0xe5,
+	0x20, 0xb7, 0x13, 0x6e, 0x2e, 0x49, 0x11, 0xf2, 0x16, 0x3e, 0x81, 0xa5, 0x8f, 0xe2, 0xa3, 0xe4,
+	0x21, 0x44, 0x2e, 0x9b, 0xdd, 0x24, 0x8d, 0x76, 0x3f, 0x3b, 0xdf, 0xff, 0xcf, 0xfc, 0x6c, 0xfc,
+	0x64, 0x10, 0xcd, 0x0c, 0xb8, 0x2e, 0x88, 0x3b, 0xd9, 0xaa, 0xa5, 0xe0, 0x35, 0x10, 0x2e, 0xea,
+	0x1c, 0x88, 0x6b, 0x03, 0x59, 0xad, 0xad, 0x81, 0x6c, 0x59, 0xc2, 0x8a, 0xcd, 0x6b, 0x6c, 0xb0,
+	0x37, 0x70, 0x30, 0xd3, 0x05, 0xb1, 0xe0, 0x63, 0x4b, 0xc1, 0x82, 0xaf, 0x7f, 0xe3, 0xa3, 0xe7,
+	0x65, 0x48, 0x73, 0xee, 0xfe, 0xed, 0xd1, 0x48, 0x5b, 0x8b, 0x8d, 0x6e, 0x4a, 0xb4, 0xe4, 0xa6,
+	0xf7, 0x1f, 0x51, 0xdc, 0x55, 0x06, 0xa6, 0xed, 0xce, 0xa4, 0x84, 0x55, 0xef, 0x21, 0xbe, 0xf4,
+	0x01, 0x99, 0xd5, 0x15, 0x5c, 0x47, 0x77, 0xd1, 0xe3, 0xc5, 0xb4, 0xeb, 0x1f, 0x5f, 0x75, 0x05,
+	0x32, 0xdb, 0xaa, 0x34, 0x1e, 0x1e, 0x6e, 0xd9, 0xab, 0x79, 0x49, 0x2c, 0xc7, 0x8a, 0x9f, 0x04,
+	0x8a, 0x7c, 0x41, 0x0d, 0x56, 0x50, 0x13, 0x5f, 0x7b, 0xb9, 0x69, 0x8b, 0x06, 0x84, 0xf8, 0xfa,
+	0xb4, 0xf7, 0x66, 0xf4, 0x13, 0xc5, 0xc3, 0x1c, 0x2b, 0xf6, 0x6f, 0xf3, 0xd1, 0xd5, 0xf1, 0xb2,
+	0x49, 0xdb, 0x69, 0x12, 0xbd, 0xbd, 0xec, 0x7d, 0x06, 0x67, 0xda, 0x1a, 0x86, 0xb5, 0xe1, 0x06,
+	0xec, 0xae, 0x31, 0x3f, 0xdc, 0xfa, 0xc7, 0x47, 0x3c, 0x07, 0xf5, 0xd9, 0x39, 0x1b, 0x2b, 0xf5,
+	0xd5, 0x19, 0x8c, 0x5d, 0xa4, 0x2a, 0x88, 0x39, 0xd9, 0xaa, 0x44, 0xb0, 0xa9, 0x27, 0xbf, 0x3d,
+	0x93, 0xaa, 0x82, 0xd2, 0xc0, 0xa4, 0x89, 0x48, 0x03, 0xb3, 0xed, 0x0c, 0xdd, 0x40, 0x4a, 0x55,
+	0x90, 0x94, 0x81, 0x92, 0x32, 0x11, 0x52, 0x06, 0xee, 0xfd, 0x7c, 0x77, 0xac, 0xf8, 0x0d, 0x00,
+	0x00, 0xff, 0xff, 0xb4, 0x84, 0xe5, 0x40, 0x34, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/asset.pb.go b/googleapis/ads/googleads/v3/resources/asset.pb.go
new file mode 100644
index 0000000..f6803a3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/asset.pb.go
@@ -0,0 +1,226 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/asset.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Asset is a part of an ad which can be shared across multiple ads.
+// It can be an image (ImageAsset), a video (YoutubeVideoAsset), etc.
+type Asset struct {
+	// The resource name of the asset.
+	// Asset resource names have the form:
+	//
+	// `customers/{customer_id}/assets/{asset_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the asset.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// Optional name of the asset.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// Type of the asset.
+	Type enums.AssetTypeEnum_AssetType `protobuf:"varint,4,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.AssetTypeEnum_AssetType" json:"type,omitempty"`
+	// The specific type of the asset.
+	//
+	// Types that are valid to be assigned to AssetData:
+	//	*Asset_YoutubeVideoAsset
+	//	*Asset_MediaBundleAsset
+	//	*Asset_ImageAsset
+	//	*Asset_TextAsset
+	AssetData            isAsset_AssetData `protobuf_oneof:"asset_data"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *Asset) Reset()         { *m = Asset{} }
+func (m *Asset) String() string { return proto.CompactTextString(m) }
+func (*Asset) ProtoMessage()    {}
+func (*Asset) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8cc8f6a72ea26cf4, []int{0}
+}
+
+func (m *Asset) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Asset.Unmarshal(m, b)
+}
+func (m *Asset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Asset.Marshal(b, m, deterministic)
+}
+func (m *Asset) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Asset.Merge(m, src)
+}
+func (m *Asset) XXX_Size() int {
+	return xxx_messageInfo_Asset.Size(m)
+}
+func (m *Asset) XXX_DiscardUnknown() {
+	xxx_messageInfo_Asset.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Asset proto.InternalMessageInfo
+
+func (m *Asset) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *Asset) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Asset) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *Asset) GetType() enums.AssetTypeEnum_AssetType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.AssetTypeEnum_UNSPECIFIED
+}
+
+type isAsset_AssetData interface {
+	isAsset_AssetData()
+}
+
+type Asset_YoutubeVideoAsset struct {
+	YoutubeVideoAsset *common.YoutubeVideoAsset `protobuf:"bytes,5,opt,name=youtube_video_asset,json=youtubeVideoAsset,proto3,oneof"`
+}
+
+type Asset_MediaBundleAsset struct {
+	MediaBundleAsset *common.MediaBundleAsset `protobuf:"bytes,6,opt,name=media_bundle_asset,json=mediaBundleAsset,proto3,oneof"`
+}
+
+type Asset_ImageAsset struct {
+	ImageAsset *common.ImageAsset `protobuf:"bytes,7,opt,name=image_asset,json=imageAsset,proto3,oneof"`
+}
+
+type Asset_TextAsset struct {
+	TextAsset *common.TextAsset `protobuf:"bytes,8,opt,name=text_asset,json=textAsset,proto3,oneof"`
+}
+
+func (*Asset_YoutubeVideoAsset) isAsset_AssetData() {}
+
+func (*Asset_MediaBundleAsset) isAsset_AssetData() {}
+
+func (*Asset_ImageAsset) isAsset_AssetData() {}
+
+func (*Asset_TextAsset) isAsset_AssetData() {}
+
+func (m *Asset) GetAssetData() isAsset_AssetData {
+	if m != nil {
+		return m.AssetData
+	}
+	return nil
+}
+
+func (m *Asset) GetYoutubeVideoAsset() *common.YoutubeVideoAsset {
+	if x, ok := m.GetAssetData().(*Asset_YoutubeVideoAsset); ok {
+		return x.YoutubeVideoAsset
+	}
+	return nil
+}
+
+func (m *Asset) GetMediaBundleAsset() *common.MediaBundleAsset {
+	if x, ok := m.GetAssetData().(*Asset_MediaBundleAsset); ok {
+		return x.MediaBundleAsset
+	}
+	return nil
+}
+
+func (m *Asset) GetImageAsset() *common.ImageAsset {
+	if x, ok := m.GetAssetData().(*Asset_ImageAsset); ok {
+		return x.ImageAsset
+	}
+	return nil
+}
+
+func (m *Asset) GetTextAsset() *common.TextAsset {
+	if x, ok := m.GetAssetData().(*Asset_TextAsset); ok {
+		return x.TextAsset
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Asset) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Asset_YoutubeVideoAsset)(nil),
+		(*Asset_MediaBundleAsset)(nil),
+		(*Asset_ImageAsset)(nil),
+		(*Asset_TextAsset)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*Asset)(nil), "google.ads.googleads.v3.resources.Asset")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/asset.proto", fileDescriptor_8cc8f6a72ea26cf4)
+}
+
+var fileDescriptor_8cc8f6a72ea26cf4 = []byte{
+	// 552 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xdf, 0x6e, 0xd3, 0x30,
+	0x14, 0xc6, 0x49, 0xd6, 0x0e, 0xe6, 0x0d, 0x04, 0xe1, 0xa6, 0x8c, 0x69, 0xea, 0x40, 0x93, 0x0a,
+	0x08, 0xa7, 0x2c, 0x68, 0x17, 0xe1, 0x2a, 0x95, 0xa6, 0x6d, 0x95, 0x86, 0xa6, 0x32, 0x55, 0x02,
+	0x55, 0x2a, 0x6e, 0x6c, 0x22, 0x4b, 0xb5, 0x1d, 0xc5, 0x4e, 0x59, 0x35, 0xed, 0x21, 0x78, 0x05,
+	0x2e, 0x79, 0x14, 0x1e, 0x65, 0x2f, 0xc0, 0x2d, 0x8a, 0xff, 0xa4, 0xd3, 0x50, 0xe9, 0x55, 0x8f,
+	0xed, 0xef, 0xfb, 0x7d, 0x27, 0xee, 0x31, 0x78, 0x9b, 0x09, 0x91, 0x4d, 0x49, 0x88, 0xb0, 0x0c,
+	0x4d, 0x59, 0x55, 0xb3, 0x28, 0x2c, 0x88, 0x14, 0x65, 0x91, 0x12, 0x19, 0x22, 0x29, 0x89, 0x82,
+	0x79, 0x21, 0x94, 0x08, 0xf6, 0x8c, 0x06, 0x22, 0x2c, 0x61, 0x2d, 0x87, 0xb3, 0x08, 0xd6, 0xf2,
+	0xed, 0xee, 0x32, 0x62, 0x2a, 0x18, 0x13, 0xdc, 0xe0, 0xc6, 0x6a, 0x9e, 0x13, 0x69, 0xa0, 0xdb,
+	0x70, 0x99, 0x83, 0xf0, 0x92, 0xc9, 0x5b, 0x06, 0xab, 0x7f, 0xe6, 0xf4, 0x39, 0xad, 0xdb, 0xb4,
+	0x47, 0xbb, 0xf6, 0x48, 0xaf, 0x26, 0xe5, 0xb7, 0xf0, 0x7b, 0x81, 0xf2, 0x9c, 0x14, 0x2e, 0x6a,
+	0xe7, 0x96, 0x15, 0x71, 0x2e, 0x14, 0x52, 0x54, 0x70, 0x7b, 0xfa, 0xe2, 0x47, 0x13, 0x34, 0x93,
+	0x2a, 0x2d, 0x78, 0x09, 0x1e, 0x3a, 0xf2, 0x98, 0x23, 0x46, 0x5a, 0x5e, 0xdb, 0xeb, 0x6c, 0x0c,
+	0xb6, 0xdc, 0xe6, 0x47, 0xc4, 0x48, 0xf0, 0x06, 0xf8, 0x14, 0xb7, 0xfc, 0xb6, 0xd7, 0xd9, 0x3c,
+	0x78, 0x6e, 0x3f, 0x02, 0xba, 0x64, 0x78, 0xca, 0xd5, 0xe1, 0xfb, 0x21, 0x9a, 0x96, 0x64, 0xe0,
+	0x53, 0x1c, 0x74, 0x41, 0x43, 0x83, 0xd6, 0xb4, 0x7c, 0xe7, 0x1f, 0xf9, 0x27, 0x55, 0x50, 0x9e,
+	0x19, 0xbd, 0x56, 0x06, 0x7d, 0xd0, 0xa8, 0x3e, 0xba, 0xd5, 0x68, 0x7b, 0x9d, 0x47, 0x07, 0x87,
+	0x70, 0xd9, 0xd5, 0xeb, 0x5b, 0x82, 0xba, 0xef, 0x8b, 0x79, 0x4e, 0x8e, 0x78, 0xc9, 0x16, 0xab,
+	0x81, 0x66, 0x04, 0x29, 0x78, 0x3a, 0x17, 0xa5, 0x2a, 0x27, 0x64, 0x3c, 0xa3, 0x98, 0x88, 0xb1,
+	0xbe, 0xd4, 0x56, 0x53, 0x37, 0xf3, 0x6e, 0x29, 0xda, 0xfc, 0x65, 0xf0, 0xb3, 0xb1, 0x0e, 0x2b,
+	0xa7, 0x26, 0x9f, 0xdc, 0x1b, 0x3c, 0x99, 0xdf, 0xdd, 0x0c, 0xbe, 0x82, 0x80, 0x11, 0x4c, 0xd1,
+	0x78, 0x52, 0x72, 0x3c, 0x25, 0x36, 0x63, 0x5d, 0x67, 0x74, 0x57, 0x65, 0x9c, 0x55, 0xce, 0x9e,
+	0x36, 0xba, 0x88, 0xc7, 0xec, 0xce, 0x5e, 0x70, 0x06, 0x36, 0x29, 0x43, 0x99, 0x43, 0xdf, 0xd7,
+	0xe8, 0xd7, 0xab, 0xd0, 0xa7, 0x95, 0xc5, 0x41, 0x01, 0xad, 0x57, 0x41, 0x1f, 0x00, 0x45, 0x2e,
+	0x95, 0xa5, 0x3d, 0xd0, 0xb4, 0x57, 0xab, 0x68, 0x17, 0xe4, 0x52, 0x39, 0xd8, 0x86, 0x72, 0x8b,
+	0xf8, 0xe4, 0x26, 0x39, 0x02, 0xbb, 0x0b, 0x83, 0xad, 0x72, 0x2a, 0x2b, 0x63, 0x68, 0xc7, 0x2a,
+	0x2d, 0xa5, 0x12, 0x8c, 0x14, 0x32, 0xbc, 0x72, 0xe5, 0xb5, 0x19, 0x70, 0x19, 0x5e, 0xe9, 0xdf,
+	0xeb, 0xde, 0x16, 0x00, 0x66, 0xe4, 0x31, 0x52, 0xa8, 0xf7, 0xc7, 0x03, 0xfb, 0xa9, 0x60, 0x70,
+	0xe5, 0xc3, 0xeb, 0x01, 0x9d, 0x71, 0x5e, 0x0d, 0xd4, 0xb9, 0xf7, 0xa5, 0x6f, 0x0d, 0x99, 0x98,
+	0x22, 0x9e, 0x41, 0x51, 0x64, 0x61, 0x46, 0xb8, 0x1e, 0xb7, 0x70, 0xd1, 0xdb, 0x7f, 0xde, 0xfd,
+	0x87, 0xba, 0xfa, 0xe9, 0xaf, 0x1d, 0x27, 0xc9, 0x2f, 0x7f, 0xef, 0xd8, 0x20, 0x13, 0x2c, 0xa1,
+	0x29, 0xab, 0x6a, 0x18, 0xc1, 0x81, 0x53, 0xfe, 0x76, 0x9a, 0x51, 0x82, 0xe5, 0xa8, 0xd6, 0x8c,
+	0x86, 0xd1, 0xa8, 0xd6, 0xdc, 0xf8, 0xfb, 0xe6, 0x20, 0x8e, 0x13, 0x2c, 0xe3, 0xb8, 0x56, 0xc5,
+	0xf1, 0x30, 0x8a, 0xe3, 0x5a, 0x37, 0x59, 0xd7, 0xcd, 0x46, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff,
+	0xbd, 0xe2, 0xeb, 0xa7, 0xa3, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/bidding_strategy.pb.go b/googleapis/ads/googleads/v3/resources/bidding_strategy.pb.go
new file mode 100644
index 0000000..bc58208
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/bidding_strategy.pb.go
@@ -0,0 +1,290 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/bidding_strategy.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A bidding strategy.
+type BiddingStrategy struct {
+	// The resource name of the bidding strategy.
+	// Bidding strategy resource names have the form:
+	//
+	// `customers/{customer_id}/biddingStrategies/{bidding_strategy_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the bidding strategy.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the bidding strategy.
+	// All bidding strategies within an account must be named distinctly.
+	//
+	// The length of this string should be between 1 and 255, inclusive,
+	// in UTF-8 bytes, (trimmed).
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The status of the bidding strategy.
+	//
+	// This field is read-only.
+	Status enums.BiddingStrategyStatusEnum_BiddingStrategyStatus `protobuf:"varint,15,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.BiddingStrategyStatusEnum_BiddingStrategyStatus" json:"status,omitempty"`
+	// The type of the bidding strategy.
+	// Create a bidding strategy by setting the bidding scheme.
+	//
+	// This field is read-only.
+	Type enums.BiddingStrategyTypeEnum_BiddingStrategyType `protobuf:"varint,5,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.BiddingStrategyTypeEnum_BiddingStrategyType" json:"type,omitempty"`
+	// The number of campaigns attached to this bidding strategy.
+	//
+	// This field is read-only.
+	CampaignCount *wrappers.Int64Value `protobuf:"bytes,13,opt,name=campaign_count,json=campaignCount,proto3" json:"campaign_count,omitempty"`
+	// The number of non-removed campaigns attached to this bidding strategy.
+	//
+	// This field is read-only.
+	NonRemovedCampaignCount *wrappers.Int64Value `protobuf:"bytes,14,opt,name=non_removed_campaign_count,json=nonRemovedCampaignCount,proto3" json:"non_removed_campaign_count,omitempty"`
+	// The bidding scheme.
+	//
+	// Only one can be set.
+	//
+	// Types that are valid to be assigned to Scheme:
+	//	*BiddingStrategy_EnhancedCpc
+	//	*BiddingStrategy_TargetCpa
+	//	*BiddingStrategy_TargetImpressionShare
+	//	*BiddingStrategy_TargetRoas
+	//	*BiddingStrategy_TargetSpend
+	Scheme               isBiddingStrategy_Scheme `protobuf_oneof:"scheme"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *BiddingStrategy) Reset()         { *m = BiddingStrategy{} }
+func (m *BiddingStrategy) String() string { return proto.CompactTextString(m) }
+func (*BiddingStrategy) ProtoMessage()    {}
+func (*BiddingStrategy) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ac3d020c2b1960dc, []int{0}
+}
+
+func (m *BiddingStrategy) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BiddingStrategy.Unmarshal(m, b)
+}
+func (m *BiddingStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BiddingStrategy.Marshal(b, m, deterministic)
+}
+func (m *BiddingStrategy) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BiddingStrategy.Merge(m, src)
+}
+func (m *BiddingStrategy) XXX_Size() int {
+	return xxx_messageInfo_BiddingStrategy.Size(m)
+}
+func (m *BiddingStrategy) XXX_DiscardUnknown() {
+	xxx_messageInfo_BiddingStrategy.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BiddingStrategy proto.InternalMessageInfo
+
+func (m *BiddingStrategy) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *BiddingStrategy) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *BiddingStrategy) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *BiddingStrategy) GetStatus() enums.BiddingStrategyStatusEnum_BiddingStrategyStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.BiddingStrategyStatusEnum_UNSPECIFIED
+}
+
+func (m *BiddingStrategy) GetType() enums.BiddingStrategyTypeEnum_BiddingStrategyType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.BiddingStrategyTypeEnum_UNSPECIFIED
+}
+
+func (m *BiddingStrategy) GetCampaignCount() *wrappers.Int64Value {
+	if m != nil {
+		return m.CampaignCount
+	}
+	return nil
+}
+
+func (m *BiddingStrategy) GetNonRemovedCampaignCount() *wrappers.Int64Value {
+	if m != nil {
+		return m.NonRemovedCampaignCount
+	}
+	return nil
+}
+
+type isBiddingStrategy_Scheme interface {
+	isBiddingStrategy_Scheme()
+}
+
+type BiddingStrategy_EnhancedCpc struct {
+	EnhancedCpc *common.EnhancedCpc `protobuf:"bytes,7,opt,name=enhanced_cpc,json=enhancedCpc,proto3,oneof"`
+}
+
+type BiddingStrategy_TargetCpa struct {
+	TargetCpa *common.TargetCpa `protobuf:"bytes,9,opt,name=target_cpa,json=targetCpa,proto3,oneof"`
+}
+
+type BiddingStrategy_TargetImpressionShare struct {
+	TargetImpressionShare *common.TargetImpressionShare `protobuf:"bytes,48,opt,name=target_impression_share,json=targetImpressionShare,proto3,oneof"`
+}
+
+type BiddingStrategy_TargetRoas struct {
+	TargetRoas *common.TargetRoas `protobuf:"bytes,11,opt,name=target_roas,json=targetRoas,proto3,oneof"`
+}
+
+type BiddingStrategy_TargetSpend struct {
+	TargetSpend *common.TargetSpend `protobuf:"bytes,12,opt,name=target_spend,json=targetSpend,proto3,oneof"`
+}
+
+func (*BiddingStrategy_EnhancedCpc) isBiddingStrategy_Scheme() {}
+
+func (*BiddingStrategy_TargetCpa) isBiddingStrategy_Scheme() {}
+
+func (*BiddingStrategy_TargetImpressionShare) isBiddingStrategy_Scheme() {}
+
+func (*BiddingStrategy_TargetRoas) isBiddingStrategy_Scheme() {}
+
+func (*BiddingStrategy_TargetSpend) isBiddingStrategy_Scheme() {}
+
+func (m *BiddingStrategy) GetScheme() isBiddingStrategy_Scheme {
+	if m != nil {
+		return m.Scheme
+	}
+	return nil
+}
+
+func (m *BiddingStrategy) GetEnhancedCpc() *common.EnhancedCpc {
+	if x, ok := m.GetScheme().(*BiddingStrategy_EnhancedCpc); ok {
+		return x.EnhancedCpc
+	}
+	return nil
+}
+
+func (m *BiddingStrategy) GetTargetCpa() *common.TargetCpa {
+	if x, ok := m.GetScheme().(*BiddingStrategy_TargetCpa); ok {
+		return x.TargetCpa
+	}
+	return nil
+}
+
+func (m *BiddingStrategy) GetTargetImpressionShare() *common.TargetImpressionShare {
+	if x, ok := m.GetScheme().(*BiddingStrategy_TargetImpressionShare); ok {
+		return x.TargetImpressionShare
+	}
+	return nil
+}
+
+func (m *BiddingStrategy) GetTargetRoas() *common.TargetRoas {
+	if x, ok := m.GetScheme().(*BiddingStrategy_TargetRoas); ok {
+		return x.TargetRoas
+	}
+	return nil
+}
+
+func (m *BiddingStrategy) GetTargetSpend() *common.TargetSpend {
+	if x, ok := m.GetScheme().(*BiddingStrategy_TargetSpend); ok {
+		return x.TargetSpend
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*BiddingStrategy) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*BiddingStrategy_EnhancedCpc)(nil),
+		(*BiddingStrategy_TargetCpa)(nil),
+		(*BiddingStrategy_TargetImpressionShare)(nil),
+		(*BiddingStrategy_TargetRoas)(nil),
+		(*BiddingStrategy_TargetSpend)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*BiddingStrategy)(nil), "google.ads.googleads.v3.resources.BiddingStrategy")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/bidding_strategy.proto", fileDescriptor_ac3d020c2b1960dc)
+}
+
+var fileDescriptor_ac3d020c2b1960dc = []byte{
+	// 676 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xdf, 0x4e, 0xdb, 0x30,
+	0x14, 0xc6, 0xdb, 0xc2, 0x18, 0xb8, 0xfc, 0x91, 0xa2, 0x4d, 0x64, 0x0c, 0x4d, 0xb0, 0x09, 0xa9,
+	0x1b, 0x93, 0x83, 0xe8, 0x36, 0x8d, 0x70, 0x95, 0x56, 0x88, 0x82, 0x34, 0x84, 0x52, 0x54, 0x4d,
+	0x53, 0xb5, 0xc8, 0x24, 0x26, 0x8d, 0x44, 0x6c, 0xcb, 0x76, 0x98, 0x10, 0xe2, 0x62, 0x4f, 0x32,
+	0x69, 0x97, 0x7b, 0x94, 0x3d, 0x0a, 0x4f, 0x31, 0xd9, 0x71, 0xd2, 0xad, 0xd0, 0x15, 0xee, 0x8e,
+	0x73, 0xbe, 0xef, 0xf7, 0xd9, 0x27, 0x89, 0xc1, 0xc7, 0x98, 0xd2, 0xf8, 0x1c, 0x3b, 0x28, 0x12,
+	0x4e, 0x5e, 0xaa, 0xea, 0xa2, 0xe9, 0x70, 0x2c, 0x68, 0xc6, 0x43, 0x2c, 0x9c, 0xd3, 0x24, 0x8a,
+	0x12, 0x12, 0x07, 0x42, 0x72, 0x24, 0x71, 0x7c, 0x09, 0x19, 0xa7, 0x92, 0x5a, 0xeb, 0xb9, 0x1c,
+	0xa2, 0x48, 0xc0, 0xd2, 0x09, 0x2f, 0x9a, 0xb0, 0x74, 0xae, 0xbc, 0x1d, 0x07, 0x0f, 0x69, 0x9a,
+	0x52, 0x52, 0x90, 0x73, 0xe0, 0xca, 0xee, 0x38, 0x35, 0x26, 0x59, 0x7a, 0x7b, 0x1b, 0x81, 0x90,
+	0x48, 0x66, 0xc2, 0x98, 0x77, 0x1e, 0x68, 0x96, 0x97, 0x0c, 0x1b, 0xeb, 0xb3, 0xc2, 0xca, 0x92,
+	0xf2, 0xd4, 0xa6, 0xf5, 0xc2, 0xb4, 0xf4, 0xea, 0x34, 0x3b, 0x73, 0xbe, 0x71, 0xc4, 0x18, 0xe6,
+	0x45, 0xea, 0xea, 0x5f, 0x56, 0x44, 0x08, 0x95, 0x48, 0x26, 0x94, 0x98, 0xee, 0xcb, 0x1f, 0xb3,
+	0x60, 0xa9, 0x95, 0x07, 0x77, 0x4d, 0xae, 0xf5, 0x0a, 0x2c, 0x14, 0x19, 0x01, 0x41, 0x29, 0xb6,
+	0xab, 0x6b, 0xd5, 0xc6, 0x9c, 0x3f, 0x5f, 0x3c, 0x3c, 0x42, 0x29, 0xb6, 0x36, 0x41, 0x2d, 0x89,
+	0xec, 0xa9, 0xb5, 0x6a, 0xa3, 0xbe, 0xfd, 0xdc, 0x0c, 0x17, 0x16, 0x7b, 0x80, 0x07, 0x44, 0x7e,
+	0x78, 0xd7, 0x43, 0xe7, 0x19, 0xf6, 0x6b, 0x49, 0x64, 0x6d, 0x81, 0x69, 0x0d, 0x9a, 0xd6, 0xf2,
+	0xd5, 0x5b, 0xf2, 0xae, 0xe4, 0x09, 0x89, 0x73, 0xbd, 0x56, 0x5a, 0x67, 0x60, 0x26, 0x9f, 0x9d,
+	0xbd, 0xb4, 0x56, 0x6d, 0x2c, 0x6e, 0x1f, 0xc1, 0x71, 0xaf, 0x52, 0x0f, 0x0f, 0x8e, 0x9c, 0xa1,
+	0xab, 0xbd, 0x7b, 0x24, 0x4b, 0xef, 0xee, 0xf8, 0x86, 0x6e, 0x7d, 0x05, 0xd3, 0x6a, 0xcc, 0xf6,
+	0x23, 0x9d, 0x72, 0xf8, 0xb0, 0x94, 0x93, 0x4b, 0x86, 0xef, 0xca, 0x50, 0xcf, 0x7d, 0xcd, 0xb5,
+	0x5a, 0x60, 0x31, 0x44, 0x29, 0x43, 0x49, 0x4c, 0x82, 0x90, 0x66, 0x44, 0xda, 0x0b, 0x93, 0x47,
+	0xb6, 0x50, 0x58, 0xda, 0xca, 0x61, 0x7d, 0x06, 0x2b, 0x84, 0x92, 0x80, 0xe3, 0x94, 0x5e, 0xe0,
+	0x28, 0x18, 0xe1, 0x2d, 0x4e, 0xe6, 0x2d, 0x13, 0x4a, 0xfc, 0xdc, 0xdd, 0xfe, 0x87, 0x7c, 0x0c,
+	0xe6, 0x31, 0x19, 0x20, 0x12, 0x2a, 0x2c, 0x0b, 0xed, 0xc7, 0x9a, 0xb5, 0x39, 0x76, 0x0a, 0xf9,
+	0x3f, 0x01, 0xf7, 0x8c, 0xa7, 0xcd, 0xc2, 0x4e, 0xc5, 0xaf, 0xe3, 0xe1, 0xd2, 0x3a, 0x04, 0x40,
+	0x22, 0x1e, 0x63, 0x19, 0x84, 0x0c, 0xd9, 0x73, 0x9a, 0xf7, 0x7a, 0x12, 0xef, 0x44, 0x3b, 0xda,
+	0x0c, 0x75, 0x2a, 0xfe, 0x9c, 0x2c, 0x16, 0x16, 0x05, 0xcb, 0x86, 0x95, 0xa4, 0x8c, 0x63, 0x21,
+	0x12, 0x4a, 0x02, 0x31, 0x40, 0x1c, 0xdb, 0x5b, 0x1a, 0xfc, 0xfe, 0x7e, 0xe0, 0x83, 0xd2, 0xdd,
+	0x55, 0xe6, 0x4e, 0xc5, 0x7f, 0x2a, 0xef, 0x6a, 0x58, 0x9f, 0x40, 0xdd, 0x04, 0x72, 0x8a, 0x84,
+	0x5d, 0xd7, 0x21, 0x6f, 0xee, 0x17, 0xe2, 0x53, 0x24, 0x3a, 0x15, 0xdf, 0x9c, 0x5e, 0xad, 0xd4,
+	0x74, 0x0d, 0x4e, 0x30, 0x4c, 0x22, 0x7b, 0xfe, 0x7e, 0xd3, 0xcd, 0x79, 0x5d, 0x65, 0x51, 0xd3,
+	0x95, 0xc3, 0xa5, 0x3b, 0xb8, 0xf1, 0x30, 0x68, 0x0c, 0x4d, 0xa6, 0x62, 0x89, 0x50, 0x66, 0x67,
+	0xf4, 0x47, 0xde, 0x09, 0x33, 0x21, 0x69, 0x8a, 0xb9, 0x70, 0xae, 0x8a, 0xf2, 0xba, 0xb8, 0x67,
+	0x8c, 0x2a, 0xc1, 0xc2, 0xb9, 0x1a, 0xbd, 0x7a, 0xae, 0x5b, 0xb3, 0x60, 0x46, 0x84, 0x03, 0x9c,
+	0xe2, 0xd6, 0xf7, 0x1a, 0xd8, 0x08, 0x69, 0x0a, 0x27, 0x5e, 0xa5, 0xad, 0x27, 0x23, 0xf9, 0xc7,
+	0xea, 0x53, 0x3c, 0xae, 0x7e, 0x39, 0x34, 0xd6, 0x98, 0x9e, 0x23, 0x12, 0x43, 0xca, 0x63, 0x27,
+	0xc6, 0x44, 0x7f, 0xa8, 0xce, 0xf0, 0x04, 0xff, 0xb9, 0xde, 0x77, 0xcb, 0xea, 0x67, 0x6d, 0x6a,
+	0xdf, 0xf3, 0x7e, 0xd5, 0xd6, 0xf7, 0x73, 0xa4, 0x17, 0x09, 0x98, 0x97, 0xaa, 0xea, 0x35, 0xa1,
+	0x5f, 0x28, 0x7f, 0x17, 0x9a, 0xbe, 0x17, 0x89, 0x7e, 0xa9, 0xe9, 0xf7, 0x9a, 0xfd, 0x52, 0x73,
+	0x53, 0xdb, 0xc8, 0x1b, 0xae, 0xeb, 0x45, 0xc2, 0x75, 0x4b, 0x95, 0xeb, 0xf6, 0x9a, 0xae, 0x5b,
+	0xea, 0x4e, 0x67, 0xf4, 0x66, 0x9b, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x1b, 0x9e, 0x85, 0x4c,
+	0x8a, 0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/billing_setup.pb.go b/googleapis/ads/googleads/v3/resources/billing_setup.pb.go
new file mode 100644
index 0000000..349eab1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/billing_setup.pb.go
@@ -0,0 +1,365 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/billing_setup.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A billing setup, which associates a payments account and an advertiser. A
+// billing setup is specific to one advertiser.
+type BillingSetup struct {
+	// The resource name of the billing setup.
+	// BillingSetup resource names have the form:
+	//
+	// `customers/{customer_id}/billingSetups/{billing_setup_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the billing setup.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The status of the billing setup.
+	Status enums.BillingSetupStatusEnum_BillingSetupStatus `protobuf:"varint,3,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.BillingSetupStatusEnum_BillingSetupStatus" json:"status,omitempty"`
+	// The resource name of the payments account associated with this billing
+	// setup. Payments resource names have the form:
+	//
+	// `customers/{customer_id}/paymentsAccounts/{payments_account_id}`
+	// When setting up billing, this is used to signup with an existing payments
+	// account (and then payments_account_info should not be set).
+	// When getting a billing setup, this and payments_account_info will be
+	// populated.
+	PaymentsAccount *wrappers.StringValue `protobuf:"bytes,11,opt,name=payments_account,json=paymentsAccount,proto3" json:"payments_account,omitempty"`
+	// The payments account information associated with this billing setup.
+	// When setting up billing, this is used to signup with a new payments account
+	// (and then payments_account should not be set).
+	// When getting a billing setup, this and payments_account will be
+	// populated.
+	PaymentsAccountInfo *BillingSetup_PaymentsAccountInfo `protobuf:"bytes,12,opt,name=payments_account_info,json=paymentsAccountInfo,proto3" json:"payments_account_info,omitempty"`
+	// When creating a new billing setup, this is when the setup should take
+	// effect. NOW is the only acceptable start time if the customer doesn't have
+	// any approved setups.
+	//
+	// When fetching an existing billing setup, this is the requested start time.
+	// However, if the setup was approved (see status) after the requested start
+	// time, then this is the approval time.
+	//
+	// Types that are valid to be assigned to StartTime:
+	//	*BillingSetup_StartDateTime
+	//	*BillingSetup_StartTimeType
+	StartTime isBillingSetup_StartTime `protobuf_oneof:"start_time"`
+	// When the billing setup ends / ended. This is either FOREVER or the start
+	// time of the next scheduled billing setup.
+	//
+	// Types that are valid to be assigned to EndTime:
+	//	*BillingSetup_EndDateTime
+	//	*BillingSetup_EndTimeType
+	EndTime              isBillingSetup_EndTime `protobuf_oneof:"end_time"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *BillingSetup) Reset()         { *m = BillingSetup{} }
+func (m *BillingSetup) String() string { return proto.CompactTextString(m) }
+func (*BillingSetup) ProtoMessage()    {}
+func (*BillingSetup) Descriptor() ([]byte, []int) {
+	return fileDescriptor_979051338dc39b64, []int{0}
+}
+
+func (m *BillingSetup) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BillingSetup.Unmarshal(m, b)
+}
+func (m *BillingSetup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BillingSetup.Marshal(b, m, deterministic)
+}
+func (m *BillingSetup) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BillingSetup.Merge(m, src)
+}
+func (m *BillingSetup) XXX_Size() int {
+	return xxx_messageInfo_BillingSetup.Size(m)
+}
+func (m *BillingSetup) XXX_DiscardUnknown() {
+	xxx_messageInfo_BillingSetup.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BillingSetup proto.InternalMessageInfo
+
+func (m *BillingSetup) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *BillingSetup) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *BillingSetup) GetStatus() enums.BillingSetupStatusEnum_BillingSetupStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.BillingSetupStatusEnum_UNSPECIFIED
+}
+
+func (m *BillingSetup) GetPaymentsAccount() *wrappers.StringValue {
+	if m != nil {
+		return m.PaymentsAccount
+	}
+	return nil
+}
+
+func (m *BillingSetup) GetPaymentsAccountInfo() *BillingSetup_PaymentsAccountInfo {
+	if m != nil {
+		return m.PaymentsAccountInfo
+	}
+	return nil
+}
+
+type isBillingSetup_StartTime interface {
+	isBillingSetup_StartTime()
+}
+
+type BillingSetup_StartDateTime struct {
+	StartDateTime *wrappers.StringValue `protobuf:"bytes,9,opt,name=start_date_time,json=startDateTime,proto3,oneof"`
+}
+
+type BillingSetup_StartTimeType struct {
+	StartTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,10,opt,name=start_time_type,json=startTimeType,proto3,enum=google.ads.googleads.v3.enums.TimeTypeEnum_TimeType,oneof"`
+}
+
+func (*BillingSetup_StartDateTime) isBillingSetup_StartTime() {}
+
+func (*BillingSetup_StartTimeType) isBillingSetup_StartTime() {}
+
+func (m *BillingSetup) GetStartTime() isBillingSetup_StartTime {
+	if m != nil {
+		return m.StartTime
+	}
+	return nil
+}
+
+func (m *BillingSetup) GetStartDateTime() *wrappers.StringValue {
+	if x, ok := m.GetStartTime().(*BillingSetup_StartDateTime); ok {
+		return x.StartDateTime
+	}
+	return nil
+}
+
+func (m *BillingSetup) GetStartTimeType() enums.TimeTypeEnum_TimeType {
+	if x, ok := m.GetStartTime().(*BillingSetup_StartTimeType); ok {
+		return x.StartTimeType
+	}
+	return enums.TimeTypeEnum_UNSPECIFIED
+}
+
+type isBillingSetup_EndTime interface {
+	isBillingSetup_EndTime()
+}
+
+type BillingSetup_EndDateTime struct {
+	EndDateTime *wrappers.StringValue `protobuf:"bytes,13,opt,name=end_date_time,json=endDateTime,proto3,oneof"`
+}
+
+type BillingSetup_EndTimeType struct {
+	EndTimeType enums.TimeTypeEnum_TimeType `protobuf:"varint,14,opt,name=end_time_type,json=endTimeType,proto3,enum=google.ads.googleads.v3.enums.TimeTypeEnum_TimeType,oneof"`
+}
+
+func (*BillingSetup_EndDateTime) isBillingSetup_EndTime() {}
+
+func (*BillingSetup_EndTimeType) isBillingSetup_EndTime() {}
+
+func (m *BillingSetup) GetEndTime() isBillingSetup_EndTime {
+	if m != nil {
+		return m.EndTime
+	}
+	return nil
+}
+
+func (m *BillingSetup) GetEndDateTime() *wrappers.StringValue {
+	if x, ok := m.GetEndTime().(*BillingSetup_EndDateTime); ok {
+		return x.EndDateTime
+	}
+	return nil
+}
+
+func (m *BillingSetup) GetEndTimeType() enums.TimeTypeEnum_TimeType {
+	if x, ok := m.GetEndTime().(*BillingSetup_EndTimeType); ok {
+		return x.EndTimeType
+	}
+	return enums.TimeTypeEnum_UNSPECIFIED
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*BillingSetup) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*BillingSetup_StartDateTime)(nil),
+		(*BillingSetup_StartTimeType)(nil),
+		(*BillingSetup_EndDateTime)(nil),
+		(*BillingSetup_EndTimeType)(nil),
+	}
+}
+
+// Container of payments account information for this billing.
+type BillingSetup_PaymentsAccountInfo struct {
+	// A 16 digit id used to identify the payments account associated with the
+	// billing setup.
+	//
+	// This must be passed as a string with dashes, e.g. "1234-5678-9012-3456".
+	PaymentsAccountId *wrappers.StringValue `protobuf:"bytes,1,opt,name=payments_account_id,json=paymentsAccountId,proto3" json:"payments_account_id,omitempty"`
+	// The name of the payments account associated with the billing setup.
+	//
+	// This enables the user to specify a meaningful name for a payments account
+	// to aid in reconciling monthly invoices.
+	//
+	// This name will be printed in the monthly invoices.
+	PaymentsAccountName *wrappers.StringValue `protobuf:"bytes,2,opt,name=payments_account_name,json=paymentsAccountName,proto3" json:"payments_account_name,omitempty"`
+	// A 12 digit id used to identify the payments profile associated with the
+	// billing setup.
+	//
+	// This must be passed in as a string with dashes, e.g. "1234-5678-9012".
+	PaymentsProfileId *wrappers.StringValue `protobuf:"bytes,3,opt,name=payments_profile_id,json=paymentsProfileId,proto3" json:"payments_profile_id,omitempty"`
+	// The name of the payments profile associated with the billing setup.
+	PaymentsProfileName *wrappers.StringValue `protobuf:"bytes,4,opt,name=payments_profile_name,json=paymentsProfileName,proto3" json:"payments_profile_name,omitempty"`
+	// A secondary payments profile id present in uncommon situations, e.g.
+	// when a sequential liability agreement has been arranged.
+	SecondaryPaymentsProfileId *wrappers.StringValue `protobuf:"bytes,5,opt,name=secondary_payments_profile_id,json=secondaryPaymentsProfileId,proto3" json:"secondary_payments_profile_id,omitempty"`
+	XXX_NoUnkeyedLiteral       struct{}              `json:"-"`
+	XXX_unrecognized           []byte                `json:"-"`
+	XXX_sizecache              int32                 `json:"-"`
+}
+
+func (m *BillingSetup_PaymentsAccountInfo) Reset()         { *m = BillingSetup_PaymentsAccountInfo{} }
+func (m *BillingSetup_PaymentsAccountInfo) String() string { return proto.CompactTextString(m) }
+func (*BillingSetup_PaymentsAccountInfo) ProtoMessage()    {}
+func (*BillingSetup_PaymentsAccountInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_979051338dc39b64, []int{0, 0}
+}
+
+func (m *BillingSetup_PaymentsAccountInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BillingSetup_PaymentsAccountInfo.Unmarshal(m, b)
+}
+func (m *BillingSetup_PaymentsAccountInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BillingSetup_PaymentsAccountInfo.Marshal(b, m, deterministic)
+}
+func (m *BillingSetup_PaymentsAccountInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BillingSetup_PaymentsAccountInfo.Merge(m, src)
+}
+func (m *BillingSetup_PaymentsAccountInfo) XXX_Size() int {
+	return xxx_messageInfo_BillingSetup_PaymentsAccountInfo.Size(m)
+}
+func (m *BillingSetup_PaymentsAccountInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_BillingSetup_PaymentsAccountInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BillingSetup_PaymentsAccountInfo proto.InternalMessageInfo
+
+func (m *BillingSetup_PaymentsAccountInfo) GetPaymentsAccountId() *wrappers.StringValue {
+	if m != nil {
+		return m.PaymentsAccountId
+	}
+	return nil
+}
+
+func (m *BillingSetup_PaymentsAccountInfo) GetPaymentsAccountName() *wrappers.StringValue {
+	if m != nil {
+		return m.PaymentsAccountName
+	}
+	return nil
+}
+
+func (m *BillingSetup_PaymentsAccountInfo) GetPaymentsProfileId() *wrappers.StringValue {
+	if m != nil {
+		return m.PaymentsProfileId
+	}
+	return nil
+}
+
+func (m *BillingSetup_PaymentsAccountInfo) GetPaymentsProfileName() *wrappers.StringValue {
+	if m != nil {
+		return m.PaymentsProfileName
+	}
+	return nil
+}
+
+func (m *BillingSetup_PaymentsAccountInfo) GetSecondaryPaymentsProfileId() *wrappers.StringValue {
+	if m != nil {
+		return m.SecondaryPaymentsProfileId
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*BillingSetup)(nil), "google.ads.googleads.v3.resources.BillingSetup")
+	proto.RegisterType((*BillingSetup_PaymentsAccountInfo)(nil), "google.ads.googleads.v3.resources.BillingSetup.PaymentsAccountInfo")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/billing_setup.proto", fileDescriptor_979051338dc39b64)
+}
+
+var fileDescriptor_979051338dc39b64 = []byte{
+	// 681 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xed, 0x4e, 0xdb, 0x3a,
+	0x18, 0xc7, 0x4f, 0xd2, 0x73, 0xd0, 0xc1, 0xb4, 0x70, 0x08, 0x3a, 0x52, 0xd6, 0xb1, 0x09, 0x36,
+	0x21, 0x21, 0x4d, 0x73, 0x24, 0xca, 0xa6, 0x29, 0xfb, 0x94, 0xee, 0x05, 0x98, 0xa6, 0xa9, 0x0a,
+	0xa8, 0x1f, 0x58, 0x45, 0x66, 0x62, 0x37, 0x8a, 0xd4, 0xd8, 0x51, 0xec, 0x80, 0x2a, 0xc4, 0xcd,
+	0xec, 0xe3, 0x2e, 0x60, 0x17, 0xb1, 0x4b, 0xe1, 0x22, 0xb6, 0x29, 0x76, 0x9c, 0xbe, 0x50, 0x28,
+	0x68, 0xdf, 0x9e, 0xd8, 0xcf, 0xff, 0xdf, 0xdf, 0xf3, 0xf8, 0xb1, 0x0b, 0x5e, 0x44, 0x8c, 0x45,
+	0x03, 0xe2, 0x20, 0xcc, 0x1d, 0x15, 0x16, 0xd1, 0x59, 0xcb, 0xc9, 0x08, 0x67, 0x79, 0x16, 0x12,
+	0xee, 0x9c, 0xc6, 0x83, 0x41, 0x4c, 0xa3, 0x80, 0x13, 0x91, 0xa7, 0x30, 0xcd, 0x98, 0x60, 0xd6,
+	0xa6, 0xca, 0x85, 0x08, 0x73, 0x58, 0xc9, 0xe0, 0x59, 0x0b, 0x56, 0xb2, 0xe6, 0xab, 0x9b, 0x9c,
+	0x09, 0xcd, 0x93, 0x29, 0xd7, 0x80, 0x0b, 0x24, 0x72, 0xae, 0xcc, 0x9b, 0xcf, 0x6f, 0x57, 0x8a,
+	0x38, 0x21, 0x81, 0x18, 0xa6, 0xa4, 0x4c, 0x7f, 0xa0, 0xd3, 0xd3, 0xb8, 0xa2, 0x2e, 0xb7, 0x1e,
+	0x97, 0x5b, 0xf2, 0xeb, 0x34, 0xef, 0x3b, 0xe7, 0x19, 0x4a, 0x53, 0x92, 0xe9, 0x5f, 0x5a, 0x1f,
+	0x93, 0x22, 0x4a, 0x99, 0x40, 0x22, 0x66, 0xb4, 0xdc, 0x7d, 0xf2, 0x6b, 0x11, 0xd4, 0xdb, 0x0a,
+	0xf3, 0xb0, 0xa0, 0xb4, 0x9e, 0x82, 0x86, 0xfe, 0x81, 0x80, 0xa2, 0x84, 0xd8, 0xc6, 0x86, 0xb1,
+	0xbd, 0xe8, 0xd7, 0xf5, 0xe2, 0x27, 0x94, 0x10, 0xeb, 0x19, 0x30, 0x63, 0x6c, 0x9b, 0x1b, 0xc6,
+	0xf6, 0xd2, 0xce, 0xc3, 0xb2, 0x39, 0x50, 0x03, 0xc0, 0x03, 0x2a, 0x5e, 0xee, 0x76, 0xd1, 0x20,
+	0x27, 0xbe, 0x19, 0x63, 0xeb, 0x0b, 0x58, 0x50, 0xa5, 0xdb, 0xb5, 0x0d, 0x63, 0x7b, 0x79, 0x67,
+	0x1f, 0xde, 0xd4, 0x58, 0x59, 0x3b, 0x1c, 0xc7, 0x39, 0x94, 0xc2, 0x77, 0x34, 0x4f, 0x66, 0x2c,
+	0xfb, 0xa5, 0xaf, 0xb5, 0x07, 0xfe, 0x4b, 0xd1, 0x30, 0x21, 0x54, 0xf0, 0x00, 0x85, 0x21, 0xcb,
+	0xa9, 0xb0, 0x97, 0x24, 0xdc, 0xfa, 0x35, 0xb8, 0x43, 0x91, 0xc5, 0x34, 0x52, 0x74, 0x2b, 0x5a,
+	0xe5, 0x29, 0x91, 0x75, 0x0e, 0xfe, 0x9f, 0x36, 0x0a, 0x62, 0xda, 0x67, 0x76, 0x5d, 0xba, 0xbd,
+	0x81, 0x73, 0x47, 0x62, 0x02, 0x13, 0x76, 0x26, 0xfd, 0x0f, 0x68, 0x9f, 0xf9, 0x6b, 0xe9, 0xf5,
+	0x45, 0xeb, 0x3d, 0x58, 0xe1, 0x02, 0x65, 0x22, 0xc0, 0x48, 0x90, 0xa0, 0x38, 0x7d, 0x7b, 0x71,
+	0x7e, 0x01, 0xfb, 0x7f, 0xf9, 0x0d, 0x29, 0x7b, 0x8b, 0x04, 0x39, 0x8a, 0x13, 0x62, 0x9d, 0x68,
+	0x9f, 0x6a, 0x80, 0x6c, 0x20, 0x9b, 0xbe, 0x3b, 0xa7, 0xe9, 0x85, 0xfa, 0x68, 0x98, 0x12, 0xd9,
+	0x6a, 0xfd, 0x51, 0xf9, 0xeb, 0x05, 0xab, 0x0d, 0x1a, 0x84, 0xe2, 0x31, 0xca, 0xc6, 0x1d, 0x28,
+	0x0d, 0x7f, 0x89, 0x50, 0x5c, 0x31, 0x1e, 0x2b, 0x8f, 0x11, 0xe1, 0xf2, 0x1f, 0x10, 0x2a, 0x6f,
+	0xfd, 0xd9, 0xfc, 0x5e, 0x03, 0x6b, 0x33, 0x9a, 0x6e, 0x7d, 0x04, 0x6b, 0xd7, 0x0f, 0x16, 0xcb,
+	0xd9, 0x9e, 0x37, 0x24, 0xab, 0xd3, 0xe7, 0x85, 0xad, 0xce, 0x8c, 0x31, 0x91, 0x77, 0xc5, 0xbc,
+	0x83, 0xdf, 0xf4, 0xf9, 0xcb, 0x0b, 0x35, 0xce, 0x97, 0x66, 0xac, 0x1f, 0x0f, 0x48, 0xc1, 0x57,
+	0xbb, 0x0f, 0x5f, 0x47, 0xe9, 0xa6, 0xf8, 0xb4, 0x9b, 0xe4, 0xfb, 0xfb, 0x3e, 0x7c, 0xa5, 0x9f,
+	0xe4, 0x0b, 0xc0, 0x23, 0x4e, 0x42, 0x46, 0x31, 0xca, 0x86, 0xc1, 0x2c, 0xd2, 0x7f, 0xee, 0xe0,
+	0xdc, 0xac, 0x2c, 0x3a, 0xd3, 0xc8, 0xee, 0xc9, 0x95, 0xf7, 0x19, 0x6c, 0x8d, 0x8e, 0xbd, 0x8c,
+	0xd2, 0x98, 0xc3, 0x90, 0x25, 0xce, 0xc4, 0x13, 0xb5, 0x13, 0xe6, 0x5c, 0xb0, 0x84, 0x64, 0xdc,
+	0xb9, 0xd0, 0xe1, 0xa5, 0x7e, 0x6c, 0x65, 0x0a, 0x77, 0x2e, 0x26, 0xde, 0xde, 0xcb, 0x76, 0x1d,
+	0x80, 0xd1, 0xc5, 0x68, 0x03, 0xf0, 0xaf, 0x1e, 0xc1, 0xf6, 0x4f, 0x03, 0x6c, 0x85, 0x2c, 0x99,
+	0x7f, 0xb5, 0xdb, 0xab, 0xe3, 0x14, 0x9d, 0xa2, 0xc2, 0x8e, 0x71, 0xfc, 0xa1, 0xd4, 0x45, 0x6c,
+	0x80, 0x68, 0x04, 0x59, 0x16, 0x39, 0x11, 0xa1, 0xb2, 0x7e, 0x67, 0x54, 0xc4, 0x2d, 0xff, 0x3d,
+	0xaf, 0xab, 0xe8, 0xab, 0x59, 0xdb, 0xf3, 0xbc, 0x6f, 0xe6, 0xe6, 0x9e, 0xb2, 0xf4, 0x30, 0x87,
+	0x2a, 0x2c, 0xa2, 0x6e, 0x0b, 0xfa, 0x3a, 0xf3, 0x87, 0xce, 0xe9, 0x79, 0x98, 0xf7, 0xaa, 0x9c,
+	0x5e, 0xb7, 0xd5, 0xab, 0x72, 0xae, 0xcc, 0x2d, 0xb5, 0xe1, 0xba, 0x1e, 0xe6, 0xae, 0x5b, 0x65,
+	0xb9, 0x6e, 0xb7, 0xe5, 0xba, 0x55, 0xde, 0xe9, 0x82, 0x84, 0x6d, 0xfd, 0x0e, 0x00, 0x00, 0xff,
+	0xff, 0xfa, 0xda, 0xc8, 0xb5, 0x27, 0x07, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign.pb.go b/googleapis/ads/googleads/v3/resources/campaign.pb.go
new file mode 100644
index 0000000..5a123c1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign.pb.go
@@ -0,0 +1,1272 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A campaign.
+type Campaign struct {
+	// The resource name of the campaign.
+	// Campaign resource names have the form:
+	//
+	// `customers/{customer_id}/campaigns/{campaign_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the campaign.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the campaign.
+	//
+	// This field is required and should not be empty when creating new
+	// campaigns.
+	//
+	// It must not contain any null (code point 0x0), NL line feed
+	// (code point 0xA) or carriage return (code point 0xD) characters.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The status of the campaign.
+	//
+	// When a new campaign is added, the status defaults to ENABLED.
+	Status enums.CampaignStatusEnum_CampaignStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.CampaignStatusEnum_CampaignStatus" json:"status,omitempty"`
+	// The ad serving status of the campaign.
+	ServingStatus enums.CampaignServingStatusEnum_CampaignServingStatus `protobuf:"varint,21,opt,name=serving_status,json=servingStatus,proto3,enum=google.ads.googleads.v3.enums.CampaignServingStatusEnum_CampaignServingStatus" json:"serving_status,omitempty"`
+	// The ad serving optimization status of the campaign.
+	AdServingOptimizationStatus enums.AdServingOptimizationStatusEnum_AdServingOptimizationStatus `protobuf:"varint,8,opt,name=ad_serving_optimization_status,json=adServingOptimizationStatus,proto3,enum=google.ads.googleads.v3.enums.AdServingOptimizationStatusEnum_AdServingOptimizationStatus" json:"ad_serving_optimization_status,omitempty"`
+	// The primary serving target for ads within the campaign.
+	// The targeting options can be refined in `network_settings`.
+	//
+	// This field is required and should not be empty when creating new
+	// campaigns.
+	//
+	// Can be set only when creating campaigns.
+	// After the campaign is created, the field can not be changed.
+	AdvertisingChannelType enums.AdvertisingChannelTypeEnum_AdvertisingChannelType `protobuf:"varint,9,opt,name=advertising_channel_type,json=advertisingChannelType,proto3,enum=google.ads.googleads.v3.enums.AdvertisingChannelTypeEnum_AdvertisingChannelType" json:"advertising_channel_type,omitempty"`
+	// Optional refinement to `advertising_channel_type`.
+	// Must be a valid sub-type of the parent channel type.
+	//
+	// Can be set only when creating campaigns.
+	// After campaign is created, the field can not be changed.
+	AdvertisingChannelSubType enums.AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType `protobuf:"varint,10,opt,name=advertising_channel_sub_type,json=advertisingChannelSubType,proto3,enum=google.ads.googleads.v3.enums.AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType" json:"advertising_channel_sub_type,omitempty"`
+	// The URL template for constructing a tracking URL.
+	TrackingUrlTemplate *wrappers.StringValue `protobuf:"bytes,11,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	// The list of mappings used to substitute custom parameter tags in a
+	// `tracking_url_template`, `final_urls`, or `mobile_final_urls`.
+	UrlCustomParameters []*common.CustomParameter `protobuf:"bytes,12,rep,name=url_custom_parameters,json=urlCustomParameters,proto3" json:"url_custom_parameters,omitempty"`
+	// Settings for Real-Time Bidding, a feature only available for campaigns
+	// targeting the Ad Exchange network.
+	RealTimeBiddingSetting *common.RealTimeBiddingSetting `protobuf:"bytes,39,opt,name=real_time_bidding_setting,json=realTimeBiddingSetting,proto3" json:"real_time_bidding_setting,omitempty"`
+	// The network settings for the campaign.
+	NetworkSettings *Campaign_NetworkSettings `protobuf:"bytes,14,opt,name=network_settings,json=networkSettings,proto3" json:"network_settings,omitempty"`
+	// The hotel setting for the campaign.
+	HotelSetting *Campaign_HotelSettingInfo `protobuf:"bytes,32,opt,name=hotel_setting,json=hotelSetting,proto3" json:"hotel_setting,omitempty"`
+	// The setting for controlling Dynamic Search Ads (DSA).
+	DynamicSearchAdsSetting *Campaign_DynamicSearchAdsSetting `protobuf:"bytes,33,opt,name=dynamic_search_ads_setting,json=dynamicSearchAdsSetting,proto3" json:"dynamic_search_ads_setting,omitempty"`
+	// The setting for controlling Shopping campaigns.
+	ShoppingSetting *Campaign_ShoppingSetting `protobuf:"bytes,36,opt,name=shopping_setting,json=shoppingSetting,proto3" json:"shopping_setting,omitempty"`
+	// Setting for targeting related features.
+	TargetingSetting *common.TargetingSetting `protobuf:"bytes,43,opt,name=targeting_setting,json=targetingSetting,proto3" json:"targeting_setting,omitempty"`
+	// The setting for ads geotargeting.
+	GeoTargetTypeSetting *Campaign_GeoTargetTypeSetting `protobuf:"bytes,47,opt,name=geo_target_type_setting,json=geoTargetTypeSetting,proto3" json:"geo_target_type_setting,omitempty"`
+	// The setting related to App Campaign.
+	AppCampaignSetting *Campaign_AppCampaignSetting `protobuf:"bytes,51,opt,name=app_campaign_setting,json=appCampaignSetting,proto3" json:"app_campaign_setting,omitempty"`
+	// The resource names of labels attached to this campaign.
+	Labels []*wrappers.StringValue `protobuf:"bytes,53,rep,name=labels,proto3" json:"labels,omitempty"`
+	// The type of campaign: normal, draft, or experiment.
+	ExperimentType enums.CampaignExperimentTypeEnum_CampaignExperimentType `protobuf:"varint,17,opt,name=experiment_type,json=experimentType,proto3,enum=google.ads.googleads.v3.enums.CampaignExperimentTypeEnum_CampaignExperimentType" json:"experiment_type,omitempty"`
+	// The resource name of the base campaign of a draft or experiment campaign.
+	// For base campaigns, this is equal to `resource_name`.
+	//
+	// This field is read-only.
+	BaseCampaign *wrappers.StringValue `protobuf:"bytes,28,opt,name=base_campaign,json=baseCampaign,proto3" json:"base_campaign,omitempty"`
+	// The budget of the campaign.
+	CampaignBudget *wrappers.StringValue `protobuf:"bytes,6,opt,name=campaign_budget,json=campaignBudget,proto3" json:"campaign_budget,omitempty"`
+	// The type of bidding strategy.
+	//
+	// A bidding strategy can be created by setting either the bidding scheme to
+	// create a standard bidding strategy or the `bidding_strategy` field to
+	// create a portfolio bidding strategy.
+	//
+	// This field is read-only.
+	BiddingStrategyType enums.BiddingStrategyTypeEnum_BiddingStrategyType `protobuf:"varint,22,opt,name=bidding_strategy_type,json=biddingStrategyType,proto3,enum=google.ads.googleads.v3.enums.BiddingStrategyTypeEnum_BiddingStrategyType" json:"bidding_strategy_type,omitempty"`
+	// The date when campaign started.
+	//
+	// This field must not be used in WHERE clauses.
+	StartDate *wrappers.StringValue `protobuf:"bytes,19,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"`
+	// The date when campaign ended.
+	//
+	// This field must not be used in WHERE clauses.
+	EndDate *wrappers.StringValue `protobuf:"bytes,20,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"`
+	// Suffix used to append query parameters to landing pages that are served
+	// with parallel tracking.
+	FinalUrlSuffix *wrappers.StringValue `protobuf:"bytes,38,opt,name=final_url_suffix,json=finalUrlSuffix,proto3" json:"final_url_suffix,omitempty"`
+	// A list that limits how often each user will see this campaign's ads.
+	FrequencyCaps []*common.FrequencyCapEntry `protobuf:"bytes,40,rep,name=frequency_caps,json=frequencyCaps,proto3" json:"frequency_caps,omitempty"`
+	// 3-Tier Brand Safety setting for the campaign.
+	VideoBrandSafetySuitability enums.BrandSafetySuitabilityEnum_BrandSafetySuitability `protobuf:"varint,42,opt,name=video_brand_safety_suitability,json=videoBrandSafetySuitability,proto3,enum=google.ads.googleads.v3.enums.BrandSafetySuitabilityEnum_BrandSafetySuitability" json:"video_brand_safety_suitability,omitempty"`
+	// Describes how unbranded pharma ads will be displayed.
+	VanityPharma *Campaign_VanityPharma `protobuf:"bytes,44,opt,name=vanity_pharma,json=vanityPharma,proto3" json:"vanity_pharma,omitempty"`
+	// Selective optimization setting for this campaign, which includes a set of
+	// conversion actions to optimize this campaign towards.
+	SelectiveOptimization *Campaign_SelectiveOptimization `protobuf:"bytes,45,opt,name=selective_optimization,json=selectiveOptimization,proto3" json:"selective_optimization,omitempty"`
+	// Campaign-level settings for tracking information.
+	TrackingSetting *Campaign_TrackingSetting `protobuf:"bytes,46,opt,name=tracking_setting,json=trackingSetting,proto3" json:"tracking_setting,omitempty"`
+	// Payment mode for the campaign.
+	PaymentMode enums.PaymentModeEnum_PaymentMode `protobuf:"varint,52,opt,name=payment_mode,json=paymentMode,proto3,enum=google.ads.googleads.v3.enums.PaymentModeEnum_PaymentMode" json:"payment_mode,omitempty"`
+	// The bidding strategy for the campaign.
+	//
+	// Must be either portfolio (created via BiddingStrategy service) or
+	// standard, that is embedded into the campaign.
+	//
+	// Types that are valid to be assigned to CampaignBiddingStrategy:
+	//	*Campaign_BiddingStrategy
+	//	*Campaign_Commission
+	//	*Campaign_ManualCpc
+	//	*Campaign_ManualCpm
+	//	*Campaign_ManualCpv
+	//	*Campaign_MaximizeConversions
+	//	*Campaign_MaximizeConversionValue
+	//	*Campaign_TargetCpa
+	//	*Campaign_TargetImpressionShare
+	//	*Campaign_TargetRoas
+	//	*Campaign_TargetSpend
+	//	*Campaign_PercentCpc
+	//	*Campaign_TargetCpm
+	CampaignBiddingStrategy isCampaign_CampaignBiddingStrategy `protobuf_oneof:"campaign_bidding_strategy"`
+	XXX_NoUnkeyedLiteral    struct{}                           `json:"-"`
+	XXX_unrecognized        []byte                             `json:"-"`
+	XXX_sizecache           int32                              `json:"-"`
+}
+
+func (m *Campaign) Reset()         { *m = Campaign{} }
+func (m *Campaign) String() string { return proto.CompactTextString(m) }
+func (*Campaign) ProtoMessage()    {}
+func (*Campaign) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0}
+}
+
+func (m *Campaign) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign.Unmarshal(m, b)
+}
+func (m *Campaign) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign.Marshal(b, m, deterministic)
+}
+func (m *Campaign) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign.Merge(m, src)
+}
+func (m *Campaign) XXX_Size() int {
+	return xxx_messageInfo_Campaign.Size(m)
+}
+func (m *Campaign) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign proto.InternalMessageInfo
+
+func (m *Campaign) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *Campaign) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Campaign) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *Campaign) GetStatus() enums.CampaignStatusEnum_CampaignStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.CampaignStatusEnum_UNSPECIFIED
+}
+
+func (m *Campaign) GetServingStatus() enums.CampaignServingStatusEnum_CampaignServingStatus {
+	if m != nil {
+		return m.ServingStatus
+	}
+	return enums.CampaignServingStatusEnum_UNSPECIFIED
+}
+
+func (m *Campaign) GetAdServingOptimizationStatus() enums.AdServingOptimizationStatusEnum_AdServingOptimizationStatus {
+	if m != nil {
+		return m.AdServingOptimizationStatus
+	}
+	return enums.AdServingOptimizationStatusEnum_UNSPECIFIED
+}
+
+func (m *Campaign) GetAdvertisingChannelType() enums.AdvertisingChannelTypeEnum_AdvertisingChannelType {
+	if m != nil {
+		return m.AdvertisingChannelType
+	}
+	return enums.AdvertisingChannelTypeEnum_UNSPECIFIED
+}
+
+func (m *Campaign) GetAdvertisingChannelSubType() enums.AdvertisingChannelSubTypeEnum_AdvertisingChannelSubType {
+	if m != nil {
+		return m.AdvertisingChannelSubType
+	}
+	return enums.AdvertisingChannelSubTypeEnum_UNSPECIFIED
+}
+
+func (m *Campaign) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func (m *Campaign) GetUrlCustomParameters() []*common.CustomParameter {
+	if m != nil {
+		return m.UrlCustomParameters
+	}
+	return nil
+}
+
+func (m *Campaign) GetRealTimeBiddingSetting() *common.RealTimeBiddingSetting {
+	if m != nil {
+		return m.RealTimeBiddingSetting
+	}
+	return nil
+}
+
+func (m *Campaign) GetNetworkSettings() *Campaign_NetworkSettings {
+	if m != nil {
+		return m.NetworkSettings
+	}
+	return nil
+}
+
+func (m *Campaign) GetHotelSetting() *Campaign_HotelSettingInfo {
+	if m != nil {
+		return m.HotelSetting
+	}
+	return nil
+}
+
+func (m *Campaign) GetDynamicSearchAdsSetting() *Campaign_DynamicSearchAdsSetting {
+	if m != nil {
+		return m.DynamicSearchAdsSetting
+	}
+	return nil
+}
+
+func (m *Campaign) GetShoppingSetting() *Campaign_ShoppingSetting {
+	if m != nil {
+		return m.ShoppingSetting
+	}
+	return nil
+}
+
+func (m *Campaign) GetTargetingSetting() *common.TargetingSetting {
+	if m != nil {
+		return m.TargetingSetting
+	}
+	return nil
+}
+
+func (m *Campaign) GetGeoTargetTypeSetting() *Campaign_GeoTargetTypeSetting {
+	if m != nil {
+		return m.GeoTargetTypeSetting
+	}
+	return nil
+}
+
+func (m *Campaign) GetAppCampaignSetting() *Campaign_AppCampaignSetting {
+	if m != nil {
+		return m.AppCampaignSetting
+	}
+	return nil
+}
+
+func (m *Campaign) GetLabels() []*wrappers.StringValue {
+	if m != nil {
+		return m.Labels
+	}
+	return nil
+}
+
+func (m *Campaign) GetExperimentType() enums.CampaignExperimentTypeEnum_CampaignExperimentType {
+	if m != nil {
+		return m.ExperimentType
+	}
+	return enums.CampaignExperimentTypeEnum_UNSPECIFIED
+}
+
+func (m *Campaign) GetBaseCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.BaseCampaign
+	}
+	return nil
+}
+
+func (m *Campaign) GetCampaignBudget() *wrappers.StringValue {
+	if m != nil {
+		return m.CampaignBudget
+	}
+	return nil
+}
+
+func (m *Campaign) GetBiddingStrategyType() enums.BiddingStrategyTypeEnum_BiddingStrategyType {
+	if m != nil {
+		return m.BiddingStrategyType
+	}
+	return enums.BiddingStrategyTypeEnum_UNSPECIFIED
+}
+
+func (m *Campaign) GetStartDate() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDate
+	}
+	return nil
+}
+
+func (m *Campaign) GetEndDate() *wrappers.StringValue {
+	if m != nil {
+		return m.EndDate
+	}
+	return nil
+}
+
+func (m *Campaign) GetFinalUrlSuffix() *wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrlSuffix
+	}
+	return nil
+}
+
+func (m *Campaign) GetFrequencyCaps() []*common.FrequencyCapEntry {
+	if m != nil {
+		return m.FrequencyCaps
+	}
+	return nil
+}
+
+func (m *Campaign) GetVideoBrandSafetySuitability() enums.BrandSafetySuitabilityEnum_BrandSafetySuitability {
+	if m != nil {
+		return m.VideoBrandSafetySuitability
+	}
+	return enums.BrandSafetySuitabilityEnum_UNSPECIFIED
+}
+
+func (m *Campaign) GetVanityPharma() *Campaign_VanityPharma {
+	if m != nil {
+		return m.VanityPharma
+	}
+	return nil
+}
+
+func (m *Campaign) GetSelectiveOptimization() *Campaign_SelectiveOptimization {
+	if m != nil {
+		return m.SelectiveOptimization
+	}
+	return nil
+}
+
+func (m *Campaign) GetTrackingSetting() *Campaign_TrackingSetting {
+	if m != nil {
+		return m.TrackingSetting
+	}
+	return nil
+}
+
+func (m *Campaign) GetPaymentMode() enums.PaymentModeEnum_PaymentMode {
+	if m != nil {
+		return m.PaymentMode
+	}
+	return enums.PaymentModeEnum_UNSPECIFIED
+}
+
+type isCampaign_CampaignBiddingStrategy interface {
+	isCampaign_CampaignBiddingStrategy()
+}
+
+type Campaign_BiddingStrategy struct {
+	BiddingStrategy *wrappers.StringValue `protobuf:"bytes,23,opt,name=bidding_strategy,json=biddingStrategy,proto3,oneof"`
+}
+
+type Campaign_Commission struct {
+	Commission *common.Commission `protobuf:"bytes,49,opt,name=commission,proto3,oneof"`
+}
+
+type Campaign_ManualCpc struct {
+	ManualCpc *common.ManualCpc `protobuf:"bytes,24,opt,name=manual_cpc,json=manualCpc,proto3,oneof"`
+}
+
+type Campaign_ManualCpm struct {
+	ManualCpm *common.ManualCpm `protobuf:"bytes,25,opt,name=manual_cpm,json=manualCpm,proto3,oneof"`
+}
+
+type Campaign_ManualCpv struct {
+	ManualCpv *common.ManualCpv `protobuf:"bytes,37,opt,name=manual_cpv,json=manualCpv,proto3,oneof"`
+}
+
+type Campaign_MaximizeConversions struct {
+	MaximizeConversions *common.MaximizeConversions `protobuf:"bytes,30,opt,name=maximize_conversions,json=maximizeConversions,proto3,oneof"`
+}
+
+type Campaign_MaximizeConversionValue struct {
+	MaximizeConversionValue *common.MaximizeConversionValue `protobuf:"bytes,31,opt,name=maximize_conversion_value,json=maximizeConversionValue,proto3,oneof"`
+}
+
+type Campaign_TargetCpa struct {
+	TargetCpa *common.TargetCpa `protobuf:"bytes,26,opt,name=target_cpa,json=targetCpa,proto3,oneof"`
+}
+
+type Campaign_TargetImpressionShare struct {
+	TargetImpressionShare *common.TargetImpressionShare `protobuf:"bytes,48,opt,name=target_impression_share,json=targetImpressionShare,proto3,oneof"`
+}
+
+type Campaign_TargetRoas struct {
+	TargetRoas *common.TargetRoas `protobuf:"bytes,29,opt,name=target_roas,json=targetRoas,proto3,oneof"`
+}
+
+type Campaign_TargetSpend struct {
+	TargetSpend *common.TargetSpend `protobuf:"bytes,27,opt,name=target_spend,json=targetSpend,proto3,oneof"`
+}
+
+type Campaign_PercentCpc struct {
+	PercentCpc *common.PercentCpc `protobuf:"bytes,34,opt,name=percent_cpc,json=percentCpc,proto3,oneof"`
+}
+
+type Campaign_TargetCpm struct {
+	TargetCpm *common.TargetCpm `protobuf:"bytes,41,opt,name=target_cpm,json=targetCpm,proto3,oneof"`
+}
+
+func (*Campaign_BiddingStrategy) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_Commission) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_ManualCpc) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_ManualCpm) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_ManualCpv) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_MaximizeConversions) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_MaximizeConversionValue) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_TargetCpa) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_TargetImpressionShare) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_TargetRoas) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_TargetSpend) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_PercentCpc) isCampaign_CampaignBiddingStrategy() {}
+
+func (*Campaign_TargetCpm) isCampaign_CampaignBiddingStrategy() {}
+
+func (m *Campaign) GetCampaignBiddingStrategy() isCampaign_CampaignBiddingStrategy {
+	if m != nil {
+		return m.CampaignBiddingStrategy
+	}
+	return nil
+}
+
+func (m *Campaign) GetBiddingStrategy() *wrappers.StringValue {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_BiddingStrategy); ok {
+		return x.BiddingStrategy
+	}
+	return nil
+}
+
+func (m *Campaign) GetCommission() *common.Commission {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_Commission); ok {
+		return x.Commission
+	}
+	return nil
+}
+
+func (m *Campaign) GetManualCpc() *common.ManualCpc {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_ManualCpc); ok {
+		return x.ManualCpc
+	}
+	return nil
+}
+
+func (m *Campaign) GetManualCpm() *common.ManualCpm {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_ManualCpm); ok {
+		return x.ManualCpm
+	}
+	return nil
+}
+
+func (m *Campaign) GetManualCpv() *common.ManualCpv {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_ManualCpv); ok {
+		return x.ManualCpv
+	}
+	return nil
+}
+
+func (m *Campaign) GetMaximizeConversions() *common.MaximizeConversions {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_MaximizeConversions); ok {
+		return x.MaximizeConversions
+	}
+	return nil
+}
+
+func (m *Campaign) GetMaximizeConversionValue() *common.MaximizeConversionValue {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_MaximizeConversionValue); ok {
+		return x.MaximizeConversionValue
+	}
+	return nil
+}
+
+func (m *Campaign) GetTargetCpa() *common.TargetCpa {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_TargetCpa); ok {
+		return x.TargetCpa
+	}
+	return nil
+}
+
+func (m *Campaign) GetTargetImpressionShare() *common.TargetImpressionShare {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_TargetImpressionShare); ok {
+		return x.TargetImpressionShare
+	}
+	return nil
+}
+
+func (m *Campaign) GetTargetRoas() *common.TargetRoas {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_TargetRoas); ok {
+		return x.TargetRoas
+	}
+	return nil
+}
+
+func (m *Campaign) GetTargetSpend() *common.TargetSpend {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_TargetSpend); ok {
+		return x.TargetSpend
+	}
+	return nil
+}
+
+func (m *Campaign) GetPercentCpc() *common.PercentCpc {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_PercentCpc); ok {
+		return x.PercentCpc
+	}
+	return nil
+}
+
+func (m *Campaign) GetTargetCpm() *common.TargetCpm {
+	if x, ok := m.GetCampaignBiddingStrategy().(*Campaign_TargetCpm); ok {
+		return x.TargetCpm
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Campaign) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Campaign_BiddingStrategy)(nil),
+		(*Campaign_Commission)(nil),
+		(*Campaign_ManualCpc)(nil),
+		(*Campaign_ManualCpm)(nil),
+		(*Campaign_ManualCpv)(nil),
+		(*Campaign_MaximizeConversions)(nil),
+		(*Campaign_MaximizeConversionValue)(nil),
+		(*Campaign_TargetCpa)(nil),
+		(*Campaign_TargetImpressionShare)(nil),
+		(*Campaign_TargetRoas)(nil),
+		(*Campaign_TargetSpend)(nil),
+		(*Campaign_PercentCpc)(nil),
+		(*Campaign_TargetCpm)(nil),
+	}
+}
+
+// The network settings for the campaign.
+type Campaign_NetworkSettings struct {
+	// Whether ads will be served with google.com search results.
+	TargetGoogleSearch *wrappers.BoolValue `protobuf:"bytes,1,opt,name=target_google_search,json=targetGoogleSearch,proto3" json:"target_google_search,omitempty"`
+	// Whether ads will be served on partner sites in the Google Search Network
+	// (requires `target_google_search` to also be `true`).
+	TargetSearchNetwork *wrappers.BoolValue `protobuf:"bytes,2,opt,name=target_search_network,json=targetSearchNetwork,proto3" json:"target_search_network,omitempty"`
+	// Whether ads will be served on specified placements in the Google Display
+	// Network. Placements are specified using the Placement criterion.
+	TargetContentNetwork *wrappers.BoolValue `protobuf:"bytes,3,opt,name=target_content_network,json=targetContentNetwork,proto3" json:"target_content_network,omitempty"`
+	// Whether ads will be served on the Google Partner Network.
+	// This is available only to some select Google partner accounts.
+	TargetPartnerSearchNetwork *wrappers.BoolValue `protobuf:"bytes,4,opt,name=target_partner_search_network,json=targetPartnerSearchNetwork,proto3" json:"target_partner_search_network,omitempty"`
+	XXX_NoUnkeyedLiteral       struct{}            `json:"-"`
+	XXX_unrecognized           []byte              `json:"-"`
+	XXX_sizecache              int32               `json:"-"`
+}
+
+func (m *Campaign_NetworkSettings) Reset()         { *m = Campaign_NetworkSettings{} }
+func (m *Campaign_NetworkSettings) String() string { return proto.CompactTextString(m) }
+func (*Campaign_NetworkSettings) ProtoMessage()    {}
+func (*Campaign_NetworkSettings) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0, 0}
+}
+
+func (m *Campaign_NetworkSettings) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign_NetworkSettings.Unmarshal(m, b)
+}
+func (m *Campaign_NetworkSettings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign_NetworkSettings.Marshal(b, m, deterministic)
+}
+func (m *Campaign_NetworkSettings) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign_NetworkSettings.Merge(m, src)
+}
+func (m *Campaign_NetworkSettings) XXX_Size() int {
+	return xxx_messageInfo_Campaign_NetworkSettings.Size(m)
+}
+func (m *Campaign_NetworkSettings) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign_NetworkSettings.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign_NetworkSettings proto.InternalMessageInfo
+
+func (m *Campaign_NetworkSettings) GetTargetGoogleSearch() *wrappers.BoolValue {
+	if m != nil {
+		return m.TargetGoogleSearch
+	}
+	return nil
+}
+
+func (m *Campaign_NetworkSettings) GetTargetSearchNetwork() *wrappers.BoolValue {
+	if m != nil {
+		return m.TargetSearchNetwork
+	}
+	return nil
+}
+
+func (m *Campaign_NetworkSettings) GetTargetContentNetwork() *wrappers.BoolValue {
+	if m != nil {
+		return m.TargetContentNetwork
+	}
+	return nil
+}
+
+func (m *Campaign_NetworkSettings) GetTargetPartnerSearchNetwork() *wrappers.BoolValue {
+	if m != nil {
+		return m.TargetPartnerSearchNetwork
+	}
+	return nil
+}
+
+// Campaign-level settings for hotel ads.
+type Campaign_HotelSettingInfo struct {
+	// The linked Hotel Center account.
+	HotelCenterId        *wrappers.Int64Value `protobuf:"bytes,1,opt,name=hotel_center_id,json=hotelCenterId,proto3" json:"hotel_center_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *Campaign_HotelSettingInfo) Reset()         { *m = Campaign_HotelSettingInfo{} }
+func (m *Campaign_HotelSettingInfo) String() string { return proto.CompactTextString(m) }
+func (*Campaign_HotelSettingInfo) ProtoMessage()    {}
+func (*Campaign_HotelSettingInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0, 1}
+}
+
+func (m *Campaign_HotelSettingInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign_HotelSettingInfo.Unmarshal(m, b)
+}
+func (m *Campaign_HotelSettingInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign_HotelSettingInfo.Marshal(b, m, deterministic)
+}
+func (m *Campaign_HotelSettingInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign_HotelSettingInfo.Merge(m, src)
+}
+func (m *Campaign_HotelSettingInfo) XXX_Size() int {
+	return xxx_messageInfo_Campaign_HotelSettingInfo.Size(m)
+}
+func (m *Campaign_HotelSettingInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign_HotelSettingInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign_HotelSettingInfo proto.InternalMessageInfo
+
+func (m *Campaign_HotelSettingInfo) GetHotelCenterId() *wrappers.Int64Value {
+	if m != nil {
+		return m.HotelCenterId
+	}
+	return nil
+}
+
+// Campaign-level settings for App Campaigns.
+type Campaign_AppCampaignSetting struct {
+	// Represents the goal which the bidding strategy of this app campaign
+	// should optimize towards.
+	BiddingStrategyGoalType enums.AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType `protobuf:"varint,1,opt,name=bidding_strategy_goal_type,json=biddingStrategyGoalType,proto3,enum=google.ads.googleads.v3.enums.AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType" json:"bidding_strategy_goal_type,omitempty"`
+	// A string that uniquely identifies a mobile application.
+	AppId *wrappers.StringValue `protobuf:"bytes,2,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
+	// The application store that distributes this specific app.
+	AppStore             enums.AppCampaignAppStoreEnum_AppCampaignAppStore `protobuf:"varint,3,opt,name=app_store,json=appStore,proto3,enum=google.ads.googleads.v3.enums.AppCampaignAppStoreEnum_AppCampaignAppStore" json:"app_store,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                          `json:"-"`
+	XXX_unrecognized     []byte                                            `json:"-"`
+	XXX_sizecache        int32                                             `json:"-"`
+}
+
+func (m *Campaign_AppCampaignSetting) Reset()         { *m = Campaign_AppCampaignSetting{} }
+func (m *Campaign_AppCampaignSetting) String() string { return proto.CompactTextString(m) }
+func (*Campaign_AppCampaignSetting) ProtoMessage()    {}
+func (*Campaign_AppCampaignSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0, 2}
+}
+
+func (m *Campaign_AppCampaignSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign_AppCampaignSetting.Unmarshal(m, b)
+}
+func (m *Campaign_AppCampaignSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign_AppCampaignSetting.Marshal(b, m, deterministic)
+}
+func (m *Campaign_AppCampaignSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign_AppCampaignSetting.Merge(m, src)
+}
+func (m *Campaign_AppCampaignSetting) XXX_Size() int {
+	return xxx_messageInfo_Campaign_AppCampaignSetting.Size(m)
+}
+func (m *Campaign_AppCampaignSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign_AppCampaignSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign_AppCampaignSetting proto.InternalMessageInfo
+
+func (m *Campaign_AppCampaignSetting) GetBiddingStrategyGoalType() enums.AppCampaignBiddingStrategyGoalTypeEnum_AppCampaignBiddingStrategyGoalType {
+	if m != nil {
+		return m.BiddingStrategyGoalType
+	}
+	return enums.AppCampaignBiddingStrategyGoalTypeEnum_UNSPECIFIED
+}
+
+func (m *Campaign_AppCampaignSetting) GetAppId() *wrappers.StringValue {
+	if m != nil {
+		return m.AppId
+	}
+	return nil
+}
+
+func (m *Campaign_AppCampaignSetting) GetAppStore() enums.AppCampaignAppStoreEnum_AppCampaignAppStore {
+	if m != nil {
+		return m.AppStore
+	}
+	return enums.AppCampaignAppStoreEnum_UNSPECIFIED
+}
+
+// The setting for controlling Dynamic Search Ads (DSA).
+type Campaign_DynamicSearchAdsSetting struct {
+	// The Internet domain name that this setting represents, e.g., "google.com"
+	// or "www.google.com".
+	DomainName *wrappers.StringValue `protobuf:"bytes,1,opt,name=domain_name,json=domainName,proto3" json:"domain_name,omitempty"`
+	// The language code specifying the language of the domain, e.g., "en".
+	LanguageCode *wrappers.StringValue `protobuf:"bytes,2,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
+	// Whether the campaign uses advertiser supplied URLs exclusively.
+	UseSuppliedUrlsOnly *wrappers.BoolValue `protobuf:"bytes,3,opt,name=use_supplied_urls_only,json=useSuppliedUrlsOnly,proto3" json:"use_supplied_urls_only,omitempty"`
+	// The list of page feeds associated with the campaign.
+	Feeds                []*wrappers.StringValue `protobuf:"bytes,5,rep,name=feeds,proto3" json:"feeds,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *Campaign_DynamicSearchAdsSetting) Reset()         { *m = Campaign_DynamicSearchAdsSetting{} }
+func (m *Campaign_DynamicSearchAdsSetting) String() string { return proto.CompactTextString(m) }
+func (*Campaign_DynamicSearchAdsSetting) ProtoMessage()    {}
+func (*Campaign_DynamicSearchAdsSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0, 3}
+}
+
+func (m *Campaign_DynamicSearchAdsSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign_DynamicSearchAdsSetting.Unmarshal(m, b)
+}
+func (m *Campaign_DynamicSearchAdsSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign_DynamicSearchAdsSetting.Marshal(b, m, deterministic)
+}
+func (m *Campaign_DynamicSearchAdsSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign_DynamicSearchAdsSetting.Merge(m, src)
+}
+func (m *Campaign_DynamicSearchAdsSetting) XXX_Size() int {
+	return xxx_messageInfo_Campaign_DynamicSearchAdsSetting.Size(m)
+}
+func (m *Campaign_DynamicSearchAdsSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign_DynamicSearchAdsSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign_DynamicSearchAdsSetting proto.InternalMessageInfo
+
+func (m *Campaign_DynamicSearchAdsSetting) GetDomainName() *wrappers.StringValue {
+	if m != nil {
+		return m.DomainName
+	}
+	return nil
+}
+
+func (m *Campaign_DynamicSearchAdsSetting) GetLanguageCode() *wrappers.StringValue {
+	if m != nil {
+		return m.LanguageCode
+	}
+	return nil
+}
+
+func (m *Campaign_DynamicSearchAdsSetting) GetUseSuppliedUrlsOnly() *wrappers.BoolValue {
+	if m != nil {
+		return m.UseSuppliedUrlsOnly
+	}
+	return nil
+}
+
+func (m *Campaign_DynamicSearchAdsSetting) GetFeeds() []*wrappers.StringValue {
+	if m != nil {
+		return m.Feeds
+	}
+	return nil
+}
+
+// The setting for Shopping campaigns. Defines the universe of products that
+// can be advertised by the campaign, and how this campaign interacts with
+// other Shopping campaigns.
+type Campaign_ShoppingSetting struct {
+	// ID of the Merchant Center account.
+	// This field is required for create operations. This field is immutable for
+	// Shopping campaigns.
+	MerchantId *wrappers.Int64Value `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
+	// Sales country of products to include in the campaign.
+	// This field is required for Shopping campaigns. This field is immutable.
+	// This field is optional for non-Shopping campaigns, but it must be equal
+	// to 'ZZ' if set.
+	SalesCountry *wrappers.StringValue `protobuf:"bytes,2,opt,name=sales_country,json=salesCountry,proto3" json:"sales_country,omitempty"`
+	// Priority of the campaign. Campaigns with numerically higher priorities
+	// take precedence over those with lower priorities.
+	// This field is required for Shopping campaigns, with values between 0 and
+	// 2, inclusive.
+	// This field is optional for Smart Shopping campaigns, but must be equal to
+	// 3 if set.
+	CampaignPriority *wrappers.Int32Value `protobuf:"bytes,3,opt,name=campaign_priority,json=campaignPriority,proto3" json:"campaign_priority,omitempty"`
+	// Whether to include local products.
+	EnableLocal          *wrappers.BoolValue `protobuf:"bytes,4,opt,name=enable_local,json=enableLocal,proto3" json:"enable_local,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *Campaign_ShoppingSetting) Reset()         { *m = Campaign_ShoppingSetting{} }
+func (m *Campaign_ShoppingSetting) String() string { return proto.CompactTextString(m) }
+func (*Campaign_ShoppingSetting) ProtoMessage()    {}
+func (*Campaign_ShoppingSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0, 4}
+}
+
+func (m *Campaign_ShoppingSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign_ShoppingSetting.Unmarshal(m, b)
+}
+func (m *Campaign_ShoppingSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign_ShoppingSetting.Marshal(b, m, deterministic)
+}
+func (m *Campaign_ShoppingSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign_ShoppingSetting.Merge(m, src)
+}
+func (m *Campaign_ShoppingSetting) XXX_Size() int {
+	return xxx_messageInfo_Campaign_ShoppingSetting.Size(m)
+}
+func (m *Campaign_ShoppingSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign_ShoppingSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign_ShoppingSetting proto.InternalMessageInfo
+
+func (m *Campaign_ShoppingSetting) GetMerchantId() *wrappers.Int64Value {
+	if m != nil {
+		return m.MerchantId
+	}
+	return nil
+}
+
+func (m *Campaign_ShoppingSetting) GetSalesCountry() *wrappers.StringValue {
+	if m != nil {
+		return m.SalesCountry
+	}
+	return nil
+}
+
+func (m *Campaign_ShoppingSetting) GetCampaignPriority() *wrappers.Int32Value {
+	if m != nil {
+		return m.CampaignPriority
+	}
+	return nil
+}
+
+func (m *Campaign_ShoppingSetting) GetEnableLocal() *wrappers.BoolValue {
+	if m != nil {
+		return m.EnableLocal
+	}
+	return nil
+}
+
+// Describes how unbranded pharma ads will be displayed.
+type Campaign_VanityPharma struct {
+	// The display mode for vanity pharma URLs.
+	VanityPharmaDisplayUrlMode enums.VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode `protobuf:"varint,1,opt,name=vanity_pharma_display_url_mode,json=vanityPharmaDisplayUrlMode,proto3,enum=google.ads.googleads.v3.enums.VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode" json:"vanity_pharma_display_url_mode,omitempty"`
+	// The text that will be displayed in display URL of the text ad when
+	// website description is the selected display mode for vanity pharma URLs.
+	VanityPharmaText     enums.VanityPharmaTextEnum_VanityPharmaText `protobuf:"varint,2,opt,name=vanity_pharma_text,json=vanityPharmaText,proto3,enum=google.ads.googleads.v3.enums.VanityPharmaTextEnum_VanityPharmaText" json:"vanity_pharma_text,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *Campaign_VanityPharma) Reset()         { *m = Campaign_VanityPharma{} }
+func (m *Campaign_VanityPharma) String() string { return proto.CompactTextString(m) }
+func (*Campaign_VanityPharma) ProtoMessage()    {}
+func (*Campaign_VanityPharma) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0, 5}
+}
+
+func (m *Campaign_VanityPharma) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign_VanityPharma.Unmarshal(m, b)
+}
+func (m *Campaign_VanityPharma) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign_VanityPharma.Marshal(b, m, deterministic)
+}
+func (m *Campaign_VanityPharma) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign_VanityPharma.Merge(m, src)
+}
+func (m *Campaign_VanityPharma) XXX_Size() int {
+	return xxx_messageInfo_Campaign_VanityPharma.Size(m)
+}
+func (m *Campaign_VanityPharma) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign_VanityPharma.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign_VanityPharma proto.InternalMessageInfo
+
+func (m *Campaign_VanityPharma) GetVanityPharmaDisplayUrlMode() enums.VanityPharmaDisplayUrlModeEnum_VanityPharmaDisplayUrlMode {
+	if m != nil {
+		return m.VanityPharmaDisplayUrlMode
+	}
+	return enums.VanityPharmaDisplayUrlModeEnum_UNSPECIFIED
+}
+
+func (m *Campaign_VanityPharma) GetVanityPharmaText() enums.VanityPharmaTextEnum_VanityPharmaText {
+	if m != nil {
+		return m.VanityPharmaText
+	}
+	return enums.VanityPharmaTextEnum_UNSPECIFIED
+}
+
+// Selective optimization setting for this campaign, which includes a set of
+// conversion actions to optimize this campaign towards.
+type Campaign_SelectiveOptimization struct {
+	// The selected set of conversion actions for optimizing this campaign.
+	ConversionActions    []*wrappers.StringValue `protobuf:"bytes,1,rep,name=conversion_actions,json=conversionActions,proto3" json:"conversion_actions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *Campaign_SelectiveOptimization) Reset()         { *m = Campaign_SelectiveOptimization{} }
+func (m *Campaign_SelectiveOptimization) String() string { return proto.CompactTextString(m) }
+func (*Campaign_SelectiveOptimization) ProtoMessage()    {}
+func (*Campaign_SelectiveOptimization) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0, 6}
+}
+
+func (m *Campaign_SelectiveOptimization) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign_SelectiveOptimization.Unmarshal(m, b)
+}
+func (m *Campaign_SelectiveOptimization) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign_SelectiveOptimization.Marshal(b, m, deterministic)
+}
+func (m *Campaign_SelectiveOptimization) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign_SelectiveOptimization.Merge(m, src)
+}
+func (m *Campaign_SelectiveOptimization) XXX_Size() int {
+	return xxx_messageInfo_Campaign_SelectiveOptimization.Size(m)
+}
+func (m *Campaign_SelectiveOptimization) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign_SelectiveOptimization.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign_SelectiveOptimization proto.InternalMessageInfo
+
+func (m *Campaign_SelectiveOptimization) GetConversionActions() []*wrappers.StringValue {
+	if m != nil {
+		return m.ConversionActions
+	}
+	return nil
+}
+
+// Represents a collection of settings related to ads geotargeting.
+type Campaign_GeoTargetTypeSetting struct {
+	// The setting used for positive geotargeting in this particular campaign.
+	PositiveGeoTargetType enums.PositiveGeoTargetTypeEnum_PositiveGeoTargetType `protobuf:"varint,1,opt,name=positive_geo_target_type,json=positiveGeoTargetType,proto3,enum=google.ads.googleads.v3.enums.PositiveGeoTargetTypeEnum_PositiveGeoTargetType" json:"positive_geo_target_type,omitempty"`
+	// The setting used for negative geotargeting in this particular campaign.
+	NegativeGeoTargetType enums.NegativeGeoTargetTypeEnum_NegativeGeoTargetType `protobuf:"varint,2,opt,name=negative_geo_target_type,json=negativeGeoTargetType,proto3,enum=google.ads.googleads.v3.enums.NegativeGeoTargetTypeEnum_NegativeGeoTargetType" json:"negative_geo_target_type,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{}                                              `json:"-"`
+	XXX_unrecognized      []byte                                                `json:"-"`
+	XXX_sizecache         int32                                                 `json:"-"`
+}
+
+func (m *Campaign_GeoTargetTypeSetting) Reset()         { *m = Campaign_GeoTargetTypeSetting{} }
+func (m *Campaign_GeoTargetTypeSetting) String() string { return proto.CompactTextString(m) }
+func (*Campaign_GeoTargetTypeSetting) ProtoMessage()    {}
+func (*Campaign_GeoTargetTypeSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0, 7}
+}
+
+func (m *Campaign_GeoTargetTypeSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign_GeoTargetTypeSetting.Unmarshal(m, b)
+}
+func (m *Campaign_GeoTargetTypeSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign_GeoTargetTypeSetting.Marshal(b, m, deterministic)
+}
+func (m *Campaign_GeoTargetTypeSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign_GeoTargetTypeSetting.Merge(m, src)
+}
+func (m *Campaign_GeoTargetTypeSetting) XXX_Size() int {
+	return xxx_messageInfo_Campaign_GeoTargetTypeSetting.Size(m)
+}
+func (m *Campaign_GeoTargetTypeSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign_GeoTargetTypeSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign_GeoTargetTypeSetting proto.InternalMessageInfo
+
+func (m *Campaign_GeoTargetTypeSetting) GetPositiveGeoTargetType() enums.PositiveGeoTargetTypeEnum_PositiveGeoTargetType {
+	if m != nil {
+		return m.PositiveGeoTargetType
+	}
+	return enums.PositiveGeoTargetTypeEnum_UNSPECIFIED
+}
+
+func (m *Campaign_GeoTargetTypeSetting) GetNegativeGeoTargetType() enums.NegativeGeoTargetTypeEnum_NegativeGeoTargetType {
+	if m != nil {
+		return m.NegativeGeoTargetType
+	}
+	return enums.NegativeGeoTargetTypeEnum_UNSPECIFIED
+}
+
+// Campaign-level settings for tracking information.
+type Campaign_TrackingSetting struct {
+	// The url used for dynamic tracking.
+	TrackingUrl          *wrappers.StringValue `protobuf:"bytes,1,opt,name=tracking_url,json=trackingUrl,proto3" json:"tracking_url,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *Campaign_TrackingSetting) Reset()         { *m = Campaign_TrackingSetting{} }
+func (m *Campaign_TrackingSetting) String() string { return proto.CompactTextString(m) }
+func (*Campaign_TrackingSetting) ProtoMessage()    {}
+func (*Campaign_TrackingSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fc9f8fbba6491262, []int{0, 8}
+}
+
+func (m *Campaign_TrackingSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Campaign_TrackingSetting.Unmarshal(m, b)
+}
+func (m *Campaign_TrackingSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Campaign_TrackingSetting.Marshal(b, m, deterministic)
+}
+func (m *Campaign_TrackingSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Campaign_TrackingSetting.Merge(m, src)
+}
+func (m *Campaign_TrackingSetting) XXX_Size() int {
+	return xxx_messageInfo_Campaign_TrackingSetting.Size(m)
+}
+func (m *Campaign_TrackingSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_Campaign_TrackingSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Campaign_TrackingSetting proto.InternalMessageInfo
+
+func (m *Campaign_TrackingSetting) GetTrackingUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrl
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Campaign)(nil), "google.ads.googleads.v3.resources.Campaign")
+	proto.RegisterType((*Campaign_NetworkSettings)(nil), "google.ads.googleads.v3.resources.Campaign.NetworkSettings")
+	proto.RegisterType((*Campaign_HotelSettingInfo)(nil), "google.ads.googleads.v3.resources.Campaign.HotelSettingInfo")
+	proto.RegisterType((*Campaign_AppCampaignSetting)(nil), "google.ads.googleads.v3.resources.Campaign.AppCampaignSetting")
+	proto.RegisterType((*Campaign_DynamicSearchAdsSetting)(nil), "google.ads.googleads.v3.resources.Campaign.DynamicSearchAdsSetting")
+	proto.RegisterType((*Campaign_ShoppingSetting)(nil), "google.ads.googleads.v3.resources.Campaign.ShoppingSetting")
+	proto.RegisterType((*Campaign_VanityPharma)(nil), "google.ads.googleads.v3.resources.Campaign.VanityPharma")
+	proto.RegisterType((*Campaign_SelectiveOptimization)(nil), "google.ads.googleads.v3.resources.Campaign.SelectiveOptimization")
+	proto.RegisterType((*Campaign_GeoTargetTypeSetting)(nil), "google.ads.googleads.v3.resources.Campaign.GeoTargetTypeSetting")
+	proto.RegisterType((*Campaign_TrackingSetting)(nil), "google.ads.googleads.v3.resources.Campaign.TrackingSetting")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign.proto", fileDescriptor_fc9f8fbba6491262)
+}
+
+var fileDescriptor_fc9f8fbba6491262 = []byte{
+	// 2265 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x59, 0x5b, 0x93, 0x13, 0xc7,
+	0xf5, 0x5f, 0x09, 0xc3, 0x1f, 0x7a, 0xaf, 0xf4, 0xde, 0x66, 0x05, 0xe6, 0x0f, 0x4e, 0x9c, 0x80,
+	0x71, 0x24, 0xbc, 0x02, 0x9c, 0x08, 0xec, 0xa0, 0x15, 0x98, 0x5d, 0x0c, 0x8b, 0x32, 0x5a, 0x36,
+	0x94, 0x0b, 0x6a, 0xaa, 0x35, 0xd3, 0xab, 0x9d, 0xf2, 0x5c, 0xda, 0xdd, 0x3d, 0x62, 0x95, 0x94,
+	0x53, 0x79, 0x4b, 0x25, 0xef, 0xa9, 0x3c, 0x24, 0x55, 0xb9, 0x54, 0xe5, 0xc5, 0x1f, 0x25, 0x1f,
+	0x21, 0x4f, 0x79, 0xf6, 0x47, 0xc8, 0x53, 0xaa, 0x2f, 0x33, 0x1a, 0x49, 0x23, 0xcd, 0xe8, 0x6d,
+	0xfa, 0x9c, 0xfe, 0xfd, 0xce, 0xe9, 0xd3, 0xa7, 0x8f, 0x4e, 0xb7, 0xc0, 0x9d, 0x5e, 0x18, 0xf6,
+	0x3c, 0x5c, 0x43, 0x0e, 0xab, 0xa9, 0x4f, 0xf1, 0xd5, 0xaf, 0xd7, 0x28, 0x66, 0x61, 0x44, 0x6d,
+	0xcc, 0x6a, 0x36, 0xf2, 0x09, 0x72, 0x7b, 0x41, 0x95, 0xd0, 0x90, 0x87, 0xf0, 0x86, 0x9a, 0x56,
+	0x45, 0x0e, 0xab, 0x26, 0x88, 0x6a, 0xbf, 0x5e, 0x4d, 0x10, 0x95, 0x8f, 0xa7, 0x91, 0xda, 0xa1,
+	0xef, 0x87, 0x41, 0xad, 0xeb, 0x3a, 0x8e, 0x1b, 0xf4, 0x14, 0x61, 0xe5, 0x5e, 0xce, 0x6c, 0x3b,
+	0x62, 0x3c, 0xf4, 0x2d, 0x82, 0x28, 0xf2, 0x31, 0xc7, 0x54, 0xc3, 0x76, 0x73, 0x60, 0x27, 0x14,
+	0x7f, 0x13, 0xe1, 0xc0, 0x1e, 0x58, 0x36, 0x22, 0x1a, 0xf3, 0x79, 0x0e, 0x86, 0x62, 0xe4, 0x59,
+	0xdc, 0xf5, 0xb1, 0xa5, 0x5d, 0xb4, 0x18, 0xe6, 0x7c, 0xe8, 0xea, 0xfd, 0x1c, 0x3c, 0x47, 0xb4,
+	0x87, 0xf9, 0x24, 0x6e, 0x6f, 0x1a, 0x0e, 0x07, 0x91, 0xcf, 0x6a, 0xc8, 0xb1, 0x18, 0xa6, 0x7d,
+	0x81, 0x0b, 0x09, 0x77, 0x7d, 0xf7, 0x57, 0x88, 0xbb, 0x61, 0x60, 0x31, 0x8e, 0x78, 0xc4, 0x34,
+	0xc7, 0xa3, 0x3c, 0x8e, 0x3e, 0xa6, 0xdc, 0x65, 0x82, 0xc4, 0x3e, 0x45, 0x41, 0x80, 0x3d, 0x8b,
+	0x45, 0x5d, 0x8b, 0x0f, 0x08, 0xd6, 0x0c, 0x0f, 0xe7, 0x67, 0x48, 0xa1, 0x1b, 0x39, 0x68, 0x42,
+	0xac, 0x38, 0x53, 0x2c, 0x31, 0x60, 0x3c, 0xa4, 0x31, 0xf6, 0xcb, 0x39, 0xb0, 0x49, 0xe4, 0x39,
+	0x45, 0x1c, 0xf7, 0x06, 0x56, 0x2f, 0x44, 0x23, 0x8e, 0xfc, 0x6c, 0x36, 0xd9, 0x04, 0xbe, 0x78,
+	0x04, 0xba, 0x14, 0x05, 0x8e, 0xc5, 0xd0, 0x09, 0xe6, 0x03, 0x8b, 0x45, 0x2e, 0x47, 0x5d, 0xd7,
+	0x73, 0xf9, 0xa0, 0x18, 0x3a, 0x59, 0x01, 0x3e, 0x23, 0x98, 0xba, 0x3e, 0x0e, 0x78, 0xda, 0xf6,
+	0x83, 0x82, 0xe8, 0x38, 0x13, 0x46, 0x36, 0xbf, 0x5e, 0x14, 0x9c, 0x06, 0xe5, 0xf8, 0x1b, 0xe0,
+	0x1e, 0xe2, 0x6e, 0x1f, 0x5b, 0x3d, 0x1c, 0x5a, 0x2a, 0x73, 0xd3, 0xfe, 0xde, 0x99, 0x8d, 0x26,
+	0x68, 0x20, 0x57, 0xe8, 0x87, 0x4e, 0xc1, 0xe8, 0x92, 0x90, 0xb9, 0x33, 0xec, 0xe5, 0x9c, 0x91,
+	0x3e, 0x0a, 0x5c, 0x3e, 0xb0, 0xc8, 0x29, 0xa2, 0x3e, 0xb2, 0x1c, 0x97, 0x11, 0x0f, 0x0d, 0xac,
+	0x88, 0x7a, 0x69, 0x0f, 0xee, 0xcf, 0xc3, 0xc1, 0xf1, 0x19, 0xd7, 0xb8, 0x9d, 0x18, 0x47, 0xdc,
+	0xa4, 0xf0, 0x69, 0xd5, 0x35, 0xad, 0x92, 0xa3, 0x6e, 0x74, 0x52, 0x7b, 0x47, 0x11, 0x21, 0x98,
+	0xc6, 0x41, 0xbe, 0x9a, 0x82, 0xa2, 0x20, 0x08, 0xb9, 0x3c, 0xba, 0x5a, 0xfb, 0xc1, 0xef, 0xeb,
+	0xe0, 0x62, 0x4b, 0x6f, 0x0e, 0xfc, 0x01, 0x58, 0x8e, 0xc9, 0xad, 0x00, 0xf9, 0xd8, 0x28, 0x5d,
+	0x2f, 0xdd, 0xbc, 0x64, 0x2e, 0xc5, 0xc2, 0x43, 0xe4, 0x63, 0x78, 0x1b, 0x94, 0x5d, 0xc7, 0x38,
+	0x77, 0xbd, 0x74, 0x73, 0x71, 0xf7, 0x8a, 0x2e, 0xb0, 0xd5, 0xd8, 0x78, 0xf5, 0x20, 0xe0, 0xf7,
+	0xef, 0x1e, 0x23, 0x2f, 0xc2, 0x66, 0xd9, 0x75, 0xe0, 0x1d, 0xf0, 0x9e, 0x24, 0x7a, 0x4f, 0x4e,
+	0xbf, 0x3a, 0x31, 0xbd, 0xc3, 0xa9, 0x1b, 0xf4, 0xd4, 0x7c, 0x39, 0x13, 0xbe, 0x06, 0x17, 0x54,
+	0x8e, 0x18, 0xe7, 0xaf, 0x97, 0x6e, 0xae, 0xec, 0x3e, 0xaa, 0x4e, 0x2b, 0xe7, 0x32, 0x64, 0xd5,
+	0xd8, 0xf9, 0x8e, 0x04, 0x3d, 0x09, 0x22, 0x7f, 0x4c, 0x64, 0x6a, 0x3e, 0x18, 0x81, 0x95, 0xd1,
+	0xd4, 0x35, 0x36, 0xa5, 0x85, 0xc3, 0xa2, 0x16, 0x14, 0x38, 0xcb, 0x50, 0x5a, 0x63, 0x2e, 0xb3,
+	0xf4, 0x10, 0xfe, 0xb5, 0x04, 0xae, 0xcd, 0xae, 0x9f, 0xc6, 0x45, 0xe9, 0xc7, 0x57, 0x39, 0x7e,
+	0x34, 0x1d, 0x6d, 0xe7, 0x65, 0x8a, 0x22, 0xe5, 0xcd, 0x0c, 0xbd, 0x79, 0x05, 0x4d, 0x57, 0xc2,
+	0x3f, 0x94, 0x80, 0x31, 0xad, 0xb6, 0x1a, 0x97, 0xa4, 0x6f, 0xed, 0x5c, 0xdf, 0x12, 0x78, 0x4b,
+	0xa1, 0x8f, 0x06, 0x04, 0x6b, 0xb7, 0xb2, 0x54, 0xe6, 0x16, 0xca, 0x94, 0xc3, 0x3f, 0x95, 0xc0,
+	0xd5, 0x59, 0x3f, 0x15, 0x06, 0x90, 0x0e, 0x1d, 0xcf, 0xed, 0x50, 0x27, 0xea, 0xce, 0xf0, 0x49,
+	0x6b, 0xcd, 0x1d, 0x34, 0x4d, 0x05, 0xdb, 0x60, 0x93, 0x53, 0x64, 0x7f, 0x2d, 0xbc, 0x12, 0xc7,
+	0x9a, 0x63, 0x9f, 0x78, 0x88, 0x63, 0x63, 0xb1, 0x40, 0x72, 0xaf, 0xc7, 0xd0, 0x57, 0xd4, 0x3b,
+	0xd2, 0x40, 0x68, 0x83, 0x4d, 0x41, 0x34, 0xde, 0x3f, 0x30, 0x63, 0xe9, 0xfa, 0xb9, 0x9b, 0x8b,
+	0xbb, 0xb5, 0xa9, 0x6b, 0x54, 0xbf, 0xe6, 0xd5, 0x96, 0x04, 0xb6, 0x63, 0x9c, 0xb9, 0x1e, 0x51,
+	0x6f, 0x4c, 0xc6, 0xe0, 0x37, 0x60, 0x67, 0x6a, 0xd7, 0x60, 0xfc, 0x58, 0xba, 0x7e, 0x3f, 0xcf,
+	0x90, 0x89, 0x91, 0x77, 0xe4, 0xfa, 0x78, 0x4f, 0xc1, 0x3b, 0x0a, 0x6d, 0x6e, 0xd1, 0x4c, 0x39,
+	0x3c, 0x01, 0x6b, 0x01, 0xe6, 0xef, 0x42, 0xfa, 0x75, 0x6c, 0x88, 0x19, 0x2b, 0xd2, 0xd2, 0x83,
+	0x6a, 0x6e, 0x73, 0x96, 0x9c, 0xaa, 0xea, 0xa1, 0xe2, 0xd0, 0xac, 0xcc, 0x5c, 0x0d, 0x46, 0x05,
+	0x10, 0x81, 0xe5, 0xd3, 0x90, 0x8b, 0xe4, 0xd0, 0xcb, 0xb9, 0x2e, 0x8d, 0x3c, 0x9c, 0xc7, 0xc8,
+	0xbe, 0x20, 0xd0, 0x8c, 0x07, 0xc1, 0x49, 0x68, 0x2e, 0x9d, 0xa6, 0x24, 0xf0, 0xb7, 0x25, 0x50,
+	0x71, 0x06, 0x01, 0xf2, 0x5d, 0xdb, 0x62, 0x18, 0x51, 0xfb, 0xd4, 0x42, 0x0e, 0x4b, 0x0c, 0xde,
+	0x90, 0x06, 0x5b, 0xf3, 0x18, 0x7c, 0xac, 0xd8, 0x3a, 0x92, 0xac, 0xe9, 0xb0, 0x38, 0x98, 0xdb,
+	0x4e, 0xb6, 0x42, 0x44, 0x93, 0x9d, 0x86, 0x84, 0xa4, 0xf7, 0xed, 0x87, 0xf3, 0x47, 0xb3, 0xa3,
+	0x39, 0x62, 0x7b, 0xab, 0x6c, 0x54, 0x00, 0xdf, 0x82, 0xcb, 0x13, 0xed, 0xa1, 0x71, 0x5b, 0x1a,
+	0xba, 0x93, 0x97, 0x20, 0x47, 0x31, 0x30, 0x66, 0x5f, 0xe3, 0x63, 0x12, 0xf8, 0x0e, 0x6c, 0x8f,
+	0xfd, 0xae, 0x26, 0x46, 0x6a, 0xd2, 0xc8, 0xa3, 0x79, 0x56, 0xf3, 0x14, 0x87, 0xca, 0xa6, 0x38,
+	0x9a, 0xb1, 0xd1, 0x8d, 0x5e, 0x86, 0x14, 0x12, 0xb0, 0x31, 0xd2, 0xbf, 0xc5, 0x56, 0xeb, 0xd2,
+	0xea, 0xe7, 0xf3, 0x58, 0x6d, 0x12, 0x32, 0xac, 0xf9, 0xca, 0x26, 0x44, 0x13, 0x32, 0x78, 0x17,
+	0x5c, 0xf0, 0x50, 0x17, 0x7b, 0xcc, 0xb8, 0x27, 0x0f, 0xf2, 0xec, 0xd2, 0xa0, 0xe7, 0xc2, 0x01,
+	0x58, 0x1d, 0x6b, 0xcc, 0x8c, 0xcb, 0x85, 0x8a, 0x6f, 0x6c, 0xfe, 0x49, 0x82, 0x4e, 0x0a, 0x5d,
+	0xb6, 0xca, 0x5c, 0xc1, 0x23, 0x63, 0xd8, 0x04, 0xcb, 0x5d, 0xc4, 0x70, 0x12, 0x23, 0xe3, 0x6a,
+	0x81, 0x92, 0xb6, 0x24, 0x20, 0x49, 0xef, 0xf0, 0x04, 0xac, 0x0e, 0x3b, 0xe4, 0xc8, 0xe9, 0x61,
+	0x6e, 0x5c, 0x28, 0x40, 0xb2, 0x12, 0x83, 0xf6, 0x24, 0x06, 0xfe, 0x06, 0x6c, 0x66, 0xf6, 0xc7,
+	0xc6, 0x96, 0x0c, 0xc5, 0xb3, 0x9c, 0x50, 0xc4, 0x85, 0x48, 0x43, 0x93, 0x38, 0x64, 0xc8, 0xcd,
+	0xf5, 0xee, 0xa4, 0x10, 0x3e, 0x00, 0x80, 0x71, 0x44, 0xb9, 0xe5, 0x88, 0xca, 0xbe, 0x5e, 0x60,
+	0x05, 0x97, 0xe4, 0xfc, 0xc7, 0xa2, 0x9e, 0x7f, 0x0a, 0x2e, 0xe2, 0xc0, 0x51, 0xd0, 0x8d, 0x02,
+	0xd0, 0xff, 0xc3, 0x81, 0x23, 0x81, 0x5f, 0x80, 0xb5, 0x13, 0x37, 0x40, 0x9e, 0xfc, 0x5d, 0x61,
+	0xd1, 0xc9, 0x89, 0x7b, 0x66, 0xfc, 0xa8, 0x48, 0xf4, 0x24, 0xea, 0x15, 0xf5, 0x3a, 0x12, 0x03,
+	0x5f, 0x83, 0x95, 0x91, 0x5b, 0x25, 0x33, 0x6e, 0xca, 0x04, 0xfc, 0x24, 0xef, 0xfc, 0x7e, 0x11,
+	0xa3, 0x5a, 0x88, 0x3c, 0x09, 0x38, 0x1d, 0x98, 0xcb, 0x27, 0x29, 0x11, 0x83, 0x7f, 0x2c, 0x81,
+	0x6b, 0x7d, 0xd7, 0xc1, 0xa1, 0x35, 0xed, 0x0e, 0x62, 0x7c, 0x54, 0x28, 0x59, 0xf7, 0x04, 0xbc,
+	0x23, 0xd1, 0x9d, 0x21, 0x58, 0x6d, 0x52, 0xa6, 0xca, 0xbc, 0x22, 0xed, 0x66, 0x2b, 0xe1, 0x5b,
+	0xb0, 0x3c, 0xd2, 0x34, 0x1b, 0x1f, 0xcb, 0xb0, 0xfd, 0x74, 0x9e, 0x53, 0x7d, 0x2c, 0x09, 0xda,
+	0x12, 0x6f, 0x2e, 0xf5, 0x53, 0x23, 0x78, 0x06, 0xb6, 0x18, 0xf6, 0xb0, 0x2d, 0xaf, 0x05, 0xe9,
+	0xd6, 0xcd, 0xf8, 0x89, 0xb4, 0xd3, 0x9c, 0xab, 0x02, 0xc7, 0x4c, 0xe9, 0x1e, 0xcc, 0xdc, 0x64,
+	0x59, 0x62, 0x51, 0xf5, 0x93, 0x6e, 0x23, 0xae, 0x58, 0xd5, 0xf9, 0xab, 0xfe, 0x91, 0xe6, 0x48,
+	0xaa, 0x3e, 0x1f, 0x15, 0xc0, 0xb7, 0x60, 0x29, 0x7d, 0x53, 0x32, 0xee, 0xca, 0x5d, 0x6c, 0xe4,
+	0xec, 0x62, 0x5b, 0x41, 0x5e, 0x84, 0x8e, 0x3a, 0x5f, 0xa9, 0xb1, 0xb9, 0x48, 0x86, 0x03, 0x78,
+	0x00, 0xd6, 0xc6, 0xcf, 0xb3, 0xb1, 0x9d, 0x9f, 0xd9, 0xfb, 0x0b, 0xe6, 0xea, 0xd8, 0xf1, 0x84,
+	0xcf, 0x01, 0x10, 0xd9, 0xea, 0x32, 0x26, 0xe2, 0xff, 0x89, 0x24, 0xf9, 0x28, 0xb7, 0x45, 0x4a,
+	0x10, 0xfb, 0x0b, 0x66, 0x0a, 0x0f, 0x9f, 0x01, 0xe0, 0xa3, 0x20, 0x42, 0x9e, 0x65, 0x13, 0xdb,
+	0x30, 0x24, 0xdb, 0xad, 0x3c, 0xb6, 0x17, 0x12, 0xd1, 0x22, 0xf6, 0xfe, 0x82, 0x79, 0xc9, 0x8f,
+	0x07, 0x23, 0x5c, 0xbe, 0xb1, 0x33, 0x1f, 0x97, 0x9f, 0xe6, 0xf2, 0x47, 0xb8, 0xfa, 0xc6, 0x87,
+	0xf3, 0x71, 0xf5, 0xd3, 0x5c, 0x7d, 0x78, 0x0a, 0x36, 0x7c, 0x74, 0x26, 0x72, 0x0a, 0x5b, 0x76,
+	0x18, 0xf4, 0x31, 0x15, 0x4b, 0x67, 0xc6, 0x35, 0xc9, 0x5a, 0xcf, 0x67, 0x55, 0xd8, 0xd6, 0x10,
+	0xba, 0xbf, 0x60, 0xae, 0xfb, 0x93, 0x62, 0x18, 0x81, 0x9d, 0x0c, 0x4b, 0x56, 0x5f, 0xec, 0xa5,
+	0xf1, 0xff, 0xd2, 0xdc, 0xa7, 0xf3, 0x9b, 0x8b, 0x53, 0x61, 0xdb, 0xcf, 0x56, 0x89, 0x60, 0xe9,
+	0x7e, 0xc2, 0x26, 0xc8, 0xa8, 0x14, 0x0b, 0x96, 0xea, 0x10, 0x5a, 0x04, 0x89, 0x60, 0xf1, 0x78,
+	0x00, 0x43, 0xb0, 0xad, 0xb9, 0x5c, 0x9f, 0x50, 0x2c, 0xb3, 0xc4, 0x62, 0xa7, 0x88, 0x62, 0xe3,
+	0x8e, 0x24, 0xbe, 0x57, 0x8c, 0xf8, 0x20, 0x41, 0x77, 0x04, 0x78, 0x7f, 0xc1, 0xdc, 0xe4, 0x59,
+	0x0a, 0xf8, 0x02, 0x2c, 0x6a, 0x83, 0x34, 0x44, 0xcc, 0x78, 0xbf, 0x58, 0x42, 0x2b, 0x23, 0x66,
+	0x88, 0xc4, 0x5e, 0xe8, 0xd5, 0x8b, 0x11, 0x6c, 0x83, 0x25, 0x4d, 0xc7, 0x08, 0x0e, 0x1c, 0xe3,
+	0x8a, 0xe4, 0xbb, 0x5d, 0x8c, 0xaf, 0x23, 0x20, 0xfb, 0x0b, 0xa6, 0xf6, 0x48, 0x0e, 0x85, 0x83,
+	0x04, 0x53, 0x5b, 0x94, 0x06, 0x71, 0x46, 0x3e, 0x28, 0xe6, 0x60, 0x5b, 0x41, 0xd4, 0x21, 0x01,
+	0x24, 0x19, 0x8d, 0x6c, 0x96, 0x6f, 0xdc, 0x9a, 0x6f, 0xb3, 0xfc, 0xf4, 0x66, 0xf9, 0x95, 0xff,
+	0x94, 0xc1, 0xea, 0xd8, 0xf5, 0x00, 0x3e, 0x07, 0x1b, 0x9a, 0x5f, 0x11, 0xe9, 0x7e, 0x5d, 0x3e,
+	0x62, 0x2c, 0xee, 0x56, 0x26, 0xca, 0xcd, 0x5e, 0x18, 0x7a, 0xea, 0x67, 0x14, 0x2a, 0xdc, 0x53,
+	0x39, 0x41, 0xf5, 0xdf, 0xf0, 0x10, 0x6c, 0xc6, 0xe1, 0x54, 0x6d, 0xbf, 0xbe, 0x7c, 0x18, 0xe5,
+	0x5c, 0xba, 0x75, 0x1d, 0x44, 0x89, 0xd3, 0x5e, 0xc2, 0x36, 0xd8, 0x8a, 0x57, 0x1f, 0x06, 0x5c,
+	0xc4, 0x34, 0x26, 0x3c, 0x97, 0x4b, 0xa8, 0xd7, 0xd5, 0x52, 0xc0, 0x98, 0xf1, 0x2d, 0x78, 0x5f,
+	0x33, 0x12, 0x44, 0x79, 0x80, 0xe9, 0xb8, 0xa7, 0xef, 0xe5, 0x12, 0x57, 0x14, 0x41, 0x5b, 0xe1,
+	0x47, 0x1c, 0xae, 0xfc, 0x12, 0xac, 0x8d, 0xdf, 0x8d, 0x60, 0x0b, 0xac, 0xaa, 0x0b, 0x97, 0xd8,
+	0x53, 0x4c, 0x2d, 0xd7, 0xd1, 0xd1, 0x9d, 0xf9, 0x10, 0xa4, 0x2e, 0x69, 0x2d, 0x09, 0x39, 0x70,
+	0x2a, 0xff, 0x2e, 0x03, 0x38, 0xd9, 0x48, 0xc3, 0x7f, 0x96, 0x40, 0x65, 0xfa, 0xd3, 0xaa, 0xb4,
+	0xb3, 0xb2, 0x7b, 0x9a, 0x77, 0xed, 0x1f, 0xf2, 0x8e, 0xb5, 0x7c, 0x4f, 0x43, 0x94, 0x7a, 0x93,
+	0xc8, 0x9d, 0x66, 0x6e, 0x77, 0xb3, 0x15, 0xb0, 0x0e, 0x2e, 0x88, 0xeb, 0x84, 0xeb, 0xe8, 0x4c,
+	0x98, 0xdd, 0xa1, 0x9d, 0x47, 0x84, 0x1c, 0x38, 0xb0, 0x07, 0x2e, 0x25, 0x4f, 0xce, 0x72, 0xc3,
+	0xf3, 0x5b, 0xd9, 0x94, 0x8f, 0x4d, 0x42, 0x3a, 0x02, 0x39, 0xee, 0x7b, 0x2c, 0x37, 0x2f, 0x22,
+	0xfd, 0x55, 0xf9, 0x5b, 0x19, 0x6c, 0x4f, 0xb9, 0x61, 0xc2, 0xcf, 0xc0, 0xa2, 0x13, 0xfa, 0xc8,
+	0x0d, 0x86, 0x8f, 0x7b, 0x79, 0xee, 0x03, 0x05, 0x90, 0x0f, 0x7f, 0x4d, 0xb0, 0xec, 0xa1, 0xa0,
+	0x17, 0xa1, 0x9e, 0xa8, 0xf1, 0x0e, 0x2e, 0xb4, 0xfe, 0xa5, 0x18, 0xd2, 0x12, 0xdd, 0xc0, 0x4b,
+	0xb0, 0x15, 0x31, 0x6c, 0xb1, 0x88, 0x10, 0xcf, 0xc5, 0x8e, 0x68, 0x77, 0x99, 0x15, 0x06, 0xde,
+	0xa0, 0xc0, 0x21, 0x58, 0x8f, 0x18, 0xee, 0x68, 0xe0, 0x2b, 0xea, 0xb1, 0x97, 0x81, 0x37, 0x80,
+	0xbb, 0xe0, 0xfc, 0x09, 0xc6, 0x0e, 0x33, 0xce, 0x17, 0xb8, 0x68, 0xa9, 0xa9, 0x95, 0x3f, 0x97,
+	0xc1, 0xea, 0xd8, 0x65, 0x18, 0x3e, 0x04, 0x8b, 0x3e, 0xa6, 0xf6, 0x29, 0x0a, 0x78, 0xc1, 0xa4,
+	0x06, 0xf1, 0xfc, 0x03, 0x47, 0x44, 0x86, 0x21, 0x0f, 0x33, 0xcb, 0x0e, 0x23, 0xd1, 0x3c, 0x17,
+	0x8b, 0x8c, 0x84, 0xb4, 0x14, 0x02, 0xee, 0x83, 0xcb, 0xc9, 0xf5, 0x89, 0x50, 0x37, 0xa4, 0xa2,
+	0xa3, 0x9e, 0xf1, 0xc8, 0x5a, 0xdf, 0x55, 0x2c, 0x6b, 0x31, 0xaa, 0xad, 0x41, 0xf0, 0x33, 0xb0,
+	0x84, 0x03, 0xd4, 0xf5, 0xb0, 0xe5, 0x85, 0x36, 0xf2, 0x0a, 0x54, 0x81, 0x45, 0x35, 0xff, 0xb9,
+	0x98, 0x5e, 0xf9, 0x7b, 0x19, 0x2c, 0xa5, 0x1b, 0x62, 0xf8, 0x17, 0xd1, 0xf9, 0xcf, 0x7c, 0xdb,
+	0xd6, 0x67, 0xf3, 0x75, 0x4e, 0x42, 0xa7, 0x59, 0x1f, 0x2b, 0x8a, 0x57, 0xd4, 0x4b, 0x5a, 0xc8,
+	0xe9, 0x6a, 0xb3, 0xd2, 0x9f, 0xaa, 0x83, 0x14, 0xc0, 0xc9, 0x57, 0x73, 0xb9, 0x01, 0x2b, 0xbb,
+	0x8f, 0xe7, 0xf0, 0xe8, 0x08, 0x9f, 0xf1, 0x09, 0x3f, 0x84, 0xd0, 0x5c, 0xeb, 0x8f, 0x49, 0x2a,
+	0x0e, 0xd8, 0xcc, 0xec, 0xe5, 0xe1, 0x97, 0x00, 0xa6, 0xba, 0x1f, 0x64, 0xcb, 0x97, 0x76, 0xa3,
+	0x54, 0x20, 0x37, 0x2f, 0x0f, 0x71, 0x4d, 0x05, 0xab, 0x7c, 0x57, 0x06, 0x1b, 0x59, 0xcf, 0x1c,
+	0xf0, 0x77, 0x25, 0x60, 0x4c, 0xfb, 0xaf, 0x42, 0xef, 0x45, 0xde, 0x9b, 0x76, 0x5b, 0xc3, 0x47,
+	0xf8, 0x55, 0x27, 0x9f, 0xa5, 0x31, 0x37, 0x49, 0x96, 0x58, 0x7a, 0x32, 0xed, 0x5f, 0x1a, 0xbd,
+	0x07, 0x79, 0x9e, 0x1c, 0x6a, 0xf8, 0xa4, 0x27, 0x99, 0x1a, 0x73, 0x33, 0xc8, 0x12, 0x57, 0x4c,
+	0xb0, 0x3a, 0x76, 0xd5, 0x81, 0x3f, 0x07, 0x4b, 0xe9, 0xf7, 0xda, 0x42, 0xf5, 0x6e, 0x31, 0xf5,
+	0x4c, 0xdb, 0xf8, 0xc5, 0xf7, 0xcd, 0x43, 0x70, 0x63, 0xe8, 0xb3, 0xfe, 0x22, 0x2e, 0x13, 0xdd,
+	0x49, 0x2d, 0x79, 0xfa, 0xb8, 0xa5, 0x1e, 0x70, 0x31, 0x65, 0xb5, 0x5f, 0xc7, 0x9f, 0xdf, 0x26,
+	0x7f, 0x79, 0x09, 0xa1, 0xfe, 0xfc, 0x76, 0xef, 0x0a, 0xd8, 0x99, 0xfa, 0x3f, 0xe2, 0xde, 0x7f,
+	0x4b, 0xe0, 0x43, 0x3b, 0xf4, 0xf3, 0xaf, 0x77, 0x7b, 0xcb, 0xad, 0xe4, 0xd4, 0x87, 0x3c, 0x6c,
+	0x97, 0xbe, 0x7a, 0xa6, 0x31, 0xbd, 0x50, 0xd4, 0xdb, 0x6a, 0x48, 0x7b, 0xb5, 0x1e, 0x0e, 0xe4,
+	0x12, 0x6b, 0x43, 0xb7, 0x67, 0xfc, 0x89, 0xfe, 0x20, 0xf9, 0xfa, 0x47, 0xf9, 0xdc, 0xd3, 0x66,
+	0xf3, 0xbb, 0xf2, 0x0d, 0xd5, 0x0e, 0x55, 0x9b, 0x0e, 0xab, 0xaa, 0x4f, 0xf1, 0x75, 0x5c, 0xaf,
+	0x9a, 0xf1, 0xcc, 0x7f, 0xc5, 0x73, 0xde, 0x34, 0x1d, 0xf6, 0x26, 0x99, 0xf3, 0xe6, 0xb8, 0xfe,
+	0x26, 0x99, 0xf3, 0x7d, 0xf9, 0x43, 0xa5, 0x68, 0x34, 0x9a, 0x0e, 0x6b, 0x34, 0x92, 0x59, 0x8d,
+	0xc6, 0x71, 0xbd, 0xd1, 0x48, 0xe6, 0x75, 0x2f, 0x48, 0x67, 0xeb, 0xff, 0x0b, 0x00, 0x00, 0xff,
+	0xff, 0xde, 0x7f, 0x4a, 0x3e, 0xf0, 0x1f, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_audience_view.pb.go b/googleapis/ads/googleads/v3/resources/campaign_audience_view.pb.go
new file mode 100644
index 0000000..b34fe61
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_audience_view.pb.go
@@ -0,0 +1,104 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_audience_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A campaign audience view.
+// Includes performance data from interests and remarketing lists for Display
+// Network and YouTube Network ads, and remarketing lists for search ads (RLSA),
+// aggregated by campaign and audience criterion. This view only includes
+// audiences attached at the campaign level.
+type CampaignAudienceView struct {
+	// The resource name of the campaign audience view.
+	// Campaign audience view resource names have the form:
+	//
+	// `customers/{customer_id}/campaignAudienceViews/{campaign_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CampaignAudienceView) Reset()         { *m = CampaignAudienceView{} }
+func (m *CampaignAudienceView) String() string { return proto.CompactTextString(m) }
+func (*CampaignAudienceView) ProtoMessage()    {}
+func (*CampaignAudienceView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c3b43f13f60a17e8, []int{0}
+}
+
+func (m *CampaignAudienceView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignAudienceView.Unmarshal(m, b)
+}
+func (m *CampaignAudienceView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignAudienceView.Marshal(b, m, deterministic)
+}
+func (m *CampaignAudienceView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignAudienceView.Merge(m, src)
+}
+func (m *CampaignAudienceView) XXX_Size() int {
+	return xxx_messageInfo_CampaignAudienceView.Size(m)
+}
+func (m *CampaignAudienceView) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignAudienceView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignAudienceView proto.InternalMessageInfo
+
+func (m *CampaignAudienceView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*CampaignAudienceView)(nil), "google.ads.googleads.v3.resources.CampaignAudienceView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_audience_view.proto", fileDescriptor_c3b43f13f60a17e8)
+}
+
+var fileDescriptor_c3b43f13f60a17e8 = []byte{
+	// 325 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x31, 0x4b, 0x03, 0x31,
+	0x18, 0x86, 0xb9, 0x13, 0x04, 0x0f, 0x5d, 0x8a, 0x83, 0x2d, 0x0e, 0x56, 0x29, 0xb8, 0x98, 0x0c,
+	0xb7, 0x45, 0x10, 0xd2, 0x0e, 0x05, 0x07, 0x29, 0x1d, 0x6e, 0x90, 0x83, 0x12, 0x2f, 0x21, 0x04,
+	0x9a, 0x7c, 0xc7, 0xe5, 0xda, 0x0e, 0xd2, 0xd5, 0x1f, 0xe2, 0xe8, 0xec, 0xaf, 0xf0, 0xa7, 0xf4,
+	0x57, 0xc8, 0x35, 0x97, 0xb4, 0xc3, 0xa1, 0xdb, 0xcb, 0x7d, 0xcf, 0xfb, 0x7e, 0x5f, 0xde, 0x4b,
+	0x9e, 0x24, 0x80, 0x5c, 0x0a, 0xcc, 0xb8, 0xc5, 0x4e, 0x36, 0x6a, 0x9d, 0xe2, 0x4a, 0x58, 0x58,
+	0x55, 0x85, 0xb0, 0xb8, 0x60, 0xba, 0x64, 0x4a, 0x9a, 0x05, 0x5b, 0x71, 0x25, 0x4c, 0x21, 0x16,
+	0x6b, 0x25, 0x36, 0xa8, 0xac, 0xa0, 0x86, 0xde, 0xd0, 0x99, 0x10, 0xe3, 0x16, 0x05, 0x3f, 0x5a,
+	0xa7, 0x28, 0xf8, 0x07, 0x7d, 0xbf, 0xa2, 0x54, 0x21, 0xd5, 0xb9, 0x07, 0xd7, 0x47, 0x23, 0x66,
+	0x0c, 0xd4, 0xac, 0x56, 0x60, 0xac, 0x9b, 0xde, 0x7e, 0x47, 0xc9, 0xe5, 0xa4, 0x5d, 0x4e, 0xdb,
+	0xdd, 0x99, 0x12, 0x9b, 0xde, 0x5d, 0x72, 0xe1, 0x83, 0x16, 0x86, 0x69, 0x71, 0x15, 0xdd, 0x44,
+	0xf7, 0x67, 0xf3, 0x73, 0xff, 0xf1, 0x85, 0x69, 0x41, 0x36, 0x3b, 0x5a, 0x27, 0x0f, 0x87, 0x9b,
+	0x5a, 0x55, 0x2a, 0x8b, 0x0a, 0xd0, 0xb8, 0x33, 0x78, 0x52, 0xac, 0x6c, 0x0d, 0x5a, 0x54, 0x16,
+	0xbf, 0x7b, 0xb9, 0x0d, 0x05, 0x1c, 0xa3, 0x0d, 0xd0, 0xd9, 0xcb, 0x76, 0xfc, 0x11, 0x27, 0xa3,
+	0x02, 0x34, 0xfa, 0xb7, 0x99, 0x71, 0xbf, 0xeb, 0x88, 0x59, 0xf3, 0xf6, 0x59, 0xf4, 0xfa, 0xdc,
+	0xfa, 0x25, 0x2c, 0x99, 0x91, 0x08, 0x2a, 0x89, 0xa5, 0x30, 0xfb, 0x66, 0xf0, 0xe1, 0x2d, 0x7f,
+	0xfc, 0xb8, 0xc7, 0xa0, 0x3e, 0xe3, 0x93, 0x29, 0xa5, 0x5f, 0xf1, 0x70, 0xea, 0x22, 0x29, 0xb7,
+	0xc8, 0xc9, 0x46, 0x65, 0x29, 0x9a, 0x7b, 0xf2, 0xc7, 0x33, 0x39, 0xe5, 0x36, 0x0f, 0x4c, 0x9e,
+	0xa5, 0x79, 0x60, 0x76, 0xf1, 0xc8, 0x0d, 0x08, 0xa1, 0xdc, 0x12, 0x12, 0x28, 0x42, 0xb2, 0x94,
+	0x90, 0xc0, 0xbd, 0x9d, 0xee, 0x8f, 0x4d, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xd3, 0x3e,
+	0xb3, 0x64, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_bid_modifier.pb.go b/googleapis/ads/googleads/v3/resources/campaign_bid_modifier.pb.go
new file mode 100644
index 0000000..affb921
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_bid_modifier.pb.go
@@ -0,0 +1,177 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_bid_modifier.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Represents a bid-modifiable only criterion at the campaign level.
+type CampaignBidModifier struct {
+	// The resource name of the campaign bid modifier.
+	// Campaign bid modifier resource names have the form:
+	//
+	// `customers/{customer_id}/campaignBidModifiers/{campaign_id}~{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The campaign to which this criterion belongs.
+	Campaign *wrappers.StringValue `protobuf:"bytes,2,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// The ID of the criterion to bid modify.
+	//
+	// This field is ignored for mutates.
+	CriterionId *wrappers.Int64Value `protobuf:"bytes,3,opt,name=criterion_id,json=criterionId,proto3" json:"criterion_id,omitempty"`
+	// The modifier for the bid when the criterion matches.
+	BidModifier *wrappers.DoubleValue `protobuf:"bytes,4,opt,name=bid_modifier,json=bidModifier,proto3" json:"bid_modifier,omitempty"`
+	// The criterion of this campaign bid modifier.
+	//
+	// Types that are valid to be assigned to Criterion:
+	//	*CampaignBidModifier_InteractionType
+	Criterion            isCampaignBidModifier_Criterion `protobuf_oneof:"criterion"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *CampaignBidModifier) Reset()         { *m = CampaignBidModifier{} }
+func (m *CampaignBidModifier) String() string { return proto.CompactTextString(m) }
+func (*CampaignBidModifier) ProtoMessage()    {}
+func (*CampaignBidModifier) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6a7c4dd3c8a563d8, []int{0}
+}
+
+func (m *CampaignBidModifier) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignBidModifier.Unmarshal(m, b)
+}
+func (m *CampaignBidModifier) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignBidModifier.Marshal(b, m, deterministic)
+}
+func (m *CampaignBidModifier) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignBidModifier.Merge(m, src)
+}
+func (m *CampaignBidModifier) XXX_Size() int {
+	return xxx_messageInfo_CampaignBidModifier.Size(m)
+}
+func (m *CampaignBidModifier) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignBidModifier.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignBidModifier proto.InternalMessageInfo
+
+func (m *CampaignBidModifier) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignBidModifier) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *CampaignBidModifier) GetCriterionId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CriterionId
+	}
+	return nil
+}
+
+func (m *CampaignBidModifier) GetBidModifier() *wrappers.DoubleValue {
+	if m != nil {
+		return m.BidModifier
+	}
+	return nil
+}
+
+type isCampaignBidModifier_Criterion interface {
+	isCampaignBidModifier_Criterion()
+}
+
+type CampaignBidModifier_InteractionType struct {
+	InteractionType *common.InteractionTypeInfo `protobuf:"bytes,5,opt,name=interaction_type,json=interactionType,proto3,oneof"`
+}
+
+func (*CampaignBidModifier_InteractionType) isCampaignBidModifier_Criterion() {}
+
+func (m *CampaignBidModifier) GetCriterion() isCampaignBidModifier_Criterion {
+	if m != nil {
+		return m.Criterion
+	}
+	return nil
+}
+
+func (m *CampaignBidModifier) GetInteractionType() *common.InteractionTypeInfo {
+	if x, ok := m.GetCriterion().(*CampaignBidModifier_InteractionType); ok {
+		return x.InteractionType
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignBidModifier) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignBidModifier_InteractionType)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*CampaignBidModifier)(nil), "google.ads.googleads.v3.resources.CampaignBidModifier")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_bid_modifier.proto", fileDescriptor_6a7c4dd3c8a563d8)
+}
+
+var fileDescriptor_6a7c4dd3c8a563d8 = []byte{
+	// 483 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0xd1, 0x8a, 0xd4, 0x30,
+	0x14, 0x75, 0x3a, 0x2a, 0x6e, 0x66, 0x44, 0xa9, 0x2f, 0x75, 0x5d, 0x64, 0x57, 0x59, 0xd8, 0x07,
+	0x4d, 0xc0, 0x8a, 0x48, 0x44, 0xa5, 0xa3, 0xb0, 0x8e, 0xa0, 0x2c, 0xa3, 0xcc, 0x83, 0x0c, 0xd4,
+	0xb4, 0xc9, 0x94, 0xc0, 0x34, 0xa9, 0x49, 0xba, 0xb2, 0xc8, 0x3e, 0xfa, 0x23, 0x3e, 0xfa, 0x29,
+	0x7e, 0x82, 0x9f, 0xb0, 0x5f, 0x21, 0x6d, 0x93, 0x6c, 0xc5, 0x19, 0xf7, 0xed, 0x34, 0xf7, 0x9c,
+	0x9b, 0x7b, 0x4e, 0x6e, 0xc1, 0xf3, 0x42, 0xca, 0x62, 0xc5, 0x10, 0xa1, 0x1a, 0x75, 0xb0, 0x41,
+	0xc7, 0x31, 0x52, 0x4c, 0xcb, 0x5a, 0xe5, 0x4c, 0xa3, 0x9c, 0x94, 0x15, 0xe1, 0x85, 0x48, 0x33,
+	0x4e, 0xd3, 0x52, 0x52, 0xbe, 0xe4, 0x4c, 0xc1, 0x4a, 0x49, 0x23, 0xc3, 0xbd, 0x4e, 0x03, 0x09,
+	0xd5, 0xd0, 0xcb, 0xe1, 0x71, 0x0c, 0xbd, 0x7c, 0xfb, 0xe1, 0xa6, 0x1b, 0x72, 0x59, 0x96, 0x52,
+	0xa0, 0x5c, 0x71, 0xc3, 0x14, 0x27, 0x5d, 0xc7, 0xed, 0xdb, 0x8e, 0x5e, 0x71, 0x3f, 0x83, 0x2d,
+	0xdd, 0xb5, 0xa5, 0xf6, 0x2b, 0xab, 0x97, 0xe8, 0xab, 0x22, 0x55, 0xc5, 0x94, 0xb6, 0xf5, 0x9d,
+	0x9e, 0x94, 0x08, 0x21, 0x0d, 0x31, 0x5c, 0x0a, 0x5b, 0xbd, 0xf7, 0x7b, 0x08, 0x6e, 0xbd, 0xb2,
+	0x56, 0x26, 0x9c, 0xbe, 0xb3, 0x46, 0xc2, 0xfb, 0xe0, 0xba, 0xbb, 0x27, 0x15, 0xa4, 0x64, 0xd1,
+	0x60, 0x77, 0x70, 0xb0, 0x35, 0x1b, 0xbb, 0xc3, 0xf7, 0xa4, 0x64, 0xe1, 0x53, 0x70, 0xcd, 0xc5,
+	0x10, 0x05, 0xbb, 0x83, 0x83, 0xd1, 0xa3, 0x1d, 0xeb, 0x17, 0xba, 0x69, 0xe0, 0x07, 0xa3, 0xb8,
+	0x28, 0xe6, 0x64, 0x55, 0xb3, 0x99, 0x67, 0x87, 0x2f, 0xc0, 0xd8, 0x3a, 0x94, 0x22, 0xe5, 0x34,
+	0x1a, 0xb6, 0xea, 0x3b, 0xff, 0xa8, 0xa7, 0xc2, 0x3c, 0x79, 0xdc, 0x89, 0x47, 0x5e, 0x30, 0xa5,
+	0xe1, 0x4b, 0x30, 0xee, 0xe7, 0x1e, 0x5d, 0xde, 0x70, 0xfb, 0x6b, 0x59, 0x67, 0x2b, 0x66, 0x1b,
+	0x64, 0x3d, 0x7f, 0x9f, 0xc1, 0x4d, 0x2e, 0x0c, 0x53, 0x24, 0x6f, 0xd2, 0x48, 0xcd, 0x49, 0xc5,
+	0xa2, 0x2b, 0x6d, 0x93, 0x18, 0x6e, 0x7a, 0xbd, 0xee, 0x69, 0x9a, 0x99, 0x9c, 0xee, 0xe3, 0x49,
+	0xc5, 0xa6, 0x62, 0x29, 0xdf, 0x5c, 0x9a, 0xdd, 0xe0, 0x7f, 0x1f, 0x63, 0x73, 0x96, 0x7c, 0x01,
+	0x0f, 0xce, 0x1b, 0x58, 0x54, 0x71, 0xdd, 0x34, 0x42, 0xeb, 0x42, 0x4f, 0xf2, 0x5a, 0x1b, 0x59,
+	0x32, 0xa5, 0xd1, 0x37, 0x07, 0x4f, 0xfd, 0xa6, 0xf5, 0x98, 0x4d, 0x7d, 0xdd, 0xfe, 0x9d, 0x4e,
+	0x46, 0x60, 0xcb, 0xe7, 0x34, 0xf9, 0x1e, 0x80, 0xfd, 0x5c, 0x96, 0xf0, 0xc2, 0x75, 0x9c, 0x44,
+	0x6b, 0xc6, 0x39, 0x6a, 0x42, 0x3c, 0x1a, 0x7c, 0x7a, 0x6b, 0xe5, 0x85, 0x5c, 0x11, 0x51, 0x40,
+	0xa9, 0x0a, 0x54, 0x30, 0xd1, 0x46, 0x8c, 0xce, 0x4d, 0xfd, 0xe7, 0x5f, 0x79, 0xe6, 0xd1, 0x8f,
+	0x60, 0x78, 0x98, 0x24, 0x3f, 0x83, 0xbd, 0xc3, 0xae, 0x65, 0x42, 0x35, 0xec, 0x60, 0x83, 0xe6,
+	0x31, 0x9c, 0x39, 0xe6, 0x2f, 0xc7, 0x59, 0x24, 0x54, 0x2f, 0x3c, 0x67, 0x31, 0x8f, 0x17, 0x9e,
+	0x73, 0x16, 0xec, 0x77, 0x05, 0x8c, 0x13, 0xaa, 0x31, 0xf6, 0x2c, 0x8c, 0xe7, 0x31, 0xc6, 0x9e,
+	0x97, 0x5d, 0x6d, 0x87, 0x8d, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xf9, 0x2e, 0x22, 0xd7,
+	0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_budget.pb.go b/googleapis/ads/googleads/v3/resources/campaign_budget.pb.go
new file mode 100644
index 0000000..60544c3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_budget.pb.go
@@ -0,0 +1,328 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_budget.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A campaign budget.
+type CampaignBudget struct {
+	// The resource name of the campaign budget.
+	// Campaign budget resource names have the form:
+	//
+	// `customers/{customer_id}/campaignBudgets/{budget_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the campaign budget.
+	//
+	// A campaign budget is created using the CampaignBudgetService create
+	// operation and is assigned a budget ID. A budget ID can be shared across
+	// different campaigns; the system will then allocate the campaign budget
+	// among different campaigns to get optimum results.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the campaign budget.
+	//
+	// When creating a campaign budget through CampaignBudgetService, every
+	// explicitly shared campaign budget must have a non-null, non-empty name.
+	// Campaign budgets that are not explicitly shared derive their name from the
+	// attached campaign's name.
+	//
+	// The length of this string must be between 1 and 255, inclusive,
+	// in UTF-8 bytes, (trimmed).
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The amount of the budget, in the local currency for the account.
+	// Amount is specified in micros, where one million is equivalent to one
+	// currency unit. Monthly spend is capped at 30.4 times this amount.
+	AmountMicros *wrappers.Int64Value `protobuf:"bytes,5,opt,name=amount_micros,json=amountMicros,proto3" json:"amount_micros,omitempty"`
+	// The lifetime amount of the budget, in the local currency for the account.
+	// Amount is specified in micros, where one million is equivalent to one
+	// currency unit.
+	TotalAmountMicros *wrappers.Int64Value `protobuf:"bytes,10,opt,name=total_amount_micros,json=totalAmountMicros,proto3" json:"total_amount_micros,omitempty"`
+	// The status of this campaign budget. This field is read-only.
+	Status enums.BudgetStatusEnum_BudgetStatus `protobuf:"varint,6,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.BudgetStatusEnum_BudgetStatus" json:"status,omitempty"`
+	// The delivery method that determines the rate at which the campaign budget
+	// is spent.
+	//
+	// Defaults to STANDARD if unspecified in a create operation.
+	DeliveryMethod enums.BudgetDeliveryMethodEnum_BudgetDeliveryMethod `protobuf:"varint,7,opt,name=delivery_method,json=deliveryMethod,proto3,enum=google.ads.googleads.v3.enums.BudgetDeliveryMethodEnum_BudgetDeliveryMethod" json:"delivery_method,omitempty"`
+	// Specifies whether the budget is explicitly shared. Defaults to true if
+	// unspecified in a create operation.
+	//
+	// If true, the budget was created with the purpose of sharing
+	// across one or more campaigns.
+	//
+	// If false, the budget was created with the intention of only being used
+	// with a single campaign. The budget's name and status will stay in sync
+	// with the campaign's name and status. Attempting to share the budget with a
+	// second campaign will result in an error.
+	//
+	// A non-shared budget can become an explicitly shared. The same operation
+	// must also assign the budget a name.
+	//
+	// A shared campaign budget can never become non-shared.
+	ExplicitlyShared *wrappers.BoolValue `protobuf:"bytes,8,opt,name=explicitly_shared,json=explicitlyShared,proto3" json:"explicitly_shared,omitempty"`
+	// The number of campaigns actively using the budget.
+	//
+	// This field is read-only.
+	ReferenceCount *wrappers.Int64Value `protobuf:"bytes,9,opt,name=reference_count,json=referenceCount,proto3" json:"reference_count,omitempty"`
+	// Indicates whether there is a recommended budget for this campaign budget.
+	//
+	// This field is read-only.
+	HasRecommendedBudget *wrappers.BoolValue `protobuf:"bytes,11,opt,name=has_recommended_budget,json=hasRecommendedBudget,proto3" json:"has_recommended_budget,omitempty"`
+	// The recommended budget amount. If no recommendation is available, this will
+	// be set to the budget amount.
+	// Amount is specified in micros, where one million is equivalent to one
+	// currency unit.
+	//
+	// This field is read-only.
+	RecommendedBudgetAmountMicros *wrappers.Int64Value `protobuf:"bytes,12,opt,name=recommended_budget_amount_micros,json=recommendedBudgetAmountMicros,proto3" json:"recommended_budget_amount_micros,omitempty"`
+	// Period over which to spend the budget. Defaults to DAILY if not specified.
+	Period enums.BudgetPeriodEnum_BudgetPeriod `protobuf:"varint,13,opt,name=period,proto3,enum=google.ads.googleads.v3.enums.BudgetPeriodEnum_BudgetPeriod" json:"period,omitempty"`
+	// The estimated change in weekly clicks if the recommended budget is applied.
+	//
+	// This field is read-only.
+	RecommendedBudgetEstimatedChangeWeeklyClicks *wrappers.Int64Value `protobuf:"bytes,14,opt,name=recommended_budget_estimated_change_weekly_clicks,json=recommendedBudgetEstimatedChangeWeeklyClicks,proto3" json:"recommended_budget_estimated_change_weekly_clicks,omitempty"`
+	// The estimated change in weekly cost in micros if the recommended budget is
+	// applied. One million is equivalent to one currency unit.
+	//
+	// This field is read-only.
+	RecommendedBudgetEstimatedChangeWeeklyCostMicros *wrappers.Int64Value `protobuf:"bytes,15,opt,name=recommended_budget_estimated_change_weekly_cost_micros,json=recommendedBudgetEstimatedChangeWeeklyCostMicros,proto3" json:"recommended_budget_estimated_change_weekly_cost_micros,omitempty"`
+	// The estimated change in weekly interactions if the recommended budget is
+	// applied.
+	//
+	// This field is read-only.
+	RecommendedBudgetEstimatedChangeWeeklyInteractions *wrappers.Int64Value `protobuf:"bytes,16,opt,name=recommended_budget_estimated_change_weekly_interactions,json=recommendedBudgetEstimatedChangeWeeklyInteractions,proto3" json:"recommended_budget_estimated_change_weekly_interactions,omitempty"`
+	// The estimated change in weekly views if the recommended budget is applied.
+	//
+	// This field is read-only.
+	RecommendedBudgetEstimatedChangeWeeklyViews *wrappers.Int64Value `protobuf:"bytes,17,opt,name=recommended_budget_estimated_change_weekly_views,json=recommendedBudgetEstimatedChangeWeeklyViews,proto3" json:"recommended_budget_estimated_change_weekly_views,omitempty"`
+	// The type of the campaign budget.
+	Type                 enums.BudgetTypeEnum_BudgetType `protobuf:"varint,18,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.BudgetTypeEnum_BudgetType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *CampaignBudget) Reset()         { *m = CampaignBudget{} }
+func (m *CampaignBudget) String() string { return proto.CompactTextString(m) }
+func (*CampaignBudget) ProtoMessage()    {}
+func (*CampaignBudget) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3160509214176301, []int{0}
+}
+
+func (m *CampaignBudget) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignBudget.Unmarshal(m, b)
+}
+func (m *CampaignBudget) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignBudget.Marshal(b, m, deterministic)
+}
+func (m *CampaignBudget) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignBudget.Merge(m, src)
+}
+func (m *CampaignBudget) XXX_Size() int {
+	return xxx_messageInfo_CampaignBudget.Size(m)
+}
+func (m *CampaignBudget) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignBudget.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignBudget proto.InternalMessageInfo
+
+func (m *CampaignBudget) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignBudget) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.AmountMicros
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetTotalAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TotalAmountMicros
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetStatus() enums.BudgetStatusEnum_BudgetStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.BudgetStatusEnum_UNSPECIFIED
+}
+
+func (m *CampaignBudget) GetDeliveryMethod() enums.BudgetDeliveryMethodEnum_BudgetDeliveryMethod {
+	if m != nil {
+		return m.DeliveryMethod
+	}
+	return enums.BudgetDeliveryMethodEnum_UNSPECIFIED
+}
+
+func (m *CampaignBudget) GetExplicitlyShared() *wrappers.BoolValue {
+	if m != nil {
+		return m.ExplicitlyShared
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetReferenceCount() *wrappers.Int64Value {
+	if m != nil {
+		return m.ReferenceCount
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetHasRecommendedBudget() *wrappers.BoolValue {
+	if m != nil {
+		return m.HasRecommendedBudget
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetRecommendedBudgetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedBudgetAmountMicros
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetPeriod() enums.BudgetPeriodEnum_BudgetPeriod {
+	if m != nil {
+		return m.Period
+	}
+	return enums.BudgetPeriodEnum_UNSPECIFIED
+}
+
+func (m *CampaignBudget) GetRecommendedBudgetEstimatedChangeWeeklyClicks() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedBudgetEstimatedChangeWeeklyClicks
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetRecommendedBudgetEstimatedChangeWeeklyCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedBudgetEstimatedChangeWeeklyCostMicros
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetRecommendedBudgetEstimatedChangeWeeklyInteractions() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedBudgetEstimatedChangeWeeklyInteractions
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetRecommendedBudgetEstimatedChangeWeeklyViews() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedBudgetEstimatedChangeWeeklyViews
+	}
+	return nil
+}
+
+func (m *CampaignBudget) GetType() enums.BudgetTypeEnum_BudgetType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.BudgetTypeEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*CampaignBudget)(nil), "google.ads.googleads.v3.resources.CampaignBudget")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_budget.proto", fileDescriptor_3160509214176301)
+}
+
+var fileDescriptor_3160509214176301 = []byte{
+	// 800 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xdd, 0x6e, 0xe3, 0x44,
+	0x18, 0x95, 0xb3, 0xa5, 0xb0, 0xb3, 0x69, 0xba, 0xf5, 0x22, 0x64, 0xca, 0x82, 0xb2, 0xa0, 0x15,
+	0x95, 0x16, 0xd9, 0xdd, 0x06, 0x75, 0x91, 0xe1, 0x82, 0x24, 0xbb, 0xaa, 0x16, 0xb6, 0x28, 0x72,
+	0xab, 0x20, 0xa1, 0x48, 0xd6, 0xd4, 0xf3, 0xd5, 0x19, 0xd5, 0x9e, 0xb1, 0x66, 0xc6, 0x29, 0x11,
+	0xaa, 0x84, 0x10, 0xb7, 0x48, 0x3c, 0x03, 0x97, 0x3c, 0x0a, 0x8f, 0xd2, 0x2b, 0x1e, 0x01, 0x79,
+	0xfc, 0x93, 0x3f, 0xba, 0x4e, 0xee, 0x3e, 0xcf, 0x9c, 0x73, 0xbe, 0xe3, 0x33, 0x5f, 0x3c, 0x41,
+	0x2f, 0x42, 0xce, 0xc3, 0x08, 0x1c, 0x4c, 0xa4, 0x93, 0x97, 0x59, 0x35, 0xe9, 0x38, 0x02, 0x24,
+	0x4f, 0x45, 0x00, 0xd2, 0x09, 0x70, 0x9c, 0x60, 0x1a, 0x32, 0xff, 0x22, 0x25, 0x21, 0x28, 0x3b,
+	0x11, 0x5c, 0x71, 0xf3, 0x49, 0x8e, 0xb6, 0x31, 0x91, 0x76, 0x45, 0xb4, 0x27, 0x1d, 0xbb, 0x22,
+	0xee, 0xbb, 0x77, 0x69, 0x03, 0x4b, 0x63, 0xe9, 0xe4, 0x72, 0x3e, 0x81, 0x88, 0x4e, 0x40, 0x4c,
+	0xfd, 0x18, 0xd4, 0x98, 0x93, 0x5c, 0x7e, 0xff, 0xf9, 0x5a, 0xdc, 0x04, 0x04, 0xdd, 0x90, 0x22,
+	0x15, 0x56, 0xa9, 0x2c, 0x28, 0xce, 0x5a, 0x14, 0x35, 0x4d, 0xa0, 0x20, 0x7c, 0x58, 0x12, 0x12,
+	0x5a, 0x25, 0x54, 0x6c, 0x7d, 0x52, 0x6c, 0xe9, 0xa7, 0x8b, 0xf4, 0xd2, 0xb9, 0x16, 0x38, 0x49,
+	0x40, 0x94, 0xbd, 0x1e, 0xcf, 0x51, 0x31, 0x63, 0x5c, 0x61, 0x45, 0x39, 0x2b, 0x76, 0x3f, 0xfd,
+	0xb7, 0x89, 0x5a, 0xfd, 0x22, 0xe8, 0x9e, 0x6e, 0x6b, 0x7e, 0x86, 0x76, 0xca, 0x16, 0x3e, 0xc3,
+	0x31, 0x58, 0x46, 0xdb, 0x38, 0xb8, 0xef, 0x35, 0xcb, 0xc5, 0x1f, 0x70, 0x0c, 0xe6, 0x33, 0xd4,
+	0xa0, 0xc4, 0xba, 0xd7, 0x36, 0x0e, 0x1e, 0x1c, 0x7d, 0x54, 0x1c, 0x84, 0x5d, 0x5a, 0xb0, 0x5f,
+	0x33, 0x75, 0xfc, 0xe5, 0x10, 0x47, 0x29, 0x78, 0x0d, 0x4a, 0xcc, 0x43, 0xb4, 0xa5, 0x85, 0xb6,
+	0x34, 0xfc, 0xf1, 0x0a, 0xfc, 0x4c, 0x09, 0xca, 0xc2, 0x1c, 0xaf, 0x91, 0xe6, 0xb7, 0x68, 0x07,
+	0xc7, 0x3c, 0x65, 0xca, 0x8f, 0x69, 0x20, 0xb8, 0xb4, 0xde, 0xa9, 0xef, 0xd4, 0xcc, 0x19, 0xa7,
+	0x9a, 0x60, 0x7e, 0x8f, 0x1e, 0x29, 0xae, 0x70, 0xe4, 0x2f, 0xea, 0xa0, 0x7a, 0x9d, 0x3d, 0xcd,
+	0xeb, 0xce, 0x8b, 0x9d, 0xa3, 0xed, 0xfc, 0xfc, 0xac, 0xed, 0xb6, 0x71, 0xd0, 0x3a, 0xfa, 0xc6,
+	0xbe, 0x6b, 0x0a, 0xf5, 0x01, 0xda, 0x79, 0x92, 0x67, 0x9a, 0xf2, 0x8a, 0xa5, 0xf1, 0xc2, 0x82,
+	0x57, 0x68, 0x99, 0x29, 0xda, 0x5d, 0x1a, 0x42, 0xeb, 0x5d, 0x2d, 0xff, 0x66, 0x2d, 0xf9, 0x97,
+	0x05, 0xf7, 0x54, 0x53, 0xe7, 0xda, 0x2c, 0x6e, 0x78, 0x2d, 0xb2, 0xf0, 0x6c, 0x9e, 0xa0, 0x3d,
+	0xf8, 0x39, 0x89, 0x68, 0x40, 0x55, 0x34, 0xf5, 0xe5, 0x18, 0x0b, 0x20, 0xd6, 0x7b, 0x3a, 0x97,
+	0xfd, 0x95, 0x5c, 0x7a, 0x9c, 0x47, 0x79, 0x2c, 0x0f, 0x67, 0xa4, 0x33, 0xcd, 0x31, 0x5f, 0xa2,
+	0x5d, 0x01, 0x97, 0x20, 0x80, 0x05, 0xe0, 0x07, 0x59, 0x5c, 0xd6, 0xfd, 0xfa, 0x78, 0x5b, 0x15,
+	0xa7, 0x9f, 0x51, 0xcc, 0x01, 0xfa, 0x60, 0x8c, 0xa5, 0x2f, 0x20, 0xe0, 0x71, 0x0c, 0x8c, 0x00,
+	0x29, 0x7e, 0xf0, 0xd6, 0x83, 0x5a, 0x4f, 0xef, 0x8f, 0xb1, 0xf4, 0x66, 0xc4, 0x62, 0x80, 0x09,
+	0x6a, 0xaf, 0xaa, 0x2d, 0xcd, 0x41, 0xb3, 0xde, 0xe8, 0xc7, 0x62, 0x59, 0x79, 0x79, 0x26, 0xf2,
+	0xcf, 0x80, 0xb5, 0xb3, 0xc1, 0x4c, 0x0c, 0x34, 0x65, 0xee, 0xb0, 0xf2, 0x05, 0xaf, 0xd0, 0x32,
+	0x7f, 0x37, 0xd0, 0xf3, 0xff, 0x31, 0x0f, 0x52, 0xd1, 0x18, 0x2b, 0x20, 0x7e, 0x30, 0xc6, 0x2c,
+	0x04, 0xff, 0x1a, 0xe0, 0x2a, 0x9a, 0xfa, 0x41, 0x44, 0x83, 0x2b, 0x69, 0xb5, 0xea, 0xdf, 0xe6,
+	0x8b, 0x95, 0xb7, 0x79, 0x55, 0x6a, 0xf6, 0xb5, 0xe4, 0x8f, 0x5a, 0xb1, 0xaf, 0x05, 0xcd, 0x3f,
+	0x0c, 0x74, 0xbc, 0x89, 0x0d, 0x2e, 0xab, 0x64, 0x77, 0xeb, 0xbd, 0x1c, 0xae, 0xe9, 0x85, 0xcb,
+	0x32, 0xec, 0x3f, 0x0d, 0xf4, 0x62, 0x03, 0x3f, 0x94, 0x29, 0x10, 0x38, 0xd0, 0x1f, 0x3a, 0xeb,
+	0x61, 0xbd, 0xa1, 0xa3, 0xf5, 0x0c, 0xbd, 0x9e, 0x93, 0x35, 0x7f, 0x33, 0xd0, 0xe1, 0x06, 0x96,
+	0x26, 0x14, 0xae, 0xa5, 0xb5, 0x57, 0xef, 0xe5, 0xd9, 0x7a, 0x5e, 0x86, 0x99, 0x9e, 0xf9, 0x06,
+	0x6d, 0x65, 0xb7, 0x84, 0x65, 0xea, 0x11, 0xfc, 0x6a, 0xad, 0x11, 0x3c, 0x9f, 0x26, 0x30, 0x37,
+	0x80, 0xd9, 0xa3, 0xa7, 0x55, 0x5c, 0x72, 0xdb, 0xc5, 0xe8, 0xf3, 0x19, 0xb1, 0xa8, 0x12, 0x2a,
+	0xed, 0x80, 0xc7, 0xce, 0xd2, 0x3d, 0x71, 0x1c, 0xa4, 0x52, 0xf1, 0x18, 0x84, 0x74, 0x7e, 0x29,
+	0xcb, 0x9b, 0xea, 0xd6, 0xce, 0x41, 0xd9, 0xd6, 0xe2, 0x35, 0x7e, 0xd3, 0xfb, 0xb5, 0x81, 0x9e,
+	0x06, 0x3c, 0xb6, 0x6b, 0x2f, 0xf2, 0xde, 0xa3, 0xc5, 0x8e, 0x83, 0x2c, 0xad, 0x81, 0xf1, 0xd3,
+	0x77, 0x05, 0x33, 0xe4, 0x11, 0x66, 0xa1, 0xcd, 0x45, 0xe8, 0x84, 0xc0, 0x74, 0x96, 0xce, 0xcc,
+	0xf2, 0x5b, 0xfe, 0x5a, 0x7c, 0x5d, 0x55, 0x7f, 0x35, 0xee, 0x9d, 0x74, 0xbb, 0x7f, 0x37, 0x9e,
+	0x9c, 0xe4, 0x92, 0x5d, 0x22, 0xed, 0xbc, 0xcc, 0xaa, 0x61, 0xc7, 0xf6, 0x4a, 0xe4, 0x3f, 0x25,
+	0x66, 0xd4, 0x25, 0x72, 0x54, 0x61, 0x46, 0xc3, 0xce, 0xa8, 0xc2, 0xdc, 0x36, 0x9e, 0xe6, 0x1b,
+	0xae, 0xdb, 0x25, 0xd2, 0x75, 0x2b, 0x94, 0xeb, 0x0e, 0x3b, 0xae, 0x5b, 0xe1, 0x2e, 0xb6, 0xb5,
+	0xd9, 0xce, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf2, 0x67, 0x6e, 0xd9, 0x06, 0x09, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_criterion.pb.go b/googleapis/ads/googleads/v3/resources/campaign_criterion.pb.go
new file mode 100644
index 0000000..dfd0f21
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_criterion.pb.go
@@ -0,0 +1,643 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_criterion.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A campaign criterion.
+type CampaignCriterion struct {
+	// The resource name of the campaign criterion.
+	// Campaign criterion resource names have the form:
+	//
+	// `customers/{customer_id}/campaignCriteria/{campaign_id}~{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The campaign to which the criterion belongs.
+	Campaign *wrappers.StringValue `protobuf:"bytes,4,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// The ID of the criterion.
+	//
+	// This field is ignored during mutate.
+	CriterionId *wrappers.Int64Value `protobuf:"bytes,5,opt,name=criterion_id,json=criterionId,proto3" json:"criterion_id,omitempty"`
+	// The modifier for the bids when the criterion matches. The modifier must be
+	// in the range: 0.1 - 10.0. Most targetable criteria types support modifiers.
+	// Use 0 to opt out of a Device type.
+	BidModifier *wrappers.FloatValue `protobuf:"bytes,14,opt,name=bid_modifier,json=bidModifier,proto3" json:"bid_modifier,omitempty"`
+	// Whether to target (`false`) or exclude (`true`) the criterion.
+	Negative *wrappers.BoolValue `protobuf:"bytes,7,opt,name=negative,proto3" json:"negative,omitempty"`
+	// The type of the criterion.
+	Type enums.CriterionTypeEnum_CriterionType `protobuf:"varint,6,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.CriterionTypeEnum_CriterionType" json:"type,omitempty"`
+	// The status of the criterion.
+	Status enums.CampaignCriterionStatusEnum_CampaignCriterionStatus `protobuf:"varint,35,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.CampaignCriterionStatusEnum_CampaignCriterionStatus" json:"status,omitempty"`
+	// The campaign criterion.
+	//
+	// Exactly one must be set.
+	//
+	// Types that are valid to be assigned to Criterion:
+	//	*CampaignCriterion_Keyword
+	//	*CampaignCriterion_Placement
+	//	*CampaignCriterion_MobileAppCategory
+	//	*CampaignCriterion_MobileApplication
+	//	*CampaignCriterion_Location
+	//	*CampaignCriterion_Device
+	//	*CampaignCriterion_AdSchedule
+	//	*CampaignCriterion_AgeRange
+	//	*CampaignCriterion_Gender
+	//	*CampaignCriterion_IncomeRange
+	//	*CampaignCriterion_ParentalStatus
+	//	*CampaignCriterion_UserList
+	//	*CampaignCriterion_YoutubeVideo
+	//	*CampaignCriterion_YoutubeChannel
+	//	*CampaignCriterion_Proximity
+	//	*CampaignCriterion_Topic
+	//	*CampaignCriterion_ListingScope
+	//	*CampaignCriterion_Language
+	//	*CampaignCriterion_IpBlock
+	//	*CampaignCriterion_ContentLabel
+	//	*CampaignCriterion_Carrier
+	//	*CampaignCriterion_UserInterest
+	//	*CampaignCriterion_Webpage
+	//	*CampaignCriterion_OperatingSystemVersion
+	//	*CampaignCriterion_MobileDevice
+	//	*CampaignCriterion_LocationGroup
+	//	*CampaignCriterion_CustomAffinity
+	Criterion            isCampaignCriterion_Criterion `protobuf_oneof:"criterion"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *CampaignCriterion) Reset()         { *m = CampaignCriterion{} }
+func (m *CampaignCriterion) String() string { return proto.CompactTextString(m) }
+func (*CampaignCriterion) ProtoMessage()    {}
+func (*CampaignCriterion) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e4a8605ea5b2b771, []int{0}
+}
+
+func (m *CampaignCriterion) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignCriterion.Unmarshal(m, b)
+}
+func (m *CampaignCriterion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignCriterion.Marshal(b, m, deterministic)
+}
+func (m *CampaignCriterion) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignCriterion.Merge(m, src)
+}
+func (m *CampaignCriterion) XXX_Size() int {
+	return xxx_messageInfo_CampaignCriterion.Size(m)
+}
+func (m *CampaignCriterion) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignCriterion.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignCriterion proto.InternalMessageInfo
+
+func (m *CampaignCriterion) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignCriterion) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetCriterionId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CriterionId
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetBidModifier() *wrappers.FloatValue {
+	if m != nil {
+		return m.BidModifier
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetNegative() *wrappers.BoolValue {
+	if m != nil {
+		return m.Negative
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetType() enums.CriterionTypeEnum_CriterionType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.CriterionTypeEnum_UNSPECIFIED
+}
+
+func (m *CampaignCriterion) GetStatus() enums.CampaignCriterionStatusEnum_CampaignCriterionStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.CampaignCriterionStatusEnum_UNSPECIFIED
+}
+
+type isCampaignCriterion_Criterion interface {
+	isCampaignCriterion_Criterion()
+}
+
+type CampaignCriterion_Keyword struct {
+	Keyword *common.KeywordInfo `protobuf:"bytes,8,opt,name=keyword,proto3,oneof"`
+}
+
+type CampaignCriterion_Placement struct {
+	Placement *common.PlacementInfo `protobuf:"bytes,9,opt,name=placement,proto3,oneof"`
+}
+
+type CampaignCriterion_MobileAppCategory struct {
+	MobileAppCategory *common.MobileAppCategoryInfo `protobuf:"bytes,10,opt,name=mobile_app_category,json=mobileAppCategory,proto3,oneof"`
+}
+
+type CampaignCriterion_MobileApplication struct {
+	MobileApplication *common.MobileApplicationInfo `protobuf:"bytes,11,opt,name=mobile_application,json=mobileApplication,proto3,oneof"`
+}
+
+type CampaignCriterion_Location struct {
+	Location *common.LocationInfo `protobuf:"bytes,12,opt,name=location,proto3,oneof"`
+}
+
+type CampaignCriterion_Device struct {
+	Device *common.DeviceInfo `protobuf:"bytes,13,opt,name=device,proto3,oneof"`
+}
+
+type CampaignCriterion_AdSchedule struct {
+	AdSchedule *common.AdScheduleInfo `protobuf:"bytes,15,opt,name=ad_schedule,json=adSchedule,proto3,oneof"`
+}
+
+type CampaignCriterion_AgeRange struct {
+	AgeRange *common.AgeRangeInfo `protobuf:"bytes,16,opt,name=age_range,json=ageRange,proto3,oneof"`
+}
+
+type CampaignCriterion_Gender struct {
+	Gender *common.GenderInfo `protobuf:"bytes,17,opt,name=gender,proto3,oneof"`
+}
+
+type CampaignCriterion_IncomeRange struct {
+	IncomeRange *common.IncomeRangeInfo `protobuf:"bytes,18,opt,name=income_range,json=incomeRange,proto3,oneof"`
+}
+
+type CampaignCriterion_ParentalStatus struct {
+	ParentalStatus *common.ParentalStatusInfo `protobuf:"bytes,19,opt,name=parental_status,json=parentalStatus,proto3,oneof"`
+}
+
+type CampaignCriterion_UserList struct {
+	UserList *common.UserListInfo `protobuf:"bytes,22,opt,name=user_list,json=userList,proto3,oneof"`
+}
+
+type CampaignCriterion_YoutubeVideo struct {
+	YoutubeVideo *common.YouTubeVideoInfo `protobuf:"bytes,20,opt,name=youtube_video,json=youtubeVideo,proto3,oneof"`
+}
+
+type CampaignCriterion_YoutubeChannel struct {
+	YoutubeChannel *common.YouTubeChannelInfo `protobuf:"bytes,21,opt,name=youtube_channel,json=youtubeChannel,proto3,oneof"`
+}
+
+type CampaignCriterion_Proximity struct {
+	Proximity *common.ProximityInfo `protobuf:"bytes,23,opt,name=proximity,proto3,oneof"`
+}
+
+type CampaignCriterion_Topic struct {
+	Topic *common.TopicInfo `protobuf:"bytes,24,opt,name=topic,proto3,oneof"`
+}
+
+type CampaignCriterion_ListingScope struct {
+	ListingScope *common.ListingScopeInfo `protobuf:"bytes,25,opt,name=listing_scope,json=listingScope,proto3,oneof"`
+}
+
+type CampaignCriterion_Language struct {
+	Language *common.LanguageInfo `protobuf:"bytes,26,opt,name=language,proto3,oneof"`
+}
+
+type CampaignCriterion_IpBlock struct {
+	IpBlock *common.IpBlockInfo `protobuf:"bytes,27,opt,name=ip_block,json=ipBlock,proto3,oneof"`
+}
+
+type CampaignCriterion_ContentLabel struct {
+	ContentLabel *common.ContentLabelInfo `protobuf:"bytes,28,opt,name=content_label,json=contentLabel,proto3,oneof"`
+}
+
+type CampaignCriterion_Carrier struct {
+	Carrier *common.CarrierInfo `protobuf:"bytes,29,opt,name=carrier,proto3,oneof"`
+}
+
+type CampaignCriterion_UserInterest struct {
+	UserInterest *common.UserInterestInfo `protobuf:"bytes,30,opt,name=user_interest,json=userInterest,proto3,oneof"`
+}
+
+type CampaignCriterion_Webpage struct {
+	Webpage *common.WebpageInfo `protobuf:"bytes,31,opt,name=webpage,proto3,oneof"`
+}
+
+type CampaignCriterion_OperatingSystemVersion struct {
+	OperatingSystemVersion *common.OperatingSystemVersionInfo `protobuf:"bytes,32,opt,name=operating_system_version,json=operatingSystemVersion,proto3,oneof"`
+}
+
+type CampaignCriterion_MobileDevice struct {
+	MobileDevice *common.MobileDeviceInfo `protobuf:"bytes,33,opt,name=mobile_device,json=mobileDevice,proto3,oneof"`
+}
+
+type CampaignCriterion_LocationGroup struct {
+	LocationGroup *common.LocationGroupInfo `protobuf:"bytes,34,opt,name=location_group,json=locationGroup,proto3,oneof"`
+}
+
+type CampaignCriterion_CustomAffinity struct {
+	CustomAffinity *common.CustomAffinityInfo `protobuf:"bytes,36,opt,name=custom_affinity,json=customAffinity,proto3,oneof"`
+}
+
+func (*CampaignCriterion_Keyword) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_Placement) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_MobileAppCategory) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_MobileApplication) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_Location) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_Device) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_AdSchedule) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_AgeRange) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_Gender) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_IncomeRange) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_ParentalStatus) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_UserList) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_YoutubeVideo) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_YoutubeChannel) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_Proximity) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_Topic) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_ListingScope) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_Language) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_IpBlock) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_ContentLabel) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_Carrier) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_UserInterest) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_Webpage) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_OperatingSystemVersion) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_MobileDevice) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_LocationGroup) isCampaignCriterion_Criterion() {}
+
+func (*CampaignCriterion_CustomAffinity) isCampaignCriterion_Criterion() {}
+
+func (m *CampaignCriterion) GetCriterion() isCampaignCriterion_Criterion {
+	if m != nil {
+		return m.Criterion
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetKeyword() *common.KeywordInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Keyword); ok {
+		return x.Keyword
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetPlacement() *common.PlacementInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Placement); ok {
+		return x.Placement
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetMobileAppCategory() *common.MobileAppCategoryInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_MobileAppCategory); ok {
+		return x.MobileAppCategory
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetMobileApplication() *common.MobileApplicationInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_MobileApplication); ok {
+		return x.MobileApplication
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetLocation() *common.LocationInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Location); ok {
+		return x.Location
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetDevice() *common.DeviceInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Device); ok {
+		return x.Device
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetAdSchedule() *common.AdScheduleInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_AdSchedule); ok {
+		return x.AdSchedule
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetAgeRange() *common.AgeRangeInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_AgeRange); ok {
+		return x.AgeRange
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetGender() *common.GenderInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Gender); ok {
+		return x.Gender
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetIncomeRange() *common.IncomeRangeInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_IncomeRange); ok {
+		return x.IncomeRange
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetParentalStatus() *common.ParentalStatusInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_ParentalStatus); ok {
+		return x.ParentalStatus
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetUserList() *common.UserListInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_UserList); ok {
+		return x.UserList
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetYoutubeVideo() *common.YouTubeVideoInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_YoutubeVideo); ok {
+		return x.YoutubeVideo
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetYoutubeChannel() *common.YouTubeChannelInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_YoutubeChannel); ok {
+		return x.YoutubeChannel
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetProximity() *common.ProximityInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Proximity); ok {
+		return x.Proximity
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetTopic() *common.TopicInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Topic); ok {
+		return x.Topic
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetListingScope() *common.ListingScopeInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_ListingScope); ok {
+		return x.ListingScope
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetLanguage() *common.LanguageInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Language); ok {
+		return x.Language
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetIpBlock() *common.IpBlockInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_IpBlock); ok {
+		return x.IpBlock
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetContentLabel() *common.ContentLabelInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_ContentLabel); ok {
+		return x.ContentLabel
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetCarrier() *common.CarrierInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Carrier); ok {
+		return x.Carrier
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetUserInterest() *common.UserInterestInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_UserInterest); ok {
+		return x.UserInterest
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetWebpage() *common.WebpageInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_Webpage); ok {
+		return x.Webpage
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetOperatingSystemVersion() *common.OperatingSystemVersionInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_OperatingSystemVersion); ok {
+		return x.OperatingSystemVersion
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetMobileDevice() *common.MobileDeviceInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_MobileDevice); ok {
+		return x.MobileDevice
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetLocationGroup() *common.LocationGroupInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_LocationGroup); ok {
+		return x.LocationGroup
+	}
+	return nil
+}
+
+func (m *CampaignCriterion) GetCustomAffinity() *common.CustomAffinityInfo {
+	if x, ok := m.GetCriterion().(*CampaignCriterion_CustomAffinity); ok {
+		return x.CustomAffinity
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignCriterion) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignCriterion_Keyword)(nil),
+		(*CampaignCriterion_Placement)(nil),
+		(*CampaignCriterion_MobileAppCategory)(nil),
+		(*CampaignCriterion_MobileApplication)(nil),
+		(*CampaignCriterion_Location)(nil),
+		(*CampaignCriterion_Device)(nil),
+		(*CampaignCriterion_AdSchedule)(nil),
+		(*CampaignCriterion_AgeRange)(nil),
+		(*CampaignCriterion_Gender)(nil),
+		(*CampaignCriterion_IncomeRange)(nil),
+		(*CampaignCriterion_ParentalStatus)(nil),
+		(*CampaignCriterion_UserList)(nil),
+		(*CampaignCriterion_YoutubeVideo)(nil),
+		(*CampaignCriterion_YoutubeChannel)(nil),
+		(*CampaignCriterion_Proximity)(nil),
+		(*CampaignCriterion_Topic)(nil),
+		(*CampaignCriterion_ListingScope)(nil),
+		(*CampaignCriterion_Language)(nil),
+		(*CampaignCriterion_IpBlock)(nil),
+		(*CampaignCriterion_ContentLabel)(nil),
+		(*CampaignCriterion_Carrier)(nil),
+		(*CampaignCriterion_UserInterest)(nil),
+		(*CampaignCriterion_Webpage)(nil),
+		(*CampaignCriterion_OperatingSystemVersion)(nil),
+		(*CampaignCriterion_MobileDevice)(nil),
+		(*CampaignCriterion_LocationGroup)(nil),
+		(*CampaignCriterion_CustomAffinity)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*CampaignCriterion)(nil), "google.ads.googleads.v3.resources.CampaignCriterion")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_criterion.proto", fileDescriptor_e4a8605ea5b2b771)
+}
+
+var fileDescriptor_e4a8605ea5b2b771 = []byte{
+	// 1187 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x97, 0xdf, 0x72, 0xdc, 0xb4,
+	0x17, 0xc7, 0x7f, 0xc9, 0xaf, 0x4d, 0x13, 0xed, 0x26, 0xa5, 0x2a, 0x04, 0x35, 0x2d, 0x25, 0x6d,
+	0xe9, 0x4c, 0x29, 0xd4, 0x86, 0x2c, 0x74, 0x18, 0x33, 0x74, 0x66, 0xb3, 0x85, 0x74, 0xdb, 0x14,
+	0xca, 0x26, 0x6c, 0x87, 0x4e, 0x18, 0x8f, 0xd6, 0xd6, 0xba, 0xa2, 0xb6, 0xe4, 0x91, 0xe5, 0x2d,
+	0x3b, 0x9d, 0x5e, 0xf1, 0x26, 0x5c, 0xf2, 0x28, 0x5c, 0xf1, 0x1c, 0x7d, 0x0a, 0x46, 0xff, 0xbc,
+	0x9b, 0x6e, 0x82, 0xcd, 0x9d, 0x74, 0x74, 0x3e, 0x5f, 0x9d, 0x73, 0x6c, 0x1d, 0xd9, 0x20, 0x48,
+	0x38, 0x4f, 0x52, 0xe2, 0xe3, 0xb8, 0xf0, 0xcd, 0x50, 0x8d, 0x26, 0x1d, 0x5f, 0x90, 0x82, 0x97,
+	0x22, 0x22, 0x85, 0x1f, 0xe1, 0x2c, 0xc7, 0x34, 0x61, 0x61, 0x24, 0xa8, 0x24, 0x82, 0x72, 0xe6,
+	0xe5, 0x82, 0x4b, 0x0e, 0xaf, 0x19, 0xc0, 0xc3, 0x71, 0xe1, 0x55, 0xac, 0x37, 0xe9, 0x78, 0x15,
+	0xbb, 0x75, 0xe7, 0x34, 0xf9, 0x88, 0x67, 0x19, 0x67, 0xbe, 0x95, 0xc4, 0x46, 0x71, 0xeb, 0x9b,
+	0xd3, 0xdc, 0x09, 0x2b, 0xb3, 0x93, 0x22, 0x09, 0x0b, 0x89, 0x65, 0x59, 0x58, 0x7c, 0xa7, 0x06,
+	0xaf, 0x28, 0x39, 0xcd, 0x89, 0x65, 0x2e, 0x39, 0x26, 0xa7, 0x55, 0xce, 0x76, 0xe9, 0xaa, 0x5d,
+	0xd2, 0xb3, 0x51, 0x39, 0xf6, 0x5f, 0x0a, 0x9c, 0xe7, 0x44, 0xb8, 0xed, 0xae, 0xcc, 0xa1, 0x98,
+	0x31, 0x2e, 0xb1, 0xa4, 0x9c, 0xd9, 0xd5, 0xeb, 0x7f, 0x6f, 0x82, 0x0b, 0x3d, 0x1b, 0x70, 0xcf,
+	0xed, 0x0c, 0x6f, 0x80, 0x75, 0xb7, 0x4b, 0xc8, 0x70, 0x46, 0xd0, 0xd2, 0xf6, 0xd2, 0xad, 0xb5,
+	0x41, 0xdb, 0x19, 0xbf, 0xc7, 0x19, 0x81, 0x5f, 0x81, 0x55, 0x97, 0x2a, 0x3a, 0xb3, 0xbd, 0x74,
+	0xab, 0xb5, 0x73, 0xc5, 0x16, 0xd8, 0x73, 0xb1, 0x78, 0x07, 0x52, 0x50, 0x96, 0x0c, 0x71, 0x5a,
+	0x92, 0x41, 0xe5, 0x0d, 0xef, 0x81, 0xf6, 0x2c, 0x4b, 0x1a, 0xa3, 0xb3, 0x9a, 0xbe, 0xbc, 0x40,
+	0xf7, 0x99, 0xbc, 0xfb, 0x85, 0x81, 0x5b, 0x15, 0xd0, 0x8f, 0x15, 0x3f, 0xa2, 0x71, 0x98, 0xf1,
+	0x98, 0x8e, 0x29, 0x11, 0x68, 0xe3, 0x14, 0xfe, 0xbb, 0x94, 0x63, 0x69, 0xf9, 0x11, 0x8d, 0x1f,
+	0x5b, 0x7f, 0x78, 0x17, 0xac, 0x32, 0x92, 0x60, 0x49, 0x27, 0x04, 0x9d, 0xd3, 0xec, 0xd6, 0x02,
+	0xbb, 0xcb, 0x79, 0x6a, 0xe3, 0x76, 0xbe, 0x70, 0x00, 0xce, 0xa8, 0x67, 0x82, 0x56, 0xb6, 0x97,
+	0x6e, 0x6d, 0xec, 0xdc, 0xf3, 0x4e, 0x7b, 0xb3, 0xf4, 0x83, 0xf4, 0xaa, 0x72, 0x1e, 0x4e, 0x73,
+	0xf2, 0x2d, 0x2b, 0xb3, 0xe3, 0x96, 0x81, 0xd6, 0x82, 0xbf, 0x82, 0x15, 0xf3, 0x76, 0xa0, 0x1b,
+	0x5a, 0x75, 0x50, 0xa7, 0xfa, 0xf6, 0xc3, 0x3a, 0xd0, 0xb4, 0xd1, 0x3f, 0x79, 0x6d, 0x60, 0x77,
+	0x80, 0x7b, 0xe0, 0xdc, 0x0b, 0x32, 0x7d, 0xc9, 0x45, 0x8c, 0x56, 0x75, 0xda, 0x9f, 0x9c, 0xba,
+	0x99, 0x79, 0xf3, 0xbd, 0x47, 0xc6, 0xbd, 0xcf, 0xc6, 0xfc, 0xc1, 0xff, 0x06, 0x8e, 0x86, 0x8f,
+	0xc1, 0x5a, 0x9e, 0xe2, 0x88, 0x64, 0x84, 0x49, 0xb4, 0xa6, 0xa5, 0xee, 0xd4, 0x49, 0x3d, 0x71,
+	0x80, 0x15, 0x9b, 0x29, 0xc0, 0x04, 0x5c, 0xcc, 0xf8, 0x88, 0xa6, 0x24, 0xc4, 0x79, 0x1e, 0x46,
+	0x58, 0x92, 0x84, 0x8b, 0x29, 0x02, 0x5a, 0xf8, 0xcb, 0x3a, 0xe1, 0xc7, 0x1a, 0xed, 0xe6, 0x79,
+	0xcf, 0x82, 0x76, 0x83, 0x0b, 0xd9, 0xdb, 0x0b, 0x70, 0x0c, 0xe0, 0x6c, 0xa3, 0x94, 0x46, 0xfa,
+	0x28, 0xa0, 0xd6, 0x7f, 0xdc, 0xc7, 0x81, 0x0b, 0xfb, 0xb8, 0x05, 0xf8, 0x10, 0xac, 0xa6, 0xdc,
+	0xaa, 0xb7, 0xb5, 0xfa, 0xa7, 0x75, 0xea, 0xfb, 0xfc, 0x98, 0x68, 0xc5, 0xc3, 0xfb, 0x60, 0x25,
+	0x26, 0x13, 0x1a, 0x11, 0xb4, 0xae, 0x95, 0x6e, 0xd7, 0x29, 0xdd, 0xd7, 0xde, 0x56, 0xc7, 0xb2,
+	0xf0, 0x47, 0xd0, 0xc2, 0x71, 0x58, 0x44, 0xcf, 0x49, 0x5c, 0xa6, 0x04, 0x9d, 0xd7, 0x52, 0x5e,
+	0x9d, 0x54, 0x37, 0x3e, 0xb0, 0x84, 0x95, 0x03, 0xb8, 0xb2, 0xc0, 0x47, 0x60, 0x0d, 0x27, 0x24,
+	0x14, 0x98, 0x25, 0x04, 0xbd, 0xd3, 0x2c, 0xcb, 0x6e, 0x42, 0x06, 0xca, 0xdf, 0x65, 0x89, 0xed,
+	0x5c, 0x65, 0x99, 0x10, 0x16, 0x13, 0x81, 0x2e, 0x34, 0xcb, 0x72, 0x4f, 0x7b, 0xbb, 0x2c, 0x0d,
+	0x0b, 0x0f, 0x41, 0x9b, 0xb2, 0x88, 0x67, 0x2e, 0x2a, 0xa8, 0xb5, 0xfc, 0x3a, 0xad, 0xbe, 0x66,
+	0xe6, 0x03, 0x6b, 0xd1, 0x99, 0x09, 0xfe, 0x02, 0xce, 0xe7, 0x58, 0x10, 0x26, 0x71, 0x6a, 0x3b,
+	0x39, 0xba, 0xa8, 0x85, 0x77, 0x6a, 0xdf, 0x79, 0x8b, 0x99, 0x73, 0x68, 0xb5, 0x37, 0xf2, 0x63,
+	0x56, 0x55, 0xc7, 0xb2, 0x20, 0x22, 0x4c, 0x69, 0x21, 0xd1, 0x66, 0xb3, 0x3a, 0xfe, 0x54, 0x10,
+	0xb1, 0x4f, 0x0b, 0x77, 0x96, 0x56, 0x4b, 0x3b, 0x87, 0x4f, 0xc1, 0xfa, 0x94, 0x97, 0xb2, 0x1c,
+	0x91, 0x70, 0x42, 0x63, 0xc2, 0xd1, 0xbb, 0x5a, 0xf0, 0xb3, 0x3a, 0xc1, 0x9f, 0x79, 0x79, 0x58,
+	0x8e, 0xc8, 0x50, 0x31, 0x56, 0xb4, 0x6d, 0x85, 0xb4, 0x4d, 0x15, 0xc1, 0x09, 0x47, 0xcf, 0x31,
+	0x63, 0x24, 0x45, 0xef, 0x35, 0x2b, 0x82, 0x95, 0xee, 0x19, 0xca, 0x15, 0xc1, 0x8a, 0x59, 0xab,
+	0xee, 0x28, 0x82, 0xff, 0x46, 0x33, 0x2a, 0xa7, 0xe8, 0xfd, 0x86, 0x1d, 0xc5, 0x01, 0x55, 0x47,
+	0x71, 0x06, 0xd8, 0x05, 0x67, 0x25, 0xcf, 0x69, 0x84, 0x90, 0x96, 0xfa, 0xb8, 0x4e, 0xea, 0x50,
+	0x39, 0x5b, 0x19, 0x43, 0xaa, 0x4a, 0xaa, 0x27, 0x42, 0x59, 0x12, 0x16, 0x11, 0xcf, 0x09, 0xba,
+	0xd4, 0xac, 0x92, 0xfb, 0x06, 0x3a, 0x50, 0x8c, 0xab, 0x64, 0x3a, 0x67, 0xd3, 0xcd, 0x01, 0xb3,
+	0xa4, 0xc4, 0x09, 0x41, 0x5b, 0x0d, 0x9b, 0x83, 0xf5, 0xaf, 0x9a, 0x83, 0x9d, 0xc3, 0x07, 0x60,
+	0x95, 0xe6, 0xe1, 0x28, 0xe5, 0xd1, 0x0b, 0x74, 0xb9, 0x59, 0x4b, 0xef, 0xe7, 0xbb, 0xca, 0xdd,
+	0xb5, 0x74, 0x6a, 0xa6, 0x2a, 0xdd, 0x88, 0x33, 0x49, 0x98, 0x0c, 0x53, 0x3c, 0x22, 0x29, 0xba,
+	0xd2, 0x2c, 0xdd, 0x9e, 0x81, 0xf6, 0x15, 0xe3, 0xd2, 0x8d, 0xe6, 0x6c, 0xea, 0xd2, 0x89, 0xb0,
+	0x10, 0xea, 0x9e, 0xfe, 0xa0, 0x59, 0x84, 0x3d, 0xe3, 0xee, 0x22, 0xb4, 0xb4, 0x8a, 0x50, 0x9f,
+	0x13, 0xca, 0x24, 0x11, 0xa4, 0x90, 0xe8, 0x6a, 0xb3, 0x08, 0xd5, 0x59, 0xe9, 0x5b, 0xc6, 0x45,
+	0x58, 0xce, 0xd9, 0x54, 0x84, 0x2f, 0xc9, 0x28, 0x57, 0xcf, 0xe3, 0xc3, 0x66, 0x11, 0x3e, 0x35,
+	0xee, 0x2e, 0x42, 0x4b, 0xc3, 0x09, 0x40, 0x3c, 0x27, 0x02, 0x9b, 0x97, 0x66, 0x5a, 0x48, 0x92,
+	0x85, 0x13, 0x22, 0x0a, 0x75, 0x0d, 0x6c, 0x6b, 0xe5, 0xa0, 0x4e, 0xf9, 0x07, 0xc7, 0x1f, 0x68,
+	0x7c, 0x68, 0x68, 0xbb, 0xd1, 0x26, 0x3f, 0x71, 0x55, 0x55, 0xc6, 0x5e, 0x6b, 0xf6, 0xa6, 0xb8,
+	0xd6, 0xac, 0x32, 0xe6, 0x46, 0x3b, 0x76, 0x5f, 0xb4, 0xb3, 0x39, 0x1b, 0x7c, 0x06, 0x36, 0xdc,
+	0x3d, 0x14, 0x26, 0x82, 0x97, 0x39, 0xba, 0xae, 0x95, 0x3f, 0x6f, 0x7a, 0x9b, 0xed, 0x29, 0xc8,
+	0x4a, 0xaf, 0xa7, 0xf3, 0x46, 0xd5, 0x50, 0xa2, 0xb2, 0x90, 0x3c, 0x0b, 0xf1, 0x78, 0x4c, 0x99,
+	0x3a, 0xf7, 0x1f, 0x35, 0x6b, 0x28, 0x3d, 0x8d, 0x75, 0x2d, 0xe5, 0x1a, 0x4a, 0x74, 0xcc, 0x1a,
+	0xbc, 0x78, 0xd3, 0x7d, 0x0e, 0x6e, 0xcf, 0x70, 0x3b, 0xca, 0x69, 0xa1, 0x64, 0xfc, 0xc5, 0x6f,
+	0xde, 0xc0, 0x08, 0x10, 0x51, 0xf8, 0xaf, 0xdc, 0xf0, 0x75, 0xf5, 0x31, 0x6f, 0xfd, 0xb0, 0xff,
+	0x6a, 0xf1, 0xf3, 0xfe, 0xf5, 0x6e, 0x0b, 0xac, 0x55, 0xb3, 0xdd, 0xdf, 0x97, 0xc1, 0xcd, 0x88,
+	0x67, 0x5e, 0xed, 0x7f, 0xc7, 0xee, 0xe6, 0x42, 0x14, 0x4f, 0xd4, 0xe7, 0xe7, 0x93, 0xa5, 0x67,
+	0x0f, 0x2d, 0x9c, 0x70, 0x75, 0xd4, 0x3d, 0x2e, 0x12, 0x3f, 0x21, 0x4c, 0x7f, 0x9c, 0xfa, 0xb3,
+	0x4c, 0xfe, 0xe5, 0x7f, 0xe8, 0xeb, 0x6a, 0xf4, 0xc7, 0xf2, 0xff, 0xf7, 0xba, 0xdd, 0x3f, 0x97,
+	0xaf, 0xed, 0x19, 0xc9, 0x6e, 0x5c, 0x78, 0x66, 0xa8, 0x46, 0xc3, 0x8e, 0x37, 0x70, 0x9e, 0x7f,
+	0x39, 0x9f, 0xa3, 0x6e, 0x5c, 0x1c, 0x55, 0x3e, 0x47, 0xc3, 0xce, 0x51, 0xe5, 0xf3, 0x66, 0xf9,
+	0xa6, 0x59, 0x08, 0x82, 0x6e, 0x5c, 0x04, 0x41, 0xe5, 0x15, 0x04, 0xc3, 0x4e, 0x10, 0x54, 0x7e,
+	0xa3, 0x15, 0x1d, 0x6c, 0xe7, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x17, 0x32, 0xc4, 0x89, 0xbb,
+	0x0d, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_criterion_simulation.pb.go b/googleapis/ads/googleads/v3/resources/campaign_criterion_simulation.pb.go
new file mode 100644
index 0000000..aaa0029
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_criterion_simulation.pb.go
@@ -0,0 +1,216 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_criterion_simulation.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A campaign criterion simulation. Supported combinations of advertising
+// channel type, criterion ids, simulation type and simulation modification
+// method is detailed below respectively.
+//
+// 1. SEARCH - 30000,30001,30002 - BID_MODIFIER - UNIFORM
+// 2. SHOPPING - 30000,30001,30002 - BID_MODIFIER - UNIFORM
+// 3. DISPLAY - 30001 - BID_MODIFIER - UNIFORM
+type CampaignCriterionSimulation struct {
+	// The resource name of the campaign criterion simulation.
+	// Campaign criterion simulation resource names have the form:
+	//
+	// `customers/{customer_id}/campaignCriterionSimulations/{campaign_id}~{criterion_id}~{type}~{modification_method}~{start_date}~{end_date}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Campaign ID of the simulation.
+	CampaignId *wrappers.Int64Value `protobuf:"bytes,2,opt,name=campaign_id,json=campaignId,proto3" json:"campaign_id,omitempty"`
+	// Criterion ID of the simulation.
+	CriterionId *wrappers.Int64Value `protobuf:"bytes,3,opt,name=criterion_id,json=criterionId,proto3" json:"criterion_id,omitempty"`
+	// The field that the simulation modifies.
+	Type enums.SimulationTypeEnum_SimulationType `protobuf:"varint,4,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.SimulationTypeEnum_SimulationType" json:"type,omitempty"`
+	// How the simulation modifies the field.
+	ModificationMethod enums.SimulationModificationMethodEnum_SimulationModificationMethod `protobuf:"varint,5,opt,name=modification_method,json=modificationMethod,proto3,enum=google.ads.googleads.v3.enums.SimulationModificationMethodEnum_SimulationModificationMethod" json:"modification_method,omitempty"`
+	// First day on which the simulation is based, in YYYY-MM-DD format.
+	StartDate *wrappers.StringValue `protobuf:"bytes,6,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"`
+	// Last day on which the simulation is based, in YYYY-MM-DD format.
+	EndDate *wrappers.StringValue `protobuf:"bytes,7,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"`
+	// List of simulation points.
+	//
+	// Types that are valid to be assigned to PointList:
+	//	*CampaignCriterionSimulation_BidModifierPointList
+	PointList            isCampaignCriterionSimulation_PointList `protobuf_oneof:"point_list"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *CampaignCriterionSimulation) Reset()         { *m = CampaignCriterionSimulation{} }
+func (m *CampaignCriterionSimulation) String() string { return proto.CompactTextString(m) }
+func (*CampaignCriterionSimulation) ProtoMessage()    {}
+func (*CampaignCriterionSimulation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d4b0653a9a2bb524, []int{0}
+}
+
+func (m *CampaignCriterionSimulation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignCriterionSimulation.Unmarshal(m, b)
+}
+func (m *CampaignCriterionSimulation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignCriterionSimulation.Marshal(b, m, deterministic)
+}
+func (m *CampaignCriterionSimulation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignCriterionSimulation.Merge(m, src)
+}
+func (m *CampaignCriterionSimulation) XXX_Size() int {
+	return xxx_messageInfo_CampaignCriterionSimulation.Size(m)
+}
+func (m *CampaignCriterionSimulation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignCriterionSimulation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignCriterionSimulation proto.InternalMessageInfo
+
+func (m *CampaignCriterionSimulation) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignCriterionSimulation) GetCampaignId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CampaignId
+	}
+	return nil
+}
+
+func (m *CampaignCriterionSimulation) GetCriterionId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CriterionId
+	}
+	return nil
+}
+
+func (m *CampaignCriterionSimulation) GetType() enums.SimulationTypeEnum_SimulationType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.SimulationTypeEnum_UNSPECIFIED
+}
+
+func (m *CampaignCriterionSimulation) GetModificationMethod() enums.SimulationModificationMethodEnum_SimulationModificationMethod {
+	if m != nil {
+		return m.ModificationMethod
+	}
+	return enums.SimulationModificationMethodEnum_UNSPECIFIED
+}
+
+func (m *CampaignCriterionSimulation) GetStartDate() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDate
+	}
+	return nil
+}
+
+func (m *CampaignCriterionSimulation) GetEndDate() *wrappers.StringValue {
+	if m != nil {
+		return m.EndDate
+	}
+	return nil
+}
+
+type isCampaignCriterionSimulation_PointList interface {
+	isCampaignCriterionSimulation_PointList()
+}
+
+type CampaignCriterionSimulation_BidModifierPointList struct {
+	BidModifierPointList *common.BidModifierSimulationPointList `protobuf:"bytes,8,opt,name=bid_modifier_point_list,json=bidModifierPointList,proto3,oneof"`
+}
+
+func (*CampaignCriterionSimulation_BidModifierPointList) isCampaignCriterionSimulation_PointList() {}
+
+func (m *CampaignCriterionSimulation) GetPointList() isCampaignCriterionSimulation_PointList {
+	if m != nil {
+		return m.PointList
+	}
+	return nil
+}
+
+func (m *CampaignCriterionSimulation) GetBidModifierPointList() *common.BidModifierSimulationPointList {
+	if x, ok := m.GetPointList().(*CampaignCriterionSimulation_BidModifierPointList); ok {
+		return x.BidModifierPointList
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignCriterionSimulation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignCriterionSimulation_BidModifierPointList)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*CampaignCriterionSimulation)(nil), "google.ads.googleads.v3.resources.CampaignCriterionSimulation")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_criterion_simulation.proto", fileDescriptor_d4b0653a9a2bb524)
+}
+
+var fileDescriptor_d4b0653a9a2bb524 = []byte{
+	// 605 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdd, 0x4e, 0x14, 0x31,
+	0x14, 0x76, 0x16, 0xe4, 0xa7, 0xa0, 0x17, 0xa3, 0x89, 0x23, 0x10, 0xb3, 0x68, 0x48, 0xb8, 0xea,
+	0x24, 0x0c, 0xd1, 0x64, 0x30, 0xc4, 0x5d, 0x24, 0x88, 0x11, 0x83, 0x0b, 0xd9, 0x0b, 0xb3, 0xc9,
+	0xa4, 0x3b, 0x2d, 0x63, 0x93, 0x6d, 0x3b, 0x69, 0x3b, 0x10, 0x62, 0x78, 0x00, 0x2f, 0x78, 0x09,
+	0x2f, 0xbd, 0xf5, 0x2d, 0x7c, 0x14, 0x9e, 0xc2, 0x4c, 0xa7, 0xd3, 0x21, 0xc0, 0x2e, 0xdc, 0x9d,
+	0xe9, 0xf9, 0xbe, 0xef, 0xf4, 0x7c, 0xa7, 0x73, 0xc0, 0x6e, 0x26, 0x44, 0x36, 0x22, 0x21, 0xc2,
+	0x2a, 0xac, 0xc2, 0x32, 0x3a, 0x8d, 0x42, 0x49, 0x94, 0x28, 0x64, 0x4a, 0x54, 0x98, 0x22, 0x96,
+	0x23, 0x9a, 0xf1, 0x24, 0x95, 0x54, 0x13, 0x49, 0x05, 0x4f, 0x14, 0x65, 0xc5, 0x08, 0x69, 0x2a,
+	0x38, 0xcc, 0xa5, 0xd0, 0xc2, 0x5f, 0xad, 0xb8, 0x10, 0x61, 0x05, 0x9d, 0x0c, 0x3c, 0x8d, 0xa0,
+	0x93, 0x59, 0x0a, 0xc7, 0x55, 0x4a, 0x05, 0x63, 0x82, 0x87, 0x37, 0x35, 0x97, 0xba, 0xe3, 0x08,
+	0x84, 0x17, 0x4c, 0x5d, 0xc3, 0x27, 0x4c, 0x60, 0x7a, 0x42, 0x53, 0xfb, 0x41, 0xf4, 0x0f, 0x81,
+	0xad, 0x46, 0xf4, 0x60, 0x0d, 0x7d, 0x9e, 0x13, 0x4b, 0x7a, 0x59, 0x93, 0x72, 0xea, 0x6c, 0xb0,
+	0xa9, 0x57, 0x36, 0x65, 0xbe, 0x86, 0xc5, 0x49, 0x78, 0x26, 0x51, 0x9e, 0x13, 0xa9, 0x6c, 0x7e,
+	0xe5, 0x1a, 0x15, 0x71, 0x2e, 0xb4, 0x11, 0xb7, 0xd9, 0xd7, 0x7f, 0x67, 0xc0, 0xf2, 0x8e, 0x75,
+	0x73, 0xa7, 0x36, 0xf3, 0xc8, 0xdd, 0xc1, 0x7f, 0x03, 0x9e, 0xd4, 0xf5, 0x12, 0x8e, 0x18, 0x09,
+	0xbc, 0xb6, 0xb7, 0x3e, 0xdf, 0x5b, 0xac, 0x0f, 0xbf, 0x22, 0x46, 0xfc, 0xf7, 0x60, 0xc1, 0x4d,
+	0x84, 0xe2, 0xa0, 0xd5, 0xf6, 0xd6, 0x17, 0x36, 0x96, 0xad, 0xeb, 0xb0, 0xbe, 0x18, 0xdc, 0xe7,
+	0xfa, 0xed, 0x66, 0x1f, 0x8d, 0x0a, 0xd2, 0x03, 0x35, 0x7e, 0x1f, 0xfb, 0xdb, 0x60, 0xb1, 0x19,
+	0x23, 0xc5, 0xc1, 0xd4, 0xfd, 0xf4, 0x05, 0x47, 0xd8, 0xc7, 0xfe, 0x31, 0x98, 0x2e, 0x9d, 0x0a,
+	0xa6, 0xdb, 0xde, 0xfa, 0xd3, 0x8d, 0x0f, 0x70, 0xdc, 0xdc, 0x8d, 0xbf, 0xb0, 0xe9, 0xed, 0xf8,
+	0x3c, 0x27, 0xbb, 0xbc, 0x60, 0x37, 0x8e, 0x7a, 0x46, 0xcd, 0xbf, 0xf4, 0xc0, 0xb3, 0x3b, 0x86,
+	0x18, 0x3c, 0x36, 0x55, 0x06, 0x0f, 0xae, 0x72, 0x70, 0x4d, 0xe3, 0xc0, 0x48, 0xdc, 0xa8, 0x79,
+	0x1b, 0xd0, 0xf3, 0xd9, 0xad, 0x33, 0x7f, 0x0b, 0x00, 0xa5, 0x91, 0xd4, 0x09, 0x46, 0x9a, 0x04,
+	0x33, 0xc6, 0xa3, 0x95, 0x5b, 0x1e, 0x1d, 0x69, 0x49, 0x79, 0x56, 0x99, 0x34, 0x6f, 0xf0, 0x1f,
+	0x91, 0x26, 0xfe, 0x3b, 0x30, 0x47, 0x38, 0xae, 0xa8, 0xb3, 0x0f, 0xa0, 0xce, 0x12, 0x8e, 0x0d,
+	0xf1, 0x0c, 0xbc, 0x18, 0x52, 0x6c, 0x5f, 0x33, 0x91, 0x49, 0x2e, 0x28, 0xd7, 0xc9, 0x88, 0x2a,
+	0x1d, 0xcc, 0x19, 0x9d, 0xed, 0xb1, 0x46, 0x54, 0xff, 0x10, 0xec, 0x52, 0x7c, 0x60, 0xd9, 0x4d,
+	0xcf, 0x87, 0xa5, 0xcc, 0x17, 0xaa, 0xf4, 0xa7, 0x47, 0xbd, 0xe7, 0xc3, 0x06, 0xe1, 0xce, 0xe3,
+	0x4b, 0xef, 0xaa, 0xf3, 0xcb, 0x03, 0x9b, 0x8d, 0xa4, 0x8d, 0x72, 0xaa, 0x4a, 0xe9, 0x70, 0xd2,
+	0xa3, 0xfd, 0x96, 0x16, 0x4a, 0x0b, 0x46, 0xa4, 0x0a, 0x7f, 0xd6, 0xe1, 0x85, 0x5b, 0x1a, 0x77,
+	0x30, 0x4a, 0xdc, 0xa4, 0x95, 0x72, 0xd1, 0x5d, 0x04, 0xa0, 0xe9, 0xbd, 0x7b, 0xd9, 0x02, 0x6b,
+	0xa9, 0x60, 0xf0, 0xde, 0x15, 0xd3, 0x6d, 0x4f, 0xb8, 0xe7, 0x61, 0x69, 0xfd, 0xa1, 0xf7, 0xfd,
+	0xb3, 0x95, 0xc9, 0xc4, 0x08, 0xf1, 0x0c, 0x0a, 0x99, 0x85, 0x19, 0xe1, 0x66, 0x30, 0x61, 0xd3,
+	0xf5, 0x84, 0x7d, 0xb8, 0xe5, 0xa2, 0xdf, 0xad, 0xa9, 0xbd, 0x4e, 0xe7, 0x4f, 0x6b, 0x75, 0xaf,
+	0x92, 0xec, 0x60, 0x05, 0xab, 0xb0, 0x8c, 0xfa, 0x11, 0xec, 0xd5, 0xc8, 0x7f, 0x35, 0x66, 0xd0,
+	0xc1, 0x6a, 0xe0, 0x30, 0x83, 0x7e, 0x34, 0x70, 0x98, 0xab, 0xd6, 0x5a, 0x95, 0x88, 0xe3, 0x0e,
+	0x56, 0x71, 0xec, 0x50, 0x71, 0xdc, 0x8f, 0xe2, 0xd8, 0xe1, 0x86, 0x33, 0xe6, 0xb2, 0xd1, 0xff,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x36, 0xe3, 0x8f, 0xbb, 0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_draft.pb.go b/googleapis/ads/googleads/v3/resources/campaign_draft.pb.go
new file mode 100644
index 0000000..f88ad49
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_draft.pb.go
@@ -0,0 +1,193 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_draft.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A campaign draft.
+type CampaignDraft struct {
+	// The resource name of the campaign draft.
+	// Campaign draft resource names have the form:
+	//
+	// `customers/{customer_id}/campaignDrafts/{base_campaign_id}~{draft_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the draft.
+	//
+	// This field is read-only.
+	DraftId *wrappers.Int64Value `protobuf:"bytes,2,opt,name=draft_id,json=draftId,proto3" json:"draft_id,omitempty"`
+	// The base campaign to which the draft belongs.
+	BaseCampaign *wrappers.StringValue `protobuf:"bytes,3,opt,name=base_campaign,json=baseCampaign,proto3" json:"base_campaign,omitempty"`
+	// The name of the campaign draft.
+	//
+	// This field is required and should not be empty when creating new
+	// campaign drafts.
+	//
+	// It must not contain any null (code point 0x0), NL line feed
+	// (code point 0xA) or carriage return (code point 0xD) characters.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// Resource name of the Campaign that results from overlaying the draft
+	// changes onto the base campaign.
+	//
+	// This field is read-only.
+	DraftCampaign *wrappers.StringValue `protobuf:"bytes,5,opt,name=draft_campaign,json=draftCampaign,proto3" json:"draft_campaign,omitempty"`
+	// The status of the campaign draft. This field is read-only.
+	//
+	// When a new campaign draft is added, the status defaults to PROPOSED.
+	Status enums.CampaignDraftStatusEnum_CampaignDraftStatus `protobuf:"varint,6,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.CampaignDraftStatusEnum_CampaignDraftStatus" json:"status,omitempty"`
+	// Whether there is an experiment based on this draft currently serving.
+	HasExperimentRunning *wrappers.BoolValue `protobuf:"bytes,7,opt,name=has_experiment_running,json=hasExperimentRunning,proto3" json:"has_experiment_running,omitempty"`
+	// The resource name of the long-running operation that can be used to poll
+	// for completion of draft promotion. This is only set if the draft promotion
+	// is in progress or finished.
+	LongRunningOperation *wrappers.StringValue `protobuf:"bytes,8,opt,name=long_running_operation,json=longRunningOperation,proto3" json:"long_running_operation,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CampaignDraft) Reset()         { *m = CampaignDraft{} }
+func (m *CampaignDraft) String() string { return proto.CompactTextString(m) }
+func (*CampaignDraft) ProtoMessage()    {}
+func (*CampaignDraft) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ba592967968d7ea, []int{0}
+}
+
+func (m *CampaignDraft) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignDraft.Unmarshal(m, b)
+}
+func (m *CampaignDraft) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignDraft.Marshal(b, m, deterministic)
+}
+func (m *CampaignDraft) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignDraft.Merge(m, src)
+}
+func (m *CampaignDraft) XXX_Size() int {
+	return xxx_messageInfo_CampaignDraft.Size(m)
+}
+func (m *CampaignDraft) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignDraft.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignDraft proto.InternalMessageInfo
+
+func (m *CampaignDraft) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignDraft) GetDraftId() *wrappers.Int64Value {
+	if m != nil {
+		return m.DraftId
+	}
+	return nil
+}
+
+func (m *CampaignDraft) GetBaseCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.BaseCampaign
+	}
+	return nil
+}
+
+func (m *CampaignDraft) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *CampaignDraft) GetDraftCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.DraftCampaign
+	}
+	return nil
+}
+
+func (m *CampaignDraft) GetStatus() enums.CampaignDraftStatusEnum_CampaignDraftStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.CampaignDraftStatusEnum_UNSPECIFIED
+}
+
+func (m *CampaignDraft) GetHasExperimentRunning() *wrappers.BoolValue {
+	if m != nil {
+		return m.HasExperimentRunning
+	}
+	return nil
+}
+
+func (m *CampaignDraft) GetLongRunningOperation() *wrappers.StringValue {
+	if m != nil {
+		return m.LongRunningOperation
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CampaignDraft)(nil), "google.ads.googleads.v3.resources.CampaignDraft")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_draft.proto", fileDescriptor_8ba592967968d7ea)
+}
+
+var fileDescriptor_8ba592967968d7ea = []byte{
+	// 534 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xd1, 0x6e, 0xd3, 0x30,
+	0x14, 0x86, 0x95, 0x6e, 0xeb, 0x86, 0x59, 0x77, 0x11, 0x4d, 0x53, 0x28, 0x13, 0xea, 0x40, 0x43,
+	0xbd, 0x72, 0xd0, 0x32, 0x55, 0x22, 0x5c, 0xa5, 0x63, 0x9a, 0xb6, 0x0b, 0xa8, 0x32, 0xa9, 0x17,
+	0xa8, 0x22, 0x72, 0x13, 0xcf, 0x8b, 0x94, 0xd8, 0x91, 0xed, 0x0c, 0x24, 0xb4, 0xa7, 0xe0, 0x0d,
+	0xb8, 0xe4, 0x51, 0x78, 0x94, 0xbd, 0x04, 0x28, 0x76, 0xec, 0x51, 0x46, 0xa1, 0x77, 0x27, 0x39,
+	0xff, 0x77, 0xce, 0x7f, 0x7c, 0x6c, 0x30, 0x22, 0x8c, 0x91, 0x02, 0xfb, 0x28, 0x13, 0xbe, 0x0e,
+	0x9b, 0xe8, 0x26, 0xf0, 0x39, 0x16, 0xac, 0xe6, 0x29, 0x16, 0x7e, 0x8a, 0xca, 0x0a, 0xe5, 0x84,
+	0x26, 0x19, 0x47, 0x57, 0x12, 0x56, 0x9c, 0x49, 0xe6, 0x1e, 0x68, 0x31, 0x44, 0x99, 0x80, 0x96,
+	0x83, 0x37, 0x01, 0xb4, 0x5c, 0xff, 0xf5, 0xb2, 0xd2, 0x98, 0xd6, 0xe5, 0x9f, 0x65, 0x13, 0x21,
+	0x91, 0xac, 0x85, 0xae, 0xde, 0x7f, 0x62, 0xd0, 0x2a, 0xb7, 0x46, 0xda, 0xd4, 0xb3, 0x36, 0xa5,
+	0xbe, 0xe6, 0xf5, 0x95, 0xff, 0x89, 0xa3, 0xaa, 0xc2, 0xdc, 0xa0, 0xfb, 0xbf, 0xa1, 0x88, 0x52,
+	0x26, 0x91, 0xcc, 0x19, 0x6d, 0xb3, 0xcf, 0xbf, 0x6e, 0x80, 0xde, 0x49, 0xdb, 0xf8, 0x6d, 0xd3,
+	0xd7, 0x7d, 0x01, 0x7a, 0xa6, 0x43, 0x42, 0x51, 0x89, 0x3d, 0x67, 0xe0, 0x0c, 0x1f, 0xc5, 0xdb,
+	0xe6, 0xe7, 0x3b, 0x54, 0x62, 0x77, 0x04, 0xb6, 0xb4, 0xcb, 0x3c, 0xf3, 0x3a, 0x03, 0x67, 0xf8,
+	0xf8, 0xe8, 0x69, 0x3b, 0x35, 0x34, 0x3e, 0xe0, 0x39, 0x95, 0xa3, 0xe3, 0x29, 0x2a, 0x6a, 0x1c,
+	0x6f, 0x2a, 0xf1, 0x79, 0xe6, 0x46, 0xa0, 0x37, 0x47, 0x02, 0x27, 0x66, 0x56, 0x6f, 0x4d, 0xc1,
+	0xfb, 0x0f, 0xe0, 0x4b, 0xc9, 0x73, 0x4a, 0x34, 0xbd, 0xdd, 0x20, 0xc6, 0xa4, 0xfb, 0x0a, 0xac,
+	0x2b, 0x5b, 0xeb, 0x2b, 0x90, 0x4a, 0xe9, 0x9e, 0x80, 0x1d, 0x6d, 0xd6, 0x76, 0xdd, 0x58, 0x81,
+	0xed, 0x29, 0xc6, 0xb6, 0x9d, 0x83, 0xae, 0xde, 0x88, 0xd7, 0x1d, 0x38, 0xc3, 0x9d, 0xa3, 0x0b,
+	0xb8, 0x6c, 0xe1, 0x6a, 0x9b, 0x70, 0xe1, 0x50, 0x2f, 0x15, 0x79, 0x4a, 0xeb, 0xf2, 0x6f, 0xff,
+	0xe3, 0xb6, 0xb2, 0x3b, 0x01, 0x7b, 0xd7, 0x48, 0x24, 0xf8, 0x73, 0x85, 0x79, 0x5e, 0x62, 0x2a,
+	0x13, 0x5e, 0x53, 0x9a, 0x53, 0xe2, 0x6d, 0x2a, 0xc3, 0xfd, 0x07, 0x86, 0xc7, 0x8c, 0x15, 0xda,
+	0xee, 0xee, 0x35, 0x12, 0xa7, 0x16, 0x8c, 0x35, 0xe7, 0xc6, 0x60, 0xaf, 0x60, 0x94, 0x98, 0x3a,
+	0x09, 0xab, 0x30, 0x57, 0xfb, 0xf7, 0xb6, 0x56, 0x38, 0x82, 0xdd, 0x86, 0x6d, 0x4b, 0xbd, 0x37,
+	0x64, 0x88, 0xee, 0xa2, 0x8f, 0xe0, 0xe5, 0xfd, 0xc8, 0x6d, 0x54, 0xe5, 0x02, 0xa6, 0xac, 0xf4,
+	0x17, 0x6f, 0xd3, 0x71, 0x5a, 0x0b, 0xc9, 0x4a, 0xcc, 0x85, 0xff, 0xc5, 0x84, 0xb7, 0xf6, 0xaa,
+	0x2b, 0x4d, 0x93, 0x59, 0xb8, 0xfa, 0xb7, 0xe3, 0x9f, 0x0e, 0x38, 0x4c, 0x59, 0x09, 0xff, 0xfb,
+	0xa6, 0xc6, 0xee, 0x42, 0xbb, 0x49, 0x33, 0xc5, 0xc4, 0xf9, 0x70, 0xd1, 0x82, 0x84, 0x15, 0x88,
+	0x12, 0xc8, 0x38, 0xf1, 0x09, 0xa6, 0x6a, 0x46, 0xff, 0xde, 0xee, 0x3f, 0xde, 0xf8, 0x1b, 0x1b,
+	0x7d, 0xeb, 0xac, 0x9d, 0x45, 0xd1, 0xf7, 0xce, 0xc1, 0x99, 0x2e, 0x19, 0x65, 0x02, 0xea, 0xb0,
+	0x89, 0xa6, 0x01, 0x8c, 0x8d, 0xf2, 0x87, 0xd1, 0xcc, 0xa2, 0x4c, 0xcc, 0xac, 0x66, 0x36, 0x0d,
+	0x66, 0x56, 0x73, 0xd7, 0x39, 0xd4, 0x89, 0x30, 0x8c, 0x32, 0x11, 0x86, 0x56, 0x15, 0x86, 0xd3,
+	0x20, 0x0c, 0xad, 0x6e, 0xde, 0x55, 0x66, 0x83, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x31, 0xbb,
+	0x5e, 0x61, 0x8f, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_experiment.pb.go b/googleapis/ads/googleads/v3/resources/campaign_experiment.pb.go
new file mode 100644
index 0000000..f73a51f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_experiment.pb.go
@@ -0,0 +1,245 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_experiment.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An A/B experiment that compares the performance of the base campaign
+// (the control) and a variation of that campaign (the experiment).
+type CampaignExperiment struct {
+	// The resource name of the campaign experiment.
+	// Campaign experiment resource names have the form:
+	//
+	// `customers/{customer_id}/campaignExperiments/{campaign_experiment_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the campaign experiment.
+	//
+	// This field is read-only.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The campaign draft with staged changes to the base campaign.
+	CampaignDraft *wrappers.StringValue `protobuf:"bytes,3,opt,name=campaign_draft,json=campaignDraft,proto3" json:"campaign_draft,omitempty"`
+	// The name of the campaign experiment.
+	//
+	// This field is required when creating new campaign experiments
+	// and must not conflict with the name of another non-removed
+	// campaign experiment or campaign.
+	//
+	// It must not contain any null (code point 0x0), NL line feed
+	// (code point 0xA) or carriage return (code point 0xD) characters.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The description of the experiment.
+	Description *wrappers.StringValue `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
+	// Share of traffic directed to experiment as a percent (must be between 1 and
+	// 99 inclusive. Base campaign receives the remainder of the traffic
+	// (100 - traffic_split_percent). Required for create.
+	TrafficSplitPercent *wrappers.Int64Value `protobuf:"bytes,6,opt,name=traffic_split_percent,json=trafficSplitPercent,proto3" json:"traffic_split_percent,omitempty"`
+	// Determines the behavior of the traffic split.
+	TrafficSplitType enums.CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType `protobuf:"varint,7,opt,name=traffic_split_type,json=trafficSplitType,proto3,enum=google.ads.googleads.v3.enums.CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType" json:"traffic_split_type,omitempty"`
+	// The experiment campaign, as opposed to the base campaign.
+	ExperimentCampaign *wrappers.StringValue `protobuf:"bytes,8,opt,name=experiment_campaign,json=experimentCampaign,proto3" json:"experiment_campaign,omitempty"`
+	// The status of the campaign experiment. This field is read-only.
+	Status enums.CampaignExperimentStatusEnum_CampaignExperimentStatus `protobuf:"varint,9,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.CampaignExperimentStatusEnum_CampaignExperimentStatus" json:"status,omitempty"`
+	// The resource name of the long-running operation that can be used to poll
+	// for completion of experiment create or promote. The most recent long
+	// running operation is returned.
+	LongRunningOperation *wrappers.StringValue `protobuf:"bytes,10,opt,name=long_running_operation,json=longRunningOperation,proto3" json:"long_running_operation,omitempty"`
+	// Date when the campaign experiment starts. By default, the experiment starts
+	// now or on the campaign's start date, whichever is later. If this field is
+	// set, then the experiment starts at the beginning of the specified date in
+	// the customer's time zone. Cannot be changed once the experiment starts.
+	//
+	// Format: YYYY-MM-DD
+	// Example: 2019-03-14
+	StartDate *wrappers.StringValue `protobuf:"bytes,11,opt,name=start_date,json=startDate,proto3" json:"start_date,omitempty"`
+	// Date when the campaign experiment ends. By default, the experiment ends on
+	// the campaign's end date. If this field is set, then the experiment ends at
+	// the end of the specified date in the customer's time zone.
+	//
+	// Format: YYYY-MM-DD
+	// Example: 2019-04-18
+	EndDate              *wrappers.StringValue `protobuf:"bytes,12,opt,name=end_date,json=endDate,proto3" json:"end_date,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CampaignExperiment) Reset()         { *m = CampaignExperiment{} }
+func (m *CampaignExperiment) String() string { return proto.CompactTextString(m) }
+func (*CampaignExperiment) ProtoMessage()    {}
+func (*CampaignExperiment) Descriptor() ([]byte, []int) {
+	return fileDescriptor_241b735b09714cee, []int{0}
+}
+
+func (m *CampaignExperiment) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignExperiment.Unmarshal(m, b)
+}
+func (m *CampaignExperiment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignExperiment.Marshal(b, m, deterministic)
+}
+func (m *CampaignExperiment) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignExperiment.Merge(m, src)
+}
+func (m *CampaignExperiment) XXX_Size() int {
+	return xxx_messageInfo_CampaignExperiment.Size(m)
+}
+func (m *CampaignExperiment) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignExperiment.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignExperiment proto.InternalMessageInfo
+
+func (m *CampaignExperiment) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignExperiment) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *CampaignExperiment) GetCampaignDraft() *wrappers.StringValue {
+	if m != nil {
+		return m.CampaignDraft
+	}
+	return nil
+}
+
+func (m *CampaignExperiment) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *CampaignExperiment) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *CampaignExperiment) GetTrafficSplitPercent() *wrappers.Int64Value {
+	if m != nil {
+		return m.TrafficSplitPercent
+	}
+	return nil
+}
+
+func (m *CampaignExperiment) GetTrafficSplitType() enums.CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType {
+	if m != nil {
+		return m.TrafficSplitType
+	}
+	return enums.CampaignExperimentTrafficSplitTypeEnum_UNSPECIFIED
+}
+
+func (m *CampaignExperiment) GetExperimentCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.ExperimentCampaign
+	}
+	return nil
+}
+
+func (m *CampaignExperiment) GetStatus() enums.CampaignExperimentStatusEnum_CampaignExperimentStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.CampaignExperimentStatusEnum_UNSPECIFIED
+}
+
+func (m *CampaignExperiment) GetLongRunningOperation() *wrappers.StringValue {
+	if m != nil {
+		return m.LongRunningOperation
+	}
+	return nil
+}
+
+func (m *CampaignExperiment) GetStartDate() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDate
+	}
+	return nil
+}
+
+func (m *CampaignExperiment) GetEndDate() *wrappers.StringValue {
+	if m != nil {
+		return m.EndDate
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CampaignExperiment)(nil), "google.ads.googleads.v3.resources.CampaignExperiment")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_experiment.proto", fileDescriptor_241b735b09714cee)
+}
+
+var fileDescriptor_241b735b09714cee = []byte{
+	// 630 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xdd, 0x6a, 0x14, 0x31,
+	0x14, 0xc7, 0xd9, 0x69, 0xed, 0x47, 0xfa, 0x81, 0xa4, 0x7e, 0x8c, 0xb5, 0x48, 0xab, 0x14, 0x0a,
+	0x85, 0x8c, 0x74, 0x45, 0x61, 0x0a, 0x85, 0xed, 0x07, 0x45, 0x41, 0x5b, 0xa6, 0x65, 0x2f, 0x64,
+	0x61, 0x48, 0x27, 0xd9, 0x31, 0xb0, 0x93, 0x84, 0x24, 0x53, 0x2d, 0x52, 0xf0, 0xc2, 0x67, 0xf0,
+	0x01, 0xbc, 0xf4, 0x51, 0x7c, 0x94, 0x3e, 0x85, 0xcc, 0x64, 0x32, 0xbb, 0xba, 0xad, 0x9d, 0xde,
+	0x9d, 0xdd, 0xf3, 0xff, 0x9d, 0x73, 0xfe, 0x49, 0xe6, 0x80, 0xed, 0x54, 0x88, 0x74, 0x40, 0x03,
+	0x4c, 0x74, 0x60, 0xc3, 0x22, 0x3a, 0x6f, 0x07, 0x8a, 0x6a, 0x91, 0xab, 0x84, 0xea, 0x20, 0xc1,
+	0x99, 0xc4, 0x2c, 0xe5, 0x31, 0xfd, 0x22, 0xa9, 0x62, 0x19, 0xe5, 0x06, 0x49, 0x25, 0x8c, 0x80,
+	0x6b, 0x96, 0x40, 0x98, 0x68, 0x54, 0xc3, 0xe8, 0xbc, 0x8d, 0x6a, 0x78, 0x79, 0xe7, 0xa6, 0xfa,
+	0x94, 0xe7, 0xd9, 0xb5, 0xb5, 0x63, 0x6d, 0xb0, 0xc9, 0xb5, 0x6d, 0xb1, 0xfc, 0xee, 0xee, 0xbc,
+	0x51, 0xb8, 0xdf, 0x67, 0x49, 0xac, 0xe5, 0x80, 0x99, 0xd8, 0x5c, 0x48, 0x5a, 0xd5, 0x7a, 0xe2,
+	0x6a, 0x49, 0x56, 0xdb, 0xab, 0x52, 0xcf, 0xaa, 0x54, 0xf9, 0xeb, 0x2c, 0xef, 0x07, 0x9f, 0x15,
+	0x96, 0x92, 0x2a, 0x37, 0xc6, 0xca, 0x08, 0x8a, 0x39, 0x17, 0x06, 0x1b, 0x26, 0x78, 0x95, 0x7d,
+	0xfe, 0x6d, 0x06, 0xc0, 0xbd, 0x6a, 0x92, 0x83, 0x7a, 0x10, 0xf8, 0x02, 0x2c, 0xb8, 0x36, 0x31,
+	0xc7, 0x19, 0xf5, 0x5b, 0xab, 0xad, 0x8d, 0xd9, 0x68, 0xde, 0xfd, 0xf9, 0x01, 0x67, 0x14, 0x6e,
+	0x02, 0x8f, 0x11, 0xdf, 0x5b, 0x6d, 0x6d, 0xcc, 0x6d, 0x3d, 0xad, 0x4e, 0x11, 0xb9, 0x31, 0xd0,
+	0x5b, 0x6e, 0x5e, 0xbf, 0xea, 0xe2, 0x41, 0x4e, 0x23, 0x8f, 0x11, 0xb8, 0x07, 0x16, 0x6b, 0xc7,
+	0x44, 0xe1, 0xbe, 0xf1, 0x27, 0x4a, 0x70, 0x65, 0x0c, 0x3c, 0x31, 0x8a, 0xf1, 0xd4, 0x92, 0x0b,
+	0x8e, 0xd9, 0x2f, 0x10, 0xf8, 0x12, 0x4c, 0x96, 0xd3, 0x4c, 0x36, 0x40, 0x4b, 0x25, 0xdc, 0x01,
+	0x73, 0x84, 0xea, 0x44, 0x31, 0x59, 0xb8, 0xf6, 0xef, 0x35, 0x00, 0x47, 0x01, 0x78, 0x04, 0x1e,
+	0xfe, 0x7d, 0x29, 0x92, 0xaa, 0x84, 0x72, 0xe3, 0x4f, 0xdd, 0x6e, 0x7b, 0xa9, 0x22, 0x4f, 0x0a,
+	0xf0, 0xd8, 0x72, 0xf0, 0x47, 0x0b, 0xc0, 0xf1, 0x6b, 0xf6, 0xa7, 0x57, 0x5b, 0x1b, 0x8b, 0x5b,
+	0x9f, 0xd0, 0x4d, 0xcf, 0xb2, 0x7c, 0x33, 0x68, 0xfc, 0xa6, 0x4e, 0x47, 0x5a, 0x9c, 0x5e, 0x48,
+	0x7a, 0xc0, 0xf3, 0xac, 0x81, 0x2c, 0xba, 0x6f, 0xfe, 0xf9, 0x07, 0xbe, 0x07, 0x4b, 0x23, 0x2f,
+	0xd1, 0x9d, 0xbb, 0x3f, 0xd3, 0xe0, 0xc4, 0xe0, 0x10, 0x74, 0xad, 0xe1, 0x00, 0x4c, 0xd9, 0xaf,
+	0xc1, 0x9f, 0x2d, 0xad, 0x9d, 0xde, 0xd9, 0xda, 0x49, 0x89, 0xdf, 0x60, 0xc8, 0x26, 0xa3, 0xaa,
+	0x07, 0x8c, 0xc0, 0xa3, 0x81, 0xe0, 0x69, 0xac, 0x72, 0xce, 0x19, 0x4f, 0x63, 0x21, 0xa9, 0x2a,
+	0xdf, 0xb9, 0x0f, 0x1a, 0xcc, 0xff, 0xa0, 0x60, 0x23, 0x8b, 0x1e, 0x39, 0x12, 0x6e, 0x03, 0xa0,
+	0x0d, 0x56, 0x26, 0x26, 0xd8, 0x50, 0x7f, 0xae, 0x41, 0x9d, 0xd9, 0x52, 0xbf, 0x8f, 0x0d, 0x85,
+	0x6f, 0xc0, 0x0c, 0xe5, 0xc4, 0xa2, 0xf3, 0x0d, 0xd0, 0x69, 0xca, 0x49, 0x01, 0x86, 0xf2, 0xaa,
+	0x93, 0x81, 0xcd, 0xe1, 0x01, 0x55, 0x91, 0x64, 0x1a, 0x25, 0x22, 0x0b, 0xae, 0xf9, 0x56, 0x77,
+	0x92, 0x5c, 0x1b, 0x91, 0x51, 0xa5, 0x83, 0xaf, 0x2e, 0xbc, 0xac, 0xd7, 0xcb, 0x50, 0x58, 0xa4,
+	0xc7, 0x77, 0xce, 0xe5, 0xee, 0x77, 0x0f, 0xac, 0x27, 0x22, 0x43, 0xb7, 0x6e, 0xc4, 0xdd, 0xc7,
+	0xe3, 0xdd, 0x8f, 0x0b, 0x33, 0xc7, 0xad, 0x8f, 0xd5, 0xb2, 0x43, 0xa9, 0x18, 0x60, 0x9e, 0x22,
+	0xa1, 0xd2, 0x20, 0xa5, 0xbc, 0xb4, 0x1a, 0x0c, 0x2d, 0xfc, 0x67, 0x57, 0x6f, 0xd7, 0xd1, 0x4f,
+	0x6f, 0xe2, 0xb0, 0xd3, 0xf9, 0xe5, 0xad, 0x1d, 0xda, 0x92, 0x1d, 0xa2, 0x91, 0x0d, 0x8b, 0xa8,
+	0xdb, 0x46, 0x91, 0x53, 0xfe, 0x76, 0x9a, 0x5e, 0x87, 0xe8, 0x5e, 0xad, 0xe9, 0x75, 0xdb, 0xbd,
+	0x5a, 0x73, 0xe5, 0xad, 0xdb, 0x44, 0x18, 0x76, 0x88, 0x0e, 0xc3, 0x5a, 0x15, 0x86, 0xdd, 0x76,
+	0x18, 0xd6, 0xba, 0xb3, 0xa9, 0x72, 0xd8, 0xf6, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xe1,
+	0x7f, 0x6c, 0x57, 0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_extension_setting.pb.go b/googleapis/ads/googleads/v3/resources/campaign_extension_setting.pb.go
new file mode 100644
index 0000000..9c1cdb5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_extension_setting.pb.go
@@ -0,0 +1,155 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_extension_setting.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A campaign extension setting.
+type CampaignExtensionSetting struct {
+	// The resource name of the campaign extension setting.
+	// CampaignExtensionSetting resource names have the form:
+	//
+	// `customers/{customer_id}/campaignExtensionSettings/{campaign_id}~{extension_type}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The extension type of the customer extension setting.
+	ExtensionType enums.ExtensionTypeEnum_ExtensionType `protobuf:"varint,2,opt,name=extension_type,json=extensionType,proto3,enum=google.ads.googleads.v3.enums.ExtensionTypeEnum_ExtensionType" json:"extension_type,omitempty"`
+	// The resource name of the campaign. The linked extension feed items will
+	// serve under this campaign.
+	// Campaign resource names have the form:
+	//
+	// `customers/{customer_id}/campaigns/{campaign_id}`
+	Campaign *wrappers.StringValue `protobuf:"bytes,3,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// The resource names of the extension feed items to serve under the campaign.
+	// ExtensionFeedItem resource names have the form:
+	//
+	// `customers/{customer_id}/extensionFeedItems/{feed_item_id}`
+	ExtensionFeedItems []*wrappers.StringValue `protobuf:"bytes,4,rep,name=extension_feed_items,json=extensionFeedItems,proto3" json:"extension_feed_items,omitempty"`
+	// The device for which the extensions will serve. Optional.
+	Device               enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice `protobuf:"varint,5,opt,name=device,proto3,enum=google.ads.googleads.v3.enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice" json:"device,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                `json:"-"`
+	XXX_unrecognized     []byte                                                  `json:"-"`
+	XXX_sizecache        int32                                                   `json:"-"`
+}
+
+func (m *CampaignExtensionSetting) Reset()         { *m = CampaignExtensionSetting{} }
+func (m *CampaignExtensionSetting) String() string { return proto.CompactTextString(m) }
+func (*CampaignExtensionSetting) ProtoMessage()    {}
+func (*CampaignExtensionSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_61cdf4a6d2d3087e, []int{0}
+}
+
+func (m *CampaignExtensionSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignExtensionSetting.Unmarshal(m, b)
+}
+func (m *CampaignExtensionSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignExtensionSetting.Marshal(b, m, deterministic)
+}
+func (m *CampaignExtensionSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignExtensionSetting.Merge(m, src)
+}
+func (m *CampaignExtensionSetting) XXX_Size() int {
+	return xxx_messageInfo_CampaignExtensionSetting.Size(m)
+}
+func (m *CampaignExtensionSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignExtensionSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignExtensionSetting proto.InternalMessageInfo
+
+func (m *CampaignExtensionSetting) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignExtensionSetting) GetExtensionType() enums.ExtensionTypeEnum_ExtensionType {
+	if m != nil {
+		return m.ExtensionType
+	}
+	return enums.ExtensionTypeEnum_UNSPECIFIED
+}
+
+func (m *CampaignExtensionSetting) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *CampaignExtensionSetting) GetExtensionFeedItems() []*wrappers.StringValue {
+	if m != nil {
+		return m.ExtensionFeedItems
+	}
+	return nil
+}
+
+func (m *CampaignExtensionSetting) GetDevice() enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice {
+	if m != nil {
+		return m.Device
+	}
+	return enums.ExtensionSettingDeviceEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*CampaignExtensionSetting)(nil), "google.ads.googleads.v3.resources.CampaignExtensionSetting")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_extension_setting.proto", fileDescriptor_61cdf4a6d2d3087e)
+}
+
+var fileDescriptor_61cdf4a6d2d3087e = []byte{
+	// 493 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x41, 0x6b, 0xd4, 0x40,
+	0x14, 0x26, 0xd9, 0x5a, 0x34, 0xda, 0x1e, 0x82, 0x87, 0x58, 0xaa, 0x6c, 0x95, 0xc2, 0x9e, 0x66,
+	0x70, 0x73, 0x91, 0x28, 0x42, 0x56, 0x6b, 0x51, 0xa1, 0x2c, 0xa9, 0xec, 0x41, 0x16, 0xc2, 0x34,
+	0x79, 0x8d, 0x03, 0x3b, 0x33, 0x21, 0x33, 0x59, 0x2d, 0x52, 0xf0, 0xe0, 0xc9, 0x7f, 0xa1, 0x47,
+	0x7f, 0x8a, 0x3f, 0xa5, 0xbf, 0x42, 0x92, 0xcc, 0xcc, 0x76, 0x95, 0xb4, 0xbd, 0x7d, 0x99, 0xf7,
+	0x7d, 0xdf, 0x7b, 0xdf, 0x9b, 0x8c, 0x37, 0x29, 0x84, 0x28, 0x16, 0x80, 0x49, 0x2e, 0x71, 0x07,
+	0x1b, 0xb4, 0x0c, 0x71, 0x05, 0x52, 0xd4, 0x55, 0x06, 0x12, 0x67, 0x84, 0x95, 0x84, 0x16, 0x3c,
+	0x85, 0x2f, 0x0a, 0xb8, 0xa4, 0x82, 0xa7, 0x12, 0x94, 0xa2, 0xbc, 0x40, 0x65, 0x25, 0x94, 0xf0,
+	0xf7, 0x3a, 0x21, 0x22, 0xb9, 0x44, 0xd6, 0x03, 0x2d, 0x43, 0x64, 0x3d, 0x76, 0x5e, 0xf4, 0xb5,
+	0x01, 0x5e, 0x33, 0x89, 0xff, 0x73, 0x4e, 0x73, 0x58, 0xd2, 0x0c, 0xba, 0x06, 0x3b, 0xe3, 0x9b,
+	0xaa, 0xd5, 0x59, 0x69, 0x34, 0x0f, 0x8c, 0xa6, 0xa4, 0x36, 0x8b, 0x2e, 0x3d, 0xd2, 0xa5, 0xf6,
+	0xeb, 0xa4, 0x3e, 0xc5, 0x9f, 0x2b, 0x52, 0x96, 0x50, 0x49, 0x5d, 0xdf, 0xbd, 0x24, 0x25, 0x9c,
+	0x0b, 0x45, 0x14, 0x15, 0x5c, 0x57, 0x1f, 0xff, 0xdc, 0xf0, 0x82, 0x57, 0x7a, 0x25, 0x07, 0xa6,
+	0xf3, 0x71, 0x37, 0xb6, 0xff, 0xc4, 0xdb, 0x32, 0xcd, 0x52, 0x4e, 0x18, 0x04, 0xce, 0xd0, 0x19,
+	0xdd, 0x49, 0xee, 0x99, 0xc3, 0x23, 0xc2, 0xc0, 0x07, 0x6f, 0x7b, 0x7d, 0xe4, 0xc0, 0x1d, 0x3a,
+	0xa3, 0xed, 0xf1, 0x4b, 0xd4, 0xb7, 0xc8, 0x36, 0x27, 0xb2, 0xdd, 0x3e, 0x9c, 0x95, 0x70, 0xc0,
+	0x6b, 0xb6, 0x7e, 0x92, 0x6c, 0xc1, 0xe5, 0x4f, 0xff, 0x99, 0x77, 0xdb, 0x5c, 0x5d, 0x30, 0x18,
+	0x3a, 0xa3, 0xbb, 0xe3, 0x5d, 0xd3, 0xc0, 0x24, 0x47, 0xc7, 0xaa, 0xa2, 0xbc, 0x98, 0x91, 0x45,
+	0x0d, 0x89, 0x65, 0xfb, 0x47, 0xde, 0xfd, 0xd5, 0x80, 0xa7, 0x00, 0x79, 0x4a, 0x15, 0x30, 0x19,
+	0x6c, 0x0c, 0x07, 0xd7, 0xba, 0xf8, 0x56, 0xf9, 0x06, 0x20, 0x7f, 0xdb, 0xe8, 0xfc, 0x4f, 0xde,
+	0x66, 0x77, 0x9f, 0xc1, 0xad, 0x36, 0xe8, 0xf4, 0xa6, 0x41, 0xf5, 0x5a, 0x5f, 0xb7, 0xe2, 0xf5,
+	0xc4, 0x6b, 0xa5, 0x44, 0xfb, 0x47, 0xdf, 0x9d, 0x8b, 0xf8, 0x9b, 0xe3, 0x3d, 0x5d, 0x99, 0x6a,
+	0x54, 0x52, 0x89, 0x32, 0xc1, 0x70, 0xef, 0xcd, 0xbd, 0xcf, 0x6a, 0xa9, 0x04, 0x83, 0x4a, 0xe2,
+	0xaf, 0x06, 0x9e, 0xdb, 0x7f, 0xff, 0x5f, 0x7a, 0x43, 0xea, 0x7d, 0x16, 0xe7, 0x93, 0x1f, 0xae,
+	0xb7, 0x9f, 0x09, 0x86, 0xae, 0x7d, 0x18, 0x93, 0x87, 0x7d, 0x03, 0x4d, 0x9b, 0xe5, 0x4e, 0x9d,
+	0x8f, 0xef, 0xb4, 0x47, 0x21, 0x16, 0x84, 0x17, 0x48, 0x54, 0x05, 0x2e, 0x80, 0xb7, 0xab, 0xc7,
+	0xab, 0x6c, 0x57, 0xbc, 0xdf, 0xe7, 0x16, 0xfd, 0x72, 0x07, 0x87, 0x71, 0xfc, 0xdb, 0xdd, 0x3b,
+	0xec, 0x2c, 0xe3, 0x5c, 0xa2, 0x0e, 0x36, 0x68, 0x16, 0xa2, 0xc4, 0x30, 0xff, 0x18, 0xce, 0x3c,
+	0xce, 0xe5, 0xdc, 0x72, 0xe6, 0xb3, 0x70, 0x6e, 0x39, 0x17, 0xee, 0x7e, 0x57, 0x88, 0xa2, 0x38,
+	0x97, 0x51, 0x64, 0x59, 0x51, 0x34, 0x0b, 0xa3, 0xc8, 0xf2, 0x4e, 0x36, 0xdb, 0x61, 0xc3, 0xbf,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0x13, 0x85, 0xc3, 0xef, 0x6b, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_feed.pb.go b/googleapis/ads/googleads/v3/resources/campaign_feed.pb.go
new file mode 100644
index 0000000..8ecb5f3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_feed.pb.go
@@ -0,0 +1,164 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_feed.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A campaign feed.
+type CampaignFeed struct {
+	// The resource name of the campaign feed.
+	// Campaign feed resource names have the form:
+	//
+	// `customers/{customer_id}/campaignFeeds/{campaign_id}~{feed_id}
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The feed to which the CampaignFeed belongs.
+	Feed *wrappers.StringValue `protobuf:"bytes,2,opt,name=feed,proto3" json:"feed,omitempty"`
+	// The campaign to which the CampaignFeed belongs.
+	Campaign *wrappers.StringValue `protobuf:"bytes,3,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// Indicates which placeholder types the feed may populate under the connected
+	// campaign. Required.
+	PlaceholderTypes []enums.PlaceholderTypeEnum_PlaceholderType `protobuf:"varint,4,rep,packed,name=placeholder_types,json=placeholderTypes,proto3,enum=google.ads.googleads.v3.enums.PlaceholderTypeEnum_PlaceholderType" json:"placeholder_types,omitempty"`
+	// Matching function associated with the CampaignFeed.
+	// The matching function is used to filter the set of feed items selected.
+	// Required.
+	MatchingFunction *common.MatchingFunction `protobuf:"bytes,5,opt,name=matching_function,json=matchingFunction,proto3" json:"matching_function,omitempty"`
+	// Status of the campaign feed.
+	// This field is read-only.
+	Status               enums.FeedLinkStatusEnum_FeedLinkStatus `protobuf:"varint,6,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.FeedLinkStatusEnum_FeedLinkStatus" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *CampaignFeed) Reset()         { *m = CampaignFeed{} }
+func (m *CampaignFeed) String() string { return proto.CompactTextString(m) }
+func (*CampaignFeed) ProtoMessage()    {}
+func (*CampaignFeed) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6f9f25847e06da48, []int{0}
+}
+
+func (m *CampaignFeed) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignFeed.Unmarshal(m, b)
+}
+func (m *CampaignFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignFeed.Marshal(b, m, deterministic)
+}
+func (m *CampaignFeed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignFeed.Merge(m, src)
+}
+func (m *CampaignFeed) XXX_Size() int {
+	return xxx_messageInfo_CampaignFeed.Size(m)
+}
+func (m *CampaignFeed) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignFeed.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignFeed proto.InternalMessageInfo
+
+func (m *CampaignFeed) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignFeed) GetFeed() *wrappers.StringValue {
+	if m != nil {
+		return m.Feed
+	}
+	return nil
+}
+
+func (m *CampaignFeed) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *CampaignFeed) GetPlaceholderTypes() []enums.PlaceholderTypeEnum_PlaceholderType {
+	if m != nil {
+		return m.PlaceholderTypes
+	}
+	return nil
+}
+
+func (m *CampaignFeed) GetMatchingFunction() *common.MatchingFunction {
+	if m != nil {
+		return m.MatchingFunction
+	}
+	return nil
+}
+
+func (m *CampaignFeed) GetStatus() enums.FeedLinkStatusEnum_FeedLinkStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.FeedLinkStatusEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*CampaignFeed)(nil), "google.ads.googleads.v3.resources.CampaignFeed")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_feed.proto", fileDescriptor_6f9f25847e06da48)
+}
+
+var fileDescriptor_6f9f25847e06da48 = []byte{
+	// 527 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xdd, 0x6a, 0xd4, 0x40,
+	0x14, 0x26, 0xbb, 0xeb, 0xa2, 0x63, 0x2d, 0xdd, 0x5c, 0xc5, 0x52, 0x64, 0xab, 0x2c, 0xec, 0xd5,
+	0x4c, 0xd9, 0xa8, 0x48, 0xbc, 0x31, 0x2b, 0xb6, 0x20, 0x2a, 0x4b, 0x2a, 0x8b, 0xe8, 0x6a, 0x98,
+	0x26, 0xb3, 0x69, 0x68, 0xe6, 0x87, 0x4c, 0x52, 0x29, 0xd2, 0x97, 0xf1, 0x4e, 0x1f, 0xc5, 0x47,
+	0xe9, 0x43, 0x88, 0x4c, 0x32, 0x99, 0xfd, 0x91, 0x6d, 0x7b, 0xf7, 0xe5, 0x9c, 0xef, 0x3b, 0x73,
+	0xce, 0xf9, 0x72, 0xc0, 0xb3, 0x84, 0xf3, 0x24, 0x23, 0x08, 0xc7, 0x12, 0xd5, 0x50, 0xa1, 0x73,
+	0x17, 0xe5, 0x44, 0xf2, 0x32, 0x8f, 0x88, 0x44, 0x11, 0xa6, 0x02, 0xa7, 0x09, 0x0b, 0xe7, 0x84,
+	0xc4, 0x50, 0xe4, 0xbc, 0xe0, 0xf6, 0x7e, 0xcd, 0x85, 0x38, 0x96, 0xd0, 0xc8, 0xe0, 0xb9, 0x0b,
+	0x8d, 0x6c, 0xf7, 0xf9, 0xa6, 0xca, 0x11, 0xa7, 0x94, 0x33, 0x44, 0x71, 0x11, 0x9d, 0xa6, 0x2c,
+	0x09, 0xe7, 0x25, 0x8b, 0x8a, 0x94, 0xb3, 0xba, 0xf4, 0xee, 0xd3, 0x4d, 0x3a, 0xc2, 0x4a, 0x2a,
+	0x91, 0x6a, 0x22, 0xcc, 0x52, 0x76, 0x16, 0xca, 0x02, 0x17, 0xa5, 0xbc, 0x9d, 0x4a, 0x64, 0x38,
+	0x22, 0xa7, 0x3c, 0x8b, 0x49, 0x1e, 0x16, 0x17, 0x82, 0x68, 0xd5, 0xc3, 0x46, 0x25, 0x52, 0x33,
+	0xb0, 0x4e, 0x3d, 0xd2, 0xa9, 0xea, 0xeb, 0xa4, 0x9c, 0xa3, 0xef, 0x39, 0x16, 0x82, 0xe4, 0xcd,
+	0x83, 0x7b, 0x4b, 0x52, 0xcc, 0x18, 0x2f, 0xb0, 0x9a, 0x41, 0x67, 0x1f, 0xff, 0xea, 0x80, 0xad,
+	0xd7, 0x7a, 0x6f, 0x87, 0x84, 0xc4, 0xf6, 0x13, 0xf0, 0xa0, 0x79, 0x20, 0x64, 0x98, 0x12, 0xc7,
+	0xea, 0x5b, 0xc3, 0x7b, 0xc1, 0x56, 0x13, 0xfc, 0x80, 0x29, 0xb1, 0x0f, 0x40, 0x47, 0x8d, 0xe7,
+	0xb4, 0xfa, 0xd6, 0xf0, 0xfe, 0x68, 0x4f, 0x6f, 0x16, 0x36, 0x2d, 0xc0, 0xe3, 0x22, 0x4f, 0x59,
+	0x32, 0xc5, 0x59, 0x49, 0x82, 0x8a, 0x69, 0xbf, 0x00, 0x77, 0x1b, 0x7b, 0x9c, 0xf6, 0x2d, 0x54,
+	0x86, 0x6d, 0x73, 0xd0, 0x5b, 0x5f, 0x8a, 0x74, 0x3a, 0xfd, 0xf6, 0x70, 0x7b, 0x34, 0x86, 0x9b,
+	0xdc, 0xad, 0x96, 0x09, 0x27, 0x0b, 0xdd, 0xc7, 0x0b, 0x41, 0xde, 0xb0, 0x92, 0xae, 0xc7, 0x82,
+	0x1d, 0xb1, 0x1a, 0x90, 0xf6, 0x57, 0xd0, 0xfb, 0xcf, 0x72, 0xe7, 0x4e, 0xd5, 0xf3, 0xc1, 0xc6,
+	0x07, 0xeb, 0x7f, 0x05, 0xbe, 0xd7, 0xc2, 0x43, 0xad, 0x0b, 0x76, 0xe8, 0x5a, 0xc4, 0xfe, 0x04,
+	0xba, 0xf5, 0x0f, 0xe1, 0x74, 0xfb, 0xd6, 0x70, 0x7b, 0xf4, 0xea, 0x86, 0x21, 0x94, 0x2b, 0xef,
+	0x52, 0x76, 0x76, 0x5c, 0x89, 0xaa, 0x19, 0x56, 0x43, 0x81, 0xae, 0xe7, 0x7d, 0xbb, 0xf2, 0xbf,
+	0x80, 0xc1, 0xa2, 0x84, 0x46, 0x22, 0x95, 0xaa, 0x3d, 0xb4, 0x62, 0xf3, 0x28, 0x2a, 0x65, 0xc1,
+	0x29, 0xc9, 0x25, 0xfa, 0xd1, 0xc0, 0x4b, 0x73, 0x41, 0x8a, 0xa2, 0x12, 0xcb, 0x07, 0x75, 0x39,
+	0xfe, 0x6b, 0x81, 0x41, 0xc4, 0x29, 0xbc, 0xf1, 0xa4, 0xc6, 0xbd, 0xe5, 0xb7, 0x26, 0xca, 0xdf,
+	0x89, 0xf5, 0xf9, 0xad, 0xd6, 0x25, 0x3c, 0xc3, 0x2c, 0x81, 0x3c, 0x4f, 0x50, 0x42, 0x58, 0xe5,
+	0x3e, 0x5a, 0xb4, 0x7a, 0xcd, 0x81, 0xbf, 0x34, 0xe8, 0x67, 0xab, 0x7d, 0xe4, 0xfb, 0xbf, 0x5b,
+	0xfb, 0x47, 0x75, 0x49, 0x3f, 0x96, 0xb0, 0x86, 0x0a, 0x4d, 0x5d, 0x18, 0x34, 0xcc, 0x3f, 0x0d,
+	0x67, 0xe6, 0xc7, 0x72, 0x66, 0x38, 0xb3, 0xa9, 0x3b, 0x33, 0x9c, 0xab, 0xd6, 0xa0, 0x4e, 0x78,
+	0x9e, 0x1f, 0x4b, 0xcf, 0x33, 0x2c, 0xcf, 0x9b, 0xba, 0x9e, 0x67, 0x78, 0x27, 0xdd, 0xaa, 0x59,
+	0xf7, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0xa1, 0xf2, 0xf2, 0x8c, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_label.pb.go b/googleapis/ads/googleads/v3/resources/campaign_label.pb.go
new file mode 100644
index 0000000..674ce3b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_label.pb.go
@@ -0,0 +1,121 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_label.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Represents a relationship between a campaign and a label.
+type CampaignLabel struct {
+	// Name of the resource.
+	// Campaign label resource names have the form:
+	// `customers/{customer_id}/campaignLabels/{campaign_id}~{label_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The campaign to which the label is attached.
+	Campaign *wrappers.StringValue `protobuf:"bytes,2,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// The label assigned to the campaign.
+	Label                *wrappers.StringValue `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CampaignLabel) Reset()         { *m = CampaignLabel{} }
+func (m *CampaignLabel) String() string { return proto.CompactTextString(m) }
+func (*CampaignLabel) ProtoMessage()    {}
+func (*CampaignLabel) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b50dc695bdd1c347, []int{0}
+}
+
+func (m *CampaignLabel) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignLabel.Unmarshal(m, b)
+}
+func (m *CampaignLabel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignLabel.Marshal(b, m, deterministic)
+}
+func (m *CampaignLabel) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignLabel.Merge(m, src)
+}
+func (m *CampaignLabel) XXX_Size() int {
+	return xxx_messageInfo_CampaignLabel.Size(m)
+}
+func (m *CampaignLabel) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignLabel.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignLabel proto.InternalMessageInfo
+
+func (m *CampaignLabel) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignLabel) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *CampaignLabel) GetLabel() *wrappers.StringValue {
+	if m != nil {
+		return m.Label
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CampaignLabel)(nil), "google.ads.googleads.v3.resources.CampaignLabel")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_label.proto", fileDescriptor_b50dc695bdd1c347)
+}
+
+var fileDescriptor_b50dc695bdd1c347 = []byte{
+	// 372 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x4b, 0xf3, 0x30,
+	0x1c, 0xc6, 0x69, 0xc7, 0xfb, 0xa2, 0xd5, 0x5d, 0x7a, 0x9a, 0x63, 0xc8, 0xa6, 0x4c, 0x76, 0x4a,
+	0x60, 0x15, 0x91, 0x78, 0xea, 0x3c, 0x0c, 0x44, 0x64, 0x4c, 0xe8, 0x41, 0x8a, 0x23, 0x6b, 0x63,
+	0x28, 0xb4, 0x49, 0x49, 0xda, 0x79, 0x90, 0x1d, 0xfd, 0x22, 0x1e, 0xfd, 0x28, 0x7e, 0x94, 0x7d,
+	0x09, 0xa5, 0x6d, 0x92, 0xb9, 0x8b, 0x7a, 0x7b, 0xb6, 0xe7, 0xf7, 0xfc, 0xf3, 0xfc, 0x93, 0x3a,
+	0x17, 0x94, 0x73, 0x9a, 0x12, 0x88, 0x63, 0x09, 0x1b, 0x59, 0xa9, 0x95, 0x07, 0x05, 0x91, 0xbc,
+	0x14, 0x11, 0x91, 0x30, 0xc2, 0x59, 0x8e, 0x13, 0xca, 0x16, 0x29, 0x5e, 0x92, 0x14, 0xe4, 0x82,
+	0x17, 0xdc, 0x1d, 0x34, 0x30, 0xc0, 0xb1, 0x04, 0x26, 0x07, 0x56, 0x1e, 0x30, 0xb9, 0xee, 0x91,
+	0x1e, 0x9d, 0x27, 0x66, 0x5a, 0x93, 0xee, 0x1e, 0x2b, 0xab, 0xfe, 0xb5, 0x2c, 0x9f, 0xe0, 0xb3,
+	0xc0, 0x79, 0x4e, 0x84, 0x54, 0x7e, 0xef, 0x5b, 0x14, 0x33, 0xc6, 0x0b, 0x5c, 0x24, 0x9c, 0x29,
+	0xf7, 0xe4, 0xd5, 0x76, 0xda, 0xd7, 0xaa, 0xd4, 0x6d, 0xd5, 0xc9, 0x3d, 0x75, 0xda, 0xfa, 0x84,
+	0x05, 0xc3, 0x19, 0xe9, 0x58, 0x7d, 0x6b, 0xb4, 0x3f, 0x3f, 0xd4, 0x7f, 0xde, 0xe1, 0x8c, 0xb8,
+	0x97, 0xce, 0x9e, 0x5e, 0xa5, 0x63, 0xf7, 0xad, 0xd1, 0xc1, 0xb8, 0xa7, 0xaa, 0x03, 0xdd, 0x03,
+	0xdc, 0x17, 0x22, 0x61, 0x34, 0xc0, 0x69, 0x49, 0xe6, 0x86, 0x76, 0xc7, 0xce, 0xbf, 0x7a, 0xf7,
+	0x4e, 0xeb, 0x0f, 0xb1, 0x06, 0x45, 0x78, 0xe3, 0x3f, 0x3a, 0x67, 0xdb, 0xab, 0x51, 0x2a, 0x4f,
+	0x24, 0x88, 0x78, 0x06, 0x77, 0xfb, 0x9f, 0x47, 0xa5, 0x2c, 0x78, 0x46, 0x84, 0x84, 0x2f, 0x5a,
+	0xae, 0xcd, 0xc5, 0xd7, 0x4c, 0xe5, 0xec, 0x3c, 0xc4, 0x7a, 0xf2, 0x69, 0x39, 0xc3, 0x88, 0x67,
+	0xe0, 0xd7, 0xa7, 0x98, 0xb8, 0x3b, 0xc7, 0xcd, 0xaa, 0xda, 0x33, 0xeb, 0xe1, 0x46, 0x05, 0x29,
+	0x4f, 0x31, 0xa3, 0x80, 0x0b, 0x0a, 0x29, 0x61, 0xf5, 0x52, 0x70, 0x5b, 0xf7, 0x87, 0x4f, 0xe3,
+	0xca, 0xa8, 0x37, 0xbb, 0x35, 0xf5, 0xfd, 0x77, 0x7b, 0x30, 0x6d, 0x46, 0xfa, 0xb1, 0x04, 0x8d,
+	0xac, 0x54, 0xe0, 0x81, 0xb9, 0x26, 0x3f, 0x34, 0x13, 0xfa, 0xb1, 0x0c, 0x0d, 0x13, 0x06, 0x5e,
+	0x68, 0x98, 0x8d, 0x3d, 0x6c, 0x0c, 0x84, 0xfc, 0x58, 0x22, 0x64, 0x28, 0x84, 0x02, 0x0f, 0x21,
+	0xc3, 0x2d, 0xff, 0xd7, 0x65, 0xbd, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xd7, 0x8a, 0xa9,
+	0xc6, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/campaign_shared_set.pb.go b/googleapis/ads/googleads/v3/resources/campaign_shared_set.pb.go
new file mode 100644
index 0000000..7499a07
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/campaign_shared_set.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/campaign_shared_set.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// CampaignSharedSets are used for managing the shared sets associated with a
+// campaign.
+type CampaignSharedSet struct {
+	// The resource name of the campaign shared set.
+	// Campaign shared set resource names have the form:
+	//
+	// `customers/{customer_id}/campaignSharedSets/{campaign_id}~{shared_set_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The campaign to which the campaign shared set belongs.
+	Campaign *wrappers.StringValue `protobuf:"bytes,3,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// The shared set associated with the campaign. This may be a negative keyword
+	// shared set of another customer. This customer should be a manager of the
+	// other customer, otherwise the campaign shared set will exist but have no
+	// serving effect. Only negative keyword shared sets can be associated with
+	// Shopping campaigns. Only negative placement shared sets can be associated
+	// with Display mobile app campaigns.
+	SharedSet *wrappers.StringValue `protobuf:"bytes,4,opt,name=shared_set,json=sharedSet,proto3" json:"shared_set,omitempty"`
+	// The status of this campaign shared set. Read only.
+	Status               enums.CampaignSharedSetStatusEnum_CampaignSharedSetStatus `protobuf:"varint,2,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.CampaignSharedSetStatusEnum_CampaignSharedSetStatus" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                  `json:"-"`
+	XXX_unrecognized     []byte                                                    `json:"-"`
+	XXX_sizecache        int32                                                     `json:"-"`
+}
+
+func (m *CampaignSharedSet) Reset()         { *m = CampaignSharedSet{} }
+func (m *CampaignSharedSet) String() string { return proto.CompactTextString(m) }
+func (*CampaignSharedSet) ProtoMessage()    {}
+func (*CampaignSharedSet) Descriptor() ([]byte, []int) {
+	return fileDescriptor_41d4c077729b864b, []int{0}
+}
+
+func (m *CampaignSharedSet) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignSharedSet.Unmarshal(m, b)
+}
+func (m *CampaignSharedSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignSharedSet.Marshal(b, m, deterministic)
+}
+func (m *CampaignSharedSet) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignSharedSet.Merge(m, src)
+}
+func (m *CampaignSharedSet) XXX_Size() int {
+	return xxx_messageInfo_CampaignSharedSet.Size(m)
+}
+func (m *CampaignSharedSet) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignSharedSet.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignSharedSet proto.InternalMessageInfo
+
+func (m *CampaignSharedSet) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CampaignSharedSet) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *CampaignSharedSet) GetSharedSet() *wrappers.StringValue {
+	if m != nil {
+		return m.SharedSet
+	}
+	return nil
+}
+
+func (m *CampaignSharedSet) GetStatus() enums.CampaignSharedSetStatusEnum_CampaignSharedSetStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.CampaignSharedSetStatusEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*CampaignSharedSet)(nil), "google.ads.googleads.v3.resources.CampaignSharedSet")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/campaign_shared_set.proto", fileDescriptor_41d4c077729b864b)
+}
+
+var fileDescriptor_41d4c077729b864b = []byte{
+	// 430 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x4f, 0x8b, 0xd4, 0x30,
+	0x1c, 0xa5, 0x1d, 0x59, 0xdc, 0xf8, 0x07, 0xec, 0x41, 0xea, 0xb2, 0xc8, 0xac, 0xb2, 0x30, 0x78,
+	0x48, 0x60, 0x7b, 0x91, 0x0c, 0x0a, 0x5d, 0x91, 0x05, 0x0f, 0xb2, 0xb4, 0xd0, 0x83, 0x14, 0x4a,
+	0xb6, 0x8d, 0xb1, 0x3a, 0x49, 0x4a, 0x92, 0xae, 0x07, 0xd9, 0x93, 0x47, 0xbf, 0x85, 0x47, 0x3f,
+	0x8a, 0x1f, 0x65, 0x3e, 0x85, 0xb4, 0x4d, 0x32, 0x42, 0x1d, 0xf5, 0xf6, 0xda, 0xdf, 0x7b, 0xbf,
+	0xf7, 0xf2, 0x12, 0xb0, 0x66, 0x52, 0xb2, 0x0d, 0x45, 0xa4, 0xd1, 0x68, 0x82, 0x03, 0xba, 0x4e,
+	0x90, 0xa2, 0x5a, 0xf6, 0xaa, 0xa6, 0x1a, 0xd5, 0x84, 0x77, 0xa4, 0x65, 0xa2, 0xd2, 0x1f, 0x88,
+	0xa2, 0x4d, 0xa5, 0xa9, 0x81, 0x9d, 0x92, 0x46, 0x46, 0x27, 0x93, 0x02, 0x92, 0x46, 0x43, 0x2f,
+	0x86, 0xd7, 0x09, 0xf4, 0xe2, 0xa3, 0x97, 0xfb, 0xf6, 0x53, 0xd1, 0xf3, 0x3f, 0xee, 0xae, 0xb4,
+	0x21, 0xa6, 0xd7, 0x93, 0xc5, 0xd1, 0x23, 0xa7, 0xef, 0x5a, 0x1f, 0xc9, 0x8e, 0x1e, 0xdb, 0xd1,
+	0xf8, 0x75, 0xd5, 0xbf, 0x47, 0x9f, 0x15, 0xe9, 0x3a, 0xaa, 0x9c, 0xf4, 0xf8, 0x37, 0x29, 0x11,
+	0x42, 0x1a, 0x62, 0x5a, 0x29, 0xec, 0xf4, 0xc9, 0xb7, 0x05, 0x78, 0xf0, 0xca, 0xba, 0xe7, 0xa3,
+	0x79, 0x4e, 0x4d, 0xf4, 0x14, 0xdc, 0x73, 0x2e, 0x95, 0x20, 0x9c, 0xc6, 0xc1, 0x32, 0x58, 0x1d,
+	0x66, 0x77, 0xdd, 0xcf, 0xb7, 0x84, 0xd3, 0xe8, 0x39, 0xb8, 0xed, 0x72, 0xc7, 0x8b, 0x65, 0xb0,
+	0xba, 0x73, 0x76, 0x6c, 0x8f, 0x0f, 0x5d, 0x16, 0x98, 0x1b, 0xd5, 0x0a, 0x56, 0x90, 0x4d, 0x4f,
+	0x33, 0xcf, 0x8e, 0xd6, 0x00, 0xec, 0x0e, 0x1a, 0xdf, 0xfa, 0x0f, 0xed, 0xa1, 0xf6, 0xd9, 0x3e,
+	0x82, 0x83, 0xa9, 0x9a, 0x38, 0x5c, 0x06, 0xab, 0xfb, 0x67, 0x19, 0xdc, 0x57, 0xff, 0xd8, 0x2d,
+	0x9c, 0x9d, 0x2e, 0x1f, 0xd5, 0xaf, 0x45, 0xcf, 0xf7, 0xcd, 0x32, 0xeb, 0x80, 0xc5, 0x36, 0xfd,
+	0x04, 0x9e, 0xed, 0x96, 0x5a, 0xd4, 0xb5, 0x1a, 0xd6, 0x92, 0xa3, 0x79, 0x71, 0x2f, 0xea, 0x5e,
+	0x1b, 0xc9, 0xa9, 0xd2, 0xe8, 0x8b, 0x83, 0x37, 0xfe, 0x7a, 0x3d, 0x6f, 0x98, 0xce, 0xaf, 0xfc,
+	0xe6, 0xfc, 0x6b, 0x08, 0x4e, 0x6b, 0xc9, 0xe1, 0x3f, 0x1f, 0xd4, 0xf9, 0xc3, 0x99, 0xf7, 0xe5,
+	0xd0, 0xdb, 0x65, 0xf0, 0xee, 0x8d, 0x15, 0x33, 0xb9, 0x21, 0x82, 0x41, 0xa9, 0x18, 0x62, 0x54,
+	0x8c, 0xad, 0xa2, 0x5d, 0xfe, 0xbf, 0xbc, 0xf4, 0xb5, 0x47, 0xdf, 0xc3, 0xc5, 0x45, 0x9a, 0xfe,
+	0x08, 0x4f, 0x2e, 0xa6, 0x95, 0x69, 0xa3, 0xe1, 0x04, 0x07, 0x54, 0x24, 0x30, 0x73, 0xcc, 0x9f,
+	0x8e, 0x53, 0xa6, 0x8d, 0x2e, 0x3d, 0xa7, 0x2c, 0x92, 0xd2, 0x73, 0xb6, 0xe1, 0xe9, 0x34, 0xc0,
+	0x38, 0x6d, 0x34, 0xc6, 0x9e, 0x85, 0x71, 0x91, 0x60, 0xec, 0x79, 0x57, 0x07, 0x63, 0xd8, 0xe4,
+	0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x8a, 0xa2, 0x34, 0x95, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/carrier_constant.pb.go b/googleapis/ads/googleads/v3/resources/carrier_constant.pb.go
new file mode 100644
index 0000000..34bd5df
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/carrier_constant.pb.go
@@ -0,0 +1,133 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/carrier_constant.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A carrier criterion that can be used in campaign targeting.
+type CarrierConstant struct {
+	// The resource name of the carrier criterion.
+	// Carrier criterion resource names have the form:
+	//
+	// `carrierConstants/{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the carrier criterion.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The full name of the carrier in English.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The country code of the country where the carrier is located, e.g., "AR",
+	// "FR", etc.
+	CountryCode          *wrappers.StringValue `protobuf:"bytes,4,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CarrierConstant) Reset()         { *m = CarrierConstant{} }
+func (m *CarrierConstant) String() string { return proto.CompactTextString(m) }
+func (*CarrierConstant) ProtoMessage()    {}
+func (*CarrierConstant) Descriptor() ([]byte, []int) {
+	return fileDescriptor_41cfb443de8f3806, []int{0}
+}
+
+func (m *CarrierConstant) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CarrierConstant.Unmarshal(m, b)
+}
+func (m *CarrierConstant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CarrierConstant.Marshal(b, m, deterministic)
+}
+func (m *CarrierConstant) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CarrierConstant.Merge(m, src)
+}
+func (m *CarrierConstant) XXX_Size() int {
+	return xxx_messageInfo_CarrierConstant.Size(m)
+}
+func (m *CarrierConstant) XXX_DiscardUnknown() {
+	xxx_messageInfo_CarrierConstant.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CarrierConstant proto.InternalMessageInfo
+
+func (m *CarrierConstant) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CarrierConstant) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *CarrierConstant) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *CarrierConstant) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CarrierConstant)(nil), "google.ads.googleads.v3.resources.CarrierConstant")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/carrier_constant.proto", fileDescriptor_41cfb443de8f3806)
+}
+
+var fileDescriptor_41cfb443de8f3806 = []byte{
+	// 394 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xd1, 0xaa, 0xd3, 0x30,
+	0x1c, 0xc6, 0x69, 0xce, 0x41, 0x30, 0xe7, 0x88, 0x50, 0xbc, 0x98, 0xc7, 0x21, 0x9b, 0x32, 0x18,
+	0x08, 0x89, 0x58, 0x11, 0x89, 0x17, 0xd2, 0xed, 0x62, 0xe8, 0x85, 0x8e, 0x0a, 0xbd, 0x90, 0xc2,
+	0xc8, 0x92, 0x58, 0x0a, 0x6b, 0x52, 0x92, 0x74, 0x22, 0xe2, 0x85, 0xaf, 0xe2, 0xe5, 0x1e, 0xc5,
+	0x47, 0xd9, 0x53, 0xc8, 0x9a, 0x34, 0xd3, 0x0d, 0xd4, 0xbb, 0xaf, 0xf9, 0xff, 0xbe, 0xaf, 0x5f,
+	0xfa, 0x2f, 0x7c, 0x59, 0x2a, 0x55, 0x6e, 0x04, 0xa6, 0xdc, 0x60, 0x27, 0x0f, 0x6a, 0x9b, 0x60,
+	0x2d, 0x8c, 0x6a, 0x35, 0x13, 0x06, 0x33, 0xaa, 0x75, 0x25, 0xf4, 0x8a, 0x29, 0x69, 0x2c, 0x95,
+	0x16, 0x35, 0x5a, 0x59, 0x15, 0x8f, 0x1d, 0x8e, 0x28, 0x37, 0x28, 0x38, 0xd1, 0x36, 0x41, 0xc1,
+	0x79, 0x73, 0xbf, 0x0f, 0x6f, 0xaa, 0x90, 0xe7, 0xdc, 0x37, 0x0f, 0xfd, 0xa8, 0x7b, 0x5a, 0xb7,
+	0x9f, 0xf0, 0x67, 0x4d, 0x9b, 0x46, 0x68, 0xe3, 0xe7, 0xc3, 0xdf, 0xac, 0x54, 0x4a, 0x65, 0xa9,
+	0xad, 0x94, 0xf4, 0xd3, 0x47, 0x3b, 0x00, 0xef, 0xce, 0x5d, 0xad, 0xb9, 0x6f, 0x15, 0x3f, 0x86,
+	0x77, 0xfa, 0x77, 0xac, 0x24, 0xad, 0xc5, 0x20, 0x1a, 0x45, 0xd3, 0xdb, 0xd9, 0x75, 0x7f, 0xf8,
+	0x8e, 0xd6, 0x22, 0x7e, 0x02, 0x41, 0xc5, 0x07, 0x60, 0x14, 0x4d, 0xaf, 0x9e, 0x3d, 0xf0, 0xb5,
+	0x51, 0xdf, 0x01, 0xbd, 0x91, 0xf6, 0xc5, 0xf3, 0x9c, 0x6e, 0x5a, 0x91, 0x81, 0x8a, 0xc7, 0x4f,
+	0xe1, 0x65, 0x17, 0x74, 0xd1, 0xe1, 0xc3, 0x33, 0xfc, 0x83, 0xd5, 0x95, 0x2c, 0x1d, 0xdf, 0x91,
+	0xf1, 0x6b, 0x78, 0xcd, 0x54, 0x2b, 0xad, 0xfe, 0xb2, 0x62, 0x8a, 0x8b, 0xc1, 0xe5, 0x7f, 0x38,
+	0xaf, 0xbc, 0x63, 0xae, 0xb8, 0x20, 0xd9, 0x3e, 0x7d, 0x0f, 0xa7, 0xc7, 0xcf, 0xe9, 0x55, 0x53,
+	0x19, 0xc4, 0x54, 0x8d, 0xcf, 0xee, 0xcc, 0xfe, 0x3c, 0x30, 0xf8, 0xeb, 0xe9, 0xb6, 0xbe, 0xcd,
+	0xbe, 0x03, 0x38, 0x61, 0xaa, 0x46, 0xff, 0xdc, 0xd7, 0xec, 0xde, 0x49, 0xfe, 0xf2, 0xd0, 0x77,
+	0x19, 0x7d, 0x7c, 0xeb, 0xad, 0xa5, 0xda, 0x50, 0x59, 0x22, 0xa5, 0x4b, 0x5c, 0x0a, 0xd9, 0xdd,
+	0x06, 0x1f, 0x1b, 0xfe, 0xe5, 0x1f, 0x7a, 0x15, 0xd4, 0x0f, 0x70, 0xb1, 0x48, 0xd3, 0x1d, 0x18,
+	0x2f, 0x5c, 0x64, 0xca, 0x0d, 0x72, 0xf2, 0xa0, 0xf2, 0x04, 0x65, 0x3d, 0xf9, 0xb3, 0x67, 0x8a,
+	0x94, 0x9b, 0x22, 0x30, 0x45, 0x9e, 0x14, 0x81, 0xd9, 0x83, 0x89, 0x1b, 0x10, 0x92, 0x72, 0x43,
+	0x48, 0xa0, 0x08, 0xc9, 0x13, 0x42, 0x02, 0xb7, 0xbe, 0xd5, 0x95, 0x4d, 0x7e, 0x05, 0x00, 0x00,
+	0xff, 0xff, 0xbe, 0xb4, 0x80, 0x31, 0xef, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/change_status.pb.go b/googleapis/ads/googleads/v3/resources/change_status.pb.go
new file mode 100644
index 0000000..8854e66
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/change_status.pb.go
@@ -0,0 +1,241 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/change_status.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Describes the status of returned resource.
+type ChangeStatus struct {
+	// The resource name of the change status.
+	// Change status resource names have the form:
+	//
+	// `customers/{customer_id}/changeStatus/{change_status_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Time at which the most recent change has occurred on this resource.
+	LastChangeDateTime *wrappers.StringValue `protobuf:"bytes,3,opt,name=last_change_date_time,json=lastChangeDateTime,proto3" json:"last_change_date_time,omitempty"`
+	// Represents the type of the changed resource. This dictates what fields
+	// will be set. For example, for AD_GROUP, campaign and ad_group fields will
+	// be set.
+	ResourceType enums.ChangeStatusResourceTypeEnum_ChangeStatusResourceType `protobuf:"varint,4,opt,name=resource_type,json=resourceType,proto3,enum=google.ads.googleads.v3.enums.ChangeStatusResourceTypeEnum_ChangeStatusResourceType" json:"resource_type,omitempty"`
+	// The Campaign affected by this change.
+	Campaign *wrappers.StringValue `protobuf:"bytes,5,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// The AdGroup affected by this change.
+	AdGroup *wrappers.StringValue `protobuf:"bytes,6,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// Represents the status of the changed resource.
+	ResourceStatus enums.ChangeStatusOperationEnum_ChangeStatusOperation `protobuf:"varint,8,opt,name=resource_status,json=resourceStatus,proto3,enum=google.ads.googleads.v3.enums.ChangeStatusOperationEnum_ChangeStatusOperation" json:"resource_status,omitempty"`
+	// The AdGroupAd affected by this change.
+	AdGroupAd *wrappers.StringValue `protobuf:"bytes,9,opt,name=ad_group_ad,json=adGroupAd,proto3" json:"ad_group_ad,omitempty"`
+	// The AdGroupCriterion affected by this change.
+	AdGroupCriterion *wrappers.StringValue `protobuf:"bytes,10,opt,name=ad_group_criterion,json=adGroupCriterion,proto3" json:"ad_group_criterion,omitempty"`
+	// The CampaignCriterion affected by this change.
+	CampaignCriterion *wrappers.StringValue `protobuf:"bytes,11,opt,name=campaign_criterion,json=campaignCriterion,proto3" json:"campaign_criterion,omitempty"`
+	// The Feed affected by this change.
+	Feed *wrappers.StringValue `protobuf:"bytes,12,opt,name=feed,proto3" json:"feed,omitempty"`
+	// The FeedItem affected by this change.
+	FeedItem *wrappers.StringValue `protobuf:"bytes,13,opt,name=feed_item,json=feedItem,proto3" json:"feed_item,omitempty"`
+	// The AdGroupFeed affected by this change.
+	AdGroupFeed *wrappers.StringValue `protobuf:"bytes,14,opt,name=ad_group_feed,json=adGroupFeed,proto3" json:"ad_group_feed,omitempty"`
+	// The CampaignFeed affected by this change.
+	CampaignFeed *wrappers.StringValue `protobuf:"bytes,15,opt,name=campaign_feed,json=campaignFeed,proto3" json:"campaign_feed,omitempty"`
+	// The AdGroupBidModifier affected by this change.
+	AdGroupBidModifier   *wrappers.StringValue `protobuf:"bytes,16,opt,name=ad_group_bid_modifier,json=adGroupBidModifier,proto3" json:"ad_group_bid_modifier,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ChangeStatus) Reset()         { *m = ChangeStatus{} }
+func (m *ChangeStatus) String() string { return proto.CompactTextString(m) }
+func (*ChangeStatus) ProtoMessage()    {}
+func (*ChangeStatus) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d9c24d7e7a930b4, []int{0}
+}
+
+func (m *ChangeStatus) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ChangeStatus.Unmarshal(m, b)
+}
+func (m *ChangeStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ChangeStatus.Marshal(b, m, deterministic)
+}
+func (m *ChangeStatus) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ChangeStatus.Merge(m, src)
+}
+func (m *ChangeStatus) XXX_Size() int {
+	return xxx_messageInfo_ChangeStatus.Size(m)
+}
+func (m *ChangeStatus) XXX_DiscardUnknown() {
+	xxx_messageInfo_ChangeStatus.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ChangeStatus proto.InternalMessageInfo
+
+func (m *ChangeStatus) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *ChangeStatus) GetLastChangeDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.LastChangeDateTime
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetResourceType() enums.ChangeStatusResourceTypeEnum_ChangeStatusResourceType {
+	if m != nil {
+		return m.ResourceType
+	}
+	return enums.ChangeStatusResourceTypeEnum_UNSPECIFIED
+}
+
+func (m *ChangeStatus) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetResourceStatus() enums.ChangeStatusOperationEnum_ChangeStatusOperation {
+	if m != nil {
+		return m.ResourceStatus
+	}
+	return enums.ChangeStatusOperationEnum_UNSPECIFIED
+}
+
+func (m *ChangeStatus) GetAdGroupAd() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupAd
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetAdGroupCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupCriterion
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetCampaignCriterion() *wrappers.StringValue {
+	if m != nil {
+		return m.CampaignCriterion
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetFeed() *wrappers.StringValue {
+	if m != nil {
+		return m.Feed
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetFeedItem() *wrappers.StringValue {
+	if m != nil {
+		return m.FeedItem
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetAdGroupFeed() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupFeed
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetCampaignFeed() *wrappers.StringValue {
+	if m != nil {
+		return m.CampaignFeed
+	}
+	return nil
+}
+
+func (m *ChangeStatus) GetAdGroupBidModifier() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupBidModifier
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ChangeStatus)(nil), "google.ads.googleads.v3.resources.ChangeStatus")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/change_status.proto", fileDescriptor_4d9c24d7e7a930b4)
+}
+
+var fileDescriptor_4d9c24d7e7a930b4 = []byte{
+	// 650 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdf, 0x4e, 0xdb, 0x3e,
+	0x18, 0x55, 0x81, 0x1f, 0xbf, 0xd6, 0x6d, 0xf9, 0x63, 0x09, 0x29, 0x43, 0x68, 0x82, 0x4d, 0x48,
+	0x5c, 0x39, 0x1b, 0xd5, 0xb4, 0x2d, 0x4c, 0xda, 0x02, 0xdb, 0xd0, 0x98, 0x06, 0xa8, 0xa0, 0x5e,
+	0xa0, 0x4e, 0x91, 0x89, 0x4d, 0x66, 0xa9, 0x8e, 0x23, 0xdb, 0x01, 0x21, 0xc4, 0xcb, 0xec, 0x72,
+	0x8f, 0xb2, 0xe7, 0xd8, 0x15, 0x0f, 0x31, 0x4d, 0x49, 0x6c, 0xb7, 0x6c, 0x62, 0x0b, 0x57, 0xfd,
+	0xd2, 0xef, 0x9c, 0xf3, 0x9d, 0x63, 0x27, 0x1f, 0x78, 0x96, 0x08, 0x91, 0x8c, 0xa8, 0x8f, 0x89,
+	0xf2, 0xab, 0xb2, 0xa8, 0xce, 0x7b, 0xbe, 0xa4, 0x4a, 0xe4, 0x32, 0xa6, 0xca, 0x8f, 0xbf, 0xe0,
+	0x34, 0xa1, 0x91, 0xd2, 0x58, 0xe7, 0x0a, 0x65, 0x52, 0x68, 0x01, 0xd7, 0x2a, 0x2c, 0xc2, 0x44,
+	0x21, 0x47, 0x43, 0xe7, 0x3d, 0xe4, 0x68, 0xcb, 0x5b, 0x77, 0x29, 0xd3, 0x34, 0xe7, 0xbf, 0xa9,
+	0x46, 0x22, 0xa3, 0x12, 0x6b, 0x26, 0xd2, 0x4a, 0x7f, 0xf9, 0xf5, 0x7d, 0xc8, 0x76, 0x66, 0xa4,
+	0x2f, 0x33, 0x6a, 0x04, 0x1e, 0x58, 0x81, 0x8c, 0xb9, 0x28, 0xa6, 0xf5, 0xd0, 0xb4, 0xca, 0xa7,
+	0xd3, 0xfc, 0xcc, 0xbf, 0x90, 0x38, 0xcb, 0xa8, 0x34, 0xd9, 0x96, 0x57, 0x26, 0xa8, 0x38, 0x4d,
+	0x85, 0x2e, 0x8d, 0x99, 0xee, 0xa3, 0x1f, 0x4d, 0xd0, 0xd9, 0x29, 0xc7, 0x1f, 0x95, 0xd3, 0xe1,
+	0x63, 0xd0, 0x75, 0x06, 0x52, 0xcc, 0xa9, 0xd7, 0x58, 0x6d, 0x6c, 0xb4, 0xfa, 0x1d, 0xfb, 0xe7,
+	0x3e, 0xe6, 0x14, 0x1e, 0x80, 0xa5, 0x11, 0x56, 0x3a, 0x32, 0xc6, 0x09, 0xd6, 0x34, 0xd2, 0x8c,
+	0x53, 0x6f, 0x7a, 0xb5, 0xb1, 0xd1, 0xde, 0x5c, 0x31, 0x87, 0x88, 0xac, 0x27, 0x74, 0xa4, 0x25,
+	0x4b, 0x93, 0x01, 0x1e, 0xe5, 0xb4, 0x0f, 0x0b, 0x6a, 0x35, 0xf3, 0x2d, 0xd6, 0xf4, 0x98, 0x71,
+	0x0a, 0x2f, 0x27, 0xa6, 0x16, 0xb1, 0xbd, 0x99, 0xd5, 0xc6, 0xc6, 0xdc, 0xe6, 0x31, 0xba, 0xeb,
+	0x62, 0xca, 0x83, 0x43, 0x93, 0xce, 0xfb, 0x86, 0x7f, 0x7c, 0x99, 0xd1, 0x77, 0x69, 0xce, 0xef,
+	0x6c, 0x8e, 0xb3, 0x14, 0x4f, 0xf0, 0x05, 0x68, 0xc6, 0x98, 0x67, 0x98, 0x25, 0xa9, 0xf7, 0x5f,
+	0x0d, 0xfb, 0x0e, 0x0d, 0x9f, 0x83, 0x26, 0x26, 0x51, 0x22, 0x45, 0x9e, 0x79, 0xb3, 0x35, 0x98,
+	0xff, 0x63, 0xb2, 0x5b, 0x80, 0xe1, 0x05, 0x98, 0x77, 0x69, 0xab, 0x4b, 0xf7, 0x9a, 0x65, 0xde,
+	0xfd, 0x7b, 0xe4, 0x3d, 0xb0, 0xef, 0xd8, 0x1f, 0x61, 0x5d, 0xa7, 0x3f, 0x67, 0xc7, 0x98, 0xcb,
+	0x7d, 0x05, 0xda, 0xd6, 0x71, 0x84, 0x89, 0xd7, 0xaa, 0x61, 0xba, 0x65, 0x4c, 0x87, 0x04, 0xee,
+	0x01, 0xe8, 0xd8, 0xb1, 0x64, 0x9a, 0x4a, 0x26, 0x52, 0x0f, 0xd4, 0x10, 0x59, 0x30, 0x22, 0x3b,
+	0x96, 0x05, 0x3f, 0x02, 0x68, 0xcf, 0x71, 0x42, 0xab, 0x5d, 0x43, 0x6b, 0xd1, 0xf2, 0xc6, 0x62,
+	0x4f, 0xc0, 0xcc, 0x19, 0xa5, 0xc4, 0xeb, 0xd4, 0xa0, 0x97, 0x48, 0xf8, 0x12, 0xb4, 0x8a, 0xdf,
+	0x88, 0x69, 0xca, 0xbd, 0x6e, 0x9d, 0x5b, 0x2f, 0xe0, 0x1f, 0x34, 0xe5, 0xf0, 0x0d, 0xe8, 0xba,
+	0x53, 0x28, 0xa7, 0xce, 0xd5, 0xa0, 0xb7, 0xcd, 0x01, 0xbc, 0x2f, 0x86, 0x87, 0xa0, 0xeb, 0xb2,
+	0x97, 0x0a, 0xf3, 0x35, 0x14, 0x3a, 0x96, 0x52, 0x4a, 0x1c, 0x80, 0x25, 0x67, 0xe2, 0x94, 0x91,
+	0x88, 0x0b, 0xc2, 0xce, 0x18, 0x95, 0xde, 0x42, 0x9d, 0x0f, 0xd0, 0x98, 0xd9, 0x66, 0xe4, 0x93,
+	0xe1, 0x05, 0x9f, 0x6f, 0xc2, 0x13, 0xb0, 0x3e, 0x7e, 0xe5, 0x4c, 0x95, 0x31, 0x85, 0x62, 0xc1,
+	0xfd, 0x5b, 0x2b, 0xe2, 0x69, 0x9c, 0x2b, 0x2d, 0x38, 0x95, 0xca, 0xbf, 0xb2, 0xe5, 0xb5, 0x59,
+	0x62, 0x15, 0xc4, 0xbf, 0xba, 0xb5, 0xd2, 0xae, 0xb7, 0x7f, 0x36, 0xc0, 0x7a, 0x2c, 0x38, 0xfa,
+	0xe7, 0x9e, 0xdd, 0x5e, 0x9c, 0x1c, 0x75, 0x58, 0xd8, 0x3f, 0x6c, 0x9c, 0xec, 0x19, 0x5e, 0x22,
+	0x46, 0x38, 0x4d, 0x90, 0x90, 0x89, 0x9f, 0xd0, 0xb4, 0x0c, 0xe7, 0x8f, 0x9d, 0xfe, 0x65, 0xeb,
+	0x6f, 0xb9, 0xea, 0xeb, 0xd4, 0xf4, 0x6e, 0x18, 0x7e, 0x9b, 0x5a, 0xdb, 0xad, 0x24, 0x43, 0xa2,
+	0x50, 0x55, 0x16, 0xd5, 0xa0, 0x87, 0xec, 0xaa, 0x50, 0xdf, 0x2d, 0x66, 0x18, 0x12, 0x35, 0x74,
+	0x98, 0xe1, 0xa0, 0x37, 0x74, 0x98, 0x9b, 0xa9, 0xf5, 0xaa, 0x11, 0x04, 0x21, 0x51, 0x41, 0xe0,
+	0x50, 0x41, 0x30, 0xe8, 0x05, 0x81, 0xc3, 0x9d, 0xce, 0x96, 0x66, 0x7b, 0xbf, 0x02, 0x00, 0x00,
+	0xff, 0xff, 0xda, 0x55, 0xdb, 0xd7, 0xa1, 0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/click_view.pb.go b/googleapis/ads/googleads/v3/resources/click_view.pb.go
new file mode 100644
index 0000000..56643eb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/click_view.pb.go
@@ -0,0 +1,164 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/click_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A click view with metrics aggregated at each click level, including both
+// valid and invalid clicks. For non-Search campaigns, metrics.clicks
+// represents the number of valid and invalid interactions.
+// Queries including ClickView must have a filter limiting the results to one
+// day and can be requested for dates back to 90 days before the time of the
+// request.
+type ClickView struct {
+	// The resource name of the click view.
+	// Click view resource names have the form:
+	//
+	// `customers/{customer_id}/clickViews/{date (yyyy-MM-dd)}~{gclid}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The Google Click ID.
+	Gclid *wrappers.StringValue `protobuf:"bytes,2,opt,name=gclid,proto3" json:"gclid,omitempty"`
+	// The location criteria matching the area of interest associated with the
+	// impression.
+	AreaOfInterest *common.ClickLocation `protobuf:"bytes,3,opt,name=area_of_interest,json=areaOfInterest,proto3" json:"area_of_interest,omitempty"`
+	// The location criteria matching the location of presence associated with the
+	// impression.
+	LocationOfPresence *common.ClickLocation `protobuf:"bytes,4,opt,name=location_of_presence,json=locationOfPresence,proto3" json:"location_of_presence,omitempty"`
+	// Page number in search results where the ad was shown.
+	PageNumber *wrappers.Int64Value `protobuf:"bytes,5,opt,name=page_number,json=pageNumber,proto3" json:"page_number,omitempty"`
+	// The associated ad.
+	AdGroupAd            *wrappers.StringValue `protobuf:"bytes,7,opt,name=ad_group_ad,json=adGroupAd,proto3" json:"ad_group_ad,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ClickView) Reset()         { *m = ClickView{} }
+func (m *ClickView) String() string { return proto.CompactTextString(m) }
+func (*ClickView) ProtoMessage()    {}
+func (*ClickView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7eb15a7d43c843e9, []int{0}
+}
+
+func (m *ClickView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ClickView.Unmarshal(m, b)
+}
+func (m *ClickView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ClickView.Marshal(b, m, deterministic)
+}
+func (m *ClickView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ClickView.Merge(m, src)
+}
+func (m *ClickView) XXX_Size() int {
+	return xxx_messageInfo_ClickView.Size(m)
+}
+func (m *ClickView) XXX_DiscardUnknown() {
+	xxx_messageInfo_ClickView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClickView proto.InternalMessageInfo
+
+func (m *ClickView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *ClickView) GetGclid() *wrappers.StringValue {
+	if m != nil {
+		return m.Gclid
+	}
+	return nil
+}
+
+func (m *ClickView) GetAreaOfInterest() *common.ClickLocation {
+	if m != nil {
+		return m.AreaOfInterest
+	}
+	return nil
+}
+
+func (m *ClickView) GetLocationOfPresence() *common.ClickLocation {
+	if m != nil {
+		return m.LocationOfPresence
+	}
+	return nil
+}
+
+func (m *ClickView) GetPageNumber() *wrappers.Int64Value {
+	if m != nil {
+		return m.PageNumber
+	}
+	return nil
+}
+
+func (m *ClickView) GetAdGroupAd() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroupAd
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ClickView)(nil), "google.ads.googleads.v3.resources.ClickView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/click_view.proto", fileDescriptor_7eb15a7d43c843e9)
+}
+
+var fileDescriptor_7eb15a7d43c843e9 = []byte{
+	// 494 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0x41, 0x6b, 0xd4, 0x40,
+	0x14, 0xc7, 0xc9, 0xae, 0x55, 0x76, 0xaa, 0x45, 0x82, 0x87, 0x58, 0x8b, 0xb4, 0x95, 0x42, 0x0f,
+	0x3a, 0x81, 0x8d, 0x78, 0x88, 0x5e, 0x52, 0x0f, 0x4b, 0x45, 0xda, 0x25, 0x62, 0x04, 0x59, 0x08,
+	0xb3, 0x99, 0xb7, 0x43, 0x30, 0x99, 0x09, 0x33, 0xc9, 0xee, 0x41, 0xfa, 0x65, 0x3c, 0xfa, 0x51,
+	0xfc, 0x28, 0xbd, 0x79, 0xf6, 0x22, 0x93, 0x99, 0xcc, 0x0a, 0x52, 0x15, 0x6f, 0x6f, 0xe7, 0xfd,
+	0xff, 0xbf, 0xf9, 0xbf, 0xb7, 0x13, 0x34, 0x65, 0x42, 0xb0, 0x0a, 0x42, 0x42, 0x55, 0x68, 0x4a,
+	0x5d, 0xad, 0xa3, 0x50, 0x82, 0x12, 0x9d, 0x2c, 0x40, 0x85, 0x45, 0x55, 0x16, 0x9f, 0xf2, 0x75,
+	0x09, 0x1b, 0xdc, 0x48, 0xd1, 0x0a, 0xff, 0xc8, 0x08, 0x31, 0xa1, 0x0a, 0x3b, 0x0f, 0x5e, 0x47,
+	0xd8, 0x79, 0xf6, 0xa3, 0x9b, 0xb0, 0x85, 0xa8, 0x6b, 0xc1, 0x2d, 0xb3, 0x12, 0x05, 0x69, 0x4b,
+	0xc1, 0x0d, 0x77, 0xff, 0xe1, 0x60, 0x6a, 0x4a, 0x77, 0xbd, 0x6d, 0x3d, 0xb6, 0xad, 0xfe, 0xd7,
+	0xb2, 0x5b, 0x85, 0x1b, 0x49, 0x9a, 0x06, 0xa4, 0xb2, 0xfd, 0x83, 0x5f, 0xac, 0x84, 0x73, 0xd1,
+	0xf6, 0x5c, 0xdb, 0x3d, 0xfe, 0x3e, 0x46, 0x93, 0xd7, 0xfa, 0xc6, 0xac, 0x84, 0x8d, 0xff, 0x04,
+	0xdd, 0x1b, 0xe8, 0x39, 0x27, 0x35, 0x04, 0xde, 0xa1, 0x77, 0x3a, 0x49, 0xef, 0x0e, 0x87, 0x17,
+	0xa4, 0x06, 0x7f, 0x8a, 0x76, 0x58, 0x51, 0x95, 0x34, 0x18, 0x1d, 0x7a, 0xa7, 0xbb, 0xd3, 0x03,
+	0x3b, 0x28, 0x1e, 0x02, 0xe0, 0x77, 0xad, 0x2c, 0x39, 0xcb, 0x48, 0xd5, 0x41, 0x6a, 0xa4, 0xfe,
+	0x07, 0x74, 0x9f, 0x48, 0x20, 0xb9, 0x58, 0xe5, 0x25, 0x6f, 0x41, 0x82, 0x6a, 0x83, 0x71, 0x6f,
+	0x7f, 0x86, 0x6f, 0x5a, 0x99, 0xd9, 0x07, 0xee, 0xd3, 0xbd, 0xb5, 0xeb, 0x48, 0xf7, 0x34, 0xe6,
+	0x72, 0x75, 0x6e, 0x21, 0x7e, 0x8e, 0x1e, 0x0c, 0xab, 0xd2, 0xf0, 0x46, 0x82, 0x02, 0x5e, 0x40,
+	0x70, 0xeb, 0x7f, 0xe0, 0xfe, 0x80, 0xba, 0x5c, 0xcd, 0x2d, 0xc8, 0x7f, 0x85, 0x76, 0x1b, 0xc2,
+	0x20, 0xe7, 0x5d, 0xbd, 0x04, 0x19, 0xec, 0xf4, 0xdc, 0x47, 0xbf, 0xcd, 0x7c, 0xce, 0xdb, 0x17,
+	0xcf, 0xcd, 0xc8, 0x48, 0xeb, 0x2f, 0x7a, 0xb9, 0x76, 0x13, 0x9a, 0x33, 0x29, 0xba, 0x26, 0x27,
+	0x34, 0xb8, 0xf3, 0x0f, 0x1b, 0x9b, 0x10, 0x3a, 0xd3, 0xfa, 0x84, 0xc6, 0xef, 0xaf, 0x93, 0x14,
+	0x1d, 0x6f, 0x73, 0xdb, 0xaa, 0x29, 0x95, 0xce, 0x1f, 0x6e, 0xff, 0xb7, 0xa7, 0x45, 0xa7, 0x5a,
+	0x51, 0x83, 0x54, 0xe1, 0xe7, 0xa1, 0xbc, 0x32, 0x2f, 0x49, 0xf7, 0xf5, 0xa9, 0x7b, 0xa9, 0x57,
+	0x67, 0x3f, 0x3c, 0x74, 0x52, 0x88, 0x1a, 0xff, 0xf5, 0xad, 0x9e, 0xed, 0xb9, 0x2b, 0xe6, 0x3a,
+	0xea, 0xdc, 0xfb, 0xf8, 0xc6, 0x9a, 0x98, 0xa8, 0x08, 0x67, 0x58, 0x48, 0x16, 0x32, 0xe0, 0xfd,
+	0x20, 0xe1, 0x36, 0xde, 0x1f, 0xbe, 0x99, 0x97, 0xae, 0xfa, 0x32, 0x1a, 0xcf, 0x92, 0xe4, 0xeb,
+	0xe8, 0x68, 0x66, 0x90, 0x09, 0x55, 0xd8, 0x94, 0xba, 0xca, 0x22, 0x9c, 0x0e, 0xca, 0x6f, 0x83,
+	0x66, 0x91, 0x50, 0xb5, 0x70, 0x9a, 0x45, 0x16, 0x2d, 0x9c, 0xe6, 0x7a, 0x74, 0x62, 0x1a, 0x71,
+	0x9c, 0x50, 0x15, 0xc7, 0x4e, 0x15, 0xc7, 0x59, 0x14, 0xc7, 0x4e, 0xb7, 0xbc, 0xdd, 0x87, 0x8d,
+	0x7e, 0x06, 0x00, 0x00, 0xff, 0xff, 0xd1, 0x56, 0xa3, 0xdc, 0xdf, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/conversion_action.pb.go b/googleapis/ads/googleads/v3/resources/conversion_action.pb.go
new file mode 100644
index 0000000..bface36
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/conversion_action.pb.go
@@ -0,0 +1,413 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/conversion_action.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A conversion action.
+type ConversionAction struct {
+	// The resource name of the conversion action.
+	// Conversion action resource names have the form:
+	//
+	// `customers/{customer_id}/conversionActions/{conversion_action_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the conversion action.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the conversion action.
+	//
+	// This field is required and should not be empty when creating new
+	// conversion actions.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The status of this conversion action for conversion event accrual.
+	Status enums.ConversionActionStatusEnum_ConversionActionStatus `protobuf:"varint,4,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.ConversionActionStatusEnum_ConversionActionStatus" json:"status,omitempty"`
+	// The type of this conversion action.
+	Type enums.ConversionActionTypeEnum_ConversionActionType `protobuf:"varint,5,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.ConversionActionTypeEnum_ConversionActionType" json:"type,omitempty"`
+	// The category of conversions reported for this conversion action.
+	Category enums.ConversionActionCategoryEnum_ConversionActionCategory `protobuf:"varint,6,opt,name=category,proto3,enum=google.ads.googleads.v3.enums.ConversionActionCategoryEnum_ConversionActionCategory" json:"category,omitempty"`
+	// The resource name of the conversion action owner customer, or null if this
+	// is a system-defined conversion action.
+	OwnerCustomer *wrappers.StringValue `protobuf:"bytes,7,opt,name=owner_customer,json=ownerCustomer,proto3" json:"owner_customer,omitempty"`
+	// Whether this conversion action should be included in the "conversions"
+	// metric.
+	IncludeInConversionsMetric *wrappers.BoolValue `protobuf:"bytes,8,opt,name=include_in_conversions_metric,json=includeInConversionsMetric,proto3" json:"include_in_conversions_metric,omitempty"`
+	// The maximum number of days that may elapse between an interaction
+	// (e.g., a click) and a conversion event.
+	ClickThroughLookbackWindowDays *wrappers.Int64Value `protobuf:"bytes,9,opt,name=click_through_lookback_window_days,json=clickThroughLookbackWindowDays,proto3" json:"click_through_lookback_window_days,omitempty"`
+	// The maximum number of days which may elapse between an impression and a
+	// conversion without an interaction.
+	ViewThroughLookbackWindowDays *wrappers.Int64Value `protobuf:"bytes,10,opt,name=view_through_lookback_window_days,json=viewThroughLookbackWindowDays,proto3" json:"view_through_lookback_window_days,omitempty"`
+	// Settings related to the value for conversion events associated with this
+	// conversion action.
+	ValueSettings *ConversionAction_ValueSettings `protobuf:"bytes,11,opt,name=value_settings,json=valueSettings,proto3" json:"value_settings,omitempty"`
+	// How to count conversion events for the conversion action.
+	CountingType enums.ConversionActionCountingTypeEnum_ConversionActionCountingType `protobuf:"varint,12,opt,name=counting_type,json=countingType,proto3,enum=google.ads.googleads.v3.enums.ConversionActionCountingTypeEnum_ConversionActionCountingType" json:"counting_type,omitempty"`
+	// Settings related to this conversion action's attribution model.
+	AttributionModelSettings *ConversionAction_AttributionModelSettings `protobuf:"bytes,13,opt,name=attribution_model_settings,json=attributionModelSettings,proto3" json:"attribution_model_settings,omitempty"`
+	// The snippets used for tracking conversions.
+	TagSnippets []*common.TagSnippet `protobuf:"bytes,14,rep,name=tag_snippets,json=tagSnippets,proto3" json:"tag_snippets,omitempty"`
+	// The phone call duration in seconds after which a conversion should be
+	// reported for this conversion action.
+	//
+	// The value must be between 0 and 10000, inclusive.
+	PhoneCallDurationSeconds *wrappers.Int64Value `protobuf:"bytes,15,opt,name=phone_call_duration_seconds,json=phoneCallDurationSeconds,proto3" json:"phone_call_duration_seconds,omitempty"`
+	// App ID for an app conversion action.
+	AppId                *wrappers.StringValue `protobuf:"bytes,16,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ConversionAction) Reset()         { *m = ConversionAction{} }
+func (m *ConversionAction) String() string { return proto.CompactTextString(m) }
+func (*ConversionAction) ProtoMessage()    {}
+func (*ConversionAction) Descriptor() ([]byte, []int) {
+	return fileDescriptor_be3d6bc96d205b0d, []int{0}
+}
+
+func (m *ConversionAction) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionAction.Unmarshal(m, b)
+}
+func (m *ConversionAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionAction.Marshal(b, m, deterministic)
+}
+func (m *ConversionAction) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionAction.Merge(m, src)
+}
+func (m *ConversionAction) XXX_Size() int {
+	return xxx_messageInfo_ConversionAction.Size(m)
+}
+func (m *ConversionAction) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionAction.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionAction proto.InternalMessageInfo
+
+func (m *ConversionAction) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *ConversionAction) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetStatus() enums.ConversionActionStatusEnum_ConversionActionStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.ConversionActionStatusEnum_UNSPECIFIED
+}
+
+func (m *ConversionAction) GetType() enums.ConversionActionTypeEnum_ConversionActionType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.ConversionActionTypeEnum_UNSPECIFIED
+}
+
+func (m *ConversionAction) GetCategory() enums.ConversionActionCategoryEnum_ConversionActionCategory {
+	if m != nil {
+		return m.Category
+	}
+	return enums.ConversionActionCategoryEnum_UNSPECIFIED
+}
+
+func (m *ConversionAction) GetOwnerCustomer() *wrappers.StringValue {
+	if m != nil {
+		return m.OwnerCustomer
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetIncludeInConversionsMetric() *wrappers.BoolValue {
+	if m != nil {
+		return m.IncludeInConversionsMetric
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetClickThroughLookbackWindowDays() *wrappers.Int64Value {
+	if m != nil {
+		return m.ClickThroughLookbackWindowDays
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetViewThroughLookbackWindowDays() *wrappers.Int64Value {
+	if m != nil {
+		return m.ViewThroughLookbackWindowDays
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetValueSettings() *ConversionAction_ValueSettings {
+	if m != nil {
+		return m.ValueSettings
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetCountingType() enums.ConversionActionCountingTypeEnum_ConversionActionCountingType {
+	if m != nil {
+		return m.CountingType
+	}
+	return enums.ConversionActionCountingTypeEnum_UNSPECIFIED
+}
+
+func (m *ConversionAction) GetAttributionModelSettings() *ConversionAction_AttributionModelSettings {
+	if m != nil {
+		return m.AttributionModelSettings
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetTagSnippets() []*common.TagSnippet {
+	if m != nil {
+		return m.TagSnippets
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetPhoneCallDurationSeconds() *wrappers.Int64Value {
+	if m != nil {
+		return m.PhoneCallDurationSeconds
+	}
+	return nil
+}
+
+func (m *ConversionAction) GetAppId() *wrappers.StringValue {
+	if m != nil {
+		return m.AppId
+	}
+	return nil
+}
+
+// Settings related to this conversion action's attribution model.
+type ConversionAction_AttributionModelSettings struct {
+	// The attribution model type of this conversion action.
+	AttributionModel enums.AttributionModelEnum_AttributionModel `protobuf:"varint,1,opt,name=attribution_model,json=attributionModel,proto3,enum=google.ads.googleads.v3.enums.AttributionModelEnum_AttributionModel" json:"attribution_model,omitempty"`
+	// The status of the data-driven attribution model for the conversion
+	// action.
+	DataDrivenModelStatus enums.DataDrivenModelStatusEnum_DataDrivenModelStatus `protobuf:"varint,2,opt,name=data_driven_model_status,json=dataDrivenModelStatus,proto3,enum=google.ads.googleads.v3.enums.DataDrivenModelStatusEnum_DataDrivenModelStatus" json:"data_driven_model_status,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{}                                              `json:"-"`
+	XXX_unrecognized      []byte                                                `json:"-"`
+	XXX_sizecache         int32                                                 `json:"-"`
+}
+
+func (m *ConversionAction_AttributionModelSettings) Reset() {
+	*m = ConversionAction_AttributionModelSettings{}
+}
+func (m *ConversionAction_AttributionModelSettings) String() string { return proto.CompactTextString(m) }
+func (*ConversionAction_AttributionModelSettings) ProtoMessage()    {}
+func (*ConversionAction_AttributionModelSettings) Descriptor() ([]byte, []int) {
+	return fileDescriptor_be3d6bc96d205b0d, []int{0, 0}
+}
+
+func (m *ConversionAction_AttributionModelSettings) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionAction_AttributionModelSettings.Unmarshal(m, b)
+}
+func (m *ConversionAction_AttributionModelSettings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionAction_AttributionModelSettings.Marshal(b, m, deterministic)
+}
+func (m *ConversionAction_AttributionModelSettings) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionAction_AttributionModelSettings.Merge(m, src)
+}
+func (m *ConversionAction_AttributionModelSettings) XXX_Size() int {
+	return xxx_messageInfo_ConversionAction_AttributionModelSettings.Size(m)
+}
+func (m *ConversionAction_AttributionModelSettings) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionAction_AttributionModelSettings.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionAction_AttributionModelSettings proto.InternalMessageInfo
+
+func (m *ConversionAction_AttributionModelSettings) GetAttributionModel() enums.AttributionModelEnum_AttributionModel {
+	if m != nil {
+		return m.AttributionModel
+	}
+	return enums.AttributionModelEnum_UNSPECIFIED
+}
+
+func (m *ConversionAction_AttributionModelSettings) GetDataDrivenModelStatus() enums.DataDrivenModelStatusEnum_DataDrivenModelStatus {
+	if m != nil {
+		return m.DataDrivenModelStatus
+	}
+	return enums.DataDrivenModelStatusEnum_UNSPECIFIED
+}
+
+// Settings related to the value for conversion events associated with this
+// conversion action.
+type ConversionAction_ValueSettings struct {
+	// The value to use when conversion events for this conversion action are
+	// sent with an invalid, disallowed or missing value, or when
+	// this conversion action is configured to always use the default value.
+	DefaultValue *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=default_value,json=defaultValue,proto3" json:"default_value,omitempty"`
+	// The currency code to use when conversion events for this conversion
+	// action are sent with an invalid or missing currency code, or when this
+	// conversion action is configured to always use the default value.
+	DefaultCurrencyCode *wrappers.StringValue `protobuf:"bytes,2,opt,name=default_currency_code,json=defaultCurrencyCode,proto3" json:"default_currency_code,omitempty"`
+	// Controls whether the default value and default currency code are used in
+	// place of the value and currency code specified in conversion events for
+	// this conversion action.
+	AlwaysUseDefaultValue *wrappers.BoolValue `protobuf:"bytes,3,opt,name=always_use_default_value,json=alwaysUseDefaultValue,proto3" json:"always_use_default_value,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{}            `json:"-"`
+	XXX_unrecognized      []byte              `json:"-"`
+	XXX_sizecache         int32               `json:"-"`
+}
+
+func (m *ConversionAction_ValueSettings) Reset()         { *m = ConversionAction_ValueSettings{} }
+func (m *ConversionAction_ValueSettings) String() string { return proto.CompactTextString(m) }
+func (*ConversionAction_ValueSettings) ProtoMessage()    {}
+func (*ConversionAction_ValueSettings) Descriptor() ([]byte, []int) {
+	return fileDescriptor_be3d6bc96d205b0d, []int{0, 1}
+}
+
+func (m *ConversionAction_ValueSettings) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionAction_ValueSettings.Unmarshal(m, b)
+}
+func (m *ConversionAction_ValueSettings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionAction_ValueSettings.Marshal(b, m, deterministic)
+}
+func (m *ConversionAction_ValueSettings) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionAction_ValueSettings.Merge(m, src)
+}
+func (m *ConversionAction_ValueSettings) XXX_Size() int {
+	return xxx_messageInfo_ConversionAction_ValueSettings.Size(m)
+}
+func (m *ConversionAction_ValueSettings) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionAction_ValueSettings.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionAction_ValueSettings proto.InternalMessageInfo
+
+func (m *ConversionAction_ValueSettings) GetDefaultValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.DefaultValue
+	}
+	return nil
+}
+
+func (m *ConversionAction_ValueSettings) GetDefaultCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.DefaultCurrencyCode
+	}
+	return nil
+}
+
+func (m *ConversionAction_ValueSettings) GetAlwaysUseDefaultValue() *wrappers.BoolValue {
+	if m != nil {
+		return m.AlwaysUseDefaultValue
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ConversionAction)(nil), "google.ads.googleads.v3.resources.ConversionAction")
+	proto.RegisterType((*ConversionAction_AttributionModelSettings)(nil), "google.ads.googleads.v3.resources.ConversionAction.AttributionModelSettings")
+	proto.RegisterType((*ConversionAction_ValueSettings)(nil), "google.ads.googleads.v3.resources.ConversionAction.ValueSettings")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/conversion_action.proto", fileDescriptor_be3d6bc96d205b0d)
+}
+
+var fileDescriptor_be3d6bc96d205b0d = []byte{
+	// 1013 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdf, 0x6e, 0xe3, 0xc4,
+	0x17, 0x56, 0xd2, 0x6e, 0x7f, 0xbb, 0xd3, 0x26, 0xbf, 0x32, 0xa8, 0x92, 0xc9, 0xfe, 0x51, 0xbb,
+	0x68, 0xa5, 0x02, 0x92, 0xbd, 0x4a, 0x00, 0x09, 0x83, 0x90, 0xdc, 0x04, 0xad, 0x8a, 0xda, 0x55,
+	0xe5, 0x94, 0x22, 0xad, 0x82, 0x86, 0x89, 0x67, 0xd6, 0x31, 0xb5, 0x67, 0x8c, 0x67, 0x9c, 0x28,
+	0x42, 0x7b, 0x01, 0x37, 0x48, 0xbc, 0x00, 0xf7, 0x48, 0xdc, 0xf0, 0x28, 0x3c, 0xca, 0xbe, 0x01,
+	0x77, 0xc8, 0xe3, 0xb1, 0x93, 0x26, 0x71, 0xd3, 0x70, 0x37, 0xe3, 0x73, 0xbe, 0xef, 0x3b, 0xe7,
+	0xcc, 0x99, 0x39, 0x06, 0x9f, 0xf9, 0x9c, 0xfb, 0x21, 0xb5, 0x30, 0x11, 0x56, 0xbe, 0xcc, 0x56,
+	0xe3, 0x8e, 0x95, 0x50, 0xc1, 0xd3, 0xc4, 0xa3, 0xc2, 0xf2, 0x38, 0x1b, 0xd3, 0x44, 0x04, 0x9c,
+	0x21, 0xec, 0xc9, 0x80, 0x33, 0x33, 0x4e, 0xb8, 0xe4, 0xf0, 0x28, 0xf7, 0x37, 0x31, 0x11, 0x66,
+	0x09, 0x35, 0xc7, 0x1d, 0xb3, 0x84, 0xb6, 0x9e, 0x57, 0xb1, 0x7b, 0x3c, 0x8a, 0x38, 0xb3, 0x24,
+	0xf6, 0x91, 0x60, 0x41, 0x1c, 0x53, 0x99, 0x93, 0xb6, 0x3e, 0xa9, 0x42, 0x50, 0x96, 0x46, 0xc2,
+	0xc2, 0x52, 0x26, 0xc1, 0x30, 0xcd, 0xa2, 0x40, 0x11, 0x27, 0x34, 0xd4, 0xb0, 0x2f, 0x6f, 0x87,
+	0x2d, 0xa5, 0x80, 0x3c, 0x2c, 0xa9, 0xcf, 0x93, 0xa9, 0xc6, 0x77, 0x37, 0xc6, 0xf3, 0x94, 0xc9,
+	0x80, 0xf9, 0x48, 0x4e, 0x63, 0xaa, 0x49, 0xbe, 0xd8, 0x94, 0x44, 0x48, 0x2c, 0x53, 0xa1, 0xd1,
+	0xf6, 0xa6, 0xe8, 0xbb, 0x2b, 0x13, 0x2c, 0x31, 0x22, 0x49, 0x30, 0xa6, 0xba, 0x6a, 0x37, 0x95,
+	0xdf, 0x2b, 0xd0, 0x71, 0x50, 0x1e, 0xbb, 0x36, 0x3d, 0xd1, 0x26, 0xb5, 0x1b, 0xa6, 0xaf, 0xad,
+	0x49, 0x82, 0xe3, 0x98, 0x26, 0x05, 0xf4, 0xd1, 0x1c, 0x14, 0x33, 0xc6, 0x25, 0xce, 0x42, 0xd3,
+	0xd6, 0xa7, 0x7f, 0xee, 0x83, 0xfd, 0x6e, 0x19, 0xb7, 0xa3, 0xc2, 0x86, 0xef, 0x83, 0x46, 0x21,
+	0x82, 0x18, 0x8e, 0xa8, 0x51, 0x3b, 0xac, 0x1d, 0x3f, 0x70, 0xf7, 0x8a, 0x8f, 0x2f, 0x71, 0x44,
+	0xe1, 0x47, 0xa0, 0x1e, 0x10, 0xa3, 0x7e, 0x58, 0x3b, 0xde, 0x6d, 0x3f, 0xd4, 0xdd, 0x65, 0x16,
+	0x41, 0x98, 0xa7, 0x4c, 0x7e, 0xfa, 0xf1, 0x15, 0x0e, 0x53, 0xea, 0xd6, 0x03, 0x02, 0x9f, 0x83,
+	0x6d, 0x45, 0xb4, 0xa5, 0xdc, 0x1f, 0x2d, 0xb9, 0xf7, 0x65, 0x12, 0x30, 0x3f, 0xf7, 0x57, 0x9e,
+	0x70, 0x04, 0x76, 0xf2, 0x0a, 0x18, 0xdb, 0x87, 0xb5, 0xe3, 0x66, 0xfb, 0xc2, 0xac, 0xea, 0x65,
+	0x55, 0x40, 0x73, 0x31, 0x89, 0xbe, 0x02, 0x7f, 0xc5, 0xd2, 0xa8, 0xc2, 0xe4, 0x6a, 0x7e, 0xf8,
+	0x3d, 0xd8, 0xce, 0xce, 0xc9, 0xb8, 0xa7, 0x74, 0xce, 0x36, 0xd4, 0xb9, 0x9c, 0xc6, 0x74, 0xa5,
+	0x4a, 0x66, 0x70, 0x15, 0x33, 0x8c, 0xc1, 0xfd, 0xa2, 0x99, 0x8d, 0x1d, 0xa5, 0x72, 0xb9, 0xa1,
+	0x4a, 0x57, 0xc3, 0x57, 0x2a, 0x15, 0x46, 0xb7, 0x54, 0x81, 0x5d, 0xd0, 0xe4, 0x13, 0x46, 0x13,
+	0xe4, 0xa5, 0x42, 0xf2, 0x88, 0x26, 0xc6, 0xff, 0xee, 0x50, 0xf9, 0x86, 0xc2, 0x74, 0x35, 0x04,
+	0x7e, 0x07, 0x1e, 0x07, 0xcc, 0x0b, 0x53, 0x42, 0x51, 0x90, 0x5d, 0xa7, 0x42, 0x55, 0xa0, 0x88,
+	0xca, 0x24, 0xf0, 0x8c, 0xfb, 0x8a, 0xb3, 0xb5, 0xc4, 0x79, 0xc2, 0x79, 0x98, 0x33, 0xb6, 0x34,
+	0xc1, 0x29, 0x9b, 0x05, 0x2d, 0xce, 0x15, 0x1a, 0xfa, 0xe0, 0xa9, 0x17, 0x06, 0xde, 0x35, 0x92,
+	0xa3, 0x84, 0xa7, 0xfe, 0x08, 0x85, 0x9c, 0x5f, 0x0f, 0xb1, 0x77, 0x8d, 0x26, 0x01, 0x23, 0x7c,
+	0x82, 0x08, 0x9e, 0x0a, 0xe3, 0xc1, 0xfa, 0x06, 0x7b, 0xa2, 0x68, 0x2e, 0x73, 0x96, 0x33, 0x4d,
+	0xf2, 0xad, 0xe2, 0xe8, 0xe1, 0xa9, 0x80, 0x14, 0x1c, 0x8d, 0x03, 0x3a, 0xb9, 0x5d, 0x07, 0xac,
+	0xd7, 0x79, 0x9c, 0xb1, 0x54, 0xcb, 0x8c, 0x40, 0x73, 0x9c, 0xf9, 0x21, 0x41, 0x65, 0xf6, 0xee,
+	0x08, 0x63, 0x57, 0x71, 0x3a, 0xe6, 0xda, 0x57, 0x78, 0xe9, 0x48, 0x4d, 0xa5, 0xd8, 0xd7, 0x44,
+	0x6e, 0x63, 0x3c, 0xbf, 0x85, 0x3f, 0xd7, 0x40, 0xe3, 0xc6, 0xeb, 0x66, 0xec, 0xa9, 0xae, 0x1a,
+	0x6c, 0xda, 0x55, 0x9a, 0xa3, 0xb2, 0x87, 0xe7, 0x1d, 0xdc, 0x3d, 0x6f, 0x6e, 0x07, 0x7f, 0xab,
+	0x81, 0xd6, 0xd2, 0x53, 0x3f, 0x4b, 0xbd, 0xa1, 0x52, 0x3f, 0xfb, 0x2f, 0xa9, 0x3b, 0x33, 0xd6,
+	0xf3, 0x8c, 0xb4, 0xac, 0x82, 0x81, 0x2b, 0x2c, 0xf0, 0x1c, 0xec, 0xcd, 0xcd, 0x29, 0x61, 0x34,
+	0x0f, 0xb7, 0x8e, 0x77, 0xdb, 0x1f, 0x56, 0xaa, 0xe7, 0xb3, 0xcd, 0xbc, 0xc4, 0x7e, 0x3f, 0x87,
+	0xb8, 0xbb, 0xb2, 0x5c, 0x0b, 0xf8, 0x0a, 0x3c, 0x8c, 0x47, 0x9c, 0x51, 0xe4, 0xe1, 0x30, 0x44,
+	0x24, 0x4d, 0x70, 0x3e, 0x0b, 0xa8, 0xc7, 0x19, 0x11, 0xc6, 0xff, 0xd7, 0xb7, 0x8a, 0xa1, 0xf0,
+	0x5d, 0x1c, 0x86, 0x3d, 0x8d, 0xee, 0xe7, 0x60, 0xd8, 0x01, 0x3b, 0x38, 0x8e, 0x51, 0x40, 0x8c,
+	0xfd, 0x3b, 0xdc, 0xc8, 0x7b, 0x38, 0x8e, 0x4f, 0x49, 0xeb, 0xf7, 0x3a, 0x30, 0xaa, 0xca, 0x02,
+	0x7f, 0x04, 0xef, 0x2c, 0x1d, 0x84, 0x7a, 0xb1, 0x9b, 0xed, 0xde, 0x9a, 0x86, 0x58, 0xe4, 0x54,
+	0x4d, 0xb0, 0xf8, 0xd1, 0xdd, 0x5f, 0xac, 0x3b, 0xfc, 0xb5, 0x06, 0x8c, 0xaa, 0x89, 0xa5, 0x46,
+	0x42, 0xb3, 0xfd, 0x72, 0x8d, 0x74, 0x0f, 0x4b, 0xdc, 0x53, 0xe8, 0x3c, 0x9b, 0xd9, 0x73, 0xbd,
+	0xd2, 0xe2, 0x1e, 0x90, 0x55, 0x9f, 0x5b, 0xff, 0xd4, 0x40, 0xe3, 0xc6, 0x5d, 0x81, 0x0e, 0x68,
+	0x10, 0xfa, 0x1a, 0xa7, 0xa1, 0x44, 0xea, 0xd6, 0xa8, 0x52, 0xac, 0xaa, 0x73, 0x8f, 0xa7, 0xc3,
+	0x90, 0xe6, 0x75, 0xde, 0xd3, 0x10, 0xb5, 0x83, 0x17, 0xe0, 0xa0, 0xa0, 0xf0, 0xd2, 0x24, 0xa1,
+	0xcc, 0x9b, 0x22, 0x8f, 0x13, 0xaa, 0xa7, 0xdd, 0xed, 0x47, 0xf6, 0xae, 0x86, 0x76, 0x35, 0xb2,
+	0xcb, 0x09, 0x85, 0x7d, 0x60, 0xe0, 0x70, 0x82, 0xa7, 0x02, 0xa5, 0x82, 0xa2, 0x9b, 0xf1, 0x6d,
+	0xad, 0x7d, 0x45, 0x0f, 0x72, 0xec, 0x37, 0x82, 0xf6, 0xe6, 0xc2, 0xb4, 0x7f, 0x78, 0xeb, 0xf8,
+	0xe0, 0x83, 0x59, 0x6d, 0xf5, 0x2a, 0x0e, 0x44, 0xd6, 0xe0, 0xd6, 0xd2, 0x58, 0xb7, 0x8b, 0x61,
+	0x20, 0xac, 0x9f, 0x8a, 0xe5, 0x9b, 0xb9, 0xbf, 0x96, 0xdc, 0x2d, 0x33, 0x2e, 0xfe, 0xc8, 0xbc,
+	0x39, 0xf9, 0xa5, 0x0e, 0x9e, 0x79, 0x3c, 0x5a, 0x7f, 0x9f, 0x4f, 0x0e, 0x16, 0x75, 0x2f, 0xb2,
+	0x84, 0x2e, 0x6a, 0xaf, 0xbe, 0xd6, 0x58, 0x9f, 0x87, 0x98, 0xf9, 0x26, 0x4f, 0x7c, 0xcb, 0xa7,
+	0x4c, 0xa5, 0x6b, 0xcd, 0x42, 0xbf, 0xe5, 0x37, 0xf7, 0xf3, 0x72, 0xf5, 0x47, 0x7d, 0xeb, 0x85,
+	0xe3, 0xfc, 0x55, 0x3f, 0x7a, 0x91, 0x53, 0x3a, 0x44, 0x98, 0xf9, 0x32, 0x5b, 0x5d, 0x75, 0x4c,
+	0xb7, 0xf0, 0xfc, 0xbb, 0xf0, 0x19, 0x38, 0x44, 0x0c, 0x4a, 0x9f, 0xc1, 0x55, 0x67, 0x50, 0xfa,
+	0xbc, 0xad, 0x3f, 0xcb, 0x0d, 0xb6, 0xed, 0x10, 0x61, 0xdb, 0xa5, 0x97, 0x6d, 0x5f, 0x75, 0x6c,
+	0xbb, 0xf4, 0x1b, 0xee, 0xa8, 0x60, 0x3b, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xc6, 0xcf, 0x6d,
+	0x1f, 0x92, 0x0b, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/currency_constant.pb.go b/googleapis/ads/googleads/v3/resources/currency_constant.pb.go
new file mode 100644
index 0000000..7b054ac
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/currency_constant.pb.go
@@ -0,0 +1,144 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/currency_constant.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A currency constant.
+type CurrencyConstant struct {
+	// The resource name of the currency constant.
+	// Currency constant resource names have the form:
+	//
+	// `currencyConstants/{currency_code}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// ISO 4217 three-letter currency code, e.g. "USD"
+	Code *wrappers.StringValue `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"`
+	// Full English name of the currency.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// Standard symbol for describing this currency, e.g. '$' for US Dollars.
+	Symbol *wrappers.StringValue `protobuf:"bytes,4,opt,name=symbol,proto3" json:"symbol,omitempty"`
+	// The billable unit for this currency. Billed amounts should be multiples of
+	// this value.
+	BillableUnitMicros   *wrappers.Int64Value `protobuf:"bytes,5,opt,name=billable_unit_micros,json=billableUnitMicros,proto3" json:"billable_unit_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *CurrencyConstant) Reset()         { *m = CurrencyConstant{} }
+func (m *CurrencyConstant) String() string { return proto.CompactTextString(m) }
+func (*CurrencyConstant) ProtoMessage()    {}
+func (*CurrencyConstant) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6f14d3d22f3007ad, []int{0}
+}
+
+func (m *CurrencyConstant) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CurrencyConstant.Unmarshal(m, b)
+}
+func (m *CurrencyConstant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CurrencyConstant.Marshal(b, m, deterministic)
+}
+func (m *CurrencyConstant) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CurrencyConstant.Merge(m, src)
+}
+func (m *CurrencyConstant) XXX_Size() int {
+	return xxx_messageInfo_CurrencyConstant.Size(m)
+}
+func (m *CurrencyConstant) XXX_DiscardUnknown() {
+	xxx_messageInfo_CurrencyConstant.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CurrencyConstant proto.InternalMessageInfo
+
+func (m *CurrencyConstant) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CurrencyConstant) GetCode() *wrappers.StringValue {
+	if m != nil {
+		return m.Code
+	}
+	return nil
+}
+
+func (m *CurrencyConstant) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *CurrencyConstant) GetSymbol() *wrappers.StringValue {
+	if m != nil {
+		return m.Symbol
+	}
+	return nil
+}
+
+func (m *CurrencyConstant) GetBillableUnitMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.BillableUnitMicros
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CurrencyConstant)(nil), "google.ads.googleads.v3.resources.CurrencyConstant")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/currency_constant.proto", fileDescriptor_6f14d3d22f3007ad)
+}
+
+var fileDescriptor_6f14d3d22f3007ad = []byte{
+	// 420 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x8a, 0xd4, 0x30,
+	0x1c, 0xc6, 0x69, 0x77, 0x5d, 0x30, 0x2a, 0x48, 0x51, 0xa8, 0xeb, 0x22, 0xbb, 0xca, 0xc0, 0x7a,
+	0x49, 0xc4, 0x2e, 0x82, 0xf1, 0xd4, 0xdd, 0xc3, 0xa2, 0xb0, 0x32, 0x54, 0xa6, 0x07, 0x29, 0x94,
+	0x34, 0x8d, 0x25, 0xd0, 0x26, 0x25, 0x49, 0x47, 0x06, 0xf1, 0xe2, 0xa3, 0x78, 0xf4, 0x51, 0x7c,
+	0x94, 0x79, 0x01, 0xaf, 0xd2, 0x36, 0xcd, 0xc8, 0x0c, 0xb8, 0x73, 0xfb, 0x9a, 0xff, 0xf7, 0xfb,
+	0xf2, 0xb5, 0xff, 0x82, 0xb7, 0x95, 0x94, 0x55, 0xcd, 0x10, 0x29, 0x35, 0x1a, 0x65, 0xaf, 0x96,
+	0x11, 0x52, 0x4c, 0xcb, 0x4e, 0x51, 0xa6, 0x11, 0xed, 0x94, 0x62, 0x82, 0xae, 0x72, 0x2a, 0x85,
+	0x36, 0x44, 0x18, 0xd8, 0x2a, 0x69, 0x64, 0x70, 0x36, 0xfa, 0x21, 0x29, 0x35, 0x74, 0x28, 0x5c,
+	0x46, 0xd0, 0xa1, 0xc7, 0x4f, 0xa6, 0xf4, 0x96, 0xbb, 0xc0, 0x91, 0x3e, 0x7e, 0x66, 0x47, 0xc3,
+	0x53, 0xd1, 0x7d, 0x41, 0x5f, 0x15, 0x69, 0x5b, 0xa6, 0xb4, 0x9d, 0x9f, 0xfc, 0x83, 0x12, 0x21,
+	0xa4, 0x21, 0x86, 0x4b, 0x61, 0xa7, 0xcf, 0xff, 0xf8, 0xe0, 0xe1, 0x95, 0xed, 0x75, 0x65, 0x6b,
+	0x05, 0x2f, 0xc0, 0x83, 0xe9, 0x92, 0x5c, 0x90, 0x86, 0x85, 0xde, 0xa9, 0x77, 0x7e, 0x37, 0xb9,
+	0x3f, 0x1d, 0x7e, 0x24, 0x0d, 0x0b, 0x5e, 0x81, 0x43, 0x2a, 0x4b, 0x16, 0xfa, 0xa7, 0xde, 0xf9,
+	0xbd, 0xd7, 0x27, 0xb6, 0x39, 0x9c, 0x6a, 0xc0, 0x4f, 0x46, 0x71, 0x51, 0xa5, 0xa4, 0xee, 0x58,
+	0x32, 0x38, 0x7b, 0x62, 0x48, 0x3b, 0xd8, 0x87, 0xe8, 0x9d, 0xc1, 0x05, 0x38, 0xd2, 0xab, 0xa6,
+	0x90, 0x75, 0x78, 0xb8, 0x07, 0x63, 0xbd, 0xc1, 0x0d, 0x78, 0x54, 0xf0, 0xba, 0x26, 0x45, 0xcd,
+	0xf2, 0x4e, 0x70, 0x93, 0x37, 0x9c, 0x2a, 0xa9, 0xc3, 0x3b, 0x43, 0xc6, 0xd3, 0x9d, 0x8c, 0xf7,
+	0xc2, 0xbc, 0xb9, 0x18, 0x23, 0x82, 0x09, 0x5c, 0x08, 0x6e, 0x6e, 0x06, 0x0c, 0x2f, 0xd6, 0x71,
+	0x02, 0x5e, 0x6e, 0x16, 0x63, 0x55, 0xcb, 0x35, 0xa4, 0xb2, 0x41, 0x3b, 0x5f, 0x6f, 0x46, 0xb7,
+	0x4e, 0x34, 0xfa, 0xb6, 0xb3, 0xfa, 0xef, 0x97, 0x3f, 0x7c, 0x30, 0xa3, 0xb2, 0x81, 0xb7, 0x2e,
+	0xff, 0xf2, 0xf1, 0xf6, 0x15, 0xf3, 0xbe, 0xf9, 0xdc, 0xfb, 0xfc, 0xc1, 0xb2, 0x95, 0xac, 0x89,
+	0xa8, 0xa0, 0x54, 0x15, 0xaa, 0x98, 0x18, 0xde, 0x0b, 0x6d, 0x5a, 0xfe, 0xe7, 0x97, 0x7c, 0xe7,
+	0xd4, 0x4f, 0xff, 0xe0, 0x3a, 0x8e, 0x7f, 0xf9, 0x67, 0xd7, 0x63, 0x64, 0x5c, 0x6a, 0x38, 0xca,
+	0x5e, 0xa5, 0x11, 0x4c, 0x26, 0xe7, 0xef, 0xc9, 0x93, 0xc5, 0xa5, 0xce, 0x9c, 0x27, 0x4b, 0xa3,
+	0xcc, 0x79, 0xd6, 0xfe, 0x6c, 0x1c, 0x60, 0x1c, 0x97, 0x1a, 0x63, 0xe7, 0xc2, 0x38, 0x8d, 0x30,
+	0x76, 0xbe, 0xe2, 0x68, 0x28, 0x1b, 0xfd, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xcd, 0xaa, 0xb5,
+	0x3e, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/custom_interest.pb.go b/googleapis/ads/googleads/v3/resources/custom_interest.pb.go
new file mode 100644
index 0000000..9fed781
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/custom_interest.pb.go
@@ -0,0 +1,230 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/custom_interest.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A custom interest. This is a list of users by interest.
+type CustomInterest struct {
+	// The resource name of the custom interest.
+	// Custom interest resource names have the form:
+	//
+	// `customers/{customer_id}/customInterests/{custom_interest_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Id of the custom interest.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// Status of this custom interest. Indicates whether the custom interest is
+	// enabled or removed.
+	Status enums.CustomInterestStatusEnum_CustomInterestStatus `protobuf:"varint,3,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.CustomInterestStatusEnum_CustomInterestStatus" json:"status,omitempty"`
+	// Name of the custom interest. It should be unique across the same custom
+	// affinity audience.
+	// This field is required for create operations.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// Type of the custom interest, CUSTOM_AFFINITY or CUSTOM_INTENT.
+	// By default the type is set to CUSTOM_AFFINITY.
+	Type enums.CustomInterestTypeEnum_CustomInterestType `protobuf:"varint,5,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.CustomInterestTypeEnum_CustomInterestType" json:"type,omitempty"`
+	// Description of this custom interest audience.
+	Description *wrappers.StringValue `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"`
+	// List of custom interest members that this custom interest is composed of.
+	// Members can be added during CustomInterest creation. If members are
+	// presented in UPDATE operation, existing members will be overridden.
+	Members              []*CustomInterestMember `protobuf:"bytes,7,rep,name=members,proto3" json:"members,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *CustomInterest) Reset()         { *m = CustomInterest{} }
+func (m *CustomInterest) String() string { return proto.CompactTextString(m) }
+func (*CustomInterest) ProtoMessage()    {}
+func (*CustomInterest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_440649afc3ab8fa9, []int{0}
+}
+
+func (m *CustomInterest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomInterest.Unmarshal(m, b)
+}
+func (m *CustomInterest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomInterest.Marshal(b, m, deterministic)
+}
+func (m *CustomInterest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomInterest.Merge(m, src)
+}
+func (m *CustomInterest) XXX_Size() int {
+	return xxx_messageInfo_CustomInterest.Size(m)
+}
+func (m *CustomInterest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomInterest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomInterest proto.InternalMessageInfo
+
+func (m *CustomInterest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CustomInterest) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *CustomInterest) GetStatus() enums.CustomInterestStatusEnum_CustomInterestStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.CustomInterestStatusEnum_UNSPECIFIED
+}
+
+func (m *CustomInterest) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *CustomInterest) GetType() enums.CustomInterestTypeEnum_CustomInterestType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.CustomInterestTypeEnum_UNSPECIFIED
+}
+
+func (m *CustomInterest) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *CustomInterest) GetMembers() []*CustomInterestMember {
+	if m != nil {
+		return m.Members
+	}
+	return nil
+}
+
+// A member of custom interest audience. A member can be a keyword or url.
+// It is immutable, that is, it can only be created or removed but not changed.
+type CustomInterestMember struct {
+	// The type of custom interest member, KEYWORD or URL.
+	MemberType enums.CustomInterestMemberTypeEnum_CustomInterestMemberType `protobuf:"varint,1,opt,name=member_type,json=memberType,proto3,enum=google.ads.googleads.v3.enums.CustomInterestMemberTypeEnum_CustomInterestMemberType" json:"member_type,omitempty"`
+	// Keyword text when member_type is KEYWORD or URL string when
+	// member_type is URL.
+	Parameter            *wrappers.StringValue `protobuf:"bytes,2,opt,name=parameter,proto3" json:"parameter,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CustomInterestMember) Reset()         { *m = CustomInterestMember{} }
+func (m *CustomInterestMember) String() string { return proto.CompactTextString(m) }
+func (*CustomInterestMember) ProtoMessage()    {}
+func (*CustomInterestMember) Descriptor() ([]byte, []int) {
+	return fileDescriptor_440649afc3ab8fa9, []int{1}
+}
+
+func (m *CustomInterestMember) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomInterestMember.Unmarshal(m, b)
+}
+func (m *CustomInterestMember) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomInterestMember.Marshal(b, m, deterministic)
+}
+func (m *CustomInterestMember) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomInterestMember.Merge(m, src)
+}
+func (m *CustomInterestMember) XXX_Size() int {
+	return xxx_messageInfo_CustomInterestMember.Size(m)
+}
+func (m *CustomInterestMember) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomInterestMember.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomInterestMember proto.InternalMessageInfo
+
+func (m *CustomInterestMember) GetMemberType() enums.CustomInterestMemberTypeEnum_CustomInterestMemberType {
+	if m != nil {
+		return m.MemberType
+	}
+	return enums.CustomInterestMemberTypeEnum_UNSPECIFIED
+}
+
+func (m *CustomInterestMember) GetParameter() *wrappers.StringValue {
+	if m != nil {
+		return m.Parameter
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CustomInterest)(nil), "google.ads.googleads.v3.resources.CustomInterest")
+	proto.RegisterType((*CustomInterestMember)(nil), "google.ads.googleads.v3.resources.CustomInterestMember")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/custom_interest.proto", fileDescriptor_440649afc3ab8fa9)
+}
+
+var fileDescriptor_440649afc3ab8fa9 = []byte{
+	// 563 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xd1, 0x6a, 0x13, 0x4d,
+	0x18, 0x65, 0x37, 0xf9, 0x53, 0x3a, 0xf9, 0xcd, 0xc5, 0xea, 0xc5, 0x5a, 0x8b, 0xa4, 0x95, 0x62,
+	0x40, 0x98, 0x95, 0xac, 0xb4, 0xb2, 0x82, 0xb2, 0x15, 0xa9, 0x15, 0x95, 0xba, 0x2d, 0xb9, 0x90,
+	0x40, 0x98, 0x64, 0xc7, 0x65, 0x21, 0x33, 0xb3, 0xcc, 0xcc, 0x56, 0x8a, 0x14, 0x7c, 0x16, 0x2f,
+	0x7d, 0x13, 0xbd, 0xf3, 0x35, 0xfa, 0x14, 0xb2, 0x33, 0xb3, 0x93, 0xb4, 0x4d, 0x5a, 0x73, 0xf7,
+	0x65, 0xbf, 0x73, 0xce, 0x77, 0x38, 0x7b, 0xb2, 0x60, 0x2f, 0x63, 0x2c, 0x9b, 0xe2, 0x00, 0xa5,
+	0x22, 0xd0, 0x63, 0x35, 0x9d, 0x86, 0x01, 0xc7, 0x82, 0x95, 0x7c, 0x82, 0x45, 0x30, 0x29, 0x85,
+	0x64, 0x64, 0x94, 0x53, 0x89, 0x39, 0x16, 0x12, 0x16, 0x9c, 0x49, 0xe6, 0x6d, 0x69, 0x34, 0x44,
+	0xa9, 0x80, 0x96, 0x08, 0x4f, 0x43, 0x68, 0x89, 0x1b, 0xaf, 0x96, 0x69, 0x63, 0x5a, 0x92, 0x6b,
+	0xba, 0x23, 0x82, 0xc9, 0x18, 0xf3, 0x91, 0x3c, 0x2b, 0xb0, 0xbe, 0xb1, 0x11, 0xad, 0x26, 0x20,
+	0x24, 0x92, 0xa5, 0x30, 0xdc, 0xe7, 0xab, 0x71, 0xe7, 0xae, 0xde, 0xaf, 0x99, 0x45, 0x6e, 0x53,
+	0x30, 0xab, 0x87, 0x66, 0xa5, 0x7e, 0x8d, 0xcb, 0x2f, 0xc1, 0x57, 0x8e, 0x8a, 0x02, 0xf3, 0xfa,
+	0xe8, 0xe6, 0x1c, 0x15, 0x51, 0xca, 0x24, 0x92, 0x39, 0xa3, 0x66, 0xbb, 0xfd, 0xa7, 0x09, 0x3a,
+	0xaf, 0xd5, 0xdd, 0x43, 0x73, 0xd6, 0x7b, 0x04, 0xee, 0xd4, 0x27, 0x46, 0x14, 0x11, 0xec, 0x3b,
+	0x5d, 0xa7, 0xb7, 0x9e, 0xfc, 0x5f, 0x3f, 0xfc, 0x88, 0x08, 0xf6, 0x9e, 0x00, 0x37, 0x4f, 0x7d,
+	0xb7, 0xeb, 0xf4, 0xda, 0xfd, 0x07, 0x26, 0x6c, 0x58, 0x5b, 0x80, 0x87, 0x54, 0xee, 0x3e, 0x1b,
+	0xa0, 0x69, 0x89, 0x13, 0x37, 0x4f, 0xbd, 0x14, 0xb4, 0x74, 0x0e, 0x7e, 0xa3, 0xeb, 0xf4, 0x3a,
+	0xfd, 0xf7, 0x70, 0xd9, 0x8b, 0x52, 0x41, 0xc0, 0xcb, 0x86, 0x8e, 0x15, 0xf5, 0x0d, 0x2d, 0xc9,
+	0xc2, 0x45, 0x62, 0xb4, 0xbd, 0xa7, 0xa0, 0xa9, 0xec, 0x36, 0x95, 0xa9, 0xcd, 0x6b, 0xa6, 0x8e,
+	0x25, 0xcf, 0x69, 0xa6, 0x5d, 0x29, 0xa4, 0x37, 0x04, 0xcd, 0x2a, 0x63, 0xff, 0x3f, 0xe5, 0xea,
+	0xed, 0x4a, 0xae, 0x4e, 0xce, 0x0a, 0xbc, 0xc0, 0x53, 0xf5, 0x38, 0x51, 0xaa, 0xde, 0x4b, 0xd0,
+	0x4e, 0xb1, 0x98, 0xf0, 0xbc, 0xa8, 0x02, 0xf7, 0x5b, 0xff, 0x60, 0x6b, 0x9e, 0xe0, 0x7d, 0x02,
+	0x6b, 0xba, 0x7e, 0xc2, 0x5f, 0xeb, 0x36, 0x7a, 0xed, 0xfe, 0x1e, 0xbc, 0xb5, 0xdf, 0x57, 0xdc,
+	0x7c, 0x50, 0xfc, 0xa4, 0xd6, 0x89, 0xd2, 0x8b, 0x18, 0x81, 0xc7, 0x33, 0xaa, 0x99, 0x8a, 0x5c,
+	0xc0, 0x09, 0x23, 0xc1, 0x95, 0x22, 0xec, 0xea, 0x42, 0x62, 0x2e, 0x82, 0x6f, 0xf5, 0x78, 0x6e,
+	0x5a, 0x5a, 0x83, 0xec, 0xca, 0xd6, 0xf6, 0x7c, 0xfb, 0x97, 0x03, 0xee, 0x2d, 0xf2, 0xe1, 0x95,
+	0xa0, 0x3d, 0xf7, 0x87, 0x52, 0xbd, 0xea, 0xf4, 0x4f, 0x56, 0x8a, 0x5d, 0x2b, 0x2d, 0x09, 0x7f,
+	0xb6, 0x4c, 0x00, 0xb1, 0xb3, 0x17, 0x81, 0xf5, 0x02, 0x71, 0x44, 0xb0, 0xc4, 0xdc, 0x54, 0xf6,
+	0xe6, 0xd7, 0x30, 0x83, 0xef, 0x7f, 0x77, 0xc1, 0xce, 0x84, 0x91, 0xdb, 0x93, 0xdf, 0xbf, 0x7b,
+	0xd9, 0xcb, 0x51, 0x25, 0x7c, 0xe4, 0x7c, 0x7e, 0x67, 0x98, 0x19, 0x9b, 0x22, 0x9a, 0x41, 0xc6,
+	0xb3, 0x20, 0xc3, 0x54, 0x9d, 0x0d, 0x66, 0xf1, 0xdf, 0xf0, 0xad, 0x7b, 0x61, 0xa7, 0x1f, 0x6e,
+	0xe3, 0x20, 0x8e, 0x7f, 0xba, 0x5b, 0x07, 0x5a, 0x32, 0x4e, 0x05, 0xd4, 0x63, 0x35, 0x0d, 0x42,
+	0x98, 0xd4, 0xc8, 0xdf, 0x35, 0x66, 0x18, 0xa7, 0x62, 0x68, 0x31, 0xc3, 0x41, 0x38, 0xb4, 0x98,
+	0x0b, 0x77, 0x47, 0x2f, 0xa2, 0x28, 0x4e, 0x45, 0x14, 0x59, 0x54, 0x14, 0x0d, 0xc2, 0x28, 0xb2,
+	0xb8, 0x71, 0x4b, 0x99, 0x0d, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xef, 0xee, 0x77, 0x97,
+	0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/customer.pb.go b/googleapis/ads/googleads/v3/resources/customer.pb.go
new file mode 100644
index 0000000..ffbae07
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/customer.pb.go
@@ -0,0 +1,431 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/customer.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A customer.
+type Customer struct {
+	// The resource name of the customer.
+	// Customer resource names have the form:
+	//
+	// `customers/{customer_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the customer.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// Optional, non-unique descriptive name of the customer.
+	DescriptiveName *wrappers.StringValue `protobuf:"bytes,4,opt,name=descriptive_name,json=descriptiveName,proto3" json:"descriptive_name,omitempty"`
+	// The currency in which the account operates.
+	// A subset of the currency codes from the ISO 4217 standard is
+	// supported.
+	CurrencyCode *wrappers.StringValue `protobuf:"bytes,5,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	// The local timezone ID of the customer.
+	TimeZone *wrappers.StringValue `protobuf:"bytes,6,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"`
+	// The URL template for constructing a tracking URL out of parameters.
+	TrackingUrlTemplate *wrappers.StringValue `protobuf:"bytes,7,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
+	// The URL template for appending params to the final URL
+	FinalUrlSuffix *wrappers.StringValue `protobuf:"bytes,11,opt,name=final_url_suffix,json=finalUrlSuffix,proto3" json:"final_url_suffix,omitempty"`
+	// Whether auto-tagging is enabled for the customer.
+	AutoTaggingEnabled *wrappers.BoolValue `protobuf:"bytes,8,opt,name=auto_tagging_enabled,json=autoTaggingEnabled,proto3" json:"auto_tagging_enabled,omitempty"`
+	// Whether the Customer has a Partners program badge. If the Customer is not
+	// associated with the Partners program, this will be false. For more
+	// information, see https://support.google.com/partners/answer/3125774.
+	HasPartnersBadge *wrappers.BoolValue `protobuf:"bytes,9,opt,name=has_partners_badge,json=hasPartnersBadge,proto3" json:"has_partners_badge,omitempty"`
+	// Whether the customer is a manager.
+	Manager *wrappers.BoolValue `protobuf:"bytes,12,opt,name=manager,proto3" json:"manager,omitempty"`
+	// Whether the customer is a test account.
+	TestAccount *wrappers.BoolValue `protobuf:"bytes,13,opt,name=test_account,json=testAccount,proto3" json:"test_account,omitempty"`
+	// Call reporting setting for a customer.
+	CallReportingSetting *CallReportingSetting `protobuf:"bytes,10,opt,name=call_reporting_setting,json=callReportingSetting,proto3" json:"call_reporting_setting,omitempty"`
+	// Conversion tracking setting for a customer.
+	ConversionTrackingSetting *ConversionTrackingSetting `protobuf:"bytes,14,opt,name=conversion_tracking_setting,json=conversionTrackingSetting,proto3" json:"conversion_tracking_setting,omitempty"`
+	// Remarketing setting for a customer.
+	RemarketingSetting *RemarketingSetting `protobuf:"bytes,15,opt,name=remarketing_setting,json=remarketingSetting,proto3" json:"remarketing_setting,omitempty"`
+	// Reasons why the customer is not eligible to use PaymentMode.CONVERSIONS. If
+	// the list is empty, the customer is eligible. This field is read-only.
+	PayPerConversionEligibilityFailureReasons []enums.CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason `protobuf:"varint,16,rep,packed,name=pay_per_conversion_eligibility_failure_reasons,json=payPerConversionEligibilityFailureReasons,proto3,enum=google.ads.googleads.v3.enums.CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason" json:"pay_per_conversion_eligibility_failure_reasons,omitempty"`
+	XXX_NoUnkeyedLiteral                      struct{}                                                                                                      `json:"-"`
+	XXX_unrecognized                          []byte                                                                                                        `json:"-"`
+	XXX_sizecache                             int32                                                                                                         `json:"-"`
+}
+
+func (m *Customer) Reset()         { *m = Customer{} }
+func (m *Customer) String() string { return proto.CompactTextString(m) }
+func (*Customer) ProtoMessage()    {}
+func (*Customer) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1221f0b49b42ae61, []int{0}
+}
+
+func (m *Customer) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Customer.Unmarshal(m, b)
+}
+func (m *Customer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Customer.Marshal(b, m, deterministic)
+}
+func (m *Customer) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Customer.Merge(m, src)
+}
+func (m *Customer) XXX_Size() int {
+	return xxx_messageInfo_Customer.Size(m)
+}
+func (m *Customer) XXX_DiscardUnknown() {
+	xxx_messageInfo_Customer.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Customer proto.InternalMessageInfo
+
+func (m *Customer) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *Customer) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Customer) GetDescriptiveName() *wrappers.StringValue {
+	if m != nil {
+		return m.DescriptiveName
+	}
+	return nil
+}
+
+func (m *Customer) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+func (m *Customer) GetTimeZone() *wrappers.StringValue {
+	if m != nil {
+		return m.TimeZone
+	}
+	return nil
+}
+
+func (m *Customer) GetTrackingUrlTemplate() *wrappers.StringValue {
+	if m != nil {
+		return m.TrackingUrlTemplate
+	}
+	return nil
+}
+
+func (m *Customer) GetFinalUrlSuffix() *wrappers.StringValue {
+	if m != nil {
+		return m.FinalUrlSuffix
+	}
+	return nil
+}
+
+func (m *Customer) GetAutoTaggingEnabled() *wrappers.BoolValue {
+	if m != nil {
+		return m.AutoTaggingEnabled
+	}
+	return nil
+}
+
+func (m *Customer) GetHasPartnersBadge() *wrappers.BoolValue {
+	if m != nil {
+		return m.HasPartnersBadge
+	}
+	return nil
+}
+
+func (m *Customer) GetManager() *wrappers.BoolValue {
+	if m != nil {
+		return m.Manager
+	}
+	return nil
+}
+
+func (m *Customer) GetTestAccount() *wrappers.BoolValue {
+	if m != nil {
+		return m.TestAccount
+	}
+	return nil
+}
+
+func (m *Customer) GetCallReportingSetting() *CallReportingSetting {
+	if m != nil {
+		return m.CallReportingSetting
+	}
+	return nil
+}
+
+func (m *Customer) GetConversionTrackingSetting() *ConversionTrackingSetting {
+	if m != nil {
+		return m.ConversionTrackingSetting
+	}
+	return nil
+}
+
+func (m *Customer) GetRemarketingSetting() *RemarketingSetting {
+	if m != nil {
+		return m.RemarketingSetting
+	}
+	return nil
+}
+
+func (m *Customer) GetPayPerConversionEligibilityFailureReasons() []enums.CustomerPayPerConversionEligibilityFailureReasonEnum_CustomerPayPerConversionEligibilityFailureReason {
+	if m != nil {
+		return m.PayPerConversionEligibilityFailureReasons
+	}
+	return nil
+}
+
+// Call reporting setting for a customer.
+type CallReportingSetting struct {
+	// Enable reporting of phone call events by redirecting them via Google
+	// System.
+	CallReportingEnabled *wrappers.BoolValue `protobuf:"bytes,1,opt,name=call_reporting_enabled,json=callReportingEnabled,proto3" json:"call_reporting_enabled,omitempty"`
+	// Whether to enable call conversion reporting.
+	CallConversionReportingEnabled *wrappers.BoolValue `protobuf:"bytes,2,opt,name=call_conversion_reporting_enabled,json=callConversionReportingEnabled,proto3" json:"call_conversion_reporting_enabled,omitempty"`
+	// Customer-level call conversion action to attribute a call conversion to.
+	// If not set a default conversion action is used. Only in effect when
+	// call_conversion_reporting_enabled is set to true.
+	CallConversionAction *wrappers.StringValue `protobuf:"bytes,9,opt,name=call_conversion_action,json=callConversionAction,proto3" json:"call_conversion_action,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CallReportingSetting) Reset()         { *m = CallReportingSetting{} }
+func (m *CallReportingSetting) String() string { return proto.CompactTextString(m) }
+func (*CallReportingSetting) ProtoMessage()    {}
+func (*CallReportingSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1221f0b49b42ae61, []int{1}
+}
+
+func (m *CallReportingSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CallReportingSetting.Unmarshal(m, b)
+}
+func (m *CallReportingSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CallReportingSetting.Marshal(b, m, deterministic)
+}
+func (m *CallReportingSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CallReportingSetting.Merge(m, src)
+}
+func (m *CallReportingSetting) XXX_Size() int {
+	return xxx_messageInfo_CallReportingSetting.Size(m)
+}
+func (m *CallReportingSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_CallReportingSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CallReportingSetting proto.InternalMessageInfo
+
+func (m *CallReportingSetting) GetCallReportingEnabled() *wrappers.BoolValue {
+	if m != nil {
+		return m.CallReportingEnabled
+	}
+	return nil
+}
+
+func (m *CallReportingSetting) GetCallConversionReportingEnabled() *wrappers.BoolValue {
+	if m != nil {
+		return m.CallConversionReportingEnabled
+	}
+	return nil
+}
+
+func (m *CallReportingSetting) GetCallConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.CallConversionAction
+	}
+	return nil
+}
+
+// A collection of customer-wide settings related to Google Ads Conversion
+// Tracking.
+type ConversionTrackingSetting struct {
+	// The conversion tracking id used for this account. This id is automatically
+	// assigned after any conversion tracking feature is used. If the customer
+	// doesn't use conversion tracking, this is 0. This field is read-only.
+	ConversionTrackingId *wrappers.Int64Value `protobuf:"bytes,1,opt,name=conversion_tracking_id,json=conversionTrackingId,proto3" json:"conversion_tracking_id,omitempty"`
+	// The conversion tracking id of the customer's manager. This is set when the
+	// customer is opted into cross account conversion tracking, and it overrides
+	// conversion_tracking_id. This field can only be managed through the Google
+	// Ads UI. This field is read-only.
+	CrossAccountConversionTrackingId *wrappers.Int64Value `protobuf:"bytes,2,opt,name=cross_account_conversion_tracking_id,json=crossAccountConversionTrackingId,proto3" json:"cross_account_conversion_tracking_id,omitempty"`
+	XXX_NoUnkeyedLiteral             struct{}             `json:"-"`
+	XXX_unrecognized                 []byte               `json:"-"`
+	XXX_sizecache                    int32                `json:"-"`
+}
+
+func (m *ConversionTrackingSetting) Reset()         { *m = ConversionTrackingSetting{} }
+func (m *ConversionTrackingSetting) String() string { return proto.CompactTextString(m) }
+func (*ConversionTrackingSetting) ProtoMessage()    {}
+func (*ConversionTrackingSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1221f0b49b42ae61, []int{2}
+}
+
+func (m *ConversionTrackingSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionTrackingSetting.Unmarshal(m, b)
+}
+func (m *ConversionTrackingSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionTrackingSetting.Marshal(b, m, deterministic)
+}
+func (m *ConversionTrackingSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionTrackingSetting.Merge(m, src)
+}
+func (m *ConversionTrackingSetting) XXX_Size() int {
+	return xxx_messageInfo_ConversionTrackingSetting.Size(m)
+}
+func (m *ConversionTrackingSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionTrackingSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionTrackingSetting proto.InternalMessageInfo
+
+func (m *ConversionTrackingSetting) GetConversionTrackingId() *wrappers.Int64Value {
+	if m != nil {
+		return m.ConversionTrackingId
+	}
+	return nil
+}
+
+func (m *ConversionTrackingSetting) GetCrossAccountConversionTrackingId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CrossAccountConversionTrackingId
+	}
+	return nil
+}
+
+// Remarketing setting for a customer.
+type RemarketingSetting struct {
+	// The Google global site tag.
+	GoogleGlobalSiteTag  *wrappers.StringValue `protobuf:"bytes,1,opt,name=google_global_site_tag,json=googleGlobalSiteTag,proto3" json:"google_global_site_tag,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *RemarketingSetting) Reset()         { *m = RemarketingSetting{} }
+func (m *RemarketingSetting) String() string { return proto.CompactTextString(m) }
+func (*RemarketingSetting) ProtoMessage()    {}
+func (*RemarketingSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1221f0b49b42ae61, []int{3}
+}
+
+func (m *RemarketingSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RemarketingSetting.Unmarshal(m, b)
+}
+func (m *RemarketingSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RemarketingSetting.Marshal(b, m, deterministic)
+}
+func (m *RemarketingSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RemarketingSetting.Merge(m, src)
+}
+func (m *RemarketingSetting) XXX_Size() int {
+	return xxx_messageInfo_RemarketingSetting.Size(m)
+}
+func (m *RemarketingSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_RemarketingSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RemarketingSetting proto.InternalMessageInfo
+
+func (m *RemarketingSetting) GetGoogleGlobalSiteTag() *wrappers.StringValue {
+	if m != nil {
+		return m.GoogleGlobalSiteTag
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Customer)(nil), "google.ads.googleads.v3.resources.Customer")
+	proto.RegisterType((*CallReportingSetting)(nil), "google.ads.googleads.v3.resources.CallReportingSetting")
+	proto.RegisterType((*ConversionTrackingSetting)(nil), "google.ads.googleads.v3.resources.ConversionTrackingSetting")
+	proto.RegisterType((*RemarketingSetting)(nil), "google.ads.googleads.v3.resources.RemarketingSetting")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/customer.proto", fileDescriptor_1221f0b49b42ae61)
+}
+
+var fileDescriptor_1221f0b49b42ae61 = []byte{
+	// 911 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x96, 0xdd, 0x6e, 0xdc, 0x44,
+	0x14, 0xc7, 0xb5, 0x1b, 0x68, 0x93, 0xc9, 0x47, 0xa3, 0xe9, 0x52, 0x39, 0x69, 0x55, 0x25, 0x81,
+	0x4a, 0x41, 0x48, 0x5e, 0xd4, 0x2d, 0xa0, 0x9a, 0x72, 0xe1, 0x44, 0x69, 0x28, 0x42, 0x68, 0x71,
+	0xd2, 0x5c, 0x44, 0x91, 0x46, 0xb3, 0xf6, 0x59, 0x77, 0x94, 0xf1, 0x8c, 0x35, 0x33, 0x0e, 0x84,
+	0x8f, 0x3b, 0x9e, 0x04, 0xee, 0x78, 0x12, 0xc4, 0x2b, 0xf0, 0x02, 0xa8, 0x8f, 0xc0, 0x15, 0xf2,
+	0xd8, 0xe3, 0x4d, 0xb4, 0xd9, 0x78, 0x7b, 0x95, 0x89, 0xcf, 0xf9, 0xff, 0xfe, 0xc7, 0x93, 0x73,
+	0x8e, 0x83, 0x3e, 0x4d, 0xa5, 0x4c, 0x39, 0xf4, 0x69, 0xa2, 0xfb, 0xd5, 0xb1, 0x3c, 0x5d, 0x0c,
+	0xfa, 0x0a, 0xb4, 0x2c, 0x54, 0x0c, 0xba, 0x1f, 0x17, 0xda, 0xc8, 0x0c, 0x94, 0x9f, 0x2b, 0x69,
+	0x24, 0xde, 0xae, 0xd2, 0x7c, 0x9a, 0x68, 0xbf, 0x51, 0xf8, 0x17, 0x03, 0xbf, 0x51, 0x6c, 0x9e,
+	0xce, 0x82, 0x82, 0x28, 0xb2, 0x09, 0x90, 0xe4, 0xf4, 0x92, 0xe4, 0xa0, 0x48, 0x2c, 0xc5, 0x05,
+	0x28, 0xcd, 0xa4, 0x20, 0xc0, 0x59, 0xca, 0x46, 0x8c, 0x33, 0x73, 0x49, 0xc6, 0x94, 0xf1, 0x42,
+	0x01, 0x51, 0x40, 0xb5, 0x14, 0x95, 0xfd, 0xe6, 0x86, 0x63, 0xe7, 0xac, 0xa9, 0xb1, 0x0e, 0x3d,
+	0xae, 0x43, 0xf6, 0xb7, 0x51, 0x31, 0xee, 0xff, 0xa0, 0x68, 0x9e, 0x83, 0xd2, 0x75, 0xfc, 0xd1,
+	0x15, 0x29, 0x15, 0x42, 0x1a, 0x6a, 0x98, 0x14, 0x75, 0x74, 0xe7, 0x2f, 0x84, 0x16, 0xf7, 0xeb,
+	0xca, 0xf0, 0x87, 0x68, 0xd5, 0xc1, 0x89, 0xa0, 0x19, 0x78, 0x9d, 0xad, 0xce, 0xee, 0x52, 0xb4,
+	0xe2, 0x1e, 0x7e, 0x47, 0x33, 0xc0, 0x9f, 0xa0, 0x2e, 0x4b, 0xbc, 0x85, 0xad, 0xce, 0xee, 0xf2,
+	0xd3, 0x87, 0xf5, 0x5d, 0xf8, 0xce, 0xdc, 0x7f, 0x25, 0xcc, 0xe7, 0xcf, 0x4e, 0x28, 0x2f, 0x20,
+	0xea, 0xb2, 0x04, 0x1f, 0xa2, 0xf5, 0x04, 0x74, 0xac, 0x58, 0x6e, 0xd8, 0x45, 0x0d, 0x7d, 0xcf,
+	0x4a, 0x1f, 0x4d, 0x49, 0x8f, 0x8c, 0x62, 0x22, 0xad, 0xb4, 0xf7, 0xae, 0xa8, 0xac, 0x6b, 0x88,
+	0x56, 0xe3, 0x42, 0x29, 0x10, 0xf1, 0x25, 0x89, 0x65, 0x02, 0xde, 0xfb, 0x73, 0x50, 0x56, 0x9c,
+	0x64, 0x5f, 0x26, 0x80, 0x9f, 0xa3, 0x25, 0xc3, 0x32, 0x20, 0x3f, 0x49, 0x01, 0xde, 0x9d, 0x39,
+	0xe4, 0x8b, 0x65, 0xfa, 0xa9, 0x14, 0x80, 0x87, 0xe8, 0x03, 0xa3, 0x68, 0x7c, 0xce, 0x44, 0x4a,
+	0x0a, 0xc5, 0x89, 0x81, 0x2c, 0xe7, 0xd4, 0x80, 0x77, 0x77, 0x0e, 0xcc, 0x7d, 0x27, 0x7d, 0xad,
+	0xf8, 0x71, 0x2d, 0xc4, 0x2f, 0xd1, 0xfa, 0x98, 0x09, 0xca, 0x2d, 0x4e, 0x17, 0xe3, 0x31, 0xfb,
+	0xd1, 0x5b, 0x9e, 0x03, 0xb6, 0x66, 0x55, 0xaf, 0x15, 0x3f, 0xb2, 0x1a, 0xfc, 0x2d, 0xea, 0xd1,
+	0xc2, 0x48, 0x62, 0x68, 0x9a, 0x96, 0xd5, 0x81, 0xa0, 0x23, 0x0e, 0x89, 0xb7, 0x68, 0x59, 0x9b,
+	0x53, 0xac, 0x3d, 0x29, 0x79, 0x45, 0xc2, 0xa5, 0xee, 0xb8, 0x92, 0x1d, 0x54, 0x2a, 0xfc, 0x35,
+	0xc2, 0x6f, 0xa8, 0x26, 0x39, 0x55, 0x46, 0x80, 0xd2, 0x64, 0x44, 0x93, 0x14, 0xbc, 0xa5, 0x56,
+	0xd6, 0xfa, 0x1b, 0xaa, 0x87, 0xb5, 0x68, 0xaf, 0xd4, 0xe0, 0x67, 0xe8, 0x6e, 0x46, 0x05, 0x4d,
+	0x41, 0x79, 0x2b, 0xad, 0x72, 0x97, 0x8a, 0xbf, 0x42, 0x2b, 0x06, 0xb4, 0x21, 0x34, 0x8e, 0x65,
+	0x21, 0x8c, 0xb7, 0xda, 0x2a, 0x5d, 0x2e, 0xf3, 0xc3, 0x2a, 0x1d, 0x67, 0xe8, 0x41, 0x4c, 0x39,
+	0x27, 0x0a, 0x72, 0xa9, 0x4c, 0x79, 0x1d, 0x1a, 0x4c, 0xf9, 0xd3, 0x43, 0x16, 0xf4, 0x85, 0xdf,
+	0x3a, 0xc5, 0xfe, 0x3e, 0xe5, 0x3c, 0x72, 0xfa, 0xa3, 0x4a, 0x1e, 0xf5, 0xe2, 0x1b, 0x9e, 0xe2,
+	0x5f, 0xd0, 0xc3, 0x2b, 0x33, 0xdc, 0x34, 0x88, 0xf3, 0x5c, 0xb3, 0x9e, 0x2f, 0xe6, 0xf1, 0x6c,
+	0x28, 0xc7, 0x35, 0xc4, 0x19, 0x6f, 0xc4, 0xb3, 0x42, 0x78, 0x8c, 0xee, 0x2b, 0xc8, 0xa8, 0x3a,
+	0x87, 0x6b, 0x6f, 0x7a, 0xcf, 0xba, 0x7e, 0x36, 0x87, 0x6b, 0x34, 0x51, 0x3b, 0x3b, 0xac, 0xa6,
+	0x9e, 0xe1, 0x7f, 0x3b, 0xc8, 0x7f, 0xa7, 0x95, 0xa5, 0xbd, 0xf5, 0xad, 0x85, 0xdd, 0xb5, 0xa7,
+	0xbf, 0x75, 0x66, 0x16, 0x61, 0x37, 0xa2, 0xef, 0xf6, 0xce, 0x90, 0x5e, 0x0e, 0x41, 0x4d, 0x2e,
+	0xe1, 0x60, 0x82, 0x7e, 0x59, 0x91, 0x23, 0x0b, 0x3e, 0x10, 0x45, 0xf6, 0xce, 0xa2, 0xe8, 0xe3,
+	0x7c, 0xce, 0x4c, 0x1d, 0xbc, 0x78, 0x1b, 0x3e, 0x47, 0xdb, 0x93, 0x4a, 0xeb, 0x53, 0xce, 0xb4,
+	0x1f, 0xcb, 0xac, 0xdf, 0xec, 0xc9, 0x9e, 0xdb, 0xe5, 0xba, 0xff, 0xb3, 0x3b, 0xfe, 0xba, 0xf3,
+	0x47, 0x17, 0xf5, 0x6e, 0xea, 0x1e, 0x3c, 0x9c, 0x6a, 0x4b, 0x37, 0xa5, 0x9d, 0xd6, 0xfe, 0xbe,
+	0xde, 0x79, 0x6e, 0x4e, 0x01, 0x6d, 0x5b, 0xe2, 0x95, 0xbf, 0xc7, 0x34, 0xbc, 0xdb, 0x0a, 0x7f,
+	0x5c, 0x42, 0x26, 0x17, 0x33, 0x65, 0x13, 0xd5, 0x85, 0x5f, 0xb1, 0xa1, 0x71, 0xf9, 0xf5, 0xa8,
+	0x57, 0xc2, 0xed, 0xab, 0xaa, 0x77, 0x9d, 0x1e, 0x5a, 0xe5, 0xce, 0x3f, 0x1d, 0xb4, 0x31, 0xb3,
+	0xdf, 0xf1, 0xf7, 0xe8, 0xc1, 0x4d, 0x23, 0xc5, 0xdc, 0x55, 0xdd, 0xfa, 0xc1, 0xe9, 0x4d, 0x0f,
+	0xcb, 0xab, 0x04, 0x9f, 0xa3, 0x8f, 0x62, 0x25, 0xb5, 0x76, 0x4b, 0x85, 0xcc, 0x30, 0xe8, 0xb6,
+	0x1b, 0x6c, 0x59, 0x50, 0xbd, 0x6d, 0xf6, 0x6f, 0x30, 0xdb, 0x49, 0x11, 0x9e, 0x1e, 0xab, 0xf2,
+	0xad, 0x2a, 0x2a, 0x49, 0xb9, 0x1c, 0x51, 0x4e, 0x34, 0x33, 0x50, 0xae, 0xec, 0xfa, 0xad, 0x5a,
+	0xbe, 0x1f, 0x55, 0xf0, 0xd0, 0x4a, 0x8f, 0x98, 0x81, 0x63, 0x9a, 0xee, 0xfd, 0xd7, 0x41, 0x4f,
+	0x62, 0x99, 0xb5, 0x8f, 0xf9, 0xde, 0x6a, 0x33, 0x31, 0x25, 0x7c, 0xd8, 0x39, 0xfd, 0xa6, 0xd6,
+	0xa4, 0x92, 0x53, 0x91, 0xfa, 0x52, 0xa5, 0xfd, 0x14, 0x84, 0xb5, 0xee, 0x4f, 0x3a, 0xfe, 0x96,
+	0xff, 0x8d, 0xbe, 0x6c, 0x4e, 0xbf, 0x77, 0x17, 0x0e, 0xc3, 0xf0, 0xcf, 0xee, 0xf6, 0x61, 0x85,
+	0x0c, 0x13, 0xed, 0x57, 0xc7, 0xf2, 0x74, 0x32, 0xf0, 0x23, 0x97, 0xf9, 0xb7, 0xcb, 0x39, 0x0b,
+	0x13, 0x7d, 0xd6, 0xe4, 0x9c, 0x9d, 0x0c, 0xce, 0x9a, 0x9c, 0xb7, 0xdd, 0x27, 0x55, 0x20, 0x08,
+	0xc2, 0x44, 0x07, 0x41, 0x93, 0x15, 0x04, 0x27, 0x83, 0x20, 0x68, 0xf2, 0x46, 0x77, 0x6c, 0xb1,
+	0x83, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x17, 0xf8, 0x6e, 0x7f, 0xc7, 0x09, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/customer_client.pb.go b/googleapis/ads/googleads/v3/resources/customer_client.pb.go
new file mode 100644
index 0000000..e92d696
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/customer_client.pb.go
@@ -0,0 +1,200 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/customer_client.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A link between the given customer and a client customer. CustomerClients only
+// exist for manager customers. All direct and indirect client customers are
+// included, as well as the manager itself.
+type CustomerClient struct {
+	// The resource name of the customer client.
+	// CustomerClient resource names have the form:
+	// `customers/{customer_id}/customerClients/{client_customer_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The resource name of the client-customer which is linked to
+	// the given customer. Read only.
+	ClientCustomer *wrappers.StringValue `protobuf:"bytes,3,opt,name=client_customer,json=clientCustomer,proto3" json:"client_customer,omitempty"`
+	// Specifies whether this is a
+	// [hidden account](https://support.google.com/google-ads/answer/7519830).
+	// Read only.
+	Hidden *wrappers.BoolValue `protobuf:"bytes,4,opt,name=hidden,proto3" json:"hidden,omitempty"`
+	// Distance between given customer and client. For self link, the level value
+	// will be 0. Read only.
+	Level *wrappers.Int64Value `protobuf:"bytes,5,opt,name=level,proto3" json:"level,omitempty"`
+	// Common Locale Data Repository (CLDR) string representation of the
+	// time zone of the client, e.g. America/Los_Angeles. Read only.
+	TimeZone *wrappers.StringValue `protobuf:"bytes,6,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"`
+	// Identifies if the client is a test account. Read only.
+	TestAccount *wrappers.BoolValue `protobuf:"bytes,7,opt,name=test_account,json=testAccount,proto3" json:"test_account,omitempty"`
+	// Identifies if the client is a manager. Read only.
+	Manager *wrappers.BoolValue `protobuf:"bytes,8,opt,name=manager,proto3" json:"manager,omitempty"`
+	// Descriptive name for the client. Read only.
+	DescriptiveName *wrappers.StringValue `protobuf:"bytes,9,opt,name=descriptive_name,json=descriptiveName,proto3" json:"descriptive_name,omitempty"`
+	// Currency code (e.g. 'USD', 'EUR') for the client. Read only.
+	CurrencyCode *wrappers.StringValue `protobuf:"bytes,10,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	// The ID of the client customer. Read only.
+	Id                   *wrappers.Int64Value `protobuf:"bytes,11,opt,name=id,proto3" json:"id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *CustomerClient) Reset()         { *m = CustomerClient{} }
+func (m *CustomerClient) String() string { return proto.CompactTextString(m) }
+func (*CustomerClient) ProtoMessage()    {}
+func (*CustomerClient) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01c696c42eabfec5, []int{0}
+}
+
+func (m *CustomerClient) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerClient.Unmarshal(m, b)
+}
+func (m *CustomerClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerClient.Marshal(b, m, deterministic)
+}
+func (m *CustomerClient) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerClient.Merge(m, src)
+}
+func (m *CustomerClient) XXX_Size() int {
+	return xxx_messageInfo_CustomerClient.Size(m)
+}
+func (m *CustomerClient) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerClient.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerClient proto.InternalMessageInfo
+
+func (m *CustomerClient) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CustomerClient) GetClientCustomer() *wrappers.StringValue {
+	if m != nil {
+		return m.ClientCustomer
+	}
+	return nil
+}
+
+func (m *CustomerClient) GetHidden() *wrappers.BoolValue {
+	if m != nil {
+		return m.Hidden
+	}
+	return nil
+}
+
+func (m *CustomerClient) GetLevel() *wrappers.Int64Value {
+	if m != nil {
+		return m.Level
+	}
+	return nil
+}
+
+func (m *CustomerClient) GetTimeZone() *wrappers.StringValue {
+	if m != nil {
+		return m.TimeZone
+	}
+	return nil
+}
+
+func (m *CustomerClient) GetTestAccount() *wrappers.BoolValue {
+	if m != nil {
+		return m.TestAccount
+	}
+	return nil
+}
+
+func (m *CustomerClient) GetManager() *wrappers.BoolValue {
+	if m != nil {
+		return m.Manager
+	}
+	return nil
+}
+
+func (m *CustomerClient) GetDescriptiveName() *wrappers.StringValue {
+	if m != nil {
+		return m.DescriptiveName
+	}
+	return nil
+}
+
+func (m *CustomerClient) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+func (m *CustomerClient) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CustomerClient)(nil), "google.ads.googleads.v3.resources.CustomerClient")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/customer_client.proto", fileDescriptor_01c696c42eabfec5)
+}
+
+var fileDescriptor_01c696c42eabfec5 = []byte{
+	// 524 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x5f, 0x6b, 0x13, 0x4d,
+	0x14, 0xc6, 0xc9, 0xf6, 0xed, 0x9f, 0x4c, 0xd2, 0xf6, 0x65, 0xbd, 0x59, 0x63, 0x91, 0x56, 0x29,
+	0x16, 0x84, 0x59, 0xec, 0x96, 0x8a, 0x2b, 0x5e, 0x6c, 0x82, 0x04, 0xbd, 0x90, 0x12, 0x21, 0x17,
+	0x25, 0xb0, 0x4c, 0x67, 0x8e, 0xeb, 0xc0, 0xee, 0xcc, 0x32, 0x33, 0x1b, 0x51, 0x29, 0xf8, 0x59,
+	0xbc, 0xf4, 0xd2, 0x8f, 0xe1, 0x47, 0xe9, 0xa7, 0x90, 0xec, 0xec, 0x6c, 0xa3, 0x05, 0x93, 0xbb,
+	0x27, 0x39, 0xcf, 0xef, 0xcc, 0x73, 0x76, 0xe6, 0xa0, 0xe7, 0x99, 0x94, 0x59, 0x0e, 0x21, 0x61,
+	0x3a, 0xb4, 0x72, 0xa1, 0xe6, 0x51, 0xa8, 0x40, 0xcb, 0x4a, 0x51, 0xd0, 0x21, 0xad, 0xb4, 0x91,
+	0x05, 0xa8, 0x94, 0xe6, 0x1c, 0x84, 0xc1, 0xa5, 0x92, 0x46, 0xfa, 0x47, 0xd6, 0x8d, 0x09, 0xd3,
+	0xb8, 0x05, 0xf1, 0x3c, 0xc2, 0x2d, 0x38, 0xb8, 0xef, 0x7a, 0x97, 0xbc, 0x6d, 0x67, 0xe9, 0xc1,
+	0xc3, 0xa6, 0x54, 0xff, 0xba, 0xaa, 0x3e, 0x84, 0x9f, 0x14, 0x29, 0x4b, 0x50, 0xba, 0xa9, 0x1f,
+	0x2c, 0xa1, 0x44, 0x08, 0x69, 0x88, 0xe1, 0x52, 0x34, 0xd5, 0x47, 0x3f, 0x37, 0xd1, 0xde, 0xa8,
+	0x49, 0x35, 0xaa, 0x43, 0xf9, 0x8f, 0xd1, 0xae, 0x3b, 0x22, 0x15, 0xa4, 0x80, 0xa0, 0x73, 0xd8,
+	0x39, 0xe9, 0x4e, 0xfa, 0xee, 0xcf, 0x77, 0xa4, 0x00, 0xff, 0x35, 0xda, 0xb7, 0x33, 0xa4, 0x6e,
+	0xa6, 0x60, 0xe3, 0xb0, 0x73, 0xd2, 0x3b, 0x3d, 0x68, 0x46, 0xc0, 0x2e, 0x0f, 0x7e, 0x6f, 0x14,
+	0x17, 0xd9, 0x94, 0xe4, 0x15, 0x4c, 0xf6, 0x2c, 0xe4, 0x4e, 0xf4, 0x4f, 0xd1, 0xd6, 0x47, 0xce,
+	0x18, 0x88, 0xe0, 0xbf, 0x9a, 0x1e, 0xdc, 0xa1, 0x87, 0x52, 0xe6, 0x96, 0x6d, 0x9c, 0xfe, 0x33,
+	0xb4, 0x99, 0xc3, 0x1c, 0xf2, 0x60, 0xb3, 0x46, 0x1e, 0xdc, 0x41, 0xde, 0x08, 0x73, 0x7e, 0x66,
+	0x19, 0xeb, 0xf4, 0x5f, 0xa0, 0xae, 0xe1, 0x05, 0xa4, 0x5f, 0xa4, 0x80, 0x60, 0x6b, 0x8d, 0x9c,
+	0x3b, 0x0b, 0xfb, 0xa5, 0x14, 0xe0, 0xbf, 0x42, 0x7d, 0x03, 0xda, 0xa4, 0x84, 0x52, 0x59, 0x09,
+	0x13, 0x6c, 0xaf, 0xcc, 0xd9, 0x5b, 0xf8, 0x13, 0x6b, 0xf7, 0xcf, 0xd0, 0x76, 0x41, 0x04, 0xc9,
+	0x40, 0x05, 0x3b, 0x2b, 0x49, 0x67, 0xf5, 0xc7, 0xe8, 0x7f, 0x06, 0x9a, 0x2a, 0x5e, 0x1a, 0x3e,
+	0x6f, 0x6e, 0xa1, 0xbb, 0x46, 0xec, 0xfd, 0x25, 0xaa, 0xbe, 0xa6, 0x04, 0xed, 0xd2, 0x4a, 0x29,
+	0x10, 0xf4, 0x73, 0x4a, 0x25, 0x83, 0x00, 0xad, 0xd1, 0xa5, 0xef, 0x90, 0x91, 0x64, 0xe0, 0x3f,
+	0x45, 0x1e, 0x67, 0x41, 0x6f, 0xf5, 0xb7, 0xf6, 0x38, 0x8b, 0xd9, 0x4d, 0x42, 0xd0, 0x93, 0xdb,
+	0x47, 0xdc, 0xa8, 0x92, 0x6b, 0x4c, 0x65, 0x11, 0xfe, 0xf5, 0xd2, 0xce, 0xdd, 0xdb, 0xd1, 0xe1,
+	0x57, 0x27, 0xaf, 0xdb, 0x25, 0xb1, 0xa6, 0xa5, 0x52, 0xb3, 0x35, 0xd7, 0xc3, 0x6f, 0x1e, 0x3a,
+	0xa6, 0xb2, 0xc0, 0x2b, 0xf7, 0x66, 0x78, 0xef, 0xcf, 0x13, 0x2f, 0x16, 0xb1, 0x2f, 0x3a, 0x97,
+	0x6f, 0x1b, 0x32, 0x93, 0x39, 0x11, 0x19, 0x96, 0x2a, 0x0b, 0x33, 0x10, 0xf5, 0x50, 0xe1, 0x6d,
+	0xe4, 0x7f, 0x6c, 0xf2, 0xcb, 0x56, 0x7d, 0xf7, 0x36, 0xc6, 0x49, 0xf2, 0xc3, 0x3b, 0x1a, 0xdb,
+	0x96, 0x09, 0xd3, 0xd8, 0xca, 0x85, 0x9a, 0x46, 0x78, 0xe2, 0x9c, 0xbf, 0x9c, 0x67, 0x96, 0x30,
+	0x3d, 0x6b, 0x3d, 0xb3, 0x69, 0x34, 0x6b, 0x3d, 0x37, 0xde, 0xb1, 0x2d, 0xc4, 0x71, 0xc2, 0x74,
+	0x1c, 0xb7, 0xae, 0x38, 0x9e, 0x46, 0x71, 0xdc, 0xfa, 0xae, 0xb6, 0xea, 0xb0, 0xd1, 0xef, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0xdc, 0x5c, 0x72, 0xd4, 0x75, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/customer_client_link.pb.go b/googleapis/ads/googleads/v3/resources/customer_client_link.pb.go
new file mode 100644
index 0000000..02754fb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/customer_client_link.pb.go
@@ -0,0 +1,148 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/customer_client_link.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Represents customer client link relationship.
+type CustomerClientLink struct {
+	// Name of the resource.
+	// CustomerClientLink resource names have the form:
+	// `customers/{customer_id}/customerClientLinks/{client_customer_id}~{manager_link_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The client customer linked to this customer.
+	ClientCustomer *wrappers.StringValue `protobuf:"bytes,3,opt,name=client_customer,json=clientCustomer,proto3" json:"client_customer,omitempty"`
+	// This is uniquely identifies a customer client link. Read only.
+	ManagerLinkId *wrappers.Int64Value `protobuf:"bytes,4,opt,name=manager_link_id,json=managerLinkId,proto3" json:"manager_link_id,omitempty"`
+	// This is the status of the link between client and manager.
+	Status enums.ManagerLinkStatusEnum_ManagerLinkStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.ManagerLinkStatusEnum_ManagerLinkStatus" json:"status,omitempty"`
+	// The visibility of the link. Users can choose whether or not to see hidden
+	// links in the AdWords UI.
+	// Default value is false
+	Hidden               *wrappers.BoolValue `protobuf:"bytes,6,opt,name=hidden,proto3" json:"hidden,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *CustomerClientLink) Reset()         { *m = CustomerClientLink{} }
+func (m *CustomerClientLink) String() string { return proto.CompactTextString(m) }
+func (*CustomerClientLink) ProtoMessage()    {}
+func (*CustomerClientLink) Descriptor() ([]byte, []int) {
+	return fileDescriptor_19b00c28e6d68d63, []int{0}
+}
+
+func (m *CustomerClientLink) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerClientLink.Unmarshal(m, b)
+}
+func (m *CustomerClientLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerClientLink.Marshal(b, m, deterministic)
+}
+func (m *CustomerClientLink) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerClientLink.Merge(m, src)
+}
+func (m *CustomerClientLink) XXX_Size() int {
+	return xxx_messageInfo_CustomerClientLink.Size(m)
+}
+func (m *CustomerClientLink) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerClientLink.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerClientLink proto.InternalMessageInfo
+
+func (m *CustomerClientLink) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CustomerClientLink) GetClientCustomer() *wrappers.StringValue {
+	if m != nil {
+		return m.ClientCustomer
+	}
+	return nil
+}
+
+func (m *CustomerClientLink) GetManagerLinkId() *wrappers.Int64Value {
+	if m != nil {
+		return m.ManagerLinkId
+	}
+	return nil
+}
+
+func (m *CustomerClientLink) GetStatus() enums.ManagerLinkStatusEnum_ManagerLinkStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.ManagerLinkStatusEnum_UNSPECIFIED
+}
+
+func (m *CustomerClientLink) GetHidden() *wrappers.BoolValue {
+	if m != nil {
+		return m.Hidden
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CustomerClientLink)(nil), "google.ads.googleads.v3.resources.CustomerClientLink")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/customer_client_link.proto", fileDescriptor_19b00c28e6d68d63)
+}
+
+var fileDescriptor_19b00c28e6d68d63 = []byte{
+	// 478 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x5d, 0x6b, 0x13, 0x41,
+	0x14, 0x65, 0x13, 0x0d, 0xb8, 0xda, 0x16, 0xf6, 0xc5, 0x35, 0x16, 0x49, 0x95, 0x42, 0x40, 0x98,
+	0x81, 0xac, 0x28, 0x8c, 0x82, 0x6c, 0x42, 0x2d, 0x15, 0x95, 0x92, 0x42, 0x1e, 0x24, 0x18, 0xa6,
+	0x3b, 0xe3, 0x3a, 0x74, 0x77, 0x66, 0x9d, 0x99, 0xad, 0x0f, 0xd2, 0x37, 0x7f, 0x89, 0x8f, 0xfe,
+	0x14, 0xf1, 0x97, 0xf4, 0x57, 0x48, 0xe6, 0x2b, 0x91, 0x18, 0x7d, 0xbb, 0x99, 0x7b, 0xce, 0xb9,
+	0xe7, 0xdc, 0xdc, 0x8d, 0x5f, 0x94, 0x42, 0x94, 0x15, 0x85, 0x98, 0x28, 0x68, 0xcb, 0x65, 0x75,
+	0x99, 0x41, 0x49, 0x95, 0x68, 0x65, 0x41, 0x15, 0x2c, 0x5a, 0xa5, 0x45, 0x4d, 0xe5, 0xa2, 0xa8,
+	0x18, 0xe5, 0x7a, 0x51, 0x31, 0x7e, 0x01, 0x1a, 0x29, 0xb4, 0x48, 0x0e, 0x2c, 0x05, 0x60, 0xa2,
+	0x40, 0x60, 0x83, 0xcb, 0x0c, 0x04, 0x76, 0xff, 0xd9, 0xb6, 0x01, 0x94, 0xb7, 0xb5, 0x82, 0x35,
+	0xe6, 0xb8, 0xa4, 0xd2, 0x88, 0x2e, 0x94, 0xc6, 0xba, 0x55, 0x56, 0xbb, 0x7f, 0xcf, 0x13, 0x1b,
+	0x16, 0xcc, 0xb8, 0xd6, 0x03, 0xd7, 0x32, 0xbf, 0xce, 0xdb, 0x8f, 0xf0, 0x8b, 0xc4, 0x4d, 0x43,
+	0xa5, 0xa7, 0xee, 0xaf, 0x51, 0x31, 0xe7, 0x42, 0x63, 0xcd, 0x04, 0x77, 0xdd, 0x87, 0xbf, 0xba,
+	0x71, 0x32, 0x71, 0x99, 0x26, 0x26, 0xd2, 0x1b, 0xc6, 0x2f, 0x92, 0x47, 0xf1, 0x8e, 0x1f, 0xb3,
+	0xe0, 0xb8, 0xa6, 0x69, 0x34, 0x88, 0x86, 0xb7, 0xa6, 0x77, 0xfc, 0xe3, 0x3b, 0x5c, 0xd3, 0xe4,
+	0x28, 0xde, 0x73, 0x5b, 0xf0, 0x5b, 0x49, 0xbb, 0x83, 0x68, 0x78, 0x7b, 0xb4, 0xef, 0xf2, 0x03,
+	0xef, 0x09, 0x9c, 0x69, 0xc9, 0x78, 0x39, 0xc3, 0x55, 0x4b, 0xa7, 0xbb, 0x96, 0xe4, 0xa7, 0x26,
+	0x93, 0x78, 0xef, 0x8f, 0xe0, 0x8c, 0xa4, 0x37, 0x8c, 0xcc, 0xfd, 0x0d, 0x99, 0x13, 0xae, 0x9f,
+	0x3e, 0xb1, 0x2a, 0x3b, 0x8e, 0xb3, 0xb4, 0x7b, 0x42, 0x92, 0x0f, 0x71, 0xcf, 0x2e, 0x2c, 0xbd,
+	0x39, 0x88, 0x86, 0xbb, 0xa3, 0x57, 0x60, 0xdb, 0xbf, 0x61, 0x56, 0x0d, 0xde, 0xae, 0xd8, 0x67,
+	0x86, 0x77, 0xc4, 0xdb, 0x7a, 0xf3, 0x75, 0xea, 0x54, 0x93, 0x51, 0xdc, 0xfb, 0xc4, 0x08, 0xa1,
+	0x3c, 0xed, 0x19, 0x6f, 0xfd, 0x0d, 0x6f, 0x63, 0x21, 0x2a, 0x6b, 0xcd, 0x21, 0xd1, 0xe7, 0xeb,
+	0x9c, 0xc7, 0x8f, 0x57, 0xc3, 0x5d, 0xd5, 0x30, 0x05, 0x0a, 0x51, 0xc3, 0xbf, 0xac, 0xfd, 0xa5,
+	0x5f, 0xa4, 0x82, 0x5f, 0x7d, 0x79, 0x15, 0x6e, 0x6e, 0x05, 0x5c, 0x6b, 0xaf, 0x1f, 0xe2, 0xd5,
+	0xf8, 0x5b, 0x27, 0x3e, 0x2c, 0x44, 0x0d, 0xfe, 0x7b, 0x8a, 0xe3, 0xbb, 0x9b, 0xe3, 0x4f, 0x97,
+	0x51, 0x4e, 0xa3, 0xf7, 0xaf, 0x1d, 0xbb, 0x14, 0x15, 0xe6, 0x25, 0x10, 0xb2, 0x84, 0x25, 0xe5,
+	0x26, 0x28, 0x5c, 0x65, 0xf8, 0xc7, 0x57, 0xf2, 0x3c, 0x54, 0xdf, 0x3b, 0xdd, 0xe3, 0x3c, 0xff,
+	0xd1, 0x39, 0x38, 0xb6, 0x92, 0x39, 0x51, 0xc0, 0x96, 0xcb, 0x6a, 0x96, 0x81, 0xa9, 0x47, 0xfe,
+	0xf4, 0x98, 0x79, 0x4e, 0xd4, 0x3c, 0x60, 0xe6, 0xb3, 0x6c, 0x1e, 0x30, 0xd7, 0x9d, 0x43, 0xdb,
+	0x40, 0x28, 0x27, 0x0a, 0xa1, 0x80, 0x42, 0x68, 0x96, 0x21, 0x14, 0x70, 0xe7, 0x3d, 0x63, 0x36,
+	0xfb, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x0a, 0xf8, 0x4a, 0xd1, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/customer_extension_setting.pb.go b/googleapis/ads/googleads/v3/resources/customer_extension_setting.pb.go
new file mode 100644
index 0000000..1bdd059
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/customer_extension_setting.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/customer_extension_setting.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A customer extension setting.
+type CustomerExtensionSetting struct {
+	// The resource name of the customer extension setting.
+	// CustomerExtensionSetting resource names have the form:
+	//
+	// `customers/{customer_id}/customerExtensionSettings/{extension_type}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The extension type of the customer extension setting.
+	ExtensionType enums.ExtensionTypeEnum_ExtensionType `protobuf:"varint,2,opt,name=extension_type,json=extensionType,proto3,enum=google.ads.googleads.v3.enums.ExtensionTypeEnum_ExtensionType" json:"extension_type,omitempty"`
+	// The resource names of the extension feed items to serve under the customer.
+	// ExtensionFeedItem resource names have the form:
+	//
+	// `customers/{customer_id}/extensionFeedItems/{feed_item_id}`
+	ExtensionFeedItems []*wrappers.StringValue `protobuf:"bytes,3,rep,name=extension_feed_items,json=extensionFeedItems,proto3" json:"extension_feed_items,omitempty"`
+	// The device for which the extensions will serve. Optional.
+	Device               enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice `protobuf:"varint,4,opt,name=device,proto3,enum=google.ads.googleads.v3.enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice" json:"device,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                `json:"-"`
+	XXX_unrecognized     []byte                                                  `json:"-"`
+	XXX_sizecache        int32                                                   `json:"-"`
+}
+
+func (m *CustomerExtensionSetting) Reset()         { *m = CustomerExtensionSetting{} }
+func (m *CustomerExtensionSetting) String() string { return proto.CompactTextString(m) }
+func (*CustomerExtensionSetting) ProtoMessage()    {}
+func (*CustomerExtensionSetting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aad619780d8a95dd, []int{0}
+}
+
+func (m *CustomerExtensionSetting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerExtensionSetting.Unmarshal(m, b)
+}
+func (m *CustomerExtensionSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerExtensionSetting.Marshal(b, m, deterministic)
+}
+func (m *CustomerExtensionSetting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerExtensionSetting.Merge(m, src)
+}
+func (m *CustomerExtensionSetting) XXX_Size() int {
+	return xxx_messageInfo_CustomerExtensionSetting.Size(m)
+}
+func (m *CustomerExtensionSetting) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerExtensionSetting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerExtensionSetting proto.InternalMessageInfo
+
+func (m *CustomerExtensionSetting) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CustomerExtensionSetting) GetExtensionType() enums.ExtensionTypeEnum_ExtensionType {
+	if m != nil {
+		return m.ExtensionType
+	}
+	return enums.ExtensionTypeEnum_UNSPECIFIED
+}
+
+func (m *CustomerExtensionSetting) GetExtensionFeedItems() []*wrappers.StringValue {
+	if m != nil {
+		return m.ExtensionFeedItems
+	}
+	return nil
+}
+
+func (m *CustomerExtensionSetting) GetDevice() enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice {
+	if m != nil {
+		return m.Device
+	}
+	return enums.ExtensionSettingDeviceEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*CustomerExtensionSetting)(nil), "google.ads.googleads.v3.resources.CustomerExtensionSetting")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/customer_extension_setting.proto", fileDescriptor_aad619780d8a95dd)
+}
+
+var fileDescriptor_aad619780d8a95dd = []byte{
+	// 476 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x5d, 0x6b, 0xd4, 0x40,
+	0x14, 0x25, 0x59, 0x29, 0x18, 0x6d, 0x1f, 0x82, 0x0f, 0xb1, 0x54, 0xd9, 0x2a, 0x85, 0x7d, 0x9a,
+	0xc1, 0xcd, 0xdb, 0x28, 0x42, 0x56, 0x6b, 0x51, 0xa1, 0x2c, 0xa9, 0xec, 0x83, 0x2c, 0x84, 0x69,
+	0x72, 0x1b, 0x03, 0x9b, 0x99, 0x30, 0x33, 0x59, 0x2d, 0x52, 0xf0, 0xc1, 0x27, 0x7f, 0x86, 0x8f,
+	0xfe, 0x14, 0xff, 0x88, 0xd0, 0x5f, 0x21, 0x9b, 0xf9, 0xd8, 0x5d, 0xcb, 0xda, 0x7d, 0xbb, 0x33,
+	0xf7, 0x9c, 0x7b, 0xce, 0x9c, 0xdc, 0x04, 0xa3, 0x92, 0xf3, 0x72, 0x06, 0x98, 0x16, 0x12, 0xeb,
+	0x72, 0x51, 0xcd, 0x63, 0x2c, 0x40, 0xf2, 0x56, 0xe4, 0x20, 0x71, 0xde, 0x4a, 0xc5, 0x6b, 0x10,
+	0x19, 0x7c, 0x51, 0xc0, 0x64, 0xc5, 0x59, 0x26, 0x41, 0xa9, 0x8a, 0x95, 0xa8, 0x11, 0x5c, 0xf1,
+	0xf0, 0x50, 0x13, 0x11, 0x2d, 0x24, 0x72, 0x33, 0xd0, 0x3c, 0x46, 0x6e, 0xc6, 0xfe, 0x8b, 0x4d,
+	0x32, 0xc0, 0xda, 0x5a, 0xe2, 0x1b, 0x93, 0xb3, 0x02, 0xe6, 0x55, 0x0e, 0x5a, 0x60, 0x7f, 0xb8,
+	0x2d, 0x5b, 0x5d, 0x36, 0x96, 0xf3, 0xd0, 0x72, 0x9a, 0xca, 0xbd, 0xc5, 0xb4, 0x1e, 0x9b, 0x56,
+	0x77, 0x3a, 0x6f, 0x2f, 0xf0, 0x67, 0x41, 0x9b, 0x06, 0x84, 0x34, 0xfd, 0x83, 0x15, 0x2a, 0x65,
+	0x8c, 0x2b, 0xaa, 0x2a, 0xce, 0x4c, 0xf7, 0xc9, 0x9f, 0x5e, 0x10, 0xbd, 0x32, 0x91, 0x1c, 0x5b,
+	0xe5, 0x33, 0x6d, 0x3b, 0x7c, 0x1a, 0xec, 0x5a, 0xb1, 0x8c, 0xd1, 0x1a, 0x22, 0xaf, 0xef, 0x0d,
+	0xee, 0xa6, 0xf7, 0xed, 0xe5, 0x29, 0xad, 0x21, 0x84, 0x60, 0x6f, 0xdd, 0x72, 0xe4, 0xf7, 0xbd,
+	0xc1, 0xde, 0xf0, 0x25, 0xda, 0x14, 0x64, 0xf7, 0x4e, 0xe4, 0xd4, 0x3e, 0x5c, 0x36, 0x70, 0xcc,
+	0xda, 0x7a, 0xfd, 0x26, 0xdd, 0x85, 0xd5, 0x63, 0x78, 0x1a, 0x3c, 0x58, 0xca, 0x5c, 0x00, 0x14,
+	0x59, 0xa5, 0xa0, 0x96, 0x51, 0xaf, 0xdf, 0x1b, 0xdc, 0x1b, 0x1e, 0x58, 0x31, 0x9b, 0x02, 0x3a,
+	0x53, 0xa2, 0x62, 0xe5, 0x84, 0xce, 0x5a, 0x48, 0x43, 0xc7, 0x7c, 0x03, 0x50, 0xbc, 0x5d, 0xf0,
+	0xc2, 0x4f, 0xc1, 0x8e, 0xfe, 0x2a, 0xd1, 0x9d, 0xce, 0xee, 0x78, 0x5b, 0xbb, 0x26, 0x9c, 0xd7,
+	0x1d, 0x79, 0xdd, 0xf7, 0x5a, 0x2b, 0x35, 0xf3, 0xc9, 0x77, 0xef, 0x3a, 0xf9, 0xe6, 0x05, 0xcf,
+	0x96, 0x43, 0x4d, 0xd5, 0x54, 0x12, 0xe5, 0xbc, 0xc6, 0x1b, 0xf3, 0x7f, 0x6f, 0x97, 0x55, 0xe2,
+	0xaf, 0xb6, 0xbc, 0x72, 0x1b, 0xfc, 0x2f, 0x7c, 0x05, 0x74, 0x73, 0xb9, 0xaf, 0x46, 0x3f, 0xfc,
+	0xe0, 0x28, 0xe7, 0x35, 0xba, 0x75, 0xbd, 0x47, 0x8f, 0x36, 0x19, 0x1a, 0x2f, 0xc2, 0x1d, 0x7b,
+	0x1f, 0xdf, 0x99, 0x19, 0x25, 0x9f, 0x51, 0x56, 0x22, 0x2e, 0x4a, 0x5c, 0x02, 0xeb, 0xa2, 0xc7,
+	0xcb, 0xb7, 0xfd, 0xe7, 0x2f, 0x7c, 0xee, 0xaa, 0x9f, 0x7e, 0xef, 0x24, 0x49, 0x7e, 0xf9, 0x87,
+	0x27, 0x7a, 0x64, 0x52, 0x48, 0xa4, 0xcb, 0x45, 0x35, 0x89, 0x51, 0x6a, 0x91, 0xbf, 0x2d, 0x66,
+	0x9a, 0x14, 0x72, 0xea, 0x30, 0xd3, 0x49, 0x3c, 0x75, 0x98, 0x6b, 0xff, 0x48, 0x37, 0x08, 0x49,
+	0x0a, 0x49, 0x88, 0x43, 0x11, 0x32, 0x89, 0x09, 0x71, 0xb8, 0xf3, 0x9d, 0xce, 0x6c, 0xfc, 0x37,
+	0x00, 0x00, 0xff, 0xff, 0xd3, 0x84, 0xd4, 0x16, 0x31, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/customer_feed.pb.go b/googleapis/ads/googleads/v3/resources/customer_feed.pb.go
new file mode 100644
index 0000000..7042a68
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/customer_feed.pb.go
@@ -0,0 +1,155 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/customer_feed.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A customer feed.
+type CustomerFeed struct {
+	// The resource name of the customer feed.
+	// Customer feed resource names have the form:
+	//
+	// `customers/{customer_id}/customerFeeds/{feed_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The feed being linked to the customer.
+	Feed *wrappers.StringValue `protobuf:"bytes,2,opt,name=feed,proto3" json:"feed,omitempty"`
+	// Indicates which placeholder types the feed may populate under the connected
+	// customer. Required.
+	PlaceholderTypes []enums.PlaceholderTypeEnum_PlaceholderType `protobuf:"varint,3,rep,packed,name=placeholder_types,json=placeholderTypes,proto3,enum=google.ads.googleads.v3.enums.PlaceholderTypeEnum_PlaceholderType" json:"placeholder_types,omitempty"`
+	// Matching function associated with the CustomerFeed.
+	// The matching function is used to filter the set of feed items selected.
+	// Required.
+	MatchingFunction *common.MatchingFunction `protobuf:"bytes,4,opt,name=matching_function,json=matchingFunction,proto3" json:"matching_function,omitempty"`
+	// Status of the customer feed.
+	// This field is read-only.
+	Status               enums.FeedLinkStatusEnum_FeedLinkStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.FeedLinkStatusEnum_FeedLinkStatus" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *CustomerFeed) Reset()         { *m = CustomerFeed{} }
+func (m *CustomerFeed) String() string { return proto.CompactTextString(m) }
+func (*CustomerFeed) ProtoMessage()    {}
+func (*CustomerFeed) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9924134ce68c2327, []int{0}
+}
+
+func (m *CustomerFeed) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerFeed.Unmarshal(m, b)
+}
+func (m *CustomerFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerFeed.Marshal(b, m, deterministic)
+}
+func (m *CustomerFeed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerFeed.Merge(m, src)
+}
+func (m *CustomerFeed) XXX_Size() int {
+	return xxx_messageInfo_CustomerFeed.Size(m)
+}
+func (m *CustomerFeed) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerFeed.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerFeed proto.InternalMessageInfo
+
+func (m *CustomerFeed) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CustomerFeed) GetFeed() *wrappers.StringValue {
+	if m != nil {
+		return m.Feed
+	}
+	return nil
+}
+
+func (m *CustomerFeed) GetPlaceholderTypes() []enums.PlaceholderTypeEnum_PlaceholderType {
+	if m != nil {
+		return m.PlaceholderTypes
+	}
+	return nil
+}
+
+func (m *CustomerFeed) GetMatchingFunction() *common.MatchingFunction {
+	if m != nil {
+		return m.MatchingFunction
+	}
+	return nil
+}
+
+func (m *CustomerFeed) GetStatus() enums.FeedLinkStatusEnum_FeedLinkStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.FeedLinkStatusEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*CustomerFeed)(nil), "google.ads.googleads.v3.resources.CustomerFeed")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/customer_feed.proto", fileDescriptor_9924134ce68c2327)
+}
+
+var fileDescriptor_9924134ce68c2327 = []byte{
+	// 513 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xdd, 0x6a, 0xd4, 0x40,
+	0x14, 0x26, 0xbb, 0xb5, 0x60, 0xac, 0xa5, 0x9b, 0xab, 0x58, 0x8a, 0x6c, 0x95, 0x85, 0xbd, 0x9a,
+	0x29, 0x1b, 0xf5, 0x22, 0xde, 0x98, 0x15, 0x5b, 0x10, 0x95, 0x25, 0x95, 0x45, 0x74, 0x35, 0x4c,
+	0x93, 0xb3, 0x69, 0x68, 0x66, 0x26, 0x64, 0x92, 0x4a, 0x91, 0xbe, 0x8c, 0x97, 0x3e, 0x8a, 0x8f,
+	0xd2, 0x1b, 0xdf, 0x40, 0x24, 0x93, 0x99, 0xd9, 0x1f, 0x59, 0xeb, 0xdd, 0x97, 0x73, 0xbe, 0xef,
+	0xcc, 0x39, 0xe7, 0xcb, 0xb1, 0x9f, 0xa6, 0x9c, 0xa7, 0x39, 0x60, 0x92, 0x08, 0xdc, 0xc2, 0x06,
+	0x5d, 0x7a, 0xb8, 0x04, 0xc1, 0xeb, 0x32, 0x06, 0x81, 0xe3, 0x5a, 0x54, 0x9c, 0x42, 0x19, 0xcd,
+	0x01, 0x12, 0x54, 0x94, 0xbc, 0xe2, 0xce, 0x61, 0xcb, 0x45, 0x24, 0x11, 0xc8, 0xc8, 0xd0, 0xa5,
+	0x87, 0x8c, 0x6c, 0xff, 0xd9, 0xa6, 0xca, 0x31, 0xa7, 0x94, 0x33, 0x4c, 0x49, 0x15, 0x9f, 0x67,
+	0x2c, 0x8d, 0xe6, 0x35, 0x8b, 0xab, 0x8c, 0xb3, 0xb6, 0xf4, 0xfe, 0x93, 0x4d, 0x3a, 0x60, 0x35,
+	0x15, 0xb8, 0x69, 0x22, 0xca, 0x33, 0x76, 0x11, 0x89, 0x8a, 0x54, 0xb5, 0xf8, 0x3f, 0x55, 0x91,
+	0x93, 0x18, 0xce, 0x79, 0x9e, 0x40, 0x19, 0x55, 0x57, 0x05, 0x28, 0xd5, 0x03, 0xad, 0x2a, 0x32,
+	0x33, 0xb0, 0x4a, 0x3d, 0x54, 0x29, 0xf9, 0x75, 0x56, 0xcf, 0xf1, 0xd7, 0x92, 0x14, 0x05, 0x94,
+	0xfa, 0xc1, 0x83, 0x25, 0x29, 0x61, 0x8c, 0x57, 0xa4, 0x99, 0x41, 0x65, 0x1f, 0xfd, 0xea, 0xda,
+	0x3b, 0x2f, 0xd5, 0xde, 0x8e, 0x01, 0x12, 0xe7, 0xb1, 0x7d, 0x5f, 0x3f, 0x10, 0x31, 0x42, 0xc1,
+	0xb5, 0xfa, 0xd6, 0xf0, 0x6e, 0xb8, 0xa3, 0x83, 0xef, 0x08, 0x05, 0xe7, 0xc8, 0xde, 0x6a, 0xc6,
+	0x73, 0x3b, 0x7d, 0x6b, 0x78, 0x6f, 0x74, 0xa0, 0x36, 0x8b, 0x74, 0x0b, 0xe8, 0xb4, 0x2a, 0x33,
+	0x96, 0x4e, 0x49, 0x5e, 0x43, 0x28, 0x99, 0x0e, 0xb7, 0x7b, 0xeb, 0xa3, 0x09, 0xb7, 0xdb, 0xef,
+	0x0e, 0x77, 0x47, 0x63, 0xb4, 0xc9, 0x23, 0xb9, 0x12, 0x34, 0x59, 0xe8, 0xde, 0x5f, 0x15, 0xf0,
+	0x8a, 0xd5, 0x74, 0x3d, 0x16, 0xee, 0x15, 0xab, 0x01, 0xe1, 0x7c, 0xb6, 0x7b, 0x7f, 0x19, 0xe7,
+	0x6e, 0xc9, 0x7e, 0x8f, 0x36, 0x3e, 0xd8, 0x3a, 0x8e, 0xde, 0x2a, 0xe1, 0xb1, 0xd2, 0x85, 0x7b,
+	0x74, 0x2d, 0xe2, 0x7c, 0xb0, 0xb7, 0x5b, 0x5b, 0xdd, 0x3b, 0x7d, 0x6b, 0xb8, 0x3b, 0x7a, 0x71,
+	0xcb, 0x10, 0xcd, 0x6e, 0xdf, 0x64, 0xec, 0xe2, 0x54, 0x8a, 0xe4, 0x0c, 0xab, 0xa1, 0x50, 0xd5,
+	0xf3, 0xbf, 0xdc, 0x04, 0x9f, 0xec, 0xc1, 0xa2, 0x84, 0x42, 0x45, 0x26, 0x9a, 0xf6, 0xf0, 0x8a,
+	0x59, 0x23, 0xfd, 0xcb, 0x0b, 0xfc, 0x4d, 0xc3, 0x6b, 0x73, 0x07, 0x0d, 0x65, 0x29, 0x21, 0xcf,
+	0xe2, 0x7a, 0xfc, 0xdb, 0xb2, 0x07, 0x31, 0xa7, 0xe8, 0xd6, 0xc3, 0x18, 0xf7, 0x96, 0xdf, 0x9a,
+	0x34, 0xde, 0x4e, 0xac, 0x8f, 0xaf, 0x95, 0x2e, 0xe5, 0x39, 0x61, 0x29, 0xe2, 0x65, 0x8a, 0x53,
+	0x60, 0xd2, 0x79, 0xbc, 0x68, 0xf5, 0x1f, 0x67, 0xfa, 0xdc, 0xa0, 0xef, 0x9d, 0xee, 0x49, 0x10,
+	0xfc, 0xe8, 0x1c, 0x9e, 0xb4, 0x25, 0x83, 0x44, 0xa0, 0x16, 0x36, 0x68, 0xea, 0xa1, 0x50, 0x33,
+	0x7f, 0x6a, 0xce, 0x2c, 0x48, 0xc4, 0xcc, 0x70, 0x66, 0x53, 0x6f, 0x66, 0x38, 0x37, 0x9d, 0x41,
+	0x9b, 0xf0, 0xfd, 0x20, 0x11, 0xbe, 0x6f, 0x58, 0xbe, 0x3f, 0xf5, 0x7c, 0xdf, 0xf0, 0xce, 0xb6,
+	0x65, 0xb3, 0xde, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xef, 0x32, 0x4d, 0x81, 0x52, 0x04, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/customer_label.pb.go b/googleapis/ads/googleads/v3/resources/customer_label.pb.go
new file mode 100644
index 0000000..8a576f6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/customer_label.pb.go
@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/customer_label.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Represents a relationship between a customer and a label. This customer may
+// not have access to all the labels attached to it. Additional CustomerLabels
+// may be returned by increasing permissions with login-customer-id.
+type CustomerLabel struct {
+	// Name of the resource.
+	// Customer label resource names have the form:
+	// `customers/{customer_id}/customerLabels/{label_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The resource name of the customer to which the label is attached.
+	// Read only.
+	Customer *wrappers.StringValue `protobuf:"bytes,2,opt,name=customer,proto3" json:"customer,omitempty"`
+	// The resource name of the label assigned to the customer.
+	//
+	// Note: the Customer ID portion of the label resource name is not
+	// validated when creating a new CustomerLabel.
+	Label                *wrappers.StringValue `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CustomerLabel) Reset()         { *m = CustomerLabel{} }
+func (m *CustomerLabel) String() string { return proto.CompactTextString(m) }
+func (*CustomerLabel) ProtoMessage()    {}
+func (*CustomerLabel) Descriptor() ([]byte, []int) {
+	return fileDescriptor_cb93c66565bf0f10, []int{0}
+}
+
+func (m *CustomerLabel) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerLabel.Unmarshal(m, b)
+}
+func (m *CustomerLabel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerLabel.Marshal(b, m, deterministic)
+}
+func (m *CustomerLabel) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerLabel.Merge(m, src)
+}
+func (m *CustomerLabel) XXX_Size() int {
+	return xxx_messageInfo_CustomerLabel.Size(m)
+}
+func (m *CustomerLabel) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerLabel.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerLabel proto.InternalMessageInfo
+
+func (m *CustomerLabel) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CustomerLabel) GetCustomer() *wrappers.StringValue {
+	if m != nil {
+		return m.Customer
+	}
+	return nil
+}
+
+func (m *CustomerLabel) GetLabel() *wrappers.StringValue {
+	if m != nil {
+		return m.Label
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CustomerLabel)(nil), "google.ads.googleads.v3.resources.CustomerLabel")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/customer_label.proto", fileDescriptor_cb93c66565bf0f10)
+}
+
+var fileDescriptor_cb93c66565bf0f10 = []byte{
+	// 369 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcf, 0x4a, 0xeb, 0x40,
+	0x14, 0xc6, 0x49, 0xca, 0xbd, 0xdc, 0x1b, 0xed, 0x26, 0xab, 0x5a, 0x8a, 0xb4, 0x4a, 0xa5, 0xab,
+	0x19, 0x68, 0x44, 0x64, 0x5c, 0xa5, 0x2e, 0x0a, 0x22, 0x52, 0x2a, 0x64, 0x21, 0xc1, 0x32, 0x4d,
+	0xc6, 0x10, 0x48, 0x66, 0xc2, 0x4c, 0x52, 0x17, 0xd2, 0xa5, 0x2f, 0xe2, 0xd2, 0x47, 0xf1, 0x51,
+	0xfa, 0x12, 0x4a, 0x32, 0x7f, 0xda, 0x6e, 0xd4, 0xdd, 0x97, 0x9c, 0xdf, 0x77, 0xce, 0x77, 0x66,
+	0xc6, 0xb9, 0x48, 0x18, 0x4b, 0x32, 0x02, 0x71, 0x2c, 0xa0, 0x94, 0xb5, 0x5a, 0x79, 0x90, 0x13,
+	0xc1, 0x2a, 0x1e, 0x11, 0x01, 0xa3, 0x4a, 0x94, 0x2c, 0x27, 0x7c, 0x91, 0xe1, 0x25, 0xc9, 0x40,
+	0xc1, 0x59, 0xc9, 0xdc, 0x81, 0x84, 0x01, 0x8e, 0x05, 0x30, 0x3e, 0xb0, 0xf2, 0x80, 0xf1, 0x75,
+	0x8f, 0x74, 0xeb, 0x22, 0x35, 0xdd, 0xa4, 0xbb, 0x7b, 0xac, 0x4a, 0xcd, 0xd7, 0xb2, 0x7a, 0x82,
+	0xcf, 0x1c, 0x17, 0x05, 0xe1, 0x42, 0xd5, 0x7b, 0x3b, 0x56, 0x4c, 0x29, 0x2b, 0x71, 0x99, 0x32,
+	0xaa, 0xaa, 0x27, 0xaf, 0xb6, 0xd3, 0xbe, 0x56, 0xa1, 0x6e, 0xeb, 0x4c, 0xee, 0xa9, 0xd3, 0xd6,
+	0x13, 0x16, 0x14, 0xe7, 0xa4, 0x63, 0xf5, 0xad, 0xd1, 0xff, 0xf9, 0xa1, 0xfe, 0x79, 0x87, 0x73,
+	0xe2, 0x5e, 0x3a, 0xff, 0xf4, 0x2a, 0x1d, 0xbb, 0x6f, 0x8d, 0x0e, 0xc6, 0x3d, 0x15, 0x1d, 0xe8,
+	0x1c, 0xe0, 0xbe, 0xe4, 0x29, 0x4d, 0x02, 0x9c, 0x55, 0x64, 0x6e, 0x68, 0x77, 0xec, 0xfc, 0x69,
+	0x76, 0xef, 0xb4, 0x7e, 0x61, 0x93, 0x28, 0xc2, 0x1b, 0xff, 0xd1, 0x39, 0xdb, 0x1e, 0x8d, 0x52,
+	0x45, 0x2a, 0x40, 0xc4, 0x72, 0xb8, 0x9f, 0xff, 0x5c, 0x8f, 0x12, 0xf0, 0x45, 0xcb, 0xb5, 0x39,
+	0xf8, 0x86, 0xd9, 0xa9, 0xc8, 0x8b, 0x58, 0x4f, 0x3e, 0x2d, 0x67, 0x18, 0xb1, 0x1c, 0xfc, 0x78,
+	0x15, 0x13, 0x77, 0x6f, 0xdc, 0xac, 0x8e, 0x3d, 0xb3, 0x1e, 0x6e, 0x94, 0x31, 0x61, 0x19, 0xa6,
+	0x09, 0x60, 0x3c, 0x81, 0x09, 0xa1, 0xcd, 0x52, 0x70, 0x1b, 0xf7, 0x9b, 0xa7, 0x71, 0x65, 0xd4,
+	0x9b, 0xdd, 0x9a, 0xfa, 0xfe, 0xbb, 0x3d, 0x98, 0xca, 0x96, 0x7e, 0x2c, 0x80, 0x94, 0xb5, 0x0a,
+	0x3c, 0x30, 0xd7, 0xe4, 0x87, 0x66, 0x42, 0x3f, 0x16, 0xa1, 0x61, 0xc2, 0xc0, 0x0b, 0x0d, 0xb3,
+	0xb1, 0x87, 0xb2, 0x80, 0x90, 0x1f, 0x0b, 0x84, 0x0c, 0x85, 0x50, 0xe0, 0x21, 0x64, 0xb8, 0xe5,
+	0xdf, 0x26, 0xac, 0xf7, 0x15, 0x00, 0x00, 0xff, 0xff, 0x73, 0xf2, 0x1e, 0xa2, 0xc6, 0x02, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/customer_manager_link.pb.go b/googleapis/ads/googleads/v3/resources/customer_manager_link.pb.go
new file mode 100644
index 0000000..3d30c75
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/customer_manager_link.pb.go
@@ -0,0 +1,136 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/customer_manager_link.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Represents customer-manager link relationship.
+type CustomerManagerLink struct {
+	// Name of the resource.
+	// CustomerManagerLink resource names have the form:
+	// `customers/{customer_id}/customerManagerLinks/{manager_customer_id}~{manager_link_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The manager customer linked to the customer.
+	ManagerCustomer *wrappers.StringValue `protobuf:"bytes,3,opt,name=manager_customer,json=managerCustomer,proto3" json:"manager_customer,omitempty"`
+	// ID of the customer-manager link. This field is read only.
+	ManagerLinkId *wrappers.Int64Value `protobuf:"bytes,4,opt,name=manager_link_id,json=managerLinkId,proto3" json:"manager_link_id,omitempty"`
+	// Status of the link between the customer and the manager.
+	Status               enums.ManagerLinkStatusEnum_ManagerLinkStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.ManagerLinkStatusEnum_ManagerLinkStatus" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
+	XXX_unrecognized     []byte                                        `json:"-"`
+	XXX_sizecache        int32                                         `json:"-"`
+}
+
+func (m *CustomerManagerLink) Reset()         { *m = CustomerManagerLink{} }
+func (m *CustomerManagerLink) String() string { return proto.CompactTextString(m) }
+func (*CustomerManagerLink) ProtoMessage()    {}
+func (*CustomerManagerLink) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f371b86257a487a2, []int{0}
+}
+
+func (m *CustomerManagerLink) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerManagerLink.Unmarshal(m, b)
+}
+func (m *CustomerManagerLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerManagerLink.Marshal(b, m, deterministic)
+}
+func (m *CustomerManagerLink) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerManagerLink.Merge(m, src)
+}
+func (m *CustomerManagerLink) XXX_Size() int {
+	return xxx_messageInfo_CustomerManagerLink.Size(m)
+}
+func (m *CustomerManagerLink) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerManagerLink.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerManagerLink proto.InternalMessageInfo
+
+func (m *CustomerManagerLink) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CustomerManagerLink) GetManagerCustomer() *wrappers.StringValue {
+	if m != nil {
+		return m.ManagerCustomer
+	}
+	return nil
+}
+
+func (m *CustomerManagerLink) GetManagerLinkId() *wrappers.Int64Value {
+	if m != nil {
+		return m.ManagerLinkId
+	}
+	return nil
+}
+
+func (m *CustomerManagerLink) GetStatus() enums.ManagerLinkStatusEnum_ManagerLinkStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.ManagerLinkStatusEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*CustomerManagerLink)(nil), "google.ads.googleads.v3.resources.CustomerManagerLink")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/customer_manager_link.proto", fileDescriptor_f371b86257a487a2)
+}
+
+var fileDescriptor_f371b86257a487a2 = []byte{
+	// 453 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x4d, 0x6b, 0xd5, 0x40,
+	0x14, 0x25, 0xef, 0x69, 0xc1, 0xd1, 0x5a, 0x89, 0x9b, 0x58, 0x8b, 0xbc, 0x2a, 0x85, 0xb7, 0x90,
+	0x19, 0x68, 0x44, 0x61, 0xc4, 0x45, 0x5a, 0xf4, 0x51, 0x51, 0x29, 0xaf, 0xf0, 0x16, 0x12, 0x0c,
+	0xd3, 0x64, 0x1c, 0x42, 0x33, 0x33, 0x71, 0x66, 0x52, 0x17, 0xd2, 0xa5, 0x7f, 0xc3, 0x85, 0x4b,
+	0x7f, 0x8a, 0x3f, 0xa5, 0xbf, 0x42, 0x5e, 0xe6, 0xe3, 0xa5, 0xb4, 0xb5, 0xbb, 0x93, 0xb9, 0xe7,
+	0x9c, 0x7b, 0xef, 0xc9, 0x05, 0x6f, 0x98, 0x94, 0xac, 0xa1, 0x88, 0x54, 0x1a, 0x59, 0xb8, 0x44,
+	0xa7, 0x29, 0x52, 0x54, 0xcb, 0x4e, 0x95, 0x54, 0xa3, 0xb2, 0xd3, 0x46, 0x72, 0xaa, 0x0a, 0x4e,
+	0x04, 0x61, 0x54, 0x15, 0x4d, 0x2d, 0x4e, 0x60, 0xab, 0xa4, 0x91, 0xf1, 0xb6, 0xd5, 0x40, 0x52,
+	0x69, 0x18, 0xe4, 0xf0, 0x34, 0x85, 0x41, 0xbe, 0xf9, 0xea, 0xba, 0x0e, 0x54, 0x74, 0x5c, 0xa3,
+	0xa1, 0x69, 0xa1, 0x0d, 0x31, 0x9d, 0xb6, 0xde, 0x9b, 0x8f, 0xbc, 0xb0, 0xad, 0xc3, 0x34, 0xae,
+	0xf4, 0xc4, 0x95, 0xfa, 0xaf, 0xe3, 0xee, 0x2b, 0xfa, 0xae, 0x48, 0xdb, 0x52, 0xe5, 0xa5, 0x5b,
+	0x03, 0x29, 0x11, 0x42, 0x1a, 0x62, 0x6a, 0x29, 0x5c, 0xf5, 0xe9, 0xaf, 0x31, 0x78, 0xb8, 0xef,
+	0x96, 0xfa, 0x68, 0xdb, 0x7f, 0xa8, 0xc5, 0x49, 0xfc, 0x0c, 0xac, 0xfb, 0x3e, 0x85, 0x20, 0x9c,
+	0x26, 0xd1, 0x24, 0x9a, 0xde, 0x99, 0xdf, 0xf3, 0x8f, 0x9f, 0x08, 0xa7, 0xf1, 0x0c, 0x3c, 0xf0,
+	0x23, 0xfb, 0x60, 0x92, 0xf1, 0x24, 0x9a, 0xde, 0xdd, 0xdd, 0x72, 0x09, 0x40, 0x3f, 0x15, 0x3c,
+	0x32, 0xaa, 0x16, 0x6c, 0x41, 0x9a, 0x8e, 0xce, 0x37, 0x9c, 0xca, 0x37, 0x8e, 0xf7, 0xc1, 0xc6,
+	0x85, 0xdd, 0xeb, 0x2a, 0xb9, 0xd5, 0xfb, 0x3c, 0xbe, 0xe4, 0x73, 0x20, 0xcc, 0xcb, 0x17, 0xd6,
+	0x66, 0x9d, 0xaf, 0x06, 0x3e, 0xa8, 0xe2, 0x2f, 0x60, 0xcd, 0x66, 0x96, 0xdc, 0x9e, 0x44, 0xd3,
+	0xfb, 0xbb, 0xef, 0xe0, 0x75, 0x3f, 0xa4, 0x4f, 0x1b, 0x0e, 0xd6, 0x3d, 0xea, 0x75, 0x6f, 0x45,
+	0xc7, 0x2f, 0xbf, 0xce, 0x9d, 0x2b, 0x36, 0xe7, 0xd9, 0x37, 0xf0, 0x7c, 0x65, 0xe4, 0x50, 0x5b,
+	0x6b, 0x58, 0x4a, 0x8e, 0xae, 0x4a, 0x31, 0xf3, 0xb1, 0x68, 0xf4, 0xc3, 0xc3, 0xb3, 0x70, 0x44,
+	0x03, 0xe6, 0xa0, 0x7e, 0xe1, 0xb4, 0xce, 0xf6, 0x7e, 0x8e, 0xc0, 0x4e, 0x29, 0x39, 0xbc, 0xf1,
+	0xb8, 0xf6, 0x92, 0x2b, 0x26, 0x38, 0x5c, 0xc6, 0x76, 0x18, 0x7d, 0x7e, 0xef, 0xe4, 0x4c, 0x36,
+	0x44, 0x30, 0x28, 0x15, 0x43, 0x8c, 0x8a, 0x3e, 0x54, 0xb4, 0xda, 0xe3, 0x3f, 0x97, 0xff, 0x3a,
+	0xa0, 0xdf, 0xa3, 0xf1, 0x2c, 0xcb, 0xfe, 0x8c, 0xb6, 0x67, 0xd6, 0x32, 0xab, 0x34, 0xb4, 0x70,
+	0x89, 0x16, 0x29, 0x9c, 0x7b, 0xe6, 0x5f, 0xcf, 0xc9, 0xb3, 0x4a, 0xe7, 0x81, 0x93, 0x2f, 0xd2,
+	0x3c, 0x70, 0xce, 0x47, 0x3b, 0xb6, 0x80, 0x71, 0x56, 0x69, 0x8c, 0x03, 0x0b, 0xe3, 0x45, 0x8a,
+	0x71, 0xe0, 0x1d, 0xaf, 0xf5, 0xc3, 0xa6, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x19, 0x12, 0x3a,
+	0xfc, 0xa5, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/customer_negative_criterion.pb.go b/googleapis/ads/googleads/v3/resources/customer_negative_criterion.pb.go
new file mode 100644
index 0000000..fb4e1d3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/customer_negative_criterion.pb.go
@@ -0,0 +1,252 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/customer_negative_criterion.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A negative criterion for exclusions at the customer level.
+type CustomerNegativeCriterion struct {
+	// The resource name of the customer negative criterion.
+	// Customer negative criterion resource names have the form:
+	//
+	// `customers/{customer_id}/customerNegativeCriteria/{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the criterion.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The type of the criterion.
+	Type enums.CriterionTypeEnum_CriterionType `protobuf:"varint,3,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.CriterionTypeEnum_CriterionType" json:"type,omitempty"`
+	// The customer negative criterion.
+	//
+	// Exactly one must be set.
+	//
+	// Types that are valid to be assigned to Criterion:
+	//	*CustomerNegativeCriterion_ContentLabel
+	//	*CustomerNegativeCriterion_MobileApplication
+	//	*CustomerNegativeCriterion_MobileAppCategory
+	//	*CustomerNegativeCriterion_Placement
+	//	*CustomerNegativeCriterion_YoutubeVideo
+	//	*CustomerNegativeCriterion_YoutubeChannel
+	Criterion            isCustomerNegativeCriterion_Criterion `protobuf_oneof:"criterion"`
+	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
+	XXX_unrecognized     []byte                                `json:"-"`
+	XXX_sizecache        int32                                 `json:"-"`
+}
+
+func (m *CustomerNegativeCriterion) Reset()         { *m = CustomerNegativeCriterion{} }
+func (m *CustomerNegativeCriterion) String() string { return proto.CompactTextString(m) }
+func (*CustomerNegativeCriterion) ProtoMessage()    {}
+func (*CustomerNegativeCriterion) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9b7ecee4f1a6dde8, []int{0}
+}
+
+func (m *CustomerNegativeCriterion) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerNegativeCriterion.Unmarshal(m, b)
+}
+func (m *CustomerNegativeCriterion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerNegativeCriterion.Marshal(b, m, deterministic)
+}
+func (m *CustomerNegativeCriterion) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerNegativeCriterion.Merge(m, src)
+}
+func (m *CustomerNegativeCriterion) XXX_Size() int {
+	return xxx_messageInfo_CustomerNegativeCriterion.Size(m)
+}
+func (m *CustomerNegativeCriterion) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerNegativeCriterion.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerNegativeCriterion proto.InternalMessageInfo
+
+func (m *CustomerNegativeCriterion) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *CustomerNegativeCriterion) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *CustomerNegativeCriterion) GetType() enums.CriterionTypeEnum_CriterionType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.CriterionTypeEnum_UNSPECIFIED
+}
+
+type isCustomerNegativeCriterion_Criterion interface {
+	isCustomerNegativeCriterion_Criterion()
+}
+
+type CustomerNegativeCriterion_ContentLabel struct {
+	ContentLabel *common.ContentLabelInfo `protobuf:"bytes,4,opt,name=content_label,json=contentLabel,proto3,oneof"`
+}
+
+type CustomerNegativeCriterion_MobileApplication struct {
+	MobileApplication *common.MobileApplicationInfo `protobuf:"bytes,5,opt,name=mobile_application,json=mobileApplication,proto3,oneof"`
+}
+
+type CustomerNegativeCriterion_MobileAppCategory struct {
+	MobileAppCategory *common.MobileAppCategoryInfo `protobuf:"bytes,6,opt,name=mobile_app_category,json=mobileAppCategory,proto3,oneof"`
+}
+
+type CustomerNegativeCriterion_Placement struct {
+	Placement *common.PlacementInfo `protobuf:"bytes,7,opt,name=placement,proto3,oneof"`
+}
+
+type CustomerNegativeCriterion_YoutubeVideo struct {
+	YoutubeVideo *common.YouTubeVideoInfo `protobuf:"bytes,8,opt,name=youtube_video,json=youtubeVideo,proto3,oneof"`
+}
+
+type CustomerNegativeCriterion_YoutubeChannel struct {
+	YoutubeChannel *common.YouTubeChannelInfo `protobuf:"bytes,9,opt,name=youtube_channel,json=youtubeChannel,proto3,oneof"`
+}
+
+func (*CustomerNegativeCriterion_ContentLabel) isCustomerNegativeCriterion_Criterion() {}
+
+func (*CustomerNegativeCriterion_MobileApplication) isCustomerNegativeCriterion_Criterion() {}
+
+func (*CustomerNegativeCriterion_MobileAppCategory) isCustomerNegativeCriterion_Criterion() {}
+
+func (*CustomerNegativeCriterion_Placement) isCustomerNegativeCriterion_Criterion() {}
+
+func (*CustomerNegativeCriterion_YoutubeVideo) isCustomerNegativeCriterion_Criterion() {}
+
+func (*CustomerNegativeCriterion_YoutubeChannel) isCustomerNegativeCriterion_Criterion() {}
+
+func (m *CustomerNegativeCriterion) GetCriterion() isCustomerNegativeCriterion_Criterion {
+	if m != nil {
+		return m.Criterion
+	}
+	return nil
+}
+
+func (m *CustomerNegativeCriterion) GetContentLabel() *common.ContentLabelInfo {
+	if x, ok := m.GetCriterion().(*CustomerNegativeCriterion_ContentLabel); ok {
+		return x.ContentLabel
+	}
+	return nil
+}
+
+func (m *CustomerNegativeCriterion) GetMobileApplication() *common.MobileApplicationInfo {
+	if x, ok := m.GetCriterion().(*CustomerNegativeCriterion_MobileApplication); ok {
+		return x.MobileApplication
+	}
+	return nil
+}
+
+func (m *CustomerNegativeCriterion) GetMobileAppCategory() *common.MobileAppCategoryInfo {
+	if x, ok := m.GetCriterion().(*CustomerNegativeCriterion_MobileAppCategory); ok {
+		return x.MobileAppCategory
+	}
+	return nil
+}
+
+func (m *CustomerNegativeCriterion) GetPlacement() *common.PlacementInfo {
+	if x, ok := m.GetCriterion().(*CustomerNegativeCriterion_Placement); ok {
+		return x.Placement
+	}
+	return nil
+}
+
+func (m *CustomerNegativeCriterion) GetYoutubeVideo() *common.YouTubeVideoInfo {
+	if x, ok := m.GetCriterion().(*CustomerNegativeCriterion_YoutubeVideo); ok {
+		return x.YoutubeVideo
+	}
+	return nil
+}
+
+func (m *CustomerNegativeCriterion) GetYoutubeChannel() *common.YouTubeChannelInfo {
+	if x, ok := m.GetCriterion().(*CustomerNegativeCriterion_YoutubeChannel); ok {
+		return x.YoutubeChannel
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CustomerNegativeCriterion) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CustomerNegativeCriterion_ContentLabel)(nil),
+		(*CustomerNegativeCriterion_MobileApplication)(nil),
+		(*CustomerNegativeCriterion_MobileAppCategory)(nil),
+		(*CustomerNegativeCriterion_Placement)(nil),
+		(*CustomerNegativeCriterion_YoutubeVideo)(nil),
+		(*CustomerNegativeCriterion_YoutubeChannel)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*CustomerNegativeCriterion)(nil), "google.ads.googleads.v3.resources.CustomerNegativeCriterion")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/customer_negative_criterion.proto", fileDescriptor_9b7ecee4f1a6dde8)
+}
+
+var fileDescriptor_9b7ecee4f1a6dde8 = []byte{
+	// 621 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xdf, 0x6a, 0xd4, 0x40,
+	0x14, 0xc6, 0x4d, 0x5a, 0x5b, 0x77, 0xfa, 0x47, 0x8c, 0x37, 0x69, 0x95, 0xd2, 0x2a, 0x85, 0x82,
+	0x74, 0x22, 0xbb, 0xea, 0x45, 0x04, 0x21, 0x5d, 0xa4, 0x56, 0x6d, 0x29, 0x4b, 0x59, 0x51, 0x56,
+	0xc2, 0x6c, 0x72, 0x1a, 0x03, 0xc9, 0x4c, 0xc8, 0x4c, 0x56, 0x16, 0xe9, 0x85, 0x17, 0xe2, 0x85,
+	0x6f, 0xe1, 0xa5, 0x8f, 0xe2, 0xa3, 0xf4, 0x29, 0x24, 0x93, 0x99, 0xd9, 0x5a, 0x5d, 0xb7, 0xde,
+	0x9d, 0x3d, 0xe7, 0x7c, 0xbf, 0x73, 0xf2, 0x2d, 0x73, 0x50, 0x37, 0x61, 0x2c, 0xc9, 0xc0, 0x23,
+	0x31, 0xf7, 0x9a, 0xb0, 0x8e, 0x46, 0x1d, 0xaf, 0x04, 0xce, 0xaa, 0x32, 0x02, 0xee, 0x45, 0x15,
+	0x17, 0x2c, 0x87, 0x32, 0xa4, 0x90, 0x10, 0x91, 0x8e, 0x20, 0x8c, 0xca, 0x54, 0x40, 0x99, 0x32,
+	0x8a, 0x8b, 0x92, 0x09, 0xe6, 0x6c, 0x35, 0x4a, 0x4c, 0x62, 0x8e, 0x0d, 0x04, 0x8f, 0x3a, 0xd8,
+	0x40, 0xd6, 0x77, 0xa7, 0xcd, 0x89, 0x58, 0x9e, 0x33, 0xea, 0x29, 0x24, 0x69, 0x88, 0xeb, 0xed,
+	0x69, 0xed, 0x40, 0xab, 0x9c, 0x7b, 0x66, 0x81, 0x50, 0x8c, 0x0b, 0x50, 0x9a, 0x35, 0xad, 0x29,
+	0x52, 0xb3, 0xbd, 0x2a, 0x6d, 0xa8, 0x92, 0xfc, 0x35, 0xac, 0x4e, 0xbd, 0x8f, 0x25, 0x29, 0x0a,
+	0x28, 0xb9, 0xaa, 0xdf, 0xbd, 0x20, 0x25, 0x94, 0x32, 0x41, 0x44, 0xca, 0xa8, 0xaa, 0xde, 0xfb,
+	0xba, 0x88, 0xd6, 0xba, 0xca, 0x84, 0x23, 0xe5, 0x41, 0x57, 0x6f, 0xe0, 0xdc, 0x47, 0x2b, 0x7a,
+	0x5a, 0x48, 0x49, 0x0e, 0xae, 0xb5, 0x69, 0xed, 0xb4, 0x7a, 0xcb, 0x3a, 0x79, 0x44, 0x72, 0x70,
+	0x1e, 0x20, 0x3b, 0x8d, 0x5d, 0x7b, 0xd3, 0xda, 0x59, 0x6a, 0xdf, 0x51, 0x1e, 0x61, 0xbd, 0x0d,
+	0x3e, 0xa0, 0xe2, 0xc9, 0xa3, 0x3e, 0xc9, 0x2a, 0xe8, 0xd9, 0x69, 0xec, 0xf4, 0xd0, 0x7c, 0xfd,
+	0x59, 0xee, 0xdc, 0xa6, 0xb5, 0xb3, 0xda, 0x7e, 0x86, 0xa7, 0xb9, 0x2b, 0xbd, 0xc0, 0x66, 0x93,
+	0x93, 0x71, 0x01, 0xcf, 0x69, 0x95, 0xff, 0x9e, 0xe9, 0x49, 0x96, 0xf3, 0x06, 0xad, 0x44, 0x8c,
+	0x0a, 0xa0, 0x22, 0xcc, 0xc8, 0x10, 0x32, 0x77, 0x5e, 0xee, 0xf2, 0x70, 0x2a, 0xbc, 0xf9, 0x5f,
+	0x70, 0xb7, 0x11, 0xbd, 0xae, 0x35, 0x07, 0xf4, 0x94, 0xbd, 0xb8, 0xd6, 0x5b, 0x8e, 0x2e, 0xe4,
+	0x9c, 0x53, 0xe4, 0xe4, 0x6c, 0x98, 0x66, 0x10, 0x92, 0xa2, 0xc8, 0xd2, 0x48, 0x3a, 0xe7, 0x5e,
+	0x97, 0xf4, 0xc7, 0xb3, 0xe8, 0x87, 0x52, 0x19, 0x4c, 0x84, 0x6a, 0xc4, 0xad, 0xfc, 0x72, 0xc1,
+	0x49, 0xd0, 0xed, 0xc9, 0x9c, 0x30, 0x22, 0x02, 0x12, 0x56, 0x8e, 0xdd, 0x85, 0xff, 0x1c, 0xd4,
+	0x55, 0xc2, 0x3f, 0x06, 0xe9, 0x82, 0x73, 0x88, 0x5a, 0x45, 0x46, 0x22, 0xc8, 0x81, 0x0a, 0x77,
+	0x51, 0xe2, 0x77, 0x67, 0xe1, 0x8f, 0xb5, 0x40, 0x61, 0x27, 0x84, 0xda, 0xf8, 0x31, 0xab, 0x44,
+	0x35, 0x84, 0x70, 0x94, 0xc6, 0xc0, 0xdc, 0x1b, 0x57, 0x33, 0xfe, 0x2d, 0xab, 0x4e, 0xaa, 0x21,
+	0xf4, 0x6b, 0x8d, 0x36, 0x5e, 0x81, 0x64, 0xce, 0x79, 0x8f, 0x6e, 0x6a, 0x70, 0xf4, 0x81, 0x50,
+	0x0a, 0x99, 0xdb, 0x92, 0xe8, 0xf6, 0x15, 0xd1, 0xdd, 0x46, 0xa5, 0xe0, 0xab, 0x0a, 0xa6, 0xb2,
+	0xfe, 0x17, 0xeb, 0x3c, 0xf8, 0x6c, 0xa1, 0xf6, 0x04, 0xa0, 0xa2, 0x22, 0xe5, 0x35, 0xc8, 0x9b,
+	0xfe, 0x22, 0x5e, 0xe9, 0x8b, 0xc1, 0xbd, 0x4f, 0x3a, 0x3c, 0x33, 0x67, 0xe4, 0x52, 0x3f, 0x99,
+	0xf4, 0xfc, 0xe5, 0xc0, 0x9c, 0xed, 0x2d, 0xa1, 0x96, 0xf9, 0xb5, 0xf7, 0xcd, 0x46, 0xdb, 0x11,
+	0xcb, 0xf1, 0xcc, 0x7b, 0xb3, 0xb7, 0x31, 0x75, 0xbd, 0xe3, 0xfa, 0xd5, 0x1d, 0x5b, 0xef, 0x5e,
+	0x2a, 0x48, 0xc2, 0x32, 0x42, 0x13, 0xcc, 0xca, 0xc4, 0x4b, 0x80, 0xca, 0x37, 0xe9, 0x4d, 0x3e,
+	0xf5, 0x1f, 0x87, 0xf1, 0xa9, 0x89, 0xbe, 0xdb, 0x73, 0xfb, 0x41, 0xf0, 0xc3, 0xde, 0xda, 0x6f,
+	0x90, 0x41, 0xcc, 0x71, 0x13, 0xd6, 0x51, 0xbf, 0x83, 0x7b, 0xba, 0xf3, 0xa7, 0xee, 0x19, 0x04,
+	0x31, 0x1f, 0x98, 0x9e, 0x41, 0xbf, 0x33, 0x30, 0x3d, 0xe7, 0xf6, 0x76, 0x53, 0xf0, 0xfd, 0x20,
+	0xe6, 0xbe, 0x6f, 0xba, 0x7c, 0xbf, 0xdf, 0xf1, 0x7d, 0xd3, 0x37, 0x5c, 0x90, 0xcb, 0x76, 0x7e,
+	0x05, 0x00, 0x00, 0xff, 0xff, 0x44, 0xcf, 0xca, 0x20, 0xc4, 0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/detail_placement_view.pb.go b/googleapis/ads/googleads/v3/resources/detail_placement_view.pb.go
new file mode 100644
index 0000000..4fa0e42
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/detail_placement_view.pb.go
@@ -0,0 +1,161 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/detail_placement_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A view with metrics aggregated by ad group and URL or YouTube video.
+type DetailPlacementView struct {
+	// The resource name of the detail placement view.
+	// Detail placement view resource names have the form:
+	//
+	// `customers/{customer_id}/detailPlacementViews/{ad_group_id}~{base64_placement}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The automatic placement string at detail level, e. g. website URL, mobile
+	// application ID, or a YouTube video ID.
+	Placement *wrappers.StringValue `protobuf:"bytes,2,opt,name=placement,proto3" json:"placement,omitempty"`
+	// The display name is URL name for websites, YouTube video name for YouTube
+	// videos, and translated mobile app name for mobile apps.
+	DisplayName *wrappers.StringValue `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
+	// URL of the group placement, e.g. domain, link to the mobile application in
+	// app store, or a YouTube channel URL.
+	GroupPlacementTargetUrl *wrappers.StringValue `protobuf:"bytes,4,opt,name=group_placement_target_url,json=groupPlacementTargetUrl,proto3" json:"group_placement_target_url,omitempty"`
+	// URL of the placement, e.g. website, link to the mobile application in app
+	// store, or a YouTube video URL.
+	TargetUrl *wrappers.StringValue `protobuf:"bytes,5,opt,name=target_url,json=targetUrl,proto3" json:"target_url,omitempty"`
+	// Type of the placement, e.g. Website, YouTube Video, and Mobile Application.
+	PlacementType        enums.PlacementTypeEnum_PlacementType `protobuf:"varint,6,opt,name=placement_type,json=placementType,proto3,enum=google.ads.googleads.v3.enums.PlacementTypeEnum_PlacementType" json:"placement_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
+	XXX_unrecognized     []byte                                `json:"-"`
+	XXX_sizecache        int32                                 `json:"-"`
+}
+
+func (m *DetailPlacementView) Reset()         { *m = DetailPlacementView{} }
+func (m *DetailPlacementView) String() string { return proto.CompactTextString(m) }
+func (*DetailPlacementView) ProtoMessage()    {}
+func (*DetailPlacementView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_55e3b8e503380d64, []int{0}
+}
+
+func (m *DetailPlacementView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DetailPlacementView.Unmarshal(m, b)
+}
+func (m *DetailPlacementView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DetailPlacementView.Marshal(b, m, deterministic)
+}
+func (m *DetailPlacementView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DetailPlacementView.Merge(m, src)
+}
+func (m *DetailPlacementView) XXX_Size() int {
+	return xxx_messageInfo_DetailPlacementView.Size(m)
+}
+func (m *DetailPlacementView) XXX_DiscardUnknown() {
+	xxx_messageInfo_DetailPlacementView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DetailPlacementView proto.InternalMessageInfo
+
+func (m *DetailPlacementView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *DetailPlacementView) GetPlacement() *wrappers.StringValue {
+	if m != nil {
+		return m.Placement
+	}
+	return nil
+}
+
+func (m *DetailPlacementView) GetDisplayName() *wrappers.StringValue {
+	if m != nil {
+		return m.DisplayName
+	}
+	return nil
+}
+
+func (m *DetailPlacementView) GetGroupPlacementTargetUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.GroupPlacementTargetUrl
+	}
+	return nil
+}
+
+func (m *DetailPlacementView) GetTargetUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.TargetUrl
+	}
+	return nil
+}
+
+func (m *DetailPlacementView) GetPlacementType() enums.PlacementTypeEnum_PlacementType {
+	if m != nil {
+		return m.PlacementType
+	}
+	return enums.PlacementTypeEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*DetailPlacementView)(nil), "google.ads.googleads.v3.resources.DetailPlacementView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/detail_placement_view.proto", fileDescriptor_55e3b8e503380d64)
+}
+
+var fileDescriptor_55e3b8e503380d64 = []byte{
+	// 483 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xdd, 0x6a, 0xdb, 0x30,
+	0x14, 0x26, 0x6e, 0x57, 0xa8, 0xfa, 0x73, 0xe1, 0x5d, 0xcc, 0x0b, 0x65, 0xa4, 0x1b, 0x85, 0x5c,
+	0x0c, 0x09, 0xe2, 0x3b, 0x95, 0x6d, 0xb8, 0x6c, 0x14, 0x76, 0x31, 0x42, 0xb6, 0x19, 0x36, 0x02,
+	0x41, 0xb5, 0xcf, 0x8c, 0xc1, 0x96, 0x34, 0x49, 0x4e, 0x08, 0xa5, 0x97, 0x7b, 0x91, 0x5d, 0x8e,
+	0x3d, 0xc9, 0x1e, 0xa5, 0x4f, 0x31, 0x62, 0xcb, 0x72, 0x02, 0xe9, 0x96, 0xbb, 0x4f, 0x3a, 0xdf,
+	0xf7, 0x9d, 0x73, 0x74, 0x8e, 0xd0, 0xab, 0x4c, 0x88, 0xac, 0x00, 0xc2, 0x52, 0x4d, 0x1a, 0xb8,
+	0x42, 0xf3, 0x90, 0x28, 0xd0, 0xa2, 0x52, 0x09, 0x68, 0x92, 0x82, 0x61, 0x79, 0x31, 0x93, 0x05,
+	0x4b, 0xa0, 0x04, 0x6e, 0x66, 0xf3, 0x1c, 0x16, 0x58, 0x2a, 0x61, 0x84, 0x7f, 0xde, 0x68, 0x30,
+	0x4b, 0x35, 0x76, 0x72, 0x3c, 0x0f, 0xb1, 0x93, 0xf7, 0x47, 0x0f, 0x65, 0x00, 0x5e, 0x95, 0x9a,
+	0x74, 0xb6, 0x66, 0x29, 0xa1, 0xb1, 0xed, 0x3f, 0x6d, 0x35, 0x32, 0x77, 0x85, 0xd8, 0xd0, 0x33,
+	0x1b, 0xaa, 0x4f, 0x37, 0xd5, 0x37, 0xb2, 0x50, 0x4c, 0x4a, 0x50, 0xda, 0xc6, 0xcf, 0xd6, 0xa4,
+	0x8c, 0x73, 0x61, 0x98, 0xc9, 0x05, 0xb7, 0xd1, 0xe7, 0xbf, 0xf7, 0xd1, 0xe3, 0xb7, 0x75, 0x3f,
+	0xe3, 0x36, 0x6f, 0x9c, 0xc3, 0xc2, 0x7f, 0x81, 0x4e, 0xda, 0x3c, 0x33, 0xce, 0x4a, 0x08, 0x7a,
+	0x83, 0xde, 0xf0, 0x70, 0x72, 0xdc, 0x5e, 0x7e, 0x60, 0x25, 0xf8, 0x14, 0x1d, 0xba, 0x6a, 0x03,
+	0x6f, 0xd0, 0x1b, 0x1e, 0x8d, 0xce, 0x6c, 0xd7, 0xb8, 0x2d, 0x07, 0x7f, 0x34, 0x2a, 0xe7, 0x59,
+	0xcc, 0x8a, 0x0a, 0x26, 0x1d, 0xdd, 0x7f, 0x83, 0x8e, 0xd3, 0x5c, 0xcb, 0x82, 0x2d, 0x1b, 0xff,
+	0xbd, 0x1d, 0xe4, 0x47, 0x56, 0x51, 0x27, 0xff, 0x82, 0xfa, 0x99, 0x12, 0x95, 0x5c, 0x9b, 0x83,
+	0x61, 0x2a, 0x03, 0x33, 0xab, 0x54, 0x11, 0xec, 0xef, 0x60, 0xf7, 0xa4, 0xd6, 0xbb, 0xbe, 0x3f,
+	0xd5, 0xea, 0xcf, 0xaa, 0xf0, 0x2f, 0x11, 0x5a, 0xb3, 0x7a, 0xb4, 0x4b, 0x63, 0xc6, 0x89, 0x01,
+	0x9d, 0x6e, 0x8e, 0x30, 0x38, 0x18, 0xf4, 0x86, 0xa7, 0xa3, 0xd7, 0xf8, 0xa1, 0xd5, 0xa8, 0xe7,
+	0x8e, 0xbb, 0x3a, 0x96, 0x12, 0xde, 0xf1, 0xaa, 0xdc, 0xbc, 0x99, 0x9c, 0xc8, 0xf5, 0x23, 0x35,
+	0xf7, 0xd1, 0x77, 0xf4, 0xb2, 0xf3, 0xb1, 0x48, 0xe6, 0x1a, 0x27, 0xa2, 0x24, 0xdb, 0x66, 0x1a,
+	0x25, 0x95, 0x36, 0xa2, 0x04, 0xa5, 0xc9, 0x6d, 0x0b, 0xef, 0xec, 0x36, 0x6f, 0x30, 0x35, 0xb9,
+	0xdd, 0xba, 0xe3, 0x77, 0x57, 0x3f, 0x3c, 0x74, 0x91, 0x88, 0x12, 0xff, 0x77, 0xcb, 0xaf, 0x82,
+	0x2d, 0x15, 0x8c, 0x57, 0x4f, 0x37, 0xee, 0x7d, 0x7d, 0x6f, 0xe5, 0x99, 0x28, 0x18, 0xcf, 0xb0,
+	0x50, 0x19, 0xc9, 0x80, 0xd7, 0x0f, 0x4b, 0xba, 0x3e, 0xfe, 0xf1, 0x05, 0x2f, 0x1d, 0xfa, 0xe9,
+	0xed, 0x5d, 0x47, 0xd1, 0x2f, 0xef, 0xfc, 0xba, 0xb1, 0x8c, 0x52, 0x8d, 0x1b, 0xb8, 0x42, 0x71,
+	0x88, 0x27, 0x2d, 0xf3, 0x4f, 0xcb, 0x99, 0x46, 0xa9, 0x9e, 0x3a, 0xce, 0x34, 0x0e, 0xa7, 0x8e,
+	0x73, 0xef, 0x5d, 0x34, 0x01, 0x4a, 0xa3, 0x54, 0x53, 0xea, 0x58, 0x94, 0xc6, 0x21, 0xa5, 0x8e,
+	0x77, 0x73, 0x50, 0x17, 0x1b, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x28, 0xbe, 0xdd, 0xc6, 0x2e,
+	0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/display_keyword_view.pb.go b/googleapis/ads/googleads/v3/resources/display_keyword_view.pb.go
new file mode 100644
index 0000000..c95bfc3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/display_keyword_view.pb.go
@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/display_keyword_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A display keyword view.
+type DisplayKeywordView struct {
+	// The resource name of the display keyword view.
+	// Display Keyword view resource names have the form:
+	//
+	// `customers/{customer_id}/displayKeywordViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DisplayKeywordView) Reset()         { *m = DisplayKeywordView{} }
+func (m *DisplayKeywordView) String() string { return proto.CompactTextString(m) }
+func (*DisplayKeywordView) ProtoMessage()    {}
+func (*DisplayKeywordView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5b0a6220f800cacf, []int{0}
+}
+
+func (m *DisplayKeywordView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DisplayKeywordView.Unmarshal(m, b)
+}
+func (m *DisplayKeywordView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DisplayKeywordView.Marshal(b, m, deterministic)
+}
+func (m *DisplayKeywordView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DisplayKeywordView.Merge(m, src)
+}
+func (m *DisplayKeywordView) XXX_Size() int {
+	return xxx_messageInfo_DisplayKeywordView.Size(m)
+}
+func (m *DisplayKeywordView) XXX_DiscardUnknown() {
+	xxx_messageInfo_DisplayKeywordView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DisplayKeywordView proto.InternalMessageInfo
+
+func (m *DisplayKeywordView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*DisplayKeywordView)(nil), "google.ads.googleads.v3.resources.DisplayKeywordView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/display_keyword_view.proto", fileDescriptor_5b0a6220f800cacf)
+}
+
+var fileDescriptor_5b0a6220f800cacf = []byte{
+	// 325 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0xc3, 0x40,
+	0x10, 0x86, 0x49, 0x04, 0xc1, 0xa0, 0x97, 0x5e, 0xd4, 0xe2, 0xc1, 0x2a, 0x05, 0x41, 0xd8, 0x3d,
+	0xe4, 0xb6, 0x0a, 0x92, 0x22, 0x14, 0x14, 0xa4, 0xf4, 0x90, 0x83, 0x04, 0xca, 0x9a, 0x5d, 0xc2,
+	0x62, 0xb3, 0x13, 0x77, 0xd2, 0x96, 0x52, 0x7a, 0xf3, 0x49, 0x3c, 0x8a, 0x4f, 0xe2, 0xa3, 0xf4,
+	0x29, 0xa4, 0xdd, 0xee, 0xb6, 0x60, 0xd1, 0xdb, 0x4f, 0xe6, 0xfb, 0xff, 0x7f, 0x67, 0x12, 0xdd,
+	0x16, 0x00, 0xc5, 0x50, 0x52, 0x2e, 0x90, 0x5a, 0xb9, 0x54, 0xe3, 0x98, 0x1a, 0x89, 0x30, 0x32,
+	0xb9, 0x44, 0x2a, 0x14, 0x56, 0x43, 0x3e, 0x1d, 0xbc, 0xca, 0xe9, 0x04, 0x8c, 0x18, 0x8c, 0x95,
+	0x9c, 0x90, 0xca, 0x40, 0x0d, 0x8d, 0x96, 0xb5, 0x10, 0x2e, 0x90, 0x78, 0x37, 0x19, 0xc7, 0xc4,
+	0xbb, 0x9b, 0xa7, 0xae, 0xa0, 0x52, 0x3e, 0xd3, 0xba, 0x9b, 0x67, 0x5b, 0x23, 0xae, 0x35, 0xd4,
+	0xbc, 0x56, 0xa0, 0xd1, 0x4e, 0x2f, 0xbe, 0x82, 0xa8, 0x71, 0x6f, 0xab, 0x1f, 0x6d, 0x73, 0xaa,
+	0xe4, 0xa4, 0x71, 0x19, 0x1d, 0xb9, 0x98, 0x81, 0xe6, 0xa5, 0x3c, 0x09, 0xce, 0x83, 0xab, 0x83,
+	0xfe, 0xa1, 0xfb, 0xf8, 0xc4, 0x4b, 0xc9, 0xde, 0x16, 0x89, 0x8e, 0xae, 0x37, 0x2f, 0x5a, 0xab,
+	0x4a, 0x21, 0xc9, 0xa1, 0xa4, 0x3b, 0x62, 0xef, 0xf2, 0x11, 0xd6, 0x50, 0x4a, 0x83, 0x74, 0xe6,
+	0xe4, 0xdc, 0xad, 0xbe, 0x05, 0x22, 0x9d, 0xed, 0xba, 0xc7, 0xbc, 0xf3, 0x1e, 0x46, 0xed, 0x1c,
+	0x4a, 0xf2, 0xef, 0x45, 0x3a, 0xc7, 0xbf, 0xeb, 0x7b, 0xcb, 0x8d, 0x7b, 0xc1, 0xf3, 0xc3, 0xda,
+	0x5d, 0xc0, 0x90, 0xeb, 0x82, 0x80, 0x29, 0x68, 0x21, 0xf5, 0xea, 0x1e, 0x74, 0xb3, 0xc3, 0x1f,
+	0x3f, 0xeb, 0xc6, 0xab, 0x8f, 0x70, 0xaf, 0x9b, 0x24, 0x9f, 0x61, 0xab, 0x6b, 0x23, 0x13, 0x81,
+	0xc4, 0xca, 0xa5, 0x4a, 0x63, 0xd2, 0x77, 0xe4, 0xb7, 0x63, 0xb2, 0x44, 0x60, 0xe6, 0x99, 0x2c,
+	0x8d, 0x33, 0xcf, 0x2c, 0xc2, 0xb6, 0x1d, 0x30, 0x96, 0x08, 0x64, 0xcc, 0x53, 0x8c, 0xa5, 0x31,
+	0x63, 0x9e, 0x7b, 0xd9, 0x5f, 0x3d, 0x36, 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x51, 0xa4,
+	0x8b, 0x58, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/distance_view.pb.go b/googleapis/ads/googleads/v3/resources/distance_view.pb.go
new file mode 100644
index 0000000..aad5313
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/distance_view.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/distance_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A distance view with metrics aggregated by the user's distance from an
+// advertiser's location extensions. Each DistanceBucket includes all
+// impressions that fall within its distance and a single impression will
+// contribute to the metrics for all DistanceBuckets that include the user's
+// distance.
+type DistanceView struct {
+	// The resource name of the distance view.
+	// Distance view resource names have the form:
+	//
+	// `customers/{customer_id}/distanceViews/1~{distance_bucket}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Grouping of user distance from location extensions.
+	DistanceBucket enums.DistanceBucketEnum_DistanceBucket `protobuf:"varint,2,opt,name=distance_bucket,json=distanceBucket,proto3,enum=google.ads.googleads.v3.enums.DistanceBucketEnum_DistanceBucket" json:"distance_bucket,omitempty"`
+	// True if the DistanceBucket is using the metric system, false otherwise.
+	MetricSystem         *wrappers.BoolValue `protobuf:"bytes,3,opt,name=metric_system,json=metricSystem,proto3" json:"metric_system,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *DistanceView) Reset()         { *m = DistanceView{} }
+func (m *DistanceView) String() string { return proto.CompactTextString(m) }
+func (*DistanceView) ProtoMessage()    {}
+func (*DistanceView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dad7deb2cae396f2, []int{0}
+}
+
+func (m *DistanceView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DistanceView.Unmarshal(m, b)
+}
+func (m *DistanceView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DistanceView.Marshal(b, m, deterministic)
+}
+func (m *DistanceView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DistanceView.Merge(m, src)
+}
+func (m *DistanceView) XXX_Size() int {
+	return xxx_messageInfo_DistanceView.Size(m)
+}
+func (m *DistanceView) XXX_DiscardUnknown() {
+	xxx_messageInfo_DistanceView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DistanceView proto.InternalMessageInfo
+
+func (m *DistanceView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *DistanceView) GetDistanceBucket() enums.DistanceBucketEnum_DistanceBucket {
+	if m != nil {
+		return m.DistanceBucket
+	}
+	return enums.DistanceBucketEnum_UNSPECIFIED
+}
+
+func (m *DistanceView) GetMetricSystem() *wrappers.BoolValue {
+	if m != nil {
+		return m.MetricSystem
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*DistanceView)(nil), "google.ads.googleads.v3.resources.DistanceView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/distance_view.proto", fileDescriptor_dad7deb2cae396f2)
+}
+
+var fileDescriptor_dad7deb2cae396f2 = []byte{
+	// 421 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x4f, 0x8b, 0xd4, 0x30,
+	0x1c, 0xa5, 0x5d, 0x10, 0xac, 0xb3, 0x2b, 0xf6, 0x34, 0x0e, 0x22, 0xb3, 0xca, 0xc0, 0x9c, 0x12,
+	0x98, 0xe2, 0x25, 0x1e, 0xb4, 0x45, 0x59, 0xf0, 0x20, 0x4b, 0x85, 0x1e, 0xb4, 0x38, 0x64, 0xda,
+	0x9f, 0x25, 0xd8, 0x24, 0x25, 0x49, 0x67, 0x90, 0x65, 0xbf, 0x8c, 0x47, 0xbf, 0x84, 0x77, 0x3f,
+	0xca, 0x7e, 0x08, 0x91, 0xfe, 0x49, 0x76, 0x66, 0x61, 0xdc, 0xdb, 0x4b, 0xde, 0x7b, 0xbf, 0xf7,
+	0x7e, 0x4d, 0x83, 0x57, 0x95, 0x94, 0x55, 0x0d, 0x98, 0x96, 0x1a, 0x0f, 0xb0, 0x43, 0xdb, 0x08,
+	0x2b, 0xd0, 0xb2, 0x55, 0x05, 0x68, 0x5c, 0x32, 0x6d, 0xa8, 0x28, 0x60, 0xbd, 0x65, 0xb0, 0x43,
+	0x8d, 0x92, 0x46, 0x86, 0xe7, 0x83, 0x16, 0xd1, 0x52, 0x23, 0x67, 0x43, 0xdb, 0x08, 0x39, 0xdb,
+	0x2c, 0x3a, 0x36, 0x19, 0x44, 0xcb, 0xf7, 0xa6, 0x6e, 0xda, 0xe2, 0x3b, 0x98, 0x61, 0xee, 0xec,
+	0xa9, 0x35, 0x35, 0xcc, 0x35, 0x18, 0xa9, 0xe7, 0x23, 0xd5, 0x9f, 0x36, 0xed, 0x37, 0xbc, 0x53,
+	0xb4, 0x69, 0x40, 0xe9, 0x91, 0x7f, 0xb6, 0x67, 0xa5, 0x42, 0x48, 0x43, 0x0d, 0x93, 0x62, 0x64,
+	0x5f, 0xfc, 0xf6, 0x83, 0xc9, 0xbb, 0x31, 0x32, 0x63, 0xb0, 0x0b, 0x5f, 0x06, 0xa7, 0x36, 0x60,
+	0x2d, 0x28, 0x87, 0xa9, 0x37, 0xf7, 0x96, 0x0f, 0xd3, 0x89, 0xbd, 0xfc, 0x48, 0x39, 0x84, 0x2c,
+	0x78, 0x7c, 0xa7, 0xe7, 0xd4, 0x9f, 0x7b, 0xcb, 0xb3, 0xd5, 0x5b, 0x74, 0xec, 0x03, 0xf4, 0xdb,
+	0x21, 0x1b, 0x95, 0xf4, 0xa6, 0xf7, 0xa2, 0xe5, 0x77, 0xae, 0xd2, 0xb3, 0xf2, 0xe0, 0x1c, 0xbe,
+	0x09, 0x4e, 0x39, 0x18, 0xc5, 0x8a, 0xb5, 0xfe, 0xa1, 0x0d, 0xf0, 0xe9, 0xc9, 0xdc, 0x5b, 0x3e,
+	0x5a, 0xcd, 0x6c, 0x90, 0x5d, 0x1b, 0x25, 0x52, 0xd6, 0x19, 0xad, 0x5b, 0x48, 0x27, 0x83, 0xe1,
+	0x53, 0xaf, 0x27, 0x5f, 0x6f, 0xe2, 0x2f, 0xc1, 0xe2, 0xb6, 0xcb, 0x88, 0x1a, 0xa6, 0x51, 0x21,
+	0x39, 0x3e, 0x58, 0x7e, 0x55, 0xb4, 0xda, 0x48, 0x0e, 0x4a, 0xe3, 0x2b, 0x0b, 0xaf, 0xdd, 0x93,
+	0x74, 0x12, 0x8d, 0xaf, 0x0e, 0xde, 0xfd, 0x3a, 0xf9, 0xeb, 0x05, 0x8b, 0x42, 0x72, 0x74, 0xef,
+	0xcb, 0x27, 0x4f, 0xf6, 0xb3, 0x2e, 0xbb, 0xde, 0x97, 0xde, 0xe7, 0x0f, 0xa3, 0xaf, 0x92, 0x35,
+	0x15, 0x15, 0x92, 0xaa, 0xc2, 0x15, 0x88, 0x7e, 0x2b, 0x7c, 0x5b, 0xf5, 0x3f, 0xff, 0xe1, 0x6b,
+	0x87, 0x7e, 0xfa, 0x27, 0x17, 0x71, 0xfc, 0xcb, 0x3f, 0xbf, 0x18, 0x46, 0xc6, 0xa5, 0x46, 0x03,
+	0xec, 0x50, 0x16, 0xa1, 0xd4, 0x2a, 0xff, 0x58, 0x4d, 0x1e, 0x97, 0x3a, 0x77, 0x9a, 0x3c, 0x8b,
+	0x72, 0xa7, 0xb9, 0xf1, 0x17, 0x03, 0x41, 0x48, 0x5c, 0x6a, 0x42, 0x9c, 0x8a, 0x90, 0x2c, 0x22,
+	0xc4, 0xe9, 0x36, 0x0f, 0xfa, 0xb2, 0xd1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7c, 0x1d, 0x68,
+	0x23, 0x33, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/domain_category.pb.go b/googleapis/ads/googleads/v3/resources/domain_category.pb.go
new file mode 100644
index 0000000..d5c9f59
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/domain_category.pb.go
@@ -0,0 +1,196 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/domain_category.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A category generated automatically by crawling a domain. If a campaign uses
+// the DynamicSearchAdsSetting, then domain categories will be generated for
+// the domain. The categories can be targeted using WebpageConditionInfo.
+// See: https://support.google.com/google-ads/answer/2471185
+type DomainCategory struct {
+	// The resource name of the domain category.
+	// Domain category resource names have the form:
+	//
+	// `customers/{customer_id}/domainCategories/{campaign_id}~{category_base64}~{language_code}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The campaign this category is recommended for.
+	Campaign *wrappers.StringValue `protobuf:"bytes,2,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// Recommended category for the website domain. e.g. if you have a website
+	// about electronics, the categories could be "cameras", "televisions", etc.
+	Category *wrappers.StringValue `protobuf:"bytes,3,opt,name=category,proto3" json:"category,omitempty"`
+	// The language code specifying the language of the website. e.g. "en" for
+	// English. The language can be specified in the DynamicSearchAdsSetting
+	// required for dynamic search ads. This is the language of the pages from
+	// your website that you want Google Ads to find, create ads for,
+	// and match searches with.
+	LanguageCode *wrappers.StringValue `protobuf:"bytes,4,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
+	// The domain for the website. The domain can be specified in the
+	// DynamicSearchAdsSetting required for dynamic search ads.
+	Domain *wrappers.StringValue `protobuf:"bytes,5,opt,name=domain,proto3" json:"domain,omitempty"`
+	// Fraction of pages on your site that this category matches.
+	CoverageFraction *wrappers.DoubleValue `protobuf:"bytes,6,opt,name=coverage_fraction,json=coverageFraction,proto3" json:"coverage_fraction,omitempty"`
+	// The position of this category in the set of categories. Lower numbers
+	// indicate a better match for the domain. null indicates not recommended.
+	CategoryRank *wrappers.Int64Value `protobuf:"bytes,7,opt,name=category_rank,json=categoryRank,proto3" json:"category_rank,omitempty"`
+	// Indicates whether this category has sub-categories.
+	HasChildren *wrappers.BoolValue `protobuf:"bytes,8,opt,name=has_children,json=hasChildren,proto3" json:"has_children,omitempty"`
+	// The recommended cost per click for the category.
+	RecommendedCpcBidMicros *wrappers.Int64Value `protobuf:"bytes,9,opt,name=recommended_cpc_bid_micros,json=recommendedCpcBidMicros,proto3" json:"recommended_cpc_bid_micros,omitempty"`
+	XXX_NoUnkeyedLiteral    struct{}             `json:"-"`
+	XXX_unrecognized        []byte               `json:"-"`
+	XXX_sizecache           int32                `json:"-"`
+}
+
+func (m *DomainCategory) Reset()         { *m = DomainCategory{} }
+func (m *DomainCategory) String() string { return proto.CompactTextString(m) }
+func (*DomainCategory) ProtoMessage()    {}
+func (*DomainCategory) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4b9715a478ef6373, []int{0}
+}
+
+func (m *DomainCategory) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DomainCategory.Unmarshal(m, b)
+}
+func (m *DomainCategory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DomainCategory.Marshal(b, m, deterministic)
+}
+func (m *DomainCategory) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DomainCategory.Merge(m, src)
+}
+func (m *DomainCategory) XXX_Size() int {
+	return xxx_messageInfo_DomainCategory.Size(m)
+}
+func (m *DomainCategory) XXX_DiscardUnknown() {
+	xxx_messageInfo_DomainCategory.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DomainCategory proto.InternalMessageInfo
+
+func (m *DomainCategory) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *DomainCategory) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *DomainCategory) GetCategory() *wrappers.StringValue {
+	if m != nil {
+		return m.Category
+	}
+	return nil
+}
+
+func (m *DomainCategory) GetLanguageCode() *wrappers.StringValue {
+	if m != nil {
+		return m.LanguageCode
+	}
+	return nil
+}
+
+func (m *DomainCategory) GetDomain() *wrappers.StringValue {
+	if m != nil {
+		return m.Domain
+	}
+	return nil
+}
+
+func (m *DomainCategory) GetCoverageFraction() *wrappers.DoubleValue {
+	if m != nil {
+		return m.CoverageFraction
+	}
+	return nil
+}
+
+func (m *DomainCategory) GetCategoryRank() *wrappers.Int64Value {
+	if m != nil {
+		return m.CategoryRank
+	}
+	return nil
+}
+
+func (m *DomainCategory) GetHasChildren() *wrappers.BoolValue {
+	if m != nil {
+		return m.HasChildren
+	}
+	return nil
+}
+
+func (m *DomainCategory) GetRecommendedCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedCpcBidMicros
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*DomainCategory)(nil), "google.ads.googleads.v3.resources.DomainCategory")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/domain_category.proto", fileDescriptor_4b9715a478ef6373)
+}
+
+var fileDescriptor_4b9715a478ef6373 = []byte{
+	// 541 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xd1, 0x6a, 0x13, 0x4f,
+	0x14, 0xc6, 0x49, 0xfa, 0x6f, 0xff, 0xed, 0xb4, 0x11, 0x5d, 0x2f, 0x5c, 0x63, 0x91, 0x56, 0x29,
+	0xf6, 0x6a, 0x16, 0xdc, 0x62, 0x65, 0x45, 0x70, 0x93, 0x62, 0xa9, 0xa0, 0x94, 0x08, 0x41, 0x24,
+	0xb0, 0x4c, 0x66, 0xa6, 0x9b, 0xa1, 0xbb, 0x73, 0x96, 0x99, 0xdd, 0x88, 0x94, 0x82, 0xcf, 0xe2,
+	0xa5, 0x37, 0xbe, 0x87, 0x8f, 0xd2, 0xa7, 0x90, 0xdd, 0x99, 0xd9, 0xd6, 0x16, 0x6d, 0xee, 0x4e,
+	0x72, 0xbe, 0xdf, 0x77, 0xbe, 0x93, 0xcc, 0x41, 0xfb, 0x29, 0x40, 0x9a, 0xf1, 0x80, 0x30, 0x1d,
+	0x98, 0xb2, 0xae, 0xe6, 0x61, 0xa0, 0xb8, 0x86, 0x4a, 0x51, 0xae, 0x03, 0x06, 0x39, 0x11, 0x32,
+	0xa1, 0xa4, 0xe4, 0x29, 0xa8, 0xaf, 0xb8, 0x50, 0x50, 0x82, 0xb7, 0x6d, 0xd4, 0x98, 0x30, 0x8d,
+	0x5b, 0x10, 0xcf, 0x43, 0xdc, 0x82, 0xfd, 0x87, 0xce, 0xbb, 0x10, 0xad, 0x9d, 0xa1, 0xfb, 0x8f,
+	0x6d, 0xab, 0xf9, 0x34, 0xad, 0x4e, 0x82, 0x2f, 0x8a, 0x14, 0x05, 0x57, 0xda, 0xf6, 0x37, 0xaf,
+	0xa0, 0x44, 0x4a, 0x28, 0x49, 0x29, 0x40, 0xda, 0xee, 0x93, 0x9f, 0xcb, 0xe8, 0xce, 0x41, 0x93,
+	0x6a, 0x68, 0x43, 0x79, 0x4f, 0x51, 0xcf, 0x8d, 0x48, 0x24, 0xc9, 0xb9, 0xdf, 0xd9, 0xea, 0xec,
+	0xae, 0x8d, 0x36, 0xdc, 0x97, 0x1f, 0x48, 0xce, 0xbd, 0x97, 0x68, 0x95, 0x92, 0xbc, 0x20, 0x22,
+	0x95, 0x7e, 0x77, 0xab, 0xb3, 0xbb, 0xfe, 0x7c, 0xd3, 0x66, 0xc7, 0x2e, 0x08, 0xfe, 0x58, 0x2a,
+	0x21, 0xd3, 0x31, 0xc9, 0x2a, 0x3e, 0x6a, 0xd5, 0x86, 0x34, 0xa3, 0xfc, 0xa5, 0xc5, 0x48, 0x1b,
+	0x2c, 0x46, 0xbd, 0x8c, 0xc8, 0xb4, 0x22, 0x29, 0x4f, 0x28, 0x30, 0xee, 0xff, 0xb7, 0x00, 0xbe,
+	0xe1, 0x90, 0x21, 0x30, 0xee, 0xed, 0xa1, 0x15, 0xf3, 0x1f, 0xf8, 0xcb, 0x0b, 0xb0, 0x56, 0xeb,
+	0x1d, 0xa1, 0x7b, 0x14, 0xe6, 0x5c, 0xd5, 0x83, 0x4f, 0x14, 0xa1, 0xf5, 0x0f, 0xe8, 0xaf, 0xfc,
+	0xc5, 0xe0, 0x00, 0xaa, 0x69, 0xc6, 0x8d, 0xc1, 0x5d, 0x87, 0xbd, 0xb5, 0x94, 0xf7, 0x06, 0xf5,
+	0xdc, 0x3e, 0x89, 0x22, 0xf2, 0xd4, 0xff, 0xbf, 0xb1, 0x79, 0x74, 0xc3, 0xe6, 0x48, 0x96, 0x2f,
+	0xf6, 0xec, 0x0a, 0x8e, 0x18, 0x11, 0x79, 0xea, 0xbd, 0x46, 0x1b, 0x33, 0xa2, 0x13, 0x3a, 0x13,
+	0x19, 0x53, 0x5c, 0xfa, 0xab, 0x8d, 0x41, 0xff, 0x86, 0xc1, 0x00, 0x20, 0x33, 0xfc, 0xfa, 0x8c,
+	0xe8, 0xa1, 0x95, 0x7b, 0x9f, 0x50, 0x5f, 0x71, 0x0a, 0x79, 0xce, 0x25, 0xe3, 0x2c, 0xa1, 0x05,
+	0x4d, 0xa6, 0x82, 0x25, 0xb9, 0xa0, 0x0a, 0xb4, 0xbf, 0x76, 0x7b, 0x9a, 0x07, 0x57, 0xf0, 0x61,
+	0x41, 0x07, 0x82, 0xbd, 0x6f, 0xd8, 0x88, 0x5f, 0xc4, 0x53, 0xf4, 0xec, 0xf2, 0x01, 0xdb, 0xaa,
+	0x10, 0x1a, 0x53, 0xc8, 0x83, 0x6b, 0xaf, 0x6c, 0x9f, 0x56, 0xba, 0x84, 0x9c, 0x2b, 0x1d, 0x9c,
+	0xb9, 0xf2, 0xdc, 0x1e, 0x88, 0x15, 0x09, 0xae, 0x83, 0xb3, 0x6b, 0x27, 0x73, 0x3e, 0xf8, 0xd6,
+	0x45, 0x3b, 0x14, 0x72, 0x7c, 0xeb, 0xd1, 0x0c, 0xee, 0xff, 0x39, 0xf2, 0xb8, 0x5e, 0xe6, 0xb8,
+	0xf3, 0xf9, 0x9d, 0x25, 0x53, 0xa8, 0x9f, 0x06, 0x06, 0x95, 0x06, 0x29, 0x97, 0xcd, 0xaa, 0xc1,
+	0x65, 0xe6, 0x7f, 0x9c, 0xf1, 0xab, 0xb6, 0xfa, 0xde, 0x5d, 0x3a, 0x8c, 0xe3, 0x1f, 0xdd, 0xed,
+	0x43, 0x63, 0x19, 0x33, 0x8d, 0x4d, 0x59, 0x57, 0xe3, 0x10, 0x8f, 0x9c, 0xf2, 0x97, 0xd3, 0x4c,
+	0x62, 0xa6, 0x27, 0xad, 0x66, 0x32, 0x0e, 0x27, 0xad, 0xe6, 0xa2, 0xbb, 0x63, 0x1a, 0x51, 0x14,
+	0x33, 0x1d, 0x45, 0xad, 0x2a, 0x8a, 0xc6, 0x61, 0x14, 0xb5, 0xba, 0xe9, 0x4a, 0x13, 0x36, 0xfc,
+	0x1d, 0x00, 0x00, 0xff, 0xff, 0x18, 0x5f, 0x5b, 0x7c, 0x72, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/dynamic_search_ads_search_term_view.pb.go b/googleapis/ads/googleads/v3/resources/dynamic_search_ads_search_term_view.pb.go
new file mode 100644
index 0000000..1baaa21
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/dynamic_search_ads_search_term_view.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/dynamic_search_ads_search_term_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A dynamic search ads search term view.
+type DynamicSearchAdsSearchTermView struct {
+	// The resource name of the dynamic search ads search term view.
+	// Dynamic search ads search term view resource names have the form:
+	//
+	// `customers/{customer_id}/dynamicSearchAdsSearchTermViews/{ad_group_id}~{search_term_fp}~{headline_fp}~{landing_page_fp}~{page_url_fp}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Search term
+	//
+	// This field is read-only.
+	SearchTerm *wrappers.StringValue `protobuf:"bytes,2,opt,name=search_term,json=searchTerm,proto3" json:"search_term,omitempty"`
+	// The dynamically generated headline of the Dynamic Search Ad.
+	//
+	// This field is read-only.
+	Headline *wrappers.StringValue `protobuf:"bytes,3,opt,name=headline,proto3" json:"headline,omitempty"`
+	// The dynamically selected landing page URL of the impression.
+	//
+	// This field is read-only.
+	LandingPage *wrappers.StringValue `protobuf:"bytes,4,opt,name=landing_page,json=landingPage,proto3" json:"landing_page,omitempty"`
+	// The URL of page feed item served for the impression.
+	//
+	// This field is read-only.
+	PageUrl *wrappers.StringValue `protobuf:"bytes,5,opt,name=page_url,json=pageUrl,proto3" json:"page_url,omitempty"`
+	// True if query matches a negative keyword.
+	//
+	// This field is read-only.
+	HasNegativeKeyword *wrappers.BoolValue `protobuf:"bytes,6,opt,name=has_negative_keyword,json=hasNegativeKeyword,proto3" json:"has_negative_keyword,omitempty"`
+	// True if query is added to targeted keywords.
+	//
+	// This field is read-only.
+	HasMatchingKeyword *wrappers.BoolValue `protobuf:"bytes,7,opt,name=has_matching_keyword,json=hasMatchingKeyword,proto3" json:"has_matching_keyword,omitempty"`
+	// True if query matches a negative url.
+	//
+	// This field is read-only.
+	HasNegativeUrl       *wrappers.BoolValue `protobuf:"bytes,8,opt,name=has_negative_url,json=hasNegativeUrl,proto3" json:"has_negative_url,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *DynamicSearchAdsSearchTermView) Reset()         { *m = DynamicSearchAdsSearchTermView{} }
+func (m *DynamicSearchAdsSearchTermView) String() string { return proto.CompactTextString(m) }
+func (*DynamicSearchAdsSearchTermView) ProtoMessage()    {}
+func (*DynamicSearchAdsSearchTermView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c0384f99ab33a76a, []int{0}
+}
+
+func (m *DynamicSearchAdsSearchTermView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DynamicSearchAdsSearchTermView.Unmarshal(m, b)
+}
+func (m *DynamicSearchAdsSearchTermView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DynamicSearchAdsSearchTermView.Marshal(b, m, deterministic)
+}
+func (m *DynamicSearchAdsSearchTermView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DynamicSearchAdsSearchTermView.Merge(m, src)
+}
+func (m *DynamicSearchAdsSearchTermView) XXX_Size() int {
+	return xxx_messageInfo_DynamicSearchAdsSearchTermView.Size(m)
+}
+func (m *DynamicSearchAdsSearchTermView) XXX_DiscardUnknown() {
+	xxx_messageInfo_DynamicSearchAdsSearchTermView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DynamicSearchAdsSearchTermView proto.InternalMessageInfo
+
+func (m *DynamicSearchAdsSearchTermView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *DynamicSearchAdsSearchTermView) GetSearchTerm() *wrappers.StringValue {
+	if m != nil {
+		return m.SearchTerm
+	}
+	return nil
+}
+
+func (m *DynamicSearchAdsSearchTermView) GetHeadline() *wrappers.StringValue {
+	if m != nil {
+		return m.Headline
+	}
+	return nil
+}
+
+func (m *DynamicSearchAdsSearchTermView) GetLandingPage() *wrappers.StringValue {
+	if m != nil {
+		return m.LandingPage
+	}
+	return nil
+}
+
+func (m *DynamicSearchAdsSearchTermView) GetPageUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.PageUrl
+	}
+	return nil
+}
+
+func (m *DynamicSearchAdsSearchTermView) GetHasNegativeKeyword() *wrappers.BoolValue {
+	if m != nil {
+		return m.HasNegativeKeyword
+	}
+	return nil
+}
+
+func (m *DynamicSearchAdsSearchTermView) GetHasMatchingKeyword() *wrappers.BoolValue {
+	if m != nil {
+		return m.HasMatchingKeyword
+	}
+	return nil
+}
+
+func (m *DynamicSearchAdsSearchTermView) GetHasNegativeUrl() *wrappers.BoolValue {
+	if m != nil {
+		return m.HasNegativeUrl
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*DynamicSearchAdsSearchTermView)(nil), "google.ads.googleads.v3.resources.DynamicSearchAdsSearchTermView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/dynamic_search_ads_search_term_view.proto", fileDescriptor_c0384f99ab33a76a)
+}
+
+var fileDescriptor_c0384f99ab33a76a = []byte{
+	// 525 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xc1, 0x6a, 0xdb, 0x40,
+	0x10, 0x86, 0x91, 0xd3, 0x24, 0xee, 0x3a, 0x2d, 0x45, 0xf4, 0xa0, 0x9a, 0x10, 0x92, 0x86, 0x40,
+	0x4e, 0x2b, 0xa8, 0x0e, 0x29, 0x2a, 0xa5, 0xc8, 0x04, 0x02, 0x4d, 0x1b, 0x8c, 0xd3, 0xf8, 0x10,
+	0x0c, 0x62, 0xa2, 0x9d, 0xae, 0x45, 0xa5, 0x5d, 0xb1, 0x2b, 0xdb, 0x84, 0x90, 0x77, 0xe8, 0xa5,
+	0x87, 0x5e, 0x7b, 0xec, 0x03, 0xf4, 0x21, 0xfa, 0x28, 0x79, 0x8a, 0x22, 0x4b, 0xbb, 0x71, 0x29,
+	0x8d, 0x7d, 0xfb, 0xed, 0xf9, 0xff, 0x6f, 0x66, 0xc4, 0x0e, 0x39, 0xe5, 0x52, 0xf2, 0x0c, 0x7d,
+	0x60, 0xda, 0xaf, 0x65, 0xa5, 0xa6, 0x81, 0xaf, 0x50, 0xcb, 0x89, 0x4a, 0x50, 0xfb, 0xec, 0x5a,
+	0x40, 0x9e, 0x26, 0xb1, 0x46, 0x50, 0xc9, 0x38, 0x06, 0xa6, 0x8d, 0x2c, 0x51, 0xe5, 0xf1, 0x34,
+	0xc5, 0x19, 0x2d, 0x94, 0x2c, 0xa5, 0xbb, 0x57, 0x13, 0x28, 0x30, 0x4d, 0x2d, 0x8c, 0x4e, 0x03,
+	0x6a, 0x61, 0xdd, 0x17, 0xa6, 0x5f, 0x91, 0xda, 0x16, 0x75, 0xba, 0xbb, 0xd3, 0x94, 0xe6, 0xbf,
+	0xae, 0x26, 0x9f, 0xfd, 0x99, 0x82, 0xa2, 0x40, 0xa5, 0x9b, 0xfa, 0xf6, 0x42, 0x14, 0x84, 0x90,
+	0x25, 0x94, 0xa9, 0x14, 0x4d, 0xf5, 0xe5, 0xaf, 0x75, 0xb2, 0x73, 0x5c, 0x4f, 0x7a, 0x3e, 0x9f,
+	0x2e, 0x62, 0xba, 0x16, 0x9f, 0x50, 0xe5, 0xc3, 0x14, 0x67, 0xee, 0x3e, 0x79, 0x62, 0x5a, 0xc6,
+	0x02, 0x72, 0xf4, 0x9c, 0x5d, 0xe7, 0xf0, 0xf1, 0x60, 0xcb, 0xfc, 0x79, 0x06, 0x39, 0xba, 0x6f,
+	0x49, 0x67, 0x61, 0x3b, 0xaf, 0xb5, 0xeb, 0x1c, 0x76, 0x5e, 0x6d, 0x37, 0xeb, 0x50, 0x33, 0x1b,
+	0x3d, 0x2f, 0x55, 0x2a, 0xf8, 0x10, 0xb2, 0x09, 0x0e, 0x88, 0xb6, 0x7d, 0xdc, 0xd7, 0xa4, 0x3d,
+	0x46, 0x60, 0x59, 0x2a, 0xd0, 0x5b, 0x5b, 0x21, 0x6b, 0xdd, 0xee, 0x3b, 0xb2, 0x95, 0x81, 0x60,
+	0xa9, 0xe0, 0x71, 0x01, 0x1c, 0xbd, 0x47, 0x2b, 0xa4, 0x3b, 0x4d, 0xa2, 0x0f, 0x1c, 0xdd, 0x23,
+	0xd2, 0xae, 0x82, 0xf1, 0x44, 0x65, 0xde, 0xfa, 0x0a, 0xe1, 0xcd, 0xca, 0x7d, 0xa1, 0x32, 0xf7,
+	0x03, 0x79, 0x3e, 0x06, 0x1d, 0x0b, 0xe4, 0x50, 0xa6, 0x53, 0x8c, 0xbf, 0xe0, 0xf5, 0x4c, 0x2a,
+	0xe6, 0x6d, 0xcc, 0x21, 0xdd, 0x7f, 0x20, 0x3d, 0x29, 0xb3, 0x1a, 0xe1, 0x8e, 0x41, 0x9f, 0x35,
+	0xb1, 0xd3, 0x3a, 0x65, 0x68, 0x39, 0x94, 0xc9, 0xb8, 0x5a, 0xc6, 0xd0, 0x36, 0x57, 0xa2, 0x7d,
+	0x6c, 0x62, 0x86, 0x76, 0x4c, 0x9e, 0xfd, 0x35, 0x5b, 0xb5, 0x5c, 0x7b, 0x29, 0xe9, 0xe9, 0xc2,
+	0x5c, 0x17, 0x2a, 0x0b, 0xbf, 0x3b, 0x77, 0xd1, 0x37, 0x87, 0x1c, 0xdd, 0x3f, 0xca, 0x46, 0x15,
+	0xa9, 0xa6, 0x89, 0xcc, 0xfd, 0x25, 0x2f, 0xe7, 0x32, 0x99, 0xe8, 0x52, 0xe6, 0xa8, 0xb4, 0x7f,
+	0x63, 0xe4, 0xad, 0x39, 0x8c, 0xff, 0x84, 0xb4, 0x7f, 0xb3, 0xc2, 0xe5, 0xdc, 0xf6, 0xbe, 0xb6,
+	0xc8, 0x41, 0x22, 0x73, 0xba, 0xf4, 0x76, 0x7a, 0xfb, 0x0f, 0x4f, 0xd9, 0xaf, 0xbe, 0x43, 0xdf,
+	0xb9, 0x7c, 0xdf, 0x90, 0xb8, 0xcc, 0x40, 0x70, 0x2a, 0x15, 0xf7, 0x39, 0x8a, 0xf9, 0x57, 0xf2,
+	0xef, 0xd7, 0x7e, 0xe0, 0xe2, 0xdf, 0x58, 0xf5, 0xa3, 0xb5, 0x76, 0x12, 0x45, 0x3f, 0x5b, 0x7b,
+	0x27, 0x35, 0x32, 0x62, 0x9a, 0xd6, 0xb2, 0x52, 0xc3, 0x80, 0x0e, 0x8c, 0xf3, 0xb7, 0xf1, 0x8c,
+	0x22, 0xa6, 0x47, 0xd6, 0x33, 0x1a, 0x06, 0x23, 0xeb, 0xb9, 0x6b, 0x1d, 0xd4, 0x85, 0x30, 0x8c,
+	0x98, 0x0e, 0x43, 0xeb, 0x0a, 0xc3, 0x61, 0x10, 0x86, 0xd6, 0x77, 0xb5, 0x31, 0x1f, 0x36, 0xf8,
+	0x13, 0x00, 0x00, 0xff, 0xff, 0xcd, 0x88, 0x17, 0x91, 0x9d, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/expanded_landing_page_view.pb.go b/googleapis/ads/googleads/v3/resources/expanded_landing_page_view.pb.go
new file mode 100644
index 0000000..d293ec3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/expanded_landing_page_view.pb.go
@@ -0,0 +1,115 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/expanded_landing_page_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A landing page view with metrics aggregated at the expanded final URL
+// level.
+type ExpandedLandingPageView struct {
+	// The resource name of the expanded landing page view.
+	// Expanded landing page view resource names have the form:
+	//
+	// `customers/{customer_id}/expandedLandingPageViews/{expanded_final_url_fingerprint}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The final URL that clicks are directed to.
+	ExpandedFinalUrl     *wrappers.StringValue `protobuf:"bytes,2,opt,name=expanded_final_url,json=expandedFinalUrl,proto3" json:"expanded_final_url,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ExpandedLandingPageView) Reset()         { *m = ExpandedLandingPageView{} }
+func (m *ExpandedLandingPageView) String() string { return proto.CompactTextString(m) }
+func (*ExpandedLandingPageView) ProtoMessage()    {}
+func (*ExpandedLandingPageView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_10d3300869449542, []int{0}
+}
+
+func (m *ExpandedLandingPageView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExpandedLandingPageView.Unmarshal(m, b)
+}
+func (m *ExpandedLandingPageView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExpandedLandingPageView.Marshal(b, m, deterministic)
+}
+func (m *ExpandedLandingPageView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExpandedLandingPageView.Merge(m, src)
+}
+func (m *ExpandedLandingPageView) XXX_Size() int {
+	return xxx_messageInfo_ExpandedLandingPageView.Size(m)
+}
+func (m *ExpandedLandingPageView) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExpandedLandingPageView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExpandedLandingPageView proto.InternalMessageInfo
+
+func (m *ExpandedLandingPageView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *ExpandedLandingPageView) GetExpandedFinalUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.ExpandedFinalUrl
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ExpandedLandingPageView)(nil), "google.ads.googleads.v3.resources.ExpandedLandingPageView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/expanded_landing_page_view.proto", fileDescriptor_10d3300869449542)
+}
+
+var fileDescriptor_10d3300869449542 = []byte{
+	// 395 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x41, 0x6b, 0xdb, 0x30,
+	0x18, 0xc5, 0x1e, 0x0c, 0xe6, 0x6d, 0x30, 0x7c, 0x59, 0x16, 0xc2, 0x48, 0x36, 0x02, 0x39, 0x49,
+	0x63, 0xbe, 0xa9, 0x27, 0x07, 0xda, 0x40, 0x28, 0x25, 0xa4, 0xd4, 0x87, 0x62, 0x30, 0x8a, 0xa5,
+	0x08, 0x81, 0x2d, 0x19, 0xc9, 0x4e, 0x0a, 0x21, 0x85, 0x1e, 0x7b, 0xe9, 0x8f, 0xe8, 0xb1, 0x3f,
+	0xa5, 0x3f, 0x25, 0xbf, 0xa2, 0x38, 0xb6, 0x94, 0x52, 0x48, 0x7b, 0x7b, 0xf6, 0xf7, 0xde, 0xd3,
+	0x7b, 0x9f, 0xe4, 0x8d, 0x99, 0x94, 0x2c, 0xa3, 0x10, 0x13, 0x0d, 0x1b, 0x58, 0xa3, 0x55, 0x00,
+	0x15, 0xd5, 0xb2, 0x52, 0x29, 0xd5, 0x90, 0xde, 0x14, 0x58, 0x10, 0x4a, 0x92, 0x0c, 0x0b, 0xc2,
+	0x05, 0x4b, 0x0a, 0xcc, 0x68, 0xb2, 0xe2, 0x74, 0x0d, 0x0a, 0x25, 0x4b, 0xe9, 0x0f, 0x1a, 0x21,
+	0xc0, 0x44, 0x03, 0xeb, 0x01, 0x56, 0x01, 0xb0, 0x1e, 0xdd, 0x5f, 0xe6, 0x98, 0x82, 0x5b, 0xe7,
+	0x46, 0xdd, 0xfd, 0xdd, 0x8e, 0xf6, 0x5f, 0x8b, 0x6a, 0x09, 0xd7, 0x0a, 0x17, 0x05, 0x55, 0xba,
+	0x9d, 0xf7, 0x5e, 0x49, 0xb1, 0x10, 0xb2, 0xc4, 0x25, 0x97, 0xa2, 0x9d, 0xfe, 0x79, 0x70, 0xbd,
+	0x9f, 0xa7, 0x6d, 0xc0, 0xf3, 0x26, 0xdf, 0x0c, 0x33, 0x1a, 0x71, 0xba, 0xf6, 0xff, 0x7a, 0xdf,
+	0xcd, 0x59, 0x89, 0xc0, 0x39, 0xed, 0x38, 0x7d, 0x67, 0xf4, 0x65, 0xfe, 0xcd, 0xfc, 0xbc, 0xc0,
+	0x39, 0xf5, 0xa7, 0x9e, 0x6f, 0x0b, 0x2e, 0xb9, 0xc0, 0x59, 0x52, 0xa9, 0xac, 0xe3, 0xf6, 0x9d,
+	0xd1, 0xd7, 0xff, 0xbd, 0xb6, 0x0e, 0x30, 0xd9, 0xc0, 0x65, 0xa9, 0xb8, 0x60, 0x11, 0xce, 0x2a,
+	0x3a, 0xff, 0x61, 0x74, 0x67, 0xb5, 0xec, 0x4a, 0x65, 0xe8, 0xce, 0xd9, 0x85, 0xb7, 0xde, 0xbf,
+	0xc3, 0x0e, 0x5a, 0x54, 0x70, 0x0d, 0x52, 0x99, 0xc3, 0x63, 0x41, 0xa7, 0x69, 0xa5, 0x4b, 0x99,
+	0x53, 0xa5, 0xe1, 0xc6, 0xc0, 0xad, 0xdd, 0xfb, 0x1b, 0xb6, 0x86, 0x9b, 0xe3, 0x37, 0xb2, 0x1d,
+	0xdf, 0xbb, 0xde, 0x30, 0x95, 0x39, 0xf8, 0xf0, 0x4e, 0xc6, 0xbd, 0x23, 0x71, 0x66, 0x75, 0xd9,
+	0x99, 0x73, 0x3d, 0x6d, 0x2d, 0x98, 0xcc, 0xb0, 0x60, 0x40, 0x2a, 0x06, 0x19, 0x15, 0xfb, 0x55,
+	0xc0, 0x43, 0xb1, 0x77, 0x5e, 0xce, 0x89, 0x45, 0x8f, 0xee, 0xa7, 0x49, 0x18, 0x3e, 0xb9, 0x83,
+	0x49, 0x63, 0x19, 0x12, 0x0d, 0x1a, 0x58, 0xa3, 0x28, 0x00, 0x73, 0xc3, 0x7c, 0x36, 0x9c, 0x38,
+	0x24, 0x3a, 0xb6, 0x9c, 0x38, 0x0a, 0x62, 0xcb, 0xd9, 0xb9, 0xc3, 0x66, 0x80, 0x50, 0x48, 0x34,
+	0x42, 0x96, 0x85, 0x50, 0x14, 0x20, 0x64, 0x79, 0x8b, 0xcf, 0xfb, 0xb0, 0xc1, 0x4b, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0xae, 0x79, 0x3b, 0xbe, 0xe5, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/extension_feed_item.pb.go b/googleapis/ads/googleads/v3/resources/extension_feed_item.pb.go
new file mode 100644
index 0000000..b2b5915
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/extension_feed_item.pb.go
@@ -0,0 +1,469 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/extension_feed_item.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An extension feed item.
+type ExtensionFeedItem struct {
+	// The resource name of the extension feed item.
+	// Extension feed item resource names have the form:
+	//
+	// `customers/{customer_id}/extensionFeedItems/{feed_item_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of this feed item. Read-only.
+	Id *wrappers.Int64Value `protobuf:"bytes,24,opt,name=id,proto3" json:"id,omitempty"`
+	// The extension type of the extension feed item.
+	// This field is read-only.
+	ExtensionType enums.ExtensionTypeEnum_ExtensionType `protobuf:"varint,13,opt,name=extension_type,json=extensionType,proto3,enum=google.ads.googleads.v3.enums.ExtensionTypeEnum_ExtensionType" json:"extension_type,omitempty"`
+	// Start time in which this feed item is effective and can begin serving. The
+	// time is in the customer's time zone.
+	// The format is "YYYY-MM-DD HH:MM:SS".
+	// Examples: "2018-03-05 09:15:00" or "2018-02-01 14:34:30"
+	StartDateTime *wrappers.StringValue `protobuf:"bytes,5,opt,name=start_date_time,json=startDateTime,proto3" json:"start_date_time,omitempty"`
+	// End time in which this feed item is no longer effective and will stop
+	// serving. The time is in the customer's time zone.
+	// The format is "YYYY-MM-DD HH:MM:SS".
+	// Examples: "2018-03-05 09:15:00" or "2018-02-01 14:34:30"
+	EndDateTime *wrappers.StringValue `protobuf:"bytes,6,opt,name=end_date_time,json=endDateTime,proto3" json:"end_date_time,omitempty"`
+	// List of non-overlapping schedules specifying all time intervals
+	// for which the feed item may serve. There can be a maximum of 6 schedules
+	// per day.
+	AdSchedules []*common.AdScheduleInfo `protobuf:"bytes,16,rep,name=ad_schedules,json=adSchedules,proto3" json:"ad_schedules,omitempty"`
+	// The targeted device.
+	Device enums.FeedItemTargetDeviceEnum_FeedItemTargetDevice `protobuf:"varint,17,opt,name=device,proto3,enum=google.ads.googleads.v3.enums.FeedItemTargetDeviceEnum_FeedItemTargetDevice" json:"device,omitempty"`
+	// The targeted geo target constant.
+	TargetedGeoTargetConstant *wrappers.StringValue `protobuf:"bytes,20,opt,name=targeted_geo_target_constant,json=targetedGeoTargetConstant,proto3" json:"targeted_geo_target_constant,omitempty"`
+	// The targeted keyword.
+	TargetedKeyword *common.KeywordInfo `protobuf:"bytes,22,opt,name=targeted_keyword,json=targetedKeyword,proto3" json:"targeted_keyword,omitempty"`
+	// Status of the feed item.
+	// This field is read-only.
+	Status enums.FeedItemStatusEnum_FeedItemStatus `protobuf:"varint,4,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.FeedItemStatusEnum_FeedItemStatus" json:"status,omitempty"`
+	// Extension type.
+	//
+	// Types that are valid to be assigned to Extension:
+	//	*ExtensionFeedItem_SitelinkFeedItem
+	//	*ExtensionFeedItem_StructuredSnippetFeedItem
+	//	*ExtensionFeedItem_AppFeedItem
+	//	*ExtensionFeedItem_CallFeedItem
+	//	*ExtensionFeedItem_CalloutFeedItem
+	//	*ExtensionFeedItem_TextMessageFeedItem
+	//	*ExtensionFeedItem_PriceFeedItem
+	//	*ExtensionFeedItem_PromotionFeedItem
+	//	*ExtensionFeedItem_LocationFeedItem
+	//	*ExtensionFeedItem_AffiliateLocationFeedItem
+	//	*ExtensionFeedItem_HotelCalloutFeedItem
+	Extension isExtensionFeedItem_Extension `protobuf_oneof:"extension"`
+	// Targeting at either the campaign or ad group level. Feed items that target
+	// a campaign or ad group will only serve with that resource.
+	//
+	// Types that are valid to be assigned to ServingResourceTargeting:
+	//	*ExtensionFeedItem_TargetedCampaign
+	//	*ExtensionFeedItem_TargetedAdGroup
+	ServingResourceTargeting isExtensionFeedItem_ServingResourceTargeting `protobuf_oneof:"serving_resource_targeting"`
+	XXX_NoUnkeyedLiteral     struct{}                                     `json:"-"`
+	XXX_unrecognized         []byte                                       `json:"-"`
+	XXX_sizecache            int32                                        `json:"-"`
+}
+
+func (m *ExtensionFeedItem) Reset()         { *m = ExtensionFeedItem{} }
+func (m *ExtensionFeedItem) String() string { return proto.CompactTextString(m) }
+func (*ExtensionFeedItem) ProtoMessage()    {}
+func (*ExtensionFeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d54452736e95564f, []int{0}
+}
+
+func (m *ExtensionFeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExtensionFeedItem.Unmarshal(m, b)
+}
+func (m *ExtensionFeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExtensionFeedItem.Marshal(b, m, deterministic)
+}
+func (m *ExtensionFeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExtensionFeedItem.Merge(m, src)
+}
+func (m *ExtensionFeedItem) XXX_Size() int {
+	return xxx_messageInfo_ExtensionFeedItem.Size(m)
+}
+func (m *ExtensionFeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExtensionFeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExtensionFeedItem proto.InternalMessageInfo
+
+func (m *ExtensionFeedItem) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *ExtensionFeedItem) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetExtensionType() enums.ExtensionTypeEnum_ExtensionType {
+	if m != nil {
+		return m.ExtensionType
+	}
+	return enums.ExtensionTypeEnum_UNSPECIFIED
+}
+
+func (m *ExtensionFeedItem) GetStartDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDateTime
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetEndDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.EndDateTime
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetAdSchedules() []*common.AdScheduleInfo {
+	if m != nil {
+		return m.AdSchedules
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetDevice() enums.FeedItemTargetDeviceEnum_FeedItemTargetDevice {
+	if m != nil {
+		return m.Device
+	}
+	return enums.FeedItemTargetDeviceEnum_UNSPECIFIED
+}
+
+func (m *ExtensionFeedItem) GetTargetedGeoTargetConstant() *wrappers.StringValue {
+	if m != nil {
+		return m.TargetedGeoTargetConstant
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetTargetedKeyword() *common.KeywordInfo {
+	if m != nil {
+		return m.TargetedKeyword
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetStatus() enums.FeedItemStatusEnum_FeedItemStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.FeedItemStatusEnum_UNSPECIFIED
+}
+
+type isExtensionFeedItem_Extension interface {
+	isExtensionFeedItem_Extension()
+}
+
+type ExtensionFeedItem_SitelinkFeedItem struct {
+	SitelinkFeedItem *common.SitelinkFeedItem `protobuf:"bytes,2,opt,name=sitelink_feed_item,json=sitelinkFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_StructuredSnippetFeedItem struct {
+	StructuredSnippetFeedItem *common.StructuredSnippetFeedItem `protobuf:"bytes,3,opt,name=structured_snippet_feed_item,json=structuredSnippetFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_AppFeedItem struct {
+	AppFeedItem *common.AppFeedItem `protobuf:"bytes,7,opt,name=app_feed_item,json=appFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_CallFeedItem struct {
+	CallFeedItem *common.CallFeedItem `protobuf:"bytes,8,opt,name=call_feed_item,json=callFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_CalloutFeedItem struct {
+	CalloutFeedItem *common.CalloutFeedItem `protobuf:"bytes,9,opt,name=callout_feed_item,json=calloutFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_TextMessageFeedItem struct {
+	TextMessageFeedItem *common.TextMessageFeedItem `protobuf:"bytes,10,opt,name=text_message_feed_item,json=textMessageFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_PriceFeedItem struct {
+	PriceFeedItem *common.PriceFeedItem `protobuf:"bytes,11,opt,name=price_feed_item,json=priceFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_PromotionFeedItem struct {
+	PromotionFeedItem *common.PromotionFeedItem `protobuf:"bytes,12,opt,name=promotion_feed_item,json=promotionFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_LocationFeedItem struct {
+	LocationFeedItem *common.LocationFeedItem `protobuf:"bytes,14,opt,name=location_feed_item,json=locationFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_AffiliateLocationFeedItem struct {
+	AffiliateLocationFeedItem *common.AffiliateLocationFeedItem `protobuf:"bytes,15,opt,name=affiliate_location_feed_item,json=affiliateLocationFeedItem,proto3,oneof"`
+}
+
+type ExtensionFeedItem_HotelCalloutFeedItem struct {
+	HotelCalloutFeedItem *common.HotelCalloutFeedItem `protobuf:"bytes,23,opt,name=hotel_callout_feed_item,json=hotelCalloutFeedItem,proto3,oneof"`
+}
+
+func (*ExtensionFeedItem_SitelinkFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_StructuredSnippetFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_AppFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_CallFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_CalloutFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_TextMessageFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_PriceFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_PromotionFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_LocationFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_AffiliateLocationFeedItem) isExtensionFeedItem_Extension() {}
+
+func (*ExtensionFeedItem_HotelCalloutFeedItem) isExtensionFeedItem_Extension() {}
+
+func (m *ExtensionFeedItem) GetExtension() isExtensionFeedItem_Extension {
+	if m != nil {
+		return m.Extension
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetSitelinkFeedItem() *common.SitelinkFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_SitelinkFeedItem); ok {
+		return x.SitelinkFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetStructuredSnippetFeedItem() *common.StructuredSnippetFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_StructuredSnippetFeedItem); ok {
+		return x.StructuredSnippetFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetAppFeedItem() *common.AppFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_AppFeedItem); ok {
+		return x.AppFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetCallFeedItem() *common.CallFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_CallFeedItem); ok {
+		return x.CallFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetCalloutFeedItem() *common.CalloutFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_CalloutFeedItem); ok {
+		return x.CalloutFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetTextMessageFeedItem() *common.TextMessageFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_TextMessageFeedItem); ok {
+		return x.TextMessageFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetPriceFeedItem() *common.PriceFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_PriceFeedItem); ok {
+		return x.PriceFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetPromotionFeedItem() *common.PromotionFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_PromotionFeedItem); ok {
+		return x.PromotionFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetLocationFeedItem() *common.LocationFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_LocationFeedItem); ok {
+		return x.LocationFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetAffiliateLocationFeedItem() *common.AffiliateLocationFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_AffiliateLocationFeedItem); ok {
+		return x.AffiliateLocationFeedItem
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetHotelCalloutFeedItem() *common.HotelCalloutFeedItem {
+	if x, ok := m.GetExtension().(*ExtensionFeedItem_HotelCalloutFeedItem); ok {
+		return x.HotelCalloutFeedItem
+	}
+	return nil
+}
+
+type isExtensionFeedItem_ServingResourceTargeting interface {
+	isExtensionFeedItem_ServingResourceTargeting()
+}
+
+type ExtensionFeedItem_TargetedCampaign struct {
+	TargetedCampaign *wrappers.StringValue `protobuf:"bytes,18,opt,name=targeted_campaign,json=targetedCampaign,proto3,oneof"`
+}
+
+type ExtensionFeedItem_TargetedAdGroup struct {
+	TargetedAdGroup *wrappers.StringValue `protobuf:"bytes,19,opt,name=targeted_ad_group,json=targetedAdGroup,proto3,oneof"`
+}
+
+func (*ExtensionFeedItem_TargetedCampaign) isExtensionFeedItem_ServingResourceTargeting() {}
+
+func (*ExtensionFeedItem_TargetedAdGroup) isExtensionFeedItem_ServingResourceTargeting() {}
+
+func (m *ExtensionFeedItem) GetServingResourceTargeting() isExtensionFeedItem_ServingResourceTargeting {
+	if m != nil {
+		return m.ServingResourceTargeting
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetTargetedCampaign() *wrappers.StringValue {
+	if x, ok := m.GetServingResourceTargeting().(*ExtensionFeedItem_TargetedCampaign); ok {
+		return x.TargetedCampaign
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItem) GetTargetedAdGroup() *wrappers.StringValue {
+	if x, ok := m.GetServingResourceTargeting().(*ExtensionFeedItem_TargetedAdGroup); ok {
+		return x.TargetedAdGroup
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ExtensionFeedItem) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ExtensionFeedItem_SitelinkFeedItem)(nil),
+		(*ExtensionFeedItem_StructuredSnippetFeedItem)(nil),
+		(*ExtensionFeedItem_AppFeedItem)(nil),
+		(*ExtensionFeedItem_CallFeedItem)(nil),
+		(*ExtensionFeedItem_CalloutFeedItem)(nil),
+		(*ExtensionFeedItem_TextMessageFeedItem)(nil),
+		(*ExtensionFeedItem_PriceFeedItem)(nil),
+		(*ExtensionFeedItem_PromotionFeedItem)(nil),
+		(*ExtensionFeedItem_LocationFeedItem)(nil),
+		(*ExtensionFeedItem_AffiliateLocationFeedItem)(nil),
+		(*ExtensionFeedItem_HotelCalloutFeedItem)(nil),
+		(*ExtensionFeedItem_TargetedCampaign)(nil),
+		(*ExtensionFeedItem_TargetedAdGroup)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*ExtensionFeedItem)(nil), "google.ads.googleads.v3.resources.ExtensionFeedItem")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/extension_feed_item.proto", fileDescriptor_d54452736e95564f)
+}
+
+var fileDescriptor_d54452736e95564f = []byte{
+	// 1013 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0x61, 0x4f, 0xdc, 0x36,
+	0x18, 0xde, 0x5d, 0x37, 0x36, 0x7c, 0x1c, 0x70, 0xa6, 0xa2, 0x81, 0xa1, 0x89, 0x6e, 0xaa, 0x84,
+	0xd6, 0x35, 0xd9, 0x38, 0x34, 0x69, 0x87, 0x36, 0xf5, 0x80, 0x0e, 0x68, 0xbb, 0x89, 0x1e, 0x88,
+	0x4d, 0x13, 0x55, 0xe6, 0xc6, 0x2f, 0xc1, 0x23, 0xb1, 0xa3, 0xd8, 0xa1, 0xa0, 0xae, 0x9f, 0xf6,
+	0x4f, 0xf6, 0x71, 0x5f, 0xf7, 0x2f, 0xf6, 0x53, 0xfa, 0x2b, 0xa6, 0x38, 0x89, 0xcf, 0x70, 0x5c,
+	0x73, 0xdf, 0xec, 0xd7, 0xef, 0xf3, 0x3c, 0xaf, 0x9f, 0xbc, 0x76, 0x8c, 0x36, 0x43, 0x21, 0xc2,
+	0x08, 0x3c, 0x42, 0xa5, 0x57, 0x0c, 0xf3, 0xd1, 0x45, 0xd7, 0x4b, 0x41, 0x8a, 0x2c, 0x0d, 0x40,
+	0x7a, 0x70, 0xa9, 0x80, 0x4b, 0x26, 0xb8, 0x7f, 0x0a, 0x40, 0x7d, 0xa6, 0x20, 0x76, 0x93, 0x54,
+	0x28, 0x81, 0xef, 0x17, 0x08, 0x97, 0x50, 0xe9, 0x1a, 0xb0, 0x7b, 0xd1, 0x75, 0x0d, 0x78, 0xf9,
+	0xd1, 0x38, 0xfe, 0x40, 0xc4, 0xb1, 0xe0, 0x5e, 0x90, 0x32, 0x05, 0x29, 0x23, 0x05, 0xe3, 0xb2,
+	0x57, 0x93, 0x6e, 0x6a, 0x91, 0x25, 0x60, 0x7d, 0x1c, 0x00, 0x78, 0x16, 0xdb, 0xb5, 0xab, 0xab,
+	0x04, 0x4a, 0xcc, 0xc6, 0xfb, 0x31, 0x66, 0x97, 0xbe, 0x54, 0x44, 0x65, 0x95, 0xd2, 0xe6, 0xa4,
+	0x28, 0x45, 0xd2, 0x10, 0x94, 0x4f, 0xe1, 0x82, 0x05, 0x95, 0xe4, 0x52, 0x05, 0x4e, 0x98, 0x71,
+	0xb6, 0x5c, 0xfa, 0xac, 0x5c, 0xd2, 0xb3, 0x57, 0xd9, 0xa9, 0xf7, 0x3a, 0x25, 0x49, 0x02, 0x69,
+	0xa5, 0xbb, 0x62, 0x41, 0x09, 0xe7, 0x42, 0x11, 0x35, 0xdc, 0xff, 0xe7, 0xff, 0x76, 0x50, 0xe7,
+	0x49, 0xb5, 0xc9, 0x1f, 0x01, 0xe8, 0xbe, 0x82, 0x18, 0x7f, 0x81, 0xda, 0x95, 0x8a, 0xcf, 0x49,
+	0x0c, 0x4e, 0x63, 0xb5, 0xb1, 0x36, 0x3d, 0x98, 0xa9, 0x82, 0x3f, 0x93, 0x18, 0xf0, 0x43, 0xd4,
+	0x64, 0xd4, 0x71, 0x56, 0x1b, 0x6b, 0xad, 0xf5, 0x4f, 0xcb, 0xef, 0xe7, 0x56, 0x55, 0xb8, 0xfb,
+	0x5c, 0x7d, 0xbb, 0x71, 0x4c, 0xa2, 0x0c, 0x06, 0x4d, 0x46, 0x31, 0xa0, 0xd9, 0xeb, 0x5e, 0x3a,
+	0xed, 0xd5, 0xc6, 0xda, 0xec, 0xfa, 0x0f, 0xee, 0xb8, 0x1e, 0xd0, 0xb6, 0xb8, 0xa6, 0xb6, 0xa3,
+	0xab, 0x04, 0x9e, 0xf0, 0x2c, 0xbe, 0x1e, 0x19, 0xb4, 0xc1, 0x9e, 0xe2, 0x1d, 0x34, 0x27, 0x15,
+	0x49, 0x95, 0x4f, 0x89, 0x02, 0x5f, 0xb1, 0x18, 0x9c, 0x8f, 0x74, 0x81, 0x2b, 0x23, 0x05, 0x1e,
+	0xaa, 0x94, 0xf1, 0xb0, 0xa8, 0xb0, 0xad, 0x41, 0x3b, 0x44, 0xc1, 0x11, 0x8b, 0x01, 0x3f, 0x46,
+	0x6d, 0xe0, 0xd4, 0xe2, 0x98, 0x9a, 0x80, 0xa3, 0x05, 0x9c, 0x1a, 0x86, 0x17, 0x68, 0x86, 0x50,
+	0x5f, 0x06, 0x67, 0x40, 0xb3, 0x08, 0xa4, 0x33, 0xbf, 0x7a, 0x67, 0xad, 0xb5, 0xee, 0x8e, 0xdd,
+	0x6c, 0xd1, 0x9e, 0x6e, 0x9f, 0x1e, 0x96, 0x90, 0x7d, 0x7e, 0x2a, 0x06, 0x2d, 0x62, 0xe6, 0x12,
+	0x53, 0x34, 0x55, 0xb4, 0x84, 0xd3, 0xd1, 0xce, 0x3d, 0xaf, 0x71, 0xae, 0xfa, 0x98, 0x47, 0xba,
+	0x9d, 0x76, 0x34, 0x54, 0x1b, 0x78, 0xdb, 0xc2, 0xa0, 0xe4, 0xc6, 0x2f, 0xd1, 0x4a, 0xd1, 0x7f,
+	0x40, 0xfd, 0x10, 0x44, 0xd5, 0x8c, 0x81, 0xe0, 0x52, 0x11, 0xae, 0x9c, 0xbb, 0x13, 0x38, 0xb1,
+	0x54, 0x31, 0xec, 0x82, 0x28, 0x44, 0xb6, 0x4b, 0x38, 0x3e, 0x46, 0xf3, 0x86, 0xfe, 0x1c, 0xae,
+	0x5e, 0x8b, 0x94, 0x3a, 0x8b, 0x9a, 0xf2, 0x61, 0x9d, 0x37, 0xcf, 0x8a, 0x74, 0x6d, 0xcc, 0x5c,
+	0x45, 0x52, 0x06, 0xf1, 0xaf, 0x68, 0xaa, 0x38, 0x6c, 0xce, 0x87, 0xda, 0x9c, 0xc7, 0x13, 0x9a,
+	0x73, 0xa8, 0x41, 0xd7, 0x6c, 0x29, 0x42, 0x83, 0x92, 0x0f, 0xff, 0x8e, 0xb0, 0x64, 0x0a, 0x22,
+	0xc6, 0xcf, 0x87, 0xf7, 0x97, 0xd3, 0xd4, 0x35, 0x7f, 0x5d, 0x57, 0xf3, 0x61, 0x89, 0xac, 0xb8,
+	0xf7, 0x3e, 0x18, 0xcc, 0xcb, 0x1b, 0x31, 0xfc, 0x27, 0x5a, 0x91, 0x2a, 0xcd, 0x02, 0x95, 0xa5,
+	0x40, 0x7d, 0xc9, 0x59, 0x92, 0x80, 0xb2, 0xb4, 0xee, 0x68, 0xad, 0xef, 0x6a, 0xb5, 0x0c, 0xc7,
+	0x61, 0x41, 0x61, 0x89, 0x2e, 0xc9, 0x71, 0x8b, 0xf8, 0x05, 0x6a, 0x93, 0x24, 0xb1, 0xe4, 0x3e,
+	0x9e, 0xec, 0x73, 0xf4, 0x93, 0xc4, 0x12, 0x68, 0x91, 0xe1, 0x14, 0x1f, 0xa1, 0xd9, 0x80, 0x44,
+	0x91, 0xc5, 0xf9, 0x89, 0xe6, 0xfc, 0xaa, 0x8e, 0x73, 0x9b, 0x44, 0x91, 0x45, 0x3a, 0x13, 0x58,
+	0x73, 0xfc, 0x12, 0x75, 0xf2, 0xb9, 0xc8, 0x6c, 0x6f, 0xa6, 0x35, 0xb1, 0x37, 0x09, 0xb1, 0xc8,
+	0x6c, 0x47, 0xe6, 0x82, 0xeb, 0x21, 0xfc, 0x07, 0x5a, 0x54, 0x70, 0xa9, 0xfc, 0x18, 0xa4, 0x24,
+	0x21, 0x58, 0x1a, 0x48, 0x6b, 0x74, 0xeb, 0x34, 0x8e, 0xe0, 0x52, 0xfd, 0x54, 0x80, 0x2d, 0x9d,
+	0x05, 0x35, 0x1a, 0xc6, 0xbf, 0xa0, 0xb9, 0x24, 0x65, 0x81, 0x2d, 0xd2, 0xd2, 0x22, 0x8f, 0xea,
+	0x44, 0x0e, 0x72, 0x98, 0x45, 0xdf, 0x4e, 0xec, 0x00, 0x0e, 0xd0, 0x42, 0x92, 0x8a, 0x58, 0xa8,
+	0x6b, 0x7f, 0x5b, 0x67, 0x46, 0x93, 0x7f, 0x53, 0x4f, 0x5e, 0x42, 0x2d, 0x81, 0x4e, 0x72, 0x33,
+	0x98, 0x9f, 0x88, 0x48, 0x04, 0xe4, 0x86, 0xc6, 0xec, 0x64, 0x27, 0xe2, 0x79, 0x89, 0xb4, 0x4f,
+	0x44, 0x74, 0x23, 0x96, 0x9f, 0x08, 0x72, 0x7a, 0xca, 0x22, 0x96, 0x5f, 0xc0, 0xb7, 0x68, 0xcd,
+	0x4d, 0x76, 0x22, 0xfa, 0x15, 0xc7, 0x2d, 0xa2, 0x4b, 0x64, 0xdc, 0x22, 0x8e, 0xd1, 0xbd, 0x33,
+	0xa1, 0x20, 0xf2, 0x47, 0xdb, 0xed, 0x9e, 0x16, 0xde, 0xa8, 0x13, 0xde, 0xcb, 0xe1, 0xa3, 0x3d,
+	0x77, 0xf7, 0xec, 0x96, 0x38, 0x7e, 0x86, 0x3a, 0xe6, 0x4a, 0x0c, 0x48, 0x9c, 0x10, 0x16, 0x72,
+	0x07, 0xd7, 0x5f, 0xb3, 0x7b, 0x8d, 0x81, 0xb9, 0x4b, 0xb7, 0x4b, 0x1c, 0x7e, 0x6a, 0x91, 0x11,
+	0xea, 0x87, 0xa9, 0xc8, 0x12, 0x67, 0x61, 0x22, 0x32, 0x73, 0xa7, 0xf6, 0xe9, 0x6e, 0x0e, 0xeb,
+	0xf1, 0x77, 0xfd, 0x73, 0xf4, 0xe5, 0x70, 0x7f, 0xe5, 0x28, 0x61, 0x32, 0xdf, 0xa7, 0x37, 0xfa,
+	0x6a, 0xf8, 0x3e, 0xc8, 0xa4, 0x12, 0x31, 0xa4, 0xd2, 0x7b, 0x53, 0x0d, 0xdf, 0x0e, 0x9f, 0x50,
+	0x55, 0x9e, 0xf4, 0xde, 0xdc, 0xf2, 0x24, 0x7c, 0xbb, 0xd5, 0x42, 0xd3, 0x26, 0xbe, 0xb5, 0x82,
+	0x96, 0x25, 0xa4, 0x17, 0x8c, 0x87, 0xbe, 0x79, 0x89, 0x14, 0x05, 0x32, 0x1e, 0x6e, 0xfd, 0xd5,
+	0x44, 0x0f, 0x02, 0x11, 0xbb, 0xb5, 0xef, 0xc7, 0xad, 0xc5, 0x91, 0x32, 0x0f, 0xf2, 0xed, 0x1f,
+	0x34, 0x7e, 0x7b, 0x5a, 0x82, 0x43, 0x11, 0x11, 0x1e, 0xba, 0x22, 0x0d, 0xbd, 0x10, 0xb8, 0x36,
+	0xc7, 0x1b, 0x6e, 0xf5, 0x3d, 0x0f, 0xdb, 0x4d, 0x33, 0xfa, 0xbb, 0x79, 0x67, 0xb7, 0xdf, 0xff,
+	0xa7, 0x79, 0x7f, 0xb7, 0xa0, 0xec, 0x53, 0xe9, 0x16, 0xc3, 0x7c, 0x74, 0xdc, 0x75, 0x07, 0x55,
+	0xe6, 0x7f, 0x55, 0xce, 0x49, 0x9f, 0xca, 0x13, 0x93, 0x73, 0x72, 0xdc, 0x3d, 0x31, 0x39, 0xef,
+	0x9a, 0x0f, 0x8a, 0x85, 0x5e, 0xaf, 0x4f, 0x65, 0xaf, 0x67, 0xb2, 0x7a, 0xbd, 0xe3, 0x6e, 0xaf,
+	0x67, 0xf2, 0x5e, 0x4d, 0xe9, 0x62, 0xbb, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x03, 0xd9, 0x3f,
+	0x01, 0x84, 0x0b, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/feed.pb.go b/googleapis/ads/googleads/v3/resources/feed.pb.go
new file mode 100644
index 0000000..59945e0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/feed.pb.go
@@ -0,0 +1,635 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/feed.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The operator.
+type FeedAttributeOperation_Operator int32
+
+const (
+	// Unspecified.
+	FeedAttributeOperation_UNSPECIFIED FeedAttributeOperation_Operator = 0
+	// Used for return value only. Represents value unknown in this version.
+	FeedAttributeOperation_UNKNOWN FeedAttributeOperation_Operator = 1
+	// Add the attribute to the existing attributes.
+	FeedAttributeOperation_ADD FeedAttributeOperation_Operator = 2
+)
+
+var FeedAttributeOperation_Operator_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "UNKNOWN",
+	2: "ADD",
+}
+
+var FeedAttributeOperation_Operator_value = map[string]int32{
+	"UNSPECIFIED": 0,
+	"UNKNOWN":     1,
+	"ADD":         2,
+}
+
+func (x FeedAttributeOperation_Operator) String() string {
+	return proto.EnumName(FeedAttributeOperation_Operator_name, int32(x))
+}
+
+func (FeedAttributeOperation_Operator) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_a634570b482d2aa7, []int{2, 0}
+}
+
+// A feed.
+type Feed struct {
+	// The resource name of the feed.
+	// Feed resource names have the form:
+	//
+	// `customers/{customer_id}/feeds/{feed_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the feed.
+	// This field is read-only.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// Name of the feed. Required.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The Feed's attributes. Required on CREATE, unless
+	// system_feed_generation_data is provided, in which case Google Ads will
+	// update the feed with the correct attributes.
+	// Disallowed on UPDATE. Use attribute_operations to add new attributes.
+	Attributes []*FeedAttribute `protobuf:"bytes,4,rep,name=attributes,proto3" json:"attributes,omitempty"`
+	// The list of operations changing the feed attributes. Attributes can only
+	// be added, not removed.
+	AttributeOperations []*FeedAttributeOperation `protobuf:"bytes,9,rep,name=attribute_operations,json=attributeOperations,proto3" json:"attribute_operations,omitempty"`
+	// Specifies who manages the FeedAttributes for the Feed.
+	Origin enums.FeedOriginEnum_FeedOrigin `protobuf:"varint,5,opt,name=origin,proto3,enum=google.ads.googleads.v3.enums.FeedOriginEnum_FeedOrigin" json:"origin,omitempty"`
+	// Status of the feed.
+	// This field is read-only.
+	Status enums.FeedStatusEnum_FeedStatus `protobuf:"varint,8,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.FeedStatusEnum_FeedStatus" json:"status,omitempty"`
+	// The system data for the Feed. This data specifies information for
+	// generating the feed items of the system generated feed.
+	//
+	// Types that are valid to be assigned to SystemFeedGenerationData:
+	//	*Feed_PlacesLocationFeedData_
+	//	*Feed_AffiliateLocationFeedData_
+	SystemFeedGenerationData isFeed_SystemFeedGenerationData `protobuf_oneof:"system_feed_generation_data"`
+	XXX_NoUnkeyedLiteral     struct{}                        `json:"-"`
+	XXX_unrecognized         []byte                          `json:"-"`
+	XXX_sizecache            int32                           `json:"-"`
+}
+
+func (m *Feed) Reset()         { *m = Feed{} }
+func (m *Feed) String() string { return proto.CompactTextString(m) }
+func (*Feed) ProtoMessage()    {}
+func (*Feed) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a634570b482d2aa7, []int{0}
+}
+
+func (m *Feed) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Feed.Unmarshal(m, b)
+}
+func (m *Feed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Feed.Marshal(b, m, deterministic)
+}
+func (m *Feed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Feed.Merge(m, src)
+}
+func (m *Feed) XXX_Size() int {
+	return xxx_messageInfo_Feed.Size(m)
+}
+func (m *Feed) XXX_DiscardUnknown() {
+	xxx_messageInfo_Feed.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Feed proto.InternalMessageInfo
+
+func (m *Feed) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *Feed) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Feed) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *Feed) GetAttributes() []*FeedAttribute {
+	if m != nil {
+		return m.Attributes
+	}
+	return nil
+}
+
+func (m *Feed) GetAttributeOperations() []*FeedAttributeOperation {
+	if m != nil {
+		return m.AttributeOperations
+	}
+	return nil
+}
+
+func (m *Feed) GetOrigin() enums.FeedOriginEnum_FeedOrigin {
+	if m != nil {
+		return m.Origin
+	}
+	return enums.FeedOriginEnum_UNSPECIFIED
+}
+
+func (m *Feed) GetStatus() enums.FeedStatusEnum_FeedStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.FeedStatusEnum_UNSPECIFIED
+}
+
+type isFeed_SystemFeedGenerationData interface {
+	isFeed_SystemFeedGenerationData()
+}
+
+type Feed_PlacesLocationFeedData_ struct {
+	PlacesLocationFeedData *Feed_PlacesLocationFeedData `protobuf:"bytes,6,opt,name=places_location_feed_data,json=placesLocationFeedData,proto3,oneof"`
+}
+
+type Feed_AffiliateLocationFeedData_ struct {
+	AffiliateLocationFeedData *Feed_AffiliateLocationFeedData `protobuf:"bytes,7,opt,name=affiliate_location_feed_data,json=affiliateLocationFeedData,proto3,oneof"`
+}
+
+func (*Feed_PlacesLocationFeedData_) isFeed_SystemFeedGenerationData() {}
+
+func (*Feed_AffiliateLocationFeedData_) isFeed_SystemFeedGenerationData() {}
+
+func (m *Feed) GetSystemFeedGenerationData() isFeed_SystemFeedGenerationData {
+	if m != nil {
+		return m.SystemFeedGenerationData
+	}
+	return nil
+}
+
+func (m *Feed) GetPlacesLocationFeedData() *Feed_PlacesLocationFeedData {
+	if x, ok := m.GetSystemFeedGenerationData().(*Feed_PlacesLocationFeedData_); ok {
+		return x.PlacesLocationFeedData
+	}
+	return nil
+}
+
+func (m *Feed) GetAffiliateLocationFeedData() *Feed_AffiliateLocationFeedData {
+	if x, ok := m.GetSystemFeedGenerationData().(*Feed_AffiliateLocationFeedData_); ok {
+		return x.AffiliateLocationFeedData
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Feed) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Feed_PlacesLocationFeedData_)(nil),
+		(*Feed_AffiliateLocationFeedData_)(nil),
+	}
+}
+
+// Data used to configure a location feed populated from Google My Business
+// Locations.
+type Feed_PlacesLocationFeedData struct {
+	// Required authentication token (from OAuth API) for the email.
+	// This field can only be specified in a create request. All its subfields
+	// are not selectable.
+	OauthInfo *Feed_PlacesLocationFeedData_OAuthInfo `protobuf:"bytes,1,opt,name=oauth_info,json=oauthInfo,proto3" json:"oauth_info,omitempty"`
+	// Email address of a Google My Business account or email address of a
+	// manager of the Google My Business account. Required.
+	EmailAddress *wrappers.StringValue `protobuf:"bytes,2,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"`
+	// Plus page ID of the managed business whose locations should be used. If
+	// this field is not set, then all businesses accessible by the user
+	// (specified by email_address) are used.
+	// This field is mutate-only and is not selectable.
+	BusinessAccountId *wrappers.StringValue `protobuf:"bytes,10,opt,name=business_account_id,json=businessAccountId,proto3" json:"business_account_id,omitempty"`
+	// Used to filter Google My Business listings by business name. If
+	// business_name_filter is set, only listings with a matching business name
+	// are candidates to be sync'd into FeedItems.
+	BusinessNameFilter *wrappers.StringValue `protobuf:"bytes,4,opt,name=business_name_filter,json=businessNameFilter,proto3" json:"business_name_filter,omitempty"`
+	// Used to filter Google My Business listings by categories. If entries
+	// exist in category_filters, only listings that belong to any of the
+	// categories are candidates to be sync'd into FeedItems. If no entries
+	// exist in category_filters, then all listings are candidates for syncing.
+	CategoryFilters []*wrappers.StringValue `protobuf:"bytes,5,rep,name=category_filters,json=categoryFilters,proto3" json:"category_filters,omitempty"`
+	// Used to filter Google My Business listings by labels. If entries exist in
+	// label_filters, only listings that has any of the labels set are
+	// candidates to be synchronized into FeedItems. If no entries exist in
+	// label_filters, then all listings are candidates for syncing.
+	LabelFilters         []*wrappers.StringValue `protobuf:"bytes,6,rep,name=label_filters,json=labelFilters,proto3" json:"label_filters,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *Feed_PlacesLocationFeedData) Reset()         { *m = Feed_PlacesLocationFeedData{} }
+func (m *Feed_PlacesLocationFeedData) String() string { return proto.CompactTextString(m) }
+func (*Feed_PlacesLocationFeedData) ProtoMessage()    {}
+func (*Feed_PlacesLocationFeedData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a634570b482d2aa7, []int{0, 0}
+}
+
+func (m *Feed_PlacesLocationFeedData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Feed_PlacesLocationFeedData.Unmarshal(m, b)
+}
+func (m *Feed_PlacesLocationFeedData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Feed_PlacesLocationFeedData.Marshal(b, m, deterministic)
+}
+func (m *Feed_PlacesLocationFeedData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Feed_PlacesLocationFeedData.Merge(m, src)
+}
+func (m *Feed_PlacesLocationFeedData) XXX_Size() int {
+	return xxx_messageInfo_Feed_PlacesLocationFeedData.Size(m)
+}
+func (m *Feed_PlacesLocationFeedData) XXX_DiscardUnknown() {
+	xxx_messageInfo_Feed_PlacesLocationFeedData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Feed_PlacesLocationFeedData proto.InternalMessageInfo
+
+func (m *Feed_PlacesLocationFeedData) GetOauthInfo() *Feed_PlacesLocationFeedData_OAuthInfo {
+	if m != nil {
+		return m.OauthInfo
+	}
+	return nil
+}
+
+func (m *Feed_PlacesLocationFeedData) GetEmailAddress() *wrappers.StringValue {
+	if m != nil {
+		return m.EmailAddress
+	}
+	return nil
+}
+
+func (m *Feed_PlacesLocationFeedData) GetBusinessAccountId() *wrappers.StringValue {
+	if m != nil {
+		return m.BusinessAccountId
+	}
+	return nil
+}
+
+func (m *Feed_PlacesLocationFeedData) GetBusinessNameFilter() *wrappers.StringValue {
+	if m != nil {
+		return m.BusinessNameFilter
+	}
+	return nil
+}
+
+func (m *Feed_PlacesLocationFeedData) GetCategoryFilters() []*wrappers.StringValue {
+	if m != nil {
+		return m.CategoryFilters
+	}
+	return nil
+}
+
+func (m *Feed_PlacesLocationFeedData) GetLabelFilters() []*wrappers.StringValue {
+	if m != nil {
+		return m.LabelFilters
+	}
+	return nil
+}
+
+// Data used for authorization using OAuth.
+type Feed_PlacesLocationFeedData_OAuthInfo struct {
+	// The HTTP method used to obtain authorization.
+	HttpMethod *wrappers.StringValue `protobuf:"bytes,1,opt,name=http_method,json=httpMethod,proto3" json:"http_method,omitempty"`
+	// The HTTP request URL used to obtain authorization.
+	HttpRequestUrl *wrappers.StringValue `protobuf:"bytes,2,opt,name=http_request_url,json=httpRequestUrl,proto3" json:"http_request_url,omitempty"`
+	// The HTTP authorization header used to obtain authorization.
+	HttpAuthorizationHeader *wrappers.StringValue `protobuf:"bytes,3,opt,name=http_authorization_header,json=httpAuthorizationHeader,proto3" json:"http_authorization_header,omitempty"`
+	XXX_NoUnkeyedLiteral    struct{}              `json:"-"`
+	XXX_unrecognized        []byte                `json:"-"`
+	XXX_sizecache           int32                 `json:"-"`
+}
+
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) Reset()         { *m = Feed_PlacesLocationFeedData_OAuthInfo{} }
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) String() string { return proto.CompactTextString(m) }
+func (*Feed_PlacesLocationFeedData_OAuthInfo) ProtoMessage()    {}
+func (*Feed_PlacesLocationFeedData_OAuthInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a634570b482d2aa7, []int{0, 0, 0}
+}
+
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Feed_PlacesLocationFeedData_OAuthInfo.Unmarshal(m, b)
+}
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Feed_PlacesLocationFeedData_OAuthInfo.Marshal(b, m, deterministic)
+}
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Feed_PlacesLocationFeedData_OAuthInfo.Merge(m, src)
+}
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) XXX_Size() int {
+	return xxx_messageInfo_Feed_PlacesLocationFeedData_OAuthInfo.Size(m)
+}
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_Feed_PlacesLocationFeedData_OAuthInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Feed_PlacesLocationFeedData_OAuthInfo proto.InternalMessageInfo
+
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) GetHttpMethod() *wrappers.StringValue {
+	if m != nil {
+		return m.HttpMethod
+	}
+	return nil
+}
+
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) GetHttpRequestUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.HttpRequestUrl
+	}
+	return nil
+}
+
+func (m *Feed_PlacesLocationFeedData_OAuthInfo) GetHttpAuthorizationHeader() *wrappers.StringValue {
+	if m != nil {
+		return m.HttpAuthorizationHeader
+	}
+	return nil
+}
+
+// Data used to configure an affiliate location feed populated with the
+// specified chains.
+type Feed_AffiliateLocationFeedData struct {
+	// The list of chains that the affiliate location feed will sync the
+	// locations from.
+	ChainIds []*wrappers.Int64Value `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"`
+	// The relationship the chains have with the advertiser.
+	RelationshipType     enums.AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType `protobuf:"varint,2,opt,name=relationship_type,json=relationshipType,proto3,enum=google.ads.googleads.v3.enums.AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType" json:"relationship_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                                              `json:"-"`
+	XXX_unrecognized     []byte                                                                                `json:"-"`
+	XXX_sizecache        int32                                                                                 `json:"-"`
+}
+
+func (m *Feed_AffiliateLocationFeedData) Reset()         { *m = Feed_AffiliateLocationFeedData{} }
+func (m *Feed_AffiliateLocationFeedData) String() string { return proto.CompactTextString(m) }
+func (*Feed_AffiliateLocationFeedData) ProtoMessage()    {}
+func (*Feed_AffiliateLocationFeedData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a634570b482d2aa7, []int{0, 1}
+}
+
+func (m *Feed_AffiliateLocationFeedData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Feed_AffiliateLocationFeedData.Unmarshal(m, b)
+}
+func (m *Feed_AffiliateLocationFeedData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Feed_AffiliateLocationFeedData.Marshal(b, m, deterministic)
+}
+func (m *Feed_AffiliateLocationFeedData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Feed_AffiliateLocationFeedData.Merge(m, src)
+}
+func (m *Feed_AffiliateLocationFeedData) XXX_Size() int {
+	return xxx_messageInfo_Feed_AffiliateLocationFeedData.Size(m)
+}
+func (m *Feed_AffiliateLocationFeedData) XXX_DiscardUnknown() {
+	xxx_messageInfo_Feed_AffiliateLocationFeedData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Feed_AffiliateLocationFeedData proto.InternalMessageInfo
+
+func (m *Feed_AffiliateLocationFeedData) GetChainIds() []*wrappers.Int64Value {
+	if m != nil {
+		return m.ChainIds
+	}
+	return nil
+}
+
+func (m *Feed_AffiliateLocationFeedData) GetRelationshipType() enums.AffiliateLocationFeedRelationshipTypeEnum_AffiliateLocationFeedRelationshipType {
+	if m != nil {
+		return m.RelationshipType
+	}
+	return enums.AffiliateLocationFeedRelationshipTypeEnum_UNSPECIFIED
+}
+
+// FeedAttributes define the types of data expected to be present in a Feed. A
+// single FeedAttribute specifies the expected type of the FeedItemAttributes
+// with the same FeedAttributeId. Optionally, a FeedAttribute can be marked as
+// being part of a FeedItem's unique key.
+type FeedAttribute struct {
+	// ID of the attribute.
+	Id *wrappers.Int64Value `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the attribute. Required.
+	Name *wrappers.StringValue `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	// Data type for feed attribute. Required.
+	Type enums.FeedAttributeTypeEnum_FeedAttributeType `protobuf:"varint,3,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.FeedAttributeTypeEnum_FeedAttributeType" json:"type,omitempty"`
+	// Indicates that data corresponding to this attribute is part of a
+	// FeedItem's unique key. It defaults to false if it is unspecified. Note
+	// that a unique key is not required in a Feed's schema, in which case the
+	// FeedItems must be referenced by their feed_item_id.
+	IsPartOfKey          *wrappers.BoolValue `protobuf:"bytes,4,opt,name=is_part_of_key,json=isPartOfKey,proto3" json:"is_part_of_key,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *FeedAttribute) Reset()         { *m = FeedAttribute{} }
+func (m *FeedAttribute) String() string { return proto.CompactTextString(m) }
+func (*FeedAttribute) ProtoMessage()    {}
+func (*FeedAttribute) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a634570b482d2aa7, []int{1}
+}
+
+func (m *FeedAttribute) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedAttribute.Unmarshal(m, b)
+}
+func (m *FeedAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedAttribute.Marshal(b, m, deterministic)
+}
+func (m *FeedAttribute) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedAttribute.Merge(m, src)
+}
+func (m *FeedAttribute) XXX_Size() int {
+	return xxx_messageInfo_FeedAttribute.Size(m)
+}
+func (m *FeedAttribute) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedAttribute.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedAttribute proto.InternalMessageInfo
+
+func (m *FeedAttribute) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *FeedAttribute) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *FeedAttribute) GetType() enums.FeedAttributeTypeEnum_FeedAttributeType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.FeedAttributeTypeEnum_UNSPECIFIED
+}
+
+func (m *FeedAttribute) GetIsPartOfKey() *wrappers.BoolValue {
+	if m != nil {
+		return m.IsPartOfKey
+	}
+	return nil
+}
+
+// Operation to be performed on a feed attribute list in a mutate.
+type FeedAttributeOperation struct {
+	// Type of list operation to perform.
+	Operator FeedAttributeOperation_Operator `protobuf:"varint,1,opt,name=operator,proto3,enum=google.ads.googleads.v3.resources.FeedAttributeOperation_Operator" json:"operator,omitempty"`
+	// The feed attribute being added to the list.
+	Value                *FeedAttribute `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
+}
+
+func (m *FeedAttributeOperation) Reset()         { *m = FeedAttributeOperation{} }
+func (m *FeedAttributeOperation) String() string { return proto.CompactTextString(m) }
+func (*FeedAttributeOperation) ProtoMessage()    {}
+func (*FeedAttributeOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a634570b482d2aa7, []int{2}
+}
+
+func (m *FeedAttributeOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedAttributeOperation.Unmarshal(m, b)
+}
+func (m *FeedAttributeOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedAttributeOperation.Marshal(b, m, deterministic)
+}
+func (m *FeedAttributeOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedAttributeOperation.Merge(m, src)
+}
+func (m *FeedAttributeOperation) XXX_Size() int {
+	return xxx_messageInfo_FeedAttributeOperation.Size(m)
+}
+func (m *FeedAttributeOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedAttributeOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedAttributeOperation proto.InternalMessageInfo
+
+func (m *FeedAttributeOperation) GetOperator() FeedAttributeOperation_Operator {
+	if m != nil {
+		return m.Operator
+	}
+	return FeedAttributeOperation_UNSPECIFIED
+}
+
+func (m *FeedAttributeOperation) GetValue() *FeedAttribute {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterEnum("google.ads.googleads.v3.resources.FeedAttributeOperation_Operator", FeedAttributeOperation_Operator_name, FeedAttributeOperation_Operator_value)
+	proto.RegisterType((*Feed)(nil), "google.ads.googleads.v3.resources.Feed")
+	proto.RegisterType((*Feed_PlacesLocationFeedData)(nil), "google.ads.googleads.v3.resources.Feed.PlacesLocationFeedData")
+	proto.RegisterType((*Feed_PlacesLocationFeedData_OAuthInfo)(nil), "google.ads.googleads.v3.resources.Feed.PlacesLocationFeedData.OAuthInfo")
+	proto.RegisterType((*Feed_AffiliateLocationFeedData)(nil), "google.ads.googleads.v3.resources.Feed.AffiliateLocationFeedData")
+	proto.RegisterType((*FeedAttribute)(nil), "google.ads.googleads.v3.resources.FeedAttribute")
+	proto.RegisterType((*FeedAttributeOperation)(nil), "google.ads.googleads.v3.resources.FeedAttributeOperation")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/feed.proto", fileDescriptor_a634570b482d2aa7)
+}
+
+var fileDescriptor_a634570b482d2aa7 = []byte{
+	// 1078 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x96, 0x4f, 0x6f, 0xe3, 0x44,
+	0x18, 0xc6, 0xd7, 0xe9, 0x9f, 0x6d, 0x26, 0x6d, 0x36, 0x3b, 0xbb, 0x2a, 0x6e, 0xb6, 0x8b, 0xda,
+	0xa2, 0x95, 0x2a, 0x81, 0xec, 0x25, 0x41, 0xb0, 0x04, 0x01, 0x72, 0x68, 0xd3, 0x86, 0xdd, 0x4d,
+	0x22, 0x97, 0x16, 0xb4, 0xaa, 0xb0, 0xa6, 0xf1, 0xc4, 0x19, 0x61, 0x7b, 0xcc, 0xcc, 0xb8, 0x28,
+	0x54, 0x7b, 0xe3, 0xc6, 0x47, 0xe0, 0xc6, 0x91, 0x03, 0x1f, 0x84, 0xef, 0xc0, 0x17, 0x58, 0x71,
+	0x5b, 0x89, 0x33, 0xf2, 0x8c, 0xed, 0x86, 0x6d, 0x9b, 0xba, 0x70, 0xca, 0x78, 0xe6, 0x79, 0x7e,
+	0xf3, 0xfa, 0x1d, 0xbf, 0xf3, 0x06, 0xbc, 0xe7, 0x51, 0xea, 0xf9, 0xd8, 0x44, 0x2e, 0x37, 0xd5,
+	0x30, 0x19, 0x9d, 0x36, 0x4d, 0x86, 0x39, 0x8d, 0xd9, 0x10, 0x73, 0x73, 0x84, 0xb1, 0x6b, 0x44,
+	0x8c, 0x0a, 0x0a, 0x37, 0x95, 0xc4, 0x40, 0x2e, 0x37, 0x72, 0xb5, 0x71, 0xda, 0x34, 0x72, 0x75,
+	0xfd, 0xf9, 0x55, 0x40, 0x1c, 0xc6, 0x01, 0x37, 0xd1, 0x68, 0x44, 0x7c, 0x82, 0x04, 0x76, 0x7c,
+	0x3a, 0x44, 0x82, 0xd0, 0xd0, 0x49, 0xf8, 0x0e, 0xc3, 0xbe, 0x7c, 0xe2, 0x63, 0x12, 0x39, 0x62,
+	0x12, 0x61, 0xb5, 0x63, 0xfd, 0xa3, 0xd9, 0x38, 0xe9, 0x45, 0x42, 0x30, 0x72, 0x12, 0x0b, 0x3c,
+	0x6d, 0x34, 0x0b, 0x18, 0x29, 0x23, 0x1e, 0x09, 0x6f, 0x60, 0xe0, 0x02, 0x89, 0x98, 0xa7, 0x86,
+	0xb5, 0xcc, 0x10, 0x91, 0x3c, 0x5b, 0xe9, 0xd2, 0xdb, 0xe9, 0x92, 0x7c, 0x3a, 0x89, 0x47, 0xe6,
+	0x0f, 0x0c, 0x45, 0x11, 0x66, 0x99, 0x75, 0x7d, 0xca, 0x8a, 0xc2, 0x90, 0x0a, 0xf5, 0xee, 0x6a,
+	0x75, 0xeb, 0xf7, 0x2a, 0x98, 0xef, 0x60, 0xec, 0xc2, 0x77, 0xc0, 0x4a, 0x06, 0x76, 0x42, 0x14,
+	0x60, 0x5d, 0xdb, 0xd0, 0xb6, 0xcb, 0xf6, 0x72, 0x36, 0xd9, 0x43, 0x01, 0x86, 0xef, 0x82, 0x12,
+	0x71, 0xf5, 0xd2, 0x86, 0xb6, 0x5d, 0x69, 0x3c, 0x48, 0x4f, 0xc5, 0xc8, 0x36, 0x36, 0xba, 0xa1,
+	0xf8, 0xf0, 0x83, 0x23, 0xe4, 0xc7, 0xd8, 0x2e, 0x11, 0x17, 0x3e, 0x06, 0xf3, 0x12, 0x34, 0x27,
+	0xe5, 0xeb, 0x17, 0xe4, 0x07, 0x82, 0x91, 0xd0, 0x53, 0x7a, 0xa9, 0x84, 0x03, 0x00, 0xf2, 0xfc,
+	0x72, 0x7d, 0x7e, 0x63, 0x6e, 0xbb, 0xd2, 0x78, 0x6c, 0x5c, 0xfb, 0x1d, 0x18, 0xc9, 0x0b, 0x58,
+	0x99, 0xd1, 0x9e, 0x62, 0x40, 0x1f, 0xdc, 0x3f, 0x3f, 0x31, 0x1a, 0x61, 0xa6, 0x5e, 0x5e, 0x2f,
+	0x4b, 0xf6, 0xc7, 0x37, 0x65, 0xf7, 0x33, 0x82, 0x7d, 0x0f, 0x5d, 0x98, 0xe3, 0x70, 0x00, 0x16,
+	0xd5, 0x31, 0xeb, 0x0b, 0x1b, 0xda, 0x76, 0xb5, 0xf1, 0xe4, 0x4a, 0xbe, 0x3c, 0x67, 0xc9, 0xee,
+	0x4b, 0xc3, 0x6e, 0x18, 0x07, 0x53, 0x8f, 0x76, 0xca, 0x49, 0x88, 0xea, 0x3b, 0xd0, 0x97, 0x0a,
+	0x13, 0x0f, 0xa4, 0x21, 0x27, 0xaa, 0x47, 0x3b, 0xe5, 0xc0, 0x33, 0xb0, 0x16, 0xf9, 0x68, 0x88,
+	0xf9, 0x1b, 0x45, 0xe1, 0x22, 0x81, 0xf4, 0x45, 0x79, 0x54, 0x9f, 0x15, 0x4c, 0x8b, 0x31, 0x90,
+	0xa0, 0x67, 0x29, 0x27, 0x99, 0xda, 0x41, 0x02, 0xed, 0xdf, 0xb2, 0x57, 0xa3, 0x4b, 0x57, 0xe0,
+	0x4f, 0x1a, 0x58, 0xbf, 0xaa, 0x2a, 0x65, 0x00, 0xb7, 0x65, 0x00, 0x56, 0xd1, 0x00, 0xac, 0x8c,
+	0x75, 0x49, 0x0c, 0x6b, 0xe8, 0xaa, 0xc5, 0xfa, 0x9f, 0x0b, 0x60, 0xf5, 0xf2, 0xd8, 0xa1, 0x07,
+	0x00, 0x45, 0xb1, 0x18, 0x3b, 0x24, 0x1c, 0x51, 0x59, 0x03, 0x95, 0xc6, 0xfe, 0xff, 0xcb, 0x87,
+	0xd1, 0xb7, 0x62, 0x31, 0xee, 0x86, 0x23, 0x6a, 0x97, 0x25, 0x3b, 0x19, 0x42, 0x0b, 0xac, 0xe0,
+	0x00, 0x11, 0xdf, 0x41, 0xae, 0xcb, 0x30, 0xe7, 0x69, 0x55, 0xcd, 0x2e, 0x93, 0x65, 0x69, 0xb1,
+	0x94, 0x03, 0x3e, 0x03, 0xf7, 0x4e, 0x62, 0x4e, 0x42, 0xcc, 0xb9, 0x83, 0x86, 0x43, 0x1a, 0x87,
+	0xc2, 0x21, 0xae, 0x0e, 0x0a, 0x80, 0xee, 0x66, 0x46, 0x4b, 0xf9, 0xba, 0x2e, 0xec, 0x81, 0xfb,
+	0x39, 0x2d, 0xa9, 0x46, 0x67, 0x44, 0x7c, 0x81, 0x99, 0x3e, 0x5f, 0x00, 0x07, 0x33, 0x67, 0x72,
+	0x4b, 0x74, 0xa4, 0x0f, 0xee, 0x81, 0xda, 0x10, 0x09, 0xec, 0x51, 0x36, 0x49, 0x51, 0x5c, 0x5f,
+	0x90, 0x65, 0x37, 0x9b, 0x75, 0x27, 0x73, 0x29, 0x0e, 0x4f, 0x32, 0xe5, 0xa3, 0x13, 0xec, 0xe7,
+	0x94, 0xc5, 0x02, 0x94, 0x65, 0x69, 0x49, 0x11, 0xf5, 0xbf, 0x34, 0x50, 0xce, 0x4f, 0x01, 0x7e,
+	0x0a, 0x2a, 0x63, 0x21, 0x22, 0x27, 0xc0, 0x62, 0x4c, 0xdd, 0xf4, 0x90, 0x67, 0xe3, 0x40, 0x62,
+	0x78, 0x2e, 0xf5, 0xb0, 0x03, 0x6a, 0xd2, 0xce, 0xf0, 0xf7, 0x31, 0xe6, 0xc2, 0x89, 0x99, 0x5f,
+	0xe8, 0xf0, 0xaa, 0x89, 0xcb, 0x56, 0xa6, 0x43, 0xe6, 0xc3, 0x6f, 0xc0, 0x9a, 0xe4, 0x24, 0x9f,
+	0x04, 0x65, 0xe4, 0x47, 0x55, 0x0b, 0x63, 0x8c, 0x5c, 0xcc, 0x0a, 0x5d, 0x9a, 0x6f, 0x25, 0x76,
+	0x6b, 0xda, 0xbd, 0x2f, 0xcd, 0xf5, 0xd7, 0x1a, 0x58, 0xbb, 0xb2, 0x34, 0xe0, 0x13, 0x50, 0x1e,
+	0x8e, 0x11, 0x09, 0x1d, 0xe2, 0x72, 0x5d, 0x93, 0xb9, 0x9c, 0x79, 0x97, 0x2f, 0x49, 0x75, 0xd7,
+	0xe5, 0xf0, 0x17, 0x0d, 0xdc, 0xbd, 0xd0, 0x3c, 0xe5, 0xbb, 0x57, 0x1b, 0xe1, 0x35, 0x37, 0xd3,
+	0xa5, 0xf1, 0xd8, 0x53, 0xb0, 0xaf, 0x26, 0x11, 0x96, 0x97, 0x56, 0x21, 0xa5, 0x5d, 0x63, 0x6f,
+	0xcc, 0xb4, 0x76, 0x5f, 0x59, 0x6d, 0xf0, 0xf0, 0x7c, 0xeb, 0x74, 0x14, 0x11, 0x6e, 0x0c, 0x69,
+	0x60, 0xca, 0x2e, 0xb7, 0x39, 0x8c, 0xb9, 0xa0, 0x01, 0x66, 0xdc, 0x3c, 0xcb, 0x86, 0x2f, 0x65,
+	0xbf, 0xe5, 0xe6, 0x59, 0xf2, 0xf3, 0xb2, 0xfd, 0x10, 0x3c, 0xe0, 0x13, 0x2e, 0x70, 0xa0, 0xae,
+	0x25, 0x0f, 0x87, 0xe9, 0xfd, 0x2e, 0x6f, 0xa8, 0xad, 0x9f, 0x4b, 0x60, 0xe5, 0x5f, 0x3d, 0x21,
+	0x6d, 0x8a, 0xda, 0xcd, 0x9a, 0x62, 0xa9, 0x70, 0x53, 0x7c, 0x01, 0xe6, 0x65, 0x9a, 0xe7, 0x64,
+	0x9a, 0x3b, 0x05, 0x1a, 0x40, 0x1e, 0x5a, 0x9e, 0xd2, 0x0b, 0xb3, 0xb6, 0x64, 0xc2, 0xcf, 0x41,
+	0x95, 0x70, 0x27, 0x42, 0x4c, 0x38, 0x74, 0xe4, 0x7c, 0x87, 0x27, 0x69, 0xb5, 0xd7, 0x2f, 0xc4,
+	0xd5, 0xa6, 0xd4, 0x57, 0x51, 0x55, 0x08, 0x1f, 0x20, 0x26, 0xfa, 0xa3, 0xa7, 0x78, 0xb2, 0xf5,
+	0x5a, 0x03, 0xab, 0x97, 0x77, 0x48, 0xf8, 0x2d, 0x58, 0x52, 0x0d, 0x97, 0x32, 0x99, 0x9c, 0x6a,
+	0xa3, 0xfd, 0x9f, 0xdb, 0xad, 0xd1, 0x4f, 0x49, 0x76, 0xce, 0x84, 0x1d, 0xb0, 0x70, 0x9a, 0x04,
+	0x94, 0xa6, 0xf2, 0xe6, 0xff, 0x13, 0x94, 0x7d, 0xeb, 0x7d, 0xb0, 0x94, 0xd1, 0xe1, 0x1d, 0x50,
+	0x39, 0xec, 0x1d, 0x0c, 0x76, 0xbf, 0xe8, 0x76, 0xba, 0xbb, 0x3b, 0xb5, 0x5b, 0xb0, 0x02, 0x6e,
+	0x1f, 0xf6, 0x9e, 0xf6, 0xfa, 0x5f, 0xf7, 0x6a, 0x1a, 0xbc, 0x0d, 0xe6, 0xac, 0x9d, 0x9d, 0x5a,
+	0xa9, 0xfd, 0xb7, 0x06, 0x1e, 0x0d, 0x69, 0x70, 0xfd, 0x8e, 0xed, 0x72, 0xb2, 0xe5, 0x20, 0x49,
+	0xe2, 0x40, 0x7b, 0xf1, 0x65, 0xaa, 0xf7, 0xa8, 0x8f, 0x42, 0xcf, 0xa0, 0xcc, 0x33, 0x3d, 0x1c,
+	0xca, 0x14, 0x9b, 0xe7, 0x1f, 0xeb, 0x8c, 0xbf, 0xc7, 0x9f, 0xe4, 0xa3, 0x5f, 0x4b, 0x73, 0x7b,
+	0x96, 0xf5, 0x5b, 0x69, 0x73, 0x4f, 0x21, 0x2d, 0x97, 0x1b, 0x6a, 0x98, 0x8c, 0x8e, 0x9a, 0x86,
+	0x9d, 0x29, 0xff, 0xc8, 0x34, 0xc7, 0x96, 0xcb, 0x8f, 0x73, 0xcd, 0xf1, 0x51, 0xf3, 0x38, 0xd7,
+	0xbc, 0x2a, 0x3d, 0x52, 0x0b, 0xad, 0x96, 0xe5, 0xf2, 0x56, 0x2b, 0x57, 0xb5, 0x5a, 0x47, 0xcd,
+	0x56, 0x2b, 0xd7, 0x9d, 0x2c, 0xca, 0x60, 0x9b, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x23,
+	0x8d, 0x02, 0xca, 0x0b, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/feed_item.pb.go b/googleapis/ads/googleads/v3/resources/feed_item.pb.go
new file mode 100644
index 0000000..a20a596
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/feed_item.pb.go
@@ -0,0 +1,591 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/feed_item.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	errors "google.golang.org/genproto/googleapis/ads/googleads/v3/errors"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A feed item.
+type FeedItem struct {
+	// The resource name of the feed item.
+	// Feed item resource names have the form:
+	//
+	// `customers/{customer_id}/feedItems/{feed_id}~{feed_item_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The feed to which this feed item belongs.
+	Feed *wrappers.StringValue `protobuf:"bytes,2,opt,name=feed,proto3" json:"feed,omitempty"`
+	// The ID of this feed item.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// Start time in which this feed item is effective and can begin serving. The
+	// time is in the customer's time zone.
+	// The format is "YYYY-MM-DD HH:MM:SS".
+	// Examples: "2018-03-05 09:15:00" or "2018-02-01 14:34:30"
+	StartDateTime *wrappers.StringValue `protobuf:"bytes,4,opt,name=start_date_time,json=startDateTime,proto3" json:"start_date_time,omitempty"`
+	// End time in which this feed item is no longer effective and will stop
+	// serving. The time is in the customer's time zone.
+	// The format is "YYYY-MM-DD HH:MM:SS".
+	// Examples: "2018-03-05 09:15:00" or "2018-02-01 14:34:30"
+	EndDateTime *wrappers.StringValue `protobuf:"bytes,5,opt,name=end_date_time,json=endDateTime,proto3" json:"end_date_time,omitempty"`
+	// The feed item's attribute values.
+	AttributeValues []*FeedItemAttributeValue `protobuf:"bytes,6,rep,name=attribute_values,json=attributeValues,proto3" json:"attribute_values,omitempty"`
+	// Geo targeting restriction specifies the type of location that can be used
+	// for targeting.
+	GeoTargetingRestriction enums.GeoTargetingRestrictionEnum_GeoTargetingRestriction `protobuf:"varint,7,opt,name=geo_targeting_restriction,json=geoTargetingRestriction,proto3,enum=google.ads.googleads.v3.enums.GeoTargetingRestrictionEnum_GeoTargetingRestriction" json:"geo_targeting_restriction,omitempty"`
+	// The list of mappings used to substitute custom parameter tags in a
+	// `tracking_url_template`, `final_urls`, or `mobile_final_urls`.
+	UrlCustomParameters []*common.CustomParameter `protobuf:"bytes,8,rep,name=url_custom_parameters,json=urlCustomParameters,proto3" json:"url_custom_parameters,omitempty"`
+	// Status of the feed item.
+	// This field is read-only.
+	Status enums.FeedItemStatusEnum_FeedItemStatus `protobuf:"varint,9,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.FeedItemStatusEnum_FeedItemStatus" json:"status,omitempty"`
+	// List of info about a feed item's validation and approval state for active
+	// feed mappings. There will be an entry in the list for each type of feed
+	// mapping associated with the feed, e.g. a feed with a sitelink and a call
+	// feed mapping would cause every feed item associated with that feed to have
+	// an entry in this list for both sitelink and call.
+	// This field is read-only.
+	PolicyInfos          []*FeedItemPlaceholderPolicyInfo `protobuf:"bytes,10,rep,name=policy_infos,json=policyInfos,proto3" json:"policy_infos,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *FeedItem) Reset()         { *m = FeedItem{} }
+func (m *FeedItem) String() string { return proto.CompactTextString(m) }
+func (*FeedItem) ProtoMessage()    {}
+func (*FeedItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aa81ffed50546ca6, []int{0}
+}
+
+func (m *FeedItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItem.Unmarshal(m, b)
+}
+func (m *FeedItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItem.Marshal(b, m, deterministic)
+}
+func (m *FeedItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItem.Merge(m, src)
+}
+func (m *FeedItem) XXX_Size() int {
+	return xxx_messageInfo_FeedItem.Size(m)
+}
+func (m *FeedItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItem proto.InternalMessageInfo
+
+func (m *FeedItem) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *FeedItem) GetFeed() *wrappers.StringValue {
+	if m != nil {
+		return m.Feed
+	}
+	return nil
+}
+
+func (m *FeedItem) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *FeedItem) GetStartDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.StartDateTime
+	}
+	return nil
+}
+
+func (m *FeedItem) GetEndDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.EndDateTime
+	}
+	return nil
+}
+
+func (m *FeedItem) GetAttributeValues() []*FeedItemAttributeValue {
+	if m != nil {
+		return m.AttributeValues
+	}
+	return nil
+}
+
+func (m *FeedItem) GetGeoTargetingRestriction() enums.GeoTargetingRestrictionEnum_GeoTargetingRestriction {
+	if m != nil {
+		return m.GeoTargetingRestriction
+	}
+	return enums.GeoTargetingRestrictionEnum_UNSPECIFIED
+}
+
+func (m *FeedItem) GetUrlCustomParameters() []*common.CustomParameter {
+	if m != nil {
+		return m.UrlCustomParameters
+	}
+	return nil
+}
+
+func (m *FeedItem) GetStatus() enums.FeedItemStatusEnum_FeedItemStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.FeedItemStatusEnum_UNSPECIFIED
+}
+
+func (m *FeedItem) GetPolicyInfos() []*FeedItemPlaceholderPolicyInfo {
+	if m != nil {
+		return m.PolicyInfos
+	}
+	return nil
+}
+
+// A feed item attribute value.
+type FeedItemAttributeValue struct {
+	// Id of the feed attribute for which the value is associated with.
+	FeedAttributeId *wrappers.Int64Value `protobuf:"bytes,1,opt,name=feed_attribute_id,json=feedAttributeId,proto3" json:"feed_attribute_id,omitempty"`
+	// Int64 value. Should be set if feed_attribute_id refers to a feed attribute
+	// of type INT64.
+	IntegerValue *wrappers.Int64Value `protobuf:"bytes,2,opt,name=integer_value,json=integerValue,proto3" json:"integer_value,omitempty"`
+	// Bool value. Should be set if feed_attribute_id refers to a feed attribute
+	// of type BOOLEAN.
+	BooleanValue *wrappers.BoolValue `protobuf:"bytes,3,opt,name=boolean_value,json=booleanValue,proto3" json:"boolean_value,omitempty"`
+	// String value. Should be set if feed_attribute_id refers to a feed attribute
+	// of type STRING, URL or DATE_TIME.
+	// For STRING the maximum length is 1500 characters. For URL the maximum
+	// length is 2076 characters. For DATE_TIME the string must be in the format
+	// "YYYYMMDD HHMMSS".
+	StringValue *wrappers.StringValue `protobuf:"bytes,4,opt,name=string_value,json=stringValue,proto3" json:"string_value,omitempty"`
+	// Double value. Should be set if feed_attribute_id refers to a feed attribute
+	// of type DOUBLE.
+	DoubleValue *wrappers.DoubleValue `protobuf:"bytes,5,opt,name=double_value,json=doubleValue,proto3" json:"double_value,omitempty"`
+	// Price value. Should be set if feed_attribute_id refers to a feed attribute
+	// of type PRICE.
+	PriceValue *common.Money `protobuf:"bytes,6,opt,name=price_value,json=priceValue,proto3" json:"price_value,omitempty"`
+	// Repeated int64 value. Should be set if feed_attribute_id refers to a feed
+	// attribute of type INT64_LIST.
+	IntegerValues []*wrappers.Int64Value `protobuf:"bytes,7,rep,name=integer_values,json=integerValues,proto3" json:"integer_values,omitempty"`
+	// Repeated bool value. Should be set if feed_attribute_id refers to a feed
+	// attribute of type BOOLEAN_LIST.
+	BooleanValues []*wrappers.BoolValue `protobuf:"bytes,8,rep,name=boolean_values,json=booleanValues,proto3" json:"boolean_values,omitempty"`
+	// Repeated string value. Should be set if feed_attribute_id refers to a feed
+	// attribute of type STRING_LIST, URL_LIST or DATE_TIME_LIST.
+	// For STRING_LIST and URL_LIST the total size of the list in bytes may not
+	// exceed 3000. For DATE_TIME_LIST the number of elements may not exceed 200.
+	//
+	// For STRING_LIST the maximum length of each string element is 1500
+	// characters. For URL_LIST the maximum length is 2076 characters. For
+	// DATE_TIME the format of the string must be the same as start and end time
+	// for the feed item.
+	StringValues []*wrappers.StringValue `protobuf:"bytes,9,rep,name=string_values,json=stringValues,proto3" json:"string_values,omitempty"`
+	// Repeated double value. Should be set if feed_attribute_id refers to a feed
+	// attribute of type DOUBLE_LIST.
+	DoubleValues         []*wrappers.DoubleValue `protobuf:"bytes,10,rep,name=double_values,json=doubleValues,proto3" json:"double_values,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *FeedItemAttributeValue) Reset()         { *m = FeedItemAttributeValue{} }
+func (m *FeedItemAttributeValue) String() string { return proto.CompactTextString(m) }
+func (*FeedItemAttributeValue) ProtoMessage()    {}
+func (*FeedItemAttributeValue) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aa81ffed50546ca6, []int{1}
+}
+
+func (m *FeedItemAttributeValue) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemAttributeValue.Unmarshal(m, b)
+}
+func (m *FeedItemAttributeValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemAttributeValue.Marshal(b, m, deterministic)
+}
+func (m *FeedItemAttributeValue) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemAttributeValue.Merge(m, src)
+}
+func (m *FeedItemAttributeValue) XXX_Size() int {
+	return xxx_messageInfo_FeedItemAttributeValue.Size(m)
+}
+func (m *FeedItemAttributeValue) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemAttributeValue.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemAttributeValue proto.InternalMessageInfo
+
+func (m *FeedItemAttributeValue) GetFeedAttributeId() *wrappers.Int64Value {
+	if m != nil {
+		return m.FeedAttributeId
+	}
+	return nil
+}
+
+func (m *FeedItemAttributeValue) GetIntegerValue() *wrappers.Int64Value {
+	if m != nil {
+		return m.IntegerValue
+	}
+	return nil
+}
+
+func (m *FeedItemAttributeValue) GetBooleanValue() *wrappers.BoolValue {
+	if m != nil {
+		return m.BooleanValue
+	}
+	return nil
+}
+
+func (m *FeedItemAttributeValue) GetStringValue() *wrappers.StringValue {
+	if m != nil {
+		return m.StringValue
+	}
+	return nil
+}
+
+func (m *FeedItemAttributeValue) GetDoubleValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.DoubleValue
+	}
+	return nil
+}
+
+func (m *FeedItemAttributeValue) GetPriceValue() *common.Money {
+	if m != nil {
+		return m.PriceValue
+	}
+	return nil
+}
+
+func (m *FeedItemAttributeValue) GetIntegerValues() []*wrappers.Int64Value {
+	if m != nil {
+		return m.IntegerValues
+	}
+	return nil
+}
+
+func (m *FeedItemAttributeValue) GetBooleanValues() []*wrappers.BoolValue {
+	if m != nil {
+		return m.BooleanValues
+	}
+	return nil
+}
+
+func (m *FeedItemAttributeValue) GetStringValues() []*wrappers.StringValue {
+	if m != nil {
+		return m.StringValues
+	}
+	return nil
+}
+
+func (m *FeedItemAttributeValue) GetDoubleValues() []*wrappers.DoubleValue {
+	if m != nil {
+		return m.DoubleValues
+	}
+	return nil
+}
+
+// Policy, validation, and quality approval info for a feed item for the
+// specified placeholder type.
+type FeedItemPlaceholderPolicyInfo struct {
+	// The placeholder type.
+	PlaceholderTypeEnum enums.PlaceholderTypeEnum_PlaceholderType `protobuf:"varint,10,opt,name=placeholder_type_enum,json=placeholderTypeEnum,proto3,enum=google.ads.googleads.v3.enums.PlaceholderTypeEnum_PlaceholderType" json:"placeholder_type_enum,omitempty"`
+	// The FeedMapping that contains the placeholder type.
+	FeedMappingResourceName *wrappers.StringValue `protobuf:"bytes,2,opt,name=feed_mapping_resource_name,json=feedMappingResourceName,proto3" json:"feed_mapping_resource_name,omitempty"`
+	// Where the placeholder type is in the review process.
+	ReviewStatus enums.PolicyReviewStatusEnum_PolicyReviewStatus `protobuf:"varint,3,opt,name=review_status,json=reviewStatus,proto3,enum=google.ads.googleads.v3.enums.PolicyReviewStatusEnum_PolicyReviewStatus" json:"review_status,omitempty"`
+	// The overall approval status of the placeholder type, calculated based on
+	// the status of its individual policy topic entries.
+	ApprovalStatus enums.PolicyApprovalStatusEnum_PolicyApprovalStatus `protobuf:"varint,4,opt,name=approval_status,json=approvalStatus,proto3,enum=google.ads.googleads.v3.enums.PolicyApprovalStatusEnum_PolicyApprovalStatus" json:"approval_status,omitempty"`
+	// The list of policy findings for the placeholder type.
+	PolicyTopicEntries []*common.PolicyTopicEntry `protobuf:"bytes,5,rep,name=policy_topic_entries,json=policyTopicEntries,proto3" json:"policy_topic_entries,omitempty"`
+	// The validation status of the palceholder type.
+	ValidationStatus enums.FeedItemValidationStatusEnum_FeedItemValidationStatus `protobuf:"varint,6,opt,name=validation_status,json=validationStatus,proto3,enum=google.ads.googleads.v3.enums.FeedItemValidationStatusEnum_FeedItemValidationStatus" json:"validation_status,omitempty"`
+	// List of placeholder type validation errors.
+	ValidationErrors []*FeedItemValidationError `protobuf:"bytes,7,rep,name=validation_errors,json=validationErrors,proto3" json:"validation_errors,omitempty"`
+	// Placeholder type quality evaluation approval status.
+	QualityApprovalStatus enums.FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus `protobuf:"varint,8,opt,name=quality_approval_status,json=qualityApprovalStatus,proto3,enum=google.ads.googleads.v3.enums.FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus" json:"quality_approval_status,omitempty"`
+	// List of placeholder type quality evaluation disapproval reasons.
+	QualityDisapprovalReasons []enums.FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason `protobuf:"varint,9,rep,packed,name=quality_disapproval_reasons,json=qualityDisapprovalReasons,proto3,enum=google.ads.googleads.v3.enums.FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason" json:"quality_disapproval_reasons,omitempty"`
+	XXX_NoUnkeyedLiteral      struct{}                                                                      `json:"-"`
+	XXX_unrecognized          []byte                                                                        `json:"-"`
+	XXX_sizecache             int32                                                                         `json:"-"`
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) Reset()         { *m = FeedItemPlaceholderPolicyInfo{} }
+func (m *FeedItemPlaceholderPolicyInfo) String() string { return proto.CompactTextString(m) }
+func (*FeedItemPlaceholderPolicyInfo) ProtoMessage()    {}
+func (*FeedItemPlaceholderPolicyInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aa81ffed50546ca6, []int{2}
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemPlaceholderPolicyInfo.Unmarshal(m, b)
+}
+func (m *FeedItemPlaceholderPolicyInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemPlaceholderPolicyInfo.Marshal(b, m, deterministic)
+}
+func (m *FeedItemPlaceholderPolicyInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemPlaceholderPolicyInfo.Merge(m, src)
+}
+func (m *FeedItemPlaceholderPolicyInfo) XXX_Size() int {
+	return xxx_messageInfo_FeedItemPlaceholderPolicyInfo.Size(m)
+}
+func (m *FeedItemPlaceholderPolicyInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemPlaceholderPolicyInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemPlaceholderPolicyInfo proto.InternalMessageInfo
+
+func (m *FeedItemPlaceholderPolicyInfo) GetPlaceholderTypeEnum() enums.PlaceholderTypeEnum_PlaceholderType {
+	if m != nil {
+		return m.PlaceholderTypeEnum
+	}
+	return enums.PlaceholderTypeEnum_UNSPECIFIED
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) GetFeedMappingResourceName() *wrappers.StringValue {
+	if m != nil {
+		return m.FeedMappingResourceName
+	}
+	return nil
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) GetReviewStatus() enums.PolicyReviewStatusEnum_PolicyReviewStatus {
+	if m != nil {
+		return m.ReviewStatus
+	}
+	return enums.PolicyReviewStatusEnum_UNSPECIFIED
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) GetApprovalStatus() enums.PolicyApprovalStatusEnum_PolicyApprovalStatus {
+	if m != nil {
+		return m.ApprovalStatus
+	}
+	return enums.PolicyApprovalStatusEnum_UNSPECIFIED
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) GetPolicyTopicEntries() []*common.PolicyTopicEntry {
+	if m != nil {
+		return m.PolicyTopicEntries
+	}
+	return nil
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) GetValidationStatus() enums.FeedItemValidationStatusEnum_FeedItemValidationStatus {
+	if m != nil {
+		return m.ValidationStatus
+	}
+	return enums.FeedItemValidationStatusEnum_UNSPECIFIED
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) GetValidationErrors() []*FeedItemValidationError {
+	if m != nil {
+		return m.ValidationErrors
+	}
+	return nil
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) GetQualityApprovalStatus() enums.FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus {
+	if m != nil {
+		return m.QualityApprovalStatus
+	}
+	return enums.FeedItemQualityApprovalStatusEnum_UNSPECIFIED
+}
+
+func (m *FeedItemPlaceholderPolicyInfo) GetQualityDisapprovalReasons() []enums.FeedItemQualityDisapprovalReasonEnum_FeedItemQualityDisapprovalReason {
+	if m != nil {
+		return m.QualityDisapprovalReasons
+	}
+	return nil
+}
+
+// Stores a validation error and the set of offending feed attributes which
+// together are responsible for causing a feed item validation error.
+type FeedItemValidationError struct {
+	// Error code indicating what validation error was triggered. The description
+	// of the error can be found in the 'description' field.
+	ValidationError errors.FeedItemValidationErrorEnum_FeedItemValidationError `protobuf:"varint,1,opt,name=validation_error,json=validationError,proto3,enum=google.ads.googleads.v3.errors.FeedItemValidationErrorEnum_FeedItemValidationError" json:"validation_error,omitempty"`
+	// The description of the validation error.
+	Description *wrappers.StringValue `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	// Set of feed attributes in the feed item flagged during validation. If
+	// empty, no specific feed attributes can be associated with the error
+	// (e.g. error across the entire feed item).
+	FeedAttributeIds []*wrappers.Int64Value `protobuf:"bytes,3,rep,name=feed_attribute_ids,json=feedAttributeIds,proto3" json:"feed_attribute_ids,omitempty"`
+	// Any extra information related to this error which is not captured by
+	// validation_error and feed_attribute_id (e.g. placeholder field IDs when
+	// feed_attribute_id is not mapped). Note that extra_info is not localized.
+	ExtraInfo            *wrappers.StringValue `protobuf:"bytes,5,opt,name=extra_info,json=extraInfo,proto3" json:"extra_info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *FeedItemValidationError) Reset()         { *m = FeedItemValidationError{} }
+func (m *FeedItemValidationError) String() string { return proto.CompactTextString(m) }
+func (*FeedItemValidationError) ProtoMessage()    {}
+func (*FeedItemValidationError) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aa81ffed50546ca6, []int{3}
+}
+
+func (m *FeedItemValidationError) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemValidationError.Unmarshal(m, b)
+}
+func (m *FeedItemValidationError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemValidationError.Marshal(b, m, deterministic)
+}
+func (m *FeedItemValidationError) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemValidationError.Merge(m, src)
+}
+func (m *FeedItemValidationError) XXX_Size() int {
+	return xxx_messageInfo_FeedItemValidationError.Size(m)
+}
+func (m *FeedItemValidationError) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemValidationError.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemValidationError proto.InternalMessageInfo
+
+func (m *FeedItemValidationError) GetValidationError() errors.FeedItemValidationErrorEnum_FeedItemValidationError {
+	if m != nil {
+		return m.ValidationError
+	}
+	return errors.FeedItemValidationErrorEnum_UNSPECIFIED
+}
+
+func (m *FeedItemValidationError) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *FeedItemValidationError) GetFeedAttributeIds() []*wrappers.Int64Value {
+	if m != nil {
+		return m.FeedAttributeIds
+	}
+	return nil
+}
+
+func (m *FeedItemValidationError) GetExtraInfo() *wrappers.StringValue {
+	if m != nil {
+		return m.ExtraInfo
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*FeedItem)(nil), "google.ads.googleads.v3.resources.FeedItem")
+	proto.RegisterType((*FeedItemAttributeValue)(nil), "google.ads.googleads.v3.resources.FeedItemAttributeValue")
+	proto.RegisterType((*FeedItemPlaceholderPolicyInfo)(nil), "google.ads.googleads.v3.resources.FeedItemPlaceholderPolicyInfo")
+	proto.RegisterType((*FeedItemValidationError)(nil), "google.ads.googleads.v3.resources.FeedItemValidationError")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/feed_item.proto", fileDescriptor_aa81ffed50546ca6)
+}
+
+var fileDescriptor_aa81ffed50546ca6 = []byte{
+	// 1275 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x57, 0xdf, 0x6e, 0xdc, 0xc4,
+	0x17, 0xd6, 0x6e, 0xda, 0x34, 0x9d, 0xfd, 0x93, 0x74, 0xfa, 0xeb, 0x2f, 0x6e, 0x5a, 0x50, 0x1a,
+	0x54, 0x29, 0xa2, 0x92, 0x1d, 0x76, 0x0b, 0x82, 0xad, 0xa0, 0xd9, 0x90, 0x34, 0x0d, 0xa2, 0x10,
+	0x9c, 0x28, 0x02, 0x14, 0x61, 0xcd, 0xda, 0x13, 0x33, 0x92, 0xed, 0x71, 0x66, 0xc6, 0x5b, 0x56,
+	0x55, 0x91, 0xb8, 0xe0, 0x96, 0x4b, 0x1e, 0x00, 0x71, 0xc5, 0x2b, 0xf0, 0x06, 0xbc, 0x05, 0x97,
+	0xf4, 0x11, 0xb8, 0x42, 0x1e, 0x8f, 0xbd, 0xde, 0x3f, 0x5e, 0x3b, 0x77, 0xe3, 0x99, 0xf3, 0x7d,
+	0xe7, 0xcc, 0x99, 0xf9, 0xce, 0x19, 0x83, 0xf7, 0x5c, 0x4a, 0x5d, 0x0f, 0x1b, 0xc8, 0xe1, 0x46,
+	0x32, 0x8c, 0x47, 0xc3, 0xae, 0xc1, 0x30, 0xa7, 0x11, 0xb3, 0x31, 0x37, 0x2e, 0x30, 0x76, 0x2c,
+	0x22, 0xb0, 0xaf, 0x87, 0x8c, 0x0a, 0x0a, 0x1f, 0x24, 0x76, 0x3a, 0x72, 0xb8, 0x9e, 0x41, 0xf4,
+	0x61, 0x57, 0xcf, 0x20, 0x1b, 0xef, 0x17, 0xb1, 0xda, 0xd4, 0xf7, 0x69, 0x60, 0xd8, 0x11, 0x17,
+	0xd4, 0xb7, 0x42, 0xc4, 0x90, 0x8f, 0x05, 0x66, 0x09, 0xf3, 0xc6, 0x4e, 0x09, 0x4c, 0x46, 0x92,
+	0x8c, 0x15, 0xe2, 0x51, 0x09, 0x22, 0xa4, 0x1e, 0xb1, 0x47, 0xca, 0xf8, 0xa0, 0xc8, 0x18, 0x07,
+	0x91, 0x9f, 0xdb, 0xa7, 0x75, 0x19, 0x21, 0x8f, 0x88, 0x91, 0x85, 0xc2, 0x90, 0xd1, 0x21, 0xf2,
+	0x2c, 0x2e, 0x90, 0x88, 0xb8, 0xa2, 0x79, 0x7e, 0x55, 0x1a, 0x87, 0xf0, 0x8c, 0x89, 0x61, 0xc4,
+	0xb3, 0xe8, 0x1f, 0x57, 0x65, 0x9a, 0xf0, 0xff, 0xb4, 0x2a, 0x6a, 0x88, 0x3c, 0xe2, 0x20, 0x41,
+	0x68, 0x30, 0x49, 0xf0, 0xf1, 0x62, 0x02, 0x17, 0x53, 0x4b, 0x20, 0xe6, 0x62, 0x41, 0x02, 0xd7,
+	0x62, 0x98, 0x0b, 0x46, 0xec, 0x98, 0xa5, 0x5a, 0xd4, 0xa1, 0x87, 0x6c, 0xfc, 0x3d, 0xf5, 0x1c,
+	0xcc, 0x2c, 0x31, 0x0a, 0xb1, 0x42, 0xf5, 0x4a, 0x50, 0xf2, 0xa0, 0x0a, 0x32, 0xfe, 0x61, 0x25,
+	0x2c, 0xc3, 0x43, 0x82, 0x5f, 0x56, 0xcd, 0x15, 0x63, 0x94, 0x15, 0x24, 0x4b, 0xae, 0x29, 0x82,
+	0xbb, 0x29, 0x41, 0x48, 0x32, 0x49, 0xa8, 0xa5, 0xb7, 0xd5, 0x92, 0xfc, 0x1a, 0x44, 0x17, 0xc6,
+	0x4b, 0x86, 0xc2, 0x10, 0xb3, 0xd4, 0xf7, 0xfd, 0x1c, 0x14, 0x05, 0x01, 0x15, 0x92, 0x5d, 0xad,
+	0x6e, 0xfd, 0x7c, 0x03, 0xac, 0x3c, 0xc3, 0xd8, 0x39, 0x12, 0xd8, 0x87, 0xef, 0x80, 0x56, 0x4a,
+	0x6e, 0x05, 0xc8, 0xc7, 0x5a, 0x6d, 0xb3, 0xb6, 0x7d, 0xd3, 0x6c, 0xa6, 0x93, 0x5f, 0x20, 0x1f,
+	0xc3, 0x1d, 0x70, 0x2d, 0x0e, 0x57, 0xab, 0x6f, 0xd6, 0xb6, 0x1b, 0x9d, 0xfb, 0x4a, 0x7b, 0x7a,
+	0xea, 0x5e, 0x3f, 0x11, 0x8c, 0x04, 0xee, 0x19, 0xf2, 0x22, 0x6c, 0x4a, 0x4b, 0xf8, 0x08, 0xd4,
+	0x89, 0xa3, 0x2d, 0x49, 0xfb, 0x7b, 0x33, 0xf6, 0x47, 0x81, 0xf8, 0xe0, 0x71, 0x62, 0x5e, 0x27,
+	0x0e, 0xdc, 0x07, 0xab, 0x5c, 0x20, 0x26, 0x2c, 0x07, 0x09, 0x6c, 0x09, 0xe2, 0x63, 0xed, 0x5a,
+	0x05, 0x4f, 0x2d, 0x09, 0xda, 0x47, 0x02, 0x9f, 0x12, 0x1f, 0xc3, 0x5d, 0xd0, 0xc2, 0x81, 0x93,
+	0xe3, 0xb8, 0x5e, 0x81, 0xa3, 0x81, 0x03, 0x27, 0x63, 0x70, 0xc0, 0x1a, 0x12, 0x82, 0x91, 0x41,
+	0x24, 0x70, 0x7c, 0x2a, 0x11, 0xe6, 0xda, 0xf2, 0xe6, 0xd2, 0x76, 0xa3, 0xf3, 0x91, 0x5e, 0x5a,
+	0x79, 0xf4, 0x34, 0xa5, 0xfd, 0x94, 0x22, 0xf1, 0xb0, 0x8a, 0x26, 0xbe, 0x39, 0xfc, 0xa5, 0x06,
+	0xee, 0x16, 0x5e, 0x74, 0xed, 0xc6, 0x66, 0x6d, 0xbb, 0xdd, 0x31, 0x0b, 0xfd, 0xc9, 0x7b, 0xa7,
+	0x1f, 0x62, 0x7a, 0x9a, 0xc2, 0xcd, 0x31, 0xfa, 0x20, 0x88, 0xfc, 0xa2, 0x35, 0x73, 0xdd, 0x9d,
+	0xbf, 0x00, 0x6d, 0x70, 0x27, 0x62, 0x9e, 0x35, 0x5d, 0x19, 0xb9, 0xb6, 0x22, 0xf7, 0x6e, 0x14,
+	0xc6, 0xa2, 0xea, 0xe1, 0xa7, 0x12, 0x78, 0x9c, 0xe2, 0xcc, 0xdb, 0x11, 0xf3, 0xa6, 0xe6, 0x38,
+	0xfc, 0x1a, 0x2c, 0x27, 0xf2, 0xd0, 0x6e, 0xca, 0x1d, 0xee, 0x96, 0xec, 0x30, 0xcd, 0xe6, 0x89,
+	0x04, 0xc9, 0x8d, 0x4d, 0x4e, 0x99, 0x8a, 0x0f, 0xda, 0xa0, 0xa9, 0x64, 0x48, 0x82, 0x0b, 0xca,
+	0x35, 0x20, 0xa3, 0xde, 0xbd, 0xc2, 0x89, 0x1d, 0x8f, 0xeb, 0xc6, 0xb1, 0x64, 0x3a, 0x0a, 0x2e,
+	0xa8, 0xd9, 0x08, 0xb3, 0x31, 0xef, 0x99, 0x6f, 0xfa, 0x5f, 0x82, 0x07, 0x63, 0x1e, 0x35, 0x0a,
+	0x09, 0x8f, 0xb3, 0x60, 0x64, 0x72, 0x7a, 0x37, 0xc9, 0x22, 0x66, 0xdc, 0x78, 0x95, 0x0e, 0x5f,
+	0x4b, 0xad, 0xc7, 0xcb, 0xdc, 0x78, 0x95, 0xc9, 0xfe, 0xf5, 0xd6, 0x9f, 0xd7, 0xc1, 0xff, 0xe7,
+	0x5f, 0x1a, 0x78, 0x08, 0x6e, 0x49, 0xc3, 0xf1, 0x75, 0x24, 0x8e, 0x54, 0x66, 0x89, 0x9a, 0x56,
+	0x63, 0x54, 0xc6, 0x75, 0xe4, 0xc4, 0xa2, 0x20, 0x81, 0xc0, 0x2e, 0x66, 0xc9, 0x85, 0x56, 0x12,
+	0x5e, 0x48, 0xd2, 0x54, 0x88, 0x24, 0x94, 0xa7, 0xa0, 0x35, 0xa0, 0xd4, 0xc3, 0x28, 0x50, 0x0c,
+	0x89, 0xa8, 0x37, 0x66, 0x18, 0xf6, 0x28, 0xf5, 0x14, 0x81, 0x02, 0xa4, 0x04, 0x4d, 0x2e, 0x15,
+	0xa7, 0xf0, 0x55, 0xa4, 0xdd, 0xe0, 0xe3, 0x8f, 0x98, 0xc0, 0xa1, 0xd1, 0xc0, 0x53, 0x9a, 0x2c,
+	0xd4, 0xf5, 0xbe, 0x34, 0x52, 0x04, 0xce, 0xf8, 0x03, 0x3e, 0x03, 0x8d, 0x90, 0x11, 0x3b, 0xc5,
+	0x2f, 0x4b, 0xfc, 0xc3, 0xb2, 0x6b, 0xfd, 0x82, 0x06, 0x78, 0x64, 0x02, 0x89, 0x4c, 0x78, 0xf6,
+	0x40, 0x7b, 0x22, 0x99, 0x5c, 0xbb, 0x21, 0xef, 0xda, 0xc2, 0x6c, 0xb6, 0xf2, 0xd9, 0xe4, 0xb0,
+	0x0f, 0xda, 0x13, 0xe9, 0x4c, 0x55, 0xb6, 0x28, 0x9f, 0xad, 0x7c, 0x3e, 0x63, 0x8a, 0x56, 0x3e,
+	0xa1, 0xb1, 0xa2, 0x96, 0x4a, 0x33, 0xda, 0xcc, 0x65, 0x54, 0x52, 0xe4, 0x53, 0x9a, 0x8a, 0x66,
+	0x71, 0x4e, 0x9b, 0xb9, 0x9c, 0xf2, 0xad, 0x7f, 0x56, 0xc0, 0x5b, 0x0b, 0x05, 0x04, 0x87, 0xe0,
+	0xce, 0x74, 0x47, 0xb6, 0x62, 0x71, 0x6b, 0x40, 0x56, 0x80, 0xbd, 0x92, 0x0a, 0x90, 0x23, 0x3d,
+	0x1d, 0x85, 0x58, 0x96, 0x80, 0xa9, 0x39, 0xf3, 0x76, 0x38, 0x6b, 0x04, 0xbf, 0x01, 0x1b, 0x52,
+	0x3c, 0x3e, 0x0a, 0x43, 0x55, 0x5e, 0x73, 0xfd, 0xad, 0x4a, 0x0f, 0x5b, 0x8f, 0xf1, 0x2f, 0x12,
+	0xb8, 0x99, 0x6f, 0x84, 0x7e, 0xdc, 0x2d, 0x73, 0xbd, 0x5e, 0x8a, 0xa1, 0xdd, 0x79, 0x5e, 0xb6,
+	0x15, 0x99, 0x14, 0x53, 0x22, 0x73, 0x05, 0x6d, 0x76, 0x3a, 0xee, 0xbb, 0xe3, 0x2f, 0x18, 0x81,
+	0xd5, 0xa9, 0x67, 0x89, 0x54, 0x4f, 0xbb, 0xf3, 0x79, 0x25, 0x87, 0x7d, 0x85, 0x9d, 0x71, 0x39,
+	0xb9, 0x60, 0xb6, 0xd1, 0xc4, 0x37, 0x1c, 0x80, 0xff, 0xa9, 0x8a, 0x2a, 0x68, 0x48, 0x6c, 0x0b,
+	0x07, 0x82, 0x11, 0xcc, 0xb5, 0xeb, 0xf2, 0x92, 0xec, 0x94, 0x09, 0x27, 0xf1, 0x71, 0x1a, 0x43,
+	0x0f, 0x02, 0xc1, 0x46, 0x26, 0x0c, 0x27, 0x67, 0x08, 0xe6, 0xf0, 0xa7, 0x1a, 0xb8, 0x35, 0xf3,
+	0x4a, 0x94, 0xd2, 0x6c, 0x77, 0x4e, 0x2b, 0xf6, 0x86, 0xb3, 0x0c, 0x3f, 0xa7, 0x4b, 0x4c, 0x2f,
+	0x9a, 0x6b, 0xc3, 0xa9, 0x19, 0xe8, 0x4e, 0x84, 0x90, 0xbc, 0xcb, 0x94, 0xa4, 0x7b, 0x57, 0x68,
+	0x1f, 0x63, 0x4f, 0x07, 0x31, 0x45, 0xde, 0x91, 0x9c, 0xe0, 0xf0, 0xd7, 0x1a, 0x58, 0x2f, 0x78,
+	0xd9, 0x6b, 0x2b, 0x72, 0xcb, 0xdf, 0x55, 0xdc, 0xf2, 0x57, 0x09, 0xcb, 0x9c, 0x93, 0x5d, 0x68,
+	0x61, 0xde, 0xb9, 0x9c, 0x37, 0x0d, 0x7f, 0xaf, 0x81, 0x7b, 0xc5, 0xff, 0x0a, 0x49, 0x65, 0x69,
+	0x77, 0x9c, 0xab, 0x05, 0xb7, 0x3f, 0x26, 0x32, 0x25, 0xcf, 0xbc, 0xf8, 0x66, 0x8c, 0xcc, 0xbb,
+	0x97, 0x05, 0x2b, 0x7c, 0xeb, 0xef, 0x3a, 0x58, 0x2f, 0xc8, 0x36, 0xfc, 0x11, 0xac, 0x4d, 0x1f,
+	0xa2, 0xec, 0x94, 0xed, 0xce, 0x49, 0x71, 0xd8, 0xf2, 0x58, 0x8a, 0x0e, 0xb0, 0xe0, 0x1a, 0x25,
+	0x87, 0xbb, 0x3a, 0x75, 0xb8, 0xf0, 0x13, 0xd0, 0x70, 0x30, 0xb7, 0x19, 0x09, 0xe5, 0xfb, 0xad,
+	0x4a, 0x79, 0xc9, 0x03, 0xe0, 0x11, 0x80, 0x33, 0xad, 0x3e, 0xae, 0x2b, 0xa5, 0x8d, 0x65, 0x6d,
+	0xaa, 0xd7, 0x73, 0xf8, 0x04, 0x00, 0xfc, 0x83, 0x60, 0x48, 0x3e, 0x84, 0x2a, 0x3d, 0x7f, 0x6f,
+	0x4a, 0xfb, 0xb8, 0x5a, 0xef, 0xfd, 0x5b, 0x03, 0x0f, 0x6d, 0xea, 0x97, 0xdf, 0xfb, 0xbd, 0x56,
+	0x56, 0xf6, 0x63, 0xca, 0xe3, 0xda, 0xb7, 0x9f, 0x29, 0x8c, 0x4b, 0x3d, 0x14, 0xb8, 0x3a, 0x65,
+	0xae, 0xe1, 0xe2, 0x40, 0x3a, 0x34, 0xc6, 0x0f, 0xa5, 0x05, 0x3f, 0xfa, 0x4f, 0xb2, 0xd1, 0x6f,
+	0xf5, 0xa5, 0xc3, 0x7e, 0xff, 0x8f, 0xfa, 0x83, 0xc3, 0x84, 0xb2, 0xef, 0x70, 0x3d, 0x19, 0xc6,
+	0xa3, 0xb3, 0xae, 0x9e, 0x96, 0x63, 0xfe, 0x57, 0x6a, 0x73, 0xde, 0x77, 0xf8, 0x79, 0x66, 0x73,
+	0x7e, 0xd6, 0x3d, 0xcf, 0x6c, 0xde, 0xd4, 0x1f, 0x26, 0x0b, 0xbd, 0x5e, 0xdf, 0xe1, 0xbd, 0x5e,
+	0x66, 0xd5, 0xeb, 0x9d, 0x75, 0x7b, 0xbd, 0xcc, 0x6e, 0xb0, 0x2c, 0x83, 0xed, 0xfe, 0x17, 0x00,
+	0x00, 0xff, 0xff, 0x2c, 0x38, 0x2b, 0x40, 0x94, 0x10, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/feed_item_target.pb.go b/googleapis/ads/googleads/v3/resources/feed_item_target.pb.go
new file mode 100644
index 0000000..673651f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/feed_item_target.pb.go
@@ -0,0 +1,270 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/feed_item_target.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A feed item target.
+type FeedItemTarget struct {
+	// The resource name of the feed item target.
+	// Feed item target resource names have the form:
+	// `customers/{customer_id}/feedItemTargets/{feed_id}~{feed_item_id}~{feed_item_target_type}~{feed_item_target_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The feed item to which this feed item target belongs.
+	FeedItem *wrappers.StringValue `protobuf:"bytes,2,opt,name=feed_item,json=feedItem,proto3" json:"feed_item,omitempty"`
+	// The target type of this feed item target. This field is read-only.
+	FeedItemTargetType enums.FeedItemTargetTypeEnum_FeedItemTargetType `protobuf:"varint,3,opt,name=feed_item_target_type,json=feedItemTargetType,proto3,enum=google.ads.googleads.v3.enums.FeedItemTargetTypeEnum_FeedItemTargetType" json:"feed_item_target_type,omitempty"`
+	// The ID of the targeted resource. This field is read-only.
+	FeedItemTargetId *wrappers.Int64Value `protobuf:"bytes,6,opt,name=feed_item_target_id,json=feedItemTargetId,proto3" json:"feed_item_target_id,omitempty"`
+	// Status of the feed item target.
+	// This field is read-only.
+	Status enums.FeedItemTargetStatusEnum_FeedItemTargetStatus `protobuf:"varint,11,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.FeedItemTargetStatusEnum_FeedItemTargetStatus" json:"status,omitempty"`
+	// The targeted resource.
+	//
+	// Types that are valid to be assigned to Target:
+	//	*FeedItemTarget_Campaign
+	//	*FeedItemTarget_AdGroup
+	//	*FeedItemTarget_Keyword
+	//	*FeedItemTarget_GeoTargetConstant
+	//	*FeedItemTarget_Device
+	//	*FeedItemTarget_AdSchedule
+	Target               isFeedItemTarget_Target `protobuf_oneof:"target"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *FeedItemTarget) Reset()         { *m = FeedItemTarget{} }
+func (m *FeedItemTarget) String() string { return proto.CompactTextString(m) }
+func (*FeedItemTarget) ProtoMessage()    {}
+func (*FeedItemTarget) Descriptor() ([]byte, []int) {
+	return fileDescriptor_91101725362cc715, []int{0}
+}
+
+func (m *FeedItemTarget) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemTarget.Unmarshal(m, b)
+}
+func (m *FeedItemTarget) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemTarget.Marshal(b, m, deterministic)
+}
+func (m *FeedItemTarget) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemTarget.Merge(m, src)
+}
+func (m *FeedItemTarget) XXX_Size() int {
+	return xxx_messageInfo_FeedItemTarget.Size(m)
+}
+func (m *FeedItemTarget) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemTarget.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemTarget proto.InternalMessageInfo
+
+func (m *FeedItemTarget) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *FeedItemTarget) GetFeedItem() *wrappers.StringValue {
+	if m != nil {
+		return m.FeedItem
+	}
+	return nil
+}
+
+func (m *FeedItemTarget) GetFeedItemTargetType() enums.FeedItemTargetTypeEnum_FeedItemTargetType {
+	if m != nil {
+		return m.FeedItemTargetType
+	}
+	return enums.FeedItemTargetTypeEnum_UNSPECIFIED
+}
+
+func (m *FeedItemTarget) GetFeedItemTargetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.FeedItemTargetId
+	}
+	return nil
+}
+
+func (m *FeedItemTarget) GetStatus() enums.FeedItemTargetStatusEnum_FeedItemTargetStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.FeedItemTargetStatusEnum_UNSPECIFIED
+}
+
+type isFeedItemTarget_Target interface {
+	isFeedItemTarget_Target()
+}
+
+type FeedItemTarget_Campaign struct {
+	Campaign *wrappers.StringValue `protobuf:"bytes,4,opt,name=campaign,proto3,oneof"`
+}
+
+type FeedItemTarget_AdGroup struct {
+	AdGroup *wrappers.StringValue `protobuf:"bytes,5,opt,name=ad_group,json=adGroup,proto3,oneof"`
+}
+
+type FeedItemTarget_Keyword struct {
+	Keyword *common.KeywordInfo `protobuf:"bytes,7,opt,name=keyword,proto3,oneof"`
+}
+
+type FeedItemTarget_GeoTargetConstant struct {
+	GeoTargetConstant *wrappers.StringValue `protobuf:"bytes,8,opt,name=geo_target_constant,json=geoTargetConstant,proto3,oneof"`
+}
+
+type FeedItemTarget_Device struct {
+	Device enums.FeedItemTargetDeviceEnum_FeedItemTargetDevice `protobuf:"varint,9,opt,name=device,proto3,enum=google.ads.googleads.v3.enums.FeedItemTargetDeviceEnum_FeedItemTargetDevice,oneof"`
+}
+
+type FeedItemTarget_AdSchedule struct {
+	AdSchedule *common.AdScheduleInfo `protobuf:"bytes,10,opt,name=ad_schedule,json=adSchedule,proto3,oneof"`
+}
+
+func (*FeedItemTarget_Campaign) isFeedItemTarget_Target() {}
+
+func (*FeedItemTarget_AdGroup) isFeedItemTarget_Target() {}
+
+func (*FeedItemTarget_Keyword) isFeedItemTarget_Target() {}
+
+func (*FeedItemTarget_GeoTargetConstant) isFeedItemTarget_Target() {}
+
+func (*FeedItemTarget_Device) isFeedItemTarget_Target() {}
+
+func (*FeedItemTarget_AdSchedule) isFeedItemTarget_Target() {}
+
+func (m *FeedItemTarget) GetTarget() isFeedItemTarget_Target {
+	if m != nil {
+		return m.Target
+	}
+	return nil
+}
+
+func (m *FeedItemTarget) GetCampaign() *wrappers.StringValue {
+	if x, ok := m.GetTarget().(*FeedItemTarget_Campaign); ok {
+		return x.Campaign
+	}
+	return nil
+}
+
+func (m *FeedItemTarget) GetAdGroup() *wrappers.StringValue {
+	if x, ok := m.GetTarget().(*FeedItemTarget_AdGroup); ok {
+		return x.AdGroup
+	}
+	return nil
+}
+
+func (m *FeedItemTarget) GetKeyword() *common.KeywordInfo {
+	if x, ok := m.GetTarget().(*FeedItemTarget_Keyword); ok {
+		return x.Keyword
+	}
+	return nil
+}
+
+func (m *FeedItemTarget) GetGeoTargetConstant() *wrappers.StringValue {
+	if x, ok := m.GetTarget().(*FeedItemTarget_GeoTargetConstant); ok {
+		return x.GeoTargetConstant
+	}
+	return nil
+}
+
+func (m *FeedItemTarget) GetDevice() enums.FeedItemTargetDeviceEnum_FeedItemTargetDevice {
+	if x, ok := m.GetTarget().(*FeedItemTarget_Device); ok {
+		return x.Device
+	}
+	return enums.FeedItemTargetDeviceEnum_UNSPECIFIED
+}
+
+func (m *FeedItemTarget) GetAdSchedule() *common.AdScheduleInfo {
+	if x, ok := m.GetTarget().(*FeedItemTarget_AdSchedule); ok {
+		return x.AdSchedule
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*FeedItemTarget) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*FeedItemTarget_Campaign)(nil),
+		(*FeedItemTarget_AdGroup)(nil),
+		(*FeedItemTarget_Keyword)(nil),
+		(*FeedItemTarget_GeoTargetConstant)(nil),
+		(*FeedItemTarget_Device)(nil),
+		(*FeedItemTarget_AdSchedule)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*FeedItemTarget)(nil), "google.ads.googleads.v3.resources.FeedItemTarget")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/feed_item_target.proto", fileDescriptor_91101725362cc715)
+}
+
+var fileDescriptor_91101725362cc715 = []byte{
+	// 651 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xdd, 0x4e, 0xdb, 0x4a,
+	0x10, 0x26, 0xe1, 0x9c, 0x24, 0x2c, 0xe7, 0xa0, 0x73, 0x16, 0x55, 0x72, 0x29, 0xaa, 0xa0, 0x15,
+	0x2a, 0x52, 0xd5, 0xb5, 0x44, 0xaa, 0xb6, 0x98, 0x2b, 0xd3, 0x9f, 0x10, 0x5a, 0x21, 0x6a, 0x50,
+	0x2e, 0xaa, 0x48, 0xd1, 0xe2, 0x9d, 0xb8, 0x56, 0xe3, 0x5d, 0x6b, 0x77, 0x0d, 0x42, 0x08, 0xa9,
+	0xcf, 0xd2, 0xcb, 0x3e, 0x4a, 0x5f, 0xa1, 0x6f, 0xc0, 0x53, 0x54, 0xf1, 0xae, 0x4d, 0x43, 0x92,
+	0xf2, 0x73, 0x37, 0xde, 0xf9, 0xbe, 0x99, 0x6f, 0xbe, 0xf1, 0x2e, 0x7a, 0x15, 0x09, 0x11, 0x0d,
+	0xc0, 0xa5, 0x4c, 0xb9, 0x26, 0x1c, 0x46, 0xc7, 0x4d, 0x57, 0x82, 0x12, 0x99, 0x0c, 0x41, 0xb9,
+	0x7d, 0x00, 0xd6, 0x8b, 0x35, 0x24, 0x3d, 0x4d, 0x65, 0x04, 0x9a, 0xa4, 0x52, 0x68, 0x81, 0x57,
+	0x0d, 0x9c, 0x50, 0xa6, 0x48, 0xc9, 0x24, 0xc7, 0x4d, 0x52, 0x32, 0x97, 0x9e, 0x4d, 0x2b, 0x1e,
+	0x8a, 0x24, 0x11, 0xdc, 0x0d, 0x65, 0xac, 0x41, 0xc6, 0xd4, 0x54, 0x5c, 0xda, 0x9a, 0x06, 0x07,
+	0x9e, 0x25, 0xe3, 0x3a, 0x7a, 0x0c, 0x8e, 0xe3, 0x10, 0xee, 0x48, 0x56, 0x9a, 0xea, 0x4c, 0x59,
+	0xf2, 0xe6, 0x2d, 0xc9, 0xfa, 0x34, 0x2d, 0xfa, 0xde, 0x2f, 0xa8, 0x69, 0x5c, 0x7a, 0x66, 0x53,
+	0x0f, 0x6d, 0x2a, 0xff, 0x3a, 0xca, 0xfa, 0xee, 0x89, 0xa4, 0x69, 0x0a, 0xb2, 0xe8, 0xba, 0xfc,
+	0x1b, 0x95, 0x72, 0x2e, 0x34, 0xd5, 0xb1, 0xe0, 0x36, 0xfb, 0xe8, 0x67, 0x1d, 0x2d, 0xbc, 0x03,
+	0x60, 0x6d, 0x0d, 0xc9, 0x61, 0xde, 0x16, 0x3f, 0x46, 0xff, 0x16, 0x2d, 0x7a, 0x9c, 0x26, 0xe0,
+	0x54, 0x56, 0x2a, 0xeb, 0x73, 0xc1, 0x3f, 0xc5, 0xe1, 0x1e, 0x4d, 0x00, 0x6f, 0xa2, 0xb9, 0x52,
+	0xaf, 0x53, 0x5d, 0xa9, 0xac, 0xcf, 0x6f, 0x2c, 0xdb, 0x05, 0x91, 0x42, 0x09, 0x39, 0xd0, 0x32,
+	0xe6, 0x51, 0x87, 0x0e, 0x32, 0x08, 0x1a, 0x7d, 0xdb, 0x05, 0x9f, 0xa1, 0x7b, 0x13, 0x47, 0x75,
+	0x66, 0x57, 0x2a, 0xeb, 0x0b, 0x1b, 0x3b, 0x64, 0xda, 0xca, 0x73, 0x9b, 0xc8, 0xa8, 0xda, 0xc3,
+	0xd3, 0x14, 0xde, 0xf2, 0x2c, 0x99, 0x70, 0x1c, 0xe0, 0xfe, 0xd8, 0x19, 0xde, 0x45, 0x8b, 0x63,
+	0xcd, 0x63, 0xe6, 0xd4, 0xf2, 0x09, 0x1e, 0x8c, 0x4d, 0xd0, 0xe6, 0xfa, 0xc5, 0x73, 0x33, 0xc0,
+	0x7f, 0xa3, 0xd5, 0xda, 0x0c, 0x33, 0x54, 0x33, 0xfb, 0x75, 0xe6, 0x73, 0xe5, 0x1f, 0x6e, 0xa5,
+	0xfc, 0x20, 0xa7, 0x4e, 0xd0, 0x6e, 0x12, 0x81, 0xad, 0x8d, 0x3d, 0xd4, 0x08, 0x69, 0x92, 0xd2,
+	0x38, 0xe2, 0xce, 0x5f, 0xd7, 0x1b, 0xbd, 0x33, 0x13, 0x94, 0x78, 0xbc, 0x89, 0x1a, 0x94, 0xf5,
+	0x22, 0x29, 0xb2, 0xd4, 0xf9, 0xfb, 0x46, 0xdc, 0x3a, 0x65, 0xad, 0x21, 0x1c, 0xb7, 0x50, 0xfd,
+	0x0b, 0x9c, 0x9e, 0x08, 0xc9, 0x9c, 0x7a, 0xce, 0x7c, 0x3a, 0x75, 0x3a, 0x73, 0xcf, 0xc8, 0x7b,
+	0x03, 0x6f, 0xf3, 0xbe, 0x18, 0x16, 0xb2, 0x6c, 0xbc, 0x87, 0x16, 0x23, 0x10, 0x85, 0xd7, 0xa1,
+	0xe0, 0x4a, 0x53, 0xae, 0x9d, 0xc6, 0x8d, 0xe4, 0xfc, 0x1f, 0x81, 0x30, 0xae, 0xbc, 0xb6, 0x44,
+	0xdc, 0x47, 0x35, 0x73, 0x25, 0x9d, 0xb9, 0x3b, 0xb8, 0xfe, 0x26, 0xa7, 0x4e, 0x70, 0xdd, 0x24,
+	0x76, 0x66, 0x02, 0x5b, 0x1d, 0x7f, 0x44, 0xf3, 0x94, 0xf5, 0x54, 0xf8, 0x19, 0x58, 0x36, 0x00,
+	0x07, 0xe5, 0x7a, 0xc9, 0x75, 0x26, 0xf8, 0xec, 0xc0, 0x32, 0xac, 0x0f, 0x88, 0x96, 0x27, 0x1e,
+	0x5c, 0xf8, 0x47, 0xe8, 0xc9, 0x25, 0xcd, 0x46, 0x69, 0xac, 0x86, 0x74, 0xf7, 0xca, 0x3d, 0x7c,
+	0x19, 0x66, 0x4a, 0x8b, 0x04, 0xa4, 0x72, 0xcf, 0x8a, 0xf0, 0xdc, 0x1d, 0xfd, 0x0b, 0x95, 0x7b,
+	0x76, 0xf5, 0x77, 0x3e, 0xdf, 0x6e, 0xa0, 0x9a, 0x09, 0xb7, 0xbf, 0x56, 0xd1, 0x5a, 0x28, 0x12,
+	0x72, 0xed, 0x23, 0xba, 0xbd, 0x38, 0xda, 0x7c, 0x7f, 0xb8, 0x8e, 0xfd, 0xca, 0xa7, 0x5d, 0xcb,
+	0x8c, 0xc4, 0x80, 0xf2, 0x88, 0x08, 0x19, 0xb9, 0x11, 0xf0, 0x7c, 0x59, 0xee, 0xa5, 0xfa, 0x3f,
+	0xbc, 0xeb, 0x5b, 0x65, 0xf4, 0xad, 0x3a, 0xdb, 0xf2, 0xfd, 0xef, 0xd5, 0xd5, 0x96, 0x29, 0xe9,
+	0x33, 0x45, 0x4c, 0x38, 0x8c, 0x3a, 0x4d, 0x12, 0x14, 0xc8, 0x1f, 0x05, 0xa6, 0xeb, 0x33, 0xd5,
+	0x2d, 0x31, 0xdd, 0x4e, 0xb3, 0x5b, 0x62, 0x2e, 0xaa, 0x6b, 0x26, 0xe1, 0x79, 0x3e, 0x53, 0x9e,
+	0x57, 0xa2, 0x3c, 0xaf, 0xd3, 0xf4, 0xbc, 0x12, 0x77, 0x54, 0xcb, 0xc5, 0x36, 0x7f, 0x05, 0x00,
+	0x00, 0xff, 0xff, 0xab, 0x3f, 0x4b, 0x20, 0x83, 0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/feed_mapping.pb.go b/googleapis/ads/googleads/v3/resources/feed_mapping.pb.go
new file mode 100644
index 0000000..4b6ae43
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/feed_mapping.pb.go
@@ -0,0 +1,641 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/feed_mapping.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A feed mapping.
+type FeedMapping struct {
+	// The resource name of the feed mapping.
+	// Feed mapping resource names have the form:
+	//
+	// `customers/{customer_id}/feedMappings/{feed_id}~{feed_mapping_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The feed of this feed mapping.
+	Feed *wrappers.StringValue `protobuf:"bytes,2,opt,name=feed,proto3" json:"feed,omitempty"`
+	// Feed attributes to field mappings. These mappings are a one-to-many
+	// relationship meaning that 1 feed attribute can be used to populate
+	// multiple placeholder fields, but 1 placeholder field can only draw
+	// data from 1 feed attribute. Ad Customizer is an exception, 1 placeholder
+	// field can be mapped to multiple feed attributes. Required.
+	AttributeFieldMappings []*AttributeFieldMapping `protobuf:"bytes,5,rep,name=attribute_field_mappings,json=attributeFieldMappings,proto3" json:"attribute_field_mappings,omitempty"`
+	// Status of the feed mapping.
+	// This field is read-only.
+	Status enums.FeedMappingStatusEnum_FeedMappingStatus `protobuf:"varint,6,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.FeedMappingStatusEnum_FeedMappingStatus" json:"status,omitempty"`
+	// Feed mapping target. Can be either a placeholder or a criterion. For a
+	// given feed, the active FeedMappings must have unique targets. Required.
+	//
+	// Types that are valid to be assigned to Target:
+	//	*FeedMapping_PlaceholderType
+	//	*FeedMapping_CriterionType
+	Target               isFeedMapping_Target `protobuf_oneof:"target"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *FeedMapping) Reset()         { *m = FeedMapping{} }
+func (m *FeedMapping) String() string { return proto.CompactTextString(m) }
+func (*FeedMapping) ProtoMessage()    {}
+func (*FeedMapping) Descriptor() ([]byte, []int) {
+	return fileDescriptor_686021db801e5474, []int{0}
+}
+
+func (m *FeedMapping) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedMapping.Unmarshal(m, b)
+}
+func (m *FeedMapping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedMapping.Marshal(b, m, deterministic)
+}
+func (m *FeedMapping) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedMapping.Merge(m, src)
+}
+func (m *FeedMapping) XXX_Size() int {
+	return xxx_messageInfo_FeedMapping.Size(m)
+}
+func (m *FeedMapping) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedMapping.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedMapping proto.InternalMessageInfo
+
+func (m *FeedMapping) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *FeedMapping) GetFeed() *wrappers.StringValue {
+	if m != nil {
+		return m.Feed
+	}
+	return nil
+}
+
+func (m *FeedMapping) GetAttributeFieldMappings() []*AttributeFieldMapping {
+	if m != nil {
+		return m.AttributeFieldMappings
+	}
+	return nil
+}
+
+func (m *FeedMapping) GetStatus() enums.FeedMappingStatusEnum_FeedMappingStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.FeedMappingStatusEnum_UNSPECIFIED
+}
+
+type isFeedMapping_Target interface {
+	isFeedMapping_Target()
+}
+
+type FeedMapping_PlaceholderType struct {
+	PlaceholderType enums.PlaceholderTypeEnum_PlaceholderType `protobuf:"varint,3,opt,name=placeholder_type,json=placeholderType,proto3,enum=google.ads.googleads.v3.enums.PlaceholderTypeEnum_PlaceholderType,oneof"`
+}
+
+type FeedMapping_CriterionType struct {
+	CriterionType enums.FeedMappingCriterionTypeEnum_FeedMappingCriterionType `protobuf:"varint,4,opt,name=criterion_type,json=criterionType,proto3,enum=google.ads.googleads.v3.enums.FeedMappingCriterionTypeEnum_FeedMappingCriterionType,oneof"`
+}
+
+func (*FeedMapping_PlaceholderType) isFeedMapping_Target() {}
+
+func (*FeedMapping_CriterionType) isFeedMapping_Target() {}
+
+func (m *FeedMapping) GetTarget() isFeedMapping_Target {
+	if m != nil {
+		return m.Target
+	}
+	return nil
+}
+
+func (m *FeedMapping) GetPlaceholderType() enums.PlaceholderTypeEnum_PlaceholderType {
+	if x, ok := m.GetTarget().(*FeedMapping_PlaceholderType); ok {
+		return x.PlaceholderType
+	}
+	return enums.PlaceholderTypeEnum_UNSPECIFIED
+}
+
+func (m *FeedMapping) GetCriterionType() enums.FeedMappingCriterionTypeEnum_FeedMappingCriterionType {
+	if x, ok := m.GetTarget().(*FeedMapping_CriterionType); ok {
+		return x.CriterionType
+	}
+	return enums.FeedMappingCriterionTypeEnum_UNSPECIFIED
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*FeedMapping) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*FeedMapping_PlaceholderType)(nil),
+		(*FeedMapping_CriterionType)(nil),
+	}
+}
+
+// Maps from feed attribute id to a placeholder or criterion field id.
+type AttributeFieldMapping struct {
+	// Feed attribute from which to map.
+	FeedAttributeId *wrappers.Int64Value `protobuf:"bytes,1,opt,name=feed_attribute_id,json=feedAttributeId,proto3" json:"feed_attribute_id,omitempty"`
+	// The placeholder field ID. If a placeholder field enum is not published in
+	// the current API version, then this field will be populated and the field
+	// oneof will be empty.
+	// This field is read-only.
+	FieldId *wrappers.Int64Value `protobuf:"bytes,2,opt,name=field_id,json=fieldId,proto3" json:"field_id,omitempty"`
+	// Placeholder or criterion field to be populated using data from
+	// the above feed attribute. Required.
+	//
+	// Types that are valid to be assigned to Field:
+	//	*AttributeFieldMapping_SitelinkField
+	//	*AttributeFieldMapping_CallField
+	//	*AttributeFieldMapping_AppField
+	//	*AttributeFieldMapping_LocationField
+	//	*AttributeFieldMapping_AffiliateLocationField
+	//	*AttributeFieldMapping_CalloutField
+	//	*AttributeFieldMapping_StructuredSnippetField
+	//	*AttributeFieldMapping_MessageField
+	//	*AttributeFieldMapping_PriceField
+	//	*AttributeFieldMapping_PromotionField
+	//	*AttributeFieldMapping_AdCustomizerField
+	//	*AttributeFieldMapping_DsaPageFeedField
+	//	*AttributeFieldMapping_LocationExtensionTargetingField
+	//	*AttributeFieldMapping_EducationField
+	//	*AttributeFieldMapping_FlightField
+	//	*AttributeFieldMapping_CustomField
+	//	*AttributeFieldMapping_HotelField
+	//	*AttributeFieldMapping_RealEstateField
+	//	*AttributeFieldMapping_TravelField
+	//	*AttributeFieldMapping_LocalField
+	//	*AttributeFieldMapping_JobField
+	Field                isAttributeFieldMapping_Field `protobuf_oneof:"field"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *AttributeFieldMapping) Reset()         { *m = AttributeFieldMapping{} }
+func (m *AttributeFieldMapping) String() string { return proto.CompactTextString(m) }
+func (*AttributeFieldMapping) ProtoMessage()    {}
+func (*AttributeFieldMapping) Descriptor() ([]byte, []int) {
+	return fileDescriptor_686021db801e5474, []int{1}
+}
+
+func (m *AttributeFieldMapping) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AttributeFieldMapping.Unmarshal(m, b)
+}
+func (m *AttributeFieldMapping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AttributeFieldMapping.Marshal(b, m, deterministic)
+}
+func (m *AttributeFieldMapping) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AttributeFieldMapping.Merge(m, src)
+}
+func (m *AttributeFieldMapping) XXX_Size() int {
+	return xxx_messageInfo_AttributeFieldMapping.Size(m)
+}
+func (m *AttributeFieldMapping) XXX_DiscardUnknown() {
+	xxx_messageInfo_AttributeFieldMapping.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AttributeFieldMapping proto.InternalMessageInfo
+
+func (m *AttributeFieldMapping) GetFeedAttributeId() *wrappers.Int64Value {
+	if m != nil {
+		return m.FeedAttributeId
+	}
+	return nil
+}
+
+func (m *AttributeFieldMapping) GetFieldId() *wrappers.Int64Value {
+	if m != nil {
+		return m.FieldId
+	}
+	return nil
+}
+
+type isAttributeFieldMapping_Field interface {
+	isAttributeFieldMapping_Field()
+}
+
+type AttributeFieldMapping_SitelinkField struct {
+	SitelinkField enums.SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField `protobuf:"varint,3,opt,name=sitelink_field,json=sitelinkField,proto3,enum=google.ads.googleads.v3.enums.SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_CallField struct {
+	CallField enums.CallPlaceholderFieldEnum_CallPlaceholderField `protobuf:"varint,4,opt,name=call_field,json=callField,proto3,enum=google.ads.googleads.v3.enums.CallPlaceholderFieldEnum_CallPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_AppField struct {
+	AppField enums.AppPlaceholderFieldEnum_AppPlaceholderField `protobuf:"varint,5,opt,name=app_field,json=appField,proto3,enum=google.ads.googleads.v3.enums.AppPlaceholderFieldEnum_AppPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_LocationField struct {
+	LocationField enums.LocationPlaceholderFieldEnum_LocationPlaceholderField `protobuf:"varint,6,opt,name=location_field,json=locationField,proto3,enum=google.ads.googleads.v3.enums.LocationPlaceholderFieldEnum_LocationPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_AffiliateLocationField struct {
+	AffiliateLocationField enums.AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField `protobuf:"varint,7,opt,name=affiliate_location_field,json=affiliateLocationField,proto3,enum=google.ads.googleads.v3.enums.AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_CalloutField struct {
+	CalloutField enums.CalloutPlaceholderFieldEnum_CalloutPlaceholderField `protobuf:"varint,8,opt,name=callout_field,json=calloutField,proto3,enum=google.ads.googleads.v3.enums.CalloutPlaceholderFieldEnum_CalloutPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_StructuredSnippetField struct {
+	StructuredSnippetField enums.StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField `protobuf:"varint,9,opt,name=structured_snippet_field,json=structuredSnippetField,proto3,enum=google.ads.googleads.v3.enums.StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_MessageField struct {
+	MessageField enums.MessagePlaceholderFieldEnum_MessagePlaceholderField `protobuf:"varint,10,opt,name=message_field,json=messageField,proto3,enum=google.ads.googleads.v3.enums.MessagePlaceholderFieldEnum_MessagePlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_PriceField struct {
+	PriceField enums.PricePlaceholderFieldEnum_PricePlaceholderField `protobuf:"varint,11,opt,name=price_field,json=priceField,proto3,enum=google.ads.googleads.v3.enums.PricePlaceholderFieldEnum_PricePlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_PromotionField struct {
+	PromotionField enums.PromotionPlaceholderFieldEnum_PromotionPlaceholderField `protobuf:"varint,12,opt,name=promotion_field,json=promotionField,proto3,enum=google.ads.googleads.v3.enums.PromotionPlaceholderFieldEnum_PromotionPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_AdCustomizerField struct {
+	AdCustomizerField enums.AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField `protobuf:"varint,13,opt,name=ad_customizer_field,json=adCustomizerField,proto3,enum=google.ads.googleads.v3.enums.AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_DsaPageFeedField struct {
+	DsaPageFeedField enums.DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField `protobuf:"varint,14,opt,name=dsa_page_feed_field,json=dsaPageFeedField,proto3,enum=google.ads.googleads.v3.enums.DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField,oneof"`
+}
+
+type AttributeFieldMapping_LocationExtensionTargetingField struct {
+	LocationExtensionTargetingField enums.LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField `protobuf:"varint,15,opt,name=location_extension_targeting_field,json=locationExtensionTargetingField,proto3,enum=google.ads.googleads.v3.enums.LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField,oneof"`
+}
+
+type AttributeFieldMapping_EducationField struct {
+	EducationField enums.EducationPlaceholderFieldEnum_EducationPlaceholderField `protobuf:"varint,16,opt,name=education_field,json=educationField,proto3,enum=google.ads.googleads.v3.enums.EducationPlaceholderFieldEnum_EducationPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_FlightField struct {
+	FlightField enums.FlightPlaceholderFieldEnum_FlightPlaceholderField `protobuf:"varint,17,opt,name=flight_field,json=flightField,proto3,enum=google.ads.googleads.v3.enums.FlightPlaceholderFieldEnum_FlightPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_CustomField struct {
+	CustomField enums.CustomPlaceholderFieldEnum_CustomPlaceholderField `protobuf:"varint,18,opt,name=custom_field,json=customField,proto3,enum=google.ads.googleads.v3.enums.CustomPlaceholderFieldEnum_CustomPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_HotelField struct {
+	HotelField enums.HotelPlaceholderFieldEnum_HotelPlaceholderField `protobuf:"varint,19,opt,name=hotel_field,json=hotelField,proto3,enum=google.ads.googleads.v3.enums.HotelPlaceholderFieldEnum_HotelPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_RealEstateField struct {
+	RealEstateField enums.RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField `protobuf:"varint,20,opt,name=real_estate_field,json=realEstateField,proto3,enum=google.ads.googleads.v3.enums.RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_TravelField struct {
+	TravelField enums.TravelPlaceholderFieldEnum_TravelPlaceholderField `protobuf:"varint,21,opt,name=travel_field,json=travelField,proto3,enum=google.ads.googleads.v3.enums.TravelPlaceholderFieldEnum_TravelPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_LocalField struct {
+	LocalField enums.LocalPlaceholderFieldEnum_LocalPlaceholderField `protobuf:"varint,22,opt,name=local_field,json=localField,proto3,enum=google.ads.googleads.v3.enums.LocalPlaceholderFieldEnum_LocalPlaceholderField,oneof"`
+}
+
+type AttributeFieldMapping_JobField struct {
+	JobField enums.JobPlaceholderFieldEnum_JobPlaceholderField `protobuf:"varint,23,opt,name=job_field,json=jobField,proto3,enum=google.ads.googleads.v3.enums.JobPlaceholderFieldEnum_JobPlaceholderField,oneof"`
+}
+
+func (*AttributeFieldMapping_SitelinkField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_CallField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_AppField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_LocationField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_AffiliateLocationField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_CalloutField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_StructuredSnippetField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_MessageField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_PriceField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_PromotionField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_AdCustomizerField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_DsaPageFeedField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_LocationExtensionTargetingField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_EducationField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_FlightField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_CustomField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_HotelField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_RealEstateField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_TravelField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_LocalField) isAttributeFieldMapping_Field() {}
+
+func (*AttributeFieldMapping_JobField) isAttributeFieldMapping_Field() {}
+
+func (m *AttributeFieldMapping) GetField() isAttributeFieldMapping_Field {
+	if m != nil {
+		return m.Field
+	}
+	return nil
+}
+
+func (m *AttributeFieldMapping) GetSitelinkField() enums.SitelinkPlaceholderFieldEnum_SitelinkPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_SitelinkField); ok {
+		return x.SitelinkField
+	}
+	return enums.SitelinkPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetCallField() enums.CallPlaceholderFieldEnum_CallPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_CallField); ok {
+		return x.CallField
+	}
+	return enums.CallPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetAppField() enums.AppPlaceholderFieldEnum_AppPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_AppField); ok {
+		return x.AppField
+	}
+	return enums.AppPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetLocationField() enums.LocationPlaceholderFieldEnum_LocationPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_LocationField); ok {
+		return x.LocationField
+	}
+	return enums.LocationPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetAffiliateLocationField() enums.AffiliateLocationPlaceholderFieldEnum_AffiliateLocationPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_AffiliateLocationField); ok {
+		return x.AffiliateLocationField
+	}
+	return enums.AffiliateLocationPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetCalloutField() enums.CalloutPlaceholderFieldEnum_CalloutPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_CalloutField); ok {
+		return x.CalloutField
+	}
+	return enums.CalloutPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetStructuredSnippetField() enums.StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_StructuredSnippetField); ok {
+		return x.StructuredSnippetField
+	}
+	return enums.StructuredSnippetPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetMessageField() enums.MessagePlaceholderFieldEnum_MessagePlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_MessageField); ok {
+		return x.MessageField
+	}
+	return enums.MessagePlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetPriceField() enums.PricePlaceholderFieldEnum_PricePlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_PriceField); ok {
+		return x.PriceField
+	}
+	return enums.PricePlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetPromotionField() enums.PromotionPlaceholderFieldEnum_PromotionPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_PromotionField); ok {
+		return x.PromotionField
+	}
+	return enums.PromotionPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetAdCustomizerField() enums.AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_AdCustomizerField); ok {
+		return x.AdCustomizerField
+	}
+	return enums.AdCustomizerPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetDsaPageFeedField() enums.DsaPageFeedCriterionFieldEnum_DsaPageFeedCriterionField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_DsaPageFeedField); ok {
+		return x.DsaPageFeedField
+	}
+	return enums.DsaPageFeedCriterionFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetLocationExtensionTargetingField() enums.LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_LocationExtensionTargetingField); ok {
+		return x.LocationExtensionTargetingField
+	}
+	return enums.LocationExtensionTargetingCriterionFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetEducationField() enums.EducationPlaceholderFieldEnum_EducationPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_EducationField); ok {
+		return x.EducationField
+	}
+	return enums.EducationPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetFlightField() enums.FlightPlaceholderFieldEnum_FlightPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_FlightField); ok {
+		return x.FlightField
+	}
+	return enums.FlightPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetCustomField() enums.CustomPlaceholderFieldEnum_CustomPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_CustomField); ok {
+		return x.CustomField
+	}
+	return enums.CustomPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetHotelField() enums.HotelPlaceholderFieldEnum_HotelPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_HotelField); ok {
+		return x.HotelField
+	}
+	return enums.HotelPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetRealEstateField() enums.RealEstatePlaceholderFieldEnum_RealEstatePlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_RealEstateField); ok {
+		return x.RealEstateField
+	}
+	return enums.RealEstatePlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetTravelField() enums.TravelPlaceholderFieldEnum_TravelPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_TravelField); ok {
+		return x.TravelField
+	}
+	return enums.TravelPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetLocalField() enums.LocalPlaceholderFieldEnum_LocalPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_LocalField); ok {
+		return x.LocalField
+	}
+	return enums.LocalPlaceholderFieldEnum_UNSPECIFIED
+}
+
+func (m *AttributeFieldMapping) GetJobField() enums.JobPlaceholderFieldEnum_JobPlaceholderField {
+	if x, ok := m.GetField().(*AttributeFieldMapping_JobField); ok {
+		return x.JobField
+	}
+	return enums.JobPlaceholderFieldEnum_UNSPECIFIED
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AttributeFieldMapping) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AttributeFieldMapping_SitelinkField)(nil),
+		(*AttributeFieldMapping_CallField)(nil),
+		(*AttributeFieldMapping_AppField)(nil),
+		(*AttributeFieldMapping_LocationField)(nil),
+		(*AttributeFieldMapping_AffiliateLocationField)(nil),
+		(*AttributeFieldMapping_CalloutField)(nil),
+		(*AttributeFieldMapping_StructuredSnippetField)(nil),
+		(*AttributeFieldMapping_MessageField)(nil),
+		(*AttributeFieldMapping_PriceField)(nil),
+		(*AttributeFieldMapping_PromotionField)(nil),
+		(*AttributeFieldMapping_AdCustomizerField)(nil),
+		(*AttributeFieldMapping_DsaPageFeedField)(nil),
+		(*AttributeFieldMapping_LocationExtensionTargetingField)(nil),
+		(*AttributeFieldMapping_EducationField)(nil),
+		(*AttributeFieldMapping_FlightField)(nil),
+		(*AttributeFieldMapping_CustomField)(nil),
+		(*AttributeFieldMapping_HotelField)(nil),
+		(*AttributeFieldMapping_RealEstateField)(nil),
+		(*AttributeFieldMapping_TravelField)(nil),
+		(*AttributeFieldMapping_LocalField)(nil),
+		(*AttributeFieldMapping_JobField)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*FeedMapping)(nil), "google.ads.googleads.v3.resources.FeedMapping")
+	proto.RegisterType((*AttributeFieldMapping)(nil), "google.ads.googleads.v3.resources.AttributeFieldMapping")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/feed_mapping.proto", fileDescriptor_686021db801e5474)
+}
+
+var fileDescriptor_686021db801e5474 = []byte{
+	// 1360 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x98, 0xdd, 0x6e, 0xdc, 0x44,
+	0x14, 0xc7, 0xed, 0xb4, 0x49, 0x93, 0xd9, 0x7c, 0x6e, 0x69, 0x58, 0x4a, 0x05, 0x69, 0xa1, 0x52,
+	0xae, 0xbc, 0x55, 0x52, 0x15, 0xd8, 0xf2, 0xa1, 0x4d, 0x48, 0xeb, 0x56, 0x6d, 0xb5, 0x72, 0xa2,
+	0xa8, 0x82, 0x88, 0xd5, 0xec, 0x7a, 0x76, 0xeb, 0xe2, 0xf5, 0x18, 0xcf, 0xb8, 0x50, 0xaa, 0x5c,
+	0x70, 0x03, 0x77, 0xf0, 0x0e, 0xbd, 0xe4, 0x35, 0xb8, 0xe3, 0x9a, 0xa7, 0xe8, 0x3b, 0x20, 0xa1,
+	0x99, 0x63, 0xcf, 0x3a, 0xe9, 0xd8, 0x63, 0xf6, 0x6e, 0x76, 0xce, 0xfc, 0xcf, 0xef, 0xf8, 0xcc,
+	0x99, 0xaf, 0x45, 0xb7, 0xc7, 0x94, 0x8e, 0x43, 0xd2, 0xc6, 0x3e, 0x6b, 0x43, 0x53, 0xb4, 0x5e,
+	0xec, 0xb6, 0x13, 0xc2, 0x68, 0x9a, 0x0c, 0x09, 0x6b, 0x8f, 0x08, 0xf1, 0xfb, 0x13, 0x1c, 0xc7,
+	0x41, 0x34, 0x76, 0xe2, 0x84, 0x72, 0xda, 0xbc, 0x0e, 0x43, 0x1d, 0xec, 0x33, 0x47, 0xa9, 0x9c,
+	0x17, 0xbb, 0x8e, 0x52, 0x5d, 0xdd, 0x2f, 0x73, 0x4c, 0xa2, 0x74, 0xc2, 0xda, 0xd8, 0xef, 0x0f,
+	0x53, 0xc6, 0xe9, 0x24, 0xf8, 0x99, 0x24, 0xfd, 0x38, 0xc4, 0x43, 0xf2, 0x8c, 0x86, 0x3e, 0x49,
+	0xfa, 0xa3, 0x80, 0x84, 0x3e, 0x70, 0xae, 0xba, 0x06, 0x27, 0xa3, 0x51, 0x10, 0x06, 0x98, 0x93,
+	0x7e, 0x48, 0x87, 0x98, 0x07, 0x34, 0x2a, 0xf5, 0xf4, 0x99, 0xc1, 0x53, 0x1c, 0x97, 0x4a, 0x3b,
+	0xd5, 0xd2, 0x21, 0x0e, 0xc3, 0x52, 0xed, 0x17, 0x66, 0x2d, 0x4d, 0x79, 0xa9, 0xfc, 0x73, 0x83,
+	0x5c, 0x66, 0xb0, 0x54, 0xdd, 0xad, 0x56, 0xfb, 0x0c, 0xf7, 0x63, 0x3c, 0x26, 0x7d, 0x39, 0xc1,
+	0xc3, 0x24, 0xe0, 0x24, 0x11, 0x29, 0x2c, 0xba, 0xf8, 0xaa, 0xda, 0x05, 0xf1, 0x53, 0x43, 0xde,
+	0x0d, 0x0e, 0x8a, 0xb5, 0x55, 0x08, 0x81, 0xbf, 0x8c, 0x49, 0xe6, 0xe0, 0x93, 0xff, 0xe1, 0x80,
+	0x71, 0xcc, 0x53, 0x56, 0x2f, 0x77, 0xa3, 0x30, 0x18, 0x3f, 0x2b, 0xcf, 0xfc, 0xdd, 0x6a, 0xf5,
+	0x33, 0xca, 0x49, 0x38, 0x6b, 0xb1, 0x3d, 0xa7, 0x83, 0x59, 0xb9, 0xa2, 0xce, 0xcb, 0xb9, 0x3d,
+	0xb3, 0x58, 0x4e, 0x16, 0xf9, 0x89, 0x93, 0x88, 0xc9, 0x44, 0xe3, 0x64, 0x4c, 0xf8, 0xd9, 0xe4,
+	0x17, 0x3d, 0x7e, 0x59, 0xd3, 0xe3, 0x8c, 0xf5, 0x3f, 0x21, 0x8c, 0x89, 0x0a, 0x2c, 0x93, 0xdf,
+	0xae, 0x96, 0x17, 0x65, 0x85, 0x92, 0x31, 0xe4, 0x30, 0x4e, 0x82, 0x21, 0x99, 0xb5, 0x60, 0xe3,
+	0x84, 0x4e, 0x68, 0xe5, 0x27, 0x1b, 0x56, 0x5d, 0x42, 0x70, 0xd8, 0x27, 0xa2, 0x52, 0xcb, 0x63,
+	0x30, 0x64, 0x9d, 0x05, 0x9c, 0x84, 0x41, 0xf4, 0xfd, 0xac, 0xdb, 0x26, 0xe3, 0x49, 0x3a, 0xe4,
+	0x69, 0x42, 0xfc, 0x3e, 0x8b, 0x82, 0x38, 0x26, 0x33, 0x6f, 0x40, 0x3c, 0xc1, 0x2f, 0x2a, 0xd6,
+	0xc1, 0x7b, 0xb9, 0x3a, 0x0e, 0xd4, 0x79, 0x92, 0x99, 0x3e, 0xc8, 0x4c, 0xf2, 0xd7, 0x20, 0x1d,
+	0xb5, 0x7f, 0x4c, 0x70, 0x1c, 0x93, 0x24, 0x5f, 0xbd, 0xd7, 0x0a, 0x52, 0x1c, 0x45, 0x94, 0xcb,
+	0x3a, 0xcb, 0xac, 0x37, 0xfe, 0x98, 0x47, 0x8d, 0x7b, 0x84, 0xf8, 0x8f, 0x61, 0xe1, 0x37, 0x3f,
+	0x42, 0x2b, 0xb9, 0xff, 0x7e, 0x84, 0x27, 0xa4, 0x65, 0x6f, 0xd9, 0xdb, 0x4b, 0xde, 0x72, 0xde,
+	0xf9, 0x04, 0x4f, 0x48, 0xf3, 0x16, 0xba, 0x28, 0x76, 0x8b, 0xd6, 0xdc, 0x96, 0xbd, 0xdd, 0xd8,
+	0xb9, 0x96, 0x1d, 0x5c, 0x4e, 0x1e, 0x81, 0x73, 0xc8, 0x93, 0x20, 0x1a, 0x1f, 0xe3, 0x30, 0x25,
+	0x9e, 0x1c, 0xd9, 0x4c, 0x50, 0x0b, 0x73, 0x9e, 0x04, 0x83, 0x94, 0x13, 0xf8, 0xb0, 0x7c, 0xab,
+	0x61, 0xad, 0xf9, 0xad, 0x0b, 0xdb, 0x8d, 0x9d, 0x4f, 0x1d, 0xe3, 0x49, 0xe8, 0x74, 0x73, 0x17,
+	0xf7, 0x84, 0x87, 0x2c, 0x64, 0x6f, 0x13, 0xeb, 0xba, 0x59, 0xf3, 0x3b, 0xb4, 0x00, 0xdb, 0x58,
+	0x6b, 0x61, 0xcb, 0xde, 0x5e, 0xdd, 0xb9, 0x57, 0x4a, 0x90, 0x53, 0xe0, 0x14, 0xd2, 0x70, 0x28,
+	0x75, 0x07, 0x51, 0x3a, 0x79, 0xbb, 0xd7, 0xcb, 0xbc, 0x36, 0x29, 0x5a, 0x3f, 0xbf, 0x6c, 0x5a,
+	0x17, 0x24, 0x69, 0xcf, 0x40, 0xea, 0x4d, 0x65, 0x47, 0x2f, 0x63, 0x22, 0x39, 0xe7, 0xfa, 0x5c,
+	0xcb, 0x5b, 0x8b, 0xcf, 0x76, 0x35, 0x4f, 0xd1, 0xea, 0xd9, 0x8d, 0xbd, 0x75, 0x51, 0xe2, 0x8e,
+	0xea, 0x7f, 0xd8, 0x7e, 0xae, 0x57, 0xdc, 0x32, 0xa3, 0x6b, 0x79, 0x2b, 0xc3, 0x62, 0x47, 0xe7,
+	0xdb, 0x37, 0xdd, 0xa7, 0xe8, 0xe3, 0xa9, 0xff, 0xac, 0x15, 0x07, 0xcc, 0x19, 0xd2, 0x49, 0xbb,
+	0x58, 0x45, 0xb7, 0xe0, 0x3c, 0x25, 0x09, 0x6b, 0xbf, 0xca, 0x9b, 0xa7, 0xf2, 0x84, 0xc9, 0x67,
+	0xa7, 0xfd, 0xaa, 0x78, 0xde, 0x9c, 0xee, 0x2d, 0xa2, 0x05, 0xd8, 0x41, 0x6f, 0xfc, 0xb3, 0x89,
+	0xae, 0x68, 0x27, 0xba, 0x79, 0x1f, 0x6d, 0x48, 0xd1, 0xb4, 0x92, 0x02, 0x5f, 0xd6, 0x67, 0x63,
+	0xe7, 0xfd, 0xb7, 0x6a, 0xf0, 0x41, 0xc4, 0xef, 0xdc, 0x86, 0x12, 0x5c, 0x13, 0x2a, 0xe5, 0xf2,
+	0x81, 0xdf, 0xbc, 0x83, 0x16, 0xa1, 0x06, 0x83, 0xbc, 0x86, 0x2b, 0xf5, 0x97, 0xe4, 0xe0, 0x07,
+	0xbe, 0x98, 0x00, 0xb5, 0x63, 0xc8, 0xbe, 0x6c, 0xbe, 0x4d, 0x13, 0x70, 0x98, 0x89, 0x0a, 0x73,
+	0x2c, 0x3f, 0x4c, 0x4e, 0x40, 0x99, 0x51, 0x4c, 0x40, 0x4e, 0x93, 0x1d, 0xcd, 0x09, 0x42, 0xf2,
+	0x8a, 0x04, 0x68, 0x98, 0xfb, 0x47, 0x06, 0xf4, 0x3e, 0x0e, 0x43, 0x2d, 0x56, 0x67, 0x70, 0x2d,
+	0x6f, 0x49, 0x10, 0x00, 0x17, 0xa0, 0x25, 0x71, 0x99, 0x03, 0xda, 0xbc, 0xa4, 0x3d, 0x34, 0xd0,
+	0xba, 0x71, 0xac, 0x85, 0x69, 0xfa, 0x5d, 0xcb, 0x5b, 0xc4, 0x71, 0x0c, 0xa8, 0x53, 0xb4, 0xaa,
+	0x0e, 0x40, 0xe0, 0x2d, 0xd4, 0x4a, 0xec, 0xa3, 0x4c, 0xa4, 0x85, 0x96, 0x19, 0x45, 0x62, 0x73,
+	0x1a, 0xe0, 0x5f, 0xdb, 0xa8, 0xa5, 0xb9, 0x01, 0x43, 0x24, 0x97, 0x64, 0x24, 0x23, 0xd3, 0x97,
+	0xe7, 0xf2, 0xca, 0x90, 0x8c, 0xa3, 0x5c, 0xcb, 0xdb, 0xc4, 0xe7, 0x07, 0x41, 0x90, 0x2f, 0xd1,
+	0x4a, 0x7e, 0xc9, 0x85, 0xc0, 0x16, 0x65, 0x60, 0x5e, 0x8d, 0x02, 0xa0, 0x29, 0x2f, 0xad, 0x01,
+	0x8d, 0xcd, 0xb5, 0xbc, 0xe5, 0x0c, 0x35, 0xcd, 0x8f, 0xe6, 0xa8, 0x83, 0x30, 0x96, 0x6a, 0xe5,
+	0xe7, 0x50, 0xc9, 0x0f, 0x41, 0xad, 0x5f, 0x0b, 0xa6, 0x51, 0x22, 0x3f, 0xec, 0xfc, 0x20, 0x95,
+	0x9f, 0xfc, 0x12, 0x04, 0x81, 0xa1, 0x5a, 0xf9, 0x79, 0x0c, 0x1a, 0x6d, 0x38, 0x25, 0x36, 0x91,
+	0x9f, 0x0c, 0x05, 0xe8, 0x1f, 0x50, 0x03, 0xae, 0x42, 0x00, 0x6e, 0x48, 0xf0, 0x13, 0xd3, 0x21,
+	0x20, 0x14, 0x5a, 0xac, 0xd6, 0xe2, 0x5a, 0x1e, 0x92, 0x10, 0x40, 0xfe, 0x62, 0xa3, 0xb5, 0xe9,
+	0x0d, 0x0a, 0xb8, 0xcb, 0x92, 0x7b, 0x6c, 0xe4, 0x66, 0xaa, 0x12, 0x76, 0x89, 0xd5, 0xb5, 0xbc,
+	0x55, 0x05, 0x84, 0x18, 0x7e, 0xb7, 0xd1, 0xe5, 0xb3, 0xaf, 0x4f, 0x88, 0x63, 0x45, 0xc6, 0x71,
+	0x62, 0x5a, 0x31, 0xfe, 0xbe, 0x12, 0xea, 0x17, 0x4b, 0xc5, 0x00, 0xd7, 0xf2, 0x36, 0x70, 0xc1,
+	0x0e, 0x01, 0xfd, 0x66, 0xa3, 0xcb, 0x67, 0xdf, 0x62, 0x10, 0xd0, 0x6a, 0xad, 0xc4, 0x7c, 0xcd,
+	0x70, 0x4f, 0x4c, 0x29, 0x21, 0xbe, 0x3a, 0x09, 0xa7, 0xd1, 0x94, 0x5a, 0x5d, 0xcb, 0x5b, 0xf7,
+	0xa7, 0x46, 0x88, 0xe4, 0x2f, 0x1b, 0xdd, 0xa8, 0x7c, 0x24, 0x40, 0x60, 0x6b, 0x32, 0x30, 0x5e,
+	0x73, 0x97, 0x3b, 0xc8, 0xfd, 0x1c, 0xe5, 0x6e, 0x34, 0x71, 0xd6, 0x1d, 0xec, 0x5a, 0xde, 0x87,
+	0x61, 0xe9, 0xd8, 0x69, 0x91, 0x4d, 0x1f, 0xa6, 0x10, 0xf2, 0x7a, 0xad, 0x5c, 0x1e, 0xe4, 0x2a,
+	0xed, 0xcc, 0x96, 0x5a, 0x45, 0x91, 0x29, 0x20, 0xc4, 0x90, 0xa2, 0xe5, 0xec, 0x81, 0x09, 0xfc,
+	0x0d, 0xc9, 0xef, 0x99, 0xae, 0x3c, 0x52, 0xa2, 0x85, 0xeb, 0x4d, 0xae, 0xe5, 0x35, 0x80, 0xa3,
+	0xb0, 0xd9, 0x7f, 0x02, 0x80, 0x6d, 0xd6, 0xc2, 0x42, 0x41, 0xea, 0xf7, 0x5a, 0xad, 0x49, 0x60,
+	0x81, 0xa3, 0x76, 0x12, 0x78, 0x10, 0x03, 0xf5, 0x72, 0xad, 0x9d, 0xc4, 0x15, 0x0a, 0x2d, 0x54,
+	0x6b, 0x11, 0x3b, 0x89, 0x84, 0x00, 0xf2, 0x57, 0x1b, 0x6d, 0x14, 0x9f, 0x52, 0x40, 0x7e, 0x47,
+	0x92, 0x9f, 0x1a, 0xc8, 0x1e, 0xc1, 0xe1, 0x81, 0x94, 0x69, 0xf1, 0xe5, 0x66, 0x71, 0xbd, 0x4d,
+	0x94, 0x55, 0xa5, 0x3c, 0x7b, 0x05, 0x41, 0x08, 0x57, 0x6a, 0xa5, 0xfc, 0x48, 0x4a, 0xb4, 0x78,
+	0xbd, 0x49, 0xa4, 0x1c, 0x38, 0x2a, 0xe5, 0xf0, 0x5f, 0x00, 0x50, 0x37, 0x6b, 0xa5, 0x5c, 0xac,
+	0xb2, 0xb0, 0xf4, 0xd6, 0xa1, 0x4d, 0xb9, 0x84, 0xa8, 0x9b, 0xd5, 0x73, 0x3a, 0xc8, 0x80, 0xef,
+	0xd6, 0xba, 0x59, 0x3d, 0xa4, 0x03, 0x2d, 0x4e, 0xd3, 0x2f, 0x6e, 0x56, 0xcf, 0xe9, 0x40, 0xb6,
+	0xf7, 0x2e, 0xa1, 0x79, 0x89, 0xd9, 0xfb, 0xd7, 0x46, 0x37, 0x87, 0x74, 0x62, 0x7e, 0x65, 0xed,
+	0xad, 0x17, 0x6e, 0xf2, 0x3d, 0x71, 0x1d, 0xee, 0xd9, 0xdf, 0x3c, 0xcc, 0x64, 0x63, 0x1a, 0xe2,
+	0x68, 0xec, 0xd0, 0x64, 0xdc, 0x1e, 0x93, 0x48, 0x5e, 0x96, 0xdb, 0xd3, 0x77, 0x40, 0xc5, 0x7f,
+	0x9f, 0x77, 0x55, 0xeb, 0xf5, 0xdc, 0x85, 0xfb, 0xdd, 0xee, 0x9f, 0x73, 0xd7, 0xef, 0x83, 0xcb,
+	0xae, 0xcf, 0x1c, 0x68, 0x8a, 0xd6, 0xf1, 0xae, 0xe3, 0xe5, 0x23, 0xff, 0xce, 0xc7, 0x9c, 0x74,
+	0x7d, 0x76, 0xa2, 0xc6, 0x9c, 0x1c, 0xef, 0x9e, 0xa8, 0x31, 0x6f, 0xe6, 0x6e, 0x82, 0xa1, 0xd3,
+	0xe9, 0xfa, 0xac, 0xd3, 0x51, 0xa3, 0x3a, 0x9d, 0xe3, 0xdd, 0x4e, 0x47, 0x8d, 0x1b, 0x2c, 0xc8,
+	0x60, 0x77, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x7d, 0x27, 0x51, 0xa7, 0x15, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/feed_placeholder_view.pb.go b/googleapis/ads/googleads/v3/resources/feed_placeholder_view.pb.go
new file mode 100644
index 0000000..4a738c7
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/feed_placeholder_view.pb.go
@@ -0,0 +1,113 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/feed_placeholder_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A feed placeholder view.
+type FeedPlaceholderView struct {
+	// The resource name of the feed placeholder view.
+	// Feed placeholder view resource names have the form:
+	//
+	// `customers/{customer_id}/feedPlaceholderViews/{placeholder_type}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The placeholder type of the feed placeholder view.
+	PlaceholderType      enums.PlaceholderTypeEnum_PlaceholderType `protobuf:"varint,2,opt,name=placeholder_type,json=placeholderType,proto3,enum=google.ads.googleads.v3.enums.PlaceholderTypeEnum_PlaceholderType" json:"placeholder_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
+	XXX_unrecognized     []byte                                    `json:"-"`
+	XXX_sizecache        int32                                     `json:"-"`
+}
+
+func (m *FeedPlaceholderView) Reset()         { *m = FeedPlaceholderView{} }
+func (m *FeedPlaceholderView) String() string { return proto.CompactTextString(m) }
+func (*FeedPlaceholderView) ProtoMessage()    {}
+func (*FeedPlaceholderView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d5dcecda7416af9b, []int{0}
+}
+
+func (m *FeedPlaceholderView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedPlaceholderView.Unmarshal(m, b)
+}
+func (m *FeedPlaceholderView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedPlaceholderView.Marshal(b, m, deterministic)
+}
+func (m *FeedPlaceholderView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedPlaceholderView.Merge(m, src)
+}
+func (m *FeedPlaceholderView) XXX_Size() int {
+	return xxx_messageInfo_FeedPlaceholderView.Size(m)
+}
+func (m *FeedPlaceholderView) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedPlaceholderView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedPlaceholderView proto.InternalMessageInfo
+
+func (m *FeedPlaceholderView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *FeedPlaceholderView) GetPlaceholderType() enums.PlaceholderTypeEnum_PlaceholderType {
+	if m != nil {
+		return m.PlaceholderType
+	}
+	return enums.PlaceholderTypeEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*FeedPlaceholderView)(nil), "google.ads.googleads.v3.resources.FeedPlaceholderView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/feed_placeholder_view.proto", fileDescriptor_d5dcecda7416af9b)
+}
+
+var fileDescriptor_d5dcecda7416af9b = []byte{
+	// 379 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x4a, 0xeb, 0x40,
+	0x14, 0x25, 0x79, 0xf0, 0xe0, 0x85, 0xf7, 0x9e, 0x52, 0x37, 0xb5, 0xb8, 0x68, 0x95, 0x42, 0x17,
+	0x32, 0x03, 0xc6, 0xd5, 0x88, 0x8b, 0x14, 0xb4, 0xe0, 0x42, 0x4a, 0x91, 0x2c, 0x24, 0x50, 0xc6,
+	0xcc, 0x35, 0x06, 0x32, 0x33, 0x31, 0x93, 0xb4, 0x94, 0xd2, 0xa5, 0xdf, 0x21, 0xb8, 0xf4, 0x53,
+	0xfc, 0x94, 0x7e, 0x85, 0x34, 0xd3, 0x4c, 0x6b, 0x69, 0x75, 0x77, 0xb8, 0xf7, 0x9c, 0x33, 0xf7,
+	0xe4, 0xc4, 0xb9, 0x8c, 0xa4, 0x8c, 0x12, 0xc0, 0x94, 0x29, 0xac, 0xe1, 0x02, 0x8d, 0x5c, 0x9c,
+	0x81, 0x92, 0x45, 0x16, 0x82, 0xc2, 0x8f, 0x00, 0x6c, 0x98, 0x26, 0x34, 0x84, 0x27, 0x99, 0x30,
+	0xc8, 0x86, 0xa3, 0x18, 0xc6, 0x28, 0xcd, 0x64, 0x2e, 0x6b, 0x2d, 0xad, 0x41, 0x94, 0x29, 0x64,
+	0xe4, 0x68, 0xe4, 0x22, 0x23, 0x6f, 0x9c, 0xef, 0x7a, 0x01, 0x44, 0xc1, 0x15, 0x5e, 0x37, 0xce,
+	0x27, 0x29, 0x68, 0xe3, 0xc6, 0x61, 0xa5, 0x4a, 0x63, 0x73, 0xca, 0x72, 0x75, 0xb4, 0xb6, 0xa2,
+	0x42, 0xc8, 0x9c, 0xe6, 0xb1, 0x14, 0x4a, 0x6f, 0x8f, 0x5f, 0x6d, 0xe7, 0xe0, 0x1a, 0x80, 0xf5,
+	0x57, 0xbe, 0x7e, 0x0c, 0xe3, 0xda, 0x89, 0xf3, 0xaf, 0xf2, 0x19, 0x0a, 0xca, 0xa1, 0x6e, 0x35,
+	0xad, 0xce, 0x9f, 0xc1, 0xdf, 0x6a, 0x78, 0x4b, 0x39, 0xd4, 0xb8, 0xb3, 0xbf, 0x79, 0x4f, 0xdd,
+	0x6e, 0x5a, 0x9d, 0xff, 0x67, 0x5d, 0xb4, 0x2b, 0x69, 0x19, 0x03, 0xad, 0x3d, 0x77, 0x37, 0x49,
+	0xe1, 0x4a, 0x14, 0x7c, 0x73, 0x36, 0xd8, 0x4b, 0xbf, 0x0e, 0x48, 0x3e, 0xf7, 0x9e, 0x9d, 0xd3,
+	0x95, 0xdb, 0x12, 0xa5, 0xb1, 0x42, 0xa1, 0xe4, 0x78, 0x5b, 0x0c, 0x2f, 0x2c, 0x54, 0x2e, 0x39,
+	0x64, 0x0a, 0x4f, 0x2b, 0x38, 0x2b, 0x2b, 0xda, 0x60, 0x2a, 0x3c, 0xdd, 0x5a, 0xdc, 0xac, 0xfb,
+	0x62, 0x3b, 0xed, 0x50, 0x72, 0xf4, 0x63, 0x75, 0xdd, 0xfa, 0x96, 0x0b, 0xfa, 0x8b, 0xaf, 0xdc,
+	0xb7, 0xee, 0x6f, 0x96, 0xf2, 0x48, 0x26, 0x54, 0x44, 0x48, 0x66, 0x11, 0x8e, 0x40, 0x94, 0x1d,
+	0xe0, 0x55, 0x8e, 0x6f, 0xfe, 0xab, 0x0b, 0x83, 0xde, 0xec, 0x5f, 0x3d, 0xcf, 0x7b, 0xb7, 0x5b,
+	0x3d, 0x6d, 0xe9, 0x31, 0x85, 0x34, 0x5c, 0x20, 0xdf, 0x45, 0x83, 0x8a, 0xf9, 0x51, 0x71, 0x02,
+	0x8f, 0xa9, 0xc0, 0x70, 0x02, 0xdf, 0x0d, 0x0c, 0x67, 0x6e, 0xb7, 0xf5, 0x82, 0x10, 0x8f, 0x29,
+	0x42, 0x0c, 0x8b, 0x10, 0xdf, 0x25, 0xc4, 0xf0, 0x1e, 0x7e, 0x97, 0xc7, 0xba, 0x9f, 0x01, 0x00,
+	0x00, 0xff, 0xff, 0xaa, 0x95, 0xec, 0x49, 0x03, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/gender_view.pb.go b/googleapis/ads/googleads/v3/resources/gender_view.pb.go
new file mode 100644
index 0000000..13ee48a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/gender_view.pb.go
@@ -0,0 +1,99 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/gender_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A gender view.
+type GenderView struct {
+	// The resource name of the gender view.
+	// Gender view resource names have the form:
+	//
+	// `customers/{customer_id}/genderViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GenderView) Reset()         { *m = GenderView{} }
+func (m *GenderView) String() string { return proto.CompactTextString(m) }
+func (*GenderView) ProtoMessage()    {}
+func (*GenderView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_374a728b177a8cfa, []int{0}
+}
+
+func (m *GenderView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenderView.Unmarshal(m, b)
+}
+func (m *GenderView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenderView.Marshal(b, m, deterministic)
+}
+func (m *GenderView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenderView.Merge(m, src)
+}
+func (m *GenderView) XXX_Size() int {
+	return xxx_messageInfo_GenderView.Size(m)
+}
+func (m *GenderView) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenderView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenderView proto.InternalMessageInfo
+
+func (m *GenderView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GenderView)(nil), "google.ads.googleads.v3.resources.GenderView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/gender_view.proto", fileDescriptor_374a728b177a8cfa)
+}
+
+var fileDescriptor_374a728b177a8cfa = []byte{
+	// 310 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0xc1, 0x4a, 0x33, 0x31,
+	0x14, 0x85, 0x99, 0xfe, 0xf0, 0x83, 0x41, 0x11, 0xba, 0xd2, 0xe2, 0xc2, 0x5a, 0x0a, 0xae, 0x92,
+	0x45, 0x76, 0x71, 0x95, 0x6e, 0x0a, 0x2e, 0xa4, 0x14, 0x1c, 0x44, 0x06, 0x4a, 0x9c, 0x84, 0x30,
+	0xd0, 0xc9, 0x2d, 0xb9, 0xd3, 0x76, 0x51, 0xfa, 0x04, 0xbe, 0x85, 0x4b, 0x1f, 0xc5, 0x47, 0xe9,
+	0x33, 0xb8, 0x90, 0x69, 0x9a, 0xb4, 0x2b, 0xdd, 0x1d, 0x72, 0xbf, 0x73, 0xee, 0x3d, 0x21, 0xdc,
+	0x02, 0xd8, 0xb9, 0x61, 0x4a, 0x23, 0x0b, 0xb2, 0x55, 0x2b, 0xce, 0xbc, 0x41, 0x58, 0xfa, 0xd2,
+	0x20, 0xb3, 0xc6, 0x69, 0xe3, 0x67, 0xab, 0xca, 0xac, 0xe9, 0xc2, 0x43, 0x03, 0xdd, 0x7e, 0x20,
+	0xa9, 0xd2, 0x48, 0x93, 0x89, 0xae, 0x38, 0x4d, 0xa6, 0xde, 0x75, 0xcc, 0x5d, 0x54, 0x29, 0x2a,
+	0xb8, 0x7b, 0x37, 0x27, 0x23, 0xe5, 0x1c, 0x34, 0xaa, 0xa9, 0xc0, 0x61, 0x98, 0xde, 0xbd, 0x67,
+	0x84, 0x8c, 0xf7, 0x1b, 0xf3, 0xca, 0xac, 0xbb, 0x03, 0x72, 0x11, 0xed, 0x33, 0xa7, 0x6a, 0x73,
+	0x95, 0xdd, 0x66, 0xf7, 0x67, 0xd3, 0xf3, 0xf8, 0xf8, 0xa4, 0x6a, 0x23, 0x5e, 0x76, 0xf2, 0x99,
+	0x0c, 0x8e, 0x97, 0x1c, 0xd4, 0xa2, 0x42, 0x5a, 0x42, 0xcd, 0x4e, 0xe2, 0x68, 0xb9, 0xc4, 0x06,
+	0x6a, 0xe3, 0x91, 0x6d, 0xa2, 0xdc, 0x1e, 0x1a, 0xb6, 0x00, 0xb2, 0xcd, 0x49, 0xdd, 0xed, 0xe8,
+	0x3b, 0x23, 0xc3, 0x12, 0x6a, 0xfa, 0x67, 0xe1, 0xd1, 0xe5, 0x71, 0xcb, 0xa4, 0x2d, 0x32, 0xc9,
+	0x5e, 0x1f, 0x0f, 0x2e, 0x0b, 0x73, 0xe5, 0x2c, 0x05, 0x6f, 0xdb, 0x4d, 0xfb, 0x9a, 0xec, 0x78,
+	0xe2, 0x2f, 0x5f, 0xff, 0x90, 0xd4, 0x47, 0xe7, 0xdf, 0x58, 0xca, 0xcf, 0x4e, 0x7f, 0x1c, 0x22,
+	0xa5, 0x46, 0x1a, 0x64, 0xab, 0x72, 0x4e, 0xa7, 0x91, 0xfc, 0x8a, 0x4c, 0x21, 0x35, 0x16, 0x89,
+	0x29, 0x72, 0x5e, 0x24, 0x66, 0xd7, 0x19, 0x86, 0x81, 0x10, 0x52, 0xa3, 0x10, 0x89, 0x12, 0x22,
+	0xe7, 0x42, 0x24, 0xee, 0xed, 0xff, 0xfe, 0x58, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xc5,
+	0x56, 0x57, 0x26, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/geo_target_constant.pb.go b/googleapis/ads/googleads/v3/resources/geo_target_constant.pb.go
new file mode 100644
index 0000000..0c9fc33
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/geo_target_constant.pb.go
@@ -0,0 +1,167 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/geo_target_constant.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A geo target constant.
+type GeoTargetConstant struct {
+	// The resource name of the geo target constant.
+	// Geo target constant resource names have the form:
+	//
+	// `geoTargetConstants/{geo_target_constant_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the geo target constant.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// Geo target constant English name.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The ISO-3166-1 alpha-2 country code that is associated with the target.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,5,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// Geo target constant target type.
+	TargetType *wrappers.StringValue `protobuf:"bytes,6,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"`
+	// Geo target constant status.
+	Status enums.GeoTargetConstantStatusEnum_GeoTargetConstantStatus `protobuf:"varint,7,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.GeoTargetConstantStatusEnum_GeoTargetConstantStatus" json:"status,omitempty"`
+	// The fully qualified English name, consisting of the target's name and that
+	// of its parent and country.
+	CanonicalName        *wrappers.StringValue `protobuf:"bytes,8,opt,name=canonical_name,json=canonicalName,proto3" json:"canonical_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *GeoTargetConstant) Reset()         { *m = GeoTargetConstant{} }
+func (m *GeoTargetConstant) String() string { return proto.CompactTextString(m) }
+func (*GeoTargetConstant) ProtoMessage()    {}
+func (*GeoTargetConstant) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28e0880fcfd2987c, []int{0}
+}
+
+func (m *GeoTargetConstant) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GeoTargetConstant.Unmarshal(m, b)
+}
+func (m *GeoTargetConstant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GeoTargetConstant.Marshal(b, m, deterministic)
+}
+func (m *GeoTargetConstant) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GeoTargetConstant.Merge(m, src)
+}
+func (m *GeoTargetConstant) XXX_Size() int {
+	return xxx_messageInfo_GeoTargetConstant.Size(m)
+}
+func (m *GeoTargetConstant) XXX_DiscardUnknown() {
+	xxx_messageInfo_GeoTargetConstant.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GeoTargetConstant proto.InternalMessageInfo
+
+func (m *GeoTargetConstant) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *GeoTargetConstant) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *GeoTargetConstant) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *GeoTargetConstant) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *GeoTargetConstant) GetTargetType() *wrappers.StringValue {
+	if m != nil {
+		return m.TargetType
+	}
+	return nil
+}
+
+func (m *GeoTargetConstant) GetStatus() enums.GeoTargetConstantStatusEnum_GeoTargetConstantStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.GeoTargetConstantStatusEnum_UNSPECIFIED
+}
+
+func (m *GeoTargetConstant) GetCanonicalName() *wrappers.StringValue {
+	if m != nil {
+		return m.CanonicalName
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*GeoTargetConstant)(nil), "google.ads.googleads.v3.resources.GeoTargetConstant")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/geo_target_constant.proto", fileDescriptor_28e0880fcfd2987c)
+}
+
+var fileDescriptor_28e0880fcfd2987c = []byte{
+	// 490 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x51, 0x6b, 0xd4, 0x40,
+	0x10, 0xc7, 0x49, 0x7a, 0x9e, 0xba, 0xd7, 0x16, 0xcc, 0x83, 0xc4, 0x5a, 0xe4, 0xaa, 0x14, 0x0e,
+	0x85, 0x8d, 0x34, 0xe2, 0x43, 0x8a, 0x4a, 0x7a, 0xc8, 0xa1, 0x0f, 0x52, 0xd2, 0x12, 0x50, 0x0e,
+	0xc2, 0x36, 0x59, 0x97, 0xc8, 0x65, 0x27, 0x64, 0x37, 0x95, 0x43, 0x7c, 0xf2, 0x9b, 0xe8, 0x9b,
+	0x1f, 0xc5, 0x8f, 0xd2, 0x4f, 0x21, 0xb7, 0xbb, 0xd9, 0x8a, 0x77, 0xa7, 0xf7, 0x36, 0xd9, 0xf9,
+	0xff, 0x66, 0xfe, 0x3b, 0xb3, 0x41, 0xc7, 0x0c, 0x80, 0xcd, 0x68, 0x40, 0x0a, 0x11, 0xe8, 0x70,
+	0x11, 0x5d, 0x86, 0x41, 0x43, 0x05, 0xb4, 0x4d, 0x4e, 0x45, 0xc0, 0x28, 0x64, 0x92, 0x34, 0x8c,
+	0xca, 0x2c, 0x07, 0x2e, 0x24, 0xe1, 0x12, 0xd7, 0x0d, 0x48, 0xf0, 0x0e, 0x34, 0x81, 0x49, 0x21,
+	0xb0, 0x85, 0xf1, 0x65, 0x88, 0x2d, 0xbc, 0xf7, 0x72, 0x5d, 0x7d, 0xca, 0xdb, 0x6a, 0x65, 0xed,
+	0x4c, 0x48, 0x22, 0x5b, 0xa1, 0x5b, 0xec, 0xdd, 0xeb, 0xf8, 0xba, 0xb4, 0x96, 0x4c, 0xea, 0x81,
+	0x49, 0xa9, 0xaf, 0x8b, 0xf6, 0x63, 0xf0, 0xb9, 0x21, 0x75, 0x4d, 0x9b, 0x0e, 0xdd, 0xff, 0x03,
+	0x25, 0x9c, 0x83, 0x24, 0xb2, 0x04, 0x6e, 0xb2, 0x0f, 0x7f, 0xf4, 0xd0, 0x9d, 0x09, 0x85, 0x73,
+	0xd5, 0x7c, 0x6c, 0x7a, 0x7b, 0x8f, 0xd0, 0x4e, 0xd7, 0x25, 0xe3, 0xa4, 0xa2, 0xbe, 0x33, 0x74,
+	0x46, 0xb7, 0x93, 0xed, 0xee, 0xf0, 0x1d, 0xa9, 0xa8, 0xf7, 0x04, 0xb9, 0x65, 0xe1, 0x6f, 0x0d,
+	0x9d, 0xd1, 0xe0, 0xe8, 0xbe, 0xb9, 0x38, 0xee, 0x5c, 0xe0, 0x37, 0x5c, 0x3e, 0x7f, 0x96, 0x92,
+	0x59, 0x4b, 0x13, 0xb7, 0x2c, 0xbc, 0xa7, 0xa8, 0xa7, 0x0a, 0xf5, 0x94, 0x7c, 0x7f, 0x49, 0x7e,
+	0x26, 0x9b, 0x92, 0x33, 0xad, 0x57, 0x4a, 0xef, 0x15, 0xda, 0xce, 0xa1, 0xe5, 0xb2, 0x99, 0x67,
+	0x39, 0x14, 0xd4, 0xbf, 0xb1, 0x01, 0x39, 0x30, 0xc4, 0x18, 0x0a, 0xea, 0xbd, 0x40, 0x03, 0x33,
+	0x53, 0x39, 0xaf, 0xa9, 0xdf, 0xdf, 0x80, 0x47, 0x1a, 0x38, 0x9f, 0xd7, 0xd4, 0xfb, 0x84, 0xfa,
+	0x7a, 0x05, 0xfe, 0xcd, 0xa1, 0x33, 0xda, 0x3d, 0x4a, 0xf0, 0xba, 0x35, 0xab, 0x1d, 0xe2, 0xa5,
+	0x29, 0x9e, 0x29, 0xfa, 0x35, 0x6f, 0xab, 0x75, 0xb9, 0xc4, 0x74, 0xf0, 0xc6, 0x68, 0x37, 0x27,
+	0x1c, 0x78, 0x99, 0x93, 0x99, 0x1e, 0xf8, 0xad, 0x0d, 0xdc, 0xee, 0x58, 0x66, 0xb1, 0x8f, 0xe8,
+	0xfd, 0x55, 0x9c, 0xa2, 0xc7, 0xd7, 0xce, 0x4c, 0x54, 0x97, 0x02, 0xe7, 0x50, 0x05, 0xcb, 0x5b,
+	0x1e, 0xb1, 0xbf, 0x8f, 0x44, 0xf0, 0x65, 0xc5, 0x53, 0xfc, 0x7a, 0xf2, 0xcd, 0x45, 0x87, 0x39,
+	0x54, 0xf8, 0xbf, 0x0f, 0xfd, 0xe4, 0xee, 0x52, 0x9b, 0xd3, 0x85, 0xf5, 0x53, 0xe7, 0xc3, 0x5b,
+	0x03, 0x33, 0x98, 0x11, 0xce, 0x30, 0x34, 0x2c, 0x60, 0x94, 0xab, 0x8b, 0x05, 0xd7, 0x56, 0xff,
+	0xf1, 0x07, 0x1e, 0xdb, 0xe8, 0xbb, 0xbb, 0x35, 0x89, 0xe3, 0x9f, 0xee, 0xc1, 0x44, 0x97, 0x8c,
+	0x0b, 0x81, 0x75, 0xb8, 0x88, 0xd2, 0x10, 0x27, 0x9d, 0xf2, 0x57, 0xa7, 0x99, 0xc6, 0x85, 0x98,
+	0x5a, 0xcd, 0x34, 0x0d, 0xa7, 0x56, 0x73, 0xe5, 0x1e, 0xea, 0x44, 0x14, 0xc5, 0x85, 0x88, 0x22,
+	0xab, 0x8a, 0xa2, 0x34, 0x8c, 0x22, 0xab, 0xbb, 0xe8, 0x2b, 0xb3, 0xe1, 0xef, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0x81, 0x94, 0x66, 0x8c, 0x2d, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/geographic_view.pb.go b/googleapis/ads/googleads/v3/resources/geographic_view.pb.go
new file mode 100644
index 0000000..ac2d24e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/geographic_view.pb.go
@@ -0,0 +1,132 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/geographic_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A geographic view.
+//
+// Geographic View includes all metrics aggregated at the country level,
+// one row per country. It reports metrics at either actual physical location of
+// the user or an area of interest. If other segment fields are used, you may
+// get more than one row per country.
+type GeographicView struct {
+	// The resource name of the geographic view.
+	// Geographic view resource names have the form:
+	//
+	// `customers/{customer_id}/geographicViews/{country_criterion_id}~{location_type}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Type of the geo targeting of the campaign.
+	LocationType enums.GeoTargetingTypeEnum_GeoTargetingType `protobuf:"varint,3,opt,name=location_type,json=locationType,proto3,enum=google.ads.googleads.v3.enums.GeoTargetingTypeEnum_GeoTargetingType" json:"location_type,omitempty"`
+	// Criterion Id for the country.
+	CountryCriterionId   *wrappers.Int64Value `protobuf:"bytes,4,opt,name=country_criterion_id,json=countryCriterionId,proto3" json:"country_criterion_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *GeographicView) Reset()         { *m = GeographicView{} }
+func (m *GeographicView) String() string { return proto.CompactTextString(m) }
+func (*GeographicView) ProtoMessage()    {}
+func (*GeographicView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9e9d21ad3e852168, []int{0}
+}
+
+func (m *GeographicView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GeographicView.Unmarshal(m, b)
+}
+func (m *GeographicView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GeographicView.Marshal(b, m, deterministic)
+}
+func (m *GeographicView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GeographicView.Merge(m, src)
+}
+func (m *GeographicView) XXX_Size() int {
+	return xxx_messageInfo_GeographicView.Size(m)
+}
+func (m *GeographicView) XXX_DiscardUnknown() {
+	xxx_messageInfo_GeographicView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GeographicView proto.InternalMessageInfo
+
+func (m *GeographicView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *GeographicView) GetLocationType() enums.GeoTargetingTypeEnum_GeoTargetingType {
+	if m != nil {
+		return m.LocationType
+	}
+	return enums.GeoTargetingTypeEnum_UNSPECIFIED
+}
+
+func (m *GeographicView) GetCountryCriterionId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CountryCriterionId
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*GeographicView)(nil), "google.ads.googleads.v3.resources.GeographicView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/geographic_view.proto", fileDescriptor_9e9d21ad3e852168)
+}
+
+var fileDescriptor_9e9d21ad3e852168 = []byte{
+	// 446 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x5d, 0x6b, 0x14, 0x31,
+	0x14, 0x65, 0xa6, 0x22, 0x38, 0xb6, 0x7d, 0x18, 0x7d, 0x58, 0xab, 0xc8, 0x56, 0x29, 0xee, 0x53,
+	0x02, 0x1d, 0x59, 0x21, 0x3e, 0x4d, 0x55, 0x96, 0x0a, 0x4a, 0x59, 0xca, 0x3c, 0xc8, 0xc2, 0x90,
+	0xce, 0x5c, 0x63, 0x60, 0x27, 0x77, 0x48, 0x32, 0xbb, 0x2c, 0xa5, 0xe0, 0x6f, 0xf1, 0xd1, 0x9f,
+	0xe2, 0xbb, 0x7f, 0xa2, 0xbf, 0x42, 0xe6, 0x23, 0x69, 0xad, 0xd4, 0xbe, 0x9d, 0xe4, 0x9e, 0x73,
+	0xee, 0x3d, 0xc9, 0x8d, 0xde, 0x08, 0x44, 0xb1, 0x04, 0xca, 0x4b, 0x43, 0x7b, 0xd8, 0xa2, 0x55,
+	0x42, 0x35, 0x18, 0x6c, 0x74, 0x01, 0x86, 0x0a, 0x40, 0xa1, 0x79, 0xfd, 0x4d, 0x16, 0xf9, 0x4a,
+	0xc2, 0x9a, 0xd4, 0x1a, 0x2d, 0xc6, 0xfb, 0x3d, 0x9b, 0xf0, 0xd2, 0x10, 0x2f, 0x24, 0xab, 0x84,
+	0x78, 0xe1, 0xde, 0xf4, 0x36, 0x6f, 0x50, 0x4d, 0xd5, 0xf9, 0xe6, 0x96, 0x6b, 0x01, 0x56, 0x2a,
+	0x91, 0xdb, 0x4d, 0x0d, 0xbd, 0xf5, 0xde, 0x13, 0xa7, 0xab, 0xa5, 0x1f, 0x63, 0x28, 0x3d, 0x1f,
+	0x4a, 0xdd, 0xe9, 0xac, 0xf9, 0x4a, 0xd7, 0x9a, 0xd7, 0x35, 0x68, 0x33, 0xd4, 0x9f, 0x5d, 0x93,
+	0x72, 0xa5, 0xd0, 0x72, 0x2b, 0x51, 0x0d, 0xd5, 0x17, 0xbf, 0xc3, 0x68, 0x77, 0xe6, 0xd3, 0x64,
+	0x12, 0xd6, 0xf1, 0xcb, 0x68, 0xc7, 0xb5, 0xc8, 0x15, 0xaf, 0x60, 0x14, 0x8c, 0x83, 0xc9, 0x83,
+	0xf9, 0xb6, 0xbb, 0xfc, 0xcc, 0x2b, 0x88, 0x65, 0xb4, 0xb3, 0xc4, 0xa2, 0xb3, 0xea, 0xe6, 0x1c,
+	0x6d, 0x8d, 0x83, 0xc9, 0xee, 0xe1, 0x7b, 0x72, 0xdb, 0x1b, 0x74, 0x01, 0xc9, 0x0c, 0xf0, 0xd4,
+	0xe5, 0x3b, 0xdd, 0xd4, 0xf0, 0x41, 0x35, 0xd5, 0x3f, 0x97, 0xf3, 0x6d, 0x67, 0xdd, 0x9e, 0xe2,
+	0x4f, 0xd1, 0xe3, 0x02, 0x1b, 0x65, 0xf5, 0x26, 0x2f, 0xb4, 0xb4, 0xa0, 0xdb, 0x9e, 0xb2, 0x1c,
+	0xdd, 0x1b, 0x07, 0x93, 0x87, 0x87, 0x4f, 0x5d, 0x47, 0x97, 0x9f, 0x1c, 0x2b, 0x3b, 0x7d, 0x9d,
+	0xf1, 0x65, 0x03, 0xf3, 0x78, 0x10, 0xbe, 0x73, 0xba, 0xe3, 0x92, 0x95, 0x97, 0x29, 0x8f, 0x5e,
+	0x5d, 0xcd, 0x36, 0xa0, 0x5a, 0x1a, 0x52, 0x60, 0x45, 0x6f, 0x3c, 0xc6, 0xb4, 0x68, 0x8c, 0xc5,
+	0x0a, 0xb4, 0xa1, 0xe7, 0x0e, 0x5e, 0x5c, 0xfb, 0xff, 0x96, 0x64, 0xe8, 0xf9, 0x8d, 0x85, 0xb8,
+	0x38, 0xfa, 0x1e, 0x46, 0x07, 0x05, 0x56, 0xe4, 0xce, 0x95, 0x38, 0x7a, 0xf4, 0x77, 0xc7, 0x93,
+	0x36, 0xc6, 0x49, 0xf0, 0xe5, 0xe3, 0xa0, 0x14, 0xb8, 0xe4, 0x4a, 0x10, 0xd4, 0x82, 0x0a, 0x50,
+	0x5d, 0x48, 0x7a, 0x35, 0xf2, 0x7f, 0x96, 0xf4, 0xad, 0x47, 0x3f, 0xc2, 0xad, 0x59, 0x9a, 0xfe,
+	0x0c, 0xf7, 0x67, 0xbd, 0x65, 0x5a, 0x1a, 0xd2, 0xc3, 0x16, 0x65, 0x09, 0x99, 0x3b, 0xe6, 0x2f,
+	0xc7, 0x59, 0xa4, 0xa5, 0x59, 0x78, 0xce, 0x22, 0x4b, 0x16, 0x9e, 0x73, 0x19, 0x1e, 0xf4, 0x05,
+	0xc6, 0xd2, 0xd2, 0x30, 0xe6, 0x59, 0x8c, 0x65, 0x09, 0x63, 0x9e, 0x77, 0x76, 0xbf, 0x1b, 0x36,
+	0xf9, 0x13, 0x00, 0x00, 0xff, 0xff, 0x4c, 0xd7, 0x44, 0x65, 0x50, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/google_ads_field.pb.go b/googleapis/ads/googleads/v3/resources/google_ads_field.pb.go
new file mode 100644
index 0000000..e1ab756
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/google_ads_field.pb.go
@@ -0,0 +1,262 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/google_ads_field.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A field or resource (artifact) used by GoogleAdsService.
+type GoogleAdsField struct {
+	// The resource name of the artifact.
+	// Artifact resource names have the form:
+	//
+	// `googleAdsFields/{name}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The name of the artifact.
+	Name *wrappers.StringValue `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	// The category of the artifact.
+	Category enums.GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory `protobuf:"varint,3,opt,name=category,proto3,enum=google.ads.googleads.v3.enums.GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory" json:"category,omitempty"`
+	// Whether the artifact can be used in a SELECT clause in search
+	// queries.
+	Selectable *wrappers.BoolValue `protobuf:"bytes,4,opt,name=selectable,proto3" json:"selectable,omitempty"`
+	// Whether the artifact can be used in a WHERE clause in search
+	// queries.
+	Filterable *wrappers.BoolValue `protobuf:"bytes,5,opt,name=filterable,proto3" json:"filterable,omitempty"`
+	// Whether the artifact can be used in a ORDER BY clause in search
+	// queries.
+	Sortable *wrappers.BoolValue `protobuf:"bytes,6,opt,name=sortable,proto3" json:"sortable,omitempty"`
+	// The names of all resources, segments, and metrics that are selectable with
+	// the described artifact.
+	SelectableWith []*wrappers.StringValue `protobuf:"bytes,7,rep,name=selectable_with,json=selectableWith,proto3" json:"selectable_with,omitempty"`
+	// The names of all resources that are selectable with the described
+	// artifact. Fields from these resources do not segment metrics when included
+	// in search queries.
+	//
+	// This field is only set for artifacts whose category is RESOURCE.
+	AttributeResources []*wrappers.StringValue `protobuf:"bytes,8,rep,name=attribute_resources,json=attributeResources,proto3" json:"attribute_resources,omitempty"`
+	// At and beyond version V1 this field lists the names of all metrics that are
+	// selectable with the described artifact when it is used in the FROM clause.
+	// It is only set for artifacts whose category is RESOURCE.
+	//
+	// Before version V1 this field lists the names of all metrics that are
+	// selectable with the described artifact. It is only set for artifacts whose
+	// category is either RESOURCE or SEGMENT
+	Metrics []*wrappers.StringValue `protobuf:"bytes,9,rep,name=metrics,proto3" json:"metrics,omitempty"`
+	// At and beyond version V1 this field lists the names of all artifacts,
+	// whether a segment or another resource, that segment metrics when included
+	// in search queries and when the described artifact is used in the FROM
+	// clause. It is only set for artifacts whose category is RESOURCE.
+	//
+	// Before version V1 this field lists the names of all artifacts, whether a
+	// segment or another resource, that segment metrics when included in search
+	// queries. It is only set for artifacts of category RESOURCE, SEGMENT or
+	// METRIC.
+	Segments []*wrappers.StringValue `protobuf:"bytes,10,rep,name=segments,proto3" json:"segments,omitempty"`
+	// Values the artifact can assume if it is a field of type ENUM.
+	//
+	// This field is only set for artifacts of category SEGMENT or ATTRIBUTE.
+	EnumValues []*wrappers.StringValue `protobuf:"bytes,11,rep,name=enum_values,json=enumValues,proto3" json:"enum_values,omitempty"`
+	// This field determines the operators that can be used with the artifact
+	// in WHERE clauses.
+	DataType enums.GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType `protobuf:"varint,12,opt,name=data_type,json=dataType,proto3,enum=google.ads.googleads.v3.enums.GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType" json:"data_type,omitempty"`
+	// The URL of proto describing the artifact's data type.
+	TypeUrl *wrappers.StringValue `protobuf:"bytes,13,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"`
+	// Whether the field artifact is repeated.
+	IsRepeated           *wrappers.BoolValue `protobuf:"bytes,14,opt,name=is_repeated,json=isRepeated,proto3" json:"is_repeated,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *GoogleAdsField) Reset()         { *m = GoogleAdsField{} }
+func (m *GoogleAdsField) String() string { return proto.CompactTextString(m) }
+func (*GoogleAdsField) ProtoMessage()    {}
+func (*GoogleAdsField) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7843d52294d73b63, []int{0}
+}
+
+func (m *GoogleAdsField) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GoogleAdsField.Unmarshal(m, b)
+}
+func (m *GoogleAdsField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GoogleAdsField.Marshal(b, m, deterministic)
+}
+func (m *GoogleAdsField) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GoogleAdsField.Merge(m, src)
+}
+func (m *GoogleAdsField) XXX_Size() int {
+	return xxx_messageInfo_GoogleAdsField.Size(m)
+}
+func (m *GoogleAdsField) XXX_DiscardUnknown() {
+	xxx_messageInfo_GoogleAdsField.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GoogleAdsField proto.InternalMessageInfo
+
+func (m *GoogleAdsField) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *GoogleAdsField) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetCategory() enums.GoogleAdsFieldCategoryEnum_GoogleAdsFieldCategory {
+	if m != nil {
+		return m.Category
+	}
+	return enums.GoogleAdsFieldCategoryEnum_UNSPECIFIED
+}
+
+func (m *GoogleAdsField) GetSelectable() *wrappers.BoolValue {
+	if m != nil {
+		return m.Selectable
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetFilterable() *wrappers.BoolValue {
+	if m != nil {
+		return m.Filterable
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetSortable() *wrappers.BoolValue {
+	if m != nil {
+		return m.Sortable
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetSelectableWith() []*wrappers.StringValue {
+	if m != nil {
+		return m.SelectableWith
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetAttributeResources() []*wrappers.StringValue {
+	if m != nil {
+		return m.AttributeResources
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetMetrics() []*wrappers.StringValue {
+	if m != nil {
+		return m.Metrics
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetSegments() []*wrappers.StringValue {
+	if m != nil {
+		return m.Segments
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetEnumValues() []*wrappers.StringValue {
+	if m != nil {
+		return m.EnumValues
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetDataType() enums.GoogleAdsFieldDataTypeEnum_GoogleAdsFieldDataType {
+	if m != nil {
+		return m.DataType
+	}
+	return enums.GoogleAdsFieldDataTypeEnum_UNSPECIFIED
+}
+
+func (m *GoogleAdsField) GetTypeUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.TypeUrl
+	}
+	return nil
+}
+
+func (m *GoogleAdsField) GetIsRepeated() *wrappers.BoolValue {
+	if m != nil {
+		return m.IsRepeated
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*GoogleAdsField)(nil), "google.ads.googleads.v3.resources.GoogleAdsField")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/google_ads_field.proto", fileDescriptor_7843d52294d73b63)
+}
+
+var fileDescriptor_7843d52294d73b63 = []byte{
+	// 618 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xdf, 0x4a, 0xdc, 0x4e,
+	0x14, 0xc7, 0xd9, 0xd5, 0x9f, 0xc6, 0x59, 0xdd, 0x1f, 0x8c, 0x37, 0xa9, 0x48, 0x59, 0x2d, 0x52,
+	0xaf, 0x26, 0xc5, 0x80, 0x95, 0x88, 0x85, 0xd8, 0x5a, 0xa1, 0x60, 0x59, 0xd2, 0x76, 0x0b, 0x65,
+	0x21, 0xcc, 0x26, 0xc7, 0x38, 0x90, 0x64, 0xc2, 0xcc, 0x44, 0x91, 0x52, 0x28, 0xf4, 0x4d, 0x7a,
+	0xd9, 0x47, 0xe9, 0xa3, 0xf8, 0x14, 0x25, 0xff, 0x66, 0x77, 0xb5, 0xdb, 0xdd, 0xf6, 0xee, 0x64,
+	0xce, 0xf7, 0x33, 0xe7, 0x3b, 0x27, 0x67, 0x06, 0x1d, 0x45, 0x9c, 0x47, 0x31, 0x58, 0x34, 0x94,
+	0x56, 0x15, 0x16, 0xd1, 0xb5, 0x6d, 0x09, 0x90, 0x3c, 0x17, 0x01, 0x34, 0xcb, 0x3e, 0x0d, 0xa5,
+	0x7f, 0xc9, 0x20, 0x0e, 0x49, 0x26, 0xb8, 0xe2, 0x78, 0xa7, 0x5a, 0x27, 0x34, 0x94, 0x44, 0x93,
+	0xe4, 0xda, 0x26, 0x9a, 0xdc, 0x3a, 0x99, 0xb5, 0x39, 0xa4, 0x79, 0xf2, 0x70, 0x63, 0x3f, 0xa0,
+	0x0a, 0x22, 0x2e, 0x6e, 0xab, 0x0a, 0x5b, 0x2f, 0xfe, 0x12, 0x0f, 0xa9, 0xa2, 0xbe, 0xba, 0xcd,
+	0xa0, 0xe6, 0x1f, 0x35, 0x7c, 0xc6, 0xf4, 0x71, 0xea, 0xd4, 0xe3, 0x3a, 0x55, 0x7e, 0x8d, 0xf2,
+	0x4b, 0xeb, 0x46, 0xd0, 0x2c, 0x03, 0x21, 0xeb, 0xfc, 0xf6, 0x04, 0x4a, 0xd3, 0x94, 0x2b, 0xaa,
+	0x18, 0x4f, 0xeb, 0xec, 0xee, 0x37, 0x03, 0x75, 0xcf, 0x4b, 0x81, 0x1b, 0xca, 0xd7, 0x45, 0x6d,
+	0xfc, 0x04, 0x6d, 0x34, 0x25, 0xfc, 0x94, 0x26, 0x60, 0xb6, 0x7a, 0xad, 0xfd, 0x35, 0x6f, 0xbd,
+	0x59, 0x7c, 0x4b, 0x13, 0xc0, 0xcf, 0xd0, 0x72, 0x99, 0x6b, 0xf7, 0x5a, 0xfb, 0x9d, 0x83, 0xed,
+	0xba, 0x6d, 0xa4, 0x31, 0x41, 0xde, 0x29, 0xc1, 0xd2, 0x68, 0x40, 0xe3, 0x1c, 0xbc, 0x52, 0x89,
+	0x63, 0x64, 0x34, 0x4d, 0x31, 0x97, 0x7a, 0xad, 0xfd, 0xee, 0x41, 0x9f, 0xcc, 0xea, 0x7b, 0xd9,
+	0x15, 0x32, 0xed, 0xeb, 0x65, 0x0d, 0x9f, 0xa5, 0x79, 0x32, 0x23, 0xe5, 0xe9, 0x0a, 0xd8, 0x41,
+	0x48, 0x42, 0x0c, 0x81, 0xa2, 0xa3, 0x18, 0xcc, 0xe5, 0xd2, 0xe5, 0xd6, 0x03, 0x97, 0xa7, 0x9c,
+	0xc7, 0x95, 0xc7, 0x09, 0x75, 0xc1, 0x5e, 0xb2, 0x58, 0x81, 0x28, 0xd9, 0xff, 0xe6, 0xb3, 0x63,
+	0x35, 0x3e, 0x44, 0x86, 0xe4, 0xa2, 0xaa, 0xba, 0x32, 0x97, 0xd4, 0x5a, 0x7c, 0x86, 0xfe, 0x1f,
+	0x3b, 0xf0, 0x6f, 0x98, 0xba, 0x32, 0x57, 0x7b, 0x4b, 0x73, 0x5b, 0xdb, 0x1d, 0x43, 0x1f, 0x99,
+	0xba, 0xc2, 0x17, 0x68, 0x93, 0x2a, 0x25, 0xd8, 0x28, 0x57, 0xe0, 0xeb, 0xe9, 0x35, 0x8d, 0x05,
+	0xb6, 0xc2, 0x1a, 0xf4, 0x1a, 0x0e, 0x1f, 0xa2, 0xd5, 0x04, 0x94, 0x60, 0x81, 0x34, 0xd7, 0x16,
+	0xd8, 0xa2, 0x11, 0xe3, 0x23, 0x64, 0x48, 0x88, 0x12, 0x48, 0x95, 0x34, 0xd1, 0x02, 0xa0, 0x56,
+	0xe3, 0x13, 0xd4, 0x29, 0x7e, 0xbe, 0x7f, 0x5d, 0xac, 0x4b, 0xb3, 0xb3, 0x00, 0x8c, 0x0a, 0xa0,
+	0x0c, 0x25, 0x4e, 0xd0, 0x9a, 0xbe, 0x3a, 0xe6, 0xfa, 0x3f, 0x4c, 0xd9, 0x2b, 0xaa, 0xe8, 0xfb,
+	0xdb, 0x0c, 0x7e, 0x33, 0x65, 0x4d, 0xca, 0x33, 0xc2, 0x3a, 0xc2, 0xcf, 0x91, 0x51, 0x54, 0xf2,
+	0x73, 0x11, 0x9b, 0x1b, 0x0b, 0xdc, 0x84, 0xd5, 0x42, 0xfd, 0x41, 0xc4, 0xf8, 0x18, 0x75, 0x98,
+	0xf4, 0x05, 0x64, 0x40, 0x15, 0x84, 0x66, 0x77, 0xfe, 0x8c, 0x31, 0xe9, 0xd5, 0x6a, 0xa7, 0x7f,
+	0xe7, 0x5e, 0xa0, 0xa7, 0xe3, 0xa3, 0xd4, 0x51, 0xc6, 0x24, 0x09, 0x78, 0x62, 0xdd, 0xbb, 0xce,
+	0xbb, 0xd1, 0xd4, 0xb7, 0xb4, 0x3e, 0xdf, 0x7f, 0x6d, 0xbe, 0x9c, 0x7e, 0x6d, 0xa3, 0xbd, 0x80,
+	0x27, 0x64, 0xee, 0x3b, 0x78, 0xba, 0x39, 0xbd, 0x7b, 0xbf, 0x70, 0xda, 0x6f, 0x7d, 0x7a, 0x53,
+	0x93, 0x11, 0x8f, 0x69, 0x1a, 0x11, 0x2e, 0x22, 0x2b, 0x82, 0xb4, 0x3c, 0x87, 0x35, 0xb6, 0xf7,
+	0x87, 0xa7, 0xf9, 0x58, 0x47, 0xdf, 0xdb, 0x4b, 0xe7, 0xae, 0xfb, 0xa3, 0xbd, 0x53, 0x55, 0x22,
+	0x6e, 0x38, 0xf1, 0x8f, 0xc8, 0xc0, 0x26, 0x7a, 0x3c, 0x7f, 0x36, 0x9a, 0xa1, 0x1b, 0xca, 0xa1,
+	0xd6, 0x0c, 0x07, 0xf6, 0x50, 0x6b, 0xee, 0xda, 0x7b, 0x55, 0xc2, 0x71, 0xdc, 0x50, 0x3a, 0x8e,
+	0x56, 0x39, 0xce, 0xc0, 0x76, 0x1c, 0xad, 0x1b, 0xad, 0x94, 0x66, 0xed, 0x5f, 0x01, 0x00, 0x00,
+	0xff, 0xff, 0xfb, 0xd9, 0x33, 0x2c, 0x46, 0x06, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/group_placement_view.pb.go b/googleapis/ads/googleads/v3/resources/group_placement_view.pb.go
new file mode 100644
index 0000000..dde185f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/group_placement_view.pb.go
@@ -0,0 +1,148 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/group_placement_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A group placement view.
+type GroupPlacementView struct {
+	// The resource name of the group placement view.
+	// Group placement view resource names have the form:
+	//
+	// `customers/{customer_id}/groupPlacementViews/{ad_group_id}~{base64_placement}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The automatic placement string at group level, e. g. web domain, mobile
+	// app ID, or a YouTube channel ID.
+	Placement *wrappers.StringValue `protobuf:"bytes,2,opt,name=placement,proto3" json:"placement,omitempty"`
+	// Domain name for websites and YouTube channel name for YouTube channels.
+	DisplayName *wrappers.StringValue `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
+	// URL of the group placement, e.g. domain, link to the mobile application in
+	// app store, or a YouTube channel URL.
+	TargetUrl *wrappers.StringValue `protobuf:"bytes,4,opt,name=target_url,json=targetUrl,proto3" json:"target_url,omitempty"`
+	// Type of the placement, e.g. Website, YouTube Channel, Mobile Application.
+	PlacementType        enums.PlacementTypeEnum_PlacementType `protobuf:"varint,5,opt,name=placement_type,json=placementType,proto3,enum=google.ads.googleads.v3.enums.PlacementTypeEnum_PlacementType" json:"placement_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
+	XXX_unrecognized     []byte                                `json:"-"`
+	XXX_sizecache        int32                                 `json:"-"`
+}
+
+func (m *GroupPlacementView) Reset()         { *m = GroupPlacementView{} }
+func (m *GroupPlacementView) String() string { return proto.CompactTextString(m) }
+func (*GroupPlacementView) ProtoMessage()    {}
+func (*GroupPlacementView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ef2c4cce716c4dd, []int{0}
+}
+
+func (m *GroupPlacementView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GroupPlacementView.Unmarshal(m, b)
+}
+func (m *GroupPlacementView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GroupPlacementView.Marshal(b, m, deterministic)
+}
+func (m *GroupPlacementView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GroupPlacementView.Merge(m, src)
+}
+func (m *GroupPlacementView) XXX_Size() int {
+	return xxx_messageInfo_GroupPlacementView.Size(m)
+}
+func (m *GroupPlacementView) XXX_DiscardUnknown() {
+	xxx_messageInfo_GroupPlacementView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GroupPlacementView proto.InternalMessageInfo
+
+func (m *GroupPlacementView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *GroupPlacementView) GetPlacement() *wrappers.StringValue {
+	if m != nil {
+		return m.Placement
+	}
+	return nil
+}
+
+func (m *GroupPlacementView) GetDisplayName() *wrappers.StringValue {
+	if m != nil {
+		return m.DisplayName
+	}
+	return nil
+}
+
+func (m *GroupPlacementView) GetTargetUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.TargetUrl
+	}
+	return nil
+}
+
+func (m *GroupPlacementView) GetPlacementType() enums.PlacementTypeEnum_PlacementType {
+	if m != nil {
+		return m.PlacementType
+	}
+	return enums.PlacementTypeEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*GroupPlacementView)(nil), "google.ads.googleads.v3.resources.GroupPlacementView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/group_placement_view.proto", fileDescriptor_8ef2c4cce716c4dd)
+}
+
+var fileDescriptor_8ef2c4cce716c4dd = []byte{
+	// 461 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xdd, 0x6a, 0xdb, 0x30,
+	0x14, 0xc6, 0xce, 0x36, 0xa8, 0xfa, 0x73, 0xe1, 0x9b, 0x65, 0xa5, 0x8c, 0x74, 0xa3, 0x10, 0x18,
+	0x48, 0x10, 0xdf, 0xa9, 0x63, 0xc5, 0x85, 0x11, 0xd8, 0xc5, 0x08, 0xd9, 0xe6, 0x8b, 0x11, 0x08,
+	0xaa, 0x7d, 0x26, 0x0c, 0xb6, 0xa4, 0x49, 0x72, 0x42, 0x28, 0xbd, 0xdb, 0x93, 0xec, 0x72, 0x8f,
+	0x32, 0xd8, 0x8b, 0xf4, 0x29, 0x46, 0x2c, 0x5b, 0x69, 0x58, 0xbb, 0xe6, 0xee, 0x93, 0xce, 0xf7,
+	0x9d, 0xef, 0x9c, 0xa3, 0x23, 0xf4, 0x96, 0x4b, 0xc9, 0x4b, 0x20, 0x2c, 0x37, 0xc4, 0xc1, 0x35,
+	0x5a, 0xc4, 0x44, 0x83, 0x91, 0xb5, 0xce, 0xc0, 0x10, 0xae, 0x65, 0xad, 0xe6, 0xaa, 0x64, 0x19,
+	0x54, 0x20, 0xec, 0x7c, 0x51, 0xc0, 0x12, 0x2b, 0x2d, 0xad, 0x8c, 0x4e, 0x9d, 0x04, 0xb3, 0xdc,
+	0x60, 0xaf, 0xc6, 0x8b, 0x18, 0x7b, 0xf5, 0xf1, 0xe8, 0x21, 0x03, 0x10, 0x75, 0x65, 0xc8, 0x26,
+	0xad, 0x5d, 0x29, 0x70, 0x69, 0x8f, 0x5f, 0x74, 0x1a, 0x55, 0xf8, 0x3a, 0xda, 0xd0, 0xcb, 0x36,
+	0xd4, 0x9c, 0xae, 0xea, 0x6f, 0x64, 0xa9, 0x99, 0x52, 0xa0, 0x4d, 0x1b, 0x3f, 0xb9, 0x23, 0x65,
+	0x42, 0x48, 0xcb, 0x6c, 0x21, 0x45, 0x1b, 0x7d, 0xf5, 0xa7, 0x87, 0xa2, 0xf1, 0xba, 0x9d, 0x49,
+	0x67, 0x9b, 0x16, 0xb0, 0x8c, 0x5e, 0xa3, 0xc3, 0xce, 0x66, 0x2e, 0x58, 0x05, 0xfd, 0x60, 0x10,
+	0x0c, 0xf7, 0xa6, 0x07, 0xdd, 0xe5, 0x47, 0x56, 0x41, 0x44, 0xd1, 0x9e, 0x2f, 0xb6, 0x1f, 0x0e,
+	0x82, 0xe1, 0xfe, 0xe8, 0xa4, 0x6d, 0x1a, 0x77, 0xd5, 0xe0, 0x4f, 0x56, 0x17, 0x82, 0xa7, 0xac,
+	0xac, 0x61, 0xba, 0xa1, 0x47, 0x17, 0xe8, 0x20, 0x2f, 0x8c, 0x2a, 0xd9, 0xca, 0xe5, 0xef, 0xed,
+	0x20, 0xdf, 0x6f, 0x15, 0x8d, 0xf9, 0x39, 0x42, 0x96, 0x69, 0x0e, 0x76, 0x5e, 0xeb, 0xb2, 0xff,
+	0x64, 0x17, 0x77, 0xc7, 0xff, 0xa2, 0xcb, 0x08, 0xd0, 0xd1, 0xf6, 0x98, 0xfb, 0x4f, 0x07, 0xc1,
+	0xf0, 0x68, 0xf4, 0x0e, 0x3f, 0xf4, 0x7c, 0xcd, 0xdb, 0x60, 0x3f, 0xa4, 0xcf, 0x2b, 0x05, 0xef,
+	0x45, 0x5d, 0x6d, 0xdf, 0x4c, 0x0f, 0xd5, 0xdd, 0x23, 0xfd, 0x7e, 0x9b, 0x08, 0xf4, 0x66, 0x93,
+	0xa7, 0x45, 0xaa, 0x30, 0x38, 0x93, 0x15, 0xb9, 0x67, 0xee, 0x17, 0x59, 0x6d, 0xac, 0xac, 0x40,
+	0x1b, 0x72, 0xdd, 0xc1, 0x1b, 0xb7, 0x6f, 0x5b, 0x44, 0x43, 0xae, 0xef, 0x5b, 0xc2, 0x9b, 0xcb,
+	0x1f, 0x21, 0x3a, 0xcb, 0x64, 0x85, 0x1f, 0x5d, 0xc3, 0xcb, 0xe7, 0xff, 0xda, 0x4f, 0xd6, 0x63,
+	0x9b, 0x04, 0x5f, 0x3f, 0xb4, 0x6a, 0x2e, 0x4b, 0x26, 0x38, 0x96, 0x9a, 0x13, 0x0e, 0xa2, 0x19,
+	0x2a, 0xd9, 0xf4, 0xf0, 0x9f, 0x1f, 0x72, 0xee, 0xd1, 0xcf, 0xb0, 0x37, 0x4e, 0x92, 0x5f, 0xe1,
+	0xe9, 0xd8, 0xa5, 0x4c, 0x72, 0x83, 0x1d, 0x5c, 0xa3, 0x34, 0xc6, 0xd3, 0x8e, 0xf9, 0xbb, 0xe3,
+	0xcc, 0x92, 0xdc, 0xcc, 0x3c, 0x67, 0x96, 0xc6, 0x33, 0xcf, 0xb9, 0x0d, 0xcf, 0x5c, 0x80, 0xd2,
+	0x24, 0x37, 0x94, 0x7a, 0x16, 0xa5, 0x69, 0x4c, 0xa9, 0xe7, 0x5d, 0x3d, 0x6b, 0x8a, 0x8d, 0xff,
+	0x06, 0x00, 0x00, 0xff, 0xff, 0x76, 0x23, 0x4c, 0xa9, 0xcd, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/hotel_group_view.pb.go b/googleapis/ads/googleads/v3/resources/hotel_group_view.pb.go
new file mode 100644
index 0000000..48aeffb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/hotel_group_view.pb.go
@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/hotel_group_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A hotel group view.
+type HotelGroupView struct {
+	// The resource name of the hotel group view.
+	// Hotel Group view resource names have the form:
+	//
+	// `customers/{customer_id}/hotelGroupViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HotelGroupView) Reset()         { *m = HotelGroupView{} }
+func (m *HotelGroupView) String() string { return proto.CompactTextString(m) }
+func (*HotelGroupView) ProtoMessage()    {}
+func (*HotelGroupView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e471d0eff5bb8f4a, []int{0}
+}
+
+func (m *HotelGroupView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelGroupView.Unmarshal(m, b)
+}
+func (m *HotelGroupView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelGroupView.Marshal(b, m, deterministic)
+}
+func (m *HotelGroupView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelGroupView.Merge(m, src)
+}
+func (m *HotelGroupView) XXX_Size() int {
+	return xxx_messageInfo_HotelGroupView.Size(m)
+}
+func (m *HotelGroupView) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelGroupView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelGroupView proto.InternalMessageInfo
+
+func (m *HotelGroupView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*HotelGroupView)(nil), "google.ads.googleads.v3.resources.HotelGroupView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/hotel_group_view.proto", fileDescriptor_e471d0eff5bb8f4a)
+}
+
+var fileDescriptor_e471d0eff5bb8f4a = []byte{
+	// 322 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xb1, 0x4e, 0xf3, 0x30,
+	0x14, 0x85, 0x95, 0xfc, 0xd2, 0x2f, 0x11, 0x01, 0x43, 0x59, 0xa0, 0x62, 0xa0, 0xa0, 0x0a, 0x26,
+	0x7b, 0xc8, 0x00, 0x32, 0x93, 0xbb, 0x14, 0x31, 0xa0, 0xaa, 0x43, 0x06, 0x14, 0xa9, 0x72, 0x13,
+	0xcb, 0x44, 0x6a, 0x7c, 0x23, 0xdf, 0x34, 0x1d, 0xaa, 0x4a, 0x3c, 0x08, 0x13, 0x23, 0x8f, 0xc2,
+	0xa3, 0xf4, 0x29, 0x50, 0xea, 0xda, 0x85, 0x0e, 0xb0, 0x1d, 0xe5, 0x7e, 0xe7, 0xdc, 0x7b, 0xe2,
+	0xe8, 0x4e, 0x01, 0xa8, 0x99, 0xa4, 0x22, 0x47, 0x6a, 0x65, 0xab, 0x9a, 0x98, 0x1a, 0x89, 0x30,
+	0x37, 0x99, 0x44, 0xfa, 0x02, 0xb5, 0x9c, 0x4d, 0x94, 0x81, 0x79, 0x35, 0x69, 0x0a, 0xb9, 0x20,
+	0x95, 0x81, 0x1a, 0x3a, 0x3d, 0x8b, 0x13, 0x91, 0x23, 0xf1, 0x4e, 0xd2, 0xc4, 0xc4, 0x3b, 0xbb,
+	0x67, 0x2e, 0xbc, 0x2a, 0x7c, 0x9e, 0x75, 0x77, 0xcf, 0xbf, 0x8d, 0x84, 0xd6, 0x50, 0x8b, 0xba,
+	0x00, 0x8d, 0x76, 0x7a, 0xf9, 0x16, 0x44, 0xc7, 0x0f, 0xed, 0xda, 0x61, 0xbb, 0x35, 0x29, 0xe4,
+	0xa2, 0x73, 0x15, 0x1d, 0xb9, 0x88, 0x89, 0x16, 0xa5, 0x3c, 0x0d, 0x2e, 0x82, 0x9b, 0x83, 0xf1,
+	0xa1, 0xfb, 0xf8, 0x24, 0x4a, 0xc9, 0xe4, 0x9a, 0x4f, 0xa3, 0xeb, 0xdd, 0x35, 0x5b, 0x55, 0x15,
+	0x48, 0x32, 0x28, 0xe9, 0x5e, 0xe4, 0x6d, 0x36, 0xc7, 0x1a, 0x4a, 0x69, 0x90, 0x2e, 0x9d, 0x5c,
+	0xd9, 0xba, 0x1e, 0x42, 0xba, 0xdc, 0xef, 0xbf, 0x1a, 0xbc, 0x86, 0x51, 0x3f, 0x83, 0x92, 0xfc,
+	0xf9, 0x07, 0x06, 0x27, 0x3f, 0x57, 0x8e, 0xda, 0x76, 0xa3, 0xe0, 0xf9, 0x71, 0xeb, 0x54, 0x30,
+	0x13, 0x5a, 0x11, 0x30, 0x8a, 0x2a, 0xa9, 0x37, 0xdd, 0xe9, 0xee, 0xe6, 0x5f, 0x1e, 0xe5, 0xde,
+	0xab, 0xf7, 0xf0, 0xdf, 0x90, 0xf3, 0x8f, 0xb0, 0x37, 0xb4, 0x91, 0x3c, 0x47, 0x62, 0x65, 0xab,
+	0x92, 0x98, 0x8c, 0x1d, 0xf9, 0xe9, 0x98, 0x94, 0xe7, 0x98, 0x7a, 0x26, 0x4d, 0xe2, 0xd4, 0x33,
+	0xeb, 0xb0, 0x6f, 0x07, 0x8c, 0xf1, 0x1c, 0x19, 0xf3, 0x14, 0x63, 0x49, 0xcc, 0x98, 0xe7, 0xa6,
+	0xff, 0x37, 0xc7, 0xc6, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xae, 0xb3, 0x11, 0xa9, 0x40, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/hotel_performance_view.pb.go b/googleapis/ads/googleads/v3/resources/hotel_performance_view.pb.go
new file mode 100644
index 0000000..348e54f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/hotel_performance_view.pb.go
@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/hotel_performance_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A hotel performance view.
+type HotelPerformanceView struct {
+	// The resource name of the hotel performance view.
+	// Hotel performance view resource names have the form:
+	//
+	// `customers/{customer_id}/hotelPerformanceView`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HotelPerformanceView) Reset()         { *m = HotelPerformanceView{} }
+func (m *HotelPerformanceView) String() string { return proto.CompactTextString(m) }
+func (*HotelPerformanceView) ProtoMessage()    {}
+func (*HotelPerformanceView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_93062407e8bc6ee5, []int{0}
+}
+
+func (m *HotelPerformanceView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HotelPerformanceView.Unmarshal(m, b)
+}
+func (m *HotelPerformanceView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HotelPerformanceView.Marshal(b, m, deterministic)
+}
+func (m *HotelPerformanceView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HotelPerformanceView.Merge(m, src)
+}
+func (m *HotelPerformanceView) XXX_Size() int {
+	return xxx_messageInfo_HotelPerformanceView.Size(m)
+}
+func (m *HotelPerformanceView) XXX_DiscardUnknown() {
+	xxx_messageInfo_HotelPerformanceView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HotelPerformanceView proto.InternalMessageInfo
+
+func (m *HotelPerformanceView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*HotelPerformanceView)(nil), "google.ads.googleads.v3.resources.HotelPerformanceView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/hotel_performance_view.proto", fileDescriptor_93062407e8bc6ee5)
+}
+
+var fileDescriptor_93062407e8bc6ee5 = []byte{
+	// 323 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0xf3, 0x40,
+	0x14, 0x85, 0x49, 0x7e, 0xf8, 0xc1, 0xa0, 0x9b, 0xe2, 0xc2, 0x16, 0x17, 0x56, 0x29, 0xe8, 0xc2,
+	0x99, 0x45, 0x76, 0x23, 0x08, 0xe9, 0xa6, 0xe2, 0x42, 0x4a, 0x17, 0x59, 0x94, 0x48, 0x19, 0x93,
+	0xeb, 0x18, 0xe8, 0xcc, 0x0d, 0x33, 0x69, 0xbb, 0x10, 0xb7, 0x3e, 0x84, 0x4b, 0x97, 0x3e, 0x8a,
+	0x8f, 0xd2, 0xa7, 0x90, 0x74, 0x3a, 0x13, 0x91, 0xa2, 0xbb, 0x43, 0xee, 0x77, 0xce, 0xb9, 0x37,
+	0x13, 0x5d, 0x0b, 0x44, 0x31, 0x07, 0xca, 0x0b, 0x43, 0xad, 0x6c, 0xd4, 0x32, 0xa6, 0x1a, 0x0c,
+	0x2e, 0x74, 0x0e, 0x86, 0x3e, 0x61, 0x0d, 0xf3, 0x59, 0x05, 0xfa, 0x11, 0xb5, 0xe4, 0x2a, 0x87,
+	0xd9, 0xb2, 0x84, 0x15, 0xa9, 0x34, 0xd6, 0xd8, 0xe9, 0x5b, 0x13, 0xe1, 0x85, 0x21, 0xde, 0x4f,
+	0x96, 0x31, 0xf1, 0xfe, 0x5e, 0xd7, 0x55, 0x54, 0xa5, 0x4f, 0xb5, 0xee, 0xde, 0xf1, 0xb7, 0x11,
+	0x57, 0x0a, 0x6b, 0x5e, 0x97, 0xa8, 0x8c, 0x9d, 0x9e, 0xbe, 0x05, 0xd1, 0xe1, 0x4d, 0x53, 0x3e,
+	0x6e, 0xbb, 0xd3, 0x12, 0x56, 0x9d, 0xb3, 0xe8, 0xc0, 0x05, 0xcd, 0x14, 0x97, 0x70, 0x14, 0x9c,
+	0x04, 0xe7, 0x7b, 0x93, 0x7d, 0xf7, 0xf1, 0x8e, 0x4b, 0x60, 0xf7, 0xeb, 0x64, 0x1a, 0x5d, 0xb6,
+	0x3b, 0x6d, 0x55, 0x55, 0x1a, 0x92, 0xa3, 0xa4, 0x3b, 0x83, 0x2f, 0xf2, 0x85, 0xa9, 0x51, 0x82,
+	0x36, 0xf4, 0xd9, 0xc9, 0x17, 0xfb, 0x03, 0x7e, 0xa0, 0xc3, 0xd7, 0x30, 0x1a, 0xe4, 0x28, 0xc9,
+	0x9f, 0xf7, 0x0f, 0xbb, 0xbb, 0xaa, 0xc6, 0xcd, 0x85, 0xe3, 0x60, 0x7a, 0xbb, 0xf5, 0x0b, 0x9c,
+	0x73, 0x25, 0x08, 0x6a, 0x41, 0x05, 0xa8, 0xcd, 0xfd, 0xb4, 0xdd, 0xf8, 0x97, 0xe7, 0xb9, 0xf2,
+	0xea, 0x3d, 0xfc, 0x37, 0x4a, 0x92, 0x8f, 0xb0, 0x3f, 0xb2, 0x91, 0x49, 0x61, 0x88, 0x95, 0x8d,
+	0x4a, 0x63, 0x32, 0x71, 0xe4, 0xa7, 0x63, 0xb2, 0xa4, 0x30, 0x99, 0x67, 0xb2, 0x34, 0xce, 0x3c,
+	0xb3, 0x0e, 0x07, 0x76, 0xc0, 0x58, 0x52, 0x18, 0xc6, 0x3c, 0xc5, 0x58, 0x1a, 0x33, 0xe6, 0xb9,
+	0x87, 0xff, 0x9b, 0x65, 0xe3, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8d, 0xd9, 0x7c, 0xd3, 0x4a,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/invoice.pb.go b/googleapis/ads/googleads/v3/resources/invoice.pb.go
new file mode 100644
index 0000000..1a508f9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/invoice.pb.go
@@ -0,0 +1,456 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/invoice.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An invoice. All invoice information is snapshotted to match the PDF invoice.
+// For invoices older than the launch of InvoiceService, the snapshotted
+// information may not match the PDF invoice.
+type Invoice struct {
+	// The resource name of the invoice. Multiple customers can share a given
+	// invoice, so multiple resource names may point to the same invoice.
+	// Invoice resource names have the form:
+	//
+	// `customers/{customer_id}/invoices/{invoice_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the invoice. It appears on the invoice PDF as "Invoice number".
+	Id *wrappers.StringValue `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The type of invoice.
+	Type enums.InvoiceTypeEnum_InvoiceType `protobuf:"varint,3,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.InvoiceTypeEnum_InvoiceType" json:"type,omitempty"`
+	// The resource name of this invoice’s billing setup.
+	//
+	// `customers/{customer_id}/billingSetups/{billing_setup_id}`
+	BillingSetup *wrappers.StringValue `protobuf:"bytes,4,opt,name=billing_setup,json=billingSetup,proto3" json:"billing_setup,omitempty"`
+	// A 16 digit ID used to identify the payments account associated with the
+	// billing setup, e.g. "1234-5678-9012-3456". It appears on the invoice PDF as
+	// "Billing Account Number".
+	PaymentsAccountId *wrappers.StringValue `protobuf:"bytes,5,opt,name=payments_account_id,json=paymentsAccountId,proto3" json:"payments_account_id,omitempty"`
+	// A 12 digit ID used to identify the payments profile associated with the
+	// billing setup, e.g. "1234-5678-9012". It appears on the invoice PDF as
+	// "Billing ID".
+	PaymentsProfileId *wrappers.StringValue `protobuf:"bytes,6,opt,name=payments_profile_id,json=paymentsProfileId,proto3" json:"payments_profile_id,omitempty"`
+	// The issue date in yyyy-mm-dd format. It appears on the invoice PDF as
+	// either "Issue date" or "Invoice date".
+	IssueDate *wrappers.StringValue `protobuf:"bytes,7,opt,name=issue_date,json=issueDate,proto3" json:"issue_date,omitempty"`
+	// The due date in yyyy-mm-dd format.
+	DueDate *wrappers.StringValue `protobuf:"bytes,8,opt,name=due_date,json=dueDate,proto3" json:"due_date,omitempty"`
+	// The service period date range of this invoice. The end date is inclusive.
+	ServiceDateRange *common.DateRange `protobuf:"bytes,9,opt,name=service_date_range,json=serviceDateRange,proto3" json:"service_date_range,omitempty"`
+	// The currency code. All costs are returned in this currency. A subset of the
+	// currency codes derived from the ISO 4217 standard is supported.
+	CurrencyCode *wrappers.StringValue `protobuf:"bytes,10,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	// The total amount of invoice level adjustments. These adjustments are made
+	// on the invoice, not on a specific account budget.
+	InvoiceLevelAdjustmentsMicros *wrappers.Int64Value `protobuf:"bytes,11,opt,name=invoice_level_adjustments_micros,json=invoiceLevelAdjustmentsMicros,proto3" json:"invoice_level_adjustments_micros,omitempty"`
+	// The pretax subtotal amount, in micros. This equals the sum of the
+	// AccountBudgetSummary subtotal amounts, plus the invoice level adjustments.
+	SubtotalAmountMicros *wrappers.Int64Value `protobuf:"bytes,12,opt,name=subtotal_amount_micros,json=subtotalAmountMicros,proto3" json:"subtotal_amount_micros,omitempty"`
+	// The sum of all taxes on the invoice, in micros. This equals the sum of the
+	// AccountBudgetSummary tax amounts, plus taxes not associated with a specific
+	// account budget.
+	TaxAmountMicros *wrappers.Int64Value `protobuf:"bytes,13,opt,name=tax_amount_micros,json=taxAmountMicros,proto3" json:"tax_amount_micros,omitempty"`
+	// The total amount, in micros. This equals the sum of the invoice subtotal
+	// amount and the invoice tax amount.
+	TotalAmountMicros *wrappers.Int64Value `protobuf:"bytes,14,opt,name=total_amount_micros,json=totalAmountMicros,proto3" json:"total_amount_micros,omitempty"`
+	// The resource name of the original invoice corrected, wrote off, or canceled
+	// by this invoice, if applicable. If `corrected_invoice` is set,
+	// `replaced_invoices` will not be set.
+	//
+	// Invoice resource names have the form:
+	//
+	// `customers/{customer_id}/invoices/{invoice_id}`
+	CorrectedInvoice *wrappers.StringValue `protobuf:"bytes,15,opt,name=corrected_invoice,json=correctedInvoice,proto3" json:"corrected_invoice,omitempty"`
+	// The resource name of the original invoice(s) being rebilled or replaced by
+	// this invoice, if applicable. There might be multiple replaced invoices due
+	// to invoice consolidation. The replaced invoices may not belong to the same
+	// payments account. If `replaced_invoices` is set, `corrected_invoice` will
+	// not be set.
+	// Invoice resource names have the form:
+	//
+	// `customers/{customer_id}/invoices/{invoice_id}`
+	ReplacedInvoices []*wrappers.StringValue `protobuf:"bytes,16,rep,name=replaced_invoices,json=replacedInvoices,proto3" json:"replaced_invoices,omitempty"`
+	// The URL to a PDF copy of the invoice. Users need to pass in their OAuth
+	// token to request the PDF with this URL.
+	PdfUrl *wrappers.StringValue `protobuf:"bytes,17,opt,name=pdf_url,json=pdfUrl,proto3" json:"pdf_url,omitempty"`
+	// The list of summarized account budget information associated with this
+	// invoice.
+	AccountBudgetSummaries []*Invoice_AccountBudgetSummary `protobuf:"bytes,18,rep,name=account_budget_summaries,json=accountBudgetSummaries,proto3" json:"account_budget_summaries,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{}                        `json:"-"`
+	XXX_unrecognized       []byte                          `json:"-"`
+	XXX_sizecache          int32                           `json:"-"`
+}
+
+func (m *Invoice) Reset()         { *m = Invoice{} }
+func (m *Invoice) String() string { return proto.CompactTextString(m) }
+func (*Invoice) ProtoMessage()    {}
+func (*Invoice) Descriptor() ([]byte, []int) {
+	return fileDescriptor_52f5271ace0f4785, []int{0}
+}
+
+func (m *Invoice) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Invoice.Unmarshal(m, b)
+}
+func (m *Invoice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Invoice.Marshal(b, m, deterministic)
+}
+func (m *Invoice) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Invoice.Merge(m, src)
+}
+func (m *Invoice) XXX_Size() int {
+	return xxx_messageInfo_Invoice.Size(m)
+}
+func (m *Invoice) XXX_DiscardUnknown() {
+	xxx_messageInfo_Invoice.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Invoice proto.InternalMessageInfo
+
+func (m *Invoice) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *Invoice) GetId() *wrappers.StringValue {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Invoice) GetType() enums.InvoiceTypeEnum_InvoiceType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.InvoiceTypeEnum_UNSPECIFIED
+}
+
+func (m *Invoice) GetBillingSetup() *wrappers.StringValue {
+	if m != nil {
+		return m.BillingSetup
+	}
+	return nil
+}
+
+func (m *Invoice) GetPaymentsAccountId() *wrappers.StringValue {
+	if m != nil {
+		return m.PaymentsAccountId
+	}
+	return nil
+}
+
+func (m *Invoice) GetPaymentsProfileId() *wrappers.StringValue {
+	if m != nil {
+		return m.PaymentsProfileId
+	}
+	return nil
+}
+
+func (m *Invoice) GetIssueDate() *wrappers.StringValue {
+	if m != nil {
+		return m.IssueDate
+	}
+	return nil
+}
+
+func (m *Invoice) GetDueDate() *wrappers.StringValue {
+	if m != nil {
+		return m.DueDate
+	}
+	return nil
+}
+
+func (m *Invoice) GetServiceDateRange() *common.DateRange {
+	if m != nil {
+		return m.ServiceDateRange
+	}
+	return nil
+}
+
+func (m *Invoice) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+func (m *Invoice) GetInvoiceLevelAdjustmentsMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.InvoiceLevelAdjustmentsMicros
+	}
+	return nil
+}
+
+func (m *Invoice) GetSubtotalAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.SubtotalAmountMicros
+	}
+	return nil
+}
+
+func (m *Invoice) GetTaxAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TaxAmountMicros
+	}
+	return nil
+}
+
+func (m *Invoice) GetTotalAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TotalAmountMicros
+	}
+	return nil
+}
+
+func (m *Invoice) GetCorrectedInvoice() *wrappers.StringValue {
+	if m != nil {
+		return m.CorrectedInvoice
+	}
+	return nil
+}
+
+func (m *Invoice) GetReplacedInvoices() []*wrappers.StringValue {
+	if m != nil {
+		return m.ReplacedInvoices
+	}
+	return nil
+}
+
+func (m *Invoice) GetPdfUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.PdfUrl
+	}
+	return nil
+}
+
+func (m *Invoice) GetAccountBudgetSummaries() []*Invoice_AccountBudgetSummary {
+	if m != nil {
+		return m.AccountBudgetSummaries
+	}
+	return nil
+}
+
+// Represents a summarized account budget billable cost.
+type Invoice_AccountBudgetSummary struct {
+	// The resource name of the customer associated with this account budget.
+	// This contains the customer ID, which appears on the invoice PDF as
+	// "Account ID".
+	// Customer resource names have the form:
+	//
+	// `customers/{customer_id}`
+	Customer *wrappers.StringValue `protobuf:"bytes,1,opt,name=customer,proto3" json:"customer,omitempty"`
+	// The descriptive name of the account budget’s customer. It appears on the
+	// invoice PDF as "Account".
+	CustomerDescriptiveName *wrappers.StringValue `protobuf:"bytes,2,opt,name=customer_descriptive_name,json=customerDescriptiveName,proto3" json:"customer_descriptive_name,omitempty"`
+	// The resource name of the account budget associated with this summarized
+	// billable cost.
+	// AccountBudget resource names have the form:
+	//
+	// `customers/{customer_id}/accountBudgets/{account_budget_id}`
+	AccountBudget *wrappers.StringValue `protobuf:"bytes,3,opt,name=account_budget,json=accountBudget,proto3" json:"account_budget,omitempty"`
+	// The name of the account budget. It appears on the invoice PDF as "Account
+	// budget".
+	AccountBudgetName *wrappers.StringValue `protobuf:"bytes,4,opt,name=account_budget_name,json=accountBudgetName,proto3" json:"account_budget_name,omitempty"`
+	// The purchase order number of the account budget. It appears on the
+	// invoice PDF as "Purchase order".
+	PurchaseOrderNumber *wrappers.StringValue `protobuf:"bytes,5,opt,name=purchase_order_number,json=purchaseOrderNumber,proto3" json:"purchase_order_number,omitempty"`
+	// The pretax subtotal amount attributable to this budget during the service
+	// period, in micros.
+	SubtotalAmountMicros *wrappers.Int64Value `protobuf:"bytes,6,opt,name=subtotal_amount_micros,json=subtotalAmountMicros,proto3" json:"subtotal_amount_micros,omitempty"`
+	// The tax amount attributable to this budget during the service period, in
+	// micros.
+	TaxAmountMicros *wrappers.Int64Value `protobuf:"bytes,7,opt,name=tax_amount_micros,json=taxAmountMicros,proto3" json:"tax_amount_micros,omitempty"`
+	// The total amount attributable to this budget during the service period,
+	// in micros. This equals the sum of the account budget subtotal amount and
+	// the account budget tax amount.
+	TotalAmountMicros *wrappers.Int64Value `protobuf:"bytes,8,opt,name=total_amount_micros,json=totalAmountMicros,proto3" json:"total_amount_micros,omitempty"`
+	// The billable activity date range of the account budget, within the
+	// service date range of this invoice. The end date is inclusive. This can
+	// be different from the account budget's start and end time.
+	BillableActivityDateRange *common.DateRange `protobuf:"bytes,9,opt,name=billable_activity_date_range,json=billableActivityDateRange,proto3" json:"billable_activity_date_range,omitempty"`
+	XXX_NoUnkeyedLiteral      struct{}          `json:"-"`
+	XXX_unrecognized          []byte            `json:"-"`
+	XXX_sizecache             int32             `json:"-"`
+}
+
+func (m *Invoice_AccountBudgetSummary) Reset()         { *m = Invoice_AccountBudgetSummary{} }
+func (m *Invoice_AccountBudgetSummary) String() string { return proto.CompactTextString(m) }
+func (*Invoice_AccountBudgetSummary) ProtoMessage()    {}
+func (*Invoice_AccountBudgetSummary) Descriptor() ([]byte, []int) {
+	return fileDescriptor_52f5271ace0f4785, []int{0, 0}
+}
+
+func (m *Invoice_AccountBudgetSummary) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Invoice_AccountBudgetSummary.Unmarshal(m, b)
+}
+func (m *Invoice_AccountBudgetSummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Invoice_AccountBudgetSummary.Marshal(b, m, deterministic)
+}
+func (m *Invoice_AccountBudgetSummary) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Invoice_AccountBudgetSummary.Merge(m, src)
+}
+func (m *Invoice_AccountBudgetSummary) XXX_Size() int {
+	return xxx_messageInfo_Invoice_AccountBudgetSummary.Size(m)
+}
+func (m *Invoice_AccountBudgetSummary) XXX_DiscardUnknown() {
+	xxx_messageInfo_Invoice_AccountBudgetSummary.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Invoice_AccountBudgetSummary proto.InternalMessageInfo
+
+func (m *Invoice_AccountBudgetSummary) GetCustomer() *wrappers.StringValue {
+	if m != nil {
+		return m.Customer
+	}
+	return nil
+}
+
+func (m *Invoice_AccountBudgetSummary) GetCustomerDescriptiveName() *wrappers.StringValue {
+	if m != nil {
+		return m.CustomerDescriptiveName
+	}
+	return nil
+}
+
+func (m *Invoice_AccountBudgetSummary) GetAccountBudget() *wrappers.StringValue {
+	if m != nil {
+		return m.AccountBudget
+	}
+	return nil
+}
+
+func (m *Invoice_AccountBudgetSummary) GetAccountBudgetName() *wrappers.StringValue {
+	if m != nil {
+		return m.AccountBudgetName
+	}
+	return nil
+}
+
+func (m *Invoice_AccountBudgetSummary) GetPurchaseOrderNumber() *wrappers.StringValue {
+	if m != nil {
+		return m.PurchaseOrderNumber
+	}
+	return nil
+}
+
+func (m *Invoice_AccountBudgetSummary) GetSubtotalAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.SubtotalAmountMicros
+	}
+	return nil
+}
+
+func (m *Invoice_AccountBudgetSummary) GetTaxAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TaxAmountMicros
+	}
+	return nil
+}
+
+func (m *Invoice_AccountBudgetSummary) GetTotalAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TotalAmountMicros
+	}
+	return nil
+}
+
+func (m *Invoice_AccountBudgetSummary) GetBillableActivityDateRange() *common.DateRange {
+	if m != nil {
+		return m.BillableActivityDateRange
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Invoice)(nil), "google.ads.googleads.v3.resources.Invoice")
+	proto.RegisterType((*Invoice_AccountBudgetSummary)(nil), "google.ads.googleads.v3.resources.Invoice.AccountBudgetSummary")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/invoice.proto", fileDescriptor_52f5271ace0f4785)
+}
+
+var fileDescriptor_52f5271ace0f4785 = []byte{
+	// 916 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xdd, 0x6e, 0xdc, 0x44,
+	0x14, 0xc7, 0xb5, 0x9b, 0x36, 0x1f, 0xd3, 0x24, 0xcd, 0x3a, 0xa5, 0x38, 0x21, 0xa0, 0x2d, 0xa8,
+	0x22, 0x20, 0x64, 0xa3, 0x2e, 0x5f, 0x72, 0x2f, 0x90, 0xd3, 0xa2, 0x68, 0x69, 0x09, 0x61, 0x03,
+	0x01, 0xa1, 0x48, 0xd6, 0xac, 0xe7, 0xc4, 0x4c, 0x65, 0xcf, 0x58, 0x33, 0xe3, 0xa5, 0xab, 0xaa,
+	0x2f, 0xc3, 0x25, 0x8f, 0xc2, 0x73, 0x70, 0x55, 0x9e, 0x80, 0x3b, 0x34, 0xe3, 0x19, 0x6f, 0xb7,
+	0x69, 0xba, 0x06, 0x7a, 0x77, 0xd6, 0x73, 0xfe, 0x3f, 0x9f, 0x39, 0x33, 0xe7, 0xbf, 0x46, 0x61,
+	0xc6, 0x79, 0x96, 0x43, 0x88, 0x89, 0xb4, 0xa1, 0x8e, 0x26, 0x83, 0x50, 0x80, 0xe4, 0x95, 0x48,
+	0x41, 0x86, 0x94, 0x4d, 0x38, 0x4d, 0x21, 0x28, 0x05, 0x57, 0xdc, 0xbb, 0x55, 0x67, 0x05, 0x98,
+	0xc8, 0xa0, 0x11, 0x04, 0x93, 0x41, 0xd0, 0x08, 0x76, 0x3f, 0xbc, 0x8c, 0x99, 0xf2, 0xa2, 0xe0,
+	0x2c, 0x24, 0x58, 0x81, 0xac, 0x71, 0xbb, 0x1f, 0x5f, 0x96, 0x0b, 0xac, 0x2a, 0x9a, 0x77, 0x27,
+	0x6a, 0x5a, 0xda, 0x02, 0x76, 0x77, 0x9c, 0xa2, 0xa4, 0x4d, 0x91, 0x76, 0xe9, 0x1d, 0xbb, 0x64,
+	0x7e, 0x8d, 0xab, 0xf3, 0xf0, 0x57, 0x81, 0xcb, 0x12, 0x84, 0x7b, 0xd9, 0xde, 0x73, 0x52, 0xcc,
+	0x18, 0x57, 0x58, 0x51, 0xce, 0xec, 0xea, 0xbb, 0x7f, 0x6d, 0xa1, 0x95, 0x61, 0xfd, 0x3e, 0xef,
+	0x3d, 0xb4, 0xe1, 0xd8, 0x09, 0xc3, 0x05, 0xf8, 0x9d, 0x7e, 0x67, 0x7f, 0x6d, 0xb4, 0xee, 0x1e,
+	0x1e, 0xe1, 0x02, 0xbc, 0x8f, 0x50, 0x97, 0x12, 0xbf, 0xdb, 0xef, 0xec, 0x5f, 0xbb, 0xb3, 0x67,
+	0x9b, 0x11, 0xb8, 0x77, 0x07, 0x27, 0x4a, 0x50, 0x96, 0x9d, 0xe2, 0xbc, 0x82, 0x51, 0x97, 0x12,
+	0xef, 0x08, 0x5d, 0xd1, 0xbb, 0xf0, 0x97, 0xfa, 0x9d, 0xfd, 0xcd, 0x3b, 0x51, 0x70, 0x59, 0x1f,
+	0xcd, 0xc6, 0x03, 0x5b, 0xc8, 0xf7, 0xd3, 0x12, 0xbe, 0x62, 0x55, 0xf1, 0xfc, 0xef, 0x91, 0xe1,
+	0x78, 0x31, 0xda, 0x18, 0xd3, 0x3c, 0xa7, 0x2c, 0x4b, 0x24, 0xa8, 0xaa, 0xf4, 0xaf, 0xb4, 0x28,
+	0x64, 0xdd, 0x4a, 0x4e, 0xb4, 0xc2, 0x7b, 0x88, 0xb6, 0x4b, 0x3c, 0x2d, 0x80, 0x29, 0x99, 0xe0,
+	0x34, 0xe5, 0x15, 0x53, 0x09, 0x25, 0xfe, 0xd5, 0x16, 0xa0, 0x9e, 0x13, 0xc6, 0xb5, 0x6e, 0x48,
+	0xe6, 0x68, 0xa5, 0xe0, 0xe7, 0x34, 0x07, 0x4d, 0x5b, 0xfe, 0x37, 0xb4, 0xe3, 0x5a, 0x37, 0x24,
+	0xde, 0x5d, 0x84, 0xa8, 0x94, 0x15, 0x24, 0xfa, 0xb6, 0xf8, 0x2b, 0x2d, 0x20, 0x6b, 0x26, 0xff,
+	0x3e, 0x56, 0xe0, 0x7d, 0x8e, 0x56, 0x89, 0x93, 0xae, 0xb6, 0x90, 0xae, 0x10, 0x2b, 0xfc, 0x11,
+	0x79, 0x12, 0xc4, 0x44, 0x5f, 0x39, 0x2d, 0x4e, 0x04, 0x66, 0x19, 0xf8, 0x6b, 0x06, 0xf1, 0xc1,
+	0xa5, 0x47, 0x56, 0xdf, 0xeb, 0x40, 0x13, 0x46, 0x5a, 0x30, 0xda, 0xb2, 0x90, 0xe6, 0x89, 0x3e,
+	0xad, 0xb4, 0x12, 0x02, 0x58, 0x3a, 0x4d, 0x52, 0x4e, 0xc0, 0x47, 0x6d, 0x4e, 0xcb, 0x49, 0xee,
+	0x71, 0x02, 0x1e, 0x41, 0x7d, 0x37, 0x0e, 0x39, 0x4c, 0x20, 0x4f, 0x30, 0x79, 0x54, 0x49, 0x55,
+	0x37, 0xbc, 0xa0, 0xa9, 0xe0, 0xd2, 0xbf, 0x66, 0xa8, 0x6f, 0x5d, 0xa0, 0x0e, 0x99, 0xfa, 0xec,
+	0x93, 0x1a, 0xfa, 0xb6, 0x85, 0x3c, 0xd4, 0x8c, 0x78, 0x86, 0xf8, 0xc6, 0x10, 0xbc, 0xef, 0xd0,
+	0x4d, 0x59, 0x8d, 0x15, 0x57, 0x38, 0x4f, 0x70, 0x61, 0xae, 0x84, 0x65, 0xaf, 0x2f, 0x66, 0xdf,
+	0x70, 0xd2, 0xd8, 0x28, 0x2d, 0xf2, 0x10, 0xf5, 0x14, 0x7e, 0xfc, 0x02, 0x6d, 0x63, 0x31, 0xed,
+	0xba, 0xc2, 0x8f, 0xe7, 0x40, 0x0f, 0xd0, 0xf6, 0xcb, 0x0a, 0xdb, 0x5c, 0x8c, 0xea, 0x5d, 0xac,
+	0x6a, 0x88, 0x7a, 0x29, 0x17, 0x02, 0x52, 0x05, 0x24, 0xb1, 0x3d, 0xf1, 0xaf, 0xb7, 0x38, 0x95,
+	0xad, 0x46, 0xe6, 0xdc, 0x62, 0x88, 0x7a, 0x02, 0xca, 0x1c, 0xa7, 0x33, 0x92, 0xf4, 0xb7, 0xfa,
+	0x4b, 0x8b, 0x51, 0x4e, 0x66, 0x49, 0xd2, 0xfb, 0x14, 0xad, 0x94, 0xe4, 0x3c, 0xa9, 0x44, 0xee,
+	0xf7, 0x5a, 0xd4, 0xb2, 0x5c, 0x92, 0xf3, 0x1f, 0x44, 0xee, 0x4d, 0x91, 0xef, 0x06, 0x78, 0x5c,
+	0x91, 0x0c, 0x54, 0x22, 0xab, 0xa2, 0xc0, 0x82, 0x82, 0xf4, 0x3d, 0x53, 0xc8, 0x97, 0xc1, 0x42,
+	0xe3, 0x76, 0x26, 0x13, 0xd8, 0x99, 0x3e, 0x30, 0xa4, 0x13, 0x03, 0x9a, 0x8e, 0x6e, 0xe2, 0x8b,
+	0x4f, 0x29, 0xc8, 0xdd, 0x3f, 0xaf, 0xa2, 0x1b, 0x2f, 0x13, 0x78, 0x5f, 0xa0, 0xd5, 0xb4, 0x92,
+	0x8a, 0x17, 0x20, 0x8c, 0x7d, 0x2e, 0xda, 0x4b, 0x93, 0xed, 0xfd, 0x84, 0x76, 0x5c, 0x9c, 0x10,
+	0x90, 0xa9, 0xa0, 0xa5, 0xa2, 0x13, 0xeb, 0xc4, 0x6d, 0xfc, 0xf6, 0x4d, 0x27, 0xbf, 0x3f, 0x53,
+	0x1b, 0xcb, 0xbe, 0x87, 0x36, 0xe7, 0xfb, 0x64, 0xec, 0x78, 0x11, 0x6e, 0x63, 0x6e, 0xeb, 0xda,
+	0xe8, 0x5e, 0x68, 0xb6, 0x29, 0xac, 0x8d, 0xff, 0xf6, 0xe6, 0x48, 0xa6, 0xa4, 0x63, 0xf4, 0x46,
+	0x59, 0x89, 0xf4, 0x17, 0x2c, 0x21, 0xe1, 0x82, 0x80, 0x48, 0x58, 0x55, 0x8c, 0x41, 0xb4, 0xb2,
+	0xe1, 0x6d, 0x27, 0xfd, 0x56, 0x2b, 0x8f, 0x8c, 0xf0, 0x15, 0x23, 0xbc, 0xfc, 0x5a, 0x47, 0x78,
+	0xe5, 0xf5, 0x8d, 0xf0, 0xea, 0x7f, 0x1a, 0xe1, 0x47, 0x68, 0x4f, 0xff, 0x9f, 0xe1, 0x71, 0x0e,
+	0x09, 0x4e, 0x15, 0x9d, 0x50, 0x35, 0xfd, 0x5f, 0xbe, 0xbd, 0xe3, 0x70, 0xb1, 0xa5, 0x35, 0x4b,
+	0xd1, 0xd1, 0xb3, 0xf8, 0x01, 0xea, 0xcf, 0xe4, 0x36, 0x2a, 0xa9, 0xd4, 0x98, 0xd0, 0x59, 0xc1,
+	0xfb, 0xee, 0xe6, 0xc9, 0xf0, 0x89, 0x0b, 0x9f, 0xba, 0xcf, 0x18, 0x19, 0x3e, 0xb1, 0xd1, 0xd3,
+	0x83, 0xbf, 0x3b, 0xe8, 0x76, 0xca, 0x8b, 0xc5, 0x53, 0x79, 0xb0, 0x6e, 0xd9, 0xc7, 0xba, 0x29,
+	0xc7, 0x9d, 0x9f, 0xbf, 0xb6, 0x92, 0x8c, 0xe7, 0x98, 0x65, 0x01, 0x17, 0x59, 0x98, 0x01, 0x33,
+	0x2d, 0x0b, 0x67, 0x55, 0xbd, 0xe2, 0x8b, 0xee, 0x6e, 0x13, 0xfd, 0xd6, 0x5d, 0x3a, 0x8c, 0xe3,
+	0xdf, 0xbb, 0xb7, 0x0e, 0x6b, 0x64, 0x4c, 0x64, 0x50, 0x87, 0x3a, 0x3a, 0x1d, 0x04, 0x23, 0x97,
+	0xf9, 0x87, 0xcb, 0x39, 0x8b, 0x89, 0x3c, 0x6b, 0x72, 0xce, 0x4e, 0x07, 0x67, 0x4d, 0xce, 0xb3,
+	0xee, 0xed, 0x7a, 0x21, 0x8a, 0x62, 0x22, 0xa3, 0xa8, 0xc9, 0x8a, 0xa2, 0xd3, 0x41, 0x14, 0x35,
+	0x79, 0xe3, 0x65, 0x53, 0xec, 0xe0, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x08, 0x62, 0x31, 0x73,
+	0x7d, 0x0a, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/keyword_plan.pb.go b/googleapis/ads/googleads/v3/resources/keyword_plan.pb.go
new file mode 100644
index 0000000..6157874
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/keyword_plan.pb.go
@@ -0,0 +1,232 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/keyword_plan.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A Keyword Planner plan.
+// Max number of saved keyword plans: 10000.
+// It's possible to remove plans if limit is reached.
+type KeywordPlan struct {
+	// The resource name of the Keyword Planner plan.
+	// KeywordPlan resource names have the form:
+	//
+	// `customers/{customer_id}/keywordPlans/{kp_plan_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the keyword plan.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the keyword plan.
+	//
+	// This field is required and should not be empty when creating new keyword
+	// plans.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The date period used for forecasting the plan.
+	ForecastPeriod       *KeywordPlanForecastPeriod `protobuf:"bytes,4,opt,name=forecast_period,json=forecastPeriod,proto3" json:"forecast_period,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *KeywordPlan) Reset()         { *m = KeywordPlan{} }
+func (m *KeywordPlan) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlan) ProtoMessage()    {}
+func (*KeywordPlan) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b7a261a590e572b8, []int{0}
+}
+
+func (m *KeywordPlan) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlan.Unmarshal(m, b)
+}
+func (m *KeywordPlan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlan.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlan) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlan.Merge(m, src)
+}
+func (m *KeywordPlan) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlan.Size(m)
+}
+func (m *KeywordPlan) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlan.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlan proto.InternalMessageInfo
+
+func (m *KeywordPlan) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *KeywordPlan) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *KeywordPlan) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *KeywordPlan) GetForecastPeriod() *KeywordPlanForecastPeriod {
+	if m != nil {
+		return m.ForecastPeriod
+	}
+	return nil
+}
+
+// The forecasting period associated with the keyword plan.
+type KeywordPlanForecastPeriod struct {
+	// Required. The date used for forecasting the Plan.
+	//
+	// Types that are valid to be assigned to Interval:
+	//	*KeywordPlanForecastPeriod_DateInterval
+	//	*KeywordPlanForecastPeriod_DateRange
+	Interval             isKeywordPlanForecastPeriod_Interval `protobuf_oneof:"interval"`
+	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
+	XXX_unrecognized     []byte                               `json:"-"`
+	XXX_sizecache        int32                                `json:"-"`
+}
+
+func (m *KeywordPlanForecastPeriod) Reset()         { *m = KeywordPlanForecastPeriod{} }
+func (m *KeywordPlanForecastPeriod) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanForecastPeriod) ProtoMessage()    {}
+func (*KeywordPlanForecastPeriod) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b7a261a590e572b8, []int{1}
+}
+
+func (m *KeywordPlanForecastPeriod) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanForecastPeriod.Unmarshal(m, b)
+}
+func (m *KeywordPlanForecastPeriod) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanForecastPeriod.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanForecastPeriod) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanForecastPeriod.Merge(m, src)
+}
+func (m *KeywordPlanForecastPeriod) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanForecastPeriod.Size(m)
+}
+func (m *KeywordPlanForecastPeriod) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanForecastPeriod.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanForecastPeriod proto.InternalMessageInfo
+
+type isKeywordPlanForecastPeriod_Interval interface {
+	isKeywordPlanForecastPeriod_Interval()
+}
+
+type KeywordPlanForecastPeriod_DateInterval struct {
+	DateInterval enums.KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval `protobuf:"varint,1,opt,name=date_interval,json=dateInterval,proto3,enum=google.ads.googleads.v3.enums.KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval,oneof"`
+}
+
+type KeywordPlanForecastPeriod_DateRange struct {
+	DateRange *common.DateRange `protobuf:"bytes,2,opt,name=date_range,json=dateRange,proto3,oneof"`
+}
+
+func (*KeywordPlanForecastPeriod_DateInterval) isKeywordPlanForecastPeriod_Interval() {}
+
+func (*KeywordPlanForecastPeriod_DateRange) isKeywordPlanForecastPeriod_Interval() {}
+
+func (m *KeywordPlanForecastPeriod) GetInterval() isKeywordPlanForecastPeriod_Interval {
+	if m != nil {
+		return m.Interval
+	}
+	return nil
+}
+
+func (m *KeywordPlanForecastPeriod) GetDateInterval() enums.KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval {
+	if x, ok := m.GetInterval().(*KeywordPlanForecastPeriod_DateInterval); ok {
+		return x.DateInterval
+	}
+	return enums.KeywordPlanForecastIntervalEnum_UNSPECIFIED
+}
+
+func (m *KeywordPlanForecastPeriod) GetDateRange() *common.DateRange {
+	if x, ok := m.GetInterval().(*KeywordPlanForecastPeriod_DateRange); ok {
+		return x.DateRange
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*KeywordPlanForecastPeriod) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*KeywordPlanForecastPeriod_DateInterval)(nil),
+		(*KeywordPlanForecastPeriod_DateRange)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*KeywordPlan)(nil), "google.ads.googleads.v3.resources.KeywordPlan")
+	proto.RegisterType((*KeywordPlanForecastPeriod)(nil), "google.ads.googleads.v3.resources.KeywordPlanForecastPeriod")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/keyword_plan.proto", fileDescriptor_b7a261a590e572b8)
+}
+
+var fileDescriptor_b7a261a590e572b8 = []byte{
+	// 533 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0xdd, 0x6a, 0xd4, 0x40,
+	0x14, 0x6e, 0xd2, 0x22, 0x76, 0xfa, 0xa3, 0xe4, 0x6a, 0x5b, 0x8b, 0xb4, 0xd5, 0x42, 0x55, 0x98,
+	0x29, 0x4d, 0xf1, 0x22, 0x7a, 0x93, 0x45, 0xed, 0x8f, 0x20, 0x4b, 0x84, 0x45, 0xea, 0xc2, 0x32,
+	0xcd, 0xcc, 0x86, 0x60, 0x32, 0x13, 0x66, 0x26, 0x5b, 0xa4, 0xf4, 0xc2, 0x57, 0xf1, 0xd2, 0x47,
+	0xf1, 0xde, 0x97, 0xe8, 0x0b, 0x78, 0x25, 0x48, 0x26, 0x33, 0xd3, 0x2d, 0x9a, 0xf6, 0xee, 0x4c,
+	0xce, 0x77, 0xbe, 0xf3, 0x9d, 0xf3, 0x9d, 0x80, 0x83, 0x8c, 0xf3, 0xac, 0xa0, 0x08, 0x13, 0x89,
+	0xda, 0xb0, 0x89, 0xa6, 0x21, 0x12, 0x54, 0xf2, 0x5a, 0xa4, 0x54, 0xa2, 0x2f, 0xf4, 0xeb, 0x39,
+	0x17, 0x64, 0x5c, 0x15, 0x98, 0xc1, 0x4a, 0x70, 0xc5, 0x83, 0xad, 0x16, 0x0a, 0x31, 0x91, 0xd0,
+	0x55, 0xc1, 0x69, 0x08, 0x5d, 0xd5, 0xfa, 0xf3, 0x2e, 0xe2, 0x94, 0x97, 0x25, 0x67, 0x88, 0x60,
+	0x45, 0x65, 0x4b, 0xb7, 0xde, 0xef, 0xc2, 0x52, 0x56, 0x97, 0x37, 0x05, 0x8c, 0x27, 0x5c, 0xd0,
+	0x14, 0x4b, 0x35, 0xce, 0x99, 0xa2, 0x62, 0x8a, 0x0b, 0xc3, 0xb1, 0x66, 0x39, 0xaa, 0xdc, 0x69,
+	0x37, 0xa9, 0xc7, 0x26, 0xa5, 0x5f, 0x67, 0xf5, 0x04, 0x9d, 0x0b, 0x5c, 0x55, 0x54, 0xd8, 0xf6,
+	0x1b, 0x33, 0xa5, 0x98, 0x31, 0xae, 0xb0, 0xca, 0x39, 0x33, 0xd9, 0xed, 0x5f, 0x3e, 0x58, 0x7a,
+	0xdf, 0x2a, 0x18, 0x14, 0x98, 0x05, 0x4f, 0xc0, 0x8a, 0xe5, 0x1f, 0x33, 0x5c, 0xd2, 0x9e, 0xb7,
+	0xe9, 0xed, 0x2e, 0x26, 0xcb, 0xf6, 0xe3, 0x07, 0x5c, 0xd2, 0xe0, 0x05, 0xf0, 0x73, 0xd2, 0xf3,
+	0x37, 0xbd, 0xdd, 0xa5, 0xfd, 0x47, 0x66, 0x45, 0xd0, 0xf6, 0x87, 0xc7, 0x4c, 0xbd, 0x3c, 0x18,
+	0xe2, 0xa2, 0xa6, 0x89, 0x9f, 0x93, 0x60, 0x0f, 0x2c, 0x68, 0xa2, 0x79, 0x0d, 0xdf, 0xf8, 0x07,
+	0xfe, 0x51, 0x89, 0x9c, 0x65, 0x2d, 0x5e, 0x23, 0x03, 0x0a, 0x1e, 0xb8, 0x3d, 0x54, 0x54, 0xe4,
+	0x9c, 0xf4, 0x16, 0x74, 0xf1, 0x6b, 0x78, 0xa7, 0x33, 0x70, 0x66, 0x98, 0x77, 0x86, 0x64, 0xa0,
+	0x39, 0x92, 0xd5, 0xc9, 0x8d, 0x77, 0xf4, 0xf9, 0x2a, 0xfe, 0x04, 0x9e, 0x5e, 0xd3, 0x98, 0xa8,
+	0xca, 0x25, 0x4c, 0x79, 0x89, 0x66, 0xb7, 0xb2, 0x97, 0xd6, 0x52, 0xf1, 0x92, 0x0a, 0x89, 0x2e,
+	0x6c, 0x78, 0x69, 0x9d, 0x6b, 0x10, 0x12, 0x5d, 0xcc, 0xfa, 0x78, 0xb9, 0xfd, 0xdb, 0x03, 0x6b,
+	0x9d, 0x52, 0x82, 0x6f, 0x1e, 0x58, 0x69, 0x4e, 0xc4, 0xd9, 0xac, 0xd7, 0xbc, 0xba, 0x7f, 0xda,
+	0x39, 0xa0, 0xbe, 0x95, 0xff, 0x0d, 0x77, 0x6c, 0x18, 0xde, 0xb2, 0xba, 0xbc, 0x2d, 0x7f, 0x34,
+	0x97, 0x2c, 0x37, 0x2d, 0xed, 0x3b, 0x38, 0x01, 0x40, 0x4b, 0x10, 0x98, 0x65, 0xd4, 0x98, 0xf9,
+	0xac, 0xb3, 0x7f, 0x7b, 0xd7, 0xf0, 0x0d, 0x56, 0x34, 0x69, 0x0a, 0x8e, 0xe6, 0x92, 0x45, 0x62,
+	0x1f, 0x7d, 0x00, 0xee, 0xdb, 0x49, 0xfa, 0x7f, 0x3c, 0xb0, 0x93, 0xf2, 0xf2, 0x6e, 0xab, 0xfa,
+	0x0f, 0x67, 0xe4, 0x0e, 0x9a, 0x73, 0x18, 0x78, 0xa7, 0x27, 0xa6, 0x2c, 0xe3, 0x05, 0x66, 0x19,
+	0xe4, 0x22, 0x43, 0x19, 0x65, 0xfa, 0x58, 0xd0, 0xb5, 0x41, 0xb7, 0xfc, 0xd0, 0xaf, 0x5c, 0xf4,
+	0xdd, 0x9f, 0x3f, 0x8c, 0xe3, 0x1f, 0xfe, 0xd6, 0x61, 0x4b, 0x19, 0x13, 0x09, 0xdb, 0xb0, 0x89,
+	0x86, 0x21, 0x4c, 0x2c, 0xf2, 0xa7, 0xc5, 0x8c, 0x62, 0x22, 0x47, 0x0e, 0x33, 0x1a, 0x86, 0x23,
+	0x87, 0xb9, 0xf2, 0x77, 0xda, 0x44, 0x14, 0xc5, 0x44, 0x46, 0x91, 0x43, 0x45, 0xd1, 0x30, 0x8c,
+	0x22, 0x87, 0x3b, 0xbb, 0xa7, 0xc5, 0x86, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x77, 0x4d,
+	0x29, 0x7c, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/keyword_plan_ad_group.pb.go b/googleapis/ads/googleads/v3/resources/keyword_plan_ad_group.pb.go
new file mode 100644
index 0000000..6c68cde
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/keyword_plan_ad_group.pb.go
@@ -0,0 +1,150 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/keyword_plan_ad_group.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A Keyword Planner ad group.
+// Max number of keyword plan ad groups per plan: 200.
+type KeywordPlanAdGroup struct {
+	// The resource name of the Keyword Planner ad group.
+	// KeywordPlanAdGroup resource names have the form:
+	//
+	// `customers/{customer_id}/keywordPlanAdGroups/{kp_ad_group_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The keyword plan campaign to which this ad group belongs.
+	KeywordPlanCampaign *wrappers.StringValue `protobuf:"bytes,2,opt,name=keyword_plan_campaign,json=keywordPlanCampaign,proto3" json:"keyword_plan_campaign,omitempty"`
+	// The ID of the keyword plan ad group.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the keyword plan ad group.
+	//
+	// This field is required and should not be empty when creating keyword plan
+	// ad group.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// A default ad group max cpc bid in micros in account currency for all
+	// biddable keywords under the keyword plan ad group.
+	// If not set, will inherit from parent campaign.
+	CpcBidMicros         *wrappers.Int64Value `protobuf:"bytes,5,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *KeywordPlanAdGroup) Reset()         { *m = KeywordPlanAdGroup{} }
+func (m *KeywordPlanAdGroup) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanAdGroup) ProtoMessage()    {}
+func (*KeywordPlanAdGroup) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8bbe0859e53aefdd, []int{0}
+}
+
+func (m *KeywordPlanAdGroup) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanAdGroup.Unmarshal(m, b)
+}
+func (m *KeywordPlanAdGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanAdGroup.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanAdGroup) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanAdGroup.Merge(m, src)
+}
+func (m *KeywordPlanAdGroup) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanAdGroup.Size(m)
+}
+func (m *KeywordPlanAdGroup) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanAdGroup.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanAdGroup proto.InternalMessageInfo
+
+func (m *KeywordPlanAdGroup) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *KeywordPlanAdGroup) GetKeywordPlanCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.KeywordPlanCampaign
+	}
+	return nil
+}
+
+func (m *KeywordPlanAdGroup) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *KeywordPlanAdGroup) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *KeywordPlanAdGroup) GetCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidMicros
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*KeywordPlanAdGroup)(nil), "google.ads.googleads.v3.resources.KeywordPlanAdGroup")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/keyword_plan_ad_group.proto", fileDescriptor_8bbe0859e53aefdd)
+}
+
+var fileDescriptor_8bbe0859e53aefdd = []byte{
+	// 444 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xdf, 0x6a, 0x14, 0x31,
+	0x18, 0xc5, 0xd9, 0xd9, 0x2a, 0x18, 0xab, 0x17, 0x23, 0xe2, 0x5a, 0x8b, 0xb4, 0x4a, 0xa1, 0x50,
+	0x48, 0xc4, 0x11, 0x2f, 0x22, 0x82, 0xb3, 0x5e, 0x2c, 0x2a, 0xca, 0xb2, 0xc2, 0x5e, 0xc8, 0xc2,
+	0x90, 0x4d, 0x62, 0x08, 0x3b, 0x93, 0x2f, 0x24, 0x33, 0x2d, 0x52, 0x7a, 0xe7, 0x8b, 0xe8, 0xa5,
+	0x8f, 0xe2, 0xa3, 0xf4, 0x29, 0x64, 0xfe, 0x65, 0x95, 0x2d, 0x6e, 0xef, 0xce, 0xcc, 0x77, 0x7e,
+	0x39, 0xdf, 0x99, 0x09, 0x7a, 0xad, 0x00, 0x54, 0x2e, 0x09, 0x13, 0x9e, 0xb4, 0xb2, 0x56, 0xa7,
+	0x09, 0x71, 0xd2, 0x43, 0xe5, 0xb8, 0xf4, 0x64, 0x25, 0xbf, 0x9d, 0x81, 0x13, 0x99, 0xcd, 0x99,
+	0xc9, 0x98, 0xc8, 0x94, 0x83, 0xca, 0x62, 0xeb, 0xa0, 0x84, 0xf8, 0xb0, 0x65, 0x30, 0x13, 0x1e,
+	0x07, 0x1c, 0x9f, 0x26, 0x38, 0xe0, 0x7b, 0x0f, 0xfb, 0x04, 0xab, 0xc3, 0xa1, 0x2d, 0xbd, 0xf7,
+	0xb8, 0x1b, 0x35, 0x4f, 0xcb, 0xea, 0x2b, 0x39, 0x73, 0xcc, 0x5a, 0xe9, 0x7c, 0x37, 0xdf, 0xff,
+	0x0b, 0x65, 0xc6, 0x40, 0xc9, 0x4a, 0x0d, 0xa6, 0x9b, 0x3e, 0xf9, 0x31, 0x44, 0xf1, 0x87, 0x76,
+	0xb7, 0x69, 0xce, 0x4c, 0x2a, 0x26, 0xf5, 0x62, 0xf1, 0x53, 0x74, 0xa7, 0x8f, 0xc9, 0x0c, 0x2b,
+	0xe4, 0x68, 0x70, 0x30, 0x38, 0xbe, 0x35, 0xdb, 0xed, 0x5f, 0x7e, 0x62, 0x85, 0x8c, 0xa7, 0xe8,
+	0xfe, 0x3f, 0xb5, 0x38, 0x2b, 0x2c, 0xd3, 0xca, 0x8c, 0xa2, 0x83, 0xc1, 0xf1, 0xed, 0xe7, 0xfb,
+	0x5d, 0x19, 0xdc, 0x6f, 0x86, 0x3f, 0x97, 0x4e, 0x1b, 0x35, 0x67, 0x79, 0x25, 0x67, 0xf7, 0x56,
+	0xeb, 0xd4, 0xb7, 0x1d, 0x18, 0x9f, 0xa0, 0x48, 0x8b, 0xd1, 0xb0, 0xc1, 0x1f, 0x6d, 0xe0, 0xef,
+	0x4c, 0xf9, 0xf2, 0x45, 0x4b, 0x47, 0x5a, 0xc4, 0xcf, 0xd0, 0x4e, 0xb3, 0xda, 0xce, 0x35, 0xd2,
+	0x1a, 0x67, 0x9c, 0xa2, 0xbb, 0xdc, 0xf2, 0x6c, 0xa9, 0x45, 0x56, 0x68, 0xee, 0xc0, 0x8f, 0x6e,
+	0x6c, 0x8f, 0xda, 0xe5, 0x96, 0x8f, 0xb5, 0xf8, 0xd8, 0x00, 0xd4, 0x5d, 0xa6, 0x80, 0x4e, 0xd6,
+	0x7f, 0xa9, 0x53, 0x56, 0x7b, 0xcc, 0xa1, 0x20, 0x57, 0x7c, 0xca, 0x37, 0xbc, 0xf2, 0x25, 0x14,
+	0xd2, 0x79, 0x72, 0xde, 0xcb, 0x0b, 0xb2, 0xda, 0x30, 0x7a, 0x72, 0x7e, 0xe5, 0x25, 0xb9, 0x18,
+	0x7f, 0x8f, 0xd0, 0x11, 0x87, 0x02, 0x6f, 0xbd, 0x26, 0xe3, 0x07, 0x9b, 0xf9, 0xd3, 0xba, 0xd2,
+	0x74, 0xf0, 0xe5, 0x7d, 0x47, 0x2b, 0xc8, 0x99, 0x51, 0x18, 0x9c, 0x22, 0x4a, 0x9a, 0xa6, 0x30,
+	0x59, 0x97, 0xf8, 0xcf, 0x15, 0x7e, 0x15, 0xd4, 0xcf, 0x68, 0x38, 0x49, 0xd3, 0x5f, 0xd1, 0xe1,
+	0xa4, 0x3d, 0x32, 0x15, 0x1e, 0xb7, 0xb2, 0x56, 0xf3, 0x04, 0xcf, 0x7a, 0xe7, 0xef, 0xde, 0xb3,
+	0x48, 0x85, 0x5f, 0x04, 0xcf, 0x62, 0x9e, 0x2c, 0x82, 0xe7, 0x32, 0x3a, 0x6a, 0x07, 0x94, 0xa6,
+	0xc2, 0x53, 0x1a, 0x5c, 0x94, 0xce, 0x13, 0x4a, 0x83, 0x6f, 0x79, 0xb3, 0x59, 0x36, 0xf9, 0x13,
+	0x00, 0x00, 0xff, 0xff, 0xc6, 0xc1, 0xce, 0xdf, 0x6e, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/keyword_plan_campaign.pb.go b/googleapis/ads/googleads/v3/resources/keyword_plan_campaign.pb.go
new file mode 100644
index 0000000..7cd53f0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/keyword_plan_campaign.pb.go
@@ -0,0 +1,236 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/keyword_plan_campaign.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A Keyword Plan campaign.
+// Max number of keyword plan campaigns per plan allowed: 1.
+type KeywordPlanCampaign struct {
+	// The resource name of the Keyword Plan campaign.
+	// KeywordPlanCampaign resource names have the form:
+	//
+	// `customers/{customer_id}/keywordPlanCampaigns/{kp_campaign_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The keyword plan this campaign belongs to.
+	KeywordPlan *wrappers.StringValue `protobuf:"bytes,2,opt,name=keyword_plan,json=keywordPlan,proto3" json:"keyword_plan,omitempty"`
+	// The ID of the Keyword Plan campaign.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the Keyword Plan campaign.
+	//
+	// This field is required and should not be empty when creating Keyword Plan
+	// campaigns.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The languages targeted for the Keyword Plan campaign.
+	// Max allowed: 1.
+	LanguageConstants []*wrappers.StringValue `protobuf:"bytes,5,rep,name=language_constants,json=languageConstants,proto3" json:"language_constants,omitempty"`
+	// Targeting network.
+	//
+	// This field is required and should not be empty when creating Keyword Plan
+	// campaigns.
+	KeywordPlanNetwork enums.KeywordPlanNetworkEnum_KeywordPlanNetwork `protobuf:"varint,6,opt,name=keyword_plan_network,json=keywordPlanNetwork,proto3,enum=google.ads.googleads.v3.enums.KeywordPlanNetworkEnum_KeywordPlanNetwork" json:"keyword_plan_network,omitempty"`
+	// A default max cpc bid in micros, and in the account currency, for all ad
+	// groups under the campaign.
+	//
+	// This field is required and should not be empty when creating Keyword Plan
+	// campaigns.
+	CpcBidMicros *wrappers.Int64Value `protobuf:"bytes,7,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
+	// The geo targets.
+	// Max number allowed: 20.
+	GeoTargets           []*KeywordPlanGeoTarget `protobuf:"bytes,8,rep,name=geo_targets,json=geoTargets,proto3" json:"geo_targets,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *KeywordPlanCampaign) Reset()         { *m = KeywordPlanCampaign{} }
+func (m *KeywordPlanCampaign) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanCampaign) ProtoMessage()    {}
+func (*KeywordPlanCampaign) Descriptor() ([]byte, []int) {
+	return fileDescriptor_17930fe29b1b9aff, []int{0}
+}
+
+func (m *KeywordPlanCampaign) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanCampaign.Unmarshal(m, b)
+}
+func (m *KeywordPlanCampaign) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanCampaign.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanCampaign) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanCampaign.Merge(m, src)
+}
+func (m *KeywordPlanCampaign) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanCampaign.Size(m)
+}
+func (m *KeywordPlanCampaign) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanCampaign.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanCampaign proto.InternalMessageInfo
+
+func (m *KeywordPlanCampaign) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *KeywordPlanCampaign) GetKeywordPlan() *wrappers.StringValue {
+	if m != nil {
+		return m.KeywordPlan
+	}
+	return nil
+}
+
+func (m *KeywordPlanCampaign) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *KeywordPlanCampaign) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *KeywordPlanCampaign) GetLanguageConstants() []*wrappers.StringValue {
+	if m != nil {
+		return m.LanguageConstants
+	}
+	return nil
+}
+
+func (m *KeywordPlanCampaign) GetKeywordPlanNetwork() enums.KeywordPlanNetworkEnum_KeywordPlanNetwork {
+	if m != nil {
+		return m.KeywordPlanNetwork
+	}
+	return enums.KeywordPlanNetworkEnum_UNSPECIFIED
+}
+
+func (m *KeywordPlanCampaign) GetCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidMicros
+	}
+	return nil
+}
+
+func (m *KeywordPlanCampaign) GetGeoTargets() []*KeywordPlanGeoTarget {
+	if m != nil {
+		return m.GeoTargets
+	}
+	return nil
+}
+
+// A geo target.
+// Next ID: 3
+type KeywordPlanGeoTarget struct {
+	// Required. The resource name of the geo target.
+	GeoTargetConstant    *wrappers.StringValue `protobuf:"bytes,1,opt,name=geo_target_constant,json=geoTargetConstant,proto3" json:"geo_target_constant,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *KeywordPlanGeoTarget) Reset()         { *m = KeywordPlanGeoTarget{} }
+func (m *KeywordPlanGeoTarget) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanGeoTarget) ProtoMessage()    {}
+func (*KeywordPlanGeoTarget) Descriptor() ([]byte, []int) {
+	return fileDescriptor_17930fe29b1b9aff, []int{1}
+}
+
+func (m *KeywordPlanGeoTarget) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanGeoTarget.Unmarshal(m, b)
+}
+func (m *KeywordPlanGeoTarget) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanGeoTarget.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanGeoTarget) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanGeoTarget.Merge(m, src)
+}
+func (m *KeywordPlanGeoTarget) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanGeoTarget.Size(m)
+}
+func (m *KeywordPlanGeoTarget) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanGeoTarget.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanGeoTarget proto.InternalMessageInfo
+
+func (m *KeywordPlanGeoTarget) GetGeoTargetConstant() *wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetConstant
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*KeywordPlanCampaign)(nil), "google.ads.googleads.v3.resources.KeywordPlanCampaign")
+	proto.RegisterType((*KeywordPlanGeoTarget)(nil), "google.ads.googleads.v3.resources.KeywordPlanGeoTarget")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/keyword_plan_campaign.proto", fileDescriptor_17930fe29b1b9aff)
+}
+
+var fileDescriptor_17930fe29b1b9aff = []byte{
+	// 570 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0xdf, 0x6a, 0x13, 0x41,
+	0x14, 0xc6, 0xc9, 0xf6, 0x8f, 0x3a, 0xad, 0x05, 0xa7, 0xbd, 0x58, 0x6b, 0x91, 0xb4, 0x52, 0x08,
+	0x28, 0xb3, 0xd2, 0x15, 0x95, 0x15, 0x91, 0x4d, 0x91, 0xa8, 0xd5, 0x12, 0xa2, 0x04, 0x91, 0xc0,
+	0x32, 0xd9, 0x19, 0x87, 0x25, 0xd9, 0x99, 0x75, 0x66, 0xb6, 0x41, 0x4b, 0x2f, 0x7d, 0x11, 0x2f,
+	0x7d, 0x00, 0x1f, 0xc2, 0x47, 0xe9, 0x53, 0x48, 0x66, 0x77, 0x36, 0xc1, 0x6c, 0x8d, 0x77, 0x27,
+	0x73, 0xbe, 0xdf, 0x9c, 0xef, 0x9c, 0x33, 0x59, 0xf0, 0x9c, 0x09, 0xc1, 0xc6, 0xd4, 0xc3, 0x44,
+	0x79, 0x45, 0x38, 0x8d, 0xce, 0x7c, 0x4f, 0x52, 0x25, 0x72, 0x19, 0x53, 0xe5, 0x8d, 0xe8, 0xd7,
+	0x89, 0x90, 0x24, 0xca, 0xc6, 0x98, 0x47, 0x31, 0x4e, 0x33, 0x9c, 0x30, 0x8e, 0x32, 0x29, 0xb4,
+	0x80, 0xfb, 0x05, 0x83, 0x30, 0x51, 0xa8, 0xc2, 0xd1, 0x99, 0x8f, 0x2a, 0x7c, 0xf7, 0xe9, 0x55,
+	0x15, 0x28, 0xcf, 0xd3, 0xbf, 0x6e, 0xe7, 0x54, 0x4f, 0x84, 0x1c, 0x15, 0x97, 0xef, 0xde, 0xb6,
+	0x64, 0x96, 0x54, 0x76, 0xca, 0xd4, 0xdd, 0x32, 0x65, 0x7e, 0x0d, 0xf3, 0xcf, 0xde, 0x44, 0xe2,
+	0x2c, 0xa3, 0x52, 0x95, 0xf9, 0xbd, 0x39, 0x14, 0x73, 0x2e, 0x34, 0xd6, 0x89, 0xe0, 0x65, 0xf6,
+	0xe0, 0xd7, 0x1a, 0xd8, 0x3e, 0x29, 0xea, 0x76, 0xc7, 0x98, 0x1f, 0x97, 0x3d, 0xc1, 0x7b, 0xe0,
+	0xa6, 0xad, 0x13, 0x71, 0x9c, 0x52, 0xb7, 0xd1, 0x6c, 0xb4, 0x6e, 0xf4, 0x36, 0xed, 0xe1, 0x29,
+	0x4e, 0x29, 0x7c, 0x01, 0x36, 0xe7, 0x3d, 0xbb, 0x4e, 0xb3, 0xd1, 0xda, 0x38, 0xda, 0x2b, 0xdb,
+	0x47, 0xd6, 0x11, 0x7a, 0xaf, 0x65, 0xc2, 0x59, 0x1f, 0x8f, 0x73, 0xda, 0xdb, 0x18, 0xcd, 0xaa,
+	0xc1, 0xfb, 0xc0, 0x49, 0x88, 0xbb, 0x62, 0xb0, 0x3b, 0x0b, 0xd8, 0x6b, 0xae, 0x1f, 0x3f, 0x2a,
+	0x28, 0x27, 0x21, 0xf0, 0x21, 0x58, 0x35, 0x4e, 0x56, 0xff, 0xa3, 0x8a, 0x51, 0xc2, 0x13, 0x00,
+	0xc7, 0x98, 0xb3, 0x1c, 0x33, 0x1a, 0xc5, 0x82, 0x2b, 0x8d, 0xb9, 0x56, 0xee, 0x5a, 0x73, 0x65,
+	0x29, 0x7f, 0xcb, 0x72, 0xc7, 0x16, 0x83, 0xdf, 0xc0, 0x4e, 0xdd, 0x82, 0xdc, 0xf5, 0x66, 0xa3,
+	0xb5, 0x75, 0xf4, 0x0a, 0x5d, 0xb5, 0x7e, 0xb3, 0x5b, 0x34, 0x37, 0xe3, 0xd3, 0x02, 0x7c, 0xc9,
+	0xf3, 0xb4, 0xe6, 0xb8, 0x07, 0x47, 0x0b, 0x67, 0x30, 0x04, 0x5b, 0x71, 0x16, 0x47, 0xc3, 0x84,
+	0x44, 0x69, 0x12, 0x4b, 0xa1, 0xdc, 0x6b, 0xcb, 0x67, 0xb6, 0x19, 0x67, 0x71, 0x3b, 0x21, 0xef,
+	0x0c, 0x00, 0x3f, 0x82, 0x0d, 0x46, 0x45, 0xa4, 0xb1, 0x64, 0x54, 0x2b, 0xf7, 0xba, 0x19, 0xc2,
+	0x13, 0xb4, 0xf4, 0xd1, 0xce, 0x5b, 0xec, 0x50, 0xf1, 0xc1, 0xf0, 0x3d, 0xc0, 0x6c, 0xa8, 0x02,
+	0x7d, 0x19, 0x7e, 0x01, 0x0f, 0x66, 0x74, 0x19, 0x65, 0x89, 0x42, 0xb1, 0x48, 0xbd, 0xba, 0xd7,
+	0x15, 0xc6, 0xb9, 0xd2, 0x22, 0xa5, 0x52, 0x79, 0xe7, 0x36, 0xbc, 0xf0, 0x46, 0x8b, 0x4a, 0xe5,
+	0x9d, 0xd7, 0xfe, 0xe7, 0x2e, 0x0e, 0x08, 0xd8, 0xa9, 0x73, 0x06, 0xdf, 0x82, 0xed, 0x59, 0x9f,
+	0xd5, 0xd6, 0xcd, 0xf3, 0x5d, 0xba, 0xf4, 0xaa, 0x29, 0xbb, 0xf5, 0xf6, 0x77, 0x07, 0x1c, 0xc6,
+	0x22, 0x5d, 0x3e, 0xa6, 0xb6, 0x5b, 0xd3, 0x67, 0x77, 0x5a, 0xa5, 0xdb, 0xf8, 0xf4, 0xa6, 0xc4,
+	0x99, 0x98, 0x3e, 0x2b, 0x24, 0x24, 0xf3, 0x18, 0xe5, 0xc6, 0x83, 0x37, 0x9b, 0xd6, 0x3f, 0x3e,
+	0x3c, 0xcf, 0xaa, 0xe8, 0x87, 0xb3, 0xd2, 0x09, 0xc3, 0x9f, 0xce, 0x7e, 0xa7, 0xb8, 0x32, 0x24,
+	0x0a, 0x15, 0xe1, 0x34, 0xea, 0xfb, 0xa8, 0x67, 0x95, 0xbf, 0xad, 0x66, 0x10, 0x12, 0x35, 0xa8,
+	0x34, 0x83, 0xbe, 0x3f, 0xa8, 0x34, 0x97, 0xce, 0x61, 0x91, 0x08, 0x82, 0x90, 0xa8, 0x20, 0xa8,
+	0x54, 0x41, 0xd0, 0xf7, 0x83, 0xa0, 0xd2, 0x0d, 0xd7, 0x8d, 0x59, 0xff, 0x4f, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xd8, 0xd5, 0x7a, 0xf9, 0x24, 0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/keyword_plan_keyword.pb.go b/googleapis/ads/googleads/v3/resources/keyword_plan_keyword.pb.go
new file mode 100644
index 0000000..4f4ee20
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/keyword_plan_keyword.pb.go
@@ -0,0 +1,160 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/keyword_plan_keyword.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A Keyword Plan ad group keyword.
+// Max number of keyword plan keywords per plan: 2500.
+type KeywordPlanKeyword struct {
+	// The resource name of the Keyword Plan ad group keyword.
+	// KeywordPlanKeyword resource names have the form:
+	//
+	// `customers/{customer_id}/keywordPlanKeywords/{kp_ad_group_keyword_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The Keyword Plan ad group to which this keyword belongs.
+	KeywordPlanAdGroup *wrappers.StringValue `protobuf:"bytes,2,opt,name=keyword_plan_ad_group,json=keywordPlanAdGroup,proto3" json:"keyword_plan_ad_group,omitempty"`
+	// The ID of the Keyword Plan keyword.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// The keyword text.
+	Text *wrappers.StringValue `protobuf:"bytes,4,opt,name=text,proto3" json:"text,omitempty"`
+	// The keyword match type.
+	MatchType enums.KeywordMatchTypeEnum_KeywordMatchType `protobuf:"varint,5,opt,name=match_type,json=matchType,proto3,enum=google.ads.googleads.v3.enums.KeywordMatchTypeEnum_KeywordMatchType" json:"match_type,omitempty"`
+	// A keyword level max cpc bid in micros, in the account currency, that
+	// overrides the keyword plan ad group cpc bid.
+	CpcBidMicros         *wrappers.Int64Value `protobuf:"bytes,6,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *KeywordPlanKeyword) Reset()         { *m = KeywordPlanKeyword{} }
+func (m *KeywordPlanKeyword) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanKeyword) ProtoMessage()    {}
+func (*KeywordPlanKeyword) Descriptor() ([]byte, []int) {
+	return fileDescriptor_148007907f81fae0, []int{0}
+}
+
+func (m *KeywordPlanKeyword) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanKeyword.Unmarshal(m, b)
+}
+func (m *KeywordPlanKeyword) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanKeyword.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanKeyword) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanKeyword.Merge(m, src)
+}
+func (m *KeywordPlanKeyword) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanKeyword.Size(m)
+}
+func (m *KeywordPlanKeyword) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanKeyword.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanKeyword proto.InternalMessageInfo
+
+func (m *KeywordPlanKeyword) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *KeywordPlanKeyword) GetKeywordPlanAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.KeywordPlanAdGroup
+	}
+	return nil
+}
+
+func (m *KeywordPlanKeyword) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *KeywordPlanKeyword) GetText() *wrappers.StringValue {
+	if m != nil {
+		return m.Text
+	}
+	return nil
+}
+
+func (m *KeywordPlanKeyword) GetMatchType() enums.KeywordMatchTypeEnum_KeywordMatchType {
+	if m != nil {
+		return m.MatchType
+	}
+	return enums.KeywordMatchTypeEnum_UNSPECIFIED
+}
+
+func (m *KeywordPlanKeyword) GetCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidMicros
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*KeywordPlanKeyword)(nil), "google.ads.googleads.v3.resources.KeywordPlanKeyword")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/keyword_plan_keyword.proto", fileDescriptor_148007907f81fae0)
+}
+
+var fileDescriptor_148007907f81fae0 = []byte{
+	// 497 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xdd, 0x6a, 0xd4, 0x4c,
+	0x18, 0xc7, 0xd9, 0x74, 0xdf, 0x42, 0xe7, 0xad, 0x3d, 0x08, 0x88, 0xb1, 0x16, 0xd9, 0x2a, 0x85,
+	0x85, 0xc2, 0x8c, 0x34, 0xd2, 0x83, 0x28, 0x48, 0x16, 0x65, 0x51, 0xa9, 0x2e, 0xab, 0xec, 0x81,
+	0x2c, 0x84, 0xd9, 0x99, 0x31, 0x86, 0xcd, 0x7c, 0x38, 0x33, 0x69, 0x5d, 0x4a, 0xcf, 0x7a, 0x25,
+	0x1e, 0x7a, 0x29, 0x5e, 0x4a, 0xaf, 0x42, 0x92, 0x4c, 0x12, 0x65, 0x5b, 0xeb, 0xd9, 0x3f, 0xf3,
+	0xfc, 0x7f, 0xf3, 0x7c, 0x4d, 0xc0, 0xf3, 0x54, 0xca, 0x34, 0x67, 0x08, 0x53, 0x83, 0x6a, 0x59,
+	0xaa, 0xd3, 0x10, 0x69, 0x66, 0x64, 0xa1, 0x09, 0x33, 0x68, 0xc9, 0x56, 0x67, 0x52, 0xd3, 0x44,
+	0xe5, 0x58, 0x24, 0xee, 0x03, 0x2a, 0x2d, 0xad, 0xf4, 0xf7, 0x6b, 0x04, 0x62, 0x6a, 0x60, 0x4b,
+	0xc3, 0xd3, 0x10, 0xb6, 0xf4, 0xee, 0xf1, 0x4d, 0x09, 0x98, 0x28, 0x78, 0x77, 0x39, 0xc7, 0x96,
+	0x7c, 0x49, 0xec, 0x4a, 0xb1, 0xfa, 0xea, 0xdd, 0xfb, 0x0d, 0xa7, 0xb2, 0xb6, 0x16, 0x17, 0x7a,
+	0xe8, 0x42, 0xd5, 0xd7, 0xa2, 0xf8, 0x8c, 0xce, 0x34, 0x56, 0x8a, 0x69, 0xe3, 0xe2, 0x7b, 0xbf,
+	0xa1, 0x58, 0x08, 0x69, 0xb1, 0xcd, 0xa4, 0x70, 0xd1, 0x47, 0x97, 0x7d, 0xe0, 0xbf, 0xad, 0xb3,
+	0x4e, 0x72, 0x2c, 0x9c, 0xf4, 0x1f, 0x83, 0x3b, 0x4d, 0x9a, 0x44, 0x60, 0xce, 0x82, 0xde, 0xa0,
+	0x37, 0xdc, 0x9a, 0x6e, 0x37, 0x87, 0xef, 0x30, 0x67, 0xfe, 0x7b, 0x70, 0xf7, 0x8f, 0x69, 0x60,
+	0x9a, 0xa4, 0x5a, 0x16, 0x2a, 0xf0, 0x06, 0xbd, 0xe1, 0xff, 0x47, 0x7b, 0x6e, 0x08, 0xb0, 0xa9,
+	0x0c, 0x7e, 0xb0, 0x3a, 0x13, 0xe9, 0x0c, 0xe7, 0x05, 0x9b, 0xfa, 0xcb, 0x2e, 0x6b, 0x4c, 0xc7,
+	0x25, 0xe7, 0x1f, 0x02, 0x2f, 0xa3, 0xc1, 0x46, 0x45, 0x3f, 0x58, 0xa3, 0x5f, 0x0b, 0x7b, 0xfc,
+	0xb4, 0x86, 0xbd, 0x8c, 0xfa, 0x4f, 0x40, 0xdf, 0xb2, 0x6f, 0x36, 0xe8, 0xff, 0x43, 0xb2, 0xca,
+	0xe9, 0x13, 0x00, 0xba, 0xc1, 0x06, 0xff, 0x0d, 0x7a, 0xc3, 0x9d, 0xa3, 0x97, 0xf0, 0xa6, 0xa5,
+	0x55, 0x1b, 0x81, 0x6e, 0x20, 0x27, 0x25, 0xf7, 0x71, 0xa5, 0xd8, 0x2b, 0x51, 0xf0, 0xb5, 0xc3,
+	0xe9, 0x16, 0x6f, 0xa4, 0x1f, 0x83, 0x1d, 0xa2, 0x48, 0xb2, 0xc8, 0x68, 0xc2, 0x33, 0xa2, 0xa5,
+	0x09, 0x36, 0x6f, 0xef, 0x67, 0x9b, 0x28, 0x32, 0xca, 0xe8, 0x49, 0x05, 0x44, 0x5f, 0xaf, 0x62,
+	0x01, 0x0e, 0xbb, 0x62, 0x9c, 0x52, 0x99, 0x81, 0x44, 0x72, 0x74, 0xcd, 0xba, 0x5e, 0x90, 0xc2,
+	0x58, 0xc9, 0x99, 0x36, 0xe8, 0xbc, 0x91, 0x17, 0x68, 0xb9, 0x66, 0x34, 0xe8, 0xfc, 0xba, 0xf7,
+	0x7b, 0x31, 0xba, 0xf4, 0xc0, 0x01, 0x91, 0x1c, 0xde, 0xfa, 0x82, 0x47, 0xf7, 0xd6, 0xd3, 0x4f,
+	0xca, 0x8e, 0x26, 0xbd, 0x4f, 0x6f, 0x1c, 0x9d, 0xca, 0x1c, 0x8b, 0x14, 0x4a, 0x9d, 0xa2, 0x94,
+	0x89, 0xaa, 0x5f, 0xd4, 0xf5, 0xf0, 0x97, 0x9f, 0xeb, 0x59, 0xab, 0xbe, 0x7b, 0x1b, 0xe3, 0x38,
+	0xfe, 0xe1, 0xed, 0x8f, 0xeb, 0x2b, 0x63, 0x6a, 0x60, 0x2d, 0x4b, 0x35, 0x0b, 0xe1, 0xb4, 0x71,
+	0xfe, 0x6c, 0x3c, 0xf3, 0x98, 0x9a, 0x79, 0xeb, 0x99, 0xcf, 0xc2, 0x79, 0xeb, 0xb9, 0xf2, 0x0e,
+	0xea, 0x40, 0x14, 0xc5, 0xd4, 0x44, 0x51, 0xeb, 0x8a, 0xa2, 0x59, 0x18, 0x45, 0xad, 0x6f, 0xb1,
+	0x59, 0x15, 0x1b, 0xfe, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x72, 0xf9, 0x4b, 0x08, 0x04, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/keyword_plan_negative_keyword.pb.go b/googleapis/ads/googleads/v3/resources/keyword_plan_negative_keyword.pb.go
new file mode 100644
index 0000000..1c36c20
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/keyword_plan_negative_keyword.pb.go
@@ -0,0 +1,149 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/keyword_plan_negative_keyword.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A Keyword Plan negative keyword.
+// Max number of keyword plan negative keywords per plan: 1000.
+type KeywordPlanNegativeKeyword struct {
+	// The resource name of the Keyword Plan negative keyword.
+	// KeywordPlanNegativeKeyword resource names have the form:
+	//
+	// `customers/{customer_id}/keywordPlanNegativeKeywords/{kp_negative_keyword_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The Keyword Plan campaign to which this negative keyword belongs.
+	KeywordPlanCampaign *wrappers.StringValue `protobuf:"bytes,2,opt,name=keyword_plan_campaign,json=keywordPlanCampaign,proto3" json:"keyword_plan_campaign,omitempty"`
+	// The ID of the Keyword Plan negative keyword.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// The keyword text.
+	Text *wrappers.StringValue `protobuf:"bytes,4,opt,name=text,proto3" json:"text,omitempty"`
+	// The keyword match type.
+	MatchType            enums.KeywordMatchTypeEnum_KeywordMatchType `protobuf:"varint,5,opt,name=match_type,json=matchType,proto3,enum=google.ads.googleads.v3.enums.KeywordMatchTypeEnum_KeywordMatchType" json:"match_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *KeywordPlanNegativeKeyword) Reset()         { *m = KeywordPlanNegativeKeyword{} }
+func (m *KeywordPlanNegativeKeyword) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanNegativeKeyword) ProtoMessage()    {}
+func (*KeywordPlanNegativeKeyword) Descriptor() ([]byte, []int) {
+	return fileDescriptor_385c61d2484cb50d, []int{0}
+}
+
+func (m *KeywordPlanNegativeKeyword) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanNegativeKeyword.Unmarshal(m, b)
+}
+func (m *KeywordPlanNegativeKeyword) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanNegativeKeyword.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanNegativeKeyword) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanNegativeKeyword.Merge(m, src)
+}
+func (m *KeywordPlanNegativeKeyword) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanNegativeKeyword.Size(m)
+}
+func (m *KeywordPlanNegativeKeyword) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanNegativeKeyword.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanNegativeKeyword proto.InternalMessageInfo
+
+func (m *KeywordPlanNegativeKeyword) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *KeywordPlanNegativeKeyword) GetKeywordPlanCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.KeywordPlanCampaign
+	}
+	return nil
+}
+
+func (m *KeywordPlanNegativeKeyword) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *KeywordPlanNegativeKeyword) GetText() *wrappers.StringValue {
+	if m != nil {
+		return m.Text
+	}
+	return nil
+}
+
+func (m *KeywordPlanNegativeKeyword) GetMatchType() enums.KeywordMatchTypeEnum_KeywordMatchType {
+	if m != nil {
+		return m.MatchType
+	}
+	return enums.KeywordMatchTypeEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*KeywordPlanNegativeKeyword)(nil), "google.ads.googleads.v3.resources.KeywordPlanNegativeKeyword")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/keyword_plan_negative_keyword.proto", fileDescriptor_385c61d2484cb50d)
+}
+
+var fileDescriptor_385c61d2484cb50d = []byte{
+	// 483 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x4d, 0x6b, 0xd4, 0x40,
+	0x18, 0x26, 0xd9, 0x2a, 0x74, 0xfc, 0x38, 0x44, 0x84, 0xb8, 0x16, 0xdd, 0x2a, 0x85, 0x05, 0x61,
+	0x46, 0x1a, 0xe9, 0x61, 0x3c, 0xa5, 0x5a, 0x8a, 0x8a, 0x25, 0xac, 0xb2, 0x07, 0x59, 0x08, 0xd3,
+	0x64, 0x1c, 0xc3, 0x66, 0x3e, 0x98, 0x99, 0x6c, 0x5d, 0x4a, 0xcf, 0x1e, 0xf4, 0x57, 0x78, 0xf4,
+	0xa7, 0xf8, 0x3f, 0xbc, 0xf4, 0x57, 0xc8, 0x26, 0x93, 0x44, 0x29, 0xbb, 0x7a, 0x7b, 0xf2, 0xbe,
+	0xcf, 0xf3, 0x3e, 0xef, 0x3c, 0x33, 0x01, 0x47, 0x4c, 0x4a, 0x56, 0x52, 0x44, 0x72, 0x83, 0x1a,
+	0xb8, 0x42, 0x8b, 0x08, 0x69, 0x6a, 0x64, 0xa5, 0x33, 0x6a, 0xd0, 0x9c, 0x2e, 0xcf, 0xa4, 0xce,
+	0x53, 0x55, 0x12, 0x91, 0x0a, 0xca, 0x88, 0x2d, 0x16, 0x34, 0x75, 0x55, 0xa8, 0xb4, 0xb4, 0x32,
+	0xd8, 0x6d, 0xb4, 0x90, 0xe4, 0x06, 0x76, 0x63, 0xe0, 0x22, 0x82, 0xdd, 0x98, 0xe1, 0xc1, 0x3a,
+	0x27, 0x2a, 0x2a, 0xde, 0xbb, 0x70, 0x62, 0xb3, 0x4f, 0xa9, 0x5d, 0x2a, 0xda, 0x8c, 0x1e, 0xde,
+	0x6b, 0x75, 0xaa, 0xe8, 0x96, 0x72, 0xad, 0x07, 0xae, 0x55, 0x7f, 0x9d, 0x56, 0x1f, 0xd1, 0x99,
+	0x26, 0x4a, 0x51, 0x6d, 0x5c, 0x7f, 0xe7, 0x0f, 0x29, 0x11, 0x42, 0x5a, 0x62, 0x0b, 0x29, 0x5c,
+	0xf7, 0xd1, 0xaf, 0x01, 0x18, 0xbe, 0x69, 0x5c, 0x93, 0x92, 0x88, 0x13, 0x77, 0x32, 0x57, 0x0a,
+	0x1e, 0x83, 0x5b, 0xad, 0x5d, 0x2a, 0x08, 0xa7, 0xa1, 0x37, 0xf2, 0xc6, 0xdb, 0x93, 0x9b, 0x6d,
+	0xf1, 0x84, 0x70, 0x1a, 0x24, 0xe0, 0xee, 0x5f, 0xf1, 0x64, 0x84, 0x2b, 0x52, 0x30, 0x11, 0xfa,
+	0x23, 0x6f, 0x7c, 0x63, 0x7f, 0xc7, 0x85, 0x01, 0xdb, 0x0d, 0xe1, 0x3b, 0xab, 0x0b, 0xc1, 0xa6,
+	0xa4, 0xac, 0xe8, 0xe4, 0xce, 0xbc, 0x77, 0x7f, 0xe1, 0x84, 0xc1, 0x13, 0xe0, 0x17, 0x79, 0x38,
+	0xa8, 0xe5, 0xf7, 0xaf, 0xc8, 0x5f, 0x09, 0x7b, 0xf0, 0xac, 0x51, 0xfb, 0x45, 0x1e, 0x3c, 0x05,
+	0x5b, 0x96, 0x7e, 0xb6, 0xe1, 0xd6, 0x7f, 0xb8, 0xd5, 0xcc, 0x20, 0x03, 0xa0, 0x4f, 0x38, 0xbc,
+	0x36, 0xf2, 0xc6, 0xb7, 0xf7, 0x5f, 0xc2, 0x75, 0xb7, 0x57, 0x5f, 0x0d, 0x74, 0x89, 0xbc, 0x5d,
+	0xe9, 0xde, 0x2f, 0x15, 0x3d, 0x12, 0x15, 0xbf, 0x52, 0x9c, 0x6c, 0xf3, 0x16, 0xe2, 0xaf, 0xde,
+	0x65, 0xfc, 0xc5, 0x03, 0x51, 0x3f, 0xcb, 0x21, 0x55, 0x18, 0x98, 0x49, 0x8e, 0x36, 0xc4, 0x9e,
+	0x64, 0x95, 0xb1, 0x92, 0x53, 0x6d, 0xd0, 0x79, 0x0b, 0x2f, 0xd0, 0x7c, 0xad, 0xc0, 0xa0, 0xf3,
+	0x8d, 0x0f, 0xf4, 0xe2, 0xf0, 0x9b, 0x0f, 0xf6, 0x32, 0xc9, 0xe1, 0x3f, 0x9f, 0xe8, 0xe1, 0xc3,
+	0xf5, 0x7b, 0x25, 0xab, 0x48, 0x13, 0xef, 0xc3, 0x6b, 0x37, 0x85, 0xc9, 0x92, 0x08, 0x06, 0xa5,
+	0x66, 0x88, 0x51, 0x51, 0x07, 0x8e, 0xfa, 0x43, 0x6e, 0xf8, 0x9d, 0x9e, 0x77, 0xe8, 0xbb, 0x3f,
+	0x38, 0x8e, 0xe3, 0x1f, 0xfe, 0xee, 0x71, 0x33, 0x32, 0xce, 0x0d, 0x6c, 0xe0, 0x0a, 0x4d, 0x23,
+	0x38, 0x69, 0x99, 0x3f, 0x5b, 0xce, 0x2c, 0xce, 0xcd, 0xac, 0xe3, 0xcc, 0xa6, 0xd1, 0xac, 0xe3,
+	0x5c, 0xfa, 0x7b, 0x4d, 0x03, 0xe3, 0x38, 0x37, 0x18, 0x77, 0x2c, 0x8c, 0xa7, 0x11, 0xc6, 0x1d,
+	0xef, 0xf4, 0x7a, 0xbd, 0x6c, 0xf4, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x61, 0xe0, 0x73, 0xc2, 0xfa,
+	0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/keyword_view.pb.go b/googleapis/ads/googleads/v3/resources/keyword_view.pb.go
new file mode 100644
index 0000000..6c9b851
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/keyword_view.pb.go
@@ -0,0 +1,99 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/keyword_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A keyword view.
+type KeywordView struct {
+	// The resource name of the keyword view.
+	// Keyword view resource names have the form:
+	//
+	// `customers/{customer_id}/keywordViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *KeywordView) Reset()         { *m = KeywordView{} }
+func (m *KeywordView) String() string { return proto.CompactTextString(m) }
+func (*KeywordView) ProtoMessage()    {}
+func (*KeywordView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b4b06c74ce279f21, []int{0}
+}
+
+func (m *KeywordView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordView.Unmarshal(m, b)
+}
+func (m *KeywordView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordView.Marshal(b, m, deterministic)
+}
+func (m *KeywordView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordView.Merge(m, src)
+}
+func (m *KeywordView) XXX_Size() int {
+	return xxx_messageInfo_KeywordView.Size(m)
+}
+func (m *KeywordView) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordView proto.InternalMessageInfo
+
+func (m *KeywordView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*KeywordView)(nil), "google.ads.googleads.v3.resources.KeywordView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/keyword_view.proto", fileDescriptor_b4b06c74ce279f21)
+}
+
+var fileDescriptor_b4b06c74ce279f21 = []byte{
+	// 315 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0x33, 0x31,
+	0x14, 0x85, 0x99, 0xfe, 0xf0, 0x83, 0xa3, 0x82, 0x74, 0xa5, 0xc5, 0x85, 0x55, 0x0b, 0xae, 0x12,
+	0x61, 0x5c, 0xc5, 0x55, 0xba, 0x29, 0x28, 0x48, 0xe9, 0x62, 0x10, 0x1d, 0x28, 0x71, 0x12, 0xc2,
+	0x60, 0x27, 0xb7, 0xe4, 0x4e, 0x5b, 0xa4, 0xf4, 0x19, 0x7c, 0x07, 0x97, 0x3e, 0x8a, 0x8f, 0xd2,
+	0x77, 0x10, 0x64, 0x9a, 0x26, 0x9d, 0x95, 0xee, 0x0e, 0xb9, 0xdf, 0x39, 0xf7, 0x1e, 0x12, 0xdf,
+	0x68, 0x00, 0x3d, 0x51, 0x54, 0x48, 0xa4, 0x4e, 0xd6, 0x6a, 0x9e, 0x50, 0xab, 0x10, 0x66, 0x36,
+	0x57, 0x48, 0x5f, 0xd5, 0xdb, 0x02, 0xac, 0x1c, 0xcf, 0x0b, 0xb5, 0x20, 0x53, 0x0b, 0x15, 0xb4,
+	0xbb, 0x0e, 0x25, 0x42, 0x22, 0x09, 0x2e, 0x32, 0x4f, 0x48, 0x70, 0x75, 0x4e, 0x7c, 0xf0, 0xb4,
+	0x08, 0x59, 0xce, 0xdd, 0x39, 0x6d, 0x8c, 0x84, 0x31, 0x50, 0x89, 0xaa, 0x00, 0x83, 0x6e, 0x7a,
+	0xfe, 0x1e, 0xc5, 0xfb, 0xf7, 0x6e, 0x65, 0x5a, 0xa8, 0x45, 0xfb, 0x22, 0x3e, 0xf4, 0xfe, 0xb1,
+	0x11, 0xa5, 0x3a, 0x8e, 0xce, 0xa2, 0xab, 0xbd, 0xd1, 0x81, 0x7f, 0x7c, 0x10, 0xa5, 0x62, 0xcf,
+	0x6b, 0xfe, 0x18, 0x5f, 0xee, 0x4e, 0xd9, 0xaa, 0x69, 0x81, 0x24, 0x87, 0x92, 0x36, 0xf3, 0xae,
+	0xf3, 0x19, 0x56, 0x50, 0x2a, 0x8b, 0x74, 0xe9, 0xe5, 0xca, 0x97, 0xac, 0x09, 0xa4, 0xcb, 0x66,
+	0xe5, 0x55, 0xff, 0x3b, 0x8a, 0x7b, 0x39, 0x94, 0xe4, 0xcf, 0xd2, 0xfd, 0xa3, 0xc6, 0xa2, 0x61,
+	0xdd, 0x66, 0x18, 0x3d, 0xdd, 0x6d, 0x6d, 0x1a, 0x26, 0xc2, 0x68, 0x02, 0x56, 0x53, 0xad, 0xcc,
+	0xa6, 0x2b, 0xdd, 0x9d, 0xf9, 0xcb, 0x07, 0xdc, 0x06, 0xf5, 0xd1, 0xfa, 0x37, 0xe0, 0xfc, 0xb3,
+	0xd5, 0x1d, 0xb8, 0x48, 0x2e, 0x91, 0x38, 0x59, 0xab, 0x34, 0x21, 0x23, 0x4f, 0x7e, 0x79, 0x26,
+	0xe3, 0x12, 0xb3, 0xc0, 0x64, 0x69, 0x92, 0x05, 0x66, 0xdd, 0xea, 0xb9, 0x01, 0x63, 0x5c, 0x22,
+	0x63, 0x81, 0x62, 0x2c, 0x4d, 0x18, 0x0b, 0xdc, 0xcb, 0xff, 0xcd, 0xb1, 0xc9, 0x4f, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0x5b, 0xbd, 0xec, 0x85, 0x2c, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/label.pb.go b/googleapis/ads/googleads/v3/resources/label.pb.go
new file mode 100644
index 0000000..a074898
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/label.pb.go
@@ -0,0 +1,150 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/label.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A label.
+type Label struct {
+	// Name of the resource.
+	// Label resource names have the form:
+	// `customers/{customer_id}/labels/{label_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Id of the label. Read only.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the label.
+	//
+	// This field is required and should not be empty when creating a new label.
+	//
+	// The length of this string should be between 1 and 80, inclusive.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// Status of the label. Read only.
+	Status enums.LabelStatusEnum_LabelStatus `protobuf:"varint,4,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.LabelStatusEnum_LabelStatus" json:"status,omitempty"`
+	// A type of label displaying text on a colored background.
+	TextLabel            *common.TextLabel `protobuf:"bytes,5,opt,name=text_label,json=textLabel,proto3" json:"text_label,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *Label) Reset()         { *m = Label{} }
+func (m *Label) String() string { return proto.CompactTextString(m) }
+func (*Label) ProtoMessage()    {}
+func (*Label) Descriptor() ([]byte, []int) {
+	return fileDescriptor_218eb3ad030af589, []int{0}
+}
+
+func (m *Label) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Label.Unmarshal(m, b)
+}
+func (m *Label) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Label.Marshal(b, m, deterministic)
+}
+func (m *Label) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Label.Merge(m, src)
+}
+func (m *Label) XXX_Size() int {
+	return xxx_messageInfo_Label.Size(m)
+}
+func (m *Label) XXX_DiscardUnknown() {
+	xxx_messageInfo_Label.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Label proto.InternalMessageInfo
+
+func (m *Label) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *Label) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Label) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *Label) GetStatus() enums.LabelStatusEnum_LabelStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.LabelStatusEnum_UNSPECIFIED
+}
+
+func (m *Label) GetTextLabel() *common.TextLabel {
+	if m != nil {
+		return m.TextLabel
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Label)(nil), "google.ads.googleads.v3.resources.Label")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/label.proto", fileDescriptor_218eb3ad030af589)
+}
+
+var fileDescriptor_218eb3ad030af589 = []byte{
+	// 452 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xcb, 0x6a, 0xdc, 0x30,
+	0x14, 0x86, 0xb1, 0x73, 0x81, 0xa8, 0x97, 0x85, 0x57, 0xd3, 0x34, 0x84, 0x49, 0x4b, 0x60, 0x4a,
+	0xa9, 0x14, 0xe2, 0xd2, 0x85, 0xba, 0x72, 0x20, 0x24, 0x2d, 0xa5, 0x04, 0xa7, 0xcc, 0xa2, 0x18,
+	0x06, 0x8d, 0xad, 0x1a, 0x83, 0x25, 0x19, 0x49, 0x4e, 0x03, 0x21, 0x2f, 0xd3, 0x65, 0x1f, 0xa5,
+	0x8f, 0x32, 0xdb, 0x2e, 0xba, 0x2d, 0xd6, 0x6d, 0x06, 0x8a, 0x9b, 0xd5, 0xfc, 0x9a, 0xf3, 0xfd,
+	0xbf, 0x8e, 0xcf, 0x11, 0x78, 0x53, 0x0b, 0x51, 0xb7, 0x14, 0x91, 0x4a, 0x21, 0x2b, 0x07, 0x75,
+	0x93, 0x22, 0x49, 0x95, 0xe8, 0x65, 0x49, 0x15, 0x6a, 0xc9, 0x92, 0xb6, 0xb0, 0x93, 0x42, 0x8b,
+	0xe4, 0xc8, 0x32, 0x90, 0x54, 0x0a, 0x06, 0x1c, 0xde, 0xa4, 0x30, 0xe0, 0xfb, 0x68, 0x2c, 0xb1,
+	0x14, 0x8c, 0x09, 0x8e, 0x34, 0xbd, 0xd5, 0x8b, 0x8d, 0xcc, 0xfd, 0x93, 0x31, 0x03, 0xe5, 0x3d,
+	0x73, 0xd7, 0x2f, 0x94, 0x26, 0xba, 0x57, 0xce, 0xf1, 0xcc, 0x3b, 0xba, 0x26, 0xf4, 0xe9, 0x4a,
+	0x87, 0xae, 0x64, 0x4e, 0xcb, 0xfe, 0x1b, 0xfa, 0x2e, 0x49, 0xd7, 0x51, 0xe9, 0xad, 0x07, 0x1b,
+	0x56, 0xc2, 0xb9, 0xd0, 0x44, 0x37, 0x82, 0xbb, 0xea, 0x8b, 0xdf, 0x31, 0xd8, 0xf9, 0x34, 0xdc,
+	0x97, 0xbc, 0x04, 0x4f, 0x7c, 0xf2, 0x82, 0x13, 0x46, 0x27, 0xd1, 0x34, 0x9a, 0xed, 0xe5, 0x8f,
+	0xfd, 0x9f, 0x9f, 0x09, 0xa3, 0xc9, 0x6b, 0x10, 0x37, 0xd5, 0x24, 0x9e, 0x46, 0xb3, 0x47, 0xa7,
+	0xcf, 0xdd, 0x3c, 0xa0, 0xbf, 0x19, 0x7e, 0xe0, 0xfa, 0xdd, 0xdb, 0x39, 0x69, 0x7b, 0x9a, 0xc7,
+	0x4d, 0x95, 0x9c, 0x80, 0x6d, 0x13, 0xb4, 0x65, 0xf0, 0x83, 0x7f, 0xf0, 0x6b, 0x2d, 0x1b, 0x5e,
+	0x5b, 0xde, 0x90, 0x49, 0x0e, 0x76, 0xed, 0x67, 0x4f, 0xb6, 0xa7, 0xd1, 0xec, 0xe9, 0x29, 0x86,
+	0x63, 0xd3, 0x37, 0x93, 0x82, 0xa6, 0xf3, 0x6b, 0xe3, 0x38, 0xe7, 0x3d, 0xdb, 0x3c, 0xe7, 0x2e,
+	0x29, 0xb9, 0x04, 0x60, 0xbd, 0x80, 0xc9, 0x8e, 0xe9, 0xe5, 0xd5, 0x68, 0xae, 0x5d, 0x19, 0xfc,
+	0x42, 0x6f, 0xb5, 0x09, 0xcb, 0xf7, 0xb4, 0x97, 0xf8, 0x72, 0x95, 0x9d, 0x83, 0xc3, 0x35, 0xee,
+	0x54, 0xd7, 0xa8, 0xc1, 0x86, 0xdc, 0x18, 0xcb, 0x5e, 0x69, 0xc1, 0xa8, 0x54, 0xe8, 0xce, 0xcb,
+	0x7b, 0xbb, 0x52, 0x85, 0xee, 0xcc, 0xef, 0xfd, 0xd9, 0x9f, 0x08, 0x1c, 0x97, 0x82, 0xc1, 0x07,
+	0xdf, 0xd6, 0x19, 0x30, 0xa9, 0x57, 0xc3, 0xc8, 0xae, 0xa2, 0xaf, 0x1f, 0x9d, 0xa1, 0x16, 0x2d,
+	0xe1, 0x35, 0x14, 0xb2, 0x46, 0x35, 0xe5, 0x66, 0xa0, 0x68, 0xdd, 0xcd, 0x7f, 0x9e, 0xf6, 0xfb,
+	0xa0, 0x7e, 0xc4, 0x5b, 0x17, 0x59, 0xf6, 0x33, 0x3e, 0xba, 0xb0, 0x91, 0x59, 0xa5, 0xa0, 0x95,
+	0x83, 0x9a, 0xa7, 0x30, 0xf7, 0xe4, 0x2f, 0xcf, 0x14, 0x59, 0xa5, 0x8a, 0xc0, 0x14, 0xf3, 0xb4,
+	0x08, 0xcc, 0x2a, 0x3e, 0xb6, 0x05, 0x8c, 0xb3, 0x4a, 0x61, 0x1c, 0x28, 0x8c, 0xe7, 0x29, 0xc6,
+	0x81, 0x5b, 0xee, 0x9a, 0x66, 0xd3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x99, 0xa2, 0x1f, 0x9f,
+	0x86, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/landing_page_view.pb.go b/googleapis/ads/googleads/v3/resources/landing_page_view.pb.go
new file mode 100644
index 0000000..6982474
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/landing_page_view.pb.go
@@ -0,0 +1,115 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/landing_page_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A landing page view with metrics aggregated at the unexpanded final URL
+// level.
+type LandingPageView struct {
+	// The resource name of the landing page view.
+	// Landing page view resource names have the form:
+	//
+	// `customers/{customer_id}/landingPageViews/{unexpanded_final_url_fingerprint}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The advertiser-specified final URL.
+	UnexpandedFinalUrl   *wrappers.StringValue `protobuf:"bytes,2,opt,name=unexpanded_final_url,json=unexpandedFinalUrl,proto3" json:"unexpanded_final_url,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *LandingPageView) Reset()         { *m = LandingPageView{} }
+func (m *LandingPageView) String() string { return proto.CompactTextString(m) }
+func (*LandingPageView) ProtoMessage()    {}
+func (*LandingPageView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_edb62863fc91958b, []int{0}
+}
+
+func (m *LandingPageView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LandingPageView.Unmarshal(m, b)
+}
+func (m *LandingPageView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LandingPageView.Marshal(b, m, deterministic)
+}
+func (m *LandingPageView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LandingPageView.Merge(m, src)
+}
+func (m *LandingPageView) XXX_Size() int {
+	return xxx_messageInfo_LandingPageView.Size(m)
+}
+func (m *LandingPageView) XXX_DiscardUnknown() {
+	xxx_messageInfo_LandingPageView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LandingPageView proto.InternalMessageInfo
+
+func (m *LandingPageView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *LandingPageView) GetUnexpandedFinalUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.UnexpandedFinalUrl
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*LandingPageView)(nil), "google.ads.googleads.v3.resources.LandingPageView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/landing_page_view.proto", fileDescriptor_edb62863fc91958b)
+}
+
+var fileDescriptor_edb62863fc91958b = []byte{
+	// 386 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xc1, 0xea, 0xd3, 0x40,
+	0x10, 0xc6, 0x49, 0x04, 0xc1, 0xa8, 0x08, 0xa1, 0x87, 0x5a, 0x8a, 0xb4, 0x4a, 0xa1, 0xa7, 0x5d,
+	0x30, 0xa7, 0xae, 0xa7, 0xf4, 0x60, 0x41, 0xa4, 0x94, 0x8a, 0x39, 0x48, 0x20, 0x6c, 0xb3, 0xd3,
+	0x75, 0x21, 0xd9, 0x0d, 0xbb, 0x49, 0x2b, 0x94, 0x1e, 0x7c, 0x15, 0x8f, 0x3e, 0x8a, 0x8f, 0xd2,
+	0x93, 0x8f, 0x20, 0x69, 0xb2, 0x5b, 0xa9, 0xe0, 0xff, 0xf6, 0x25, 0xf3, 0xfb, 0x66, 0xbe, 0x19,
+	0x36, 0x58, 0x70, 0xa5, 0x78, 0x01, 0x98, 0x32, 0x83, 0x3b, 0xd9, 0xaa, 0x43, 0x84, 0x35, 0x18,
+	0xd5, 0xe8, 0x1c, 0x0c, 0x2e, 0xa8, 0x64, 0x42, 0xf2, 0xac, 0xa2, 0x1c, 0xb2, 0x83, 0x80, 0x23,
+	0xaa, 0xb4, 0xaa, 0x55, 0x38, 0xed, 0x78, 0x44, 0x99, 0x41, 0xce, 0x8a, 0x0e, 0x11, 0x72, 0xd6,
+	0xd1, 0x4b, 0xdb, 0xbd, 0x12, 0xae, 0x61, 0xe7, 0x1e, 0xbd, 0xea, 0x4b, 0xd7, 0xaf, 0x5d, 0xb3,
+	0xc7, 0x47, 0x4d, 0xab, 0x0a, 0xb4, 0xe9, 0xeb, 0xe3, 0xbf, 0xac, 0x54, 0x4a, 0x55, 0xd3, 0x5a,
+	0x28, 0xd9, 0x57, 0x5f, 0xff, 0xf6, 0x82, 0x17, 0x1f, 0xbb, 0x5c, 0x1b, 0xca, 0x21, 0x11, 0x70,
+	0x0c, 0xdf, 0x04, 0xcf, 0xed, 0x8c, 0x4c, 0xd2, 0x12, 0x86, 0xde, 0xc4, 0x9b, 0x3f, 0xd9, 0x3e,
+	0xb3, 0x3f, 0xd7, 0xb4, 0x84, 0x70, 0x1d, 0x0c, 0x1a, 0x09, 0xdf, 0x2a, 0x2a, 0x19, 0xb0, 0x6c,
+	0x2f, 0x24, 0x2d, 0xb2, 0x46, 0x17, 0x43, 0x7f, 0xe2, 0xcd, 0x9f, 0xbe, 0x1d, 0xf7, 0x8b, 0x20,
+	0x9b, 0x0a, 0x7d, 0xaa, 0xb5, 0x90, 0x3c, 0xa1, 0x45, 0x03, 0xdb, 0xf0, 0xe6, 0x7c, 0xdf, 0x1a,
+	0x3f, 0xeb, 0x82, 0x7c, 0xbd, 0xc4, 0x10, 0xcc, 0x6f, 0xeb, 0xf7, 0xaa, 0x12, 0x06, 0xe5, 0xaa,
+	0xc4, 0xf7, 0x19, 0x17, 0x79, 0x63, 0x6a, 0x55, 0x82, 0x36, 0xf8, 0x64, 0xe5, 0xd9, 0x5e, 0xd8,
+	0x52, 0x06, 0x9f, 0xfe, 0xb9, 0xf9, 0x79, 0xf9, 0xdd, 0x0f, 0x66, 0xb9, 0x2a, 0xd1, 0x83, 0x57,
+	0x5f, 0x0e, 0xee, 0xa6, 0x6e, 0xda, 0x65, 0x36, 0xde, 0x97, 0x0f, 0xbd, 0x95, 0xab, 0x82, 0x4a,
+	0x8e, 0x94, 0xe6, 0x98, 0x83, 0xbc, 0xae, 0x8a, 0x6f, 0xb9, 0xff, 0xf3, 0x14, 0xde, 0x39, 0xf5,
+	0xc3, 0x7f, 0xb4, 0x8a, 0xe3, 0x9f, 0xfe, 0x74, 0xd5, 0xb5, 0x8c, 0x99, 0x41, 0x9d, 0x6c, 0x55,
+	0x12, 0xa1, 0xad, 0x25, 0x7f, 0x59, 0x26, 0x8d, 0x99, 0x49, 0x1d, 0x93, 0x26, 0x51, 0xea, 0x98,
+	0x8b, 0x3f, 0xeb, 0x0a, 0x84, 0xc4, 0xcc, 0x10, 0xe2, 0x28, 0x42, 0x92, 0x88, 0x10, 0xc7, 0xed,
+	0x1e, 0x5f, 0xc3, 0x46, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x87, 0xab, 0xca, 0x2e, 0xb6, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/language_constant.pb.go b/googleapis/ads/googleads/v3/resources/language_constant.pb.go
new file mode 100644
index 0000000..ce9577a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/language_constant.pb.go
@@ -0,0 +1,143 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/language_constant.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A language.
+type LanguageConstant struct {
+	// The resource name of the language constant.
+	// Language constant resource names have the form:
+	//
+	// `languageConstants/{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the language constant.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The language code, e.g. "en_US", "en_AU", "es", "fr", etc.
+	Code *wrappers.StringValue `protobuf:"bytes,3,opt,name=code,proto3" json:"code,omitempty"`
+	// The full name of the language in English, e.g., "English (US)", "Spanish",
+	// etc.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// Whether the language is targetable.
+	Targetable           *wrappers.BoolValue `protobuf:"bytes,5,opt,name=targetable,proto3" json:"targetable,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *LanguageConstant) Reset()         { *m = LanguageConstant{} }
+func (m *LanguageConstant) String() string { return proto.CompactTextString(m) }
+func (*LanguageConstant) ProtoMessage()    {}
+func (*LanguageConstant) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1d50094a07423762, []int{0}
+}
+
+func (m *LanguageConstant) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LanguageConstant.Unmarshal(m, b)
+}
+func (m *LanguageConstant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LanguageConstant.Marshal(b, m, deterministic)
+}
+func (m *LanguageConstant) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LanguageConstant.Merge(m, src)
+}
+func (m *LanguageConstant) XXX_Size() int {
+	return xxx_messageInfo_LanguageConstant.Size(m)
+}
+func (m *LanguageConstant) XXX_DiscardUnknown() {
+	xxx_messageInfo_LanguageConstant.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LanguageConstant proto.InternalMessageInfo
+
+func (m *LanguageConstant) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *LanguageConstant) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *LanguageConstant) GetCode() *wrappers.StringValue {
+	if m != nil {
+		return m.Code
+	}
+	return nil
+}
+
+func (m *LanguageConstant) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *LanguageConstant) GetTargetable() *wrappers.BoolValue {
+	if m != nil {
+		return m.Targetable
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*LanguageConstant)(nil), "google.ads.googleads.v3.resources.LanguageConstant")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/language_constant.proto", fileDescriptor_1d50094a07423762)
+}
+
+var fileDescriptor_1d50094a07423762 = []byte{
+	// 407 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xd1, 0x8a, 0xd4, 0x30,
+	0x14, 0x86, 0x69, 0x76, 0x15, 0x8c, 0x0a, 0x52, 0x10, 0xea, 0xb8, 0xc8, 0xae, 0x32, 0xb0, 0x22,
+	0x24, 0x62, 0x45, 0x30, 0x5e, 0x75, 0xbc, 0x58, 0x14, 0x91, 0xa5, 0x62, 0x2f, 0xa4, 0xb0, 0x64,
+	0x9a, 0x18, 0x0a, 0x6d, 0x52, 0x92, 0x74, 0xbc, 0x10, 0x6f, 0x7c, 0x14, 0x2f, 0x7d, 0x14, 0x5f,
+	0xc1, 0x37, 0x98, 0xa7, 0x90, 0x36, 0x69, 0x66, 0x98, 0x82, 0x7a, 0xf7, 0x37, 0xe7, 0xfb, 0xcf,
+	0xf9, 0x9b, 0x13, 0xf8, 0x52, 0x28, 0x25, 0x1a, 0x8e, 0x29, 0x33, 0xd8, 0xc9, 0x41, 0x6d, 0x52,
+	0xac, 0xb9, 0x51, 0xbd, 0xae, 0xb8, 0xc1, 0x0d, 0x95, 0xa2, 0xa7, 0x82, 0x5f, 0x55, 0x4a, 0x1a,
+	0x4b, 0xa5, 0x45, 0x9d, 0x56, 0x56, 0xc5, 0x67, 0x8e, 0x47, 0x94, 0x19, 0x14, 0xac, 0x68, 0x93,
+	0xa2, 0x60, 0x5d, 0xdc, 0x9b, 0xba, 0x77, 0x75, 0x68, 0xe8, 0xdc, 0x8b, 0x07, 0xbe, 0x34, 0x7e,
+	0xad, 0xfb, 0xcf, 0xf8, 0x8b, 0xa6, 0x5d, 0xc7, 0xb5, 0xf1, 0xf5, 0x93, 0x3d, 0x2b, 0x95, 0x52,
+	0x59, 0x6a, 0x6b, 0x25, 0x7d, 0xf5, 0xe1, 0x6f, 0x00, 0xef, 0xbc, 0xf3, 0xb9, 0x5e, 0xfb, 0x58,
+	0xf1, 0x23, 0x78, 0x7b, 0x1a, 0x72, 0x25, 0x69, 0xcb, 0x93, 0xe8, 0x34, 0x3a, 0xbf, 0x91, 0xdf,
+	0x9a, 0x0e, 0xdf, 0xd3, 0x96, 0xc7, 0x4f, 0x20, 0xa8, 0x59, 0x02, 0x4e, 0xa3, 0xf3, 0x9b, 0xcf,
+	0xee, 0xfb, 0xdc, 0x68, 0x0a, 0x81, 0xde, 0x48, 0xfb, 0xe2, 0x79, 0x41, 0x9b, 0x9e, 0xe7, 0xa0,
+	0x66, 0xf1, 0x53, 0x78, 0x5c, 0x29, 0xc6, 0x93, 0xa3, 0x11, 0x3f, 0x99, 0xe1, 0x1f, 0xac, 0xae,
+	0xa5, 0x70, 0xfc, 0x48, 0x0e, 0x8e, 0x71, 0xf4, 0xf1, 0xff, 0x38, 0x06, 0x32, 0x26, 0x10, 0x5a,
+	0xaa, 0x05, 0xb7, 0x74, 0xdd, 0xf0, 0xe4, 0xda, 0xe8, 0x5b, 0xcc, 0x7c, 0x2b, 0xa5, 0x1a, 0xe7,
+	0xda, 0xa3, 0xc9, 0xc7, 0x6d, 0x96, 0xc3, 0xc7, 0xbb, 0xcb, 0xf7, 0xaa, 0xab, 0x0d, 0xaa, 0x54,
+	0x8b, 0x67, 0x37, 0xb4, 0x6c, 0x0e, 0x4e, 0x0c, 0xfe, 0x3a, 0x5b, 0xef, 0xb7, 0xd5, 0x77, 0x00,
+	0x97, 0x95, 0x6a, 0xd1, 0x3f, 0x17, 0xbc, 0xba, 0x7b, 0x38, 0xe2, 0x72, 0x08, 0x7c, 0x19, 0x7d,
+	0x7a, 0xeb, 0xbd, 0x42, 0x0d, 0xfd, 0x91, 0xd2, 0x02, 0x0b, 0x2e, 0xc7, 0xdf, 0xc1, 0xbb, 0x94,
+	0x7f, 0x79, 0x76, 0xaf, 0x82, 0xfa, 0x01, 0x8e, 0x2e, 0xb2, 0xec, 0x27, 0x38, 0xbb, 0x70, 0x2d,
+	0x33, 0x66, 0x90, 0x93, 0x83, 0x2a, 0x52, 0x94, 0x4f, 0xe4, 0xaf, 0x89, 0x29, 0x33, 0x66, 0xca,
+	0xc0, 0x94, 0x45, 0x5a, 0x06, 0x66, 0x0b, 0x96, 0xae, 0x40, 0x48, 0xc6, 0x0c, 0x21, 0x81, 0x22,
+	0xa4, 0x48, 0x09, 0x09, 0xdc, 0xfa, 0xfa, 0x18, 0x36, 0xfd, 0x13, 0x00, 0x00, 0xff, 0xff, 0xd0,
+	0xc3, 0x88, 0x06, 0x22, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/location_view.pb.go b/googleapis/ads/googleads/v3/resources/location_view.pb.go
new file mode 100644
index 0000000..71d26b7
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/location_view.pb.go
@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/location_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A location view summarizes the performance of campaigns by
+// Location criteria.
+type LocationView struct {
+	// The resource name of the location view.
+	// Location view resource names have the form:
+	//
+	// `customers/{customer_id}/locationViews/{campaign_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LocationView) Reset()         { *m = LocationView{} }
+func (m *LocationView) String() string { return proto.CompactTextString(m) }
+func (*LocationView) ProtoMessage()    {}
+func (*LocationView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8294fbe2fa5282fe, []int{0}
+}
+
+func (m *LocationView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LocationView.Unmarshal(m, b)
+}
+func (m *LocationView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LocationView.Marshal(b, m, deterministic)
+}
+func (m *LocationView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LocationView.Merge(m, src)
+}
+func (m *LocationView) XXX_Size() int {
+	return xxx_messageInfo_LocationView.Size(m)
+}
+func (m *LocationView) XXX_DiscardUnknown() {
+	xxx_messageInfo_LocationView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LocationView proto.InternalMessageInfo
+
+func (m *LocationView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*LocationView)(nil), "google.ads.googleads.v3.resources.LocationView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/location_view.proto", fileDescriptor_8294fbe2fa5282fe)
+}
+
+var fileDescriptor_8294fbe2fa5282fe = []byte{
+	// 313 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x41, 0x4a, 0xc3, 0x40,
+	0x14, 0x86, 0x49, 0x05, 0xc1, 0x50, 0x17, 0x76, 0xa5, 0xc5, 0x85, 0x55, 0x0a, 0xae, 0x66, 0xc0,
+	0xc1, 0xcd, 0xb8, 0x9a, 0x6e, 0x0a, 0x22, 0x52, 0xba, 0xc8, 0x42, 0x83, 0x65, 0x4c, 0x86, 0x21,
+	0xd0, 0xcc, 0x2b, 0x79, 0x69, 0xba, 0x28, 0x3d, 0x85, 0x37, 0x70, 0xe9, 0x51, 0x3c, 0x4a, 0x0f,
+	0x21, 0x92, 0x4c, 0x66, 0xda, 0x6e, 0x74, 0xf7, 0x33, 0xef, 0xfb, 0xff, 0xf7, 0x7e, 0x26, 0xbc,
+	0xd7, 0x00, 0x7a, 0xae, 0xa8, 0x4c, 0x91, 0x5a, 0x59, 0xab, 0x8a, 0xd1, 0x42, 0x21, 0x2c, 0x8b,
+	0x44, 0x21, 0x9d, 0x43, 0x22, 0xcb, 0x0c, 0xcc, 0xac, 0xca, 0xd4, 0x8a, 0x2c, 0x0a, 0x28, 0xa1,
+	0x37, 0xb0, 0x2c, 0x91, 0x29, 0x12, 0x6f, 0x23, 0x15, 0x23, 0xde, 0xd6, 0xbf, 0x70, 0xc9, 0x8b,
+	0xcc, 0x87, 0x59, 0x77, 0xff, 0x72, 0x6f, 0x24, 0x8d, 0x81, 0xb2, 0xc9, 0x47, 0x3b, 0xbd, 0xfe,
+	0x08, 0xc2, 0xee, 0x53, 0xbb, 0x33, 0xca, 0xd4, 0xaa, 0x77, 0x13, 0x9e, 0xba, 0x80, 0x99, 0x91,
+	0xb9, 0x3a, 0x0f, 0xae, 0x82, 0xdb, 0x93, 0x69, 0xd7, 0x3d, 0x3e, 0xcb, 0x5c, 0xf1, 0xb7, 0xad,
+	0x78, 0x0d, 0x87, 0xbb, 0x5b, 0x5a, 0xb5, 0xc8, 0x90, 0x24, 0x90, 0xd3, 0x83, 0xc0, 0xbb, 0x64,
+	0x89, 0x25, 0xe4, 0xaa, 0x40, 0xba, 0x76, 0x72, 0xe3, 0x7b, 0xd6, 0x08, 0xd2, 0xf5, 0x41, 0xed,
+	0xcd, 0xe8, 0x27, 0x08, 0x87, 0x09, 0xe4, 0xe4, 0xdf, 0xe2, 0xa3, 0xb3, 0xfd, 0x5d, 0x93, 0xba,
+	0xd2, 0x24, 0x78, 0x79, 0x6c, 0x7d, 0x1a, 0xe6, 0xd2, 0x68, 0x02, 0x85, 0xa6, 0x5a, 0x99, 0xa6,
+	0x30, 0xdd, 0x9d, 0xfa, 0xc7, 0x37, 0x3c, 0x78, 0xf5, 0xd9, 0x39, 0x1a, 0x0b, 0xf1, 0xd5, 0x19,
+	0x8c, 0x6d, 0xa4, 0x48, 0x91, 0x58, 0x59, 0xab, 0x88, 0x91, 0xa9, 0x23, 0xbf, 0x1d, 0x13, 0x8b,
+	0x14, 0x63, 0xcf, 0xc4, 0x11, 0x8b, 0x3d, 0xb3, 0xed, 0x0c, 0xed, 0x80, 0x73, 0x91, 0x22, 0xe7,
+	0x9e, 0xe2, 0x3c, 0x62, 0x9c, 0x7b, 0xee, 0xfd, 0xb8, 0x39, 0x96, 0xfd, 0x06, 0x00, 0x00, 0xff,
+	0xff, 0x7b, 0x0a, 0xb2, 0x64, 0x32, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/managed_placement_view.pb.go b/googleapis/ads/googleads/v3/resources/managed_placement_view.pb.go
new file mode 100644
index 0000000..c94d901
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/managed_placement_view.pb.go
@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/managed_placement_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A managed placement view.
+type ManagedPlacementView struct {
+	// The resource name of the Managed Placement view.
+	// Managed placement view resource names have the form:
+	//
+	// `customers/{customer_id}/managedPlacementViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ManagedPlacementView) Reset()         { *m = ManagedPlacementView{} }
+func (m *ManagedPlacementView) String() string { return proto.CompactTextString(m) }
+func (*ManagedPlacementView) ProtoMessage()    {}
+func (*ManagedPlacementView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e3083284e69e9877, []int{0}
+}
+
+func (m *ManagedPlacementView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ManagedPlacementView.Unmarshal(m, b)
+}
+func (m *ManagedPlacementView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ManagedPlacementView.Marshal(b, m, deterministic)
+}
+func (m *ManagedPlacementView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ManagedPlacementView.Merge(m, src)
+}
+func (m *ManagedPlacementView) XXX_Size() int {
+	return xxx_messageInfo_ManagedPlacementView.Size(m)
+}
+func (m *ManagedPlacementView) XXX_DiscardUnknown() {
+	xxx_messageInfo_ManagedPlacementView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ManagedPlacementView proto.InternalMessageInfo
+
+func (m *ManagedPlacementView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ManagedPlacementView)(nil), "google.ads.googleads.v3.resources.ManagedPlacementView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/managed_placement_view.proto", fileDescriptor_e3083284e69e9877)
+}
+
+var fileDescriptor_e3083284e69e9877 = []byte{
+	// 327 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0xf3, 0x40,
+	0x14, 0x85, 0x49, 0x7e, 0xf8, 0xc1, 0xa0, 0x9b, 0xe2, 0xc2, 0x16, 0x17, 0x56, 0x29, 0xb8, 0x71,
+	0x66, 0x91, 0xdd, 0x08, 0x42, 0xea, 0xa2, 0x20, 0x28, 0xa5, 0x8b, 0x2c, 0x24, 0x50, 0xc6, 0xe4,
+	0x32, 0x04, 0x3a, 0x73, 0x43, 0x6e, 0xda, 0x2e, 0x4a, 0xb7, 0x3e, 0x88, 0x4b, 0xd7, 0x3e, 0x85,
+	0x8f, 0xd2, 0xa7, 0x90, 0x76, 0x3a, 0x53, 0x85, 0xa0, 0xbb, 0x43, 0xee, 0x77, 0xce, 0xbd, 0x73,
+	0x12, 0xdd, 0x29, 0x44, 0x35, 0x03, 0x2e, 0x0b, 0xe2, 0x56, 0x6e, 0xd5, 0x22, 0xe6, 0x35, 0x10,
+	0xce, 0xeb, 0x1c, 0x88, 0x6b, 0x69, 0xa4, 0x82, 0x62, 0x5a, 0xcd, 0x64, 0x0e, 0x1a, 0x4c, 0x33,
+	0x5d, 0x94, 0xb0, 0x64, 0x55, 0x8d, 0x0d, 0x76, 0xfa, 0xd6, 0xc4, 0x64, 0x41, 0xcc, 0xfb, 0xd9,
+	0x22, 0x66, 0xde, 0xdf, 0xeb, 0xba, 0x15, 0x55, 0xe9, 0x53, 0xad, 0xbb, 0x77, 0xfe, 0x6d, 0x24,
+	0x8d, 0xc1, 0x46, 0x36, 0x25, 0x1a, 0xb2, 0xd3, 0xcb, 0x8f, 0x20, 0x3a, 0x7d, 0xb4, 0xcb, 0xc7,
+	0x6e, 0x77, 0x5a, 0xc2, 0xb2, 0x73, 0x15, 0x9d, 0xb8, 0xa0, 0xa9, 0x91, 0x1a, 0xce, 0x82, 0x8b,
+	0xe0, 0xfa, 0x68, 0x72, 0xec, 0x3e, 0x3e, 0x49, 0x0d, 0x62, 0xb9, 0x49, 0x9a, 0xe8, 0xe6, 0x70,
+	0xd3, 0x5e, 0x55, 0x25, 0xb1, 0x1c, 0x35, 0x6f, 0x0d, 0xbe, 0xcf, 0xe7, 0xd4, 0xa0, 0x86, 0x9a,
+	0xf8, 0xca, 0xc9, 0xb5, 0x2b, 0xe0, 0x07, 0x4a, 0x7c, 0xd5, 0xde, 0xcb, 0x7a, 0xf8, 0x1a, 0x46,
+	0x83, 0x1c, 0x35, 0xfb, 0xb3, 0x99, 0x61, 0xb7, 0xed, 0x88, 0xf1, 0xf6, 0xed, 0xe3, 0xe0, 0xf9,
+	0x61, 0xef, 0x57, 0x38, 0x93, 0x46, 0x31, 0xac, 0x15, 0x57, 0x60, 0x76, 0xcd, 0xf0, 0xc3, 0x5b,
+	0x7e, 0xf9, 0x71, 0xb7, 0x5e, 0xbd, 0x85, 0xff, 0x46, 0x49, 0xf2, 0x1e, 0xf6, 0x47, 0x36, 0x32,
+	0x29, 0x88, 0x59, 0xb9, 0x55, 0x69, 0xcc, 0x26, 0x8e, 0xfc, 0x74, 0x4c, 0x96, 0x14, 0x94, 0x79,
+	0x26, 0x4b, 0xe3, 0xcc, 0x33, 0x9b, 0x70, 0x60, 0x07, 0x42, 0x24, 0x05, 0x09, 0xe1, 0x29, 0x21,
+	0xd2, 0x58, 0x08, 0xcf, 0xbd, 0xfc, 0xdf, 0x1d, 0x1b, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb1,
+	0x9e, 0x8d, 0xf0, 0x64, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/media_file.pb.go b/googleapis/ads/googleads/v3/resources/media_file.pb.go
new file mode 100644
index 0000000..3d2428f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/media_file.pb.go
@@ -0,0 +1,462 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/media_file.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A media file.
+type MediaFile struct {
+	// The resource name of the media file.
+	// Media file resource names have the form:
+	//
+	// `customers/{customer_id}/mediaFiles/{media_file_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the media file.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// Type of the media file.
+	Type enums.MediaTypeEnum_MediaType `protobuf:"varint,5,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.MediaTypeEnum_MediaType" json:"type,omitempty"`
+	// The mime type of the media file.
+	MimeType enums.MimeTypeEnum_MimeType `protobuf:"varint,6,opt,name=mime_type,json=mimeType,proto3,enum=google.ads.googleads.v3.enums.MimeTypeEnum_MimeType" json:"mime_type,omitempty"`
+	// The URL of where the original media file was downloaded from (or a file
+	// name). Only used for media of type AUDIO and IMAGE.
+	SourceUrl *wrappers.StringValue `protobuf:"bytes,7,opt,name=source_url,json=sourceUrl,proto3" json:"source_url,omitempty"`
+	// The name of the media file. The name can be used by clients to help
+	// identify previously uploaded media.
+	Name *wrappers.StringValue `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"`
+	// The size of the media file in bytes.
+	FileSize *wrappers.Int64Value `protobuf:"bytes,9,opt,name=file_size,json=fileSize,proto3" json:"file_size,omitempty"`
+	// The specific type of the media file.
+	//
+	// Types that are valid to be assigned to Mediatype:
+	//	*MediaFile_Image
+	//	*MediaFile_MediaBundle
+	//	*MediaFile_Audio
+	//	*MediaFile_Video
+	Mediatype            isMediaFile_Mediatype `protobuf_oneof:"mediatype"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *MediaFile) Reset()         { *m = MediaFile{} }
+func (m *MediaFile) String() string { return proto.CompactTextString(m) }
+func (*MediaFile) ProtoMessage()    {}
+func (*MediaFile) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f6bdb14f7d0436d6, []int{0}
+}
+
+func (m *MediaFile) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaFile.Unmarshal(m, b)
+}
+func (m *MediaFile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaFile.Marshal(b, m, deterministic)
+}
+func (m *MediaFile) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaFile.Merge(m, src)
+}
+func (m *MediaFile) XXX_Size() int {
+	return xxx_messageInfo_MediaFile.Size(m)
+}
+func (m *MediaFile) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaFile.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaFile proto.InternalMessageInfo
+
+func (m *MediaFile) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *MediaFile) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *MediaFile) GetType() enums.MediaTypeEnum_MediaType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.MediaTypeEnum_UNSPECIFIED
+}
+
+func (m *MediaFile) GetMimeType() enums.MimeTypeEnum_MimeType {
+	if m != nil {
+		return m.MimeType
+	}
+	return enums.MimeTypeEnum_UNSPECIFIED
+}
+
+func (m *MediaFile) GetSourceUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.SourceUrl
+	}
+	return nil
+}
+
+func (m *MediaFile) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *MediaFile) GetFileSize() *wrappers.Int64Value {
+	if m != nil {
+		return m.FileSize
+	}
+	return nil
+}
+
+type isMediaFile_Mediatype interface {
+	isMediaFile_Mediatype()
+}
+
+type MediaFile_Image struct {
+	Image *MediaImage `protobuf:"bytes,3,opt,name=image,proto3,oneof"`
+}
+
+type MediaFile_MediaBundle struct {
+	MediaBundle *MediaBundle `protobuf:"bytes,4,opt,name=media_bundle,json=mediaBundle,proto3,oneof"`
+}
+
+type MediaFile_Audio struct {
+	Audio *MediaAudio `protobuf:"bytes,10,opt,name=audio,proto3,oneof"`
+}
+
+type MediaFile_Video struct {
+	Video *MediaVideo `protobuf:"bytes,11,opt,name=video,proto3,oneof"`
+}
+
+func (*MediaFile_Image) isMediaFile_Mediatype() {}
+
+func (*MediaFile_MediaBundle) isMediaFile_Mediatype() {}
+
+func (*MediaFile_Audio) isMediaFile_Mediatype() {}
+
+func (*MediaFile_Video) isMediaFile_Mediatype() {}
+
+func (m *MediaFile) GetMediatype() isMediaFile_Mediatype {
+	if m != nil {
+		return m.Mediatype
+	}
+	return nil
+}
+
+func (m *MediaFile) GetImage() *MediaImage {
+	if x, ok := m.GetMediatype().(*MediaFile_Image); ok {
+		return x.Image
+	}
+	return nil
+}
+
+func (m *MediaFile) GetMediaBundle() *MediaBundle {
+	if x, ok := m.GetMediatype().(*MediaFile_MediaBundle); ok {
+		return x.MediaBundle
+	}
+	return nil
+}
+
+func (m *MediaFile) GetAudio() *MediaAudio {
+	if x, ok := m.GetMediatype().(*MediaFile_Audio); ok {
+		return x.Audio
+	}
+	return nil
+}
+
+func (m *MediaFile) GetVideo() *MediaVideo {
+	if x, ok := m.GetMediatype().(*MediaFile_Video); ok {
+		return x.Video
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*MediaFile) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*MediaFile_Image)(nil),
+		(*MediaFile_MediaBundle)(nil),
+		(*MediaFile_Audio)(nil),
+		(*MediaFile_Video)(nil),
+	}
+}
+
+// Encapsulates an Image.
+type MediaImage struct {
+	// Raw image data.
+	Data                 *wrappers.BytesValue `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *MediaImage) Reset()         { *m = MediaImage{} }
+func (m *MediaImage) String() string { return proto.CompactTextString(m) }
+func (*MediaImage) ProtoMessage()    {}
+func (*MediaImage) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f6bdb14f7d0436d6, []int{1}
+}
+
+func (m *MediaImage) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaImage.Unmarshal(m, b)
+}
+func (m *MediaImage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaImage.Marshal(b, m, deterministic)
+}
+func (m *MediaImage) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaImage.Merge(m, src)
+}
+func (m *MediaImage) XXX_Size() int {
+	return xxx_messageInfo_MediaImage.Size(m)
+}
+func (m *MediaImage) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaImage.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaImage proto.InternalMessageInfo
+
+func (m *MediaImage) GetData() *wrappers.BytesValue {
+	if m != nil {
+		return m.Data
+	}
+	return nil
+}
+
+// Represents a ZIP archive media the content of which contains HTML5 assets.
+type MediaBundle struct {
+	// Raw zipped data.
+	Data                 *wrappers.BytesValue `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *MediaBundle) Reset()         { *m = MediaBundle{} }
+func (m *MediaBundle) String() string { return proto.CompactTextString(m) }
+func (*MediaBundle) ProtoMessage()    {}
+func (*MediaBundle) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f6bdb14f7d0436d6, []int{2}
+}
+
+func (m *MediaBundle) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaBundle.Unmarshal(m, b)
+}
+func (m *MediaBundle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaBundle.Marshal(b, m, deterministic)
+}
+func (m *MediaBundle) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaBundle.Merge(m, src)
+}
+func (m *MediaBundle) XXX_Size() int {
+	return xxx_messageInfo_MediaBundle.Size(m)
+}
+func (m *MediaBundle) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaBundle.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaBundle proto.InternalMessageInfo
+
+func (m *MediaBundle) GetData() *wrappers.BytesValue {
+	if m != nil {
+		return m.Data
+	}
+	return nil
+}
+
+// Encapsulates an Audio.
+type MediaAudio struct {
+	// The duration of the Audio in milliseconds.
+	AdDurationMillis     *wrappers.Int64Value `protobuf:"bytes,1,opt,name=ad_duration_millis,json=adDurationMillis,proto3" json:"ad_duration_millis,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *MediaAudio) Reset()         { *m = MediaAudio{} }
+func (m *MediaAudio) String() string { return proto.CompactTextString(m) }
+func (*MediaAudio) ProtoMessage()    {}
+func (*MediaAudio) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f6bdb14f7d0436d6, []int{3}
+}
+
+func (m *MediaAudio) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaAudio.Unmarshal(m, b)
+}
+func (m *MediaAudio) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaAudio.Marshal(b, m, deterministic)
+}
+func (m *MediaAudio) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaAudio.Merge(m, src)
+}
+func (m *MediaAudio) XXX_Size() int {
+	return xxx_messageInfo_MediaAudio.Size(m)
+}
+func (m *MediaAudio) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaAudio.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaAudio proto.InternalMessageInfo
+
+func (m *MediaAudio) GetAdDurationMillis() *wrappers.Int64Value {
+	if m != nil {
+		return m.AdDurationMillis
+	}
+	return nil
+}
+
+// Encapsulates a Video.
+type MediaVideo struct {
+	// The duration of the Video in milliseconds.
+	AdDurationMillis *wrappers.Int64Value `protobuf:"bytes,1,opt,name=ad_duration_millis,json=adDurationMillis,proto3" json:"ad_duration_millis,omitempty"`
+	// The YouTube video ID (as seen in YouTube URLs).
+	YoutubeVideoId *wrappers.StringValue `protobuf:"bytes,2,opt,name=youtube_video_id,json=youtubeVideoId,proto3" json:"youtube_video_id,omitempty"`
+	// The Advertising Digital Identification code for this video, as defined by
+	// the American Association of Advertising Agencies, used mainly for
+	// television commercials.
+	AdvertisingIdCode *wrappers.StringValue `protobuf:"bytes,3,opt,name=advertising_id_code,json=advertisingIdCode,proto3" json:"advertising_id_code,omitempty"`
+	// The Industry Standard Commercial Identifier code for this video, used
+	// mainly for television commercials.
+	IsciCode             *wrappers.StringValue `protobuf:"bytes,4,opt,name=isci_code,json=isciCode,proto3" json:"isci_code,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *MediaVideo) Reset()         { *m = MediaVideo{} }
+func (m *MediaVideo) String() string { return proto.CompactTextString(m) }
+func (*MediaVideo) ProtoMessage()    {}
+func (*MediaVideo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f6bdb14f7d0436d6, []int{4}
+}
+
+func (m *MediaVideo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaVideo.Unmarshal(m, b)
+}
+func (m *MediaVideo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaVideo.Marshal(b, m, deterministic)
+}
+func (m *MediaVideo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaVideo.Merge(m, src)
+}
+func (m *MediaVideo) XXX_Size() int {
+	return xxx_messageInfo_MediaVideo.Size(m)
+}
+func (m *MediaVideo) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaVideo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaVideo proto.InternalMessageInfo
+
+func (m *MediaVideo) GetAdDurationMillis() *wrappers.Int64Value {
+	if m != nil {
+		return m.AdDurationMillis
+	}
+	return nil
+}
+
+func (m *MediaVideo) GetYoutubeVideoId() *wrappers.StringValue {
+	if m != nil {
+		return m.YoutubeVideoId
+	}
+	return nil
+}
+
+func (m *MediaVideo) GetAdvertisingIdCode() *wrappers.StringValue {
+	if m != nil {
+		return m.AdvertisingIdCode
+	}
+	return nil
+}
+
+func (m *MediaVideo) GetIsciCode() *wrappers.StringValue {
+	if m != nil {
+		return m.IsciCode
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*MediaFile)(nil), "google.ads.googleads.v3.resources.MediaFile")
+	proto.RegisterType((*MediaImage)(nil), "google.ads.googleads.v3.resources.MediaImage")
+	proto.RegisterType((*MediaBundle)(nil), "google.ads.googleads.v3.resources.MediaBundle")
+	proto.RegisterType((*MediaAudio)(nil), "google.ads.googleads.v3.resources.MediaAudio")
+	proto.RegisterType((*MediaVideo)(nil), "google.ads.googleads.v3.resources.MediaVideo")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/media_file.proto", fileDescriptor_f6bdb14f7d0436d6)
+}
+
+var fileDescriptor_f6bdb14f7d0436d6 = []byte{
+	// 729 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0x5f, 0x6b, 0xdb, 0x3c,
+	0x14, 0xc6, 0x9b, 0x34, 0xed, 0x1b, 0x2b, 0x7d, 0x4b, 0x5f, 0xbd, 0x37, 0x5e, 0x57, 0x46, 0x9b,
+	0x51, 0x28, 0x6c, 0x95, 0x47, 0x53, 0xca, 0xe6, 0xb2, 0x41, 0xb2, 0xf5, 0x4f, 0xca, 0x3a, 0x3a,
+	0x77, 0xcd, 0x60, 0x04, 0x8c, 0x12, 0xa9, 0x46, 0x60, 0x5b, 0xc6, 0xb2, 0x33, 0xd2, 0xd2, 0x2f,
+	0xb3, 0xab, 0xb1, 0xdb, 0x7d, 0x8b, 0x7d, 0x94, 0x7e, 0x85, 0xdd, 0x0c, 0xc9, 0xb2, 0x1d, 0xd8,
+	0xda, 0xb4, 0xb0, 0xbb, 0xa3, 0x9c, 0xe7, 0xf9, 0xf9, 0x9c, 0xe3, 0x23, 0x07, 0x6c, 0x79, 0x9c,
+	0x7b, 0x3e, 0xb5, 0x30, 0x11, 0x56, 0x16, 0xca, 0x68, 0xd4, 0xb2, 0x62, 0x2a, 0x78, 0x1a, 0x0f,
+	0xa9, 0xb0, 0x02, 0x4a, 0x18, 0x76, 0xcf, 0x99, 0x4f, 0x51, 0x14, 0xf3, 0x84, 0xc3, 0xb5, 0x4c,
+	0x88, 0x30, 0x11, 0xa8, 0xf0, 0xa0, 0x51, 0x0b, 0x15, 0x9e, 0x65, 0x74, 0x13, 0x96, 0x86, 0x69,
+	0x90, 0x23, 0x93, 0x71, 0xa4, 0x91, 0xcb, 0x9b, 0x53, 0xf4, 0x2c, 0xa0, 0x93, 0xf2, 0x07, 0xb9,
+	0x3c, 0x62, 0x45, 0xa1, 0x3a, 0xf5, 0x48, 0xa7, 0xd4, 0x69, 0x90, 0x9e, 0x5b, 0x9f, 0x63, 0x1c,
+	0x45, 0x34, 0x16, 0x3a, 0xbf, 0x32, 0x61, 0xc5, 0x61, 0xc8, 0x13, 0x9c, 0x30, 0x1e, 0xea, 0x6c,
+	0xf3, 0xfb, 0x3c, 0x30, 0x8e, 0x65, 0x71, 0xfb, 0xcc, 0xa7, 0xf0, 0x31, 0xf8, 0x37, 0xa7, 0xbb,
+	0x21, 0x0e, 0xa8, 0x59, 0x59, 0xad, 0x6c, 0x18, 0xce, 0x42, 0xfe, 0xe3, 0x3b, 0x1c, 0x50, 0xf8,
+	0x04, 0x54, 0x19, 0x31, 0xab, 0xab, 0x95, 0x8d, 0xc6, 0xd6, 0x43, 0xdd, 0x37, 0xca, 0x9f, 0x8e,
+	0xba, 0x61, 0xb2, 0xb3, 0xdd, 0xc3, 0x7e, 0x4a, 0x9d, 0x2a, 0x23, 0xf0, 0x08, 0xd4, 0x64, 0x1b,
+	0xe6, 0xdc, 0x6a, 0x65, 0x63, 0x71, 0x6b, 0x07, 0xdd, 0x34, 0x49, 0xd5, 0x36, 0x52, 0x95, 0x7c,
+	0x18, 0x47, 0x74, 0x2f, 0x4c, 0x83, 0xf2, 0xe4, 0x28, 0x06, 0x7c, 0x0f, 0x8c, 0x62, 0x2e, 0xe6,
+	0xbc, 0x02, 0x6e, 0x4f, 0x03, 0xb2, 0x80, 0x96, 0x3c, 0x7d, 0x70, 0xea, 0x81, 0x8e, 0xe0, 0x2e,
+	0x00, 0xba, 0xdd, 0x34, 0xf6, 0xcd, 0x7f, 0x54, 0x4f, 0x2b, 0xbf, 0xf5, 0x74, 0x9a, 0xc4, 0x2c,
+	0xf4, 0xb2, 0xa6, 0x8c, 0x4c, 0x7f, 0x16, 0xfb, 0xf0, 0x19, 0xa8, 0xa9, 0x21, 0xd5, 0xef, 0x60,
+	0x53, 0x4a, 0xf8, 0x1c, 0x18, 0x72, 0xad, 0x5c, 0xc1, 0x2e, 0xa8, 0x69, 0x4c, 0x9f, 0x60, 0x5d,
+	0xaa, 0x4f, 0xd9, 0x05, 0x85, 0x7b, 0x60, 0x8e, 0x05, 0xd8, 0xa3, 0xe6, 0xac, 0x72, 0x6d, 0xa2,
+	0xa9, 0x2b, 0x99, 0x8d, 0xaf, 0x2b, 0x4d, 0x87, 0x33, 0x4e, 0xe6, 0x86, 0xa7, 0x60, 0x21, 0x5b,
+	0xc5, 0x41, 0x1a, 0x12, 0x9f, 0x9a, 0x35, 0x45, 0x43, 0x77, 0xa5, 0x75, 0x94, 0xeb, 0x70, 0xc6,
+	0x69, 0x04, 0xe5, 0x51, 0xd6, 0x86, 0x53, 0xc2, 0xb8, 0x09, 0xee, 0x57, 0x5b, 0x5b, 0x9a, 0x64,
+	0x6d, 0xca, 0x2d, 0x31, 0x23, 0x46, 0x28, 0x37, 0x1b, 0xf7, 0xc3, 0xf4, 0xa4, 0x49, 0x62, 0x94,
+	0xdb, 0x3e, 0xbb, 0x6e, 0x3b, 0xa0, 0x59, 0x1a, 0x74, 0x14, 0x31, 0x81, 0x86, 0x3c, 0xb0, 0xca,
+	0x65, 0x7f, 0x3a, 0x4c, 0x45, 0xc2, 0x03, 0x1a, 0x0b, 0xeb, 0x32, 0x0f, 0xaf, 0xb2, 0x9b, 0x2a,
+	0xf3, 0xc2, 0xba, 0x2c, 0x3f, 0x04, 0x57, 0x9d, 0x06, 0x30, 0xd4, 0x51, 0x2e, 0x5f, 0xf3, 0x25,
+	0x00, 0xe5, 0x74, 0xa1, 0x05, 0x6a, 0x04, 0x27, 0x58, 0x5d, 0x96, 0x3f, 0xbd, 0xd0, 0xce, 0x38,
+	0xa1, 0x42, 0xaf, 0x81, 0x14, 0x36, 0x5f, 0x81, 0xc6, 0xc4, 0x38, 0xef, 0xef, 0xff, 0xa8, 0x1f,
+	0xaf, 0x06, 0x08, 0xbb, 0x00, 0x62, 0xe2, 0x92, 0x34, 0x56, 0x17, 0xdb, 0x0d, 0x98, 0xef, 0x33,
+	0x71, 0x23, 0x6c, 0x62, 0xbb, 0x96, 0x30, 0x79, 0xa3, 0x5d, 0xc7, 0xca, 0xd4, 0xfc, 0x5a, 0xd5,
+	0x64, 0x35, 0xd3, 0xbf, 0x48, 0x86, 0xfb, 0x60, 0x69, 0xcc, 0xd3, 0x24, 0x1d, 0x50, 0x57, 0xbd,
+	0x26, 0xb7, 0xf8, 0x84, 0xdc, 0x7e, 0x6f, 0x16, 0xb5, 0x4b, 0x15, 0xd4, 0x25, 0xf0, 0x2d, 0xf8,
+	0x1f, 0x93, 0x11, 0x8d, 0x13, 0x26, 0x58, 0xe8, 0xb9, 0x8c, 0xb8, 0x43, 0x4e, 0xf2, 0x5b, 0x71,
+	0x3b, 0xea, 0xbf, 0x09, 0x63, 0x97, 0xbc, 0xe6, 0x84, 0xc2, 0x17, 0xc0, 0x60, 0x62, 0xc8, 0x32,
+	0x46, 0xed, 0x0e, 0x8c, 0xba, 0x94, 0x4b, 0x6b, 0xe7, 0x67, 0x05, 0xac, 0x0f, 0x79, 0x30, 0x7d,
+	0x49, 0x3b, 0x8b, 0xc5, 0xca, 0x9d, 0x48, 0xe4, 0x49, 0xe5, 0xd3, 0x91, 0x36, 0x79, 0xdc, 0xc7,
+	0xa1, 0x87, 0x78, 0xec, 0x59, 0x1e, 0x0d, 0xd5, 0x03, 0xad, 0x72, 0x5d, 0x6f, 0xf9, 0x8b, 0xda,
+	0x2d, 0xa2, 0x2f, 0xd5, 0xd9, 0x83, 0x76, 0xfb, 0x5b, 0x75, 0xed, 0x20, 0x43, 0xb6, 0x89, 0x40,
+	0x59, 0x28, 0xa3, 0x5e, 0x0b, 0x39, 0xb9, 0xf2, 0x47, 0xae, 0xe9, 0xb7, 0x89, 0xe8, 0x17, 0x9a,
+	0x7e, 0xaf, 0xd5, 0x2f, 0x34, 0xd7, 0xd5, 0xf5, 0x2c, 0x61, 0xdb, 0x6d, 0x22, 0x6c, 0xbb, 0x50,
+	0xd9, 0x76, 0xaf, 0x65, 0xdb, 0x85, 0x6e, 0x30, 0xaf, 0x8a, 0x6d, 0xfd, 0x0a, 0x00, 0x00, 0xff,
+	0xff, 0xa4, 0x51, 0x4f, 0x1e, 0x4e, 0x07, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/merchant_center_link.pb.go b/googleapis/ads/googleads/v3/resources/merchant_center_link.pb.go
new file mode 100644
index 0000000..be327ee
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/merchant_center_link.pb.go
@@ -0,0 +1,140 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/merchant_center_link.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A data sharing connection, proposed or in use,
+// between a Google Ads Customer and a Merchant Center account.
+type MerchantCenterLink struct {
+	// The resource name of the merchant center link.
+	// Merchant center link resource names have the form:
+	//
+	// `customers/{customer_id}/merchantCenterLinks/{merchant_center_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the Merchant Center account.
+	// This field is readonly.
+	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the Merchant Center account.
+	// This field is readonly.
+	MerchantCenterAccountName *wrappers.StringValue `protobuf:"bytes,4,opt,name=merchant_center_account_name,json=merchantCenterAccountName,proto3" json:"merchant_center_account_name,omitempty"`
+	// The status of the link.
+	Status               enums.MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                    `json:"-"`
+	XXX_unrecognized     []byte                                                      `json:"-"`
+	XXX_sizecache        int32                                                       `json:"-"`
+}
+
+func (m *MerchantCenterLink) Reset()         { *m = MerchantCenterLink{} }
+func (m *MerchantCenterLink) String() string { return proto.CompactTextString(m) }
+func (*MerchantCenterLink) ProtoMessage()    {}
+func (*MerchantCenterLink) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5922ba0a523027c6, []int{0}
+}
+
+func (m *MerchantCenterLink) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MerchantCenterLink.Unmarshal(m, b)
+}
+func (m *MerchantCenterLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MerchantCenterLink.Marshal(b, m, deterministic)
+}
+func (m *MerchantCenterLink) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MerchantCenterLink.Merge(m, src)
+}
+func (m *MerchantCenterLink) XXX_Size() int {
+	return xxx_messageInfo_MerchantCenterLink.Size(m)
+}
+func (m *MerchantCenterLink) XXX_DiscardUnknown() {
+	xxx_messageInfo_MerchantCenterLink.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MerchantCenterLink proto.InternalMessageInfo
+
+func (m *MerchantCenterLink) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *MerchantCenterLink) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *MerchantCenterLink) GetMerchantCenterAccountName() *wrappers.StringValue {
+	if m != nil {
+		return m.MerchantCenterAccountName
+	}
+	return nil
+}
+
+func (m *MerchantCenterLink) GetStatus() enums.MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.MerchantCenterLinkStatusEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*MerchantCenterLink)(nil), "google.ads.googleads.v3.resources.MerchantCenterLink")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/merchant_center_link.proto", fileDescriptor_5922ba0a523027c6)
+}
+
+var fileDescriptor_5922ba0a523027c6 = []byte{
+	// 455 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x4f, 0x6b, 0xd4, 0x40,
+	0x14, 0x27, 0x59, 0x2d, 0x18, 0xff, 0x1c, 0x72, 0x71, 0x5b, 0x17, 0xd9, 0x2a, 0x85, 0x85, 0xc2,
+	0x0c, 0x34, 0xe2, 0x61, 0x14, 0x4a, 0x2a, 0x52, 0x14, 0x95, 0xb2, 0x95, 0x3d, 0xc8, 0xca, 0x32,
+	0x4d, 0xc6, 0x18, 0x9a, 0x79, 0x13, 0x67, 0x26, 0xf5, 0x50, 0x7a, 0xf3, 0x93, 0x78, 0xf0, 0xe0,
+	0x47, 0xf1, 0xa3, 0xf4, 0x53, 0xc8, 0xce, 0xbf, 0xaa, 0xd9, 0xb5, 0xb7, 0x5f, 0xf2, 0x7e, 0x7f,
+	0xde, 0x7b, 0x79, 0x49, 0x9e, 0x57, 0x42, 0x54, 0x0d, 0xc3, 0xb4, 0x54, 0xd8, 0xc2, 0x25, 0x3a,
+	0xcb, 0xb0, 0x64, 0x4a, 0x74, 0xb2, 0x60, 0x0a, 0x73, 0x26, 0x8b, 0xcf, 0x14, 0xf4, 0xa2, 0x60,
+	0xa0, 0x99, 0x5c, 0x34, 0x35, 0x9c, 0xa2, 0x56, 0x0a, 0x2d, 0xd2, 0x6d, 0x2b, 0x41, 0xb4, 0x54,
+	0x28, 0xa8, 0xd1, 0x59, 0x86, 0x82, 0x7a, 0x6b, 0x7f, 0x5d, 0x00, 0x83, 0x8e, 0xaf, 0x36, 0x5f,
+	0x28, 0x4d, 0x75, 0xa7, 0x6c, 0xc6, 0xd6, 0xa6, 0x37, 0x68, 0xeb, 0xd0, 0x94, 0x2b, 0x3d, 0x74,
+	0x25, 0xf3, 0x74, 0xd2, 0x7d, 0xc2, 0x5f, 0x25, 0x6d, 0x5b, 0x26, 0xbd, 0x74, 0xf4, 0x87, 0x94,
+	0x02, 0x08, 0x4d, 0x75, 0x2d, 0xc0, 0x55, 0x1f, 0xfd, 0x18, 0x24, 0xe9, 0x5b, 0x17, 0xff, 0xc2,
+	0xa4, 0xbf, 0xa9, 0xe1, 0x34, 0x7d, 0x9c, 0xdc, 0xf5, 0x31, 0x0b, 0xa0, 0x9c, 0x0d, 0xa3, 0x71,
+	0x34, 0xb9, 0x35, 0xbd, 0xe3, 0x5f, 0xbe, 0xa3, 0x9c, 0xa5, 0xbb, 0x49, 0x5c, 0x97, 0xc3, 0xc1,
+	0x38, 0x9a, 0xdc, 0xde, 0x7b, 0xe0, 0x46, 0x47, 0xbe, 0x0d, 0xf4, 0x0a, 0xf4, 0xd3, 0x27, 0x33,
+	0xda, 0x74, 0x6c, 0x1a, 0xd7, 0x65, 0xfa, 0x31, 0x19, 0xfd, 0x3b, 0x26, 0x2d, 0x0a, 0xd1, 0x81,
+	0xb6, 0x01, 0x37, 0x8c, 0xcd, 0xa8, 0x67, 0x73, 0xac, 0x65, 0x0d, 0x95, 0xf5, 0xd9, 0xe4, 0x7f,
+	0x75, 0x9a, 0x5b, 0xbd, 0xe9, 0xa5, 0x49, 0x36, 0xec, 0xc2, 0x86, 0x37, 0xc7, 0xd1, 0xe4, 0xde,
+	0xde, 0x7b, 0xb4, 0xee, 0xab, 0x98, 0x95, 0xa3, 0xfe, 0xcc, 0xc7, 0x46, 0xfe, 0x12, 0x3a, 0xbe,
+	0xb6, 0x38, 0x75, 0x19, 0xe4, 0xcb, 0x65, 0x0e, 0xc9, 0xee, 0x95, 0xad, 0x43, 0x6d, 0xad, 0x50,
+	0x21, 0x38, 0x5e, 0xb1, 0xd0, 0xfd, 0xa2, 0x53, 0x5a, 0x70, 0x26, 0x15, 0x3e, 0xf7, 0xf0, 0x02,
+	0xf3, 0x1e, 0x51, 0xe1, 0xf3, 0x55, 0xd7, 0x70, 0x71, 0xf0, 0x2d, 0x4e, 0x76, 0x0a, 0xc1, 0xd1,
+	0xb5, 0xc7, 0x76, 0x70, 0xbf, 0x1f, 0x7f, 0xb4, 0xdc, 0xe6, 0x51, 0xf4, 0xe1, 0xb5, 0x53, 0x57,
+	0xa2, 0xa1, 0x50, 0x21, 0x21, 0x2b, 0x5c, 0x31, 0x30, 0xbb, 0xc6, 0x57, 0x33, 0xfc, 0xe7, 0x3f,
+	0x78, 0x16, 0xd0, 0xf7, 0x78, 0x70, 0x98, 0xe7, 0x3f, 0xe3, 0xed, 0x43, 0x6b, 0x99, 0x97, 0x0a,
+	0x59, 0xb8, 0x44, 0xb3, 0x0c, 0x4d, 0x3d, 0xf3, 0x97, 0xe7, 0xcc, 0xf3, 0x52, 0xcd, 0x03, 0x67,
+	0x3e, 0xcb, 0xe6, 0x81, 0x73, 0x19, 0xef, 0xd8, 0x02, 0x21, 0x79, 0xa9, 0x08, 0x09, 0x2c, 0x42,
+	0x66, 0x19, 0x21, 0x81, 0x77, 0xb2, 0x61, 0x9a, 0xcd, 0x7e, 0x07, 0x00, 0x00, 0xff, 0xff, 0x91,
+	0x97, 0x6e, 0x3d, 0xb3, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/mobile_app_category_constant.pb.go b/googleapis/ads/googleads/v3/resources/mobile_app_category_constant.pb.go
new file mode 100644
index 0000000..faacb54
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/mobile_app_category_constant.pb.go
@@ -0,0 +1,123 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/mobile_app_category_constant.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A mobile application category constant.
+type MobileAppCategoryConstant struct {
+	// The resource name of the mobile app category constant.
+	// Mobile app category constant resource names have the form:
+	//
+	// `mobileAppCategoryConstants/{mobile_app_category_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the mobile app category constant.
+	Id *wrappers.Int32Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// Mobile app category name.
+	Name                 *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *MobileAppCategoryConstant) Reset()         { *m = MobileAppCategoryConstant{} }
+func (m *MobileAppCategoryConstant) String() string { return proto.CompactTextString(m) }
+func (*MobileAppCategoryConstant) ProtoMessage()    {}
+func (*MobileAppCategoryConstant) Descriptor() ([]byte, []int) {
+	return fileDescriptor_14ce0b7d234fc1da, []int{0}
+}
+
+func (m *MobileAppCategoryConstant) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MobileAppCategoryConstant.Unmarshal(m, b)
+}
+func (m *MobileAppCategoryConstant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MobileAppCategoryConstant.Marshal(b, m, deterministic)
+}
+func (m *MobileAppCategoryConstant) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MobileAppCategoryConstant.Merge(m, src)
+}
+func (m *MobileAppCategoryConstant) XXX_Size() int {
+	return xxx_messageInfo_MobileAppCategoryConstant.Size(m)
+}
+func (m *MobileAppCategoryConstant) XXX_DiscardUnknown() {
+	xxx_messageInfo_MobileAppCategoryConstant.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MobileAppCategoryConstant proto.InternalMessageInfo
+
+func (m *MobileAppCategoryConstant) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *MobileAppCategoryConstant) GetId() *wrappers.Int32Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *MobileAppCategoryConstant) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*MobileAppCategoryConstant)(nil), "google.ads.googleads.v3.resources.MobileAppCategoryConstant")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/mobile_app_category_constant.proto", fileDescriptor_14ce0b7d234fc1da)
+}
+
+var fileDescriptor_14ce0b7d234fc1da = []byte{
+	// 388 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xc1, 0x6a, 0xdb, 0x30,
+	0x1c, 0xc6, 0xb1, 0x32, 0x06, 0xf3, 0xb6, 0x8b, 0x4f, 0x49, 0x16, 0x42, 0xb2, 0x11, 0x08, 0x0c,
+	0xa4, 0x11, 0x9f, 0xa6, 0x9d, 0x9c, 0x0c, 0xc2, 0x06, 0x1b, 0x21, 0x03, 0x1f, 0x86, 0xc1, 0x28,
+	0xb6, 0x2a, 0x0c, 0xb6, 0x24, 0x24, 0x25, 0xa5, 0x94, 0x3e, 0x41, 0x8f, 0x7d, 0x83, 0x1e, 0xfb,
+	0x28, 0x7d, 0x94, 0x3c, 0x45, 0x89, 0x2d, 0x2b, 0x85, 0x92, 0xf4, 0xf6, 0xd9, 0xdf, 0x4f, 0xdf,
+	0xff, 0xfb, 0x5b, 0xf6, 0x7f, 0x32, 0x21, 0x58, 0x49, 0x11, 0xc9, 0x35, 0x6a, 0xe4, 0x41, 0xed,
+	0x42, 0xa4, 0xa8, 0x16, 0x5b, 0x95, 0x51, 0x8d, 0x2a, 0xb1, 0x29, 0x4a, 0x9a, 0x12, 0x29, 0xd3,
+	0x8c, 0x18, 0xca, 0x84, 0xba, 0x4a, 0x33, 0xc1, 0xb5, 0x21, 0xdc, 0x40, 0xa9, 0x84, 0x11, 0xc1,
+	0xb8, 0x39, 0x0a, 0x49, 0xae, 0xa1, 0x4b, 0x81, 0xbb, 0x10, 0xba, 0x94, 0x7e, 0xaf, 0x1d, 0x24,
+	0x0b, 0x97, 0xdd, 0x9c, 0xee, 0x0f, 0xad, 0x55, 0x3f, 0x6d, 0xb6, 0x17, 0xe8, 0x52, 0x11, 0x29,
+	0xa9, 0xd2, 0xd6, 0x1f, 0x3c, 0x3b, 0x4a, 0x38, 0x17, 0x86, 0x98, 0x42, 0x70, 0xeb, 0x7e, 0xbe,
+	0x03, 0x7e, 0xef, 0x4f, 0x5d, 0x31, 0x92, 0x72, 0x61, 0x0b, 0x2e, 0x6c, 0xbf, 0xe0, 0x8b, 0xff,
+	0xb1, 0x9d, 0x96, 0x72, 0x52, 0xd1, 0xae, 0x37, 0xf2, 0xa6, 0xef, 0xd6, 0x1f, 0xda, 0x97, 0x7f,
+	0x49, 0x45, 0x83, 0xaf, 0x3e, 0x28, 0xf2, 0x2e, 0x18, 0x79, 0xd3, 0xf7, 0xb3, 0x4f, 0x76, 0x01,
+	0xd8, 0xb6, 0x81, 0xbf, 0xb8, 0x09, 0x67, 0x31, 0x29, 0xb7, 0x74, 0x0d, 0x8a, 0x3c, 0xf8, 0xe6,
+	0xbf, 0xa9, 0x83, 0x3a, 0x35, 0x3e, 0x78, 0x81, 0xff, 0x33, 0xaa, 0xe0, 0xac, 0xe1, 0x6b, 0x12,
+	0xab, 0x7d, 0x24, 0xfc, 0xd9, 0xf1, 0xbb, 0x58, 0x25, 0x0b, 0x0d, 0x33, 0x51, 0xa1, 0xd3, 0xe5,
+	0xbf, 0x57, 0xa7, 0x2c, 0x8d, 0xae, 0xcf, 0x5d, 0xcb, 0xcd, 0xfc, 0x16, 0xf8, 0x93, 0x4c, 0x54,
+	0xf0, 0xd5, 0x8b, 0x99, 0x0f, 0x4f, 0xce, 0x5f, 0x1d, 0x56, 0x5a, 0x79, 0xff, 0x7f, 0xdb, 0x10,
+	0x26, 0x4a, 0xc2, 0x19, 0x14, 0x8a, 0x21, 0x46, 0x79, 0xbd, 0x30, 0x3a, 0xee, 0x72, 0xe6, 0x17,
+	0xfa, 0xe1, 0xd4, 0x3d, 0xe8, 0x2c, 0xa3, 0xe8, 0x01, 0x8c, 0x97, 0x4d, 0x64, 0x94, 0x6b, 0xd8,
+	0xc8, 0x83, 0x8a, 0x43, 0xb8, 0x6e, 0xc9, 0xc7, 0x96, 0x49, 0xa2, 0x5c, 0x27, 0x8e, 0x49, 0xe2,
+	0x30, 0x71, 0xcc, 0x1e, 0x4c, 0x1a, 0x03, 0xe3, 0x28, 0xd7, 0x18, 0x3b, 0x0a, 0xe3, 0x38, 0xc4,
+	0xd8, 0x71, 0x9b, 0xb7, 0x75, 0xd9, 0xf0, 0x29, 0x00, 0x00, 0xff, 0xff, 0x84, 0x0f, 0xa0, 0x59,
+	0xee, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/mobile_device_constant.pb.go b/googleapis/ads/googleads/v3/resources/mobile_device_constant.pb.go
new file mode 100644
index 0000000..17ec853
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/mobile_device_constant.pb.go
@@ -0,0 +1,156 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/mobile_device_constant.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A mobile device constant.
+type MobileDeviceConstant struct {
+	// The resource name of the mobile device constant.
+	// Mobile device constant resource names have the form:
+	//
+	// `mobileDeviceConstants/{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the mobile device constant.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the mobile device.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The manufacturer of the mobile device.
+	ManufacturerName *wrappers.StringValue `protobuf:"bytes,4,opt,name=manufacturer_name,json=manufacturerName,proto3" json:"manufacturer_name,omitempty"`
+	// The operating system of the mobile device.
+	OperatingSystemName *wrappers.StringValue `protobuf:"bytes,5,opt,name=operating_system_name,json=operatingSystemName,proto3" json:"operating_system_name,omitempty"`
+	// The type of mobile device.
+	Type                 enums.MobileDeviceTypeEnum_MobileDeviceType `protobuf:"varint,6,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.MobileDeviceTypeEnum_MobileDeviceType" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *MobileDeviceConstant) Reset()         { *m = MobileDeviceConstant{} }
+func (m *MobileDeviceConstant) String() string { return proto.CompactTextString(m) }
+func (*MobileDeviceConstant) ProtoMessage()    {}
+func (*MobileDeviceConstant) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c5b5d0a29b45d355, []int{0}
+}
+
+func (m *MobileDeviceConstant) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MobileDeviceConstant.Unmarshal(m, b)
+}
+func (m *MobileDeviceConstant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MobileDeviceConstant.Marshal(b, m, deterministic)
+}
+func (m *MobileDeviceConstant) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MobileDeviceConstant.Merge(m, src)
+}
+func (m *MobileDeviceConstant) XXX_Size() int {
+	return xxx_messageInfo_MobileDeviceConstant.Size(m)
+}
+func (m *MobileDeviceConstant) XXX_DiscardUnknown() {
+	xxx_messageInfo_MobileDeviceConstant.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MobileDeviceConstant proto.InternalMessageInfo
+
+func (m *MobileDeviceConstant) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *MobileDeviceConstant) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *MobileDeviceConstant) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *MobileDeviceConstant) GetManufacturerName() *wrappers.StringValue {
+	if m != nil {
+		return m.ManufacturerName
+	}
+	return nil
+}
+
+func (m *MobileDeviceConstant) GetOperatingSystemName() *wrappers.StringValue {
+	if m != nil {
+		return m.OperatingSystemName
+	}
+	return nil
+}
+
+func (m *MobileDeviceConstant) GetType() enums.MobileDeviceTypeEnum_MobileDeviceType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.MobileDeviceTypeEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*MobileDeviceConstant)(nil), "google.ads.googleads.v3.resources.MobileDeviceConstant")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/mobile_device_constant.proto", fileDescriptor_c5b5d0a29b45d355)
+}
+
+var fileDescriptor_c5b5d0a29b45d355 = []byte{
+	// 480 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x5d, 0x6b, 0x14, 0x31,
+	0x14, 0x65, 0x66, 0xd7, 0x82, 0xf1, 0x03, 0x1d, 0x15, 0xb6, 0xb5, 0xc8, 0x56, 0x29, 0x2c, 0x88,
+	0x19, 0xe9, 0x48, 0x1f, 0x22, 0x08, 0x53, 0x2b, 0xa5, 0x82, 0xb2, 0x6c, 0x65, 0x11, 0x59, 0x18,
+	0xb2, 0x33, 0xb7, 0x43, 0x60, 0x93, 0x0c, 0x49, 0x66, 0x65, 0x11, 0x5f, 0xfd, 0x21, 0x3e, 0xfa,
+	0x53, 0xfc, 0x29, 0x7d, 0xf7, 0x5d, 0x36, 0x99, 0x49, 0x17, 0xbb, 0xb5, 0x7d, 0x3b, 0x93, 0x7b,
+	0xce, 0xb9, 0x27, 0xf7, 0x66, 0xd0, 0x9b, 0x52, 0xca, 0x72, 0x06, 0x31, 0x2d, 0x74, 0xec, 0xe0,
+	0x12, 0xcd, 0x93, 0x58, 0x81, 0x96, 0xb5, 0xca, 0x41, 0xc7, 0x5c, 0x4e, 0xd9, 0x0c, 0xb2, 0x02,
+	0xe6, 0x2c, 0x87, 0x2c, 0x97, 0x42, 0x1b, 0x2a, 0x0c, 0xae, 0x94, 0x34, 0x32, 0xda, 0x71, 0x22,
+	0x4c, 0x0b, 0x8d, 0xbd, 0x1e, 0xcf, 0x13, 0xec, 0xf5, 0x5b, 0xfb, 0x97, 0xb5, 0x00, 0x51, 0xf3,
+	0x7f, 0xed, 0xcd, 0xa2, 0x02, 0x67, 0xbd, 0xb5, 0xd9, 0xea, 0x2a, 0xe6, 0xd3, 0x34, 0xa5, 0x27,
+	0x4d, 0xc9, 0x7e, 0x4d, 0xeb, 0xd3, 0xf8, 0xab, 0xa2, 0x55, 0x05, 0x4a, 0x37, 0xf5, 0xed, 0x15,
+	0x29, 0x15, 0x42, 0x1a, 0x6a, 0x98, 0x14, 0x4d, 0xf5, 0xe9, 0x9f, 0x0e, 0x7a, 0xf8, 0xc1, 0x76,
+	0x3d, 0xb4, 0x4d, 0xdf, 0x36, 0x57, 0x8a, 0x9e, 0xa1, 0x3b, 0x6d, 0xa3, 0x4c, 0x50, 0x0e, 0xbd,
+	0xa0, 0x1f, 0x0c, 0x6e, 0x8e, 0x6e, 0xb7, 0x87, 0x1f, 0x29, 0x87, 0xe8, 0x39, 0x0a, 0x59, 0xd1,
+	0x0b, 0xfb, 0xc1, 0xe0, 0xd6, 0xde, 0xe3, 0xe6, 0xce, 0xb8, 0x0d, 0x82, 0x8f, 0x85, 0xd9, 0x7f,
+	0x35, 0xa6, 0xb3, 0x1a, 0x46, 0x21, 0x2b, 0xa2, 0x97, 0xa8, 0x6b, 0x8d, 0x3a, 0x96, 0xbe, 0x7d,
+	0x81, 0x7e, 0x62, 0x14, 0x13, 0xa5, 0xe3, 0x5b, 0x66, 0x74, 0x8c, 0xee, 0x73, 0x2a, 0xea, 0x53,
+	0x9a, 0x9b, 0x5a, 0x81, 0x72, 0x39, 0xba, 0xd7, 0x90, 0xdf, 0x5b, 0x95, 0xd9, 0xa4, 0x43, 0xf4,
+	0x48, 0x56, 0xa0, 0xa8, 0x61, 0xa2, 0xcc, 0xf4, 0x42, 0x1b, 0xe0, 0xce, 0xee, 0xc6, 0x35, 0xec,
+	0x1e, 0x78, 0xe9, 0x89, 0x55, 0x5a, 0xc7, 0xcf, 0xa8, 0xbb, 0x5c, 0x50, 0x6f, 0xa3, 0x1f, 0x0c,
+	0xee, 0xee, 0x1d, 0xe2, 0xcb, 0x96, 0x6f, 0x37, 0x8b, 0x57, 0x67, 0xfc, 0x69, 0x51, 0xc1, 0x3b,
+	0x51, 0xf3, 0x0b, 0x87, 0x23, 0xeb, 0x48, 0xa6, 0x67, 0x69, 0x86, 0x5e, 0x9c, 0x9b, 0x34, 0xa8,
+	0x62, 0x1a, 0xe7, 0x92, 0xc7, 0x6b, 0xd7, 0x85, 0xf9, 0x9a, 0x53, 0x1d, 0x7f, 0x5b, 0xff, 0x60,
+	0xbf, 0x1f, 0xfc, 0x08, 0xd1, 0x6e, 0x2e, 0x39, 0xbe, 0xf2, 0xc9, 0x1e, 0x6c, 0xae, 0xeb, 0x37,
+	0x5c, 0x8e, 0x69, 0x18, 0x7c, 0x79, 0xdf, 0xe8, 0x4b, 0x39, 0xa3, 0xa2, 0xc4, 0x52, 0x95, 0x71,
+	0x09, 0xc2, 0x0e, 0x31, 0x3e, 0x8f, 0xfd, 0x9f, 0x3f, 0xea, 0xb5, 0x47, 0x3f, 0xc3, 0xce, 0x51,
+	0x9a, 0xfe, 0x0a, 0x77, 0x8e, 0x9c, 0x65, 0x5a, 0x68, 0xec, 0xe0, 0x12, 0x8d, 0x13, 0x3c, 0x6a,
+	0x99, 0xbf, 0x5b, 0xce, 0x24, 0x2d, 0xf4, 0xc4, 0x73, 0x26, 0xe3, 0x64, 0xe2, 0x39, 0x67, 0xe1,
+	0xae, 0x2b, 0x10, 0x92, 0x16, 0x9a, 0x10, 0xcf, 0x22, 0x64, 0x9c, 0x10, 0xe2, 0x79, 0xd3, 0x0d,
+	0x1b, 0x36, 0xf9, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xba, 0x32, 0x30, 0xd1, 0xfd, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/mutate_job.pb.go b/googleapis/ads/googleads/v3/resources/mutate_job.pb.go
new file mode 100644
index 0000000..84f4886
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/mutate_job.pb.go
@@ -0,0 +1,253 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/mutate_job.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A list of mutates being processed asynchronously. The mutates are uploaded
+// by the user. The mutates themselves aren't readable and the results of the
+// job can only be read using MutateJobService.ListMutateJobResults.
+type MutateJob struct {
+	// The resource name of the mutate job.
+	// Mutate job resource names have the form:
+	//
+	// `customers/{customer_id}/mutateJobs/{mutate_job_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// ID of this mutate job.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The next sequence token to use when adding operations. Only set when the
+	// mutate job status is PENDING.
+	NextAddSequenceToken *wrappers.StringValue `protobuf:"bytes,3,opt,name=next_add_sequence_token,json=nextAddSequenceToken,proto3" json:"next_add_sequence_token,omitempty"`
+	// Contains additional information about this mutate job.
+	Metadata *MutateJob_MutateJobMetadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"`
+	// Status of this mutate job.
+	Status enums.MutateJobStatusEnum_MutateJobStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.MutateJobStatusEnum_MutateJobStatus" json:"status,omitempty"`
+	// The resource name of the long-running operation that can be used to poll
+	// for completion. Only set when the mutate job status is RUNNING or DONE.
+	LongRunningOperation *wrappers.StringValue `protobuf:"bytes,6,opt,name=long_running_operation,json=longRunningOperation,proto3" json:"long_running_operation,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *MutateJob) Reset()         { *m = MutateJob{} }
+func (m *MutateJob) String() string { return proto.CompactTextString(m) }
+func (*MutateJob) ProtoMessage()    {}
+func (*MutateJob) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0931df65c93d4349, []int{0}
+}
+
+func (m *MutateJob) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateJob.Unmarshal(m, b)
+}
+func (m *MutateJob) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateJob.Marshal(b, m, deterministic)
+}
+func (m *MutateJob) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateJob.Merge(m, src)
+}
+func (m *MutateJob) XXX_Size() int {
+	return xxx_messageInfo_MutateJob.Size(m)
+}
+func (m *MutateJob) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateJob.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateJob proto.InternalMessageInfo
+
+func (m *MutateJob) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *MutateJob) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *MutateJob) GetNextAddSequenceToken() *wrappers.StringValue {
+	if m != nil {
+		return m.NextAddSequenceToken
+	}
+	return nil
+}
+
+func (m *MutateJob) GetMetadata() *MutateJob_MutateJobMetadata {
+	if m != nil {
+		return m.Metadata
+	}
+	return nil
+}
+
+func (m *MutateJob) GetStatus() enums.MutateJobStatusEnum_MutateJobStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.MutateJobStatusEnum_UNSPECIFIED
+}
+
+func (m *MutateJob) GetLongRunningOperation() *wrappers.StringValue {
+	if m != nil {
+		return m.LongRunningOperation
+	}
+	return nil
+}
+
+// Additional information about the mutate job. This message is also used as
+// metadata returned in mutate job Long Running Operations.
+type MutateJob_MutateJobMetadata struct {
+	// The time when this mutate job was created.
+	// Formatted as yyyy-mm-dd hh:mm:ss. Example: "2018-03-05 09:15:00"
+	CreationDateTime *wrappers.StringValue `protobuf:"bytes,1,opt,name=creation_date_time,json=creationDateTime,proto3" json:"creation_date_time,omitempty"`
+	// The time when this mutate job was completed.
+	// Formatted as yyyy-MM-dd HH:mm:ss. Example: "2018-03-05 09:16:00"
+	CompletionDateTime *wrappers.StringValue `protobuf:"bytes,2,opt,name=completion_date_time,json=completionDateTime,proto3" json:"completion_date_time,omitempty"`
+	// The fraction (between 0.0 and 1.0) of mutates that have been processed.
+	// This is empty if the job hasn't started running yet.
+	EstimatedCompletionRatio *wrappers.DoubleValue `protobuf:"bytes,3,opt,name=estimated_completion_ratio,json=estimatedCompletionRatio,proto3" json:"estimated_completion_ratio,omitempty"`
+	// The number of mutate operations in the mutate job.
+	OperationCount *wrappers.Int64Value `protobuf:"bytes,4,opt,name=operation_count,json=operationCount,proto3" json:"operation_count,omitempty"`
+	// The number of mutate operations executed by the mutate job.
+	// Present only if the job has started running.
+	ExecutedOperationCount *wrappers.Int64Value `protobuf:"bytes,5,opt,name=executed_operation_count,json=executedOperationCount,proto3" json:"executed_operation_count,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{}             `json:"-"`
+	XXX_unrecognized       []byte               `json:"-"`
+	XXX_sizecache          int32                `json:"-"`
+}
+
+func (m *MutateJob_MutateJobMetadata) Reset()         { *m = MutateJob_MutateJobMetadata{} }
+func (m *MutateJob_MutateJobMetadata) String() string { return proto.CompactTextString(m) }
+func (*MutateJob_MutateJobMetadata) ProtoMessage()    {}
+func (*MutateJob_MutateJobMetadata) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0931df65c93d4349, []int{0, 0}
+}
+
+func (m *MutateJob_MutateJobMetadata) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateJob_MutateJobMetadata.Unmarshal(m, b)
+}
+func (m *MutateJob_MutateJobMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateJob_MutateJobMetadata.Marshal(b, m, deterministic)
+}
+func (m *MutateJob_MutateJobMetadata) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateJob_MutateJobMetadata.Merge(m, src)
+}
+func (m *MutateJob_MutateJobMetadata) XXX_Size() int {
+	return xxx_messageInfo_MutateJob_MutateJobMetadata.Size(m)
+}
+func (m *MutateJob_MutateJobMetadata) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateJob_MutateJobMetadata.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateJob_MutateJobMetadata proto.InternalMessageInfo
+
+func (m *MutateJob_MutateJobMetadata) GetCreationDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.CreationDateTime
+	}
+	return nil
+}
+
+func (m *MutateJob_MutateJobMetadata) GetCompletionDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.CompletionDateTime
+	}
+	return nil
+}
+
+func (m *MutateJob_MutateJobMetadata) GetEstimatedCompletionRatio() *wrappers.DoubleValue {
+	if m != nil {
+		return m.EstimatedCompletionRatio
+	}
+	return nil
+}
+
+func (m *MutateJob_MutateJobMetadata) GetOperationCount() *wrappers.Int64Value {
+	if m != nil {
+		return m.OperationCount
+	}
+	return nil
+}
+
+func (m *MutateJob_MutateJobMetadata) GetExecutedOperationCount() *wrappers.Int64Value {
+	if m != nil {
+		return m.ExecutedOperationCount
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*MutateJob)(nil), "google.ads.googleads.v3.resources.MutateJob")
+	proto.RegisterType((*MutateJob_MutateJobMetadata)(nil), "google.ads.googleads.v3.resources.MutateJob.MutateJobMetadata")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/mutate_job.proto", fileDescriptor_0931df65c93d4349)
+}
+
+var fileDescriptor_0931df65c93d4349 = []byte{
+	// 630 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0xdd, 0x6a, 0xd4, 0x40,
+	0x14, 0x80, 0xd9, 0xd4, 0x56, 0x3b, 0x6a, 0xd5, 0xa1, 0xd4, 0xb8, 0x16, 0x69, 0x2b, 0x85, 0x82,
+	0x32, 0x81, 0xae, 0x7a, 0x11, 0x41, 0x48, 0x5b, 0x29, 0x2e, 0xf4, 0x87, 0x6c, 0xbb, 0x17, 0xcb,
+	0x42, 0x98, 0xcd, 0x1c, 0x43, 0x74, 0x33, 0x13, 0x33, 0x33, 0xb5, 0x50, 0xfa, 0x32, 0x5e, 0x89,
+	0x4f, 0xe1, 0xb5, 0x8f, 0xd2, 0x57, 0xf0, 0x46, 0xf2, 0x37, 0xa9, 0x2d, 0xdb, 0xed, 0xdd, 0xd9,
+	0x9d, 0xf3, 0x7d, 0x73, 0xce, 0xcc, 0xc9, 0xa0, 0xcd, 0x48, 0x88, 0x68, 0x0c, 0x0e, 0x65, 0xd2,
+	0x29, 0xc3, 0x3c, 0x3a, 0xe9, 0x38, 0x19, 0x48, 0xa1, 0xb3, 0x10, 0xa4, 0x93, 0x68, 0x45, 0x15,
+	0x04, 0x5f, 0xc4, 0x88, 0xa4, 0x99, 0x50, 0x02, 0xaf, 0x96, 0x89, 0x84, 0x32, 0x49, 0x0c, 0x43,
+	0x4e, 0x3a, 0xc4, 0x30, 0xed, 0xb7, 0x93, 0xb4, 0xc0, 0x75, 0x72, 0x59, 0x19, 0x48, 0x45, 0x95,
+	0x96, 0xa5, 0xb9, 0xfd, 0xac, 0xc6, 0xd2, 0xd8, 0x14, 0x50, 0x2d, 0xbd, 0xa8, 0x96, 0x8a, 0x5f,
+	0x23, 0xfd, 0xd9, 0xf9, 0x9e, 0xd1, 0x34, 0x85, 0xac, 0x46, 0x97, 0x2f, 0xa1, 0x94, 0x73, 0xa1,
+	0xa8, 0x8a, 0x05, 0xaf, 0x56, 0xd7, 0x7e, 0xdf, 0x45, 0xf3, 0x7b, 0xc5, 0xa6, 0x5d, 0x31, 0xc2,
+	0x2f, 0xd1, 0xc3, 0xda, 0x1e, 0x70, 0x9a, 0x80, 0xdd, 0x5a, 0x69, 0x6d, 0xcc, 0xfb, 0x0f, 0xea,
+	0x3f, 0xf7, 0x69, 0x02, 0xf8, 0x15, 0xb2, 0x62, 0x66, 0x5b, 0x2b, 0xad, 0x8d, 0xfb, 0x9b, 0xcf,
+	0xab, 0x3e, 0x49, 0xbd, 0x3b, 0xf9, 0xc4, 0xd5, 0xbb, 0x37, 0x7d, 0x3a, 0xd6, 0xe0, 0x5b, 0x31,
+	0xc3, 0x3d, 0xf4, 0x94, 0xc3, 0xa9, 0x0a, 0x28, 0x63, 0x81, 0x84, 0x6f, 0x1a, 0x78, 0x08, 0x81,
+	0x12, 0x5f, 0x81, 0xdb, 0x33, 0x85, 0x61, 0xf9, 0x9a, 0xa1, 0xa7, 0xb2, 0x98, 0x47, 0xa5, 0x62,
+	0x31, 0x87, 0x3d, 0xc6, 0x7a, 0x15, 0x7a, 0x94, 0x93, 0x78, 0x80, 0xee, 0x25, 0xa0, 0x28, 0xa3,
+	0x8a, 0xda, 0x77, 0x0a, 0xcb, 0x07, 0x32, 0xf5, 0xe8, 0x89, 0x69, 0xb3, 0x89, 0xf6, 0x2a, 0x8b,
+	0x6f, 0x7c, 0x78, 0x80, 0xe6, 0xca, 0x93, 0xb7, 0x67, 0x57, 0x5a, 0x1b, 0x0b, 0x9b, 0x5b, 0x13,
+	0xcd, 0xc5, 0x8d, 0x35, 0xae, 0x5e, 0x41, 0x7d, 0xe4, 0x3a, 0xb9, 0xfa, 0x9f, 0x5f, 0x19, 0xb1,
+	0x8f, 0x96, 0xc6, 0x82, 0x47, 0x41, 0xa6, 0x39, 0x8f, 0x79, 0x14, 0x88, 0x14, 0xb2, 0xe2, 0x36,
+	0xec, 0xb9, 0xdb, 0x9c, 0x45, 0xce, 0xfa, 0x25, 0x7a, 0x50, 0x93, 0xed, 0x9f, 0x33, 0xe8, 0xc9,
+	0xb5, 0x7e, 0x70, 0x17, 0xe1, 0x30, 0x83, 0x22, 0x23, 0x60, 0xf9, 0x44, 0xa9, 0xb8, 0xba, 0xcd,
+	0x69, 0xbb, 0x3c, 0xae, 0xb9, 0x1d, 0xaa, 0xe0, 0x28, 0x4e, 0x00, 0xef, 0xa3, 0xc5, 0x50, 0x24,
+	0xe9, 0x18, 0xae, 0xd8, 0xac, 0x5b, 0xd8, 0x70, 0x43, 0x1a, 0xdf, 0x00, 0xb5, 0x41, 0xaa, 0x38,
+	0xa1, 0x0a, 0x58, 0x70, 0xc9, 0x5c, 0x34, 0x34, 0x71, 0x2a, 0x76, 0x84, 0x1e, 0x8d, 0xa1, 0xb4,
+	0xda, 0x86, 0xdf, 0x36, 0xb8, 0x9f, 0xd3, 0x78, 0x07, 0x3d, 0x32, 0x87, 0x1a, 0x84, 0x42, 0x73,
+	0x55, 0x0d, 0xc8, 0x8d, 0x83, 0xba, 0x60, 0x98, 0xed, 0x1c, 0xc1, 0xc7, 0xc8, 0x86, 0x53, 0x08,
+	0x75, 0x5e, 0xe0, 0x55, 0xdd, 0xec, 0x74, 0xdd, 0x52, 0x0d, 0x1f, 0xfc, 0xa7, 0x75, 0x8f, 0x2f,
+	0x3c, 0x1f, 0xad, 0x35, 0x33, 0x54, 0x45, 0x69, 0x2c, 0x49, 0x28, 0x12, 0xa7, 0xf9, 0x0c, 0x5f,
+	0x87, 0x5a, 0x2a, 0x91, 0x40, 0x26, 0x9d, 0xb3, 0x3a, 0x3c, 0xaf, 0xde, 0x86, 0xae, 0x18, 0x49,
+	0xe7, 0xac, 0x79, 0x27, 0xce, 0xb7, 0xfe, 0xb6, 0xd0, 0x7a, 0x28, 0x92, 0xe9, 0x5f, 0xc0, 0xd6,
+	0x82, 0xd9, 0xe2, 0x30, 0x2f, 0xfb, 0xb0, 0x35, 0xe8, 0x56, 0x50, 0x24, 0xc6, 0x94, 0x47, 0x44,
+	0x64, 0x91, 0x13, 0x01, 0x2f, 0x9a, 0x72, 0x9a, 0xf2, 0x6e, 0x78, 0x04, 0xdf, 0x9b, 0xe8, 0x87,
+	0x35, 0xb3, 0xeb, 0x79, 0xbf, 0xac, 0xd5, 0xdd, 0x52, 0xe9, 0x31, 0x49, 0xca, 0x30, 0x8f, 0xfa,
+	0x1d, 0xe2, 0xd7, 0x99, 0x7f, 0xea, 0x9c, 0xa1, 0xc7, 0xe4, 0xd0, 0xe4, 0x0c, 0xfb, 0x9d, 0xa1,
+	0xc9, 0xb9, 0xb0, 0xd6, 0xcb, 0x05, 0xd7, 0xf5, 0x98, 0x74, 0x5d, 0x93, 0xe5, 0xba, 0xfd, 0x8e,
+	0xeb, 0x9a, 0xbc, 0xd1, 0x5c, 0x51, 0x6c, 0xe7, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xbf,
+	0xaf, 0xac, 0xb0, 0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/operating_system_version_constant.pb.go b/googleapis/ads/googleads/v3/resources/operating_system_version_constant.pb.go
new file mode 100644
index 0000000..970315c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/operating_system_version_constant.pb.go
@@ -0,0 +1,160 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/operating_system_version_constant.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A mobile operating system version or a range of versions, depending on
+// `operator_type`. List of available mobile platforms at
+// https://developers.google.com/adwords/api/docs/appendix/codes-formats#mobile-platforms
+type OperatingSystemVersionConstant struct {
+	// The resource name of the operating system version constant.
+	// Operating system version constant resource names have the form:
+	//
+	// `operatingSystemVersionConstants/{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the operating system version.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// Name of the operating system.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The OS Major Version number.
+	OsMajorVersion *wrappers.Int32Value `protobuf:"bytes,4,opt,name=os_major_version,json=osMajorVersion,proto3" json:"os_major_version,omitempty"`
+	// The OS Minor Version number.
+	OsMinorVersion *wrappers.Int32Value `protobuf:"bytes,5,opt,name=os_minor_version,json=osMinorVersion,proto3" json:"os_minor_version,omitempty"`
+	// Determines whether this constant represents a single version or a range of
+	// versions.
+	OperatorType         enums.OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType `protobuf:"varint,6,opt,name=operator_type,json=operatorType,proto3,enum=google.ads.googleads.v3.enums.OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType" json:"operator_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                                        `json:"-"`
+	XXX_unrecognized     []byte                                                                          `json:"-"`
+	XXX_sizecache        int32                                                                           `json:"-"`
+}
+
+func (m *OperatingSystemVersionConstant) Reset()         { *m = OperatingSystemVersionConstant{} }
+func (m *OperatingSystemVersionConstant) String() string { return proto.CompactTextString(m) }
+func (*OperatingSystemVersionConstant) ProtoMessage()    {}
+func (*OperatingSystemVersionConstant) Descriptor() ([]byte, []int) {
+	return fileDescriptor_246e8d7d26135833, []int{0}
+}
+
+func (m *OperatingSystemVersionConstant) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OperatingSystemVersionConstant.Unmarshal(m, b)
+}
+func (m *OperatingSystemVersionConstant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OperatingSystemVersionConstant.Marshal(b, m, deterministic)
+}
+func (m *OperatingSystemVersionConstant) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OperatingSystemVersionConstant.Merge(m, src)
+}
+func (m *OperatingSystemVersionConstant) XXX_Size() int {
+	return xxx_messageInfo_OperatingSystemVersionConstant.Size(m)
+}
+func (m *OperatingSystemVersionConstant) XXX_DiscardUnknown() {
+	xxx_messageInfo_OperatingSystemVersionConstant.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OperatingSystemVersionConstant proto.InternalMessageInfo
+
+func (m *OperatingSystemVersionConstant) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *OperatingSystemVersionConstant) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *OperatingSystemVersionConstant) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *OperatingSystemVersionConstant) GetOsMajorVersion() *wrappers.Int32Value {
+	if m != nil {
+		return m.OsMajorVersion
+	}
+	return nil
+}
+
+func (m *OperatingSystemVersionConstant) GetOsMinorVersion() *wrappers.Int32Value {
+	if m != nil {
+		return m.OsMinorVersion
+	}
+	return nil
+}
+
+func (m *OperatingSystemVersionConstant) GetOperatorType() enums.OperatingSystemVersionOperatorTypeEnum_OperatingSystemVersionOperatorType {
+	if m != nil {
+		return m.OperatorType
+	}
+	return enums.OperatingSystemVersionOperatorTypeEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*OperatingSystemVersionConstant)(nil), "google.ads.googleads.v3.resources.OperatingSystemVersionConstant")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/operating_system_version_constant.proto", fileDescriptor_246e8d7d26135833)
+}
+
+var fileDescriptor_246e8d7d26135833 = []byte{
+	// 494 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xdd, 0x6a, 0xd4, 0x40,
+	0x14, 0x26, 0xe9, 0x5a, 0x30, 0xb6, 0x45, 0x72, 0xb5, 0xd6, 0x52, 0xb6, 0x96, 0xc2, 0x82, 0x30,
+	0x23, 0x1b, 0x51, 0x18, 0xaf, 0xd2, 0x52, 0x4a, 0x05, 0x6d, 0xd9, 0x4a, 0x2e, 0x64, 0x21, 0x4c,
+	0x37, 0x63, 0x1c, 0xd9, 0xcc, 0x09, 0x33, 0x93, 0x95, 0x45, 0x14, 0x7c, 0x00, 0xc1, 0x67, 0xf0,
+	0xd2, 0x07, 0xf1, 0xc2, 0x47, 0xe9, 0x53, 0x48, 0x32, 0x33, 0xe9, 0x8a, 0xee, 0xcf, 0xdd, 0x99,
+	0x7c, 0xdf, 0xf9, 0xbe, 0x6f, 0xe6, 0xe4, 0x04, 0xe7, 0x39, 0x40, 0x3e, 0x61, 0x98, 0x66, 0x0a,
+	0x9b, 0xb2, 0xae, 0xa6, 0x11, 0x96, 0x4c, 0x41, 0x25, 0xc7, 0x4c, 0x61, 0x28, 0x99, 0xa4, 0x9a,
+	0x8b, 0x3c, 0x55, 0x33, 0xa5, 0x59, 0x91, 0x4e, 0x99, 0x54, 0x1c, 0x44, 0x3a, 0x06, 0xa1, 0x34,
+	0x15, 0x1a, 0x95, 0x12, 0x34, 0x84, 0x07, 0xa6, 0x1f, 0xd1, 0x4c, 0xa1, 0x56, 0x0a, 0x4d, 0x23,
+	0xd4, 0x4a, 0xed, 0xbe, 0x5c, 0xe4, 0xc6, 0x44, 0x55, 0x2c, 0x71, 0x32, 0x00, 0xc8, 0x54, 0xcf,
+	0x4a, 0x66, 0xec, 0x76, 0x1f, 0x38, 0xad, 0x92, 0xb7, 0x61, 0x2d, 0xb4, 0x6f, 0xa1, 0xe6, 0x74,
+	0x5d, 0xbd, 0xc3, 0x1f, 0x25, 0x2d, 0x4b, 0x26, 0x95, 0xc5, 0xf7, 0xe6, 0x5a, 0xa9, 0x10, 0xa0,
+	0xa9, 0xe6, 0x20, 0x2c, 0xfa, 0xe8, 0x57, 0x27, 0xd8, 0xbf, 0x70, 0x49, 0xae, 0x9a, 0x20, 0x89,
+	0xc9, 0x71, 0x62, 0x2f, 0x1c, 0x1e, 0x06, 0xdb, 0xce, 0x32, 0x15, 0xb4, 0x60, 0x5d, 0xaf, 0xe7,
+	0xf5, 0xef, 0x0e, 0xb7, 0xdc, 0xc7, 0xd7, 0xb4, 0x60, 0xe1, 0xe3, 0xc0, 0xe7, 0x59, 0xd7, 0xef,
+	0x79, 0xfd, 0x7b, 0x83, 0x87, 0xf6, 0x45, 0x90, 0x8b, 0x84, 0xce, 0x85, 0x7e, 0xf6, 0x34, 0xa1,
+	0x93, 0x8a, 0x0d, 0x7d, 0x9e, 0x85, 0x4f, 0x82, 0x4e, 0x23, 0xb4, 0xd1, 0xd0, 0xf7, 0xfe, 0xa1,
+	0x5f, 0x69, 0xc9, 0x45, 0x6e, 0xf8, 0x0d, 0x33, 0x3c, 0x0d, 0xee, 0x83, 0x4a, 0x0b, 0xfa, 0x01,
+	0xa4, 0x7b, 0xa7, 0x6e, 0x67, 0xb1, 0x59, 0x34, 0x30, 0xcd, 0x3b, 0xa0, 0x5e, 0xd5, 0x3d, 0xf6,
+	0x4a, 0x4e, 0x86, 0x8b, 0x39, 0x99, 0x3b, 0xeb, 0xc9, 0xd4, 0x3d, 0x4e, 0xe6, 0x9b, 0x17, 0x6c,
+	0xff, 0x35, 0xa5, 0xee, 0x66, 0xcf, 0xeb, 0xef, 0x0c, 0xde, 0xa3, 0x45, 0x7f, 0x45, 0x33, 0x72,
+	0xf4, 0xff, 0x87, 0xbe, 0xb0, 0x4a, 0x6f, 0x66, 0x25, 0x3b, 0x15, 0x55, 0xb1, 0x06, 0x6d, 0xb8,
+	0x05, 0x73, 0x27, 0xf2, 0xd5, 0xbb, 0x89, 0xbf, 0x04, 0xcf, 0x6f, 0x1d, 0x6d, 0x55, 0x72, 0x85,
+	0xc6, 0x50, 0xe0, 0x15, 0x03, 0x3e, 0x81, 0xa5, 0xb8, 0xc2, 0x9f, 0x56, 0x6e, 0xc5, 0xe7, 0xe3,
+	0xef, 0x7e, 0x70, 0x34, 0x86, 0x02, 0xad, 0xdc, 0x8b, 0xe3, 0xc3, 0xe5, 0x71, 0x2e, 0xeb, 0x01,
+	0x5c, 0x7a, 0x6f, 0xed, 0xfa, 0xa0, 0x1c, 0x26, 0x54, 0xe4, 0x08, 0x64, 0x8e, 0x73, 0x26, 0x9a,
+	0xf1, 0xe0, 0xdb, 0xfb, 0x2d, 0xd9, 0xe5, 0x17, 0x6d, 0xf5, 0xc3, 0xdf, 0x38, 0x8b, 0xe3, 0x9f,
+	0xfe, 0xc1, 0x99, 0x91, 0x8c, 0x33, 0x85, 0x4c, 0x59, 0x57, 0x49, 0x84, 0x86, 0x8e, 0xf9, 0xdb,
+	0x71, 0x46, 0x71, 0xa6, 0x46, 0x2d, 0x67, 0x94, 0x44, 0xa3, 0x96, 0x73, 0xe3, 0x1f, 0x19, 0x80,
+	0x90, 0x38, 0x53, 0x84, 0xb4, 0x2c, 0x42, 0x92, 0x88, 0x90, 0x96, 0x77, 0xbd, 0xd9, 0x84, 0x8d,
+	0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x12, 0x97, 0x8b, 0x9a, 0x77, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/paid_organic_search_term_view.pb.go b/googleapis/ads/googleads/v3/resources/paid_organic_search_term_view.pb.go
new file mode 100644
index 0000000..9585535
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/paid_organic_search_term_view.pb.go
@@ -0,0 +1,116 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/paid_organic_search_term_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A paid organic search term view providing a view of search stats across
+// ads and organic listings aggregated by search term at the ad group level.
+type PaidOrganicSearchTermView struct {
+	// The resource name of the search term view.
+	// Search term view resource names have the form:
+	//
+	// `customers/{customer_id}/paidOrganicSearchTermViews/{campaign_id}~
+	// {ad_group_id}~{URL-base64 search term}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The search term.
+	SearchTerm           *wrappers.StringValue `protobuf:"bytes,2,opt,name=search_term,json=searchTerm,proto3" json:"search_term,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *PaidOrganicSearchTermView) Reset()         { *m = PaidOrganicSearchTermView{} }
+func (m *PaidOrganicSearchTermView) String() string { return proto.CompactTextString(m) }
+func (*PaidOrganicSearchTermView) ProtoMessage()    {}
+func (*PaidOrganicSearchTermView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9878fc316cec3005, []int{0}
+}
+
+func (m *PaidOrganicSearchTermView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PaidOrganicSearchTermView.Unmarshal(m, b)
+}
+func (m *PaidOrganicSearchTermView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PaidOrganicSearchTermView.Marshal(b, m, deterministic)
+}
+func (m *PaidOrganicSearchTermView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PaidOrganicSearchTermView.Merge(m, src)
+}
+func (m *PaidOrganicSearchTermView) XXX_Size() int {
+	return xxx_messageInfo_PaidOrganicSearchTermView.Size(m)
+}
+func (m *PaidOrganicSearchTermView) XXX_DiscardUnknown() {
+	xxx_messageInfo_PaidOrganicSearchTermView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PaidOrganicSearchTermView proto.InternalMessageInfo
+
+func (m *PaidOrganicSearchTermView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *PaidOrganicSearchTermView) GetSearchTerm() *wrappers.StringValue {
+	if m != nil {
+		return m.SearchTerm
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*PaidOrganicSearchTermView)(nil), "google.ads.googleads.v3.resources.PaidOrganicSearchTermView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/paid_organic_search_term_view.proto", fileDescriptor_9878fc316cec3005)
+}
+
+var fileDescriptor_9878fc316cec3005 = []byte{
+	// 387 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x41, 0x6b, 0xfa, 0x30,
+	0x1c, 0xa5, 0xfd, 0xc3, 0x1f, 0xfe, 0xf5, 0xbf, 0x8b, 0x27, 0x15, 0x11, 0xdd, 0x10, 0x3c, 0x25,
+	0x60, 0x6f, 0x19, 0x3b, 0x54, 0x18, 0xc2, 0x0e, 0x53, 0x74, 0xf4, 0x30, 0x0a, 0x25, 0xb6, 0x59,
+	0x16, 0xb0, 0x49, 0x49, 0x5a, 0x3d, 0x88, 0xc7, 0x1d, 0x86, 0xdf, 0x62, 0xc7, 0x7d, 0x94, 0x7d,
+	0x14, 0x3f, 0xc5, 0xb0, 0x6d, 0xa2, 0x87, 0xe9, 0x6e, 0xaf, 0x7d, 0xef, 0xf7, 0x7e, 0xef, 0x25,
+	0x71, 0xee, 0xa9, 0x10, 0x74, 0x49, 0x20, 0x8e, 0x15, 0x2c, 0xe1, 0x01, 0xad, 0x5c, 0x28, 0x89,
+	0x12, 0xb9, 0x8c, 0x88, 0x82, 0x29, 0x66, 0x71, 0x28, 0x24, 0xc5, 0x9c, 0x45, 0xa1, 0x22, 0x58,
+	0x46, 0xaf, 0x61, 0x46, 0x64, 0x12, 0xae, 0x18, 0x59, 0x83, 0x54, 0x8a, 0x4c, 0xd4, 0x7b, 0xe5,
+	0x2c, 0xc0, 0xb1, 0x02, 0xc6, 0x06, 0xac, 0x5c, 0x60, 0x6c, 0x5a, 0x4d, 0xbd, 0x29, 0x65, 0xc6,
+	0xbc, 0x9c, 0x6e, 0x75, 0x2a, 0xaa, 0xf8, 0x5a, 0xe4, 0x2f, 0x70, 0x2d, 0x71, 0x9a, 0x12, 0xa9,
+	0x2a, 0xbe, 0x7d, 0x32, 0x8a, 0x39, 0x17, 0x19, 0xce, 0x98, 0xe0, 0x15, 0x7b, 0xbd, 0xb3, 0x9d,
+	0xe6, 0x14, 0xb3, 0x78, 0x52, 0x46, 0x9c, 0x17, 0x09, 0x9f, 0x88, 0x4c, 0x7c, 0x46, 0xd6, 0xf5,
+	0x1b, 0xe7, 0x4a, 0x6f, 0x0b, 0x39, 0x4e, 0x48, 0xc3, 0xea, 0x5a, 0x83, 0x7f, 0xb3, 0xff, 0xfa,
+	0xe7, 0x23, 0x4e, 0x48, 0xfd, 0xce, 0xa9, 0x9d, 0x14, 0x6b, 0xd8, 0x5d, 0x6b, 0x50, 0x1b, 0xb6,
+	0xab, 0x26, 0x40, 0xc7, 0x02, 0xf3, 0x4c, 0x32, 0x4e, 0x7d, 0xbc, 0xcc, 0xc9, 0xcc, 0x51, 0x66,
+	0x0f, 0x7a, 0xb7, 0xf6, 0xde, 0x9b, 0xe5, 0x0c, 0x8f, 0xcd, 0x2b, 0x94, 0x32, 0x05, 0x22, 0x91,
+	0xc0, 0xf3, 0xf1, 0x26, 0x51, 0xae, 0x32, 0x91, 0x10, 0xa9, 0xe0, 0x46, 0xc3, 0x6d, 0x71, 0xe4,
+	0x3f, 0xea, 0x15, 0xdc, 0x5c, 0xbc, 0x8e, 0xed, 0x68, 0x67, 0x3b, 0xfd, 0x48, 0x24, 0xe0, 0xd7,
+	0x0b, 0x19, 0x75, 0xce, 0xa6, 0x9a, 0x1e, 0x0a, 0x4f, 0xad, 0xe7, 0x87, 0xca, 0x84, 0x8a, 0x25,
+	0xe6, 0x14, 0x08, 0x49, 0x21, 0x25, 0xbc, 0x38, 0x0e, 0x78, 0x6c, 0x78, 0xe1, 0xed, 0xdc, 0x1a,
+	0xf4, 0x61, 0xff, 0x19, 0x7b, 0xde, 0xa7, 0xdd, 0x1b, 0x97, 0x96, 0x5e, 0xac, 0x40, 0x09, 0x0f,
+	0xc8, 0x77, 0xc1, 0x4c, 0x2b, 0xbf, 0xb4, 0x26, 0xf0, 0x62, 0x15, 0x18, 0x4d, 0xe0, 0xbb, 0x81,
+	0xd1, 0xec, 0xed, 0x7e, 0x49, 0x20, 0xe4, 0xc5, 0x0a, 0x21, 0xa3, 0x42, 0xc8, 0x77, 0x11, 0x32,
+	0xba, 0xc5, 0xdf, 0x22, 0xac, 0xfb, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x3e, 0x5c, 0xf8, 0xe7,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/parental_status_view.pb.go b/googleapis/ads/googleads/v3/resources/parental_status_view.pb.go
new file mode 100644
index 0000000..e6998bb
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/parental_status_view.pb.go
@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/parental_status_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A parental status view.
+type ParentalStatusView struct {
+	// The resource name of the parental status view.
+	// Parental Status view resource names have the form:
+	//
+	// `customers/{customer_id}/parentalStatusViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ParentalStatusView) Reset()         { *m = ParentalStatusView{} }
+func (m *ParentalStatusView) String() string { return proto.CompactTextString(m) }
+func (*ParentalStatusView) ProtoMessage()    {}
+func (*ParentalStatusView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_64f32f4c8c47347e, []int{0}
+}
+
+func (m *ParentalStatusView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ParentalStatusView.Unmarshal(m, b)
+}
+func (m *ParentalStatusView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ParentalStatusView.Marshal(b, m, deterministic)
+}
+func (m *ParentalStatusView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ParentalStatusView.Merge(m, src)
+}
+func (m *ParentalStatusView) XXX_Size() int {
+	return xxx_messageInfo_ParentalStatusView.Size(m)
+}
+func (m *ParentalStatusView) XXX_DiscardUnknown() {
+	xxx_messageInfo_ParentalStatusView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ParentalStatusView proto.InternalMessageInfo
+
+func (m *ParentalStatusView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ParentalStatusView)(nil), "google.ads.googleads.v3.resources.ParentalStatusView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/parental_status_view.proto", fileDescriptor_64f32f4c8c47347e)
+}
+
+var fileDescriptor_64f32f4c8c47347e = []byte{
+	// 325 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0xf3, 0x40,
+	0x14, 0x85, 0x49, 0x7e, 0xf8, 0xc1, 0xa0, 0x9b, 0x6e, 0xd4, 0xe2, 0xc2, 0x2a, 0x05, 0x41, 0x98,
+	0x59, 0x64, 0x37, 0x0a, 0x32, 0xdd, 0x14, 0x5c, 0x48, 0xa9, 0x90, 0x85, 0x04, 0xca, 0x98, 0x0c,
+	0x43, 0xa0, 0x99, 0x1b, 0xe7, 0x4e, 0xdb, 0x45, 0xe9, 0xce, 0x27, 0x71, 0x29, 0x3e, 0x89, 0x8f,
+	0xd2, 0xa7, 0x90, 0x76, 0x3a, 0x13, 0xc1, 0xa2, 0xbb, 0x43, 0xee, 0x77, 0xce, 0x99, 0x7b, 0x93,
+	0xdc, 0x2a, 0x00, 0x35, 0x95, 0x54, 0x94, 0x48, 0x9d, 0xdc, 0xa8, 0x79, 0x4a, 0x8d, 0x44, 0x98,
+	0x99, 0x42, 0x22, 0x6d, 0x84, 0x91, 0xda, 0x8a, 0xe9, 0x04, 0xad, 0xb0, 0x33, 0x9c, 0xcc, 0x2b,
+	0xb9, 0x20, 0x8d, 0x01, 0x0b, 0x9d, 0x9e, 0xb3, 0x10, 0x51, 0x22, 0x09, 0x6e, 0x32, 0x4f, 0x49,
+	0x70, 0x77, 0x4f, 0x7d, 0x41, 0x53, 0x85, 0x4c, 0xe7, 0xee, 0x9e, 0x7d, 0x1b, 0x09, 0xad, 0xc1,
+	0x0a, 0x5b, 0x81, 0x46, 0x37, 0xbd, 0xf8, 0x88, 0x92, 0xce, 0x68, 0x57, 0xfd, 0xb8, 0x6d, 0xce,
+	0x2a, 0xb9, 0xe8, 0x5c, 0x26, 0x47, 0x3e, 0x66, 0xa2, 0x45, 0x2d, 0x4f, 0xa2, 0xf3, 0xe8, 0xea,
+	0x60, 0x7c, 0xe8, 0x3f, 0x3e, 0x88, 0x5a, 0xb2, 0x97, 0x35, 0xd7, 0xc9, 0x75, 0xfb, 0xa2, 0x9d,
+	0x6a, 0x2a, 0x24, 0x05, 0xd4, 0x74, 0x4f, 0xec, 0x5d, 0x31, 0x43, 0x0b, 0xb5, 0x34, 0x48, 0x97,
+	0x5e, 0xae, 0xc2, 0xea, 0x2d, 0x88, 0x74, 0xb9, 0xef, 0x1e, 0xab, 0xc1, 0x6b, 0x9c, 0xf4, 0x0b,
+	0xa8, 0xc9, 0x9f, 0x17, 0x19, 0x1c, 0xff, 0xac, 0x1f, 0x6d, 0x36, 0x1e, 0x45, 0x4f, 0xf7, 0x3b,
+	0xb7, 0x82, 0xa9, 0xd0, 0x8a, 0x80, 0x51, 0x54, 0x49, 0xbd, 0xbd, 0x07, 0x6d, 0x77, 0xf8, 0xe5,
+	0x67, 0xdd, 0x04, 0xf5, 0x16, 0xff, 0x1b, 0x72, 0xfe, 0x1e, 0xf7, 0x86, 0x2e, 0x92, 0x97, 0x48,
+	0x9c, 0xdc, 0xa8, 0x2c, 0x25, 0x63, 0x4f, 0x7e, 0x7a, 0x26, 0xe7, 0x25, 0xe6, 0x81, 0xc9, 0xb3,
+	0x34, 0x0f, 0xcc, 0x3a, 0xee, 0xbb, 0x01, 0x63, 0xbc, 0x44, 0xc6, 0x02, 0xc5, 0x58, 0x96, 0x32,
+	0x16, 0xb8, 0xe7, 0xff, 0xdb, 0xc7, 0xa6, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe6, 0x56, 0xcd,
+	0x1c, 0x58, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/payments_account.pb.go b/googleapis/ads/googleads/v3/resources/payments_account.pb.go
new file mode 100644
index 0000000..8adf1f9
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/payments_account.pb.go
@@ -0,0 +1,157 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/payments_account.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A payments account, which can be used to set up billing for an Ads customer.
+type PaymentsAccount struct {
+	// The resource name of the payments account.
+	// PaymentsAccount resource names have the form:
+	//
+	// `customers/{customer_id}/paymentsAccounts/{payments_account_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// A 16 digit ID used to identify a payments account.
+	PaymentsAccountId *wrappers.StringValue `protobuf:"bytes,2,opt,name=payments_account_id,json=paymentsAccountId,proto3" json:"payments_account_id,omitempty"`
+	// The name of the payments account.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The currency code of the payments account.
+	// A subset of the currency codes derived from the ISO 4217 standard is
+	// supported.
+	CurrencyCode *wrappers.StringValue `protobuf:"bytes,4,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	// A 12 digit ID used to identify the payments profile associated with the
+	// payments account.
+	PaymentsProfileId *wrappers.StringValue `protobuf:"bytes,5,opt,name=payments_profile_id,json=paymentsProfileId,proto3" json:"payments_profile_id,omitempty"`
+	// A secondary payments profile ID present in uncommon situations, e.g.
+	// when a sequential liability agreement has been arranged.
+	SecondaryPaymentsProfileId *wrappers.StringValue `protobuf:"bytes,6,opt,name=secondary_payments_profile_id,json=secondaryPaymentsProfileId,proto3" json:"secondary_payments_profile_id,omitempty"`
+	XXX_NoUnkeyedLiteral       struct{}              `json:"-"`
+	XXX_unrecognized           []byte                `json:"-"`
+	XXX_sizecache              int32                 `json:"-"`
+}
+
+func (m *PaymentsAccount) Reset()         { *m = PaymentsAccount{} }
+func (m *PaymentsAccount) String() string { return proto.CompactTextString(m) }
+func (*PaymentsAccount) ProtoMessage()    {}
+func (*PaymentsAccount) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37c21bb407f87d61, []int{0}
+}
+
+func (m *PaymentsAccount) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PaymentsAccount.Unmarshal(m, b)
+}
+func (m *PaymentsAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PaymentsAccount.Marshal(b, m, deterministic)
+}
+func (m *PaymentsAccount) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PaymentsAccount.Merge(m, src)
+}
+func (m *PaymentsAccount) XXX_Size() int {
+	return xxx_messageInfo_PaymentsAccount.Size(m)
+}
+func (m *PaymentsAccount) XXX_DiscardUnknown() {
+	xxx_messageInfo_PaymentsAccount.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PaymentsAccount proto.InternalMessageInfo
+
+func (m *PaymentsAccount) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *PaymentsAccount) GetPaymentsAccountId() *wrappers.StringValue {
+	if m != nil {
+		return m.PaymentsAccountId
+	}
+	return nil
+}
+
+func (m *PaymentsAccount) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *PaymentsAccount) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+func (m *PaymentsAccount) GetPaymentsProfileId() *wrappers.StringValue {
+	if m != nil {
+		return m.PaymentsProfileId
+	}
+	return nil
+}
+
+func (m *PaymentsAccount) GetSecondaryPaymentsProfileId() *wrappers.StringValue {
+	if m != nil {
+		return m.SecondaryPaymentsProfileId
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*PaymentsAccount)(nil), "google.ads.googleads.v3.resources.PaymentsAccount")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/payments_account.proto", fileDescriptor_37c21bb407f87d61)
+}
+
+var fileDescriptor_37c21bb407f87d61 = []byte{
+	// 446 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x41, 0x6b, 0xd4, 0x40,
+	0x18, 0x65, 0xd3, 0xb5, 0xe0, 0xd8, 0x22, 0x46, 0x0f, 0xeb, 0x52, 0xa5, 0x55, 0x0a, 0x7b, 0x9a,
+	0x11, 0x73, 0x29, 0xe3, 0x29, 0xf5, 0x50, 0x2a, 0x22, 0x61, 0x85, 0x3d, 0xc8, 0x42, 0x98, 0xce,
+	0x4c, 0x43, 0x60, 0x33, 0xdf, 0x30, 0x93, 0x54, 0x96, 0xd2, 0x83, 0x3f, 0xc1, 0xbf, 0xe0, 0xd1,
+	0x9f, 0xe2, 0x4f, 0xe9, 0xaf, 0x90, 0x64, 0x32, 0x53, 0x37, 0x88, 0x6e, 0x6f, 0x2f, 0xf9, 0xde,
+	0x7b, 0xdf, 0x7b, 0x99, 0x09, 0x3a, 0x29, 0x00, 0x8a, 0x95, 0x24, 0x4c, 0x58, 0xe2, 0x60, 0x8b,
+	0xae, 0x12, 0x62, 0xa4, 0x85, 0xc6, 0x70, 0x69, 0x89, 0x66, 0xeb, 0x4a, 0xaa, 0xda, 0xe6, 0x8c,
+	0x73, 0x68, 0x54, 0x8d, 0xb5, 0x81, 0x1a, 0xe2, 0x23, 0x47, 0xc7, 0x4c, 0x58, 0x1c, 0x94, 0xf8,
+	0x2a, 0xc1, 0x41, 0x39, 0x7d, 0xee, 0xcd, 0x75, 0x19, 0xfc, 0x9c, 0x7a, 0xfa, 0xb2, 0x1f, 0x75,
+	0x4f, 0x17, 0xcd, 0x25, 0xf9, 0x6a, 0x98, 0xd6, 0xd2, 0xd8, 0x7e, 0x7e, 0xf0, 0x87, 0x94, 0x29,
+	0x05, 0x35, 0xab, 0x4b, 0x50, 0xfd, 0xf4, 0xd5, 0xf7, 0x31, 0x7a, 0x9c, 0xf5, 0xb1, 0x52, 0x97,
+	0x2a, 0x7e, 0x8d, 0xf6, 0xfd, 0x8e, 0x5c, 0xb1, 0x4a, 0x4e, 0x46, 0x87, 0xa3, 0xd9, 0xc3, 0xf9,
+	0x9e, 0x7f, 0xf9, 0x89, 0x55, 0x32, 0xfe, 0x88, 0x9e, 0x0e, 0xeb, 0xe4, 0xa5, 0x98, 0x44, 0x87,
+	0xa3, 0xd9, 0xa3, 0xb7, 0x07, 0x7d, 0x0f, 0xec, 0x43, 0xe1, 0xcf, 0xb5, 0x29, 0x55, 0xb1, 0x60,
+	0xab, 0x46, 0xce, 0x9f, 0xe8, 0xcd, 0x85, 0xe7, 0x22, 0x7e, 0x83, 0xc6, 0xdd, 0xa6, 0x9d, 0x2d,
+	0xe4, 0x1d, 0x33, 0x4e, 0xd1, 0x3e, 0x6f, 0x8c, 0x91, 0x8a, 0xaf, 0x73, 0x0e, 0x42, 0x4e, 0xc6,
+	0x5b, 0x48, 0xf7, 0xbc, 0xe4, 0x3d, 0x88, 0xcd, 0x0a, 0xda, 0xc0, 0x65, 0xb9, 0x92, 0x6d, 0x85,
+	0x07, 0xf7, 0xa9, 0x90, 0x39, 0xdd, 0xb9, 0x88, 0x73, 0xf4, 0xc2, 0x4a, 0x0e, 0x4a, 0x30, 0xb3,
+	0xce, 0xff, 0xe6, 0xbb, 0xbb, 0x85, 0xef, 0x34, 0x58, 0x64, 0xc3, 0x05, 0xb4, 0xb8, 0x4d, 0x05,
+	0x9a, 0xdd, 0x5d, 0x90, 0x1e, 0xe9, 0xd2, 0x62, 0x0e, 0x15, 0x19, 0x9e, 0xe2, 0x09, 0x6f, 0x6c,
+	0x0d, 0x95, 0x34, 0x96, 0x5c, 0x7b, 0x78, 0x43, 0x06, 0x9f, 0xde, 0x92, 0xeb, 0xe1, 0x29, 0xde,
+	0x9c, 0x7e, 0x8b, 0xd0, 0x31, 0x87, 0x0a, 0xff, 0xf7, 0x5a, 0x9e, 0x3e, 0x1b, 0x2c, 0xcd, 0xda,
+	0x4e, 0xd9, 0xe8, 0xcb, 0x87, 0x5e, 0x5a, 0xc0, 0x8a, 0xa9, 0x02, 0x83, 0x29, 0x48, 0x21, 0x55,
+	0xd7, 0x98, 0xdc, 0xc5, 0xfe, 0xc7, 0xaf, 0xf2, 0x2e, 0xa0, 0x1f, 0xd1, 0xce, 0x59, 0x9a, 0xfe,
+	0x8c, 0x8e, 0xce, 0x9c, 0x65, 0x2a, 0x2c, 0x76, 0xb0, 0x45, 0x8b, 0x04, 0xcf, 0x3d, 0xf3, 0x97,
+	0xe7, 0x2c, 0x53, 0x61, 0x97, 0x81, 0xb3, 0x5c, 0x24, 0xcb, 0xc0, 0xb9, 0x8d, 0x8e, 0xdd, 0x80,
+	0xd2, 0x54, 0x58, 0x4a, 0x03, 0x8b, 0xd2, 0x45, 0x42, 0x69, 0xe0, 0x5d, 0xec, 0x76, 0x61, 0x93,
+	0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x8d, 0xc1, 0xcd, 0xd6, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/product_bidding_category_constant.pb.go b/googleapis/ads/googleads/v3/resources/product_bidding_category_constant.pb.go
new file mode 100644
index 0000000..2ecf1b3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/product_bidding_category_constant.pb.go
@@ -0,0 +1,183 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/product_bidding_category_constant.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A Product Bidding Category.
+type ProductBiddingCategoryConstant struct {
+	// The resource name of the product bidding category.
+	// Product bidding category resource names have the form:
+	//
+	// `productBiddingCategoryConstants/{country_code}~{level}~{id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// ID of the product bidding category.
+	//
+	// This ID is equivalent to the google_product_category ID as described in
+	// this article: https://support.google.com/merchants/answer/6324436.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// Two-letter upper-case country code of the product bidding category.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,3,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// Resource name of the parent product bidding category.
+	ProductBiddingCategoryConstantParent *wrappers.StringValue `protobuf:"bytes,4,opt,name=product_bidding_category_constant_parent,json=productBiddingCategoryConstantParent,proto3" json:"product_bidding_category_constant_parent,omitempty"`
+	// Level of the product bidding category.
+	Level enums.ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel `protobuf:"varint,5,opt,name=level,proto3,enum=google.ads.googleads.v3.enums.ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel" json:"level,omitempty"`
+	// Status of the product bidding category.
+	Status enums.ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus `protobuf:"varint,6,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus" json:"status,omitempty"`
+	// Language code of the product bidding category.
+	LanguageCode *wrappers.StringValue `protobuf:"bytes,7,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
+	// Display value of the product bidding category localized according to
+	// language_code.
+	LocalizedName        *wrappers.StringValue `protobuf:"bytes,8,opt,name=localized_name,json=localizedName,proto3" json:"localized_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ProductBiddingCategoryConstant) Reset()         { *m = ProductBiddingCategoryConstant{} }
+func (m *ProductBiddingCategoryConstant) String() string { return proto.CompactTextString(m) }
+func (*ProductBiddingCategoryConstant) ProtoMessage()    {}
+func (*ProductBiddingCategoryConstant) Descriptor() ([]byte, []int) {
+	return fileDescriptor_52fb4d93554a21c8, []int{0}
+}
+
+func (m *ProductBiddingCategoryConstant) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductBiddingCategoryConstant.Unmarshal(m, b)
+}
+func (m *ProductBiddingCategoryConstant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductBiddingCategoryConstant.Marshal(b, m, deterministic)
+}
+func (m *ProductBiddingCategoryConstant) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductBiddingCategoryConstant.Merge(m, src)
+}
+func (m *ProductBiddingCategoryConstant) XXX_Size() int {
+	return xxx_messageInfo_ProductBiddingCategoryConstant.Size(m)
+}
+func (m *ProductBiddingCategoryConstant) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductBiddingCategoryConstant.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductBiddingCategoryConstant proto.InternalMessageInfo
+
+func (m *ProductBiddingCategoryConstant) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *ProductBiddingCategoryConstant) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *ProductBiddingCategoryConstant) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+func (m *ProductBiddingCategoryConstant) GetProductBiddingCategoryConstantParent() *wrappers.StringValue {
+	if m != nil {
+		return m.ProductBiddingCategoryConstantParent
+	}
+	return nil
+}
+
+func (m *ProductBiddingCategoryConstant) GetLevel() enums.ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel {
+	if m != nil {
+		return m.Level
+	}
+	return enums.ProductBiddingCategoryLevelEnum_UNSPECIFIED
+}
+
+func (m *ProductBiddingCategoryConstant) GetStatus() enums.ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.ProductBiddingCategoryStatusEnum_UNSPECIFIED
+}
+
+func (m *ProductBiddingCategoryConstant) GetLanguageCode() *wrappers.StringValue {
+	if m != nil {
+		return m.LanguageCode
+	}
+	return nil
+}
+
+func (m *ProductBiddingCategoryConstant) GetLocalizedName() *wrappers.StringValue {
+	if m != nil {
+		return m.LocalizedName
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ProductBiddingCategoryConstant)(nil), "google.ads.googleads.v3.resources.ProductBiddingCategoryConstant")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/product_bidding_category_constant.proto", fileDescriptor_52fb4d93554a21c8)
+}
+
+var fileDescriptor_52fb4d93554a21c8 = []byte{
+	// 547 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xd1, 0x6a, 0xd4, 0x4c,
+	0x14, 0x26, 0xe9, 0xdf, 0xfd, 0x75, 0xba, 0xdb, 0x8b, 0x5c, 0xc5, 0x5a, 0xca, 0xd6, 0x5a, 0x58,
+	0x10, 0x26, 0xd0, 0x88, 0x42, 0xbc, 0x90, 0x6c, 0x90, 0x52, 0x11, 0x59, 0xb6, 0xb0, 0x17, 0x65,
+	0x21, 0xcc, 0x66, 0xc6, 0x21, 0x90, 0xcc, 0x84, 0x99, 0xc9, 0x8a, 0x8a, 0x82, 0x6f, 0xe0, 0x0b,
+	0x78, 0xe3, 0xa5, 0x8f, 0xe2, 0xa3, 0xf4, 0x29, 0x24, 0x33, 0x93, 0x54, 0xd0, 0x66, 0x97, 0xde,
+	0x9d, 0xe4, 0x9c, 0xef, 0xfb, 0xce, 0x39, 0xdf, 0x61, 0xc0, 0x05, 0xe5, 0x9c, 0x16, 0x24, 0x40,
+	0x58, 0x06, 0x26, 0x6c, 0xa2, 0x75, 0x18, 0x08, 0x22, 0x79, 0x2d, 0x32, 0x22, 0x83, 0x4a, 0x70,
+	0x5c, 0x67, 0x2a, 0x5d, 0xe5, 0x18, 0xe7, 0x8c, 0xa6, 0x19, 0x52, 0x84, 0x72, 0xf1, 0x21, 0xcd,
+	0x38, 0x93, 0x0a, 0x31, 0x05, 0x2b, 0xc1, 0x15, 0xf7, 0x8e, 0x0d, 0x1e, 0x22, 0x2c, 0x61, 0x47,
+	0x05, 0xd7, 0x21, 0xec, 0xa8, 0x0e, 0xa6, 0xb7, 0xa9, 0x11, 0x56, 0x97, 0x3d, 0x4a, 0x05, 0x59,
+	0x93, 0xc2, 0xc8, 0x1c, 0x24, 0x77, 0xe4, 0x90, 0x0a, 0xa9, 0x5a, 0x5a, 0x92, 0x07, 0x2d, 0x49,
+	0x95, 0x77, 0x93, 0xda, 0xd4, 0x91, 0x4d, 0xe9, 0xaf, 0x55, 0xfd, 0x2e, 0x78, 0x2f, 0x50, 0x55,
+	0x11, 0xd1, 0x42, 0x0f, 0xff, 0x80, 0x22, 0xc6, 0xb8, 0x42, 0x2a, 0xe7, 0xcc, 0x66, 0x1f, 0x7d,
+	0x1f, 0x80, 0xa3, 0x99, 0x69, 0x61, 0x6a, 0x3a, 0x48, 0x6c, 0x03, 0x89, 0xdd, 0x96, 0x77, 0x02,
+	0x46, 0xad, 0x64, 0xca, 0x50, 0x49, 0x7c, 0x67, 0xec, 0x4c, 0xee, 0xcf, 0x87, 0xed, 0xcf, 0xb7,
+	0xa8, 0x24, 0xde, 0x13, 0xe0, 0xe6, 0xd8, 0x77, 0xc7, 0xce, 0x64, 0xef, 0xec, 0xa1, 0x5d, 0x27,
+	0x6c, 0x5b, 0x82, 0x17, 0x4c, 0x3d, 0x7b, 0xba, 0x40, 0x45, 0x4d, 0xe6, 0x6e, 0x8e, 0xbd, 0x97,
+	0x60, 0x98, 0xf1, 0x9a, 0x29, 0xed, 0x09, 0x26, 0xfe, 0x8e, 0x86, 0x1d, 0xfe, 0x05, 0xbb, 0x54,
+	0x22, 0x67, 0xd4, 0xe0, 0xf6, 0x2c, 0x22, 0xe1, 0x98, 0x78, 0x0a, 0x4c, 0x36, 0xba, 0x9c, 0x56,
+	0x48, 0x10, 0xa6, 0xfc, 0xff, 0xb6, 0x20, 0x7f, 0x5c, 0xf5, 0xae, 0x60, 0xa6, 0x99, 0xbc, 0x0a,
+	0xec, 0x6a, 0x63, 0xfd, 0xdd, 0xb1, 0x33, 0xd9, 0x3f, 0xbb, 0x82, 0xb7, 0x1d, 0x90, 0x76, 0x16,
+	0xfe, 0x7b, 0xad, 0x6f, 0x1a, 0x86, 0x57, 0xac, 0x2e, 0xfb, 0xf2, 0x73, 0x23, 0xe4, 0x29, 0x30,
+	0x30, 0x67, 0xe0, 0x0f, 0xb4, 0xe4, 0xf2, 0x4e, 0x92, 0x97, 0x9a, 0xa2, 0x47, 0xd3, 0x14, 0xcc,
+	0xad, 0x96, 0x17, 0x83, 0x51, 0x81, 0x18, 0xad, 0x11, 0x25, 0xc6, 0x9f, 0xff, 0xb7, 0x58, 0xe1,
+	0xb0, 0x85, 0x68, 0x83, 0x12, 0xb0, 0x5f, 0xf0, 0x0c, 0x15, 0xf9, 0x47, 0x82, 0xcd, 0xd1, 0xdc,
+	0xdb, 0x82, 0x63, 0xd4, 0x61, 0x9a, 0x9b, 0x8a, 0xbe, 0x3a, 0xd7, 0xf1, 0x17, 0xf0, 0xfc, 0x66,
+	0x4e, 0x1b, 0x55, 0xb9, 0x84, 0x19, 0x2f, 0x83, 0x0d, 0x77, 0x9b, 0xf4, 0x9b, 0x2a, 0x83, 0x4f,
+	0x1b, 0x6f, 0xe8, 0xf3, 0xf4, 0x9b, 0x0b, 0x4e, 0x33, 0x5e, 0xc2, 0x8d, 0x6f, 0xc5, 0xf4, 0xa4,
+	0xbf, 0x9d, 0x59, 0x33, 0xf0, 0xcc, 0xb9, 0x7a, 0x6d, 0x99, 0x28, 0x6f, 0x16, 0x06, 0xb9, 0xa0,
+	0x01, 0x25, 0x4c, 0xaf, 0x23, 0xb8, 0x99, 0xaf, 0xe7, 0x7d, 0x7b, 0xd1, 0x45, 0x3f, 0xdc, 0x9d,
+	0xf3, 0x38, 0xfe, 0xe9, 0x1e, 0x9f, 0x1b, 0xca, 0x18, 0x4b, 0x68, 0xc2, 0x26, 0x5a, 0x84, 0x70,
+	0xde, 0x56, 0xfe, 0x6a, 0x6b, 0x96, 0x31, 0x96, 0xcb, 0xae, 0x66, 0xb9, 0x08, 0x97, 0x5d, 0xcd,
+	0xb5, 0x7b, 0x6a, 0x12, 0x51, 0x14, 0x63, 0x19, 0x45, 0x5d, 0x55, 0x14, 0x2d, 0xc2, 0x28, 0xea,
+	0xea, 0x56, 0x03, 0xdd, 0x6c, 0xf8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xf4, 0xfd, 0x48, 0xb9, 0x8b,
+	0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/product_group_view.pb.go b/googleapis/ads/googleads/v3/resources/product_group_view.pb.go
new file mode 100644
index 0000000..5aabe0e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/product_group_view.pb.go
@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/product_group_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A product group view.
+type ProductGroupView struct {
+	// The resource name of the product group view.
+	// Product group view resource names have the form:
+	//
+	// `customers/{customer_id}/productGroupViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProductGroupView) Reset()         { *m = ProductGroupView{} }
+func (m *ProductGroupView) String() string { return proto.CompactTextString(m) }
+func (*ProductGroupView) ProtoMessage()    {}
+func (*ProductGroupView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dd2fe9a1ca896489, []int{0}
+}
+
+func (m *ProductGroupView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductGroupView.Unmarshal(m, b)
+}
+func (m *ProductGroupView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductGroupView.Marshal(b, m, deterministic)
+}
+func (m *ProductGroupView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductGroupView.Merge(m, src)
+}
+func (m *ProductGroupView) XXX_Size() int {
+	return xxx_messageInfo_ProductGroupView.Size(m)
+}
+func (m *ProductGroupView) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductGroupView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductGroupView proto.InternalMessageInfo
+
+func (m *ProductGroupView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ProductGroupView)(nil), "google.ads.googleads.v3.resources.ProductGroupView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/product_group_view.proto", fileDescriptor_dd2fe9a1ca896489)
+}
+
+var fileDescriptor_dd2fe9a1ca896489 = []byte{
+	// 322 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xcf, 0x4a, 0xf3, 0x40,
+	0x14, 0xc5, 0x49, 0x3e, 0xf8, 0xc0, 0xa0, 0x20, 0x05, 0x41, 0x8b, 0x0b, 0xab, 0x14, 0x74, 0x33,
+	0xb3, 0xc8, 0x6e, 0xba, 0x4a, 0x37, 0x05, 0x17, 0x52, 0xba, 0xc8, 0x42, 0x02, 0x65, 0xcc, 0x0c,
+	0x63, 0xb0, 0x99, 0x1b, 0xe6, 0x26, 0xe9, 0xa2, 0x74, 0xe3, 0xa3, 0x88, 0x2b, 0x1f, 0xc5, 0x47,
+	0xe9, 0x53, 0x48, 0x3a, 0x9d, 0xa9, 0x58, 0xd0, 0xdd, 0x61, 0xee, 0xef, 0x9c, 0xfb, 0x67, 0x22,
+	0xa6, 0x00, 0xd4, 0x42, 0x52, 0x2e, 0x90, 0x5a, 0xd9, 0xa9, 0x36, 0xa6, 0x46, 0x22, 0x34, 0x26,
+	0x97, 0x48, 0x2b, 0x03, 0xa2, 0xc9, 0xeb, 0xb9, 0x32, 0xd0, 0x54, 0xf3, 0xb6, 0x90, 0x4b, 0x52,
+	0x19, 0xa8, 0xa1, 0x37, 0xb0, 0x06, 0xc2, 0x05, 0x12, 0xef, 0x25, 0x6d, 0x4c, 0xbc, 0xb7, 0x7f,
+	0xe1, 0xe2, 0xab, 0xc2, 0x27, 0x5a, 0x77, 0xff, 0xf2, 0x5b, 0x89, 0x6b, 0x0d, 0x35, 0xaf, 0x0b,
+	0xd0, 0x68, 0xab, 0xd7, 0xef, 0x41, 0x74, 0x3a, 0xb5, 0x8d, 0x27, 0x5d, 0xdf, 0xb4, 0x90, 0xcb,
+	0xde, 0x4d, 0x74, 0xe2, 0x42, 0xe6, 0x9a, 0x97, 0xf2, 0x3c, 0xb8, 0x0a, 0x6e, 0x8f, 0x66, 0xc7,
+	0xee, 0xf1, 0x81, 0x97, 0x92, 0xbd, 0x6c, 0x92, 0xe7, 0xe8, 0x6e, 0x3f, 0xcf, 0x4e, 0x55, 0x05,
+	0x92, 0x1c, 0x4a, 0x7a, 0x10, 0x3a, 0xca, 0x1b, 0xac, 0xa1, 0x94, 0x06, 0xe9, 0xca, 0xc9, 0xb5,
+	0x5b, 0xda, 0x63, 0x48, 0x57, 0x87, 0x77, 0x58, 0x8f, 0x5f, 0xc3, 0x68, 0x98, 0x43, 0x49, 0xfe,
+	0xbc, 0xc4, 0xf8, 0xec, 0x67, 0xe3, 0x69, 0xb7, 0xe7, 0x34, 0x78, 0xbc, 0xdf, 0x79, 0x15, 0x2c,
+	0xb8, 0x56, 0x04, 0x8c, 0xa2, 0x4a, 0xea, 0xed, 0x15, 0xe8, 0x7e, 0xf6, 0x5f, 0x3e, 0x68, 0xe4,
+	0xd5, 0x5b, 0xf8, 0x6f, 0x92, 0x24, 0x1f, 0xe1, 0x60, 0x62, 0x23, 0x13, 0x81, 0xc4, 0xca, 0x4e,
+	0xa5, 0x31, 0x99, 0x39, 0xf2, 0xd3, 0x31, 0x59, 0x22, 0x30, 0xf3, 0x4c, 0x96, 0xc6, 0x99, 0x67,
+	0x36, 0xe1, 0xd0, 0x16, 0x18, 0x4b, 0x04, 0x32, 0xe6, 0x29, 0xc6, 0xd2, 0x98, 0x31, 0xcf, 0x3d,
+	0xfd, 0xdf, 0x0e, 0x1b, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xc8, 0x13, 0xd8, 0x1d, 0x4c, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/recommendation.pb.go b/googleapis/ads/googleads/v3/resources/recommendation.pb.go
new file mode 100644
index 0000000..ffaac8a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/recommendation.pb.go
@@ -0,0 +1,1442 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/recommendation.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A recommendation.
+type Recommendation struct {
+	// The resource name of the recommendation.
+	//
+	// `customers/{customer_id}/recommendations/{recommendation_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The type of recommendation.
+	Type enums.RecommendationTypeEnum_RecommendationType `protobuf:"varint,2,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.RecommendationTypeEnum_RecommendationType" json:"type,omitempty"`
+	// The impact on account performance as a result of applying the
+	// recommendation.
+	Impact *Recommendation_RecommendationImpact `protobuf:"bytes,3,opt,name=impact,proto3" json:"impact,omitempty"`
+	// The budget targeted by this recommendation. This will be set only when
+	// the recommendation affects a single campaign budget.
+	//
+	// This field will be set for the following recommendation types:
+	// CAMPAIGN_BUDGET, MOVE_UNUSED_BUDGET
+	CampaignBudget *wrappers.StringValue `protobuf:"bytes,5,opt,name=campaign_budget,json=campaignBudget,proto3" json:"campaign_budget,omitempty"`
+	// The campaign targeted by this recommendation. This will be set only when
+	// the recommendation affects a single campaign.
+	//
+	// This field will be set for the following recommendation types:
+	// CALL_EXTENSION, CALLOUT_EXTENSION, ENHANCED_CPC_OPT_IN, KEYWORD,
+	// KEYWORD_MATCH_TYPE, MAXIMIZE_CLICKS_OPT_IN, MAXIMIZE_CONVERSIONS_OPT_IN,
+	// OPTIMIZE_AD_ROTATION, SEARCH_PARTNERS_OPT_IN, SITELINK_EXTENSION,
+	// TARGET_CPA_OPT_IN, TEXT_AD
+	Campaign *wrappers.StringValue `protobuf:"bytes,6,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// The ad group targeted by this recommendation. This will be set only when
+	// the recommendation affects a single ad group.
+	//
+	// This field will be set for the following recommendation types:
+	// KEYWORD, OPTIMIZE_AD_ROTATION, TEXT_AD
+	AdGroup *wrappers.StringValue `protobuf:"bytes,7,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// Whether the recommendation is dismissed or not.
+	Dismissed *wrappers.BoolValue `protobuf:"bytes,13,opt,name=dismissed,proto3" json:"dismissed,omitempty"`
+	// The details of recommendation.
+	//
+	// Types that are valid to be assigned to Recommendation:
+	//	*Recommendation_CampaignBudgetRecommendation_
+	//	*Recommendation_KeywordRecommendation_
+	//	*Recommendation_TextAdRecommendation_
+	//	*Recommendation_TargetCpaOptInRecommendation_
+	//	*Recommendation_MaximizeConversionsOptInRecommendation_
+	//	*Recommendation_EnhancedCpcOptInRecommendation_
+	//	*Recommendation_SearchPartnersOptInRecommendation_
+	//	*Recommendation_MaximizeClicksOptInRecommendation_
+	//	*Recommendation_OptimizeAdRotationRecommendation_
+	//	*Recommendation_CalloutExtensionRecommendation_
+	//	*Recommendation_SitelinkExtensionRecommendation_
+	//	*Recommendation_CallExtensionRecommendation_
+	//	*Recommendation_KeywordMatchTypeRecommendation_
+	//	*Recommendation_MoveUnusedBudgetRecommendation_
+	Recommendation       isRecommendation_Recommendation `protobuf_oneof:"recommendation"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *Recommendation) Reset()         { *m = Recommendation{} }
+func (m *Recommendation) String() string { return proto.CompactTextString(m) }
+func (*Recommendation) ProtoMessage()    {}
+func (*Recommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0}
+}
+
+func (m *Recommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation.Unmarshal(m, b)
+}
+func (m *Recommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation.Merge(m, src)
+}
+func (m *Recommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation.Size(m)
+}
+func (m *Recommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation proto.InternalMessageInfo
+
+func (m *Recommendation) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *Recommendation) GetType() enums.RecommendationTypeEnum_RecommendationType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.RecommendationTypeEnum_UNSPECIFIED
+}
+
+func (m *Recommendation) GetImpact() *Recommendation_RecommendationImpact {
+	if m != nil {
+		return m.Impact
+	}
+	return nil
+}
+
+func (m *Recommendation) GetCampaignBudget() *wrappers.StringValue {
+	if m != nil {
+		return m.CampaignBudget
+	}
+	return nil
+}
+
+func (m *Recommendation) GetCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *Recommendation) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *Recommendation) GetDismissed() *wrappers.BoolValue {
+	if m != nil {
+		return m.Dismissed
+	}
+	return nil
+}
+
+type isRecommendation_Recommendation interface {
+	isRecommendation_Recommendation()
+}
+
+type Recommendation_CampaignBudgetRecommendation_ struct {
+	CampaignBudgetRecommendation *Recommendation_CampaignBudgetRecommendation `protobuf:"bytes,4,opt,name=campaign_budget_recommendation,json=campaignBudgetRecommendation,proto3,oneof"`
+}
+
+type Recommendation_KeywordRecommendation_ struct {
+	KeywordRecommendation *Recommendation_KeywordRecommendation `protobuf:"bytes,8,opt,name=keyword_recommendation,json=keywordRecommendation,proto3,oneof"`
+}
+
+type Recommendation_TextAdRecommendation_ struct {
+	TextAdRecommendation *Recommendation_TextAdRecommendation `protobuf:"bytes,9,opt,name=text_ad_recommendation,json=textAdRecommendation,proto3,oneof"`
+}
+
+type Recommendation_TargetCpaOptInRecommendation_ struct {
+	TargetCpaOptInRecommendation *Recommendation_TargetCpaOptInRecommendation `protobuf:"bytes,10,opt,name=target_cpa_opt_in_recommendation,json=targetCpaOptInRecommendation,proto3,oneof"`
+}
+
+type Recommendation_MaximizeConversionsOptInRecommendation_ struct {
+	MaximizeConversionsOptInRecommendation *Recommendation_MaximizeConversionsOptInRecommendation `protobuf:"bytes,11,opt,name=maximize_conversions_opt_in_recommendation,json=maximizeConversionsOptInRecommendation,proto3,oneof"`
+}
+
+type Recommendation_EnhancedCpcOptInRecommendation_ struct {
+	EnhancedCpcOptInRecommendation *Recommendation_EnhancedCpcOptInRecommendation `protobuf:"bytes,12,opt,name=enhanced_cpc_opt_in_recommendation,json=enhancedCpcOptInRecommendation,proto3,oneof"`
+}
+
+type Recommendation_SearchPartnersOptInRecommendation_ struct {
+	SearchPartnersOptInRecommendation *Recommendation_SearchPartnersOptInRecommendation `protobuf:"bytes,14,opt,name=search_partners_opt_in_recommendation,json=searchPartnersOptInRecommendation,proto3,oneof"`
+}
+
+type Recommendation_MaximizeClicksOptInRecommendation_ struct {
+	MaximizeClicksOptInRecommendation *Recommendation_MaximizeClicksOptInRecommendation `protobuf:"bytes,15,opt,name=maximize_clicks_opt_in_recommendation,json=maximizeClicksOptInRecommendation,proto3,oneof"`
+}
+
+type Recommendation_OptimizeAdRotationRecommendation_ struct {
+	OptimizeAdRotationRecommendation *Recommendation_OptimizeAdRotationRecommendation `protobuf:"bytes,16,opt,name=optimize_ad_rotation_recommendation,json=optimizeAdRotationRecommendation,proto3,oneof"`
+}
+
+type Recommendation_CalloutExtensionRecommendation_ struct {
+	CalloutExtensionRecommendation *Recommendation_CalloutExtensionRecommendation `protobuf:"bytes,17,opt,name=callout_extension_recommendation,json=calloutExtensionRecommendation,proto3,oneof"`
+}
+
+type Recommendation_SitelinkExtensionRecommendation_ struct {
+	SitelinkExtensionRecommendation *Recommendation_SitelinkExtensionRecommendation `protobuf:"bytes,18,opt,name=sitelink_extension_recommendation,json=sitelinkExtensionRecommendation,proto3,oneof"`
+}
+
+type Recommendation_CallExtensionRecommendation_ struct {
+	CallExtensionRecommendation *Recommendation_CallExtensionRecommendation `protobuf:"bytes,19,opt,name=call_extension_recommendation,json=callExtensionRecommendation,proto3,oneof"`
+}
+
+type Recommendation_KeywordMatchTypeRecommendation_ struct {
+	KeywordMatchTypeRecommendation *Recommendation_KeywordMatchTypeRecommendation `protobuf:"bytes,20,opt,name=keyword_match_type_recommendation,json=keywordMatchTypeRecommendation,proto3,oneof"`
+}
+
+type Recommendation_MoveUnusedBudgetRecommendation_ struct {
+	MoveUnusedBudgetRecommendation *Recommendation_MoveUnusedBudgetRecommendation `protobuf:"bytes,21,opt,name=move_unused_budget_recommendation,json=moveUnusedBudgetRecommendation,proto3,oneof"`
+}
+
+func (*Recommendation_CampaignBudgetRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_KeywordRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_TextAdRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_TargetCpaOptInRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_MaximizeConversionsOptInRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_EnhancedCpcOptInRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_SearchPartnersOptInRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_MaximizeClicksOptInRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_OptimizeAdRotationRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_CalloutExtensionRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_SitelinkExtensionRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_CallExtensionRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_KeywordMatchTypeRecommendation_) isRecommendation_Recommendation() {}
+
+func (*Recommendation_MoveUnusedBudgetRecommendation_) isRecommendation_Recommendation() {}
+
+func (m *Recommendation) GetRecommendation() isRecommendation_Recommendation {
+	if m != nil {
+		return m.Recommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetCampaignBudgetRecommendation() *Recommendation_CampaignBudgetRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_CampaignBudgetRecommendation_); ok {
+		return x.CampaignBudgetRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetKeywordRecommendation() *Recommendation_KeywordRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_KeywordRecommendation_); ok {
+		return x.KeywordRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetTextAdRecommendation() *Recommendation_TextAdRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_TextAdRecommendation_); ok {
+		return x.TextAdRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetTargetCpaOptInRecommendation() *Recommendation_TargetCpaOptInRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_TargetCpaOptInRecommendation_); ok {
+		return x.TargetCpaOptInRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetMaximizeConversionsOptInRecommendation() *Recommendation_MaximizeConversionsOptInRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_MaximizeConversionsOptInRecommendation_); ok {
+		return x.MaximizeConversionsOptInRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetEnhancedCpcOptInRecommendation() *Recommendation_EnhancedCpcOptInRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_EnhancedCpcOptInRecommendation_); ok {
+		return x.EnhancedCpcOptInRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetSearchPartnersOptInRecommendation() *Recommendation_SearchPartnersOptInRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_SearchPartnersOptInRecommendation_); ok {
+		return x.SearchPartnersOptInRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetMaximizeClicksOptInRecommendation() *Recommendation_MaximizeClicksOptInRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_MaximizeClicksOptInRecommendation_); ok {
+		return x.MaximizeClicksOptInRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetOptimizeAdRotationRecommendation() *Recommendation_OptimizeAdRotationRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_OptimizeAdRotationRecommendation_); ok {
+		return x.OptimizeAdRotationRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetCalloutExtensionRecommendation() *Recommendation_CalloutExtensionRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_CalloutExtensionRecommendation_); ok {
+		return x.CalloutExtensionRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetSitelinkExtensionRecommendation() *Recommendation_SitelinkExtensionRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_SitelinkExtensionRecommendation_); ok {
+		return x.SitelinkExtensionRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetCallExtensionRecommendation() *Recommendation_CallExtensionRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_CallExtensionRecommendation_); ok {
+		return x.CallExtensionRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetKeywordMatchTypeRecommendation() *Recommendation_KeywordMatchTypeRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_KeywordMatchTypeRecommendation_); ok {
+		return x.KeywordMatchTypeRecommendation
+	}
+	return nil
+}
+
+func (m *Recommendation) GetMoveUnusedBudgetRecommendation() *Recommendation_MoveUnusedBudgetRecommendation {
+	if x, ok := m.GetRecommendation().(*Recommendation_MoveUnusedBudgetRecommendation_); ok {
+		return x.MoveUnusedBudgetRecommendation
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Recommendation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Recommendation_CampaignBudgetRecommendation_)(nil),
+		(*Recommendation_KeywordRecommendation_)(nil),
+		(*Recommendation_TextAdRecommendation_)(nil),
+		(*Recommendation_TargetCpaOptInRecommendation_)(nil),
+		(*Recommendation_MaximizeConversionsOptInRecommendation_)(nil),
+		(*Recommendation_EnhancedCpcOptInRecommendation_)(nil),
+		(*Recommendation_SearchPartnersOptInRecommendation_)(nil),
+		(*Recommendation_MaximizeClicksOptInRecommendation_)(nil),
+		(*Recommendation_OptimizeAdRotationRecommendation_)(nil),
+		(*Recommendation_CalloutExtensionRecommendation_)(nil),
+		(*Recommendation_SitelinkExtensionRecommendation_)(nil),
+		(*Recommendation_CallExtensionRecommendation_)(nil),
+		(*Recommendation_KeywordMatchTypeRecommendation_)(nil),
+		(*Recommendation_MoveUnusedBudgetRecommendation_)(nil),
+	}
+}
+
+// The impact of making the change as described in the recommendation.
+// Some types of recommendations may not have impact information.
+type Recommendation_RecommendationImpact struct {
+	// Base metrics at the time the recommendation was generated.
+	BaseMetrics *Recommendation_RecommendationMetrics `protobuf:"bytes,1,opt,name=base_metrics,json=baseMetrics,proto3" json:"base_metrics,omitempty"`
+	// Estimated metrics if the recommendation is applied.
+	PotentialMetrics     *Recommendation_RecommendationMetrics `protobuf:"bytes,2,opt,name=potential_metrics,json=potentialMetrics,proto3" json:"potential_metrics,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
+	XXX_unrecognized     []byte                                `json:"-"`
+	XXX_sizecache        int32                                 `json:"-"`
+}
+
+func (m *Recommendation_RecommendationImpact) Reset()         { *m = Recommendation_RecommendationImpact{} }
+func (m *Recommendation_RecommendationImpact) String() string { return proto.CompactTextString(m) }
+func (*Recommendation_RecommendationImpact) ProtoMessage()    {}
+func (*Recommendation_RecommendationImpact) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 0}
+}
+
+func (m *Recommendation_RecommendationImpact) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_RecommendationImpact.Unmarshal(m, b)
+}
+func (m *Recommendation_RecommendationImpact) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_RecommendationImpact.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_RecommendationImpact) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_RecommendationImpact.Merge(m, src)
+}
+func (m *Recommendation_RecommendationImpact) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_RecommendationImpact.Size(m)
+}
+func (m *Recommendation_RecommendationImpact) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_RecommendationImpact.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_RecommendationImpact proto.InternalMessageInfo
+
+func (m *Recommendation_RecommendationImpact) GetBaseMetrics() *Recommendation_RecommendationMetrics {
+	if m != nil {
+		return m.BaseMetrics
+	}
+	return nil
+}
+
+func (m *Recommendation_RecommendationImpact) GetPotentialMetrics() *Recommendation_RecommendationMetrics {
+	if m != nil {
+		return m.PotentialMetrics
+	}
+	return nil
+}
+
+// Weekly account performance metrics. For some recommendation types, these
+// are averaged over the past 90-day period and hence can be fractional.
+type Recommendation_RecommendationMetrics struct {
+	// Number of ad impressions.
+	Impressions *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=impressions,proto3" json:"impressions,omitempty"`
+	// Number of ad clicks.
+	Clicks *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=clicks,proto3" json:"clicks,omitempty"`
+	// Cost (in micros) for advertising, in the local currency for the account.
+	CostMicros *wrappers.Int64Value `protobuf:"bytes,3,opt,name=cost_micros,json=costMicros,proto3" json:"cost_micros,omitempty"`
+	// Number of conversions.
+	Conversions *wrappers.DoubleValue `protobuf:"bytes,4,opt,name=conversions,proto3" json:"conversions,omitempty"`
+	// Number of video views for a video ad campaign.
+	VideoViews           *wrappers.DoubleValue `protobuf:"bytes,5,opt,name=video_views,json=videoViews,proto3" json:"video_views,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *Recommendation_RecommendationMetrics) Reset()         { *m = Recommendation_RecommendationMetrics{} }
+func (m *Recommendation_RecommendationMetrics) String() string { return proto.CompactTextString(m) }
+func (*Recommendation_RecommendationMetrics) ProtoMessage()    {}
+func (*Recommendation_RecommendationMetrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 1}
+}
+
+func (m *Recommendation_RecommendationMetrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_RecommendationMetrics.Unmarshal(m, b)
+}
+func (m *Recommendation_RecommendationMetrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_RecommendationMetrics.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_RecommendationMetrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_RecommendationMetrics.Merge(m, src)
+}
+func (m *Recommendation_RecommendationMetrics) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_RecommendationMetrics.Size(m)
+}
+func (m *Recommendation_RecommendationMetrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_RecommendationMetrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_RecommendationMetrics proto.InternalMessageInfo
+
+func (m *Recommendation_RecommendationMetrics) GetImpressions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Impressions
+	}
+	return nil
+}
+
+func (m *Recommendation_RecommendationMetrics) GetClicks() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Clicks
+	}
+	return nil
+}
+
+func (m *Recommendation_RecommendationMetrics) GetCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CostMicros
+	}
+	return nil
+}
+
+func (m *Recommendation_RecommendationMetrics) GetConversions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Conversions
+	}
+	return nil
+}
+
+func (m *Recommendation_RecommendationMetrics) GetVideoViews() *wrappers.DoubleValue {
+	if m != nil {
+		return m.VideoViews
+	}
+	return nil
+}
+
+// The budget recommendation for budget constrained campaigns.
+type Recommendation_CampaignBudgetRecommendation struct {
+	// The current budget amount in micros.
+	CurrentBudgetAmountMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=current_budget_amount_micros,json=currentBudgetAmountMicros,proto3" json:"current_budget_amount_micros,omitempty"`
+	// The recommended budget amount in micros.
+	RecommendedBudgetAmountMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=recommended_budget_amount_micros,json=recommendedBudgetAmountMicros,proto3" json:"recommended_budget_amount_micros,omitempty"`
+	// The budget amounts and associated impact estimates for some values of
+	// possible budget amounts.
+	BudgetOptions        []*Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption `protobuf:"bytes,3,rep,name=budget_options,json=budgetOptions,proto3" json:"budget_options,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                                          `json:"-"`
+	XXX_unrecognized     []byte                                                                            `json:"-"`
+	XXX_sizecache        int32                                                                             `json:"-"`
+}
+
+func (m *Recommendation_CampaignBudgetRecommendation) Reset() {
+	*m = Recommendation_CampaignBudgetRecommendation{}
+}
+func (m *Recommendation_CampaignBudgetRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_CampaignBudgetRecommendation) ProtoMessage() {}
+func (*Recommendation_CampaignBudgetRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 2}
+}
+
+func (m *Recommendation_CampaignBudgetRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_CampaignBudgetRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_CampaignBudgetRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_CampaignBudgetRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_CampaignBudgetRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_CampaignBudgetRecommendation.Merge(m, src)
+}
+func (m *Recommendation_CampaignBudgetRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_CampaignBudgetRecommendation.Size(m)
+}
+func (m *Recommendation_CampaignBudgetRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_CampaignBudgetRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_CampaignBudgetRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_CampaignBudgetRecommendation) GetCurrentBudgetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CurrentBudgetAmountMicros
+	}
+	return nil
+}
+
+func (m *Recommendation_CampaignBudgetRecommendation) GetRecommendedBudgetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedBudgetAmountMicros
+	}
+	return nil
+}
+
+func (m *Recommendation_CampaignBudgetRecommendation) GetBudgetOptions() []*Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption {
+	if m != nil {
+		return m.BudgetOptions
+	}
+	return nil
+}
+
+// The impact estimates for a given budget amount.
+type Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption struct {
+	// The budget amount for this option.
+	BudgetAmountMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=budget_amount_micros,json=budgetAmountMicros,proto3" json:"budget_amount_micros,omitempty"`
+	// The impact estimate if budget is changed to amount specified in this
+	// option.
+	Impact               *Recommendation_RecommendationImpact `protobuf:"bytes,2,opt,name=impact,proto3" json:"impact,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
+	XXX_unrecognized     []byte                               `json:"-"`
+	XXX_sizecache        int32                                `json:"-"`
+}
+
+func (m *Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) Reset() {
+	*m = Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption{}
+}
+func (m *Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) ProtoMessage() {
+}
+func (*Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 2, 0}
+}
+
+func (m *Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption.Unmarshal(m, b)
+}
+func (m *Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption.Merge(m, src)
+}
+func (m *Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption.Size(m)
+}
+func (m *Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption proto.InternalMessageInfo
+
+func (m *Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) GetBudgetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.BudgetAmountMicros
+	}
+	return nil
+}
+
+func (m *Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption) GetImpact() *Recommendation_RecommendationImpact {
+	if m != nil {
+		return m.Impact
+	}
+	return nil
+}
+
+// The keyword recommendation.
+type Recommendation_KeywordRecommendation struct {
+	// The recommended keyword.
+	Keyword *common.KeywordInfo `protobuf:"bytes,1,opt,name=keyword,proto3" json:"keyword,omitempty"`
+	// The recommended CPC (cost-per-click) bid.
+	RecommendedCpcBidMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=recommended_cpc_bid_micros,json=recommendedCpcBidMicros,proto3" json:"recommended_cpc_bid_micros,omitempty"`
+	XXX_NoUnkeyedLiteral    struct{}             `json:"-"`
+	XXX_unrecognized        []byte               `json:"-"`
+	XXX_sizecache           int32                `json:"-"`
+}
+
+func (m *Recommendation_KeywordRecommendation) Reset()         { *m = Recommendation_KeywordRecommendation{} }
+func (m *Recommendation_KeywordRecommendation) String() string { return proto.CompactTextString(m) }
+func (*Recommendation_KeywordRecommendation) ProtoMessage()    {}
+func (*Recommendation_KeywordRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 3}
+}
+
+func (m *Recommendation_KeywordRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_KeywordRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_KeywordRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_KeywordRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_KeywordRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_KeywordRecommendation.Merge(m, src)
+}
+func (m *Recommendation_KeywordRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_KeywordRecommendation.Size(m)
+}
+func (m *Recommendation_KeywordRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_KeywordRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_KeywordRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_KeywordRecommendation) GetKeyword() *common.KeywordInfo {
+	if m != nil {
+		return m.Keyword
+	}
+	return nil
+}
+
+func (m *Recommendation_KeywordRecommendation) GetRecommendedCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedCpcBidMicros
+	}
+	return nil
+}
+
+// The Maximize Clicks opt-in recommendation.
+type Recommendation_MaximizeClicksOptInRecommendation struct {
+	// The recommended new budget amount.
+	// Only set if the current budget is too high.
+	RecommendedBudgetAmountMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=recommended_budget_amount_micros,json=recommendedBudgetAmountMicros,proto3" json:"recommended_budget_amount_micros,omitempty"`
+	XXX_NoUnkeyedLiteral          struct{}             `json:"-"`
+	XXX_unrecognized              []byte               `json:"-"`
+	XXX_sizecache                 int32                `json:"-"`
+}
+
+func (m *Recommendation_MaximizeClicksOptInRecommendation) Reset() {
+	*m = Recommendation_MaximizeClicksOptInRecommendation{}
+}
+func (m *Recommendation_MaximizeClicksOptInRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_MaximizeClicksOptInRecommendation) ProtoMessage() {}
+func (*Recommendation_MaximizeClicksOptInRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 4}
+}
+
+func (m *Recommendation_MaximizeClicksOptInRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_MaximizeClicksOptInRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_MaximizeClicksOptInRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_MaximizeClicksOptInRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_MaximizeClicksOptInRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_MaximizeClicksOptInRecommendation.Merge(m, src)
+}
+func (m *Recommendation_MaximizeClicksOptInRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_MaximizeClicksOptInRecommendation.Size(m)
+}
+func (m *Recommendation_MaximizeClicksOptInRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_MaximizeClicksOptInRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_MaximizeClicksOptInRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_MaximizeClicksOptInRecommendation) GetRecommendedBudgetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedBudgetAmountMicros
+	}
+	return nil
+}
+
+// The text ad recommendation.
+type Recommendation_TextAdRecommendation struct {
+	// Recommended ad.
+	Ad *Ad `protobuf:"bytes,1,opt,name=ad,proto3" json:"ad,omitempty"`
+	// Creation date of the recommended ad.
+	// YYYY-MM-DD format, e.g., 2018-04-17.
+	CreationDate *wrappers.StringValue `protobuf:"bytes,2,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"`
+	// Date, if present, is the earliest when the recommendation will be auto
+	// applied.
+	// YYYY-MM-DD format, e.g., 2018-04-17.
+	AutoApplyDate        *wrappers.StringValue `protobuf:"bytes,3,opt,name=auto_apply_date,json=autoApplyDate,proto3" json:"auto_apply_date,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *Recommendation_TextAdRecommendation) Reset()         { *m = Recommendation_TextAdRecommendation{} }
+func (m *Recommendation_TextAdRecommendation) String() string { return proto.CompactTextString(m) }
+func (*Recommendation_TextAdRecommendation) ProtoMessage()    {}
+func (*Recommendation_TextAdRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 5}
+}
+
+func (m *Recommendation_TextAdRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_TextAdRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_TextAdRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_TextAdRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_TextAdRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_TextAdRecommendation.Merge(m, src)
+}
+func (m *Recommendation_TextAdRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_TextAdRecommendation.Size(m)
+}
+func (m *Recommendation_TextAdRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_TextAdRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_TextAdRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_TextAdRecommendation) GetAd() *Ad {
+	if m != nil {
+		return m.Ad
+	}
+	return nil
+}
+
+func (m *Recommendation_TextAdRecommendation) GetCreationDate() *wrappers.StringValue {
+	if m != nil {
+		return m.CreationDate
+	}
+	return nil
+}
+
+func (m *Recommendation_TextAdRecommendation) GetAutoApplyDate() *wrappers.StringValue {
+	if m != nil {
+		return m.AutoApplyDate
+	}
+	return nil
+}
+
+// The move unused budget recommendation.
+type Recommendation_MoveUnusedBudgetRecommendation struct {
+	// The excess budget's resource_name.
+	ExcessCampaignBudget *wrappers.StringValue `protobuf:"bytes,1,opt,name=excess_campaign_budget,json=excessCampaignBudget,proto3" json:"excess_campaign_budget,omitempty"`
+	// The recommendation for the constrained budget to increase.
+	BudgetRecommendation *Recommendation_CampaignBudgetRecommendation `protobuf:"bytes,2,opt,name=budget_recommendation,json=budgetRecommendation,proto3" json:"budget_recommendation,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                     `json:"-"`
+	XXX_unrecognized     []byte                                       `json:"-"`
+	XXX_sizecache        int32                                        `json:"-"`
+}
+
+func (m *Recommendation_MoveUnusedBudgetRecommendation) Reset() {
+	*m = Recommendation_MoveUnusedBudgetRecommendation{}
+}
+func (m *Recommendation_MoveUnusedBudgetRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_MoveUnusedBudgetRecommendation) ProtoMessage() {}
+func (*Recommendation_MoveUnusedBudgetRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 6}
+}
+
+func (m *Recommendation_MoveUnusedBudgetRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_MoveUnusedBudgetRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_MoveUnusedBudgetRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_MoveUnusedBudgetRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_MoveUnusedBudgetRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_MoveUnusedBudgetRecommendation.Merge(m, src)
+}
+func (m *Recommendation_MoveUnusedBudgetRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_MoveUnusedBudgetRecommendation.Size(m)
+}
+func (m *Recommendation_MoveUnusedBudgetRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_MoveUnusedBudgetRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_MoveUnusedBudgetRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_MoveUnusedBudgetRecommendation) GetExcessCampaignBudget() *wrappers.StringValue {
+	if m != nil {
+		return m.ExcessCampaignBudget
+	}
+	return nil
+}
+
+func (m *Recommendation_MoveUnusedBudgetRecommendation) GetBudgetRecommendation() *Recommendation_CampaignBudgetRecommendation {
+	if m != nil {
+		return m.BudgetRecommendation
+	}
+	return nil
+}
+
+// The Target CPA opt-in recommendation.
+type Recommendation_TargetCpaOptInRecommendation struct {
+	// The available goals and corresponding options for Target CPA strategy.
+	Options []*Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption `protobuf:"bytes,1,rep,name=options,proto3" json:"options,omitempty"`
+	// The recommended average CPA target. See required budget amount and impact
+	// of using this recommendation in options list.
+	RecommendedTargetCpaMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=recommended_target_cpa_micros,json=recommendedTargetCpaMicros,proto3" json:"recommended_target_cpa_micros,omitempty"`
+	XXX_NoUnkeyedLiteral       struct{}             `json:"-"`
+	XXX_unrecognized           []byte               `json:"-"`
+	XXX_sizecache              int32                `json:"-"`
+}
+
+func (m *Recommendation_TargetCpaOptInRecommendation) Reset() {
+	*m = Recommendation_TargetCpaOptInRecommendation{}
+}
+func (m *Recommendation_TargetCpaOptInRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_TargetCpaOptInRecommendation) ProtoMessage() {}
+func (*Recommendation_TargetCpaOptInRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 7}
+}
+
+func (m *Recommendation_TargetCpaOptInRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_TargetCpaOptInRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_TargetCpaOptInRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation.Merge(m, src)
+}
+func (m *Recommendation_TargetCpaOptInRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation.Size(m)
+}
+func (m *Recommendation_TargetCpaOptInRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_TargetCpaOptInRecommendation) GetOptions() []*Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption {
+	if m != nil {
+		return m.Options
+	}
+	return nil
+}
+
+func (m *Recommendation_TargetCpaOptInRecommendation) GetRecommendedTargetCpaMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedTargetCpaMicros
+	}
+	return nil
+}
+
+// The Target CPA opt-in option with impact estimate.
+type Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption struct {
+	// The goal achieved by this option.
+	Goal enums.TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal `protobuf:"varint,1,opt,name=goal,proto3,enum=google.ads.googleads.v3.enums.TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal" json:"goal,omitempty"`
+	// Average CPA target.
+	TargetCpaMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=target_cpa_micros,json=targetCpaMicros,proto3" json:"target_cpa_micros,omitempty"`
+	// The minimum campaign budget, in local currency for the account,
+	// required to achieve the target CPA.
+	// Amount is specified in micros, where one million is equivalent to one
+	// currency unit.
+	RequiredCampaignBudgetAmountMicros *wrappers.Int64Value `protobuf:"bytes,3,opt,name=required_campaign_budget_amount_micros,json=requiredCampaignBudgetAmountMicros,proto3" json:"required_campaign_budget_amount_micros,omitempty"`
+	// The impact estimate if this option is selected.
+	Impact               *Recommendation_RecommendationImpact `protobuf:"bytes,4,opt,name=impact,proto3" json:"impact,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
+	XXX_unrecognized     []byte                               `json:"-"`
+	XXX_sizecache        int32                                `json:"-"`
+}
+
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) Reset() {
+	*m = Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption{}
+}
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) ProtoMessage() {
+}
+func (*Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 7, 0}
+}
+
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption.Unmarshal(m, b)
+}
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption.Merge(m, src)
+}
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption.Size(m)
+}
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption proto.InternalMessageInfo
+
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) GetGoal() enums.TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal {
+	if m != nil {
+		return m.Goal
+	}
+	return enums.TargetCpaOptInRecommendationGoalEnum_UNSPECIFIED
+}
+
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) GetTargetCpaMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TargetCpaMicros
+	}
+	return nil
+}
+
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) GetRequiredCampaignBudgetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.RequiredCampaignBudgetAmountMicros
+	}
+	return nil
+}
+
+func (m *Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption) GetImpact() *Recommendation_RecommendationImpact {
+	if m != nil {
+		return m.Impact
+	}
+	return nil
+}
+
+// The Callout extension recommendation.
+type Recommendation_CalloutExtensionRecommendation struct {
+	// Callout extensions recommended to be added.
+	RecommendedExtensions []*common.CalloutFeedItem `protobuf:"bytes,1,rep,name=recommended_extensions,json=recommendedExtensions,proto3" json:"recommended_extensions,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{}                  `json:"-"`
+	XXX_unrecognized      []byte                    `json:"-"`
+	XXX_sizecache         int32                     `json:"-"`
+}
+
+func (m *Recommendation_CalloutExtensionRecommendation) Reset() {
+	*m = Recommendation_CalloutExtensionRecommendation{}
+}
+func (m *Recommendation_CalloutExtensionRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_CalloutExtensionRecommendation) ProtoMessage() {}
+func (*Recommendation_CalloutExtensionRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 8}
+}
+
+func (m *Recommendation_CalloutExtensionRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_CalloutExtensionRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_CalloutExtensionRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_CalloutExtensionRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_CalloutExtensionRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_CalloutExtensionRecommendation.Merge(m, src)
+}
+func (m *Recommendation_CalloutExtensionRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_CalloutExtensionRecommendation.Size(m)
+}
+func (m *Recommendation_CalloutExtensionRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_CalloutExtensionRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_CalloutExtensionRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_CalloutExtensionRecommendation) GetRecommendedExtensions() []*common.CalloutFeedItem {
+	if m != nil {
+		return m.RecommendedExtensions
+	}
+	return nil
+}
+
+// The Maximize Conversions Opt-In recommendation.
+type Recommendation_MaximizeConversionsOptInRecommendation struct {
+	// The recommended new budget amount.
+	RecommendedBudgetAmountMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=recommended_budget_amount_micros,json=recommendedBudgetAmountMicros,proto3" json:"recommended_budget_amount_micros,omitempty"`
+	XXX_NoUnkeyedLiteral          struct{}             `json:"-"`
+	XXX_unrecognized              []byte               `json:"-"`
+	XXX_sizecache                 int32                `json:"-"`
+}
+
+func (m *Recommendation_MaximizeConversionsOptInRecommendation) Reset() {
+	*m = Recommendation_MaximizeConversionsOptInRecommendation{}
+}
+func (m *Recommendation_MaximizeConversionsOptInRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_MaximizeConversionsOptInRecommendation) ProtoMessage() {}
+func (*Recommendation_MaximizeConversionsOptInRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 9}
+}
+
+func (m *Recommendation_MaximizeConversionsOptInRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_MaximizeConversionsOptInRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_MaximizeConversionsOptInRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_MaximizeConversionsOptInRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_MaximizeConversionsOptInRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_MaximizeConversionsOptInRecommendation.Merge(m, src)
+}
+func (m *Recommendation_MaximizeConversionsOptInRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_MaximizeConversionsOptInRecommendation.Size(m)
+}
+func (m *Recommendation_MaximizeConversionsOptInRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_MaximizeConversionsOptInRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_MaximizeConversionsOptInRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_MaximizeConversionsOptInRecommendation) GetRecommendedBudgetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.RecommendedBudgetAmountMicros
+	}
+	return nil
+}
+
+// The Enhanced Cost-Per-Click Opt-In recommendation.
+type Recommendation_EnhancedCpcOptInRecommendation struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Recommendation_EnhancedCpcOptInRecommendation) Reset() {
+	*m = Recommendation_EnhancedCpcOptInRecommendation{}
+}
+func (m *Recommendation_EnhancedCpcOptInRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_EnhancedCpcOptInRecommendation) ProtoMessage() {}
+func (*Recommendation_EnhancedCpcOptInRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 10}
+}
+
+func (m *Recommendation_EnhancedCpcOptInRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_EnhancedCpcOptInRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_EnhancedCpcOptInRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_EnhancedCpcOptInRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_EnhancedCpcOptInRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_EnhancedCpcOptInRecommendation.Merge(m, src)
+}
+func (m *Recommendation_EnhancedCpcOptInRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_EnhancedCpcOptInRecommendation.Size(m)
+}
+func (m *Recommendation_EnhancedCpcOptInRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_EnhancedCpcOptInRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_EnhancedCpcOptInRecommendation proto.InternalMessageInfo
+
+// The keyword match type recommendation.
+type Recommendation_KeywordMatchTypeRecommendation struct {
+	// The existing keyword where the match type should be more broad.
+	Keyword *common.KeywordInfo `protobuf:"bytes,1,opt,name=keyword,proto3" json:"keyword,omitempty"`
+	// The recommended new match type.
+	RecommendedMatchType enums.KeywordMatchTypeEnum_KeywordMatchType `protobuf:"varint,2,opt,name=recommended_match_type,json=recommendedMatchType,proto3,enum=google.ads.googleads.v3.enums.KeywordMatchTypeEnum_KeywordMatchType" json:"recommended_match_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *Recommendation_KeywordMatchTypeRecommendation) Reset() {
+	*m = Recommendation_KeywordMatchTypeRecommendation{}
+}
+func (m *Recommendation_KeywordMatchTypeRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_KeywordMatchTypeRecommendation) ProtoMessage() {}
+func (*Recommendation_KeywordMatchTypeRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 11}
+}
+
+func (m *Recommendation_KeywordMatchTypeRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_KeywordMatchTypeRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_KeywordMatchTypeRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_KeywordMatchTypeRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_KeywordMatchTypeRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_KeywordMatchTypeRecommendation.Merge(m, src)
+}
+func (m *Recommendation_KeywordMatchTypeRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_KeywordMatchTypeRecommendation.Size(m)
+}
+func (m *Recommendation_KeywordMatchTypeRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_KeywordMatchTypeRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_KeywordMatchTypeRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_KeywordMatchTypeRecommendation) GetKeyword() *common.KeywordInfo {
+	if m != nil {
+		return m.Keyword
+	}
+	return nil
+}
+
+func (m *Recommendation_KeywordMatchTypeRecommendation) GetRecommendedMatchType() enums.KeywordMatchTypeEnum_KeywordMatchType {
+	if m != nil {
+		return m.RecommendedMatchType
+	}
+	return enums.KeywordMatchTypeEnum_UNSPECIFIED
+}
+
+// The Search Partners Opt-In recommendation.
+type Recommendation_SearchPartnersOptInRecommendation struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Recommendation_SearchPartnersOptInRecommendation) Reset() {
+	*m = Recommendation_SearchPartnersOptInRecommendation{}
+}
+func (m *Recommendation_SearchPartnersOptInRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_SearchPartnersOptInRecommendation) ProtoMessage() {}
+func (*Recommendation_SearchPartnersOptInRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 12}
+}
+
+func (m *Recommendation_SearchPartnersOptInRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_SearchPartnersOptInRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_SearchPartnersOptInRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_SearchPartnersOptInRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_SearchPartnersOptInRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_SearchPartnersOptInRecommendation.Merge(m, src)
+}
+func (m *Recommendation_SearchPartnersOptInRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_SearchPartnersOptInRecommendation.Size(m)
+}
+func (m *Recommendation_SearchPartnersOptInRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_SearchPartnersOptInRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_SearchPartnersOptInRecommendation proto.InternalMessageInfo
+
+// The Optimize Ad Rotation recommendation.
+type Recommendation_OptimizeAdRotationRecommendation struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Recommendation_OptimizeAdRotationRecommendation) Reset() {
+	*m = Recommendation_OptimizeAdRotationRecommendation{}
+}
+func (m *Recommendation_OptimizeAdRotationRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_OptimizeAdRotationRecommendation) ProtoMessage() {}
+func (*Recommendation_OptimizeAdRotationRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 13}
+}
+
+func (m *Recommendation_OptimizeAdRotationRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_OptimizeAdRotationRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_OptimizeAdRotationRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_OptimizeAdRotationRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_OptimizeAdRotationRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_OptimizeAdRotationRecommendation.Merge(m, src)
+}
+func (m *Recommendation_OptimizeAdRotationRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_OptimizeAdRotationRecommendation.Size(m)
+}
+func (m *Recommendation_OptimizeAdRotationRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_OptimizeAdRotationRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_OptimizeAdRotationRecommendation proto.InternalMessageInfo
+
+// The Sitelink extension recommendation.
+type Recommendation_SitelinkExtensionRecommendation struct {
+	// Sitelink extensions recommended to be added.
+	RecommendedExtensions []*common.SitelinkFeedItem `protobuf:"bytes,1,rep,name=recommended_extensions,json=recommendedExtensions,proto3" json:"recommended_extensions,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{}                   `json:"-"`
+	XXX_unrecognized      []byte                     `json:"-"`
+	XXX_sizecache         int32                      `json:"-"`
+}
+
+func (m *Recommendation_SitelinkExtensionRecommendation) Reset() {
+	*m = Recommendation_SitelinkExtensionRecommendation{}
+}
+func (m *Recommendation_SitelinkExtensionRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_SitelinkExtensionRecommendation) ProtoMessage() {}
+func (*Recommendation_SitelinkExtensionRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 14}
+}
+
+func (m *Recommendation_SitelinkExtensionRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_SitelinkExtensionRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_SitelinkExtensionRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_SitelinkExtensionRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_SitelinkExtensionRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_SitelinkExtensionRecommendation.Merge(m, src)
+}
+func (m *Recommendation_SitelinkExtensionRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_SitelinkExtensionRecommendation.Size(m)
+}
+func (m *Recommendation_SitelinkExtensionRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_SitelinkExtensionRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_SitelinkExtensionRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_SitelinkExtensionRecommendation) GetRecommendedExtensions() []*common.SitelinkFeedItem {
+	if m != nil {
+		return m.RecommendedExtensions
+	}
+	return nil
+}
+
+// The Call extension recommendation.
+type Recommendation_CallExtensionRecommendation struct {
+	// Call extensions recommended to be added.
+	RecommendedExtensions []*common.CallFeedItem `protobuf:"bytes,1,rep,name=recommended_extensions,json=recommendedExtensions,proto3" json:"recommended_extensions,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{}               `json:"-"`
+	XXX_unrecognized      []byte                 `json:"-"`
+	XXX_sizecache         int32                  `json:"-"`
+}
+
+func (m *Recommendation_CallExtensionRecommendation) Reset() {
+	*m = Recommendation_CallExtensionRecommendation{}
+}
+func (m *Recommendation_CallExtensionRecommendation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*Recommendation_CallExtensionRecommendation) ProtoMessage() {}
+func (*Recommendation_CallExtensionRecommendation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d8d0d8505cb0b2b, []int{0, 15}
+}
+
+func (m *Recommendation_CallExtensionRecommendation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Recommendation_CallExtensionRecommendation.Unmarshal(m, b)
+}
+func (m *Recommendation_CallExtensionRecommendation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Recommendation_CallExtensionRecommendation.Marshal(b, m, deterministic)
+}
+func (m *Recommendation_CallExtensionRecommendation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Recommendation_CallExtensionRecommendation.Merge(m, src)
+}
+func (m *Recommendation_CallExtensionRecommendation) XXX_Size() int {
+	return xxx_messageInfo_Recommendation_CallExtensionRecommendation.Size(m)
+}
+func (m *Recommendation_CallExtensionRecommendation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Recommendation_CallExtensionRecommendation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Recommendation_CallExtensionRecommendation proto.InternalMessageInfo
+
+func (m *Recommendation_CallExtensionRecommendation) GetRecommendedExtensions() []*common.CallFeedItem {
+	if m != nil {
+		return m.RecommendedExtensions
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Recommendation)(nil), "google.ads.googleads.v3.resources.Recommendation")
+	proto.RegisterType((*Recommendation_RecommendationImpact)(nil), "google.ads.googleads.v3.resources.Recommendation.RecommendationImpact")
+	proto.RegisterType((*Recommendation_RecommendationMetrics)(nil), "google.ads.googleads.v3.resources.Recommendation.RecommendationMetrics")
+	proto.RegisterType((*Recommendation_CampaignBudgetRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.CampaignBudgetRecommendation")
+	proto.RegisterType((*Recommendation_CampaignBudgetRecommendation_CampaignBudgetRecommendationOption)(nil), "google.ads.googleads.v3.resources.Recommendation.CampaignBudgetRecommendation.CampaignBudgetRecommendationOption")
+	proto.RegisterType((*Recommendation_KeywordRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.KeywordRecommendation")
+	proto.RegisterType((*Recommendation_MaximizeClicksOptInRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.MaximizeClicksOptInRecommendation")
+	proto.RegisterType((*Recommendation_TextAdRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.TextAdRecommendation")
+	proto.RegisterType((*Recommendation_MoveUnusedBudgetRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.MoveUnusedBudgetRecommendation")
+	proto.RegisterType((*Recommendation_TargetCpaOptInRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.TargetCpaOptInRecommendation")
+	proto.RegisterType((*Recommendation_TargetCpaOptInRecommendation_TargetCpaOptInRecommendationOption)(nil), "google.ads.googleads.v3.resources.Recommendation.TargetCpaOptInRecommendation.TargetCpaOptInRecommendationOption")
+	proto.RegisterType((*Recommendation_CalloutExtensionRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.CalloutExtensionRecommendation")
+	proto.RegisterType((*Recommendation_MaximizeConversionsOptInRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.MaximizeConversionsOptInRecommendation")
+	proto.RegisterType((*Recommendation_EnhancedCpcOptInRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.EnhancedCpcOptInRecommendation")
+	proto.RegisterType((*Recommendation_KeywordMatchTypeRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.KeywordMatchTypeRecommendation")
+	proto.RegisterType((*Recommendation_SearchPartnersOptInRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.SearchPartnersOptInRecommendation")
+	proto.RegisterType((*Recommendation_OptimizeAdRotationRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.OptimizeAdRotationRecommendation")
+	proto.RegisterType((*Recommendation_SitelinkExtensionRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.SitelinkExtensionRecommendation")
+	proto.RegisterType((*Recommendation_CallExtensionRecommendation)(nil), "google.ads.googleads.v3.resources.Recommendation.CallExtensionRecommendation")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/recommendation.proto", fileDescriptor_4d8d0d8505cb0b2b)
+}
+
+var fileDescriptor_4d8d0d8505cb0b2b = []byte{
+	// 1713 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x59, 0x5b, 0x6f, 0xdc, 0xb8,
+	0x15, 0x2e, 0xc7, 0x5e, 0x3b, 0x39, 0xbe, 0x25, 0x5c, 0xdb, 0x9d, 0x55, 0xbc, 0xb3, 0x63, 0x07,
+	0x4e, 0x8d, 0x6d, 0x3b, 0x53, 0xd8, 0xdb, 0xdd, 0xc5, 0xf4, 0x02, 0x8c, 0x2f, 0xeb, 0x75, 0x0b,
+	0x27, 0xae, 0x92, 0x1a, 0x41, 0x61, 0x44, 0xa5, 0x25, 0x66, 0xa2, 0x7a, 0x24, 0x2a, 0x22, 0xe5,
+	0xd8, 0x09, 0x52, 0x04, 0x6d, 0x1f, 0x7a, 0x01, 0xfa, 0x52, 0xa0, 0xc8, 0x43, 0x2f, 0x40, 0xfb,
+	0x50, 0xa0, 0x3f, 0xa0, 0xc8, 0x3f, 0x28, 0x90, 0xd7, 0x00, 0xfd, 0x03, 0x7d, 0xcb, 0x2f, 0x28,
+	0xfa, 0x54, 0x88, 0xa2, 0x34, 0x9a, 0x8b, 0xa4, 0xf1, 0x34, 0xd9, 0x37, 0x0d, 0x79, 0xbe, 0xef,
+	0x7c, 0x24, 0x0f, 0x0f, 0x0f, 0x39, 0xf0, 0x71, 0x8b, 0xb1, 0x56, 0x9b, 0xd6, 0x89, 0xc5, 0xeb,
+	0xd1, 0x67, 0xf8, 0x75, 0xba, 0x51, 0xf7, 0x29, 0x67, 0x81, 0x6f, 0x52, 0x5e, 0xf7, 0xa9, 0xc9,
+	0x1c, 0x87, 0xba, 0x16, 0x11, 0x36, 0x73, 0x6b, 0x9e, 0xcf, 0x04, 0xc3, 0xcb, 0x91, 0x71, 0x8d,
+	0x58, 0xbc, 0x96, 0xe0, 0x6a, 0xa7, 0x1b, 0xb5, 0x04, 0xa7, 0x7d, 0x3d, 0x8b, 0x3a, 0xa4, 0x63,
+	0x6e, 0xdd, 0xf4, 0x6d, 0x41, 0x7d, 0x9b, 0x44, 0x8c, 0x5a, 0xbd, 0xc0, 0x9c, 0x9e, 0x09, 0xea,
+	0x72, 0x9b, 0xb9, 0x5c, 0x01, 0x32, 0xa5, 0x53, 0x37, 0x70, 0x78, 0xfd, 0x84, 0x9e, 0x3f, 0x62,
+	0xbe, 0x65, 0x38, 0x44, 0x98, 0x0f, 0x0c, 0x71, 0xee, 0x51, 0x85, 0xfb, 0x24, 0x1f, 0xd7, 0x3d,
+	0xdc, 0x34, 0x70, 0x2f, 0x1f, 0x28, 0x88, 0xdf, 0xa2, 0xc2, 0x30, 0x3d, 0x62, 0x30, 0x4f, 0x18,
+	0xb6, 0x6b, 0xf4, 0x50, 0xb5, 0x18, 0x69, 0x2b, 0xaa, 0x0f, 0x8b, 0xa7, 0x9d, 0x58, 0xca, 0xf6,
+	0xbd, 0xd8, 0xd6, 0xb3, 0x93, 0x6e, 0xd5, 0x55, 0x51, 0x5d, 0xf2, 0xd7, 0x71, 0x70, 0xbf, 0xfe,
+	0xc8, 0x27, 0x9e, 0x47, 0xfd, 0x78, 0x8a, 0x96, 0x52, 0x50, 0xe2, 0xba, 0x4c, 0x48, 0x21, 0xaa,
+	0x77, 0xe5, 0x17, 0xeb, 0x30, 0xab, 0x77, 0x49, 0xc4, 0xd7, 0x61, 0x26, 0x76, 0x61, 0xb8, 0xc4,
+	0xa1, 0x65, 0x54, 0x45, 0x6b, 0x97, 0xf5, 0xe9, 0xb8, 0xf1, 0x26, 0x71, 0x28, 0x3e, 0x82, 0xf1,
+	0x70, 0x56, 0xca, 0xa5, 0x2a, 0x5a, 0x9b, 0x5d, 0xff, 0xbc, 0x96, 0x15, 0x0a, 0x72, 0x5a, 0x6a,
+	0xdd, 0x1e, 0xee, 0x9c, 0x7b, 0x74, 0xc7, 0x0d, 0x9c, 0x01, 0xcd, 0xba, 0x64, 0xc5, 0xf7, 0x60,
+	0xc2, 0x76, 0x3c, 0x62, 0x8a, 0xf2, 0x58, 0x15, 0xad, 0x4d, 0xad, 0x7f, 0x56, 0x2b, 0x0c, 0xb5,
+	0x1e, 0xb2, 0x9e, 0x9f, 0x7b, 0x92, 0x4d, 0x57, 0xac, 0x78, 0x07, 0xe6, 0x4c, 0xe2, 0x78, 0xc4,
+	0x6e, 0xb9, 0xc6, 0x71, 0x60, 0xb5, 0xa8, 0x28, 0xbf, 0x23, 0x1d, 0x2d, 0xc5, 0x8e, 0xe2, 0xd9,
+	0xac, 0xdd, 0x16, 0xbe, 0xed, 0xb6, 0x0e, 0x49, 0x3b, 0xa0, 0xfa, 0x6c, 0x0c, 0xda, 0x94, 0x18,
+	0xfc, 0x29, 0x5c, 0x8a, 0x5b, 0xca, 0x13, 0x43, 0xe0, 0x13, 0x6b, 0xfc, 0x09, 0x5c, 0x22, 0x96,
+	0xd1, 0xf2, 0x59, 0xe0, 0x95, 0x27, 0x87, 0x40, 0x4e, 0x12, 0x6b, 0x37, 0x34, 0xc6, 0x9f, 0xc2,
+	0x65, 0xcb, 0xe6, 0x8e, 0xcd, 0x39, 0xb5, 0xca, 0x33, 0x12, 0xa9, 0xf5, 0x21, 0x37, 0x19, 0x6b,
+	0x47, 0xb8, 0x8e, 0x31, 0xfe, 0x3d, 0x82, 0x4a, 0xcf, 0xa0, 0x7b, 0x82, 0xb3, 0x3c, 0x2e, 0xf9,
+	0x6e, 0x5e, 0x7c, 0xb2, 0xb7, 0xba, 0xe6, 0xa5, 0xbb, 0xf3, 0xf3, 0x2f, 0xe9, 0x4b, 0x66, 0x4e,
+	0x3f, 0x7e, 0x86, 0x60, 0x31, 0xde, 0xa8, 0x3d, 0x82, 0x2e, 0x49, 0x41, 0xbb, 0x17, 0x17, 0xf4,
+	0xfd, 0x88, 0xaf, 0x4f, 0xc9, 0xc2, 0xc9, 0xa0, 0x0e, 0xfc, 0x53, 0x58, 0x14, 0xf4, 0x4c, 0x18,
+	0xa4, 0x4f, 0xc1, 0xe5, 0x51, 0xe3, 0xef, 0x0e, 0x3d, 0x13, 0xcd, 0x7e, 0x01, 0xf3, 0x62, 0x40,
+	0x3b, 0x7e, 0x8e, 0xa0, 0x5a, 0x94, 0x3a, 0xca, 0x30, 0xea, 0xea, 0xdc, 0x91, 0xcc, 0x5b, 0x1e,
+	0xb9, 0xe5, 0x89, 0x3d, 0xb7, 0x7f, 0x75, 0x44, 0x4e, 0x3f, 0xfe, 0x07, 0x82, 0x0f, 0x1d, 0x72,
+	0x66, 0x3b, 0xf6, 0x63, 0x6a, 0x98, 0xcc, 0x3d, 0xa5, 0xbe, 0x4c, 0xc0, 0x19, 0x22, 0xa7, 0xa4,
+	0xc8, 0xbb, 0x17, 0x17, 0xb9, 0xaf, 0x7c, 0x6c, 0x75, 0x5c, 0x0c, 0x96, 0x7b, 0xc3, 0x19, 0xca,
+	0x12, 0xff, 0x09, 0xc1, 0x0a, 0x75, 0x1f, 0x10, 0xd7, 0xa4, 0x96, 0x61, 0x7a, 0x66, 0x86, 0xe0,
+	0x69, 0x29, 0xf8, 0xe0, 0xe2, 0x82, 0x77, 0x14, 0xf7, 0x96, 0x67, 0x0e, 0x16, 0x5a, 0xa1, 0xb9,
+	0x16, 0xf8, 0x6f, 0x08, 0x56, 0x39, 0x25, 0xbe, 0xf9, 0xc0, 0xf0, 0x88, 0x2f, 0x5c, 0xea, 0x67,
+	0x4d, 0xea, 0xac, 0xd4, 0x78, 0xfb, 0xe2, 0x1a, 0x6f, 0x4b, 0xfa, 0x03, 0xc5, 0x3e, 0x58, 0xe6,
+	0x32, 0x2f, 0x32, 0x92, 0x4a, 0x3b, 0x31, 0xd0, 0xb6, 0xcd, 0x93, 0x2c, 0xa5, 0x73, 0xa3, 0x2a,
+	0x4d, 0x96, 0x5f, 0xb2, 0x67, 0x28, 0x75, 0x8a, 0x8c, 0xf0, 0x5f, 0x11, 0x5c, 0x67, 0x9e, 0x88,
+	0x94, 0x86, 0xbb, 0x59, 0x1d, 0x77, 0xbd, 0x3a, 0xaf, 0x48, 0x9d, 0xfa, 0xc5, 0x75, 0xde, 0x52,
+	0xe4, 0x4d, 0x4b, 0x57, 0xd4, 0x7d, 0x32, 0xab, 0xac, 0xc0, 0x06, 0xff, 0x01, 0x41, 0xd5, 0x24,
+	0xed, 0x36, 0x0b, 0x84, 0x91, 0x94, 0x34, 0xbd, 0x12, 0xaf, 0x8e, 0x1a, 0x98, 0x5b, 0x11, 0xf3,
+	0x4e, 0x4c, 0xdc, 0x1f, 0x98, 0x66, 0xae, 0x05, 0xfe, 0x33, 0x82, 0x65, 0x6e, 0x0b, 0xda, 0xb6,
+	0xdd, 0x93, 0x6c, 0x7d, 0x58, 0xea, 0xfb, 0xc1, 0x08, 0x41, 0xa9, 0xa8, 0xb3, 0x05, 0x7e, 0xc0,
+	0xf3, 0x4d, 0xf0, 0xef, 0x10, 0xbc, 0x1f, 0x0e, 0x22, 0x5b, 0xdd, 0xbb, 0x52, 0xdd, 0xfe, 0x68,
+	0xb3, 0x97, 0xad, 0xec, 0x9a, 0x99, 0xdd, 0x8d, 0xff, 0x88, 0x60, 0xb9, 0xbf, 0xe2, 0xec, 0x55,
+	0x36, 0x3f, 0xea, 0xba, 0xaa, 0x33, 0x6d, 0x3f, 0x64, 0x96, 0xb5, 0x52, 0xdf, 0xba, 0x9e, 0xe4,
+	0x5a, 0x48, 0x7d, 0x0e, 0x3b, 0xa5, 0x46, 0xe0, 0x06, 0x9c, 0x5a, 0x19, 0x45, 0xc0, 0xc2, 0xa8,
+	0xfa, 0xf6, 0xd9, 0x29, 0xfd, 0xa1, 0x64, 0xce, 0x28, 0x03, 0x2a, 0x4e, 0xae, 0x85, 0xf6, 0x1f,
+	0x04, 0xf3, 0x83, 0xca, 0x36, 0xfc, 0x13, 0x98, 0x3e, 0x26, 0x9c, 0x1a, 0x0e, 0x15, 0xbe, 0x6d,
+	0x72, 0x59, 0x90, 0x8e, 0x54, 0x16, 0x74, 0xff, 0xdc, 0x8f, 0xe8, 0xf4, 0xa9, 0x90, 0x5c, 0xfd,
+	0xc0, 0x02, 0xae, 0x7a, 0x4c, 0x50, 0x57, 0xd8, 0xa4, 0x9d, 0x38, 0x2c, 0xbd, 0x59, 0x87, 0x57,
+	0x12, 0x0f, 0xaa, 0x45, 0x7b, 0x59, 0x82, 0x85, 0x81, 0xb6, 0xf8, 0xbb, 0x30, 0x65, 0x3b, 0x9e,
+	0x4f, 0xb9, 0x3c, 0xe8, 0xd4, 0xd0, 0xfb, 0x8b, 0xc5, 0x6d, 0x16, 0x1c, 0xb7, 0x69, 0x54, 0xf4,
+	0xa5, 0x01, 0xf8, 0x23, 0x98, 0x88, 0x32, 0xb6, 0x1a, 0x44, 0x3e, 0x54, 0xd9, 0xe2, 0x6f, 0xc3,
+	0x94, 0xc9, 0xb8, 0x30, 0x1c, 0xdb, 0xf4, 0x19, 0x57, 0x55, 0xf8, 0xb5, 0x3e, 0xe8, 0x9e, 0x2b,
+	0x3e, 0xfe, 0x28, 0x42, 0x42, 0x68, 0xbf, 0x2f, 0xcd, 0x43, 0xcd, 0xa9, 0x4a, 0x41, 0x95, 0x95,
+	0x05, 0x9a, 0x53, 0x00, 0xfc, 0x1d, 0x98, 0x3a, 0xb5, 0x2d, 0xca, 0x8c, 0x53, 0x9b, 0x3e, 0xe2,
+	0x99, 0xa5, 0x79, 0x1a, 0x0f, 0x12, 0x70, 0x18, 0xda, 0x6b, 0xaf, 0xc6, 0x61, 0x29, 0xaf, 0x22,
+	0xc5, 0x47, 0xb0, 0x64, 0x06, 0xbe, 0x4f, 0x5d, 0x11, 0xef, 0x01, 0xe2, 0xb0, 0xc0, 0x4d, 0x86,
+	0x8b, 0x8a, 0x87, 0xfb, 0x9e, 0x22, 0x88, 0xf8, 0x9b, 0x12, 0xae, 0x46, 0x6f, 0x41, 0x35, 0xd9,
+	0x52, 0x9d, 0x5d, 0xd6, 0xed, 0xa1, 0x54, 0xec, 0xe1, 0xfd, 0x14, 0xc9, 0x00, 0x2f, 0xcf, 0x11,
+	0xcc, 0x2a, 0xea, 0xf0, 0xbc, 0x09, 0xe7, 0x79, 0xac, 0x3a, 0xb6, 0x36, 0xb5, 0xfe, 0xf0, 0xcd,
+	0x96, 0xef, 0xb9, 0x9d, 0xb7, 0xa4, 0x67, 0x7d, 0x26, 0x12, 0x12, 0xfd, 0xe2, 0xda, 0x2b, 0x04,
+	0x2b, 0xc5, 0x28, 0xbc, 0x0f, 0xf3, 0xa3, 0xce, 0x3e, 0x3e, 0xee, 0x9f, 0x90, 0xce, 0x9d, 0xb1,
+	0xf4, 0x36, 0xee, 0x8c, 0xda, 0x0b, 0x04, 0x0b, 0x03, 0xaf, 0x15, 0x78, 0x07, 0x26, 0x55, 0xe6,
+	0x55, 0xda, 0xbf, 0x9a, 0xe9, 0x3a, 0x7a, 0xc7, 0x88, 0x53, 0xf9, 0x9e, 0x7b, 0x9f, 0xe9, 0x31,
+	0x16, 0xdf, 0x05, 0x2d, 0x1d, 0x37, 0x61, 0xc9, 0x7a, 0x6c, 0x5b, 0x17, 0x88, 0x98, 0x2f, 0xa7,
+	0xe0, 0x5b, 0x9e, 0xb9, 0x69, 0x5b, 0xd1, 0xd4, 0x68, 0xbf, 0x42, 0xb0, 0x5c, 0x58, 0x60, 0x0d,
+	0x15, 0xb7, 0xe8, 0xff, 0x8d, 0x5b, 0xed, 0x5f, 0x08, 0xe6, 0x07, 0xdd, 0x8d, 0xf0, 0x37, 0xa1,
+	0x44, 0xe2, 0x09, 0x5c, 0x1d, 0x62, 0xed, 0x9a, 0x96, 0x5e, 0x22, 0x16, 0x6e, 0xc2, 0x8c, 0xe9,
+	0xd3, 0xa8, 0xc8, 0xb3, 0x88, 0xa0, 0x99, 0x69, 0x2e, 0x7d, 0x9d, 0x9e, 0x8e, 0x21, 0xdb, 0x44,
+	0x50, 0xbc, 0x0d, 0x73, 0x24, 0x10, 0xcc, 0x20, 0x9e, 0xd7, 0x3e, 0x8f, 0x48, 0xc6, 0x86, 0x20,
+	0x99, 0x09, 0x41, 0xcd, 0x10, 0x13, 0xb2, 0x68, 0xff, 0x45, 0x50, 0xc9, 0x3f, 0x02, 0xb1, 0x0e,
+	0x8b, 0xf4, 0xcc, 0xa4, 0x9c, 0x1b, 0xbd, 0xaf, 0x0f, 0x68, 0x08, 0x7f, 0xf3, 0x11, 0xb6, 0x7b,
+	0x67, 0xe1, 0x9f, 0x23, 0x58, 0x18, 0x7c, 0x90, 0x97, 0xde, 0xc6, 0x6d, 0x5e, 0x57, 0x7b, 0xb6,
+	0xe7, 0xe8, 0xfe, 0xe7, 0x3b, 0xb0, 0x94, 0x77, 0xcd, 0xc4, 0xbf, 0x41, 0x30, 0x19, 0xe7, 0x29,
+	0x34, 0x6a, 0x9e, 0xca, 0xf3, 0x90, 0xdb, 0xa9, 0xf2, 0x54, 0xac, 0x00, 0xdf, 0x83, 0x74, 0x94,
+	0x1a, 0xa9, 0xab, 0xf7, 0xf0, 0xbb, 0x2d, 0xbd, 0x59, 0x13, 0xdf, 0x2a, 0xc8, 0x5f, 0x8c, 0xc1,
+	0x4a, 0xb1, 0x1e, 0x7c, 0x06, 0xe3, 0x2d, 0x46, 0xda, 0x72, 0xf5, 0x67, 0xd7, 0xad, 0x82, 0x47,
+	0xb4, 0x3c, 0xc2, 0x5d, 0x46, 0xda, 0xf2, 0x49, 0xad, 0xc8, 0x48, 0x97, 0x1e, 0xf1, 0x2e, 0x5c,
+	0x1d, 0x69, 0xd0, 0x73, 0xa2, 0x7b, 0xa4, 0x98, 0xc1, 0x0d, 0x9f, 0x3e, 0x0c, 0x6c, 0x3f, 0xcc,
+	0x58, 0x3d, 0xaf, 0x4b, 0xdd, 0xa9, 0x63, 0x88, 0x1a, 0x62, 0x25, 0xa6, 0xea, 0x8e, 0xc0, 0x8c,
+	0x34, 0x3f, 0xfe, 0x56, 0xd2, 0xfc, 0x2f, 0x11, 0x54, 0xf2, 0x6f, 0x50, 0xf8, 0x3e, 0x2c, 0xa6,
+	0xa3, 0xa7, 0xf3, 0x28, 0xad, 0x22, 0xbb, 0x5e, 0x94, 0xfe, 0x15, 0xff, 0x67, 0x94, 0x5a, 0x7b,
+	0x82, 0x3a, 0xfa, 0x42, 0x8a, 0x2e, 0x71, 0xca, 0xb5, 0xdf, 0x22, 0xb8, 0x31, 0xdc, 0xb3, 0xc8,
+	0x17, 0x94, 0xbb, 0xab, 0x50, 0xc9, 0x7f, 0xf5, 0xd0, 0xfe, 0x8d, 0xa0, 0x92, 0x7f, 0x4f, 0x79,
+	0x53, 0xa7, 0xe5, 0xe3, 0xee, 0x45, 0xe8, 0xdc, 0xb7, 0xd4, 0x93, 0xf4, 0x76, 0xc1, 0x6e, 0xea,
+	0x55, 0x29, 0x77, 0x4f, 0x9f, 0xf4, 0xf9, 0x94, 0x8f, 0xa4, 0x55, 0xbb, 0x0e, 0xcb, 0x85, 0x2f,
+	0x2b, 0xda, 0x0a, 0x54, 0x8b, 0x1e, 0x0b, 0xb4, 0x5f, 0x23, 0xf8, 0xa0, 0xe0, 0x3a, 0x8c, 0x5b,
+	0x05, 0xd1, 0xf6, 0x8d, 0xa2, 0xe9, 0x8b, 0x1d, 0x14, 0x85, 0xdb, 0xcf, 0x10, 0x5c, 0xcb, 0xb9,
+	0xfd, 0x62, 0xb3, 0x40, 0xc8, 0xd7, 0x86, 0x09, 0xfb, 0x02, 0x11, 0x0d, 0xf3, 0x75, 0xf3, 0xc7,
+	0xf0, 0x95, 0x0e, 0x5a, 0x7d, 0x79, 0x36, 0x0f, 0x59, 0xea, 0xbd, 0x35, 0x83, 0x19, 0x70, 0xc1,
+	0x1c, 0xea, 0xf3, 0xfa, 0x93, 0xf8, 0xf3, 0x69, 0xcf, 0xbf, 0x37, 0xbc, 0xfe, 0xa4, 0xbb, 0xe1,
+	0xe9, 0xe6, 0x15, 0x98, 0xed, 0x6e, 0xda, 0x7c, 0x56, 0x82, 0x55, 0x93, 0x39, 0xc5, 0xb9, 0x64,
+	0xf3, 0xdd, 0x6e, 0x09, 0x07, 0xe1, 0x2e, 0x3a, 0x40, 0x3f, 0xfa, 0x9e, 0x42, 0xb6, 0x58, 0x9b,
+	0xb8, 0xad, 0x1a, 0xf3, 0x5b, 0xf5, 0x16, 0x75, 0xe5, 0x1e, 0xab, 0x77, 0xc6, 0x90, 0xf3, 0x5f,
+	0xcf, 0xb7, 0x92, 0xaf, 0xbf, 0x94, 0xc6, 0x76, 0x9b, 0xcd, 0xbf, 0x97, 0x96, 0x77, 0x23, 0xca,
+	0xa6, 0xc5, 0x6b, 0xd1, 0x67, 0xf8, 0x75, 0xb8, 0x51, 0xd3, 0x63, 0xcb, 0x97, 0xb1, 0xcd, 0x51,
+	0xd3, 0xe2, 0x47, 0x89, 0xcd, 0xd1, 0xe1, 0xc6, 0x51, 0x62, 0xf3, 0xba, 0xb4, 0x1a, 0x75, 0x34,
+	0x1a, 0x4d, 0x8b, 0x37, 0x1a, 0x89, 0x55, 0xa3, 0x71, 0xb8, 0xd1, 0x68, 0x24, 0x76, 0xc7, 0x13,
+	0x52, 0xec, 0xc6, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x20, 0x4a, 0x9e, 0x0e, 0x1c, 0x00,
+	0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/remarketing_action.pb.go b/googleapis/ads/googleads/v3/resources/remarketing_action.pb.go
new file mode 100644
index 0000000..1946dff
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/remarketing_action.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/remarketing_action.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A remarketing action. A snippet of JavaScript code that will collect the
+// product id and the type of page people visited (product page, shopping cart
+// page, purchase page, general site visit) on an advertiser's website.
+type RemarketingAction struct {
+	// The resource name of the remarketing action.
+	// Remarketing action resource names have the form:
+	//
+	// `customers/{customer_id}/remarketingActions/{remarketing_action_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Id of the remarketing action.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The name of the remarketing action.
+	//
+	// This field is required and should not be empty when creating new
+	// remarketing actions.
+	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The snippets used for tracking remarketing actions.
+	TagSnippets          []*common.TagSnippet `protobuf:"bytes,4,rep,name=tag_snippets,json=tagSnippets,proto3" json:"tag_snippets,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *RemarketingAction) Reset()         { *m = RemarketingAction{} }
+func (m *RemarketingAction) String() string { return proto.CompactTextString(m) }
+func (*RemarketingAction) ProtoMessage()    {}
+func (*RemarketingAction) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c40c8690943ef763, []int{0}
+}
+
+func (m *RemarketingAction) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RemarketingAction.Unmarshal(m, b)
+}
+func (m *RemarketingAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RemarketingAction.Marshal(b, m, deterministic)
+}
+func (m *RemarketingAction) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RemarketingAction.Merge(m, src)
+}
+func (m *RemarketingAction) XXX_Size() int {
+	return xxx_messageInfo_RemarketingAction.Size(m)
+}
+func (m *RemarketingAction) XXX_DiscardUnknown() {
+	xxx_messageInfo_RemarketingAction.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RemarketingAction proto.InternalMessageInfo
+
+func (m *RemarketingAction) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *RemarketingAction) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *RemarketingAction) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *RemarketingAction) GetTagSnippets() []*common.TagSnippet {
+	if m != nil {
+		return m.TagSnippets
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*RemarketingAction)(nil), "google.ads.googleads.v3.resources.RemarketingAction")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/remarketing_action.proto", fileDescriptor_c40c8690943ef763)
+}
+
+var fileDescriptor_c40c8690943ef763 = []byte{
+	// 435 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0x41, 0x6b, 0x14, 0x31,
+	0x14, 0xc7, 0x99, 0x6c, 0x11, 0xcc, 0xd6, 0x83, 0x73, 0x90, 0xb5, 0x16, 0xd9, 0x2a, 0x85, 0xa5,
+	0x42, 0x52, 0x3a, 0xe2, 0x21, 0x7a, 0x99, 0x5e, 0x8a, 0x82, 0x52, 0xa6, 0x32, 0x07, 0x19, 0x58,
+	0xd2, 0x99, 0x18, 0xa2, 0x9b, 0x64, 0x48, 0x32, 0xf5, 0x50, 0x7a, 0xf2, 0x9b, 0x78, 0xf4, 0xa3,
+	0x78, 0xf7, 0x4b, 0xec, 0xa7, 0x90, 0x99, 0xcc, 0x64, 0x17, 0x86, 0xb5, 0xb7, 0xff, 0xee, 0xfb,
+	0xfd, 0x5f, 0xde, 0xfb, 0xcf, 0x83, 0x84, 0x6b, 0xcd, 0x57, 0x0c, 0xd3, 0xca, 0x62, 0x2f, 0x5b,
+	0x75, 0x93, 0x60, 0xc3, 0xac, 0x6e, 0x4c, 0xc9, 0x2c, 0x36, 0x4c, 0x52, 0xf3, 0x9d, 0x39, 0xa1,
+	0xf8, 0x92, 0x96, 0x4e, 0x68, 0x85, 0x6a, 0xa3, 0x9d, 0x8e, 0x8f, 0xbc, 0x01, 0xd1, 0xca, 0xa2,
+	0xe0, 0x45, 0x37, 0x09, 0x0a, 0xde, 0x83, 0xd3, 0x5d, 0xed, 0x4b, 0x2d, 0xa5, 0x56, 0xd8, 0x51,
+	0xbe, 0xb4, 0x4a, 0xd4, 0x35, 0x73, 0xbe, 0xe9, 0xc1, 0xd3, 0xc1, 0x51, 0x8b, 0x30, 0x43, 0x5f,
+	0x7a, 0xde, 0x97, 0xba, 0x5f, 0xd7, 0xcd, 0x57, 0xfc, 0xc3, 0xd0, 0xba, 0x66, 0xc6, 0xf6, 0xf5,
+	0xc3, 0x2d, 0x2b, 0x55, 0x4a, 0x3b, 0xda, 0x0e, 0xdb, 0x57, 0x5f, 0xfc, 0x05, 0xf0, 0x71, 0xb6,
+	0x59, 0x25, 0xed, 0x36, 0x89, 0x5f, 0xc2, 0x47, 0xc3, 0x2b, 0x4b, 0x45, 0x25, 0x9b, 0x45, 0xf3,
+	0x68, 0xf1, 0x30, 0xdb, 0x1f, 0xfe, 0xfc, 0x44, 0x25, 0x8b, 0x5f, 0x41, 0x20, 0xaa, 0x19, 0x98,
+	0x47, 0x8b, 0xe9, 0xd9, 0xb3, 0x7e, 0x55, 0x34, 0x4c, 0x81, 0xde, 0x2b, 0xf7, 0xe6, 0x75, 0x4e,
+	0x57, 0x0d, 0xcb, 0x80, 0xa8, 0xe2, 0x53, 0xb8, 0xd7, 0x35, 0x9a, 0x74, 0xf8, 0xe1, 0x08, 0xbf,
+	0x72, 0x46, 0x28, 0xee, 0xf9, 0x8e, 0x8c, 0x3f, 0xc2, 0xfd, 0xad, 0x1c, 0xec, 0x6c, 0x6f, 0x3e,
+	0x59, 0x4c, 0xcf, 0x4e, 0xd0, 0xae, 0x78, 0x7d, 0x76, 0xe8, 0x33, 0xe5, 0x57, 0xde, 0x92, 0x4d,
+	0x5d, 0xd0, 0x96, 0xc8, 0x75, 0xfa, 0x0d, 0x9e, 0x6c, 0x1c, 0xbd, 0xaa, 0x85, 0x6d, 0x9d, 0x78,
+	0x9c, 0xc1, 0xbb, 0xb2, 0xb1, 0x4e, 0x4b, 0x66, 0x2c, 0xbe, 0x1d, 0xe4, 0xdd, 0xf6, 0x67, 0xf7,
+	0x9c, 0xc5, 0xb7, 0xe3, 0x53, 0xb8, 0x3b, 0xff, 0x09, 0xe0, 0x71, 0xa9, 0x25, 0xba, 0xf7, 0x18,
+	0xce, 0x9f, 0x8c, 0x9e, 0xbe, 0x6c, 0x43, 0xb9, 0x8c, 0xbe, 0x7c, 0xe8, 0xcd, 0x5c, 0xaf, 0xa8,
+	0xe2, 0x48, 0x1b, 0x8e, 0x39, 0x53, 0x5d, 0x64, 0x78, 0x33, 0xfe, 0x7f, 0x8e, 0xf4, 0x6d, 0x50,
+	0xbf, 0xc0, 0xe4, 0x22, 0x4d, 0x7f, 0x83, 0xa3, 0x0b, 0xdf, 0x32, 0xad, 0x2c, 0xf2, 0xb2, 0x55,
+	0x79, 0x82, 0xb2, 0x81, 0xfc, 0x33, 0x30, 0x45, 0x5a, 0xd9, 0x22, 0x30, 0x45, 0x9e, 0x14, 0x81,
+	0x59, 0x83, 0x63, 0x5f, 0x20, 0x24, 0xad, 0x2c, 0x21, 0x81, 0x22, 0x24, 0x4f, 0x08, 0x09, 0xdc,
+	0xf5, 0x83, 0x6e, 0xd8, 0xe4, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x57, 0x41, 0x27, 0xec, 0x50,
+	0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/search_term_view.pb.go b/googleapis/ads/googleads/v3/resources/search_term_view.pb.go
new file mode 100644
index 0000000..e344fed
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/search_term_view.pb.go
@@ -0,0 +1,138 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/search_term_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A search term view with metrics aggregated by search term at the ad group
+// level.
+type SearchTermView struct {
+	// The resource name of the search term view.
+	// Search term view resource names have the form:
+	//
+	// `customers/{customer_id}/searchTermViews/{campaign_id}~{ad_group_id}~{URL-base64_search_term}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The search term.
+	SearchTerm *wrappers.StringValue `protobuf:"bytes,2,opt,name=search_term,json=searchTerm,proto3" json:"search_term,omitempty"`
+	// The ad group the search term served in.
+	AdGroup *wrappers.StringValue `protobuf:"bytes,3,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// Indicates whether the search term is currently one of your
+	// targeted or excluded keywords.
+	Status               enums.SearchTermTargetingStatusEnum_SearchTermTargetingStatus `protobuf:"varint,4,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.SearchTermTargetingStatusEnum_SearchTermTargetingStatus" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                                      `json:"-"`
+	XXX_unrecognized     []byte                                                        `json:"-"`
+	XXX_sizecache        int32                                                         `json:"-"`
+}
+
+func (m *SearchTermView) Reset()         { *m = SearchTermView{} }
+func (m *SearchTermView) String() string { return proto.CompactTextString(m) }
+func (*SearchTermView) ProtoMessage()    {}
+func (*SearchTermView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5cc5622e8cea5d3c, []int{0}
+}
+
+func (m *SearchTermView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchTermView.Unmarshal(m, b)
+}
+func (m *SearchTermView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchTermView.Marshal(b, m, deterministic)
+}
+func (m *SearchTermView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchTermView.Merge(m, src)
+}
+func (m *SearchTermView) XXX_Size() int {
+	return xxx_messageInfo_SearchTermView.Size(m)
+}
+func (m *SearchTermView) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchTermView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchTermView proto.InternalMessageInfo
+
+func (m *SearchTermView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *SearchTermView) GetSearchTerm() *wrappers.StringValue {
+	if m != nil {
+		return m.SearchTerm
+	}
+	return nil
+}
+
+func (m *SearchTermView) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *SearchTermView) GetStatus() enums.SearchTermTargetingStatusEnum_SearchTermTargetingStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.SearchTermTargetingStatusEnum_UNSPECIFIED
+}
+
+func init() {
+	proto.RegisterType((*SearchTermView)(nil), "google.ads.googleads.v3.resources.SearchTermView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/search_term_view.proto", fileDescriptor_5cc5622e8cea5d3c)
+}
+
+var fileDescriptor_5cc5622e8cea5d3c = []byte{
+	// 446 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x4f, 0x6b, 0x13, 0x41,
+	0x1c, 0x65, 0x37, 0x52, 0x75, 0xaa, 0x3d, 0xac, 0x97, 0x58, 0x8a, 0xa4, 0x4a, 0x31, 0xa7, 0x19,
+	0xe8, 0x1e, 0x2a, 0x23, 0x82, 0x5b, 0x90, 0x80, 0x07, 0x29, 0x49, 0xd9, 0x83, 0x04, 0x96, 0xc9,
+	0xee, 0xcf, 0x71, 0x21, 0x33, 0xb3, 0xcc, 0xcc, 0x26, 0x87, 0x52, 0xf0, 0xe0, 0x27, 0xf1, 0xe8,
+	0x47, 0xf1, 0xa3, 0xf4, 0x53, 0xc8, 0xfe, 0x99, 0x49, 0x13, 0x88, 0xf6, 0xf6, 0x76, 0x7f, 0xef,
+	0xfd, 0xde, 0x9b, 0xc7, 0x0f, 0xbd, 0xe3, 0x4a, 0xf1, 0x25, 0x10, 0x56, 0x18, 0xd2, 0xc1, 0x06,
+	0xad, 0x62, 0xa2, 0xc1, 0xa8, 0x5a, 0xe7, 0x60, 0x88, 0x01, 0xa6, 0xf3, 0xef, 0x99, 0x05, 0x2d,
+	0xb2, 0x55, 0x09, 0x6b, 0x5c, 0x69, 0x65, 0x55, 0x74, 0xda, 0xd1, 0x31, 0x2b, 0x0c, 0xf6, 0x4a,
+	0xbc, 0x8a, 0xb1, 0x57, 0x1e, 0x7f, 0xdc, 0xb7, 0x1c, 0x64, 0x2d, 0xb6, 0x17, 0x5b, 0xa6, 0x39,
+	0xd8, 0x52, 0xf2, 0xcc, 0x58, 0x66, 0x6b, 0xd3, 0x99, 0x1c, 0xbf, 0x74, 0x1b, 0xaa, 0xd2, 0x27,
+	0xea, 0x47, 0xaf, 0xfa, 0x51, 0xfb, 0xb5, 0xa8, 0xbf, 0x91, 0xb5, 0x66, 0x55, 0x05, 0xda, 0x49,
+	0x4f, 0xee, 0x49, 0x99, 0x94, 0xca, 0x32, 0x5b, 0x2a, 0xd9, 0x4f, 0x5f, 0xff, 0x1c, 0xa0, 0xa3,
+	0x59, 0xeb, 0x7f, 0x0d, 0x5a, 0xa4, 0x25, 0xac, 0xa3, 0x37, 0xe8, 0xb9, 0xb3, 0xc8, 0x24, 0x13,
+	0x30, 0x0c, 0x46, 0xc1, 0xf8, 0xe9, 0xf4, 0x99, 0xfb, 0xf9, 0x85, 0x09, 0x88, 0x3e, 0xa0, 0xc3,
+	0x7b, 0xb1, 0x87, 0xe1, 0x28, 0x18, 0x1f, 0x9e, 0x9f, 0xf4, 0x05, 0x60, 0x97, 0x05, 0xcf, 0xac,
+	0x2e, 0x25, 0x4f, 0xd9, 0xb2, 0x86, 0x29, 0x32, 0xde, 0x27, 0xba, 0x40, 0x4f, 0x58, 0x91, 0x71,
+	0xad, 0xea, 0x6a, 0x38, 0x78, 0x80, 0xf6, 0x31, 0x2b, 0x26, 0x0d, 0x39, 0x92, 0xe8, 0xa0, 0x2b,
+	0x66, 0xf8, 0x68, 0x14, 0x8c, 0x8f, 0xce, 0x53, 0xbc, 0xaf, 0xfe, 0xb6, 0x5b, 0xbc, 0x79, 0xdb,
+	0xb5, 0x6b, 0x76, 0xd6, 0xea, 0x3f, 0xc9, 0x5a, 0xec, 0x9f, 0x4e, 0x7b, 0x17, 0x0a, 0x77, 0xc9,
+	0x02, 0xbd, 0xdd, 0x2c, 0xee, 0x51, 0x55, 0x1a, 0x9c, 0x2b, 0x41, 0x76, 0xaa, 0xbb, 0xc8, 0x6b,
+	0x63, 0x95, 0x00, 0x6d, 0xc8, 0x8d, 0x83, 0xb7, 0xc4, 0x6c, 0x91, 0x0c, 0xb9, 0xd9, 0xbd, 0xa4,
+	0xdb, 0xcb, 0x1f, 0x21, 0x3a, 0xcb, 0x95, 0xc0, 0xff, 0xbd, 0xa5, 0xcb, 0x17, 0xdb, 0x96, 0x57,
+	0x4d, 0x5b, 0x57, 0xc1, 0xd7, 0xcf, 0xbd, 0x92, 0xab, 0x25, 0x93, 0x1c, 0x2b, 0xcd, 0x09, 0x07,
+	0xd9, 0x76, 0x49, 0x36, 0x99, 0xff, 0x71, 0xde, 0xef, 0x3d, 0xfa, 0x15, 0x0e, 0x26, 0x49, 0xf2,
+	0x3b, 0x3c, 0x9d, 0x74, 0x2b, 0x93, 0xc2, 0xe0, 0x0e, 0x36, 0x28, 0x8d, 0xf1, 0xd4, 0x31, 0xff,
+	0x38, 0xce, 0x3c, 0x29, 0xcc, 0xdc, 0x73, 0xe6, 0x69, 0x3c, 0xf7, 0x9c, 0xbb, 0xf0, 0xac, 0x1b,
+	0x50, 0x9a, 0x14, 0x86, 0x52, 0xcf, 0xa2, 0x34, 0x8d, 0x29, 0xf5, 0xbc, 0xc5, 0x41, 0x1b, 0x36,
+	0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x18, 0x5c, 0x86, 0xcb, 0x8a, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/shared_criterion.pb.go b/googleapis/ads/googleads/v3/resources/shared_criterion.pb.go
new file mode 100644
index 0000000..6ddcd33
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/shared_criterion.pb.go
@@ -0,0 +1,264 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/shared_criterion.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A criterion belonging to a shared set.
+type SharedCriterion struct {
+	// The resource name of the shared criterion.
+	// Shared set resource names have the form:
+	//
+	// `customers/{customer_id}/sharedCriteria/{shared_set_id}~{criterion_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The shared set to which the shared criterion belongs.
+	SharedSet *wrappers.StringValue `protobuf:"bytes,2,opt,name=shared_set,json=sharedSet,proto3" json:"shared_set,omitempty"`
+	// The ID of the criterion.
+	//
+	// This field is ignored for mutates.
+	CriterionId *wrappers.Int64Value `protobuf:"bytes,26,opt,name=criterion_id,json=criterionId,proto3" json:"criterion_id,omitempty"`
+	// The type of the criterion.
+	Type enums.CriterionTypeEnum_CriterionType `protobuf:"varint,4,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.CriterionTypeEnum_CriterionType" json:"type,omitempty"`
+	// The criterion.
+	//
+	// Exactly one must be set.
+	//
+	// Types that are valid to be assigned to Criterion:
+	//	*SharedCriterion_Keyword
+	//	*SharedCriterion_YoutubeVideo
+	//	*SharedCriterion_YoutubeChannel
+	//	*SharedCriterion_Placement
+	//	*SharedCriterion_MobileAppCategory
+	//	*SharedCriterion_MobileApplication
+	Criterion            isSharedCriterion_Criterion `protobuf_oneof:"criterion"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *SharedCriterion) Reset()         { *m = SharedCriterion{} }
+func (m *SharedCriterion) String() string { return proto.CompactTextString(m) }
+func (*SharedCriterion) ProtoMessage()    {}
+func (*SharedCriterion) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4619a4fc8d25dd41, []int{0}
+}
+
+func (m *SharedCriterion) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SharedCriterion.Unmarshal(m, b)
+}
+func (m *SharedCriterion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SharedCriterion.Marshal(b, m, deterministic)
+}
+func (m *SharedCriterion) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SharedCriterion.Merge(m, src)
+}
+func (m *SharedCriterion) XXX_Size() int {
+	return xxx_messageInfo_SharedCriterion.Size(m)
+}
+func (m *SharedCriterion) XXX_DiscardUnknown() {
+	xxx_messageInfo_SharedCriterion.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SharedCriterion proto.InternalMessageInfo
+
+func (m *SharedCriterion) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *SharedCriterion) GetSharedSet() *wrappers.StringValue {
+	if m != nil {
+		return m.SharedSet
+	}
+	return nil
+}
+
+func (m *SharedCriterion) GetCriterionId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CriterionId
+	}
+	return nil
+}
+
+func (m *SharedCriterion) GetType() enums.CriterionTypeEnum_CriterionType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.CriterionTypeEnum_UNSPECIFIED
+}
+
+type isSharedCriterion_Criterion interface {
+	isSharedCriterion_Criterion()
+}
+
+type SharedCriterion_Keyword struct {
+	Keyword *common.KeywordInfo `protobuf:"bytes,3,opt,name=keyword,proto3,oneof"`
+}
+
+type SharedCriterion_YoutubeVideo struct {
+	YoutubeVideo *common.YouTubeVideoInfo `protobuf:"bytes,5,opt,name=youtube_video,json=youtubeVideo,proto3,oneof"`
+}
+
+type SharedCriterion_YoutubeChannel struct {
+	YoutubeChannel *common.YouTubeChannelInfo `protobuf:"bytes,6,opt,name=youtube_channel,json=youtubeChannel,proto3,oneof"`
+}
+
+type SharedCriterion_Placement struct {
+	Placement *common.PlacementInfo `protobuf:"bytes,7,opt,name=placement,proto3,oneof"`
+}
+
+type SharedCriterion_MobileAppCategory struct {
+	MobileAppCategory *common.MobileAppCategoryInfo `protobuf:"bytes,8,opt,name=mobile_app_category,json=mobileAppCategory,proto3,oneof"`
+}
+
+type SharedCriterion_MobileApplication struct {
+	MobileApplication *common.MobileApplicationInfo `protobuf:"bytes,9,opt,name=mobile_application,json=mobileApplication,proto3,oneof"`
+}
+
+func (*SharedCriterion_Keyword) isSharedCriterion_Criterion() {}
+
+func (*SharedCriterion_YoutubeVideo) isSharedCriterion_Criterion() {}
+
+func (*SharedCriterion_YoutubeChannel) isSharedCriterion_Criterion() {}
+
+func (*SharedCriterion_Placement) isSharedCriterion_Criterion() {}
+
+func (*SharedCriterion_MobileAppCategory) isSharedCriterion_Criterion() {}
+
+func (*SharedCriterion_MobileApplication) isSharedCriterion_Criterion() {}
+
+func (m *SharedCriterion) GetCriterion() isSharedCriterion_Criterion {
+	if m != nil {
+		return m.Criterion
+	}
+	return nil
+}
+
+func (m *SharedCriterion) GetKeyword() *common.KeywordInfo {
+	if x, ok := m.GetCriterion().(*SharedCriterion_Keyword); ok {
+		return x.Keyword
+	}
+	return nil
+}
+
+func (m *SharedCriterion) GetYoutubeVideo() *common.YouTubeVideoInfo {
+	if x, ok := m.GetCriterion().(*SharedCriterion_YoutubeVideo); ok {
+		return x.YoutubeVideo
+	}
+	return nil
+}
+
+func (m *SharedCriterion) GetYoutubeChannel() *common.YouTubeChannelInfo {
+	if x, ok := m.GetCriterion().(*SharedCriterion_YoutubeChannel); ok {
+		return x.YoutubeChannel
+	}
+	return nil
+}
+
+func (m *SharedCriterion) GetPlacement() *common.PlacementInfo {
+	if x, ok := m.GetCriterion().(*SharedCriterion_Placement); ok {
+		return x.Placement
+	}
+	return nil
+}
+
+func (m *SharedCriterion) GetMobileAppCategory() *common.MobileAppCategoryInfo {
+	if x, ok := m.GetCriterion().(*SharedCriterion_MobileAppCategory); ok {
+		return x.MobileAppCategory
+	}
+	return nil
+}
+
+func (m *SharedCriterion) GetMobileApplication() *common.MobileApplicationInfo {
+	if x, ok := m.GetCriterion().(*SharedCriterion_MobileApplication); ok {
+		return x.MobileApplication
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*SharedCriterion) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*SharedCriterion_Keyword)(nil),
+		(*SharedCriterion_YoutubeVideo)(nil),
+		(*SharedCriterion_YoutubeChannel)(nil),
+		(*SharedCriterion_Placement)(nil),
+		(*SharedCriterion_MobileAppCategory)(nil),
+		(*SharedCriterion_MobileApplication)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*SharedCriterion)(nil), "google.ads.googleads.v3.resources.SharedCriterion")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/shared_criterion.proto", fileDescriptor_4619a4fc8d25dd41)
+}
+
+var fileDescriptor_4619a4fc8d25dd41 = []byte{
+	// 637 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xdf, 0x6a, 0xd4, 0x4e,
+	0x14, 0xc7, 0x7f, 0xbb, 0xed, 0xaf, 0x75, 0xa7, 0xff, 0x30, 0x7a, 0x11, 0x6b, 0x91, 0x56, 0x29,
+	0x2c, 0x48, 0x27, 0xb2, 0xab, 0x45, 0x52, 0x28, 0xa4, 0x45, 0x6a, 0x95, 0x4a, 0xd9, 0x96, 0x15,
+	0x65, 0x65, 0x99, 0x4d, 0x4e, 0xd3, 0x60, 0x32, 0x13, 0x66, 0x26, 0x2d, 0x4b, 0xe9, 0x85, 0xef,
+	0xe1, 0x95, 0x97, 0x3e, 0x8a, 0x8f, 0xd2, 0xa7, 0x90, 0x4c, 0x66, 0x66, 0x75, 0xcb, 0xba, 0x7a,
+	0x77, 0x32, 0xe7, 0xfb, 0xfd, 0x9c, 0x33, 0x33, 0x99, 0x83, 0x5e, 0xc6, 0x8c, 0xc5, 0x29, 0x78,
+	0x24, 0x12, 0x5e, 0x15, 0x96, 0xd1, 0x45, 0xdb, 0xe3, 0x20, 0x58, 0xc1, 0x43, 0x10, 0x9e, 0x38,
+	0x27, 0x1c, 0xa2, 0x7e, 0xc8, 0x13, 0x09, 0x3c, 0x61, 0x14, 0xe7, 0x9c, 0x49, 0xe6, 0x6c, 0x54,
+	0x72, 0x4c, 0x22, 0x81, 0xad, 0x13, 0x5f, 0xb4, 0xb1, 0x75, 0xae, 0x6e, 0x4d, 0x82, 0x87, 0x2c,
+	0xcb, 0x18, 0xf5, 0x34, 0x92, 0x54, 0xc4, 0xd5, 0xd6, 0x24, 0x39, 0xd0, 0x22, 0x13, 0x9e, 0x6d,
+	0xa0, 0x2f, 0x87, 0x39, 0x68, 0xcf, 0x03, 0xe3, 0xc9, 0x13, 0xdb, 0xb2, 0x4e, 0x3d, 0xd2, 0x29,
+	0xf5, 0x35, 0x28, 0xce, 0xbc, 0x4b, 0x4e, 0xf2, 0x1c, 0xb8, 0xd0, 0xf9, 0xb5, 0x5f, 0xac, 0x84,
+	0x52, 0x26, 0x89, 0x4c, 0x18, 0xd5, 0xd9, 0xc7, 0x5f, 0xe7, 0xd1, 0xca, 0x89, 0xda, 0xf9, 0xbe,
+	0xa9, 0xeb, 0x3c, 0x41, 0x4b, 0xa6, 0x46, 0x9f, 0x92, 0x0c, 0xdc, 0xda, 0x7a, 0xad, 0xd9, 0xe8,
+	0x2c, 0x9a, 0xc5, 0x77, 0x24, 0x03, 0x67, 0x07, 0x21, 0x7d, 0x62, 0x02, 0xa4, 0x5b, 0x5f, 0xaf,
+	0x35, 0x17, 0x5a, 0x6b, 0xfa, 0x84, 0xb0, 0xe9, 0x05, 0x9f, 0x48, 0x9e, 0xd0, 0xb8, 0x4b, 0xd2,
+	0x02, 0x3a, 0x8d, 0x4a, 0x7f, 0x02, 0xd2, 0xd9, 0x45, 0x8b, 0xa3, 0x6d, 0x26, 0x91, 0xbb, 0xaa,
+	0xec, 0x0f, 0x6f, 0xd9, 0x0f, 0xa9, 0xdc, 0x7e, 0x5e, 0xb9, 0x17, 0xac, 0xe1, 0x30, 0x72, 0x3a,
+	0x68, 0xb6, 0x3c, 0x1c, 0x77, 0x76, 0xbd, 0xd6, 0x5c, 0x6e, 0xed, 0xe2, 0x49, 0x77, 0xa4, 0x4e,
+	0x14, 0xdb, 0x9d, 0x9d, 0x0e, 0x73, 0x78, 0x45, 0x8b, 0xec, 0xf7, 0x95, 0x8e, 0x62, 0x39, 0x07,
+	0x68, 0xfe, 0x33, 0x0c, 0x2f, 0x19, 0x8f, 0xdc, 0x19, 0xd5, 0xce, 0xd3, 0x89, 0xd8, 0xea, 0x5e,
+	0xf1, 0xdb, 0x4a, 0x7e, 0x48, 0xcf, 0xd8, 0xeb, 0xff, 0x3a, 0xc6, 0xed, 0xbc, 0x47, 0x4b, 0x43,
+	0x56, 0xc8, 0x62, 0x00, 0xfd, 0x8b, 0x24, 0x02, 0xe6, 0xfe, 0xaf, 0x70, 0xcf, 0xa6, 0xe1, 0x3e,
+	0xb0, 0xe2, 0xb4, 0x18, 0x40, 0xb7, 0xf4, 0x68, 0xe6, 0xa2, 0x06, 0xa9, 0x35, 0xe7, 0x13, 0x5a,
+	0x31, 0xe0, 0xf0, 0x9c, 0x50, 0x0a, 0xa9, 0x3b, 0xa7, 0xd0, 0xad, 0xbf, 0x44, 0xef, 0x57, 0x2e,
+	0x0d, 0x5f, 0xd6, 0x30, 0xbd, 0xea, 0x1c, 0xa1, 0x46, 0x9e, 0x92, 0x10, 0x32, 0xa0, 0xd2, 0x9d,
+	0x57, 0xe0, 0xad, 0x69, 0xe0, 0x63, 0x63, 0xd0, 0xcc, 0x11, 0xc1, 0x89, 0xd1, 0xbd, 0x8c, 0x0d,
+	0x92, 0x14, 0xfa, 0x24, 0xcf, 0xfb, 0x21, 0x91, 0x10, 0x33, 0x3e, 0x74, 0xef, 0x28, 0xf0, 0x8b,
+	0x69, 0xe0, 0x23, 0x65, 0x0d, 0xf2, 0x7c, 0x5f, 0x1b, 0x75, 0x81, 0xbb, 0xd9, 0x78, 0xc2, 0x39,
+	0x43, 0xce, 0xa8, 0x50, 0x9a, 0x84, 0xea, 0xff, 0x76, 0x1b, 0xff, 0x58, 0xc7, 0x18, 0x6f, 0xd5,
+	0x31, 0x09, 0x1f, 0x6e, 0x82, 0x01, 0x6a, 0x8e, 0x20, 0x3a, 0xca, 0x13, 0x51, 0xc2, 0xbc, 0xf1,
+	0x57, 0xb4, 0x1d, 0x16, 0x42, 0xb2, 0x0c, 0xb8, 0xf0, 0xae, 0x4c, 0x78, 0xad, 0xa7, 0x8c, 0x56,
+	0x11, 0xef, 0x6a, 0x7c, 0xea, 0x5c, 0xef, 0x2d, 0xa0, 0x86, 0xfd, 0xda, 0xfb, 0x52, 0x47, 0x9b,
+	0x21, 0xcb, 0xf0, 0xd4, 0x21, 0xb4, 0x77, 0x7f, 0xac, 0xfe, 0x71, 0xf9, 0x86, 0x8e, 0x6b, 0x1f,
+	0xdf, 0x68, 0x6b, 0xcc, 0x52, 0x42, 0x63, 0xcc, 0x78, 0xec, 0xc5, 0x40, 0xd5, 0x0b, 0xf3, 0x46,
+	0x3b, 0xf8, 0xc3, 0x60, 0xdc, 0xb1, 0xd1, 0xb7, 0xfa, 0xcc, 0x41, 0x10, 0x7c, 0xaf, 0x6f, 0x1c,
+	0x54, 0xc8, 0x20, 0x12, 0xb8, 0x0a, 0xcb, 0xa8, 0xdb, 0xc6, 0x1d, 0xa3, 0xfc, 0x61, 0x34, 0xbd,
+	0x20, 0x12, 0x3d, 0xab, 0xe9, 0x75, 0xdb, 0x3d, 0xab, 0xb9, 0xa9, 0x6f, 0x56, 0x09, 0xdf, 0x0f,
+	0x22, 0xe1, 0xfb, 0x56, 0xe5, 0xfb, 0xdd, 0xb6, 0xef, 0x5b, 0xdd, 0x60, 0x4e, 0x35, 0xdb, 0xfe,
+	0x19, 0x00, 0x00, 0xff, 0xff, 0x99, 0xd7, 0x6f, 0xb6, 0xc4, 0x05, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/shared_set.pb.go b/googleapis/ads/googleads/v3/resources/shared_set.pb.go
new file mode 100644
index 0000000..d55c01d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/shared_set.pb.go
@@ -0,0 +1,173 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/shared_set.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// SharedSets are used for sharing criterion exclusions across multiple
+// campaigns.
+type SharedSet struct {
+	// The resource name of the shared set.
+	// Shared set resource names have the form:
+	//
+	// `customers/{customer_id}/sharedSets/{shared_set_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of this shared set. Read only.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The type of this shared set: each shared set holds only a single kind
+	// of resource. Required. Immutable.
+	Type enums.SharedSetTypeEnum_SharedSetType `protobuf:"varint,3,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.SharedSetTypeEnum_SharedSetType" json:"type,omitempty"`
+	// The name of this shared set. Required.
+	// Shared Sets must have names that are unique among active shared sets of
+	// the same type.
+	// The length of this string should be between 1 and 255 UTF-8 bytes,
+	// inclusive.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The status of this shared set. Read only.
+	Status enums.SharedSetStatusEnum_SharedSetStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.SharedSetStatusEnum_SharedSetStatus" json:"status,omitempty"`
+	// The number of shared criteria within this shared set. Read only.
+	MemberCount *wrappers.Int64Value `protobuf:"bytes,6,opt,name=member_count,json=memberCount,proto3" json:"member_count,omitempty"`
+	// The number of campaigns associated with this shared set. Read only.
+	ReferenceCount       *wrappers.Int64Value `protobuf:"bytes,7,opt,name=reference_count,json=referenceCount,proto3" json:"reference_count,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *SharedSet) Reset()         { *m = SharedSet{} }
+func (m *SharedSet) String() string { return proto.CompactTextString(m) }
+func (*SharedSet) ProtoMessage()    {}
+func (*SharedSet) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4d9291edd18f8ee2, []int{0}
+}
+
+func (m *SharedSet) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SharedSet.Unmarshal(m, b)
+}
+func (m *SharedSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SharedSet.Marshal(b, m, deterministic)
+}
+func (m *SharedSet) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SharedSet.Merge(m, src)
+}
+func (m *SharedSet) XXX_Size() int {
+	return xxx_messageInfo_SharedSet.Size(m)
+}
+func (m *SharedSet) XXX_DiscardUnknown() {
+	xxx_messageInfo_SharedSet.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SharedSet proto.InternalMessageInfo
+
+func (m *SharedSet) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *SharedSet) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *SharedSet) GetType() enums.SharedSetTypeEnum_SharedSetType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.SharedSetTypeEnum_UNSPECIFIED
+}
+
+func (m *SharedSet) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *SharedSet) GetStatus() enums.SharedSetStatusEnum_SharedSetStatus {
+	if m != nil {
+		return m.Status
+	}
+	return enums.SharedSetStatusEnum_UNSPECIFIED
+}
+
+func (m *SharedSet) GetMemberCount() *wrappers.Int64Value {
+	if m != nil {
+		return m.MemberCount
+	}
+	return nil
+}
+
+func (m *SharedSet) GetReferenceCount() *wrappers.Int64Value {
+	if m != nil {
+		return m.ReferenceCount
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*SharedSet)(nil), "google.ads.googleads.v3.resources.SharedSet")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/shared_set.proto", fileDescriptor_4d9291edd18f8ee2)
+}
+
+var fileDescriptor_4d9291edd18f8ee2 = []byte{
+	// 502 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xd1, 0x6a, 0xd4, 0x40,
+	0x14, 0x25, 0xe9, 0xba, 0xd2, 0x69, 0x5d, 0x21, 0x4f, 0x6b, 0x2d, 0xb2, 0xad, 0x14, 0x16, 0x94,
+	0x19, 0xd9, 0xa8, 0x0f, 0x11, 0x0a, 0x59, 0x95, 0xa2, 0x0f, 0x52, 0xb2, 0xba, 0x0f, 0x65, 0x61,
+	0x99, 0x4d, 0x6e, 0x63, 0x60, 0x33, 0x13, 0x66, 0x26, 0x95, 0x52, 0xfa, 0x27, 0x3e, 0xf9, 0xe8,
+	0xa7, 0xf8, 0x29, 0xfd, 0x05, 0x5f, 0x24, 0x33, 0x93, 0xd9, 0x16, 0x69, 0xb7, 0x6f, 0x27, 0x73,
+	0xcf, 0x39, 0xf7, 0xdc, 0x9b, 0x19, 0x34, 0xca, 0x39, 0xcf, 0x97, 0x40, 0x68, 0x26, 0x89, 0x81,
+	0x0d, 0x3a, 0x0b, 0x89, 0x00, 0xc9, 0x6b, 0x91, 0x82, 0x24, 0xf2, 0x3b, 0x15, 0x90, 0xcd, 0x25,
+	0x28, 0x5c, 0x09, 0xae, 0x78, 0xb0, 0x67, 0x88, 0x98, 0x66, 0x12, 0x3b, 0x0d, 0x3e, 0x0b, 0xb1,
+	0xd3, 0xec, 0xbc, 0xb9, 0xcd, 0x16, 0x58, 0x5d, 0x5e, 0xb7, 0x9c, 0x4b, 0x45, 0x55, 0x2d, 0x8d,
+	0xf3, 0x4e, 0x78, 0x6f, 0x99, 0x3a, 0xaf, 0xc0, 0x8a, 0x9e, 0xb4, 0xa2, 0xaa, 0x70, 0xa9, 0x6d,
+	0xe9, 0x99, 0x2d, 0xe9, 0xaf, 0x45, 0x7d, 0x4a, 0x7e, 0x08, 0x5a, 0x55, 0x20, 0xda, 0x7e, 0xbb,
+	0xd7, 0xa4, 0x94, 0x31, 0xae, 0xa8, 0x2a, 0x38, 0xb3, 0xd5, 0xfd, 0x9f, 0x1d, 0xb4, 0x39, 0xd1,
+	0x2d, 0x27, 0xa0, 0x82, 0xe7, 0xe8, 0x51, 0xeb, 0x3e, 0x67, 0xb4, 0x84, 0xbe, 0x37, 0xf0, 0x86,
+	0x9b, 0xc9, 0x76, 0x7b, 0xf8, 0x85, 0x96, 0x10, 0xbc, 0x40, 0x7e, 0x91, 0xf5, 0xfd, 0x81, 0x37,
+	0xdc, 0x1a, 0x3d, 0xb5, 0xcb, 0xc1, 0x6d, 0x77, 0xfc, 0x89, 0xa9, 0xb7, 0xaf, 0xa7, 0x74, 0x59,
+	0x43, 0xe2, 0x17, 0x59, 0x90, 0xa0, 0x4e, 0x33, 0x46, 0x7f, 0x63, 0xe0, 0x0d, 0x7b, 0xa3, 0x43,
+	0x7c, 0xdb, 0x5a, 0xf5, 0xf0, 0xd8, 0x25, 0xf9, 0x7a, 0x5e, 0xc1, 0x47, 0x56, 0x97, 0x37, 0x4f,
+	0x12, 0xed, 0x15, 0xbc, 0x42, 0x1d, 0x1d, 0xae, 0xa3, 0x23, 0xec, 0xfe, 0x17, 0x61, 0xa2, 0x44,
+	0xc1, 0x72, 0x93, 0x41, 0x33, 0x83, 0x13, 0xd4, 0x35, 0xff, 0xa0, 0xff, 0x40, 0xe7, 0x18, 0xdf,
+	0x37, 0xc7, 0x44, 0xab, 0x6e, 0x26, 0x31, 0x67, 0x89, 0x75, 0x0c, 0x0e, 0xd1, 0x76, 0x09, 0xe5,
+	0x02, 0xc4, 0x3c, 0xe5, 0x35, 0x53, 0xfd, 0xee, 0xfa, 0xc5, 0x6c, 0x19, 0xc1, 0xfb, 0x86, 0x1f,
+	0x7c, 0x40, 0x8f, 0x05, 0x9c, 0x82, 0x00, 0x96, 0x82, 0xb5, 0x78, 0xb8, 0xde, 0xa2, 0xe7, 0x34,
+	0xda, 0x25, 0xfa, 0x76, 0x15, 0x27, 0x68, 0x7f, 0x35, 0x8a, 0x45, 0x55, 0x21, 0x71, 0xca, 0x4b,
+	0xb2, 0xfa, 0xc5, 0x2f, 0xd3, 0x5a, 0x2a, 0x5e, 0x82, 0x90, 0xe4, 0xa2, 0x85, 0x97, 0xf6, 0xd6,
+	0x4d, 0x40, 0x49, 0x72, 0xb1, 0xba, 0x81, 0x97, 0xe3, 0xbf, 0x1e, 0x3a, 0x48, 0x79, 0x89, 0xd7,
+	0xbe, 0x86, 0x71, 0xcf, 0xb5, 0x38, 0x6e, 0xe2, 0x1e, 0x7b, 0x27, 0x9f, 0xad, 0x28, 0xe7, 0x4b,
+	0xca, 0x72, 0xcc, 0x45, 0x4e, 0x72, 0x60, 0x7a, 0x18, 0xb2, 0x8a, 0x77, 0xc7, 0xab, 0x7c, 0xe7,
+	0xd0, 0x2f, 0x7f, 0xe3, 0x28, 0x8e, 0x7f, 0xfb, 0x7b, 0x47, 0xc6, 0x32, 0xce, 0x24, 0x36, 0xb0,
+	0x41, 0xd3, 0x10, 0x27, 0x2d, 0xf3, 0x4f, 0xcb, 0x99, 0xc5, 0x99, 0x9c, 0x39, 0xce, 0x6c, 0x1a,
+	0xce, 0x1c, 0xe7, 0xca, 0x3f, 0x30, 0x85, 0x28, 0x8a, 0x33, 0x19, 0x45, 0x8e, 0x15, 0x45, 0xd3,
+	0x30, 0x8a, 0x1c, 0x6f, 0xd1, 0xd5, 0x61, 0xc3, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x31, 0xc7,
+	0xf7, 0x69, 0x41, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/shopping_performance_view.pb.go b/googleapis/ads/googleads/v3/resources/shopping_performance_view.pb.go
new file mode 100644
index 0000000..7fce010
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/shopping_performance_view.pb.go
@@ -0,0 +1,104 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/shopping_performance_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Shopping performance view.
+// Provides Shopping campaign statistics aggregated at several product dimension
+// levels. Product dimension values from Merchant Center such as brand,
+// category, custom attributes, product condition and product type will reflect
+// the state of each dimension as of the date and time when the corresponding
+// event was recorded.
+type ShoppingPerformanceView struct {
+	// The resource name of the Shopping performance view.
+	// Shopping performance view resource names have the form:
+	// `customers/{customer_id}/shoppingPerformanceView`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ShoppingPerformanceView) Reset()         { *m = ShoppingPerformanceView{} }
+func (m *ShoppingPerformanceView) String() string { return proto.CompactTextString(m) }
+func (*ShoppingPerformanceView) ProtoMessage()    {}
+func (*ShoppingPerformanceView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f485d5704344bc86, []int{0}
+}
+
+func (m *ShoppingPerformanceView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ShoppingPerformanceView.Unmarshal(m, b)
+}
+func (m *ShoppingPerformanceView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ShoppingPerformanceView.Marshal(b, m, deterministic)
+}
+func (m *ShoppingPerformanceView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ShoppingPerformanceView.Merge(m, src)
+}
+func (m *ShoppingPerformanceView) XXX_Size() int {
+	return xxx_messageInfo_ShoppingPerformanceView.Size(m)
+}
+func (m *ShoppingPerformanceView) XXX_DiscardUnknown() {
+	xxx_messageInfo_ShoppingPerformanceView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ShoppingPerformanceView proto.InternalMessageInfo
+
+func (m *ShoppingPerformanceView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ShoppingPerformanceView)(nil), "google.ads.googleads.v3.resources.ShoppingPerformanceView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/shopping_performance_view.proto", fileDescriptor_f485d5704344bc86)
+}
+
+var fileDescriptor_f485d5704344bc86 = []byte{
+	// 323 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0xf3, 0x40,
+	0x10, 0xc7, 0x49, 0x3e, 0xf8, 0xc0, 0xa0, 0x97, 0x5e, 0xd4, 0xd2, 0x83, 0x55, 0x0a, 0x1e, 0x64,
+	0x57, 0xc8, 0x6d, 0x3d, 0x6d, 0x2f, 0x05, 0x0f, 0x52, 0x2a, 0xe4, 0x20, 0x81, 0xba, 0x26, 0xeb,
+	0x1a, 0x68, 0x76, 0x96, 0x9d, 0xb4, 0x3d, 0x88, 0x0f, 0xe0, 0x6b, 0xe8, 0xcd, 0x47, 0xf1, 0x51,
+	0xfa, 0x14, 0xd2, 0x6e, 0x77, 0x23, 0x42, 0xf5, 0xf6, 0x27, 0xf3, 0x9b, 0xdf, 0x4c, 0x66, 0x13,
+	0xae, 0x00, 0xd4, 0x4c, 0x52, 0x51, 0x22, 0x75, 0x71, 0x9d, 0x16, 0x29, 0xb5, 0x12, 0x61, 0x6e,
+	0x0b, 0x89, 0x14, 0x9f, 0xc0, 0x98, 0x4a, 0xab, 0xa9, 0x91, 0xf6, 0x11, 0x6c, 0x2d, 0x74, 0x21,
+	0xa7, 0x8b, 0x4a, 0x2e, 0x89, 0xb1, 0xd0, 0x40, 0xa7, 0xef, 0xfa, 0x88, 0x28, 0x91, 0x04, 0x05,
+	0x59, 0xa4, 0x24, 0x28, 0xba, 0xc7, 0x7e, 0x8a, 0xa9, 0x82, 0xd8, 0x75, 0x77, 0x7b, 0xdf, 0x4a,
+	0x42, 0x6b, 0x68, 0x44, 0x53, 0x81, 0x46, 0x57, 0x3d, 0x7d, 0x8f, 0x92, 0xc3, 0xdb, 0xed, 0xfc,
+	0x71, 0x3b, 0x3e, 0xab, 0xe4, 0xb2, 0x73, 0x96, 0x1c, 0x78, 0xd7, 0x54, 0x8b, 0x5a, 0x1e, 0x45,
+	0x27, 0xd1, 0xf9, 0xde, 0x64, 0xdf, 0x7f, 0xbc, 0x11, 0xb5, 0x64, 0xc5, 0x8a, 0xdf, 0x27, 0x97,
+	0xed, 0x5a, 0xdb, 0x64, 0x2a, 0x24, 0x05, 0xd4, 0x74, 0x97, 0xfb, 0xa2, 0x98, 0x63, 0x03, 0xb5,
+	0xb4, 0x48, 0x9f, 0x7d, 0x7c, 0x09, 0x97, 0xf8, 0x41, 0x0f, 0x5f, 0xe3, 0x64, 0x50, 0x40, 0x4d,
+	0xfe, 0x3c, 0xc4, 0xb0, 0xb7, 0x63, 0xe0, 0x78, 0xfd, 0xb7, 0xe3, 0xe8, 0xee, 0x7a, 0xab, 0x50,
+	0x30, 0x13, 0x5a, 0x11, 0xb0, 0x8a, 0x2a, 0xa9, 0x37, 0xb7, 0xa0, 0xed, 0xea, 0xbf, 0xbc, 0xd6,
+	0x55, 0x48, 0x6f, 0xf1, 0xbf, 0x11, 0xe7, 0x1f, 0x71, 0x7f, 0xe4, 0x94, 0xbc, 0x44, 0xe2, 0xe2,
+	0x3a, 0x65, 0x29, 0x99, 0x78, 0xf2, 0xd3, 0x33, 0x39, 0x2f, 0x31, 0x0f, 0x4c, 0x9e, 0xa5, 0x79,
+	0x60, 0x56, 0xf1, 0xc0, 0x15, 0x18, 0xe3, 0x25, 0x32, 0x16, 0x28, 0xc6, 0xb2, 0x94, 0xb1, 0xc0,
+	0x3d, 0xfc, 0xdf, 0x2c, 0x9b, 0x7e, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x88, 0xfa, 0x29, 0x59,
+	0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/topic_constant.pb.go b/googleapis/ads/googleads/v3/resources/topic_constant.pb.go
new file mode 100644
index 0000000..f09e744
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/topic_constant.pb.go
@@ -0,0 +1,138 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/topic_constant.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Use topics to target or exclude placements in the Google Display Network
+// based on the category into which the placement falls (for example,
+// "Pets & Animals/Pets/Dogs").
+type TopicConstant struct {
+	// The resource name of the topic constant.
+	// topic constant resource names have the form:
+	//
+	// `topicConstants/{topic_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the topic.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// Resource name of parent of the topic constant.
+	TopicConstantParent *wrappers.StringValue `protobuf:"bytes,3,opt,name=topic_constant_parent,json=topicConstantParent,proto3" json:"topic_constant_parent,omitempty"`
+	// The category to target or exclude. Each subsequent element in the array
+	// describes a more specific sub-category. For example,
+	// {"Pets & Animals", "Pets", "Dogs"} represents the
+	// "Pets & Animals/Pets/Dogs" category. List of available topic categories at
+	// https://developers.google.com/adwords/api/docs/appendix/verticals
+	Path                 []*wrappers.StringValue `protobuf:"bytes,4,rep,name=path,proto3" json:"path,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *TopicConstant) Reset()         { *m = TopicConstant{} }
+func (m *TopicConstant) String() string { return proto.CompactTextString(m) }
+func (*TopicConstant) ProtoMessage()    {}
+func (*TopicConstant) Descriptor() ([]byte, []int) {
+	return fileDescriptor_87af0f21f4e047c9, []int{0}
+}
+
+func (m *TopicConstant) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TopicConstant.Unmarshal(m, b)
+}
+func (m *TopicConstant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TopicConstant.Marshal(b, m, deterministic)
+}
+func (m *TopicConstant) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TopicConstant.Merge(m, src)
+}
+func (m *TopicConstant) XXX_Size() int {
+	return xxx_messageInfo_TopicConstant.Size(m)
+}
+func (m *TopicConstant) XXX_DiscardUnknown() {
+	xxx_messageInfo_TopicConstant.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TopicConstant proto.InternalMessageInfo
+
+func (m *TopicConstant) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *TopicConstant) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *TopicConstant) GetTopicConstantParent() *wrappers.StringValue {
+	if m != nil {
+		return m.TopicConstantParent
+	}
+	return nil
+}
+
+func (m *TopicConstant) GetPath() []*wrappers.StringValue {
+	if m != nil {
+		return m.Path
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*TopicConstant)(nil), "google.ads.googleads.v3.resources.TopicConstant")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/topic_constant.proto", fileDescriptor_87af0f21f4e047c9)
+}
+
+var fileDescriptor_87af0f21f4e047c9 = []byte{
+	// 398 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0x4f, 0x6b, 0xdb, 0x30,
+	0x18, 0xc6, 0xb1, 0x13, 0x06, 0xd3, 0x96, 0x8b, 0xc7, 0xc0, 0xcb, 0xc2, 0x96, 0x6c, 0x64, 0x04,
+	0x06, 0xd2, 0x98, 0x47, 0x0e, 0xda, 0xc9, 0xd9, 0x21, 0x64, 0x8c, 0x61, 0xb2, 0xe1, 0x43, 0x31,
+	0x04, 0xc5, 0x56, 0x5d, 0x43, 0x2c, 0x09, 0x49, 0x49, 0x0f, 0xa5, 0x5f, 0xa6, 0xc7, 0x5e, 0xfb,
+	0x2d, 0xfa, 0x51, 0xf2, 0x25, 0x5a, 0xfc, 0x4f, 0x89, 0x29, 0x34, 0xb7, 0xc7, 0x7e, 0x9f, 0xe7,
+	0xd1, 0xcf, 0xaf, 0x05, 0xa6, 0x29, 0xe7, 0xe9, 0x86, 0x22, 0x92, 0x28, 0x54, 0xc9, 0x42, 0xed,
+	0x3c, 0x24, 0xa9, 0xe2, 0x5b, 0x19, 0x53, 0x85, 0x34, 0x17, 0x59, 0xbc, 0x8a, 0x39, 0x53, 0x9a,
+	0x30, 0x0d, 0x85, 0xe4, 0x9a, 0x3b, 0xa3, 0xca, 0x0c, 0x49, 0xa2, 0xa0, 0xc9, 0xc1, 0x9d, 0x07,
+	0x4d, 0xae, 0xff, 0xae, 0xa9, 0x16, 0x99, 0x69, 0xab, 0xd2, 0xfd, 0x0f, 0xf5, 0xa8, 0x7c, 0x5a,
+	0x6f, 0xcf, 0xd1, 0xa5, 0x24, 0x42, 0x50, 0xa9, 0xea, 0xf9, 0xe0, 0x28, 0x4a, 0x18, 0xe3, 0x9a,
+	0xe8, 0x8c, 0xb3, 0x7a, 0xfa, 0xe9, 0xce, 0x06, 0xbd, 0xff, 0x05, 0xd4, 0xaf, 0x9a, 0xc9, 0xf9,
+	0x0c, 0x7a, 0xcd, 0x09, 0x2b, 0x46, 0x72, 0xea, 0x5a, 0x43, 0x6b, 0xf2, 0x72, 0xf9, 0xba, 0x79,
+	0xf9, 0x97, 0xe4, 0xd4, 0xf9, 0x0a, 0xec, 0x2c, 0x71, 0xed, 0xa1, 0x35, 0x79, 0xf5, 0xfd, 0x7d,
+	0x0d, 0x0d, 0x1b, 0x02, 0xb8, 0x60, 0x7a, 0xfa, 0x23, 0x24, 0x9b, 0x2d, 0x5d, 0xda, 0x59, 0xe2,
+	0x04, 0xe0, 0x6d, 0xfb, 0xbb, 0x57, 0x82, 0x48, 0xca, 0xb4, 0xdb, 0x29, 0xf3, 0x83, 0x27, 0xf9,
+	0x7f, 0x5a, 0x66, 0x2c, 0xad, 0x0a, 0xde, 0xe8, 0x63, 0xba, 0xa0, 0x0c, 0x3a, 0xdf, 0x40, 0x57,
+	0x10, 0x7d, 0xe1, 0x76, 0x87, 0x9d, 0x93, 0x05, 0xa5, 0x13, 0xff, 0xd9, 0xfb, 0x0b, 0xf0, 0xe5,
+	0xb0, 0xdd, 0x5a, 0x89, 0x4c, 0xc1, 0x98, 0xe7, 0xa8, 0xbd, 0x82, 0x8f, 0xad, 0x33, 0x15, 0xba,
+	0x6a, 0xe3, 0x5f, 0xcf, 0x1e, 0x2c, 0x30, 0x8e, 0x79, 0x0e, 0x4f, 0xfe, 0xb8, 0x99, 0xd3, 0x6a,
+	0x0e, 0x0a, 0xc0, 0xc0, 0x3a, 0xfb, 0x5d, 0x07, 0x53, 0xbe, 0x21, 0x2c, 0x85, 0x5c, 0xa6, 0x28,
+	0xa5, 0xac, 0xc4, 0x47, 0x07, 0xb2, 0x67, 0x2e, 0xd2, 0x4f, 0xa3, 0x6e, 0xec, 0xce, 0xdc, 0xf7,
+	0x6f, 0xed, 0xd1, 0xbc, 0xaa, 0xf4, 0x13, 0x05, 0x2b, 0x59, 0xa8, 0xd0, 0x83, 0xcb, 0xc6, 0x79,
+	0xdf, 0x78, 0x22, 0x3f, 0x51, 0x91, 0xf1, 0x44, 0xa1, 0x17, 0x19, 0xcf, 0xde, 0x1e, 0x57, 0x03,
+	0x8c, 0xfd, 0x44, 0x61, 0x6c, 0x5c, 0x18, 0x87, 0x1e, 0xc6, 0xc6, 0xb7, 0x7e, 0x51, 0xc2, 0x7a,
+	0x8f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xba, 0x66, 0x83, 0xb6, 0xf4, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/topic_view.pb.go b/googleapis/ads/googleads/v3/resources/topic_view.pb.go
new file mode 100644
index 0000000..437cf32
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/topic_view.pb.go
@@ -0,0 +1,99 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/topic_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A topic view.
+type TopicView struct {
+	// The resource name of the topic view.
+	// Topic view resource names have the form:
+	//
+	// `customers/{customer_id}/topicViews/{ad_group_id}~{criterion_id}`
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TopicView) Reset()         { *m = TopicView{} }
+func (m *TopicView) String() string { return proto.CompactTextString(m) }
+func (*TopicView) ProtoMessage()    {}
+func (*TopicView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_cd8d6dea163affbf, []int{0}
+}
+
+func (m *TopicView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TopicView.Unmarshal(m, b)
+}
+func (m *TopicView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TopicView.Marshal(b, m, deterministic)
+}
+func (m *TopicView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TopicView.Merge(m, src)
+}
+func (m *TopicView) XXX_Size() int {
+	return xxx_messageInfo_TopicView.Size(m)
+}
+func (m *TopicView) XXX_DiscardUnknown() {
+	xxx_messageInfo_TopicView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TopicView proto.InternalMessageInfo
+
+func (m *TopicView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*TopicView)(nil), "google.ads.googleads.v3.resources.TopicView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/topic_view.proto", fileDescriptor_cd8d6dea163affbf)
+}
+
+var fileDescriptor_cd8d6dea163affbf = []byte{
+	// 311 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0xb1, 0x6a, 0xf3, 0x30,
+	0x14, 0x85, 0x71, 0x7e, 0xf8, 0x21, 0xa6, 0xed, 0x90, 0xa9, 0x0d, 0x1d, 0x9a, 0x94, 0x40, 0x87,
+	0x22, 0x41, 0xb5, 0xa9, 0x93, 0xb2, 0x04, 0x3a, 0x94, 0x10, 0x5a, 0x0f, 0xc5, 0x10, 0x54, 0x5b,
+	0x08, 0x41, 0xac, 0x6b, 0x7c, 0x1d, 0x67, 0x08, 0x99, 0xfb, 0x1e, 0x1d, 0xfb, 0x28, 0x7d, 0x94,
+	0xbc, 0x42, 0x97, 0xe2, 0x28, 0x92, 0x3b, 0xb5, 0xdb, 0xc1, 0xe7, 0x3b, 0x47, 0xf7, 0x38, 0xbe,
+	0xd3, 0x00, 0x7a, 0xa5, 0xa8, 0xcc, 0x91, 0x3a, 0xd9, 0xaa, 0x86, 0xd1, 0x4a, 0x21, 0xac, 0xab,
+	0x4c, 0x21, 0xad, 0xa1, 0x34, 0xd9, 0xb2, 0x31, 0x6a, 0x43, 0xca, 0x0a, 0x6a, 0x18, 0x8c, 0x1c,
+	0x48, 0x64, 0x8e, 0x24, 0x64, 0x48, 0xc3, 0x48, 0xc8, 0x0c, 0x2f, 0x7c, 0x6d, 0x69, 0x42, 0x93,
+	0x4b, 0x0f, 0x2f, 0x7f, 0x58, 0xd2, 0x5a, 0xa8, 0x65, 0x6d, 0xc0, 0xa2, 0x73, 0xc7, 0x6f, 0x51,
+	0xdc, 0x7f, 0x6a, 0x1f, 0x4c, 0x8c, 0xda, 0x0c, 0xae, 0xe3, 0x53, 0x9f, 0x5e, 0x5a, 0x59, 0xa8,
+	0xf3, 0xe8, 0x2a, 0xba, 0xe9, 0x2f, 0x4e, 0xfc, 0xc7, 0x47, 0x59, 0x28, 0xfe, 0xbc, 0x17, 0x8b,
+	0x78, 0xdc, 0x1d, 0x72, 0x54, 0xa5, 0x41, 0x92, 0x41, 0x41, 0xbb, 0xb6, 0xdb, 0x6c, 0x8d, 0x35,
+	0x14, 0xaa, 0x42, 0xba, 0xf5, 0x72, 0xe7, 0xe6, 0xb5, 0x3e, 0xd2, 0x6d, 0x37, 0x75, 0x37, 0xfd,
+	0x8a, 0xe2, 0x49, 0x06, 0x05, 0xf9, 0x73, 0xec, 0xf4, 0x2c, 0x3c, 0x31, 0x6f, 0x37, 0xcc, 0xa3,
+	0x97, 0x87, 0x63, 0x48, 0xc3, 0x4a, 0x5a, 0x4d, 0xa0, 0xd2, 0x54, 0x2b, 0x7b, 0x58, 0x48, 0xbb,
+	0xf3, 0x7e, 0xf9, 0xe9, 0xf7, 0x41, 0xbd, 0xf7, 0xfe, 0xcd, 0x84, 0xf8, 0xe8, 0x8d, 0x66, 0xae,
+	0x52, 0xe4, 0x48, 0x9c, 0x6c, 0x55, 0xc2, 0xc8, 0xc2, 0x93, 0x9f, 0x9e, 0x49, 0x45, 0x8e, 0x69,
+	0x60, 0xd2, 0x84, 0xa5, 0x81, 0xd9, 0xf7, 0x26, 0xce, 0xe0, 0x5c, 0xe4, 0xc8, 0x79, 0xa0, 0x38,
+	0x4f, 0x18, 0xe7, 0x81, 0x7b, 0xfd, 0x7f, 0x38, 0x96, 0x7d, 0x07, 0x00, 0x00, 0xff, 0xff, 0x7d,
+	0xdf, 0xdb, 0xda, 0x20, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/user_interest.pb.go b/googleapis/ads/googleads/v3/resources/user_interest.pb.go
new file mode 100644
index 0000000..21e4cc6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/user_interest.pb.go
@@ -0,0 +1,172 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/user_interest.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A user interest: a particular interest-based vertical to be targeted.
+type UserInterest struct {
+	// The resource name of the user interest.
+	// User interest resource names have the form:
+	//
+	// `customers/{customer_id}/userInterests/{user_interest_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Taxonomy type of the user interest.
+	TaxonomyType enums.UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType `protobuf:"varint,2,opt,name=taxonomy_type,json=taxonomyType,proto3,enum=google.ads.googleads.v3.enums.UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType" json:"taxonomy_type,omitempty"`
+	// The ID of the user interest.
+	UserInterestId *wrappers.Int64Value `protobuf:"bytes,3,opt,name=user_interest_id,json=userInterestId,proto3" json:"user_interest_id,omitempty"`
+	// The name of the user interest.
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The parent of the user interest.
+	UserInterestParent *wrappers.StringValue `protobuf:"bytes,5,opt,name=user_interest_parent,json=userInterestParent,proto3" json:"user_interest_parent,omitempty"`
+	// True if the user interest is launched to all channels and locales.
+	LaunchedToAll *wrappers.BoolValue `protobuf:"bytes,6,opt,name=launched_to_all,json=launchedToAll,proto3" json:"launched_to_all,omitempty"`
+	// Availability information of the user interest.
+	Availabilities       []*common.CriterionCategoryAvailability `protobuf:"bytes,7,rep,name=availabilities,proto3" json:"availabilities,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *UserInterest) Reset()         { *m = UserInterest{} }
+func (m *UserInterest) String() string { return proto.CompactTextString(m) }
+func (*UserInterest) ProtoMessage()    {}
+func (*UserInterest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_853f2530b9dfe755, []int{0}
+}
+
+func (m *UserInterest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserInterest.Unmarshal(m, b)
+}
+func (m *UserInterest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserInterest.Marshal(b, m, deterministic)
+}
+func (m *UserInterest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserInterest.Merge(m, src)
+}
+func (m *UserInterest) XXX_Size() int {
+	return xxx_messageInfo_UserInterest.Size(m)
+}
+func (m *UserInterest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserInterest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserInterest proto.InternalMessageInfo
+
+func (m *UserInterest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *UserInterest) GetTaxonomyType() enums.UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType {
+	if m != nil {
+		return m.TaxonomyType
+	}
+	return enums.UserInterestTaxonomyTypeEnum_UNSPECIFIED
+}
+
+func (m *UserInterest) GetUserInterestId() *wrappers.Int64Value {
+	if m != nil {
+		return m.UserInterestId
+	}
+	return nil
+}
+
+func (m *UserInterest) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *UserInterest) GetUserInterestParent() *wrappers.StringValue {
+	if m != nil {
+		return m.UserInterestParent
+	}
+	return nil
+}
+
+func (m *UserInterest) GetLaunchedToAll() *wrappers.BoolValue {
+	if m != nil {
+		return m.LaunchedToAll
+	}
+	return nil
+}
+
+func (m *UserInterest) GetAvailabilities() []*common.CriterionCategoryAvailability {
+	if m != nil {
+		return m.Availabilities
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*UserInterest)(nil), "google.ads.googleads.v3.resources.UserInterest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/user_interest.proto", fileDescriptor_853f2530b9dfe755)
+}
+
+var fileDescriptor_853f2530b9dfe755 = []byte{
+	// 564 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xcd, 0x6e, 0xd3, 0x40,
+	0x10, 0x96, 0xd3, 0x1f, 0x84, 0xdb, 0x06, 0xb0, 0x38, 0x98, 0x50, 0xa1, 0x14, 0x14, 0x29, 0xa7,
+	0x5d, 0x14, 0x03, 0x07, 0x23, 0x84, 0x9c, 0x52, 0x55, 0xe1, 0x50, 0x45, 0x21, 0xe4, 0x00, 0x11,
+	0xd6, 0xc6, 0x1e, 0xcc, 0x4a, 0xeb, 0x5d, 0x6b, 0x77, 0x1d, 0xb0, 0xaa, 0x5e, 0x78, 0x14, 0x8e,
+	0x3c, 0x0a, 0x8f, 0xd2, 0x87, 0x40, 0x28, 0xfe, 0xab, 0xd3, 0x2a, 0xc0, 0xed, 0xdb, 0xcc, 0xf7,
+	0x33, 0x33, 0x99, 0xc4, 0x7c, 0x1e, 0x09, 0x11, 0x31, 0xc0, 0x24, 0x54, 0xb8, 0x80, 0x2b, 0xb4,
+	0x74, 0xb0, 0x04, 0x25, 0x52, 0x19, 0x80, 0xc2, 0xa9, 0x02, 0xe9, 0x53, 0xae, 0x41, 0x82, 0xd2,
+	0x28, 0x91, 0x42, 0x0b, 0xeb, 0xa8, 0xe0, 0x22, 0x12, 0x2a, 0x54, 0xcb, 0xd0, 0xd2, 0x41, 0xb5,
+	0xac, 0xf3, 0x66, 0x93, 0x73, 0x20, 0xe2, 0x58, 0x70, 0x1c, 0x48, 0xaa, 0x41, 0x52, 0xc1, 0xfd,
+	0x80, 0x68, 0x88, 0x84, 0xcc, 0x7c, 0xb2, 0x24, 0x94, 0x91, 0x05, 0x65, 0x54, 0x67, 0x45, 0x50,
+	0xe7, 0xf5, 0x26, 0x17, 0xe0, 0x69, 0x7c, 0xad, 0x37, 0x5f, 0x93, 0x6f, 0x82, 0x8b, 0x38, 0xf3,
+	0x75, 0x96, 0x40, 0x69, 0xf0, 0xa0, 0x32, 0x48, 0x68, 0x3d, 0x53, 0x59, 0x7a, 0x54, 0x96, 0xf2,
+	0xd7, 0x22, 0xfd, 0x8c, 0xbf, 0x4a, 0x92, 0x24, 0x20, 0x55, 0x59, 0x3f, 0x6c, 0x48, 0x09, 0xe7,
+	0x42, 0x13, 0x4d, 0x05, 0x2f, 0xab, 0x8f, 0xbf, 0xef, 0x98, 0xfb, 0xef, 0x15, 0xc8, 0x51, 0x99,
+	0x6e, 0x3d, 0x31, 0x0f, 0xaa, 0x00, 0x9f, 0x93, 0x18, 0x6c, 0xa3, 0x6b, 0xf4, 0x6f, 0x4f, 0xf6,
+	0xab, 0x0f, 0xcf, 0x48, 0x0c, 0x56, 0x66, 0x1e, 0xac, 0x75, 0x69, 0xb7, 0xba, 0x46, 0xbf, 0x3d,
+	0x98, 0xa2, 0x4d, 0x0b, 0xcd, 0xe7, 0x44, 0xcd, 0xa0, 0x69, 0xa9, 0x9f, 0x66, 0x09, 0x9c, 0xf0,
+	0x34, 0xde, 0x58, 0x9c, 0xec, 0xeb, 0xc6, 0xcb, 0x3a, 0x31, 0xef, 0xae, 0xaf, 0x8b, 0x86, 0xf6,
+	0x56, 0xd7, 0xe8, 0xef, 0x0d, 0x1e, 0x56, 0xe9, 0xd5, 0x26, 0xd0, 0x88, 0xeb, 0x17, 0xcf, 0x66,
+	0x84, 0xa5, 0x30, 0x69, 0xa7, 0x0d, 0xfb, 0x51, 0x68, 0x3d, 0x35, 0xb7, 0xf3, 0xe9, 0xb6, 0x73,
+	0xe9, 0xe1, 0x0d, 0xe9, 0x3b, 0x2d, 0x29, 0x8f, 0x0a, 0x6d, 0xce, 0xb4, 0xce, 0xcc, 0xfb, 0xeb,
+	0xc1, 0x09, 0x91, 0xc0, 0xb5, 0xbd, 0xf3, 0x1f, 0x0e, 0x56, 0x33, 0x7d, 0x9c, 0xeb, 0xac, 0xa1,
+	0x79, 0x87, 0x91, 0x94, 0x07, 0x5f, 0x20, 0xf4, 0xb5, 0xf0, 0x09, 0x63, 0xf6, 0x6e, 0x6e, 0xd5,
+	0xb9, 0x61, 0x35, 0x14, 0x82, 0x15, 0x46, 0x07, 0x95, 0x64, 0x2a, 0x3c, 0xc6, 0x2c, 0x30, 0xdb,
+	0x8d, 0x6b, 0xa3, 0xa0, 0xec, 0x5b, 0xdd, 0xad, 0xfe, 0xde, 0xe0, 0xd5, 0xc6, 0x2f, 0xa2, 0x38,
+	0x5b, 0x74, 0x5c, 0x9d, 0xed, 0x71, 0x79, 0xb5, 0x5e, 0xe3, 0x68, 0x27, 0xd7, 0x4c, 0xdd, 0x4f,
+	0x97, 0xde, 0x47, 0xb3, 0x77, 0xe5, 0x53, 0xa2, 0x84, 0xaa, 0x95, 0x1f, 0x5e, 0xbb, 0x9f, 0x41,
+	0x90, 0x2a, 0x2d, 0x62, 0x90, 0x0a, 0x9f, 0x57, 0xf0, 0x02, 0x37, 0xe7, 0x57, 0xf8, 0x7c, 0x6d,
+	0x91, 0x17, 0xc3, 0xdf, 0x86, 0xd9, 0x0b, 0x44, 0x8c, 0xfe, 0xf9, 0x73, 0x1c, 0xde, 0x6b, 0x66,
+	0x8d, 0x57, 0xfb, 0x19, 0x1b, 0x1f, 0xde, 0x96, 0xba, 0x48, 0x30, 0xc2, 0x23, 0x24, 0x64, 0x84,
+	0x23, 0xe0, 0xf9, 0xf6, 0xf0, 0x55, 0xab, 0x7f, 0xf9, 0x73, 0x78, 0x59, 0xa3, 0x1f, 0xad, 0xad,
+	0x53, 0xcf, 0xfb, 0xd9, 0x3a, 0x3a, 0x2d, 0x2c, 0xbd, 0x50, 0xa1, 0x02, 0xae, 0xd0, 0xcc, 0x41,
+	0x93, 0x8a, 0xf9, 0xab, 0xe2, 0xcc, 0xbd, 0x50, 0xcd, 0x6b, 0xce, 0x7c, 0xe6, 0xcc, 0x6b, 0xce,
+	0x65, 0xab, 0x57, 0x14, 0x5c, 0xd7, 0x0b, 0x95, 0xeb, 0xd6, 0x2c, 0xd7, 0x9d, 0x39, 0xae, 0x5b,
+	0xf3, 0x16, 0xbb, 0x79, 0xb3, 0xce, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x00, 0x06, 0xa2,
+	0xc8, 0x04, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/user_list.pb.go b/googleapis/ads/googleads/v3/resources/user_list.pb.go
new file mode 100644
index 0000000..d26dace
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/user_list.pb.go
@@ -0,0 +1,431 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/user_list.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A user list. This is a list of users a customer may target.
+type UserList struct {
+	// The resource name of the user list.
+	// User list resource names have the form:
+	//
+	// `customers/{customer_id}/userLists/{user_list_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Id of the user list.
+	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// A flag that indicates if a user may edit a list. Depends on the list
+	// ownership and list type. For example, external remarketing user lists are
+	// not editable.
+	//
+	// This field is read-only.
+	ReadOnly *wrappers.BoolValue `protobuf:"bytes,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"`
+	// Name of this user list. Depending on its access_reason, the user list name
+	// may not be unique (e.g. if access_reason=SHARED)
+	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// Description of this user list.
+	Description *wrappers.StringValue `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
+	// Membership status of this user list. Indicates whether a user list is open
+	// or active. Only open user lists can accumulate more users and can be
+	// targeted to.
+	MembershipStatus enums.UserListMembershipStatusEnum_UserListMembershipStatus `protobuf:"varint,6,opt,name=membership_status,json=membershipStatus,proto3,enum=google.ads.googleads.v3.enums.UserListMembershipStatusEnum_UserListMembershipStatus" json:"membership_status,omitempty"`
+	// An ID from external system. It is used by user list sellers to correlate
+	// IDs on their systems.
+	IntegrationCode *wrappers.StringValue `protobuf:"bytes,7,opt,name=integration_code,json=integrationCode,proto3" json:"integration_code,omitempty"`
+	// Number of days a user's cookie stays on your list since its most recent
+	// addition to the list. This field must be between 0 and 540 inclusive.
+	// However, for CRM based userlists, this field can be set to 10000 which
+	// means no expiration.
+	//
+	// It'll be ignored for logical_user_list.
+	MembershipLifeSpan *wrappers.Int64Value `protobuf:"bytes,8,opt,name=membership_life_span,json=membershipLifeSpan,proto3" json:"membership_life_span,omitempty"`
+	// Estimated number of users in this user list, on the Google Display Network.
+	// This value is null if the number of users has not yet been determined.
+	//
+	// This field is read-only.
+	SizeForDisplay *wrappers.Int64Value `protobuf:"bytes,9,opt,name=size_for_display,json=sizeForDisplay,proto3" json:"size_for_display,omitempty"`
+	// Size range in terms of number of users of the UserList, on the Google
+	// Display Network.
+	//
+	// This field is read-only.
+	SizeRangeForDisplay enums.UserListSizeRangeEnum_UserListSizeRange `protobuf:"varint,10,opt,name=size_range_for_display,json=sizeRangeForDisplay,proto3,enum=google.ads.googleads.v3.enums.UserListSizeRangeEnum_UserListSizeRange" json:"size_range_for_display,omitempty"`
+	// Estimated number of users in this user list in the google.com domain.
+	// These are the users available for targeting in Search campaigns.
+	// This value is null if the number of users has not yet been determined.
+	//
+	// This field is read-only.
+	SizeForSearch *wrappers.Int64Value `protobuf:"bytes,11,opt,name=size_for_search,json=sizeForSearch,proto3" json:"size_for_search,omitempty"`
+	// Size range in terms of number of users of the UserList, for Search ads.
+	//
+	// This field is read-only.
+	SizeRangeForSearch enums.UserListSizeRangeEnum_UserListSizeRange `protobuf:"varint,12,opt,name=size_range_for_search,json=sizeRangeForSearch,proto3,enum=google.ads.googleads.v3.enums.UserListSizeRangeEnum_UserListSizeRange" json:"size_range_for_search,omitempty"`
+	// Type of this list.
+	//
+	// This field is read-only.
+	Type enums.UserListTypeEnum_UserListType `protobuf:"varint,13,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.UserListTypeEnum_UserListType" json:"type,omitempty"`
+	// Indicating the reason why this user list membership status is closed. It is
+	// only populated on lists that were automatically closed due to inactivity,
+	// and will be cleared once the list membership status becomes open.
+	ClosingReason enums.UserListClosingReasonEnum_UserListClosingReason `protobuf:"varint,14,opt,name=closing_reason,json=closingReason,proto3,enum=google.ads.googleads.v3.enums.UserListClosingReasonEnum_UserListClosingReason" json:"closing_reason,omitempty"`
+	// Indicates the reason this account has been granted access to the list.
+	// The reason can be SHARED, OWNED, LICENSED or SUBSCRIBED.
+	//
+	// This field is read-only.
+	AccessReason enums.AccessReasonEnum_AccessReason `protobuf:"varint,15,opt,name=access_reason,json=accessReason,proto3,enum=google.ads.googleads.v3.enums.AccessReasonEnum_AccessReason" json:"access_reason,omitempty"`
+	// Indicates if this share is still enabled. When a UserList is shared with
+	// the user this field is set to ENABLED. Later the userList owner can decide
+	// to revoke the share and make it DISABLED.
+	// The default value of this field is set to ENABLED.
+	AccountUserListStatus enums.UserListAccessStatusEnum_UserListAccessStatus `protobuf:"varint,16,opt,name=account_user_list_status,json=accountUserListStatus,proto3,enum=google.ads.googleads.v3.enums.UserListAccessStatusEnum_UserListAccessStatus" json:"account_user_list_status,omitempty"`
+	// Indicates if this user list is eligible for Google Search Network.
+	EligibleForSearch *wrappers.BoolValue `protobuf:"bytes,17,opt,name=eligible_for_search,json=eligibleForSearch,proto3" json:"eligible_for_search,omitempty"`
+	// Indicates this user list is eligible for Google Display Network.
+	//
+	// This field is read-only.
+	EligibleForDisplay *wrappers.BoolValue `protobuf:"bytes,18,opt,name=eligible_for_display,json=eligibleForDisplay,proto3" json:"eligible_for_display,omitempty"`
+	// The user list.
+	//
+	// Exactly one must be set.
+	//
+	// Types that are valid to be assigned to UserList:
+	//	*UserList_CrmBasedUserList
+	//	*UserList_SimilarUserList
+	//	*UserList_RuleBasedUserList
+	//	*UserList_LogicalUserList
+	//	*UserList_BasicUserList
+	UserList             isUserList_UserList `protobuf_oneof:"user_list"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *UserList) Reset()         { *m = UserList{} }
+func (m *UserList) String() string { return proto.CompactTextString(m) }
+func (*UserList) ProtoMessage()    {}
+func (*UserList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2efbaf923f128250, []int{0}
+}
+
+func (m *UserList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserList.Unmarshal(m, b)
+}
+func (m *UserList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserList.Marshal(b, m, deterministic)
+}
+func (m *UserList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserList.Merge(m, src)
+}
+func (m *UserList) XXX_Size() int {
+	return xxx_messageInfo_UserList.Size(m)
+}
+func (m *UserList) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserList proto.InternalMessageInfo
+
+func (m *UserList) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *UserList) GetId() *wrappers.Int64Value {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *UserList) GetReadOnly() *wrappers.BoolValue {
+	if m != nil {
+		return m.ReadOnly
+	}
+	return nil
+}
+
+func (m *UserList) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *UserList) GetDescription() *wrappers.StringValue {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *UserList) GetMembershipStatus() enums.UserListMembershipStatusEnum_UserListMembershipStatus {
+	if m != nil {
+		return m.MembershipStatus
+	}
+	return enums.UserListMembershipStatusEnum_UNSPECIFIED
+}
+
+func (m *UserList) GetIntegrationCode() *wrappers.StringValue {
+	if m != nil {
+		return m.IntegrationCode
+	}
+	return nil
+}
+
+func (m *UserList) GetMembershipLifeSpan() *wrappers.Int64Value {
+	if m != nil {
+		return m.MembershipLifeSpan
+	}
+	return nil
+}
+
+func (m *UserList) GetSizeForDisplay() *wrappers.Int64Value {
+	if m != nil {
+		return m.SizeForDisplay
+	}
+	return nil
+}
+
+func (m *UserList) GetSizeRangeForDisplay() enums.UserListSizeRangeEnum_UserListSizeRange {
+	if m != nil {
+		return m.SizeRangeForDisplay
+	}
+	return enums.UserListSizeRangeEnum_UNSPECIFIED
+}
+
+func (m *UserList) GetSizeForSearch() *wrappers.Int64Value {
+	if m != nil {
+		return m.SizeForSearch
+	}
+	return nil
+}
+
+func (m *UserList) GetSizeRangeForSearch() enums.UserListSizeRangeEnum_UserListSizeRange {
+	if m != nil {
+		return m.SizeRangeForSearch
+	}
+	return enums.UserListSizeRangeEnum_UNSPECIFIED
+}
+
+func (m *UserList) GetType() enums.UserListTypeEnum_UserListType {
+	if m != nil {
+		return m.Type
+	}
+	return enums.UserListTypeEnum_UNSPECIFIED
+}
+
+func (m *UserList) GetClosingReason() enums.UserListClosingReasonEnum_UserListClosingReason {
+	if m != nil {
+		return m.ClosingReason
+	}
+	return enums.UserListClosingReasonEnum_UNSPECIFIED
+}
+
+func (m *UserList) GetAccessReason() enums.AccessReasonEnum_AccessReason {
+	if m != nil {
+		return m.AccessReason
+	}
+	return enums.AccessReasonEnum_UNSPECIFIED
+}
+
+func (m *UserList) GetAccountUserListStatus() enums.UserListAccessStatusEnum_UserListAccessStatus {
+	if m != nil {
+		return m.AccountUserListStatus
+	}
+	return enums.UserListAccessStatusEnum_UNSPECIFIED
+}
+
+func (m *UserList) GetEligibleForSearch() *wrappers.BoolValue {
+	if m != nil {
+		return m.EligibleForSearch
+	}
+	return nil
+}
+
+func (m *UserList) GetEligibleForDisplay() *wrappers.BoolValue {
+	if m != nil {
+		return m.EligibleForDisplay
+	}
+	return nil
+}
+
+type isUserList_UserList interface {
+	isUserList_UserList()
+}
+
+type UserList_CrmBasedUserList struct {
+	CrmBasedUserList *common.CrmBasedUserListInfo `protobuf:"bytes,19,opt,name=crm_based_user_list,json=crmBasedUserList,proto3,oneof"`
+}
+
+type UserList_SimilarUserList struct {
+	SimilarUserList *common.SimilarUserListInfo `protobuf:"bytes,20,opt,name=similar_user_list,json=similarUserList,proto3,oneof"`
+}
+
+type UserList_RuleBasedUserList struct {
+	RuleBasedUserList *common.RuleBasedUserListInfo `protobuf:"bytes,21,opt,name=rule_based_user_list,json=ruleBasedUserList,proto3,oneof"`
+}
+
+type UserList_LogicalUserList struct {
+	LogicalUserList *common.LogicalUserListInfo `protobuf:"bytes,22,opt,name=logical_user_list,json=logicalUserList,proto3,oneof"`
+}
+
+type UserList_BasicUserList struct {
+	BasicUserList *common.BasicUserListInfo `protobuf:"bytes,23,opt,name=basic_user_list,json=basicUserList,proto3,oneof"`
+}
+
+func (*UserList_CrmBasedUserList) isUserList_UserList() {}
+
+func (*UserList_SimilarUserList) isUserList_UserList() {}
+
+func (*UserList_RuleBasedUserList) isUserList_UserList() {}
+
+func (*UserList_LogicalUserList) isUserList_UserList() {}
+
+func (*UserList_BasicUserList) isUserList_UserList() {}
+
+func (m *UserList) GetUserList() isUserList_UserList {
+	if m != nil {
+		return m.UserList
+	}
+	return nil
+}
+
+func (m *UserList) GetCrmBasedUserList() *common.CrmBasedUserListInfo {
+	if x, ok := m.GetUserList().(*UserList_CrmBasedUserList); ok {
+		return x.CrmBasedUserList
+	}
+	return nil
+}
+
+func (m *UserList) GetSimilarUserList() *common.SimilarUserListInfo {
+	if x, ok := m.GetUserList().(*UserList_SimilarUserList); ok {
+		return x.SimilarUserList
+	}
+	return nil
+}
+
+func (m *UserList) GetRuleBasedUserList() *common.RuleBasedUserListInfo {
+	if x, ok := m.GetUserList().(*UserList_RuleBasedUserList); ok {
+		return x.RuleBasedUserList
+	}
+	return nil
+}
+
+func (m *UserList) GetLogicalUserList() *common.LogicalUserListInfo {
+	if x, ok := m.GetUserList().(*UserList_LogicalUserList); ok {
+		return x.LogicalUserList
+	}
+	return nil
+}
+
+func (m *UserList) GetBasicUserList() *common.BasicUserListInfo {
+	if x, ok := m.GetUserList().(*UserList_BasicUserList); ok {
+		return x.BasicUserList
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*UserList) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*UserList_CrmBasedUserList)(nil),
+		(*UserList_SimilarUserList)(nil),
+		(*UserList_RuleBasedUserList)(nil),
+		(*UserList_LogicalUserList)(nil),
+		(*UserList_BasicUserList)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*UserList)(nil), "google.ads.googleads.v3.resources.UserList")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/user_list.proto", fileDescriptor_2efbaf923f128250)
+}
+
+var fileDescriptor_2efbaf923f128250 = []byte{
+	// 969 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xdd, 0x6e, 0xdb, 0x36,
+	0x14, 0xc7, 0x67, 0x37, 0xeb, 0x12, 0x26, 0x8e, 0x6d, 0x26, 0xe9, 0xb4, 0xac, 0x18, 0x92, 0x0d,
+	0x05, 0x82, 0x0d, 0x90, 0xd6, 0xb8, 0xfb, 0x80, 0x5a, 0x6c, 0xb0, 0xb3, 0x36, 0x6b, 0xe1, 0xb6,
+	0x81, 0xdc, 0xe5, 0x62, 0x0b, 0x20, 0xd0, 0x12, 0xad, 0x10, 0xa0, 0x48, 0x81, 0x94, 0x3a, 0xb8,
+	0x41, 0x2f, 0x76, 0xb1, 0x17, 0xd9, 0xe5, 0x1e, 0xa5, 0x8f, 0xd2, 0x47, 0xd8, 0xd5, 0x20, 0xea,
+	0xc3, 0x94, 0x53, 0x57, 0xba, 0xe8, 0x1d, 0x75, 0xce, 0xf9, 0xfd, 0xff, 0x3c, 0xfc, 0x90, 0x04,
+	0xee, 0x06, 0x9c, 0x07, 0x14, 0x5b, 0xc8, 0x97, 0x56, 0x36, 0x4c, 0x47, 0x2f, 0x07, 0x96, 0xc0,
+	0x92, 0x27, 0xc2, 0xc3, 0xd2, 0x4a, 0x24, 0x16, 0x2e, 0x25, 0x32, 0x36, 0x23, 0xc1, 0x63, 0x0e,
+	0x0f, 0xb3, 0x3a, 0x13, 0xf9, 0xd2, 0x2c, 0x11, 0xf3, 0xe5, 0xc0, 0x2c, 0x91, 0x7d, 0x6b, 0x95,
+	0xaa, 0xc7, 0xc3, 0x90, 0xb3, 0x85, 0xa4, 0xcc, 0x34, 0xf7, 0x57, 0x4e, 0x03, 0xb3, 0x24, 0x94,
+	0x16, 0xf2, 0x3c, 0x2c, 0xa5, 0x2b, 0x30, 0x92, 0x9c, 0xe5, 0xc8, 0xfd, 0xf7, 0x23, 0xa5, 0x85,
+	0x9b, 0xc3, 0x32, 0x46, 0x71, 0x52, 0xf8, 0x3d, 0x68, 0x0a, 0x7b, 0x94, 0x4b, 0xc2, 0x82, 0xaa,
+	0xf5, 0xcf, 0x4d, 0xe9, 0x10, 0x87, 0x53, 0x2c, 0xe4, 0x25, 0x89, 0xaa, 0xf6, 0x3f, 0x36, 0x15,
+	0x90, 0xe4, 0x15, 0x76, 0x05, 0x62, 0x01, 0xce, 0xc9, 0xe3, 0xa6, 0x64, 0x3c, 0x8f, 0x0a, 0xe6,
+	0xb3, 0x82, 0x89, 0x48, 0xb9, 0xad, 0x79, 0xea, 0x8b, 0x3c, 0xa5, 0x9e, 0xa6, 0xc9, 0xcc, 0xfa,
+	0x53, 0xa0, 0x28, 0xc2, 0xa2, 0x98, 0xe8, 0x6d, 0x0d, 0x45, 0x8c, 0xf1, 0x18, 0xc5, 0x84, 0xb3,
+	0x3c, 0xfb, 0xe5, 0x9b, 0x1e, 0x58, 0xff, 0x4d, 0x62, 0x31, 0x26, 0x32, 0x86, 0x5f, 0x81, 0x4e,
+	0x21, 0xee, 0x32, 0x14, 0x62, 0xa3, 0x75, 0xd0, 0x3a, 0xda, 0x70, 0xb6, 0x8a, 0xe0, 0x33, 0x14,
+	0x62, 0xf8, 0x0d, 0x68, 0x13, 0xdf, 0x68, 0x1f, 0xb4, 0x8e, 0x36, 0x8f, 0x3f, 0xcf, 0x4f, 0x8f,
+	0x59, 0x98, 0x9b, 0x8f, 0x59, 0xfc, 0xfd, 0xbd, 0x73, 0x44, 0x13, 0xec, 0xb4, 0x89, 0x0f, 0x7f,
+	0x00, 0x1b, 0x02, 0x23, 0xdf, 0xe5, 0x8c, 0xce, 0x8d, 0x1b, 0x8a, 0xd9, 0xbf, 0xc6, 0x8c, 0x38,
+	0xa7, 0x19, 0xb2, 0x9e, 0x16, 0x3f, 0x67, 0x74, 0x0e, 0xbf, 0x05, 0x6b, 0x6a, 0x06, 0x6b, 0x8a,
+	0xb9, 0x7d, 0x8d, 0x99, 0xc4, 0x82, 0xb0, 0x20, 0xa3, 0x54, 0x25, 0xfc, 0x09, 0x6c, 0xfa, 0x58,
+	0x7a, 0x82, 0x44, 0x69, 0x7f, 0xc6, 0xc7, 0x0d, 0x40, 0x1d, 0x80, 0x7f, 0xb5, 0x40, 0xff, 0xda,
+	0x66, 0x1b, 0x37, 0x0f, 0x5a, 0x47, 0xdb, 0xc7, 0x2f, 0xcc, 0x55, 0x17, 0x46, 0xed, 0x99, 0x59,
+	0xac, 0xe0, 0xd3, 0x92, 0x9f, 0x28, 0xfc, 0x21, 0x4b, 0xc2, 0x95, 0x49, 0xa7, 0x17, 0x2e, 0x45,
+	0xe0, 0x29, 0xe8, 0x11, 0x16, 0xe3, 0x40, 0xa8, 0x3d, 0x72, 0x3d, 0xee, 0x63, 0xe3, 0x93, 0x06,
+	0x8d, 0x74, 0x35, 0xea, 0x84, 0xfb, 0x18, 0x3e, 0x05, 0xbb, 0x5a, 0x2f, 0x94, 0xcc, 0xb0, 0x2b,
+	0x23, 0xc4, 0x8c, 0xf5, 0xfa, 0x6d, 0x83, 0x0b, 0x70, 0x4c, 0x66, 0x78, 0x12, 0x21, 0x06, 0x1f,
+	0x82, 0x9e, 0x3a, 0xc6, 0x33, 0x2e, 0x5c, 0x9f, 0xc8, 0x88, 0xa2, 0xb9, 0xb1, 0x51, 0x2f, 0xb5,
+	0x9d, 0x42, 0x8f, 0xb8, 0xf8, 0x25, 0x43, 0xe0, 0x15, 0xb8, 0xb5, 0xb8, 0x0d, 0x15, 0x31, 0xa0,
+	0x96, 0xf9, 0x51, 0xc3, 0x65, 0x9e, 0x90, 0x57, 0xd8, 0x49, 0x35, 0x2a, 0xeb, 0x5b, 0x46, 0x9d,
+	0x1d, 0x59, 0x0c, 0x35, 0xf3, 0x13, 0xd0, 0x2d, 0x7b, 0x90, 0x18, 0x09, 0xef, 0xd2, 0xd8, 0xac,
+	0x6f, 0xa1, 0x93, 0xb7, 0x30, 0x51, 0x04, 0x9c, 0x83, 0xbd, 0xa5, 0x0e, 0x72, 0xa9, 0xad, 0x0f,
+	0xda, 0x00, 0xd4, 0x1b, 0xc8, 0xad, 0xcf, 0xc0, 0x5a, 0xfa, 0x42, 0x30, 0x3a, 0xca, 0xe9, 0x41,
+	0x43, 0xa7, 0x17, 0xf3, 0xa8, 0x6a, 0x92, 0x06, 0x1c, 0xa5, 0x04, 0x13, 0xb0, 0x5d, 0x7d, 0x37,
+	0x1a, 0xdb, 0x4a, 0xfb, 0x59, 0x43, 0xed, 0x93, 0x0c, 0x76, 0x14, 0x5b, 0x31, 0xa9, 0x64, 0x9c,
+	0x8e, 0xa7, 0x3f, 0x42, 0x04, 0x3a, 0x95, 0x8f, 0x81, 0xd1, 0x6d, 0xd4, 0xd1, 0x50, 0x31, 0x9a,
+	0x99, 0x1e, 0x70, 0xb6, 0x90, 0xf6, 0x04, 0xff, 0x6e, 0x01, 0x03, 0x79, 0x1e, 0x4f, 0x58, 0xec,
+	0x6a, 0x6f, 0xe2, 0xec, 0x4a, 0xf7, 0x94, 0xdd, 0xb8, 0x61, 0x93, 0x99, 0xcb, 0x3b, 0xae, 0xb3,
+	0x9e, 0x70, 0xf6, 0x72, 0xb7, 0x72, 0x2b, 0xb3, 0xfb, 0xfc, 0x04, 0xec, 0x60, 0x4a, 0x02, 0x32,
+	0xa5, 0x95, 0xc3, 0xd2, 0xaf, 0x7d, 0x11, 0xf6, 0x0b, 0x6c, 0xb1, 0xff, 0x63, 0xb0, 0x5b, 0xd1,
+	0x2a, 0xae, 0x0e, 0xac, 0x15, 0x83, 0x9a, 0x58, 0x71, 0x1b, 0x30, 0xd8, 0xf1, 0x44, 0xe8, 0x4e,
+	0x91, 0xc4, 0xfe, 0x62, 0x89, 0x8c, 0x1d, 0x25, 0x76, 0x6f, 0xe5, 0xda, 0x64, 0x1f, 0x7f, 0xf3,
+	0x44, 0x84, 0xa3, 0x94, 0x2c, 0xda, 0x7d, 0xcc, 0x66, 0xfc, 0xd7, 0x8f, 0x9c, 0x9e, 0xb7, 0x14,
+	0x87, 0x08, 0xf4, 0x25, 0x09, 0x09, 0x45, 0x42, 0x33, 0xd9, 0x55, 0x26, 0x83, 0x3a, 0x93, 0x49,
+	0x06, 0x2e, 0x79, 0x74, 0x65, 0x35, 0x0c, 0x2f, 0xc1, 0xae, 0x48, 0x28, 0xbe, 0xd6, 0xca, 0x9e,
+	0x72, 0xf9, 0xae, 0xce, 0xc5, 0x49, 0x28, 0x7e, 0x57, 0x2f, 0x7d, 0xb1, 0x9c, 0x48, 0x9b, 0xa1,
+	0x3c, 0x20, 0x1e, 0xa2, 0x9a, 0xcd, 0xad, 0x66, 0xcd, 0x8c, 0x33, 0x70, 0xb9, 0x19, 0x5a, 0x0d,
+	0xc3, 0x3f, 0x40, 0x77, 0x8a, 0x24, 0xf1, 0x34, 0x83, 0x4f, 0x95, 0xc1, 0xdd, 0x3a, 0x83, 0x51,
+	0x8a, 0x2d, 0xc9, 0x77, 0xa6, 0x7a, 0xd0, 0x76, 0xde, 0x0e, 0x9f, 0x83, 0xc3, 0x05, 0x9c, 0x8f,
+	0x22, 0x22, 0x53, 0x11, 0xab, 0x9c, 0xc4, 0xd7, 0x5e, 0x22, 0x63, 0x1e, 0x62, 0x21, 0xad, 0xab,
+	0x62, 0xf8, 0x5a, 0xfd, 0x97, 0xa4, 0x69, 0x69, 0x5d, 0x95, 0x93, 0x7b, 0x3d, 0xda, 0x04, 0x1b,
+	0xe5, 0xd3, 0xe8, 0xbf, 0x16, 0xb8, 0xe3, 0xf1, 0xd0, 0xac, 0xfd, 0xbb, 0x1c, 0x75, 0x0a, 0xb3,
+	0xb3, 0xf4, 0xb8, 0x9e, 0xb5, 0x7e, 0x7f, 0x92, 0x33, 0x01, 0xa7, 0x88, 0x05, 0x26, 0x17, 0x81,
+	0x15, 0x60, 0xa6, 0x0e, 0xb3, 0xb5, 0x98, 0xe7, 0x7b, 0xfe, 0x71, 0xef, 0x97, 0xa3, 0x7f, 0xda,
+	0x37, 0x4e, 0x87, 0xc3, 0x7f, 0xdb, 0x87, 0xa7, 0x99, 0xe4, 0xd0, 0x97, 0x66, 0x36, 0x4c, 0x47,
+	0xe7, 0x03, 0xd3, 0x29, 0x2a, 0xdf, 0x14, 0x35, 0x17, 0x43, 0x5f, 0x5e, 0x94, 0x35, 0x17, 0xe7,
+	0x83, 0x8b, 0xb2, 0xe6, 0x6d, 0xfb, 0x4e, 0x96, 0xb0, 0xed, 0xa1, 0x2f, 0x6d, 0xbb, 0xac, 0xb2,
+	0xed, 0xf3, 0x81, 0x6d, 0x97, 0x75, 0xd3, 0x9b, 0x6a, 0xb2, 0x83, 0xff, 0x03, 0x00, 0x00, 0xff,
+	0xff, 0x60, 0x1d, 0x81, 0x7b, 0x8f, 0x0b, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/user_location_view.pb.go b/googleapis/ads/googleads/v3/resources/user_location_view.pb.go
new file mode 100644
index 0000000..4d02f48
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/user_location_view.pb.go
@@ -0,0 +1,129 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/user_location_view.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A user location view.
+//
+// User Location View includes all metrics aggregated at the country level,
+// one row per country. It reports metrics at the actual physical location of
+// the user by targeted or not targeted location. If other segment fields are
+// used, you may get more than one row per country.
+type UserLocationView struct {
+	// The resource name of the user location view.
+	// UserLocation view resource names have the form:
+	//
+	// `customers/{customer_id}/userLocationViews/{country_criterion_id}~{targeting_location}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Criterion Id for the country.
+	CountryCriterionId *wrappers.Int64Value `protobuf:"bytes,2,opt,name=country_criterion_id,json=countryCriterionId,proto3" json:"country_criterion_id,omitempty"`
+	// Indicates whether location was targeted or not.
+	TargetingLocation    *wrappers.BoolValue `protobuf:"bytes,3,opt,name=targeting_location,json=targetingLocation,proto3" json:"targeting_location,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *UserLocationView) Reset()         { *m = UserLocationView{} }
+func (m *UserLocationView) String() string { return proto.CompactTextString(m) }
+func (*UserLocationView) ProtoMessage()    {}
+func (*UserLocationView) Descriptor() ([]byte, []int) {
+	return fileDescriptor_010a04e760a368f3, []int{0}
+}
+
+func (m *UserLocationView) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserLocationView.Unmarshal(m, b)
+}
+func (m *UserLocationView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserLocationView.Marshal(b, m, deterministic)
+}
+func (m *UserLocationView) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserLocationView.Merge(m, src)
+}
+func (m *UserLocationView) XXX_Size() int {
+	return xxx_messageInfo_UserLocationView.Size(m)
+}
+func (m *UserLocationView) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserLocationView.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserLocationView proto.InternalMessageInfo
+
+func (m *UserLocationView) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *UserLocationView) GetCountryCriterionId() *wrappers.Int64Value {
+	if m != nil {
+		return m.CountryCriterionId
+	}
+	return nil
+}
+
+func (m *UserLocationView) GetTargetingLocation() *wrappers.BoolValue {
+	if m != nil {
+		return m.TargetingLocation
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*UserLocationView)(nil), "google.ads.googleads.v3.resources.UserLocationView")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/user_location_view.proto", fileDescriptor_010a04e760a368f3)
+}
+
+var fileDescriptor_010a04e760a368f3 = []byte{
+	// 416 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xd1, 0x8a, 0xd4, 0x30,
+	0x14, 0xa5, 0x5d, 0x10, 0xac, 0x0a, 0x5a, 0x14, 0xc6, 0x51, 0x64, 0x57, 0x59, 0x58, 0x5f, 0x12,
+	0xb0, 0xe2, 0x43, 0xf6, 0xa9, 0xe3, 0xc3, 0x32, 0xa2, 0xb2, 0x0c, 0xd8, 0x07, 0x29, 0x94, 0x4c,
+	0x1b, 0x63, 0xb0, 0xcd, 0x2d, 0x49, 0x3a, 0x83, 0x0c, 0xf3, 0xe2, 0xa7, 0xf8, 0xe8, 0x47, 0xf8,
+	0x01, 0x7e, 0xca, 0x7c, 0x85, 0xb4, 0x4d, 0x32, 0x83, 0x03, 0xee, 0xdb, 0x69, 0xef, 0x39, 0xe7,
+	0xde, 0x73, 0x6f, 0x22, 0xc2, 0x01, 0x78, 0xcd, 0x30, 0xad, 0x34, 0x1e, 0x61, 0x8f, 0x56, 0x09,
+	0x56, 0x4c, 0x43, 0xa7, 0x4a, 0xa6, 0x71, 0xa7, 0x99, 0x2a, 0x6a, 0x28, 0xa9, 0x11, 0x20, 0x8b,
+	0x95, 0x60, 0x6b, 0xd4, 0x2a, 0x30, 0x10, 0x9f, 0x8d, 0x02, 0x44, 0x2b, 0x8d, 0xbc, 0x16, 0xad,
+	0x12, 0xe4, 0xb5, 0xd3, 0xc7, 0xce, 0xbe, 0x15, 0xde, 0x71, 0x54, 0x4f, 0x9f, 0xd9, 0xd2, 0xf0,
+	0xb5, 0xec, 0xbe, 0xe0, 0xb5, 0xa2, 0x6d, 0xcb, 0x94, 0xb6, 0xf5, 0xa7, 0x07, 0x52, 0x2a, 0x25,
+	0x98, 0xa1, 0xbf, 0xad, 0x3e, 0xff, 0x1d, 0x46, 0xf7, 0x3f, 0x69, 0xa6, 0xde, 0xdb, 0xb9, 0x32,
+	0xc1, 0xd6, 0xf1, 0x8b, 0xe8, 0x9e, 0x6b, 0x52, 0x48, 0xda, 0xb0, 0x49, 0x70, 0x1a, 0x5c, 0xdc,
+	0x5e, 0xdc, 0x75, 0x3f, 0x3f, 0xd2, 0x86, 0xc5, 0x1f, 0xa2, 0x87, 0x25, 0x74, 0xd2, 0xa8, 0xef,
+	0x45, 0xa9, 0x84, 0x61, 0xaa, 0x4f, 0x25, 0xaa, 0x49, 0x78, 0x1a, 0x5c, 0xdc, 0x79, 0xf5, 0xc4,
+	0x26, 0x41, 0x6e, 0x2c, 0x34, 0x97, 0xe6, 0xcd, 0xeb, 0x8c, 0xd6, 0x1d, 0x5b, 0xc4, 0x56, 0xf8,
+	0xd6, 0xe9, 0xe6, 0x55, 0x3c, 0x8f, 0x62, 0x43, 0x15, 0x67, 0x46, 0x48, 0xee, 0xb7, 0x34, 0x39,
+	0x19, 0xcc, 0xa6, 0x47, 0x66, 0x33, 0x80, 0x7a, 0xf4, 0x7a, 0xe0, 0x55, 0x2e, 0x02, 0xf9, 0xb6,
+	0x4b, 0xbf, 0x46, 0x2f, 0xf7, 0x9b, 0xb4, 0xa8, 0x15, 0x1a, 0x95, 0xd0, 0xe0, 0xa3, 0xb8, 0x97,
+	0x65, 0xa7, 0x0d, 0x34, 0x4c, 0x69, 0xbc, 0x71, 0x70, 0x3b, 0x9c, 0xeb, 0x90, 0xa6, 0xf1, 0xe6,
+	0xf8, 0x82, 0xdb, 0xd9, 0x8f, 0x30, 0x3a, 0x2f, 0xa1, 0x41, 0x37, 0xde, 0x70, 0xf6, 0xe8, 0xdf,
+	0xc6, 0xd7, 0x7d, 0x9a, 0xeb, 0xe0, 0xf3, 0x3b, 0xab, 0xe5, 0x50, 0x53, 0xc9, 0x11, 0x28, 0x8e,
+	0x39, 0x93, 0x43, 0x56, 0xbc, 0x9f, 0xfd, 0x3f, 0x4f, 0xeb, 0xd2, 0xa3, 0x9f, 0xe1, 0xc9, 0x55,
+	0x9a, 0xfe, 0x0a, 0xcf, 0xae, 0x46, 0xcb, 0xb4, 0xd2, 0x68, 0x84, 0x3d, 0xca, 0x12, 0xb4, 0x70,
+	0xcc, 0x3f, 0x8e, 0x93, 0xa7, 0x95, 0xce, 0x3d, 0x27, 0xcf, 0x92, 0xdc, 0x73, 0x76, 0xe1, 0xf9,
+	0x58, 0x20, 0x24, 0xad, 0x34, 0x21, 0x9e, 0x45, 0x48, 0x96, 0x10, 0xe2, 0x79, 0xcb, 0x5b, 0xc3,
+	0xb0, 0xc9, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x30, 0xab, 0xb2, 0x8a, 0x06, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/resources/video.pb.go b/googleapis/ads/googleads/v3/resources/video.pb.go
new file mode 100644
index 0000000..2901779
--- /dev/null
+++ b/googleapis/ads/googleads/v3/resources/video.pb.go
@@ -0,0 +1,142 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/resources/video.proto
+
+package resources
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A video.
+type Video struct {
+	// The resource name of the video.
+	// Video resource names have the form:
+	//
+	// `customers/{customer_id}/videos/{video_id}`
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// The ID of the video.
+	Id *wrappers.StringValue `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The owner channel id of the video.
+	ChannelId *wrappers.StringValue `protobuf:"bytes,3,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// The duration of the video in milliseconds.
+	DurationMillis *wrappers.Int64Value `protobuf:"bytes,4,opt,name=duration_millis,json=durationMillis,proto3" json:"duration_millis,omitempty"`
+	// The title of the video.
+	Title                *wrappers.StringValue `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *Video) Reset()         { *m = Video{} }
+func (m *Video) String() string { return proto.CompactTextString(m) }
+func (*Video) ProtoMessage()    {}
+func (*Video) Descriptor() ([]byte, []int) {
+	return fileDescriptor_19115eaa759c1b28, []int{0}
+}
+
+func (m *Video) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Video.Unmarshal(m, b)
+}
+func (m *Video) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Video.Marshal(b, m, deterministic)
+}
+func (m *Video) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Video.Merge(m, src)
+}
+func (m *Video) XXX_Size() int {
+	return xxx_messageInfo_Video.Size(m)
+}
+func (m *Video) XXX_DiscardUnknown() {
+	xxx_messageInfo_Video.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Video proto.InternalMessageInfo
+
+func (m *Video) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *Video) GetId() *wrappers.StringValue {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *Video) GetChannelId() *wrappers.StringValue {
+	if m != nil {
+		return m.ChannelId
+	}
+	return nil
+}
+
+func (m *Video) GetDurationMillis() *wrappers.Int64Value {
+	if m != nil {
+		return m.DurationMillis
+	}
+	return nil
+}
+
+func (m *Video) GetTitle() *wrappers.StringValue {
+	if m != nil {
+		return m.Title
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Video)(nil), "google.ads.googleads.v3.resources.Video")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/resources/video.proto", fileDescriptor_19115eaa759c1b28)
+}
+
+var fileDescriptor_19115eaa759c1b28 = []byte{
+	// 415 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x4d, 0x6b, 0xd4, 0x40,
+	0x1c, 0xc6, 0x49, 0xea, 0x0a, 0x1d, 0xdf, 0x20, 0xa7, 0x58, 0x4b, 0x69, 0x95, 0x42, 0x0f, 0x3a,
+	0x03, 0x8d, 0x78, 0x98, 0x9e, 0x52, 0x94, 0x5a, 0x41, 0x29, 0x2b, 0xe4, 0x20, 0x81, 0x65, 0x9a,
+	0x19, 0xe3, 0x40, 0x32, 0x13, 0x66, 0x26, 0xeb, 0x61, 0xd9, 0x2f, 0xe3, 0xd1, 0x8f, 0xe2, 0x57,
+	0xf0, 0x1b, 0xec, 0x17, 0xf0, 0x2a, 0x99, 0xb7, 0x15, 0x04, 0xdd, 0x53, 0x9e, 0xe4, 0xff, 0x7b,
+	0x9e, 0x79, 0xc8, 0x7f, 0xc0, 0x8b, 0x56, 0xca, 0xb6, 0x63, 0x88, 0x50, 0x8d, 0x9c, 0x9c, 0xd4,
+	0xb2, 0x40, 0x8a, 0x69, 0x39, 0xaa, 0x86, 0x69, 0xb4, 0xe4, 0x94, 0x49, 0x38, 0x28, 0x69, 0x64,
+	0x76, 0xe2, 0x18, 0x48, 0xa8, 0x86, 0x11, 0x87, 0xcb, 0x02, 0x46, 0xfc, 0xe0, 0x71, 0x48, 0x1c,
+	0x78, 0x0c, 0x71, 0xee, 0x83, 0x23, 0x3f, 0xb2, 0x6f, 0xb7, 0xe3, 0x67, 0xf4, 0x55, 0x91, 0x61,
+	0x60, 0x4a, 0xfb, 0xf9, 0xe1, 0x1f, 0x56, 0x22, 0x84, 0x34, 0xc4, 0x70, 0x29, 0xfc, 0xf4, 0xe9,
+	0xcf, 0x14, 0xcc, 0xaa, 0xa9, 0x4b, 0xf6, 0x0c, 0x3c, 0x08, 0xc9, 0x0b, 0x41, 0x7a, 0x96, 0x27,
+	0xc7, 0xc9, 0xd9, 0xfe, 0xfc, 0x7e, 0xf8, 0xf8, 0x81, 0xf4, 0x2c, 0x7b, 0x0e, 0x52, 0x4e, 0xf3,
+	0xf4, 0x38, 0x39, 0xbb, 0x77, 0x7e, 0xe8, 0xcb, 0xc2, 0x70, 0x32, 0xfc, 0x68, 0x14, 0x17, 0x6d,
+	0x45, 0xba, 0x91, 0xcd, 0x53, 0x4e, 0xb3, 0x0b, 0x00, 0x9a, 0x2f, 0x44, 0x08, 0xd6, 0x2d, 0x38,
+	0xcd, 0xf7, 0x76, 0x70, 0xed, 0x7b, 0xfe, 0x9a, 0x66, 0xaf, 0xc1, 0x23, 0x3a, 0x2a, 0x5b, 0x76,
+	0xd1, 0xf3, 0xae, 0xe3, 0x3a, 0xbf, 0x63, 0x13, 0x9e, 0xfc, 0x95, 0x70, 0x2d, 0xcc, 0xab, 0x97,
+	0x2e, 0xe0, 0x61, 0xf0, 0xbc, 0xb7, 0x96, 0xec, 0x1c, 0xcc, 0x0c, 0x37, 0x1d, 0xcb, 0x67, 0x3b,
+	0x9c, 0xee, 0x50, 0xfc, 0x76, 0x53, 0xbe, 0x01, 0x47, 0xdb, 0x4d, 0x78, 0x35, 0x70, 0x0d, 0x1b,
+	0xd9, 0x23, 0xff, 0xbb, 0x9a, 0x51, 0x1b, 0xd9, 0x33, 0xa5, 0xd1, 0x2a, 0xc8, 0xb5, 0x5b, 0xab,
+	0x46, 0x2b, 0xfb, 0x5c, 0x5f, 0xfe, 0x4a, 0xc0, 0x69, 0x23, 0x7b, 0xf8, 0xdf, 0x05, 0x5f, 0x02,
+	0x9b, 0x7a, 0x33, 0xb5, 0xba, 0x49, 0x3e, 0xbd, 0xf3, 0x86, 0x56, 0x76, 0x44, 0xb4, 0x50, 0xaa,
+	0x16, 0xb5, 0x4c, 0xd8, 0xce, 0x68, 0xdb, 0xe6, 0x1f, 0xf7, 0xeb, 0x22, 0xaa, 0x6f, 0xe9, 0xde,
+	0x55, 0x59, 0x7e, 0x4f, 0x4f, 0xae, 0x5c, 0x64, 0x49, 0x35, 0x74, 0x72, 0x52, 0x55, 0x01, 0xe7,
+	0x81, 0xfc, 0x11, 0x98, 0xba, 0xa4, 0xba, 0x8e, 0x4c, 0x5d, 0x15, 0x75, 0x64, 0x36, 0xe9, 0xa9,
+	0x1b, 0x60, 0x5c, 0x52, 0x8d, 0x71, 0xa4, 0x30, 0xae, 0x0a, 0x8c, 0x23, 0x77, 0x7b, 0xd7, 0x96,
+	0x2d, 0x7e, 0x07, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x6c, 0x2c, 0x86, 0x0b, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/ads/googleads/v3/services/account_budget_proposal_service.pb.go b/googleapis/ads/googleads/v3/services/account_budget_proposal_service.pb.go
new file mode 100644
index 0000000..43d64ad
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/account_budget_proposal_service.pb.go
@@ -0,0 +1,494 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/account_budget_proposal_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [AccountBudgetProposalService.GetAccountBudgetProposal][google.ads.googleads.v3.services.AccountBudgetProposalService.GetAccountBudgetProposal].
+type GetAccountBudgetProposalRequest struct {
+	// Required. The resource name of the account-level budget proposal to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAccountBudgetProposalRequest) Reset()         { *m = GetAccountBudgetProposalRequest{} }
+func (m *GetAccountBudgetProposalRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAccountBudgetProposalRequest) ProtoMessage()    {}
+func (*GetAccountBudgetProposalRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9ca78c4fca96fbd7, []int{0}
+}
+
+func (m *GetAccountBudgetProposalRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAccountBudgetProposalRequest.Unmarshal(m, b)
+}
+func (m *GetAccountBudgetProposalRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAccountBudgetProposalRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAccountBudgetProposalRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAccountBudgetProposalRequest.Merge(m, src)
+}
+func (m *GetAccountBudgetProposalRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAccountBudgetProposalRequest.Size(m)
+}
+func (m *GetAccountBudgetProposalRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAccountBudgetProposalRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAccountBudgetProposalRequest proto.InternalMessageInfo
+
+func (m *GetAccountBudgetProposalRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for
+// [AccountBudgetProposalService.MutateAccountBudgetProposal][google.ads.googleads.v3.services.AccountBudgetProposalService.MutateAccountBudgetProposal].
+type MutateAccountBudgetProposalRequest struct {
+	// Required. The ID of the customer.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The operation to perform on an individual account-level budget proposal.
+	Operation *AccountBudgetProposalOperation `protobuf:"bytes,2,opt,name=operation,proto3" json:"operation,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,3,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAccountBudgetProposalRequest) Reset()         { *m = MutateAccountBudgetProposalRequest{} }
+func (m *MutateAccountBudgetProposalRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAccountBudgetProposalRequest) ProtoMessage()    {}
+func (*MutateAccountBudgetProposalRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9ca78c4fca96fbd7, []int{1}
+}
+
+func (m *MutateAccountBudgetProposalRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAccountBudgetProposalRequest.Unmarshal(m, b)
+}
+func (m *MutateAccountBudgetProposalRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAccountBudgetProposalRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAccountBudgetProposalRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAccountBudgetProposalRequest.Merge(m, src)
+}
+func (m *MutateAccountBudgetProposalRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAccountBudgetProposalRequest.Size(m)
+}
+func (m *MutateAccountBudgetProposalRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAccountBudgetProposalRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAccountBudgetProposalRequest proto.InternalMessageInfo
+
+func (m *MutateAccountBudgetProposalRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAccountBudgetProposalRequest) GetOperation() *AccountBudgetProposalOperation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *MutateAccountBudgetProposalRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation to propose the creation of a new account-level budget or
+// edit/end/remove an existing one.
+type AccountBudgetProposalOperation struct {
+	// FieldMask that determines which budget fields are modified.  While budgets
+	// may be modified, proposals that propose such modifications are final.
+	// Therefore, update operations are not supported for proposals.
+	//
+	// Proposals that modify budgets have the 'update' proposal type.  Specifying
+	// a mask for any other proposal type is considered an error.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AccountBudgetProposalOperation_Create
+	//	*AccountBudgetProposalOperation_Remove
+	Operation            isAccountBudgetProposalOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
+	XXX_unrecognized     []byte                                     `json:"-"`
+	XXX_sizecache        int32                                      `json:"-"`
+}
+
+func (m *AccountBudgetProposalOperation) Reset()         { *m = AccountBudgetProposalOperation{} }
+func (m *AccountBudgetProposalOperation) String() string { return proto.CompactTextString(m) }
+func (*AccountBudgetProposalOperation) ProtoMessage()    {}
+func (*AccountBudgetProposalOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9ca78c4fca96fbd7, []int{2}
+}
+
+func (m *AccountBudgetProposalOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AccountBudgetProposalOperation.Unmarshal(m, b)
+}
+func (m *AccountBudgetProposalOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AccountBudgetProposalOperation.Marshal(b, m, deterministic)
+}
+func (m *AccountBudgetProposalOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AccountBudgetProposalOperation.Merge(m, src)
+}
+func (m *AccountBudgetProposalOperation) XXX_Size() int {
+	return xxx_messageInfo_AccountBudgetProposalOperation.Size(m)
+}
+func (m *AccountBudgetProposalOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AccountBudgetProposalOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccountBudgetProposalOperation proto.InternalMessageInfo
+
+func (m *AccountBudgetProposalOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isAccountBudgetProposalOperation_Operation interface {
+	isAccountBudgetProposalOperation_Operation()
+}
+
+type AccountBudgetProposalOperation_Create struct {
+	Create *resources.AccountBudgetProposal `protobuf:"bytes,2,opt,name=create,proto3,oneof"`
+}
+
+type AccountBudgetProposalOperation_Remove struct {
+	Remove string `protobuf:"bytes,1,opt,name=remove,proto3,oneof"`
+}
+
+func (*AccountBudgetProposalOperation_Create) isAccountBudgetProposalOperation_Operation() {}
+
+func (*AccountBudgetProposalOperation_Remove) isAccountBudgetProposalOperation_Operation() {}
+
+func (m *AccountBudgetProposalOperation) GetOperation() isAccountBudgetProposalOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposalOperation) GetCreate() *resources.AccountBudgetProposal {
+	if x, ok := m.GetOperation().(*AccountBudgetProposalOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AccountBudgetProposalOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AccountBudgetProposalOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AccountBudgetProposalOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AccountBudgetProposalOperation_Create)(nil),
+		(*AccountBudgetProposalOperation_Remove)(nil),
+	}
+}
+
+// Response message for account-level budget mutate operations.
+type MutateAccountBudgetProposalResponse struct {
+	// The result of the mutate.
+	Result               *MutateAccountBudgetProposalResult `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *MutateAccountBudgetProposalResponse) Reset()         { *m = MutateAccountBudgetProposalResponse{} }
+func (m *MutateAccountBudgetProposalResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAccountBudgetProposalResponse) ProtoMessage()    {}
+func (*MutateAccountBudgetProposalResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9ca78c4fca96fbd7, []int{3}
+}
+
+func (m *MutateAccountBudgetProposalResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAccountBudgetProposalResponse.Unmarshal(m, b)
+}
+func (m *MutateAccountBudgetProposalResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAccountBudgetProposalResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAccountBudgetProposalResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAccountBudgetProposalResponse.Merge(m, src)
+}
+func (m *MutateAccountBudgetProposalResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAccountBudgetProposalResponse.Size(m)
+}
+func (m *MutateAccountBudgetProposalResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAccountBudgetProposalResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAccountBudgetProposalResponse proto.InternalMessageInfo
+
+func (m *MutateAccountBudgetProposalResponse) GetResult() *MutateAccountBudgetProposalResult {
+	if m != nil {
+		return m.Result
+	}
+	return nil
+}
+
+// The result for the account budget proposal mutate.
+type MutateAccountBudgetProposalResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAccountBudgetProposalResult) Reset()         { *m = MutateAccountBudgetProposalResult{} }
+func (m *MutateAccountBudgetProposalResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAccountBudgetProposalResult) ProtoMessage()    {}
+func (*MutateAccountBudgetProposalResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9ca78c4fca96fbd7, []int{4}
+}
+
+func (m *MutateAccountBudgetProposalResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAccountBudgetProposalResult.Unmarshal(m, b)
+}
+func (m *MutateAccountBudgetProposalResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAccountBudgetProposalResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAccountBudgetProposalResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAccountBudgetProposalResult.Merge(m, src)
+}
+func (m *MutateAccountBudgetProposalResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAccountBudgetProposalResult.Size(m)
+}
+func (m *MutateAccountBudgetProposalResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAccountBudgetProposalResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAccountBudgetProposalResult proto.InternalMessageInfo
+
+func (m *MutateAccountBudgetProposalResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAccountBudgetProposalRequest)(nil), "google.ads.googleads.v3.services.GetAccountBudgetProposalRequest")
+	proto.RegisterType((*MutateAccountBudgetProposalRequest)(nil), "google.ads.googleads.v3.services.MutateAccountBudgetProposalRequest")
+	proto.RegisterType((*AccountBudgetProposalOperation)(nil), "google.ads.googleads.v3.services.AccountBudgetProposalOperation")
+	proto.RegisterType((*MutateAccountBudgetProposalResponse)(nil), "google.ads.googleads.v3.services.MutateAccountBudgetProposalResponse")
+	proto.RegisterType((*MutateAccountBudgetProposalResult)(nil), "google.ads.googleads.v3.services.MutateAccountBudgetProposalResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/account_budget_proposal_service.proto", fileDescriptor_9ca78c4fca96fbd7)
+}
+
+var fileDescriptor_9ca78c4fca96fbd7 = []byte{
+	// 690 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0x4f, 0x6b, 0xd4, 0x4e,
+	0x18, 0xc7, 0x7f, 0x49, 0x7f, 0x14, 0x3b, 0xdb, 0x5e, 0x06, 0xc4, 0x65, 0x5b, 0xec, 0x36, 0xed,
+	0x61, 0x59, 0x24, 0x81, 0xee, 0xa5, 0xa4, 0x14, 0x9b, 0x55, 0xdb, 0x8a, 0xd4, 0x2e, 0x11, 0x7a,
+	0xd0, 0xc5, 0x30, 0x9b, 0x4c, 0x63, 0x68, 0x92, 0x89, 0x99, 0xc9, 0x42, 0x29, 0xbd, 0xf4, 0x24,
+	0x5e, 0x7d, 0x07, 0x1e, 0x3d, 0xfb, 0x2a, 0x7a, 0xd5, 0x83, 0xf4, 0xe4, 0xc1, 0x8b, 0xbe, 0x0a,
+	0x49, 0x66, 0x66, 0xff, 0xc0, 0x6e, 0x02, 0xf6, 0xf6, 0x64, 0x9e, 0xef, 0x7e, 0x9e, 0xbf, 0x33,
+	0x0b, 0x0e, 0x7c, 0x42, 0xfc, 0x10, 0x1b, 0xc8, 0xa3, 0x06, 0x37, 0x73, 0x6b, 0xd8, 0x31, 0x28,
+	0x4e, 0x87, 0x81, 0x8b, 0xa9, 0x81, 0x5c, 0x97, 0x64, 0x31, 0x73, 0x06, 0x99, 0xe7, 0x63, 0xe6,
+	0x24, 0x29, 0x49, 0x08, 0x45, 0xa1, 0x23, 0x04, 0x7a, 0x92, 0x12, 0x46, 0x60, 0x93, 0xff, 0x58,
+	0x47, 0x1e, 0xd5, 0x47, 0x1c, 0x7d, 0xd8, 0xd1, 0x25, 0xa7, 0xf1, 0x78, 0x5e, 0xa4, 0x14, 0x53,
+	0x92, 0xa5, 0x25, 0xa1, 0x78, 0x88, 0xc6, 0x9a, 0x04, 0x24, 0x81, 0x81, 0xe2, 0x98, 0x30, 0xc4,
+	0x02, 0x12, 0x53, 0xe1, 0x7d, 0x30, 0xe1, 0x75, 0xc3, 0x00, 0xc7, 0x4c, 0x38, 0xd6, 0x27, 0x1c,
+	0x67, 0x01, 0x0e, 0x3d, 0x67, 0x80, 0xdf, 0xa1, 0x61, 0x40, 0x52, 0x21, 0x10, 0xa9, 0x1b, 0xc5,
+	0xd7, 0x20, 0x3b, 0x13, 0xaa, 0x08, 0xd1, 0x73, 0xae, 0xd0, 0x5e, 0x80, 0xf5, 0x43, 0xcc, 0x2c,
+	0x9e, 0x5d, 0xb7, 0x48, 0xae, 0x27, 0x72, 0xb3, 0xf1, 0xfb, 0x0c, 0x53, 0x06, 0x5b, 0x60, 0x45,
+	0xd6, 0xe1, 0xc4, 0x28, 0xc2, 0x75, 0xa5, 0xa9, 0xb4, 0x96, 0xba, 0x0b, 0x3f, 0x2d, 0xd5, 0x5e,
+	0x96, 0x9e, 0x97, 0x28, 0xc2, 0xda, 0x77, 0x05, 0x68, 0xc7, 0x19, 0x43, 0x0c, 0x97, 0x02, 0xb7,
+	0x40, 0xcd, 0xcd, 0x28, 0x23, 0x11, 0x4e, 0x9d, 0xc0, 0x9b, 0xc4, 0x01, 0x79, 0xfe, 0xdc, 0x83,
+	0x2e, 0x58, 0x22, 0x09, 0x4e, 0x8b, 0x4e, 0xd4, 0xd5, 0xa6, 0xd2, 0xaa, 0x6d, 0xef, 0xeb, 0x55,
+	0xa3, 0xd0, 0x67, 0x06, 0x3e, 0x91, 0x1c, 0x1e, 0x65, 0xcc, 0x85, 0x9b, 0x60, 0x65, 0x88, 0xc2,
+	0xc0, 0x43, 0x0c, 0x3b, 0x24, 0x0e, 0x2f, 0xea, 0x0b, 0x4d, 0xa5, 0x75, 0xcf, 0x5e, 0x96, 0x87,
+	0x27, 0x71, 0x78, 0xa1, 0xfd, 0x50, 0xc0, 0xc3, 0x72, 0x2e, 0xdc, 0x05, 0xb5, 0x2c, 0x29, 0x28,
+	0x79, 0x6f, 0x0b, 0x4a, 0x6d, 0xbb, 0x21, 0xd3, 0x95, 0xed, 0xd7, 0x0f, 0xf2, 0xf6, 0x1f, 0x23,
+	0x7a, 0x6e, 0x03, 0x2e, 0xcf, 0x6d, 0x68, 0x83, 0x45, 0x37, 0xc5, 0x88, 0x61, 0x51, 0xe6, 0xce,
+	0xdc, 0x32, 0x47, 0xfb, 0x34, 0xbb, 0xce, 0xa3, 0xff, 0x6c, 0x41, 0x82, 0x75, 0xb0, 0x98, 0xe2,
+	0x88, 0x0c, 0xc5, 0xb4, 0x72, 0x0f, 0xff, 0xee, 0xd6, 0x26, 0xfa, 0xaa, 0x5d, 0x2b, 0x60, 0xb3,
+	0x74, 0x62, 0x34, 0x21, 0x31, 0xc5, 0xf0, 0x4d, 0x8e, 0xa3, 0x59, 0xc8, 0x44, 0x8a, 0x4f, 0xaa,
+	0x27, 0x51, 0x8e, 0xcd, 0x42, 0x66, 0x0b, 0xa4, 0x76, 0x04, 0x36, 0x2a, 0xc5, 0xf9, 0xa4, 0x66,
+	0x6c, 0xe1, 0xf4, 0x02, 0x6e, 0x7f, 0xfd, 0x1f, 0xac, 0xcd, 0x84, 0xbc, 0xe2, 0x59, 0xc1, 0xdf,
+	0x0a, 0xa8, 0xcf, 0xdb, 0x77, 0x68, 0x55, 0x17, 0x55, 0x71, 0x57, 0x1a, 0xff, 0x3c, 0x3a, 0xad,
+	0x77, 0x6b, 0x4d, 0x17, 0x78, 0xfd, 0xed, 0xd7, 0x27, 0xd5, 0x84, 0x3b, 0xf9, 0x3b, 0x72, 0x39,
+	0xe5, 0xd9, 0x93, 0xb7, 0x84, 0x1a, 0x6d, 0xf9, 0xb0, 0x4c, 0xd3, 0xa8, 0xd1, 0xbe, 0x82, 0x1f,
+	0x55, 0xb0, 0x5a, 0xd2, 0x57, 0xf8, 0xf4, 0x8e, 0x33, 0xe4, 0x15, 0x3f, 0xbb, 0xeb, 0x26, 0x14,
+	0x0b, 0xa6, 0xbd, 0xbd, 0xb5, 0xee, 0x4f, 0x3c, 0x0a, 0x8f, 0x46, 0x2b, 0x5a, 0xb4, 0x61, 0x5f,
+	0xdb, 0xcd, 0xdb, 0x30, 0xae, 0xfb, 0x72, 0x42, 0xbb, 0xd7, 0xbe, 0x9a, 0xd3, 0x05, 0x33, 0x2a,
+	0x22, 0x9b, 0x4a, 0xbb, 0xb1, 0x7a, 0x63, 0xd5, 0xc7, 0xd9, 0x09, 0x2b, 0x09, 0xa8, 0xee, 0x92,
+	0xa8, 0xfb, 0x41, 0x05, 0x5b, 0x2e, 0x89, 0x2a, 0x2b, 0xe9, 0x6e, 0x94, 0x2d, 0x57, 0x2f, 0xbf,
+	0xe5, 0x3d, 0xe5, 0xf5, 0x91, 0xc0, 0xf8, 0x24, 0x44, 0xb1, 0xaf, 0x93, 0xd4, 0x37, 0x7c, 0x1c,
+	0x17, 0x6f, 0x80, 0x31, 0x0e, 0x3c, 0xff, 0x6f, 0x69, 0x57, 0x1a, 0x9f, 0xd5, 0x85, 0x43, 0xcb,
+	0xfa, 0xa2, 0x36, 0x0f, 0x39, 0xd0, 0xf2, 0xa8, 0xce, 0xcd, 0xdc, 0x3a, 0xed, 0xe8, 0x22, 0x30,
+	0xbd, 0x91, 0x92, 0xbe, 0xe5, 0xd1, 0xfe, 0x48, 0xd2, 0x3f, 0xed, 0xf4, 0xa5, 0xe4, 0x8f, 0xba,
+	0xc5, 0xcf, 0x4d, 0xd3, 0xf2, 0xa8, 0x69, 0x8e, 0x44, 0xa6, 0x79, 0xda, 0x31, 0x4d, 0x29, 0x1b,
+	0x2c, 0x16, 0x79, 0x76, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0x2a, 0x4d, 0x10, 0x0c, 0x3d, 0x07,
+	0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AccountBudgetProposalServiceClient is the client API for AccountBudgetProposalService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AccountBudgetProposalServiceClient interface {
+	// Returns an account-level budget proposal in full detail.
+	GetAccountBudgetProposal(ctx context.Context, in *GetAccountBudgetProposalRequest, opts ...grpc.CallOption) (*resources.AccountBudgetProposal, error)
+	// Creates, updates, or removes account budget proposals.  Operation statuses
+	// are returned.
+	MutateAccountBudgetProposal(ctx context.Context, in *MutateAccountBudgetProposalRequest, opts ...grpc.CallOption) (*MutateAccountBudgetProposalResponse, error)
+}
+
+type accountBudgetProposalServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAccountBudgetProposalServiceClient(cc grpc.ClientConnInterface) AccountBudgetProposalServiceClient {
+	return &accountBudgetProposalServiceClient{cc}
+}
+
+func (c *accountBudgetProposalServiceClient) GetAccountBudgetProposal(ctx context.Context, in *GetAccountBudgetProposalRequest, opts ...grpc.CallOption) (*resources.AccountBudgetProposal, error) {
+	out := new(resources.AccountBudgetProposal)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AccountBudgetProposalService/GetAccountBudgetProposal", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *accountBudgetProposalServiceClient) MutateAccountBudgetProposal(ctx context.Context, in *MutateAccountBudgetProposalRequest, opts ...grpc.CallOption) (*MutateAccountBudgetProposalResponse, error) {
+	out := new(MutateAccountBudgetProposalResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AccountBudgetProposalService/MutateAccountBudgetProposal", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AccountBudgetProposalServiceServer is the server API for AccountBudgetProposalService service.
+type AccountBudgetProposalServiceServer interface {
+	// Returns an account-level budget proposal in full detail.
+	GetAccountBudgetProposal(context.Context, *GetAccountBudgetProposalRequest) (*resources.AccountBudgetProposal, error)
+	// Creates, updates, or removes account budget proposals.  Operation statuses
+	// are returned.
+	MutateAccountBudgetProposal(context.Context, *MutateAccountBudgetProposalRequest) (*MutateAccountBudgetProposalResponse, error)
+}
+
+// UnimplementedAccountBudgetProposalServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAccountBudgetProposalServiceServer struct {
+}
+
+func (*UnimplementedAccountBudgetProposalServiceServer) GetAccountBudgetProposal(ctx context.Context, req *GetAccountBudgetProposalRequest) (*resources.AccountBudgetProposal, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAccountBudgetProposal not implemented")
+}
+func (*UnimplementedAccountBudgetProposalServiceServer) MutateAccountBudgetProposal(ctx context.Context, req *MutateAccountBudgetProposalRequest) (*MutateAccountBudgetProposalResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateAccountBudgetProposal not implemented")
+}
+
+func RegisterAccountBudgetProposalServiceServer(s *grpc.Server, srv AccountBudgetProposalServiceServer) {
+	s.RegisterService(&_AccountBudgetProposalService_serviceDesc, srv)
+}
+
+func _AccountBudgetProposalService_GetAccountBudgetProposal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAccountBudgetProposalRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AccountBudgetProposalServiceServer).GetAccountBudgetProposal(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AccountBudgetProposalService/GetAccountBudgetProposal",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AccountBudgetProposalServiceServer).GetAccountBudgetProposal(ctx, req.(*GetAccountBudgetProposalRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AccountBudgetProposalService_MutateAccountBudgetProposal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAccountBudgetProposalRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AccountBudgetProposalServiceServer).MutateAccountBudgetProposal(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AccountBudgetProposalService/MutateAccountBudgetProposal",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AccountBudgetProposalServiceServer).MutateAccountBudgetProposal(ctx, req.(*MutateAccountBudgetProposalRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AccountBudgetProposalService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AccountBudgetProposalService",
+	HandlerType: (*AccountBudgetProposalServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAccountBudgetProposal",
+			Handler:    _AccountBudgetProposalService_GetAccountBudgetProposal_Handler,
+		},
+		{
+			MethodName: "MutateAccountBudgetProposal",
+			Handler:    _AccountBudgetProposalService_MutateAccountBudgetProposal_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/account_budget_proposal_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/account_budget_service.pb.go b/googleapis/ads/googleads/v3/services/account_budget_service.pb.go
new file mode 100644
index 0000000..95665b8
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/account_budget_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/account_budget_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [AccountBudgetService.GetAccountBudget][google.ads.googleads.v3.services.AccountBudgetService.GetAccountBudget].
+type GetAccountBudgetRequest struct {
+	// Required. The resource name of the account-level budget to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAccountBudgetRequest) Reset()         { *m = GetAccountBudgetRequest{} }
+func (m *GetAccountBudgetRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAccountBudgetRequest) ProtoMessage()    {}
+func (*GetAccountBudgetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2e805d79057ca99f, []int{0}
+}
+
+func (m *GetAccountBudgetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAccountBudgetRequest.Unmarshal(m, b)
+}
+func (m *GetAccountBudgetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAccountBudgetRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAccountBudgetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAccountBudgetRequest.Merge(m, src)
+}
+func (m *GetAccountBudgetRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAccountBudgetRequest.Size(m)
+}
+func (m *GetAccountBudgetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAccountBudgetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAccountBudgetRequest proto.InternalMessageInfo
+
+func (m *GetAccountBudgetRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAccountBudgetRequest)(nil), "google.ads.googleads.v3.services.GetAccountBudgetRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/account_budget_service.proto", fileDescriptor_2e805d79057ca99f)
+}
+
+var fileDescriptor_2e805d79057ca99f = []byte{
+	// 410 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcd, 0x8a, 0xd3, 0x40,
+	0x1c, 0x27, 0x29, 0x08, 0x06, 0x05, 0x09, 0x42, 0x6b, 0x14, 0x2c, 0xa5, 0x87, 0xd2, 0xc3, 0x4c,
+	0x69, 0x40, 0x70, 0xa4, 0x87, 0x89, 0x87, 0xf6, 0x24, 0xa5, 0x42, 0x0f, 0x12, 0x08, 0xd3, 0x64,
+	0x8c, 0x81, 0x64, 0xa6, 0x66, 0x26, 0xb9, 0x88, 0x20, 0xbe, 0x82, 0x6f, 0xe0, 0xd1, 0x37, 0xb1,
+	0x57, 0x6f, 0x9e, 0x3c, 0x78, 0xda, 0x97, 0xd8, 0x25, 0x9d, 0x4c, 0xda, 0xec, 0x6e, 0xe8, 0xed,
+	0xc7, 0xfc, 0x7f, 0x1f, 0xff, 0x8f, 0xb1, 0x16, 0x31, 0xe7, 0x71, 0x4a, 0x21, 0x89, 0x04, 0x54,
+	0xb0, 0x42, 0xa5, 0x0b, 0x05, 0xcd, 0xcb, 0x24, 0xa4, 0x02, 0x92, 0x30, 0xe4, 0x05, 0x93, 0xc1,
+	0xae, 0x88, 0x62, 0x2a, 0x83, 0xfa, 0x1d, 0xec, 0x73, 0x2e, 0xb9, 0x3d, 0x54, 0x1a, 0x40, 0x22,
+	0x01, 0x1a, 0x39, 0x28, 0x5d, 0xa0, 0xe5, 0xce, 0xab, 0xae, 0x80, 0x9c, 0x0a, 0x5e, 0xe4, 0x77,
+	0x13, 0x94, 0xb3, 0xf3, 0x42, 0xeb, 0xf6, 0x09, 0x24, 0x8c, 0x71, 0x49, 0x64, 0xc2, 0x99, 0xa8,
+	0xab, 0xfd, 0xb3, 0x6a, 0x98, 0x26, 0x94, 0x69, 0xd9, 0xcb, 0xb3, 0xc2, 0xc7, 0x84, 0xa6, 0x51,
+	0xb0, 0xa3, 0x9f, 0x48, 0x99, 0xf0, 0x5c, 0x11, 0x46, 0x6f, 0xad, 0xfe, 0x92, 0x4a, 0xac, 0x22,
+	0xbd, 0x63, 0xe2, 0x86, 0x7e, 0x2e, 0xa8, 0x90, 0xf6, 0xc4, 0x7a, 0xac, 0x9b, 0x0a, 0x18, 0xc9,
+	0xe8, 0xc0, 0x18, 0x1a, 0x93, 0x87, 0x5e, 0xef, 0x1f, 0x36, 0x37, 0x8f, 0x74, 0xe5, 0x1d, 0xc9,
+	0xe8, 0xfc, 0xda, 0xb0, 0x9e, 0xb6, 0x2c, 0xde, 0xab, 0x71, 0xed, 0xdf, 0x86, 0xf5, 0xe4, 0xb6,
+	0xbd, 0xfd, 0x1a, 0x5c, 0xda, 0x12, 0xe8, 0x68, 0xc9, 0x99, 0x75, 0x4a, 0x9b, 0xf5, 0x81, 0x96,
+	0x70, 0xb4, 0xfa, 0x8b, 0xdb, 0x53, 0x7c, 0xff, 0xf3, 0xff, 0x87, 0x39, 0xb7, 0x67, 0xd5, 0xce,
+	0xbf, 0xb4, 0x2a, 0x8b, 0xb0, 0x10, 0x92, 0x67, 0x34, 0x17, 0x70, 0xaa, 0x8f, 0xa0, 0x5c, 0x04,
+	0x9c, 0x7e, 0x75, 0x9e, 0x1f, 0xf0, 0xe0, 0x14, 0x59, 0xa3, 0x7d, 0x22, 0x40, 0xc8, 0x33, 0xef,
+	0x9b, 0x69, 0x8d, 0x43, 0x9e, 0x5d, 0x9c, 0xcc, 0x7b, 0x76, 0xdf, 0x9e, 0xd6, 0xd5, 0x29, 0xd6,
+	0xc6, 0x87, 0x55, 0x2d, 0x8f, 0x79, 0x4a, 0x58, 0x0c, 0x78, 0x1e, 0xc3, 0x98, 0xb2, 0xe3, 0xa1,
+	0xe0, 0x29, 0xb0, 0xfb, 0x73, 0xbe, 0xd1, 0xe0, 0xa7, 0xd9, 0x5b, 0x62, 0xfc, 0xcb, 0x1c, 0x2e,
+	0x95, 0x21, 0x8e, 0x04, 0x50, 0xb0, 0x42, 0x5b, 0x17, 0xd4, 0xc1, 0xe2, 0xa0, 0x29, 0x3e, 0x8e,
+	0x84, 0xdf, 0x50, 0xfc, 0xad, 0xeb, 0x6b, 0xca, 0x95, 0x39, 0x56, 0xef, 0x08, 0xe1, 0x48, 0x20,
+	0xd4, 0x90, 0x10, 0xda, 0xba, 0x08, 0x69, 0xda, 0xee, 0xc1, 0xb1, 0x4f, 0xf7, 0x26, 0x00, 0x00,
+	0xff, 0xff, 0x7f, 0xaf, 0x6d, 0xc8, 0x43, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AccountBudgetServiceClient is the client API for AccountBudgetService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AccountBudgetServiceClient interface {
+	// Returns an account-level budget in full detail.
+	GetAccountBudget(ctx context.Context, in *GetAccountBudgetRequest, opts ...grpc.CallOption) (*resources.AccountBudget, error)
+}
+
+type accountBudgetServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAccountBudgetServiceClient(cc grpc.ClientConnInterface) AccountBudgetServiceClient {
+	return &accountBudgetServiceClient{cc}
+}
+
+func (c *accountBudgetServiceClient) GetAccountBudget(ctx context.Context, in *GetAccountBudgetRequest, opts ...grpc.CallOption) (*resources.AccountBudget, error) {
+	out := new(resources.AccountBudget)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AccountBudgetService/GetAccountBudget", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AccountBudgetServiceServer is the server API for AccountBudgetService service.
+type AccountBudgetServiceServer interface {
+	// Returns an account-level budget in full detail.
+	GetAccountBudget(context.Context, *GetAccountBudgetRequest) (*resources.AccountBudget, error)
+}
+
+// UnimplementedAccountBudgetServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAccountBudgetServiceServer struct {
+}
+
+func (*UnimplementedAccountBudgetServiceServer) GetAccountBudget(ctx context.Context, req *GetAccountBudgetRequest) (*resources.AccountBudget, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAccountBudget not implemented")
+}
+
+func RegisterAccountBudgetServiceServer(s *grpc.Server, srv AccountBudgetServiceServer) {
+	s.RegisterService(&_AccountBudgetService_serviceDesc, srv)
+}
+
+func _AccountBudgetService_GetAccountBudget_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAccountBudgetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AccountBudgetServiceServer).GetAccountBudget(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AccountBudgetService/GetAccountBudget",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AccountBudgetServiceServer).GetAccountBudget(ctx, req.(*GetAccountBudgetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AccountBudgetService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AccountBudgetService",
+	HandlerType: (*AccountBudgetServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAccountBudget",
+			Handler:    _AccountBudgetService_GetAccountBudget_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/account_budget_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_ad_asset_view_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_ad_asset_view_service.pb.go
new file mode 100644
index 0000000..822963a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_ad_asset_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_ad_asset_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupAdAssetViewService.GetAdGroupAdAssetView][google.ads.googleads.v3.services.AdGroupAdAssetViewService.GetAdGroupAdAssetView].
+type GetAdGroupAdAssetViewRequest struct {
+	// Required. The resource name of the ad group ad asset view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupAdAssetViewRequest) Reset()         { *m = GetAdGroupAdAssetViewRequest{} }
+func (m *GetAdGroupAdAssetViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupAdAssetViewRequest) ProtoMessage()    {}
+func (*GetAdGroupAdAssetViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6809cbe9c3c4b2f3, []int{0}
+}
+
+func (m *GetAdGroupAdAssetViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupAdAssetViewRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupAdAssetViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupAdAssetViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupAdAssetViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupAdAssetViewRequest.Merge(m, src)
+}
+func (m *GetAdGroupAdAssetViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupAdAssetViewRequest.Size(m)
+}
+func (m *GetAdGroupAdAssetViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupAdAssetViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupAdAssetViewRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupAdAssetViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupAdAssetViewRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupAdAssetViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_ad_asset_view_service.proto", fileDescriptor_6809cbe9c3c4b2f3)
+}
+
+var fileDescriptor_6809cbe9c3c4b2f3 = []byte{
+	// 425 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x6a, 0xd5, 0x40,
+	0x14, 0xe5, 0xa5, 0x20, 0x18, 0x74, 0x13, 0x10, 0xeb, 0xb3, 0xe8, 0xa3, 0x74, 0x51, 0xba, 0x98,
+	0x01, 0x43, 0x11, 0x46, 0x2c, 0xcc, 0x03, 0x79, 0xdd, 0x28, 0xa5, 0x42, 0x16, 0x12, 0x08, 0xd3,
+	0xcc, 0x35, 0x0e, 0x24, 0x99, 0x38, 0x77, 0x92, 0x2e, 0xc4, 0x8d, 0xe0, 0x17, 0xb8, 0x71, 0xed,
+	0xd2, 0x4f, 0xe9, 0xd6, 0x9d, 0x20, 0xb8, 0x70, 0xe5, 0x57, 0x48, 0x3a, 0x99, 0xb4, 0xe5, 0x99,
+	0x76, 0x77, 0xc8, 0x39, 0xf7, 0x9c, 0x3b, 0xe7, 0x26, 0x7c, 0x51, 0x68, 0x5d, 0x94, 0x40, 0x85,
+	0x44, 0xea, 0x60, 0x8f, 0xba, 0x98, 0x22, 0x98, 0x4e, 0xe5, 0x80, 0x54, 0xc8, 0xac, 0x30, 0xba,
+	0x6d, 0x32, 0x21, 0x33, 0x81, 0x08, 0x36, 0xeb, 0x14, 0x9c, 0x66, 0x03, 0x4f, 0x1a, 0xa3, 0xad,
+	0x8e, 0x16, 0x6e, 0x96, 0x08, 0x89, 0x64, 0xb4, 0x21, 0x5d, 0x4c, 0xbc, 0xcd, 0xfc, 0x60, 0x2a,
+	0xc8, 0x00, 0xea, 0xd6, 0x4c, 0x27, 0xb9, 0x84, 0xf9, 0x96, 0x9f, 0x6f, 0x14, 0x15, 0x75, 0xad,
+	0xad, 0xb0, 0x4a, 0xd7, 0x38, 0xb0, 0xf7, 0x2f, 0xb1, 0x79, 0xa9, 0xa0, 0xb6, 0x03, 0xf1, 0xf8,
+	0x12, 0xf1, 0x56, 0x41, 0x29, 0xb3, 0x13, 0x78, 0x27, 0x3a, 0xa5, 0x8d, 0x13, 0x6c, 0x1f, 0x86,
+	0x5b, 0x2b, 0xb0, 0x5c, 0xae, 0xfa, 0x64, 0x2e, 0x79, 0x9f, 0x9b, 0x28, 0x38, 0x3d, 0x86, 0xf7,
+	0x2d, 0xa0, 0x8d, 0x76, 0xc3, 0xbb, 0x7e, 0xc3, 0xac, 0x16, 0x15, 0x6c, 0xce, 0x16, 0xb3, 0xdd,
+	0xdb, 0xcb, 0x8d, 0xdf, 0x3c, 0x38, 0xbe, 0xe3, 0x99, 0x57, 0xa2, 0x82, 0x27, 0x5f, 0x83, 0xf0,
+	0xc1, 0xba, 0xcf, 0x6b, 0x57, 0x40, 0xf4, 0x6b, 0x16, 0xde, 0xfb, 0x6f, 0x50, 0x74, 0x40, 0x6e,
+	0x2a, 0x8f, 0x5c, 0xb7, 0xe1, 0x7c, 0x7f, 0x72, 0x7e, 0xac, 0x96, 0xac, 0x4f, 0x6f, 0xbf, 0xfc,
+	0xc9, 0xaf, 0xbe, 0xec, 0xd3, 0x8f, 0x3f, 0x5f, 0x82, 0xa7, 0xd1, 0x7e, 0x7f, 0x94, 0x0f, 0x57,
+	0x98, 0xe7, 0x79, 0x8b, 0x56, 0x57, 0x60, 0x90, 0xee, 0x51, 0xb1, 0x66, 0x85, 0x74, 0xef, 0xe3,
+	0xfc, 0xe1, 0x19, 0xdf, 0xbc, 0x08, 0x1f, 0x50, 0xa3, 0x90, 0xe4, 0xba, 0x5a, 0x7e, 0x0e, 0xc2,
+	0x9d, 0x5c, 0x57, 0x37, 0x3e, 0x74, 0xf9, 0x68, 0xb2, 0xc0, 0xa3, 0xfe, 0x5a, 0x47, 0xb3, 0x37,
+	0x87, 0x83, 0x47, 0xa1, 0x4b, 0x51, 0x17, 0x44, 0x9b, 0x82, 0x16, 0x50, 0x9f, 0xdf, 0x92, 0x5e,
+	0xa4, 0x4e, 0xff, 0xcf, 0xcf, 0x3c, 0xf8, 0x16, 0x6c, 0xac, 0x38, 0xff, 0x1e, 0x2c, 0x56, 0xce,
+	0x90, 0x4b, 0x24, 0x0e, 0xf6, 0x28, 0x89, 0xc9, 0x10, 0x8c, 0x67, 0x5e, 0x92, 0x72, 0x89, 0xe9,
+	0x28, 0x49, 0x93, 0x38, 0xf5, 0x92, 0xbf, 0xc1, 0x8e, 0xfb, 0xce, 0x18, 0x97, 0xc8, 0xd8, 0x28,
+	0x62, 0x2c, 0x89, 0x19, 0xf3, 0xb2, 0x93, 0x5b, 0xe7, 0x7b, 0xc6, 0xff, 0x02, 0x00, 0x00, 0xff,
+	0xff, 0xa9, 0x66, 0x45, 0x48, 0x76, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupAdAssetViewServiceClient is the client API for AdGroupAdAssetViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupAdAssetViewServiceClient interface {
+	// Returns the requested ad group ad asset view in full detail.
+	GetAdGroupAdAssetView(ctx context.Context, in *GetAdGroupAdAssetViewRequest, opts ...grpc.CallOption) (*resources.AdGroupAdAssetView, error)
+}
+
+type adGroupAdAssetViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupAdAssetViewServiceClient(cc grpc.ClientConnInterface) AdGroupAdAssetViewServiceClient {
+	return &adGroupAdAssetViewServiceClient{cc}
+}
+
+func (c *adGroupAdAssetViewServiceClient) GetAdGroupAdAssetView(ctx context.Context, in *GetAdGroupAdAssetViewRequest, opts ...grpc.CallOption) (*resources.AdGroupAdAssetView, error) {
+	out := new(resources.AdGroupAdAssetView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupAdAssetViewService/GetAdGroupAdAssetView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupAdAssetViewServiceServer is the server API for AdGroupAdAssetViewService service.
+type AdGroupAdAssetViewServiceServer interface {
+	// Returns the requested ad group ad asset view in full detail.
+	GetAdGroupAdAssetView(context.Context, *GetAdGroupAdAssetViewRequest) (*resources.AdGroupAdAssetView, error)
+}
+
+// UnimplementedAdGroupAdAssetViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupAdAssetViewServiceServer struct {
+}
+
+func (*UnimplementedAdGroupAdAssetViewServiceServer) GetAdGroupAdAssetView(ctx context.Context, req *GetAdGroupAdAssetViewRequest) (*resources.AdGroupAdAssetView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAdGroupAdAssetView not implemented")
+}
+
+func RegisterAdGroupAdAssetViewServiceServer(s *grpc.Server, srv AdGroupAdAssetViewServiceServer) {
+	s.RegisterService(&_AdGroupAdAssetViewService_serviceDesc, srv)
+}
+
+func _AdGroupAdAssetViewService_GetAdGroupAdAssetView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupAdAssetViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupAdAssetViewServiceServer).GetAdGroupAdAssetView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupAdAssetViewService/GetAdGroupAdAssetView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupAdAssetViewServiceServer).GetAdGroupAdAssetView(ctx, req.(*GetAdGroupAdAssetViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupAdAssetViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupAdAssetViewService",
+	HandlerType: (*AdGroupAdAssetViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupAdAssetView",
+			Handler:    _AdGroupAdAssetViewService_GetAdGroupAdAssetView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_ad_asset_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_ad_label_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_ad_label_service.pb.go
new file mode 100644
index 0000000..ae93531
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_ad_label_service.pb.go
@@ -0,0 +1,502 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_ad_label_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupAdLabelService.GetAdGroupAdLabel][google.ads.googleads.v3.services.AdGroupAdLabelService.GetAdGroupAdLabel].
+type GetAdGroupAdLabelRequest struct {
+	// Required. The resource name of the ad group ad label to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupAdLabelRequest) Reset()         { *m = GetAdGroupAdLabelRequest{} }
+func (m *GetAdGroupAdLabelRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupAdLabelRequest) ProtoMessage()    {}
+func (*GetAdGroupAdLabelRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3e6c97fd3f05d422, []int{0}
+}
+
+func (m *GetAdGroupAdLabelRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupAdLabelRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupAdLabelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupAdLabelRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupAdLabelRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupAdLabelRequest.Merge(m, src)
+}
+func (m *GetAdGroupAdLabelRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupAdLabelRequest.Size(m)
+}
+func (m *GetAdGroupAdLabelRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupAdLabelRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupAdLabelRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupAdLabelRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AdGroupAdLabelService.MutateAdGroupAdLabels][google.ads.googleads.v3.services.AdGroupAdLabelService.MutateAdGroupAdLabels].
+type MutateAdGroupAdLabelsRequest struct {
+	// Required. ID of the customer whose ad group ad labels are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on ad group ad labels.
+	Operations []*AdGroupAdLabelOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupAdLabelsRequest) Reset()         { *m = MutateAdGroupAdLabelsRequest{} }
+func (m *MutateAdGroupAdLabelsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupAdLabelsRequest) ProtoMessage()    {}
+func (*MutateAdGroupAdLabelsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3e6c97fd3f05d422, []int{1}
+}
+
+func (m *MutateAdGroupAdLabelsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupAdLabelsRequest.Unmarshal(m, b)
+}
+func (m *MutateAdGroupAdLabelsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupAdLabelsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupAdLabelsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupAdLabelsRequest.Merge(m, src)
+}
+func (m *MutateAdGroupAdLabelsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupAdLabelsRequest.Size(m)
+}
+func (m *MutateAdGroupAdLabelsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupAdLabelsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupAdLabelsRequest proto.InternalMessageInfo
+
+func (m *MutateAdGroupAdLabelsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdGroupAdLabelsRequest) GetOperations() []*AdGroupAdLabelOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdGroupAdLabelsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdGroupAdLabelsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove) on an ad group ad label.
+type AdGroupAdLabelOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdGroupAdLabelOperation_Create
+	//	*AdGroupAdLabelOperation_Remove
+	Operation            isAdGroupAdLabelOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
+	XXX_unrecognized     []byte                              `json:"-"`
+	XXX_sizecache        int32                               `json:"-"`
+}
+
+func (m *AdGroupAdLabelOperation) Reset()         { *m = AdGroupAdLabelOperation{} }
+func (m *AdGroupAdLabelOperation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAdLabelOperation) ProtoMessage()    {}
+func (*AdGroupAdLabelOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3e6c97fd3f05d422, []int{2}
+}
+
+func (m *AdGroupAdLabelOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAdLabelOperation.Unmarshal(m, b)
+}
+func (m *AdGroupAdLabelOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAdLabelOperation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAdLabelOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAdLabelOperation.Merge(m, src)
+}
+func (m *AdGroupAdLabelOperation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAdLabelOperation.Size(m)
+}
+func (m *AdGroupAdLabelOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAdLabelOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAdLabelOperation proto.InternalMessageInfo
+
+type isAdGroupAdLabelOperation_Operation interface {
+	isAdGroupAdLabelOperation_Operation()
+}
+
+type AdGroupAdLabelOperation_Create struct {
+	Create *resources.AdGroupAdLabel `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdGroupAdLabelOperation_Remove struct {
+	Remove string `protobuf:"bytes,2,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdGroupAdLabelOperation_Create) isAdGroupAdLabelOperation_Operation() {}
+
+func (*AdGroupAdLabelOperation_Remove) isAdGroupAdLabelOperation_Operation() {}
+
+func (m *AdGroupAdLabelOperation) GetOperation() isAdGroupAdLabelOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdGroupAdLabelOperation) GetCreate() *resources.AdGroupAdLabel {
+	if x, ok := m.GetOperation().(*AdGroupAdLabelOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdGroupAdLabelOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdGroupAdLabelOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupAdLabelOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupAdLabelOperation_Create)(nil),
+		(*AdGroupAdLabelOperation_Remove)(nil),
+	}
+}
+
+// Response message for an ad group ad labels mutate.
+type MutateAdGroupAdLabelsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdGroupAdLabelResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *MutateAdGroupAdLabelsResponse) Reset()         { *m = MutateAdGroupAdLabelsResponse{} }
+func (m *MutateAdGroupAdLabelsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupAdLabelsResponse) ProtoMessage()    {}
+func (*MutateAdGroupAdLabelsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3e6c97fd3f05d422, []int{3}
+}
+
+func (m *MutateAdGroupAdLabelsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupAdLabelsResponse.Unmarshal(m, b)
+}
+func (m *MutateAdGroupAdLabelsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupAdLabelsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupAdLabelsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupAdLabelsResponse.Merge(m, src)
+}
+func (m *MutateAdGroupAdLabelsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupAdLabelsResponse.Size(m)
+}
+func (m *MutateAdGroupAdLabelsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupAdLabelsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupAdLabelsResponse proto.InternalMessageInfo
+
+func (m *MutateAdGroupAdLabelsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdGroupAdLabelsResponse) GetResults() []*MutateAdGroupAdLabelResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for an ad group ad label mutate.
+type MutateAdGroupAdLabelResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupAdLabelResult) Reset()         { *m = MutateAdGroupAdLabelResult{} }
+func (m *MutateAdGroupAdLabelResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupAdLabelResult) ProtoMessage()    {}
+func (*MutateAdGroupAdLabelResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3e6c97fd3f05d422, []int{4}
+}
+
+func (m *MutateAdGroupAdLabelResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupAdLabelResult.Unmarshal(m, b)
+}
+func (m *MutateAdGroupAdLabelResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupAdLabelResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupAdLabelResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupAdLabelResult.Merge(m, src)
+}
+func (m *MutateAdGroupAdLabelResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupAdLabelResult.Size(m)
+}
+func (m *MutateAdGroupAdLabelResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupAdLabelResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupAdLabelResult proto.InternalMessageInfo
+
+func (m *MutateAdGroupAdLabelResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupAdLabelRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupAdLabelRequest")
+	proto.RegisterType((*MutateAdGroupAdLabelsRequest)(nil), "google.ads.googleads.v3.services.MutateAdGroupAdLabelsRequest")
+	proto.RegisterType((*AdGroupAdLabelOperation)(nil), "google.ads.googleads.v3.services.AdGroupAdLabelOperation")
+	proto.RegisterType((*MutateAdGroupAdLabelsResponse)(nil), "google.ads.googleads.v3.services.MutateAdGroupAdLabelsResponse")
+	proto.RegisterType((*MutateAdGroupAdLabelResult)(nil), "google.ads.googleads.v3.services.MutateAdGroupAdLabelResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_ad_label_service.proto", fileDescriptor_3e6c97fd3f05d422)
+}
+
+var fileDescriptor_3e6c97fd3f05d422 = []byte{
+	// 715 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xbd, 0x6f, 0xd3, 0x40,
+	0x14, 0xc7, 0x0e, 0x2a, 0xf4, 0xd2, 0x82, 0x38, 0x54, 0x6a, 0x85, 0x22, 0x22, 0x53, 0x89, 0x28,
+	0x42, 0xb6, 0x9a, 0xb0, 0xd4, 0x50, 0xc0, 0x11, 0x34, 0xad, 0xf8, 0x68, 0x95, 0x4a, 0x11, 0x42,
+	0x11, 0xd6, 0xd5, 0xbe, 0x06, 0x4b, 0xb6, 0xcf, 0xdc, 0x9d, 0x23, 0x55, 0x55, 0x07, 0xd8, 0x99,
+	0xf8, 0x0f, 0x18, 0xf9, 0x27, 0xd8, 0x2b, 0x31, 0xb1, 0x75, 0x62, 0x60, 0x62, 0xec, 0xc6, 0x86,
+	0xfc, 0x71, 0x49, 0x1c, 0x62, 0x45, 0x74, 0x7b, 0xb9, 0xf7, 0xde, 0xef, 0xfd, 0x7e, 0xef, 0xc3,
+	0x01, 0x4f, 0xfa, 0x84, 0xf4, 0x3d, 0xac, 0x23, 0x87, 0xe9, 0xa9, 0x19, 0x5b, 0x83, 0xa6, 0xce,
+	0x30, 0x1d, 0xb8, 0x36, 0x66, 0x3a, 0x72, 0xac, 0x3e, 0x25, 0x51, 0x68, 0x21, 0xc7, 0xf2, 0xd0,
+	0x3e, 0xf6, 0xac, 0xcc, 0xa5, 0x85, 0x94, 0x70, 0x02, 0xab, 0x69, 0x9a, 0x86, 0x1c, 0xa6, 0x0d,
+	0x11, 0xb4, 0x41, 0x53, 0x13, 0x08, 0x95, 0xf5, 0xa2, 0x1a, 0x14, 0x33, 0x12, 0xd1, 0xa9, 0x45,
+	0x52, 0xf0, 0xca, 0x8a, 0x48, 0x0d, 0x5d, 0x1d, 0x05, 0x01, 0xe1, 0x88, 0xbb, 0x24, 0x60, 0x99,
+	0x77, 0x79, 0xcc, 0x6b, 0x7b, 0x2e, 0x0e, 0x78, 0xe6, 0xb8, 0x3d, 0xe6, 0x38, 0x70, 0xb1, 0xe7,
+	0x58, 0xfb, 0xf8, 0x1d, 0x1a, 0xb8, 0x84, 0x4e, 0x64, 0xd2, 0xd0, 0xd6, 0x19, 0x47, 0x3c, 0xca,
+	0x20, 0xd5, 0xa7, 0x40, 0x69, 0x63, 0x6e, 0x3a, 0xed, 0x98, 0x8d, 0xe9, 0xbc, 0x88, 0xb9, 0x74,
+	0xf0, 0xfb, 0x08, 0x33, 0x0e, 0x6b, 0x60, 0x51, 0x30, 0xb6, 0x02, 0xe4, 0x63, 0x45, 0xaa, 0x4a,
+	0xb5, 0xf9, 0x56, 0xe9, 0xa7, 0x29, 0x77, 0x16, 0x84, 0xe7, 0x15, 0xf2, 0xb1, 0x7a, 0x26, 0x81,
+	0x95, 0x97, 0x11, 0x47, 0x1c, 0xe7, 0x91, 0x98, 0x80, 0x5a, 0x05, 0x65, 0x3b, 0x62, 0x9c, 0xf8,
+	0x98, 0x5a, 0xae, 0x33, 0x0e, 0x04, 0xc4, 0xfb, 0xb6, 0x03, 0xdf, 0x02, 0x40, 0x42, 0x4c, 0x53,
+	0xcd, 0x8a, 0x5c, 0x2d, 0xd5, 0xca, 0x8d, 0x75, 0x6d, 0x56, 0xbf, 0xb5, 0x7c, 0xcd, 0x1d, 0x81,
+	0x90, 0xe1, 0x8f, 0x10, 0xe1, 0x5d, 0x70, 0x35, 0x44, 0x94, 0xbb, 0xc8, 0xb3, 0x0e, 0x90, 0xeb,
+	0x45, 0x14, 0x2b, 0xa5, 0xaa, 0x54, 0xbb, 0xdc, 0xb9, 0x92, 0x3d, 0x6f, 0xa6, 0xaf, 0xf0, 0x0e,
+	0x58, 0x1c, 0x20, 0xcf, 0x75, 0x10, 0xc7, 0x16, 0x09, 0xbc, 0x43, 0xe5, 0x62, 0x12, 0xb6, 0x20,
+	0x1e, 0x77, 0x02, 0xef, 0x50, 0xfd, 0x24, 0x81, 0xe5, 0x82, 0xd2, 0xf0, 0x39, 0x98, 0xb3, 0x29,
+	0x46, 0x3c, 0xed, 0x59, 0xb9, 0xb1, 0x56, 0xa8, 0x62, 0xb8, 0x13, 0x13, 0x32, 0xb6, 0x2e, 0x74,
+	0x32, 0x08, 0xa8, 0x80, 0x39, 0x8a, 0x7d, 0x32, 0xc0, 0x8a, 0x1c, 0xf7, 0x2d, 0xf6, 0xa4, 0xbf,
+	0x5b, 0x65, 0x30, 0x3f, 0x94, 0xa7, 0x7e, 0x93, 0xc0, 0xad, 0x82, 0x21, 0xb0, 0x90, 0x04, 0x0c,
+	0xc3, 0x4d, 0xb0, 0x34, 0xa1, 0xdf, 0xc2, 0x94, 0x12, 0x9a, 0x74, 0xa1, 0xdc, 0x80, 0x82, 0x24,
+	0x0d, 0x6d, 0x6d, 0x2f, 0xd9, 0x92, 0xce, 0xf5, 0x7c, 0x67, 0x9e, 0xc5, 0xe1, 0xb0, 0x0b, 0x2e,
+	0x51, 0xcc, 0x22, 0x8f, 0x8b, 0x21, 0x3d, 0x9c, 0x3d, 0xa4, 0x69, 0xcc, 0x3a, 0x09, 0x48, 0x47,
+	0x80, 0xa9, 0x26, 0xa8, 0x14, 0x87, 0xc5, 0x43, 0x99, 0xb2, 0x8e, 0xf9, 0x4d, 0x6c, 0xfc, 0x29,
+	0x81, 0xa5, 0x7c, 0xf6, 0x5e, 0xca, 0x00, 0x7e, 0x97, 0xc0, 0xb5, 0x7f, 0x56, 0x1d, 0x1a, 0xb3,
+	0x99, 0x17, 0xdd, 0x47, 0xe5, 0xff, 0x87, 0xaa, 0x6e, 0x9f, 0x9a, 0x79, 0x11, 0x1f, 0x7f, 0xfc,
+	0xfa, 0x2c, 0x37, 0xe1, 0x5a, 0xfc, 0x79, 0x38, 0xca, 0x79, 0x36, 0xc4, 0x61, 0x30, 0xbd, 0xae,
+	0xa3, 0xfc, 0x44, 0xf5, 0xfa, 0x31, 0x3c, 0x93, 0xc0, 0xd2, 0xd4, 0x71, 0xc3, 0x47, 0xe7, 0x9b,
+	0x86, 0x38, 0xd6, 0xca, 0xe3, 0x73, 0xe7, 0xa7, 0x7b, 0xa6, 0xbe, 0x3e, 0x35, 0x6f, 0x8c, 0x9d,
+	0xfb, 0xbd, 0xd1, 0x09, 0x26, 0x72, 0xd7, 0xd5, 0xfb, 0xb1, 0xdc, 0x91, 0xbe, 0xa3, 0xb1, 0xe0,
+	0x8d, 0xfa, 0xf1, 0xa4, 0x5a, 0xc3, 0x4f, 0xaa, 0x19, 0x52, 0xbd, 0x72, 0xf3, 0xc4, 0x54, 0x46,
+	0x8c, 0x32, 0x2b, 0x74, 0x99, 0x66, 0x13, 0xbf, 0xf5, 0x41, 0x06, 0xab, 0x36, 0xf1, 0x67, 0xb2,
+	0x6f, 0x55, 0xa6, 0x6e, 0xc8, 0x6e, 0xfc, 0x41, 0xdc, 0x95, 0xde, 0x6c, 0x65, 0xf9, 0x7d, 0xe2,
+	0xa1, 0xa0, 0xaf, 0x11, 0xda, 0xd7, 0xfb, 0x38, 0x48, 0x3e, 0x97, 0xfa, 0xa8, 0x62, 0xf1, 0x3f,
+	0xc8, 0x03, 0x61, 0x7c, 0x91, 0x4b, 0x6d, 0xd3, 0xfc, 0x2a, 0x57, 0xdb, 0x29, 0xa0, 0xe9, 0x30,
+	0x2d, 0x35, 0x63, 0xab, 0xdb, 0xd4, 0xb2, 0xc2, 0xec, 0x44, 0x84, 0xf4, 0x4c, 0x87, 0xf5, 0x86,
+	0x21, 0xbd, 0x6e, 0xb3, 0x27, 0x42, 0x7e, 0xcb, 0xab, 0xe9, 0xbb, 0x61, 0x98, 0x0e, 0x33, 0x8c,
+	0x61, 0x90, 0x61, 0x74, 0x9b, 0x86, 0x21, 0xc2, 0xf6, 0xe7, 0x12, 0x9e, 0xcd, 0xbf, 0x01, 0x00,
+	0x00, 0xff, 0xff, 0xbd, 0x74, 0x69, 0xdf, 0xe8, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupAdLabelServiceClient is the client API for AdGroupAdLabelService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupAdLabelServiceClient interface {
+	// Returns the requested ad group ad label in full detail.
+	GetAdGroupAdLabel(ctx context.Context, in *GetAdGroupAdLabelRequest, opts ...grpc.CallOption) (*resources.AdGroupAdLabel, error)
+	// Creates and removes ad group ad labels.
+	// Operation statuses are returned.
+	MutateAdGroupAdLabels(ctx context.Context, in *MutateAdGroupAdLabelsRequest, opts ...grpc.CallOption) (*MutateAdGroupAdLabelsResponse, error)
+}
+
+type adGroupAdLabelServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupAdLabelServiceClient(cc grpc.ClientConnInterface) AdGroupAdLabelServiceClient {
+	return &adGroupAdLabelServiceClient{cc}
+}
+
+func (c *adGroupAdLabelServiceClient) GetAdGroupAdLabel(ctx context.Context, in *GetAdGroupAdLabelRequest, opts ...grpc.CallOption) (*resources.AdGroupAdLabel, error) {
+	out := new(resources.AdGroupAdLabel)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupAdLabelService/GetAdGroupAdLabel", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adGroupAdLabelServiceClient) MutateAdGroupAdLabels(ctx context.Context, in *MutateAdGroupAdLabelsRequest, opts ...grpc.CallOption) (*MutateAdGroupAdLabelsResponse, error) {
+	out := new(MutateAdGroupAdLabelsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupAdLabelService/MutateAdGroupAdLabels", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupAdLabelServiceServer is the server API for AdGroupAdLabelService service.
+type AdGroupAdLabelServiceServer interface {
+	// Returns the requested ad group ad label in full detail.
+	GetAdGroupAdLabel(context.Context, *GetAdGroupAdLabelRequest) (*resources.AdGroupAdLabel, error)
+	// Creates and removes ad group ad labels.
+	// Operation statuses are returned.
+	MutateAdGroupAdLabels(context.Context, *MutateAdGroupAdLabelsRequest) (*MutateAdGroupAdLabelsResponse, error)
+}
+
+// UnimplementedAdGroupAdLabelServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupAdLabelServiceServer struct {
+}
+
+func (*UnimplementedAdGroupAdLabelServiceServer) GetAdGroupAdLabel(ctx context.Context, req *GetAdGroupAdLabelRequest) (*resources.AdGroupAdLabel, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdGroupAdLabel not implemented")
+}
+func (*UnimplementedAdGroupAdLabelServiceServer) MutateAdGroupAdLabels(ctx context.Context, req *MutateAdGroupAdLabelsRequest) (*MutateAdGroupAdLabelsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdGroupAdLabels not implemented")
+}
+
+func RegisterAdGroupAdLabelServiceServer(s *grpc.Server, srv AdGroupAdLabelServiceServer) {
+	s.RegisterService(&_AdGroupAdLabelService_serviceDesc, srv)
+}
+
+func _AdGroupAdLabelService_GetAdGroupAdLabel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupAdLabelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupAdLabelServiceServer).GetAdGroupAdLabel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupAdLabelService/GetAdGroupAdLabel",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupAdLabelServiceServer).GetAdGroupAdLabel(ctx, req.(*GetAdGroupAdLabelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdGroupAdLabelService_MutateAdGroupAdLabels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdGroupAdLabelsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupAdLabelServiceServer).MutateAdGroupAdLabels(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupAdLabelService/MutateAdGroupAdLabels",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupAdLabelServiceServer).MutateAdGroupAdLabels(ctx, req.(*MutateAdGroupAdLabelsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupAdLabelService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupAdLabelService",
+	HandlerType: (*AdGroupAdLabelServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupAdLabel",
+			Handler:    _AdGroupAdLabelService_GetAdGroupAdLabel_Handler,
+		},
+		{
+			MethodName: "MutateAdGroupAdLabels",
+			Handler:    _AdGroupAdLabelService_MutateAdGroupAdLabels_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_ad_label_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_ad_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_ad_service.pb.go
new file mode 100644
index 0000000..bc4375a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_ad_service.pb.go
@@ -0,0 +1,542 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_ad_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupAdService.GetAdGroupAd][google.ads.googleads.v3.services.AdGroupAdService.GetAdGroupAd].
+type GetAdGroupAdRequest struct {
+	// Required. The resource name of the ad to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupAdRequest) Reset()         { *m = GetAdGroupAdRequest{} }
+func (m *GetAdGroupAdRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupAdRequest) ProtoMessage()    {}
+func (*GetAdGroupAdRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aa65a543bdddcd6, []int{0}
+}
+
+func (m *GetAdGroupAdRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupAdRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupAdRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupAdRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupAdRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupAdRequest.Merge(m, src)
+}
+func (m *GetAdGroupAdRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupAdRequest.Size(m)
+}
+func (m *GetAdGroupAdRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupAdRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupAdRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupAdRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AdGroupAdService.MutateAdGroupAds][google.ads.googleads.v3.services.AdGroupAdService.MutateAdGroupAds].
+type MutateAdGroupAdsRequest struct {
+	// Required. The ID of the customer whose ads are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual ads.
+	Operations []*AdGroupAdOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupAdsRequest) Reset()         { *m = MutateAdGroupAdsRequest{} }
+func (m *MutateAdGroupAdsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupAdsRequest) ProtoMessage()    {}
+func (*MutateAdGroupAdsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aa65a543bdddcd6, []int{1}
+}
+
+func (m *MutateAdGroupAdsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupAdsRequest.Unmarshal(m, b)
+}
+func (m *MutateAdGroupAdsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupAdsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupAdsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupAdsRequest.Merge(m, src)
+}
+func (m *MutateAdGroupAdsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupAdsRequest.Size(m)
+}
+func (m *MutateAdGroupAdsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupAdsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupAdsRequest proto.InternalMessageInfo
+
+func (m *MutateAdGroupAdsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdGroupAdsRequest) GetOperations() []*AdGroupAdOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdGroupAdsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdGroupAdsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on an ad group ad.
+type AdGroupAdOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// Configuration for how policies are validated.
+	PolicyValidationParameter *common.PolicyValidationParameter `protobuf:"bytes,5,opt,name=policy_validation_parameter,json=policyValidationParameter,proto3" json:"policy_validation_parameter,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdGroupAdOperation_Create
+	//	*AdGroupAdOperation_Update
+	//	*AdGroupAdOperation_Remove
+	Operation            isAdGroupAdOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
+	XXX_unrecognized     []byte                         `json:"-"`
+	XXX_sizecache        int32                          `json:"-"`
+}
+
+func (m *AdGroupAdOperation) Reset()         { *m = AdGroupAdOperation{} }
+func (m *AdGroupAdOperation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupAdOperation) ProtoMessage()    {}
+func (*AdGroupAdOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aa65a543bdddcd6, []int{2}
+}
+
+func (m *AdGroupAdOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupAdOperation.Unmarshal(m, b)
+}
+func (m *AdGroupAdOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupAdOperation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupAdOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupAdOperation.Merge(m, src)
+}
+func (m *AdGroupAdOperation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupAdOperation.Size(m)
+}
+func (m *AdGroupAdOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupAdOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupAdOperation proto.InternalMessageInfo
+
+func (m *AdGroupAdOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+func (m *AdGroupAdOperation) GetPolicyValidationParameter() *common.PolicyValidationParameter {
+	if m != nil {
+		return m.PolicyValidationParameter
+	}
+	return nil
+}
+
+type isAdGroupAdOperation_Operation interface {
+	isAdGroupAdOperation_Operation()
+}
+
+type AdGroupAdOperation_Create struct {
+	Create *resources.AdGroupAd `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdGroupAdOperation_Update struct {
+	Update *resources.AdGroupAd `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type AdGroupAdOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdGroupAdOperation_Create) isAdGroupAdOperation_Operation() {}
+
+func (*AdGroupAdOperation_Update) isAdGroupAdOperation_Operation() {}
+
+func (*AdGroupAdOperation_Remove) isAdGroupAdOperation_Operation() {}
+
+func (m *AdGroupAdOperation) GetOperation() isAdGroupAdOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdGroupAdOperation) GetCreate() *resources.AdGroupAd {
+	if x, ok := m.GetOperation().(*AdGroupAdOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdGroupAdOperation) GetUpdate() *resources.AdGroupAd {
+	if x, ok := m.GetOperation().(*AdGroupAdOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *AdGroupAdOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdGroupAdOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupAdOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupAdOperation_Create)(nil),
+		(*AdGroupAdOperation_Update)(nil),
+		(*AdGroupAdOperation_Remove)(nil),
+	}
+}
+
+// Response message for an ad group ad mutate.
+type MutateAdGroupAdsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdGroupAdResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *MutateAdGroupAdsResponse) Reset()         { *m = MutateAdGroupAdsResponse{} }
+func (m *MutateAdGroupAdsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupAdsResponse) ProtoMessage()    {}
+func (*MutateAdGroupAdsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aa65a543bdddcd6, []int{3}
+}
+
+func (m *MutateAdGroupAdsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupAdsResponse.Unmarshal(m, b)
+}
+func (m *MutateAdGroupAdsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupAdsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupAdsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupAdsResponse.Merge(m, src)
+}
+func (m *MutateAdGroupAdsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupAdsResponse.Size(m)
+}
+func (m *MutateAdGroupAdsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupAdsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupAdsResponse proto.InternalMessageInfo
+
+func (m *MutateAdGroupAdsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdGroupAdsResponse) GetResults() []*MutateAdGroupAdResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the ad mutate.
+type MutateAdGroupAdResult struct {
+	// The resource name returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupAdResult) Reset()         { *m = MutateAdGroupAdResult{} }
+func (m *MutateAdGroupAdResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupAdResult) ProtoMessage()    {}
+func (*MutateAdGroupAdResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aa65a543bdddcd6, []int{4}
+}
+
+func (m *MutateAdGroupAdResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupAdResult.Unmarshal(m, b)
+}
+func (m *MutateAdGroupAdResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupAdResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupAdResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupAdResult.Merge(m, src)
+}
+func (m *MutateAdGroupAdResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupAdResult.Size(m)
+}
+func (m *MutateAdGroupAdResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupAdResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupAdResult proto.InternalMessageInfo
+
+func (m *MutateAdGroupAdResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupAdRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupAdRequest")
+	proto.RegisterType((*MutateAdGroupAdsRequest)(nil), "google.ads.googleads.v3.services.MutateAdGroupAdsRequest")
+	proto.RegisterType((*AdGroupAdOperation)(nil), "google.ads.googleads.v3.services.AdGroupAdOperation")
+	proto.RegisterType((*MutateAdGroupAdsResponse)(nil), "google.ads.googleads.v3.services.MutateAdGroupAdsResponse")
+	proto.RegisterType((*MutateAdGroupAdResult)(nil), "google.ads.googleads.v3.services.MutateAdGroupAdResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_ad_service.proto", fileDescriptor_9aa65a543bdddcd6)
+}
+
+var fileDescriptor_9aa65a543bdddcd6 = []byte{
+	// 817 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4f, 0x6b, 0xe3, 0x46,
+	0x14, 0xaf, 0xec, 0x36, 0x6d, 0xc6, 0x49, 0x1b, 0x26, 0xa4, 0x51, 0x9d, 0x42, 0x8d, 0x1a, 0xa8,
+	0x71, 0x83, 0x04, 0x76, 0x4a, 0x89, 0xd2, 0x50, 0x64, 0xda, 0x38, 0x3d, 0xa4, 0x71, 0x15, 0x30,
+	0xb4, 0x18, 0xc4, 0x44, 0x9a, 0xb8, 0x22, 0x92, 0x46, 0x3b, 0x33, 0x32, 0x98, 0x90, 0xcb, 0xee,
+	0x47, 0xd8, 0x6f, 0xb0, 0xc7, 0xbd, 0xef, 0x61, 0xbf, 0x42, 0xd8, 0xdb, 0xde, 0x72, 0x58, 0xf6,
+	0xb0, 0x87, 0x65, 0x3f, 0xc3, 0x1e, 0x16, 0x69, 0x34, 0xf2, 0x9f, 0xc4, 0x98, 0xe4, 0xf6, 0x34,
+	0xef, 0xf7, 0xfb, 0xbd, 0xf7, 0xe6, 0xbd, 0x37, 0x02, 0xe6, 0x80, 0x90, 0x41, 0x80, 0x0d, 0xe4,
+	0x31, 0x43, 0x98, 0xa9, 0x35, 0x6c, 0x19, 0x0c, 0xd3, 0xa1, 0xef, 0x62, 0x66, 0x20, 0xcf, 0x19,
+	0x50, 0x92, 0xc4, 0x0e, 0xf2, 0x9c, 0xfc, 0x50, 0x8f, 0x29, 0xe1, 0x04, 0xd6, 0x04, 0x41, 0x47,
+	0x1e, 0xd3, 0x0b, 0xae, 0x3e, 0x6c, 0xe9, 0x92, 0x5b, 0xfd, 0x79, 0x9e, 0xba, 0x4b, 0xc2, 0x90,
+	0x44, 0x46, 0x4c, 0x02, 0xdf, 0x1d, 0x09, 0xb9, 0x6a, 0x6b, 0x1e, 0x98, 0x62, 0x46, 0x12, 0x3a,
+	0x93, 0x4b, 0x4e, 0xfa, 0x5e, 0x92, 0x62, 0xdf, 0x40, 0x51, 0x44, 0x38, 0xe2, 0x3e, 0x89, 0x58,
+	0xee, 0xdd, 0x9c, 0xf0, 0xba, 0x81, 0x8f, 0x23, 0x9e, 0x3b, 0x7e, 0x98, 0x70, 0x9c, 0xfb, 0x38,
+	0xf0, 0x9c, 0x33, 0xfc, 0x3f, 0x1a, 0xfa, 0x84, 0xe6, 0x80, 0xbc, 0x36, 0x23, 0xfb, 0x3a, 0x4b,
+	0xce, 0x73, 0x54, 0x88, 0xd8, 0xc5, 0x8c, 0x36, 0x8d, 0x5d, 0x83, 0x71, 0xc4, 0x93, 0x3c, 0xa8,
+	0xf6, 0x3b, 0x58, 0xef, 0x60, 0x6e, 0x79, 0x9d, 0x34, 0x53, 0xcb, 0xb3, 0xf1, 0xa3, 0x04, 0x33,
+	0x0e, 0xeb, 0x60, 0x55, 0x16, 0xe2, 0x44, 0x28, 0xc4, 0xaa, 0x52, 0x53, 0xea, 0xcb, 0xed, 0xf2,
+	0x5b, 0xab, 0x64, 0xaf, 0x48, 0xcf, 0xdf, 0x28, 0xc4, 0xda, 0x7b, 0x05, 0x6c, 0x1e, 0x27, 0x1c,
+	0x71, 0x5c, 0x88, 0x30, 0xa9, 0xb2, 0x0d, 0x2a, 0x6e, 0xc2, 0x38, 0x09, 0x31, 0x75, 0x7c, 0x6f,
+	0x52, 0x03, 0xc8, 0xf3, 0xbf, 0x3c, 0xf8, 0x2f, 0x00, 0x24, 0xc6, 0x54, 0xdc, 0x85, 0x5a, 0xaa,
+	0x95, 0xeb, 0x95, 0xe6, 0xae, 0xbe, 0xa8, 0x5d, 0x7a, 0x11, 0xee, 0x44, 0x92, 0x73, 0xe9, 0xb1,
+	0x18, 0xfc, 0x09, 0x7c, 0x13, 0x23, 0xca, 0x7d, 0x14, 0x38, 0xe7, 0xc8, 0x0f, 0x12, 0x8a, 0xd5,
+	0x72, 0x4d, 0xa9, 0x7f, 0x65, 0x7f, 0x9d, 0x1f, 0x1f, 0x8a, 0x53, 0xf8, 0x23, 0x58, 0x1d, 0xa2,
+	0xc0, 0xf7, 0x10, 0xc7, 0x0e, 0x89, 0x82, 0x91, 0xfa, 0x79, 0x06, 0x5b, 0x91, 0x87, 0x27, 0x51,
+	0x30, 0xd2, 0x9e, 0x94, 0x01, 0xbc, 0x1d, 0x15, 0xee, 0x83, 0x4a, 0x12, 0x67, 0xcc, 0xf4, 0xc2,
+	0x33, 0x66, 0xa5, 0x59, 0x95, 0x05, 0xc8, 0x9e, 0xe8, 0x87, 0x69, 0x4f, 0x8e, 0x11, 0xbb, 0xb0,
+	0x81, 0x80, 0xa7, 0x36, 0x1c, 0x81, 0x2d, 0x31, 0x57, 0x4e, 0x1e, 0xca, 0x27, 0x91, 0x13, 0x23,
+	0x8a, 0x42, 0xcc, 0x31, 0x55, 0xbf, 0xc8, 0xc4, 0xf6, 0xe6, 0xde, 0x86, 0x18, 0x4d, 0xbd, 0x9b,
+	0x49, 0xf4, 0x0a, 0x85, 0xae, 0x14, 0xb0, 0xbf, 0x8b, 0xe7, 0xb9, 0xe0, 0x21, 0x58, 0x72, 0x29,
+	0x46, 0x5c, 0x34, 0xb7, 0xd2, 0xdc, 0x99, 0x1b, 0xa5, 0x98, 0xe9, 0xf1, 0xa5, 0x1f, 0x7d, 0x66,
+	0xe7, 0xec, 0x54, 0x47, 0x14, 0xa4, 0x96, 0x1e, 0xa6, 0x23, 0xd8, 0x50, 0x05, 0x4b, 0x14, 0x87,
+	0x64, 0x28, 0x7a, 0xb4, 0x9c, 0x7a, 0xc4, 0x77, 0xbb, 0x02, 0x96, 0x8b, 0xa6, 0x6a, 0x2f, 0x14,
+	0xa0, 0xde, 0x1e, 0x38, 0x16, 0x93, 0x88, 0xa5, 0xb9, 0x6c, 0xcc, 0x34, 0xdc, 0xc1, 0x94, 0x12,
+	0x9a, 0x49, 0x56, 0x9a, 0x50, 0xa6, 0x46, 0x63, 0x57, 0x3f, 0xcd, 0xf6, 0xc0, 0x5e, 0x9f, 0x1e,
+	0x85, 0x3f, 0x53, 0x38, 0xfc, 0x07, 0x7c, 0x49, 0x31, 0x4b, 0x02, 0x2e, 0x07, 0xf2, 0xd7, 0xc5,
+	0x03, 0x39, 0x93, 0x94, 0x9d, 0xf1, 0x6d, 0xa9, 0xa3, 0xfd, 0x06, 0x36, 0xee, 0x44, 0xa4, 0xb3,
+	0x77, 0xc7, 0xae, 0x4d, 0xaf, 0x59, 0xf3, 0x55, 0x19, 0xac, 0x15, 0xc4, 0x53, 0x11, 0x12, 0xbe,
+	0x54, 0xc0, 0xca, 0xe4, 0xf6, 0xc2, 0x5f, 0x16, 0x67, 0x79, 0xc7, 0xb6, 0x57, 0xef, 0xd5, 0x31,
+	0xed, 0x8f, 0x1b, 0x6b, 0x3a, 0xe1, 0xc7, 0xaf, 0xdf, 0x3d, 0x2d, 0xe9, 0x70, 0x27, 0x7d, 0xfe,
+	0x2e, 0xa7, 0x3c, 0x07, 0x72, 0xcd, 0x99, 0xd1, 0x30, 0x50, 0xd1, 0x2e, 0xa3, 0x71, 0x05, 0xdf,
+	0x28, 0x60, 0x6d, 0xb6, 0x8d, 0x70, 0xef, 0xde, 0xb7, 0x2c, 0xdf, 0x9a, 0xaa, 0xf9, 0x10, 0xaa,
+	0x98, 0x1a, 0xed, 0xf4, 0xc6, 0xfa, 0x76, 0xe2, 0xa1, 0xda, 0x19, 0xbf, 0x20, 0x59, 0x69, 0xbb,
+	0x9a, 0x91, 0xfd, 0x06, 0x8a, 0x5a, 0x2e, 0x27, 0xc0, 0x07, 0x8d, 0xab, 0x89, 0xca, 0xcc, 0x30,
+	0x8b, 0x61, 0x2a, 0x8d, 0xea, 0xd6, 0xb5, 0xa5, 0x8e, 0xf3, 0xc8, 0xad, 0xd8, 0x67, 0xe9, 0xce,
+	0xb6, 0x3f, 0x2a, 0x60, 0xdb, 0x25, 0xe1, 0xc2, 0x9c, 0xdb, 0x1b, 0xb3, 0x4d, 0xef, 0xa6, 0xef,
+	0x49, 0x57, 0xf9, 0xef, 0x28, 0xa7, 0x0e, 0x48, 0x80, 0xa2, 0x81, 0x4e, 0xe8, 0xc0, 0x18, 0xe0,
+	0x28, 0x7b, 0x6d, 0x8c, 0x71, 0xb0, 0xf9, 0xbf, 0xca, 0x7d, 0x69, 0x3c, 0x2b, 0x95, 0x3b, 0x96,
+	0xf5, 0xbc, 0x54, 0xeb, 0x08, 0x41, 0xcb, 0x63, 0xba, 0x30, 0x53, 0xab, 0xd7, 0xd2, 0xf3, 0xc0,
+	0xec, 0x5a, 0x42, 0xfa, 0x96, 0xc7, 0xfa, 0x05, 0xa4, 0xdf, 0x6b, 0xf5, 0x25, 0xe4, 0x43, 0x69,
+	0x5b, 0x9c, 0x9b, 0x66, 0x7a, 0x19, 0x66, 0x01, 0x32, 0xcd, 0x5e, 0xcb, 0x34, 0x25, 0xec, 0x6c,
+	0x29, 0xcb, 0xb3, 0xf5, 0x29, 0x00, 0x00, 0xff, 0xff, 0x4c, 0xba, 0x81, 0xa5, 0xd1, 0x07, 0x00,
+	0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupAdServiceClient is the client API for AdGroupAdService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupAdServiceClient interface {
+	// Returns the requested ad in full detail.
+	GetAdGroupAd(ctx context.Context, in *GetAdGroupAdRequest, opts ...grpc.CallOption) (*resources.AdGroupAd, error)
+	// Creates, updates, or removes ads. Operation statuses are returned.
+	MutateAdGroupAds(ctx context.Context, in *MutateAdGroupAdsRequest, opts ...grpc.CallOption) (*MutateAdGroupAdsResponse, error)
+}
+
+type adGroupAdServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupAdServiceClient(cc grpc.ClientConnInterface) AdGroupAdServiceClient {
+	return &adGroupAdServiceClient{cc}
+}
+
+func (c *adGroupAdServiceClient) GetAdGroupAd(ctx context.Context, in *GetAdGroupAdRequest, opts ...grpc.CallOption) (*resources.AdGroupAd, error) {
+	out := new(resources.AdGroupAd)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupAdService/GetAdGroupAd", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adGroupAdServiceClient) MutateAdGroupAds(ctx context.Context, in *MutateAdGroupAdsRequest, opts ...grpc.CallOption) (*MutateAdGroupAdsResponse, error) {
+	out := new(MutateAdGroupAdsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupAdService/MutateAdGroupAds", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupAdServiceServer is the server API for AdGroupAdService service.
+type AdGroupAdServiceServer interface {
+	// Returns the requested ad in full detail.
+	GetAdGroupAd(context.Context, *GetAdGroupAdRequest) (*resources.AdGroupAd, error)
+	// Creates, updates, or removes ads. Operation statuses are returned.
+	MutateAdGroupAds(context.Context, *MutateAdGroupAdsRequest) (*MutateAdGroupAdsResponse, error)
+}
+
+// UnimplementedAdGroupAdServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupAdServiceServer struct {
+}
+
+func (*UnimplementedAdGroupAdServiceServer) GetAdGroupAd(ctx context.Context, req *GetAdGroupAdRequest) (*resources.AdGroupAd, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdGroupAd not implemented")
+}
+func (*UnimplementedAdGroupAdServiceServer) MutateAdGroupAds(ctx context.Context, req *MutateAdGroupAdsRequest) (*MutateAdGroupAdsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdGroupAds not implemented")
+}
+
+func RegisterAdGroupAdServiceServer(s *grpc.Server, srv AdGroupAdServiceServer) {
+	s.RegisterService(&_AdGroupAdService_serviceDesc, srv)
+}
+
+func _AdGroupAdService_GetAdGroupAd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupAdRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupAdServiceServer).GetAdGroupAd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupAdService/GetAdGroupAd",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupAdServiceServer).GetAdGroupAd(ctx, req.(*GetAdGroupAdRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdGroupAdService_MutateAdGroupAds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdGroupAdsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupAdServiceServer).MutateAdGroupAds(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupAdService/MutateAdGroupAds",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupAdServiceServer).MutateAdGroupAds(ctx, req.(*MutateAdGroupAdsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupAdService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupAdService",
+	HandlerType: (*AdGroupAdServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupAd",
+			Handler:    _AdGroupAdService_GetAdGroupAd_Handler,
+		},
+		{
+			MethodName: "MutateAdGroupAds",
+			Handler:    _AdGroupAdService_MutateAdGroupAds_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_ad_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_audience_view_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_audience_view_service.pb.go
new file mode 100644
index 0000000..590d339
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_audience_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_audience_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupAudienceViewService.GetAdGoupAudienceView][].
+type GetAdGroupAudienceViewRequest struct {
+	// Required. The resource name of the ad group audience view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupAudienceViewRequest) Reset()         { *m = GetAdGroupAudienceViewRequest{} }
+func (m *GetAdGroupAudienceViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupAudienceViewRequest) ProtoMessage()    {}
+func (*GetAdGroupAudienceViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_88c843f8d448d38a, []int{0}
+}
+
+func (m *GetAdGroupAudienceViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupAudienceViewRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupAudienceViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupAudienceViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupAudienceViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupAudienceViewRequest.Merge(m, src)
+}
+func (m *GetAdGroupAudienceViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupAudienceViewRequest.Size(m)
+}
+func (m *GetAdGroupAudienceViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupAudienceViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupAudienceViewRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupAudienceViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupAudienceViewRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupAudienceViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_audience_view_service.proto", fileDescriptor_88c843f8d448d38a)
+}
+
+var fileDescriptor_88c843f8d448d38a = []byte{
+	// 423 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xb1, 0x8a, 0xd5, 0x40,
+	0x14, 0x25, 0x59, 0x10, 0x0c, 0xda, 0xa4, 0xd0, 0x25, 0x2a, 0xfb, 0x58, 0xb6, 0x58, 0xb6, 0x98,
+	0x01, 0x03, 0x8b, 0x8c, 0xa8, 0xcc, 0x03, 0x89, 0x36, 0xcb, 0xb2, 0x42, 0x0a, 0x09, 0x84, 0xd9,
+	0xcc, 0x35, 0x0e, 0x24, 0x33, 0x71, 0x26, 0xc9, 0x16, 0x62, 0x63, 0xe1, 0x0f, 0x58, 0xdb, 0x58,
+	0xfa, 0x29, 0xdb, 0xda, 0x59, 0x29, 0x58, 0xf9, 0x15, 0x92, 0x9d, 0x4c, 0xf6, 0x3d, 0x7c, 0xf1,
+	0x75, 0x87, 0x9c, 0x73, 0xcf, 0xb9, 0x73, 0x6e, 0x82, 0xe7, 0xa5, 0x52, 0x65, 0x05, 0x98, 0x71,
+	0x83, 0x2d, 0x1c, 0x50, 0x1f, 0x63, 0x03, 0xba, 0x17, 0x05, 0x18, 0xcc, 0x78, 0x5e, 0x6a, 0xd5,
+	0x35, 0x39, 0xeb, 0xb8, 0x00, 0x59, 0x40, 0xde, 0x0b, 0xb8, 0xc8, 0x47, 0x1e, 0x35, 0x5a, 0xb5,
+	0x2a, 0x5c, 0xd8, 0x59, 0xc4, 0xb8, 0x41, 0x93, 0x0d, 0xea, 0x63, 0xe4, 0x6c, 0xa2, 0xa7, 0x73,
+	0x41, 0x1a, 0x8c, 0xea, 0xf4, 0x7c, 0x92, 0x4d, 0x88, 0xee, 0xbb, 0xf9, 0x46, 0x60, 0x26, 0xa5,
+	0x6a, 0x59, 0x2b, 0x94, 0x34, 0x23, 0x7b, 0x77, 0x85, 0x2d, 0x2a, 0x01, 0xb2, 0x1d, 0x89, 0xbd,
+	0x15, 0xe2, 0x8d, 0x80, 0x8a, 0xe7, 0xe7, 0xf0, 0x96, 0xf5, 0x42, 0x69, 0x2b, 0xd8, 0x7f, 0x19,
+	0x3c, 0x48, 0xa0, 0xa5, 0x3c, 0x19, 0x92, 0xe9, 0x18, 0x9c, 0x0a, 0xb8, 0x38, 0x83, 0x77, 0x1d,
+	0x98, 0x36, 0x3c, 0x0c, 0x6e, 0xbb, 0x15, 0x73, 0xc9, 0x6a, 0xd8, 0xf5, 0x16, 0xde, 0xe1, 0xcd,
+	0xe5, 0xce, 0x4f, 0xea, 0x9f, 0xdd, 0x72, 0xcc, 0x09, 0xab, 0xe1, 0xe1, 0x17, 0x3f, 0x88, 0x36,
+	0x18, 0xbd, 0xb2, 0x15, 0x84, 0xbf, 0xbc, 0xe0, 0xce, 0xe6, 0xa8, 0xf0, 0x19, 0xda, 0xd6, 0x1f,
+	0xfa, 0xef, 0x92, 0xd1, 0xf1, 0xac, 0xc1, 0x54, 0x2f, 0xda, 0x30, 0xbe, 0x7f, 0xf2, 0x83, 0xae,
+	0xbf, 0xee, 0xe3, 0xf7, 0xdf, 0x9f, 0xfd, 0x47, 0xe1, 0xf1, 0x70, 0x99, 0xf7, 0x6b, 0xcc, 0x93,
+	0xa2, 0x33, 0xad, 0xaa, 0x41, 0x1b, 0x7c, 0x84, 0xd9, 0xbf, 0x5e, 0x06, 0x1f, 0x7d, 0x88, 0xee,
+	0x5d, 0xd2, 0xdd, 0xeb, 0xf8, 0x11, 0x35, 0xc2, 0xa0, 0x42, 0xd5, 0xcb, 0x4f, 0x7e, 0x70, 0x50,
+	0xa8, 0x7a, 0xeb, 0x5b, 0x97, 0x7b, 0xf3, 0x2d, 0x9e, 0x0e, 0x47, 0x3b, 0xf5, 0x5e, 0xbf, 0x18,
+	0x4d, 0x4a, 0x55, 0x31, 0x59, 0x22, 0xa5, 0x4b, 0x5c, 0x82, 0xbc, 0x3a, 0x29, 0xbe, 0x8e, 0x9d,
+	0xff, 0xad, 0x1f, 0x3b, 0xf0, 0xd5, 0xdf, 0x49, 0x28, 0xfd, 0xe6, 0x2f, 0x12, 0x6b, 0x48, 0xb9,
+	0x41, 0x16, 0x0e, 0x28, 0x8d, 0xd1, 0x18, 0x6c, 0x2e, 0x9d, 0x24, 0xa3, 0xdc, 0x64, 0x93, 0x24,
+	0x4b, 0xe3, 0xcc, 0x49, 0xfe, 0xf8, 0x07, 0xf6, 0x3b, 0x21, 0x94, 0x1b, 0x42, 0x26, 0x11, 0x21,
+	0x69, 0x4c, 0x88, 0x93, 0x9d, 0xdf, 0xb8, 0xda, 0x33, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xc0,
+	0x2d, 0x4d, 0x1d, 0x7d, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupAudienceViewServiceClient is the client API for AdGroupAudienceViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupAudienceViewServiceClient interface {
+	// Returns the requested ad group audience view in full detail.
+	GetAdGroupAudienceView(ctx context.Context, in *GetAdGroupAudienceViewRequest, opts ...grpc.CallOption) (*resources.AdGroupAudienceView, error)
+}
+
+type adGroupAudienceViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupAudienceViewServiceClient(cc grpc.ClientConnInterface) AdGroupAudienceViewServiceClient {
+	return &adGroupAudienceViewServiceClient{cc}
+}
+
+func (c *adGroupAudienceViewServiceClient) GetAdGroupAudienceView(ctx context.Context, in *GetAdGroupAudienceViewRequest, opts ...grpc.CallOption) (*resources.AdGroupAudienceView, error) {
+	out := new(resources.AdGroupAudienceView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupAudienceViewService/GetAdGroupAudienceView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupAudienceViewServiceServer is the server API for AdGroupAudienceViewService service.
+type AdGroupAudienceViewServiceServer interface {
+	// Returns the requested ad group audience view in full detail.
+	GetAdGroupAudienceView(context.Context, *GetAdGroupAudienceViewRequest) (*resources.AdGroupAudienceView, error)
+}
+
+// UnimplementedAdGroupAudienceViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupAudienceViewServiceServer struct {
+}
+
+func (*UnimplementedAdGroupAudienceViewServiceServer) GetAdGroupAudienceView(ctx context.Context, req *GetAdGroupAudienceViewRequest) (*resources.AdGroupAudienceView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAdGroupAudienceView not implemented")
+}
+
+func RegisterAdGroupAudienceViewServiceServer(s *grpc.Server, srv AdGroupAudienceViewServiceServer) {
+	s.RegisterService(&_AdGroupAudienceViewService_serviceDesc, srv)
+}
+
+func _AdGroupAudienceViewService_GetAdGroupAudienceView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupAudienceViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupAudienceViewServiceServer).GetAdGroupAudienceView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupAudienceViewService/GetAdGroupAudienceView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupAudienceViewServiceServer).GetAdGroupAudienceView(ctx, req.(*GetAdGroupAudienceViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupAudienceViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupAudienceViewService",
+	HandlerType: (*AdGroupAudienceViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupAudienceView",
+			Handler:    _AdGroupAudienceViewService_GetAdGroupAudienceView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_audience_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_bid_modifier_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_bid_modifier_service.pb.go
new file mode 100644
index 0000000..12cf7f2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_bid_modifier_service.pb.go
@@ -0,0 +1,531 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_bid_modifier_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupBidModifierService.GetAdGroupBidModifier][google.ads.googleads.v3.services.AdGroupBidModifierService.GetAdGroupBidModifier].
+type GetAdGroupBidModifierRequest struct {
+	// Required. The resource name of the ad group bid modifier to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupBidModifierRequest) Reset()         { *m = GetAdGroupBidModifierRequest{} }
+func (m *GetAdGroupBidModifierRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupBidModifierRequest) ProtoMessage()    {}
+func (*GetAdGroupBidModifierRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6e83475391d628e3, []int{0}
+}
+
+func (m *GetAdGroupBidModifierRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupBidModifierRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupBidModifierRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupBidModifierRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupBidModifierRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupBidModifierRequest.Merge(m, src)
+}
+func (m *GetAdGroupBidModifierRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupBidModifierRequest.Size(m)
+}
+func (m *GetAdGroupBidModifierRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupBidModifierRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupBidModifierRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupBidModifierRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AdGroupBidModifierService.MutateAdGroupBidModifiers][google.ads.googleads.v3.services.AdGroupBidModifierService.MutateAdGroupBidModifiers].
+type MutateAdGroupBidModifiersRequest struct {
+	// Required. ID of the customer whose ad group bid modifiers are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual ad group bid modifiers.
+	Operations []*AdGroupBidModifierOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupBidModifiersRequest) Reset()         { *m = MutateAdGroupBidModifiersRequest{} }
+func (m *MutateAdGroupBidModifiersRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupBidModifiersRequest) ProtoMessage()    {}
+func (*MutateAdGroupBidModifiersRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6e83475391d628e3, []int{1}
+}
+
+func (m *MutateAdGroupBidModifiersRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupBidModifiersRequest.Unmarshal(m, b)
+}
+func (m *MutateAdGroupBidModifiersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupBidModifiersRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupBidModifiersRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupBidModifiersRequest.Merge(m, src)
+}
+func (m *MutateAdGroupBidModifiersRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupBidModifiersRequest.Size(m)
+}
+func (m *MutateAdGroupBidModifiersRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupBidModifiersRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupBidModifiersRequest proto.InternalMessageInfo
+
+func (m *MutateAdGroupBidModifiersRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdGroupBidModifiersRequest) GetOperations() []*AdGroupBidModifierOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdGroupBidModifiersRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdGroupBidModifiersRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove, update) on an ad group bid modifier.
+type AdGroupBidModifierOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdGroupBidModifierOperation_Create
+	//	*AdGroupBidModifierOperation_Update
+	//	*AdGroupBidModifierOperation_Remove
+	Operation            isAdGroupBidModifierOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *AdGroupBidModifierOperation) Reset()         { *m = AdGroupBidModifierOperation{} }
+func (m *AdGroupBidModifierOperation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupBidModifierOperation) ProtoMessage()    {}
+func (*AdGroupBidModifierOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6e83475391d628e3, []int{2}
+}
+
+func (m *AdGroupBidModifierOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupBidModifierOperation.Unmarshal(m, b)
+}
+func (m *AdGroupBidModifierOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupBidModifierOperation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupBidModifierOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupBidModifierOperation.Merge(m, src)
+}
+func (m *AdGroupBidModifierOperation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupBidModifierOperation.Size(m)
+}
+func (m *AdGroupBidModifierOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupBidModifierOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupBidModifierOperation proto.InternalMessageInfo
+
+func (m *AdGroupBidModifierOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isAdGroupBidModifierOperation_Operation interface {
+	isAdGroupBidModifierOperation_Operation()
+}
+
+type AdGroupBidModifierOperation_Create struct {
+	Create *resources.AdGroupBidModifier `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdGroupBidModifierOperation_Update struct {
+	Update *resources.AdGroupBidModifier `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type AdGroupBidModifierOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdGroupBidModifierOperation_Create) isAdGroupBidModifierOperation_Operation() {}
+
+func (*AdGroupBidModifierOperation_Update) isAdGroupBidModifierOperation_Operation() {}
+
+func (*AdGroupBidModifierOperation_Remove) isAdGroupBidModifierOperation_Operation() {}
+
+func (m *AdGroupBidModifierOperation) GetOperation() isAdGroupBidModifierOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifierOperation) GetCreate() *resources.AdGroupBidModifier {
+	if x, ok := m.GetOperation().(*AdGroupBidModifierOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifierOperation) GetUpdate() *resources.AdGroupBidModifier {
+	if x, ok := m.GetOperation().(*AdGroupBidModifierOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *AdGroupBidModifierOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdGroupBidModifierOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupBidModifierOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupBidModifierOperation_Create)(nil),
+		(*AdGroupBidModifierOperation_Update)(nil),
+		(*AdGroupBidModifierOperation_Remove)(nil),
+	}
+}
+
+// Response message for ad group bid modifiers mutate.
+type MutateAdGroupBidModifiersResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdGroupBidModifierResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *MutateAdGroupBidModifiersResponse) Reset()         { *m = MutateAdGroupBidModifiersResponse{} }
+func (m *MutateAdGroupBidModifiersResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupBidModifiersResponse) ProtoMessage()    {}
+func (*MutateAdGroupBidModifiersResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6e83475391d628e3, []int{3}
+}
+
+func (m *MutateAdGroupBidModifiersResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupBidModifiersResponse.Unmarshal(m, b)
+}
+func (m *MutateAdGroupBidModifiersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupBidModifiersResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupBidModifiersResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupBidModifiersResponse.Merge(m, src)
+}
+func (m *MutateAdGroupBidModifiersResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupBidModifiersResponse.Size(m)
+}
+func (m *MutateAdGroupBidModifiersResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupBidModifiersResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupBidModifiersResponse proto.InternalMessageInfo
+
+func (m *MutateAdGroupBidModifiersResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdGroupBidModifiersResponse) GetResults() []*MutateAdGroupBidModifierResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the criterion mutate.
+type MutateAdGroupBidModifierResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupBidModifierResult) Reset()         { *m = MutateAdGroupBidModifierResult{} }
+func (m *MutateAdGroupBidModifierResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupBidModifierResult) ProtoMessage()    {}
+func (*MutateAdGroupBidModifierResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6e83475391d628e3, []int{4}
+}
+
+func (m *MutateAdGroupBidModifierResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupBidModifierResult.Unmarshal(m, b)
+}
+func (m *MutateAdGroupBidModifierResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupBidModifierResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupBidModifierResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupBidModifierResult.Merge(m, src)
+}
+func (m *MutateAdGroupBidModifierResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupBidModifierResult.Size(m)
+}
+func (m *MutateAdGroupBidModifierResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupBidModifierResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupBidModifierResult proto.InternalMessageInfo
+
+func (m *MutateAdGroupBidModifierResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupBidModifierRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupBidModifierRequest")
+	proto.RegisterType((*MutateAdGroupBidModifiersRequest)(nil), "google.ads.googleads.v3.services.MutateAdGroupBidModifiersRequest")
+	proto.RegisterType((*AdGroupBidModifierOperation)(nil), "google.ads.googleads.v3.services.AdGroupBidModifierOperation")
+	proto.RegisterType((*MutateAdGroupBidModifiersResponse)(nil), "google.ads.googleads.v3.services.MutateAdGroupBidModifiersResponse")
+	proto.RegisterType((*MutateAdGroupBidModifierResult)(nil), "google.ads.googleads.v3.services.MutateAdGroupBidModifierResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_bid_modifier_service.proto", fileDescriptor_6e83475391d628e3)
+}
+
+var fileDescriptor_6e83475391d628e3 = []byte{
+	// 778 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xcf, 0x6b, 0xdb, 0x48,
+	0x14, 0xc7, 0x57, 0x72, 0xc8, 0x6e, 0xc6, 0xc9, 0x2e, 0xcc, 0x92, 0x5d, 0xc7, 0x09, 0x59, 0xaf,
+	0x36, 0xb0, 0xc6, 0x2c, 0x12, 0xd8, 0x84, 0x2d, 0x0a, 0x2e, 0x95, 0xdb, 0xc4, 0xe9, 0xc1, 0x4d,
+	0x50, 0x20, 0x87, 0x60, 0x10, 0x63, 0x69, 0xec, 0x8a, 0x48, 0x1a, 0x75, 0x46, 0x32, 0x84, 0x90,
+	0x4b, 0xa0, 0x7f, 0x41, 0xcf, 0xbd, 0xb4, 0xb7, 0xfe, 0x23, 0x85, 0x5c, 0x7b, 0x0b, 0x14, 0x7a,
+	0xe8, 0xa9, 0x7f, 0x42, 0x4f, 0x45, 0x1a, 0x8d, 0x7f, 0xc4, 0xbf, 0x20, 0xb9, 0x3d, 0xcf, 0xfb,
+	0xea, 0xf3, 0xde, 0x9b, 0xf7, 0xe6, 0x19, 0x3c, 0xeb, 0x11, 0xd2, 0xf3, 0xb0, 0x86, 0x1c, 0xa6,
+	0x71, 0x33, 0xb1, 0xfa, 0x35, 0x8d, 0x61, 0xda, 0x77, 0x6d, 0xcc, 0x34, 0xe4, 0x58, 0x3d, 0x4a,
+	0xe2, 0xd0, 0xea, 0xb8, 0x8e, 0xe5, 0x13, 0xc7, 0xed, 0xba, 0x98, 0x5a, 0x99, 0x5b, 0x0d, 0x29,
+	0x89, 0x08, 0x2c, 0xf1, 0x4f, 0x55, 0xe4, 0x30, 0x75, 0x40, 0x51, 0xfb, 0x35, 0x55, 0x50, 0x8a,
+	0xf5, 0x59, 0x71, 0x28, 0x66, 0x24, 0xa6, 0x33, 0x03, 0xf1, 0x00, 0xc5, 0x2d, 0xf1, 0x79, 0xe8,
+	0x6a, 0x28, 0x08, 0x48, 0x84, 0x22, 0x97, 0x04, 0x2c, 0xf3, 0xfe, 0x39, 0xe2, 0xb5, 0x3d, 0x17,
+	0x07, 0x51, 0xe6, 0xf8, 0x6b, 0xc4, 0xd1, 0x75, 0xb1, 0xe7, 0x58, 0x1d, 0xfc, 0x12, 0xf5, 0x5d,
+	0x22, 0xb8, 0x59, 0xe2, 0x5a, 0xfa, 0xab, 0x13, 0x77, 0x33, 0x95, 0x8f, 0xd8, 0xf9, 0x1d, 0x36,
+	0x0d, 0x6d, 0x8d, 0x45, 0x28, 0x8a, 0xb3, 0xa0, 0xca, 0x21, 0xd8, 0x6a, 0xe2, 0xc8, 0x70, 0x9a,
+	0x49, 0xce, 0x0d, 0xd7, 0x69, 0x65, 0x19, 0x9b, 0xf8, 0x55, 0x8c, 0x59, 0x04, 0xcb, 0x60, 0x4d,
+	0xd4, 0x66, 0x05, 0xc8, 0xc7, 0x05, 0xa9, 0x24, 0x95, 0x57, 0x1a, 0xb9, 0x2f, 0x86, 0x6c, 0xae,
+	0x0a, 0xcf, 0x0b, 0xe4, 0x63, 0xe5, 0xbb, 0x04, 0x4a, 0xad, 0x38, 0x42, 0x11, 0x9e, 0xa4, 0x31,
+	0x81, 0xdb, 0x01, 0x79, 0x3b, 0x66, 0x11, 0xf1, 0x31, 0xb5, 0x5c, 0x67, 0x14, 0x06, 0xc4, 0xf9,
+	0x73, 0x07, 0x76, 0x00, 0x20, 0x21, 0xa6, 0xfc, 0x76, 0x0a, 0x72, 0x29, 0x57, 0xce, 0x57, 0xeb,
+	0xea, 0xa2, 0xee, 0xa8, 0x93, 0x71, 0x8f, 0x04, 0x25, 0x8b, 0x31, 0xa4, 0xc2, 0x7f, 0xc1, 0x6f,
+	0x21, 0xa2, 0x91, 0x8b, 0x3c, 0xab, 0x8b, 0x5c, 0x2f, 0xa6, 0xb8, 0x90, 0x2b, 0x49, 0xe5, 0x5f,
+	0xcc, 0x5f, 0xb3, 0xe3, 0x03, 0x7e, 0x0a, 0xff, 0x01, 0x6b, 0x7d, 0xe4, 0xb9, 0x0e, 0x8a, 0xb0,
+	0x45, 0x02, 0xef, 0xa2, 0xb0, 0x94, 0xca, 0x56, 0xc5, 0xe1, 0x51, 0xe0, 0x5d, 0x28, 0xef, 0x65,
+	0xb0, 0x39, 0x27, 0x3c, 0xdc, 0x03, 0xf9, 0x38, 0x4c, 0x11, 0x49, 0x53, 0x52, 0x44, 0xbe, 0x5a,
+	0x14, 0x25, 0x89, 0xbe, 0xa9, 0x07, 0x49, 0xdf, 0x5a, 0x88, 0x9d, 0x9b, 0x80, 0xcb, 0x13, 0x1b,
+	0x1e, 0x81, 0x65, 0x9b, 0x62, 0x14, 0xf1, 0xcb, 0xcf, 0x57, 0x77, 0x67, 0x5e, 0xc5, 0x60, 0x0c,
+	0xa7, 0xdc, 0xc5, 0xe1, 0x4f, 0x66, 0x86, 0x49, 0x80, 0x1c, 0x5f, 0x90, 0x1f, 0x08, 0xe4, 0x18,
+	0x58, 0x00, 0xcb, 0x14, 0xfb, 0xa4, 0xcf, 0xef, 0x70, 0x25, 0xf1, 0xf0, 0xdf, 0x8d, 0x3c, 0x58,
+	0x19, 0x5c, 0xba, 0xf2, 0x51, 0x02, 0x7f, 0xcf, 0x19, 0x11, 0x16, 0x92, 0x80, 0x61, 0x78, 0x00,
+	0xd6, 0xef, 0x74, 0xc6, 0xc2, 0x94, 0x12, 0x9a, 0xb2, 0xf3, 0x55, 0x28, 0x92, 0xa5, 0xa1, 0xad,
+	0x9e, 0xa4, 0xb3, 0x6c, 0xfe, 0x3e, 0xde, 0xb3, 0xfd, 0x44, 0x0e, 0xcf, 0xc0, 0xcf, 0x14, 0xb3,
+	0xd8, 0x8b, 0xc4, 0x08, 0x3d, 0x59, 0x3c, 0x42, 0xb3, 0xb2, 0x33, 0x53, 0x90, 0x29, 0x80, 0xca,
+	0x3e, 0xd8, 0x9e, 0x2f, 0x4d, 0xc6, 0x66, 0xca, 0xc3, 0x19, 0x7f, 0x33, 0xd5, 0xb7, 0x4b, 0x60,
+	0x63, 0x92, 0x70, 0xc2, 0xb3, 0x81, 0x9f, 0x25, 0xb0, 0x3e, 0xf5, 0x71, 0xc2, 0xc7, 0x8b, 0x2b,
+	0x99, 0xf7, 0xaa, 0x8b, 0xf7, 0x6b, 0xb8, 0xd2, 0xba, 0x35, 0xc6, 0x8b, 0xba, 0xfe, 0xf4, 0xf5,
+	0x8d, 0xfc, 0x3f, 0xdc, 0x4d, 0x56, 0xe0, 0xe5, 0x98, 0xa7, 0x2e, 0x9e, 0x33, 0xd3, 0x2a, 0x1a,
+	0x9a, 0xec, 0xb6, 0x56, 0xb9, 0x82, 0xd7, 0x32, 0xd8, 0x98, 0x39, 0x0e, 0xb0, 0x71, 0xff, 0x6e,
+	0x89, 0x75, 0x53, 0x7c, 0xfa, 0x20, 0x06, 0x9f, 0x47, 0xa5, 0x7d, 0x6b, 0xfc, 0x31, 0xb2, 0xb4,
+	0xfe, 0x1b, 0x2e, 0x91, 0xb4, 0xfc, 0xba, 0xf2, 0x28, 0x29, 0x7f, 0x58, 0xef, 0xe5, 0x88, 0xb8,
+	0x5e, 0xb9, 0x9a, 0x56, 0xbd, 0xee, 0xa7, 0x51, 0x75, 0xa9, 0x52, 0xdc, 0xbc, 0x31, 0x0a, 0xc3,
+	0xcc, 0x32, 0x2b, 0x74, 0x99, 0x6a, 0x13, 0xbf, 0xf1, 0x5a, 0x06, 0x3b, 0x36, 0xf1, 0x17, 0x56,
+	0xd1, 0xd8, 0x9e, 0x39, 0x45, 0xc7, 0xc9, 0x6e, 0x39, 0x96, 0xce, 0x0e, 0x33, 0x46, 0x8f, 0x78,
+	0x28, 0xe8, 0xa9, 0x84, 0xf6, 0xb4, 0x1e, 0x0e, 0xd2, 0xcd, 0xa3, 0x0d, 0xa3, 0xce, 0xfe, 0x07,
+	0xdd, 0x13, 0xc6, 0x3b, 0x39, 0xd7, 0x34, 0x8c, 0x0f, 0x72, 0xa9, 0xc9, 0x81, 0x86, 0xc3, 0x54,
+	0x6e, 0x26, 0xd6, 0x69, 0x4d, 0xcd, 0x02, 0xb3, 0x1b, 0x21, 0x69, 0x1b, 0x0e, 0x6b, 0x0f, 0x24,
+	0xed, 0xd3, 0x5a, 0x5b, 0x48, 0xbe, 0xc9, 0x3b, 0xfc, 0x5c, 0xd7, 0x0d, 0x87, 0xe9, 0xfa, 0x40,
+	0xa4, 0xeb, 0xa7, 0x35, 0x5d, 0x17, 0xb2, 0xce, 0x72, 0x9a, 0x67, 0xed, 0x47, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xfb, 0xe6, 0x6b, 0x85, 0xe8, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupBidModifierServiceClient is the client API for AdGroupBidModifierService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupBidModifierServiceClient interface {
+	// Returns the requested ad group bid modifier in full detail.
+	GetAdGroupBidModifier(ctx context.Context, in *GetAdGroupBidModifierRequest, opts ...grpc.CallOption) (*resources.AdGroupBidModifier, error)
+	// Creates, updates, or removes ad group bid modifiers.
+	// Operation statuses are returned.
+	MutateAdGroupBidModifiers(ctx context.Context, in *MutateAdGroupBidModifiersRequest, opts ...grpc.CallOption) (*MutateAdGroupBidModifiersResponse, error)
+}
+
+type adGroupBidModifierServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupBidModifierServiceClient(cc grpc.ClientConnInterface) AdGroupBidModifierServiceClient {
+	return &adGroupBidModifierServiceClient{cc}
+}
+
+func (c *adGroupBidModifierServiceClient) GetAdGroupBidModifier(ctx context.Context, in *GetAdGroupBidModifierRequest, opts ...grpc.CallOption) (*resources.AdGroupBidModifier, error) {
+	out := new(resources.AdGroupBidModifier)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupBidModifierService/GetAdGroupBidModifier", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adGroupBidModifierServiceClient) MutateAdGroupBidModifiers(ctx context.Context, in *MutateAdGroupBidModifiersRequest, opts ...grpc.CallOption) (*MutateAdGroupBidModifiersResponse, error) {
+	out := new(MutateAdGroupBidModifiersResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupBidModifierService/MutateAdGroupBidModifiers", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupBidModifierServiceServer is the server API for AdGroupBidModifierService service.
+type AdGroupBidModifierServiceServer interface {
+	// Returns the requested ad group bid modifier in full detail.
+	GetAdGroupBidModifier(context.Context, *GetAdGroupBidModifierRequest) (*resources.AdGroupBidModifier, error)
+	// Creates, updates, or removes ad group bid modifiers.
+	// Operation statuses are returned.
+	MutateAdGroupBidModifiers(context.Context, *MutateAdGroupBidModifiersRequest) (*MutateAdGroupBidModifiersResponse, error)
+}
+
+// UnimplementedAdGroupBidModifierServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupBidModifierServiceServer struct {
+}
+
+func (*UnimplementedAdGroupBidModifierServiceServer) GetAdGroupBidModifier(ctx context.Context, req *GetAdGroupBidModifierRequest) (*resources.AdGroupBidModifier, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdGroupBidModifier not implemented")
+}
+func (*UnimplementedAdGroupBidModifierServiceServer) MutateAdGroupBidModifiers(ctx context.Context, req *MutateAdGroupBidModifiersRequest) (*MutateAdGroupBidModifiersResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdGroupBidModifiers not implemented")
+}
+
+func RegisterAdGroupBidModifierServiceServer(s *grpc.Server, srv AdGroupBidModifierServiceServer) {
+	s.RegisterService(&_AdGroupBidModifierService_serviceDesc, srv)
+}
+
+func _AdGroupBidModifierService_GetAdGroupBidModifier_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupBidModifierRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupBidModifierServiceServer).GetAdGroupBidModifier(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupBidModifierService/GetAdGroupBidModifier",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupBidModifierServiceServer).GetAdGroupBidModifier(ctx, req.(*GetAdGroupBidModifierRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdGroupBidModifierService_MutateAdGroupBidModifiers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdGroupBidModifiersRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupBidModifierServiceServer).MutateAdGroupBidModifiers(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupBidModifierService/MutateAdGroupBidModifiers",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupBidModifierServiceServer).MutateAdGroupBidModifiers(ctx, req.(*MutateAdGroupBidModifiersRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupBidModifierService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupBidModifierService",
+	HandlerType: (*AdGroupBidModifierServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupBidModifier",
+			Handler:    _AdGroupBidModifierService_GetAdGroupBidModifier_Handler,
+		},
+		{
+			MethodName: "MutateAdGroupBidModifiers",
+			Handler:    _AdGroupBidModifierService_MutateAdGroupBidModifiers_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_bid_modifier_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_criterion_label_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_criterion_label_service.pb.go
new file mode 100644
index 0000000..c328598
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_criterion_label_service.pb.go
@@ -0,0 +1,505 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_criterion_label_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [AdGroupCriterionLabelService.GetAdGroupCriterionLabel][google.ads.googleads.v3.services.AdGroupCriterionLabelService.GetAdGroupCriterionLabel].
+type GetAdGroupCriterionLabelRequest struct {
+	// Required. The resource name of the ad group criterion label to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupCriterionLabelRequest) Reset()         { *m = GetAdGroupCriterionLabelRequest{} }
+func (m *GetAdGroupCriterionLabelRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupCriterionLabelRequest) ProtoMessage()    {}
+func (*GetAdGroupCriterionLabelRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f9d794cf6cbc5ec4, []int{0}
+}
+
+func (m *GetAdGroupCriterionLabelRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupCriterionLabelRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupCriterionLabelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupCriterionLabelRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupCriterionLabelRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupCriterionLabelRequest.Merge(m, src)
+}
+func (m *GetAdGroupCriterionLabelRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupCriterionLabelRequest.Size(m)
+}
+func (m *GetAdGroupCriterionLabelRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupCriterionLabelRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupCriterionLabelRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupCriterionLabelRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for
+// [AdGroupCriterionLabelService.MutateAdGroupCriterionLabels][google.ads.googleads.v3.services.AdGroupCriterionLabelService.MutateAdGroupCriterionLabels].
+type MutateAdGroupCriterionLabelsRequest struct {
+	// Required. ID of the customer whose ad group criterion labels are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on ad group criterion labels.
+	Operations []*AdGroupCriterionLabelOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupCriterionLabelsRequest) Reset()         { *m = MutateAdGroupCriterionLabelsRequest{} }
+func (m *MutateAdGroupCriterionLabelsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupCriterionLabelsRequest) ProtoMessage()    {}
+func (*MutateAdGroupCriterionLabelsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f9d794cf6cbc5ec4, []int{1}
+}
+
+func (m *MutateAdGroupCriterionLabelsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupCriterionLabelsRequest.Unmarshal(m, b)
+}
+func (m *MutateAdGroupCriterionLabelsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupCriterionLabelsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupCriterionLabelsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupCriterionLabelsRequest.Merge(m, src)
+}
+func (m *MutateAdGroupCriterionLabelsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupCriterionLabelsRequest.Size(m)
+}
+func (m *MutateAdGroupCriterionLabelsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupCriterionLabelsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupCriterionLabelsRequest proto.InternalMessageInfo
+
+func (m *MutateAdGroupCriterionLabelsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdGroupCriterionLabelsRequest) GetOperations() []*AdGroupCriterionLabelOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdGroupCriterionLabelsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdGroupCriterionLabelsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove) on an ad group criterion label.
+type AdGroupCriterionLabelOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdGroupCriterionLabelOperation_Create
+	//	*AdGroupCriterionLabelOperation_Remove
+	Operation            isAdGroupCriterionLabelOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
+	XXX_unrecognized     []byte                                     `json:"-"`
+	XXX_sizecache        int32                                      `json:"-"`
+}
+
+func (m *AdGroupCriterionLabelOperation) Reset()         { *m = AdGroupCriterionLabelOperation{} }
+func (m *AdGroupCriterionLabelOperation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterionLabelOperation) ProtoMessage()    {}
+func (*AdGroupCriterionLabelOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f9d794cf6cbc5ec4, []int{2}
+}
+
+func (m *AdGroupCriterionLabelOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterionLabelOperation.Unmarshal(m, b)
+}
+func (m *AdGroupCriterionLabelOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterionLabelOperation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterionLabelOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterionLabelOperation.Merge(m, src)
+}
+func (m *AdGroupCriterionLabelOperation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterionLabelOperation.Size(m)
+}
+func (m *AdGroupCriterionLabelOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterionLabelOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterionLabelOperation proto.InternalMessageInfo
+
+type isAdGroupCriterionLabelOperation_Operation interface {
+	isAdGroupCriterionLabelOperation_Operation()
+}
+
+type AdGroupCriterionLabelOperation_Create struct {
+	Create *resources.AdGroupCriterionLabel `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdGroupCriterionLabelOperation_Remove struct {
+	Remove string `protobuf:"bytes,2,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdGroupCriterionLabelOperation_Create) isAdGroupCriterionLabelOperation_Operation() {}
+
+func (*AdGroupCriterionLabelOperation_Remove) isAdGroupCriterionLabelOperation_Operation() {}
+
+func (m *AdGroupCriterionLabelOperation) GetOperation() isAdGroupCriterionLabelOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionLabelOperation) GetCreate() *resources.AdGroupCriterionLabel {
+	if x, ok := m.GetOperation().(*AdGroupCriterionLabelOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionLabelOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdGroupCriterionLabelOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupCriterionLabelOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupCriterionLabelOperation_Create)(nil),
+		(*AdGroupCriterionLabelOperation_Remove)(nil),
+	}
+}
+
+// Response message for an ad group criterion labels mutate.
+type MutateAdGroupCriterionLabelsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdGroupCriterionLabelResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
+	XXX_unrecognized     []byte                               `json:"-"`
+	XXX_sizecache        int32                                `json:"-"`
+}
+
+func (m *MutateAdGroupCriterionLabelsResponse) Reset()         { *m = MutateAdGroupCriterionLabelsResponse{} }
+func (m *MutateAdGroupCriterionLabelsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupCriterionLabelsResponse) ProtoMessage()    {}
+func (*MutateAdGroupCriterionLabelsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f9d794cf6cbc5ec4, []int{3}
+}
+
+func (m *MutateAdGroupCriterionLabelsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupCriterionLabelsResponse.Unmarshal(m, b)
+}
+func (m *MutateAdGroupCriterionLabelsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupCriterionLabelsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupCriterionLabelsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupCriterionLabelsResponse.Merge(m, src)
+}
+func (m *MutateAdGroupCriterionLabelsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupCriterionLabelsResponse.Size(m)
+}
+func (m *MutateAdGroupCriterionLabelsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupCriterionLabelsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupCriterionLabelsResponse proto.InternalMessageInfo
+
+func (m *MutateAdGroupCriterionLabelsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdGroupCriterionLabelsResponse) GetResults() []*MutateAdGroupCriterionLabelResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for an ad group criterion label mutate.
+type MutateAdGroupCriterionLabelResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupCriterionLabelResult) Reset()         { *m = MutateAdGroupCriterionLabelResult{} }
+func (m *MutateAdGroupCriterionLabelResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupCriterionLabelResult) ProtoMessage()    {}
+func (*MutateAdGroupCriterionLabelResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f9d794cf6cbc5ec4, []int{4}
+}
+
+func (m *MutateAdGroupCriterionLabelResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupCriterionLabelResult.Unmarshal(m, b)
+}
+func (m *MutateAdGroupCriterionLabelResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupCriterionLabelResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupCriterionLabelResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupCriterionLabelResult.Merge(m, src)
+}
+func (m *MutateAdGroupCriterionLabelResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupCriterionLabelResult.Size(m)
+}
+func (m *MutateAdGroupCriterionLabelResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupCriterionLabelResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupCriterionLabelResult proto.InternalMessageInfo
+
+func (m *MutateAdGroupCriterionLabelResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupCriterionLabelRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupCriterionLabelRequest")
+	proto.RegisterType((*MutateAdGroupCriterionLabelsRequest)(nil), "google.ads.googleads.v3.services.MutateAdGroupCriterionLabelsRequest")
+	proto.RegisterType((*AdGroupCriterionLabelOperation)(nil), "google.ads.googleads.v3.services.AdGroupCriterionLabelOperation")
+	proto.RegisterType((*MutateAdGroupCriterionLabelsResponse)(nil), "google.ads.googleads.v3.services.MutateAdGroupCriterionLabelsResponse")
+	proto.RegisterType((*MutateAdGroupCriterionLabelResult)(nil), "google.ads.googleads.v3.services.MutateAdGroupCriterionLabelResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_criterion_label_service.proto", fileDescriptor_f9d794cf6cbc5ec4)
+}
+
+var fileDescriptor_f9d794cf6cbc5ec4 = []byte{
+	// 725 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcb, 0x6a, 0xdb, 0x4c,
+	0x14, 0xfe, 0x25, 0x87, 0xfc, 0xcd, 0x38, 0x69, 0x61, 0x4a, 0x5b, 0xe1, 0x86, 0xc6, 0x51, 0x0c,
+	0x35, 0xa6, 0x48, 0x60, 0x6f, 0x82, 0x42, 0x20, 0x72, 0x48, 0x9c, 0xd2, 0x4b, 0x82, 0x02, 0x59,
+	0x14, 0x17, 0x31, 0x96, 0x26, 0xaa, 0x40, 0xd2, 0xa8, 0x33, 0x23, 0x43, 0x08, 0x81, 0xd2, 0x55,
+	0x57, 0xdd, 0x74, 0xd9, 0x5d, 0x97, 0x7d, 0x82, 0x3e, 0x43, 0xa0, 0xab, 0xee, 0xb2, 0xea, 0xa2,
+	0x9b, 0xf6, 0x29, 0x8a, 0x2e, 0xe3, 0x4b, 0xf0, 0x05, 0x9a, 0xdd, 0xf1, 0x39, 0x9f, 0xbe, 0xf3,
+	0x9d, 0xcb, 0x1c, 0x83, 0x8e, 0x47, 0x88, 0x17, 0x60, 0x1d, 0xb9, 0x4c, 0xcf, 0xcd, 0xd4, 0xea,
+	0xb7, 0x74, 0x86, 0x69, 0xdf, 0x77, 0x30, 0xd3, 0x91, 0x6b, 0x7b, 0x94, 0x24, 0xb1, 0xed, 0x50,
+	0x9f, 0x63, 0xea, 0x93, 0xc8, 0x0e, 0x50, 0x0f, 0x07, 0x76, 0x81, 0xd0, 0x62, 0x4a, 0x38, 0x81,
+	0xd5, 0xfc, 0x6b, 0x0d, 0xb9, 0x4c, 0x1b, 0x10, 0x69, 0xfd, 0x96, 0x26, 0x88, 0x2a, 0x3b, 0xd3,
+	0x52, 0x51, 0xcc, 0x48, 0x42, 0x67, 0xe5, 0xca, 0x73, 0x54, 0x56, 0x05, 0x43, 0xec, 0xeb, 0x28,
+	0x8a, 0x08, 0x47, 0xdc, 0x27, 0x11, 0x2b, 0xa2, 0x0f, 0x46, 0xa2, 0x4e, 0xe0, 0xe3, 0x88, 0x17,
+	0x81, 0xb5, 0x91, 0xc0, 0xa9, 0x8f, 0x03, 0xd7, 0xee, 0xe1, 0x37, 0xa8, 0xef, 0x13, 0x7a, 0xed,
+	0x4b, 0x1a, 0x3b, 0x3a, 0xe3, 0x88, 0x27, 0x05, 0xa5, 0xfa, 0x0c, 0xac, 0x75, 0x30, 0x37, 0xdd,
+	0x4e, 0x2a, 0x6a, 0x57, 0x68, 0x7a, 0x9e, 0x4a, 0xb2, 0xf0, 0xdb, 0x04, 0x33, 0x0e, 0xeb, 0x60,
+	0x45, 0xe8, 0xb7, 0x23, 0x14, 0x62, 0x45, 0xaa, 0x4a, 0xf5, 0xa5, 0x76, 0xe9, 0xa7, 0x29, 0x5b,
+	0xcb, 0x22, 0xf2, 0x12, 0x85, 0x58, 0x7d, 0x27, 0x83, 0x8d, 0x17, 0x09, 0x47, 0x1c, 0x4f, 0x24,
+	0x64, 0x82, 0xb1, 0x06, 0xca, 0x4e, 0xc2, 0x38, 0x09, 0x31, 0xb5, 0x7d, 0x77, 0x94, 0x0f, 0x08,
+	0xff, 0x53, 0x17, 0x62, 0x00, 0x48, 0x8c, 0x69, 0xde, 0x01, 0x45, 0xae, 0x96, 0xea, 0xe5, 0xe6,
+	0x8e, 0x36, 0x6f, 0x08, 0xda, 0xc4, 0xd4, 0x87, 0x82, 0xa8, 0x48, 0x33, 0x24, 0x86, 0x8f, 0xc1,
+	0x9d, 0x18, 0x51, 0xee, 0xa3, 0xc0, 0x3e, 0x45, 0x7e, 0x90, 0x50, 0xac, 0x94, 0xaa, 0x52, 0xfd,
+	0x96, 0x75, 0xbb, 0x70, 0xef, 0xe7, 0x5e, 0xb8, 0x01, 0x56, 0xfa, 0x28, 0xf0, 0x5d, 0xc4, 0xb1,
+	0x4d, 0xa2, 0xe0, 0x4c, 0x59, 0xc8, 0x60, 0xcb, 0xc2, 0x79, 0x18, 0x05, 0x67, 0xea, 0x67, 0x09,
+	0x3c, 0x9a, 0xad, 0x00, 0x5a, 0x60, 0xd1, 0xa1, 0x18, 0xf1, 0xbc, 0x91, 0xe5, 0xe6, 0xe6, 0xd4,
+	0x9a, 0x06, 0x6b, 0x33, 0xb9, 0xa8, 0x83, 0xff, 0xac, 0x82, 0x09, 0x2a, 0x60, 0x91, 0xe2, 0x90,
+	0xf4, 0xb1, 0x22, 0xa7, 0xcd, 0x4c, 0x23, 0xf9, 0xef, 0x76, 0x19, 0x2c, 0x0d, 0x8a, 0x55, 0xbf,
+	0x4b, 0xa0, 0x36, 0x7b, 0x40, 0x2c, 0x26, 0x11, 0xc3, 0x70, 0x1f, 0xdc, 0xbb, 0xd6, 0x14, 0x1b,
+	0x53, 0x4a, 0x68, 0xd6, 0x9a, 0x72, 0x13, 0x0a, 0xc9, 0x34, 0x76, 0xb4, 0xe3, 0x6c, 0x9f, 0xac,
+	0xbb, 0xe3, 0xed, 0xda, 0x4b, 0xe1, 0xf0, 0x35, 0xf8, 0x9f, 0x62, 0x96, 0x04, 0x5c, 0x0c, 0x70,
+	0x77, 0xfe, 0x00, 0x67, 0x08, 0xb4, 0x32, 0x2e, 0x4b, 0x70, 0xaa, 0x07, 0x60, 0x7d, 0x2e, 0x3a,
+	0x9d, 0xdb, 0x84, 0xfd, 0x1d, 0x5f, 0xdd, 0xe6, 0xb7, 0x05, 0xb0, 0x3a, 0x91, 0xe4, 0x38, 0x97,
+	0x05, 0x7f, 0x4b, 0x40, 0x99, 0xf6, 0x52, 0xa0, 0x39, 0xbf, 0xaa, 0x39, 0xaf, 0xac, 0xf2, 0xcf,
+	0x5b, 0xa0, 0x1e, 0x5d, 0x99, 0xe3, 0x05, 0xbe, 0xff, 0xf1, 0xeb, 0x93, 0x6c, 0xc0, 0xcd, 0xf4,
+	0xf2, 0x9c, 0x8f, 0x45, 0xb6, 0xc5, 0xf3, 0x62, 0x7a, 0x43, 0x47, 0x13, 0x57, 0x40, 0x6f, 0x5c,
+	0xc0, 0x8f, 0x32, 0x58, 0x9d, 0xb5, 0x26, 0x70, 0xef, 0x46, 0x53, 0x14, 0x77, 0xa0, 0xb2, 0x7f,
+	0x53, 0x9a, 0x7c, 0x5b, 0x55, 0xfb, 0xca, 0xbc, 0x3f, 0x72, 0x50, 0x9e, 0x0c, 0x5f, 0x77, 0xd6,
+	0x8a, 0x1d, 0x75, 0x2b, 0x6d, 0xc5, 0xb0, 0xf6, 0xf3, 0x11, 0xf0, 0x76, 0xe3, 0x62, 0x4a, 0x27,
+	0x8c, 0x30, 0xcb, 0x6d, 0x48, 0x8d, 0xca, 0xc3, 0x4b, 0x53, 0x19, 0xea, 0x2b, 0xac, 0xd8, 0x67,
+	0x9a, 0x43, 0xc2, 0xf6, 0x07, 0x19, 0xd4, 0x1c, 0x12, 0xce, 0xad, 0xa5, 0xbd, 0x3e, 0x6b, 0xc1,
+	0x8e, 0xd2, 0x73, 0x7c, 0x24, 0xbd, 0x3a, 0x28, 0x68, 0x3c, 0x12, 0xa0, 0xc8, 0xd3, 0x08, 0xf5,
+	0x74, 0x0f, 0x47, 0xd9, 0xb1, 0xd6, 0x87, 0x89, 0xa7, 0xff, 0x9b, 0x6d, 0x09, 0xe3, 0x8b, 0x5c,
+	0xea, 0x98, 0xe6, 0x57, 0xb9, 0xda, 0xc9, 0x09, 0x4d, 0x97, 0x69, 0xb9, 0x99, 0x5a, 0x27, 0x2d,
+	0xad, 0x48, 0xcc, 0x2e, 0x05, 0xa4, 0x6b, 0xba, 0xac, 0x3b, 0x80, 0x74, 0x4f, 0x5a, 0x5d, 0x01,
+	0xf9, 0x23, 0xd7, 0x72, 0xbf, 0x61, 0x98, 0x2e, 0x33, 0x8c, 0x01, 0xc8, 0x30, 0x4e, 0x5a, 0x86,
+	0x21, 0x60, 0xbd, 0xc5, 0x4c, 0x67, 0xeb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc5, 0x77, 0xe8,
+	0x94, 0x74, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupCriterionLabelServiceClient is the client API for AdGroupCriterionLabelService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupCriterionLabelServiceClient interface {
+	// Returns the requested ad group criterion label in full detail.
+	GetAdGroupCriterionLabel(ctx context.Context, in *GetAdGroupCriterionLabelRequest, opts ...grpc.CallOption) (*resources.AdGroupCriterionLabel, error)
+	// Creates and removes ad group criterion labels.
+	// Operation statuses are returned.
+	MutateAdGroupCriterionLabels(ctx context.Context, in *MutateAdGroupCriterionLabelsRequest, opts ...grpc.CallOption) (*MutateAdGroupCriterionLabelsResponse, error)
+}
+
+type adGroupCriterionLabelServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupCriterionLabelServiceClient(cc grpc.ClientConnInterface) AdGroupCriterionLabelServiceClient {
+	return &adGroupCriterionLabelServiceClient{cc}
+}
+
+func (c *adGroupCriterionLabelServiceClient) GetAdGroupCriterionLabel(ctx context.Context, in *GetAdGroupCriterionLabelRequest, opts ...grpc.CallOption) (*resources.AdGroupCriterionLabel, error) {
+	out := new(resources.AdGroupCriterionLabel)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupCriterionLabelService/GetAdGroupCriterionLabel", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adGroupCriterionLabelServiceClient) MutateAdGroupCriterionLabels(ctx context.Context, in *MutateAdGroupCriterionLabelsRequest, opts ...grpc.CallOption) (*MutateAdGroupCriterionLabelsResponse, error) {
+	out := new(MutateAdGroupCriterionLabelsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupCriterionLabelService/MutateAdGroupCriterionLabels", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupCriterionLabelServiceServer is the server API for AdGroupCriterionLabelService service.
+type AdGroupCriterionLabelServiceServer interface {
+	// Returns the requested ad group criterion label in full detail.
+	GetAdGroupCriterionLabel(context.Context, *GetAdGroupCriterionLabelRequest) (*resources.AdGroupCriterionLabel, error)
+	// Creates and removes ad group criterion labels.
+	// Operation statuses are returned.
+	MutateAdGroupCriterionLabels(context.Context, *MutateAdGroupCriterionLabelsRequest) (*MutateAdGroupCriterionLabelsResponse, error)
+}
+
+// UnimplementedAdGroupCriterionLabelServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupCriterionLabelServiceServer struct {
+}
+
+func (*UnimplementedAdGroupCriterionLabelServiceServer) GetAdGroupCriterionLabel(ctx context.Context, req *GetAdGroupCriterionLabelRequest) (*resources.AdGroupCriterionLabel, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdGroupCriterionLabel not implemented")
+}
+func (*UnimplementedAdGroupCriterionLabelServiceServer) MutateAdGroupCriterionLabels(ctx context.Context, req *MutateAdGroupCriterionLabelsRequest) (*MutateAdGroupCriterionLabelsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdGroupCriterionLabels not implemented")
+}
+
+func RegisterAdGroupCriterionLabelServiceServer(s *grpc.Server, srv AdGroupCriterionLabelServiceServer) {
+	s.RegisterService(&_AdGroupCriterionLabelService_serviceDesc, srv)
+}
+
+func _AdGroupCriterionLabelService_GetAdGroupCriterionLabel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupCriterionLabelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupCriterionLabelServiceServer).GetAdGroupCriterionLabel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupCriterionLabelService/GetAdGroupCriterionLabel",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupCriterionLabelServiceServer).GetAdGroupCriterionLabel(ctx, req.(*GetAdGroupCriterionLabelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdGroupCriterionLabelService_MutateAdGroupCriterionLabels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdGroupCriterionLabelsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupCriterionLabelServiceServer).MutateAdGroupCriterionLabels(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupCriterionLabelService/MutateAdGroupCriterionLabels",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupCriterionLabelServiceServer).MutateAdGroupCriterionLabels(ctx, req.(*MutateAdGroupCriterionLabelsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupCriterionLabelService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupCriterionLabelService",
+	HandlerType: (*AdGroupCriterionLabelServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupCriterionLabel",
+			Handler:    _AdGroupCriterionLabelService_GetAdGroupCriterionLabel_Handler,
+		},
+		{
+			MethodName: "MutateAdGroupCriterionLabels",
+			Handler:    _AdGroupCriterionLabelService_MutateAdGroupCriterionLabels_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_criterion_label_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_criterion_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_criterion_service.pb.go
new file mode 100644
index 0000000..27e100e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_criterion_service.pb.go
@@ -0,0 +1,550 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_criterion_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupCriterionService.GetAdGroupCriterion][google.ads.googleads.v3.services.AdGroupCriterionService.GetAdGroupCriterion].
+type GetAdGroupCriterionRequest struct {
+	// Required. The resource name of the criterion to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupCriterionRequest) Reset()         { *m = GetAdGroupCriterionRequest{} }
+func (m *GetAdGroupCriterionRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupCriterionRequest) ProtoMessage()    {}
+func (*GetAdGroupCriterionRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_112a602b3a19937a, []int{0}
+}
+
+func (m *GetAdGroupCriterionRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupCriterionRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupCriterionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupCriterionRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupCriterionRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupCriterionRequest.Merge(m, src)
+}
+func (m *GetAdGroupCriterionRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupCriterionRequest.Size(m)
+}
+func (m *GetAdGroupCriterionRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupCriterionRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupCriterionRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupCriterionRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AdGroupCriterionService.MutateAdGroupCriteria][google.ads.googleads.v3.services.AdGroupCriterionService.MutateAdGroupCriteria].
+type MutateAdGroupCriteriaRequest struct {
+	// Required. ID of the customer whose criteria are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual criteria.
+	Operations []*AdGroupCriterionOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupCriteriaRequest) Reset()         { *m = MutateAdGroupCriteriaRequest{} }
+func (m *MutateAdGroupCriteriaRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupCriteriaRequest) ProtoMessage()    {}
+func (*MutateAdGroupCriteriaRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_112a602b3a19937a, []int{1}
+}
+
+func (m *MutateAdGroupCriteriaRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupCriteriaRequest.Unmarshal(m, b)
+}
+func (m *MutateAdGroupCriteriaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupCriteriaRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupCriteriaRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupCriteriaRequest.Merge(m, src)
+}
+func (m *MutateAdGroupCriteriaRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupCriteriaRequest.Size(m)
+}
+func (m *MutateAdGroupCriteriaRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupCriteriaRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupCriteriaRequest proto.InternalMessageInfo
+
+func (m *MutateAdGroupCriteriaRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdGroupCriteriaRequest) GetOperations() []*AdGroupCriterionOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdGroupCriteriaRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdGroupCriteriaRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove, update) on an ad group criterion.
+type AdGroupCriterionOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The list of policy violation keys that should not cause a
+	// PolicyViolationError to be reported. Not all policy violations are
+	// exemptable, please refer to the is_exemptible field in the returned
+	// PolicyViolationError.
+	//
+	// Resources violating these polices will be saved, but will not be eligible
+	// to serve. They may begin serving at a later time due to a change in
+	// policies, re-review of the resource, or a change in advertiser
+	// certificates.
+	ExemptPolicyViolationKeys []*common.PolicyViolationKey `protobuf:"bytes,5,rep,name=exempt_policy_violation_keys,json=exemptPolicyViolationKeys,proto3" json:"exempt_policy_violation_keys,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdGroupCriterionOperation_Create
+	//	*AdGroupCriterionOperation_Update
+	//	*AdGroupCriterionOperation_Remove
+	Operation            isAdGroupCriterionOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
+	XXX_unrecognized     []byte                                `json:"-"`
+	XXX_sizecache        int32                                 `json:"-"`
+}
+
+func (m *AdGroupCriterionOperation) Reset()         { *m = AdGroupCriterionOperation{} }
+func (m *AdGroupCriterionOperation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupCriterionOperation) ProtoMessage()    {}
+func (*AdGroupCriterionOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_112a602b3a19937a, []int{2}
+}
+
+func (m *AdGroupCriterionOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupCriterionOperation.Unmarshal(m, b)
+}
+func (m *AdGroupCriterionOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupCriterionOperation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupCriterionOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupCriterionOperation.Merge(m, src)
+}
+func (m *AdGroupCriterionOperation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupCriterionOperation.Size(m)
+}
+func (m *AdGroupCriterionOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupCriterionOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupCriterionOperation proto.InternalMessageInfo
+
+func (m *AdGroupCriterionOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionOperation) GetExemptPolicyViolationKeys() []*common.PolicyViolationKey {
+	if m != nil {
+		return m.ExemptPolicyViolationKeys
+	}
+	return nil
+}
+
+type isAdGroupCriterionOperation_Operation interface {
+	isAdGroupCriterionOperation_Operation()
+}
+
+type AdGroupCriterionOperation_Create struct {
+	Create *resources.AdGroupCriterion `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdGroupCriterionOperation_Update struct {
+	Update *resources.AdGroupCriterion `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type AdGroupCriterionOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdGroupCriterionOperation_Create) isAdGroupCriterionOperation_Operation() {}
+
+func (*AdGroupCriterionOperation_Update) isAdGroupCriterionOperation_Operation() {}
+
+func (*AdGroupCriterionOperation_Remove) isAdGroupCriterionOperation_Operation() {}
+
+func (m *AdGroupCriterionOperation) GetOperation() isAdGroupCriterionOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionOperation) GetCreate() *resources.AdGroupCriterion {
+	if x, ok := m.GetOperation().(*AdGroupCriterionOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionOperation) GetUpdate() *resources.AdGroupCriterion {
+	if x, ok := m.GetOperation().(*AdGroupCriterionOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *AdGroupCriterionOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdGroupCriterionOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupCriterionOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupCriterionOperation_Create)(nil),
+		(*AdGroupCriterionOperation_Update)(nil),
+		(*AdGroupCriterionOperation_Remove)(nil),
+	}
+}
+
+// Response message for an ad group criterion mutate.
+type MutateAdGroupCriteriaResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdGroupCriterionResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *MutateAdGroupCriteriaResponse) Reset()         { *m = MutateAdGroupCriteriaResponse{} }
+func (m *MutateAdGroupCriteriaResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupCriteriaResponse) ProtoMessage()    {}
+func (*MutateAdGroupCriteriaResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_112a602b3a19937a, []int{3}
+}
+
+func (m *MutateAdGroupCriteriaResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupCriteriaResponse.Unmarshal(m, b)
+}
+func (m *MutateAdGroupCriteriaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupCriteriaResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupCriteriaResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupCriteriaResponse.Merge(m, src)
+}
+func (m *MutateAdGroupCriteriaResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupCriteriaResponse.Size(m)
+}
+func (m *MutateAdGroupCriteriaResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupCriteriaResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupCriteriaResponse proto.InternalMessageInfo
+
+func (m *MutateAdGroupCriteriaResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdGroupCriteriaResponse) GetResults() []*MutateAdGroupCriterionResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the criterion mutate.
+type MutateAdGroupCriterionResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupCriterionResult) Reset()         { *m = MutateAdGroupCriterionResult{} }
+func (m *MutateAdGroupCriterionResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupCriterionResult) ProtoMessage()    {}
+func (*MutateAdGroupCriterionResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_112a602b3a19937a, []int{4}
+}
+
+func (m *MutateAdGroupCriterionResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupCriterionResult.Unmarshal(m, b)
+}
+func (m *MutateAdGroupCriterionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupCriterionResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupCriterionResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupCriterionResult.Merge(m, src)
+}
+func (m *MutateAdGroupCriterionResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupCriterionResult.Size(m)
+}
+func (m *MutateAdGroupCriterionResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupCriterionResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupCriterionResult proto.InternalMessageInfo
+
+func (m *MutateAdGroupCriterionResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupCriterionRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupCriterionRequest")
+	proto.RegisterType((*MutateAdGroupCriteriaRequest)(nil), "google.ads.googleads.v3.services.MutateAdGroupCriteriaRequest")
+	proto.RegisterType((*AdGroupCriterionOperation)(nil), "google.ads.googleads.v3.services.AdGroupCriterionOperation")
+	proto.RegisterType((*MutateAdGroupCriteriaResponse)(nil), "google.ads.googleads.v3.services.MutateAdGroupCriteriaResponse")
+	proto.RegisterType((*MutateAdGroupCriterionResult)(nil), "google.ads.googleads.v3.services.MutateAdGroupCriterionResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_criterion_service.proto", fileDescriptor_112a602b3a19937a)
+}
+
+var fileDescriptor_112a602b3a19937a = []byte{
+	// 830 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x4f, 0x6f, 0xeb, 0x44,
+	0x10, 0xc7, 0xce, 0xa3, 0xd0, 0xcd, 0x7b, 0x20, 0xed, 0xd3, 0xe3, 0xb9, 0x21, 0x88, 0xc8, 0x54,
+	0x22, 0x0a, 0xc8, 0x16, 0x31, 0x17, 0x5c, 0x0a, 0x72, 0x2a, 0x92, 0x56, 0xa8, 0xb4, 0x72, 0xa5,
+	0xa8, 0x42, 0x91, 0xcc, 0xd6, 0xde, 0x06, 0xab, 0xb6, 0xd7, 0xec, 0xae, 0x23, 0xa2, 0xaa, 0x07,
+	0xe0, 0x1b, 0xc0, 0x37, 0xe0, 0xc8, 0xb7, 0xe0, 0xda, 0x6b, 0x6f, 0x3d, 0x71, 0xe0, 0xc4, 0x11,
+	0xf1, 0x01, 0x90, 0xbd, 0xde, 0xfc, 0x6b, 0xac, 0x48, 0x7d, 0xb7, 0xf1, 0xce, 0x6f, 0x7e, 0x33,
+	0xb3, 0xf3, 0xdb, 0x31, 0x70, 0xc6, 0x84, 0x8c, 0x23, 0x6c, 0xa2, 0x80, 0x99, 0xc2, 0xcc, 0xad,
+	0x89, 0x65, 0x32, 0x4c, 0x27, 0xa1, 0x8f, 0x99, 0x89, 0x02, 0x6f, 0x4c, 0x49, 0x96, 0x7a, 0x3e,
+	0x0d, 0x39, 0xa6, 0x21, 0x49, 0xbc, 0xd2, 0x67, 0xa4, 0x94, 0x70, 0x02, 0x5b, 0x22, 0xce, 0x40,
+	0x01, 0x33, 0x66, 0x14, 0xc6, 0xc4, 0x32, 0x24, 0x45, 0xe3, 0xa3, 0xaa, 0x24, 0x3e, 0x89, 0x63,
+	0x92, 0x98, 0x29, 0x89, 0x42, 0x7f, 0x2a, 0xe8, 0x1a, 0x76, 0x15, 0x98, 0x62, 0x46, 0x32, 0xba,
+	0xbe, 0xa4, 0x32, 0xb6, 0x29, 0x63, 0xd3, 0xd0, 0x44, 0x49, 0x42, 0x38, 0xe2, 0x21, 0x49, 0x58,
+	0xe9, 0x7d, 0xb9, 0xe0, 0xf5, 0xa3, 0x10, 0x27, 0xbc, 0x74, 0xbc, 0xbf, 0xe0, 0xb8, 0x0c, 0x71,
+	0x14, 0x78, 0x17, 0xf8, 0x7b, 0x34, 0x09, 0x09, 0x2d, 0x01, 0x65, 0x8b, 0x66, 0xf1, 0x75, 0x91,
+	0x5d, 0x96, 0xa8, 0x18, 0xb1, 0xab, 0x15, 0x6e, 0x9a, 0xfa, 0x26, 0xe3, 0x88, 0x67, 0x65, 0x52,
+	0xbd, 0x0f, 0x1a, 0x03, 0xcc, 0x9d, 0x60, 0x90, 0x17, 0x7c, 0x20, 0xeb, 0x75, 0xf1, 0x0f, 0x19,
+	0x66, 0x1c, 0xb6, 0xc1, 0x33, 0xd9, 0x96, 0x97, 0xa0, 0x18, 0x6b, 0x4a, 0x4b, 0x69, 0x6f, 0xf7,
+	0x6a, 0x7f, 0x39, 0xaa, 0xfb, 0x54, 0x7a, 0xbe, 0x41, 0x31, 0xd6, 0xff, 0x53, 0x40, 0xf3, 0x38,
+	0xe3, 0x88, 0xe3, 0x65, 0x2e, 0x24, 0xa9, 0x76, 0x41, 0xdd, 0xcf, 0x18, 0x27, 0x31, 0xa6, 0x5e,
+	0x18, 0x2c, 0x12, 0x01, 0x79, 0x7e, 0x14, 0xc0, 0xef, 0x00, 0x20, 0x29, 0xa6, 0xe2, 0x5e, 0x34,
+	0xb5, 0x55, 0x6b, 0xd7, 0xbb, 0x7b, 0xc6, 0xa6, 0x09, 0x1a, 0xab, 0xf5, 0x9f, 0x48, 0x8e, 0x32,
+	0xc3, 0x9c, 0x13, 0x7e, 0x08, 0xde, 0x4e, 0x11, 0xe5, 0x21, 0x8a, 0xbc, 0x4b, 0x14, 0x46, 0x19,
+	0xc5, 0x5a, 0xad, 0xa5, 0xb4, 0xdf, 0x74, 0xdf, 0x2a, 0x8f, 0xfb, 0xe2, 0x14, 0x7e, 0x00, 0x9e,
+	0x4d, 0x50, 0x14, 0x06, 0x88, 0x63, 0x8f, 0x24, 0xd1, 0x54, 0x7b, 0x52, 0xc0, 0x9e, 0xca, 0xc3,
+	0x93, 0x24, 0x9a, 0xea, 0xbf, 0xd6, 0xc0, 0x4e, 0x65, 0x72, 0xb8, 0x07, 0xea, 0x59, 0x5a, 0x10,
+	0xe4, 0xa3, 0x28, 0x08, 0xea, 0xdd, 0x86, 0x6c, 0x47, 0x4e, 0xcb, 0xe8, 0xe7, 0xd3, 0x3a, 0x46,
+	0xec, 0xca, 0x05, 0x02, 0x9e, 0xdb, 0x90, 0x81, 0x26, 0xfe, 0x11, 0xc7, 0x29, 0xf7, 0x84, 0xfe,
+	0xbc, 0x49, 0x48, 0xa2, 0x82, 0xd7, 0xbb, 0xc2, 0x53, 0xa6, 0xbd, 0x5e, 0x5c, 0x4e, 0xb7, 0xf2,
+	0x72, 0x84, 0x78, 0x8d, 0xd3, 0x22, 0x78, 0x28, 0x63, 0xbf, 0xc6, 0x53, 0x77, 0x47, 0xf0, 0x3e,
+	0xf4, 0x30, 0x78, 0x0c, 0xb6, 0x7c, 0x8a, 0x11, 0x17, 0x93, 0xae, 0x77, 0xad, 0x4a, 0xfa, 0x99,
+	0xdc, 0x1f, 0x5c, 0xfe, 0xe1, 0x6b, 0x6e, 0x49, 0x92, 0xd3, 0x89, 0x8e, 0x34, 0xf5, 0x95, 0xe8,
+	0x04, 0x09, 0xd4, 0xc0, 0x16, 0xc5, 0x31, 0x99, 0x88, 0x91, 0x6d, 0xe7, 0x1e, 0xf1, 0xdd, 0xab,
+	0x83, 0xed, 0xd9, 0x8c, 0xf5, 0x3f, 0x15, 0xf0, 0x5e, 0x85, 0x16, 0x59, 0x4a, 0x12, 0x86, 0x61,
+	0x1f, 0xbc, 0x58, 0x11, 0x81, 0x87, 0x29, 0x25, 0xb4, 0xe0, 0xad, 0x77, 0xa1, 0x2c, 0x93, 0xa6,
+	0xbe, 0x71, 0x56, 0x3c, 0x17, 0xf7, 0xf9, 0xb2, 0x3c, 0xbe, 0xca, 0xe1, 0xf0, 0x1c, 0xbc, 0x41,
+	0x31, 0xcb, 0x22, 0x2e, 0xb5, 0xfa, 0xc5, 0x66, 0xad, 0xae, 0xab, 0x2c, 0x7f, 0x71, 0x39, 0x8d,
+	0x2b, 0xe9, 0xf4, 0x83, 0xf5, 0xcf, 0x49, 0x02, 0x73, 0x75, 0xae, 0x79, 0x99, 0xcb, 0x8f, 0xb2,
+	0xfb, 0xd3, 0x13, 0xf0, 0x72, 0x35, 0xfe, 0x4c, 0xd4, 0x01, 0xef, 0x14, 0xf0, 0x7c, 0xcd, 0xcb,
+	0x87, 0x9f, 0x6f, 0xee, 0xa0, 0x7a, 0x61, 0x34, 0x1e, 0x33, 0x60, 0xfd, 0xe8, 0xde, 0x59, 0x6e,
+	0xe6, 0xe7, 0xbb, 0xbf, 0x7f, 0x53, 0x2d, 0xf8, 0x49, 0xbe, 0x56, 0xaf, 0x97, 0x3c, 0xfb, 0x72,
+	0x57, 0x30, 0xb3, 0x63, 0xa2, 0xe5, 0xe9, 0x9a, 0x9d, 0x1b, 0xf8, 0xaf, 0x02, 0x5e, 0xac, 0x1d,
+	0x3d, 0x7c, 0xe4, 0x64, 0xe4, 0xfe, 0x6a, 0x7c, 0xf9, 0xe8, 0x78, 0xa1, 0x39, 0xfd, 0xfc, 0xde,
+	0x79, 0x67, 0x61, 0x03, 0x7e, 0x3c, 0xdf, 0x49, 0x45, 0xbb, 0x9f, 0xe9, 0x9f, 0x16, 0xbf, 0x9c,
+	0x59, 0x7f, 0xd7, 0x0b, 0xe0, 0xfd, 0xce, 0xcd, 0x6a, 0xb7, 0x76, 0x5c, 0x64, 0xb3, 0x95, 0x4e,
+	0xe3, 0xdd, 0x5b, 0x47, 0x9b, 0x57, 0x54, 0x5a, 0x69, 0xc8, 0xf2, 0x15, 0xd0, 0xfb, 0x45, 0x05,
+	0xbb, 0x3e, 0x89, 0x37, 0x56, 0xdf, 0x6b, 0x56, 0x28, 0xe5, 0x34, 0x5f, 0x53, 0xa7, 0xca, 0xb7,
+	0x87, 0x25, 0xc3, 0x98, 0x44, 0x28, 0x19, 0x1b, 0x84, 0x8e, 0xcd, 0x31, 0x4e, 0x8a, 0x25, 0x66,
+	0xce, 0x73, 0x56, 0xff, 0xa9, 0xf7, 0xa4, 0xf1, 0xbb, 0x5a, 0x1b, 0x38, 0xce, 0x1f, 0x6a, 0x6b,
+	0x20, 0x08, 0x9d, 0x80, 0x19, 0xc2, 0xcc, 0xad, 0xa1, 0x65, 0x94, 0x89, 0xd9, 0xad, 0x84, 0x8c,
+	0x9c, 0x80, 0x8d, 0x66, 0x90, 0xd1, 0xd0, 0x1a, 0x49, 0xc8, 0x3f, 0xea, 0xae, 0x38, 0xb7, 0x6d,
+	0x27, 0x60, 0xb6, 0x3d, 0x03, 0xd9, 0xf6, 0xd0, 0xb2, 0x6d, 0x09, 0xbb, 0xd8, 0x2a, 0xea, 0xb4,
+	0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x94, 0x1c, 0x0a, 0xad, 0x50, 0x08, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupCriterionServiceClient is the client API for AdGroupCriterionService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupCriterionServiceClient interface {
+	// Returns the requested criterion in full detail.
+	GetAdGroupCriterion(ctx context.Context, in *GetAdGroupCriterionRequest, opts ...grpc.CallOption) (*resources.AdGroupCriterion, error)
+	// Creates, updates, or removes criteria. Operation statuses are returned.
+	MutateAdGroupCriteria(ctx context.Context, in *MutateAdGroupCriteriaRequest, opts ...grpc.CallOption) (*MutateAdGroupCriteriaResponse, error)
+}
+
+type adGroupCriterionServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupCriterionServiceClient(cc grpc.ClientConnInterface) AdGroupCriterionServiceClient {
+	return &adGroupCriterionServiceClient{cc}
+}
+
+func (c *adGroupCriterionServiceClient) GetAdGroupCriterion(ctx context.Context, in *GetAdGroupCriterionRequest, opts ...grpc.CallOption) (*resources.AdGroupCriterion, error) {
+	out := new(resources.AdGroupCriterion)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupCriterionService/GetAdGroupCriterion", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adGroupCriterionServiceClient) MutateAdGroupCriteria(ctx context.Context, in *MutateAdGroupCriteriaRequest, opts ...grpc.CallOption) (*MutateAdGroupCriteriaResponse, error) {
+	out := new(MutateAdGroupCriteriaResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupCriterionService/MutateAdGroupCriteria", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupCriterionServiceServer is the server API for AdGroupCriterionService service.
+type AdGroupCriterionServiceServer interface {
+	// Returns the requested criterion in full detail.
+	GetAdGroupCriterion(context.Context, *GetAdGroupCriterionRequest) (*resources.AdGroupCriterion, error)
+	// Creates, updates, or removes criteria. Operation statuses are returned.
+	MutateAdGroupCriteria(context.Context, *MutateAdGroupCriteriaRequest) (*MutateAdGroupCriteriaResponse, error)
+}
+
+// UnimplementedAdGroupCriterionServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupCriterionServiceServer struct {
+}
+
+func (*UnimplementedAdGroupCriterionServiceServer) GetAdGroupCriterion(ctx context.Context, req *GetAdGroupCriterionRequest) (*resources.AdGroupCriterion, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdGroupCriterion not implemented")
+}
+func (*UnimplementedAdGroupCriterionServiceServer) MutateAdGroupCriteria(ctx context.Context, req *MutateAdGroupCriteriaRequest) (*MutateAdGroupCriteriaResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdGroupCriteria not implemented")
+}
+
+func RegisterAdGroupCriterionServiceServer(s *grpc.Server, srv AdGroupCriterionServiceServer) {
+	s.RegisterService(&_AdGroupCriterionService_serviceDesc, srv)
+}
+
+func _AdGroupCriterionService_GetAdGroupCriterion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupCriterionRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupCriterionServiceServer).GetAdGroupCriterion(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupCriterionService/GetAdGroupCriterion",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupCriterionServiceServer).GetAdGroupCriterion(ctx, req.(*GetAdGroupCriterionRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdGroupCriterionService_MutateAdGroupCriteria_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdGroupCriteriaRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupCriterionServiceServer).MutateAdGroupCriteria(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupCriterionService/MutateAdGroupCriteria",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupCriterionServiceServer).MutateAdGroupCriteria(ctx, req.(*MutateAdGroupCriteriaRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupCriterionService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupCriterionService",
+	HandlerType: (*AdGroupCriterionServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupCriterion",
+			Handler:    _AdGroupCriterionService_GetAdGroupCriterion_Handler,
+		},
+		{
+			MethodName: "MutateAdGroupCriteria",
+			Handler:    _AdGroupCriterionService_MutateAdGroupCriteria_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_criterion_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_criterion_simulation_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_criterion_simulation_service.pb.go
new file mode 100644
index 0000000..5340880
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_criterion_simulation_service.pb.go
@@ -0,0 +1,191 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_criterion_simulation_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [AdGroupCriterionSimulationService.GetAdGroupCriterionSimulation][google.ads.googleads.v3.services.AdGroupCriterionSimulationService.GetAdGroupCriterionSimulation].
+type GetAdGroupCriterionSimulationRequest struct {
+	// Required. The resource name of the ad group criterion simulation to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupCriterionSimulationRequest) Reset()         { *m = GetAdGroupCriterionSimulationRequest{} }
+func (m *GetAdGroupCriterionSimulationRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupCriterionSimulationRequest) ProtoMessage()    {}
+func (*GetAdGroupCriterionSimulationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da600f48a422603f, []int{0}
+}
+
+func (m *GetAdGroupCriterionSimulationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupCriterionSimulationRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupCriterionSimulationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupCriterionSimulationRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupCriterionSimulationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupCriterionSimulationRequest.Merge(m, src)
+}
+func (m *GetAdGroupCriterionSimulationRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupCriterionSimulationRequest.Size(m)
+}
+func (m *GetAdGroupCriterionSimulationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupCriterionSimulationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupCriterionSimulationRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupCriterionSimulationRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupCriterionSimulationRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupCriterionSimulationRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_criterion_simulation_service.proto", fileDescriptor_da600f48a422603f)
+}
+
+var fileDescriptor_da600f48a422603f = []byte{
+	// 425 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xb1, 0x8b, 0xd4, 0x40,
+	0x14, 0xc6, 0xd9, 0x1c, 0x08, 0x06, 0x6d, 0xd2, 0x78, 0x44, 0xc5, 0xf5, 0x58, 0xe4, 0xb8, 0x62,
+	0x06, 0x4c, 0x37, 0xb2, 0xc8, 0xac, 0x68, 0x2c, 0x44, 0x96, 0x3b, 0xdc, 0x42, 0x02, 0x61, 0x2e,
+	0x33, 0xc6, 0x81, 0x24, 0x13, 0xe7, 0x4d, 0xd2, 0x88, 0x8d, 0xbd, 0x95, 0xff, 0x81, 0xa5, 0x7f,
+	0x85, 0xf5, 0xb5, 0x76, 0x56, 0x16, 0x56, 0xfe, 0x0f, 0x82, 0x24, 0x93, 0xc9, 0xdd, 0x16, 0x31,
+	0x76, 0x1f, 0xf9, 0x3e, 0x7e, 0xdf, 0xcb, 0x7b, 0x89, 0xff, 0x22, 0x57, 0x2a, 0x2f, 0x04, 0x66,
+	0x1c, 0xb0, 0x95, 0x9d, 0x6a, 0x23, 0x0c, 0x42, 0xb7, 0x32, 0x13, 0x80, 0x19, 0x4f, 0x73, 0xad,
+	0x9a, 0x3a, 0xcd, 0xb4, 0x34, 0x42, 0x4b, 0x55, 0xa5, 0x20, 0xcb, 0xa6, 0x60, 0xa6, 0x97, 0x36,
+	0x86, 0x6a, 0xad, 0x8c, 0x0a, 0x96, 0x16, 0x81, 0x18, 0x07, 0x34, 0xd2, 0x50, 0x1b, 0x21, 0x47,
+	0x0b, 0x9f, 0x4e, 0xf5, 0x69, 0x01, 0xaa, 0xd1, 0xb3, 0x85, 0xb6, 0x28, 0xbc, 0xe3, 0x30, 0xb5,
+	0xc4, 0xac, 0xaa, 0x94, 0xe9, 0x4d, 0x18, 0xdc, 0x5b, 0x57, 0xdc, 0xac, 0x90, 0xa2, 0x32, 0x83,
+	0x71, 0xef, 0x8a, 0xf1, 0x46, 0x8a, 0x82, 0xa7, 0xe7, 0xe2, 0x2d, 0x6b, 0xa5, 0xd2, 0x36, 0x70,
+	0xb4, 0xf5, 0x57, 0xb1, 0x30, 0x94, 0xc7, 0xdd, 0x00, 0x4f, 0x5c, 0xff, 0xd9, 0x58, 0x7f, 0x2a,
+	0xde, 0x35, 0x02, 0x4c, 0x70, 0xec, 0xdf, 0x74, 0x03, 0xa7, 0x15, 0x2b, 0xc5, 0xe1, 0x62, 0xb9,
+	0x38, 0xbe, 0xbe, 0x39, 0xf8, 0x49, 0xbd, 0xd3, 0x1b, 0xce, 0x79, 0xc9, 0x4a, 0xf1, 0xf0, 0x9b,
+	0xe7, 0xdf, 0x9f, 0xe6, 0x9d, 0xd9, 0xbd, 0x04, 0x7f, 0x16, 0xfe, 0xdd, 0x7f, 0x16, 0x07, 0xcf,
+	0xd0, 0xdc, 0x6e, 0xd1, 0xff, 0x4c, 0x1e, 0xae, 0x27, 0x39, 0xe3, 0x05, 0xd0, 0x34, 0xe5, 0xe8,
+	0xd5, 0x0f, 0xba, 0xff, 0xe6, 0x1f, 0xbf, 0xff, 0xfa, 0xec, 0x3d, 0x0e, 0xd6, 0xdd, 0x0d, 0xdf,
+	0xef, 0x39, 0xeb, 0xac, 0x01, 0xa3, 0x4a, 0xa1, 0x01, 0x9f, 0x60, 0x36, 0x89, 0x04, 0x7c, 0xf2,
+	0x21, 0xbc, 0x7d, 0x41, 0x0f, 0x2f, 0x87, 0x19, 0x54, 0x2d, 0x01, 0x65, 0xaa, 0xdc, 0x7c, 0xf2,
+	0xfc, 0x55, 0xa6, 0xca, 0xd9, 0x05, 0x6c, 0x1e, 0xcc, 0x2e, 0x7a, 0xdb, 0x5d, 0x79, 0xbb, 0x78,
+	0xfd, 0x7c, 0x60, 0xe5, 0xaa, 0x60, 0x55, 0x8e, 0x94, 0xce, 0x71, 0x2e, 0xaa, 0xfe, 0x1b, 0xc0,
+	0x97, 0xed, 0xd3, 0x7f, 0xc5, 0x23, 0x27, 0xbe, 0x78, 0x07, 0x31, 0xa5, 0x5f, 0xbd, 0x65, 0x6c,
+	0x81, 0x94, 0x03, 0xb2, 0xb2, 0x53, 0xbb, 0x08, 0x0d, 0xc5, 0x70, 0xe1, 0x22, 0x09, 0xe5, 0x90,
+	0x8c, 0x91, 0x64, 0x17, 0x25, 0x2e, 0xf2, 0xdb, 0x5b, 0xd9, 0xe7, 0x84, 0x50, 0x0e, 0x84, 0x8c,
+	0x21, 0x42, 0x76, 0x11, 0x21, 0x2e, 0x76, 0x7e, 0xad, 0x9f, 0x33, 0xfa, 0x1b, 0x00, 0x00, 0xff,
+	0xff, 0x6b, 0x09, 0x38, 0x11, 0xbc, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupCriterionSimulationServiceClient is the client API for AdGroupCriterionSimulationService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupCriterionSimulationServiceClient interface {
+	// Returns the requested ad group criterion simulation in full detail.
+	GetAdGroupCriterionSimulation(ctx context.Context, in *GetAdGroupCriterionSimulationRequest, opts ...grpc.CallOption) (*resources.AdGroupCriterionSimulation, error)
+}
+
+type adGroupCriterionSimulationServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupCriterionSimulationServiceClient(cc grpc.ClientConnInterface) AdGroupCriterionSimulationServiceClient {
+	return &adGroupCriterionSimulationServiceClient{cc}
+}
+
+func (c *adGroupCriterionSimulationServiceClient) GetAdGroupCriterionSimulation(ctx context.Context, in *GetAdGroupCriterionSimulationRequest, opts ...grpc.CallOption) (*resources.AdGroupCriterionSimulation, error) {
+	out := new(resources.AdGroupCriterionSimulation)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupCriterionSimulationService/GetAdGroupCriterionSimulation", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupCriterionSimulationServiceServer is the server API for AdGroupCriterionSimulationService service.
+type AdGroupCriterionSimulationServiceServer interface {
+	// Returns the requested ad group criterion simulation in full detail.
+	GetAdGroupCriterionSimulation(context.Context, *GetAdGroupCriterionSimulationRequest) (*resources.AdGroupCriterionSimulation, error)
+}
+
+// UnimplementedAdGroupCriterionSimulationServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupCriterionSimulationServiceServer struct {
+}
+
+func (*UnimplementedAdGroupCriterionSimulationServiceServer) GetAdGroupCriterionSimulation(ctx context.Context, req *GetAdGroupCriterionSimulationRequest) (*resources.AdGroupCriterionSimulation, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAdGroupCriterionSimulation not implemented")
+}
+
+func RegisterAdGroupCriterionSimulationServiceServer(s *grpc.Server, srv AdGroupCriterionSimulationServiceServer) {
+	s.RegisterService(&_AdGroupCriterionSimulationService_serviceDesc, srv)
+}
+
+func _AdGroupCriterionSimulationService_GetAdGroupCriterionSimulation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupCriterionSimulationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupCriterionSimulationServiceServer).GetAdGroupCriterionSimulation(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupCriterionSimulationService/GetAdGroupCriterionSimulation",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupCriterionSimulationServiceServer).GetAdGroupCriterionSimulation(ctx, req.(*GetAdGroupCriterionSimulationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupCriterionSimulationService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupCriterionSimulationService",
+	HandlerType: (*AdGroupCriterionSimulationServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupCriterionSimulation",
+			Handler:    _AdGroupCriterionSimulationService_GetAdGroupCriterionSimulation_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_criterion_simulation_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_extension_setting_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_extension_setting_service.pb.go
new file mode 100644
index 0000000..c14b633
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_extension_setting_service.pb.go
@@ -0,0 +1,537 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_extension_setting_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [AdGroupExtensionSettingService.GetAdGroupExtensionSetting][google.ads.googleads.v3.services.AdGroupExtensionSettingService.GetAdGroupExtensionSetting].
+type GetAdGroupExtensionSettingRequest struct {
+	// Required. The resource name of the ad group extension setting to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupExtensionSettingRequest) Reset()         { *m = GetAdGroupExtensionSettingRequest{} }
+func (m *GetAdGroupExtensionSettingRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupExtensionSettingRequest) ProtoMessage()    {}
+func (*GetAdGroupExtensionSettingRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1e62529bec79772a, []int{0}
+}
+
+func (m *GetAdGroupExtensionSettingRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupExtensionSettingRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupExtensionSettingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupExtensionSettingRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupExtensionSettingRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupExtensionSettingRequest.Merge(m, src)
+}
+func (m *GetAdGroupExtensionSettingRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupExtensionSettingRequest.Size(m)
+}
+func (m *GetAdGroupExtensionSettingRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupExtensionSettingRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupExtensionSettingRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupExtensionSettingRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for
+// [AdGroupExtensionSettingService.MutateAdGroupExtensionSettings][google.ads.googleads.v3.services.AdGroupExtensionSettingService.MutateAdGroupExtensionSettings].
+type MutateAdGroupExtensionSettingsRequest struct {
+	// Required. The ID of the customer whose ad group extension settings are being
+	// modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual ad group extension
+	// settings.
+	Operations []*AdGroupExtensionSettingOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupExtensionSettingsRequest) Reset()         { *m = MutateAdGroupExtensionSettingsRequest{} }
+func (m *MutateAdGroupExtensionSettingsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupExtensionSettingsRequest) ProtoMessage()    {}
+func (*MutateAdGroupExtensionSettingsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1e62529bec79772a, []int{1}
+}
+
+func (m *MutateAdGroupExtensionSettingsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupExtensionSettingsRequest.Unmarshal(m, b)
+}
+func (m *MutateAdGroupExtensionSettingsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupExtensionSettingsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupExtensionSettingsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupExtensionSettingsRequest.Merge(m, src)
+}
+func (m *MutateAdGroupExtensionSettingsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupExtensionSettingsRequest.Size(m)
+}
+func (m *MutateAdGroupExtensionSettingsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupExtensionSettingsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupExtensionSettingsRequest proto.InternalMessageInfo
+
+func (m *MutateAdGroupExtensionSettingsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdGroupExtensionSettingsRequest) GetOperations() []*AdGroupExtensionSettingOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdGroupExtensionSettingsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdGroupExtensionSettingsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on an ad group extension setting.
+type AdGroupExtensionSettingOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdGroupExtensionSettingOperation_Create
+	//	*AdGroupExtensionSettingOperation_Update
+	//	*AdGroupExtensionSettingOperation_Remove
+	Operation            isAdGroupExtensionSettingOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                     `json:"-"`
+	XXX_unrecognized     []byte                                       `json:"-"`
+	XXX_sizecache        int32                                        `json:"-"`
+}
+
+func (m *AdGroupExtensionSettingOperation) Reset()         { *m = AdGroupExtensionSettingOperation{} }
+func (m *AdGroupExtensionSettingOperation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupExtensionSettingOperation) ProtoMessage()    {}
+func (*AdGroupExtensionSettingOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1e62529bec79772a, []int{2}
+}
+
+func (m *AdGroupExtensionSettingOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupExtensionSettingOperation.Unmarshal(m, b)
+}
+func (m *AdGroupExtensionSettingOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupExtensionSettingOperation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupExtensionSettingOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupExtensionSettingOperation.Merge(m, src)
+}
+func (m *AdGroupExtensionSettingOperation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupExtensionSettingOperation.Size(m)
+}
+func (m *AdGroupExtensionSettingOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupExtensionSettingOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupExtensionSettingOperation proto.InternalMessageInfo
+
+func (m *AdGroupExtensionSettingOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isAdGroupExtensionSettingOperation_Operation interface {
+	isAdGroupExtensionSettingOperation_Operation()
+}
+
+type AdGroupExtensionSettingOperation_Create struct {
+	Create *resources.AdGroupExtensionSetting `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdGroupExtensionSettingOperation_Update struct {
+	Update *resources.AdGroupExtensionSetting `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type AdGroupExtensionSettingOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdGroupExtensionSettingOperation_Create) isAdGroupExtensionSettingOperation_Operation() {}
+
+func (*AdGroupExtensionSettingOperation_Update) isAdGroupExtensionSettingOperation_Operation() {}
+
+func (*AdGroupExtensionSettingOperation_Remove) isAdGroupExtensionSettingOperation_Operation() {}
+
+func (m *AdGroupExtensionSettingOperation) GetOperation() isAdGroupExtensionSettingOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdGroupExtensionSettingOperation) GetCreate() *resources.AdGroupExtensionSetting {
+	if x, ok := m.GetOperation().(*AdGroupExtensionSettingOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdGroupExtensionSettingOperation) GetUpdate() *resources.AdGroupExtensionSetting {
+	if x, ok := m.GetOperation().(*AdGroupExtensionSettingOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *AdGroupExtensionSettingOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdGroupExtensionSettingOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupExtensionSettingOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupExtensionSettingOperation_Create)(nil),
+		(*AdGroupExtensionSettingOperation_Update)(nil),
+		(*AdGroupExtensionSettingOperation_Remove)(nil),
+	}
+}
+
+// Response message for an ad group extension setting mutate.
+type MutateAdGroupExtensionSettingsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdGroupExtensionSettingResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *MutateAdGroupExtensionSettingsResponse) Reset() {
+	*m = MutateAdGroupExtensionSettingsResponse{}
+}
+func (m *MutateAdGroupExtensionSettingsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupExtensionSettingsResponse) ProtoMessage()    {}
+func (*MutateAdGroupExtensionSettingsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1e62529bec79772a, []int{3}
+}
+
+func (m *MutateAdGroupExtensionSettingsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupExtensionSettingsResponse.Unmarshal(m, b)
+}
+func (m *MutateAdGroupExtensionSettingsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupExtensionSettingsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupExtensionSettingsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupExtensionSettingsResponse.Merge(m, src)
+}
+func (m *MutateAdGroupExtensionSettingsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupExtensionSettingsResponse.Size(m)
+}
+func (m *MutateAdGroupExtensionSettingsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupExtensionSettingsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupExtensionSettingsResponse proto.InternalMessageInfo
+
+func (m *MutateAdGroupExtensionSettingsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdGroupExtensionSettingsResponse) GetResults() []*MutateAdGroupExtensionSettingResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the ad group extension setting mutate.
+type MutateAdGroupExtensionSettingResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupExtensionSettingResult) Reset()         { *m = MutateAdGroupExtensionSettingResult{} }
+func (m *MutateAdGroupExtensionSettingResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupExtensionSettingResult) ProtoMessage()    {}
+func (*MutateAdGroupExtensionSettingResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1e62529bec79772a, []int{4}
+}
+
+func (m *MutateAdGroupExtensionSettingResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupExtensionSettingResult.Unmarshal(m, b)
+}
+func (m *MutateAdGroupExtensionSettingResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupExtensionSettingResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupExtensionSettingResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupExtensionSettingResult.Merge(m, src)
+}
+func (m *MutateAdGroupExtensionSettingResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupExtensionSettingResult.Size(m)
+}
+func (m *MutateAdGroupExtensionSettingResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupExtensionSettingResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupExtensionSettingResult proto.InternalMessageInfo
+
+func (m *MutateAdGroupExtensionSettingResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupExtensionSettingRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupExtensionSettingRequest")
+	proto.RegisterType((*MutateAdGroupExtensionSettingsRequest)(nil), "google.ads.googleads.v3.services.MutateAdGroupExtensionSettingsRequest")
+	proto.RegisterType((*AdGroupExtensionSettingOperation)(nil), "google.ads.googleads.v3.services.AdGroupExtensionSettingOperation")
+	proto.RegisterType((*MutateAdGroupExtensionSettingsResponse)(nil), "google.ads.googleads.v3.services.MutateAdGroupExtensionSettingsResponse")
+	proto.RegisterType((*MutateAdGroupExtensionSettingResult)(nil), "google.ads.googleads.v3.services.MutateAdGroupExtensionSettingResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_extension_setting_service.proto", fileDescriptor_1e62529bec79772a)
+}
+
+var fileDescriptor_1e62529bec79772a = []byte{
+	// 776 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x4d, 0x6f, 0xd3, 0x4a,
+	0x14, 0x7d, 0x71, 0xaa, 0xbe, 0xd7, 0x49, 0xfb, 0x90, 0x06, 0x01, 0x51, 0x40, 0x25, 0xb8, 0x05,
+	0xa2, 0x08, 0xd9, 0x52, 0xb2, 0x73, 0xe9, 0xc2, 0x41, 0x6d, 0x5a, 0xa4, 0xd2, 0xca, 0x45, 0x5d,
+	0xa0, 0x48, 0xd6, 0xd4, 0x9e, 0x1a, 0xab, 0xb6, 0xc7, 0xcc, 0x8c, 0x23, 0xaa, 0xaa, 0x1b, 0xc4,
+	0x8a, 0x2d, 0x12, 0x3f, 0x80, 0x25, 0x4b, 0x7e, 0x46, 0x77, 0x88, 0x5d, 0x57, 0x2c, 0x58, 0xb1,
+	0xe3, 0x1f, 0x20, 0x7b, 0x3c, 0xf9, 0xa8, 0x70, 0x8c, 0x54, 0x76, 0xd7, 0x73, 0x4f, 0xce, 0xb9,
+	0x73, 0xef, 0x99, 0x1b, 0xb0, 0xed, 0x11, 0xe2, 0x05, 0x58, 0x47, 0x2e, 0xd3, 0x45, 0x98, 0x46,
+	0xc3, 0xae, 0xce, 0x30, 0x1d, 0xfa, 0x0e, 0x66, 0x3a, 0x72, 0x6d, 0x8f, 0x92, 0x24, 0xb6, 0xf1,
+	0x6b, 0x8e, 0x23, 0xe6, 0x93, 0xc8, 0x66, 0x98, 0x73, 0x3f, 0xf2, 0xec, 0x1c, 0xa3, 0xc5, 0x94,
+	0x70, 0x02, 0x9b, 0xe2, 0xf7, 0x1a, 0x72, 0x99, 0x36, 0xa2, 0xd2, 0x86, 0x5d, 0x4d, 0x52, 0x35,
+	0x7a, 0x45, 0x62, 0x14, 0x33, 0x92, 0xd0, 0xd9, 0x6a, 0x42, 0xa5, 0x71, 0x47, 0x72, 0xc4, 0xbe,
+	0x8e, 0xa2, 0x88, 0x70, 0xc4, 0x7d, 0x12, 0xb1, 0x3c, 0x7b, 0x6b, 0x22, 0xeb, 0x04, 0x3e, 0x8e,
+	0x78, 0x9e, 0xb8, 0x3b, 0x91, 0x38, 0xf2, 0x71, 0xe0, 0xda, 0x87, 0xf8, 0x25, 0x1a, 0xfa, 0x84,
+	0xe6, 0x80, 0xbc, 0x7a, 0x3d, 0xfb, 0x3a, 0x4c, 0x8e, 0x72, 0x54, 0x88, 0xd8, 0xf1, 0x25, 0x6e,
+	0x1a, 0x3b, 0x3a, 0xe3, 0x88, 0x27, 0xb9, 0xa8, 0xba, 0x03, 0xee, 0xf5, 0x31, 0x37, 0xdd, 0x7e,
+	0x5a, 0xf8, 0x86, 0xac, 0x7b, 0x5f, 0x94, 0x6d, 0xe1, 0x57, 0x09, 0x66, 0x1c, 0xb6, 0xc0, 0x92,
+	0xbc, 0xa5, 0x1d, 0xa1, 0x10, 0xd7, 0x2b, 0xcd, 0x4a, 0x6b, 0xa1, 0x57, 0xfd, 0x66, 0x2a, 0xd6,
+	0xa2, 0xcc, 0x3c, 0x43, 0x21, 0x56, 0xdf, 0x2a, 0xe0, 0xfe, 0x4e, 0xc2, 0x11, 0xc7, 0x05, 0x94,
+	0x4c, 0x72, 0xae, 0x82, 0x9a, 0x93, 0x30, 0x4e, 0x42, 0x4c, 0x6d, 0xdf, 0x9d, 0x64, 0x04, 0xf2,
+	0x7c, 0xdb, 0x85, 0x1e, 0x00, 0x24, 0xc6, 0x54, 0xf4, 0xa9, 0xae, 0x34, 0xab, 0xad, 0x5a, 0xa7,
+	0xa7, 0x95, 0x0d, 0x4b, 0x2b, 0x10, 0xdf, 0x95, 0x54, 0xb9, 0xd0, 0x98, 0x1a, 0x3e, 0x04, 0xd7,
+	0x62, 0x44, 0xb9, 0x8f, 0x02, 0xfb, 0x08, 0xf9, 0x41, 0x42, 0x71, 0xbd, 0xda, 0xac, 0xb4, 0xfe,
+	0xb3, 0xfe, 0xcf, 0x8f, 0x37, 0xc5, 0x29, 0x5c, 0x01, 0x4b, 0x43, 0x14, 0xf8, 0x2e, 0xe2, 0xd8,
+	0x26, 0x51, 0x70, 0x52, 0x9f, 0xcb, 0x60, 0x8b, 0xf2, 0x70, 0x37, 0x0a, 0x4e, 0xd4, 0xcf, 0x0a,
+	0x68, 0x96, 0xd5, 0x00, 0xd7, 0x40, 0x2d, 0x89, 0x33, 0x9e, 0x74, 0x50, 0x19, 0x4f, 0xad, 0xd3,
+	0x90, 0x97, 0x93, 0xb3, 0xd4, 0x36, 0xd3, 0x59, 0xee, 0x20, 0x76, 0x6c, 0x01, 0x01, 0x4f, 0x63,
+	0xf8, 0x1c, 0xcc, 0x3b, 0x14, 0x23, 0x2e, 0x66, 0x51, 0xeb, 0x18, 0x85, 0x4d, 0x19, 0xf9, 0xb3,
+	0xa8, 0x2b, 0x5b, 0xff, 0x58, 0x39, 0x57, 0xca, 0x2a, 0x34, 0xea, 0xca, 0xdf, 0x60, 0x15, 0x5c,
+	0xb0, 0x0e, 0xe6, 0x29, 0x0e, 0xc9, 0x50, 0xb4, 0x74, 0x21, 0xcd, 0x88, 0xef, 0x5e, 0x0d, 0x2c,
+	0x8c, 0x66, 0xa0, 0x7e, 0xa9, 0x80, 0x07, 0x65, 0xde, 0x61, 0x31, 0x89, 0x18, 0x86, 0x9b, 0xe0,
+	0xc6, 0xa5, 0x69, 0xd9, 0x98, 0x52, 0x42, 0x33, 0x81, 0x5a, 0x07, 0xca, 0xb2, 0x69, 0xec, 0x68,
+	0xfb, 0x99, 0xdd, 0xad, 0xeb, 0xd3, 0x73, 0xdc, 0x48, 0xe1, 0xd0, 0x06, 0xff, 0x52, 0xcc, 0x92,
+	0x80, 0x4b, 0x6f, 0x6d, 0x94, 0x7b, 0x6b, 0x66, 0x89, 0x56, 0xc6, 0x66, 0x49, 0x56, 0xf5, 0x29,
+	0x58, 0xf9, 0x03, 0x7c, 0x6a, 0xaa, 0xdf, 0x3c, 0xb0, 0xe9, 0xb7, 0xd5, 0x39, 0x9f, 0x03, 0xcb,
+	0x05, 0x34, 0xfb, 0xa2, 0x38, 0xf8, 0xb3, 0x02, 0x1a, 0xc5, 0xcf, 0x19, 0x3e, 0x29, 0xbf, 0x5d,
+	0xe9, 0x32, 0x68, 0x5c, 0xc1, 0x13, 0xaa, 0x75, 0x61, 0x4e, 0x5f, 0xf4, 0xcd, 0xd7, 0xef, 0xef,
+	0x95, 0xc7, 0xd0, 0x48, 0x17, 0xe9, 0xe9, 0x54, 0x66, 0x5d, 0x6e, 0x01, 0xa6, 0xb7, 0x75, 0x54,
+	0x60, 0x08, 0xbd, 0x7d, 0x06, 0x3f, 0x28, 0x60, 0x79, 0xb6, 0x6d, 0x60, 0xff, 0x8a, 0x53, 0x95,
+	0x4b, 0xab, 0xb1, 0x75, 0x75, 0x22, 0xe1, 0x60, 0x15, 0x5d, 0x98, 0x37, 0x27, 0xf6, 0xdf, 0xa3,
+	0xf1, 0x2a, 0xca, 0x5a, 0xd2, 0x53, 0xd7, 0xd3, 0x96, 0x8c, 0x7b, 0x70, 0x3a, 0x01, 0x5e, 0x6f,
+	0x9f, 0x15, 0x76, 0xc4, 0x08, 0x33, 0x7d, 0xa3, 0xd2, 0x6e, 0xdc, 0x3e, 0x37, 0xeb, 0xe3, 0x1a,
+	0xf3, 0x28, 0xf6, 0x99, 0xe6, 0x90, 0xb0, 0xf7, 0x4e, 0x01, 0xab, 0x0e, 0x09, 0x4b, 0xef, 0xd3,
+	0x5b, 0x99, 0x6d, 0xb9, 0xbd, 0x74, 0x4d, 0xed, 0x55, 0x5e, 0x6c, 0xe5, 0x44, 0x1e, 0x09, 0x50,
+	0xe4, 0x69, 0x84, 0x7a, 0xba, 0x87, 0xa3, 0x6c, 0x89, 0xe9, 0x63, 0xe9, 0xe2, 0xbf, 0xea, 0x35,
+	0x19, 0x7c, 0x54, 0xaa, 0x7d, 0xd3, 0xfc, 0xa4, 0x34, 0xfb, 0x82, 0xd0, 0x74, 0x99, 0x26, 0xc2,
+	0x34, 0x3a, 0xe8, 0x6a, 0xb9, 0x30, 0x3b, 0x97, 0x90, 0x81, 0xe9, 0xb2, 0xc1, 0x08, 0x32, 0x38,
+	0xe8, 0x0e, 0x24, 0xe4, 0x87, 0xb2, 0x2a, 0xce, 0x0d, 0xc3, 0x74, 0x99, 0x61, 0x8c, 0x40, 0x86,
+	0x71, 0xd0, 0x35, 0x0c, 0x09, 0x3b, 0x9c, 0xcf, 0xea, 0xec, 0xfe, 0x0a, 0x00, 0x00, 0xff, 0xff,
+	0xe9, 0xaf, 0x15, 0x5d, 0x51, 0x08, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupExtensionSettingServiceClient is the client API for AdGroupExtensionSettingService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupExtensionSettingServiceClient interface {
+	// Returns the requested ad group extension setting in full detail.
+	GetAdGroupExtensionSetting(ctx context.Context, in *GetAdGroupExtensionSettingRequest, opts ...grpc.CallOption) (*resources.AdGroupExtensionSetting, error)
+	// Creates, updates, or removes ad group extension settings. Operation
+	// statuses are returned.
+	MutateAdGroupExtensionSettings(ctx context.Context, in *MutateAdGroupExtensionSettingsRequest, opts ...grpc.CallOption) (*MutateAdGroupExtensionSettingsResponse, error)
+}
+
+type adGroupExtensionSettingServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupExtensionSettingServiceClient(cc grpc.ClientConnInterface) AdGroupExtensionSettingServiceClient {
+	return &adGroupExtensionSettingServiceClient{cc}
+}
+
+func (c *adGroupExtensionSettingServiceClient) GetAdGroupExtensionSetting(ctx context.Context, in *GetAdGroupExtensionSettingRequest, opts ...grpc.CallOption) (*resources.AdGroupExtensionSetting, error) {
+	out := new(resources.AdGroupExtensionSetting)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupExtensionSettingService/GetAdGroupExtensionSetting", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adGroupExtensionSettingServiceClient) MutateAdGroupExtensionSettings(ctx context.Context, in *MutateAdGroupExtensionSettingsRequest, opts ...grpc.CallOption) (*MutateAdGroupExtensionSettingsResponse, error) {
+	out := new(MutateAdGroupExtensionSettingsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupExtensionSettingService/MutateAdGroupExtensionSettings", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupExtensionSettingServiceServer is the server API for AdGroupExtensionSettingService service.
+type AdGroupExtensionSettingServiceServer interface {
+	// Returns the requested ad group extension setting in full detail.
+	GetAdGroupExtensionSetting(context.Context, *GetAdGroupExtensionSettingRequest) (*resources.AdGroupExtensionSetting, error)
+	// Creates, updates, or removes ad group extension settings. Operation
+	// statuses are returned.
+	MutateAdGroupExtensionSettings(context.Context, *MutateAdGroupExtensionSettingsRequest) (*MutateAdGroupExtensionSettingsResponse, error)
+}
+
+// UnimplementedAdGroupExtensionSettingServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupExtensionSettingServiceServer struct {
+}
+
+func (*UnimplementedAdGroupExtensionSettingServiceServer) GetAdGroupExtensionSetting(ctx context.Context, req *GetAdGroupExtensionSettingRequest) (*resources.AdGroupExtensionSetting, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdGroupExtensionSetting not implemented")
+}
+func (*UnimplementedAdGroupExtensionSettingServiceServer) MutateAdGroupExtensionSettings(ctx context.Context, req *MutateAdGroupExtensionSettingsRequest) (*MutateAdGroupExtensionSettingsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdGroupExtensionSettings not implemented")
+}
+
+func RegisterAdGroupExtensionSettingServiceServer(s *grpc.Server, srv AdGroupExtensionSettingServiceServer) {
+	s.RegisterService(&_AdGroupExtensionSettingService_serviceDesc, srv)
+}
+
+func _AdGroupExtensionSettingService_GetAdGroupExtensionSetting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupExtensionSettingRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupExtensionSettingServiceServer).GetAdGroupExtensionSetting(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupExtensionSettingService/GetAdGroupExtensionSetting",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupExtensionSettingServiceServer).GetAdGroupExtensionSetting(ctx, req.(*GetAdGroupExtensionSettingRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdGroupExtensionSettingService_MutateAdGroupExtensionSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdGroupExtensionSettingsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupExtensionSettingServiceServer).MutateAdGroupExtensionSettings(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupExtensionSettingService/MutateAdGroupExtensionSettings",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupExtensionSettingServiceServer).MutateAdGroupExtensionSettings(ctx, req.(*MutateAdGroupExtensionSettingsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupExtensionSettingService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupExtensionSettingService",
+	HandlerType: (*AdGroupExtensionSettingServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupExtensionSetting",
+			Handler:    _AdGroupExtensionSettingService_GetAdGroupExtensionSetting_Handler,
+		},
+		{
+			MethodName: "MutateAdGroupExtensionSettings",
+			Handler:    _AdGroupExtensionSettingService_MutateAdGroupExtensionSettings_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_extension_setting_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_feed_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_feed_service.pb.go
new file mode 100644
index 0000000..5761420
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_feed_service.pb.go
@@ -0,0 +1,530 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_feed_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupFeedService.GetAdGroupFeed][google.ads.googleads.v3.services.AdGroupFeedService.GetAdGroupFeed].
+type GetAdGroupFeedRequest struct {
+	// Required. The resource name of the ad group feed to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupFeedRequest) Reset()         { *m = GetAdGroupFeedRequest{} }
+func (m *GetAdGroupFeedRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupFeedRequest) ProtoMessage()    {}
+func (*GetAdGroupFeedRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4c9cbcec5e3a4ac2, []int{0}
+}
+
+func (m *GetAdGroupFeedRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupFeedRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupFeedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupFeedRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupFeedRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupFeedRequest.Merge(m, src)
+}
+func (m *GetAdGroupFeedRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupFeedRequest.Size(m)
+}
+func (m *GetAdGroupFeedRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupFeedRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupFeedRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupFeedRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AdGroupFeedService.MutateAdGroupFeeds][google.ads.googleads.v3.services.AdGroupFeedService.MutateAdGroupFeeds].
+type MutateAdGroupFeedsRequest struct {
+	// Required. The ID of the customer whose ad group feeds are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual ad group feeds.
+	Operations []*AdGroupFeedOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupFeedsRequest) Reset()         { *m = MutateAdGroupFeedsRequest{} }
+func (m *MutateAdGroupFeedsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupFeedsRequest) ProtoMessage()    {}
+func (*MutateAdGroupFeedsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4c9cbcec5e3a4ac2, []int{1}
+}
+
+func (m *MutateAdGroupFeedsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupFeedsRequest.Unmarshal(m, b)
+}
+func (m *MutateAdGroupFeedsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupFeedsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupFeedsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupFeedsRequest.Merge(m, src)
+}
+func (m *MutateAdGroupFeedsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupFeedsRequest.Size(m)
+}
+func (m *MutateAdGroupFeedsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupFeedsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupFeedsRequest proto.InternalMessageInfo
+
+func (m *MutateAdGroupFeedsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdGroupFeedsRequest) GetOperations() []*AdGroupFeedOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdGroupFeedsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdGroupFeedsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on an ad group feed.
+type AdGroupFeedOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdGroupFeedOperation_Create
+	//	*AdGroupFeedOperation_Update
+	//	*AdGroupFeedOperation_Remove
+	Operation            isAdGroupFeedOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *AdGroupFeedOperation) Reset()         { *m = AdGroupFeedOperation{} }
+func (m *AdGroupFeedOperation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupFeedOperation) ProtoMessage()    {}
+func (*AdGroupFeedOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4c9cbcec5e3a4ac2, []int{2}
+}
+
+func (m *AdGroupFeedOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupFeedOperation.Unmarshal(m, b)
+}
+func (m *AdGroupFeedOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupFeedOperation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupFeedOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupFeedOperation.Merge(m, src)
+}
+func (m *AdGroupFeedOperation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupFeedOperation.Size(m)
+}
+func (m *AdGroupFeedOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupFeedOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupFeedOperation proto.InternalMessageInfo
+
+func (m *AdGroupFeedOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isAdGroupFeedOperation_Operation interface {
+	isAdGroupFeedOperation_Operation()
+}
+
+type AdGroupFeedOperation_Create struct {
+	Create *resources.AdGroupFeed `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdGroupFeedOperation_Update struct {
+	Update *resources.AdGroupFeed `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type AdGroupFeedOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdGroupFeedOperation_Create) isAdGroupFeedOperation_Operation() {}
+
+func (*AdGroupFeedOperation_Update) isAdGroupFeedOperation_Operation() {}
+
+func (*AdGroupFeedOperation_Remove) isAdGroupFeedOperation_Operation() {}
+
+func (m *AdGroupFeedOperation) GetOperation() isAdGroupFeedOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdGroupFeedOperation) GetCreate() *resources.AdGroupFeed {
+	if x, ok := m.GetOperation().(*AdGroupFeedOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdGroupFeedOperation) GetUpdate() *resources.AdGroupFeed {
+	if x, ok := m.GetOperation().(*AdGroupFeedOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *AdGroupFeedOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdGroupFeedOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupFeedOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupFeedOperation_Create)(nil),
+		(*AdGroupFeedOperation_Update)(nil),
+		(*AdGroupFeedOperation_Remove)(nil),
+	}
+}
+
+// Response message for an ad group feed mutate.
+type MutateAdGroupFeedsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdGroupFeedResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *MutateAdGroupFeedsResponse) Reset()         { *m = MutateAdGroupFeedsResponse{} }
+func (m *MutateAdGroupFeedsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupFeedsResponse) ProtoMessage()    {}
+func (*MutateAdGroupFeedsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4c9cbcec5e3a4ac2, []int{3}
+}
+
+func (m *MutateAdGroupFeedsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupFeedsResponse.Unmarshal(m, b)
+}
+func (m *MutateAdGroupFeedsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupFeedsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupFeedsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupFeedsResponse.Merge(m, src)
+}
+func (m *MutateAdGroupFeedsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupFeedsResponse.Size(m)
+}
+func (m *MutateAdGroupFeedsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupFeedsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupFeedsResponse proto.InternalMessageInfo
+
+func (m *MutateAdGroupFeedsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdGroupFeedsResponse) GetResults() []*MutateAdGroupFeedResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the ad group feed mutate.
+type MutateAdGroupFeedResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupFeedResult) Reset()         { *m = MutateAdGroupFeedResult{} }
+func (m *MutateAdGroupFeedResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupFeedResult) ProtoMessage()    {}
+func (*MutateAdGroupFeedResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4c9cbcec5e3a4ac2, []int{4}
+}
+
+func (m *MutateAdGroupFeedResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupFeedResult.Unmarshal(m, b)
+}
+func (m *MutateAdGroupFeedResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupFeedResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupFeedResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupFeedResult.Merge(m, src)
+}
+func (m *MutateAdGroupFeedResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupFeedResult.Size(m)
+}
+func (m *MutateAdGroupFeedResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupFeedResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupFeedResult proto.InternalMessageInfo
+
+func (m *MutateAdGroupFeedResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupFeedRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupFeedRequest")
+	proto.RegisterType((*MutateAdGroupFeedsRequest)(nil), "google.ads.googleads.v3.services.MutateAdGroupFeedsRequest")
+	proto.RegisterType((*AdGroupFeedOperation)(nil), "google.ads.googleads.v3.services.AdGroupFeedOperation")
+	proto.RegisterType((*MutateAdGroupFeedsResponse)(nil), "google.ads.googleads.v3.services.MutateAdGroupFeedsResponse")
+	proto.RegisterType((*MutateAdGroupFeedResult)(nil), "google.ads.googleads.v3.services.MutateAdGroupFeedResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_feed_service.proto", fileDescriptor_4c9cbcec5e3a4ac2)
+}
+
+var fileDescriptor_4c9cbcec5e3a4ac2 = []byte{
+	// 760 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xbf, 0x6e, 0xd3, 0x40,
+	0x18, 0xc7, 0x0e, 0x2a, 0xf4, 0xd2, 0x16, 0xe9, 0xa0, 0x34, 0x04, 0x24, 0x22, 0x53, 0x89, 0x28,
+	0x42, 0x36, 0x24, 0xa2, 0x08, 0xb7, 0x45, 0x72, 0x24, 0x92, 0x32, 0x94, 0x56, 0xae, 0xe8, 0x00,
+	0x91, 0xac, 0xab, 0x7d, 0x09, 0x56, 0x6d, 0x9f, 0xb9, 0xb3, 0x23, 0x55, 0x55, 0x17, 0x1e, 0x80,
+	0x85, 0x37, 0x60, 0xe4, 0x0d, 0x18, 0x59, 0xbb, 0xb2, 0x75, 0x40, 0x0c, 0x88, 0x01, 0xf1, 0x0c,
+	0x08, 0xd9, 0xe7, 0x4b, 0x9c, 0x26, 0x51, 0x44, 0xb7, 0xcf, 0xf7, 0xfd, 0x7e, 0xbf, 0xef, 0xef,
+	0x9d, 0xc1, 0x46, 0x8f, 0x90, 0x9e, 0x87, 0x35, 0xe4, 0x30, 0x8d, 0x9b, 0x89, 0xd5, 0x6f, 0x68,
+	0x0c, 0xd3, 0xbe, 0x6b, 0x63, 0xa6, 0x21, 0xc7, 0xea, 0x51, 0x12, 0x87, 0x56, 0x17, 0x63, 0xc7,
+	0xca, 0x8e, 0xd5, 0x90, 0x92, 0x88, 0xc0, 0x0a, 0xa7, 0xa8, 0xc8, 0x61, 0xea, 0x80, 0xad, 0xf6,
+	0x1b, 0xaa, 0x60, 0x97, 0x1f, 0x4f, 0xd3, 0xa7, 0x98, 0x91, 0x98, 0x8e, 0x05, 0xe0, 0xc2, 0xe5,
+	0x3b, 0x82, 0x16, 0xba, 0x1a, 0x0a, 0x02, 0x12, 0xa1, 0xc8, 0x25, 0x01, 0xcb, 0xbc, 0x2b, 0x39,
+	0xaf, 0xed, 0xb9, 0x38, 0x88, 0x32, 0xc7, 0xdd, 0x9c, 0xa3, 0xeb, 0x62, 0xcf, 0xb1, 0x0e, 0xf0,
+	0x5b, 0xd4, 0x77, 0x09, 0xcd, 0x00, 0x59, 0xc2, 0x5a, 0xfa, 0x75, 0x10, 0x77, 0x33, 0x94, 0x8f,
+	0xd8, 0xe1, 0x39, 0x6d, 0x1a, 0xda, 0x1a, 0x8b, 0x50, 0x14, 0x67, 0x41, 0x15, 0x03, 0x2c, 0xb7,
+	0x71, 0x64, 0x38, 0xed, 0x24, 0xd7, 0x16, 0xc6, 0x8e, 0x89, 0xdf, 0xc5, 0x98, 0x45, 0xb0, 0x0a,
+	0x16, 0x45, 0x31, 0x56, 0x80, 0x7c, 0x5c, 0x92, 0x2a, 0x52, 0x75, 0xbe, 0x59, 0xf8, 0x61, 0xc8,
+	0xe6, 0x82, 0xf0, 0xbc, 0x44, 0x3e, 0x56, 0xfe, 0x48, 0xe0, 0xd6, 0x76, 0x1c, 0xa1, 0x08, 0xe7,
+	0x64, 0x98, 0xd0, 0x59, 0x05, 0x45, 0x3b, 0x66, 0x11, 0xf1, 0x31, 0xb5, 0x5c, 0x27, 0xaf, 0x02,
+	0xc4, 0xf9, 0x0b, 0x07, 0xbe, 0x01, 0x80, 0x84, 0x98, 0xf2, 0x7e, 0x94, 0xe4, 0x4a, 0xa1, 0x5a,
+	0xac, 0xaf, 0xa9, 0xb3, 0xe6, 0xa0, 0xe6, 0x02, 0xee, 0x08, 0x7a, 0x26, 0x3e, 0x94, 0x83, 0xf7,
+	0xc1, 0xb5, 0x10, 0xd1, 0xc8, 0x45, 0x9e, 0xd5, 0x45, 0xae, 0x17, 0x53, 0x5c, 0x2a, 0x54, 0xa4,
+	0xea, 0x55, 0x73, 0x29, 0x3b, 0x6e, 0xf1, 0x53, 0x78, 0x0f, 0x2c, 0xf6, 0x91, 0xe7, 0x3a, 0x28,
+	0xc2, 0x16, 0x09, 0xbc, 0xa3, 0xd2, 0xe5, 0x14, 0xb6, 0x20, 0x0e, 0x77, 0x02, 0xef, 0x48, 0xf9,
+	0x20, 0x83, 0x1b, 0x93, 0xe2, 0xc2, 0x75, 0x50, 0x8c, 0xc3, 0x94, 0x9b, 0x34, 0x3e, 0xe5, 0x16,
+	0xeb, 0x65, 0x51, 0x84, 0x98, 0x8d, 0xda, 0x4a, 0x66, 0xb3, 0x8d, 0xd8, 0xa1, 0x09, 0x38, 0x3c,
+	0xb1, 0xe1, 0x16, 0x98, 0xb3, 0x29, 0x46, 0x11, 0xef, 0x73, 0xb1, 0xae, 0x4e, 0x2d, 0x7e, 0xb0,
+	0x62, 0xf9, 0xea, 0xb7, 0x2e, 0x99, 0x19, 0x3f, 0x51, 0xe2, 0xba, 0x25, 0xf9, 0xa2, 0x4a, 0x9c,
+	0x0f, 0x4b, 0x60, 0x8e, 0x62, 0x9f, 0xf4, 0x79, 0xbb, 0xe6, 0x13, 0x0f, 0xff, 0x6e, 0x16, 0xc1,
+	0xfc, 0xa0, 0xbf, 0xca, 0x17, 0x09, 0x94, 0x27, 0xcd, 0x9f, 0x85, 0x24, 0x60, 0x18, 0xb6, 0xc0,
+	0xf2, 0xb9, 0xee, 0x5b, 0x98, 0x52, 0x42, 0x53, 0xd1, 0x62, 0x1d, 0x8a, 0xf4, 0x68, 0x68, 0xab,
+	0x7b, 0xe9, 0x6a, 0x9a, 0xd7, 0x47, 0xe7, 0xf2, 0x3c, 0x81, 0xc3, 0x3d, 0x70, 0x85, 0x62, 0x16,
+	0x7b, 0x91, 0xd8, 0x8f, 0xa7, 0xb3, 0xf7, 0x63, 0x2c, 0x2d, 0x33, 0x55, 0x30, 0x85, 0x92, 0xf2,
+	0x0c, 0xac, 0x4c, 0xc1, 0x24, 0xcb, 0x30, 0xe1, 0x02, 0x8c, 0xee, 0x7e, 0xfd, 0x7b, 0x01, 0xc0,
+	0x1c, 0x75, 0x8f, 0x07, 0x86, 0x5f, 0x25, 0xb0, 0x34, 0x7a, 0xad, 0xe0, 0x93, 0xd9, 0xd9, 0x4e,
+	0xbc, 0x88, 0xe5, 0xff, 0x9c, 0x9f, 0xd2, 0x3a, 0x33, 0x46, 0x13, 0x7f, 0xff, 0xed, 0xe7, 0x47,
+	0xf9, 0x21, 0x54, 0x93, 0xf7, 0xe9, 0x78, 0xc4, 0xb3, 0x29, 0x6e, 0x20, 0xd3, 0x6a, 0x1a, 0xca,
+	0x0d, 0x4f, 0xab, 0x9d, 0xc0, 0x5f, 0x12, 0x80, 0xe3, 0x63, 0x85, 0xeb, 0x17, 0xe8, 0xba, 0x78,
+	0x0c, 0xca, 0x1b, 0x17, 0x23, 0xf3, 0x4d, 0x52, 0x5e, 0x9d, 0x19, 0x37, 0x73, 0x6f, 0xc9, 0x83,
+	0xe1, 0x15, 0x4f, 0x4b, 0x5c, 0x53, 0x1e, 0x25, 0x25, 0x0e, 0x6b, 0x3a, 0xce, 0x81, 0x37, 0x6b,
+	0x27, 0x23, 0x15, 0xea, 0x7e, 0x1a, 0x47, 0x97, 0x6a, 0xe5, 0xdb, 0xa7, 0x46, 0x69, 0x98, 0x4b,
+	0x66, 0x85, 0x2e, 0x53, 0x6d, 0xe2, 0x37, 0xff, 0x4a, 0x60, 0xd5, 0x26, 0xfe, 0xcc, 0xbc, 0x9b,
+	0x2b, 0xe3, 0x6b, 0xb0, 0x9b, 0x5c, 0xf9, 0x5d, 0xe9, 0xf5, 0x56, 0x46, 0xee, 0x11, 0x0f, 0x05,
+	0x3d, 0x95, 0xd0, 0x9e, 0xd6, 0xc3, 0x41, 0xfa, 0x20, 0x68, 0xc3, 0x70, 0xd3, 0x7f, 0x56, 0xeb,
+	0xc2, 0xf8, 0x24, 0x17, 0xda, 0x86, 0xf1, 0x59, 0xae, 0xb4, 0xb9, 0xa0, 0xe1, 0x30, 0x95, 0x9b,
+	0x89, 0xb5, 0xdf, 0x50, 0xb3, 0xc0, 0xec, 0x54, 0x40, 0x3a, 0x86, 0xc3, 0x3a, 0x03, 0x48, 0x67,
+	0xbf, 0xd1, 0x11, 0x90, 0xdf, 0xf2, 0x2a, 0x3f, 0xd7, 0x75, 0xc3, 0x61, 0xba, 0x3e, 0x00, 0xe9,
+	0xfa, 0x7e, 0x43, 0xd7, 0x05, 0xec, 0x60, 0x2e, 0xcd, 0xb3, 0xf1, 0x2f, 0x00, 0x00, 0xff, 0xff,
+	0x4e, 0x99, 0x27, 0xaa, 0x53, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupFeedServiceClient is the client API for AdGroupFeedService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupFeedServiceClient interface {
+	// Returns the requested ad group feed in full detail.
+	GetAdGroupFeed(ctx context.Context, in *GetAdGroupFeedRequest, opts ...grpc.CallOption) (*resources.AdGroupFeed, error)
+	// Creates, updates, or removes ad group feeds. Operation statuses are
+	// returned.
+	MutateAdGroupFeeds(ctx context.Context, in *MutateAdGroupFeedsRequest, opts ...grpc.CallOption) (*MutateAdGroupFeedsResponse, error)
+}
+
+type adGroupFeedServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupFeedServiceClient(cc grpc.ClientConnInterface) AdGroupFeedServiceClient {
+	return &adGroupFeedServiceClient{cc}
+}
+
+func (c *adGroupFeedServiceClient) GetAdGroupFeed(ctx context.Context, in *GetAdGroupFeedRequest, opts ...grpc.CallOption) (*resources.AdGroupFeed, error) {
+	out := new(resources.AdGroupFeed)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupFeedService/GetAdGroupFeed", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adGroupFeedServiceClient) MutateAdGroupFeeds(ctx context.Context, in *MutateAdGroupFeedsRequest, opts ...grpc.CallOption) (*MutateAdGroupFeedsResponse, error) {
+	out := new(MutateAdGroupFeedsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupFeedService/MutateAdGroupFeeds", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupFeedServiceServer is the server API for AdGroupFeedService service.
+type AdGroupFeedServiceServer interface {
+	// Returns the requested ad group feed in full detail.
+	GetAdGroupFeed(context.Context, *GetAdGroupFeedRequest) (*resources.AdGroupFeed, error)
+	// Creates, updates, or removes ad group feeds. Operation statuses are
+	// returned.
+	MutateAdGroupFeeds(context.Context, *MutateAdGroupFeedsRequest) (*MutateAdGroupFeedsResponse, error)
+}
+
+// UnimplementedAdGroupFeedServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupFeedServiceServer struct {
+}
+
+func (*UnimplementedAdGroupFeedServiceServer) GetAdGroupFeed(ctx context.Context, req *GetAdGroupFeedRequest) (*resources.AdGroupFeed, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdGroupFeed not implemented")
+}
+func (*UnimplementedAdGroupFeedServiceServer) MutateAdGroupFeeds(ctx context.Context, req *MutateAdGroupFeedsRequest) (*MutateAdGroupFeedsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdGroupFeeds not implemented")
+}
+
+func RegisterAdGroupFeedServiceServer(s *grpc.Server, srv AdGroupFeedServiceServer) {
+	s.RegisterService(&_AdGroupFeedService_serviceDesc, srv)
+}
+
+func _AdGroupFeedService_GetAdGroupFeed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupFeedRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupFeedServiceServer).GetAdGroupFeed(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupFeedService/GetAdGroupFeed",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupFeedServiceServer).GetAdGroupFeed(ctx, req.(*GetAdGroupFeedRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdGroupFeedService_MutateAdGroupFeeds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdGroupFeedsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupFeedServiceServer).MutateAdGroupFeeds(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupFeedService/MutateAdGroupFeeds",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupFeedServiceServer).MutateAdGroupFeeds(ctx, req.(*MutateAdGroupFeedsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupFeedService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupFeedService",
+	HandlerType: (*AdGroupFeedServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupFeed",
+			Handler:    _AdGroupFeedService_GetAdGroupFeed_Handler,
+		},
+		{
+			MethodName: "MutateAdGroupFeeds",
+			Handler:    _AdGroupFeedService_MutateAdGroupFeeds_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_feed_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_label_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_label_service.pb.go
new file mode 100644
index 0000000..3dd2d5b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_label_service.pb.go
@@ -0,0 +1,502 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_label_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupLabelService.GetAdGroupLabel][google.ads.googleads.v3.services.AdGroupLabelService.GetAdGroupLabel].
+type GetAdGroupLabelRequest struct {
+	// Required. The resource name of the ad group label to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupLabelRequest) Reset()         { *m = GetAdGroupLabelRequest{} }
+func (m *GetAdGroupLabelRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupLabelRequest) ProtoMessage()    {}
+func (*GetAdGroupLabelRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7054d11c8a405fc3, []int{0}
+}
+
+func (m *GetAdGroupLabelRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupLabelRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupLabelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupLabelRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupLabelRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupLabelRequest.Merge(m, src)
+}
+func (m *GetAdGroupLabelRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupLabelRequest.Size(m)
+}
+func (m *GetAdGroupLabelRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupLabelRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupLabelRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupLabelRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AdGroupLabelService.MutateAdGroupLabels][google.ads.googleads.v3.services.AdGroupLabelService.MutateAdGroupLabels].
+type MutateAdGroupLabelsRequest struct {
+	// Required. ID of the customer whose ad group labels are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on ad group labels.
+	Operations []*AdGroupLabelOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupLabelsRequest) Reset()         { *m = MutateAdGroupLabelsRequest{} }
+func (m *MutateAdGroupLabelsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupLabelsRequest) ProtoMessage()    {}
+func (*MutateAdGroupLabelsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7054d11c8a405fc3, []int{1}
+}
+
+func (m *MutateAdGroupLabelsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupLabelsRequest.Unmarshal(m, b)
+}
+func (m *MutateAdGroupLabelsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupLabelsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupLabelsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupLabelsRequest.Merge(m, src)
+}
+func (m *MutateAdGroupLabelsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupLabelsRequest.Size(m)
+}
+func (m *MutateAdGroupLabelsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupLabelsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupLabelsRequest proto.InternalMessageInfo
+
+func (m *MutateAdGroupLabelsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdGroupLabelsRequest) GetOperations() []*AdGroupLabelOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdGroupLabelsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdGroupLabelsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove) on an ad group label.
+type AdGroupLabelOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdGroupLabelOperation_Create
+	//	*AdGroupLabelOperation_Remove
+	Operation            isAdGroupLabelOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *AdGroupLabelOperation) Reset()         { *m = AdGroupLabelOperation{} }
+func (m *AdGroupLabelOperation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupLabelOperation) ProtoMessage()    {}
+func (*AdGroupLabelOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7054d11c8a405fc3, []int{2}
+}
+
+func (m *AdGroupLabelOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupLabelOperation.Unmarshal(m, b)
+}
+func (m *AdGroupLabelOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupLabelOperation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupLabelOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupLabelOperation.Merge(m, src)
+}
+func (m *AdGroupLabelOperation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupLabelOperation.Size(m)
+}
+func (m *AdGroupLabelOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupLabelOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupLabelOperation proto.InternalMessageInfo
+
+type isAdGroupLabelOperation_Operation interface {
+	isAdGroupLabelOperation_Operation()
+}
+
+type AdGroupLabelOperation_Create struct {
+	Create *resources.AdGroupLabel `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdGroupLabelOperation_Remove struct {
+	Remove string `protobuf:"bytes,2,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdGroupLabelOperation_Create) isAdGroupLabelOperation_Operation() {}
+
+func (*AdGroupLabelOperation_Remove) isAdGroupLabelOperation_Operation() {}
+
+func (m *AdGroupLabelOperation) GetOperation() isAdGroupLabelOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdGroupLabelOperation) GetCreate() *resources.AdGroupLabel {
+	if x, ok := m.GetOperation().(*AdGroupLabelOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdGroupLabelOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdGroupLabelOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupLabelOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupLabelOperation_Create)(nil),
+		(*AdGroupLabelOperation_Remove)(nil),
+	}
+}
+
+// Response message for an ad group labels mutate.
+type MutateAdGroupLabelsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdGroupLabelResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *MutateAdGroupLabelsResponse) Reset()         { *m = MutateAdGroupLabelsResponse{} }
+func (m *MutateAdGroupLabelsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupLabelsResponse) ProtoMessage()    {}
+func (*MutateAdGroupLabelsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7054d11c8a405fc3, []int{3}
+}
+
+func (m *MutateAdGroupLabelsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupLabelsResponse.Unmarshal(m, b)
+}
+func (m *MutateAdGroupLabelsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupLabelsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupLabelsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupLabelsResponse.Merge(m, src)
+}
+func (m *MutateAdGroupLabelsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupLabelsResponse.Size(m)
+}
+func (m *MutateAdGroupLabelsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupLabelsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupLabelsResponse proto.InternalMessageInfo
+
+func (m *MutateAdGroupLabelsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdGroupLabelsResponse) GetResults() []*MutateAdGroupLabelResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for an ad group label mutate.
+type MutateAdGroupLabelResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupLabelResult) Reset()         { *m = MutateAdGroupLabelResult{} }
+func (m *MutateAdGroupLabelResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupLabelResult) ProtoMessage()    {}
+func (*MutateAdGroupLabelResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7054d11c8a405fc3, []int{4}
+}
+
+func (m *MutateAdGroupLabelResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupLabelResult.Unmarshal(m, b)
+}
+func (m *MutateAdGroupLabelResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupLabelResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupLabelResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupLabelResult.Merge(m, src)
+}
+func (m *MutateAdGroupLabelResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupLabelResult.Size(m)
+}
+func (m *MutateAdGroupLabelResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupLabelResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupLabelResult proto.InternalMessageInfo
+
+func (m *MutateAdGroupLabelResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupLabelRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupLabelRequest")
+	proto.RegisterType((*MutateAdGroupLabelsRequest)(nil), "google.ads.googleads.v3.services.MutateAdGroupLabelsRequest")
+	proto.RegisterType((*AdGroupLabelOperation)(nil), "google.ads.googleads.v3.services.AdGroupLabelOperation")
+	proto.RegisterType((*MutateAdGroupLabelsResponse)(nil), "google.ads.googleads.v3.services.MutateAdGroupLabelsResponse")
+	proto.RegisterType((*MutateAdGroupLabelResult)(nil), "google.ads.googleads.v3.services.MutateAdGroupLabelResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_label_service.proto", fileDescriptor_7054d11c8a405fc3)
+}
+
+var fileDescriptor_7054d11c8a405fc3 = []byte{
+	// 709 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4f, 0x6b, 0x13, 0x41,
+	0x14, 0x77, 0x37, 0x52, 0xed, 0xa4, 0xb5, 0x30, 0xa5, 0x75, 0x49, 0x05, 0xc3, 0x5a, 0x30, 0x04,
+	0xd9, 0xc5, 0x04, 0xac, 0xac, 0x06, 0xd9, 0x80, 0x4d, 0x0b, 0x6a, 0xcb, 0x56, 0x72, 0x90, 0xc0,
+	0x32, 0xdd, 0x9d, 0xae, 0x0b, 0xbb, 0x3b, 0xeb, 0xcc, 0x6c, 0xa0, 0x94, 0x5e, 0xbc, 0x79, 0xf6,
+	0x1b, 0x78, 0xf4, 0x2b, 0x78, 0xf6, 0xd2, 0xab, 0xb7, 0x9e, 0x3c, 0x08, 0x42, 0x0f, 0x7e, 0x05,
+	0x65, 0xff, 0x4c, 0xb2, 0x69, 0x13, 0x82, 0xbd, 0xbd, 0xbc, 0x3f, 0xbf, 0xf7, 0xfb, 0xbd, 0xf7,
+	0x66, 0x03, 0x3a, 0x1e, 0x21, 0x5e, 0x80, 0x75, 0xe4, 0x32, 0x3d, 0x37, 0x53, 0x6b, 0xd8, 0xd6,
+	0x19, 0xa6, 0x43, 0xdf, 0xc1, 0x4c, 0x47, 0xae, 0xed, 0x51, 0x92, 0xc4, 0x76, 0x80, 0x0e, 0x71,
+	0x60, 0x17, 0x7e, 0x2d, 0xa6, 0x84, 0x13, 0x58, 0xcf, 0x6b, 0x34, 0xe4, 0x32, 0x6d, 0x54, 0xae,
+	0x0d, 0xdb, 0x9a, 0x28, 0xaf, 0x3d, 0x99, 0xd5, 0x80, 0x62, 0x46, 0x12, 0x7a, 0xb5, 0x43, 0x8e,
+	0x5c, 0xbb, 0x27, 0xea, 0x62, 0x5f, 0x47, 0x51, 0x44, 0x38, 0xe2, 0x3e, 0x89, 0x58, 0x11, 0xbd,
+	0x5b, 0x8a, 0x3a, 0x81, 0x8f, 0x23, 0x5e, 0x04, 0xee, 0x97, 0x02, 0x47, 0x3e, 0x0e, 0x5c, 0xfb,
+	0x10, 0xbf, 0x47, 0x43, 0x9f, 0xd0, 0x4b, 0x95, 0x34, 0x76, 0x74, 0xc6, 0x11, 0x4f, 0x0a, 0x48,
+	0xb5, 0x0b, 0xd6, 0x7b, 0x98, 0x9b, 0x6e, 0x2f, 0xa5, 0xf2, 0x2a, 0x65, 0x62, 0xe1, 0x0f, 0x09,
+	0x66, 0x1c, 0x36, 0xc0, 0xb2, 0x20, 0x6b, 0x47, 0x28, 0xc4, 0x8a, 0x54, 0x97, 0x1a, 0x8b, 0xdd,
+	0xca, 0x4f, 0x53, 0xb6, 0x96, 0x44, 0xe4, 0x0d, 0x0a, 0xb1, 0xfa, 0x47, 0x02, 0xb5, 0xd7, 0x09,
+	0x47, 0x1c, 0x97, 0x71, 0x98, 0x00, 0xda, 0x04, 0x55, 0x27, 0x61, 0x9c, 0x84, 0x98, 0xda, 0xbe,
+	0x5b, 0x86, 0x01, 0xc2, 0xbf, 0xeb, 0xc2, 0x01, 0x00, 0x24, 0xc6, 0x34, 0xd7, 0xab, 0xc8, 0xf5,
+	0x4a, 0xa3, 0xda, 0xda, 0xd2, 0xe6, 0x0d, 0x5a, 0x2b, 0x77, 0xdc, 0x13, 0xf5, 0x05, 0xfa, 0x18,
+	0x0f, 0x3e, 0x04, 0x2b, 0x31, 0xa2, 0xdc, 0x47, 0x81, 0x7d, 0x84, 0xfc, 0x20, 0xa1, 0x58, 0xa9,
+	0xd4, 0xa5, 0xc6, 0x6d, 0xeb, 0x4e, 0xe1, 0xde, 0xce, 0xbd, 0xf0, 0x01, 0x58, 0x1e, 0xa2, 0xc0,
+	0x77, 0x11, 0xc7, 0x36, 0x89, 0x82, 0x63, 0xe5, 0x66, 0x96, 0xb6, 0x24, 0x9c, 0x7b, 0x51, 0x70,
+	0xac, 0x7e, 0x92, 0xc0, 0xda, 0xd4, 0xc6, 0x70, 0x17, 0x2c, 0x38, 0x14, 0x23, 0x9e, 0x4f, 0xab,
+	0xda, 0xd2, 0x67, 0x2a, 0x18, 0x1d, 0xc2, 0x84, 0x84, 0x9d, 0x1b, 0x56, 0x01, 0x00, 0x15, 0xb0,
+	0x40, 0x71, 0x48, 0x86, 0x58, 0x91, 0xd3, 0x89, 0xa5, 0x91, 0xfc, 0x77, 0xb7, 0x0a, 0x16, 0x47,
+	0xd2, 0xd4, 0x6f, 0x12, 0xd8, 0x98, 0x3a, 0x7c, 0x16, 0x93, 0x88, 0x61, 0xb8, 0x0d, 0xd6, 0x2e,
+	0x29, 0xb7, 0x31, 0xa5, 0x84, 0x66, 0xfa, 0xab, 0x2d, 0x28, 0x08, 0xd2, 0xd8, 0xd1, 0x0e, 0xb2,
+	0xcb, 0xb0, 0x56, 0x27, 0x67, 0xf2, 0x32, 0x4d, 0x87, 0x6f, 0xc1, 0x2d, 0x8a, 0x59, 0x12, 0x70,
+	0xb1, 0x1c, 0x63, 0xfe, 0x72, 0xae, 0xf2, 0xb2, 0x32, 0x08, 0x4b, 0x40, 0xa9, 0x2f, 0x80, 0x32,
+	0x2b, 0x29, 0x5d, 0xc5, 0x94, 0x03, 0x9c, 0xbc, 0xbd, 0xd6, 0xef, 0x0a, 0x58, 0x2d, 0xd7, 0x1e,
+	0xe4, 0xbd, 0xe1, 0x77, 0x09, 0xac, 0x5c, 0x3a, 0x6c, 0xf8, 0x74, 0x3e, 0xe3, 0xe9, 0x6f, 0xa1,
+	0xf6, 0xbf, 0x6b, 0x54, 0x7b, 0xe7, 0xe6, 0x24, 0xf9, 0x8f, 0x3f, 0x7e, 0x7d, 0x96, 0x1f, 0x43,
+	0x3d, 0xfd, 0x06, 0x9c, 0x4c, 0x44, 0x3a, 0xe2, 0x11, 0x30, 0xbd, 0xa9, 0xa3, 0xf2, 0x0e, 0xf5,
+	0xe6, 0x29, 0xbc, 0x90, 0xc0, 0xea, 0x94, 0xf5, 0xc2, 0xe7, 0xd7, 0x99, 0xbe, 0x78, 0x92, 0xb5,
+	0xce, 0x35, 0xab, 0xf3, 0x9b, 0x52, 0xfb, 0xe7, 0xe6, 0x7a, 0xe9, 0x49, 0x3f, 0x1a, 0x3f, 0xb4,
+	0x4c, 0xe6, 0x96, 0xda, 0x4a, 0x65, 0x8e, 0x75, 0x9d, 0x94, 0x92, 0x3b, 0xcd, 0xd3, 0x49, 0x95,
+	0x46, 0x98, 0x75, 0x32, 0xa4, 0x66, 0x6d, 0xe3, 0xcc, 0x54, 0xc6, 0x6c, 0x0a, 0x2b, 0xf6, 0x99,
+	0xe6, 0x90, 0xb0, 0xfb, 0x57, 0x02, 0x9b, 0x0e, 0x09, 0xe7, 0x32, 0xef, 0x2a, 0x53, 0xee, 0x61,
+	0x3f, 0xfd, 0xd8, 0xed, 0x4b, 0xef, 0x76, 0x8a, 0x6a, 0x8f, 0x04, 0x28, 0xf2, 0x34, 0x42, 0x3d,
+	0xdd, 0xc3, 0x51, 0xf6, 0x29, 0xd4, 0xc7, 0xfd, 0x66, 0xff, 0x2f, 0x3c, 0x13, 0xc6, 0x17, 0xb9,
+	0xd2, 0x33, 0xcd, 0xaf, 0x72, 0xbd, 0x97, 0x03, 0x9a, 0x2e, 0xd3, 0x72, 0x33, 0xb5, 0xfa, 0x6d,
+	0xad, 0x68, 0xcc, 0xce, 0x44, 0xca, 0xc0, 0x74, 0xd9, 0x60, 0x94, 0x32, 0xe8, 0xb7, 0x07, 0x22,
+	0xe5, 0x42, 0xde, 0xcc, 0xfd, 0x86, 0x61, 0xba, 0xcc, 0x30, 0x46, 0x49, 0x86, 0xd1, 0x6f, 0x1b,
+	0x86, 0x48, 0x3b, 0x5c, 0xc8, 0x78, 0xb6, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x2f, 0xf4, 0xfc,
+	0x5b, 0xbe, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupLabelServiceClient is the client API for AdGroupLabelService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupLabelServiceClient interface {
+	// Returns the requested ad group label in full detail.
+	GetAdGroupLabel(ctx context.Context, in *GetAdGroupLabelRequest, opts ...grpc.CallOption) (*resources.AdGroupLabel, error)
+	// Creates and removes ad group labels.
+	// Operation statuses are returned.
+	MutateAdGroupLabels(ctx context.Context, in *MutateAdGroupLabelsRequest, opts ...grpc.CallOption) (*MutateAdGroupLabelsResponse, error)
+}
+
+type adGroupLabelServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupLabelServiceClient(cc grpc.ClientConnInterface) AdGroupLabelServiceClient {
+	return &adGroupLabelServiceClient{cc}
+}
+
+func (c *adGroupLabelServiceClient) GetAdGroupLabel(ctx context.Context, in *GetAdGroupLabelRequest, opts ...grpc.CallOption) (*resources.AdGroupLabel, error) {
+	out := new(resources.AdGroupLabel)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupLabelService/GetAdGroupLabel", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adGroupLabelServiceClient) MutateAdGroupLabels(ctx context.Context, in *MutateAdGroupLabelsRequest, opts ...grpc.CallOption) (*MutateAdGroupLabelsResponse, error) {
+	out := new(MutateAdGroupLabelsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupLabelService/MutateAdGroupLabels", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupLabelServiceServer is the server API for AdGroupLabelService service.
+type AdGroupLabelServiceServer interface {
+	// Returns the requested ad group label in full detail.
+	GetAdGroupLabel(context.Context, *GetAdGroupLabelRequest) (*resources.AdGroupLabel, error)
+	// Creates and removes ad group labels.
+	// Operation statuses are returned.
+	MutateAdGroupLabels(context.Context, *MutateAdGroupLabelsRequest) (*MutateAdGroupLabelsResponse, error)
+}
+
+// UnimplementedAdGroupLabelServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupLabelServiceServer struct {
+}
+
+func (*UnimplementedAdGroupLabelServiceServer) GetAdGroupLabel(ctx context.Context, req *GetAdGroupLabelRequest) (*resources.AdGroupLabel, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdGroupLabel not implemented")
+}
+func (*UnimplementedAdGroupLabelServiceServer) MutateAdGroupLabels(ctx context.Context, req *MutateAdGroupLabelsRequest) (*MutateAdGroupLabelsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdGroupLabels not implemented")
+}
+
+func RegisterAdGroupLabelServiceServer(s *grpc.Server, srv AdGroupLabelServiceServer) {
+	s.RegisterService(&_AdGroupLabelService_serviceDesc, srv)
+}
+
+func _AdGroupLabelService_GetAdGroupLabel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupLabelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupLabelServiceServer).GetAdGroupLabel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupLabelService/GetAdGroupLabel",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupLabelServiceServer).GetAdGroupLabel(ctx, req.(*GetAdGroupLabelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdGroupLabelService_MutateAdGroupLabels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdGroupLabelsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupLabelServiceServer).MutateAdGroupLabels(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupLabelService/MutateAdGroupLabels",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupLabelServiceServer).MutateAdGroupLabels(ctx, req.(*MutateAdGroupLabelsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupLabelService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupLabelService",
+	HandlerType: (*AdGroupLabelServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupLabel",
+			Handler:    _AdGroupLabelService_GetAdGroupLabel_Handler,
+		},
+		{
+			MethodName: "MutateAdGroupLabels",
+			Handler:    _AdGroupLabelService_MutateAdGroupLabels_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_label_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_service.pb.go
new file mode 100644
index 0000000..fb40ef3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_service.pb.go
@@ -0,0 +1,527 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupService.GetAdGroup][google.ads.googleads.v3.services.AdGroupService.GetAdGroup].
+type GetAdGroupRequest struct {
+	// Required. The resource name of the ad group to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupRequest) Reset()         { *m = GetAdGroupRequest{} }
+func (m *GetAdGroupRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupRequest) ProtoMessage()    {}
+func (*GetAdGroupRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4788d5c8fc9bdd61, []int{0}
+}
+
+func (m *GetAdGroupRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupRequest.Merge(m, src)
+}
+func (m *GetAdGroupRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupRequest.Size(m)
+}
+func (m *GetAdGroupRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AdGroupService.MutateAdGroups][google.ads.googleads.v3.services.AdGroupService.MutateAdGroups].
+type MutateAdGroupsRequest struct {
+	// Required. The ID of the customer whose ad groups are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual ad groups.
+	Operations []*AdGroupOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupsRequest) Reset()         { *m = MutateAdGroupsRequest{} }
+func (m *MutateAdGroupsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupsRequest) ProtoMessage()    {}
+func (*MutateAdGroupsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4788d5c8fc9bdd61, []int{1}
+}
+
+func (m *MutateAdGroupsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupsRequest.Unmarshal(m, b)
+}
+func (m *MutateAdGroupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupsRequest.Merge(m, src)
+}
+func (m *MutateAdGroupsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupsRequest.Size(m)
+}
+func (m *MutateAdGroupsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupsRequest proto.InternalMessageInfo
+
+func (m *MutateAdGroupsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdGroupsRequest) GetOperations() []*AdGroupOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdGroupsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdGroupsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on an ad group.
+type AdGroupOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdGroupOperation_Create
+	//	*AdGroupOperation_Update
+	//	*AdGroupOperation_Remove
+	Operation            isAdGroupOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *AdGroupOperation) Reset()         { *m = AdGroupOperation{} }
+func (m *AdGroupOperation) String() string { return proto.CompactTextString(m) }
+func (*AdGroupOperation) ProtoMessage()    {}
+func (*AdGroupOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4788d5c8fc9bdd61, []int{2}
+}
+
+func (m *AdGroupOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdGroupOperation.Unmarshal(m, b)
+}
+func (m *AdGroupOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdGroupOperation.Marshal(b, m, deterministic)
+}
+func (m *AdGroupOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdGroupOperation.Merge(m, src)
+}
+func (m *AdGroupOperation) XXX_Size() int {
+	return xxx_messageInfo_AdGroupOperation.Size(m)
+}
+func (m *AdGroupOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdGroupOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdGroupOperation proto.InternalMessageInfo
+
+func (m *AdGroupOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isAdGroupOperation_Operation interface {
+	isAdGroupOperation_Operation()
+}
+
+type AdGroupOperation_Create struct {
+	Create *resources.AdGroup `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdGroupOperation_Update struct {
+	Update *resources.AdGroup `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type AdGroupOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdGroupOperation_Create) isAdGroupOperation_Operation() {}
+
+func (*AdGroupOperation_Update) isAdGroupOperation_Operation() {}
+
+func (*AdGroupOperation_Remove) isAdGroupOperation_Operation() {}
+
+func (m *AdGroupOperation) GetOperation() isAdGroupOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdGroupOperation) GetCreate() *resources.AdGroup {
+	if x, ok := m.GetOperation().(*AdGroupOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdGroupOperation) GetUpdate() *resources.AdGroup {
+	if x, ok := m.GetOperation().(*AdGroupOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *AdGroupOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdGroupOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdGroupOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdGroupOperation_Create)(nil),
+		(*AdGroupOperation_Update)(nil),
+		(*AdGroupOperation_Remove)(nil),
+	}
+}
+
+// Response message for an ad group mutate.
+type MutateAdGroupsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdGroupResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *MutateAdGroupsResponse) Reset()         { *m = MutateAdGroupsResponse{} }
+func (m *MutateAdGroupsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupsResponse) ProtoMessage()    {}
+func (*MutateAdGroupsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4788d5c8fc9bdd61, []int{3}
+}
+
+func (m *MutateAdGroupsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupsResponse.Unmarshal(m, b)
+}
+func (m *MutateAdGroupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupsResponse.Merge(m, src)
+}
+func (m *MutateAdGroupsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupsResponse.Size(m)
+}
+func (m *MutateAdGroupsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupsResponse proto.InternalMessageInfo
+
+func (m *MutateAdGroupsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdGroupsResponse) GetResults() []*MutateAdGroupResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the ad group mutate.
+type MutateAdGroupResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdGroupResult) Reset()         { *m = MutateAdGroupResult{} }
+func (m *MutateAdGroupResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdGroupResult) ProtoMessage()    {}
+func (*MutateAdGroupResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4788d5c8fc9bdd61, []int{4}
+}
+
+func (m *MutateAdGroupResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdGroupResult.Unmarshal(m, b)
+}
+func (m *MutateAdGroupResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdGroupResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdGroupResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdGroupResult.Merge(m, src)
+}
+func (m *MutateAdGroupResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdGroupResult.Size(m)
+}
+func (m *MutateAdGroupResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdGroupResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdGroupResult proto.InternalMessageInfo
+
+func (m *MutateAdGroupResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupRequest")
+	proto.RegisterType((*MutateAdGroupsRequest)(nil), "google.ads.googleads.v3.services.MutateAdGroupsRequest")
+	proto.RegisterType((*AdGroupOperation)(nil), "google.ads.googleads.v3.services.AdGroupOperation")
+	proto.RegisterType((*MutateAdGroupsResponse)(nil), "google.ads.googleads.v3.services.MutateAdGroupsResponse")
+	proto.RegisterType((*MutateAdGroupResult)(nil), "google.ads.googleads.v3.services.MutateAdGroupResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_service.proto", fileDescriptor_4788d5c8fc9bdd61)
+}
+
+var fileDescriptor_4788d5c8fc9bdd61 = []byte{
+	// 750 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4f, 0x4f, 0xd4, 0x4c,
+	0x18, 0x7f, 0xdb, 0x7d, 0xc3, 0xfb, 0x32, 0x0b, 0xa8, 0x43, 0xc0, 0xcd, 0x6a, 0xe2, 0xa6, 0x92,
+	0xb8, 0xd9, 0x60, 0x6b, 0x76, 0x63, 0x30, 0x25, 0x1c, 0xba, 0x51, 0x16, 0x0f, 0x08, 0x96, 0x04,
+	0x13, 0xb3, 0x49, 0x33, 0xb4, 0xc3, 0xda, 0xd0, 0x76, 0xea, 0xcc, 0x74, 0x13, 0x42, 0xb8, 0xf0,
+	0x15, 0xfc, 0x06, 0x1e, 0xbd, 0x71, 0xf5, 0x23, 0x70, 0x35, 0xf1, 0xc0, 0xc9, 0x03, 0x27, 0x3f,
+	0x82, 0x27, 0xd3, 0xce, 0xcc, 0xfe, 0x13, 0xb2, 0xc1, 0xdb, 0xb3, 0xf3, 0xfc, 0x7e, 0xbf, 0xe7,
+	0x7f, 0x17, 0xac, 0xf5, 0x08, 0xe9, 0x45, 0xd8, 0x42, 0x01, 0xb3, 0x84, 0x99, 0x5b, 0xfd, 0x96,
+	0xc5, 0x30, 0xed, 0x87, 0x3e, 0x66, 0x16, 0x0a, 0xbc, 0x1e, 0x25, 0x59, 0xea, 0xc9, 0x17, 0x33,
+	0xa5, 0x84, 0x13, 0x58, 0x13, 0x68, 0x13, 0x05, 0xcc, 0x1c, 0x10, 0xcd, 0x7e, 0xcb, 0x54, 0xc4,
+	0xea, 0xb3, 0x9b, 0xa4, 0x29, 0x66, 0x24, 0xa3, 0xa3, 0xda, 0x42, 0xb3, 0xfa, 0x50, 0x31, 0xd2,
+	0xd0, 0x42, 0x49, 0x42, 0x38, 0xe2, 0x21, 0x49, 0x98, 0xf4, 0xde, 0x1f, 0xf1, 0xfa, 0x51, 0x88,
+	0x13, 0x2e, 0x1d, 0x8f, 0x46, 0x1c, 0x87, 0x21, 0x8e, 0x02, 0xef, 0x00, 0x7f, 0x40, 0xfd, 0x90,
+	0x50, 0x09, 0x90, 0xb9, 0x5a, 0xc5, 0xaf, 0x83, 0xec, 0x50, 0xa2, 0x62, 0xc4, 0x8e, 0x26, 0xb4,
+	0x69, 0xea, 0x5b, 0x8c, 0x23, 0x9e, 0xc9, 0xa0, 0xc6, 0x06, 0xb8, 0xd7, 0xc1, 0xdc, 0x09, 0x3a,
+	0x79, 0x9a, 0x2e, 0xfe, 0x98, 0x61, 0xc6, 0x61, 0x1d, 0xcc, 0xab, 0x1a, 0xbc, 0x04, 0xc5, 0xb8,
+	0xa2, 0xd5, 0xb4, 0xfa, 0x6c, 0xbb, 0xf4, 0xc3, 0xd1, 0xdd, 0x39, 0xe5, 0x79, 0x83, 0x62, 0x6c,
+	0x5c, 0x69, 0x60, 0x69, 0x3b, 0xe3, 0x88, 0x63, 0x29, 0xc1, 0x94, 0xc6, 0x0a, 0x28, 0xfb, 0x19,
+	0xe3, 0x24, 0xc6, 0xd4, 0x0b, 0x83, 0x51, 0x05, 0xa0, 0xde, 0x5f, 0x07, 0xf0, 0x1d, 0x00, 0x24,
+	0xc5, 0x54, 0xf4, 0xa1, 0xa2, 0xd7, 0x4a, 0xf5, 0x72, 0xb3, 0x69, 0x4e, 0x6b, 0xbd, 0x29, 0x83,
+	0xed, 0x28, 0xaa, 0x14, 0x1e, 0x4a, 0xc1, 0x27, 0xe0, 0x4e, 0x8a, 0x28, 0x0f, 0x51, 0xe4, 0x1d,
+	0xa2, 0x30, 0xca, 0x28, 0xae, 0x94, 0x6a, 0x5a, 0xfd, 0x7f, 0x77, 0x41, 0x3e, 0x6f, 0x8a, 0x57,
+	0xf8, 0x18, 0xcc, 0xf7, 0x51, 0x14, 0x06, 0x88, 0x63, 0x8f, 0x24, 0xd1, 0x71, 0xe5, 0xdf, 0x02,
+	0x36, 0xa7, 0x1e, 0x77, 0x92, 0xe8, 0xd8, 0x38, 0xd3, 0xc1, 0xdd, 0xc9, 0x98, 0x70, 0x1d, 0x94,
+	0xb3, 0xb4, 0xe0, 0xe5, 0x8d, 0x2e, 0x78, 0xe5, 0x66, 0x55, 0x25, 0xaf, 0x66, 0x61, 0x6e, 0xe6,
+	0xb3, 0xd8, 0x46, 0xec, 0xc8, 0x05, 0x02, 0x9e, 0xdb, 0xf0, 0x25, 0x98, 0xf1, 0x29, 0x46, 0x5c,
+	0xf4, 0xb6, 0xdc, 0x6c, 0xdc, 0x58, 0xf4, 0x60, 0x9b, 0x54, 0xd5, 0x5b, 0xff, 0xb8, 0x92, 0x9b,
+	0xab, 0x08, 0xcd, 0x8a, 0xfe, 0x37, 0x2a, 0x82, 0x0b, 0x2b, 0x60, 0x86, 0xe2, 0x98, 0xf4, 0x45,
+	0x8b, 0x66, 0x73, 0x8f, 0xf8, 0xdd, 0x2e, 0x83, 0xd9, 0x41, 0x4f, 0x8d, 0x73, 0x0d, 0x2c, 0x4f,
+	0xce, 0x9a, 0xa5, 0x24, 0x61, 0x18, 0x6e, 0x82, 0xa5, 0x89, 0x6e, 0x7b, 0x98, 0x52, 0x42, 0x0b,
+	0xc1, 0x72, 0x13, 0xaa, 0xb4, 0x68, 0xea, 0x9b, 0x7b, 0xc5, 0xfa, 0xb9, 0x8b, 0xe3, 0x73, 0x78,
+	0x95, 0xc3, 0xe1, 0x0e, 0xf8, 0x8f, 0x62, 0x96, 0x45, 0x5c, 0xed, 0xc2, 0xf3, 0xe9, 0xbb, 0x30,
+	0x96, 0x92, 0x5b, 0xb0, 0x5d, 0xa5, 0x62, 0xd8, 0x60, 0xf1, 0x1a, 0x7f, 0x3e, 0xf4, 0x6b, 0x16,
+	0x7c, 0x7c, 0xb7, 0x9b, 0x5f, 0x4b, 0x60, 0x41, 0xd2, 0xf6, 0x44, 0x30, 0x78, 0xae, 0x01, 0x30,
+	0x3c, 0x17, 0xd8, 0x9a, 0x9e, 0xdd, 0x1f, 0xc7, 0x55, 0xbd, 0xc5, 0x8c, 0x8c, 0xf6, 0xa5, 0x33,
+	0x9e, 0xe8, 0xd9, 0xb7, 0xab, 0x4f, 0xfa, 0x2a, 0x6c, 0xe4, 0x9f, 0x99, 0x93, 0x31, 0xcf, 0x86,
+	0xba, 0x2a, 0x66, 0x35, 0x2c, 0x24, 0x07, 0x64, 0x35, 0x4e, 0xe1, 0x77, 0x0d, 0x2c, 0x8c, 0x8f,
+	0x0d, 0xae, 0xdd, 0xb2, 0xab, 0xea, 0xa8, 0xab, 0x2f, 0x6e, 0x4f, 0x14, 0x1b, 0x62, 0xbc, 0xbd,
+	0x74, 0x96, 0x47, 0xbe, 0x07, 0xab, 0xc3, 0x53, 0x2d, 0x4a, 0x6a, 0x1a, 0x4f, 0xf3, 0x92, 0x86,
+	0x35, 0x9c, 0x8c, 0x80, 0x37, 0x1a, 0xa7, 0x83, 0x8a, 0xec, 0xb8, 0xd0, 0xb7, 0xb5, 0x46, 0xf5,
+	0xc1, 0x85, 0x53, 0x19, 0xe6, 0x20, 0xad, 0x34, 0x64, 0xa6, 0x4f, 0xe2, 0xf6, 0x2f, 0x0d, 0xac,
+	0xf8, 0x24, 0x9e, 0x9a, 0x6f, 0x7b, 0x71, 0x7c, 0xc4, 0xbb, 0xf9, 0xd9, 0xee, 0x6a, 0xef, 0xb7,
+	0x24, 0xb1, 0x47, 0x22, 0x94, 0xf4, 0x4c, 0x42, 0x7b, 0x56, 0x0f, 0x27, 0xc5, 0x51, 0x5b, 0xc3,
+	0x50, 0x37, 0xff, 0xad, 0xac, 0x2b, 0xe3, 0xb3, 0x5e, 0xea, 0x38, 0xce, 0x17, 0xbd, 0xd6, 0x11,
+	0x82, 0x4e, 0xc0, 0x4c, 0x61, 0xe6, 0xd6, 0x7e, 0xcb, 0x94, 0x81, 0xd9, 0x85, 0x82, 0x74, 0x9d,
+	0x80, 0x75, 0x07, 0x90, 0xee, 0x7e, 0xab, 0xab, 0x20, 0x3f, 0xf5, 0x15, 0xf1, 0x6e, 0xdb, 0x4e,
+	0xc0, 0x6c, 0x7b, 0x00, 0xb2, 0xed, 0xfd, 0x96, 0x6d, 0x2b, 0xd8, 0xc1, 0x4c, 0x91, 0x67, 0xeb,
+	0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xa1, 0x1e, 0x4e, 0xfd, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupServiceClient is the client API for AdGroupService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupServiceClient interface {
+	// Returns the requested ad group in full detail.
+	GetAdGroup(ctx context.Context, in *GetAdGroupRequest, opts ...grpc.CallOption) (*resources.AdGroup, error)
+	// Creates, updates, or removes ad groups. Operation statuses are returned.
+	MutateAdGroups(ctx context.Context, in *MutateAdGroupsRequest, opts ...grpc.CallOption) (*MutateAdGroupsResponse, error)
+}
+
+type adGroupServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupServiceClient(cc grpc.ClientConnInterface) AdGroupServiceClient {
+	return &adGroupServiceClient{cc}
+}
+
+func (c *adGroupServiceClient) GetAdGroup(ctx context.Context, in *GetAdGroupRequest, opts ...grpc.CallOption) (*resources.AdGroup, error) {
+	out := new(resources.AdGroup)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupService/GetAdGroup", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adGroupServiceClient) MutateAdGroups(ctx context.Context, in *MutateAdGroupsRequest, opts ...grpc.CallOption) (*MutateAdGroupsResponse, error) {
+	out := new(MutateAdGroupsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupService/MutateAdGroups", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupServiceServer is the server API for AdGroupService service.
+type AdGroupServiceServer interface {
+	// Returns the requested ad group in full detail.
+	GetAdGroup(context.Context, *GetAdGroupRequest) (*resources.AdGroup, error)
+	// Creates, updates, or removes ad groups. Operation statuses are returned.
+	MutateAdGroups(context.Context, *MutateAdGroupsRequest) (*MutateAdGroupsResponse, error)
+}
+
+// UnimplementedAdGroupServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupServiceServer struct {
+}
+
+func (*UnimplementedAdGroupServiceServer) GetAdGroup(ctx context.Context, req *GetAdGroupRequest) (*resources.AdGroup, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdGroup not implemented")
+}
+func (*UnimplementedAdGroupServiceServer) MutateAdGroups(ctx context.Context, req *MutateAdGroupsRequest) (*MutateAdGroupsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdGroups not implemented")
+}
+
+func RegisterAdGroupServiceServer(s *grpc.Server, srv AdGroupServiceServer) {
+	s.RegisterService(&_AdGroupService_serviceDesc, srv)
+}
+
+func _AdGroupService_GetAdGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupServiceServer).GetAdGroup(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupService/GetAdGroup",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupServiceServer).GetAdGroup(ctx, req.(*GetAdGroupRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdGroupService_MutateAdGroups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdGroupsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupServiceServer).MutateAdGroups(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupService/MutateAdGroups",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupServiceServer).MutateAdGroups(ctx, req.(*MutateAdGroupsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupService",
+	HandlerType: (*AdGroupServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroup",
+			Handler:    _AdGroupService_GetAdGroup_Handler,
+		},
+		{
+			MethodName: "MutateAdGroups",
+			Handler:    _AdGroupService_MutateAdGroups_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_group_simulation_service.pb.go b/googleapis/ads/googleads/v3/services/ad_group_simulation_service.pb.go
new file mode 100644
index 0000000..855d8fe
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_group_simulation_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_group_simulation_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdGroupSimulationService.GetAdGroupSimulation][google.ads.googleads.v3.services.AdGroupSimulationService.GetAdGroupSimulation].
+type GetAdGroupSimulationRequest struct {
+	// Required. The resource name of the ad group simulation to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdGroupSimulationRequest) Reset()         { *m = GetAdGroupSimulationRequest{} }
+func (m *GetAdGroupSimulationRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdGroupSimulationRequest) ProtoMessage()    {}
+func (*GetAdGroupSimulationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0549cf58468ce402, []int{0}
+}
+
+func (m *GetAdGroupSimulationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdGroupSimulationRequest.Unmarshal(m, b)
+}
+func (m *GetAdGroupSimulationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdGroupSimulationRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdGroupSimulationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdGroupSimulationRequest.Merge(m, src)
+}
+func (m *GetAdGroupSimulationRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdGroupSimulationRequest.Size(m)
+}
+func (m *GetAdGroupSimulationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdGroupSimulationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdGroupSimulationRequest proto.InternalMessageInfo
+
+func (m *GetAdGroupSimulationRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdGroupSimulationRequest)(nil), "google.ads.googleads.v3.services.GetAdGroupSimulationRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_group_simulation_service.proto", fileDescriptor_0549cf58468ce402)
+}
+
+var fileDescriptor_0549cf58468ce402 = []byte{
+	// 415 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0x8b, 0xd4, 0x40,
+	0x1c, 0x25, 0x39, 0x10, 0x0c, 0xda, 0x04, 0xc1, 0x25, 0xa7, 0xb8, 0x1c, 0x57, 0x1c, 0x57, 0xcc,
+	0x80, 0x39, 0x2c, 0xe6, 0xb8, 0x62, 0xd2, 0xc4, 0x42, 0xe4, 0xb8, 0x83, 0x2d, 0x24, 0x10, 0xe6,
+	0x32, 0x63, 0x1c, 0x48, 0x32, 0x71, 0x7e, 0x49, 0x1a, 0xb1, 0x11, 0xbf, 0xc1, 0x7e, 0x03, 0x4b,
+	0x3f, 0xca, 0xb6, 0x56, 0x5a, 0x59, 0x58, 0xf9, 0x29, 0x24, 0x3b, 0x99, 0xec, 0xae, 0x6b, 0xdc,
+	0xee, 0x31, 0xef, 0xfd, 0xde, 0xfb, 0xfd, 0x19, 0x2f, 0xca, 0x95, 0xca, 0x0b, 0x81, 0x19, 0x07,
+	0x6c, 0x60, 0x8f, 0xba, 0x10, 0x83, 0xd0, 0x9d, 0xcc, 0x04, 0x60, 0xc6, 0xd3, 0x5c, 0xab, 0xb6,
+	0x4e, 0x41, 0x96, 0x6d, 0xc1, 0x1a, 0xa9, 0xaa, 0x74, 0x20, 0x51, 0xad, 0x55, 0xa3, 0xfc, 0xb9,
+	0x29, 0x44, 0x8c, 0x03, 0x1a, 0x3d, 0x50, 0x17, 0x22, 0xeb, 0x11, 0x5c, 0x4e, 0xa5, 0x68, 0x01,
+	0xaa, 0xd5, 0x13, 0x31, 0xc6, 0x3e, 0x78, 0x62, 0x8b, 0x6b, 0x89, 0x59, 0x55, 0xa9, 0x66, 0x4d,
+	0xc2, 0xc0, 0x3e, 0xde, 0x62, 0xb3, 0x42, 0x8a, 0xaa, 0x19, 0x88, 0x67, 0x5b, 0xc4, 0x5b, 0x29,
+	0x0a, 0x9e, 0xde, 0x89, 0x77, 0xac, 0x93, 0x4a, 0x1b, 0xc1, 0x49, 0xec, 0x1d, 0xc7, 0xa2, 0xa1,
+	0x3c, 0xee, 0x63, 0x6f, 0xc7, 0xd4, 0x1b, 0xf1, 0xbe, 0x15, 0xd0, 0xf8, 0x67, 0xde, 0x43, 0xdb,
+	0x5d, 0x5a, 0xb1, 0x52, 0xcc, 0x9c, 0xb9, 0x73, 0x76, 0x3f, 0x3a, 0xfa, 0x49, 0xdd, 0x9b, 0x07,
+	0x96, 0x79, 0xcd, 0x4a, 0xf1, 0x7c, 0xe9, 0x7a, 0xb3, 0x3d, 0x9b, 0x5b, 0x33, 0xbb, 0xff, 0xdd,
+	0xf1, 0x1e, 0xfd, 0x2b, 0xc6, 0xbf, 0x42, 0x87, 0xd6, 0x86, 0xfe, 0xd3, 0x5e, 0x70, 0x31, 0x59,
+	0x3e, 0xee, 0x14, 0xed, 0x15, 0x9f, 0xbc, 0xfa, 0x41, 0x77, 0xa7, 0xfa, 0xf4, 0xed, 0xd7, 0xd2,
+	0x7d, 0xe1, 0x5f, 0xf4, 0xc7, 0xf8, 0xb0, 0xc3, 0x5c, 0x65, 0x2d, 0x34, 0xaa, 0x14, 0x1a, 0xf0,
+	0x39, 0x66, 0x7f, 0x3b, 0x01, 0x3e, 0xff, 0x18, 0x1c, 0xaf, 0xe8, 0x6c, 0x13, 0x3d, 0xa0, 0x5a,
+	0x02, 0xca, 0x54, 0x19, 0x7d, 0x76, 0xbd, 0xd3, 0x4c, 0x95, 0x07, 0xa7, 0x8c, 0x9e, 0x4e, 0xed,
+	0xee, 0xba, 0x3f, 0xd3, 0xb5, 0xf3, 0xe6, 0xe5, 0x60, 0x91, 0xab, 0x82, 0x55, 0x39, 0x52, 0x3a,
+	0xc7, 0xb9, 0xa8, 0xd6, 0x47, 0xc4, 0x9b, 0xd0, 0xe9, 0x2f, 0x7c, 0x69, 0xc1, 0x17, 0xf7, 0x28,
+	0xa6, 0xf4, 0xab, 0x3b, 0x8f, 0x8d, 0x21, 0xe5, 0x80, 0x0c, 0xec, 0xd1, 0x22, 0x44, 0x43, 0x30,
+	0xac, 0xac, 0x24, 0xa1, 0x1c, 0x92, 0x51, 0x92, 0x2c, 0xc2, 0xc4, 0x4a, 0x7e, 0xbb, 0xa7, 0xe6,
+	0x9d, 0x10, 0xca, 0x81, 0x90, 0x51, 0x44, 0xc8, 0x22, 0x24, 0xc4, 0xca, 0xee, 0xee, 0xad, 0xfb,
+	0x0c, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x35, 0x6d, 0x4b, 0x69, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdGroupSimulationServiceClient is the client API for AdGroupSimulationService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdGroupSimulationServiceClient interface {
+	// Returns the requested ad group simulation in full detail.
+	GetAdGroupSimulation(ctx context.Context, in *GetAdGroupSimulationRequest, opts ...grpc.CallOption) (*resources.AdGroupSimulation, error)
+}
+
+type adGroupSimulationServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdGroupSimulationServiceClient(cc grpc.ClientConnInterface) AdGroupSimulationServiceClient {
+	return &adGroupSimulationServiceClient{cc}
+}
+
+func (c *adGroupSimulationServiceClient) GetAdGroupSimulation(ctx context.Context, in *GetAdGroupSimulationRequest, opts ...grpc.CallOption) (*resources.AdGroupSimulation, error) {
+	out := new(resources.AdGroupSimulation)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupSimulationService/GetAdGroupSimulation", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdGroupSimulationServiceServer is the server API for AdGroupSimulationService service.
+type AdGroupSimulationServiceServer interface {
+	// Returns the requested ad group simulation in full detail.
+	GetAdGroupSimulation(context.Context, *GetAdGroupSimulationRequest) (*resources.AdGroupSimulation, error)
+}
+
+// UnimplementedAdGroupSimulationServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdGroupSimulationServiceServer struct {
+}
+
+func (*UnimplementedAdGroupSimulationServiceServer) GetAdGroupSimulation(ctx context.Context, req *GetAdGroupSimulationRequest) (*resources.AdGroupSimulation, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAdGroupSimulation not implemented")
+}
+
+func RegisterAdGroupSimulationServiceServer(s *grpc.Server, srv AdGroupSimulationServiceServer) {
+	s.RegisterService(&_AdGroupSimulationService_serviceDesc, srv)
+}
+
+func _AdGroupSimulationService_GetAdGroupSimulation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdGroupSimulationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdGroupSimulationServiceServer).GetAdGroupSimulation(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdGroupSimulationService/GetAdGroupSimulation",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdGroupSimulationServiceServer).GetAdGroupSimulation(ctx, req.(*GetAdGroupSimulationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdGroupSimulationService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdGroupSimulationService",
+	HandlerType: (*AdGroupSimulationServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdGroupSimulation",
+			Handler:    _AdGroupSimulationService_GetAdGroupSimulation_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_group_simulation_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_parameter_service.pb.go b/googleapis/ads/googleads/v3/services/ad_parameter_service.pb.go
new file mode 100644
index 0000000..39b4dc6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_parameter_service.pb.go
@@ -0,0 +1,530 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_parameter_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdParameterService.GetAdParameter][google.ads.googleads.v3.services.AdParameterService.GetAdParameter]
+type GetAdParameterRequest struct {
+	// Required. The resource name of the ad parameter to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdParameterRequest) Reset()         { *m = GetAdParameterRequest{} }
+func (m *GetAdParameterRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdParameterRequest) ProtoMessage()    {}
+func (*GetAdParameterRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eee1e6c793ab006d, []int{0}
+}
+
+func (m *GetAdParameterRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdParameterRequest.Unmarshal(m, b)
+}
+func (m *GetAdParameterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdParameterRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdParameterRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdParameterRequest.Merge(m, src)
+}
+func (m *GetAdParameterRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdParameterRequest.Size(m)
+}
+func (m *GetAdParameterRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdParameterRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdParameterRequest proto.InternalMessageInfo
+
+func (m *GetAdParameterRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AdParameterService.MutateAdParameters][google.ads.googleads.v3.services.AdParameterService.MutateAdParameters]
+type MutateAdParametersRequest struct {
+	// Required. The ID of the customer whose ad parameters are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual ad parameters.
+	Operations []*AdParameterOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdParametersRequest) Reset()         { *m = MutateAdParametersRequest{} }
+func (m *MutateAdParametersRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdParametersRequest) ProtoMessage()    {}
+func (*MutateAdParametersRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eee1e6c793ab006d, []int{1}
+}
+
+func (m *MutateAdParametersRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdParametersRequest.Unmarshal(m, b)
+}
+func (m *MutateAdParametersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdParametersRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdParametersRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdParametersRequest.Merge(m, src)
+}
+func (m *MutateAdParametersRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdParametersRequest.Size(m)
+}
+func (m *MutateAdParametersRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdParametersRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdParametersRequest proto.InternalMessageInfo
+
+func (m *MutateAdParametersRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdParametersRequest) GetOperations() []*AdParameterOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateAdParametersRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateAdParametersRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on ad parameter.
+type AdParameterOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdParameterOperation_Create
+	//	*AdParameterOperation_Update
+	//	*AdParameterOperation_Remove
+	Operation            isAdParameterOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *AdParameterOperation) Reset()         { *m = AdParameterOperation{} }
+func (m *AdParameterOperation) String() string { return proto.CompactTextString(m) }
+func (*AdParameterOperation) ProtoMessage()    {}
+func (*AdParameterOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eee1e6c793ab006d, []int{2}
+}
+
+func (m *AdParameterOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdParameterOperation.Unmarshal(m, b)
+}
+func (m *AdParameterOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdParameterOperation.Marshal(b, m, deterministic)
+}
+func (m *AdParameterOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdParameterOperation.Merge(m, src)
+}
+func (m *AdParameterOperation) XXX_Size() int {
+	return xxx_messageInfo_AdParameterOperation.Size(m)
+}
+func (m *AdParameterOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdParameterOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdParameterOperation proto.InternalMessageInfo
+
+func (m *AdParameterOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isAdParameterOperation_Operation interface {
+	isAdParameterOperation_Operation()
+}
+
+type AdParameterOperation_Create struct {
+	Create *resources.AdParameter `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type AdParameterOperation_Update struct {
+	Update *resources.AdParameter `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type AdParameterOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*AdParameterOperation_Create) isAdParameterOperation_Operation() {}
+
+func (*AdParameterOperation_Update) isAdParameterOperation_Operation() {}
+
+func (*AdParameterOperation_Remove) isAdParameterOperation_Operation() {}
+
+func (m *AdParameterOperation) GetOperation() isAdParameterOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdParameterOperation) GetCreate() *resources.AdParameter {
+	if x, ok := m.GetOperation().(*AdParameterOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *AdParameterOperation) GetUpdate() *resources.AdParameter {
+	if x, ok := m.GetOperation().(*AdParameterOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *AdParameterOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*AdParameterOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdParameterOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdParameterOperation_Create)(nil),
+		(*AdParameterOperation_Update)(nil),
+		(*AdParameterOperation_Remove)(nil),
+	}
+}
+
+// Response message for an ad parameter mutate.
+type MutateAdParametersResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateAdParameterResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *MutateAdParametersResponse) Reset()         { *m = MutateAdParametersResponse{} }
+func (m *MutateAdParametersResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdParametersResponse) ProtoMessage()    {}
+func (*MutateAdParametersResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eee1e6c793ab006d, []int{3}
+}
+
+func (m *MutateAdParametersResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdParametersResponse.Unmarshal(m, b)
+}
+func (m *MutateAdParametersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdParametersResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdParametersResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdParametersResponse.Merge(m, src)
+}
+func (m *MutateAdParametersResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdParametersResponse.Size(m)
+}
+func (m *MutateAdParametersResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdParametersResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdParametersResponse proto.InternalMessageInfo
+
+func (m *MutateAdParametersResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateAdParametersResponse) GetResults() []*MutateAdParameterResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the ad parameter mutate.
+type MutateAdParameterResult struct {
+	// The resource name returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdParameterResult) Reset()         { *m = MutateAdParameterResult{} }
+func (m *MutateAdParameterResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdParameterResult) ProtoMessage()    {}
+func (*MutateAdParameterResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eee1e6c793ab006d, []int{4}
+}
+
+func (m *MutateAdParameterResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdParameterResult.Unmarshal(m, b)
+}
+func (m *MutateAdParameterResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdParameterResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdParameterResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdParameterResult.Merge(m, src)
+}
+func (m *MutateAdParameterResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdParameterResult.Size(m)
+}
+func (m *MutateAdParameterResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdParameterResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdParameterResult proto.InternalMessageInfo
+
+func (m *MutateAdParameterResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdParameterRequest)(nil), "google.ads.googleads.v3.services.GetAdParameterRequest")
+	proto.RegisterType((*MutateAdParametersRequest)(nil), "google.ads.googleads.v3.services.MutateAdParametersRequest")
+	proto.RegisterType((*AdParameterOperation)(nil), "google.ads.googleads.v3.services.AdParameterOperation")
+	proto.RegisterType((*MutateAdParametersResponse)(nil), "google.ads.googleads.v3.services.MutateAdParametersResponse")
+	proto.RegisterType((*MutateAdParameterResult)(nil), "google.ads.googleads.v3.services.MutateAdParameterResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_parameter_service.proto", fileDescriptor_eee1e6c793ab006d)
+}
+
+var fileDescriptor_eee1e6c793ab006d = []byte{
+	// 758 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcd, 0x6e, 0xd3, 0x4a,
+	0x14, 0xbe, 0x76, 0xae, 0x7a, 0x6f, 0x27, 0x6d, 0xaf, 0x34, 0x97, 0xd2, 0x10, 0x90, 0x88, 0x4c,
+	0x25, 0xa2, 0x08, 0xd9, 0x90, 0xa0, 0x22, 0x1c, 0x8a, 0xe4, 0x48, 0xa4, 0x65, 0x51, 0x5a, 0xb9,
+	0xa2, 0x0b, 0x88, 0x64, 0x4d, 0xed, 0x69, 0xb0, 0x6a, 0x7b, 0xcc, 0xcc, 0x38, 0x52, 0x55, 0x75,
+	0xc3, 0x03, 0xb0, 0xe1, 0x0d, 0x58, 0xf2, 0x06, 0x2c, 0xd9, 0x76, 0xcb, 0xae, 0x0b, 0xc4, 0x02,
+	0xb1, 0x40, 0x3c, 0x03, 0x42, 0xf6, 0x78, 0x12, 0xa7, 0x4d, 0x14, 0xd1, 0xdd, 0xf1, 0x39, 0xe7,
+	0xfb, 0xce, 0xff, 0x18, 0xb4, 0xfb, 0x84, 0xf4, 0x03, 0x6c, 0x20, 0x8f, 0x19, 0x42, 0x4c, 0xa5,
+	0x41, 0xcb, 0x60, 0x98, 0x0e, 0x7c, 0x17, 0x33, 0x03, 0x79, 0x4e, 0x8c, 0x28, 0x0a, 0x31, 0xc7,
+	0xd4, 0xc9, 0xb5, 0x7a, 0x4c, 0x09, 0x27, 0xb0, 0x26, 0x10, 0x3a, 0xf2, 0x98, 0x3e, 0x04, 0xeb,
+	0x83, 0x96, 0x2e, 0xc1, 0xd5, 0xfb, 0xd3, 0xe8, 0x29, 0x66, 0x24, 0xa1, 0xe7, 0xf9, 0x05, 0x6f,
+	0xf5, 0x86, 0x44, 0xc5, 0xbe, 0x81, 0xa2, 0x88, 0x70, 0xc4, 0x7d, 0x12, 0xb1, 0xdc, 0xba, 0x52,
+	0xb0, 0xba, 0x81, 0x8f, 0x23, 0x9e, 0x1b, 0x6e, 0x16, 0x0c, 0x07, 0x3e, 0x0e, 0x3c, 0x67, 0x1f,
+	0xbf, 0x42, 0x03, 0x9f, 0x48, 0xde, 0x3c, 0x5f, 0x23, 0xfb, 0xda, 0x4f, 0x0e, 0x72, 0xaf, 0x10,
+	0xb1, 0xc3, 0x73, 0xdc, 0x34, 0x76, 0x0d, 0xc6, 0x11, 0x4f, 0xf2, 0xa0, 0x9a, 0x05, 0x96, 0x37,
+	0x30, 0xb7, 0xbc, 0x1d, 0x99, 0xaa, 0x8d, 0x5f, 0x27, 0x98, 0x71, 0x58, 0x07, 0x8b, 0xb2, 0x16,
+	0x27, 0x42, 0x21, 0xae, 0x28, 0x35, 0xa5, 0x3e, 0xdf, 0x29, 0x7d, 0xb5, 0x54, 0x7b, 0x41, 0x5a,
+	0x9e, 0xa1, 0x10, 0x6b, 0x3f, 0x15, 0x70, 0x6d, 0x2b, 0xe1, 0x88, 0xe3, 0x02, 0x0d, 0x93, 0x3c,
+	0xab, 0xa0, 0xec, 0x26, 0x8c, 0x93, 0x10, 0x53, 0xc7, 0xf7, 0x8a, 0x2c, 0x40, 0xea, 0x9f, 0x7a,
+	0xf0, 0x25, 0x00, 0x24, 0xc6, 0x54, 0xf4, 0xa3, 0xa2, 0xd6, 0x4a, 0xf5, 0x72, 0x73, 0x4d, 0x9f,
+	0x35, 0x06, 0xbd, 0x10, 0x70, 0x5b, 0xc2, 0x73, 0xf2, 0x11, 0x1d, 0xbc, 0x0d, 0xfe, 0x8b, 0x11,
+	0xe5, 0x3e, 0x0a, 0x9c, 0x03, 0xe4, 0x07, 0x09, 0xc5, 0x95, 0x52, 0x4d, 0xa9, 0xff, 0x6b, 0x2f,
+	0xe5, 0xea, 0xae, 0xd0, 0xc2, 0x5b, 0x60, 0x71, 0x80, 0x02, 0xdf, 0x43, 0x1c, 0x3b, 0x24, 0x0a,
+	0x8e, 0x2a, 0x7f, 0x67, 0x6e, 0x0b, 0x52, 0xb9, 0x1d, 0x05, 0x47, 0xda, 0x5b, 0x15, 0x5c, 0x99,
+	0x14, 0x17, 0xb6, 0x41, 0x39, 0x89, 0x33, 0x6c, 0xda, 0xf8, 0x0c, 0x5b, 0x6e, 0x56, 0x65, 0x11,
+	0x72, 0x36, 0x7a, 0x37, 0x9d, 0xcd, 0x16, 0x62, 0x87, 0x36, 0x10, 0xee, 0xa9, 0x0c, 0x37, 0xc1,
+	0x9c, 0x4b, 0x31, 0xe2, 0xa2, 0xcf, 0xe5, 0xa6, 0x3e, 0xb5, 0xf8, 0xe1, 0x86, 0x15, 0xab, 0xdf,
+	0xfc, 0xcb, 0xce, 0xf1, 0x29, 0x93, 0xe0, 0xad, 0xa8, 0x97, 0x65, 0x12, 0x78, 0x58, 0x01, 0x73,
+	0x14, 0x87, 0x64, 0x20, 0xda, 0x35, 0x9f, 0x5a, 0xc4, 0x77, 0xa7, 0x0c, 0xe6, 0x87, 0xfd, 0xd5,
+	0x3e, 0x2a, 0xa0, 0x3a, 0x69, 0xfe, 0x2c, 0x26, 0x11, 0xc3, 0xb0, 0x0b, 0x96, 0xcf, 0x75, 0xdf,
+	0xc1, 0x94, 0x12, 0x9a, 0x91, 0x96, 0x9b, 0x50, 0xa6, 0x47, 0x63, 0x57, 0xdf, 0xcd, 0x56, 0xd3,
+	0xfe, 0x7f, 0x7c, 0x2e, 0x4f, 0x52, 0x77, 0xb8, 0x0b, 0xfe, 0xa1, 0x98, 0x25, 0x01, 0x97, 0xfb,
+	0xf1, 0x70, 0xf6, 0x7e, 0x5c, 0x48, 0xcb, 0xce, 0x18, 0x6c, 0xc9, 0xa4, 0x3d, 0x06, 0x2b, 0x53,
+	0x7c, 0xd2, 0x65, 0x98, 0x70, 0x00, 0xe3, 0xbb, 0xdf, 0xfc, 0x52, 0x02, 0xb0, 0x00, 0xdd, 0x15,
+	0x81, 0xe1, 0x27, 0x05, 0x2c, 0x8d, 0x9f, 0x15, 0x7c, 0x30, 0x3b, 0xdb, 0x89, 0x87, 0x58, 0xfd,
+	0xc3, 0xf9, 0x69, 0xdd, 0x33, 0x6b, 0x3c, 0xf1, 0x37, 0x9f, 0xbf, 0xbd, 0x53, 0xef, 0x42, 0x3d,
+	0x7d, 0x9e, 0x8e, 0xc7, 0x2c, 0xeb, 0xf2, 0x02, 0x99, 0xd1, 0x30, 0x50, 0x61, 0x78, 0x46, 0xe3,
+	0x04, 0x7e, 0x57, 0x00, 0xbc, 0x38, 0x56, 0xd8, 0xbe, 0x44, 0xd7, 0xe5, 0x63, 0x50, 0x7d, 0x74,
+	0x39, 0xb0, 0xd8, 0x24, 0xed, 0xf9, 0x99, 0x75, 0xb5, 0xf0, 0x96, 0xdc, 0x19, 0x9d, 0x78, 0x56,
+	0xe2, 0x9a, 0x76, 0x2f, 0x2d, 0x71, 0x54, 0xd3, 0x71, 0xc1, 0x79, 0xbd, 0x71, 0x32, 0x56, 0xa1,
+	0x19, 0x66, 0x71, 0x4c, 0xa5, 0x51, 0xbd, 0x7e, 0x6a, 0x55, 0x46, 0xb9, 0xe4, 0x52, 0xec, 0x33,
+	0xdd, 0x25, 0x61, 0xe7, 0x97, 0x02, 0x56, 0x5d, 0x12, 0xce, 0xcc, 0xbb, 0xb3, 0x72, 0x71, 0x0d,
+	0x76, 0xd2, 0x93, 0xdf, 0x51, 0x5e, 0x6c, 0xe6, 0xe0, 0x3e, 0x09, 0x50, 0xd4, 0xd7, 0x09, 0xed,
+	0x1b, 0x7d, 0x1c, 0x65, 0x0f, 0x82, 0x31, 0x0a, 0x37, 0xfd, 0x57, 0xd5, 0x96, 0xc2, 0x7b, 0xb5,
+	0xb4, 0x61, 0x59, 0x1f, 0xd4, 0xda, 0x86, 0x20, 0xb4, 0x3c, 0xa6, 0x0b, 0x31, 0x95, 0xf6, 0x5a,
+	0x7a, 0x1e, 0x98, 0x9d, 0x4a, 0x97, 0x9e, 0xe5, 0xb1, 0xde, 0xd0, 0xa5, 0xb7, 0xd7, 0xea, 0x49,
+	0x97, 0x1f, 0xea, 0xaa, 0xd0, 0x9b, 0xa6, 0xe5, 0x31, 0xd3, 0x1c, 0x3a, 0x99, 0xe6, 0x5e, 0xcb,
+	0x34, 0xa5, 0xdb, 0xfe, 0x5c, 0x96, 0x67, 0xeb, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x19,
+	0x17, 0xd4, 0x51, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdParameterServiceClient is the client API for AdParameterService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdParameterServiceClient interface {
+	// Returns the requested ad parameter in full detail.
+	GetAdParameter(ctx context.Context, in *GetAdParameterRequest, opts ...grpc.CallOption) (*resources.AdParameter, error)
+	// Creates, updates, or removes ad parameters. Operation statuses are
+	// returned.
+	MutateAdParameters(ctx context.Context, in *MutateAdParametersRequest, opts ...grpc.CallOption) (*MutateAdParametersResponse, error)
+}
+
+type adParameterServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdParameterServiceClient(cc grpc.ClientConnInterface) AdParameterServiceClient {
+	return &adParameterServiceClient{cc}
+}
+
+func (c *adParameterServiceClient) GetAdParameter(ctx context.Context, in *GetAdParameterRequest, opts ...grpc.CallOption) (*resources.AdParameter, error) {
+	out := new(resources.AdParameter)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdParameterService/GetAdParameter", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adParameterServiceClient) MutateAdParameters(ctx context.Context, in *MutateAdParametersRequest, opts ...grpc.CallOption) (*MutateAdParametersResponse, error) {
+	out := new(MutateAdParametersResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdParameterService/MutateAdParameters", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdParameterServiceServer is the server API for AdParameterService service.
+type AdParameterServiceServer interface {
+	// Returns the requested ad parameter in full detail.
+	GetAdParameter(context.Context, *GetAdParameterRequest) (*resources.AdParameter, error)
+	// Creates, updates, or removes ad parameters. Operation statuses are
+	// returned.
+	MutateAdParameters(context.Context, *MutateAdParametersRequest) (*MutateAdParametersResponse, error)
+}
+
+// UnimplementedAdParameterServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdParameterServiceServer struct {
+}
+
+func (*UnimplementedAdParameterServiceServer) GetAdParameter(ctx context.Context, req *GetAdParameterRequest) (*resources.AdParameter, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetAdParameter not implemented")
+}
+func (*UnimplementedAdParameterServiceServer) MutateAdParameters(ctx context.Context, req *MutateAdParametersRequest) (*MutateAdParametersResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateAdParameters not implemented")
+}
+
+func RegisterAdParameterServiceServer(s *grpc.Server, srv AdParameterServiceServer) {
+	s.RegisterService(&_AdParameterService_serviceDesc, srv)
+}
+
+func _AdParameterService_GetAdParameter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdParameterRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdParameterServiceServer).GetAdParameter(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdParameterService/GetAdParameter",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdParameterServiceServer).GetAdParameter(ctx, req.(*GetAdParameterRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdParameterService_MutateAdParameters_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdParametersRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdParameterServiceServer).MutateAdParameters(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdParameterService/MutateAdParameters",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdParameterServiceServer).MutateAdParameters(ctx, req.(*MutateAdParametersRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdParameterService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdParameterService",
+	HandlerType: (*AdParameterServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdParameter",
+			Handler:    _AdParameterService_GetAdParameter_Handler,
+		},
+		{
+			MethodName: "MutateAdParameters",
+			Handler:    _AdParameterService_MutateAdParameters_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_parameter_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_schedule_view_service.pb.go b/googleapis/ads/googleads/v3/services/ad_schedule_view_service.pb.go
new file mode 100644
index 0000000..9b71c1c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_schedule_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_schedule_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdScheduleViewService.GetAdScheduleView][google.ads.googleads.v3.services.AdScheduleViewService.GetAdScheduleView].
+type GetAdScheduleViewRequest struct {
+	// Required. The resource name of the ad schedule view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdScheduleViewRequest) Reset()         { *m = GetAdScheduleViewRequest{} }
+func (m *GetAdScheduleViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdScheduleViewRequest) ProtoMessage()    {}
+func (*GetAdScheduleViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_12439311f71170b1, []int{0}
+}
+
+func (m *GetAdScheduleViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdScheduleViewRequest.Unmarshal(m, b)
+}
+func (m *GetAdScheduleViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdScheduleViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdScheduleViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdScheduleViewRequest.Merge(m, src)
+}
+func (m *GetAdScheduleViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdScheduleViewRequest.Size(m)
+}
+func (m *GetAdScheduleViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdScheduleViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdScheduleViewRequest proto.InternalMessageInfo
+
+func (m *GetAdScheduleViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdScheduleViewRequest)(nil), "google.ads.googleads.v3.services.GetAdScheduleViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_schedule_view_service.proto", fileDescriptor_12439311f71170b1)
+}
+
+var fileDescriptor_12439311f71170b1 = []byte{
+	// 414 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0x8b, 0xd4, 0x40,
+	0x14, 0x27, 0x39, 0x10, 0x0c, 0x5a, 0x18, 0x10, 0x97, 0x28, 0xb8, 0x1c, 0x57, 0x1c, 0x57, 0xcc,
+	0x70, 0xa6, 0x91, 0x11, 0x91, 0x59, 0x84, 0xd5, 0x46, 0x8e, 0x3b, 0x48, 0x21, 0x81, 0x30, 0x97,
+	0x79, 0xe6, 0x06, 0x92, 0xcc, 0x9a, 0x97, 0xe4, 0x0a, 0xb1, 0x50, 0xfc, 0x06, 0x7e, 0x03, 0x4b,
+	0x3f, 0xca, 0x81, 0x95, 0x9d, 0x95, 0x85, 0x95, 0x9f, 0x42, 0xb2, 0x93, 0xc9, 0x6e, 0x70, 0xc3,
+	0x76, 0x3f, 0xf2, 0xfb, 0xf7, 0xde, 0x9b, 0x78, 0x2f, 0x32, 0xad, 0xb3, 0x1c, 0xa8, 0x90, 0x48,
+	0x0d, 0xec, 0x50, 0x1b, 0x52, 0x84, 0xaa, 0x55, 0x29, 0x20, 0x15, 0x32, 0xc1, 0xf4, 0x0a, 0x64,
+	0x93, 0x43, 0xd2, 0x2a, 0xb8, 0x4e, 0x7a, 0x86, 0xac, 0x2a, 0x5d, 0x6b, 0x7f, 0x6e, 0x5c, 0x44,
+	0x48, 0x24, 0x43, 0x00, 0x69, 0x43, 0x62, 0x03, 0x82, 0xa7, 0x53, 0x15, 0x15, 0xa0, 0x6e, 0xaa,
+	0x5d, 0x1d, 0x26, 0x3b, 0x78, 0x64, 0x9d, 0x2b, 0x45, 0x45, 0x59, 0xea, 0x5a, 0xd4, 0x4a, 0x97,
+	0xd8, 0xb3, 0x0f, 0xb6, 0xd8, 0x34, 0x57, 0x50, 0xd6, 0x3d, 0xf1, 0x78, 0x8b, 0x78, 0xa7, 0x20,
+	0x97, 0xc9, 0x25, 0x5c, 0x89, 0x56, 0xe9, 0xca, 0x08, 0x0e, 0x5f, 0x7a, 0xb3, 0x25, 0xd4, 0x5c,
+	0x5e, 0xf4, 0x9d, 0x91, 0x82, 0xeb, 0x73, 0x78, 0xdf, 0x00, 0xd6, 0xfe, 0xb1, 0x77, 0xd7, 0xce,
+	0x95, 0x94, 0xa2, 0x80, 0x99, 0x33, 0x77, 0x8e, 0x6f, 0x2f, 0x0e, 0x7e, 0x73, 0xf7, 0xfc, 0x8e,
+	0x65, 0xde, 0x88, 0x02, 0x9e, 0x7c, 0x71, 0xbd, 0xfb, 0xe3, 0x8c, 0x0b, 0xb3, 0xb2, 0xff, 0xc3,
+	0xf1, 0xee, 0xfd, 0x57, 0xe0, 0x33, 0xb2, 0xef, 0x54, 0x64, 0x6a, 0xaa, 0xe0, 0x74, 0xd2, 0x3b,
+	0x1c, 0x91, 0x8c, 0x9d, 0x87, 0xaf, 0x7f, 0xf1, 0xf1, 0x26, 0x9f, 0x7f, 0xfe, 0xf9, 0xea, 0x86,
+	0xfe, 0x69, 0x77, 0xfa, 0x0f, 0x23, 0xe6, 0x79, 0xda, 0x60, 0xad, 0x0b, 0xa8, 0x90, 0x9e, 0x50,
+	0x31, 0x8a, 0x41, 0x7a, 0xf2, 0x31, 0x78, 0x78, 0xc3, 0x67, 0x9b, 0xd2, 0x1e, 0xad, 0x14, 0x92,
+	0x54, 0x17, 0x8b, 0x4f, 0xae, 0x77, 0x94, 0xea, 0x62, 0xef, 0x72, 0x8b, 0x60, 0xe7, 0xb1, 0xce,
+	0xba, 0x17, 0x39, 0x73, 0xde, 0xbe, 0xea, 0xfd, 0x99, 0xce, 0x45, 0x99, 0x11, 0x5d, 0x65, 0x34,
+	0x83, 0x72, 0xfd, 0x5e, 0x74, 0xd3, 0x38, 0xfd, 0x9f, 0x3e, 0xb3, 0xe0, 0x9b, 0x7b, 0xb0, 0xe4,
+	0xfc, 0xbb, 0x3b, 0x5f, 0x9a, 0x40, 0x2e, 0x91, 0x18, 0xd8, 0xa1, 0x28, 0x24, 0x7d, 0x31, 0xde,
+	0x58, 0x49, 0xcc, 0x25, 0xc6, 0x83, 0x24, 0x8e, 0xc2, 0xd8, 0x4a, 0xfe, 0xba, 0x47, 0xe6, 0x3b,
+	0x63, 0x5c, 0x22, 0x63, 0x83, 0x88, 0xb1, 0x28, 0x64, 0xcc, 0xca, 0x2e, 0x6f, 0xad, 0xe7, 0x0c,
+	0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x88, 0x26, 0x88, 0x99, 0x4e, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdScheduleViewServiceClient is the client API for AdScheduleViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdScheduleViewServiceClient interface {
+	// Returns the requested ad schedule view in full detail.
+	GetAdScheduleView(ctx context.Context, in *GetAdScheduleViewRequest, opts ...grpc.CallOption) (*resources.AdScheduleView, error)
+}
+
+type adScheduleViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdScheduleViewServiceClient(cc grpc.ClientConnInterface) AdScheduleViewServiceClient {
+	return &adScheduleViewServiceClient{cc}
+}
+
+func (c *adScheduleViewServiceClient) GetAdScheduleView(ctx context.Context, in *GetAdScheduleViewRequest, opts ...grpc.CallOption) (*resources.AdScheduleView, error) {
+	out := new(resources.AdScheduleView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdScheduleViewService/GetAdScheduleView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdScheduleViewServiceServer is the server API for AdScheduleViewService service.
+type AdScheduleViewServiceServer interface {
+	// Returns the requested ad schedule view in full detail.
+	GetAdScheduleView(context.Context, *GetAdScheduleViewRequest) (*resources.AdScheduleView, error)
+}
+
+// UnimplementedAdScheduleViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdScheduleViewServiceServer struct {
+}
+
+func (*UnimplementedAdScheduleViewServiceServer) GetAdScheduleView(ctx context.Context, req *GetAdScheduleViewRequest) (*resources.AdScheduleView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAdScheduleView not implemented")
+}
+
+func RegisterAdScheduleViewServiceServer(s *grpc.Server, srv AdScheduleViewServiceServer) {
+	s.RegisterService(&_AdScheduleViewService_serviceDesc, srv)
+}
+
+func _AdScheduleViewService_GetAdScheduleView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdScheduleViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdScheduleViewServiceServer).GetAdScheduleView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdScheduleViewService/GetAdScheduleView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdScheduleViewServiceServer).GetAdScheduleView(ctx, req.(*GetAdScheduleViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdScheduleViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdScheduleViewService",
+	HandlerType: (*AdScheduleViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAdScheduleView",
+			Handler:    _AdScheduleViewService_GetAdScheduleView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_schedule_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/ad_service.pb.go b/googleapis/ads/googleads/v3/services/ad_service.pb.go
new file mode 100644
index 0000000..ec106e6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/ad_service.pb.go
@@ -0,0 +1,454 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/ad_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AdService.GetAd][google.ads.googleads.v3.services.AdService.GetAd].
+type GetAdRequest struct {
+	// Required. The resource name of the ad to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAdRequest) Reset()         { *m = GetAdRequest{} }
+func (m *GetAdRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAdRequest) ProtoMessage()    {}
+func (*GetAdRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eaf281ec3618ebbd, []int{0}
+}
+
+func (m *GetAdRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAdRequest.Unmarshal(m, b)
+}
+func (m *GetAdRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAdRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAdRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAdRequest.Merge(m, src)
+}
+func (m *GetAdRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAdRequest.Size(m)
+}
+func (m *GetAdRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAdRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAdRequest proto.InternalMessageInfo
+
+func (m *GetAdRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AdService.MutateAds][google.ads.googleads.v3.services.AdService.MutateAds].
+type MutateAdsRequest struct {
+	// Required. The ID of the customer whose ads are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual ads.
+	Operations           []*AdOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
+}
+
+func (m *MutateAdsRequest) Reset()         { *m = MutateAdsRequest{} }
+func (m *MutateAdsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAdsRequest) ProtoMessage()    {}
+func (*MutateAdsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eaf281ec3618ebbd, []int{1}
+}
+
+func (m *MutateAdsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdsRequest.Unmarshal(m, b)
+}
+func (m *MutateAdsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAdsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdsRequest.Merge(m, src)
+}
+func (m *MutateAdsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAdsRequest.Size(m)
+}
+func (m *MutateAdsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdsRequest proto.InternalMessageInfo
+
+func (m *MutateAdsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAdsRequest) GetOperations() []*AdOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+// A single update operation on an ad.
+type AdOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AdOperation_Update
+	Operation            isAdOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *AdOperation) Reset()         { *m = AdOperation{} }
+func (m *AdOperation) String() string { return proto.CompactTextString(m) }
+func (*AdOperation) ProtoMessage()    {}
+func (*AdOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eaf281ec3618ebbd, []int{2}
+}
+
+func (m *AdOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdOperation.Unmarshal(m, b)
+}
+func (m *AdOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdOperation.Marshal(b, m, deterministic)
+}
+func (m *AdOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdOperation.Merge(m, src)
+}
+func (m *AdOperation) XXX_Size() int {
+	return xxx_messageInfo_AdOperation.Size(m)
+}
+func (m *AdOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdOperation proto.InternalMessageInfo
+
+func (m *AdOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isAdOperation_Operation interface {
+	isAdOperation_Operation()
+}
+
+type AdOperation_Update struct {
+	Update *resources.Ad `protobuf:"bytes,1,opt,name=update,proto3,oneof"`
+}
+
+func (*AdOperation_Update) isAdOperation_Operation() {}
+
+func (m *AdOperation) GetOperation() isAdOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AdOperation) GetUpdate() *resources.Ad {
+	if x, ok := m.GetOperation().(*AdOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AdOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AdOperation_Update)(nil),
+	}
+}
+
+// Response message for an ad mutate.
+type MutateAdsResponse struct {
+	// All results for the mutate.
+	Results              []*MutateAdResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *MutateAdsResponse) Reset()         { *m = MutateAdsResponse{} }
+func (m *MutateAdsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAdsResponse) ProtoMessage()    {}
+func (*MutateAdsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eaf281ec3618ebbd, []int{3}
+}
+
+func (m *MutateAdsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdsResponse.Unmarshal(m, b)
+}
+func (m *MutateAdsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAdsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdsResponse.Merge(m, src)
+}
+func (m *MutateAdsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAdsResponse.Size(m)
+}
+func (m *MutateAdsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdsResponse proto.InternalMessageInfo
+
+func (m *MutateAdsResponse) GetResults() []*MutateAdResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the ad mutate.
+type MutateAdResult struct {
+	// The resource name returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAdResult) Reset()         { *m = MutateAdResult{} }
+func (m *MutateAdResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAdResult) ProtoMessage()    {}
+func (*MutateAdResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eaf281ec3618ebbd, []int{4}
+}
+
+func (m *MutateAdResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAdResult.Unmarshal(m, b)
+}
+func (m *MutateAdResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAdResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAdResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAdResult.Merge(m, src)
+}
+func (m *MutateAdResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAdResult.Size(m)
+}
+func (m *MutateAdResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAdResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAdResult proto.InternalMessageInfo
+
+func (m *MutateAdResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAdRequest)(nil), "google.ads.googleads.v3.services.GetAdRequest")
+	proto.RegisterType((*MutateAdsRequest)(nil), "google.ads.googleads.v3.services.MutateAdsRequest")
+	proto.RegisterType((*AdOperation)(nil), "google.ads.googleads.v3.services.AdOperation")
+	proto.RegisterType((*MutateAdsResponse)(nil), "google.ads.googleads.v3.services.MutateAdsResponse")
+	proto.RegisterType((*MutateAdResult)(nil), "google.ads.googleads.v3.services.MutateAdResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/ad_service.proto", fileDescriptor_eaf281ec3618ebbd)
+}
+
+var fileDescriptor_eaf281ec3618ebbd = []byte{
+	// 619 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x31, 0x6f, 0xd3, 0x40,
+	0x18, 0xc5, 0x8e, 0x28, 0xca, 0xb9, 0x54, 0x70, 0x03, 0x44, 0x06, 0x89, 0xc8, 0xb4, 0x22, 0x8a,
+	0xe8, 0x19, 0x62, 0x21, 0x21, 0x57, 0x15, 0xba, 0x0c, 0xb4, 0x20, 0x0a, 0x95, 0x91, 0x32, 0xa0,
+	0x48, 0xd1, 0x25, 0x77, 0x35, 0x56, 0x63, 0x9f, 0xf1, 0xd9, 0x59, 0xaa, 0x2e, 0xcc, 0x30, 0xb1,
+	0xb0, 0xb0, 0x30, 0xf2, 0x33, 0x18, 0xbb, 0xb2, 0x75, 0x62, 0x60, 0x62, 0x67, 0x47, 0xf6, 0xf9,
+	0x1c, 0x47, 0x22, 0x4a, 0xd9, 0x3e, 0xfb, 0x7b, 0xef, 0xdd, 0xbb, 0xf7, 0x7d, 0x36, 0x78, 0xe8,
+	0x73, 0xee, 0x4f, 0x99, 0x4d, 0xa8, 0xb0, 0x65, 0x99, 0x57, 0x33, 0xc7, 0x16, 0x2c, 0x99, 0x05,
+	0x13, 0x26, 0x6c, 0x42, 0x47, 0x65, 0x8d, 0xe2, 0x84, 0xa7, 0x1c, 0xb6, 0x25, 0x0e, 0x11, 0x2a,
+	0x50, 0x45, 0x41, 0x33, 0x07, 0x29, 0x8a, 0xd9, 0x5d, 0x26, 0x9a, 0x30, 0xc1, 0xb3, 0x44, 0xaa,
+	0x4a, 0x35, 0xf3, 0xb6, 0xc2, 0xc6, 0x81, 0x4d, 0xa2, 0x88, 0xa7, 0x24, 0x0d, 0x78, 0x24, 0xca,
+	0xee, 0xcd, 0x5a, 0x77, 0x32, 0x0d, 0x58, 0x94, 0x96, 0x8d, 0x3b, 0xb5, 0xc6, 0x51, 0xc0, 0xa6,
+	0x74, 0x34, 0x66, 0x6f, 0xc9, 0x2c, 0xe0, 0x49, 0x09, 0x28, 0x5d, 0xda, 0xc5, 0xd3, 0x38, 0x3b,
+	0x2a, 0x51, 0x21, 0x11, 0xc7, 0x12, 0x61, 0x3d, 0x06, 0xeb, 0x7b, 0x2c, 0xc5, 0xd4, 0x63, 0xef,
+	0x32, 0x26, 0x52, 0xd8, 0x01, 0x57, 0x95, 0xbf, 0x51, 0x44, 0x42, 0xd6, 0xd2, 0xda, 0x5a, 0xa7,
+	0xd9, 0x6f, 0xfc, 0xc4, 0xba, 0xb7, 0xae, 0x3a, 0x2f, 0x49, 0xc8, 0xac, 0x0f, 0x1a, 0xb8, 0x76,
+	0x90, 0xa5, 0x24, 0x65, 0x98, 0x0a, 0x45, 0xdf, 0x04, 0xc6, 0x24, 0x13, 0x29, 0x0f, 0x59, 0x32,
+	0x0a, 0x68, 0x9d, 0x0c, 0xd4, 0xfb, 0x67, 0x14, 0x7a, 0x00, 0xf0, 0x98, 0x25, 0xf2, 0x92, 0x2d,
+	0xbd, 0xdd, 0xe8, 0x18, 0xbd, 0x6d, 0xb4, 0x2a, 0x51, 0x84, 0xe9, 0x2b, 0xc5, 0x2a, 0x35, 0xe7,
+	0x2a, 0xd6, 0x67, 0x0d, 0x18, 0x35, 0x00, 0xdc, 0x01, 0x46, 0x16, 0x53, 0x92, 0xb2, 0xe2, 0xb6,
+	0x2d, 0xbd, 0xad, 0x75, 0x8c, 0x9e, 0xa9, 0x0e, 0x51, 0x81, 0xa0, 0xa7, 0x79, 0x20, 0x07, 0x44,
+	0x1c, 0x7b, 0x40, 0xc2, 0xf3, 0x1a, 0x3e, 0x01, 0x6b, 0xf2, 0xa9, 0xb8, 0x81, 0xd1, 0xdb, 0x5a,
+	0x6a, 0xae, 0x1a, 0x26, 0xc2, 0x74, 0xff, 0x92, 0x57, 0xd2, 0xfa, 0x06, 0x68, 0x56, 0xde, 0xac,
+	0x11, 0xb8, 0x5e, 0x0b, 0x4a, 0xc4, 0x3c, 0x12, 0x0c, 0x3e, 0x07, 0x57, 0x12, 0x26, 0xb2, 0x69,
+	0xaa, 0x02, 0x78, 0xb0, 0x3a, 0x00, 0xa5, 0xe2, 0x15, 0x44, 0x4f, 0x09, 0x58, 0x8f, 0xc0, 0xc6,
+	0x62, 0x0b, 0xde, 0xfd, 0xe7, 0x18, 0x17, 0x27, 0xd8, 0xfb, 0xd8, 0x00, 0x4d, 0x4c, 0x5f, 0x4b,
+	0x75, 0xf8, 0x45, 0x03, 0x97, 0x8b, 0x55, 0x80, 0x68, 0xb5, 0x93, 0xfa, 0xce, 0x98, 0x17, 0x4b,
+	0xc7, 0xda, 0x3d, 0xc7, 0x8b, 0xa6, 0xde, 0xff, 0xf8, 0xf5, 0x49, 0xbf, 0x07, 0xb7, 0xf2, 0x8f,
+	0xe2, 0x64, 0xa1, 0xb3, 0xab, 0x96, 0x45, 0xd8, 0xdd, 0xe2, 0x03, 0xea, 0x9e, 0xc2, 0xef, 0x1a,
+	0x68, 0x56, 0x31, 0xc2, 0xde, 0xc5, 0xd3, 0x52, 0xcb, 0x69, 0x3a, 0xff, 0xc5, 0x91, 0x73, 0xb2,
+	0x5e, 0x9c, 0xe3, 0x1b, 0xb5, 0x95, 0xbe, 0x3f, 0x5f, 0xb9, 0xc2, 0xfe, 0xb6, 0xd5, 0xc9, 0xed,
+	0xcf, 0xfd, 0x9e, 0xd4, 0xc0, 0xbb, 0xdd, 0xd3, 0xdc, 0xbd, 0x1b, 0x16, 0xaa, 0xae, 0xd6, 0x35,
+	0x6f, 0x9d, 0xe1, 0xd6, 0xfc, 0xe4, 0xb2, 0x8a, 0x03, 0x81, 0x26, 0x3c, 0xec, 0xff, 0xd1, 0xc0,
+	0xe6, 0x84, 0x87, 0x2b, 0x5d, 0xf6, 0x37, 0xaa, 0xa9, 0x1d, 0xe6, 0x7b, 0x7c, 0xa8, 0xbd, 0xd9,
+	0x2f, 0x39, 0x3e, 0x9f, 0x92, 0xc8, 0x47, 0x3c, 0xf1, 0x6d, 0x9f, 0x45, 0xc5, 0x96, 0xdb, 0xf3,
+	0x53, 0x96, 0xff, 0xe0, 0x76, 0x54, 0xf1, 0x55, 0x6f, 0xec, 0x61, 0xfc, 0x4d, 0x6f, 0xef, 0x49,
+	0x41, 0x4c, 0x05, 0x92, 0x65, 0x5e, 0x0d, 0x1c, 0x54, 0x1e, 0x2c, 0xce, 0x14, 0x64, 0x88, 0xa9,
+	0x18, 0x56, 0x90, 0xe1, 0xc0, 0x19, 0x2a, 0xc8, 0x6f, 0x7d, 0x53, 0xbe, 0x77, 0x5d, 0x4c, 0x85,
+	0xeb, 0x56, 0x20, 0xd7, 0x1d, 0x38, 0xae, 0xab, 0x60, 0xe3, 0xb5, 0xc2, 0xa7, 0xf3, 0x37, 0x00,
+	0x00, 0xff, 0xff, 0x5c, 0x86, 0xe6, 0x2e, 0x87, 0x05, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AdServiceClient is the client API for AdService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AdServiceClient interface {
+	// Returns the requested ad in full detail.
+	GetAd(ctx context.Context, in *GetAdRequest, opts ...grpc.CallOption) (*resources.Ad, error)
+	// Updates ads. Operation statuses are returned.
+	MutateAds(ctx context.Context, in *MutateAdsRequest, opts ...grpc.CallOption) (*MutateAdsResponse, error)
+}
+
+type adServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAdServiceClient(cc grpc.ClientConnInterface) AdServiceClient {
+	return &adServiceClient{cc}
+}
+
+func (c *adServiceClient) GetAd(ctx context.Context, in *GetAdRequest, opts ...grpc.CallOption) (*resources.Ad, error) {
+	out := new(resources.Ad)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdService/GetAd", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *adServiceClient) MutateAds(ctx context.Context, in *MutateAdsRequest, opts ...grpc.CallOption) (*MutateAdsResponse, error) {
+	out := new(MutateAdsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdService/MutateAds", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AdServiceServer is the server API for AdService service.
+type AdServiceServer interface {
+	// Returns the requested ad in full detail.
+	GetAd(context.Context, *GetAdRequest) (*resources.Ad, error)
+	// Updates ads. Operation statuses are returned.
+	MutateAds(context.Context, *MutateAdsRequest) (*MutateAdsResponse, error)
+}
+
+// UnimplementedAdServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAdServiceServer struct {
+}
+
+func (*UnimplementedAdServiceServer) GetAd(ctx context.Context, req *GetAdRequest) (*resources.Ad, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAd not implemented")
+}
+func (*UnimplementedAdServiceServer) MutateAds(ctx context.Context, req *MutateAdsRequest) (*MutateAdsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateAds not implemented")
+}
+
+func RegisterAdServiceServer(s *grpc.Server, srv AdServiceServer) {
+	s.RegisterService(&_AdService_serviceDesc, srv)
+}
+
+func _AdService_GetAd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAdRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdServiceServer).GetAd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdService/GetAd",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdServiceServer).GetAd(ctx, req.(*GetAdRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AdService_MutateAds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAdsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AdServiceServer).MutateAds(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AdService/MutateAds",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AdServiceServer).MutateAds(ctx, req.(*MutateAdsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AdService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AdService",
+	HandlerType: (*AdServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAd",
+			Handler:    _AdService_GetAd_Handler,
+		},
+		{
+			MethodName: "MutateAds",
+			Handler:    _AdService_MutateAds_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/ad_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/age_range_view_service.pb.go b/googleapis/ads/googleads/v3/services/age_range_view_service.pb.go
new file mode 100644
index 0000000..c3e7679
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/age_range_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/age_range_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AgeRangeViewService.GetAgeRangeView][google.ads.googleads.v3.services.AgeRangeViewService.GetAgeRangeView].
+type GetAgeRangeViewRequest struct {
+	// Required. The resource name of the age range view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAgeRangeViewRequest) Reset()         { *m = GetAgeRangeViewRequest{} }
+func (m *GetAgeRangeViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAgeRangeViewRequest) ProtoMessage()    {}
+func (*GetAgeRangeViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8b0ca94c02774afd, []int{0}
+}
+
+func (m *GetAgeRangeViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAgeRangeViewRequest.Unmarshal(m, b)
+}
+func (m *GetAgeRangeViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAgeRangeViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAgeRangeViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAgeRangeViewRequest.Merge(m, src)
+}
+func (m *GetAgeRangeViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAgeRangeViewRequest.Size(m)
+}
+func (m *GetAgeRangeViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAgeRangeViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAgeRangeViewRequest proto.InternalMessageInfo
+
+func (m *GetAgeRangeViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAgeRangeViewRequest)(nil), "google.ads.googleads.v3.services.GetAgeRangeViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/age_range_view_service.proto", fileDescriptor_8b0ca94c02774afd)
+}
+
+var fileDescriptor_8b0ca94c02774afd = []byte{
+	// 415 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x31, 0x8b, 0xd4, 0x40,
+	0x18, 0x25, 0x39, 0x10, 0x0c, 0x8a, 0x10, 0x41, 0x97, 0x28, 0xb8, 0x1c, 0x57, 0x1c, 0x57, 0xcc,
+	0xa0, 0x01, 0x91, 0x91, 0x2b, 0x26, 0x4d, 0xac, 0xe4, 0x58, 0x21, 0x85, 0x04, 0xc2, 0x5c, 0xf2,
+	0x39, 0x0e, 0x24, 0x33, 0xeb, 0x4c, 0x36, 0x57, 0x88, 0x8d, 0x7f, 0xc1, 0x7f, 0x60, 0xe9, 0xff,
+	0xb0, 0xb9, 0xd6, 0xce, 0xca, 0xc2, 0xca, 0x9f, 0x60, 0xa3, 0x64, 0x27, 0x93, 0xcd, 0xea, 0x2e,
+	0xdb, 0x3d, 0xf2, 0xde, 0xfb, 0xde, 0xf7, 0xbd, 0x49, 0x70, 0xce, 0x95, 0xe2, 0x35, 0x60, 0x56,
+	0x19, 0x6c, 0x61, 0x8f, 0xba, 0x18, 0x1b, 0xd0, 0x9d, 0x28, 0xc1, 0x60, 0xc6, 0xa1, 0xd0, 0x4c,
+	0x72, 0x28, 0x3a, 0x01, 0x57, 0xc5, 0xf0, 0x1d, 0x2d, 0xb5, 0x6a, 0x55, 0x38, 0xb7, 0x1e, 0xc4,
+	0x2a, 0x83, 0x46, 0x3b, 0xea, 0x62, 0xe4, 0xec, 0xd1, 0xd3, 0x7d, 0x01, 0x1a, 0x8c, 0x5a, 0xe9,
+	0xff, 0x13, 0xec, 0xe4, 0xe8, 0xa1, 0xf3, 0x2d, 0x05, 0x66, 0x52, 0xaa, 0x96, 0xb5, 0x42, 0x49,
+	0x33, 0xb0, 0xf7, 0x27, 0x6c, 0x59, 0x0b, 0x90, 0xed, 0x40, 0x3c, 0x9a, 0x10, 0x6f, 0x04, 0xd4,
+	0x55, 0x71, 0x09, 0x6f, 0x59, 0x27, 0x94, 0xb6, 0x82, 0xe3, 0x24, 0xb8, 0x97, 0x42, 0x4b, 0x39,
+	0x2c, 0xfa, 0xc4, 0x4c, 0xc0, 0xd5, 0x02, 0xde, 0xad, 0xc0, 0xb4, 0xe1, 0x69, 0x70, 0xdb, 0xed,
+	0x54, 0x48, 0xd6, 0xc0, 0xcc, 0x9b, 0x7b, 0xa7, 0x37, 0x93, 0xa3, 0x1f, 0xd4, 0x5f, 0xdc, 0x72,
+	0xcc, 0x4b, 0xd6, 0xc0, 0x93, 0xdf, 0x5e, 0x70, 0x77, 0x3a, 0xe1, 0x95, 0x3d, 0x36, 0xfc, 0xea,
+	0x05, 0x77, 0xfe, 0x19, 0x1e, 0x3e, 0x43, 0x87, 0x2a, 0x42, 0xbb, 0xf7, 0x89, 0xf0, 0x5e, 0xe7,
+	0x58, 0x1d, 0x9a, 0xfa, 0x8e, 0xd3, 0xef, 0x74, 0xfb, 0x82, 0x8f, 0xdf, 0x7e, 0x7e, 0xf2, 0x1f,
+	0x87, 0xb8, 0xaf, 0xfb, 0xfd, 0x16, 0x73, 0x5e, 0xae, 0x4c, 0xab, 0x1a, 0xd0, 0x06, 0x9f, 0xf5,
+	0xfd, 0x8f, 0x43, 0x0c, 0x3e, 0xfb, 0x10, 0x3d, 0xb8, 0xa6, 0xb3, 0x4d, 0xe0, 0x80, 0x96, 0xc2,
+	0xa0, 0x52, 0x35, 0xc9, 0x1f, 0x2f, 0x38, 0x29, 0x55, 0x73, 0xf0, 0xac, 0x64, 0xb6, 0xa3, 0xa2,
+	0x8b, 0xfe, 0x0d, 0x2e, 0xbc, 0xd7, 0x2f, 0x06, 0x37, 0x57, 0x35, 0x93, 0x1c, 0x29, 0xcd, 0x31,
+	0x07, 0xb9, 0x7e, 0x21, 0xbc, 0xc9, 0xdb, 0xff, 0x57, 0x3e, 0x77, 0xe0, 0xb3, 0x7f, 0x94, 0x52,
+	0xfa, 0xc5, 0x9f, 0xa7, 0x76, 0x20, 0xad, 0x0c, 0xb2, 0xb0, 0x47, 0x59, 0x8c, 0x86, 0x60, 0x73,
+	0xed, 0x24, 0x39, 0xad, 0x4c, 0x3e, 0x4a, 0xf2, 0x2c, 0xce, 0x9d, 0xe4, 0x97, 0x7f, 0x62, 0xbf,
+	0x13, 0x42, 0x2b, 0x43, 0xc8, 0x28, 0x22, 0x24, 0x8b, 0x09, 0x71, 0xb2, 0xcb, 0x1b, 0xeb, 0x3d,
+	0xe3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x7c, 0x1c, 0x10, 0x3c, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AgeRangeViewServiceClient is the client API for AgeRangeViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AgeRangeViewServiceClient interface {
+	// Returns the requested age range view in full detail.
+	GetAgeRangeView(ctx context.Context, in *GetAgeRangeViewRequest, opts ...grpc.CallOption) (*resources.AgeRangeView, error)
+}
+
+type ageRangeViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAgeRangeViewServiceClient(cc grpc.ClientConnInterface) AgeRangeViewServiceClient {
+	return &ageRangeViewServiceClient{cc}
+}
+
+func (c *ageRangeViewServiceClient) GetAgeRangeView(ctx context.Context, in *GetAgeRangeViewRequest, opts ...grpc.CallOption) (*resources.AgeRangeView, error) {
+	out := new(resources.AgeRangeView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AgeRangeViewService/GetAgeRangeView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AgeRangeViewServiceServer is the server API for AgeRangeViewService service.
+type AgeRangeViewServiceServer interface {
+	// Returns the requested age range view in full detail.
+	GetAgeRangeView(context.Context, *GetAgeRangeViewRequest) (*resources.AgeRangeView, error)
+}
+
+// UnimplementedAgeRangeViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAgeRangeViewServiceServer struct {
+}
+
+func (*UnimplementedAgeRangeViewServiceServer) GetAgeRangeView(ctx context.Context, req *GetAgeRangeViewRequest) (*resources.AgeRangeView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAgeRangeView not implemented")
+}
+
+func RegisterAgeRangeViewServiceServer(s *grpc.Server, srv AgeRangeViewServiceServer) {
+	s.RegisterService(&_AgeRangeViewService_serviceDesc, srv)
+}
+
+func _AgeRangeViewService_GetAgeRangeView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAgeRangeViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AgeRangeViewServiceServer).GetAgeRangeView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AgeRangeViewService/GetAgeRangeView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AgeRangeViewServiceServer).GetAgeRangeView(ctx, req.(*GetAgeRangeViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AgeRangeViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AgeRangeViewService",
+	HandlerType: (*AgeRangeViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAgeRangeView",
+			Handler:    _AgeRangeViewService_GetAgeRangeView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/age_range_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/asset_service.pb.go b/googleapis/ads/googleads/v3/services/asset_service.pb.go
new file mode 100644
index 0000000..f3dfe04
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/asset_service.pb.go
@@ -0,0 +1,444 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/asset_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [AssetService.GetAsset][google.ads.googleads.v3.services.AssetService.GetAsset]
+type GetAssetRequest struct {
+	// Required. The resource name of the asset to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetAssetRequest) Reset()         { *m = GetAssetRequest{} }
+func (m *GetAssetRequest) String() string { return proto.CompactTextString(m) }
+func (*GetAssetRequest) ProtoMessage()    {}
+func (*GetAssetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_09a43928a39eb915, []int{0}
+}
+
+func (m *GetAssetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetAssetRequest.Unmarshal(m, b)
+}
+func (m *GetAssetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetAssetRequest.Marshal(b, m, deterministic)
+}
+func (m *GetAssetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetAssetRequest.Merge(m, src)
+}
+func (m *GetAssetRequest) XXX_Size() int {
+	return xxx_messageInfo_GetAssetRequest.Size(m)
+}
+func (m *GetAssetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetAssetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetAssetRequest proto.InternalMessageInfo
+
+func (m *GetAssetRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [AssetService.MutateAssets][google.ads.googleads.v3.services.AssetService.MutateAssets]
+type MutateAssetsRequest struct {
+	// Required. The ID of the customer whose assets are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual assets.
+	Operations           []*AssetOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *MutateAssetsRequest) Reset()         { *m = MutateAssetsRequest{} }
+func (m *MutateAssetsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateAssetsRequest) ProtoMessage()    {}
+func (*MutateAssetsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_09a43928a39eb915, []int{1}
+}
+
+func (m *MutateAssetsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAssetsRequest.Unmarshal(m, b)
+}
+func (m *MutateAssetsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAssetsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateAssetsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAssetsRequest.Merge(m, src)
+}
+func (m *MutateAssetsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateAssetsRequest.Size(m)
+}
+func (m *MutateAssetsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAssetsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAssetsRequest proto.InternalMessageInfo
+
+func (m *MutateAssetsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateAssetsRequest) GetOperations() []*AssetOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+// A single operation to create an asset. Supported asset types are
+// YoutubeVideoAsset, MediaBundleAsset and ImageAsset. TextAsset should be
+// created with Ad inline.
+type AssetOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*AssetOperation_Create
+	Operation            isAssetOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *AssetOperation) Reset()         { *m = AssetOperation{} }
+func (m *AssetOperation) String() string { return proto.CompactTextString(m) }
+func (*AssetOperation) ProtoMessage()    {}
+func (*AssetOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_09a43928a39eb915, []int{2}
+}
+
+func (m *AssetOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AssetOperation.Unmarshal(m, b)
+}
+func (m *AssetOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AssetOperation.Marshal(b, m, deterministic)
+}
+func (m *AssetOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AssetOperation.Merge(m, src)
+}
+func (m *AssetOperation) XXX_Size() int {
+	return xxx_messageInfo_AssetOperation.Size(m)
+}
+func (m *AssetOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_AssetOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AssetOperation proto.InternalMessageInfo
+
+type isAssetOperation_Operation interface {
+	isAssetOperation_Operation()
+}
+
+type AssetOperation_Create struct {
+	Create *resources.Asset `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+func (*AssetOperation_Create) isAssetOperation_Operation() {}
+
+func (m *AssetOperation) GetOperation() isAssetOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *AssetOperation) GetCreate() *resources.Asset {
+	if x, ok := m.GetOperation().(*AssetOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AssetOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AssetOperation_Create)(nil),
+	}
+}
+
+// Response message for an asset mutate.
+type MutateAssetsResponse struct {
+	// All results for the mutate.
+	Results              []*MutateAssetResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *MutateAssetsResponse) Reset()         { *m = MutateAssetsResponse{} }
+func (m *MutateAssetsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateAssetsResponse) ProtoMessage()    {}
+func (*MutateAssetsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_09a43928a39eb915, []int{3}
+}
+
+func (m *MutateAssetsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAssetsResponse.Unmarshal(m, b)
+}
+func (m *MutateAssetsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAssetsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateAssetsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAssetsResponse.Merge(m, src)
+}
+func (m *MutateAssetsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateAssetsResponse.Size(m)
+}
+func (m *MutateAssetsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAssetsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAssetsResponse proto.InternalMessageInfo
+
+func (m *MutateAssetsResponse) GetResults() []*MutateAssetResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the asset mutate.
+type MutateAssetResult struct {
+	// The resource name returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateAssetResult) Reset()         { *m = MutateAssetResult{} }
+func (m *MutateAssetResult) String() string { return proto.CompactTextString(m) }
+func (*MutateAssetResult) ProtoMessage()    {}
+func (*MutateAssetResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_09a43928a39eb915, []int{4}
+}
+
+func (m *MutateAssetResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateAssetResult.Unmarshal(m, b)
+}
+func (m *MutateAssetResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateAssetResult.Marshal(b, m, deterministic)
+}
+func (m *MutateAssetResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateAssetResult.Merge(m, src)
+}
+func (m *MutateAssetResult) XXX_Size() int {
+	return xxx_messageInfo_MutateAssetResult.Size(m)
+}
+func (m *MutateAssetResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateAssetResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateAssetResult proto.InternalMessageInfo
+
+func (m *MutateAssetResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetAssetRequest)(nil), "google.ads.googleads.v3.services.GetAssetRequest")
+	proto.RegisterType((*MutateAssetsRequest)(nil), "google.ads.googleads.v3.services.MutateAssetsRequest")
+	proto.RegisterType((*AssetOperation)(nil), "google.ads.googleads.v3.services.AssetOperation")
+	proto.RegisterType((*MutateAssetsResponse)(nil), "google.ads.googleads.v3.services.MutateAssetsResponse")
+	proto.RegisterType((*MutateAssetResult)(nil), "google.ads.googleads.v3.services.MutateAssetResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/asset_service.proto", fileDescriptor_09a43928a39eb915)
+}
+
+var fileDescriptor_09a43928a39eb915 = []byte{
+	// 581 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xbd, 0x6e, 0xd3, 0x5e,
+	0x14, 0xff, 0xdb, 0x91, 0xfa, 0xa7, 0x37, 0x01, 0x54, 0x83, 0x20, 0x0a, 0x48, 0x44, 0x26, 0x43,
+	0x14, 0xe0, 0xba, 0xc4, 0x80, 0x90, 0xab, 0x4a, 0x38, 0x4b, 0xca, 0x50, 0x5a, 0x05, 0x91, 0x01,
+	0x45, 0x8a, 0x6e, 0xed, 0x83, 0xb1, 0x14, 0xfb, 0x06, 0x9f, 0x9b, 0x2c, 0x55, 0x17, 0x1e, 0x01,
+	0xde, 0x80, 0x09, 0x78, 0x94, 0x0e, 0x2c, 0x6c, 0x9d, 0x18, 0x98, 0x78, 0x02, 0x46, 0x64, 0x5f,
+	0x5f, 0xc7, 0x01, 0xa2, 0xd0, 0xed, 0xc4, 0xe7, 0xf7, 0x71, 0xbe, 0x6e, 0xc8, 0x83, 0x80, 0xf3,
+	0x60, 0x02, 0x16, 0xf3, 0xd1, 0x92, 0x61, 0x1a, 0xcd, 0x6d, 0x0b, 0x21, 0x99, 0x87, 0x1e, 0xa0,
+	0xc5, 0x10, 0x41, 0x8c, 0xf3, 0x9f, 0x74, 0x9a, 0x70, 0xc1, 0x8d, 0xa6, 0x84, 0x52, 0xe6, 0x23,
+	0x2d, 0x58, 0x74, 0x6e, 0x53, 0xc5, 0x6a, 0xdc, 0x5b, 0xa5, 0x9b, 0x00, 0xf2, 0x59, 0x52, 0x08,
+	0x4b, 0xc1, 0xc6, 0x4d, 0x05, 0x9f, 0x86, 0x16, 0x8b, 0x63, 0x2e, 0x98, 0x08, 0x79, 0x8c, 0x79,
+	0xf6, 0x7a, 0x29, 0xeb, 0x4d, 0x42, 0x88, 0x15, 0xed, 0x56, 0x29, 0xf1, 0x2a, 0x84, 0x89, 0x3f,
+	0x3e, 0x82, 0xd7, 0x6c, 0x1e, 0xf2, 0x44, 0x02, 0xcc, 0x1d, 0x72, 0xb9, 0x0f, 0xc2, 0x4d, 0x9d,
+	0x06, 0xf0, 0x66, 0x06, 0x28, 0x8c, 0x36, 0xb9, 0xa8, 0x6a, 0x18, 0xc7, 0x2c, 0x82, 0xba, 0xd6,
+	0xd4, 0xda, 0x9b, 0xbd, 0xca, 0x37, 0x57, 0x1f, 0xd4, 0x54, 0xe6, 0x19, 0x8b, 0xc0, 0x7c, 0xa7,
+	0x91, 0x2b, 0xfb, 0x33, 0xc1, 0x04, 0x64, 0x02, 0xa8, 0x14, 0x5a, 0xa4, 0xea, 0xcd, 0x50, 0xf0,
+	0x08, 0x92, 0x71, 0xe8, 0x97, 0xf9, 0x44, 0x7d, 0x7f, 0xea, 0x1b, 0x2f, 0x08, 0xe1, 0x53, 0x48,
+	0x64, 0x23, 0x75, 0xbd, 0x59, 0x69, 0x57, 0xbb, 0xdb, 0x74, 0xdd, 0xe0, 0x68, 0x66, 0x75, 0xa0,
+	0x88, 0xb9, 0xec, 0x42, 0xc8, 0x64, 0xe4, 0xd2, 0x32, 0xc4, 0xe8, 0x91, 0x0d, 0x2f, 0x01, 0x26,
+	0x64, 0x27, 0xd5, 0x6e, 0x7b, 0xa5, 0x49, 0x31, 0x7b, 0xe9, 0xb2, 0xf7, 0xdf, 0x20, 0x67, 0xf6,
+	0xaa, 0x64, 0xb3, 0xf0, 0x30, 0x81, 0x5c, 0x5d, 0x6e, 0x1b, 0xa7, 0x3c, 0x46, 0x30, 0xf6, 0xc9,
+	0xff, 0x09, 0xe0, 0x6c, 0x22, 0x54, 0x3b, 0xf6, 0xfa, 0x76, 0x4a, 0x42, 0x83, 0x8c, 0x3b, 0x50,
+	0x1a, 0xe6, 0x63, 0xb2, 0xf5, 0x47, 0xd6, 0xb8, 0xfd, 0xd7, 0xed, 0x2c, 0x2f, 0xa6, 0xfb, 0xb1,
+	0x42, 0x6a, 0x19, 0xe9, 0xb9, 0xb4, 0x31, 0x3e, 0x69, 0xe4, 0x82, 0xda, 0xb3, 0x71, 0x7f, 0x7d,
+	0x55, 0xbf, 0xdd, 0x44, 0xe3, 0x9f, 0x47, 0x66, 0x3e, 0x39, 0x73, 0x97, 0x0b, 0x7c, 0xfb, 0xf5,
+	0xfb, 0x7b, 0xbd, 0x63, 0xb4, 0xd3, 0xdb, 0x3e, 0x5e, 0xca, 0xec, 0xaa, 0x63, 0x40, 0xab, 0x23,
+	0x8f, 0x1d, 0xad, 0xce, 0x89, 0xf1, 0x45, 0x23, 0xb5, 0xf2, 0x78, 0x8d, 0x87, 0xe7, 0x9a, 0xa2,
+	0xba, 0xc2, 0xc6, 0xa3, 0xf3, 0xd2, 0xe4, 0x16, 0xcd, 0x83, 0x33, 0xf7, 0x5a, 0xe9, 0x7c, 0xef,
+	0x2e, 0x6e, 0x2b, 0x6b, 0x65, 0xdb, 0xbc, 0x93, 0xb6, 0xb2, 0xa8, 0xfd, 0xb8, 0x04, 0xde, 0xed,
+	0x9c, 0xe4, 0x9d, 0x38, 0x51, 0xa6, 0xed, 0x68, 0x9d, 0xc6, 0x8d, 0x53, 0xb7, 0xbe, 0xf0, 0xcf,
+	0xa3, 0x69, 0x88, 0xd4, 0xe3, 0x51, 0xef, 0xa7, 0x46, 0x5a, 0x1e, 0x8f, 0xd6, 0xd6, 0xda, 0xdb,
+	0x2a, 0x2f, 0xf4, 0x30, 0x7d, 0xbc, 0x87, 0xda, 0xcb, 0xbd, 0x9c, 0x16, 0xf0, 0x09, 0x8b, 0x03,
+	0xca, 0x93, 0xc0, 0x0a, 0x20, 0xce, 0x9e, 0xb6, 0xb5, 0x30, 0x5a, 0xfd, 0xe7, 0xb5, 0xa3, 0x82,
+	0x0f, 0x7a, 0xa5, 0xef, 0xba, 0x9f, 0xf5, 0x66, 0x5f, 0x0a, 0xba, 0x3e, 0x52, 0x19, 0xa6, 0xd1,
+	0xd0, 0xa6, 0xb9, 0x31, 0x9e, 0x2a, 0xc8, 0xc8, 0xf5, 0x71, 0x54, 0x40, 0x46, 0x43, 0x7b, 0xa4,
+	0x20, 0x3f, 0xf4, 0x96, 0xfc, 0xee, 0x38, 0xae, 0x8f, 0x8e, 0x53, 0x80, 0x1c, 0x67, 0x68, 0x3b,
+	0x8e, 0x82, 0x1d, 0x6d, 0x64, 0x75, 0xda, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xeb, 0x47, 0x5c,
+	0xd3, 0x63, 0x05, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// AssetServiceClient is the client API for AssetService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type AssetServiceClient interface {
+	// Returns the requested asset in full detail.
+	GetAsset(ctx context.Context, in *GetAssetRequest, opts ...grpc.CallOption) (*resources.Asset, error)
+	// Creates assets. Operation statuses are returned.
+	MutateAssets(ctx context.Context, in *MutateAssetsRequest, opts ...grpc.CallOption) (*MutateAssetsResponse, error)
+}
+
+type assetServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewAssetServiceClient(cc grpc.ClientConnInterface) AssetServiceClient {
+	return &assetServiceClient{cc}
+}
+
+func (c *assetServiceClient) GetAsset(ctx context.Context, in *GetAssetRequest, opts ...grpc.CallOption) (*resources.Asset, error) {
+	out := new(resources.Asset)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AssetService/GetAsset", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *assetServiceClient) MutateAssets(ctx context.Context, in *MutateAssetsRequest, opts ...grpc.CallOption) (*MutateAssetsResponse, error) {
+	out := new(MutateAssetsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AssetService/MutateAssets", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// AssetServiceServer is the server API for AssetService service.
+type AssetServiceServer interface {
+	// Returns the requested asset in full detail.
+	GetAsset(context.Context, *GetAssetRequest) (*resources.Asset, error)
+	// Creates assets. Operation statuses are returned.
+	MutateAssets(context.Context, *MutateAssetsRequest) (*MutateAssetsResponse, error)
+}
+
+// UnimplementedAssetServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedAssetServiceServer struct {
+}
+
+func (*UnimplementedAssetServiceServer) GetAsset(ctx context.Context, req *GetAssetRequest) (*resources.Asset, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetAsset not implemented")
+}
+func (*UnimplementedAssetServiceServer) MutateAssets(ctx context.Context, req *MutateAssetsRequest) (*MutateAssetsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateAssets not implemented")
+}
+
+func RegisterAssetServiceServer(s *grpc.Server, srv AssetServiceServer) {
+	s.RegisterService(&_AssetService_serviceDesc, srv)
+}
+
+func _AssetService_GetAsset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetAssetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AssetServiceServer).GetAsset(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AssetService/GetAsset",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AssetServiceServer).GetAsset(ctx, req.(*GetAssetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _AssetService_MutateAssets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateAssetsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(AssetServiceServer).MutateAssets(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.AssetService/MutateAssets",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(AssetServiceServer).MutateAssets(ctx, req.(*MutateAssetsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _AssetService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.AssetService",
+	HandlerType: (*AssetServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetAsset",
+			Handler:    _AssetService_GetAsset_Handler,
+		},
+		{
+			MethodName: "MutateAssets",
+			Handler:    _AssetService_MutateAssets_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/asset_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/bidding_strategy_service.pb.go b/googleapis/ads/googleads/v3/services/bidding_strategy_service.pb.go
new file mode 100644
index 0000000..0f6eb47
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/bidding_strategy_service.pb.go
@@ -0,0 +1,531 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/bidding_strategy_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [BiddingStrategyService.GetBiddingStrategy][google.ads.googleads.v3.services.BiddingStrategyService.GetBiddingStrategy].
+type GetBiddingStrategyRequest struct {
+	// Required. The resource name of the bidding strategy to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetBiddingStrategyRequest) Reset()         { *m = GetBiddingStrategyRequest{} }
+func (m *GetBiddingStrategyRequest) String() string { return proto.CompactTextString(m) }
+func (*GetBiddingStrategyRequest) ProtoMessage()    {}
+func (*GetBiddingStrategyRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_527fe3c2a1fca4fa, []int{0}
+}
+
+func (m *GetBiddingStrategyRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetBiddingStrategyRequest.Unmarshal(m, b)
+}
+func (m *GetBiddingStrategyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetBiddingStrategyRequest.Marshal(b, m, deterministic)
+}
+func (m *GetBiddingStrategyRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetBiddingStrategyRequest.Merge(m, src)
+}
+func (m *GetBiddingStrategyRequest) XXX_Size() int {
+	return xxx_messageInfo_GetBiddingStrategyRequest.Size(m)
+}
+func (m *GetBiddingStrategyRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetBiddingStrategyRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetBiddingStrategyRequest proto.InternalMessageInfo
+
+func (m *GetBiddingStrategyRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [BiddingStrategyService.MutateBiddingStrategies][google.ads.googleads.v3.services.BiddingStrategyService.MutateBiddingStrategies].
+type MutateBiddingStrategiesRequest struct {
+	// Required. The ID of the customer whose bidding strategies are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual bidding strategies.
+	Operations []*BiddingStrategyOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateBiddingStrategiesRequest) Reset()         { *m = MutateBiddingStrategiesRequest{} }
+func (m *MutateBiddingStrategiesRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateBiddingStrategiesRequest) ProtoMessage()    {}
+func (*MutateBiddingStrategiesRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_527fe3c2a1fca4fa, []int{1}
+}
+
+func (m *MutateBiddingStrategiesRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateBiddingStrategiesRequest.Unmarshal(m, b)
+}
+func (m *MutateBiddingStrategiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateBiddingStrategiesRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateBiddingStrategiesRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateBiddingStrategiesRequest.Merge(m, src)
+}
+func (m *MutateBiddingStrategiesRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateBiddingStrategiesRequest.Size(m)
+}
+func (m *MutateBiddingStrategiesRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateBiddingStrategiesRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateBiddingStrategiesRequest proto.InternalMessageInfo
+
+func (m *MutateBiddingStrategiesRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateBiddingStrategiesRequest) GetOperations() []*BiddingStrategyOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateBiddingStrategiesRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateBiddingStrategiesRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a bidding strategy.
+type BiddingStrategyOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*BiddingStrategyOperation_Create
+	//	*BiddingStrategyOperation_Update
+	//	*BiddingStrategyOperation_Remove
+	Operation            isBiddingStrategyOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
+	XXX_unrecognized     []byte                               `json:"-"`
+	XXX_sizecache        int32                                `json:"-"`
+}
+
+func (m *BiddingStrategyOperation) Reset()         { *m = BiddingStrategyOperation{} }
+func (m *BiddingStrategyOperation) String() string { return proto.CompactTextString(m) }
+func (*BiddingStrategyOperation) ProtoMessage()    {}
+func (*BiddingStrategyOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_527fe3c2a1fca4fa, []int{2}
+}
+
+func (m *BiddingStrategyOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BiddingStrategyOperation.Unmarshal(m, b)
+}
+func (m *BiddingStrategyOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BiddingStrategyOperation.Marshal(b, m, deterministic)
+}
+func (m *BiddingStrategyOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BiddingStrategyOperation.Merge(m, src)
+}
+func (m *BiddingStrategyOperation) XXX_Size() int {
+	return xxx_messageInfo_BiddingStrategyOperation.Size(m)
+}
+func (m *BiddingStrategyOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_BiddingStrategyOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BiddingStrategyOperation proto.InternalMessageInfo
+
+func (m *BiddingStrategyOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isBiddingStrategyOperation_Operation interface {
+	isBiddingStrategyOperation_Operation()
+}
+
+type BiddingStrategyOperation_Create struct {
+	Create *resources.BiddingStrategy `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type BiddingStrategyOperation_Update struct {
+	Update *resources.BiddingStrategy `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type BiddingStrategyOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*BiddingStrategyOperation_Create) isBiddingStrategyOperation_Operation() {}
+
+func (*BiddingStrategyOperation_Update) isBiddingStrategyOperation_Operation() {}
+
+func (*BiddingStrategyOperation_Remove) isBiddingStrategyOperation_Operation() {}
+
+func (m *BiddingStrategyOperation) GetOperation() isBiddingStrategyOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *BiddingStrategyOperation) GetCreate() *resources.BiddingStrategy {
+	if x, ok := m.GetOperation().(*BiddingStrategyOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *BiddingStrategyOperation) GetUpdate() *resources.BiddingStrategy {
+	if x, ok := m.GetOperation().(*BiddingStrategyOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *BiddingStrategyOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*BiddingStrategyOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*BiddingStrategyOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*BiddingStrategyOperation_Create)(nil),
+		(*BiddingStrategyOperation_Update)(nil),
+		(*BiddingStrategyOperation_Remove)(nil),
+	}
+}
+
+// Response message for bidding strategy mutate.
+type MutateBiddingStrategiesResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateBiddingStrategyResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
+	XXX_unrecognized     []byte                         `json:"-"`
+	XXX_sizecache        int32                          `json:"-"`
+}
+
+func (m *MutateBiddingStrategiesResponse) Reset()         { *m = MutateBiddingStrategiesResponse{} }
+func (m *MutateBiddingStrategiesResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateBiddingStrategiesResponse) ProtoMessage()    {}
+func (*MutateBiddingStrategiesResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_527fe3c2a1fca4fa, []int{3}
+}
+
+func (m *MutateBiddingStrategiesResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateBiddingStrategiesResponse.Unmarshal(m, b)
+}
+func (m *MutateBiddingStrategiesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateBiddingStrategiesResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateBiddingStrategiesResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateBiddingStrategiesResponse.Merge(m, src)
+}
+func (m *MutateBiddingStrategiesResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateBiddingStrategiesResponse.Size(m)
+}
+func (m *MutateBiddingStrategiesResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateBiddingStrategiesResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateBiddingStrategiesResponse proto.InternalMessageInfo
+
+func (m *MutateBiddingStrategiesResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateBiddingStrategiesResponse) GetResults() []*MutateBiddingStrategyResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the bidding strategy mutate.
+type MutateBiddingStrategyResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateBiddingStrategyResult) Reset()         { *m = MutateBiddingStrategyResult{} }
+func (m *MutateBiddingStrategyResult) String() string { return proto.CompactTextString(m) }
+func (*MutateBiddingStrategyResult) ProtoMessage()    {}
+func (*MutateBiddingStrategyResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_527fe3c2a1fca4fa, []int{4}
+}
+
+func (m *MutateBiddingStrategyResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateBiddingStrategyResult.Unmarshal(m, b)
+}
+func (m *MutateBiddingStrategyResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateBiddingStrategyResult.Marshal(b, m, deterministic)
+}
+func (m *MutateBiddingStrategyResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateBiddingStrategyResult.Merge(m, src)
+}
+func (m *MutateBiddingStrategyResult) XXX_Size() int {
+	return xxx_messageInfo_MutateBiddingStrategyResult.Size(m)
+}
+func (m *MutateBiddingStrategyResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateBiddingStrategyResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateBiddingStrategyResult proto.InternalMessageInfo
+
+func (m *MutateBiddingStrategyResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetBiddingStrategyRequest)(nil), "google.ads.googleads.v3.services.GetBiddingStrategyRequest")
+	proto.RegisterType((*MutateBiddingStrategiesRequest)(nil), "google.ads.googleads.v3.services.MutateBiddingStrategiesRequest")
+	proto.RegisterType((*BiddingStrategyOperation)(nil), "google.ads.googleads.v3.services.BiddingStrategyOperation")
+	proto.RegisterType((*MutateBiddingStrategiesResponse)(nil), "google.ads.googleads.v3.services.MutateBiddingStrategiesResponse")
+	proto.RegisterType((*MutateBiddingStrategyResult)(nil), "google.ads.googleads.v3.services.MutateBiddingStrategyResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/bidding_strategy_service.proto", fileDescriptor_527fe3c2a1fca4fa)
+}
+
+var fileDescriptor_527fe3c2a1fca4fa = []byte{
+	// 771 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcd, 0x6b, 0xe3, 0x46,
+	0x14, 0xaf, 0xe4, 0x90, 0x36, 0xe3, 0xa4, 0x85, 0x29, 0x4d, 0x54, 0xa7, 0x34, 0x46, 0x0d, 0xd4,
+	0x98, 0x22, 0x81, 0x4d, 0x4b, 0x91, 0x09, 0xad, 0x0c, 0xf9, 0x28, 0x6d, 0x9a, 0xa0, 0x40, 0x0a,
+	0xc1, 0x20, 0xc6, 0xd2, 0x44, 0x15, 0x91, 0x34, 0xea, 0xcc, 0xc8, 0x60, 0x42, 0x2e, 0xb9, 0xf4,
+	0x0f, 0xe8, 0xad, 0xc7, 0x3d, 0xee, 0x9f, 0xb1, 0xc7, 0x1c, 0x77, 0x6f, 0x39, 0xed, 0x61, 0x4f,
+	0x7b, 0xdf, 0xcb, 0x9e, 0x16, 0x69, 0x34, 0xfe, 0x8a, 0xbd, 0x86, 0xe4, 0xf6, 0x34, 0xef, 0x37,
+	0xbf, 0xf7, 0xf1, 0x7b, 0xf3, 0x04, 0x7e, 0x09, 0x08, 0x09, 0x22, 0x6c, 0x22, 0x9f, 0x99, 0xc2,
+	0xcc, 0xad, 0x41, 0xdb, 0x64, 0x98, 0x0e, 0x42, 0x0f, 0x33, 0xb3, 0x1f, 0xfa, 0x7e, 0x98, 0x04,
+	0x2e, 0xe3, 0x14, 0x71, 0x1c, 0x0c, 0xdd, 0xd2, 0x63, 0xa4, 0x94, 0x70, 0x02, 0xeb, 0xe2, 0x96,
+	0x81, 0x7c, 0x66, 0x8c, 0x08, 0x8c, 0x41, 0xdb, 0x90, 0x04, 0xb5, 0x9f, 0x17, 0x85, 0xa0, 0x98,
+	0x91, 0x8c, 0xce, 0x8b, 0x21, 0xb8, 0x6b, 0xdf, 0xc8, 0x9b, 0x69, 0x68, 0xa2, 0x24, 0x21, 0x1c,
+	0xf1, 0x90, 0x24, 0xac, 0xf4, 0x6e, 0x4d, 0x78, 0xbd, 0x28, 0xc4, 0x09, 0x2f, 0x1d, 0x3b, 0x13,
+	0x8e, 0xcb, 0x10, 0x47, 0xbe, 0xdb, 0xc7, 0x7f, 0xa3, 0x41, 0x48, 0x68, 0x09, 0x28, 0x73, 0x36,
+	0x8b, 0xaf, 0x7e, 0x76, 0x59, 0xa2, 0x62, 0xc4, 0xae, 0x66, 0xb8, 0x69, 0xea, 0x99, 0x8c, 0x23,
+	0x9e, 0x95, 0x41, 0xf5, 0x7d, 0xf0, 0xf5, 0x21, 0xe6, 0x5d, 0x91, 0xef, 0x59, 0x99, 0xae, 0x83,
+	0xff, 0xc9, 0x30, 0xe3, 0xb0, 0x01, 0x36, 0x64, 0x4d, 0x6e, 0x82, 0x62, 0xac, 0x29, 0x75, 0xa5,
+	0xb1, 0xd6, 0xad, 0xbc, 0xb6, 0x55, 0x67, 0x5d, 0x7a, 0xfe, 0x44, 0x31, 0xd6, 0xdf, 0x29, 0xe0,
+	0xdb, 0xe3, 0x8c, 0x23, 0x8e, 0xa7, 0xa9, 0x42, 0xcc, 0x24, 0xd9, 0x2e, 0xa8, 0x7a, 0x19, 0xe3,
+	0x24, 0xc6, 0xd4, 0x0d, 0xfd, 0x49, 0x2a, 0x20, 0xcf, 0x7f, 0xf3, 0xa1, 0x0b, 0x00, 0x49, 0x31,
+	0x15, 0x8d, 0xd1, 0xd4, 0x7a, 0xa5, 0x51, 0x6d, 0x59, 0xc6, 0x32, 0x4d, 0x8c, 0x99, 0x02, 0x4e,
+	0x24, 0x45, 0x19, 0x60, 0x4c, 0x09, 0xbf, 0x07, 0x5f, 0xa4, 0x88, 0xf2, 0x10, 0x45, 0xee, 0x25,
+	0x0a, 0xa3, 0x8c, 0x62, 0xad, 0x52, 0x57, 0x1a, 0x9f, 0x39, 0x9f, 0x97, 0xc7, 0x07, 0xe2, 0x14,
+	0x7e, 0x07, 0x36, 0x06, 0x28, 0x0a, 0x7d, 0xc4, 0xb1, 0x4b, 0x92, 0x68, 0xa8, 0xad, 0x14, 0xb0,
+	0x75, 0x79, 0x78, 0x92, 0x44, 0x43, 0xfd, 0x7f, 0x15, 0x68, 0x8b, 0x62, 0xc3, 0x0e, 0xa8, 0x66,
+	0x69, 0x71, 0x3f, 0x57, 0xa2, 0xb8, 0x5f, 0x6d, 0xd5, 0x64, 0x31, 0x52, 0x2c, 0xe3, 0x20, 0x17,
+	0xeb, 0x18, 0xb1, 0x2b, 0x07, 0x08, 0x78, 0x6e, 0xc3, 0x3f, 0xc0, 0xaa, 0x47, 0x31, 0xe2, 0xa2,
+	0xe9, 0xd5, 0x56, 0x6b, 0x61, 0x13, 0x46, 0x63, 0x37, 0xdb, 0x85, 0xa3, 0x4f, 0x9c, 0x92, 0x23,
+	0x67, 0x13, 0xdc, 0x9a, 0xfa, 0x14, 0x36, 0xc1, 0x01, 0x35, 0xb0, 0x4a, 0x71, 0x4c, 0x06, 0xa2,
+	0x75, 0x6b, 0xb9, 0x47, 0x7c, 0x77, 0xab, 0x60, 0x6d, 0xd4, 0x6b, 0xfd, 0x85, 0x02, 0x76, 0x16,
+	0x0e, 0x05, 0x4b, 0x49, 0xc2, 0x30, 0x3c, 0x00, 0x5f, 0xcd, 0xc8, 0xe1, 0x62, 0x4a, 0x09, 0x2d,
+	0x98, 0xab, 0x2d, 0x28, 0xf3, 0xa4, 0xa9, 0x67, 0x9c, 0x15, 0x83, 0xeb, 0x7c, 0x39, 0x2d, 0xd4,
+	0x7e, 0x0e, 0x87, 0x7f, 0x81, 0x4f, 0x29, 0x66, 0x59, 0xc4, 0xe5, 0xd0, 0xec, 0x2d, 0x1f, 0x9a,
+	0x79, 0xb9, 0x0d, 0x9d, 0x82, 0xc5, 0x91, 0x6c, 0x7a, 0x17, 0x6c, 0x7f, 0x04, 0x97, 0x4f, 0xc9,
+	0x9c, 0x27, 0x32, 0xfd, 0x3a, 0x5a, 0xff, 0xae, 0x80, 0xcd, 0x99, 0xeb, 0x67, 0x22, 0x09, 0xf8,
+	0x52, 0x01, 0xf0, 0xe1, 0x03, 0x84, 0x9d, 0xe5, 0xd9, 0x2f, 0x7c, 0xb6, 0xb5, 0x47, 0x88, 0xab,
+	0xff, 0x7e, 0x6f, 0x4f, 0x17, 0x72, 0xfb, 0xea, 0xcd, 0x7f, 0xea, 0x8f, 0xb0, 0x9d, 0x2f, 0xb6,
+	0xeb, 0x29, 0xcf, 0x9e, 0x7c, 0xae, 0xcc, 0x6c, 0xca, 0x4d, 0x37, 0x56, 0xd6, 0x6c, 0xde, 0xc0,
+	0xf7, 0x0a, 0xd8, 0x5a, 0x20, 0x3c, 0xfc, 0xf5, 0x71, 0xba, 0x8c, 0x17, 0x49, 0xcd, 0x7e, 0x02,
+	0x83, 0x98, 0x3a, 0xfd, 0xe2, 0xde, 0xde, 0x9c, 0x58, 0x46, 0x3f, 0x8c, 0xf7, 0x43, 0x51, 0x76,
+	0x47, 0xff, 0x29, 0x2f, 0x7b, 0x5c, 0xe7, 0xf5, 0x04, 0x78, 0xaf, 0x79, 0xf3, 0xb0, 0x6a, 0x2b,
+	0x2e, 0x22, 0x5a, 0x4a, 0xb3, 0xb6, 0x7d, 0x67, 0x6b, 0xe3, 0xac, 0x4a, 0x2b, 0x0d, 0x99, 0xe1,
+	0x91, 0xb8, 0x7b, 0xab, 0x82, 0x5d, 0x8f, 0xc4, 0x4b, 0x2b, 0xe8, 0x6e, 0xcf, 0x9f, 0x97, 0xd3,
+	0x7c, 0x69, 0x9c, 0x2a, 0x17, 0x47, 0x25, 0x41, 0x40, 0x22, 0x94, 0x04, 0x06, 0xa1, 0x81, 0x19,
+	0xe0, 0xa4, 0x58, 0x29, 0xe6, 0x38, 0xe4, 0xe2, 0xbf, 0x60, 0x47, 0x1a, 0xcf, 0xd4, 0xca, 0xa1,
+	0x6d, 0x3f, 0x57, 0xeb, 0x87, 0x82, 0xd0, 0xf6, 0x99, 0x21, 0xcc, 0xdc, 0x3a, 0x6f, 0x1b, 0x65,
+	0x60, 0x76, 0x27, 0x21, 0x3d, 0xdb, 0x67, 0xbd, 0x11, 0xa4, 0x77, 0xde, 0xee, 0x49, 0xc8, 0x5b,
+	0x75, 0x57, 0x9c, 0x5b, 0x96, 0xed, 0x33, 0xcb, 0x1a, 0x81, 0x2c, 0xeb, 0xbc, 0x6d, 0x59, 0x12,
+	0xd6, 0x5f, 0x2d, 0xf2, 0x6c, 0x7f, 0x08, 0x00, 0x00, 0xff, 0xff, 0xed, 0x02, 0xf8, 0x92, 0xac,
+	0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// BiddingStrategyServiceClient is the client API for BiddingStrategyService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type BiddingStrategyServiceClient interface {
+	// Returns the requested bidding strategy in full detail.
+	GetBiddingStrategy(ctx context.Context, in *GetBiddingStrategyRequest, opts ...grpc.CallOption) (*resources.BiddingStrategy, error)
+	// Creates, updates, or removes bidding strategies. Operation statuses are
+	// returned.
+	MutateBiddingStrategies(ctx context.Context, in *MutateBiddingStrategiesRequest, opts ...grpc.CallOption) (*MutateBiddingStrategiesResponse, error)
+}
+
+type biddingStrategyServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewBiddingStrategyServiceClient(cc grpc.ClientConnInterface) BiddingStrategyServiceClient {
+	return &biddingStrategyServiceClient{cc}
+}
+
+func (c *biddingStrategyServiceClient) GetBiddingStrategy(ctx context.Context, in *GetBiddingStrategyRequest, opts ...grpc.CallOption) (*resources.BiddingStrategy, error) {
+	out := new(resources.BiddingStrategy)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.BiddingStrategyService/GetBiddingStrategy", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biddingStrategyServiceClient) MutateBiddingStrategies(ctx context.Context, in *MutateBiddingStrategiesRequest, opts ...grpc.CallOption) (*MutateBiddingStrategiesResponse, error) {
+	out := new(MutateBiddingStrategiesResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.BiddingStrategyService/MutateBiddingStrategies", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// BiddingStrategyServiceServer is the server API for BiddingStrategyService service.
+type BiddingStrategyServiceServer interface {
+	// Returns the requested bidding strategy in full detail.
+	GetBiddingStrategy(context.Context, *GetBiddingStrategyRequest) (*resources.BiddingStrategy, error)
+	// Creates, updates, or removes bidding strategies. Operation statuses are
+	// returned.
+	MutateBiddingStrategies(context.Context, *MutateBiddingStrategiesRequest) (*MutateBiddingStrategiesResponse, error)
+}
+
+// UnimplementedBiddingStrategyServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedBiddingStrategyServiceServer struct {
+}
+
+func (*UnimplementedBiddingStrategyServiceServer) GetBiddingStrategy(ctx context.Context, req *GetBiddingStrategyRequest) (*resources.BiddingStrategy, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetBiddingStrategy not implemented")
+}
+func (*UnimplementedBiddingStrategyServiceServer) MutateBiddingStrategies(ctx context.Context, req *MutateBiddingStrategiesRequest) (*MutateBiddingStrategiesResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateBiddingStrategies not implemented")
+}
+
+func RegisterBiddingStrategyServiceServer(s *grpc.Server, srv BiddingStrategyServiceServer) {
+	s.RegisterService(&_BiddingStrategyService_serviceDesc, srv)
+}
+
+func _BiddingStrategyService_GetBiddingStrategy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetBiddingStrategyRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiddingStrategyServiceServer).GetBiddingStrategy(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.BiddingStrategyService/GetBiddingStrategy",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiddingStrategyServiceServer).GetBiddingStrategy(ctx, req.(*GetBiddingStrategyRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiddingStrategyService_MutateBiddingStrategies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateBiddingStrategiesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiddingStrategyServiceServer).MutateBiddingStrategies(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.BiddingStrategyService/MutateBiddingStrategies",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiddingStrategyServiceServer).MutateBiddingStrategies(ctx, req.(*MutateBiddingStrategiesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _BiddingStrategyService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.BiddingStrategyService",
+	HandlerType: (*BiddingStrategyServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetBiddingStrategy",
+			Handler:    _BiddingStrategyService_GetBiddingStrategy_Handler,
+		},
+		{
+			MethodName: "MutateBiddingStrategies",
+			Handler:    _BiddingStrategyService_MutateBiddingStrategies_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/bidding_strategy_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/billing_setup_service.pb.go b/googleapis/ads/googleads/v3/services/billing_setup_service.pb.go
new file mode 100644
index 0000000..af08d50
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/billing_setup_service.pb.go
@@ -0,0 +1,461 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/billing_setup_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [BillingSetupService.GetBillingSetup][google.ads.googleads.v3.services.BillingSetupService.GetBillingSetup].
+type GetBillingSetupRequest struct {
+	// Required. The resource name of the billing setup to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetBillingSetupRequest) Reset()         { *m = GetBillingSetupRequest{} }
+func (m *GetBillingSetupRequest) String() string { return proto.CompactTextString(m) }
+func (*GetBillingSetupRequest) ProtoMessage()    {}
+func (*GetBillingSetupRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_af7397edaa9e82ba, []int{0}
+}
+
+func (m *GetBillingSetupRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetBillingSetupRequest.Unmarshal(m, b)
+}
+func (m *GetBillingSetupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetBillingSetupRequest.Marshal(b, m, deterministic)
+}
+func (m *GetBillingSetupRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetBillingSetupRequest.Merge(m, src)
+}
+func (m *GetBillingSetupRequest) XXX_Size() int {
+	return xxx_messageInfo_GetBillingSetupRequest.Size(m)
+}
+func (m *GetBillingSetupRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetBillingSetupRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetBillingSetupRequest proto.InternalMessageInfo
+
+func (m *GetBillingSetupRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for billing setup mutate operations.
+type MutateBillingSetupRequest struct {
+	// Required. Id of the customer to apply the billing setup mutate operation to.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The operation to perform.
+	Operation            *BillingSetupOperation `protobuf:"bytes,2,opt,name=operation,proto3" json:"operation,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *MutateBillingSetupRequest) Reset()         { *m = MutateBillingSetupRequest{} }
+func (m *MutateBillingSetupRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateBillingSetupRequest) ProtoMessage()    {}
+func (*MutateBillingSetupRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_af7397edaa9e82ba, []int{1}
+}
+
+func (m *MutateBillingSetupRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateBillingSetupRequest.Unmarshal(m, b)
+}
+func (m *MutateBillingSetupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateBillingSetupRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateBillingSetupRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateBillingSetupRequest.Merge(m, src)
+}
+func (m *MutateBillingSetupRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateBillingSetupRequest.Size(m)
+}
+func (m *MutateBillingSetupRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateBillingSetupRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateBillingSetupRequest proto.InternalMessageInfo
+
+func (m *MutateBillingSetupRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateBillingSetupRequest) GetOperation() *BillingSetupOperation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+// A single operation on a billing setup, which describes the cancellation of an
+// existing billing setup.
+type BillingSetupOperation struct {
+	// Only one of these operations can be set. "Update" operations are not
+	// supported.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*BillingSetupOperation_Create
+	//	*BillingSetupOperation_Remove
+	Operation            isBillingSetupOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *BillingSetupOperation) Reset()         { *m = BillingSetupOperation{} }
+func (m *BillingSetupOperation) String() string { return proto.CompactTextString(m) }
+func (*BillingSetupOperation) ProtoMessage()    {}
+func (*BillingSetupOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_af7397edaa9e82ba, []int{2}
+}
+
+func (m *BillingSetupOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BillingSetupOperation.Unmarshal(m, b)
+}
+func (m *BillingSetupOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BillingSetupOperation.Marshal(b, m, deterministic)
+}
+func (m *BillingSetupOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BillingSetupOperation.Merge(m, src)
+}
+func (m *BillingSetupOperation) XXX_Size() int {
+	return xxx_messageInfo_BillingSetupOperation.Size(m)
+}
+func (m *BillingSetupOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_BillingSetupOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BillingSetupOperation proto.InternalMessageInfo
+
+type isBillingSetupOperation_Operation interface {
+	isBillingSetupOperation_Operation()
+}
+
+type BillingSetupOperation_Create struct {
+	Create *resources.BillingSetup `protobuf:"bytes,2,opt,name=create,proto3,oneof"`
+}
+
+type BillingSetupOperation_Remove struct {
+	Remove string `protobuf:"bytes,1,opt,name=remove,proto3,oneof"`
+}
+
+func (*BillingSetupOperation_Create) isBillingSetupOperation_Operation() {}
+
+func (*BillingSetupOperation_Remove) isBillingSetupOperation_Operation() {}
+
+func (m *BillingSetupOperation) GetOperation() isBillingSetupOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *BillingSetupOperation) GetCreate() *resources.BillingSetup {
+	if x, ok := m.GetOperation().(*BillingSetupOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *BillingSetupOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*BillingSetupOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*BillingSetupOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*BillingSetupOperation_Create)(nil),
+		(*BillingSetupOperation_Remove)(nil),
+	}
+}
+
+// Response message for a billing setup operation.
+type MutateBillingSetupResponse struct {
+	// A result that identifies the resource affected by the mutate request.
+	Result               *MutateBillingSetupResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
+	XXX_unrecognized     []byte                    `json:"-"`
+	XXX_sizecache        int32                     `json:"-"`
+}
+
+func (m *MutateBillingSetupResponse) Reset()         { *m = MutateBillingSetupResponse{} }
+func (m *MutateBillingSetupResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateBillingSetupResponse) ProtoMessage()    {}
+func (*MutateBillingSetupResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_af7397edaa9e82ba, []int{3}
+}
+
+func (m *MutateBillingSetupResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateBillingSetupResponse.Unmarshal(m, b)
+}
+func (m *MutateBillingSetupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateBillingSetupResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateBillingSetupResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateBillingSetupResponse.Merge(m, src)
+}
+func (m *MutateBillingSetupResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateBillingSetupResponse.Size(m)
+}
+func (m *MutateBillingSetupResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateBillingSetupResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateBillingSetupResponse proto.InternalMessageInfo
+
+func (m *MutateBillingSetupResponse) GetResult() *MutateBillingSetupResult {
+	if m != nil {
+		return m.Result
+	}
+	return nil
+}
+
+// Result for a single billing setup mutate.
+type MutateBillingSetupResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateBillingSetupResult) Reset()         { *m = MutateBillingSetupResult{} }
+func (m *MutateBillingSetupResult) String() string { return proto.CompactTextString(m) }
+func (*MutateBillingSetupResult) ProtoMessage()    {}
+func (*MutateBillingSetupResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_af7397edaa9e82ba, []int{4}
+}
+
+func (m *MutateBillingSetupResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateBillingSetupResult.Unmarshal(m, b)
+}
+func (m *MutateBillingSetupResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateBillingSetupResult.Marshal(b, m, deterministic)
+}
+func (m *MutateBillingSetupResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateBillingSetupResult.Merge(m, src)
+}
+func (m *MutateBillingSetupResult) XXX_Size() int {
+	return xxx_messageInfo_MutateBillingSetupResult.Size(m)
+}
+func (m *MutateBillingSetupResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateBillingSetupResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateBillingSetupResult proto.InternalMessageInfo
+
+func (m *MutateBillingSetupResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetBillingSetupRequest)(nil), "google.ads.googleads.v3.services.GetBillingSetupRequest")
+	proto.RegisterType((*MutateBillingSetupRequest)(nil), "google.ads.googleads.v3.services.MutateBillingSetupRequest")
+	proto.RegisterType((*BillingSetupOperation)(nil), "google.ads.googleads.v3.services.BillingSetupOperation")
+	proto.RegisterType((*MutateBillingSetupResponse)(nil), "google.ads.googleads.v3.services.MutateBillingSetupResponse")
+	proto.RegisterType((*MutateBillingSetupResult)(nil), "google.ads.googleads.v3.services.MutateBillingSetupResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/billing_setup_service.proto", fileDescriptor_af7397edaa9e82ba)
+}
+
+var fileDescriptor_af7397edaa9e82ba = []byte{
+	// 604 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xcf, 0x8b, 0xd3, 0x40,
+	0x14, 0x36, 0x29, 0x14, 0x76, 0xaa, 0x08, 0x23, 0xab, 0xb1, 0x0a, 0x96, 0xd8, 0x43, 0x29, 0x92,
+	0xc1, 0x06, 0x59, 0x99, 0xdd, 0x45, 0x92, 0x4b, 0x77, 0x0f, 0xea, 0xd2, 0xc5, 0x1e, 0x96, 0x42,
+	0x49, 0x93, 0x31, 0x06, 0x92, 0x4c, 0xcc, 0x4c, 0x7a, 0x59, 0xf6, 0xe2, 0xcd, 0xb3, 0x67, 0x2f,
+	0x1e, 0xfd, 0x3f, 0xbc, 0xec, 0xd5, 0xdb, 0x9e, 0x04, 0xc5, 0x83, 0xff, 0x84, 0x92, 0x4c, 0xa6,
+	0x4d, 0xdd, 0x94, 0xb2, 0x7b, 0x7b, 0x33, 0xef, 0x7b, 0xdf, 0xf7, 0x7e, 0xcd, 0x80, 0x3d, 0x9f,
+	0x52, 0x3f, 0x24, 0xc8, 0xf1, 0x18, 0x12, 0x66, 0x6e, 0xcd, 0x4d, 0xc4, 0x48, 0x3a, 0x0f, 0x5c,
+	0xc2, 0xd0, 0x2c, 0x08, 0xc3, 0x20, 0xf6, 0xa7, 0x8c, 0xf0, 0x2c, 0x99, 0x96, 0xd7, 0x46, 0x92,
+	0x52, 0x4e, 0x61, 0x47, 0x84, 0x18, 0x8e, 0xc7, 0x8c, 0x45, 0xb4, 0x31, 0x37, 0x0d, 0x19, 0xdd,
+	0x7e, 0xb6, 0x8e, 0x3f, 0x25, 0x8c, 0x66, 0xe9, 0x25, 0x01, 0x41, 0xdc, 0x7e, 0x28, 0xc3, 0x92,
+	0x00, 0x39, 0x71, 0x4c, 0xb9, 0xc3, 0x03, 0x1a, 0xb3, 0xd2, 0x7b, 0xaf, 0xe2, 0x75, 0xc3, 0x80,
+	0xc4, 0xbc, 0x74, 0x3c, 0xaa, 0x38, 0xde, 0x06, 0x24, 0xf4, 0xa6, 0x33, 0xf2, 0xce, 0x99, 0x07,
+	0x34, 0x15, 0x00, 0xdd, 0x06, 0x77, 0x87, 0x84, 0xdb, 0x42, 0xf1, 0x38, 0x17, 0x1c, 0x91, 0xf7,
+	0x19, 0x61, 0x1c, 0xf6, 0xc0, 0x2d, 0x99, 0xd2, 0x34, 0x76, 0x22, 0xa2, 0x29, 0x1d, 0xa5, 0xb7,
+	0x65, 0x37, 0x7e, 0x58, 0xea, 0xe8, 0xa6, 0xf4, 0xbc, 0x72, 0x22, 0xa2, 0x7f, 0x56, 0xc0, 0xfd,
+	0x97, 0x19, 0x77, 0x38, 0xa9, 0xe3, 0xe9, 0x82, 0x96, 0x9b, 0x31, 0x4e, 0x23, 0x92, 0x4e, 0x03,
+	0xaf, 0xca, 0x02, 0xe4, 0xfd, 0xa1, 0x07, 0x4f, 0xc0, 0x16, 0x4d, 0x48, 0x5a, 0x54, 0xa5, 0xa9,
+	0x1d, 0xa5, 0xd7, 0x1a, 0xec, 0x18, 0x9b, 0x9a, 0x69, 0x54, 0xf5, 0x5e, 0xcb, 0x70, 0x41, 0xbe,
+	0xa4, 0xd3, 0x3f, 0x2a, 0x60, 0xbb, 0x16, 0x09, 0x0f, 0x41, 0xd3, 0x4d, 0x89, 0xc3, 0x49, 0x29,
+	0x89, 0xd6, 0x4a, 0x2e, 0xa6, 0xb3, 0xa2, 0x79, 0x70, 0x63, 0x54, 0x12, 0x40, 0x0d, 0x34, 0x53,
+	0x12, 0xd1, 0x79, 0xd9, 0xa7, 0xdc, 0x23, 0xce, 0x76, 0xab, 0x52, 0x9a, 0x9e, 0x80, 0x76, 0x5d,
+	0xab, 0x58, 0x42, 0x63, 0x46, 0xe0, 0x28, 0x27, 0x61, 0x59, 0xc8, 0x0b, 0x92, 0xd6, 0x00, 0x6f,
+	0x6e, 0x41, 0x2d, 0x5b, 0x16, 0xf2, 0x51, 0xc9, 0xa4, 0xbf, 0x00, 0xda, 0x3a, 0x0c, 0x7c, 0x5c,
+	0x3b, 0xe3, 0xd5, 0xf1, 0x0e, 0x7e, 0x36, 0xc0, 0x9d, 0x6a, 0xec, 0xb1, 0x90, 0x86, 0xdf, 0x14,
+	0x70, 0xfb, 0xbf, 0xdd, 0x81, 0xcf, 0x37, 0x27, 0x5c, 0xbf, 0x6e, 0xed, 0xab, 0xb6, 0x5e, 0x1f,
+	0x5e, 0x58, 0xab, 0xc9, 0x7f, 0xf8, 0xfe, 0xeb, 0x93, 0xfa, 0x14, 0xa2, 0xfc, 0x31, 0x9d, 0xae,
+	0x78, 0xf6, 0xe5, 0xa2, 0x31, 0xd4, 0x97, 0xaf, 0xab, 0x20, 0x61, 0xa8, 0x7f, 0x06, 0x7f, 0x2b,
+	0x00, 0x5e, 0xee, 0x10, 0xdc, 0xbd, 0x5e, 0xef, 0x45, 0x35, 0x7b, 0xd7, 0x1c, 0x5c, 0xb1, 0x06,
+	0xfa, 0x9b, 0x0b, 0x6b, 0xbb, 0xf2, 0x66, 0x9e, 0x2c, 0xd6, 0xa7, 0x28, 0x71, 0x47, 0x1f, 0xe4,
+	0x25, 0x2e, 0x6b, 0x3a, 0xad, 0x60, 0xf7, 0xfb, 0x67, 0xab, 0x15, 0xe2, 0xa8, 0xd0, 0xc1, 0x4a,
+	0xbf, 0xfd, 0xe0, 0xdc, 0xd2, 0x96, 0xb9, 0x94, 0x56, 0x12, 0x30, 0xc3, 0xa5, 0x91, 0xfd, 0x57,
+	0x01, 0x5d, 0x97, 0x46, 0x1b, 0xf3, 0xb6, 0xb5, 0x9a, 0x5d, 0x38, 0xca, 0xff, 0x92, 0x23, 0xe5,
+	0xe4, 0xa0, 0x8c, 0xf6, 0x69, 0xe8, 0xc4, 0xbe, 0x41, 0x53, 0x1f, 0xf9, 0x24, 0x2e, 0x7e, 0x1a,
+	0xb4, 0xd4, 0x5b, 0xff, 0xb7, 0xee, 0x4a, 0xe3, 0x8b, 0xda, 0x18, 0x5a, 0xd6, 0x57, 0xb5, 0x33,
+	0x14, 0x84, 0x96, 0xc7, 0x0c, 0x61, 0xe6, 0xd6, 0xd8, 0x34, 0x4a, 0x61, 0x76, 0x2e, 0x21, 0x13,
+	0xcb, 0x63, 0x93, 0x05, 0x64, 0x32, 0x36, 0x27, 0x12, 0xf2, 0x47, 0xed, 0x8a, 0x7b, 0x8c, 0x2d,
+	0x8f, 0x61, 0xbc, 0x00, 0x61, 0x3c, 0x36, 0x31, 0x96, 0xb0, 0x59, 0xb3, 0xc8, 0xd3, 0xfc, 0x17,
+	0x00, 0x00, 0xff, 0xff, 0xef, 0xc3, 0xe5, 0xae, 0x02, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// BillingSetupServiceClient is the client API for BillingSetupService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type BillingSetupServiceClient interface {
+	// Returns a billing setup.
+	GetBillingSetup(ctx context.Context, in *GetBillingSetupRequest, opts ...grpc.CallOption) (*resources.BillingSetup, error)
+	// Creates a billing setup, or cancels an existing billing setup.
+	MutateBillingSetup(ctx context.Context, in *MutateBillingSetupRequest, opts ...grpc.CallOption) (*MutateBillingSetupResponse, error)
+}
+
+type billingSetupServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewBillingSetupServiceClient(cc grpc.ClientConnInterface) BillingSetupServiceClient {
+	return &billingSetupServiceClient{cc}
+}
+
+func (c *billingSetupServiceClient) GetBillingSetup(ctx context.Context, in *GetBillingSetupRequest, opts ...grpc.CallOption) (*resources.BillingSetup, error) {
+	out := new(resources.BillingSetup)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.BillingSetupService/GetBillingSetup", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *billingSetupServiceClient) MutateBillingSetup(ctx context.Context, in *MutateBillingSetupRequest, opts ...grpc.CallOption) (*MutateBillingSetupResponse, error) {
+	out := new(MutateBillingSetupResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.BillingSetupService/MutateBillingSetup", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// BillingSetupServiceServer is the server API for BillingSetupService service.
+type BillingSetupServiceServer interface {
+	// Returns a billing setup.
+	GetBillingSetup(context.Context, *GetBillingSetupRequest) (*resources.BillingSetup, error)
+	// Creates a billing setup, or cancels an existing billing setup.
+	MutateBillingSetup(context.Context, *MutateBillingSetupRequest) (*MutateBillingSetupResponse, error)
+}
+
+// UnimplementedBillingSetupServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedBillingSetupServiceServer struct {
+}
+
+func (*UnimplementedBillingSetupServiceServer) GetBillingSetup(ctx context.Context, req *GetBillingSetupRequest) (*resources.BillingSetup, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetBillingSetup not implemented")
+}
+func (*UnimplementedBillingSetupServiceServer) MutateBillingSetup(ctx context.Context, req *MutateBillingSetupRequest) (*MutateBillingSetupResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateBillingSetup not implemented")
+}
+
+func RegisterBillingSetupServiceServer(s *grpc.Server, srv BillingSetupServiceServer) {
+	s.RegisterService(&_BillingSetupService_serviceDesc, srv)
+}
+
+func _BillingSetupService_GetBillingSetup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetBillingSetupRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BillingSetupServiceServer).GetBillingSetup(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.BillingSetupService/GetBillingSetup",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BillingSetupServiceServer).GetBillingSetup(ctx, req.(*GetBillingSetupRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BillingSetupService_MutateBillingSetup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateBillingSetupRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BillingSetupServiceServer).MutateBillingSetup(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.BillingSetupService/MutateBillingSetup",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BillingSetupServiceServer).MutateBillingSetup(ctx, req.(*MutateBillingSetupRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _BillingSetupService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.BillingSetupService",
+	HandlerType: (*BillingSetupServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetBillingSetup",
+			Handler:    _BillingSetupService_GetBillingSetup_Handler,
+		},
+		{
+			MethodName: "MutateBillingSetup",
+			Handler:    _BillingSetupService_MutateBillingSetup_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/billing_setup_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_audience_view_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_audience_view_service.pb.go
new file mode 100644
index 0000000..3a2279b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_audience_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_audience_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignAudienceViewService.GetCampaignAudienceView][google.ads.googleads.v3.services.CampaignAudienceViewService.GetCampaignAudienceView].
+type GetCampaignAudienceViewRequest struct {
+	// Required. The resource name of the campaign audience view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignAudienceViewRequest) Reset()         { *m = GetCampaignAudienceViewRequest{} }
+func (m *GetCampaignAudienceViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignAudienceViewRequest) ProtoMessage()    {}
+func (*GetCampaignAudienceViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_fe165b782c41c4e2, []int{0}
+}
+
+func (m *GetCampaignAudienceViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignAudienceViewRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignAudienceViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignAudienceViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignAudienceViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignAudienceViewRequest.Merge(m, src)
+}
+func (m *GetCampaignAudienceViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignAudienceViewRequest.Size(m)
+}
+func (m *GetCampaignAudienceViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignAudienceViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignAudienceViewRequest proto.InternalMessageInfo
+
+func (m *GetCampaignAudienceViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignAudienceViewRequest)(nil), "google.ads.googleads.v3.services.GetCampaignAudienceViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_audience_view_service.proto", fileDescriptor_fe165b782c41c4e2)
+}
+
+var fileDescriptor_fe165b782c41c4e2 = []byte{
+	// 424 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x31, 0x8b, 0xd4, 0x40,
+	0x18, 0x25, 0x39, 0x10, 0x0c, 0xda, 0xa4, 0xb9, 0x23, 0x27, 0x1a, 0x8e, 0x2b, 0x8e, 0x2b, 0x66,
+	0xc0, 0x14, 0x87, 0x23, 0x8a, 0xb3, 0x22, 0x2b, 0x16, 0x7a, 0x9c, 0x90, 0x42, 0x02, 0x61, 0x2e,
+	0xf9, 0x8c, 0x03, 0xc9, 0x4c, 0xcc, 0x24, 0xb9, 0x42, 0x6c, 0x6c, 0xfc, 0x01, 0xfe, 0x83, 0x2b,
+	0xfd, 0x29, 0xd7, 0xda, 0x59, 0x59, 0x68, 0xe3, 0xaf, 0x38, 0xb2, 0x33, 0x93, 0xdd, 0x85, 0xcd,
+	0x6e, 0xf7, 0xc8, 0x7b, 0xdf, 0x7b, 0xdf, 0x7c, 0x2f, 0xde, 0xab, 0x42, 0xca, 0xa2, 0x04, 0xcc,
+	0x72, 0x85, 0x35, 0x1c, 0x50, 0x1f, 0x61, 0x05, 0x4d, 0xcf, 0x33, 0x50, 0x38, 0x63, 0x55, 0xcd,
+	0x78, 0x21, 0x52, 0xd6, 0xe5, 0x1c, 0x44, 0x06, 0x69, 0xcf, 0xe1, 0x2a, 0x35, 0x3c, 0xaa, 0x1b,
+	0xd9, 0x4a, 0x3f, 0xd4, 0xb3, 0x88, 0xe5, 0x0a, 0x8d, 0x36, 0xa8, 0x8f, 0x90, 0xb5, 0x09, 0x9e,
+	0x4f, 0x05, 0x35, 0xa0, 0x64, 0xd7, 0x4c, 0x27, 0xe9, 0x84, 0xe0, 0x81, 0x9d, 0xaf, 0x39, 0x66,
+	0x42, 0xc8, 0x96, 0xb5, 0x5c, 0x0a, 0x65, 0xd8, 0xfd, 0x15, 0x36, 0x2b, 0x39, 0x88, 0xd6, 0x10,
+	0x8f, 0x56, 0x88, 0x8f, 0x1c, 0xca, 0x3c, 0xbd, 0x84, 0x4f, 0xac, 0xe7, 0xb2, 0xd1, 0x82, 0xa3,
+	0x37, 0xde, 0xc3, 0x39, 0xb4, 0x2f, 0x4d, 0x34, 0x35, 0xc9, 0x31, 0x87, 0xab, 0x0b, 0xf8, 0xdc,
+	0x81, 0x6a, 0xfd, 0x13, 0xef, 0xbe, 0xdd, 0x31, 0x15, 0xac, 0x82, 0x03, 0x27, 0x74, 0x4e, 0xee,
+	0xce, 0xf6, 0xfe, 0x50, 0xf7, 0xe2, 0x9e, 0x65, 0xde, 0xb2, 0x0a, 0x1e, 0x5f, 0xbb, 0xde, 0xe1,
+	0x26, 0xa7, 0xf7, 0xfa, 0x08, 0xfe, 0x3f, 0xc7, 0xdb, 0x9f, 0x08, 0xf3, 0x5f, 0xa0, 0x5d, 0x27,
+	0x44, 0xdb, 0xf7, 0x0c, 0xce, 0x26, 0x1d, 0xc6, 0x13, 0xa3, 0x4d, 0xf3, 0x47, 0xef, 0x7e, 0xd3,
+	0xf5, 0x17, 0x7e, 0xfb, 0xf5, 0xf7, 0x87, 0xfb, 0xc4, 0x3f, 0x1b, 0xea, 0xf9, 0xb2, 0xc6, 0x3c,
+	0xcb, 0x3a, 0xd5, 0xca, 0x0a, 0x1a, 0x85, 0x4f, 0xc7, 0xbe, 0x56, 0xcd, 0x14, 0x3e, 0xfd, 0x1a,
+	0x1c, 0xde, 0xd0, 0x83, 0xe5, 0x02, 0x06, 0xd5, 0x5c, 0xa1, 0x4c, 0x56, 0xb3, 0xef, 0xae, 0x77,
+	0x9c, 0xc9, 0x6a, 0xe7, 0x73, 0x67, 0xe1, 0x96, 0x53, 0x9e, 0x0f, 0xdd, 0x9d, 0x3b, 0x1f, 0x5e,
+	0x1b, 0x97, 0x42, 0x96, 0x4c, 0x14, 0x48, 0x36, 0x05, 0x2e, 0x40, 0x2c, 0x9a, 0xc5, 0xcb, 0xdc,
+	0xe9, 0xbf, 0xfb, 0xa9, 0x05, 0xd7, 0xee, 0xde, 0x9c, 0xd2, 0x9f, 0x6e, 0x38, 0xd7, 0x86, 0x34,
+	0x57, 0x48, 0xc3, 0x01, 0xc5, 0x11, 0x32, 0xc1, 0xea, 0xc6, 0x4a, 0x12, 0x9a, 0xab, 0x64, 0x94,
+	0x24, 0x71, 0x94, 0x58, 0xc9, 0x7f, 0xf7, 0x58, 0x7f, 0x27, 0x84, 0xe6, 0x8a, 0x90, 0x51, 0x44,
+	0x48, 0x1c, 0x11, 0x62, 0x65, 0x97, 0x77, 0x16, 0x7b, 0x46, 0xb7, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0x02, 0x16, 0xa9, 0x57, 0x84, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignAudienceViewServiceClient is the client API for CampaignAudienceViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignAudienceViewServiceClient interface {
+	// Returns the requested campaign audience view in full detail.
+	GetCampaignAudienceView(ctx context.Context, in *GetCampaignAudienceViewRequest, opts ...grpc.CallOption) (*resources.CampaignAudienceView, error)
+}
+
+type campaignAudienceViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignAudienceViewServiceClient(cc grpc.ClientConnInterface) CampaignAudienceViewServiceClient {
+	return &campaignAudienceViewServiceClient{cc}
+}
+
+func (c *campaignAudienceViewServiceClient) GetCampaignAudienceView(ctx context.Context, in *GetCampaignAudienceViewRequest, opts ...grpc.CallOption) (*resources.CampaignAudienceView, error) {
+	out := new(resources.CampaignAudienceView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignAudienceViewService/GetCampaignAudienceView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignAudienceViewServiceServer is the server API for CampaignAudienceViewService service.
+type CampaignAudienceViewServiceServer interface {
+	// Returns the requested campaign audience view in full detail.
+	GetCampaignAudienceView(context.Context, *GetCampaignAudienceViewRequest) (*resources.CampaignAudienceView, error)
+}
+
+// UnimplementedCampaignAudienceViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignAudienceViewServiceServer struct {
+}
+
+func (*UnimplementedCampaignAudienceViewServiceServer) GetCampaignAudienceView(ctx context.Context, req *GetCampaignAudienceViewRequest) (*resources.CampaignAudienceView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetCampaignAudienceView not implemented")
+}
+
+func RegisterCampaignAudienceViewServiceServer(s *grpc.Server, srv CampaignAudienceViewServiceServer) {
+	s.RegisterService(&_CampaignAudienceViewService_serviceDesc, srv)
+}
+
+func _CampaignAudienceViewService_GetCampaignAudienceView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignAudienceViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignAudienceViewServiceServer).GetCampaignAudienceView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignAudienceViewService/GetCampaignAudienceView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignAudienceViewServiceServer).GetCampaignAudienceView(ctx, req.(*GetCampaignAudienceViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignAudienceViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignAudienceViewService",
+	HandlerType: (*CampaignAudienceViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignAudienceView",
+			Handler:    _CampaignAudienceViewService_GetCampaignAudienceView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_audience_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_bid_modifier_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_bid_modifier_service.pb.go
new file mode 100644
index 0000000..d029a8b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_bid_modifier_service.pb.go
@@ -0,0 +1,531 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_bid_modifier_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignBidModifierService.GetCampaignBidModifier][google.ads.googleads.v3.services.CampaignBidModifierService.GetCampaignBidModifier].
+type GetCampaignBidModifierRequest struct {
+	// Required. The resource name of the campaign bid modifier to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignBidModifierRequest) Reset()         { *m = GetCampaignBidModifierRequest{} }
+func (m *GetCampaignBidModifierRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignBidModifierRequest) ProtoMessage()    {}
+func (*GetCampaignBidModifierRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7c1d366a2da265bc, []int{0}
+}
+
+func (m *GetCampaignBidModifierRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignBidModifierRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignBidModifierRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignBidModifierRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignBidModifierRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignBidModifierRequest.Merge(m, src)
+}
+func (m *GetCampaignBidModifierRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignBidModifierRequest.Size(m)
+}
+func (m *GetCampaignBidModifierRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignBidModifierRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignBidModifierRequest proto.InternalMessageInfo
+
+func (m *GetCampaignBidModifierRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignBidModifierService.MutateCampaignBidModifier][].
+type MutateCampaignBidModifiersRequest struct {
+	// Required. ID of the customer whose campaign bid modifiers are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual campaign bid modifiers.
+	Operations []*CampaignBidModifierOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignBidModifiersRequest) Reset()         { *m = MutateCampaignBidModifiersRequest{} }
+func (m *MutateCampaignBidModifiersRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignBidModifiersRequest) ProtoMessage()    {}
+func (*MutateCampaignBidModifiersRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7c1d366a2da265bc, []int{1}
+}
+
+func (m *MutateCampaignBidModifiersRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignBidModifiersRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignBidModifiersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignBidModifiersRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignBidModifiersRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignBidModifiersRequest.Merge(m, src)
+}
+func (m *MutateCampaignBidModifiersRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignBidModifiersRequest.Size(m)
+}
+func (m *MutateCampaignBidModifiersRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignBidModifiersRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignBidModifiersRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignBidModifiersRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignBidModifiersRequest) GetOperations() []*CampaignBidModifierOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignBidModifiersRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignBidModifiersRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove, update) on a campaign bid modifier.
+type CampaignBidModifierOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignBidModifierOperation_Create
+	//	*CampaignBidModifierOperation_Update
+	//	*CampaignBidModifierOperation_Remove
+	Operation            isCampaignBidModifierOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
+	XXX_unrecognized     []byte                                   `json:"-"`
+	XXX_sizecache        int32                                    `json:"-"`
+}
+
+func (m *CampaignBidModifierOperation) Reset()         { *m = CampaignBidModifierOperation{} }
+func (m *CampaignBidModifierOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignBidModifierOperation) ProtoMessage()    {}
+func (*CampaignBidModifierOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7c1d366a2da265bc, []int{2}
+}
+
+func (m *CampaignBidModifierOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignBidModifierOperation.Unmarshal(m, b)
+}
+func (m *CampaignBidModifierOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignBidModifierOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignBidModifierOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignBidModifierOperation.Merge(m, src)
+}
+func (m *CampaignBidModifierOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignBidModifierOperation.Size(m)
+}
+func (m *CampaignBidModifierOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignBidModifierOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignBidModifierOperation proto.InternalMessageInfo
+
+func (m *CampaignBidModifierOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCampaignBidModifierOperation_Operation interface {
+	isCampaignBidModifierOperation_Operation()
+}
+
+type CampaignBidModifierOperation_Create struct {
+	Create *resources.CampaignBidModifier `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CampaignBidModifierOperation_Update struct {
+	Update *resources.CampaignBidModifier `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type CampaignBidModifierOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignBidModifierOperation_Create) isCampaignBidModifierOperation_Operation() {}
+
+func (*CampaignBidModifierOperation_Update) isCampaignBidModifierOperation_Operation() {}
+
+func (*CampaignBidModifierOperation_Remove) isCampaignBidModifierOperation_Operation() {}
+
+func (m *CampaignBidModifierOperation) GetOperation() isCampaignBidModifierOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignBidModifierOperation) GetCreate() *resources.CampaignBidModifier {
+	if x, ok := m.GetOperation().(*CampaignBidModifierOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CampaignBidModifierOperation) GetUpdate() *resources.CampaignBidModifier {
+	if x, ok := m.GetOperation().(*CampaignBidModifierOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CampaignBidModifierOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignBidModifierOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignBidModifierOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignBidModifierOperation_Create)(nil),
+		(*CampaignBidModifierOperation_Update)(nil),
+		(*CampaignBidModifierOperation_Remove)(nil),
+	}
+}
+
+// Response message for campaign bid modifiers mutate.
+type MutateCampaignBidModifiersResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignBidModifierResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *MutateCampaignBidModifiersResponse) Reset()         { *m = MutateCampaignBidModifiersResponse{} }
+func (m *MutateCampaignBidModifiersResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignBidModifiersResponse) ProtoMessage()    {}
+func (*MutateCampaignBidModifiersResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7c1d366a2da265bc, []int{3}
+}
+
+func (m *MutateCampaignBidModifiersResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignBidModifiersResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignBidModifiersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignBidModifiersResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignBidModifiersResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignBidModifiersResponse.Merge(m, src)
+}
+func (m *MutateCampaignBidModifiersResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignBidModifiersResponse.Size(m)
+}
+func (m *MutateCampaignBidModifiersResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignBidModifiersResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignBidModifiersResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignBidModifiersResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignBidModifiersResponse) GetResults() []*MutateCampaignBidModifierResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the criterion mutate.
+type MutateCampaignBidModifierResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignBidModifierResult) Reset()         { *m = MutateCampaignBidModifierResult{} }
+func (m *MutateCampaignBidModifierResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignBidModifierResult) ProtoMessage()    {}
+func (*MutateCampaignBidModifierResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7c1d366a2da265bc, []int{4}
+}
+
+func (m *MutateCampaignBidModifierResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignBidModifierResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignBidModifierResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignBidModifierResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignBidModifierResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignBidModifierResult.Merge(m, src)
+}
+func (m *MutateCampaignBidModifierResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignBidModifierResult.Size(m)
+}
+func (m *MutateCampaignBidModifierResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignBidModifierResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignBidModifierResult proto.InternalMessageInfo
+
+func (m *MutateCampaignBidModifierResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignBidModifierRequest)(nil), "google.ads.googleads.v3.services.GetCampaignBidModifierRequest")
+	proto.RegisterType((*MutateCampaignBidModifiersRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignBidModifiersRequest")
+	proto.RegisterType((*CampaignBidModifierOperation)(nil), "google.ads.googleads.v3.services.CampaignBidModifierOperation")
+	proto.RegisterType((*MutateCampaignBidModifiersResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignBidModifiersResponse")
+	proto.RegisterType((*MutateCampaignBidModifierResult)(nil), "google.ads.googleads.v3.services.MutateCampaignBidModifierResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_bid_modifier_service.proto", fileDescriptor_7c1d366a2da265bc)
+}
+
+var fileDescriptor_7c1d366a2da265bc = []byte{
+	// 777 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xcf, 0x6b, 0xe3, 0x46,
+	0x14, 0xc7, 0x2b, 0x39, 0xa4, 0xcd, 0x38, 0x69, 0x61, 0x4a, 0x53, 0xa3, 0xa6, 0xc4, 0x55, 0x03,
+	0x35, 0xa6, 0x48, 0x60, 0x43, 0x68, 0x15, 0x92, 0x22, 0x27, 0x75, 0x92, 0x43, 0x7e, 0xa0, 0x40,
+	0x0e, 0xad, 0x17, 0x31, 0x96, 0xc6, 0xde, 0x21, 0x92, 0x46, 0x3b, 0x23, 0x19, 0x42, 0xc8, 0x65,
+	0x0f, 0xf9, 0x07, 0xf6, 0x3f, 0xd8, 0x43, 0x0e, 0xfb, 0x9f, 0x6c, 0xae, 0x7b, 0xcb, 0x69, 0x17,
+	0xf6, 0xb4, 0x7f, 0xc3, 0x1e, 0x16, 0x69, 0x34, 0xfe, 0x11, 0xec, 0x18, 0x36, 0xb7, 0xe7, 0x79,
+	0x5f, 0x7d, 0xde, 0x9b, 0xf7, 0xde, 0x3c, 0x83, 0xbd, 0x3e, 0xa5, 0xfd, 0x00, 0x9b, 0xc8, 0xe7,
+	0xa6, 0x30, 0x33, 0x6b, 0xd0, 0x34, 0x39, 0x66, 0x03, 0xe2, 0x61, 0x6e, 0x7a, 0x28, 0x8c, 0x11,
+	0xe9, 0x47, 0x6e, 0x97, 0xf8, 0x6e, 0x48, 0x7d, 0xd2, 0x23, 0x98, 0xb9, 0x85, 0xdb, 0x88, 0x19,
+	0x4d, 0x28, 0xac, 0x8a, 0x4f, 0x0d, 0xe4, 0x73, 0x63, 0x48, 0x31, 0x06, 0x4d, 0x43, 0x52, 0xb4,
+	0xed, 0x59, 0x71, 0x18, 0xe6, 0x34, 0x65, 0x33, 0x03, 0x89, 0x00, 0xda, 0x9a, 0xfc, 0x3c, 0x26,
+	0x26, 0x8a, 0x22, 0x9a, 0xa0, 0x84, 0xd0, 0x88, 0x17, 0xde, 0x9f, 0xc7, 0xbc, 0x5e, 0x40, 0x70,
+	0x94, 0x14, 0x8e, 0xf5, 0x31, 0x47, 0x8f, 0xe0, 0xc0, 0x77, 0xbb, 0xf8, 0x39, 0x1a, 0x10, 0x2a,
+	0xb9, 0x45, 0xe2, 0x66, 0xfe, 0xab, 0x9b, 0xf6, 0x0a, 0x55, 0x88, 0xf8, 0xc5, 0x03, 0x36, 0x8b,
+	0x3d, 0x93, 0x27, 0x28, 0x49, 0x8b, 0xa0, 0xfa, 0x21, 0xf8, 0x75, 0x1f, 0x27, 0xbb, 0x45, 0xd2,
+	0x2d, 0xe2, 0x1f, 0x15, 0x29, 0x3b, 0xf8, 0x45, 0x8a, 0x79, 0x02, 0x6b, 0x60, 0x45, 0x5e, 0xce,
+	0x8d, 0x50, 0x88, 0x2b, 0x4a, 0x55, 0xa9, 0x2d, 0xb5, 0x4a, 0xef, 0x6d, 0xd5, 0x59, 0x96, 0x9e,
+	0x63, 0x14, 0x62, 0xfd, 0xb3, 0x02, 0x7e, 0x3b, 0x4a, 0x13, 0x94, 0xe0, 0x29, 0x38, 0x2e, 0x79,
+	0x1b, 0xa0, 0xec, 0xa5, 0x3c, 0xa1, 0x21, 0x66, 0x2e, 0xf1, 0xc7, 0x69, 0x40, 0x9e, 0x1f, 0xfa,
+	0xd0, 0x03, 0x80, 0xc6, 0x98, 0x89, 0xfa, 0x54, 0xd4, 0x6a, 0xa9, 0x56, 0x6e, 0xec, 0x18, 0xf3,
+	0xfa, 0x63, 0x4c, 0x09, 0x7c, 0x22, 0x31, 0x45, 0x90, 0x11, 0x16, 0xfe, 0x01, 0x7e, 0x88, 0x11,
+	0x4b, 0x08, 0x0a, 0xdc, 0x1e, 0x22, 0x41, 0xca, 0x70, 0xa5, 0x54, 0x55, 0x6a, 0xdf, 0x39, 0xdf,
+	0x17, 0xc7, 0x6d, 0x71, 0x0a, 0x7f, 0x07, 0x2b, 0x03, 0x14, 0x10, 0x1f, 0x25, 0xd8, 0xa5, 0x51,
+	0x70, 0x59, 0x59, 0xc8, 0x65, 0xcb, 0xf2, 0xf0, 0x24, 0x0a, 0x2e, 0xf5, 0x5b, 0x15, 0xac, 0x3d,
+	0x16, 0x1f, 0x6e, 0x81, 0x72, 0x1a, 0xe7, 0x8c, 0xac, 0x31, 0x39, 0xa3, 0xdc, 0xd0, 0xe4, 0xa5,
+	0x64, 0xef, 0x8c, 0x76, 0xd6, 0xbb, 0x23, 0xc4, 0x2f, 0x1c, 0x20, 0xe4, 0x99, 0x0d, 0x4f, 0xc1,
+	0xa2, 0xc7, 0x30, 0x4a, 0x44, 0xfd, 0xcb, 0x8d, 0xcd, 0x99, 0xc5, 0x18, 0x8e, 0xe2, 0xb4, 0x6a,
+	0x1c, 0x7c, 0xe3, 0x14, 0x9c, 0x8c, 0x28, 0xf8, 0x15, 0xf5, 0xa9, 0x44, 0xc1, 0x81, 0x15, 0xb0,
+	0xc8, 0x70, 0x48, 0x07, 0xa2, 0x8c, 0x4b, 0x99, 0x47, 0xfc, 0x6e, 0x95, 0xc1, 0xd2, 0xb0, 0xee,
+	0xfa, 0x5b, 0x05, 0xe8, 0x8f, 0xcd, 0x09, 0x8f, 0x69, 0xc4, 0x31, 0x6c, 0x83, 0x9f, 0x1e, 0x74,
+	0xc7, 0xc5, 0x8c, 0x51, 0x96, 0xc3, 0xcb, 0x0d, 0x28, 0xd3, 0x65, 0xb1, 0x67, 0x9c, 0xe5, 0x23,
+	0xed, 0xfc, 0x38, 0xd9, 0xb7, 0x7f, 0x33, 0x39, 0xfc, 0x1f, 0x7c, 0xcb, 0x30, 0x4f, 0x83, 0x44,
+	0xce, 0x91, 0x3d, 0x7f, 0x8e, 0x66, 0xa6, 0xe7, 0xe4, 0x24, 0x47, 0x12, 0xf5, 0x36, 0x58, 0x9f,
+	0xa3, 0xcd, 0x86, 0x67, 0xca, 0x03, 0x9a, 0x7c, 0x3b, 0x8d, 0xdb, 0x05, 0xa0, 0x4d, 0x41, 0x9c,
+	0x89, 0x84, 0xe0, 0x07, 0x05, 0xac, 0x4e, 0x7f, 0xa6, 0xf0, 0x9f, 0xf9, 0xb7, 0x79, 0xf4, 0x81,
+	0x6b, 0x5f, 0xd9, 0x77, 0xfd, 0xf8, 0xde, 0x9e, 0xbc, 0xd8, 0xcb, 0x77, 0x1f, 0x5f, 0xa9, 0x7f,
+	0xc1, 0xcd, 0x6c, 0x1f, 0x5e, 0x4d, 0x78, 0xb6, 0xe5, 0xcb, 0xe6, 0x66, 0x7d, 0xb8, 0x20, 0xc7,
+	0x9b, 0x6e, 0xd6, 0xaf, 0xe1, 0x8d, 0x0a, 0xb4, 0xd9, 0x63, 0x01, 0x77, 0x9f, 0xd0, 0x35, 0xb9,
+	0x7c, 0xb4, 0xbd, 0xa7, 0x41, 0xc4, 0x64, 0xea, 0xcf, 0xee, 0xed, 0xd5, 0xb1, 0x1d, 0xf6, 0xe7,
+	0x68, 0xa5, 0xe4, 0x25, 0xd8, 0xd1, 0xff, 0xce, 0x4a, 0x30, 0xba, 0xf3, 0xd5, 0x98, 0x78, 0xbb,
+	0x7e, 0x3d, 0xb5, 0x02, 0x56, 0x98, 0xc7, 0xb5, 0x94, 0xba, 0xf6, 0xcb, 0x9d, 0x5d, 0x19, 0xe5,
+	0x56, 0x58, 0x31, 0xe1, 0x86, 0x47, 0xc3, 0xd6, 0x8d, 0x0a, 0x36, 0x3c, 0x1a, 0xce, 0xbd, 0x47,
+	0x6b, 0x7d, 0xf6, 0x38, 0x9d, 0x66, 0xab, 0xe6, 0x54, 0xf9, 0xef, 0xa0, 0x80, 0xf4, 0x69, 0x80,
+	0xa2, 0xbe, 0x41, 0x59, 0xdf, 0xec, 0xe3, 0x28, 0x5f, 0x44, 0xe6, 0x28, 0xec, 0xec, 0x3f, 0xd5,
+	0x2d, 0x69, 0xbc, 0x56, 0x4b, 0xfb, 0xb6, 0xfd, 0x46, 0xad, 0xee, 0x0b, 0xa0, 0xed, 0x73, 0x43,
+	0x98, 0x99, 0x75, 0xde, 0x34, 0x8a, 0xc0, 0xfc, 0x4e, 0x4a, 0x3a, 0xb6, 0xcf, 0x3b, 0x43, 0x49,
+	0xe7, 0xbc, 0xd9, 0x91, 0x92, 0x4f, 0xea, 0x86, 0x38, 0xb7, 0x2c, 0xdb, 0xe7, 0x96, 0x35, 0x14,
+	0x59, 0xd6, 0x79, 0xd3, 0xb2, 0xa4, 0xac, 0xbb, 0x98, 0xe7, 0xd9, 0xfc, 0x12, 0x00, 0x00, 0xff,
+	0xff, 0x72, 0x5b, 0xe8, 0x90, 0xfb, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignBidModifierServiceClient is the client API for CampaignBidModifierService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignBidModifierServiceClient interface {
+	// Returns the requested campaign bid modifier in full detail.
+	GetCampaignBidModifier(ctx context.Context, in *GetCampaignBidModifierRequest, opts ...grpc.CallOption) (*resources.CampaignBidModifier, error)
+	// Creates, updates, or removes campaign bid modifiers.
+	// Operation statuses are returned.
+	MutateCampaignBidModifiers(ctx context.Context, in *MutateCampaignBidModifiersRequest, opts ...grpc.CallOption) (*MutateCampaignBidModifiersResponse, error)
+}
+
+type campaignBidModifierServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignBidModifierServiceClient(cc grpc.ClientConnInterface) CampaignBidModifierServiceClient {
+	return &campaignBidModifierServiceClient{cc}
+}
+
+func (c *campaignBidModifierServiceClient) GetCampaignBidModifier(ctx context.Context, in *GetCampaignBidModifierRequest, opts ...grpc.CallOption) (*resources.CampaignBidModifier, error) {
+	out := new(resources.CampaignBidModifier)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignBidModifierService/GetCampaignBidModifier", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignBidModifierServiceClient) MutateCampaignBidModifiers(ctx context.Context, in *MutateCampaignBidModifiersRequest, opts ...grpc.CallOption) (*MutateCampaignBidModifiersResponse, error) {
+	out := new(MutateCampaignBidModifiersResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignBidModifierService/MutateCampaignBidModifiers", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignBidModifierServiceServer is the server API for CampaignBidModifierService service.
+type CampaignBidModifierServiceServer interface {
+	// Returns the requested campaign bid modifier in full detail.
+	GetCampaignBidModifier(context.Context, *GetCampaignBidModifierRequest) (*resources.CampaignBidModifier, error)
+	// Creates, updates, or removes campaign bid modifiers.
+	// Operation statuses are returned.
+	MutateCampaignBidModifiers(context.Context, *MutateCampaignBidModifiersRequest) (*MutateCampaignBidModifiersResponse, error)
+}
+
+// UnimplementedCampaignBidModifierServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignBidModifierServiceServer struct {
+}
+
+func (*UnimplementedCampaignBidModifierServiceServer) GetCampaignBidModifier(ctx context.Context, req *GetCampaignBidModifierRequest) (*resources.CampaignBidModifier, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaignBidModifier not implemented")
+}
+func (*UnimplementedCampaignBidModifierServiceServer) MutateCampaignBidModifiers(ctx context.Context, req *MutateCampaignBidModifiersRequest) (*MutateCampaignBidModifiersResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaignBidModifiers not implemented")
+}
+
+func RegisterCampaignBidModifierServiceServer(s *grpc.Server, srv CampaignBidModifierServiceServer) {
+	s.RegisterService(&_CampaignBidModifierService_serviceDesc, srv)
+}
+
+func _CampaignBidModifierService_GetCampaignBidModifier_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignBidModifierRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignBidModifierServiceServer).GetCampaignBidModifier(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignBidModifierService/GetCampaignBidModifier",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignBidModifierServiceServer).GetCampaignBidModifier(ctx, req.(*GetCampaignBidModifierRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignBidModifierService_MutateCampaignBidModifiers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignBidModifiersRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignBidModifierServiceServer).MutateCampaignBidModifiers(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignBidModifierService/MutateCampaignBidModifiers",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignBidModifierServiceServer).MutateCampaignBidModifiers(ctx, req.(*MutateCampaignBidModifiersRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignBidModifierService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignBidModifierService",
+	HandlerType: (*CampaignBidModifierServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignBidModifier",
+			Handler:    _CampaignBidModifierService_GetCampaignBidModifier_Handler,
+		},
+		{
+			MethodName: "MutateCampaignBidModifiers",
+			Handler:    _CampaignBidModifierService_MutateCampaignBidModifiers_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_bid_modifier_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_budget_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_budget_service.pb.go
new file mode 100644
index 0000000..4a80fe5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_budget_service.pb.go
@@ -0,0 +1,530 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_budget_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignBudgetService.GetCampaignBudget][google.ads.googleads.v3.services.CampaignBudgetService.GetCampaignBudget].
+type GetCampaignBudgetRequest struct {
+	// Required. The resource name of the campaign budget to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignBudgetRequest) Reset()         { *m = GetCampaignBudgetRequest{} }
+func (m *GetCampaignBudgetRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignBudgetRequest) ProtoMessage()    {}
+func (*GetCampaignBudgetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2d4a4b1fda62b03f, []int{0}
+}
+
+func (m *GetCampaignBudgetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignBudgetRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignBudgetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignBudgetRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignBudgetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignBudgetRequest.Merge(m, src)
+}
+func (m *GetCampaignBudgetRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignBudgetRequest.Size(m)
+}
+func (m *GetCampaignBudgetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignBudgetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignBudgetRequest proto.InternalMessageInfo
+
+func (m *GetCampaignBudgetRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignBudgetService.MutateCampaignBudgets][google.ads.googleads.v3.services.CampaignBudgetService.MutateCampaignBudgets].
+type MutateCampaignBudgetsRequest struct {
+	// Required. The ID of the customer whose campaign budgets are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual campaign budgets.
+	Operations []*CampaignBudgetOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignBudgetsRequest) Reset()         { *m = MutateCampaignBudgetsRequest{} }
+func (m *MutateCampaignBudgetsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignBudgetsRequest) ProtoMessage()    {}
+func (*MutateCampaignBudgetsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2d4a4b1fda62b03f, []int{1}
+}
+
+func (m *MutateCampaignBudgetsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignBudgetsRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignBudgetsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignBudgetsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignBudgetsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignBudgetsRequest.Merge(m, src)
+}
+func (m *MutateCampaignBudgetsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignBudgetsRequest.Size(m)
+}
+func (m *MutateCampaignBudgetsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignBudgetsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignBudgetsRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignBudgetsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignBudgetsRequest) GetOperations() []*CampaignBudgetOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignBudgetsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignBudgetsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a campaign budget.
+type CampaignBudgetOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignBudgetOperation_Create
+	//	*CampaignBudgetOperation_Update
+	//	*CampaignBudgetOperation_Remove
+	Operation            isCampaignBudgetOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
+	XXX_unrecognized     []byte                              `json:"-"`
+	XXX_sizecache        int32                               `json:"-"`
+}
+
+func (m *CampaignBudgetOperation) Reset()         { *m = CampaignBudgetOperation{} }
+func (m *CampaignBudgetOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignBudgetOperation) ProtoMessage()    {}
+func (*CampaignBudgetOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2d4a4b1fda62b03f, []int{2}
+}
+
+func (m *CampaignBudgetOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignBudgetOperation.Unmarshal(m, b)
+}
+func (m *CampaignBudgetOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignBudgetOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignBudgetOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignBudgetOperation.Merge(m, src)
+}
+func (m *CampaignBudgetOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignBudgetOperation.Size(m)
+}
+func (m *CampaignBudgetOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignBudgetOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignBudgetOperation proto.InternalMessageInfo
+
+func (m *CampaignBudgetOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCampaignBudgetOperation_Operation interface {
+	isCampaignBudgetOperation_Operation()
+}
+
+type CampaignBudgetOperation_Create struct {
+	Create *resources.CampaignBudget `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CampaignBudgetOperation_Update struct {
+	Update *resources.CampaignBudget `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type CampaignBudgetOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignBudgetOperation_Create) isCampaignBudgetOperation_Operation() {}
+
+func (*CampaignBudgetOperation_Update) isCampaignBudgetOperation_Operation() {}
+
+func (*CampaignBudgetOperation_Remove) isCampaignBudgetOperation_Operation() {}
+
+func (m *CampaignBudgetOperation) GetOperation() isCampaignBudgetOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignBudgetOperation) GetCreate() *resources.CampaignBudget {
+	if x, ok := m.GetOperation().(*CampaignBudgetOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CampaignBudgetOperation) GetUpdate() *resources.CampaignBudget {
+	if x, ok := m.GetOperation().(*CampaignBudgetOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CampaignBudgetOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignBudgetOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignBudgetOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignBudgetOperation_Create)(nil),
+		(*CampaignBudgetOperation_Update)(nil),
+		(*CampaignBudgetOperation_Remove)(nil),
+	}
+}
+
+// Response message for campaign budget mutate.
+type MutateCampaignBudgetsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignBudgetResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *MutateCampaignBudgetsResponse) Reset()         { *m = MutateCampaignBudgetsResponse{} }
+func (m *MutateCampaignBudgetsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignBudgetsResponse) ProtoMessage()    {}
+func (*MutateCampaignBudgetsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2d4a4b1fda62b03f, []int{3}
+}
+
+func (m *MutateCampaignBudgetsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignBudgetsResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignBudgetsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignBudgetsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignBudgetsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignBudgetsResponse.Merge(m, src)
+}
+func (m *MutateCampaignBudgetsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignBudgetsResponse.Size(m)
+}
+func (m *MutateCampaignBudgetsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignBudgetsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignBudgetsResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignBudgetsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignBudgetsResponse) GetResults() []*MutateCampaignBudgetResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the campaign budget mutate.
+type MutateCampaignBudgetResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignBudgetResult) Reset()         { *m = MutateCampaignBudgetResult{} }
+func (m *MutateCampaignBudgetResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignBudgetResult) ProtoMessage()    {}
+func (*MutateCampaignBudgetResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2d4a4b1fda62b03f, []int{4}
+}
+
+func (m *MutateCampaignBudgetResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignBudgetResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignBudgetResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignBudgetResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignBudgetResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignBudgetResult.Merge(m, src)
+}
+func (m *MutateCampaignBudgetResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignBudgetResult.Size(m)
+}
+func (m *MutateCampaignBudgetResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignBudgetResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignBudgetResult proto.InternalMessageInfo
+
+func (m *MutateCampaignBudgetResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignBudgetRequest)(nil), "google.ads.googleads.v3.services.GetCampaignBudgetRequest")
+	proto.RegisterType((*MutateCampaignBudgetsRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignBudgetsRequest")
+	proto.RegisterType((*CampaignBudgetOperation)(nil), "google.ads.googleads.v3.services.CampaignBudgetOperation")
+	proto.RegisterType((*MutateCampaignBudgetsResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignBudgetsResponse")
+	proto.RegisterType((*MutateCampaignBudgetResult)(nil), "google.ads.googleads.v3.services.MutateCampaignBudgetResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_budget_service.proto", fileDescriptor_2d4a4b1fda62b03f)
+}
+
+var fileDescriptor_2d4a4b1fda62b03f = []byte{
+	// 767 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcd, 0x6b, 0xdc, 0x46,
+	0x14, 0xaf, 0xb4, 0xc5, 0xad, 0x67, 0xed, 0x96, 0x4e, 0x71, 0x2d, 0x54, 0x97, 0x2e, 0xaa, 0xa1,
+	0xcb, 0x52, 0x24, 0xbc, 0x5b, 0x28, 0x96, 0x6b, 0x17, 0x6d, 0x13, 0x7f, 0x10, 0x1c, 0x1b, 0x19,
+	0x96, 0x10, 0x96, 0x88, 0x59, 0x69, 0xac, 0x08, 0x4b, 0x1a, 0x65, 0x46, 0x5a, 0x30, 0xc6, 0x87,
+	0xe4, 0x5f, 0xc8, 0x21, 0xf7, 0x1c, 0xf3, 0x4f, 0xe4, 0x6e, 0xc8, 0x29, 0x37, 0x9f, 0x72, 0xc8,
+	0x29, 0x47, 0xdf, 0x72, 0x0b, 0xd2, 0x68, 0xf6, 0x2b, 0xbb, 0x2c, 0x71, 0x6e, 0x4f, 0xf3, 0x7e,
+	0xef, 0xf7, 0xbe, 0x9f, 0xc0, 0x8e, 0x4f, 0x88, 0x1f, 0x62, 0x03, 0x79, 0xcc, 0xe0, 0x62, 0x2e,
+	0xf5, 0x5b, 0x06, 0xc3, 0xb4, 0x1f, 0xb8, 0x98, 0x19, 0x2e, 0x8a, 0x12, 0x14, 0xf8, 0xb1, 0xd3,
+	0xcb, 0x3c, 0x1f, 0xa7, 0x4e, 0xa9, 0xd0, 0x13, 0x4a, 0x52, 0x02, 0x6b, 0xdc, 0x48, 0x47, 0x1e,
+	0xd3, 0x07, 0xf6, 0x7a, 0xbf, 0xa5, 0x0b, 0x7b, 0xf5, 0x9f, 0x59, 0x1e, 0x28, 0x66, 0x24, 0xa3,
+	0x53, 0x5c, 0x70, 0x6a, 0x75, 0x4d, 0x18, 0x26, 0x81, 0x81, 0xe2, 0x98, 0xa4, 0x28, 0x0d, 0x48,
+	0xcc, 0x4a, 0xed, 0xea, 0x88, 0xd6, 0x0d, 0x03, 0x1c, 0x0b, 0xb3, 0xdf, 0x47, 0x14, 0xa7, 0x01,
+	0x0e, 0x3d, 0xa7, 0x87, 0x1f, 0xa3, 0x7e, 0x40, 0x68, 0x09, 0x28, 0x43, 0x36, 0x8a, 0xaf, 0x5e,
+	0x76, 0x5a, 0xa2, 0x22, 0xc4, 0xce, 0x26, 0xb8, 0x69, 0xe2, 0x1a, 0x2c, 0x45, 0x69, 0x56, 0x3a,
+	0xd5, 0xee, 0x00, 0x65, 0x0f, 0xa7, 0xff, 0x97, 0xe1, 0xb6, 0x8b, 0x68, 0x6d, 0xfc, 0x24, 0xc3,
+	0x2c, 0x85, 0x75, 0xb0, 0x2c, 0x32, 0x72, 0x62, 0x14, 0x61, 0x45, 0xaa, 0x49, 0xf5, 0xc5, 0x76,
+	0xe5, 0x9d, 0x25, 0xdb, 0x4b, 0x42, 0x73, 0x1f, 0x45, 0x58, 0xbb, 0x91, 0xc0, 0xda, 0x61, 0x96,
+	0xa2, 0x14, 0x8f, 0x33, 0x31, 0x41, 0xb5, 0x0e, 0xaa, 0x6e, 0xc6, 0x52, 0x12, 0x61, 0xea, 0x04,
+	0xde, 0x28, 0x11, 0x10, 0xef, 0x07, 0x1e, 0x7c, 0x04, 0x00, 0x49, 0x30, 0xe5, 0x55, 0x51, 0xe4,
+	0x5a, 0xa5, 0x5e, 0x6d, 0x6e, 0xea, 0xf3, 0xfa, 0xa1, 0x8f, 0xfb, 0x3c, 0x12, 0x0c, 0x25, 0xff,
+	0x90, 0x11, 0xfe, 0x09, 0x7e, 0x4c, 0x10, 0x4d, 0x03, 0x14, 0x3a, 0xa7, 0x28, 0x08, 0x33, 0x8a,
+	0x95, 0x4a, 0x4d, 0xaa, 0x7f, 0x6f, 0xff, 0x50, 0x3e, 0xef, 0xf2, 0x57, 0xf8, 0x07, 0x58, 0xee,
+	0xa3, 0x30, 0xf0, 0x50, 0x8a, 0x1d, 0x12, 0x87, 0xe7, 0xca, 0xb7, 0x05, 0x6c, 0x49, 0x3c, 0x1e,
+	0xc5, 0xe1, 0xb9, 0xf6, 0x42, 0x06, 0xab, 0x33, 0x5c, 0xc3, 0x2d, 0x50, 0xcd, 0x92, 0xc2, 0x3c,
+	0x6f, 0x42, 0x61, 0x5e, 0x6d, 0xaa, 0x22, 0x15, 0xd1, 0x27, 0x7d, 0x37, 0xef, 0xd3, 0x21, 0x62,
+	0x67, 0x36, 0xe0, 0xf0, 0x5c, 0x86, 0xf7, 0xc0, 0x82, 0x4b, 0x31, 0x4a, 0x79, 0xc1, 0xab, 0xcd,
+	0x8d, 0x99, 0x25, 0x18, 0x0c, 0xdc, 0x44, 0x0d, 0xf6, 0xbf, 0xb1, 0x4b, 0x8a, 0x9c, 0x8c, 0x53,
+	0x2b, 0xf2, 0x57, 0x90, 0x71, 0x0a, 0xa8, 0x80, 0x05, 0x8a, 0x23, 0xd2, 0xe7, 0x75, 0x5b, 0xcc,
+	0x35, 0xfc, 0xbb, 0x5d, 0x05, 0x8b, 0x83, 0x42, 0x6b, 0xaf, 0x25, 0xf0, 0xdb, 0x8c, 0x71, 0x60,
+	0x09, 0x89, 0x19, 0x86, 0xbb, 0x60, 0x65, 0xa2, 0x13, 0x0e, 0xa6, 0x94, 0xd0, 0x82, 0xb7, 0xda,
+	0x84, 0x22, 0x48, 0x9a, 0xb8, 0xfa, 0x49, 0x31, 0xaf, 0xf6, 0xcf, 0xe3, 0x3d, 0xba, 0x9b, 0xc3,
+	0x61, 0x07, 0x7c, 0x47, 0x31, 0xcb, 0xc2, 0x54, 0x8c, 0xcb, 0xbf, 0xf3, 0xc7, 0x65, 0x5a, 0x64,
+	0x76, 0x41, 0x62, 0x0b, 0x32, 0xcd, 0x02, 0xea, 0x6c, 0x58, 0x3e, 0x1e, 0x53, 0x16, 0x63, 0x7c,
+	0x27, 0x9a, 0x1f, 0x2b, 0x60, 0x65, 0xdc, 0xfa, 0x84, 0x47, 0x00, 0xdf, 0x48, 0xe0, 0xa7, 0xcf,
+	0x96, 0x0e, 0x9a, 0xf3, 0x23, 0x9f, 0xb5, 0xa9, 0xea, 0x97, 0x37, 0x55, 0x3b, 0xb8, 0xb6, 0xc6,
+	0x93, 0x78, 0xf6, 0xf6, 0xfd, 0x73, 0xb9, 0x05, 0x37, 0xf2, 0x43, 0x76, 0x31, 0xa6, 0xd9, 0x16,
+	0x2b, 0xca, 0x8c, 0xc6, 0xe0, 0xb2, 0x95, 0x1d, 0x35, 0x1a, 0x97, 0xf0, 0x46, 0x02, 0x2b, 0x53,
+	0xdb, 0x0d, 0x77, 0x6e, 0xd7, 0x0d, 0x71, 0x36, 0xd4, 0xff, 0x6e, 0x6d, 0xcf, 0xe7, 0x4c, 0x7b,
+	0x70, 0x6d, 0xfd, 0x32, 0x72, 0x78, 0xfe, 0x1a, 0x1e, 0x83, 0x22, 0xdd, 0x4d, 0xed, 0xef, 0x3c,
+	0xdd, 0x61, 0x7e, 0x17, 0x23, 0xe0, 0xed, 0xc6, 0xe5, 0x64, 0xb6, 0x66, 0x54, 0x78, 0x33, 0xa5,
+	0x86, 0xfa, 0xeb, 0x95, 0xa5, 0x0c, 0x23, 0x2a, 0xa5, 0x24, 0x60, 0xba, 0x4b, 0xa2, 0xf6, 0x53,
+	0x19, 0xac, 0xbb, 0x24, 0x9a, 0x1b, 0x7d, 0x5b, 0x9d, 0x3a, 0x21, 0xc7, 0xf9, 0x7d, 0x38, 0x96,
+	0x1e, 0xee, 0x97, 0xf6, 0x3e, 0x09, 0x51, 0xec, 0xeb, 0x84, 0xfa, 0x86, 0x8f, 0xe3, 0xe2, 0x7a,
+	0x18, 0x43, 0x8f, 0xb3, 0xff, 0x74, 0x5b, 0x42, 0x78, 0x29, 0x57, 0xf6, 0x2c, 0xeb, 0x95, 0x5c,
+	0xdb, 0xe3, 0x84, 0x96, 0xc7, 0x74, 0x2e, 0xe6, 0x52, 0xa7, 0xa5, 0x97, 0x8e, 0xd9, 0x95, 0x80,
+	0x74, 0x2d, 0x8f, 0x75, 0x07, 0x90, 0x6e, 0xa7, 0xd5, 0x15, 0x90, 0x0f, 0xf2, 0x3a, 0x7f, 0x37,
+	0x4d, 0xcb, 0x63, 0xa6, 0x39, 0x00, 0x99, 0x66, 0xa7, 0x65, 0x9a, 0x02, 0xd6, 0x5b, 0x28, 0xe2,
+	0x6c, 0x7d, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x08, 0x43, 0xec, 0xd9, 0x90, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignBudgetServiceClient is the client API for CampaignBudgetService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignBudgetServiceClient interface {
+	// Returns the requested Campaign Budget in full detail.
+	GetCampaignBudget(ctx context.Context, in *GetCampaignBudgetRequest, opts ...grpc.CallOption) (*resources.CampaignBudget, error)
+	// Creates, updates, or removes campaign budgets. Operation statuses are
+	// returned.
+	MutateCampaignBudgets(ctx context.Context, in *MutateCampaignBudgetsRequest, opts ...grpc.CallOption) (*MutateCampaignBudgetsResponse, error)
+}
+
+type campaignBudgetServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignBudgetServiceClient(cc grpc.ClientConnInterface) CampaignBudgetServiceClient {
+	return &campaignBudgetServiceClient{cc}
+}
+
+func (c *campaignBudgetServiceClient) GetCampaignBudget(ctx context.Context, in *GetCampaignBudgetRequest, opts ...grpc.CallOption) (*resources.CampaignBudget, error) {
+	out := new(resources.CampaignBudget)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignBudgetService/GetCampaignBudget", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignBudgetServiceClient) MutateCampaignBudgets(ctx context.Context, in *MutateCampaignBudgetsRequest, opts ...grpc.CallOption) (*MutateCampaignBudgetsResponse, error) {
+	out := new(MutateCampaignBudgetsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignBudgetService/MutateCampaignBudgets", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignBudgetServiceServer is the server API for CampaignBudgetService service.
+type CampaignBudgetServiceServer interface {
+	// Returns the requested Campaign Budget in full detail.
+	GetCampaignBudget(context.Context, *GetCampaignBudgetRequest) (*resources.CampaignBudget, error)
+	// Creates, updates, or removes campaign budgets. Operation statuses are
+	// returned.
+	MutateCampaignBudgets(context.Context, *MutateCampaignBudgetsRequest) (*MutateCampaignBudgetsResponse, error)
+}
+
+// UnimplementedCampaignBudgetServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignBudgetServiceServer struct {
+}
+
+func (*UnimplementedCampaignBudgetServiceServer) GetCampaignBudget(ctx context.Context, req *GetCampaignBudgetRequest) (*resources.CampaignBudget, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaignBudget not implemented")
+}
+func (*UnimplementedCampaignBudgetServiceServer) MutateCampaignBudgets(ctx context.Context, req *MutateCampaignBudgetsRequest) (*MutateCampaignBudgetsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaignBudgets not implemented")
+}
+
+func RegisterCampaignBudgetServiceServer(s *grpc.Server, srv CampaignBudgetServiceServer) {
+	s.RegisterService(&_CampaignBudgetService_serviceDesc, srv)
+}
+
+func _CampaignBudgetService_GetCampaignBudget_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignBudgetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignBudgetServiceServer).GetCampaignBudget(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignBudgetService/GetCampaignBudget",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignBudgetServiceServer).GetCampaignBudget(ctx, req.(*GetCampaignBudgetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignBudgetService_MutateCampaignBudgets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignBudgetsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignBudgetServiceServer).MutateCampaignBudgets(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignBudgetService/MutateCampaignBudgets",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignBudgetServiceServer).MutateCampaignBudgets(ctx, req.(*MutateCampaignBudgetsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignBudgetService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignBudgetService",
+	HandlerType: (*CampaignBudgetServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignBudget",
+			Handler:    _CampaignBudgetService_GetCampaignBudget_Handler,
+		},
+		{
+			MethodName: "MutateCampaignBudgets",
+			Handler:    _CampaignBudgetService_MutateCampaignBudgets_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_budget_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_criterion_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_criterion_service.pb.go
new file mode 100644
index 0000000..b4d01e2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_criterion_service.pb.go
@@ -0,0 +1,529 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_criterion_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignCriterionService.GetCampaignCriterion][google.ads.googleads.v3.services.CampaignCriterionService.GetCampaignCriterion].
+type GetCampaignCriterionRequest struct {
+	// Required. The resource name of the criterion to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignCriterionRequest) Reset()         { *m = GetCampaignCriterionRequest{} }
+func (m *GetCampaignCriterionRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignCriterionRequest) ProtoMessage()    {}
+func (*GetCampaignCriterionRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aaa1f8d0677bfb8, []int{0}
+}
+
+func (m *GetCampaignCriterionRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignCriterionRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignCriterionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignCriterionRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignCriterionRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignCriterionRequest.Merge(m, src)
+}
+func (m *GetCampaignCriterionRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignCriterionRequest.Size(m)
+}
+func (m *GetCampaignCriterionRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignCriterionRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignCriterionRequest proto.InternalMessageInfo
+
+func (m *GetCampaignCriterionRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignCriterionService.MutateCampaignCriteria][google.ads.googleads.v3.services.CampaignCriterionService.MutateCampaignCriteria].
+type MutateCampaignCriteriaRequest struct {
+	// Required. The ID of the customer whose criteria are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual criteria.
+	Operations []*CampaignCriterionOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignCriteriaRequest) Reset()         { *m = MutateCampaignCriteriaRequest{} }
+func (m *MutateCampaignCriteriaRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignCriteriaRequest) ProtoMessage()    {}
+func (*MutateCampaignCriteriaRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aaa1f8d0677bfb8, []int{1}
+}
+
+func (m *MutateCampaignCriteriaRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignCriteriaRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignCriteriaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignCriteriaRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignCriteriaRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignCriteriaRequest.Merge(m, src)
+}
+func (m *MutateCampaignCriteriaRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignCriteriaRequest.Size(m)
+}
+func (m *MutateCampaignCriteriaRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignCriteriaRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignCriteriaRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignCriteriaRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignCriteriaRequest) GetOperations() []*CampaignCriterionOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignCriteriaRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignCriteriaRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a campaign criterion.
+type CampaignCriterionOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignCriterionOperation_Create
+	//	*CampaignCriterionOperation_Update
+	//	*CampaignCriterionOperation_Remove
+	Operation            isCampaignCriterionOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *CampaignCriterionOperation) Reset()         { *m = CampaignCriterionOperation{} }
+func (m *CampaignCriterionOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignCriterionOperation) ProtoMessage()    {}
+func (*CampaignCriterionOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aaa1f8d0677bfb8, []int{2}
+}
+
+func (m *CampaignCriterionOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignCriterionOperation.Unmarshal(m, b)
+}
+func (m *CampaignCriterionOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignCriterionOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignCriterionOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignCriterionOperation.Merge(m, src)
+}
+func (m *CampaignCriterionOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignCriterionOperation.Size(m)
+}
+func (m *CampaignCriterionOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignCriterionOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignCriterionOperation proto.InternalMessageInfo
+
+func (m *CampaignCriterionOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCampaignCriterionOperation_Operation interface {
+	isCampaignCriterionOperation_Operation()
+}
+
+type CampaignCriterionOperation_Create struct {
+	Create *resources.CampaignCriterion `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CampaignCriterionOperation_Update struct {
+	Update *resources.CampaignCriterion `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type CampaignCriterionOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignCriterionOperation_Create) isCampaignCriterionOperation_Operation() {}
+
+func (*CampaignCriterionOperation_Update) isCampaignCriterionOperation_Operation() {}
+
+func (*CampaignCriterionOperation_Remove) isCampaignCriterionOperation_Operation() {}
+
+func (m *CampaignCriterionOperation) GetOperation() isCampaignCriterionOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignCriterionOperation) GetCreate() *resources.CampaignCriterion {
+	if x, ok := m.GetOperation().(*CampaignCriterionOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CampaignCriterionOperation) GetUpdate() *resources.CampaignCriterion {
+	if x, ok := m.GetOperation().(*CampaignCriterionOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CampaignCriterionOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignCriterionOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignCriterionOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignCriterionOperation_Create)(nil),
+		(*CampaignCriterionOperation_Update)(nil),
+		(*CampaignCriterionOperation_Remove)(nil),
+	}
+}
+
+// Response message for campaign criterion mutate.
+type MutateCampaignCriteriaResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignCriterionResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *MutateCampaignCriteriaResponse) Reset()         { *m = MutateCampaignCriteriaResponse{} }
+func (m *MutateCampaignCriteriaResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignCriteriaResponse) ProtoMessage()    {}
+func (*MutateCampaignCriteriaResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aaa1f8d0677bfb8, []int{3}
+}
+
+func (m *MutateCampaignCriteriaResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignCriteriaResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignCriteriaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignCriteriaResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignCriteriaResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignCriteriaResponse.Merge(m, src)
+}
+func (m *MutateCampaignCriteriaResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignCriteriaResponse.Size(m)
+}
+func (m *MutateCampaignCriteriaResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignCriteriaResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignCriteriaResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignCriteriaResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignCriteriaResponse) GetResults() []*MutateCampaignCriterionResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the criterion mutate.
+type MutateCampaignCriterionResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignCriterionResult) Reset()         { *m = MutateCampaignCriterionResult{} }
+func (m *MutateCampaignCriterionResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignCriterionResult) ProtoMessage()    {}
+func (*MutateCampaignCriterionResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9aaa1f8d0677bfb8, []int{4}
+}
+
+func (m *MutateCampaignCriterionResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignCriterionResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignCriterionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignCriterionResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignCriterionResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignCriterionResult.Merge(m, src)
+}
+func (m *MutateCampaignCriterionResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignCriterionResult.Size(m)
+}
+func (m *MutateCampaignCriterionResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignCriterionResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignCriterionResult proto.InternalMessageInfo
+
+func (m *MutateCampaignCriterionResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignCriterionRequest)(nil), "google.ads.googleads.v3.services.GetCampaignCriterionRequest")
+	proto.RegisterType((*MutateCampaignCriteriaRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignCriteriaRequest")
+	proto.RegisterType((*CampaignCriterionOperation)(nil), "google.ads.googleads.v3.services.CampaignCriterionOperation")
+	proto.RegisterType((*MutateCampaignCriteriaResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignCriteriaResponse")
+	proto.RegisterType((*MutateCampaignCriterionResult)(nil), "google.ads.googleads.v3.services.MutateCampaignCriterionResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_criterion_service.proto", fileDescriptor_9aaa1f8d0677bfb8)
+}
+
+var fileDescriptor_9aaa1f8d0677bfb8 = []byte{
+	// 773 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xcf, 0x6b, 0xdb, 0x48,
+	0x14, 0xc7, 0x57, 0x72, 0xc8, 0x6e, 0xc6, 0xc9, 0x2e, 0xcc, 0xee, 0xa6, 0xc2, 0x69, 0x5a, 0xa3,
+	0x06, 0x6a, 0x4c, 0x91, 0xc0, 0x4e, 0x2f, 0x4a, 0x43, 0x2b, 0xa7, 0x8d, 0xd3, 0x42, 0x7e, 0xe0,
+	0x40, 0x20, 0xc5, 0x20, 0x26, 0xd2, 0xc4, 0x15, 0x91, 0x34, 0xea, 0xcc, 0xc8, 0x10, 0x42, 0x2e,
+	0xa5, 0xa7, 0x5e, 0xfb, 0x0f, 0x94, 0x1e, 0xfb, 0x6f, 0xf4, 0x96, 0x6b, 0x0f, 0x85, 0x9c, 0x7a,
+	0xe8, 0xa9, 0x7f, 0x40, 0xce, 0x45, 0x1a, 0x8d, 0x7f, 0xc4, 0x76, 0x0d, 0xe9, 0xed, 0x79, 0xde,
+	0x57, 0x9f, 0xf7, 0xde, 0xbc, 0x37, 0xcf, 0xc0, 0xee, 0x10, 0xd2, 0x09, 0xb0, 0x89, 0x3c, 0x66,
+	0x0a, 0x33, 0xb5, 0xba, 0x75, 0x93, 0x61, 0xda, 0xf5, 0x5d, 0xcc, 0x4c, 0x17, 0x85, 0x31, 0xf2,
+	0x3b, 0x91, 0xe3, 0x52, 0x9f, 0x63, 0xea, 0x93, 0xc8, 0xc9, 0x7d, 0x46, 0x4c, 0x09, 0x27, 0xb0,
+	0x2c, 0xbe, 0x33, 0x90, 0xc7, 0x8c, 0x1e, 0xc2, 0xe8, 0xd6, 0x0d, 0x89, 0x28, 0x59, 0x93, 0x82,
+	0x50, 0xcc, 0x48, 0x42, 0xc7, 0x47, 0x11, 0xf4, 0xd2, 0x6d, 0xf9, 0x6d, 0xec, 0x9b, 0x28, 0x8a,
+	0x08, 0x47, 0xdc, 0x27, 0x11, 0xcb, 0xbd, 0xb7, 0x06, 0xbc, 0x6e, 0xe0, 0xe3, 0x88, 0xe7, 0x8e,
+	0xbb, 0x03, 0x8e, 0x63, 0x1f, 0x07, 0x9e, 0x73, 0x84, 0x5f, 0xa1, 0xae, 0x4f, 0x68, 0x2e, 0xc8,
+	0xb3, 0x36, 0xb3, 0x5f, 0x47, 0xc9, 0x71, 0xae, 0x0a, 0x11, 0x3b, 0xb9, 0xc6, 0xa6, 0xb1, 0x6b,
+	0x32, 0x8e, 0x78, 0x92, 0x07, 0xd5, 0x9b, 0x60, 0xa9, 0x89, 0xf9, 0x46, 0x9e, 0xf1, 0x86, 0x4c,
+	0xb8, 0x85, 0x5f, 0x27, 0x98, 0x71, 0x58, 0x01, 0x0b, 0xb2, 0x2e, 0x27, 0x42, 0x21, 0xd6, 0x94,
+	0xb2, 0x52, 0x99, 0x6b, 0x14, 0xbe, 0xd9, 0x6a, 0x6b, 0x5e, 0x7a, 0x76, 0x50, 0x88, 0xf5, 0x2b,
+	0x05, 0x2c, 0x6f, 0x27, 0x1c, 0x71, 0x7c, 0x0d, 0x86, 0x24, 0x6b, 0x05, 0x14, 0xdd, 0x84, 0x71,
+	0x12, 0x62, 0xea, 0xf8, 0xde, 0x20, 0x09, 0xc8, 0xf3, 0xe7, 0x1e, 0x44, 0x00, 0x90, 0x18, 0x53,
+	0x71, 0x33, 0x9a, 0x5a, 0x2e, 0x54, 0x8a, 0xb5, 0x47, 0xc6, 0xb4, 0xb6, 0x18, 0x23, 0x15, 0xec,
+	0x4a, 0x48, 0x1e, 0xa2, 0x0f, 0x85, 0xf7, 0xc1, 0x3f, 0x31, 0xa2, 0xdc, 0x47, 0x81, 0x73, 0x8c,
+	0xfc, 0x20, 0xa1, 0x58, 0x2b, 0x94, 0x95, 0xca, 0x5f, 0xad, 0xbf, 0xf3, 0xe3, 0x4d, 0x71, 0x0a,
+	0xef, 0x81, 0x85, 0x2e, 0x0a, 0x7c, 0x0f, 0x71, 0xec, 0x90, 0x28, 0x38, 0xd5, 0x66, 0x32, 0xd9,
+	0xbc, 0x3c, 0xdc, 0x8d, 0x82, 0x53, 0xfd, 0x83, 0x0a, 0x4a, 0x93, 0xa3, 0xc3, 0x35, 0x50, 0x4c,
+	0xe2, 0x8c, 0x90, 0xb6, 0x23, 0x23, 0x14, 0x6b, 0x25, 0x59, 0x90, 0xec, 0x98, 0xb1, 0x99, 0x76,
+	0x6c, 0x1b, 0xb1, 0x93, 0x16, 0x10, 0xf2, 0xd4, 0x86, 0x3b, 0x60, 0xd6, 0xa5, 0x18, 0x71, 0x71,
+	0xef, 0xc5, 0xda, 0xea, 0xc4, 0x8b, 0xe8, 0x4d, 0xdf, 0xe8, 0x4d, 0x6c, 0xfd, 0xd1, 0xca, 0x29,
+	0x29, 0x4f, 0xd0, 0x35, 0xf5, 0xf7, 0x78, 0x82, 0x02, 0x35, 0x30, 0x4b, 0x71, 0x48, 0xba, 0xe2,
+	0x02, 0xe7, 0x52, 0x8f, 0xf8, 0xdd, 0x28, 0x82, 0xb9, 0xde, 0x8d, 0xeb, 0x9f, 0x15, 0x70, 0x67,
+	0xd2, 0x6c, 0xb0, 0x98, 0x44, 0x0c, 0xc3, 0x4d, 0xf0, 0xff, 0xb5, 0x9e, 0x38, 0x98, 0x52, 0x42,
+	0x33, 0x70, 0xb1, 0x06, 0x65, 0xa2, 0x34, 0x76, 0x8d, 0xfd, 0x6c, 0x80, 0x5b, 0xff, 0x0e, 0x77,
+	0xeb, 0x59, 0x2a, 0x87, 0x87, 0xe0, 0x4f, 0x8a, 0x59, 0x12, 0x70, 0x39, 0x3b, 0x8f, 0xa7, 0xcf,
+	0xce, 0xd8, 0xd4, 0xd2, 0x37, 0x90, 0x72, 0x5a, 0x92, 0xa7, 0x3f, 0x9d, 0x30, 0xe0, 0x52, 0x99,
+	0x8e, 0xcb, 0x98, 0xc7, 0x32, 0xfc, 0x4e, 0x6a, 0xef, 0x66, 0x80, 0x36, 0x02, 0xd8, 0x17, 0xa9,
+	0xc0, 0xaf, 0x0a, 0xf8, 0x6f, 0xdc, 0x73, 0x84, 0xeb, 0xd3, 0xab, 0xf8, 0xc5, 0x33, 0x2e, 0xdd,
+	0xa8, 0xcf, 0xfa, 0x8b, 0x4b, 0x7b, 0xb8, 0xa0, 0x37, 0x5f, 0xbe, 0xbf, 0x57, 0x57, 0x61, 0x2d,
+	0x5d, 0x77, 0x67, 0x43, 0x9e, 0x75, 0xf9, 0x82, 0x99, 0x59, 0xed, 0xed, 0x3f, 0xd9, 0x64, 0xb3,
+	0x7a, 0x0e, 0xaf, 0x14, 0xb0, 0x38, 0x7e, 0x04, 0xe0, 0x4d, 0x3b, 0x24, 0x17, 0x4b, 0xe9, 0xc9,
+	0xcd, 0x01, 0x62, 0xfa, 0xf4, 0xc3, 0x4b, 0x7b, 0x71, 0x60, 0x37, 0x3d, 0xe8, 0x2f, 0x8b, 0xac,
+	0x64, 0x4b, 0x7f, 0x98, 0x96, 0xdc, 0xaf, 0xf1, 0x6c, 0x40, 0xbc, 0x5e, 0x3d, 0x1f, 0xa9, 0xd8,
+	0x0a, 0xb3, 0x78, 0x96, 0x52, 0x2d, 0x2d, 0x5d, 0xd8, 0x5a, 0x3f, 0xa7, 0xdc, 0x8a, 0x7d, 0x66,
+	0xb8, 0x24, 0x6c, 0xbc, 0x55, 0xc1, 0x8a, 0x4b, 0xc2, 0xa9, 0xf9, 0x37, 0x96, 0x27, 0x8d, 0xcc,
+	0x5e, 0xba, 0x40, 0xf6, 0x94, 0x97, 0x5b, 0x39, 0xa2, 0x43, 0x02, 0x14, 0x75, 0x0c, 0x42, 0x3b,
+	0x66, 0x07, 0x47, 0xd9, 0x7a, 0x31, 0xfb, 0x41, 0x27, 0xff, 0x35, 0xae, 0x49, 0xe3, 0xa3, 0x5a,
+	0x68, 0xda, 0xf6, 0x27, 0xb5, 0xdc, 0x14, 0x40, 0xdb, 0x63, 0x86, 0x30, 0x53, 0xeb, 0xa0, 0x6e,
+	0xe4, 0x81, 0xd9, 0x85, 0x94, 0xb4, 0x6d, 0x8f, 0xb5, 0x7b, 0x92, 0xf6, 0x41, 0xbd, 0x2d, 0x25,
+	0x3f, 0xd4, 0x15, 0x71, 0x6e, 0x59, 0xb6, 0xc7, 0x2c, 0xab, 0x27, 0xb2, 0xac, 0x83, 0xba, 0x65,
+	0x49, 0xd9, 0xd1, 0x6c, 0x96, 0x67, 0xfd, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0x22, 0x62,
+	0x9d, 0xc1, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignCriterionServiceClient is the client API for CampaignCriterionService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignCriterionServiceClient interface {
+	// Returns the requested criterion in full detail.
+	GetCampaignCriterion(ctx context.Context, in *GetCampaignCriterionRequest, opts ...grpc.CallOption) (*resources.CampaignCriterion, error)
+	// Creates, updates, or removes criteria. Operation statuses are returned.
+	MutateCampaignCriteria(ctx context.Context, in *MutateCampaignCriteriaRequest, opts ...grpc.CallOption) (*MutateCampaignCriteriaResponse, error)
+}
+
+type campaignCriterionServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignCriterionServiceClient(cc grpc.ClientConnInterface) CampaignCriterionServiceClient {
+	return &campaignCriterionServiceClient{cc}
+}
+
+func (c *campaignCriterionServiceClient) GetCampaignCriterion(ctx context.Context, in *GetCampaignCriterionRequest, opts ...grpc.CallOption) (*resources.CampaignCriterion, error) {
+	out := new(resources.CampaignCriterion)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignCriterionService/GetCampaignCriterion", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignCriterionServiceClient) MutateCampaignCriteria(ctx context.Context, in *MutateCampaignCriteriaRequest, opts ...grpc.CallOption) (*MutateCampaignCriteriaResponse, error) {
+	out := new(MutateCampaignCriteriaResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignCriterionService/MutateCampaignCriteria", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignCriterionServiceServer is the server API for CampaignCriterionService service.
+type CampaignCriterionServiceServer interface {
+	// Returns the requested criterion in full detail.
+	GetCampaignCriterion(context.Context, *GetCampaignCriterionRequest) (*resources.CampaignCriterion, error)
+	// Creates, updates, or removes criteria. Operation statuses are returned.
+	MutateCampaignCriteria(context.Context, *MutateCampaignCriteriaRequest) (*MutateCampaignCriteriaResponse, error)
+}
+
+// UnimplementedCampaignCriterionServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignCriterionServiceServer struct {
+}
+
+func (*UnimplementedCampaignCriterionServiceServer) GetCampaignCriterion(ctx context.Context, req *GetCampaignCriterionRequest) (*resources.CampaignCriterion, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaignCriterion not implemented")
+}
+func (*UnimplementedCampaignCriterionServiceServer) MutateCampaignCriteria(ctx context.Context, req *MutateCampaignCriteriaRequest) (*MutateCampaignCriteriaResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaignCriteria not implemented")
+}
+
+func RegisterCampaignCriterionServiceServer(s *grpc.Server, srv CampaignCriterionServiceServer) {
+	s.RegisterService(&_CampaignCriterionService_serviceDesc, srv)
+}
+
+func _CampaignCriterionService_GetCampaignCriterion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignCriterionRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignCriterionServiceServer).GetCampaignCriterion(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignCriterionService/GetCampaignCriterion",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignCriterionServiceServer).GetCampaignCriterion(ctx, req.(*GetCampaignCriterionRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignCriterionService_MutateCampaignCriteria_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignCriteriaRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignCriterionServiceServer).MutateCampaignCriteria(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignCriterionService/MutateCampaignCriteria",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignCriterionServiceServer).MutateCampaignCriteria(ctx, req.(*MutateCampaignCriteriaRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignCriterionService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignCriterionService",
+	HandlerType: (*CampaignCriterionServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignCriterion",
+			Handler:    _CampaignCriterionService_GetCampaignCriterion_Handler,
+		},
+		{
+			MethodName: "MutateCampaignCriteria",
+			Handler:    _CampaignCriterionService_MutateCampaignCriteria_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_criterion_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_criterion_simulation_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_criterion_simulation_service.pb.go
new file mode 100644
index 0000000..9ee4232
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_criterion_simulation_service.pb.go
@@ -0,0 +1,191 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_criterion_simulation_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [CampaignCriterionSimulationService.GetCampaignCriterionSimulation][google.ads.googleads.v3.services.CampaignCriterionSimulationService.GetCampaignCriterionSimulation].
+type GetCampaignCriterionSimulationRequest struct {
+	// Required. The resource name of the campaign criterion simulation to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignCriterionSimulationRequest) Reset()         { *m = GetCampaignCriterionSimulationRequest{} }
+func (m *GetCampaignCriterionSimulationRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignCriterionSimulationRequest) ProtoMessage()    {}
+func (*GetCampaignCriterionSimulationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d3b7a1ec06fe4172, []int{0}
+}
+
+func (m *GetCampaignCriterionSimulationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignCriterionSimulationRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignCriterionSimulationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignCriterionSimulationRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignCriterionSimulationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignCriterionSimulationRequest.Merge(m, src)
+}
+func (m *GetCampaignCriterionSimulationRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignCriterionSimulationRequest.Size(m)
+}
+func (m *GetCampaignCriterionSimulationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignCriterionSimulationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignCriterionSimulationRequest proto.InternalMessageInfo
+
+func (m *GetCampaignCriterionSimulationRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignCriterionSimulationRequest)(nil), "google.ads.googleads.v3.services.GetCampaignCriterionSimulationRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_criterion_simulation_service.proto", fileDescriptor_d3b7a1ec06fe4172)
+}
+
+var fileDescriptor_d3b7a1ec06fe4172 = []byte{
+	// 427 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x31, 0x8b, 0xd4, 0x40,
+	0x18, 0x86, 0xd9, 0x39, 0x10, 0x0c, 0xda, 0xa4, 0xf1, 0x58, 0x45, 0x97, 0xe5, 0xc4, 0xe3, 0x8a,
+	0x19, 0x30, 0xdd, 0x88, 0x87, 0xb3, 0x87, 0xac, 0x85, 0xc8, 0x79, 0x07, 0x29, 0x24, 0x10, 0xe6,
+	0x92, 0x31, 0x0e, 0x24, 0x33, 0x71, 0xbe, 0x49, 0x1a, 0xb1, 0xd0, 0x1f, 0x60, 0xe3, 0x3f, 0xb0,
+	0xf4, 0x7f, 0xd8, 0x5c, 0x6b, 0x67, 0x65, 0x61, 0xe5, 0xaf, 0x90, 0x64, 0x32, 0xb9, 0x3b, 0x70,
+	0x37, 0xd7, 0xbd, 0xe4, 0x7d, 0x79, 0xde, 0x2f, 0xdf, 0x97, 0x04, 0x2f, 0x0b, 0xad, 0x8b, 0x52,
+	0x10, 0x9e, 0x03, 0x71, 0xb2, 0x53, 0x6d, 0x44, 0x40, 0x98, 0x56, 0x66, 0x02, 0x48, 0xc6, 0xab,
+	0x9a, 0xcb, 0x42, 0xa5, 0x99, 0x91, 0x56, 0x18, 0xa9, 0x55, 0x0a, 0xb2, 0x6a, 0x4a, 0x6e, 0x7b,
+	0xe9, 0x62, 0xb8, 0x36, 0xda, 0xea, 0x70, 0xe1, 0x10, 0x98, 0xe7, 0x80, 0x47, 0x1a, 0x6e, 0x23,
+	0xec, 0x69, 0xf3, 0xe7, 0x9b, 0xfa, 0x8c, 0x00, 0xdd, 0x98, 0xc9, 0x42, 0x57, 0x34, 0xbf, 0xe7,
+	0x31, 0xb5, 0x24, 0x5c, 0x29, 0x6d, 0x7b, 0x13, 0x06, 0xf7, 0xce, 0x25, 0x37, 0x2b, 0xa5, 0x50,
+	0x76, 0x30, 0x1e, 0x5c, 0x32, 0xde, 0x4a, 0x51, 0xe6, 0xe9, 0x99, 0x78, 0xc7, 0x5b, 0xa9, 0x8d,
+	0x0b, 0x2c, 0x5f, 0x07, 0x0f, 0xd7, 0xc2, 0x1e, 0x0d, 0x13, 0x1c, 0xf9, 0x01, 0x4e, 0xc7, 0xfe,
+	0x13, 0xf1, 0xbe, 0x11, 0x60, 0xc3, 0xfd, 0xe0, 0xb6, 0x9f, 0x38, 0x55, 0xbc, 0x12, 0xbb, 0xb3,
+	0xc5, 0x6c, 0xff, 0xe6, 0x6a, 0xe7, 0x37, 0x43, 0x27, 0xb7, 0xbc, 0xf3, 0x8a, 0x57, 0xe2, 0xf1,
+	0x0f, 0x14, 0x2c, 0xb7, 0x00, 0x4f, 0xdd, 0x66, 0xc2, 0x4f, 0x28, 0xb8, 0xbf, 0xbd, 0x3a, 0x5c,
+	0xe3, 0xa9, 0xf5, 0xe2, 0x6b, 0x0d, 0x3f, 0x3f, 0xdc, 0x08, 0x1a, 0xaf, 0x80, 0xb7, 0x60, 0x96,
+	0xf1, 0x2f, 0x76, 0xf5, 0xed, 0x3f, 0xff, 0xfc, 0xf3, 0x15, 0x3d, 0x0b, 0x0f, 0xbb, 0x43, 0x7e,
+	0xb8, 0xe2, 0x3c, 0xcd, 0x1a, 0xb0, 0xba, 0x12, 0x06, 0xc8, 0xc1, 0x78, 0xd9, 0xff, 0x30, 0x81,
+	0x1c, 0x7c, 0x9c, 0xdf, 0x3d, 0x67, 0xbb, 0x17, 0xe3, 0x0c, 0xaa, 0x96, 0x80, 0x33, 0x5d, 0xad,
+	0xbe, 0xa0, 0x60, 0x2f, 0xd3, 0xd5, 0xe4, 0x0e, 0x56, 0x8f, 0xa6, 0xb7, 0x7d, 0xdc, 0x1d, 0xfb,
+	0x78, 0xf6, 0xe6, 0xc5, 0x00, 0x2b, 0x74, 0xc9, 0x55, 0x81, 0xb5, 0x29, 0x48, 0x21, 0x54, 0xff,
+	0x29, 0x90, 0x8b, 0xfa, 0xcd, 0x3f, 0xc7, 0x13, 0x2f, 0xbe, 0xa1, 0x9d, 0x35, 0x63, 0xdf, 0xd1,
+	0x62, 0xed, 0x80, 0x2c, 0x07, 0xec, 0x64, 0xa7, 0xe2, 0x08, 0x0f, 0xc5, 0x70, 0xee, 0x23, 0x09,
+	0xcb, 0x21, 0x19, 0x23, 0x49, 0x1c, 0x25, 0x3e, 0xf2, 0x17, 0xed, 0xb9, 0xe7, 0x94, 0xb2, 0x1c,
+	0x28, 0x1d, 0x43, 0x94, 0xc6, 0x11, 0xa5, 0x3e, 0x76, 0x76, 0xa3, 0x9f, 0x33, 0xfa, 0x17, 0x00,
+	0x00, 0xff, 0xff, 0x16, 0x2f, 0x95, 0xd8, 0xc3, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignCriterionSimulationServiceClient is the client API for CampaignCriterionSimulationService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignCriterionSimulationServiceClient interface {
+	// Returns the requested campaign criterion simulation in full detail.
+	GetCampaignCriterionSimulation(ctx context.Context, in *GetCampaignCriterionSimulationRequest, opts ...grpc.CallOption) (*resources.CampaignCriterionSimulation, error)
+}
+
+type campaignCriterionSimulationServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignCriterionSimulationServiceClient(cc grpc.ClientConnInterface) CampaignCriterionSimulationServiceClient {
+	return &campaignCriterionSimulationServiceClient{cc}
+}
+
+func (c *campaignCriterionSimulationServiceClient) GetCampaignCriterionSimulation(ctx context.Context, in *GetCampaignCriterionSimulationRequest, opts ...grpc.CallOption) (*resources.CampaignCriterionSimulation, error) {
+	out := new(resources.CampaignCriterionSimulation)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignCriterionSimulationService/GetCampaignCriterionSimulation", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignCriterionSimulationServiceServer is the server API for CampaignCriterionSimulationService service.
+type CampaignCriterionSimulationServiceServer interface {
+	// Returns the requested campaign criterion simulation in full detail.
+	GetCampaignCriterionSimulation(context.Context, *GetCampaignCriterionSimulationRequest) (*resources.CampaignCriterionSimulation, error)
+}
+
+// UnimplementedCampaignCriterionSimulationServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignCriterionSimulationServiceServer struct {
+}
+
+func (*UnimplementedCampaignCriterionSimulationServiceServer) GetCampaignCriterionSimulation(ctx context.Context, req *GetCampaignCriterionSimulationRequest) (*resources.CampaignCriterionSimulation, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetCampaignCriterionSimulation not implemented")
+}
+
+func RegisterCampaignCriterionSimulationServiceServer(s *grpc.Server, srv CampaignCriterionSimulationServiceServer) {
+	s.RegisterService(&_CampaignCriterionSimulationService_serviceDesc, srv)
+}
+
+func _CampaignCriterionSimulationService_GetCampaignCriterionSimulation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignCriterionSimulationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignCriterionSimulationServiceServer).GetCampaignCriterionSimulation(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignCriterionSimulationService/GetCampaignCriterionSimulation",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignCriterionSimulationServiceServer).GetCampaignCriterionSimulation(ctx, req.(*GetCampaignCriterionSimulationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignCriterionSimulationService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignCriterionSimulationService",
+	HandlerType: (*CampaignCriterionSimulationServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignCriterionSimulation",
+			Handler:    _CampaignCriterionSimulationService_GetCampaignCriterionSimulation_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_criterion_simulation_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_draft_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_draft_service.pb.go
new file mode 100644
index 0000000..610ea11
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_draft_service.pb.go
@@ -0,0 +1,803 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_draft_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	longrunning "google.golang.org/genproto/googleapis/longrunning"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignDraftService.GetCampaignDraft][google.ads.googleads.v3.services.CampaignDraftService.GetCampaignDraft].
+type GetCampaignDraftRequest struct {
+	// Required. The resource name of the campaign draft to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignDraftRequest) Reset()         { *m = GetCampaignDraftRequest{} }
+func (m *GetCampaignDraftRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignDraftRequest) ProtoMessage()    {}
+func (*GetCampaignDraftRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01b2400b8d9061a5, []int{0}
+}
+
+func (m *GetCampaignDraftRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignDraftRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignDraftRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignDraftRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignDraftRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignDraftRequest.Merge(m, src)
+}
+func (m *GetCampaignDraftRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignDraftRequest.Size(m)
+}
+func (m *GetCampaignDraftRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignDraftRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignDraftRequest proto.InternalMessageInfo
+
+func (m *GetCampaignDraftRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignDraftService.MutateCampaignDrafts][google.ads.googleads.v3.services.CampaignDraftService.MutateCampaignDrafts].
+type MutateCampaignDraftsRequest struct {
+	// Required. The ID of the customer whose campaign drafts are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual campaign drafts.
+	Operations []*CampaignDraftOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignDraftsRequest) Reset()         { *m = MutateCampaignDraftsRequest{} }
+func (m *MutateCampaignDraftsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignDraftsRequest) ProtoMessage()    {}
+func (*MutateCampaignDraftsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01b2400b8d9061a5, []int{1}
+}
+
+func (m *MutateCampaignDraftsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignDraftsRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignDraftsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignDraftsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignDraftsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignDraftsRequest.Merge(m, src)
+}
+func (m *MutateCampaignDraftsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignDraftsRequest.Size(m)
+}
+func (m *MutateCampaignDraftsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignDraftsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignDraftsRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignDraftsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignDraftsRequest) GetOperations() []*CampaignDraftOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignDraftsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignDraftsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// Request message for [CampaignDraftService.PromoteCampaignDraft][google.ads.googleads.v3.services.CampaignDraftService.PromoteCampaignDraft].
+type PromoteCampaignDraftRequest struct {
+	// Required. The resource name of the campaign draft to promote.
+	CampaignDraft        string   `protobuf:"bytes,1,opt,name=campaign_draft,json=campaignDraft,proto3" json:"campaign_draft,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PromoteCampaignDraftRequest) Reset()         { *m = PromoteCampaignDraftRequest{} }
+func (m *PromoteCampaignDraftRequest) String() string { return proto.CompactTextString(m) }
+func (*PromoteCampaignDraftRequest) ProtoMessage()    {}
+func (*PromoteCampaignDraftRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01b2400b8d9061a5, []int{2}
+}
+
+func (m *PromoteCampaignDraftRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PromoteCampaignDraftRequest.Unmarshal(m, b)
+}
+func (m *PromoteCampaignDraftRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PromoteCampaignDraftRequest.Marshal(b, m, deterministic)
+}
+func (m *PromoteCampaignDraftRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PromoteCampaignDraftRequest.Merge(m, src)
+}
+func (m *PromoteCampaignDraftRequest) XXX_Size() int {
+	return xxx_messageInfo_PromoteCampaignDraftRequest.Size(m)
+}
+func (m *PromoteCampaignDraftRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_PromoteCampaignDraftRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PromoteCampaignDraftRequest proto.InternalMessageInfo
+
+func (m *PromoteCampaignDraftRequest) GetCampaignDraft() string {
+	if m != nil {
+		return m.CampaignDraft
+	}
+	return ""
+}
+
+// A single operation (create, update, remove) on a campaign draft.
+type CampaignDraftOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignDraftOperation_Create
+	//	*CampaignDraftOperation_Update
+	//	*CampaignDraftOperation_Remove
+	Operation            isCampaignDraftOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *CampaignDraftOperation) Reset()         { *m = CampaignDraftOperation{} }
+func (m *CampaignDraftOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignDraftOperation) ProtoMessage()    {}
+func (*CampaignDraftOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01b2400b8d9061a5, []int{3}
+}
+
+func (m *CampaignDraftOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignDraftOperation.Unmarshal(m, b)
+}
+func (m *CampaignDraftOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignDraftOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignDraftOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignDraftOperation.Merge(m, src)
+}
+func (m *CampaignDraftOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignDraftOperation.Size(m)
+}
+func (m *CampaignDraftOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignDraftOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignDraftOperation proto.InternalMessageInfo
+
+func (m *CampaignDraftOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCampaignDraftOperation_Operation interface {
+	isCampaignDraftOperation_Operation()
+}
+
+type CampaignDraftOperation_Create struct {
+	Create *resources.CampaignDraft `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CampaignDraftOperation_Update struct {
+	Update *resources.CampaignDraft `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type CampaignDraftOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignDraftOperation_Create) isCampaignDraftOperation_Operation() {}
+
+func (*CampaignDraftOperation_Update) isCampaignDraftOperation_Operation() {}
+
+func (*CampaignDraftOperation_Remove) isCampaignDraftOperation_Operation() {}
+
+func (m *CampaignDraftOperation) GetOperation() isCampaignDraftOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignDraftOperation) GetCreate() *resources.CampaignDraft {
+	if x, ok := m.GetOperation().(*CampaignDraftOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CampaignDraftOperation) GetUpdate() *resources.CampaignDraft {
+	if x, ok := m.GetOperation().(*CampaignDraftOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CampaignDraftOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignDraftOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignDraftOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignDraftOperation_Create)(nil),
+		(*CampaignDraftOperation_Update)(nil),
+		(*CampaignDraftOperation_Remove)(nil),
+	}
+}
+
+// Response message for campaign draft mutate.
+type MutateCampaignDraftsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignDraftResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *MutateCampaignDraftsResponse) Reset()         { *m = MutateCampaignDraftsResponse{} }
+func (m *MutateCampaignDraftsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignDraftsResponse) ProtoMessage()    {}
+func (*MutateCampaignDraftsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01b2400b8d9061a5, []int{4}
+}
+
+func (m *MutateCampaignDraftsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignDraftsResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignDraftsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignDraftsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignDraftsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignDraftsResponse.Merge(m, src)
+}
+func (m *MutateCampaignDraftsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignDraftsResponse.Size(m)
+}
+func (m *MutateCampaignDraftsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignDraftsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignDraftsResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignDraftsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignDraftsResponse) GetResults() []*MutateCampaignDraftResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the campaign draft mutate.
+type MutateCampaignDraftResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignDraftResult) Reset()         { *m = MutateCampaignDraftResult{} }
+func (m *MutateCampaignDraftResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignDraftResult) ProtoMessage()    {}
+func (*MutateCampaignDraftResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01b2400b8d9061a5, []int{5}
+}
+
+func (m *MutateCampaignDraftResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignDraftResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignDraftResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignDraftResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignDraftResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignDraftResult.Merge(m, src)
+}
+func (m *MutateCampaignDraftResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignDraftResult.Size(m)
+}
+func (m *MutateCampaignDraftResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignDraftResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignDraftResult proto.InternalMessageInfo
+
+func (m *MutateCampaignDraftResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignDraftService.ListCampaignDraftAsyncErrors][google.ads.googleads.v3.services.CampaignDraftService.ListCampaignDraftAsyncErrors].
+type ListCampaignDraftAsyncErrorsRequest struct {
+	// Required. The name of the campaign draft from which to retrieve the async errors.
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Token of the page to retrieve. If not specified, the first
+	// page of results will be returned. Use the value obtained from
+	// `next_page_token` in the previous response in order to request
+	// the next page of results.
+	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// Number of elements to retrieve in a single page.
+	// When a page request is too large, the server may decide to
+	// further limit the number of returned resources.
+	PageSize             int32    `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListCampaignDraftAsyncErrorsRequest) Reset()         { *m = ListCampaignDraftAsyncErrorsRequest{} }
+func (m *ListCampaignDraftAsyncErrorsRequest) String() string { return proto.CompactTextString(m) }
+func (*ListCampaignDraftAsyncErrorsRequest) ProtoMessage()    {}
+func (*ListCampaignDraftAsyncErrorsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01b2400b8d9061a5, []int{6}
+}
+
+func (m *ListCampaignDraftAsyncErrorsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListCampaignDraftAsyncErrorsRequest.Unmarshal(m, b)
+}
+func (m *ListCampaignDraftAsyncErrorsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListCampaignDraftAsyncErrorsRequest.Marshal(b, m, deterministic)
+}
+func (m *ListCampaignDraftAsyncErrorsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListCampaignDraftAsyncErrorsRequest.Merge(m, src)
+}
+func (m *ListCampaignDraftAsyncErrorsRequest) XXX_Size() int {
+	return xxx_messageInfo_ListCampaignDraftAsyncErrorsRequest.Size(m)
+}
+func (m *ListCampaignDraftAsyncErrorsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListCampaignDraftAsyncErrorsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListCampaignDraftAsyncErrorsRequest proto.InternalMessageInfo
+
+func (m *ListCampaignDraftAsyncErrorsRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *ListCampaignDraftAsyncErrorsRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *ListCampaignDraftAsyncErrorsRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+// Response message for [CampaignDraftService.ListCampaignDraftAsyncErrors][google.ads.googleads.v3.services.CampaignDraftService.ListCampaignDraftAsyncErrors].
+type ListCampaignDraftAsyncErrorsResponse struct {
+	// Details of the errors when performing the asynchronous operation.
+	Errors []*status.Status `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"`
+	// Pagination token used to retrieve the next page of results.
+	// Pass the content of this string as the `page_token` attribute of
+	// the next request. `next_page_token` is not returned for the last
+	// page.
+	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListCampaignDraftAsyncErrorsResponse) Reset()         { *m = ListCampaignDraftAsyncErrorsResponse{} }
+func (m *ListCampaignDraftAsyncErrorsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListCampaignDraftAsyncErrorsResponse) ProtoMessage()    {}
+func (*ListCampaignDraftAsyncErrorsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_01b2400b8d9061a5, []int{7}
+}
+
+func (m *ListCampaignDraftAsyncErrorsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListCampaignDraftAsyncErrorsResponse.Unmarshal(m, b)
+}
+func (m *ListCampaignDraftAsyncErrorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListCampaignDraftAsyncErrorsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListCampaignDraftAsyncErrorsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListCampaignDraftAsyncErrorsResponse.Merge(m, src)
+}
+func (m *ListCampaignDraftAsyncErrorsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListCampaignDraftAsyncErrorsResponse.Size(m)
+}
+func (m *ListCampaignDraftAsyncErrorsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListCampaignDraftAsyncErrorsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListCampaignDraftAsyncErrorsResponse proto.InternalMessageInfo
+
+func (m *ListCampaignDraftAsyncErrorsResponse) GetErrors() []*status.Status {
+	if m != nil {
+		return m.Errors
+	}
+	return nil
+}
+
+func (m *ListCampaignDraftAsyncErrorsResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignDraftRequest)(nil), "google.ads.googleads.v3.services.GetCampaignDraftRequest")
+	proto.RegisterType((*MutateCampaignDraftsRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignDraftsRequest")
+	proto.RegisterType((*PromoteCampaignDraftRequest)(nil), "google.ads.googleads.v3.services.PromoteCampaignDraftRequest")
+	proto.RegisterType((*CampaignDraftOperation)(nil), "google.ads.googleads.v3.services.CampaignDraftOperation")
+	proto.RegisterType((*MutateCampaignDraftsResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignDraftsResponse")
+	proto.RegisterType((*MutateCampaignDraftResult)(nil), "google.ads.googleads.v3.services.MutateCampaignDraftResult")
+	proto.RegisterType((*ListCampaignDraftAsyncErrorsRequest)(nil), "google.ads.googleads.v3.services.ListCampaignDraftAsyncErrorsRequest")
+	proto.RegisterType((*ListCampaignDraftAsyncErrorsResponse)(nil), "google.ads.googleads.v3.services.ListCampaignDraftAsyncErrorsResponse")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_draft_service.proto", fileDescriptor_01b2400b8d9061a5)
+}
+
+var fileDescriptor_01b2400b8d9061a5 = []byte{
+	// 994 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x4f, 0x6f, 0xdc, 0x44,
+	0x14, 0xc7, 0x0e, 0xa4, 0xdd, 0xb7, 0x4d, 0x8b, 0x86, 0xb4, 0xd9, 0x6e, 0x52, 0xb1, 0x72, 0x22,
+	0x88, 0x56, 0xc8, 0xae, 0x76, 0x25, 0xd4, 0x3a, 0x4a, 0x55, 0x6f, 0xc9, 0x9f, 0x22, 0x4a, 0x23,
+	0x07, 0x02, 0x42, 0x41, 0xd6, 0xc4, 0x9e, 0x18, 0x2b, 0xb6, 0xc7, 0xcc, 0xd8, 0x2b, 0x92, 0xaa,
+	0x12, 0xe2, 0xc2, 0x81, 0x23, 0x7c, 0x02, 0x8e, 0x7c, 0x07, 0x3e, 0x00, 0xb9, 0x72, 0xcb, 0x09,
+	0x21, 0xb8, 0x70, 0x40, 0x7c, 0x04, 0xe4, 0x3f, 0xb3, 0xbb, 0xde, 0x7a, 0xb3, 0x4d, 0x7a, 0x1b,
+	0xbf, 0x3f, 0xbf, 0xf7, 0x7e, 0xf3, 0x7b, 0xf3, 0x76, 0x61, 0xdd, 0xa5, 0xd4, 0xf5, 0x89, 0x86,
+	0x1d, 0xae, 0xe5, 0xc7, 0xf4, 0xd4, 0xef, 0x6a, 0x9c, 0xb0, 0xbe, 0x67, 0x13, 0xae, 0xd9, 0x38,
+	0x88, 0xb0, 0xe7, 0x86, 0x96, 0xc3, 0xf0, 0x61, 0x6c, 0x15, 0x76, 0x35, 0x62, 0x34, 0xa6, 0xa8,
+	0x95, 0xe7, 0xa8, 0xd8, 0xe1, 0xea, 0x20, 0x5d, 0xed, 0x77, 0x55, 0x91, 0xde, 0x7c, 0x7f, 0x52,
+	0x01, 0x46, 0x38, 0x4d, 0xd8, 0x8b, 0x15, 0x72, 0xe4, 0xe6, 0x92, 0xc8, 0x8b, 0x3c, 0x0d, 0x87,
+	0x21, 0x8d, 0x71, 0xec, 0xd1, 0x90, 0x17, 0xde, 0x85, 0x11, 0xaf, 0xed, 0x7b, 0x24, 0x14, 0x69,
+	0x6f, 0x8f, 0x38, 0x0e, 0x3d, 0xe2, 0x3b, 0xd6, 0x01, 0xf9, 0x0a, 0xf7, 0x3d, 0xca, 0x8a, 0x80,
+	0xe5, 0x22, 0xc0, 0xa7, 0xa1, 0xcb, 0x92, 0x30, 0xf4, 0x42, 0x57, 0xa3, 0x11, 0x61, 0x25, 0xf8,
+	0x82, 0x96, 0x96, 0x7d, 0x1d, 0x24, 0x87, 0x05, 0x54, 0x80, 0xf9, 0xd1, 0x58, 0x03, 0x2c, 0xb2,
+	0x35, 0x1e, 0xe3, 0x38, 0x29, 0x52, 0x95, 0x47, 0xb0, 0xb0, 0x45, 0xe2, 0x47, 0x05, 0xa5, 0x0f,
+	0x52, 0x46, 0x26, 0xf9, 0x3a, 0x21, 0x3c, 0x46, 0xab, 0x30, 0x27, 0x48, 0x5b, 0x21, 0x0e, 0x48,
+	0x43, 0x6a, 0x49, 0xab, 0xb5, 0xde, 0xcc, 0x1f, 0x86, 0x6c, 0x5e, 0x13, 0x9e, 0x8f, 0x71, 0x40,
+	0x94, 0xff, 0x24, 0x58, 0x7c, 0x92, 0xc4, 0x38, 0x26, 0x25, 0x20, 0x2e, 0x90, 0x56, 0xa0, 0x6e,
+	0x27, 0x3c, 0xa6, 0x01, 0x61, 0x96, 0xe7, 0x8c, 0xe2, 0x80, 0xb0, 0x3f, 0x76, 0xd0, 0x97, 0x00,
+	0x43, 0x66, 0x0d, 0xb9, 0x35, 0xb3, 0x5a, 0xef, 0xdc, 0x53, 0xa7, 0x29, 0xa6, 0x96, 0x4a, 0x3e,
+	0x15, 0x00, 0x05, 0xfc, 0x10, 0x10, 0xbd, 0x0b, 0x37, 0x22, 0xcc, 0x62, 0x0f, 0xfb, 0xd6, 0x21,
+	0xf6, 0xfc, 0x84, 0x91, 0xc6, 0x4c, 0x4b, 0x5a, 0xbd, 0x6a, 0x5e, 0x2f, 0xcc, 0x9b, 0xb9, 0x15,
+	0x2d, 0xc3, 0x5c, 0x1f, 0xfb, 0x9e, 0x83, 0x63, 0x62, 0xd1, 0xd0, 0x3f, 0x6e, 0xbc, 0x9e, 0x85,
+	0x5d, 0x13, 0xc6, 0xa7, 0xa1, 0x7f, 0xac, 0x3c, 0x86, 0xc5, 0x1d, 0x46, 0x03, 0x3a, 0x46, 0x59,
+	0x30, 0x6e, 0xc3, 0xf5, 0xf2, 0x98, 0x8c, 0x92, 0x9e, 0xb3, 0x47, 0x53, 0x94, 0x9f, 0x64, 0xb8,
+	0x55, 0x4d, 0x02, 0xad, 0x41, 0x3d, 0x89, 0xb2, 0x46, 0x52, 0x2d, 0xb3, 0x46, 0xea, 0x9d, 0xa6,
+	0xb8, 0x13, 0x21, 0xb7, 0xba, 0x99, 0xca, 0xfd, 0x04, 0xf3, 0x23, 0x13, 0xf2, 0xf0, 0xf4, 0x8c,
+	0x3e, 0x84, 0x59, 0x9b, 0x11, 0x1c, 0xe7, 0xc2, 0xd5, 0x3b, 0x77, 0x27, 0xde, 0xe5, 0x60, 0xb6,
+	0xcb, 0x97, 0xb9, 0xfd, 0x9a, 0x59, 0x20, 0xa4, 0x58, 0x39, 0x72, 0x43, 0xbe, 0x3c, 0x56, 0x8e,
+	0x80, 0x1a, 0x30, 0xcb, 0x48, 0x40, 0xfb, 0xf9, 0xfd, 0xd7, 0x52, 0x4f, 0xfe, 0xdd, 0xab, 0x43,
+	0x6d, 0x20, 0x98, 0xf2, 0xab, 0x04, 0x4b, 0xd5, 0x43, 0xc5, 0x23, 0x1a, 0x72, 0x82, 0x36, 0xe1,
+	0xe6, 0x98, 0xa0, 0x16, 0x61, 0x8c, 0xb2, 0x0c, 0xb6, 0xde, 0x41, 0xa2, 0x45, 0x16, 0xd9, 0xea,
+	0x6e, 0x36, 0xf3, 0xe6, 0x5b, 0x65, 0xa9, 0x37, 0xd2, 0x70, 0xf4, 0x29, 0x5c, 0x61, 0x84, 0x27,
+	0x7e, 0x2c, 0x86, 0x6e, 0x6d, 0xfa, 0xd0, 0x55, 0x34, 0x66, 0x66, 0x18, 0xa6, 0xc0, 0x52, 0x1e,
+	0xc2, 0xed, 0x89, 0x51, 0xe9, 0x8c, 0x55, 0xbc, 0xad, 0xb1, 0x67, 0xf5, 0x83, 0x04, 0xcb, 0x1f,
+	0x79, 0xbc, 0xfc, 0x3a, 0x0d, 0x7e, 0x1c, 0xda, 0x59, 0xe3, 0xfc, 0xc2, 0x0f, 0x15, 0xdd, 0x01,
+	0x88, 0xb0, 0x4b, 0xac, 0x98, 0x1e, 0x91, 0x30, 0x93, 0xb2, 0x66, 0xd6, 0x52, 0xcb, 0x27, 0xa9,
+	0x01, 0x2d, 0x42, 0xf6, 0x61, 0x71, 0xef, 0x24, 0x17, 0xe7, 0x0d, 0xf3, 0x6a, 0x6a, 0xd8, 0xf5,
+	0x4e, 0x88, 0x72, 0x02, 0x2b, 0xe7, 0x37, 0x53, 0xc8, 0xd2, 0x86, 0xd9, 0x4c, 0x06, 0xde, 0x90,
+	0xb2, 0xdb, 0xac, 0xd2, 0xa1, 0x88, 0x40, 0xef, 0xc0, 0x8d, 0x90, 0x7c, 0x13, 0x5b, 0x2f, 0x34,
+	0x35, 0x97, 0x9a, 0x77, 0x44, 0x63, 0x9d, 0x3f, 0xaf, 0xc0, 0x7c, 0xa9, 0xf0, 0x6e, 0x2e, 0x04,
+	0xfa, 0x4d, 0x82, 0x37, 0xc7, 0xf7, 0x17, 0xba, 0x3f, 0x5d, 0xbf, 0x09, 0x3b, 0xaf, 0x79, 0xe1,
+	0xb9, 0x56, 0xb6, 0xcf, 0x8c, 0xf2, 0xed, 0x7f, 0xf7, 0xfb, 0x5f, 0x3f, 0xca, 0x1d, 0x74, 0x37,
+	0xfd, 0xd1, 0x78, 0x56, 0xf2, 0xac, 0x8b, 0x65, 0xc7, 0xb5, 0xb6, 0x56, 0xda, 0x01, 0x5c, 0x6b,
+	0x3f, 0x47, 0xff, 0x4a, 0x30, 0x5f, 0x35, 0xf0, 0x68, 0xfd, 0x52, 0xf3, 0x28, 0xc6, 0xa3, 0xf9,
+	0xe0, 0xb2, 0xe9, 0xb9, 0xa0, 0xca, 0x67, 0x67, 0xc6, 0xad, 0x91, 0xf5, 0xfd, 0xde, 0x70, 0xa7,
+	0x66, 0x54, 0xef, 0x29, 0xdd, 0x94, 0xea, 0x90, 0xdb, 0xb3, 0x91, 0xe0, 0xf5, 0xf6, 0xf3, 0x31,
+	0xa6, 0x7a, 0x90, 0xd5, 0xd2, 0xa5, 0x36, 0xfa, 0x5b, 0x82, 0xf9, 0xaa, 0x25, 0xfa, 0x32, 0x84,
+	0xcf, 0x59, 0xbe, 0xcd, 0x3b, 0x22, 0x7d, 0xe4, 0x47, 0x53, 0x1d, 0x2c, 0x55, 0x85, 0x9e, 0x1a,
+	0x0b, 0x70, 0x73, 0x7c, 0x87, 0x6e, 0x04, 0x51, 0x7c, 0x7c, 0x66, 0x8c, 0xad, 0xed, 0x8c, 0xe1,
+	0x03, 0xe5, 0x7e, 0x26, 0x66, 0xd9, 0x75, 0xbe, 0x9a, 0x7a, 0x94, 0x37, 0x98, 0xf2, 0xfc, 0x5e,
+	0x86, 0xa5, 0xf3, 0x9e, 0x0e, 0xda, 0x98, 0xce, 0xf7, 0x25, 0xf6, 0x40, 0x73, 0xf3, 0x55, 0x61,
+	0x0a, 0xc1, 0x3f, 0xaf, 0x1c, 0xe9, 0x1e, 0x7a, 0x78, 0xd1, 0x91, 0xd6, 0x7d, 0x8f, 0x8f, 0x56,
+	0x68, 0x2e, 0x9e, 0x1a, 0x8d, 0x61, 0x63, 0xc5, 0x29, 0xf2, 0xb8, 0x6a, 0xd3, 0xa0, 0xf7, 0xad,
+	0x0c, 0x2b, 0x36, 0x0d, 0xa6, 0x92, 0xe8, 0xdd, 0xae, 0x5a, 0x05, 0x3b, 0xa9, 0x90, 0x3b, 0xd2,
+	0x17, 0xdb, 0x45, 0xba, 0x4b, 0x7d, 0x1c, 0xba, 0x2a, 0x65, 0xae, 0xe6, 0x92, 0x30, 0x93, 0x59,
+	0x1b, 0x16, 0x9c, 0xfc, 0x07, 0x72, 0x4d, 0x1c, 0x7e, 0x96, 0x67, 0xb6, 0x0c, 0xe3, 0x17, 0xb9,
+	0xb5, 0x95, 0x03, 0x1a, 0x0e, 0x57, 0xf3, 0x63, 0x7a, 0xda, 0xeb, 0xaa, 0x45, 0x61, 0x7e, 0x2a,
+	0x42, 0xf6, 0x0d, 0x87, 0xef, 0x0f, 0x42, 0xf6, 0xf7, 0xba, 0xfb, 0x22, 0xe4, 0x1f, 0x79, 0x25,
+	0xb7, 0xeb, 0xba, 0xe1, 0x70, 0x5d, 0x1f, 0x04, 0xe9, 0xfa, 0x5e, 0x57, 0xd7, 0x45, 0xd8, 0xc1,
+	0x6c, 0xd6, 0x67, 0xf7, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xff, 0x50, 0xf2, 0xe7, 0x0a,
+	0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignDraftServiceClient is the client API for CampaignDraftService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignDraftServiceClient interface {
+	// Returns the requested campaign draft in full detail.
+	GetCampaignDraft(ctx context.Context, in *GetCampaignDraftRequest, opts ...grpc.CallOption) (*resources.CampaignDraft, error)
+	// Creates, updates, or removes campaign drafts. Operation statuses are
+	// returned.
+	MutateCampaignDrafts(ctx context.Context, in *MutateCampaignDraftsRequest, opts ...grpc.CallOption) (*MutateCampaignDraftsResponse, error)
+	// Promotes the changes in a draft back to the base campaign.
+	//
+	// This method returns a Long Running Operation (LRO) indicating if the
+	// Promote is done. Use [Operations.GetOperation] to poll the LRO until it
+	// is done. Only a done status is returned in the response. See the status
+	// in the Campaign Draft resource to determine if the promotion was
+	// successful. If the LRO failed, use
+	// [CampaignDraftService.ListCampaignDraftAsyncErrors][google.ads.googleads.v3.services.CampaignDraftService.ListCampaignDraftAsyncErrors] to view the list of
+	// error reasons.
+	PromoteCampaignDraft(ctx context.Context, in *PromoteCampaignDraftRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
+	// Returns all errors that occurred during CampaignDraft promote. Throws an
+	// error if called before campaign draft is promoted.
+	// Supports standard list paging.
+	ListCampaignDraftAsyncErrors(ctx context.Context, in *ListCampaignDraftAsyncErrorsRequest, opts ...grpc.CallOption) (*ListCampaignDraftAsyncErrorsResponse, error)
+}
+
+type campaignDraftServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignDraftServiceClient(cc grpc.ClientConnInterface) CampaignDraftServiceClient {
+	return &campaignDraftServiceClient{cc}
+}
+
+func (c *campaignDraftServiceClient) GetCampaignDraft(ctx context.Context, in *GetCampaignDraftRequest, opts ...grpc.CallOption) (*resources.CampaignDraft, error) {
+	out := new(resources.CampaignDraft)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignDraftService/GetCampaignDraft", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignDraftServiceClient) MutateCampaignDrafts(ctx context.Context, in *MutateCampaignDraftsRequest, opts ...grpc.CallOption) (*MutateCampaignDraftsResponse, error) {
+	out := new(MutateCampaignDraftsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignDraftService/MutateCampaignDrafts", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignDraftServiceClient) PromoteCampaignDraft(ctx context.Context, in *PromoteCampaignDraftRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
+	out := new(longrunning.Operation)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignDraftService/PromoteCampaignDraft", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignDraftServiceClient) ListCampaignDraftAsyncErrors(ctx context.Context, in *ListCampaignDraftAsyncErrorsRequest, opts ...grpc.CallOption) (*ListCampaignDraftAsyncErrorsResponse, error) {
+	out := new(ListCampaignDraftAsyncErrorsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignDraftService/ListCampaignDraftAsyncErrors", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignDraftServiceServer is the server API for CampaignDraftService service.
+type CampaignDraftServiceServer interface {
+	// Returns the requested campaign draft in full detail.
+	GetCampaignDraft(context.Context, *GetCampaignDraftRequest) (*resources.CampaignDraft, error)
+	// Creates, updates, or removes campaign drafts. Operation statuses are
+	// returned.
+	MutateCampaignDrafts(context.Context, *MutateCampaignDraftsRequest) (*MutateCampaignDraftsResponse, error)
+	// Promotes the changes in a draft back to the base campaign.
+	//
+	// This method returns a Long Running Operation (LRO) indicating if the
+	// Promote is done. Use [Operations.GetOperation] to poll the LRO until it
+	// is done. Only a done status is returned in the response. See the status
+	// in the Campaign Draft resource to determine if the promotion was
+	// successful. If the LRO failed, use
+	// [CampaignDraftService.ListCampaignDraftAsyncErrors][google.ads.googleads.v3.services.CampaignDraftService.ListCampaignDraftAsyncErrors] to view the list of
+	// error reasons.
+	PromoteCampaignDraft(context.Context, *PromoteCampaignDraftRequest) (*longrunning.Operation, error)
+	// Returns all errors that occurred during CampaignDraft promote. Throws an
+	// error if called before campaign draft is promoted.
+	// Supports standard list paging.
+	ListCampaignDraftAsyncErrors(context.Context, *ListCampaignDraftAsyncErrorsRequest) (*ListCampaignDraftAsyncErrorsResponse, error)
+}
+
+// UnimplementedCampaignDraftServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignDraftServiceServer struct {
+}
+
+func (*UnimplementedCampaignDraftServiceServer) GetCampaignDraft(ctx context.Context, req *GetCampaignDraftRequest) (*resources.CampaignDraft, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaignDraft not implemented")
+}
+func (*UnimplementedCampaignDraftServiceServer) MutateCampaignDrafts(ctx context.Context, req *MutateCampaignDraftsRequest) (*MutateCampaignDraftsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaignDrafts not implemented")
+}
+func (*UnimplementedCampaignDraftServiceServer) PromoteCampaignDraft(ctx context.Context, req *PromoteCampaignDraftRequest) (*longrunning.Operation, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method PromoteCampaignDraft not implemented")
+}
+func (*UnimplementedCampaignDraftServiceServer) ListCampaignDraftAsyncErrors(ctx context.Context, req *ListCampaignDraftAsyncErrorsRequest) (*ListCampaignDraftAsyncErrorsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method ListCampaignDraftAsyncErrors not implemented")
+}
+
+func RegisterCampaignDraftServiceServer(s *grpc.Server, srv CampaignDraftServiceServer) {
+	s.RegisterService(&_CampaignDraftService_serviceDesc, srv)
+}
+
+func _CampaignDraftService_GetCampaignDraft_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignDraftRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignDraftServiceServer).GetCampaignDraft(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignDraftService/GetCampaignDraft",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignDraftServiceServer).GetCampaignDraft(ctx, req.(*GetCampaignDraftRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignDraftService_MutateCampaignDrafts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignDraftsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignDraftServiceServer).MutateCampaignDrafts(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignDraftService/MutateCampaignDrafts",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignDraftServiceServer).MutateCampaignDrafts(ctx, req.(*MutateCampaignDraftsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignDraftService_PromoteCampaignDraft_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(PromoteCampaignDraftRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignDraftServiceServer).PromoteCampaignDraft(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignDraftService/PromoteCampaignDraft",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignDraftServiceServer).PromoteCampaignDraft(ctx, req.(*PromoteCampaignDraftRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignDraftService_ListCampaignDraftAsyncErrors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListCampaignDraftAsyncErrorsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignDraftServiceServer).ListCampaignDraftAsyncErrors(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignDraftService/ListCampaignDraftAsyncErrors",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignDraftServiceServer).ListCampaignDraftAsyncErrors(ctx, req.(*ListCampaignDraftAsyncErrorsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignDraftService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignDraftService",
+	HandlerType: (*CampaignDraftServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignDraft",
+			Handler:    _CampaignDraftService_GetCampaignDraft_Handler,
+		},
+		{
+			MethodName: "MutateCampaignDrafts",
+			Handler:    _CampaignDraftService_MutateCampaignDrafts_Handler,
+		},
+		{
+			MethodName: "PromoteCampaignDraft",
+			Handler:    _CampaignDraftService_PromoteCampaignDraft_Handler,
+		},
+		{
+			MethodName: "ListCampaignDraftAsyncErrors",
+			Handler:    _CampaignDraftService_ListCampaignDraftAsyncErrors_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_draft_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_experiment_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_experiment_service.pb.go
new file mode 100644
index 0000000..7022d12
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_experiment_service.pb.go
@@ -0,0 +1,1181 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_experiment_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	empty "github.com/golang/protobuf/ptypes/empty"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	longrunning "google.golang.org/genproto/googleapis/longrunning"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignExperimentService.GetCampaignExperiment][google.ads.googleads.v3.services.CampaignExperimentService.GetCampaignExperiment].
+type GetCampaignExperimentRequest struct {
+	// Required. The resource name of the campaign experiment to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignExperimentRequest) Reset()         { *m = GetCampaignExperimentRequest{} }
+func (m *GetCampaignExperimentRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignExperimentRequest) ProtoMessage()    {}
+func (*GetCampaignExperimentRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{0}
+}
+
+func (m *GetCampaignExperimentRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignExperimentRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignExperimentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignExperimentRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignExperimentRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignExperimentRequest.Merge(m, src)
+}
+func (m *GetCampaignExperimentRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignExperimentRequest.Size(m)
+}
+func (m *GetCampaignExperimentRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignExperimentRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignExperimentRequest proto.InternalMessageInfo
+
+func (m *GetCampaignExperimentRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignExperimentService.MutateCampaignExperiments][google.ads.googleads.v3.services.CampaignExperimentService.MutateCampaignExperiments].
+type MutateCampaignExperimentsRequest struct {
+	// Required. The ID of the customer whose campaign experiments are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual campaign experiments.
+	Operations []*CampaignExperimentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignExperimentsRequest) Reset()         { *m = MutateCampaignExperimentsRequest{} }
+func (m *MutateCampaignExperimentsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignExperimentsRequest) ProtoMessage()    {}
+func (*MutateCampaignExperimentsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{1}
+}
+
+func (m *MutateCampaignExperimentsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignExperimentsRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignExperimentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignExperimentsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignExperimentsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignExperimentsRequest.Merge(m, src)
+}
+func (m *MutateCampaignExperimentsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignExperimentsRequest.Size(m)
+}
+func (m *MutateCampaignExperimentsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignExperimentsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignExperimentsRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignExperimentsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignExperimentsRequest) GetOperations() []*CampaignExperimentOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignExperimentsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignExperimentsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single update operation on a campaign experiment.
+type CampaignExperimentOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignExperimentOperation_Update
+	//	*CampaignExperimentOperation_Remove
+	Operation            isCampaignExperimentOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *CampaignExperimentOperation) Reset()         { *m = CampaignExperimentOperation{} }
+func (m *CampaignExperimentOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignExperimentOperation) ProtoMessage()    {}
+func (*CampaignExperimentOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{2}
+}
+
+func (m *CampaignExperimentOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignExperimentOperation.Unmarshal(m, b)
+}
+func (m *CampaignExperimentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignExperimentOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignExperimentOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignExperimentOperation.Merge(m, src)
+}
+func (m *CampaignExperimentOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignExperimentOperation.Size(m)
+}
+func (m *CampaignExperimentOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignExperimentOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignExperimentOperation proto.InternalMessageInfo
+
+func (m *CampaignExperimentOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCampaignExperimentOperation_Operation interface {
+	isCampaignExperimentOperation_Operation()
+}
+
+type CampaignExperimentOperation_Update struct {
+	Update *resources.CampaignExperiment `protobuf:"bytes,1,opt,name=update,proto3,oneof"`
+}
+
+type CampaignExperimentOperation_Remove struct {
+	Remove string `protobuf:"bytes,2,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignExperimentOperation_Update) isCampaignExperimentOperation_Operation() {}
+
+func (*CampaignExperimentOperation_Remove) isCampaignExperimentOperation_Operation() {}
+
+func (m *CampaignExperimentOperation) GetOperation() isCampaignExperimentOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignExperimentOperation) GetUpdate() *resources.CampaignExperiment {
+	if x, ok := m.GetOperation().(*CampaignExperimentOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CampaignExperimentOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignExperimentOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignExperimentOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignExperimentOperation_Update)(nil),
+		(*CampaignExperimentOperation_Remove)(nil),
+	}
+}
+
+// Response message for campaign experiment mutate.
+type MutateCampaignExperimentsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignExperimentResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *MutateCampaignExperimentsResponse) Reset()         { *m = MutateCampaignExperimentsResponse{} }
+func (m *MutateCampaignExperimentsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignExperimentsResponse) ProtoMessage()    {}
+func (*MutateCampaignExperimentsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{3}
+}
+
+func (m *MutateCampaignExperimentsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignExperimentsResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignExperimentsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignExperimentsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignExperimentsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignExperimentsResponse.Merge(m, src)
+}
+func (m *MutateCampaignExperimentsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignExperimentsResponse.Size(m)
+}
+func (m *MutateCampaignExperimentsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignExperimentsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignExperimentsResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignExperimentsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignExperimentsResponse) GetResults() []*MutateCampaignExperimentResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the campaign experiment mutate.
+type MutateCampaignExperimentResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignExperimentResult) Reset()         { *m = MutateCampaignExperimentResult{} }
+func (m *MutateCampaignExperimentResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignExperimentResult) ProtoMessage()    {}
+func (*MutateCampaignExperimentResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{4}
+}
+
+func (m *MutateCampaignExperimentResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignExperimentResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignExperimentResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignExperimentResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignExperimentResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignExperimentResult.Merge(m, src)
+}
+func (m *MutateCampaignExperimentResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignExperimentResult.Size(m)
+}
+func (m *MutateCampaignExperimentResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignExperimentResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignExperimentResult proto.InternalMessageInfo
+
+func (m *MutateCampaignExperimentResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignExperimentService.CreateCampaignExperiment][google.ads.googleads.v3.services.CampaignExperimentService.CreateCampaignExperiment].
+type CreateCampaignExperimentRequest struct {
+	// Required. The ID of the customer whose campaign experiment is being created.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The campaign experiment to be created.
+	CampaignExperiment *resources.CampaignExperiment `protobuf:"bytes,2,opt,name=campaign_experiment,json=campaignExperiment,proto3" json:"campaign_experiment,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,3,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CreateCampaignExperimentRequest) Reset()         { *m = CreateCampaignExperimentRequest{} }
+func (m *CreateCampaignExperimentRequest) String() string { return proto.CompactTextString(m) }
+func (*CreateCampaignExperimentRequest) ProtoMessage()    {}
+func (*CreateCampaignExperimentRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{5}
+}
+
+func (m *CreateCampaignExperimentRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateCampaignExperimentRequest.Unmarshal(m, b)
+}
+func (m *CreateCampaignExperimentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateCampaignExperimentRequest.Marshal(b, m, deterministic)
+}
+func (m *CreateCampaignExperimentRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateCampaignExperimentRequest.Merge(m, src)
+}
+func (m *CreateCampaignExperimentRequest) XXX_Size() int {
+	return xxx_messageInfo_CreateCampaignExperimentRequest.Size(m)
+}
+func (m *CreateCampaignExperimentRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateCampaignExperimentRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateCampaignExperimentRequest proto.InternalMessageInfo
+
+func (m *CreateCampaignExperimentRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *CreateCampaignExperimentRequest) GetCampaignExperiment() *resources.CampaignExperiment {
+	if m != nil {
+		return m.CampaignExperiment
+	}
+	return nil
+}
+
+func (m *CreateCampaignExperimentRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// Message used as metadata returned in Long Running Operations for
+// CreateCampaignExperimentRequest
+type CreateCampaignExperimentMetadata struct {
+	// Resource name of campaign experiment created.
+	CampaignExperiment   string   `protobuf:"bytes,1,opt,name=campaign_experiment,json=campaignExperiment,proto3" json:"campaign_experiment,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CreateCampaignExperimentMetadata) Reset()         { *m = CreateCampaignExperimentMetadata{} }
+func (m *CreateCampaignExperimentMetadata) String() string { return proto.CompactTextString(m) }
+func (*CreateCampaignExperimentMetadata) ProtoMessage()    {}
+func (*CreateCampaignExperimentMetadata) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{6}
+}
+
+func (m *CreateCampaignExperimentMetadata) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateCampaignExperimentMetadata.Unmarshal(m, b)
+}
+func (m *CreateCampaignExperimentMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateCampaignExperimentMetadata.Marshal(b, m, deterministic)
+}
+func (m *CreateCampaignExperimentMetadata) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateCampaignExperimentMetadata.Merge(m, src)
+}
+func (m *CreateCampaignExperimentMetadata) XXX_Size() int {
+	return xxx_messageInfo_CreateCampaignExperimentMetadata.Size(m)
+}
+func (m *CreateCampaignExperimentMetadata) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateCampaignExperimentMetadata.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateCampaignExperimentMetadata proto.InternalMessageInfo
+
+func (m *CreateCampaignExperimentMetadata) GetCampaignExperiment() string {
+	if m != nil {
+		return m.CampaignExperiment
+	}
+	return ""
+}
+
+// Request message for [CampaignExperimentService.GraduateCampaignExperiment][google.ads.googleads.v3.services.CampaignExperimentService.GraduateCampaignExperiment].
+type GraduateCampaignExperimentRequest struct {
+	// Required. The resource name of the campaign experiment to graduate.
+	CampaignExperiment string `protobuf:"bytes,1,opt,name=campaign_experiment,json=campaignExperiment,proto3" json:"campaign_experiment,omitempty"`
+	// Required. Resource name of the budget to attach to the campaign graduated from the
+	// experiment.
+	CampaignBudget       string   `protobuf:"bytes,2,opt,name=campaign_budget,json=campaignBudget,proto3" json:"campaign_budget,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GraduateCampaignExperimentRequest) Reset()         { *m = GraduateCampaignExperimentRequest{} }
+func (m *GraduateCampaignExperimentRequest) String() string { return proto.CompactTextString(m) }
+func (*GraduateCampaignExperimentRequest) ProtoMessage()    {}
+func (*GraduateCampaignExperimentRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{7}
+}
+
+func (m *GraduateCampaignExperimentRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GraduateCampaignExperimentRequest.Unmarshal(m, b)
+}
+func (m *GraduateCampaignExperimentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GraduateCampaignExperimentRequest.Marshal(b, m, deterministic)
+}
+func (m *GraduateCampaignExperimentRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GraduateCampaignExperimentRequest.Merge(m, src)
+}
+func (m *GraduateCampaignExperimentRequest) XXX_Size() int {
+	return xxx_messageInfo_GraduateCampaignExperimentRequest.Size(m)
+}
+func (m *GraduateCampaignExperimentRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GraduateCampaignExperimentRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GraduateCampaignExperimentRequest proto.InternalMessageInfo
+
+func (m *GraduateCampaignExperimentRequest) GetCampaignExperiment() string {
+	if m != nil {
+		return m.CampaignExperiment
+	}
+	return ""
+}
+
+func (m *GraduateCampaignExperimentRequest) GetCampaignBudget() string {
+	if m != nil {
+		return m.CampaignBudget
+	}
+	return ""
+}
+
+// Response message for campaign experiment graduate.
+type GraduateCampaignExperimentResponse struct {
+	// The resource name of the campaign from the graduated experiment.
+	// This campaign is the same one as CampaignExperiment.experiment_campaign.
+	GraduatedCampaign    string   `protobuf:"bytes,1,opt,name=graduated_campaign,json=graduatedCampaign,proto3" json:"graduated_campaign,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GraduateCampaignExperimentResponse) Reset()         { *m = GraduateCampaignExperimentResponse{} }
+func (m *GraduateCampaignExperimentResponse) String() string { return proto.CompactTextString(m) }
+func (*GraduateCampaignExperimentResponse) ProtoMessage()    {}
+func (*GraduateCampaignExperimentResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{8}
+}
+
+func (m *GraduateCampaignExperimentResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GraduateCampaignExperimentResponse.Unmarshal(m, b)
+}
+func (m *GraduateCampaignExperimentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GraduateCampaignExperimentResponse.Marshal(b, m, deterministic)
+}
+func (m *GraduateCampaignExperimentResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GraduateCampaignExperimentResponse.Merge(m, src)
+}
+func (m *GraduateCampaignExperimentResponse) XXX_Size() int {
+	return xxx_messageInfo_GraduateCampaignExperimentResponse.Size(m)
+}
+func (m *GraduateCampaignExperimentResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GraduateCampaignExperimentResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GraduateCampaignExperimentResponse proto.InternalMessageInfo
+
+func (m *GraduateCampaignExperimentResponse) GetGraduatedCampaign() string {
+	if m != nil {
+		return m.GraduatedCampaign
+	}
+	return ""
+}
+
+// Request message for [CampaignExperimentService.PromoteCampaignExperiment][google.ads.googleads.v3.services.CampaignExperimentService.PromoteCampaignExperiment].
+type PromoteCampaignExperimentRequest struct {
+	// Required. The resource name of the campaign experiment to promote.
+	CampaignExperiment   string   `protobuf:"bytes,1,opt,name=campaign_experiment,json=campaignExperiment,proto3" json:"campaign_experiment,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PromoteCampaignExperimentRequest) Reset()         { *m = PromoteCampaignExperimentRequest{} }
+func (m *PromoteCampaignExperimentRequest) String() string { return proto.CompactTextString(m) }
+func (*PromoteCampaignExperimentRequest) ProtoMessage()    {}
+func (*PromoteCampaignExperimentRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{9}
+}
+
+func (m *PromoteCampaignExperimentRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PromoteCampaignExperimentRequest.Unmarshal(m, b)
+}
+func (m *PromoteCampaignExperimentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PromoteCampaignExperimentRequest.Marshal(b, m, deterministic)
+}
+func (m *PromoteCampaignExperimentRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PromoteCampaignExperimentRequest.Merge(m, src)
+}
+func (m *PromoteCampaignExperimentRequest) XXX_Size() int {
+	return xxx_messageInfo_PromoteCampaignExperimentRequest.Size(m)
+}
+func (m *PromoteCampaignExperimentRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_PromoteCampaignExperimentRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PromoteCampaignExperimentRequest proto.InternalMessageInfo
+
+func (m *PromoteCampaignExperimentRequest) GetCampaignExperiment() string {
+	if m != nil {
+		return m.CampaignExperiment
+	}
+	return ""
+}
+
+// Request message for [CampaignExperimentService.EndCampaignExperiment][google.ads.googleads.v3.services.CampaignExperimentService.EndCampaignExperiment].
+type EndCampaignExperimentRequest struct {
+	// Required. The resource name of the campaign experiment to end.
+	CampaignExperiment   string   `protobuf:"bytes,1,opt,name=campaign_experiment,json=campaignExperiment,proto3" json:"campaign_experiment,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EndCampaignExperimentRequest) Reset()         { *m = EndCampaignExperimentRequest{} }
+func (m *EndCampaignExperimentRequest) String() string { return proto.CompactTextString(m) }
+func (*EndCampaignExperimentRequest) ProtoMessage()    {}
+func (*EndCampaignExperimentRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{10}
+}
+
+func (m *EndCampaignExperimentRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EndCampaignExperimentRequest.Unmarshal(m, b)
+}
+func (m *EndCampaignExperimentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EndCampaignExperimentRequest.Marshal(b, m, deterministic)
+}
+func (m *EndCampaignExperimentRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EndCampaignExperimentRequest.Merge(m, src)
+}
+func (m *EndCampaignExperimentRequest) XXX_Size() int {
+	return xxx_messageInfo_EndCampaignExperimentRequest.Size(m)
+}
+func (m *EndCampaignExperimentRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_EndCampaignExperimentRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EndCampaignExperimentRequest proto.InternalMessageInfo
+
+func (m *EndCampaignExperimentRequest) GetCampaignExperiment() string {
+	if m != nil {
+		return m.CampaignExperiment
+	}
+	return ""
+}
+
+// Request message for
+// [CampaignExperimentService.ListCampaignExperimentAsyncErrors][google.ads.googleads.v3.services.CampaignExperimentService.ListCampaignExperimentAsyncErrors].
+type ListCampaignExperimentAsyncErrorsRequest struct {
+	// Required. The name of the campaign experiment from which to retrieve the async
+	// errors.
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Token of the page to retrieve. If not specified, the first
+	// page of results will be returned. Use the value obtained from
+	// `next_page_token` in the previous response in order to request
+	// the next page of results.
+	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// Number of elements to retrieve in a single page.
+	// When a page request is too large, the server may decide to
+	// further limit the number of returned resources.
+	PageSize             int32    `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListCampaignExperimentAsyncErrorsRequest) Reset() {
+	*m = ListCampaignExperimentAsyncErrorsRequest{}
+}
+func (m *ListCampaignExperimentAsyncErrorsRequest) String() string { return proto.CompactTextString(m) }
+func (*ListCampaignExperimentAsyncErrorsRequest) ProtoMessage()    {}
+func (*ListCampaignExperimentAsyncErrorsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{11}
+}
+
+func (m *ListCampaignExperimentAsyncErrorsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListCampaignExperimentAsyncErrorsRequest.Unmarshal(m, b)
+}
+func (m *ListCampaignExperimentAsyncErrorsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListCampaignExperimentAsyncErrorsRequest.Marshal(b, m, deterministic)
+}
+func (m *ListCampaignExperimentAsyncErrorsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListCampaignExperimentAsyncErrorsRequest.Merge(m, src)
+}
+func (m *ListCampaignExperimentAsyncErrorsRequest) XXX_Size() int {
+	return xxx_messageInfo_ListCampaignExperimentAsyncErrorsRequest.Size(m)
+}
+func (m *ListCampaignExperimentAsyncErrorsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListCampaignExperimentAsyncErrorsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListCampaignExperimentAsyncErrorsRequest proto.InternalMessageInfo
+
+func (m *ListCampaignExperimentAsyncErrorsRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *ListCampaignExperimentAsyncErrorsRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *ListCampaignExperimentAsyncErrorsRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+// Response message for
+// [CampaignExperimentService.ListCampaignExperimentAsyncErrors][google.ads.googleads.v3.services.CampaignExperimentService.ListCampaignExperimentAsyncErrors].
+type ListCampaignExperimentAsyncErrorsResponse struct {
+	// Details of the errors when performing the asynchronous operation.
+	Errors []*status.Status `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"`
+	// Pagination token used to retrieve the next page of results.
+	// Pass the content of this string as the `page_token` attribute of
+	// the next request. `next_page_token` is not returned for the last
+	// page.
+	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListCampaignExperimentAsyncErrorsResponse) Reset() {
+	*m = ListCampaignExperimentAsyncErrorsResponse{}
+}
+func (m *ListCampaignExperimentAsyncErrorsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListCampaignExperimentAsyncErrorsResponse) ProtoMessage()    {}
+func (*ListCampaignExperimentAsyncErrorsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_28da8316d8332ea0, []int{12}
+}
+
+func (m *ListCampaignExperimentAsyncErrorsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListCampaignExperimentAsyncErrorsResponse.Unmarshal(m, b)
+}
+func (m *ListCampaignExperimentAsyncErrorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListCampaignExperimentAsyncErrorsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListCampaignExperimentAsyncErrorsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListCampaignExperimentAsyncErrorsResponse.Merge(m, src)
+}
+func (m *ListCampaignExperimentAsyncErrorsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListCampaignExperimentAsyncErrorsResponse.Size(m)
+}
+func (m *ListCampaignExperimentAsyncErrorsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListCampaignExperimentAsyncErrorsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListCampaignExperimentAsyncErrorsResponse proto.InternalMessageInfo
+
+func (m *ListCampaignExperimentAsyncErrorsResponse) GetErrors() []*status.Status {
+	if m != nil {
+		return m.Errors
+	}
+	return nil
+}
+
+func (m *ListCampaignExperimentAsyncErrorsResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignExperimentRequest)(nil), "google.ads.googleads.v3.services.GetCampaignExperimentRequest")
+	proto.RegisterType((*MutateCampaignExperimentsRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignExperimentsRequest")
+	proto.RegisterType((*CampaignExperimentOperation)(nil), "google.ads.googleads.v3.services.CampaignExperimentOperation")
+	proto.RegisterType((*MutateCampaignExperimentsResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignExperimentsResponse")
+	proto.RegisterType((*MutateCampaignExperimentResult)(nil), "google.ads.googleads.v3.services.MutateCampaignExperimentResult")
+	proto.RegisterType((*CreateCampaignExperimentRequest)(nil), "google.ads.googleads.v3.services.CreateCampaignExperimentRequest")
+	proto.RegisterType((*CreateCampaignExperimentMetadata)(nil), "google.ads.googleads.v3.services.CreateCampaignExperimentMetadata")
+	proto.RegisterType((*GraduateCampaignExperimentRequest)(nil), "google.ads.googleads.v3.services.GraduateCampaignExperimentRequest")
+	proto.RegisterType((*GraduateCampaignExperimentResponse)(nil), "google.ads.googleads.v3.services.GraduateCampaignExperimentResponse")
+	proto.RegisterType((*PromoteCampaignExperimentRequest)(nil), "google.ads.googleads.v3.services.PromoteCampaignExperimentRequest")
+	proto.RegisterType((*EndCampaignExperimentRequest)(nil), "google.ads.googleads.v3.services.EndCampaignExperimentRequest")
+	proto.RegisterType((*ListCampaignExperimentAsyncErrorsRequest)(nil), "google.ads.googleads.v3.services.ListCampaignExperimentAsyncErrorsRequest")
+	proto.RegisterType((*ListCampaignExperimentAsyncErrorsResponse)(nil), "google.ads.googleads.v3.services.ListCampaignExperimentAsyncErrorsResponse")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_experiment_service.proto", fileDescriptor_28da8316d8332ea0)
+}
+
+var fileDescriptor_28da8316d8332ea0 = []byte{
+	// 1224 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xdd, 0x4f, 0x23, 0x55,
+	0x14, 0x77, 0x06, 0xc5, 0xe5, 0x74, 0x81, 0x78, 0x09, 0xbb, 0xa5, 0xb0, 0x4b, 0x19, 0x88, 0x22,
+	0xc1, 0x99, 0x84, 0xba, 0xd1, 0x0c, 0x41, 0x9d, 0x42, 0x81, 0x55, 0x11, 0x52, 0x36, 0xc4, 0x10,
+	0xcc, 0x78, 0xe9, 0x5c, 0xc6, 0x09, 0xf3, 0xe5, 0xdc, 0x99, 0x66, 0xd9, 0xcd, 0x6a, 0xb2, 0x89,
+	0xf1, 0xd5, 0xc4, 0x47, 0x13, 0x1f, 0x7c, 0xf4, 0xbf, 0xd0, 0x17, 0x13, 0xde, 0xd4, 0x27, 0x49,
+	0x4c, 0x7c, 0xf0, 0xc9, 0x77, 0x5f, 0x7c, 0x30, 0x9b, 0xf9, 0xb8, 0x6d, 0x69, 0x67, 0xda, 0x6e,
+	0xe1, 0xed, 0xf6, 0x9e, 0x73, 0x7f, 0xe7, 0x9c, 0xdf, 0xf9, 0x9a, 0x14, 0xca, 0xba, 0xe3, 0xe8,
+	0x26, 0x91, 0xb0, 0x46, 0xa5, 0xf8, 0x18, 0x9e, 0xea, 0x25, 0x89, 0x12, 0xaf, 0x6e, 0xd4, 0x08,
+	0x95, 0x6a, 0xd8, 0x72, 0xb1, 0xa1, 0xdb, 0x2a, 0x79, 0xe8, 0x12, 0xcf, 0xb0, 0x88, 0xed, 0xab,
+	0x89, 0x50, 0x74, 0x3d, 0xc7, 0x77, 0x50, 0x31, 0x7e, 0x28, 0x62, 0x8d, 0x8a, 0x0d, 0x0c, 0xb1,
+	0x5e, 0x12, 0x19, 0x46, 0x61, 0x35, 0xcb, 0x8a, 0x47, 0xa8, 0x13, 0x78, 0x19, 0x66, 0x62, 0xf8,
+	0xc2, 0x0c, 0x7b, 0xec, 0x1a, 0x12, 0xb6, 0x6d, 0xc7, 0xc7, 0xbe, 0xe1, 0xd8, 0x34, 0x91, 0xde,
+	0x6e, 0x91, 0xd6, 0x4c, 0xa3, 0xf9, 0x6c, 0xb6, 0x45, 0x70, 0x62, 0x10, 0x53, 0x53, 0x8f, 0xc9,
+	0x67, 0xb8, 0x6e, 0x38, 0x5e, 0xa2, 0x30, 0x9f, 0x28, 0x98, 0x8e, 0xad, 0x7b, 0x81, 0x6d, 0x1b,
+	0xb6, 0x2e, 0x39, 0x2e, 0xf1, 0x2e, 0xc1, 0x4f, 0x27, 0x4a, 0xd1, 0xaf, 0xe3, 0xe0, 0x44, 0x22,
+	0x96, 0xeb, 0x9f, 0x25, 0xc2, 0x62, 0xbb, 0x30, 0xb6, 0x63, 0x61, 0x7a, 0xda, 0xe6, 0x9d, 0xe7,
+	0xd6, 0x24, 0xea, 0x63, 0x3f, 0x48, 0x70, 0x85, 0x6d, 0x98, 0xd9, 0x22, 0xfe, 0x7a, 0x12, 0x74,
+	0xa5, 0x11, 0x73, 0x95, 0x7c, 0x1e, 0x10, 0xea, 0xa3, 0x45, 0x18, 0x65, 0xdc, 0xa8, 0x36, 0xb6,
+	0x48, 0x9e, 0x2b, 0x72, 0x8b, 0x23, 0xe5, 0xa1, 0xbf, 0x14, 0xbe, 0x7a, 0x93, 0x49, 0x3e, 0xc2,
+	0x16, 0x11, 0xfe, 0xe3, 0xa0, 0xb8, 0x13, 0xf8, 0xd8, 0x27, 0x9d, 0x68, 0x94, 0xc1, 0x2d, 0x40,
+	0xae, 0x16, 0x50, 0xdf, 0xb1, 0x88, 0xa7, 0x1a, 0x5a, 0x2b, 0x18, 0xb0, 0xfb, 0xfb, 0x1a, 0x3a,
+	0x06, 0x68, 0x12, 0x90, 0xe7, 0x8b, 0x43, 0x8b, 0xb9, 0x95, 0x35, 0xb1, 0x57, 0x76, 0xc5, 0x4e,
+	0xbb, 0xbb, 0x0c, 0x25, 0xb1, 0xd1, 0x44, 0x45, 0xaf, 0xc1, 0xb8, 0x8b, 0x3d, 0xdf, 0xc0, 0xa6,
+	0x7a, 0x82, 0x0d, 0x33, 0xf0, 0x48, 0x7e, 0xa8, 0xc8, 0x2d, 0xde, 0xa8, 0x8e, 0x25, 0xd7, 0x9b,
+	0xf1, 0x2d, 0x9a, 0x87, 0xd1, 0x3a, 0x36, 0x0d, 0x0d, 0xfb, 0x44, 0x75, 0x6c, 0xf3, 0x2c, 0xff,
+	0x62, 0xa4, 0x76, 0x93, 0x5d, 0xee, 0xda, 0xe6, 0x99, 0xf0, 0x1b, 0x07, 0xd3, 0x5d, 0xcc, 0xa3,
+	0x55, 0xc8, 0x05, 0x6e, 0x04, 0x11, 0x26, 0x25, 0xb2, 0x94, 0x5b, 0x29, 0xb0, 0x90, 0x58, 0xde,
+	0xc4, 0xcd, 0x30, 0x6f, 0x3b, 0x98, 0x9e, 0x56, 0x21, 0x56, 0x0f, 0xcf, 0x68, 0x17, 0x86, 0xe3,
+	0x5f, 0x11, 0x5f, 0xb9, 0x95, 0x7b, 0x99, 0x54, 0x34, 0xca, 0x38, 0x85, 0x8b, 0xed, 0x17, 0xaa,
+	0x09, 0x0c, 0xca, 0xc3, 0xb0, 0x47, 0x2c, 0xa7, 0x4e, 0xf2, 0x7c, 0x98, 0x80, 0x50, 0x12, 0xff,
+	0x2e, 0xe7, 0x60, 0xa4, 0xc1, 0x91, 0xf0, 0x0b, 0x07, 0x73, 0x5d, 0x32, 0x4a, 0x5d, 0xc7, 0xa6,
+	0x04, 0x6d, 0xc2, 0x64, 0x1b, 0x91, 0x2a, 0xf1, 0x3c, 0xc7, 0x4b, 0x82, 0x44, 0xcc, 0x59, 0xcf,
+	0xad, 0x89, 0xfb, 0x51, 0xe9, 0x55, 0x27, 0x2e, 0x53, 0x5c, 0x09, 0xd5, 0xd1, 0x21, 0xbc, 0xec,
+	0x11, 0x1a, 0x98, 0x3e, 0xcb, 0xf8, 0x7b, 0xbd, 0x33, 0x9e, 0xe5, 0x5d, 0x35, 0x02, 0xaa, 0x32,
+	0x40, 0xa1, 0x02, 0x77, 0xbb, 0xab, 0x86, 0x59, 0x4e, 0xa9, 0xf3, 0xb6, 0x12, 0xff, 0x83, 0x83,
+	0xd9, 0x75, 0x8f, 0x64, 0xe0, 0x3c, 0x4f, 0x85, 0x9f, 0xc2, 0x44, 0xca, 0xa0, 0x89, 0xd2, 0x31,
+	0x68, 0x7e, 0x63, 0x23, 0xa8, 0xd6, 0x21, 0xe8, 0xac, 0xe0, 0xa1, 0x94, 0x0a, 0xde, 0x87, 0x62,
+	0x56, 0x68, 0x3b, 0xc4, 0xc7, 0x1a, 0xf6, 0x31, 0x92, 0xd2, 0xbd, 0x8e, 0xa9, 0x4a, 0xb1, 0x2c,
+	0x7c, 0xcd, 0xc1, 0xdc, 0x96, 0x87, 0xb5, 0xa0, 0x2b, 0x65, 0x6f, 0x76, 0x81, 0xcd, 0x8e, 0x6a,
+	0x19, 0xc6, 0x1b, 0xaf, 0x8e, 0x03, 0x4d, 0x27, 0x31, 0x7d, 0xc9, 0x8b, 0x31, 0x26, 0x2b, 0x47,
+	0x22, 0x61, 0x1f, 0x84, 0x6e, 0x8e, 0x24, 0xb5, 0xfc, 0x06, 0x20, 0x3d, 0xd1, 0xd2, 0x54, 0x86,
+	0x90, 0xc4, 0xf7, 0x4a, 0x43, 0xc2, 0x00, 0x84, 0x8f, 0xa1, 0xb8, 0xe7, 0x39, 0x96, 0x73, 0xed,
+	0xc1, 0x09, 0x0f, 0x60, 0xa6, 0x62, 0x6b, 0xd7, 0x8d, 0xfa, 0x0d, 0x07, 0x8b, 0x1f, 0x1a, 0x34,
+	0x65, 0xdc, 0x2b, 0xf4, 0xcc, 0xae, 0x45, 0x7d, 0x48, 0x9f, 0x7b, 0xf2, 0xa3, 0x3b, 0x00, 0x2e,
+	0xd6, 0x89, 0xea, 0x3b, 0xa7, 0xc4, 0x8e, 0x93, 0x50, 0x1d, 0x09, 0x6f, 0x1e, 0x84, 0x17, 0x68,
+	0x1a, 0xa2, 0x1f, 0x2a, 0x35, 0x1e, 0xc5, 0x33, 0xf6, 0xa5, 0xea, 0x8d, 0xf0, 0x62, 0xdf, 0x78,
+	0x44, 0x84, 0x2f, 0xe1, 0xf5, 0x3e, 0x3c, 0x4a, 0xd2, 0xb3, 0x04, 0xc3, 0xd1, 0x68, 0xa1, 0x79,
+	0x2e, 0x9a, 0x10, 0x69, 0xb3, 0x25, 0xd1, 0x40, 0xaf, 0xc2, 0xb8, 0x4d, 0x1e, 0xfa, 0x6a, 0x87,
+	0x67, 0xa3, 0xe1, 0xf5, 0x1e, 0xf3, 0x6e, 0xe5, 0xdf, 0x31, 0x98, 0xea, 0xb4, 0xbe, 0x1f, 0x4f,
+	0x18, 0xf4, 0x27, 0x07, 0x93, 0xa9, 0xfb, 0x11, 0xbd, 0xd3, 0x7b, 0x3a, 0x75, 0x5b, 0xac, 0x85,
+	0xc1, 0x9a, 0x5c, 0xd8, 0xb9, 0x50, 0x2e, 0xa7, 0xe5, 0xe9, 0xef, 0x7f, 0x7f, 0xcb, 0xbf, 0x85,
+	0xee, 0x85, 0x5f, 0x31, 0x8f, 0x2f, 0x49, 0xd6, 0xd8, 0xbc, 0xa1, 0xd2, 0x92, 0xd4, 0x59, 0x0d,
+	0x54, 0x5a, 0x7a, 0x82, 0x7e, 0xe2, 0x21, 0x9f, 0xd5, 0xf6, 0x48, 0xe9, 0x63, 0xe5, 0x76, 0x9f,
+	0x86, 0x85, 0x3b, 0x0c, 0xa2, 0xe5, 0xe3, 0x46, 0x6c, 0xac, 0x45, 0xe1, 0x67, 0xee, 0x5c, 0x39,
+	0x84, 0xc9, 0xf6, 0x35, 0x58, 0x09, 0xbf, 0x6d, 0x90, 0x32, 0xb0, 0x75, 0x36, 0xb0, 0x2e, 0x94,
+	0xd9, 0x96, 0x59, 0xbc, 0x9c, 0xd2, 0x31, 0x11, 0x7b, 0x6b, 0xc2, 0xdb, 0x21, 0x7b, 0x4d, 0xba,
+	0x1e, 0xb7, 0xbc, 0x5a, 0x5b, 0x7a, 0x92, 0x46, 0x9e, 0x5c, 0x8b, 0x6c, 0xcb, 0xdc, 0x12, 0x7a,
+	0xca, 0xc3, 0x54, 0xe6, 0x9a, 0x44, 0xe5, 0xc1, 0xb7, 0x18, 0x6b, 0xc5, 0xc2, 0xfa, 0x95, 0x30,
+	0xe2, 0xe6, 0x11, 0x8e, 0x2e, 0x94, 0x5b, 0xad, 0x6c, 0x34, 0xbf, 0x85, 0x06, 0x27, 0xc1, 0x8a,
+	0xac, 0x86, 0x24, 0x7c, 0xcf, 0x43, 0x21, 0x7b, 0xc0, 0xa2, 0x3e, 0x22, 0xe8, 0xb9, 0x27, 0x0a,
+	0x1b, 0x57, 0x03, 0x49, 0x78, 0x08, 0x2e, 0x94, 0xf9, 0x94, 0x4a, 0x58, 0x6e, 0x5b, 0x26, 0x11,
+	0x29, 0xf7, 0x85, 0x8d, 0xa8, 0xaf, 0x52, 0xf4, 0xfb, 0xe8, 0x2e, 0x99, 0x6d, 0x8c, 0x90, 0xa0,
+	0xff, 0x39, 0x98, 0xca, 0x5c, 0x16, 0xfd, 0x54, 0x49, 0xaf, 0x4d, 0xd3, 0xab, 0xd7, 0xbe, 0x38,
+	0x57, 0x6e, 0x67, 0xb4, 0xda, 0x85, 0x32, 0x91, 0xd5, 0x1b, 0xdb, 0xc2, 0xfa, 0x55, 0x18, 0x70,
+	0x63, 0xa7, 0x43, 0x02, 0x7e, 0xe5, 0x60, 0x32, 0x75, 0xa7, 0xf5, 0x33, 0x4a, 0xbb, 0x2d, 0xc3,
+	0xc2, 0x2d, 0x31, 0x35, 0x2a, 0xe1, 0xd3, 0x2e, 0x71, 0x6d, 0x08, 0xef, 0x5e, 0x25, 0x2e, 0x62,
+	0x6b, 0x61, 0x4c, 0xdf, 0xf1, 0x30, 0xd7, 0x73, 0x7d, 0xa1, 0xf7, 0x7b, 0xc7, 0xd7, 0xef, 0x56,
+	0x2e, 0x7c, 0x70, 0x2d, 0x58, 0x49, 0x2b, 0x7c, 0x92, 0xba, 0x4c, 0xb6, 0x50, 0x65, 0xa0, 0x65,
+	0x22, 0x9b, 0x06, 0x6d, 0x35, 0x53, 0x98, 0x3e, 0x57, 0xf2, 0x4d, 0x17, 0x93, 0x93, 0x6b, 0x50,
+	0xb1, 0xe6, 0x58, 0xe5, 0xaf, 0x78, 0x58, 0xa8, 0x39, 0x56, 0xcf, 0x70, 0xca, 0x77, 0x33, 0xb7,
+	0xf3, 0x5e, 0x98, 0xee, 0x3d, 0xee, 0x70, 0x3b, 0xc1, 0xd0, 0x1d, 0x13, 0xdb, 0xba, 0xe8, 0x78,
+	0xba, 0xa4, 0x13, 0x3b, 0x2a, 0x06, 0xa9, 0x69, 0x35, 0xfb, 0xaf, 0x85, 0x55, 0x76, 0xf8, 0x81,
+	0x1f, 0xda, 0x52, 0x94, 0x1f, 0xf9, 0xe2, 0x56, 0x0c, 0xa8, 0x68, 0x54, 0x8c, 0x8f, 0xe1, 0xe9,
+	0xa0, 0x24, 0x26, 0x86, 0xe9, 0x39, 0x53, 0x39, 0x52, 0x34, 0x7a, 0xd4, 0x50, 0x39, 0x3a, 0x28,
+	0x1d, 0x31, 0x95, 0x7f, 0xf8, 0x85, 0xf8, 0x5e, 0x96, 0x15, 0x8d, 0xca, 0x72, 0x43, 0x49, 0x96,
+	0x0f, 0x4a, 0xb2, 0xcc, 0xd4, 0x8e, 0x87, 0x23, 0x3f, 0x4b, 0xcf, 0x02, 0x00, 0x00, 0xff, 0xff,
+	0xb2, 0xd0, 0x60, 0xa4, 0x01, 0x11, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignExperimentServiceClient is the client API for CampaignExperimentService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignExperimentServiceClient interface {
+	// Returns the requested campaign experiment in full detail.
+	GetCampaignExperiment(ctx context.Context, in *GetCampaignExperimentRequest, opts ...grpc.CallOption) (*resources.CampaignExperiment, error)
+	// Creates a campaign experiment based on a campaign draft. The draft campaign
+	// will be forked into a real campaign (called the experiment campaign) that
+	// will begin serving ads if successfully created.
+	//
+	// The campaign experiment is created immediately with status INITIALIZING.
+	// This method return a long running operation that tracks the forking of the
+	// draft campaign. If the forking fails, a list of errors can be retrieved
+	// using the ListCampaignExperimentAsyncErrors method. The operation's
+	// metadata will be a StringValue containing the resource name of the created
+	// campaign experiment.
+	CreateCampaignExperiment(ctx context.Context, in *CreateCampaignExperimentRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
+	// Updates campaign experiments. Operation statuses are returned.
+	MutateCampaignExperiments(ctx context.Context, in *MutateCampaignExperimentsRequest, opts ...grpc.CallOption) (*MutateCampaignExperimentsResponse, error)
+	// Graduates a campaign experiment to a full campaign. The base and experiment
+	// campaigns will start running independently with their own budgets.
+	GraduateCampaignExperiment(ctx context.Context, in *GraduateCampaignExperimentRequest, opts ...grpc.CallOption) (*GraduateCampaignExperimentResponse, error)
+	// Promotes the changes in a experiment campaign back to the base campaign.
+	//
+	// The campaign experiment is updated immediately with status PROMOTING.
+	// This method return a long running operation that tracks the promoting of
+	// the experiment campaign. If the promoting fails, a list of errors can be
+	// retrieved using the ListCampaignExperimentAsyncErrors method.
+	PromoteCampaignExperiment(ctx context.Context, in *PromoteCampaignExperimentRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
+	// Immediately ends a campaign experiment, changing the experiment's scheduled
+	// end date and without waiting for end of day. End date is updated to be the
+	// time of the request.
+	EndCampaignExperiment(ctx context.Context, in *EndCampaignExperimentRequest, opts ...grpc.CallOption) (*empty.Empty, error)
+	// Returns all errors that occurred during CampaignExperiment create or
+	// promote (whichever occurred last).
+	// Supports standard list paging.
+	ListCampaignExperimentAsyncErrors(ctx context.Context, in *ListCampaignExperimentAsyncErrorsRequest, opts ...grpc.CallOption) (*ListCampaignExperimentAsyncErrorsResponse, error)
+}
+
+type campaignExperimentServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignExperimentServiceClient(cc grpc.ClientConnInterface) CampaignExperimentServiceClient {
+	return &campaignExperimentServiceClient{cc}
+}
+
+func (c *campaignExperimentServiceClient) GetCampaignExperiment(ctx context.Context, in *GetCampaignExperimentRequest, opts ...grpc.CallOption) (*resources.CampaignExperiment, error) {
+	out := new(resources.CampaignExperiment)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignExperimentService/GetCampaignExperiment", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignExperimentServiceClient) CreateCampaignExperiment(ctx context.Context, in *CreateCampaignExperimentRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
+	out := new(longrunning.Operation)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignExperimentService/CreateCampaignExperiment", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignExperimentServiceClient) MutateCampaignExperiments(ctx context.Context, in *MutateCampaignExperimentsRequest, opts ...grpc.CallOption) (*MutateCampaignExperimentsResponse, error) {
+	out := new(MutateCampaignExperimentsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignExperimentService/MutateCampaignExperiments", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignExperimentServiceClient) GraduateCampaignExperiment(ctx context.Context, in *GraduateCampaignExperimentRequest, opts ...grpc.CallOption) (*GraduateCampaignExperimentResponse, error) {
+	out := new(GraduateCampaignExperimentResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignExperimentService/GraduateCampaignExperiment", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignExperimentServiceClient) PromoteCampaignExperiment(ctx context.Context, in *PromoteCampaignExperimentRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
+	out := new(longrunning.Operation)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignExperimentService/PromoteCampaignExperiment", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignExperimentServiceClient) EndCampaignExperiment(ctx context.Context, in *EndCampaignExperimentRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
+	out := new(empty.Empty)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignExperimentService/EndCampaignExperiment", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignExperimentServiceClient) ListCampaignExperimentAsyncErrors(ctx context.Context, in *ListCampaignExperimentAsyncErrorsRequest, opts ...grpc.CallOption) (*ListCampaignExperimentAsyncErrorsResponse, error) {
+	out := new(ListCampaignExperimentAsyncErrorsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignExperimentService/ListCampaignExperimentAsyncErrors", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignExperimentServiceServer is the server API for CampaignExperimentService service.
+type CampaignExperimentServiceServer interface {
+	// Returns the requested campaign experiment in full detail.
+	GetCampaignExperiment(context.Context, *GetCampaignExperimentRequest) (*resources.CampaignExperiment, error)
+	// Creates a campaign experiment based on a campaign draft. The draft campaign
+	// will be forked into a real campaign (called the experiment campaign) that
+	// will begin serving ads if successfully created.
+	//
+	// The campaign experiment is created immediately with status INITIALIZING.
+	// This method return a long running operation that tracks the forking of the
+	// draft campaign. If the forking fails, a list of errors can be retrieved
+	// using the ListCampaignExperimentAsyncErrors method. The operation's
+	// metadata will be a StringValue containing the resource name of the created
+	// campaign experiment.
+	CreateCampaignExperiment(context.Context, *CreateCampaignExperimentRequest) (*longrunning.Operation, error)
+	// Updates campaign experiments. Operation statuses are returned.
+	MutateCampaignExperiments(context.Context, *MutateCampaignExperimentsRequest) (*MutateCampaignExperimentsResponse, error)
+	// Graduates a campaign experiment to a full campaign. The base and experiment
+	// campaigns will start running independently with their own budgets.
+	GraduateCampaignExperiment(context.Context, *GraduateCampaignExperimentRequest) (*GraduateCampaignExperimentResponse, error)
+	// Promotes the changes in a experiment campaign back to the base campaign.
+	//
+	// The campaign experiment is updated immediately with status PROMOTING.
+	// This method return a long running operation that tracks the promoting of
+	// the experiment campaign. If the promoting fails, a list of errors can be
+	// retrieved using the ListCampaignExperimentAsyncErrors method.
+	PromoteCampaignExperiment(context.Context, *PromoteCampaignExperimentRequest) (*longrunning.Operation, error)
+	// Immediately ends a campaign experiment, changing the experiment's scheduled
+	// end date and without waiting for end of day. End date is updated to be the
+	// time of the request.
+	EndCampaignExperiment(context.Context, *EndCampaignExperimentRequest) (*empty.Empty, error)
+	// Returns all errors that occurred during CampaignExperiment create or
+	// promote (whichever occurred last).
+	// Supports standard list paging.
+	ListCampaignExperimentAsyncErrors(context.Context, *ListCampaignExperimentAsyncErrorsRequest) (*ListCampaignExperimentAsyncErrorsResponse, error)
+}
+
+// UnimplementedCampaignExperimentServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignExperimentServiceServer struct {
+}
+
+func (*UnimplementedCampaignExperimentServiceServer) GetCampaignExperiment(ctx context.Context, req *GetCampaignExperimentRequest) (*resources.CampaignExperiment, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaignExperiment not implemented")
+}
+func (*UnimplementedCampaignExperimentServiceServer) CreateCampaignExperiment(ctx context.Context, req *CreateCampaignExperimentRequest) (*longrunning.Operation, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method CreateCampaignExperiment not implemented")
+}
+func (*UnimplementedCampaignExperimentServiceServer) MutateCampaignExperiments(ctx context.Context, req *MutateCampaignExperimentsRequest) (*MutateCampaignExperimentsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaignExperiments not implemented")
+}
+func (*UnimplementedCampaignExperimentServiceServer) GraduateCampaignExperiment(ctx context.Context, req *GraduateCampaignExperimentRequest) (*GraduateCampaignExperimentResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GraduateCampaignExperiment not implemented")
+}
+func (*UnimplementedCampaignExperimentServiceServer) PromoteCampaignExperiment(ctx context.Context, req *PromoteCampaignExperimentRequest) (*longrunning.Operation, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method PromoteCampaignExperiment not implemented")
+}
+func (*UnimplementedCampaignExperimentServiceServer) EndCampaignExperiment(ctx context.Context, req *EndCampaignExperimentRequest) (*empty.Empty, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method EndCampaignExperiment not implemented")
+}
+func (*UnimplementedCampaignExperimentServiceServer) ListCampaignExperimentAsyncErrors(ctx context.Context, req *ListCampaignExperimentAsyncErrorsRequest) (*ListCampaignExperimentAsyncErrorsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method ListCampaignExperimentAsyncErrors not implemented")
+}
+
+func RegisterCampaignExperimentServiceServer(s *grpc.Server, srv CampaignExperimentServiceServer) {
+	s.RegisterService(&_CampaignExperimentService_serviceDesc, srv)
+}
+
+func _CampaignExperimentService_GetCampaignExperiment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignExperimentRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignExperimentServiceServer).GetCampaignExperiment(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignExperimentService/GetCampaignExperiment",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignExperimentServiceServer).GetCampaignExperiment(ctx, req.(*GetCampaignExperimentRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignExperimentService_CreateCampaignExperiment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateCampaignExperimentRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignExperimentServiceServer).CreateCampaignExperiment(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignExperimentService/CreateCampaignExperiment",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignExperimentServiceServer).CreateCampaignExperiment(ctx, req.(*CreateCampaignExperimentRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignExperimentService_MutateCampaignExperiments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignExperimentsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignExperimentServiceServer).MutateCampaignExperiments(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignExperimentService/MutateCampaignExperiments",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignExperimentServiceServer).MutateCampaignExperiments(ctx, req.(*MutateCampaignExperimentsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignExperimentService_GraduateCampaignExperiment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GraduateCampaignExperimentRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignExperimentServiceServer).GraduateCampaignExperiment(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignExperimentService/GraduateCampaignExperiment",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignExperimentServiceServer).GraduateCampaignExperiment(ctx, req.(*GraduateCampaignExperimentRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignExperimentService_PromoteCampaignExperiment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(PromoteCampaignExperimentRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignExperimentServiceServer).PromoteCampaignExperiment(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignExperimentService/PromoteCampaignExperiment",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignExperimentServiceServer).PromoteCampaignExperiment(ctx, req.(*PromoteCampaignExperimentRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignExperimentService_EndCampaignExperiment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EndCampaignExperimentRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignExperimentServiceServer).EndCampaignExperiment(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignExperimentService/EndCampaignExperiment",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignExperimentServiceServer).EndCampaignExperiment(ctx, req.(*EndCampaignExperimentRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignExperimentService_ListCampaignExperimentAsyncErrors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListCampaignExperimentAsyncErrorsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignExperimentServiceServer).ListCampaignExperimentAsyncErrors(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignExperimentService/ListCampaignExperimentAsyncErrors",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignExperimentServiceServer).ListCampaignExperimentAsyncErrors(ctx, req.(*ListCampaignExperimentAsyncErrorsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignExperimentService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignExperimentService",
+	HandlerType: (*CampaignExperimentServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignExperiment",
+			Handler:    _CampaignExperimentService_GetCampaignExperiment_Handler,
+		},
+		{
+			MethodName: "CreateCampaignExperiment",
+			Handler:    _CampaignExperimentService_CreateCampaignExperiment_Handler,
+		},
+		{
+			MethodName: "MutateCampaignExperiments",
+			Handler:    _CampaignExperimentService_MutateCampaignExperiments_Handler,
+		},
+		{
+			MethodName: "GraduateCampaignExperiment",
+			Handler:    _CampaignExperimentService_GraduateCampaignExperiment_Handler,
+		},
+		{
+			MethodName: "PromoteCampaignExperiment",
+			Handler:    _CampaignExperimentService_PromoteCampaignExperiment_Handler,
+		},
+		{
+			MethodName: "EndCampaignExperiment",
+			Handler:    _CampaignExperimentService_EndCampaignExperiment_Handler,
+		},
+		{
+			MethodName: "ListCampaignExperimentAsyncErrors",
+			Handler:    _CampaignExperimentService_ListCampaignExperimentAsyncErrors_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_experiment_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_extension_setting_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_extension_setting_service.pb.go
new file mode 100644
index 0000000..02403a6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_extension_setting_service.pb.go
@@ -0,0 +1,539 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_extension_setting_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [CampaignExtensionSettingService.GetCampaignExtensionSetting][google.ads.googleads.v3.services.CampaignExtensionSettingService.GetCampaignExtensionSetting].
+type GetCampaignExtensionSettingRequest struct {
+	// Required. The resource name of the campaign extension setting to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignExtensionSettingRequest) Reset()         { *m = GetCampaignExtensionSettingRequest{} }
+func (m *GetCampaignExtensionSettingRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignExtensionSettingRequest) ProtoMessage()    {}
+func (*GetCampaignExtensionSettingRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_153949fd6dd7bcce, []int{0}
+}
+
+func (m *GetCampaignExtensionSettingRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignExtensionSettingRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignExtensionSettingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignExtensionSettingRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignExtensionSettingRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignExtensionSettingRequest.Merge(m, src)
+}
+func (m *GetCampaignExtensionSettingRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignExtensionSettingRequest.Size(m)
+}
+func (m *GetCampaignExtensionSettingRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignExtensionSettingRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignExtensionSettingRequest proto.InternalMessageInfo
+
+func (m *GetCampaignExtensionSettingRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for
+// [CampaignExtensionSettingService.MutateCampaignExtensionSettings][google.ads.googleads.v3.services.CampaignExtensionSettingService.MutateCampaignExtensionSettings].
+type MutateCampaignExtensionSettingsRequest struct {
+	// Required. The ID of the customer whose campaign extension settings are being
+	// modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual campaign extension
+	// settings.
+	Operations []*CampaignExtensionSettingOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignExtensionSettingsRequest) Reset() {
+	*m = MutateCampaignExtensionSettingsRequest{}
+}
+func (m *MutateCampaignExtensionSettingsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignExtensionSettingsRequest) ProtoMessage()    {}
+func (*MutateCampaignExtensionSettingsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_153949fd6dd7bcce, []int{1}
+}
+
+func (m *MutateCampaignExtensionSettingsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignExtensionSettingsRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignExtensionSettingsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignExtensionSettingsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignExtensionSettingsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignExtensionSettingsRequest.Merge(m, src)
+}
+func (m *MutateCampaignExtensionSettingsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignExtensionSettingsRequest.Size(m)
+}
+func (m *MutateCampaignExtensionSettingsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignExtensionSettingsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignExtensionSettingsRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignExtensionSettingsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignExtensionSettingsRequest) GetOperations() []*CampaignExtensionSettingOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignExtensionSettingsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignExtensionSettingsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a campaign extension setting.
+type CampaignExtensionSettingOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignExtensionSettingOperation_Create
+	//	*CampaignExtensionSettingOperation_Update
+	//	*CampaignExtensionSettingOperation_Remove
+	Operation            isCampaignExtensionSettingOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
+	XXX_unrecognized     []byte                                        `json:"-"`
+	XXX_sizecache        int32                                         `json:"-"`
+}
+
+func (m *CampaignExtensionSettingOperation) Reset()         { *m = CampaignExtensionSettingOperation{} }
+func (m *CampaignExtensionSettingOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignExtensionSettingOperation) ProtoMessage()    {}
+func (*CampaignExtensionSettingOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_153949fd6dd7bcce, []int{2}
+}
+
+func (m *CampaignExtensionSettingOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignExtensionSettingOperation.Unmarshal(m, b)
+}
+func (m *CampaignExtensionSettingOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignExtensionSettingOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignExtensionSettingOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignExtensionSettingOperation.Merge(m, src)
+}
+func (m *CampaignExtensionSettingOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignExtensionSettingOperation.Size(m)
+}
+func (m *CampaignExtensionSettingOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignExtensionSettingOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignExtensionSettingOperation proto.InternalMessageInfo
+
+func (m *CampaignExtensionSettingOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCampaignExtensionSettingOperation_Operation interface {
+	isCampaignExtensionSettingOperation_Operation()
+}
+
+type CampaignExtensionSettingOperation_Create struct {
+	Create *resources.CampaignExtensionSetting `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CampaignExtensionSettingOperation_Update struct {
+	Update *resources.CampaignExtensionSetting `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type CampaignExtensionSettingOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignExtensionSettingOperation_Create) isCampaignExtensionSettingOperation_Operation() {}
+
+func (*CampaignExtensionSettingOperation_Update) isCampaignExtensionSettingOperation_Operation() {}
+
+func (*CampaignExtensionSettingOperation_Remove) isCampaignExtensionSettingOperation_Operation() {}
+
+func (m *CampaignExtensionSettingOperation) GetOperation() isCampaignExtensionSettingOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignExtensionSettingOperation) GetCreate() *resources.CampaignExtensionSetting {
+	if x, ok := m.GetOperation().(*CampaignExtensionSettingOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CampaignExtensionSettingOperation) GetUpdate() *resources.CampaignExtensionSetting {
+	if x, ok := m.GetOperation().(*CampaignExtensionSettingOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CampaignExtensionSettingOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignExtensionSettingOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignExtensionSettingOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignExtensionSettingOperation_Create)(nil),
+		(*CampaignExtensionSettingOperation_Update)(nil),
+		(*CampaignExtensionSettingOperation_Remove)(nil),
+	}
+}
+
+// Response message for a campaign extension setting mutate.
+type MutateCampaignExtensionSettingsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignExtensionSettingResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *MutateCampaignExtensionSettingsResponse) Reset() {
+	*m = MutateCampaignExtensionSettingsResponse{}
+}
+func (m *MutateCampaignExtensionSettingsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignExtensionSettingsResponse) ProtoMessage()    {}
+func (*MutateCampaignExtensionSettingsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_153949fd6dd7bcce, []int{3}
+}
+
+func (m *MutateCampaignExtensionSettingsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignExtensionSettingsResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignExtensionSettingsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignExtensionSettingsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignExtensionSettingsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignExtensionSettingsResponse.Merge(m, src)
+}
+func (m *MutateCampaignExtensionSettingsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignExtensionSettingsResponse.Size(m)
+}
+func (m *MutateCampaignExtensionSettingsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignExtensionSettingsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignExtensionSettingsResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignExtensionSettingsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignExtensionSettingsResponse) GetResults() []*MutateCampaignExtensionSettingResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the campaign extension setting mutate.
+type MutateCampaignExtensionSettingResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignExtensionSettingResult) Reset()         { *m = MutateCampaignExtensionSettingResult{} }
+func (m *MutateCampaignExtensionSettingResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignExtensionSettingResult) ProtoMessage()    {}
+func (*MutateCampaignExtensionSettingResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_153949fd6dd7bcce, []int{4}
+}
+
+func (m *MutateCampaignExtensionSettingResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignExtensionSettingResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignExtensionSettingResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignExtensionSettingResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignExtensionSettingResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignExtensionSettingResult.Merge(m, src)
+}
+func (m *MutateCampaignExtensionSettingResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignExtensionSettingResult.Size(m)
+}
+func (m *MutateCampaignExtensionSettingResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignExtensionSettingResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignExtensionSettingResult proto.InternalMessageInfo
+
+func (m *MutateCampaignExtensionSettingResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignExtensionSettingRequest)(nil), "google.ads.googleads.v3.services.GetCampaignExtensionSettingRequest")
+	proto.RegisterType((*MutateCampaignExtensionSettingsRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignExtensionSettingsRequest")
+	proto.RegisterType((*CampaignExtensionSettingOperation)(nil), "google.ads.googleads.v3.services.CampaignExtensionSettingOperation")
+	proto.RegisterType((*MutateCampaignExtensionSettingsResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignExtensionSettingsResponse")
+	proto.RegisterType((*MutateCampaignExtensionSettingResult)(nil), "google.ads.googleads.v3.services.MutateCampaignExtensionSettingResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_extension_setting_service.proto", fileDescriptor_153949fd6dd7bcce)
+}
+
+var fileDescriptor_153949fd6dd7bcce = []byte{
+	// 780 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xbf, 0x6f, 0xe3, 0x36,
+	0x14, 0xae, 0xe5, 0x20, 0x6d, 0xe8, 0xa4, 0x05, 0x58, 0xb4, 0x35, 0x9c, 0x02, 0x71, 0x55, 0xa3,
+	0x31, 0x8c, 0x42, 0x02, 0xec, 0x4d, 0x46, 0x0a, 0xc8, 0x69, 0x9c, 0x04, 0x45, 0x7e, 0x40, 0x46,
+	0x33, 0x14, 0x06, 0x54, 0x5a, 0x62, 0x14, 0x21, 0x92, 0xa8, 0x92, 0x94, 0xd1, 0x20, 0xc8, 0xd2,
+	0xa1, 0x4b, 0xc7, 0x6e, 0x1d, 0x3b, 0xde, 0x7e, 0xff, 0x44, 0xd6, 0x6c, 0x99, 0x6e, 0xb8, 0xe9,
+	0xf6, 0xdb, 0x0f, 0x12, 0x45, 0xff, 0xc8, 0x9d, 0xa2, 0x03, 0x92, 0xed, 0x99, 0xef, 0xd3, 0xf7,
+	0x3e, 0xbe, 0xf7, 0xf1, 0x19, 0x1c, 0x7a, 0x84, 0x78, 0x01, 0xd6, 0x91, 0xcb, 0x74, 0x11, 0xa6,
+	0xd1, 0xb4, 0xa7, 0x33, 0x4c, 0xa7, 0xbe, 0x83, 0x99, 0xee, 0xa0, 0x30, 0x46, 0xbe, 0x17, 0xd9,
+	0xf8, 0x4f, 0x8e, 0x23, 0xe6, 0x93, 0xc8, 0x66, 0x98, 0x73, 0x3f, 0xf2, 0xec, 0x1c, 0xa3, 0xc5,
+	0x94, 0x70, 0x02, 0x9b, 0xe2, 0x7b, 0x0d, 0xb9, 0x4c, 0x9b, 0x51, 0x69, 0xd3, 0x9e, 0x26, 0xa9,
+	0x1a, 0x83, 0xa2, 0x62, 0x14, 0x33, 0x92, 0xd0, 0xc7, 0xab, 0x89, 0x2a, 0x8d, 0x6f, 0x25, 0x47,
+	0xec, 0xeb, 0x28, 0x8a, 0x08, 0x47, 0xdc, 0x27, 0x11, 0xcb, 0xb3, 0xdf, 0x2c, 0x64, 0x9d, 0xc0,
+	0xc7, 0x11, 0xcf, 0x13, 0x5b, 0x0b, 0x89, 0x73, 0x1f, 0x07, 0xae, 0x3d, 0xc1, 0x17, 0x68, 0xea,
+	0x13, 0x9a, 0x03, 0x72, 0xf5, 0x7a, 0xf6, 0x6b, 0x92, 0x9c, 0xe7, 0xa8, 0x10, 0xb1, 0xcb, 0x07,
+	0xdc, 0x34, 0x76, 0x74, 0xc6, 0x11, 0x4f, 0xf2, 0xa2, 0xea, 0x31, 0x50, 0xf7, 0x31, 0xdf, 0xcd,
+	0x95, 0xef, 0x49, 0xe1, 0x23, 0xa1, 0xdb, 0xc2, 0x7f, 0x24, 0x98, 0x71, 0xd8, 0x06, 0x1b, 0xf2,
+	0x9a, 0x76, 0x84, 0x42, 0x5c, 0xaf, 0x34, 0x2b, 0xed, 0xb5, 0x41, 0xf5, 0x95, 0xa9, 0x58, 0xeb,
+	0x32, 0x73, 0x8c, 0x42, 0xac, 0xfe, 0xad, 0x80, 0x1f, 0x8e, 0x12, 0x8e, 0x38, 0x2e, 0xe2, 0x64,
+	0x92, 0xb4, 0x05, 0x6a, 0x4e, 0xc2, 0x38, 0x09, 0x31, 0xb5, 0x7d, 0x77, 0x91, 0x12, 0xc8, 0xf3,
+	0x43, 0x17, 0x5e, 0x00, 0x40, 0x62, 0x4c, 0x45, 0xa7, 0xea, 0x4a, 0xb3, 0xda, 0xae, 0x75, 0x77,
+	0xb5, 0xb2, 0x71, 0x69, 0x45, 0xd5, 0x4f, 0x24, 0x57, 0x5e, 0x69, 0xce, 0x0d, 0xb7, 0xc1, 0x17,
+	0x31, 0xa2, 0xdc, 0x47, 0x81, 0x7d, 0x8e, 0xfc, 0x20, 0xa1, 0xb8, 0x5e, 0x6d, 0x56, 0xda, 0x9f,
+	0x59, 0x9f, 0xe7, 0xc7, 0x43, 0x71, 0x0a, 0xbf, 0x07, 0x1b, 0x53, 0x14, 0xf8, 0x2e, 0xe2, 0xd8,
+	0x26, 0x51, 0x70, 0x55, 0x5f, 0xc9, 0x60, 0xeb, 0xf2, 0xf0, 0x24, 0x0a, 0xae, 0xd4, 0x97, 0x0a,
+	0xf8, 0xae, 0x54, 0x04, 0xec, 0x83, 0x5a, 0x12, 0x67, 0x44, 0xe9, 0xb0, 0x32, 0xa2, 0x5a, 0xb7,
+	0x21, 0xaf, 0x27, 0xe7, 0xa9, 0x0d, 0xd3, 0x79, 0x1e, 0x21, 0x76, 0x69, 0x01, 0x01, 0x4f, 0x63,
+	0xf8, 0x2b, 0x58, 0x75, 0x28, 0x46, 0x5c, 0x8c, 0xa3, 0xd6, 0xed, 0x17, 0xb6, 0x65, 0xe6, 0xd1,
+	0xc2, 0xbe, 0x1c, 0x7c, 0x62, 0xe5, 0x64, 0x29, 0xad, 0x28, 0x52, 0x57, 0x9e, 0x85, 0x56, 0x90,
+	0xc1, 0x3a, 0x58, 0xa5, 0x38, 0x24, 0x53, 0xd1, 0xd5, 0xb5, 0x34, 0x23, 0x7e, 0x0f, 0x6a, 0x60,
+	0x6d, 0x36, 0x06, 0xf5, 0xae, 0x02, 0xb6, 0x4b, 0x0d, 0xc4, 0x62, 0x12, 0x31, 0x0c, 0x87, 0xe0,
+	0xab, 0x07, 0x13, 0xb3, 0x31, 0xa5, 0x84, 0x66, 0x15, 0x6a, 0x5d, 0x28, 0x85, 0xd3, 0xd8, 0xd1,
+	0x46, 0x99, 0xeb, 0xad, 0x2f, 0x97, 0x67, 0xb9, 0x97, 0xc2, 0xe1, 0xef, 0xe0, 0x53, 0x8a, 0x59,
+	0x12, 0x70, 0x69, 0xb0, 0x61, 0xb9, 0xc1, 0x1e, 0xd7, 0x68, 0x65, 0x74, 0x96, 0xa4, 0x55, 0x7f,
+	0x01, 0xad, 0x8f, 0xf9, 0x20, 0xb5, 0xd6, 0x07, 0x1e, 0xda, 0xf2, 0x1b, 0xeb, 0xde, 0xad, 0x80,
+	0xad, 0x22, 0x9e, 0x91, 0xd0, 0x07, 0xdf, 0x56, 0xc0, 0xe6, 0x23, 0x0f, 0x1b, 0xfe, 0x5c, 0x7e,
+	0xc3, 0xf2, 0xbd, 0xd0, 0x78, 0x8a, 0x35, 0xd4, 0xd1, 0xbd, 0xb9, 0x7c, 0xd9, 0xbf, 0xee, 0x5e,
+	0xff, 0xab, 0xec, 0xc0, 0x7e, 0xba, 0x55, 0xaf, 0x97, 0x32, 0x3b, 0x72, 0x21, 0x30, 0xbd, 0x33,
+	0x5b, 0xb3, 0xef, 0xf9, 0x42, 0xef, 0xdc, 0xc0, 0xff, 0x14, 0xb0, 0x55, 0x62, 0x1f, 0x78, 0xf0,
+	0xd4, 0xe9, 0xca, 0x15, 0xd6, 0x38, 0x7c, 0x06, 0x26, 0xe1, 0x65, 0x75, 0x72, 0x6f, 0x7e, 0xbd,
+	0xb0, 0x0e, 0x7f, 0x9c, 0x2f, 0xa6, 0xac, 0x2d, 0xbb, 0xea, 0x4f, 0x69, 0x5b, 0xe6, 0x7d, 0xb8,
+	0x5e, 0x00, 0xef, 0x74, 0x6e, 0x8a, 0xbb, 0x62, 0x84, 0x99, 0x02, 0xa3, 0xd2, 0x69, 0x6c, 0xde,
+	0x9a, 0xf5, 0xb9, 0xca, 0x3c, 0x8a, 0x7d, 0xa6, 0x39, 0x24, 0x1c, 0xfc, 0xa3, 0x80, 0x96, 0x43,
+	0xc2, 0xd2, 0x1b, 0x0d, 0x5a, 0x25, 0xde, 0x3b, 0x4d, 0xb7, 0xd6, 0x69, 0xe5, 0xb7, 0x83, 0x9c,
+	0xc9, 0x23, 0x01, 0x8a, 0x3c, 0x8d, 0x50, 0x4f, 0xf7, 0x70, 0x94, 0xed, 0x34, 0x7d, 0x5e, 0xbb,
+	0xf8, 0xdf, 0xbb, 0x2f, 0x83, 0xff, 0x95, 0xea, 0xbe, 0x69, 0xbe, 0x50, 0x9a, 0xfb, 0x82, 0xd0,
+	0x74, 0x99, 0x26, 0xc2, 0x34, 0x3a, 0xeb, 0x69, 0x79, 0x61, 0x76, 0x2b, 0x21, 0x63, 0xd3, 0x65,
+	0xe3, 0x19, 0x64, 0x7c, 0xd6, 0x1b, 0x4b, 0xc8, 0x1b, 0xa5, 0x25, 0xce, 0x0d, 0xc3, 0x74, 0x99,
+	0x61, 0xcc, 0x40, 0x86, 0x71, 0xd6, 0x33, 0x0c, 0x09, 0x9b, 0xac, 0x66, 0x3a, 0x7b, 0xef, 0x02,
+	0x00, 0x00, 0xff, 0xff, 0xb2, 0xd3, 0xc6, 0xbb, 0x64, 0x08, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignExtensionSettingServiceClient is the client API for CampaignExtensionSettingService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignExtensionSettingServiceClient interface {
+	// Returns the requested campaign extension setting in full detail.
+	GetCampaignExtensionSetting(ctx context.Context, in *GetCampaignExtensionSettingRequest, opts ...grpc.CallOption) (*resources.CampaignExtensionSetting, error)
+	// Creates, updates, or removes campaign extension settings. Operation
+	// statuses are returned.
+	MutateCampaignExtensionSettings(ctx context.Context, in *MutateCampaignExtensionSettingsRequest, opts ...grpc.CallOption) (*MutateCampaignExtensionSettingsResponse, error)
+}
+
+type campaignExtensionSettingServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignExtensionSettingServiceClient(cc grpc.ClientConnInterface) CampaignExtensionSettingServiceClient {
+	return &campaignExtensionSettingServiceClient{cc}
+}
+
+func (c *campaignExtensionSettingServiceClient) GetCampaignExtensionSetting(ctx context.Context, in *GetCampaignExtensionSettingRequest, opts ...grpc.CallOption) (*resources.CampaignExtensionSetting, error) {
+	out := new(resources.CampaignExtensionSetting)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignExtensionSettingService/GetCampaignExtensionSetting", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignExtensionSettingServiceClient) MutateCampaignExtensionSettings(ctx context.Context, in *MutateCampaignExtensionSettingsRequest, opts ...grpc.CallOption) (*MutateCampaignExtensionSettingsResponse, error) {
+	out := new(MutateCampaignExtensionSettingsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignExtensionSettingService/MutateCampaignExtensionSettings", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignExtensionSettingServiceServer is the server API for CampaignExtensionSettingService service.
+type CampaignExtensionSettingServiceServer interface {
+	// Returns the requested campaign extension setting in full detail.
+	GetCampaignExtensionSetting(context.Context, *GetCampaignExtensionSettingRequest) (*resources.CampaignExtensionSetting, error)
+	// Creates, updates, or removes campaign extension settings. Operation
+	// statuses are returned.
+	MutateCampaignExtensionSettings(context.Context, *MutateCampaignExtensionSettingsRequest) (*MutateCampaignExtensionSettingsResponse, error)
+}
+
+// UnimplementedCampaignExtensionSettingServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignExtensionSettingServiceServer struct {
+}
+
+func (*UnimplementedCampaignExtensionSettingServiceServer) GetCampaignExtensionSetting(ctx context.Context, req *GetCampaignExtensionSettingRequest) (*resources.CampaignExtensionSetting, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaignExtensionSetting not implemented")
+}
+func (*UnimplementedCampaignExtensionSettingServiceServer) MutateCampaignExtensionSettings(ctx context.Context, req *MutateCampaignExtensionSettingsRequest) (*MutateCampaignExtensionSettingsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaignExtensionSettings not implemented")
+}
+
+func RegisterCampaignExtensionSettingServiceServer(s *grpc.Server, srv CampaignExtensionSettingServiceServer) {
+	s.RegisterService(&_CampaignExtensionSettingService_serviceDesc, srv)
+}
+
+func _CampaignExtensionSettingService_GetCampaignExtensionSetting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignExtensionSettingRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignExtensionSettingServiceServer).GetCampaignExtensionSetting(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignExtensionSettingService/GetCampaignExtensionSetting",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignExtensionSettingServiceServer).GetCampaignExtensionSetting(ctx, req.(*GetCampaignExtensionSettingRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignExtensionSettingService_MutateCampaignExtensionSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignExtensionSettingsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignExtensionSettingServiceServer).MutateCampaignExtensionSettings(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignExtensionSettingService/MutateCampaignExtensionSettings",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignExtensionSettingServiceServer).MutateCampaignExtensionSettings(ctx, req.(*MutateCampaignExtensionSettingsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignExtensionSettingService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignExtensionSettingService",
+	HandlerType: (*CampaignExtensionSettingServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignExtensionSetting",
+			Handler:    _CampaignExtensionSettingService_GetCampaignExtensionSetting_Handler,
+		},
+		{
+			MethodName: "MutateCampaignExtensionSettings",
+			Handler:    _CampaignExtensionSettingService_MutateCampaignExtensionSettings_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_extension_setting_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_feed_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_feed_service.pb.go
new file mode 100644
index 0000000..6e97133
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_feed_service.pb.go
@@ -0,0 +1,530 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_feed_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignFeedService.GetCampaignFeed][google.ads.googleads.v3.services.CampaignFeedService.GetCampaignFeed].
+type GetCampaignFeedRequest struct {
+	// Required. The resource name of the campaign feed to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignFeedRequest) Reset()         { *m = GetCampaignFeedRequest{} }
+func (m *GetCampaignFeedRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignFeedRequest) ProtoMessage()    {}
+func (*GetCampaignFeedRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f28fd8f5bcce23c1, []int{0}
+}
+
+func (m *GetCampaignFeedRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignFeedRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignFeedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignFeedRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignFeedRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignFeedRequest.Merge(m, src)
+}
+func (m *GetCampaignFeedRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignFeedRequest.Size(m)
+}
+func (m *GetCampaignFeedRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignFeedRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignFeedRequest proto.InternalMessageInfo
+
+func (m *GetCampaignFeedRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignFeedService.MutateCampaignFeeds][google.ads.googleads.v3.services.CampaignFeedService.MutateCampaignFeeds].
+type MutateCampaignFeedsRequest struct {
+	// Required. The ID of the customer whose campaign feeds are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual campaign feeds.
+	Operations []*CampaignFeedOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignFeedsRequest) Reset()         { *m = MutateCampaignFeedsRequest{} }
+func (m *MutateCampaignFeedsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignFeedsRequest) ProtoMessage()    {}
+func (*MutateCampaignFeedsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f28fd8f5bcce23c1, []int{1}
+}
+
+func (m *MutateCampaignFeedsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignFeedsRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignFeedsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignFeedsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignFeedsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignFeedsRequest.Merge(m, src)
+}
+func (m *MutateCampaignFeedsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignFeedsRequest.Size(m)
+}
+func (m *MutateCampaignFeedsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignFeedsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignFeedsRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignFeedsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignFeedsRequest) GetOperations() []*CampaignFeedOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignFeedsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignFeedsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a campaign feed.
+type CampaignFeedOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignFeedOperation_Create
+	//	*CampaignFeedOperation_Update
+	//	*CampaignFeedOperation_Remove
+	Operation            isCampaignFeedOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *CampaignFeedOperation) Reset()         { *m = CampaignFeedOperation{} }
+func (m *CampaignFeedOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignFeedOperation) ProtoMessage()    {}
+func (*CampaignFeedOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f28fd8f5bcce23c1, []int{2}
+}
+
+func (m *CampaignFeedOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignFeedOperation.Unmarshal(m, b)
+}
+func (m *CampaignFeedOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignFeedOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignFeedOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignFeedOperation.Merge(m, src)
+}
+func (m *CampaignFeedOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignFeedOperation.Size(m)
+}
+func (m *CampaignFeedOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignFeedOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignFeedOperation proto.InternalMessageInfo
+
+func (m *CampaignFeedOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCampaignFeedOperation_Operation interface {
+	isCampaignFeedOperation_Operation()
+}
+
+type CampaignFeedOperation_Create struct {
+	Create *resources.CampaignFeed `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CampaignFeedOperation_Update struct {
+	Update *resources.CampaignFeed `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type CampaignFeedOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignFeedOperation_Create) isCampaignFeedOperation_Operation() {}
+
+func (*CampaignFeedOperation_Update) isCampaignFeedOperation_Operation() {}
+
+func (*CampaignFeedOperation_Remove) isCampaignFeedOperation_Operation() {}
+
+func (m *CampaignFeedOperation) GetOperation() isCampaignFeedOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignFeedOperation) GetCreate() *resources.CampaignFeed {
+	if x, ok := m.GetOperation().(*CampaignFeedOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CampaignFeedOperation) GetUpdate() *resources.CampaignFeed {
+	if x, ok := m.GetOperation().(*CampaignFeedOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CampaignFeedOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignFeedOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignFeedOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignFeedOperation_Create)(nil),
+		(*CampaignFeedOperation_Update)(nil),
+		(*CampaignFeedOperation_Remove)(nil),
+	}
+}
+
+// Response message for a campaign feed mutate.
+type MutateCampaignFeedsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignFeedResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *MutateCampaignFeedsResponse) Reset()         { *m = MutateCampaignFeedsResponse{} }
+func (m *MutateCampaignFeedsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignFeedsResponse) ProtoMessage()    {}
+func (*MutateCampaignFeedsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f28fd8f5bcce23c1, []int{3}
+}
+
+func (m *MutateCampaignFeedsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignFeedsResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignFeedsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignFeedsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignFeedsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignFeedsResponse.Merge(m, src)
+}
+func (m *MutateCampaignFeedsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignFeedsResponse.Size(m)
+}
+func (m *MutateCampaignFeedsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignFeedsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignFeedsResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignFeedsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignFeedsResponse) GetResults() []*MutateCampaignFeedResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the campaign feed mutate.
+type MutateCampaignFeedResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignFeedResult) Reset()         { *m = MutateCampaignFeedResult{} }
+func (m *MutateCampaignFeedResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignFeedResult) ProtoMessage()    {}
+func (*MutateCampaignFeedResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f28fd8f5bcce23c1, []int{4}
+}
+
+func (m *MutateCampaignFeedResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignFeedResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignFeedResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignFeedResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignFeedResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignFeedResult.Merge(m, src)
+}
+func (m *MutateCampaignFeedResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignFeedResult.Size(m)
+}
+func (m *MutateCampaignFeedResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignFeedResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignFeedResult proto.InternalMessageInfo
+
+func (m *MutateCampaignFeedResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignFeedRequest)(nil), "google.ads.googleads.v3.services.GetCampaignFeedRequest")
+	proto.RegisterType((*MutateCampaignFeedsRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignFeedsRequest")
+	proto.RegisterType((*CampaignFeedOperation)(nil), "google.ads.googleads.v3.services.CampaignFeedOperation")
+	proto.RegisterType((*MutateCampaignFeedsResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignFeedsResponse")
+	proto.RegisterType((*MutateCampaignFeedResult)(nil), "google.ads.googleads.v3.services.MutateCampaignFeedResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_feed_service.proto", fileDescriptor_f28fd8f5bcce23c1)
+}
+
+var fileDescriptor_f28fd8f5bcce23c1 = []byte{
+	// 761 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcd, 0x6a, 0xdb, 0x4a,
+	0x14, 0xbe, 0x92, 0x2f, 0xb9, 0x37, 0xe3, 0xe4, 0x06, 0x26, 0x24, 0x57, 0x38, 0x85, 0x1a, 0x35,
+	0x50, 0x63, 0x8a, 0x44, 0x6d, 0x4a, 0x8a, 0x92, 0x50, 0xe4, 0x52, 0x3b, 0x59, 0xa4, 0x09, 0x4a,
+	0xf1, 0xa2, 0x18, 0xc4, 0x44, 0x1a, 0xbb, 0x22, 0x92, 0x46, 0x9d, 0x91, 0x0c, 0x21, 0x64, 0xd3,
+	0x37, 0x28, 0x7d, 0x83, 0x2e, 0xfb, 0x0a, 0x5d, 0x77, 0x93, 0x6d, 0x77, 0x59, 0x75, 0x51, 0x28,
+	0x64, 0xd1, 0x57, 0x68, 0x91, 0x46, 0x63, 0xcb, 0x89, 0x8d, 0x69, 0x76, 0x47, 0x73, 0xbe, 0xf3,
+	0x9d, 0xff, 0x23, 0xb0, 0x33, 0x20, 0x64, 0xe0, 0x63, 0x1d, 0xb9, 0x4c, 0xe7, 0x62, 0x2a, 0x0d,
+	0x9b, 0x3a, 0xc3, 0x74, 0xe8, 0x39, 0x98, 0xe9, 0x0e, 0x0a, 0x22, 0xe4, 0x0d, 0x42, 0xbb, 0x8f,
+	0xb1, 0x6b, 0xe7, 0xcf, 0x5a, 0x44, 0x49, 0x4c, 0x60, 0x95, 0x9b, 0x68, 0xc8, 0x65, 0xda, 0xc8,
+	0x5a, 0x1b, 0x36, 0x35, 0x61, 0x5d, 0x79, 0x32, 0x8b, 0x9f, 0x62, 0x46, 0x12, 0x7a, 0xcb, 0x01,
+	0x27, 0xae, 0xdc, 0x13, 0x66, 0x91, 0xa7, 0xa3, 0x30, 0x24, 0x31, 0x8a, 0x3d, 0x12, 0xb2, 0x5c,
+	0xfb, 0x7f, 0x41, 0xeb, 0xf8, 0x1e, 0x0e, 0xe3, 0x5c, 0x71, 0xbf, 0xa0, 0xe8, 0x7b, 0xd8, 0x77,
+	0xed, 0x13, 0xfc, 0x06, 0x0d, 0x3d, 0x42, 0x73, 0x40, 0x1e, 0xb0, 0x9e, 0x7d, 0x9d, 0x24, 0xfd,
+	0x1c, 0x15, 0x20, 0x76, 0x7a, 0x83, 0x9b, 0x46, 0x8e, 0xce, 0x62, 0x14, 0x27, 0xb9, 0x53, 0xb5,
+	0x05, 0xd6, 0x3b, 0x38, 0x7e, 0x9e, 0x07, 0xdb, 0xc6, 0xd8, 0xb5, 0xf0, 0xdb, 0x04, 0xb3, 0x18,
+	0xd6, 0xc0, 0xb2, 0xc8, 0xc6, 0x0e, 0x51, 0x80, 0x15, 0xa9, 0x2a, 0xd5, 0x16, 0x5b, 0xa5, 0x6f,
+	0xa6, 0x6c, 0x2d, 0x09, 0xcd, 0x4b, 0x14, 0x60, 0xf5, 0xa7, 0x04, 0x2a, 0x07, 0x49, 0x8c, 0x62,
+	0x5c, 0xe4, 0x61, 0x82, 0x68, 0x13, 0x94, 0x9d, 0x84, 0xc5, 0x24, 0xc0, 0xd4, 0xf6, 0xdc, 0x22,
+	0x0d, 0x10, 0xef, 0xfb, 0x2e, 0xec, 0x01, 0x40, 0x22, 0x4c, 0x79, 0x45, 0x14, 0xb9, 0x5a, 0xaa,
+	0x95, 0x1b, 0x5b, 0xda, 0xbc, 0x4e, 0x68, 0x45, 0x8f, 0x87, 0xc2, 0x3e, 0x67, 0x1f, 0xf3, 0xc1,
+	0x87, 0x60, 0x25, 0x42, 0x34, 0xf6, 0x90, 0x6f, 0xf7, 0x91, 0xe7, 0x27, 0x14, 0x2b, 0xa5, 0xaa,
+	0x54, 0xfb, 0xd7, 0xfa, 0x2f, 0x7f, 0x6e, 0xf3, 0x57, 0xf8, 0x00, 0x2c, 0x0f, 0x91, 0xef, 0xb9,
+	0x28, 0xc6, 0x36, 0x09, 0xfd, 0x33, 0xe5, 0xef, 0x0c, 0xb6, 0x24, 0x1e, 0x0f, 0x43, 0xff, 0x4c,
+	0x7d, 0x2f, 0x83, 0xb5, 0xa9, 0x8e, 0xe1, 0x36, 0x28, 0x27, 0x51, 0x66, 0x9c, 0x16, 0x3f, 0x33,
+	0x2e, 0x37, 0x2a, 0x22, 0x0d, 0xd1, 0x1f, 0xad, 0x9d, 0xf6, 0xe7, 0x00, 0xb1, 0x53, 0x0b, 0x70,
+	0x78, 0x2a, 0xc3, 0x7d, 0xb0, 0xe0, 0x50, 0x8c, 0x62, 0x5e, 0xea, 0x72, 0x43, 0x9f, 0x99, 0xfe,
+	0x68, 0xcc, 0x26, 0xf2, 0xdf, 0xfb, 0xcb, 0xca, 0x09, 0x52, 0x2a, 0x4e, 0xac, 0xc8, 0x77, 0xa6,
+	0xe2, 0x04, 0x50, 0x01, 0x0b, 0x14, 0x07, 0x64, 0xc8, 0x2b, 0xb6, 0x98, 0x6a, 0xf8, 0x77, 0xab,
+	0x0c, 0x16, 0x47, 0x25, 0x56, 0x3f, 0x4b, 0x60, 0x63, 0xea, 0x10, 0xb0, 0x88, 0x84, 0x0c, 0xc3,
+	0x36, 0x58, 0xbb, 0xd1, 0x01, 0x1b, 0x53, 0x4a, 0x68, 0xc6, 0x5a, 0x6e, 0x40, 0x11, 0x20, 0x8d,
+	0x1c, 0xed, 0x38, 0x9b, 0x50, 0x6b, 0x75, 0xb2, 0x37, 0x2f, 0x52, 0x38, 0x7c, 0x05, 0xfe, 0xa1,
+	0x98, 0x25, 0x7e, 0x2c, 0x86, 0xc4, 0x98, 0x3f, 0x24, 0xb7, 0xe3, 0xb2, 0x32, 0x0a, 0x4b, 0x50,
+	0xa9, 0xcf, 0x80, 0x32, 0x0b, 0x94, 0x8e, 0xc4, 0x94, 0x45, 0x98, 0xdc, 0x81, 0xc6, 0x8f, 0x12,
+	0x58, 0x2d, 0xda, 0x1e, 0x73, 0xdf, 0xf0, 0x8b, 0x04, 0x56, 0x6e, 0x2c, 0x18, 0x7c, 0x3a, 0x3f,
+	0xe2, 0xe9, 0x3b, 0x59, 0xf9, 0xd3, 0x36, 0xaa, 0x9d, 0x2b, 0x73, 0x32, 0xf8, 0x77, 0x5f, 0xbf,
+	0x7f, 0x90, 0x1f, 0x43, 0x3d, 0x3d, 0x56, 0xe7, 0x13, 0x9a, 0x5d, 0xb1, 0x8c, 0x4c, 0xaf, 0x8f,
+	0xae, 0x57, 0xd6, 0x43, 0xbd, 0x7e, 0x01, 0xaf, 0x25, 0xb0, 0x3a, 0xa5, 0xbd, 0x70, 0xe7, 0x2e,
+	0xd5, 0x17, 0xa7, 0xa1, 0xb2, 0x7b, 0x47, 0x6b, 0x3e, 0x53, 0x6a, 0xf7, 0xca, 0x5c, 0x2f, 0x9c,
+	0x96, 0x47, 0xe3, 0x85, 0xcf, 0xd2, 0xdc, 0x52, 0x1b, 0x69, 0x9a, 0xe3, 0xbc, 0xce, 0x0b, 0xe0,
+	0xdd, 0xfa, 0xc5, 0x64, 0x96, 0x46, 0x90, 0x79, 0x32, 0xa4, 0x7a, 0x65, 0xe3, 0xd2, 0x54, 0xc6,
+	0xd1, 0xe4, 0x52, 0xe4, 0x31, 0xcd, 0x21, 0x41, 0xeb, 0x97, 0x04, 0x36, 0x1d, 0x12, 0xcc, 0x8d,
+	0xbc, 0xa5, 0x4c, 0x99, 0x87, 0xa3, 0xf4, 0x02, 0x1c, 0x49, 0xaf, 0xf7, 0x72, 0xeb, 0x01, 0xf1,
+	0x51, 0x38, 0xd0, 0x08, 0x1d, 0xe8, 0x03, 0x1c, 0x66, 0xf7, 0x41, 0x1f, 0xfb, 0x9b, 0xfd, 0xff,
+	0xda, 0x16, 0xc2, 0x47, 0xb9, 0xd4, 0x31, 0xcd, 0x4f, 0x72, 0xb5, 0xc3, 0x09, 0x4d, 0x97, 0x69,
+	0x5c, 0x4c, 0xa5, 0x6e, 0x53, 0xcb, 0x1d, 0xb3, 0x4b, 0x01, 0xe9, 0x99, 0x2e, 0xeb, 0x8d, 0x20,
+	0xbd, 0x6e, 0xb3, 0x27, 0x20, 0xd7, 0xf2, 0x26, 0x7f, 0x37, 0x0c, 0xd3, 0x65, 0x86, 0x31, 0x02,
+	0x19, 0x46, 0xb7, 0x69, 0x18, 0x02, 0x76, 0xb2, 0x90, 0xc5, 0xd9, 0xfc, 0x1d, 0x00, 0x00, 0xff,
+	0xff, 0x53, 0x2c, 0xb0, 0x93, 0x66, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignFeedServiceClient is the client API for CampaignFeedService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignFeedServiceClient interface {
+	// Returns the requested campaign feed in full detail.
+	GetCampaignFeed(ctx context.Context, in *GetCampaignFeedRequest, opts ...grpc.CallOption) (*resources.CampaignFeed, error)
+	// Creates, updates, or removes campaign feeds. Operation statuses are
+	// returned.
+	MutateCampaignFeeds(ctx context.Context, in *MutateCampaignFeedsRequest, opts ...grpc.CallOption) (*MutateCampaignFeedsResponse, error)
+}
+
+type campaignFeedServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignFeedServiceClient(cc grpc.ClientConnInterface) CampaignFeedServiceClient {
+	return &campaignFeedServiceClient{cc}
+}
+
+func (c *campaignFeedServiceClient) GetCampaignFeed(ctx context.Context, in *GetCampaignFeedRequest, opts ...grpc.CallOption) (*resources.CampaignFeed, error) {
+	out := new(resources.CampaignFeed)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignFeedService/GetCampaignFeed", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignFeedServiceClient) MutateCampaignFeeds(ctx context.Context, in *MutateCampaignFeedsRequest, opts ...grpc.CallOption) (*MutateCampaignFeedsResponse, error) {
+	out := new(MutateCampaignFeedsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignFeedService/MutateCampaignFeeds", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignFeedServiceServer is the server API for CampaignFeedService service.
+type CampaignFeedServiceServer interface {
+	// Returns the requested campaign feed in full detail.
+	GetCampaignFeed(context.Context, *GetCampaignFeedRequest) (*resources.CampaignFeed, error)
+	// Creates, updates, or removes campaign feeds. Operation statuses are
+	// returned.
+	MutateCampaignFeeds(context.Context, *MutateCampaignFeedsRequest) (*MutateCampaignFeedsResponse, error)
+}
+
+// UnimplementedCampaignFeedServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignFeedServiceServer struct {
+}
+
+func (*UnimplementedCampaignFeedServiceServer) GetCampaignFeed(ctx context.Context, req *GetCampaignFeedRequest) (*resources.CampaignFeed, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaignFeed not implemented")
+}
+func (*UnimplementedCampaignFeedServiceServer) MutateCampaignFeeds(ctx context.Context, req *MutateCampaignFeedsRequest) (*MutateCampaignFeedsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaignFeeds not implemented")
+}
+
+func RegisterCampaignFeedServiceServer(s *grpc.Server, srv CampaignFeedServiceServer) {
+	s.RegisterService(&_CampaignFeedService_serviceDesc, srv)
+}
+
+func _CampaignFeedService_GetCampaignFeed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignFeedRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignFeedServiceServer).GetCampaignFeed(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignFeedService/GetCampaignFeed",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignFeedServiceServer).GetCampaignFeed(ctx, req.(*GetCampaignFeedRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignFeedService_MutateCampaignFeeds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignFeedsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignFeedServiceServer).MutateCampaignFeeds(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignFeedService/MutateCampaignFeeds",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignFeedServiceServer).MutateCampaignFeeds(ctx, req.(*MutateCampaignFeedsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignFeedService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignFeedService",
+	HandlerType: (*CampaignFeedServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignFeed",
+			Handler:    _CampaignFeedService_GetCampaignFeed_Handler,
+		},
+		{
+			MethodName: "MutateCampaignFeeds",
+			Handler:    _CampaignFeedService_MutateCampaignFeeds_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_feed_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_label_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_label_service.pb.go
new file mode 100644
index 0000000..48780ed
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_label_service.pb.go
@@ -0,0 +1,502 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_label_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignLabelService.GetCampaignLabel][google.ads.googleads.v3.services.CampaignLabelService.GetCampaignLabel].
+type GetCampaignLabelRequest struct {
+	// Required. The resource name of the campaign-label relationship to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignLabelRequest) Reset()         { *m = GetCampaignLabelRequest{} }
+func (m *GetCampaignLabelRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignLabelRequest) ProtoMessage()    {}
+func (*GetCampaignLabelRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37778cde3b4fe5c9, []int{0}
+}
+
+func (m *GetCampaignLabelRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignLabelRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignLabelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignLabelRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignLabelRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignLabelRequest.Merge(m, src)
+}
+func (m *GetCampaignLabelRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignLabelRequest.Size(m)
+}
+func (m *GetCampaignLabelRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignLabelRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignLabelRequest proto.InternalMessageInfo
+
+func (m *GetCampaignLabelRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignLabelService.MutateCampaignLabels][google.ads.googleads.v3.services.CampaignLabelService.MutateCampaignLabels].
+type MutateCampaignLabelsRequest struct {
+	// Required. ID of the customer whose campaign-label relationships are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on campaign-label relationships.
+	Operations []*CampaignLabelOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignLabelsRequest) Reset()         { *m = MutateCampaignLabelsRequest{} }
+func (m *MutateCampaignLabelsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignLabelsRequest) ProtoMessage()    {}
+func (*MutateCampaignLabelsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37778cde3b4fe5c9, []int{1}
+}
+
+func (m *MutateCampaignLabelsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignLabelsRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignLabelsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignLabelsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignLabelsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignLabelsRequest.Merge(m, src)
+}
+func (m *MutateCampaignLabelsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignLabelsRequest.Size(m)
+}
+func (m *MutateCampaignLabelsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignLabelsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignLabelsRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignLabelsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignLabelsRequest) GetOperations() []*CampaignLabelOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignLabelsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignLabelsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove) on a campaign-label relationship.
+type CampaignLabelOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignLabelOperation_Create
+	//	*CampaignLabelOperation_Remove
+	Operation            isCampaignLabelOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *CampaignLabelOperation) Reset()         { *m = CampaignLabelOperation{} }
+func (m *CampaignLabelOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignLabelOperation) ProtoMessage()    {}
+func (*CampaignLabelOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37778cde3b4fe5c9, []int{2}
+}
+
+func (m *CampaignLabelOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignLabelOperation.Unmarshal(m, b)
+}
+func (m *CampaignLabelOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignLabelOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignLabelOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignLabelOperation.Merge(m, src)
+}
+func (m *CampaignLabelOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignLabelOperation.Size(m)
+}
+func (m *CampaignLabelOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignLabelOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignLabelOperation proto.InternalMessageInfo
+
+type isCampaignLabelOperation_Operation interface {
+	isCampaignLabelOperation_Operation()
+}
+
+type CampaignLabelOperation_Create struct {
+	Create *resources.CampaignLabel `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CampaignLabelOperation_Remove struct {
+	Remove string `protobuf:"bytes,2,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignLabelOperation_Create) isCampaignLabelOperation_Operation() {}
+
+func (*CampaignLabelOperation_Remove) isCampaignLabelOperation_Operation() {}
+
+func (m *CampaignLabelOperation) GetOperation() isCampaignLabelOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignLabelOperation) GetCreate() *resources.CampaignLabel {
+	if x, ok := m.GetOperation().(*CampaignLabelOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CampaignLabelOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignLabelOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignLabelOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignLabelOperation_Create)(nil),
+		(*CampaignLabelOperation_Remove)(nil),
+	}
+}
+
+// Response message for a campaign labels mutate.
+type MutateCampaignLabelsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignLabelResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *MutateCampaignLabelsResponse) Reset()         { *m = MutateCampaignLabelsResponse{} }
+func (m *MutateCampaignLabelsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignLabelsResponse) ProtoMessage()    {}
+func (*MutateCampaignLabelsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37778cde3b4fe5c9, []int{3}
+}
+
+func (m *MutateCampaignLabelsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignLabelsResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignLabelsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignLabelsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignLabelsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignLabelsResponse.Merge(m, src)
+}
+func (m *MutateCampaignLabelsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignLabelsResponse.Size(m)
+}
+func (m *MutateCampaignLabelsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignLabelsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignLabelsResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignLabelsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignLabelsResponse) GetResults() []*MutateCampaignLabelResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for a campaign label mutate.
+type MutateCampaignLabelResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignLabelResult) Reset()         { *m = MutateCampaignLabelResult{} }
+func (m *MutateCampaignLabelResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignLabelResult) ProtoMessage()    {}
+func (*MutateCampaignLabelResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_37778cde3b4fe5c9, []int{4}
+}
+
+func (m *MutateCampaignLabelResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignLabelResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignLabelResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignLabelResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignLabelResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignLabelResult.Merge(m, src)
+}
+func (m *MutateCampaignLabelResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignLabelResult.Size(m)
+}
+func (m *MutateCampaignLabelResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignLabelResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignLabelResult proto.InternalMessageInfo
+
+func (m *MutateCampaignLabelResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignLabelRequest)(nil), "google.ads.googleads.v3.services.GetCampaignLabelRequest")
+	proto.RegisterType((*MutateCampaignLabelsRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignLabelsRequest")
+	proto.RegisterType((*CampaignLabelOperation)(nil), "google.ads.googleads.v3.services.CampaignLabelOperation")
+	proto.RegisterType((*MutateCampaignLabelsResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignLabelsResponse")
+	proto.RegisterType((*MutateCampaignLabelResult)(nil), "google.ads.googleads.v3.services.MutateCampaignLabelResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_label_service.proto", fileDescriptor_37778cde3b4fe5c9)
+}
+
+var fileDescriptor_37778cde3b4fe5c9 = []byte{
+	// 716 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcd, 0x6e, 0xd3, 0x4a,
+	0x14, 0xbe, 0x76, 0xae, 0x7a, 0x6f, 0x27, 0xed, 0xbd, 0x68, 0x28, 0x6d, 0x9a, 0x56, 0x22, 0x32,
+	0x95, 0x88, 0x22, 0x64, 0x57, 0x89, 0x84, 0x8a, 0xab, 0x20, 0x9c, 0x8a, 0xb6, 0x20, 0xa0, 0x95,
+	0x2b, 0x8a, 0x84, 0x82, 0xac, 0xa9, 0x3d, 0x35, 0x96, 0x6c, 0x8f, 0x99, 0x19, 0x47, 0xaa, 0xaa,
+	0x4a, 0x88, 0x2d, 0x4b, 0xde, 0x80, 0x25, 0xef, 0xc0, 0x03, 0xd0, 0x2d, 0xbb, 0xae, 0x58, 0xb0,
+	0x62, 0x81, 0xfa, 0x08, 0xc8, 0x3f, 0x93, 0xc4, 0x21, 0x51, 0x44, 0x77, 0xc7, 0xe7, 0xe7, 0x3b,
+	0xe7, 0x3b, 0x3f, 0x63, 0xd0, 0x76, 0x09, 0x71, 0x7d, 0xac, 0x21, 0x87, 0x69, 0x99, 0x98, 0x48,
+	0xbd, 0x96, 0xc6, 0x30, 0xed, 0x79, 0x36, 0x66, 0x9a, 0x8d, 0x82, 0x08, 0x79, 0x6e, 0x68, 0xf9,
+	0xe8, 0x08, 0xfb, 0x56, 0xae, 0x57, 0x23, 0x4a, 0x38, 0x81, 0xb5, 0x2c, 0x46, 0x45, 0x0e, 0x53,
+	0xfb, 0xe1, 0x6a, 0xaf, 0xa5, 0x8a, 0xf0, 0xea, 0xdd, 0x49, 0x09, 0x28, 0x66, 0x24, 0xa6, 0xbf,
+	0x67, 0xc8, 0x90, 0xab, 0xab, 0x22, 0x2e, 0xf2, 0x34, 0x14, 0x86, 0x84, 0x23, 0xee, 0x91, 0x90,
+	0xe5, 0xd6, 0xa5, 0x21, 0xab, 0xed, 0x7b, 0x38, 0xe4, 0xb9, 0xe1, 0xe6, 0x90, 0xe1, 0xd8, 0xc3,
+	0xbe, 0x63, 0x1d, 0xe1, 0xd7, 0xa8, 0xe7, 0x11, 0x3a, 0x12, 0x49, 0x23, 0x5b, 0x63, 0x1c, 0xf1,
+	0x38, 0x87, 0x54, 0xb6, 0xc0, 0xd2, 0x0e, 0xe6, 0x5b, 0x79, 0x2d, 0x4f, 0x92, 0x52, 0x4c, 0xfc,
+	0x26, 0xc6, 0x8c, 0xc3, 0x3a, 0x98, 0x17, 0xd5, 0x5a, 0x21, 0x0a, 0x70, 0x45, 0xaa, 0x49, 0xf5,
+	0xd9, 0x4e, 0xe9, 0x9b, 0x21, 0x9b, 0x73, 0xc2, 0xf2, 0x0c, 0x05, 0x58, 0xb9, 0x94, 0xc0, 0xca,
+	0xd3, 0x98, 0x23, 0x8e, 0x0b, 0x40, 0x4c, 0x20, 0xad, 0x81, 0xb2, 0x1d, 0x33, 0x4e, 0x02, 0x4c,
+	0x2d, 0xcf, 0x19, 0xc6, 0x01, 0x42, 0xff, 0xc8, 0x81, 0xaf, 0x00, 0x20, 0x11, 0xa6, 0x19, 0xe3,
+	0x8a, 0x5c, 0x2b, 0xd5, 0xcb, 0xcd, 0x0d, 0x75, 0x5a, 0xab, 0xd5, 0x42, 0xca, 0x3d, 0x01, 0x90,
+	0xc3, 0x0f, 0x00, 0xe1, 0x6d, 0xf0, 0x7f, 0x84, 0x28, 0xf7, 0x90, 0x6f, 0x1d, 0x23, 0xcf, 0x8f,
+	0x29, 0xae, 0x94, 0x6a, 0x52, 0xfd, 0x5f, 0xf3, 0xbf, 0x5c, 0xbd, 0x9d, 0x69, 0xe1, 0x2d, 0x30,
+	0xdf, 0x43, 0xbe, 0xe7, 0x20, 0x8e, 0x2d, 0x12, 0xfa, 0x27, 0x95, 0xbf, 0x53, 0xb7, 0x39, 0xa1,
+	0xdc, 0x0b, 0xfd, 0x13, 0xe5, 0xbd, 0x04, 0x16, 0xc7, 0x67, 0x86, 0x8f, 0xc1, 0x8c, 0x4d, 0x31,
+	0xe2, 0x59, 0xc3, 0xca, 0xcd, 0xf5, 0x89, 0x1c, 0xfa, 0xcb, 0x50, 0x24, 0xb1, 0xfb, 0x97, 0x99,
+	0x23, 0xc0, 0x0a, 0x98, 0xa1, 0x38, 0x20, 0x3d, 0x5c, 0x91, 0x93, 0xa6, 0x25, 0x96, 0xec, 0xbb,
+	0x53, 0x06, 0xb3, 0x7d, 0x72, 0xca, 0x67, 0x09, 0xac, 0x8e, 0x1f, 0x00, 0x8b, 0x48, 0xc8, 0x30,
+	0xdc, 0x06, 0x37, 0x46, 0xc8, 0x5b, 0x98, 0x52, 0x42, 0xd3, 0x16, 0x94, 0x9b, 0x50, 0x94, 0x48,
+	0x23, 0x5b, 0x3d, 0x48, 0xf7, 0xc3, 0xbc, 0x5e, 0x6c, 0xcb, 0xc3, 0xc4, 0x1d, 0x3e, 0x07, 0xff,
+	0x50, 0xcc, 0x62, 0x9f, 0x8b, 0x01, 0x6d, 0x4e, 0x1f, 0xd0, 0x98, 0xc2, 0xcc, 0x14, 0xc3, 0x14,
+	0x58, 0xca, 0x03, 0xb0, 0x3c, 0xd1, 0x2b, 0x99, 0xc7, 0x98, 0x3d, 0x2c, 0xae, 0x60, 0xf3, 0xb2,
+	0x04, 0x16, 0x0a, 0xc1, 0x07, 0x59, 0x7a, 0xf8, 0x45, 0x02, 0xd7, 0x46, 0x37, 0x1c, 0xde, 0x9b,
+	0x5e, 0xf5, 0x84, 0xab, 0xa8, 0xfe, 0xf1, 0x34, 0x95, 0xdd, 0x0b, 0xa3, 0x48, 0xe0, 0xdd, 0xd7,
+	0xef, 0x1f, 0xe4, 0x26, 0x5c, 0x4f, 0xde, 0x83, 0xd3, 0x82, 0xa5, 0x2d, 0xce, 0x81, 0x69, 0x8d,
+	0xfe, 0x03, 0x91, 0x8d, 0x52, 0x6b, 0x9c, 0xc1, 0x9f, 0x12, 0x58, 0x18, 0x37, 0x66, 0xd8, 0xbe,
+	0xd2, 0x14, 0xc4, 0x7d, 0x56, 0xef, 0x5f, 0x35, 0x3c, 0xdb, 0x2e, 0xe5, 0xc5, 0x85, 0xb1, 0x38,
+	0x74, 0xe0, 0x77, 0x06, 0x57, 0x97, 0x52, 0xdd, 0x50, 0x5a, 0x09, 0xd5, 0x01, 0xb7, 0xd3, 0x21,
+	0xe7, 0x76, 0xe3, 0x6c, 0x84, 0xa9, 0x1e, 0xa4, 0xb9, 0x74, 0xa9, 0x51, 0x5d, 0x39, 0x37, 0x2a,
+	0x83, 0x7a, 0x72, 0x29, 0xf2, 0x98, 0x6a, 0x93, 0xa0, 0xf3, 0x56, 0x06, 0x6b, 0x36, 0x09, 0xa6,
+	0xd6, 0xde, 0x59, 0x1e, 0xb7, 0x18, 0xfb, 0xc9, 0xf3, 0xb7, 0x2f, 0xbd, 0xdc, 0xcd, 0xc3, 0x5d,
+	0xe2, 0xa3, 0xd0, 0x55, 0x09, 0x75, 0x35, 0x17, 0x87, 0xe9, 0xe3, 0xa8, 0x0d, 0x12, 0x4e, 0xfe,
+	0x53, 0x6c, 0x0a, 0xe1, 0xa3, 0x5c, 0xda, 0x31, 0x8c, 0x4f, 0x72, 0x6d, 0x27, 0x03, 0x34, 0x1c,
+	0xa6, 0x66, 0x62, 0x22, 0x1d, 0xb6, 0xd4, 0x3c, 0x31, 0x3b, 0x17, 0x2e, 0x5d, 0xc3, 0x61, 0xdd,
+	0xbe, 0x4b, 0xf7, 0xb0, 0xd5, 0x15, 0x2e, 0x3f, 0xe4, 0xb5, 0x4c, 0xaf, 0xeb, 0x86, 0xc3, 0x74,
+	0xbd, 0xef, 0xa4, 0xeb, 0x87, 0x2d, 0x5d, 0x17, 0x6e, 0x47, 0x33, 0x69, 0x9d, 0xad, 0x5f, 0x01,
+	0x00, 0x00, 0xff, 0xff, 0xe9, 0xfc, 0x2e, 0xc6, 0xd0, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignLabelServiceClient is the client API for CampaignLabelService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignLabelServiceClient interface {
+	// Returns the requested campaign-label relationship in full detail.
+	GetCampaignLabel(ctx context.Context, in *GetCampaignLabelRequest, opts ...grpc.CallOption) (*resources.CampaignLabel, error)
+	// Creates and removes campaign-label relationships.
+	// Operation statuses are returned.
+	MutateCampaignLabels(ctx context.Context, in *MutateCampaignLabelsRequest, opts ...grpc.CallOption) (*MutateCampaignLabelsResponse, error)
+}
+
+type campaignLabelServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignLabelServiceClient(cc grpc.ClientConnInterface) CampaignLabelServiceClient {
+	return &campaignLabelServiceClient{cc}
+}
+
+func (c *campaignLabelServiceClient) GetCampaignLabel(ctx context.Context, in *GetCampaignLabelRequest, opts ...grpc.CallOption) (*resources.CampaignLabel, error) {
+	out := new(resources.CampaignLabel)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignLabelService/GetCampaignLabel", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignLabelServiceClient) MutateCampaignLabels(ctx context.Context, in *MutateCampaignLabelsRequest, opts ...grpc.CallOption) (*MutateCampaignLabelsResponse, error) {
+	out := new(MutateCampaignLabelsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignLabelService/MutateCampaignLabels", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignLabelServiceServer is the server API for CampaignLabelService service.
+type CampaignLabelServiceServer interface {
+	// Returns the requested campaign-label relationship in full detail.
+	GetCampaignLabel(context.Context, *GetCampaignLabelRequest) (*resources.CampaignLabel, error)
+	// Creates and removes campaign-label relationships.
+	// Operation statuses are returned.
+	MutateCampaignLabels(context.Context, *MutateCampaignLabelsRequest) (*MutateCampaignLabelsResponse, error)
+}
+
+// UnimplementedCampaignLabelServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignLabelServiceServer struct {
+}
+
+func (*UnimplementedCampaignLabelServiceServer) GetCampaignLabel(ctx context.Context, req *GetCampaignLabelRequest) (*resources.CampaignLabel, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaignLabel not implemented")
+}
+func (*UnimplementedCampaignLabelServiceServer) MutateCampaignLabels(ctx context.Context, req *MutateCampaignLabelsRequest) (*MutateCampaignLabelsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaignLabels not implemented")
+}
+
+func RegisterCampaignLabelServiceServer(s *grpc.Server, srv CampaignLabelServiceServer) {
+	s.RegisterService(&_CampaignLabelService_serviceDesc, srv)
+}
+
+func _CampaignLabelService_GetCampaignLabel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignLabelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignLabelServiceServer).GetCampaignLabel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignLabelService/GetCampaignLabel",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignLabelServiceServer).GetCampaignLabel(ctx, req.(*GetCampaignLabelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignLabelService_MutateCampaignLabels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignLabelsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignLabelServiceServer).MutateCampaignLabels(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignLabelService/MutateCampaignLabels",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignLabelServiceServer).MutateCampaignLabels(ctx, req.(*MutateCampaignLabelsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignLabelService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignLabelService",
+	HandlerType: (*CampaignLabelServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignLabel",
+			Handler:    _CampaignLabelService_GetCampaignLabel_Handler,
+		},
+		{
+			MethodName: "MutateCampaignLabels",
+			Handler:    _CampaignLabelService_MutateCampaignLabels_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_label_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_service.pb.go
new file mode 100644
index 0000000..589c7da
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_service.pb.go
@@ -0,0 +1,527 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignService.GetCampaign][google.ads.googleads.v3.services.CampaignService.GetCampaign].
+type GetCampaignRequest struct {
+	// Required. The resource name of the campaign to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignRequest) Reset()         { *m = GetCampaignRequest{} }
+func (m *GetCampaignRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignRequest) ProtoMessage()    {}
+func (*GetCampaignRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ae6454f925b0d531, []int{0}
+}
+
+func (m *GetCampaignRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignRequest.Merge(m, src)
+}
+func (m *GetCampaignRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignRequest.Size(m)
+}
+func (m *GetCampaignRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignRequest proto.InternalMessageInfo
+
+func (m *GetCampaignRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignService.MutateCampaigns][google.ads.googleads.v3.services.CampaignService.MutateCampaigns].
+type MutateCampaignsRequest struct {
+	// Required. The ID of the customer whose campaigns are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual campaigns.
+	Operations []*CampaignOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignsRequest) Reset()         { *m = MutateCampaignsRequest{} }
+func (m *MutateCampaignsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignsRequest) ProtoMessage()    {}
+func (*MutateCampaignsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ae6454f925b0d531, []int{1}
+}
+
+func (m *MutateCampaignsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignsRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignsRequest.Merge(m, src)
+}
+func (m *MutateCampaignsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignsRequest.Size(m)
+}
+func (m *MutateCampaignsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignsRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignsRequest) GetOperations() []*CampaignOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a campaign.
+type CampaignOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignOperation_Create
+	//	*CampaignOperation_Update
+	//	*CampaignOperation_Remove
+	Operation            isCampaignOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *CampaignOperation) Reset()         { *m = CampaignOperation{} }
+func (m *CampaignOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignOperation) ProtoMessage()    {}
+func (*CampaignOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ae6454f925b0d531, []int{2}
+}
+
+func (m *CampaignOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignOperation.Unmarshal(m, b)
+}
+func (m *CampaignOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignOperation.Merge(m, src)
+}
+func (m *CampaignOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignOperation.Size(m)
+}
+func (m *CampaignOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignOperation proto.InternalMessageInfo
+
+func (m *CampaignOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCampaignOperation_Operation interface {
+	isCampaignOperation_Operation()
+}
+
+type CampaignOperation_Create struct {
+	Create *resources.Campaign `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CampaignOperation_Update struct {
+	Update *resources.Campaign `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type CampaignOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignOperation_Create) isCampaignOperation_Operation() {}
+
+func (*CampaignOperation_Update) isCampaignOperation_Operation() {}
+
+func (*CampaignOperation_Remove) isCampaignOperation_Operation() {}
+
+func (m *CampaignOperation) GetOperation() isCampaignOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignOperation) GetCreate() *resources.Campaign {
+	if x, ok := m.GetOperation().(*CampaignOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CampaignOperation) GetUpdate() *resources.Campaign {
+	if x, ok := m.GetOperation().(*CampaignOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CampaignOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignOperation_Create)(nil),
+		(*CampaignOperation_Update)(nil),
+		(*CampaignOperation_Remove)(nil),
+	}
+}
+
+// Response message for campaign mutate.
+type MutateCampaignsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *MutateCampaignsResponse) Reset()         { *m = MutateCampaignsResponse{} }
+func (m *MutateCampaignsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignsResponse) ProtoMessage()    {}
+func (*MutateCampaignsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ae6454f925b0d531, []int{3}
+}
+
+func (m *MutateCampaignsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignsResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignsResponse.Merge(m, src)
+}
+func (m *MutateCampaignsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignsResponse.Size(m)
+}
+func (m *MutateCampaignsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignsResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignsResponse) GetResults() []*MutateCampaignResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the campaign mutate.
+type MutateCampaignResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignResult) Reset()         { *m = MutateCampaignResult{} }
+func (m *MutateCampaignResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignResult) ProtoMessage()    {}
+func (*MutateCampaignResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ae6454f925b0d531, []int{4}
+}
+
+func (m *MutateCampaignResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignResult.Merge(m, src)
+}
+func (m *MutateCampaignResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignResult.Size(m)
+}
+func (m *MutateCampaignResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignResult proto.InternalMessageInfo
+
+func (m *MutateCampaignResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignRequest)(nil), "google.ads.googleads.v3.services.GetCampaignRequest")
+	proto.RegisterType((*MutateCampaignsRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignsRequest")
+	proto.RegisterType((*CampaignOperation)(nil), "google.ads.googleads.v3.services.CampaignOperation")
+	proto.RegisterType((*MutateCampaignsResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignsResponse")
+	proto.RegisterType((*MutateCampaignResult)(nil), "google.ads.googleads.v3.services.MutateCampaignResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_service.proto", fileDescriptor_ae6454f925b0d531)
+}
+
+var fileDescriptor_ae6454f925b0d531 = []byte{
+	// 750 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4d, 0x6b, 0xd4, 0x4e,
+	0x18, 0xff, 0x27, 0xfb, 0xa7, 0xda, 0x49, 0x6b, 0x71, 0xac, 0xed, 0xb2, 0x0a, 0x2e, 0xb1, 0xe0,
+	0xb2, 0xd5, 0x44, 0x36, 0xe2, 0x4b, 0x4a, 0x85, 0x6c, 0xe9, 0x8b, 0x87, 0xda, 0x92, 0x42, 0x11,
+	0x59, 0x58, 0xa6, 0xc9, 0x74, 0x0d, 0x4d, 0x32, 0x71, 0x66, 0xb2, 0x50, 0x4a, 0x2f, 0x82, 0x9f,
+	0xc0, 0x6f, 0xe0, 0xd1, 0xab, 0xf8, 0x09, 0xbc, 0xf5, 0xea, 0xad, 0x27, 0x0f, 0xe2, 0xc1, 0xaf,
+	0xe0, 0x45, 0x92, 0xc9, 0xec, 0x5b, 0x5b, 0x96, 0xf6, 0xf6, 0xec, 0x3c, 0xbf, 0xdf, 0xef, 0x79,
+	0xcf, 0x82, 0x67, 0x1d, 0x42, 0x3a, 0x21, 0x36, 0x91, 0xcf, 0x4c, 0x61, 0x66, 0x56, 0xd7, 0x32,
+	0x19, 0xa6, 0xdd, 0xc0, 0xc3, 0xcc, 0xf4, 0x50, 0x94, 0xa0, 0xa0, 0x13, 0xb7, 0x8b, 0x17, 0x23,
+	0xa1, 0x84, 0x13, 0x58, 0x15, 0x68, 0x03, 0xf9, 0xcc, 0xe8, 0x11, 0x8d, 0xae, 0x65, 0x48, 0x62,
+	0xe5, 0xf1, 0x45, 0xd2, 0x14, 0x33, 0x92, 0xd2, 0x41, 0x6d, 0xa1, 0x59, 0xb9, 0x2b, 0x19, 0x49,
+	0x60, 0xa2, 0x38, 0x26, 0x1c, 0xf1, 0x80, 0xc4, 0xac, 0xf0, 0xce, 0x0f, 0x78, 0xbd, 0x30, 0xc0,
+	0x31, 0x2f, 0x1c, 0xf7, 0x06, 0x1c, 0xfb, 0x01, 0x0e, 0xfd, 0xf6, 0x1e, 0x7e, 0x87, 0xba, 0x01,
+	0xa1, 0x05, 0xa0, 0xc8, 0xd5, 0xcc, 0x7f, 0xed, 0xa5, 0xfb, 0x05, 0x2a, 0x42, 0xec, 0x60, 0x44,
+	0x9b, 0x26, 0x9e, 0xc9, 0x38, 0xe2, 0x69, 0x11, 0x54, 0x7f, 0x09, 0xe0, 0x3a, 0xe6, 0x2b, 0x45,
+	0x9e, 0x2e, 0x7e, 0x9f, 0x62, 0xc6, 0x61, 0x0d, 0x4c, 0xcb, 0x22, 0xda, 0x31, 0x8a, 0x70, 0x59,
+	0xa9, 0x2a, 0xb5, 0xc9, 0x66, 0xe9, 0xa7, 0xa3, 0xba, 0x53, 0xd2, 0xf3, 0x1a, 0x45, 0x58, 0xff,
+	0xad, 0x80, 0xb9, 0xcd, 0x94, 0x23, 0x8e, 0xa5, 0x06, 0x93, 0x22, 0x0b, 0x40, 0xf3, 0x52, 0xc6,
+	0x49, 0x84, 0x69, 0x3b, 0xf0, 0x07, 0x25, 0x80, 0x7c, 0x7f, 0xe5, 0xc3, 0x37, 0x00, 0x90, 0x04,
+	0x53, 0xd1, 0x89, 0xb2, 0x5a, 0x2d, 0xd5, 0xb4, 0x86, 0x65, 0x8c, 0x6b, 0xbe, 0x21, 0xa3, 0x6d,
+	0x49, 0x6e, 0xa1, 0xdc, 0xd7, 0x82, 0x0f, 0xc0, 0x4c, 0x82, 0x28, 0x0f, 0x50, 0xd8, 0xde, 0x47,
+	0x41, 0x98, 0x52, 0x5c, 0x2e, 0x55, 0x95, 0xda, 0x75, 0xf7, 0x46, 0xf1, 0xbc, 0x26, 0x5e, 0xe1,
+	0x7d, 0x30, 0xdd, 0x45, 0x61, 0xe0, 0x23, 0x8e, 0xdb, 0x24, 0x0e, 0x0f, 0xcb, 0xff, 0xe7, 0xb0,
+	0x29, 0xf9, 0xb8, 0x15, 0x87, 0x87, 0xfa, 0x47, 0x15, 0xdc, 0x3c, 0x13, 0x14, 0x2e, 0x01, 0x2d,
+	0x4d, 0x72, 0x62, 0xd6, 0xec, 0x9c, 0xa8, 0x35, 0x2a, 0x32, 0x7d, 0x39, 0x0f, 0x63, 0x2d, 0x9b,
+	0xc7, 0x26, 0x62, 0x07, 0x2e, 0x10, 0xf0, 0xcc, 0x86, 0xab, 0x60, 0xc2, 0xa3, 0x18, 0x71, 0xd1,
+	0x5e, 0xad, 0xb1, 0x78, 0x61, 0xd9, 0xbd, 0x8d, 0xea, 0xd5, 0xbd, 0xf1, 0x9f, 0x5b, 0x90, 0x33,
+	0x19, 0x21, 0x5a, 0x56, 0xaf, 0x24, 0x23, 0xc8, 0xb0, 0x0c, 0x26, 0x28, 0x8e, 0x48, 0x57, 0x74,
+	0x69, 0x32, 0xf3, 0x88, 0xdf, 0x4d, 0x0d, 0x4c, 0xf6, 0xda, 0xaa, 0x7f, 0x55, 0xc0, 0xfc, 0x99,
+	0x81, 0xb3, 0x84, 0xc4, 0x0c, 0xc3, 0x35, 0x70, 0x7b, 0xa4, 0xe3, 0x6d, 0x4c, 0x29, 0xa1, 0xb9,
+	0xa2, 0xd6, 0x80, 0x32, 0x31, 0x9a, 0x78, 0xc6, 0x4e, 0xbe, 0x85, 0xee, 0xad, 0xe1, 0x59, 0xac,
+	0x66, 0x70, 0xb8, 0x0d, 0xae, 0x51, 0xcc, 0xd2, 0x90, 0xcb, 0x85, 0x78, 0x3a, 0x7e, 0x21, 0x86,
+	0x73, 0x72, 0x73, 0xba, 0x2b, 0x65, 0xf4, 0x25, 0x30, 0x7b, 0x1e, 0x20, 0x1b, 0xfd, 0x39, 0x8b,
+	0x3e, 0xbc, 0xe3, 0x8d, 0xef, 0x25, 0x30, 0x23, 0x79, 0x3b, 0x22, 0x1e, 0xfc, 0xa6, 0x00, 0x6d,
+	0xe0, 0x70, 0xe0, 0x93, 0xf1, 0x19, 0x9e, 0xbd, 0xb3, 0xca, 0x65, 0x46, 0xa5, 0xaf, 0x9c, 0x3a,
+	0xc3, 0xc9, 0x7e, 0xf8, 0xf1, 0xeb, 0x93, 0xfa, 0x08, 0x2e, 0x66, 0xdf, 0x9c, 0xa3, 0x21, 0xcf,
+	0xb2, 0x3c, 0x30, 0x66, 0xd6, 0x7b, 0x1f, 0x21, 0x66, 0xd6, 0x8f, 0xe1, 0xa9, 0x02, 0x66, 0x46,
+	0xc6, 0x07, 0x9f, 0x5f, 0xb6, 0xbb, 0xf2, 0xc4, 0x2b, 0x2f, 0xae, 0xc0, 0x14, 0xbb, 0xa2, 0xbb,
+	0xa7, 0xce, 0xdc, 0xc0, 0xe7, 0xe1, 0x61, 0xff, 0x70, 0xf3, 0xb2, 0x2c, 0xdd, 0xc8, 0xca, 0xea,
+	0xd7, 0x71, 0x34, 0x00, 0x5e, 0xae, 0x1f, 0xf7, 0xab, 0xb2, 0xa3, 0x3c, 0x82, 0xad, 0xd4, 0x2b,
+	0x77, 0x4e, 0x9c, 0x72, 0x3f, 0x8b, 0xc2, 0x4a, 0x02, 0x66, 0x78, 0x24, 0x6a, 0xfe, 0x55, 0xc0,
+	0x82, 0x47, 0xa2, 0xb1, 0x19, 0x37, 0x67, 0x47, 0x66, 0xbd, 0x9d, 0x5d, 0xf1, 0xb6, 0xf2, 0x76,
+	0xa3, 0x60, 0x76, 0x48, 0x88, 0xe2, 0x8e, 0x41, 0x68, 0xc7, 0xec, 0xe0, 0x38, 0xbf, 0x71, 0xb3,
+	0x1f, 0xeb, 0xe2, 0x7f, 0x9a, 0x25, 0x69, 0x7c, 0x56, 0x4b, 0xeb, 0x8e, 0xf3, 0x45, 0xad, 0xae,
+	0x0b, 0x41, 0xc7, 0x67, 0x86, 0x30, 0x33, 0x6b, 0xd7, 0x32, 0x8a, 0xc0, 0xec, 0x44, 0x42, 0x5a,
+	0x8e, 0xcf, 0x5a, 0x3d, 0x48, 0x6b, 0xd7, 0x6a, 0x49, 0xc8, 0x1f, 0x75, 0x41, 0xbc, 0xdb, 0xb6,
+	0xe3, 0x33, 0xdb, 0xee, 0x81, 0x6c, 0x7b, 0xd7, 0xb2, 0x6d, 0x09, 0xdb, 0x9b, 0xc8, 0xf3, 0xb4,
+	0xfe, 0x05, 0x00, 0x00, 0xff, 0xff, 0x6c, 0xae, 0xd1, 0x44, 0x10, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignServiceClient is the client API for CampaignService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignServiceClient interface {
+	// Returns the requested campaign in full detail.
+	GetCampaign(ctx context.Context, in *GetCampaignRequest, opts ...grpc.CallOption) (*resources.Campaign, error)
+	// Creates, updates, or removes campaigns. Operation statuses are returned.
+	MutateCampaigns(ctx context.Context, in *MutateCampaignsRequest, opts ...grpc.CallOption) (*MutateCampaignsResponse, error)
+}
+
+type campaignServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignServiceClient(cc grpc.ClientConnInterface) CampaignServiceClient {
+	return &campaignServiceClient{cc}
+}
+
+func (c *campaignServiceClient) GetCampaign(ctx context.Context, in *GetCampaignRequest, opts ...grpc.CallOption) (*resources.Campaign, error) {
+	out := new(resources.Campaign)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignService/GetCampaign", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignServiceClient) MutateCampaigns(ctx context.Context, in *MutateCampaignsRequest, opts ...grpc.CallOption) (*MutateCampaignsResponse, error) {
+	out := new(MutateCampaignsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignService/MutateCampaigns", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignServiceServer is the server API for CampaignService service.
+type CampaignServiceServer interface {
+	// Returns the requested campaign in full detail.
+	GetCampaign(context.Context, *GetCampaignRequest) (*resources.Campaign, error)
+	// Creates, updates, or removes campaigns. Operation statuses are returned.
+	MutateCampaigns(context.Context, *MutateCampaignsRequest) (*MutateCampaignsResponse, error)
+}
+
+// UnimplementedCampaignServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignServiceServer struct {
+}
+
+func (*UnimplementedCampaignServiceServer) GetCampaign(ctx context.Context, req *GetCampaignRequest) (*resources.Campaign, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaign not implemented")
+}
+func (*UnimplementedCampaignServiceServer) MutateCampaigns(ctx context.Context, req *MutateCampaignsRequest) (*MutateCampaignsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaigns not implemented")
+}
+
+func RegisterCampaignServiceServer(s *grpc.Server, srv CampaignServiceServer) {
+	s.RegisterService(&_CampaignService_serviceDesc, srv)
+}
+
+func _CampaignService_GetCampaign_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignServiceServer).GetCampaign(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignService/GetCampaign",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignServiceServer).GetCampaign(ctx, req.(*GetCampaignRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignService_MutateCampaigns_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignServiceServer).MutateCampaigns(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignService/MutateCampaigns",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignServiceServer).MutateCampaigns(ctx, req.(*MutateCampaignsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignService",
+	HandlerType: (*CampaignServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaign",
+			Handler:    _CampaignService_GetCampaign_Handler,
+		},
+		{
+			MethodName: "MutateCampaigns",
+			Handler:    _CampaignService_MutateCampaigns_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/campaign_shared_set_service.pb.go b/googleapis/ads/googleads/v3/services/campaign_shared_set_service.pb.go
new file mode 100644
index 0000000..6a5aeff
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/campaign_shared_set_service.pb.go
@@ -0,0 +1,500 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/campaign_shared_set_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CampaignSharedSetService.GetCampaignSharedSet][google.ads.googleads.v3.services.CampaignSharedSetService.GetCampaignSharedSet].
+type GetCampaignSharedSetRequest struct {
+	// Required. The resource name of the campaign shared set to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCampaignSharedSetRequest) Reset()         { *m = GetCampaignSharedSetRequest{} }
+func (m *GetCampaignSharedSetRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCampaignSharedSetRequest) ProtoMessage()    {}
+func (*GetCampaignSharedSetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f69153fae607b70e, []int{0}
+}
+
+func (m *GetCampaignSharedSetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCampaignSharedSetRequest.Unmarshal(m, b)
+}
+func (m *GetCampaignSharedSetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCampaignSharedSetRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCampaignSharedSetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCampaignSharedSetRequest.Merge(m, src)
+}
+func (m *GetCampaignSharedSetRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCampaignSharedSetRequest.Size(m)
+}
+func (m *GetCampaignSharedSetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCampaignSharedSetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCampaignSharedSetRequest proto.InternalMessageInfo
+
+func (m *GetCampaignSharedSetRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CampaignSharedSetService.MutateCampaignSharedSets][google.ads.googleads.v3.services.CampaignSharedSetService.MutateCampaignSharedSets].
+type MutateCampaignSharedSetsRequest struct {
+	// Required. The ID of the customer whose campaign shared sets are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual campaign shared sets.
+	Operations []*CampaignSharedSetOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignSharedSetsRequest) Reset()         { *m = MutateCampaignSharedSetsRequest{} }
+func (m *MutateCampaignSharedSetsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignSharedSetsRequest) ProtoMessage()    {}
+func (*MutateCampaignSharedSetsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f69153fae607b70e, []int{1}
+}
+
+func (m *MutateCampaignSharedSetsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignSharedSetsRequest.Unmarshal(m, b)
+}
+func (m *MutateCampaignSharedSetsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignSharedSetsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignSharedSetsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignSharedSetsRequest.Merge(m, src)
+}
+func (m *MutateCampaignSharedSetsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignSharedSetsRequest.Size(m)
+}
+func (m *MutateCampaignSharedSetsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignSharedSetsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignSharedSetsRequest proto.InternalMessageInfo
+
+func (m *MutateCampaignSharedSetsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCampaignSharedSetsRequest) GetOperations() []*CampaignSharedSetOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCampaignSharedSetsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCampaignSharedSetsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove) on an campaign shared set.
+type CampaignSharedSetOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CampaignSharedSetOperation_Create
+	//	*CampaignSharedSetOperation_Remove
+	Operation            isCampaignSharedSetOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *CampaignSharedSetOperation) Reset()         { *m = CampaignSharedSetOperation{} }
+func (m *CampaignSharedSetOperation) String() string { return proto.CompactTextString(m) }
+func (*CampaignSharedSetOperation) ProtoMessage()    {}
+func (*CampaignSharedSetOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f69153fae607b70e, []int{2}
+}
+
+func (m *CampaignSharedSetOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignSharedSetOperation.Unmarshal(m, b)
+}
+func (m *CampaignSharedSetOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignSharedSetOperation.Marshal(b, m, deterministic)
+}
+func (m *CampaignSharedSetOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignSharedSetOperation.Merge(m, src)
+}
+func (m *CampaignSharedSetOperation) XXX_Size() int {
+	return xxx_messageInfo_CampaignSharedSetOperation.Size(m)
+}
+func (m *CampaignSharedSetOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignSharedSetOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignSharedSetOperation proto.InternalMessageInfo
+
+type isCampaignSharedSetOperation_Operation interface {
+	isCampaignSharedSetOperation_Operation()
+}
+
+type CampaignSharedSetOperation_Create struct {
+	Create *resources.CampaignSharedSet `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CampaignSharedSetOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CampaignSharedSetOperation_Create) isCampaignSharedSetOperation_Operation() {}
+
+func (*CampaignSharedSetOperation_Remove) isCampaignSharedSetOperation_Operation() {}
+
+func (m *CampaignSharedSetOperation) GetOperation() isCampaignSharedSetOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CampaignSharedSetOperation) GetCreate() *resources.CampaignSharedSet {
+	if x, ok := m.GetOperation().(*CampaignSharedSetOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CampaignSharedSetOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CampaignSharedSetOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CampaignSharedSetOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CampaignSharedSetOperation_Create)(nil),
+		(*CampaignSharedSetOperation_Remove)(nil),
+	}
+}
+
+// Response message for a campaign shared set mutate.
+type MutateCampaignSharedSetsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCampaignSharedSetResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *MutateCampaignSharedSetsResponse) Reset()         { *m = MutateCampaignSharedSetsResponse{} }
+func (m *MutateCampaignSharedSetsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignSharedSetsResponse) ProtoMessage()    {}
+func (*MutateCampaignSharedSetsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f69153fae607b70e, []int{3}
+}
+
+func (m *MutateCampaignSharedSetsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignSharedSetsResponse.Unmarshal(m, b)
+}
+func (m *MutateCampaignSharedSetsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignSharedSetsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignSharedSetsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignSharedSetsResponse.Merge(m, src)
+}
+func (m *MutateCampaignSharedSetsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignSharedSetsResponse.Size(m)
+}
+func (m *MutateCampaignSharedSetsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignSharedSetsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignSharedSetsResponse proto.InternalMessageInfo
+
+func (m *MutateCampaignSharedSetsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCampaignSharedSetsResponse) GetResults() []*MutateCampaignSharedSetResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the campaign shared set mutate.
+type MutateCampaignSharedSetResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCampaignSharedSetResult) Reset()         { *m = MutateCampaignSharedSetResult{} }
+func (m *MutateCampaignSharedSetResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCampaignSharedSetResult) ProtoMessage()    {}
+func (*MutateCampaignSharedSetResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f69153fae607b70e, []int{4}
+}
+
+func (m *MutateCampaignSharedSetResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCampaignSharedSetResult.Unmarshal(m, b)
+}
+func (m *MutateCampaignSharedSetResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCampaignSharedSetResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCampaignSharedSetResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCampaignSharedSetResult.Merge(m, src)
+}
+func (m *MutateCampaignSharedSetResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCampaignSharedSetResult.Size(m)
+}
+func (m *MutateCampaignSharedSetResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCampaignSharedSetResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCampaignSharedSetResult proto.InternalMessageInfo
+
+func (m *MutateCampaignSharedSetResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCampaignSharedSetRequest)(nil), "google.ads.googleads.v3.services.GetCampaignSharedSetRequest")
+	proto.RegisterType((*MutateCampaignSharedSetsRequest)(nil), "google.ads.googleads.v3.services.MutateCampaignSharedSetsRequest")
+	proto.RegisterType((*CampaignSharedSetOperation)(nil), "google.ads.googleads.v3.services.CampaignSharedSetOperation")
+	proto.RegisterType((*MutateCampaignSharedSetsResponse)(nil), "google.ads.googleads.v3.services.MutateCampaignSharedSetsResponse")
+	proto.RegisterType((*MutateCampaignSharedSetResult)(nil), "google.ads.googleads.v3.services.MutateCampaignSharedSetResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/campaign_shared_set_service.proto", fileDescriptor_f69153fae607b70e)
+}
+
+var fileDescriptor_f69153fae607b70e = []byte{
+	// 717 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcb, 0x6a, 0xdb, 0x4c,
+	0x14, 0xfe, 0x65, 0x87, 0xfc, 0x7f, 0xc6, 0xc9, 0x5f, 0x98, 0xde, 0x84, 0xd3, 0x10, 0xa3, 0x06,
+	0x6a, 0x4c, 0x91, 0xc0, 0x0e, 0x2d, 0x28, 0x09, 0x45, 0x6e, 0x1b, 0xa7, 0xd0, 0x26, 0x41, 0x86,
+	0x40, 0x5b, 0x83, 0x98, 0x48, 0x13, 0x45, 0x20, 0x69, 0xd4, 0x99, 0x91, 0x21, 0x84, 0x6c, 0x4a,
+	0xdf, 0x20, 0x7d, 0x82, 0x2e, 0xfb, 0x1e, 0xdd, 0x64, 0xdb, 0x55, 0xb3, 0xea, 0xa2, 0xab, 0x3e,
+	0x41, 0x57, 0xa5, 0xe8, 0x32, 0xbe, 0xc4, 0x51, 0x0c, 0xe9, 0xee, 0x68, 0xce, 0x99, 0xef, 0x7c,
+	0xdf, 0x9c, 0x8b, 0x40, 0xdb, 0x25, 0xc4, 0xf5, 0xb1, 0x86, 0x1c, 0xa6, 0x65, 0x66, 0x62, 0xf5,
+	0x5b, 0x1a, 0xc3, 0xb4, 0xef, 0xd9, 0x98, 0x69, 0x36, 0x0a, 0x22, 0xe4, 0xb9, 0xa1, 0xc5, 0x0e,
+	0x11, 0xc5, 0x8e, 0xc5, 0x30, 0xb7, 0x72, 0xa7, 0x1a, 0x51, 0xc2, 0x09, 0xac, 0x65, 0x17, 0x55,
+	0xe4, 0x30, 0x75, 0x80, 0xa1, 0xf6, 0x5b, 0xaa, 0xc0, 0xa8, 0xae, 0x15, 0x65, 0xa1, 0x98, 0x91,
+	0x98, 0x16, 0xa4, 0xc9, 0xe0, 0xab, 0xf7, 0xc4, 0xe5, 0xc8, 0xd3, 0x50, 0x18, 0x12, 0x8e, 0xb8,
+	0x47, 0x42, 0x96, 0x7b, 0xef, 0x8e, 0x78, 0x6d, 0xdf, 0xc3, 0xa1, 0xb8, 0xb6, 0x3c, 0xe2, 0x38,
+	0xf0, 0xb0, 0xef, 0x58, 0xfb, 0xf8, 0x10, 0xf5, 0x3d, 0x42, 0x2f, 0xdc, 0xa4, 0x91, 0xad, 0x31,
+	0x8e, 0x78, 0x9c, 0x43, 0x2a, 0x1d, 0xb0, 0xd8, 0xc1, 0xfc, 0x69, 0x4e, 0xa8, 0x9b, 0xf2, 0xe9,
+	0x62, 0x6e, 0xe2, 0x77, 0x31, 0x66, 0x1c, 0xd6, 0xc1, 0x82, 0xa0, 0x6d, 0x85, 0x28, 0xc0, 0xb2,
+	0x54, 0x93, 0xea, 0x73, 0xed, 0xf2, 0x77, 0xa3, 0x64, 0xce, 0x0b, 0xcf, 0x36, 0x0a, 0xb0, 0xf2,
+	0x4b, 0x02, 0xcb, 0xaf, 0x62, 0x8e, 0x38, 0x9e, 0x00, 0x63, 0x02, 0x6d, 0x05, 0x54, 0xec, 0x98,
+	0x71, 0x12, 0x60, 0x6a, 0x79, 0xce, 0x28, 0x16, 0x10, 0xe7, 0x2f, 0x1c, 0x88, 0x00, 0x20, 0x11,
+	0xa6, 0x99, 0x72, 0xb9, 0x54, 0x2b, 0xd7, 0x2b, 0xcd, 0x75, 0x75, 0xda, 0xbb, 0xab, 0x13, 0x69,
+	0x77, 0x04, 0x48, 0x9e, 0x62, 0x08, 0x0a, 0x1f, 0x80, 0x1b, 0x11, 0xa2, 0xdc, 0x43, 0xbe, 0x75,
+	0x80, 0x3c, 0x3f, 0xa6, 0x58, 0x2e, 0xd7, 0xa4, 0xfa, 0x7f, 0xe6, 0xff, 0xf9, 0xf1, 0x66, 0x76,
+	0x0a, 0xef, 0x83, 0x85, 0x3e, 0xf2, 0x3d, 0x07, 0x71, 0x6c, 0x91, 0xd0, 0x3f, 0x92, 0x67, 0xd2,
+	0xb0, 0x79, 0x71, 0xb8, 0x13, 0xfa, 0x47, 0xca, 0xa9, 0x04, 0xaa, 0xc5, 0xd9, 0xe1, 0x36, 0x98,
+	0xb5, 0x29, 0x46, 0x3c, 0x7b, 0xbc, 0x4a, 0x73, 0xb5, 0x50, 0xcb, 0xa0, 0x43, 0x26, 0xc5, 0x6c,
+	0xfd, 0x63, 0xe6, 0x28, 0x50, 0x06, 0xb3, 0x14, 0x07, 0xa4, 0x9f, 0x71, 0x9e, 0x4b, 0x3c, 0xd9,
+	0x77, 0xbb, 0x02, 0xe6, 0x06, 0x22, 0x95, 0x2f, 0x12, 0xa8, 0x15, 0x17, 0x84, 0x45, 0x24, 0x64,
+	0x18, 0x6e, 0x82, 0xdb, 0x17, 0x1e, 0xc2, 0xc2, 0x94, 0x12, 0x9a, 0x42, 0x57, 0x9a, 0x50, 0x50,
+	0xa5, 0x91, 0xad, 0x76, 0xd3, 0xbe, 0x31, 0x6f, 0x8e, 0x3f, 0xd1, 0xf3, 0x24, 0x1c, 0xbe, 0x06,
+	0xff, 0x52, 0xcc, 0x62, 0x9f, 0x8b, 0x82, 0x3d, 0x99, 0x5e, 0xb0, 0x02, 0x72, 0x66, 0x8a, 0x63,
+	0x0a, 0x3c, 0xe5, 0x19, 0x58, 0xba, 0x32, 0x32, 0xa9, 0xd1, 0x25, 0x3d, 0x3a, 0xde, 0x9e, 0xcd,
+	0x8f, 0x33, 0x40, 0x9e, 0x00, 0xe8, 0x66, 0x54, 0xe0, 0x37, 0x09, 0xdc, 0xba, 0x6c, 0x0a, 0xe0,
+	0xc6, 0x74, 0x15, 0x57, 0x4c, 0x4f, 0xf5, 0x5a, 0x95, 0x56, 0x5e, 0x9e, 0x1b, 0xe3, 0x82, 0xde,
+	0x7f, 0xfd, 0x71, 0x5a, 0x7a, 0x04, 0x57, 0x93, 0x25, 0x72, 0x3c, 0xe6, 0xd9, 0x10, 0x63, 0xc3,
+	0xb4, 0xc6, 0x60, 0xab, 0x0c, 0xcb, 0xac, 0x35, 0x4e, 0xe0, 0x6f, 0x09, 0xc8, 0x45, 0x6d, 0x00,
+	0x8d, 0x6b, 0x57, 0x49, 0xcc, 0x74, 0xb5, 0xfd, 0x37, 0x10, 0x59, 0x17, 0x2a, 0x6f, 0xcf, 0x8d,
+	0x3b, 0x23, 0x8b, 0xe1, 0xe1, 0x70, 0x52, 0x53, 0xe9, 0xeb, 0xca, 0xe3, 0x44, 0xfa, 0x50, 0xeb,
+	0xf1, 0x48, 0xf0, 0x46, 0xe3, 0xe4, 0x12, 0xe5, 0x7a, 0x90, 0xe6, 0xd4, 0xa5, 0x46, 0x75, 0xf1,
+	0xcc, 0x90, 0x87, 0xbc, 0x72, 0x2b, 0xf2, 0x98, 0x6a, 0x93, 0xa0, 0xfd, 0xa1, 0x04, 0x56, 0x6c,
+	0x12, 0x4c, 0xd5, 0xd0, 0x5e, 0x2a, 0x6a, 0x9e, 0xdd, 0x64, 0x8d, 0xee, 0x4a, 0x6f, 0xb6, 0x72,
+	0x08, 0x97, 0xf8, 0x28, 0x74, 0x55, 0x42, 0x5d, 0xcd, 0xc5, 0x61, 0xba, 0x64, 0xb5, 0x61, 0xd2,
+	0xe2, 0x7f, 0xcf, 0x9a, 0x30, 0x3e, 0x95, 0xca, 0x1d, 0xc3, 0xf8, 0x5c, 0xaa, 0x75, 0x32, 0x40,
+	0xc3, 0x61, 0x6a, 0x66, 0x26, 0xd6, 0x5e, 0x4b, 0xcd, 0x13, 0xb3, 0x33, 0x11, 0xd2, 0x33, 0x1c,
+	0xd6, 0x1b, 0x84, 0xf4, 0xf6, 0x5a, 0x3d, 0x11, 0xf2, 0xb3, 0xb4, 0x92, 0x9d, 0xeb, 0xba, 0xe1,
+	0x30, 0x5d, 0x1f, 0x04, 0xe9, 0xfa, 0x5e, 0x4b, 0xd7, 0x45, 0xd8, 0xfe, 0x6c, 0xca, 0xb3, 0xf5,
+	0x27, 0x00, 0x00, 0xff, 0xff, 0x83, 0xa0, 0x28, 0xf8, 0x22, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CampaignSharedSetServiceClient is the client API for CampaignSharedSetService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CampaignSharedSetServiceClient interface {
+	// Returns the requested campaign shared set in full detail.
+	GetCampaignSharedSet(ctx context.Context, in *GetCampaignSharedSetRequest, opts ...grpc.CallOption) (*resources.CampaignSharedSet, error)
+	// Creates or removes campaign shared sets. Operation statuses are returned.
+	MutateCampaignSharedSets(ctx context.Context, in *MutateCampaignSharedSetsRequest, opts ...grpc.CallOption) (*MutateCampaignSharedSetsResponse, error)
+}
+
+type campaignSharedSetServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCampaignSharedSetServiceClient(cc grpc.ClientConnInterface) CampaignSharedSetServiceClient {
+	return &campaignSharedSetServiceClient{cc}
+}
+
+func (c *campaignSharedSetServiceClient) GetCampaignSharedSet(ctx context.Context, in *GetCampaignSharedSetRequest, opts ...grpc.CallOption) (*resources.CampaignSharedSet, error) {
+	out := new(resources.CampaignSharedSet)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignSharedSetService/GetCampaignSharedSet", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *campaignSharedSetServiceClient) MutateCampaignSharedSets(ctx context.Context, in *MutateCampaignSharedSetsRequest, opts ...grpc.CallOption) (*MutateCampaignSharedSetsResponse, error) {
+	out := new(MutateCampaignSharedSetsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CampaignSharedSetService/MutateCampaignSharedSets", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CampaignSharedSetServiceServer is the server API for CampaignSharedSetService service.
+type CampaignSharedSetServiceServer interface {
+	// Returns the requested campaign shared set in full detail.
+	GetCampaignSharedSet(context.Context, *GetCampaignSharedSetRequest) (*resources.CampaignSharedSet, error)
+	// Creates or removes campaign shared sets. Operation statuses are returned.
+	MutateCampaignSharedSets(context.Context, *MutateCampaignSharedSetsRequest) (*MutateCampaignSharedSetsResponse, error)
+}
+
+// UnimplementedCampaignSharedSetServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCampaignSharedSetServiceServer struct {
+}
+
+func (*UnimplementedCampaignSharedSetServiceServer) GetCampaignSharedSet(ctx context.Context, req *GetCampaignSharedSetRequest) (*resources.CampaignSharedSet, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCampaignSharedSet not implemented")
+}
+func (*UnimplementedCampaignSharedSetServiceServer) MutateCampaignSharedSets(ctx context.Context, req *MutateCampaignSharedSetsRequest) (*MutateCampaignSharedSetsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCampaignSharedSets not implemented")
+}
+
+func RegisterCampaignSharedSetServiceServer(s *grpc.Server, srv CampaignSharedSetServiceServer) {
+	s.RegisterService(&_CampaignSharedSetService_serviceDesc, srv)
+}
+
+func _CampaignSharedSetService_GetCampaignSharedSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCampaignSharedSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignSharedSetServiceServer).GetCampaignSharedSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignSharedSetService/GetCampaignSharedSet",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignSharedSetServiceServer).GetCampaignSharedSet(ctx, req.(*GetCampaignSharedSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CampaignSharedSetService_MutateCampaignSharedSets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCampaignSharedSetsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CampaignSharedSetServiceServer).MutateCampaignSharedSets(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CampaignSharedSetService/MutateCampaignSharedSets",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CampaignSharedSetServiceServer).MutateCampaignSharedSets(ctx, req.(*MutateCampaignSharedSetsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CampaignSharedSetService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CampaignSharedSetService",
+	HandlerType: (*CampaignSharedSetServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCampaignSharedSet",
+			Handler:    _CampaignSharedSetService_GetCampaignSharedSet_Handler,
+		},
+		{
+			MethodName: "MutateCampaignSharedSets",
+			Handler:    _CampaignSharedSetService_MutateCampaignSharedSets_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/campaign_shared_set_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/carrier_constant_service.pb.go b/googleapis/ads/googleads/v3/services/carrier_constant_service.pb.go
new file mode 100644
index 0000000..d8c3d57
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/carrier_constant_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/carrier_constant_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CarrierConstantService.GetCarrierConstant][google.ads.googleads.v3.services.CarrierConstantService.GetCarrierConstant].
+type GetCarrierConstantRequest struct {
+	// Required. Resource name of the carrier constant to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCarrierConstantRequest) Reset()         { *m = GetCarrierConstantRequest{} }
+func (m *GetCarrierConstantRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCarrierConstantRequest) ProtoMessage()    {}
+func (*GetCarrierConstantRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3024993599d2a450, []int{0}
+}
+
+func (m *GetCarrierConstantRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCarrierConstantRequest.Unmarshal(m, b)
+}
+func (m *GetCarrierConstantRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCarrierConstantRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCarrierConstantRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCarrierConstantRequest.Merge(m, src)
+}
+func (m *GetCarrierConstantRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCarrierConstantRequest.Size(m)
+}
+func (m *GetCarrierConstantRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCarrierConstantRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCarrierConstantRequest proto.InternalMessageInfo
+
+func (m *GetCarrierConstantRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCarrierConstantRequest)(nil), "google.ads.googleads.v3.services.GetCarrierConstantRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/carrier_constant_service.proto", fileDescriptor_3024993599d2a450)
+}
+
+var fileDescriptor_3024993599d2a450 = []byte{
+	// 403 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcf, 0x8a, 0xd3, 0x40,
+	0x18, 0x27, 0x29, 0x08, 0x06, 0xbd, 0xe4, 0xa0, 0x35, 0x15, 0x2c, 0xa5, 0x48, 0xf1, 0x30, 0x03,
+	0xcd, 0x45, 0xa6, 0xa8, 0x4c, 0x8b, 0xd4, 0x93, 0x94, 0x0a, 0x3d, 0x48, 0x20, 0x4c, 0x93, 0x31,
+	0x0e, 0x24, 0x33, 0x75, 0x26, 0xcd, 0x45, 0xbc, 0xf4, 0x15, 0x7c, 0x03, 0x8f, 0xbe, 0x87, 0x97,
+	0x5e, 0xbd, 0xed, 0x69, 0x0f, 0x7b, 0xda, 0x77, 0x58, 0x58, 0xd2, 0xc9, 0xa4, 0x7f, 0xb6, 0xa1,
+	0xb7, 0x1f, 0xf9, 0xfd, 0xfb, 0xbe, 0x6f, 0xe2, 0x7c, 0x48, 0x84, 0x48, 0x52, 0x0a, 0x49, 0xac,
+	0xa0, 0x86, 0x25, 0x2a, 0x7c, 0xa8, 0xa8, 0x2c, 0x58, 0x44, 0x15, 0x8c, 0x88, 0x94, 0x8c, 0xca,
+	0x30, 0x12, 0x5c, 0xe5, 0x84, 0xe7, 0x61, 0xc5, 0x80, 0x95, 0x14, 0xb9, 0x70, 0xbb, 0xda, 0x05,
+	0x48, 0xac, 0x40, 0x1d, 0x00, 0x0a, 0x1f, 0x98, 0x00, 0xef, 0x6d, 0x53, 0x85, 0xa4, 0x4a, 0xac,
+	0xe5, 0xb9, 0x0e, 0x9d, 0xed, 0xbd, 0x34, 0xce, 0x15, 0x83, 0x84, 0x73, 0x91, 0x93, 0x9c, 0x09,
+	0xae, 0x2a, 0xf6, 0xf9, 0x01, 0x1b, 0xa5, 0x8c, 0xd6, 0xb6, 0x57, 0x07, 0xc4, 0x37, 0x46, 0xd3,
+	0x38, 0x5c, 0xd2, 0xef, 0xa4, 0x60, 0x42, 0x6a, 0x41, 0xef, 0xa3, 0xf3, 0x62, 0x4a, 0xf3, 0x89,
+	0x2e, 0x9d, 0x54, 0x9d, 0x73, 0xfa, 0x63, 0x4d, 0x55, 0xee, 0x0e, 0x9c, 0xa7, 0x66, 0xb0, 0x90,
+	0x93, 0x8c, 0xb6, 0xad, 0xae, 0x35, 0x78, 0x3c, 0x6e, 0x5d, 0x63, 0x7b, 0xfe, 0xc4, 0x30, 0x9f,
+	0x49, 0x46, 0x87, 0x77, 0x96, 0xf3, 0xec, 0x24, 0xe4, 0x8b, 0x5e, 0xda, 0xfd, 0x67, 0x39, 0xee,
+	0xc3, 0x0a, 0x77, 0x04, 0x2e, 0x5d, 0x0b, 0x34, 0x0e, 0xe6, 0x0d, 0x1b, 0xcd, 0xf5, 0x21, 0xc1,
+	0x89, 0xb5, 0xf7, 0xfe, 0x0a, 0x1f, 0x6f, 0xb3, 0xf9, 0x7f, 0xf3, 0xdb, 0x1e, 0xb8, 0xaf, 0xcb,
+	0xfb, 0xff, 0x3c, 0x62, 0xde, 0x45, 0xc7, 0x5e, 0x05, 0xdf, 0xfc, 0xf2, 0x3a, 0x5b, 0xdc, 0xde,
+	0x57, 0x55, 0x68, 0xc5, 0x14, 0x88, 0x44, 0x36, 0xde, 0xd8, 0x4e, 0x3f, 0x12, 0xd9, 0xc5, 0x9d,
+	0xc6, 0x9d, 0xf3, 0x57, 0x9a, 0x95, 0x8f, 0x31, 0xb3, 0xbe, 0x7e, 0xaa, 0x02, 0x12, 0x91, 0x12,
+	0x9e, 0x00, 0x21, 0x13, 0x98, 0x50, 0xbe, 0x7b, 0x2a, 0xb8, 0xaf, 0x6c, 0xfe, 0x45, 0x47, 0x06,
+	0xfc, 0xb1, 0x5b, 0x53, 0x8c, 0xff, 0xda, 0xdd, 0xa9, 0x0e, 0xc4, 0xb1, 0x02, 0x1a, 0x96, 0x68,
+	0xe1, 0x83, 0xaa, 0x58, 0x6d, 0x8d, 0x24, 0xc0, 0xb1, 0x0a, 0x6a, 0x49, 0xb0, 0xf0, 0x03, 0x23,
+	0xb9, 0xb5, 0xfb, 0xfa, 0x3b, 0x42, 0x38, 0x56, 0x08, 0xd5, 0x22, 0x84, 0x16, 0x3e, 0x42, 0x46,
+	0xb6, 0x7c, 0xb4, 0x9b, 0xd3, 0xbf, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x69, 0x87, 0x81, 0x13, 0x49,
+	0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CarrierConstantServiceClient is the client API for CarrierConstantService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CarrierConstantServiceClient interface {
+	// Returns the requested carrier constant in full detail.
+	GetCarrierConstant(ctx context.Context, in *GetCarrierConstantRequest, opts ...grpc.CallOption) (*resources.CarrierConstant, error)
+}
+
+type carrierConstantServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCarrierConstantServiceClient(cc grpc.ClientConnInterface) CarrierConstantServiceClient {
+	return &carrierConstantServiceClient{cc}
+}
+
+func (c *carrierConstantServiceClient) GetCarrierConstant(ctx context.Context, in *GetCarrierConstantRequest, opts ...grpc.CallOption) (*resources.CarrierConstant, error) {
+	out := new(resources.CarrierConstant)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CarrierConstantService/GetCarrierConstant", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CarrierConstantServiceServer is the server API for CarrierConstantService service.
+type CarrierConstantServiceServer interface {
+	// Returns the requested carrier constant in full detail.
+	GetCarrierConstant(context.Context, *GetCarrierConstantRequest) (*resources.CarrierConstant, error)
+}
+
+// UnimplementedCarrierConstantServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCarrierConstantServiceServer struct {
+}
+
+func (*UnimplementedCarrierConstantServiceServer) GetCarrierConstant(ctx context.Context, req *GetCarrierConstantRequest) (*resources.CarrierConstant, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetCarrierConstant not implemented")
+}
+
+func RegisterCarrierConstantServiceServer(s *grpc.Server, srv CarrierConstantServiceServer) {
+	s.RegisterService(&_CarrierConstantService_serviceDesc, srv)
+}
+
+func _CarrierConstantService_GetCarrierConstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCarrierConstantRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CarrierConstantServiceServer).GetCarrierConstant(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CarrierConstantService/GetCarrierConstant",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CarrierConstantServiceServer).GetCarrierConstant(ctx, req.(*GetCarrierConstantRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CarrierConstantService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CarrierConstantService",
+	HandlerType: (*CarrierConstantServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCarrierConstant",
+			Handler:    _CarrierConstantService_GetCarrierConstant_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/carrier_constant_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/change_status_service.pb.go b/googleapis/ads/googleads/v3/services/change_status_service.pb.go
new file mode 100644
index 0000000..3de449f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/change_status_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/change_status_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for '[ChangeStatusService.GetChangeStatus][google.ads.googleads.v3.services.ChangeStatusService.GetChangeStatus]'.
+type GetChangeStatusRequest struct {
+	// Required. The resource name of the change status to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetChangeStatusRequest) Reset()         { *m = GetChangeStatusRequest{} }
+func (m *GetChangeStatusRequest) String() string { return proto.CompactTextString(m) }
+func (*GetChangeStatusRequest) ProtoMessage()    {}
+func (*GetChangeStatusRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3052f9cea2195dd0, []int{0}
+}
+
+func (m *GetChangeStatusRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetChangeStatusRequest.Unmarshal(m, b)
+}
+func (m *GetChangeStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetChangeStatusRequest.Marshal(b, m, deterministic)
+}
+func (m *GetChangeStatusRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetChangeStatusRequest.Merge(m, src)
+}
+func (m *GetChangeStatusRequest) XXX_Size() int {
+	return xxx_messageInfo_GetChangeStatusRequest.Size(m)
+}
+func (m *GetChangeStatusRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetChangeStatusRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetChangeStatusRequest proto.InternalMessageInfo
+
+func (m *GetChangeStatusRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetChangeStatusRequest)(nil), "google.ads.googleads.v3.services.GetChangeStatusRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/change_status_service.proto", fileDescriptor_3052f9cea2195dd0)
+}
+
+var fileDescriptor_3052f9cea2195dd0 = []byte{
+	// 412 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcf, 0x8a, 0xd3, 0x40,
+	0x18, 0x27, 0x29, 0x08, 0x06, 0x45, 0x88, 0xa0, 0x25, 0x0a, 0x96, 0xd2, 0x43, 0xe9, 0x61, 0x46,
+	0x0c, 0x82, 0x8c, 0x7a, 0x98, 0x08, 0xd6, 0x93, 0x94, 0x16, 0x7a, 0x90, 0x40, 0x98, 0x26, 0x63,
+	0x1a, 0x48, 0x66, 0x6a, 0x66, 0x92, 0x8b, 0x78, 0xf1, 0x15, 0x7c, 0x03, 0x8f, 0x3e, 0x87, 0xa7,
+	0x5e, 0xf7, 0xb6, 0xa7, 0x3d, 0xec, 0x69, 0xdf, 0x60, 0x4f, 0xbb, 0x24, 0x93, 0x49, 0xd3, 0xdd,
+	0x96, 0xde, 0x7e, 0xe4, 0xf7, 0xef, 0xfb, 0xbe, 0x89, 0xf5, 0x21, 0xe6, 0x3c, 0x4e, 0x29, 0x24,
+	0x91, 0x80, 0x0a, 0x56, 0xa8, 0x74, 0xa1, 0xa0, 0x79, 0x99, 0x84, 0x54, 0xc0, 0x70, 0x4d, 0x58,
+	0x4c, 0x03, 0x21, 0x89, 0x2c, 0x44, 0xd0, 0x7c, 0x06, 0x9b, 0x9c, 0x4b, 0x6e, 0x0f, 0x94, 0x05,
+	0x90, 0x48, 0x80, 0xd6, 0x0d, 0x4a, 0x17, 0x68, 0xb7, 0xf3, 0xf6, 0x58, 0x7e, 0x4e, 0x05, 0x2f,
+	0xf2, 0x7b, 0x05, 0x2a, 0xd8, 0x79, 0xa9, 0x6d, 0x9b, 0x04, 0x12, 0xc6, 0xb8, 0x24, 0x32, 0xe1,
+	0x4c, 0xb3, 0xcf, 0x3b, 0x6c, 0x98, 0x26, 0x94, 0xc9, 0x86, 0x78, 0xd5, 0x21, 0xbe, 0x27, 0x34,
+	0x8d, 0x82, 0x15, 0x5d, 0x93, 0x32, 0xe1, 0xb9, 0x12, 0x0c, 0x3d, 0xeb, 0xd9, 0x94, 0xca, 0x4f,
+	0x75, 0xe3, 0xa2, 0x2e, 0x9c, 0xd3, 0x1f, 0x05, 0x15, 0xd2, 0x1e, 0x5b, 0x8f, 0xf5, 0x48, 0x01,
+	0x23, 0x19, 0xed, 0x1b, 0x03, 0x63, 0xfc, 0xd0, 0xeb, 0x5d, 0x60, 0x73, 0xfe, 0x48, 0x33, 0x5f,
+	0x49, 0x46, 0xdf, 0x5c, 0x1b, 0xd6, 0xd3, 0x6e, 0xc2, 0x42, 0xed, 0x6a, 0xff, 0x37, 0xac, 0x27,
+	0x77, 0xc2, 0xed, 0x77, 0xe0, 0xd4, 0x85, 0xc0, 0xe1, 0x79, 0x1c, 0x78, 0xd4, 0xd9, 0x5e, 0x0e,
+	0x74, 0x7d, 0xc3, 0xcf, 0xe7, 0x78, 0x7f, 0x83, 0xdf, 0x67, 0x97, 0x7f, 0xcc, 0xd7, 0x36, 0xa8,
+	0xae, 0xfd, 0x73, 0x8f, 0xf9, 0x18, 0x16, 0x42, 0xf2, 0x8c, 0xe6, 0x02, 0x4e, 0x9a, 0xf3, 0xab,
+	0x10, 0x38, 0xf9, 0xe5, 0xbc, 0xd8, 0xe2, 0xfe, 0xae, 0xaf, 0x41, 0x9b, 0x44, 0x80, 0x90, 0x67,
+	0xde, 0x8d, 0x61, 0x8d, 0x42, 0x9e, 0x9d, 0xdc, 0xca, 0xeb, 0x1f, 0xb8, 0xd0, 0xac, 0x7a, 0x82,
+	0x99, 0xf1, 0xed, 0x4b, 0xe3, 0x8e, 0x79, 0x4a, 0x58, 0x0c, 0x78, 0x1e, 0xc3, 0x98, 0xb2, 0xfa,
+	0x81, 0xe0, 0xae, 0xef, 0xf8, 0x2f, 0xf9, 0x5e, 0x83, 0xbf, 0x66, 0x6f, 0x8a, 0xf1, 0x3f, 0x73,
+	0x30, 0x55, 0x81, 0x38, 0x12, 0x40, 0xc1, 0x0a, 0x2d, 0x5d, 0xd0, 0x14, 0x8b, 0xad, 0x96, 0xf8,
+	0x38, 0x12, 0x7e, 0x2b, 0xf1, 0x97, 0xae, 0xaf, 0x25, 0x57, 0xe6, 0x48, 0x7d, 0x47, 0x08, 0x47,
+	0x02, 0xa1, 0x56, 0x84, 0xd0, 0xd2, 0x45, 0x48, 0xcb, 0x56, 0x0f, 0xea, 0x39, 0xdd, 0xdb, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0x61, 0x3a, 0x08, 0x1b, 0x39, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ChangeStatusServiceClient is the client API for ChangeStatusService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ChangeStatusServiceClient interface {
+	// Returns the requested change status in full detail.
+	GetChangeStatus(ctx context.Context, in *GetChangeStatusRequest, opts ...grpc.CallOption) (*resources.ChangeStatus, error)
+}
+
+type changeStatusServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewChangeStatusServiceClient(cc grpc.ClientConnInterface) ChangeStatusServiceClient {
+	return &changeStatusServiceClient{cc}
+}
+
+func (c *changeStatusServiceClient) GetChangeStatus(ctx context.Context, in *GetChangeStatusRequest, opts ...grpc.CallOption) (*resources.ChangeStatus, error) {
+	out := new(resources.ChangeStatus)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ChangeStatusService/GetChangeStatus", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ChangeStatusServiceServer is the server API for ChangeStatusService service.
+type ChangeStatusServiceServer interface {
+	// Returns the requested change status in full detail.
+	GetChangeStatus(context.Context, *GetChangeStatusRequest) (*resources.ChangeStatus, error)
+}
+
+// UnimplementedChangeStatusServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedChangeStatusServiceServer struct {
+}
+
+func (*UnimplementedChangeStatusServiceServer) GetChangeStatus(ctx context.Context, req *GetChangeStatusRequest) (*resources.ChangeStatus, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetChangeStatus not implemented")
+}
+
+func RegisterChangeStatusServiceServer(s *grpc.Server, srv ChangeStatusServiceServer) {
+	s.RegisterService(&_ChangeStatusService_serviceDesc, srv)
+}
+
+func _ChangeStatusService_GetChangeStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetChangeStatusRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ChangeStatusServiceServer).GetChangeStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ChangeStatusService/GetChangeStatus",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ChangeStatusServiceServer).GetChangeStatus(ctx, req.(*GetChangeStatusRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ChangeStatusService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ChangeStatusService",
+	HandlerType: (*ChangeStatusServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetChangeStatus",
+			Handler:    _ChangeStatusService_GetChangeStatus_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/change_status_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/click_view_service.pb.go b/googleapis/ads/googleads/v3/services/click_view_service.pb.go
new file mode 100644
index 0000000..35cb7ac
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/click_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/click_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [ClickViewService.GetClickView][google.ads.googleads.v3.services.ClickViewService.GetClickView].
+type GetClickViewRequest struct {
+	// Required. The resource name of the click view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetClickViewRequest) Reset()         { *m = GetClickViewRequest{} }
+func (m *GetClickViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetClickViewRequest) ProtoMessage()    {}
+func (*GetClickViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_894a9152e8b8f104, []int{0}
+}
+
+func (m *GetClickViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetClickViewRequest.Unmarshal(m, b)
+}
+func (m *GetClickViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetClickViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetClickViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetClickViewRequest.Merge(m, src)
+}
+func (m *GetClickViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetClickViewRequest.Size(m)
+}
+func (m *GetClickViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetClickViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetClickViewRequest proto.InternalMessageInfo
+
+func (m *GetClickViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetClickViewRequest)(nil), "google.ads.googleads.v3.services.GetClickViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/click_view_service.proto", fileDescriptor_894a9152e8b8f104)
+}
+
+var fileDescriptor_894a9152e8b8f104 = []byte{
+	// 413 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcf, 0x8a, 0xd3, 0x40,
+	0x18, 0x27, 0x29, 0x08, 0x86, 0x0a, 0x12, 0x11, 0x4b, 0x14, 0x2c, 0xa5, 0x87, 0x52, 0xca, 0x0c,
+	0x34, 0x78, 0x70, 0x44, 0x64, 0xaa, 0x50, 0x4f, 0x52, 0x2a, 0xe4, 0x20, 0x81, 0x30, 0x4d, 0x3e,
+	0xe3, 0x60, 0x92, 0xa9, 0x99, 0x34, 0x3d, 0x88, 0x17, 0x5f, 0xc1, 0x37, 0xf0, 0xe8, 0x1b, 0xf8,
+	0x0a, 0xbd, 0xee, 0x6d, 0x4f, 0x7b, 0xd8, 0xd3, 0xee, 0x2b, 0xec, 0x61, 0x49, 0x27, 0x93, 0xb6,
+	0xcb, 0x96, 0xde, 0x7e, 0xcc, 0xef, 0xcf, 0xf7, 0x7d, 0xbf, 0xc4, 0x7a, 0x1d, 0x0b, 0x11, 0x27,
+	0x80, 0x59, 0x24, 0xb1, 0x82, 0x15, 0x2a, 0x5d, 0x2c, 0x21, 0x2f, 0x79, 0x08, 0x12, 0x87, 0x09,
+	0x0f, 0xbf, 0x07, 0x25, 0x87, 0x75, 0x50, 0xbf, 0xa1, 0x65, 0x2e, 0x0a, 0x61, 0x77, 0x95, 0x1e,
+	0xb1, 0x48, 0xa2, 0xc6, 0x8a, 0x4a, 0x17, 0x69, 0xab, 0x33, 0x3e, 0x16, 0x9e, 0x83, 0x14, 0xab,
+	0xfc, 0x30, 0x5d, 0xa5, 0x3a, 0x2f, 0xb4, 0x67, 0xc9, 0x31, 0xcb, 0x32, 0x51, 0xb0, 0x82, 0x8b,
+	0x4c, 0xd6, 0xec, 0xb3, 0x3d, 0x36, 0x4c, 0x38, 0x64, 0x45, 0x4d, 0xbc, 0xdc, 0x23, 0xbe, 0x72,
+	0x48, 0xa2, 0x60, 0x01, 0xdf, 0x58, 0xc9, 0x45, 0xae, 0x04, 0xbd, 0x77, 0xd6, 0x93, 0x29, 0x14,
+	0xef, 0xab, 0x71, 0x1e, 0x87, 0xf5, 0x1c, 0x7e, 0xac, 0x40, 0x16, 0xf6, 0xc0, 0x7a, 0xa4, 0x97,
+	0x09, 0x32, 0x96, 0x42, 0xc7, 0xe8, 0x1a, 0x83, 0x87, 0x93, 0xd6, 0x05, 0x35, 0xe7, 0x6d, 0xcd,
+	0x7c, 0x62, 0x29, 0x8c, 0xaf, 0x0d, 0xeb, 0x71, 0x63, 0xff, 0xac, 0x4e, 0xb4, 0xff, 0x1b, 0x56,
+	0x7b, 0x3f, 0xd6, 0x7e, 0x85, 0x4e, 0xb5, 0x82, 0xee, 0x59, 0xc3, 0x19, 0x1d, 0xb5, 0x35, 0x55,
+	0xa1, 0xc6, 0xd4, 0xfb, 0x70, 0x4e, 0x0f, 0xb7, 0xfe, 0x7d, 0x76, 0xf9, 0xc7, 0x44, 0xf6, 0xa8,
+	0xea, 0xf6, 0xe7, 0x01, 0xf3, 0x36, 0x5c, 0xc9, 0x42, 0xa4, 0x90, 0x4b, 0x3c, 0x54, 0x65, 0x57,
+	0x09, 0x12, 0x0f, 0x7f, 0x39, 0xcf, 0x37, 0xb4, 0xb3, 0x1b, 0x55, 0xa3, 0x25, 0x97, 0x28, 0x14,
+	0xe9, 0xe4, 0xc6, 0xb0, 0xfa, 0xa1, 0x48, 0x4f, 0x5e, 0x33, 0x79, 0x7a, 0xb7, 0x93, 0x59, 0x55,
+	0xf7, 0xcc, 0xf8, 0xf2, 0xb1, 0xb6, 0xc6, 0x22, 0x61, 0x59, 0x8c, 0x44, 0x1e, 0xe3, 0x18, 0xb2,
+	0xed, 0xc7, 0xc0, 0xbb, 0x61, 0xc7, 0x7f, 0xbc, 0x37, 0x1a, 0xfc, 0x35, 0x5b, 0x53, 0x4a, 0xff,
+	0x99, 0xdd, 0xa9, 0x0a, 0xa4, 0x91, 0x44, 0x0a, 0x56, 0xc8, 0x73, 0x51, 0x3d, 0x58, 0x6e, 0xb4,
+	0xc4, 0xa7, 0x91, 0xf4, 0x1b, 0x89, 0xef, 0xb9, 0xbe, 0x96, 0x5c, 0x99, 0x7d, 0xf5, 0x4e, 0x08,
+	0x8d, 0x24, 0x21, 0x8d, 0x88, 0x10, 0xcf, 0x25, 0x44, 0xcb, 0x16, 0x0f, 0xb6, 0x7b, 0xba, 0xb7,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0xc0, 0xc9, 0xf7, 0x89, 0x1f, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ClickViewServiceClient is the client API for ClickViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ClickViewServiceClient interface {
+	// Returns the requested click view in full detail.
+	GetClickView(ctx context.Context, in *GetClickViewRequest, opts ...grpc.CallOption) (*resources.ClickView, error)
+}
+
+type clickViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewClickViewServiceClient(cc grpc.ClientConnInterface) ClickViewServiceClient {
+	return &clickViewServiceClient{cc}
+}
+
+func (c *clickViewServiceClient) GetClickView(ctx context.Context, in *GetClickViewRequest, opts ...grpc.CallOption) (*resources.ClickView, error) {
+	out := new(resources.ClickView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ClickViewService/GetClickView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ClickViewServiceServer is the server API for ClickViewService service.
+type ClickViewServiceServer interface {
+	// Returns the requested click view in full detail.
+	GetClickView(context.Context, *GetClickViewRequest) (*resources.ClickView, error)
+}
+
+// UnimplementedClickViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedClickViewServiceServer struct {
+}
+
+func (*UnimplementedClickViewServiceServer) GetClickView(ctx context.Context, req *GetClickViewRequest) (*resources.ClickView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetClickView not implemented")
+}
+
+func RegisterClickViewServiceServer(s *grpc.Server, srv ClickViewServiceServer) {
+	s.RegisterService(&_ClickViewService_serviceDesc, srv)
+}
+
+func _ClickViewService_GetClickView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetClickViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ClickViewServiceServer).GetClickView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ClickViewService/GetClickView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ClickViewServiceServer).GetClickView(ctx, req.(*GetClickViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ClickViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ClickViewService",
+	HandlerType: (*ClickViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetClickView",
+			Handler:    _ClickViewService_GetClickView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/click_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/conversion_action_service.pb.go b/googleapis/ads/googleads/v3/services/conversion_action_service.pb.go
new file mode 100644
index 0000000..07b213d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/conversion_action_service.pb.go
@@ -0,0 +1,530 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/conversion_action_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [ConversionActionService.GetConversionAction][google.ads.googleads.v3.services.ConversionActionService.GetConversionAction].
+type GetConversionActionRequest struct {
+	// Required. The resource name of the conversion action to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetConversionActionRequest) Reset()         { *m = GetConversionActionRequest{} }
+func (m *GetConversionActionRequest) String() string { return proto.CompactTextString(m) }
+func (*GetConversionActionRequest) ProtoMessage()    {}
+func (*GetConversionActionRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8addb9f401303dba, []int{0}
+}
+
+func (m *GetConversionActionRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetConversionActionRequest.Unmarshal(m, b)
+}
+func (m *GetConversionActionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetConversionActionRequest.Marshal(b, m, deterministic)
+}
+func (m *GetConversionActionRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetConversionActionRequest.Merge(m, src)
+}
+func (m *GetConversionActionRequest) XXX_Size() int {
+	return xxx_messageInfo_GetConversionActionRequest.Size(m)
+}
+func (m *GetConversionActionRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetConversionActionRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetConversionActionRequest proto.InternalMessageInfo
+
+func (m *GetConversionActionRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [ConversionActionService.MutateConversionActions][google.ads.googleads.v3.services.ConversionActionService.MutateConversionActions].
+type MutateConversionActionsRequest struct {
+	// Required. The ID of the customer whose conversion actions are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual conversion actions.
+	Operations []*ConversionActionOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateConversionActionsRequest) Reset()         { *m = MutateConversionActionsRequest{} }
+func (m *MutateConversionActionsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateConversionActionsRequest) ProtoMessage()    {}
+func (*MutateConversionActionsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8addb9f401303dba, []int{1}
+}
+
+func (m *MutateConversionActionsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateConversionActionsRequest.Unmarshal(m, b)
+}
+func (m *MutateConversionActionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateConversionActionsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateConversionActionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateConversionActionsRequest.Merge(m, src)
+}
+func (m *MutateConversionActionsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateConversionActionsRequest.Size(m)
+}
+func (m *MutateConversionActionsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateConversionActionsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateConversionActionsRequest proto.InternalMessageInfo
+
+func (m *MutateConversionActionsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateConversionActionsRequest) GetOperations() []*ConversionActionOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateConversionActionsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateConversionActionsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a conversion action.
+type ConversionActionOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*ConversionActionOperation_Create
+	//	*ConversionActionOperation_Update
+	//	*ConversionActionOperation_Remove
+	Operation            isConversionActionOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
+	XXX_unrecognized     []byte                                `json:"-"`
+	XXX_sizecache        int32                                 `json:"-"`
+}
+
+func (m *ConversionActionOperation) Reset()         { *m = ConversionActionOperation{} }
+func (m *ConversionActionOperation) String() string { return proto.CompactTextString(m) }
+func (*ConversionActionOperation) ProtoMessage()    {}
+func (*ConversionActionOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8addb9f401303dba, []int{2}
+}
+
+func (m *ConversionActionOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionActionOperation.Unmarshal(m, b)
+}
+func (m *ConversionActionOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionActionOperation.Marshal(b, m, deterministic)
+}
+func (m *ConversionActionOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionActionOperation.Merge(m, src)
+}
+func (m *ConversionActionOperation) XXX_Size() int {
+	return xxx_messageInfo_ConversionActionOperation.Size(m)
+}
+func (m *ConversionActionOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionActionOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionActionOperation proto.InternalMessageInfo
+
+func (m *ConversionActionOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isConversionActionOperation_Operation interface {
+	isConversionActionOperation_Operation()
+}
+
+type ConversionActionOperation_Create struct {
+	Create *resources.ConversionAction `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type ConversionActionOperation_Update struct {
+	Update *resources.ConversionAction `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type ConversionActionOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*ConversionActionOperation_Create) isConversionActionOperation_Operation() {}
+
+func (*ConversionActionOperation_Update) isConversionActionOperation_Operation() {}
+
+func (*ConversionActionOperation_Remove) isConversionActionOperation_Operation() {}
+
+func (m *ConversionActionOperation) GetOperation() isConversionActionOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *ConversionActionOperation) GetCreate() *resources.ConversionAction {
+	if x, ok := m.GetOperation().(*ConversionActionOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *ConversionActionOperation) GetUpdate() *resources.ConversionAction {
+	if x, ok := m.GetOperation().(*ConversionActionOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *ConversionActionOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*ConversionActionOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ConversionActionOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ConversionActionOperation_Create)(nil),
+		(*ConversionActionOperation_Update)(nil),
+		(*ConversionActionOperation_Remove)(nil),
+	}
+}
+
+// Response message for [ConversionActionService.MutateConversionActions][google.ads.googleads.v3.services.ConversionActionService.MutateConversionActions].
+type MutateConversionActionsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateConversionActionResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *MutateConversionActionsResponse) Reset()         { *m = MutateConversionActionsResponse{} }
+func (m *MutateConversionActionsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateConversionActionsResponse) ProtoMessage()    {}
+func (*MutateConversionActionsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8addb9f401303dba, []int{3}
+}
+
+func (m *MutateConversionActionsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateConversionActionsResponse.Unmarshal(m, b)
+}
+func (m *MutateConversionActionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateConversionActionsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateConversionActionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateConversionActionsResponse.Merge(m, src)
+}
+func (m *MutateConversionActionsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateConversionActionsResponse.Size(m)
+}
+func (m *MutateConversionActionsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateConversionActionsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateConversionActionsResponse proto.InternalMessageInfo
+
+func (m *MutateConversionActionsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateConversionActionsResponse) GetResults() []*MutateConversionActionResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the conversion action mutate.
+type MutateConversionActionResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateConversionActionResult) Reset()         { *m = MutateConversionActionResult{} }
+func (m *MutateConversionActionResult) String() string { return proto.CompactTextString(m) }
+func (*MutateConversionActionResult) ProtoMessage()    {}
+func (*MutateConversionActionResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8addb9f401303dba, []int{4}
+}
+
+func (m *MutateConversionActionResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateConversionActionResult.Unmarshal(m, b)
+}
+func (m *MutateConversionActionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateConversionActionResult.Marshal(b, m, deterministic)
+}
+func (m *MutateConversionActionResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateConversionActionResult.Merge(m, src)
+}
+func (m *MutateConversionActionResult) XXX_Size() int {
+	return xxx_messageInfo_MutateConversionActionResult.Size(m)
+}
+func (m *MutateConversionActionResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateConversionActionResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateConversionActionResult proto.InternalMessageInfo
+
+func (m *MutateConversionActionResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetConversionActionRequest)(nil), "google.ads.googleads.v3.services.GetConversionActionRequest")
+	proto.RegisterType((*MutateConversionActionsRequest)(nil), "google.ads.googleads.v3.services.MutateConversionActionsRequest")
+	proto.RegisterType((*ConversionActionOperation)(nil), "google.ads.googleads.v3.services.ConversionActionOperation")
+	proto.RegisterType((*MutateConversionActionsResponse)(nil), "google.ads.googleads.v3.services.MutateConversionActionsResponse")
+	proto.RegisterType((*MutateConversionActionResult)(nil), "google.ads.googleads.v3.services.MutateConversionActionResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/conversion_action_service.proto", fileDescriptor_8addb9f401303dba)
+}
+
+var fileDescriptor_8addb9f401303dba = []byte{
+	// 768 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0x4f, 0x6b, 0xd4, 0x4c,
+	0x18, 0xc0, 0xdf, 0x64, 0x4b, 0xdf, 0xb7, 0xb3, 0xed, 0xfb, 0xc2, 0x94, 0xd7, 0xae, 0x6b, 0xb1,
+	0x4b, 0x2c, 0xb8, 0x2c, 0x92, 0xc0, 0x06, 0x05, 0xb3, 0x56, 0x9a, 0x2d, 0x6e, 0x2b, 0x52, 0x5b,
+	0x52, 0x28, 0x52, 0x16, 0xd6, 0x69, 0x32, 0x5d, 0x43, 0x93, 0x4c, 0x9c, 0x49, 0x16, 0x4a, 0xe9,
+	0x45, 0x8f, 0x1e, 0x3d, 0x7b, 0xf1, 0xe8, 0xd7, 0xf0, 0xd6, 0xab, 0x78, 0xe9, 0xc9, 0x83, 0x27,
+	0x3f, 0x80, 0x07, 0x4f, 0x92, 0x4c, 0x66, 0xff, 0x75, 0xe3, 0x42, 0x7b, 0xda, 0x27, 0xf3, 0x3c,
+	0xf3, 0x7b, 0xfe, 0xce, 0xb3, 0x60, 0xbd, 0x4b, 0x48, 0xd7, 0xc3, 0x1a, 0x72, 0x98, 0xc6, 0xc5,
+	0x44, 0xea, 0xe9, 0x1a, 0xc3, 0xb4, 0xe7, 0xda, 0x98, 0x69, 0x36, 0x09, 0x7a, 0x98, 0x32, 0x97,
+	0x04, 0x1d, 0x64, 0x47, 0xc9, 0x4f, 0xa6, 0x52, 0x43, 0x4a, 0x22, 0x02, 0x2b, 0xfc, 0x9a, 0x8a,
+	0x1c, 0xa6, 0xf6, 0x09, 0x6a, 0x4f, 0x57, 0x05, 0xa1, 0xfc, 0x30, 0xcf, 0x07, 0xc5, 0x8c, 0xc4,
+	0x74, 0xa2, 0x13, 0x0e, 0x2f, 0x2f, 0x8b, 0xab, 0xa1, 0xab, 0xa1, 0x20, 0x20, 0x11, 0x4a, 0x94,
+	0x2c, 0xd3, 0x2e, 0x0d, 0x69, 0x6d, 0xcf, 0xc5, 0x41, 0x94, 0x29, 0x56, 0x86, 0x14, 0x47, 0x2e,
+	0xf6, 0x9c, 0xce, 0x21, 0x7e, 0x85, 0x7a, 0x2e, 0xa1, 0x99, 0x41, 0x16, 0xb4, 0x96, 0x7e, 0x1d,
+	0xc6, 0x47, 0x99, 0x95, 0x8f, 0xd8, 0xf1, 0x18, 0x9b, 0x86, 0xb6, 0xc6, 0x22, 0x14, 0xc5, 0x99,
+	0x53, 0xa5, 0x05, 0xca, 0x9b, 0x38, 0xda, 0xe8, 0x07, 0x6c, 0xa6, 0xf1, 0x5a, 0xf8, 0x75, 0x8c,
+	0x59, 0x04, 0xab, 0x60, 0x41, 0x64, 0xd5, 0x09, 0x90, 0x8f, 0x4b, 0x52, 0x45, 0xaa, 0xce, 0x35,
+	0x0b, 0xdf, 0x4c, 0xd9, 0x9a, 0x17, 0x9a, 0xe7, 0xc8, 0xc7, 0xca, 0x4f, 0x09, 0xdc, 0xde, 0x8e,
+	0x23, 0x14, 0xe1, 0x71, 0x16, 0x13, 0xb0, 0x55, 0x50, 0xb4, 0x63, 0x16, 0x11, 0x1f, 0xd3, 0x8e,
+	0xeb, 0x0c, 0xa3, 0x80, 0x38, 0x7f, 0xea, 0xc0, 0x97, 0x00, 0x90, 0x10, 0x53, 0x5e, 0x99, 0x92,
+	0x5c, 0x29, 0x54, 0x8b, 0xf5, 0x86, 0x3a, 0xad, 0x2b, 0xea, 0xb8, 0xd7, 0x1d, 0xc1, 0xc8, 0x3c,
+	0x0c, 0x98, 0xf0, 0x2e, 0xf8, 0x2f, 0x44, 0x34, 0x72, 0x91, 0xd7, 0x39, 0x42, 0xae, 0x17, 0x53,
+	0x5c, 0x2a, 0x54, 0xa4, 0xea, 0x3f, 0xd6, 0xbf, 0xd9, 0x71, 0x8b, 0x9f, 0xc2, 0x3b, 0x60, 0xa1,
+	0x87, 0x3c, 0xd7, 0x41, 0x11, 0xee, 0x90, 0xc0, 0x3b, 0x29, 0xcd, 0xa4, 0x66, 0xf3, 0xe2, 0x70,
+	0x27, 0xf0, 0x4e, 0x94, 0x0f, 0x32, 0xb8, 0x99, 0xeb, 0x1c, 0x36, 0x40, 0x31, 0x0e, 0x53, 0x40,
+	0xd2, 0x8c, 0x14, 0x50, 0xac, 0x97, 0x45, 0x3a, 0xa2, 0x5f, 0x6a, 0x2b, 0xe9, 0xd7, 0x36, 0x62,
+	0xc7, 0x16, 0xe0, 0xe6, 0x89, 0x0c, 0xb7, 0xc1, 0xac, 0x4d, 0x31, 0x8a, 0x78, 0xd9, 0x8b, 0x75,
+	0x3d, 0xb7, 0x0c, 0xfd, 0xd1, 0xbb, 0x54, 0x87, 0xad, 0xbf, 0xac, 0x0c, 0x92, 0xe0, 0x38, 0xbc,
+	0x24, 0x5f, 0x0b, 0xc7, 0x21, 0xb0, 0x04, 0x66, 0x29, 0xf6, 0x49, 0x8f, 0x57, 0x6f, 0x2e, 0xd1,
+	0xf0, 0xef, 0x66, 0x11, 0xcc, 0xf5, 0xcb, 0xad, 0x7c, 0x96, 0xc0, 0x4a, 0xee, 0x60, 0xb0, 0x90,
+	0x04, 0x0c, 0xc3, 0x16, 0xf8, 0x7f, 0xac, 0x23, 0x1d, 0x4c, 0x29, 0xa1, 0x29, 0xb9, 0x58, 0x87,
+	0x22, 0x50, 0x1a, 0xda, 0xea, 0x5e, 0x3a, 0xbd, 0xd6, 0xe2, 0x68, 0xaf, 0x9e, 0x24, 0xe6, 0xf0,
+	0x05, 0xf8, 0x9b, 0x62, 0x16, 0x7b, 0x91, 0x18, 0x9c, 0xc7, 0xd3, 0x07, 0x67, 0x72, 0x6c, 0x56,
+	0x8a, 0xb1, 0x04, 0x4e, 0xd9, 0x00, 0xcb, 0x7f, 0x32, 0x4c, 0x46, 0x65, 0xc2, 0x43, 0x19, 0x7d,
+	0x23, 0xf5, 0x77, 0x33, 0x60, 0x69, 0xfc, 0xfe, 0x1e, 0x8f, 0x03, 0x7e, 0x95, 0xc0, 0xe2, 0x84,
+	0x87, 0x08, 0x1f, 0x4d, 0xcf, 0x20, 0xff, 0xfd, 0x96, 0xaf, 0xd2, 0x62, 0xe5, 0xd9, 0x85, 0x39,
+	0x9a, 0xcc, 0x9b, 0x2f, 0xdf, 0xdf, 0xcb, 0xf7, 0xa1, 0x9e, 0x2c, 0xb9, 0xd3, 0x11, 0xcd, 0x9a,
+	0x78, 0xb8, 0x4c, 0xab, 0x0d, 0x6d, 0xbd, 0xac, 0xbf, 0x5a, 0xed, 0x0c, 0xfe, 0x92, 0xc0, 0x52,
+	0x4e, 0xfb, 0xe1, 0xfa, 0x55, 0xbb, 0x23, 0x56, 0x4a, 0xd9, 0xbc, 0x06, 0x81, 0xcf, 0x9e, 0x72,
+	0x70, 0x61, 0xde, 0x18, 0x5a, 0x4b, 0xf7, 0x06, 0x8b, 0x22, 0x4d, 0xbb, 0xa1, 0x3c, 0x48, 0xd2,
+	0x1e, 0xe4, 0x79, 0x3a, 0x64, 0xbc, 0x56, 0x3b, 0xbb, 0x9c, 0xb5, 0xe1, 0xa7, 0x1e, 0x0d, 0xa9,
+	0x56, 0xbe, 0x75, 0x6e, 0x96, 0x06, 0x51, 0x65, 0x52, 0xe8, 0x32, 0xd5, 0x26, 0x7e, 0xf3, 0xad,
+	0x0c, 0x56, 0x6d, 0xe2, 0x4f, 0xcd, 0xa0, 0xb9, 0x9c, 0x33, 0x33, 0xbb, 0xc9, 0xf6, 0xd8, 0x95,
+	0x0e, 0xb6, 0x32, 0x42, 0x97, 0x78, 0x28, 0xe8, 0xaa, 0x84, 0x76, 0xb5, 0x2e, 0x0e, 0xd2, 0xdd,
+	0xa2, 0x0d, 0x7c, 0xe6, 0xff, 0x27, 0x36, 0x84, 0xf0, 0x51, 0x2e, 0x6c, 0x9a, 0xe6, 0x27, 0xb9,
+	0xb2, 0xc9, 0x81, 0xa6, 0xc3, 0x54, 0x2e, 0x26, 0xd2, 0xbe, 0xae, 0x66, 0x8e, 0xd9, 0xb9, 0x30,
+	0x69, 0x9b, 0x0e, 0x6b, 0xf7, 0x4d, 0xda, 0xfb, 0x7a, 0x5b, 0x98, 0xfc, 0x90, 0x57, 0xf9, 0xb9,
+	0x61, 0x98, 0x0e, 0x33, 0x8c, 0xbe, 0x91, 0x61, 0xec, 0xeb, 0x86, 0x21, 0xcc, 0x0e, 0x67, 0xd3,
+	0x38, 0xf5, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xb0, 0x5e, 0xd3, 0xba, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ConversionActionServiceClient is the client API for ConversionActionService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ConversionActionServiceClient interface {
+	// Returns the requested conversion action.
+	GetConversionAction(ctx context.Context, in *GetConversionActionRequest, opts ...grpc.CallOption) (*resources.ConversionAction, error)
+	// Creates, updates or removes conversion actions. Operation statuses are
+	// returned.
+	MutateConversionActions(ctx context.Context, in *MutateConversionActionsRequest, opts ...grpc.CallOption) (*MutateConversionActionsResponse, error)
+}
+
+type conversionActionServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewConversionActionServiceClient(cc grpc.ClientConnInterface) ConversionActionServiceClient {
+	return &conversionActionServiceClient{cc}
+}
+
+func (c *conversionActionServiceClient) GetConversionAction(ctx context.Context, in *GetConversionActionRequest, opts ...grpc.CallOption) (*resources.ConversionAction, error) {
+	out := new(resources.ConversionAction)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ConversionActionService/GetConversionAction", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *conversionActionServiceClient) MutateConversionActions(ctx context.Context, in *MutateConversionActionsRequest, opts ...grpc.CallOption) (*MutateConversionActionsResponse, error) {
+	out := new(MutateConversionActionsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ConversionActionService/MutateConversionActions", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ConversionActionServiceServer is the server API for ConversionActionService service.
+type ConversionActionServiceServer interface {
+	// Returns the requested conversion action.
+	GetConversionAction(context.Context, *GetConversionActionRequest) (*resources.ConversionAction, error)
+	// Creates, updates or removes conversion actions. Operation statuses are
+	// returned.
+	MutateConversionActions(context.Context, *MutateConversionActionsRequest) (*MutateConversionActionsResponse, error)
+}
+
+// UnimplementedConversionActionServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedConversionActionServiceServer struct {
+}
+
+func (*UnimplementedConversionActionServiceServer) GetConversionAction(ctx context.Context, req *GetConversionActionRequest) (*resources.ConversionAction, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetConversionAction not implemented")
+}
+func (*UnimplementedConversionActionServiceServer) MutateConversionActions(ctx context.Context, req *MutateConversionActionsRequest) (*MutateConversionActionsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateConversionActions not implemented")
+}
+
+func RegisterConversionActionServiceServer(s *grpc.Server, srv ConversionActionServiceServer) {
+	s.RegisterService(&_ConversionActionService_serviceDesc, srv)
+}
+
+func _ConversionActionService_GetConversionAction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetConversionActionRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ConversionActionServiceServer).GetConversionAction(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ConversionActionService/GetConversionAction",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ConversionActionServiceServer).GetConversionAction(ctx, req.(*GetConversionActionRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ConversionActionService_MutateConversionActions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateConversionActionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ConversionActionServiceServer).MutateConversionActions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ConversionActionService/MutateConversionActions",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ConversionActionServiceServer).MutateConversionActions(ctx, req.(*MutateConversionActionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ConversionActionService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ConversionActionService",
+	HandlerType: (*ConversionActionServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetConversionAction",
+			Handler:    _ConversionActionService_GetConversionAction_Handler,
+		},
+		{
+			MethodName: "MutateConversionActions",
+			Handler:    _ConversionActionService_MutateConversionActions_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/conversion_action_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/conversion_adjustment_upload_service.pb.go b/googleapis/ads/googleads/v3/services/conversion_adjustment_upload_service.pb.go
new file mode 100644
index 0000000..efcee84
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/conversion_adjustment_upload_service.pb.go
@@ -0,0 +1,662 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/conversion_adjustment_upload_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [ConversionAdjustmentUploadService.UploadConversionAdjustments][google.ads.googleads.v3.services.ConversionAdjustmentUploadService.UploadConversionAdjustments].
+type UploadConversionAdjustmentsRequest struct {
+	// Required. The ID of the customer performing the upload.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The conversion adjustments that are being uploaded.
+	ConversionAdjustments []*ConversionAdjustment `protobuf:"bytes,2,rep,name=conversion_adjustments,json=conversionAdjustments,proto3" json:"conversion_adjustments,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried out
+	// in one transaction if and only if they are all valid. This should always be
+	// set to true.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UploadConversionAdjustmentsRequest) Reset()         { *m = UploadConversionAdjustmentsRequest{} }
+func (m *UploadConversionAdjustmentsRequest) String() string { return proto.CompactTextString(m) }
+func (*UploadConversionAdjustmentsRequest) ProtoMessage()    {}
+func (*UploadConversionAdjustmentsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0dcef73f64d51915, []int{0}
+}
+
+func (m *UploadConversionAdjustmentsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UploadConversionAdjustmentsRequest.Unmarshal(m, b)
+}
+func (m *UploadConversionAdjustmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UploadConversionAdjustmentsRequest.Marshal(b, m, deterministic)
+}
+func (m *UploadConversionAdjustmentsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UploadConversionAdjustmentsRequest.Merge(m, src)
+}
+func (m *UploadConversionAdjustmentsRequest) XXX_Size() int {
+	return xxx_messageInfo_UploadConversionAdjustmentsRequest.Size(m)
+}
+func (m *UploadConversionAdjustmentsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UploadConversionAdjustmentsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UploadConversionAdjustmentsRequest proto.InternalMessageInfo
+
+func (m *UploadConversionAdjustmentsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *UploadConversionAdjustmentsRequest) GetConversionAdjustments() []*ConversionAdjustment {
+	if m != nil {
+		return m.ConversionAdjustments
+	}
+	return nil
+}
+
+func (m *UploadConversionAdjustmentsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *UploadConversionAdjustmentsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// Response message for
+// [ConversionAdjustmentUploadService.UploadConversionAdjustments][google.ads.googleads.v3.services.ConversionAdjustmentUploadService.UploadConversionAdjustments].
+type UploadConversionAdjustmentsResponse struct {
+	// Errors that pertain to conversion adjustment failures in the partial
+	// failure mode. Returned when all errors occur inside the adjustments. If any
+	// errors occur outside the adjustments (e.g. auth errors), we return an RPC
+	// level error.
+	PartialFailureError *status.Status `protobuf:"bytes,1,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// Returned for successfully processed conversion adjustments. Proto will be
+	// empty for rows that received an error. Results are not returned when
+	// validate_only is true.
+	Results              []*ConversionAdjustmentResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *UploadConversionAdjustmentsResponse) Reset()         { *m = UploadConversionAdjustmentsResponse{} }
+func (m *UploadConversionAdjustmentsResponse) String() string { return proto.CompactTextString(m) }
+func (*UploadConversionAdjustmentsResponse) ProtoMessage()    {}
+func (*UploadConversionAdjustmentsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0dcef73f64d51915, []int{1}
+}
+
+func (m *UploadConversionAdjustmentsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UploadConversionAdjustmentsResponse.Unmarshal(m, b)
+}
+func (m *UploadConversionAdjustmentsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UploadConversionAdjustmentsResponse.Marshal(b, m, deterministic)
+}
+func (m *UploadConversionAdjustmentsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UploadConversionAdjustmentsResponse.Merge(m, src)
+}
+func (m *UploadConversionAdjustmentsResponse) XXX_Size() int {
+	return xxx_messageInfo_UploadConversionAdjustmentsResponse.Size(m)
+}
+func (m *UploadConversionAdjustmentsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_UploadConversionAdjustmentsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UploadConversionAdjustmentsResponse proto.InternalMessageInfo
+
+func (m *UploadConversionAdjustmentsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *UploadConversionAdjustmentsResponse) GetResults() []*ConversionAdjustmentResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// A conversion adjustment.
+type ConversionAdjustment struct {
+	// Resource name of the conversion action associated with this conversion
+	// adjustment. Note: Although this resource name consists of a customer id and
+	// a conversion action id, validation will ignore the customer id and use the
+	// conversion action id as the sole identifier of the conversion action.
+	ConversionAction *wrappers.StringValue `protobuf:"bytes,3,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
+	// The date time at which the adjustment occurred. Must be after the
+	// conversion_date_time. The timezone must be specified. The format is
+	// "yyyy-mm-dd hh:mm:ss+|-hh:mm", e.g. "2019-01-01 12:32:45-08:00".
+	AdjustmentDateTime *wrappers.StringValue `protobuf:"bytes,4,opt,name=adjustment_date_time,json=adjustmentDateTime,proto3" json:"adjustment_date_time,omitempty"`
+	// The adjustment type.
+	AdjustmentType enums.ConversionAdjustmentTypeEnum_ConversionAdjustmentType `protobuf:"varint,5,opt,name=adjustment_type,json=adjustmentType,proto3,enum=google.ads.googleads.v3.enums.ConversionAdjustmentTypeEnum_ConversionAdjustmentType" json:"adjustment_type,omitempty"`
+	// Information needed to restate the conversion's value.
+	// Required for restatements. Should not be supplied for retractions. An error
+	// will be returned if provided for a retraction.
+	RestatementValue *RestatementValue `protobuf:"bytes,6,opt,name=restatement_value,json=restatementValue,proto3" json:"restatement_value,omitempty"`
+	// Identifies the conversion to be adjusted.
+	//
+	// Types that are valid to be assigned to ConversionIdentifier:
+	//	*ConversionAdjustment_GclidDateTimePair
+	//	*ConversionAdjustment_OrderId
+	ConversionIdentifier isConversionAdjustment_ConversionIdentifier `protobuf_oneof:"conversion_identifier"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *ConversionAdjustment) Reset()         { *m = ConversionAdjustment{} }
+func (m *ConversionAdjustment) String() string { return proto.CompactTextString(m) }
+func (*ConversionAdjustment) ProtoMessage()    {}
+func (*ConversionAdjustment) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0dcef73f64d51915, []int{2}
+}
+
+func (m *ConversionAdjustment) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionAdjustment.Unmarshal(m, b)
+}
+func (m *ConversionAdjustment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionAdjustment.Marshal(b, m, deterministic)
+}
+func (m *ConversionAdjustment) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionAdjustment.Merge(m, src)
+}
+func (m *ConversionAdjustment) XXX_Size() int {
+	return xxx_messageInfo_ConversionAdjustment.Size(m)
+}
+func (m *ConversionAdjustment) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionAdjustment.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionAdjustment proto.InternalMessageInfo
+
+func (m *ConversionAdjustment) GetConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionAction
+	}
+	return nil
+}
+
+func (m *ConversionAdjustment) GetAdjustmentDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.AdjustmentDateTime
+	}
+	return nil
+}
+
+func (m *ConversionAdjustment) GetAdjustmentType() enums.ConversionAdjustmentTypeEnum_ConversionAdjustmentType {
+	if m != nil {
+		return m.AdjustmentType
+	}
+	return enums.ConversionAdjustmentTypeEnum_UNSPECIFIED
+}
+
+func (m *ConversionAdjustment) GetRestatementValue() *RestatementValue {
+	if m != nil {
+		return m.RestatementValue
+	}
+	return nil
+}
+
+type isConversionAdjustment_ConversionIdentifier interface {
+	isConversionAdjustment_ConversionIdentifier()
+}
+
+type ConversionAdjustment_GclidDateTimePair struct {
+	GclidDateTimePair *GclidDateTimePair `protobuf:"bytes,1,opt,name=gclid_date_time_pair,json=gclidDateTimePair,proto3,oneof"`
+}
+
+type ConversionAdjustment_OrderId struct {
+	OrderId *wrappers.StringValue `protobuf:"bytes,2,opt,name=order_id,json=orderId,proto3,oneof"`
+}
+
+func (*ConversionAdjustment_GclidDateTimePair) isConversionAdjustment_ConversionIdentifier() {}
+
+func (*ConversionAdjustment_OrderId) isConversionAdjustment_ConversionIdentifier() {}
+
+func (m *ConversionAdjustment) GetConversionIdentifier() isConversionAdjustment_ConversionIdentifier {
+	if m != nil {
+		return m.ConversionIdentifier
+	}
+	return nil
+}
+
+func (m *ConversionAdjustment) GetGclidDateTimePair() *GclidDateTimePair {
+	if x, ok := m.GetConversionIdentifier().(*ConversionAdjustment_GclidDateTimePair); ok {
+		return x.GclidDateTimePair
+	}
+	return nil
+}
+
+func (m *ConversionAdjustment) GetOrderId() *wrappers.StringValue {
+	if x, ok := m.GetConversionIdentifier().(*ConversionAdjustment_OrderId); ok {
+		return x.OrderId
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ConversionAdjustment) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ConversionAdjustment_GclidDateTimePair)(nil),
+		(*ConversionAdjustment_OrderId)(nil),
+	}
+}
+
+// Contains information needed to restate a conversion's value.
+type RestatementValue struct {
+	// The restated conversion value. This is the value of the conversion after
+	// restatement. For example, to change the value of a conversion from 100 to
+	// 70, an adjusted value of 70 should be reported.
+	AdjustedValue *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=adjusted_value,json=adjustedValue,proto3" json:"adjusted_value,omitempty"`
+	// The currency of the restated value. If not provided, then the default
+	// currency from the conversion action is used, and if that is not set then
+	// the account currency is used. This is the ISO 4217 3-character currency
+	// code e.g. USD or EUR.
+	CurrencyCode         *wrappers.StringValue `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *RestatementValue) Reset()         { *m = RestatementValue{} }
+func (m *RestatementValue) String() string { return proto.CompactTextString(m) }
+func (*RestatementValue) ProtoMessage()    {}
+func (*RestatementValue) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0dcef73f64d51915, []int{3}
+}
+
+func (m *RestatementValue) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RestatementValue.Unmarshal(m, b)
+}
+func (m *RestatementValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RestatementValue.Marshal(b, m, deterministic)
+}
+func (m *RestatementValue) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RestatementValue.Merge(m, src)
+}
+func (m *RestatementValue) XXX_Size() int {
+	return xxx_messageInfo_RestatementValue.Size(m)
+}
+func (m *RestatementValue) XXX_DiscardUnknown() {
+	xxx_messageInfo_RestatementValue.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RestatementValue proto.InternalMessageInfo
+
+func (m *RestatementValue) GetAdjustedValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.AdjustedValue
+	}
+	return nil
+}
+
+func (m *RestatementValue) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+// Uniquely identifies a conversion that was reported without an order ID
+// specified.
+type GclidDateTimePair struct {
+	// Google click ID (gclid) associated with the original conversion for this
+	// adjustment.
+	Gclid *wrappers.StringValue `protobuf:"bytes,1,opt,name=gclid,proto3" json:"gclid,omitempty"`
+	// The date time at which the original conversion for this adjustment
+	// occurred. The timezone must be specified. The format is "yyyy-mm-dd
+	// hh:mm:ss+|-hh:mm", e.g. "2019-01-01 12:32:45-08:00".
+	ConversionDateTime   *wrappers.StringValue `protobuf:"bytes,2,opt,name=conversion_date_time,json=conversionDateTime,proto3" json:"conversion_date_time,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *GclidDateTimePair) Reset()         { *m = GclidDateTimePair{} }
+func (m *GclidDateTimePair) String() string { return proto.CompactTextString(m) }
+func (*GclidDateTimePair) ProtoMessage()    {}
+func (*GclidDateTimePair) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0dcef73f64d51915, []int{4}
+}
+
+func (m *GclidDateTimePair) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GclidDateTimePair.Unmarshal(m, b)
+}
+func (m *GclidDateTimePair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GclidDateTimePair.Marshal(b, m, deterministic)
+}
+func (m *GclidDateTimePair) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GclidDateTimePair.Merge(m, src)
+}
+func (m *GclidDateTimePair) XXX_Size() int {
+	return xxx_messageInfo_GclidDateTimePair.Size(m)
+}
+func (m *GclidDateTimePair) XXX_DiscardUnknown() {
+	xxx_messageInfo_GclidDateTimePair.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GclidDateTimePair proto.InternalMessageInfo
+
+func (m *GclidDateTimePair) GetGclid() *wrappers.StringValue {
+	if m != nil {
+		return m.Gclid
+	}
+	return nil
+}
+
+func (m *GclidDateTimePair) GetConversionDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionDateTime
+	}
+	return nil
+}
+
+// Information identifying a successfully processed ConversionAdjustment.
+type ConversionAdjustmentResult struct {
+	// Resource name of the conversion action associated with this conversion
+	// adjustment.
+	ConversionAction *wrappers.StringValue `protobuf:"bytes,3,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
+	// The date time at which the adjustment occurred. The format is
+	// "yyyy-mm-dd hh:mm:ss+|-hh:mm", e.g. "2019-01-01 12:32:45-08:00".
+	AdjustmentDateTime *wrappers.StringValue `protobuf:"bytes,4,opt,name=adjustment_date_time,json=adjustmentDateTime,proto3" json:"adjustment_date_time,omitempty"`
+	// The adjustment type.
+	AdjustmentType enums.ConversionAdjustmentTypeEnum_ConversionAdjustmentType `protobuf:"varint,5,opt,name=adjustment_type,json=adjustmentType,proto3,enum=google.ads.googleads.v3.enums.ConversionAdjustmentTypeEnum_ConversionAdjustmentType" json:"adjustment_type,omitempty"`
+	// Identifies the conversion that was adjusted.
+	//
+	// Types that are valid to be assigned to ConversionIdentifier:
+	//	*ConversionAdjustmentResult_GclidDateTimePair
+	//	*ConversionAdjustmentResult_OrderId
+	ConversionIdentifier isConversionAdjustmentResult_ConversionIdentifier `protobuf_oneof:"conversion_identifier"`
+	XXX_NoUnkeyedLiteral struct{}                                          `json:"-"`
+	XXX_unrecognized     []byte                                            `json:"-"`
+	XXX_sizecache        int32                                             `json:"-"`
+}
+
+func (m *ConversionAdjustmentResult) Reset()         { *m = ConversionAdjustmentResult{} }
+func (m *ConversionAdjustmentResult) String() string { return proto.CompactTextString(m) }
+func (*ConversionAdjustmentResult) ProtoMessage()    {}
+func (*ConversionAdjustmentResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0dcef73f64d51915, []int{5}
+}
+
+func (m *ConversionAdjustmentResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConversionAdjustmentResult.Unmarshal(m, b)
+}
+func (m *ConversionAdjustmentResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConversionAdjustmentResult.Marshal(b, m, deterministic)
+}
+func (m *ConversionAdjustmentResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConversionAdjustmentResult.Merge(m, src)
+}
+func (m *ConversionAdjustmentResult) XXX_Size() int {
+	return xxx_messageInfo_ConversionAdjustmentResult.Size(m)
+}
+func (m *ConversionAdjustmentResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConversionAdjustmentResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConversionAdjustmentResult proto.InternalMessageInfo
+
+func (m *ConversionAdjustmentResult) GetConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionAction
+	}
+	return nil
+}
+
+func (m *ConversionAdjustmentResult) GetAdjustmentDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.AdjustmentDateTime
+	}
+	return nil
+}
+
+func (m *ConversionAdjustmentResult) GetAdjustmentType() enums.ConversionAdjustmentTypeEnum_ConversionAdjustmentType {
+	if m != nil {
+		return m.AdjustmentType
+	}
+	return enums.ConversionAdjustmentTypeEnum_UNSPECIFIED
+}
+
+type isConversionAdjustmentResult_ConversionIdentifier interface {
+	isConversionAdjustmentResult_ConversionIdentifier()
+}
+
+type ConversionAdjustmentResult_GclidDateTimePair struct {
+	GclidDateTimePair *GclidDateTimePair `protobuf:"bytes,1,opt,name=gclid_date_time_pair,json=gclidDateTimePair,proto3,oneof"`
+}
+
+type ConversionAdjustmentResult_OrderId struct {
+	OrderId *wrappers.StringValue `protobuf:"bytes,2,opt,name=order_id,json=orderId,proto3,oneof"`
+}
+
+func (*ConversionAdjustmentResult_GclidDateTimePair) isConversionAdjustmentResult_ConversionIdentifier() {
+}
+
+func (*ConversionAdjustmentResult_OrderId) isConversionAdjustmentResult_ConversionIdentifier() {}
+
+func (m *ConversionAdjustmentResult) GetConversionIdentifier() isConversionAdjustmentResult_ConversionIdentifier {
+	if m != nil {
+		return m.ConversionIdentifier
+	}
+	return nil
+}
+
+func (m *ConversionAdjustmentResult) GetGclidDateTimePair() *GclidDateTimePair {
+	if x, ok := m.GetConversionIdentifier().(*ConversionAdjustmentResult_GclidDateTimePair); ok {
+		return x.GclidDateTimePair
+	}
+	return nil
+}
+
+func (m *ConversionAdjustmentResult) GetOrderId() *wrappers.StringValue {
+	if x, ok := m.GetConversionIdentifier().(*ConversionAdjustmentResult_OrderId); ok {
+		return x.OrderId
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ConversionAdjustmentResult) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ConversionAdjustmentResult_GclidDateTimePair)(nil),
+		(*ConversionAdjustmentResult_OrderId)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*UploadConversionAdjustmentsRequest)(nil), "google.ads.googleads.v3.services.UploadConversionAdjustmentsRequest")
+	proto.RegisterType((*UploadConversionAdjustmentsResponse)(nil), "google.ads.googleads.v3.services.UploadConversionAdjustmentsResponse")
+	proto.RegisterType((*ConversionAdjustment)(nil), "google.ads.googleads.v3.services.ConversionAdjustment")
+	proto.RegisterType((*RestatementValue)(nil), "google.ads.googleads.v3.services.RestatementValue")
+	proto.RegisterType((*GclidDateTimePair)(nil), "google.ads.googleads.v3.services.GclidDateTimePair")
+	proto.RegisterType((*ConversionAdjustmentResult)(nil), "google.ads.googleads.v3.services.ConversionAdjustmentResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/conversion_adjustment_upload_service.proto", fileDescriptor_0dcef73f64d51915)
+}
+
+var fileDescriptor_0dcef73f64d51915 = []byte{
+	// 896 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0x4f, 0x8b, 0xe4, 0xc4,
+	0x1b, 0xde, 0xa4, 0xf7, 0xdf, 0xaf, 0x66, 0x67, 0x76, 0xa7, 0x7e, 0xb3, 0x6e, 0xd3, 0xbb, 0x68,
+	0x9b, 0x1d, 0x74, 0x58, 0x24, 0x81, 0x6e, 0x10, 0x36, 0xea, 0x42, 0xe6, 0xcf, 0xce, 0x0c, 0x82,
+	0x0e, 0x99, 0xb1, 0x0f, 0x32, 0x10, 0x6a, 0x52, 0xd5, 0xb1, 0x24, 0x5d, 0x15, 0xab, 0x2a, 0x2d,
+	0x8d, 0xec, 0xc5, 0xb3, 0x9e, 0x44, 0x04, 0x8f, 0x1e, 0xfd, 0x1e, 0x5e, 0x16, 0x3c, 0x79, 0x11,
+	0x4f, 0x1e, 0x3c, 0x79, 0xf4, 0x13, 0x48, 0x2a, 0xa9, 0xee, 0x6c, 0xdb, 0xd9, 0x2c, 0x7a, 0x12,
+	0xbc, 0x55, 0xde, 0x7a, 0xde, 0xf7, 0x79, 0xde, 0xa7, 0xea, 0xa5, 0x02, 0xde, 0x4d, 0x38, 0x4f,
+	0x52, 0xe2, 0x21, 0x2c, 0xbd, 0x72, 0x59, 0xac, 0xa6, 0x43, 0x4f, 0x12, 0x31, 0xa5, 0x31, 0x91,
+	0x5e, 0xcc, 0xd9, 0x94, 0x08, 0x49, 0x39, 0x8b, 0x10, 0xfe, 0x38, 0x97, 0x6a, 0x42, 0x98, 0x8a,
+	0xf2, 0x2c, 0xe5, 0x08, 0x47, 0x15, 0xca, 0xcd, 0x04, 0x57, 0x1c, 0xf6, 0xcb, 0x0a, 0x2e, 0xc2,
+	0xd2, 0x9d, 0x17, 0x73, 0xa7, 0x43, 0xd7, 0x14, 0xeb, 0x3d, 0x6a, 0xa2, 0x23, 0x2c, 0x9f, 0x34,
+	0x71, 0xa9, 0x59, 0x56, 0x31, 0xf4, 0xee, 0x99, 0xfc, 0x8c, 0x7a, 0x88, 0x31, 0xae, 0x90, 0xa2,
+	0x9c, 0xc9, 0x6a, 0xf7, 0x4e, 0x6d, 0x37, 0x4e, 0x29, 0x61, 0xaa, 0xda, 0x78, 0xa5, 0xb6, 0x31,
+	0xa6, 0x24, 0xc5, 0xd1, 0x05, 0xf9, 0x08, 0x4d, 0x29, 0x17, 0x15, 0xe0, 0xe5, 0x0a, 0xa0, 0xbf,
+	0x2e, 0xf2, 0xb1, 0xf7, 0xa9, 0x40, 0x59, 0x46, 0xc4, 0x72, 0x65, 0x91, 0xc5, 0x9e, 0x54, 0x48,
+	0xe5, 0xd5, 0x86, 0xf3, 0x85, 0x0d, 0x9c, 0x0f, 0xb4, 0x17, 0x7b, 0x73, 0xed, 0xc1, 0x5c, 0xba,
+	0x0c, 0xc9, 0x27, 0x39, 0x91, 0x0a, 0x6e, 0x83, 0xb5, 0x38, 0x97, 0x8a, 0x4f, 0x88, 0x88, 0x28,
+	0xee, 0x5a, 0x7d, 0x6b, 0xe7, 0x7f, 0xbb, 0x9d, 0x5f, 0x03, 0x3b, 0x04, 0x26, 0x7e, 0x8c, 0xa1,
+	0x00, 0x2f, 0xad, 0x74, 0x40, 0x76, 0xed, 0x7e, 0x67, 0x67, 0x6d, 0xf0, 0xa6, 0xdb, 0x66, 0xb0,
+	0xbb, 0x4a, 0x45, 0x49, 0x74, 0x3b, 0x5e, 0x25, 0x10, 0xbe, 0x0e, 0x6e, 0x66, 0x48, 0x28, 0x8a,
+	0xd2, 0x68, 0x8c, 0x68, 0x9a, 0x0b, 0xd2, 0xed, 0xf4, 0xad, 0x9d, 0xeb, 0xe1, 0x46, 0x15, 0x7e,
+	0x5c, 0x46, 0xe1, 0x7d, 0xb0, 0x3e, 0x45, 0x29, 0xc5, 0x48, 0x91, 0x88, 0xb3, 0x74, 0xd6, 0xbd,
+	0xac, 0x61, 0x37, 0x4c, 0xf0, 0x7d, 0x96, 0xce, 0x9c, 0x1f, 0x2c, 0x70, 0xff, 0xb9, 0x76, 0xc8,
+	0x8c, 0x33, 0x49, 0xe0, 0x63, 0x70, 0x7b, 0x89, 0x35, 0x22, 0x42, 0x70, 0xa1, 0x9d, 0x59, 0x1b,
+	0x40, 0xd3, 0xa8, 0xc8, 0x62, 0xf7, 0x54, 0xfb, 0x1d, 0xfe, 0xff, 0x59, 0x3d, 0x07, 0x05, 0x1c,
+	0x8e, 0xc0, 0x35, 0x41, 0x64, 0x9e, 0xce, 0x2d, 0x7a, 0xfb, 0xef, 0x59, 0x14, 0xea, 0x22, 0xa1,
+	0x29, 0xe6, 0xfc, 0x78, 0x19, 0x6c, 0xad, 0xc2, 0xc1, 0x63, 0xb0, 0x59, 0x3f, 0xa2, 0xb8, 0xb8,
+	0x7e, 0xda, 0xb0, 0xb5, 0xc1, 0x3d, 0x43, 0x6d, 0x2e, 0x91, 0x7b, 0xaa, 0x04, 0x65, 0xc9, 0x08,
+	0xa5, 0x39, 0x09, 0x6f, 0xd5, 0xec, 0xd7, 0x59, 0xf0, 0x3d, 0xb0, 0x55, 0xbb, 0xe4, 0xda, 0x57,
+	0x45, 0x27, 0x44, 0xfb, 0xda, 0x56, 0x0d, 0x2e, 0x32, 0xf7, 0x91, 0x22, 0x67, 0x74, 0x42, 0xe0,
+	0x13, 0x70, 0x73, 0x69, 0x68, 0xba, 0x57, 0xfa, 0xd6, 0xce, 0xc6, 0xe0, 0xac, 0xd1, 0x13, 0x3d,
+	0x75, 0x2b, 0x0d, 0x39, 0x9b, 0x65, 0xe4, 0x80, 0xe5, 0x93, 0xc6, 0xcd, 0x70, 0x03, 0x3d, 0xf3,
+	0x0d, 0x23, 0xb0, 0x29, 0x48, 0x31, 0x1b, 0x44, 0xf3, 0x4f, 0x0b, 0x9d, 0xdd, 0xab, 0xba, 0x97,
+	0x41, 0xfb, 0xa1, 0x84, 0x8b, 0xd4, 0xca, 0x2f, 0xb1, 0x14, 0x81, 0x63, 0xb0, 0x95, 0xc4, 0x29,
+	0xc5, 0x0b, 0xab, 0xa2, 0x0c, 0x51, 0x73, 0x65, 0x86, 0xed, 0x1c, 0x87, 0x45, 0xb6, 0xb1, 0xeb,
+	0x04, 0x51, 0x71, 0x74, 0x29, 0xdc, 0x4c, 0x96, 0x83, 0xf0, 0x21, 0xb8, 0xce, 0x05, 0x2e, 0x07,
+	0xd5, 0x6e, 0x3f, 0x8b, 0xa3, 0x4b, 0xe1, 0x35, 0x8d, 0x3f, 0xc6, 0xbb, 0x77, 0x40, 0x6d, 0xca,
+	0x22, 0x8a, 0x09, 0x53, 0x74, 0x4c, 0x89, 0x70, 0xbe, 0xb5, 0xc0, 0xad, 0xe5, 0x16, 0xe1, 0x1e,
+	0xa8, 0x3c, 0x24, 0xb8, 0xb2, 0xcb, 0x6a, 0xa0, 0xdb, 0xe7, 0xf9, 0x45, 0x4a, 0x4a, 0x63, 0xd6,
+	0x4d, 0x4e, 0x59, 0x24, 0x00, 0xeb, 0x71, 0x2e, 0x04, 0x61, 0xf1, 0x2c, 0x8a, 0x39, 0x26, 0x2f,
+	0x22, 0x39, 0xbc, 0x61, 0x52, 0xf6, 0x38, 0x26, 0xce, 0x37, 0x16, 0xd8, 0xfc, 0x8b, 0x37, 0x70,
+	0x00, 0xae, 0x68, 0x6f, 0x1a, 0x45, 0xd5, 0x0b, 0x96, 0xd0, 0xe2, 0x4a, 0xd7, 0xfa, 0x5f, 0x5c,
+	0xe9, 0x17, 0xd1, 0x04, 0x17, 0x99, 0x46, 0x87, 0xf3, 0x47, 0x07, 0xf4, 0x9a, 0xc7, 0xf5, 0xbf,
+	0x61, 0x6c, 0x1c, 0xc6, 0x7f, 0xf1, 0xac, 0x0c, 0x7e, 0xb6, 0xc1, 0xab, 0xab, 0x1a, 0x2d, 0xdf,
+	0x95, 0xd3, 0x52, 0x21, 0xfc, 0xda, 0x06, 0x77, 0x9f, 0xf3, 0xd2, 0xc0, 0xfd, 0xf6, 0x1e, 0xdb,
+	0xdf, 0xed, 0xde, 0xc1, 0x3f, 0xac, 0x52, 0x3e, 0x77, 0x0e, 0xfd, 0x25, 0x70, 0x6a, 0xef, 0xff,
+	0x1b, 0xab, 0x5f, 0xf9, 0xcf, 0x7f, 0xfa, 0xed, 0x2b, 0xfb, 0x91, 0xf3, 0xb0, 0xf8, 0x1f, 0x32,
+	0x68, 0xe9, 0x7d, 0x56, 0x4b, 0x7c, 0xe7, 0xc1, 0x13, 0x3f, 0x6f, 0xe6, 0xf3, 0xad, 0x07, 0xbd,
+	0xbb, 0x4f, 0x83, 0xee, 0x42, 0x68, 0xb5, 0xca, 0xa8, 0x74, 0x63, 0x3e, 0xd9, 0xfd, 0xd2, 0x06,
+	0xdb, 0x31, 0x9f, 0xb4, 0x36, 0xb5, 0xfb, 0x5a, 0xeb, 0x01, 0x9c, 0x14, 0xc7, 0x7b, 0x62, 0x7d,
+	0x78, 0x54, 0xd5, 0x4a, 0x78, 0x8a, 0x58, 0xe2, 0x72, 0x91, 0x78, 0x09, 0x61, 0xfa, 0xf0, 0xbd,
+	0x05, 0x7b, 0xf3, 0xff, 0xe5, 0x5b, 0x66, 0xf1, 0x9d, 0xdd, 0x39, 0x0c, 0x82, 0xef, 0xed, 0xfe,
+	0x61, 0x59, 0x30, 0xc0, 0xd2, 0x2d, 0x97, 0xc5, 0x6a, 0x34, 0x74, 0x2b, 0x62, 0xf9, 0xd4, 0x40,
+	0xce, 0x03, 0x2c, 0xcf, 0xe7, 0x90, 0xf3, 0xd1, 0xf0, 0xdc, 0x40, 0x7e, 0xb7, 0xb7, 0xcb, 0xb8,
+	0xef, 0x07, 0x58, 0xfa, 0xfe, 0x1c, 0xe4, 0xfb, 0xa3, 0xa1, 0xef, 0x1b, 0xd8, 0xc5, 0x55, 0xad,
+	0x73, 0xf8, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x8f, 0xa1, 0xb4, 0x06, 0x0b, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ConversionAdjustmentUploadServiceClient is the client API for ConversionAdjustmentUploadService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ConversionAdjustmentUploadServiceClient interface {
+	// Processes the given conversion adjustments.
+	UploadConversionAdjustments(ctx context.Context, in *UploadConversionAdjustmentsRequest, opts ...grpc.CallOption) (*UploadConversionAdjustmentsResponse, error)
+}
+
+type conversionAdjustmentUploadServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewConversionAdjustmentUploadServiceClient(cc grpc.ClientConnInterface) ConversionAdjustmentUploadServiceClient {
+	return &conversionAdjustmentUploadServiceClient{cc}
+}
+
+func (c *conversionAdjustmentUploadServiceClient) UploadConversionAdjustments(ctx context.Context, in *UploadConversionAdjustmentsRequest, opts ...grpc.CallOption) (*UploadConversionAdjustmentsResponse, error) {
+	out := new(UploadConversionAdjustmentsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ConversionAdjustmentUploadService/UploadConversionAdjustments", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ConversionAdjustmentUploadServiceServer is the server API for ConversionAdjustmentUploadService service.
+type ConversionAdjustmentUploadServiceServer interface {
+	// Processes the given conversion adjustments.
+	UploadConversionAdjustments(context.Context, *UploadConversionAdjustmentsRequest) (*UploadConversionAdjustmentsResponse, error)
+}
+
+// UnimplementedConversionAdjustmentUploadServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedConversionAdjustmentUploadServiceServer struct {
+}
+
+func (*UnimplementedConversionAdjustmentUploadServiceServer) UploadConversionAdjustments(ctx context.Context, req *UploadConversionAdjustmentsRequest) (*UploadConversionAdjustmentsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method UploadConversionAdjustments not implemented")
+}
+
+func RegisterConversionAdjustmentUploadServiceServer(s *grpc.Server, srv ConversionAdjustmentUploadServiceServer) {
+	s.RegisterService(&_ConversionAdjustmentUploadService_serviceDesc, srv)
+}
+
+func _ConversionAdjustmentUploadService_UploadConversionAdjustments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UploadConversionAdjustmentsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ConversionAdjustmentUploadServiceServer).UploadConversionAdjustments(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ConversionAdjustmentUploadService/UploadConversionAdjustments",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ConversionAdjustmentUploadServiceServer).UploadConversionAdjustments(ctx, req.(*UploadConversionAdjustmentsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ConversionAdjustmentUploadService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ConversionAdjustmentUploadService",
+	HandlerType: (*ConversionAdjustmentUploadServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "UploadConversionAdjustments",
+			Handler:    _ConversionAdjustmentUploadService_UploadConversionAdjustments_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/conversion_adjustment_upload_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/conversion_upload_service.pb.go b/googleapis/ads/googleads/v3/services/conversion_upload_service.pb.go
new file mode 100644
index 0000000..4e15320
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/conversion_upload_service.pb.go
@@ -0,0 +1,864 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/conversion_upload_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [ConversionUploadService.UploadClickConversions][google.ads.googleads.v3.services.ConversionUploadService.UploadClickConversions].
+type UploadClickConversionsRequest struct {
+	// Required. The ID of the customer performing the upload.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The conversions that are being uploaded.
+	Conversions []*ClickConversion `protobuf:"bytes,2,rep,name=conversions,proto3" json:"conversions,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// This should always be set to true.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UploadClickConversionsRequest) Reset()         { *m = UploadClickConversionsRequest{} }
+func (m *UploadClickConversionsRequest) String() string { return proto.CompactTextString(m) }
+func (*UploadClickConversionsRequest) ProtoMessage()    {}
+func (*UploadClickConversionsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86ad5d8f8879bebc, []int{0}
+}
+
+func (m *UploadClickConversionsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UploadClickConversionsRequest.Unmarshal(m, b)
+}
+func (m *UploadClickConversionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UploadClickConversionsRequest.Marshal(b, m, deterministic)
+}
+func (m *UploadClickConversionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UploadClickConversionsRequest.Merge(m, src)
+}
+func (m *UploadClickConversionsRequest) XXX_Size() int {
+	return xxx_messageInfo_UploadClickConversionsRequest.Size(m)
+}
+func (m *UploadClickConversionsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UploadClickConversionsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UploadClickConversionsRequest proto.InternalMessageInfo
+
+func (m *UploadClickConversionsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *UploadClickConversionsRequest) GetConversions() []*ClickConversion {
+	if m != nil {
+		return m.Conversions
+	}
+	return nil
+}
+
+func (m *UploadClickConversionsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *UploadClickConversionsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// Response message for [ConversionUploadService.UploadClickConversions][google.ads.googleads.v3.services.ConversionUploadService.UploadClickConversions].
+type UploadClickConversionsResponse struct {
+	// Errors that pertain to conversion failures in the partial failure mode.
+	// Returned when all errors occur inside the conversions. If any errors occur
+	// outside the conversions (e.g. auth errors), we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,1,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// Returned for successfully processed conversions. Proto will be empty for
+	// rows that received an error. Results are not returned when validate_only is
+	// true.
+	Results              []*ClickConversionResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *UploadClickConversionsResponse) Reset()         { *m = UploadClickConversionsResponse{} }
+func (m *UploadClickConversionsResponse) String() string { return proto.CompactTextString(m) }
+func (*UploadClickConversionsResponse) ProtoMessage()    {}
+func (*UploadClickConversionsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86ad5d8f8879bebc, []int{1}
+}
+
+func (m *UploadClickConversionsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UploadClickConversionsResponse.Unmarshal(m, b)
+}
+func (m *UploadClickConversionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UploadClickConversionsResponse.Marshal(b, m, deterministic)
+}
+func (m *UploadClickConversionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UploadClickConversionsResponse.Merge(m, src)
+}
+func (m *UploadClickConversionsResponse) XXX_Size() int {
+	return xxx_messageInfo_UploadClickConversionsResponse.Size(m)
+}
+func (m *UploadClickConversionsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_UploadClickConversionsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UploadClickConversionsResponse proto.InternalMessageInfo
+
+func (m *UploadClickConversionsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *UploadClickConversionsResponse) GetResults() []*ClickConversionResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// Request message for [ConversionUploadService.UploadCallConversions][google.ads.googleads.v3.services.ConversionUploadService.UploadCallConversions].
+type UploadCallConversionsRequest struct {
+	// Required. The ID of the customer performing the upload.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The conversions that are being uploaded.
+	Conversions []*CallConversion `protobuf:"bytes,2,rep,name=conversions,proto3" json:"conversions,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// This should always be set to true.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UploadCallConversionsRequest) Reset()         { *m = UploadCallConversionsRequest{} }
+func (m *UploadCallConversionsRequest) String() string { return proto.CompactTextString(m) }
+func (*UploadCallConversionsRequest) ProtoMessage()    {}
+func (*UploadCallConversionsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86ad5d8f8879bebc, []int{2}
+}
+
+func (m *UploadCallConversionsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UploadCallConversionsRequest.Unmarshal(m, b)
+}
+func (m *UploadCallConversionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UploadCallConversionsRequest.Marshal(b, m, deterministic)
+}
+func (m *UploadCallConversionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UploadCallConversionsRequest.Merge(m, src)
+}
+func (m *UploadCallConversionsRequest) XXX_Size() int {
+	return xxx_messageInfo_UploadCallConversionsRequest.Size(m)
+}
+func (m *UploadCallConversionsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UploadCallConversionsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UploadCallConversionsRequest proto.InternalMessageInfo
+
+func (m *UploadCallConversionsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *UploadCallConversionsRequest) GetConversions() []*CallConversion {
+	if m != nil {
+		return m.Conversions
+	}
+	return nil
+}
+
+func (m *UploadCallConversionsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *UploadCallConversionsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// Response message for [ConversionUploadService.UploadCallConversions][google.ads.googleads.v3.services.ConversionUploadService.UploadCallConversions].
+type UploadCallConversionsResponse struct {
+	// Errors that pertain to conversion failures in the partial failure mode.
+	// Returned when all errors occur inside the conversions. If any errors occur
+	// outside the conversions (e.g. auth errors), we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,1,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// Returned for successfully processed conversions. Proto will be empty for
+	// rows that received an error. Results are not returned when validate_only is
+	// true.
+	Results              []*CallConversionResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *UploadCallConversionsResponse) Reset()         { *m = UploadCallConversionsResponse{} }
+func (m *UploadCallConversionsResponse) String() string { return proto.CompactTextString(m) }
+func (*UploadCallConversionsResponse) ProtoMessage()    {}
+func (*UploadCallConversionsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86ad5d8f8879bebc, []int{3}
+}
+
+func (m *UploadCallConversionsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UploadCallConversionsResponse.Unmarshal(m, b)
+}
+func (m *UploadCallConversionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UploadCallConversionsResponse.Marshal(b, m, deterministic)
+}
+func (m *UploadCallConversionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UploadCallConversionsResponse.Merge(m, src)
+}
+func (m *UploadCallConversionsResponse) XXX_Size() int {
+	return xxx_messageInfo_UploadCallConversionsResponse.Size(m)
+}
+func (m *UploadCallConversionsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_UploadCallConversionsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UploadCallConversionsResponse proto.InternalMessageInfo
+
+func (m *UploadCallConversionsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *UploadCallConversionsResponse) GetResults() []*CallConversionResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// A click conversion.
+type ClickConversion struct {
+	// The Google click ID (gclid) associated with this conversion.
+	Gclid *wrappers.StringValue `protobuf:"bytes,1,opt,name=gclid,proto3" json:"gclid,omitempty"`
+	// Resource name of the conversion action associated with this conversion.
+	// Note: Although this resource name consists of a customer id and a
+	// conversion action id, validation will ignore the customer id and use the
+	// conversion action id as the sole identifier of the conversion action.
+	ConversionAction *wrappers.StringValue `protobuf:"bytes,2,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
+	// The date time at which the conversion occurred. Must be after
+	// the click time. The timezone must be specified. The format is
+	// "yyyy-mm-dd hh:mm:ss+|-hh:mm", e.g. “2019-01-01 12:32:45-08:00”.
+	ConversionDateTime *wrappers.StringValue `protobuf:"bytes,3,opt,name=conversion_date_time,json=conversionDateTime,proto3" json:"conversion_date_time,omitempty"`
+	// The value of the conversion for the advertiser.
+	ConversionValue *wrappers.DoubleValue `protobuf:"bytes,4,opt,name=conversion_value,json=conversionValue,proto3" json:"conversion_value,omitempty"`
+	// Currency associated with the conversion value. This is the ISO 4217
+	// 3-character currency code. For example: USD, EUR.
+	CurrencyCode *wrappers.StringValue `protobuf:"bytes,5,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	// The order ID associated with the conversion. An order id can only be used
+	// for one conversion per conversion action.
+	OrderId *wrappers.StringValue `protobuf:"bytes,6,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"`
+	// Additional data about externally attributed conversions. This field
+	// is required for conversions with an externally attributed conversion
+	// action, but should not be set otherwise.
+	ExternalAttributionData *ExternalAttributionData `protobuf:"bytes,7,opt,name=external_attribution_data,json=externalAttributionData,proto3" json:"external_attribution_data,omitempty"`
+	XXX_NoUnkeyedLiteral    struct{}                 `json:"-"`
+	XXX_unrecognized        []byte                   `json:"-"`
+	XXX_sizecache           int32                    `json:"-"`
+}
+
+func (m *ClickConversion) Reset()         { *m = ClickConversion{} }
+func (m *ClickConversion) String() string { return proto.CompactTextString(m) }
+func (*ClickConversion) ProtoMessage()    {}
+func (*ClickConversion) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86ad5d8f8879bebc, []int{4}
+}
+
+func (m *ClickConversion) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ClickConversion.Unmarshal(m, b)
+}
+func (m *ClickConversion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ClickConversion.Marshal(b, m, deterministic)
+}
+func (m *ClickConversion) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ClickConversion.Merge(m, src)
+}
+func (m *ClickConversion) XXX_Size() int {
+	return xxx_messageInfo_ClickConversion.Size(m)
+}
+func (m *ClickConversion) XXX_DiscardUnknown() {
+	xxx_messageInfo_ClickConversion.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClickConversion proto.InternalMessageInfo
+
+func (m *ClickConversion) GetGclid() *wrappers.StringValue {
+	if m != nil {
+		return m.Gclid
+	}
+	return nil
+}
+
+func (m *ClickConversion) GetConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionAction
+	}
+	return nil
+}
+
+func (m *ClickConversion) GetConversionDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionDateTime
+	}
+	return nil
+}
+
+func (m *ClickConversion) GetConversionValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ConversionValue
+	}
+	return nil
+}
+
+func (m *ClickConversion) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+func (m *ClickConversion) GetOrderId() *wrappers.StringValue {
+	if m != nil {
+		return m.OrderId
+	}
+	return nil
+}
+
+func (m *ClickConversion) GetExternalAttributionData() *ExternalAttributionData {
+	if m != nil {
+		return m.ExternalAttributionData
+	}
+	return nil
+}
+
+// A call conversion.
+type CallConversion struct {
+	// The caller id from which this call was placed. Caller id is expected to be
+	// in E.164 format with preceding '+' sign. e.g. "+16502531234".
+	CallerId *wrappers.StringValue `protobuf:"bytes,1,opt,name=caller_id,json=callerId,proto3" json:"caller_id,omitempty"`
+	// The date time at which the call occurred. The timezone must be specified.
+	// The format is "yyyy-mm-dd hh:mm:ss+|-hh:mm",
+	// e.g. "2019-01-01 12:32:45-08:00".
+	CallStartDateTime *wrappers.StringValue `protobuf:"bytes,2,opt,name=call_start_date_time,json=callStartDateTime,proto3" json:"call_start_date_time,omitempty"`
+	// Resource name of the conversion action associated with this conversion.
+	// Note: Although this resource name consists of a customer id and a
+	// conversion action id, validation will ignore the customer id and use the
+	// conversion action id as the sole identifier of the conversion action.
+	ConversionAction *wrappers.StringValue `protobuf:"bytes,3,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
+	// The date time at which the conversion occurred. Must be after the call
+	// time. The timezone must be specified. The format is
+	// "yyyy-mm-dd hh:mm:ss+|-hh:mm", e.g. "2019-01-01 12:32:45-08:00".
+	ConversionDateTime *wrappers.StringValue `protobuf:"bytes,4,opt,name=conversion_date_time,json=conversionDateTime,proto3" json:"conversion_date_time,omitempty"`
+	// The value of the conversion for the advertiser.
+	ConversionValue *wrappers.DoubleValue `protobuf:"bytes,5,opt,name=conversion_value,json=conversionValue,proto3" json:"conversion_value,omitempty"`
+	// Currency associated with the conversion value. This is the ISO 4217
+	// 3-character currency code. For example: USD, EUR.
+	CurrencyCode         *wrappers.StringValue `protobuf:"bytes,6,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CallConversion) Reset()         { *m = CallConversion{} }
+func (m *CallConversion) String() string { return proto.CompactTextString(m) }
+func (*CallConversion) ProtoMessage()    {}
+func (*CallConversion) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86ad5d8f8879bebc, []int{5}
+}
+
+func (m *CallConversion) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CallConversion.Unmarshal(m, b)
+}
+func (m *CallConversion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CallConversion.Marshal(b, m, deterministic)
+}
+func (m *CallConversion) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CallConversion.Merge(m, src)
+}
+func (m *CallConversion) XXX_Size() int {
+	return xxx_messageInfo_CallConversion.Size(m)
+}
+func (m *CallConversion) XXX_DiscardUnknown() {
+	xxx_messageInfo_CallConversion.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CallConversion proto.InternalMessageInfo
+
+func (m *CallConversion) GetCallerId() *wrappers.StringValue {
+	if m != nil {
+		return m.CallerId
+	}
+	return nil
+}
+
+func (m *CallConversion) GetCallStartDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.CallStartDateTime
+	}
+	return nil
+}
+
+func (m *CallConversion) GetConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionAction
+	}
+	return nil
+}
+
+func (m *CallConversion) GetConversionDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionDateTime
+	}
+	return nil
+}
+
+func (m *CallConversion) GetConversionValue() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ConversionValue
+	}
+	return nil
+}
+
+func (m *CallConversion) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+// Contains additional information about externally attributed conversions.
+type ExternalAttributionData struct {
+	// Represents the fraction of the conversion that is attributed to the
+	// Google Ads click.
+	ExternalAttributionCredit *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=external_attribution_credit,json=externalAttributionCredit,proto3" json:"external_attribution_credit,omitempty"`
+	// Specifies the attribution model name.
+	ExternalAttributionModel *wrappers.StringValue `protobuf:"bytes,2,opt,name=external_attribution_model,json=externalAttributionModel,proto3" json:"external_attribution_model,omitempty"`
+	XXX_NoUnkeyedLiteral     struct{}              `json:"-"`
+	XXX_unrecognized         []byte                `json:"-"`
+	XXX_sizecache            int32                 `json:"-"`
+}
+
+func (m *ExternalAttributionData) Reset()         { *m = ExternalAttributionData{} }
+func (m *ExternalAttributionData) String() string { return proto.CompactTextString(m) }
+func (*ExternalAttributionData) ProtoMessage()    {}
+func (*ExternalAttributionData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86ad5d8f8879bebc, []int{6}
+}
+
+func (m *ExternalAttributionData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExternalAttributionData.Unmarshal(m, b)
+}
+func (m *ExternalAttributionData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExternalAttributionData.Marshal(b, m, deterministic)
+}
+func (m *ExternalAttributionData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExternalAttributionData.Merge(m, src)
+}
+func (m *ExternalAttributionData) XXX_Size() int {
+	return xxx_messageInfo_ExternalAttributionData.Size(m)
+}
+func (m *ExternalAttributionData) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExternalAttributionData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExternalAttributionData proto.InternalMessageInfo
+
+func (m *ExternalAttributionData) GetExternalAttributionCredit() *wrappers.DoubleValue {
+	if m != nil {
+		return m.ExternalAttributionCredit
+	}
+	return nil
+}
+
+func (m *ExternalAttributionData) GetExternalAttributionModel() *wrappers.StringValue {
+	if m != nil {
+		return m.ExternalAttributionModel
+	}
+	return nil
+}
+
+// Identifying information for a successfully processed ClickConversion.
+type ClickConversionResult struct {
+	// The Google Click ID (gclid) associated with this conversion.
+	Gclid *wrappers.StringValue `protobuf:"bytes,1,opt,name=gclid,proto3" json:"gclid,omitempty"`
+	// Resource name of the conversion action associated with this conversion.
+	ConversionAction *wrappers.StringValue `protobuf:"bytes,2,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
+	// The date time at which the conversion occurred. The format is
+	// "yyyy-mm-dd hh:mm:ss+|-hh:mm", e.g. “2019-01-01 12:32:45-08:00”.
+	ConversionDateTime   *wrappers.StringValue `protobuf:"bytes,3,opt,name=conversion_date_time,json=conversionDateTime,proto3" json:"conversion_date_time,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ClickConversionResult) Reset()         { *m = ClickConversionResult{} }
+func (m *ClickConversionResult) String() string { return proto.CompactTextString(m) }
+func (*ClickConversionResult) ProtoMessage()    {}
+func (*ClickConversionResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86ad5d8f8879bebc, []int{7}
+}
+
+func (m *ClickConversionResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ClickConversionResult.Unmarshal(m, b)
+}
+func (m *ClickConversionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ClickConversionResult.Marshal(b, m, deterministic)
+}
+func (m *ClickConversionResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ClickConversionResult.Merge(m, src)
+}
+func (m *ClickConversionResult) XXX_Size() int {
+	return xxx_messageInfo_ClickConversionResult.Size(m)
+}
+func (m *ClickConversionResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_ClickConversionResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClickConversionResult proto.InternalMessageInfo
+
+func (m *ClickConversionResult) GetGclid() *wrappers.StringValue {
+	if m != nil {
+		return m.Gclid
+	}
+	return nil
+}
+
+func (m *ClickConversionResult) GetConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionAction
+	}
+	return nil
+}
+
+func (m *ClickConversionResult) GetConversionDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionDateTime
+	}
+	return nil
+}
+
+// Identifying information for a successfully processed CallConversionUpload.
+type CallConversionResult struct {
+	// The caller id from which this call was placed. Caller id is expected to be
+	// in E.164 format with preceding '+' sign.
+	CallerId *wrappers.StringValue `protobuf:"bytes,1,opt,name=caller_id,json=callerId,proto3" json:"caller_id,omitempty"`
+	// The date time at which the call occurred. The format is
+	// "yyyy-mm-dd hh:mm:ss+|-hh:mm", e.g. "2019-01-01 12:32:45-08:00".
+	CallStartDateTime *wrappers.StringValue `protobuf:"bytes,2,opt,name=call_start_date_time,json=callStartDateTime,proto3" json:"call_start_date_time,omitempty"`
+	// Resource name of the conversion action associated with this conversion.
+	ConversionAction *wrappers.StringValue `protobuf:"bytes,3,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
+	// The date time at which the conversion occurred. The format is
+	// "yyyy-mm-dd hh:mm:ss+|-hh:mm", e.g. "2019-01-01 12:32:45-08:00".
+	ConversionDateTime   *wrappers.StringValue `protobuf:"bytes,4,opt,name=conversion_date_time,json=conversionDateTime,proto3" json:"conversion_date_time,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CallConversionResult) Reset()         { *m = CallConversionResult{} }
+func (m *CallConversionResult) String() string { return proto.CompactTextString(m) }
+func (*CallConversionResult) ProtoMessage()    {}
+func (*CallConversionResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_86ad5d8f8879bebc, []int{8}
+}
+
+func (m *CallConversionResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CallConversionResult.Unmarshal(m, b)
+}
+func (m *CallConversionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CallConversionResult.Marshal(b, m, deterministic)
+}
+func (m *CallConversionResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CallConversionResult.Merge(m, src)
+}
+func (m *CallConversionResult) XXX_Size() int {
+	return xxx_messageInfo_CallConversionResult.Size(m)
+}
+func (m *CallConversionResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_CallConversionResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CallConversionResult proto.InternalMessageInfo
+
+func (m *CallConversionResult) GetCallerId() *wrappers.StringValue {
+	if m != nil {
+		return m.CallerId
+	}
+	return nil
+}
+
+func (m *CallConversionResult) GetCallStartDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.CallStartDateTime
+	}
+	return nil
+}
+
+func (m *CallConversionResult) GetConversionAction() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionAction
+	}
+	return nil
+}
+
+func (m *CallConversionResult) GetConversionDateTime() *wrappers.StringValue {
+	if m != nil {
+		return m.ConversionDateTime
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*UploadClickConversionsRequest)(nil), "google.ads.googleads.v3.services.UploadClickConversionsRequest")
+	proto.RegisterType((*UploadClickConversionsResponse)(nil), "google.ads.googleads.v3.services.UploadClickConversionsResponse")
+	proto.RegisterType((*UploadCallConversionsRequest)(nil), "google.ads.googleads.v3.services.UploadCallConversionsRequest")
+	proto.RegisterType((*UploadCallConversionsResponse)(nil), "google.ads.googleads.v3.services.UploadCallConversionsResponse")
+	proto.RegisterType((*ClickConversion)(nil), "google.ads.googleads.v3.services.ClickConversion")
+	proto.RegisterType((*CallConversion)(nil), "google.ads.googleads.v3.services.CallConversion")
+	proto.RegisterType((*ExternalAttributionData)(nil), "google.ads.googleads.v3.services.ExternalAttributionData")
+	proto.RegisterType((*ClickConversionResult)(nil), "google.ads.googleads.v3.services.ClickConversionResult")
+	proto.RegisterType((*CallConversionResult)(nil), "google.ads.googleads.v3.services.CallConversionResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/conversion_upload_service.proto", fileDescriptor_86ad5d8f8879bebc)
+}
+
+var fileDescriptor_86ad5d8f8879bebc = []byte{
+	// 977 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0xcf, 0x6f, 0xdc, 0x44,
+	0x14, 0x96, 0xbd, 0xf9, 0xd5, 0xd9, 0xb6, 0xa1, 0x43, 0xc2, 0xba, 0xdb, 0x50, 0x56, 0x26, 0x12,
+	0x51, 0x84, 0x6c, 0xd8, 0x45, 0x94, 0x18, 0x41, 0xeb, 0x24, 0x6d, 0xc8, 0xa1, 0x10, 0x36, 0x10,
+	0x4a, 0xb5, 0x92, 0x35, 0x6b, 0x4f, 0x96, 0x11, 0xb3, 0x1e, 0x33, 0x33, 0x5e, 0x88, 0x10, 0x17,
+	0xf8, 0x13, 0xb8, 0x72, 0x42, 0x9c, 0xf8, 0x0f, 0x50, 0x4f, 0x5c, 0x7b, 0xed, 0x8d, 0x13, 0x07,
+	0xc4, 0x01, 0xc4, 0x85, 0x03, 0x67, 0xe4, 0x5f, 0x6b, 0x67, 0xe5, 0x65, 0x9d, 0x28, 0x5c, 0x10,
+	0xb7, 0xc9, 0xcc, 0xfb, 0xbe, 0x79, 0xef, 0x7d, 0x9f, 0x67, 0x5f, 0xc0, 0x9d, 0x01, 0x63, 0x03,
+	0x8a, 0x4d, 0xe4, 0x09, 0x33, 0x59, 0x46, 0xab, 0x51, 0xc7, 0x14, 0x98, 0x8f, 0x88, 0x8b, 0x85,
+	0xe9, 0x32, 0x7f, 0x84, 0xb9, 0x20, 0xcc, 0x77, 0xc2, 0x80, 0x32, 0xe4, 0x39, 0xe9, 0x91, 0x11,
+	0x70, 0x26, 0x19, 0x6c, 0x25, 0x30, 0x03, 0x79, 0xc2, 0x18, 0x33, 0x18, 0xa3, 0x8e, 0x91, 0x31,
+	0x34, 0xd7, 0xb2, 0x3b, 0x02, 0x62, 0x22, 0xdf, 0x67, 0x12, 0x49, 0xc2, 0x7c, 0x91, 0xe0, 0x9b,
+	0x8d, 0xc2, 0xa9, 0x4b, 0x09, 0xf6, 0x65, 0x7a, 0xf0, 0x5c, 0xe1, 0xe0, 0x98, 0x60, 0xea, 0x39,
+	0x7d, 0xfc, 0x11, 0x1a, 0x11, 0xc6, 0xd3, 0x80, 0x9b, 0x69, 0x40, 0xfc, 0x57, 0x3f, 0x3c, 0x36,
+	0x3f, 0xe5, 0x28, 0x08, 0x30, 0x9f, 0x64, 0xe6, 0x81, 0x6b, 0x0a, 0x89, 0x64, 0x98, 0x1e, 0xe8,
+	0x7f, 0x28, 0xe0, 0xd9, 0xf7, 0xe3, 0x5a, 0x76, 0x28, 0x71, 0x3f, 0xde, 0x19, 0x57, 0x28, 0xba,
+	0xf8, 0x93, 0x10, 0x0b, 0x09, 0xd7, 0x41, 0xdd, 0x0d, 0x85, 0x64, 0x43, 0xcc, 0x1d, 0xe2, 0x69,
+	0x4a, 0x4b, 0xd9, 0xb8, 0xb4, 0x5d, 0xfb, 0xd9, 0x56, 0xbb, 0x20, 0xdb, 0xdf, 0xf7, 0xe0, 0x03,
+	0x50, 0xcf, 0xbb, 0x23, 0x34, 0xb5, 0x55, 0xdb, 0xa8, 0xb7, 0x5f, 0x36, 0x66, 0x35, 0xc4, 0x98,
+	0xb8, 0x35, 0x21, 0x2e, 0x52, 0xc1, 0x17, 0xc0, 0x72, 0x80, 0xb8, 0x24, 0x88, 0x3a, 0xc7, 0x88,
+	0xd0, 0x90, 0x63, 0xad, 0xd6, 0x52, 0x36, 0x96, 0xba, 0x57, 0xd3, 0xed, 0x7b, 0xc9, 0x2e, 0x7c,
+	0x1e, 0x5c, 0x19, 0x21, 0x4a, 0x3c, 0x24, 0xb1, 0xc3, 0x7c, 0x7a, 0xa2, 0xcd, 0xc5, 0x61, 0x97,
+	0xb3, 0xcd, 0x77, 0x7c, 0x7a, 0xa2, 0x3f, 0x52, 0xc0, 0xcd, 0x69, 0xf5, 0x8a, 0x80, 0xf9, 0x02,
+	0xc3, 0x7b, 0x60, 0x75, 0xe2, 0x42, 0x07, 0x73, 0xce, 0x78, 0x5c, 0x7a, 0xbd, 0x0d, 0xb3, 0xa2,
+	0x78, 0xe0, 0x1a, 0x87, 0x71, 0x2f, 0xbb, 0x4f, 0x9f, 0x4e, 0xe5, 0x6e, 0x14, 0x0e, 0xdf, 0x05,
+	0x8b, 0x1c, 0x8b, 0x90, 0xca, 0xac, 0x1d, 0xb7, 0xce, 0xdc, 0x8e, 0x6e, 0x8c, 0xef, 0x66, 0x3c,
+	0xfa, 0xef, 0x0a, 0x58, 0x4b, 0xb3, 0x47, 0x94, 0x9e, 0x5b, 0xac, 0x0f, 0xca, 0xc4, 0x7a, 0xa9,
+	0x42, 0x76, 0xa7, 0x2e, 0xfd, 0xd7, 0xb5, 0xfa, 0x21, 0xf7, 0xe6, 0x64, 0xb5, 0x17, 0x2c, 0xd5,
+	0xc1, 0xa4, 0x54, 0xaf, 0x9e, 0xb5, 0x19, 0x93, 0x4a, 0x7d, 0x33, 0x07, 0x96, 0x27, 0xc4, 0x84,
+	0x6d, 0x30, 0x3f, 0x70, 0x69, 0x2a, 0x4b, 0xbd, 0xbd, 0x96, 0xdd, 0x91, 0x7d, 0xb4, 0xc6, 0xa1,
+	0xe4, 0xc4, 0x1f, 0x1c, 0x21, 0x1a, 0xe2, 0x6e, 0x12, 0x0a, 0xf7, 0xc1, 0xb5, 0xc2, 0xab, 0x83,
+	0xdc, 0xe8, 0xb9, 0xd0, 0xd4, 0x0a, 0xf8, 0xa7, 0x72, 0x98, 0x1d, 0xa3, 0xe0, 0xdb, 0x60, 0xa5,
+	0x40, 0x15, 0xb7, 0x5e, 0x92, 0x61, 0xa2, 0xd0, 0x2c, 0x36, 0x98, 0x23, 0x77, 0x91, 0xc4, 0xef,
+	0x91, 0x21, 0x86, 0x7b, 0xa0, 0x70, 0x87, 0x33, 0x8a, 0xe2, 0x62, 0x19, 0xcb, 0xb8, 0x76, 0x59,
+	0xd8, 0xa7, 0x38, 0xe1, 0x5a, 0xce, 0x51, 0xf1, 0x06, 0xb4, 0xc1, 0x15, 0x37, 0xe4, 0x1c, 0xfb,
+	0xee, 0x89, 0xe3, 0x32, 0x0f, 0x6b, 0xf3, 0x15, 0x32, 0xba, 0x9c, 0x41, 0x76, 0x98, 0x87, 0xe1,
+	0x2d, 0xb0, 0xc4, 0xb8, 0x97, 0x98, 0x7e, 0xa1, 0x02, 0x7a, 0x31, 0x8e, 0xde, 0xf7, 0x60, 0x08,
+	0xae, 0xe3, 0xcf, 0x24, 0xe6, 0x3e, 0xa2, 0x0e, 0x92, 0x92, 0x93, 0x7e, 0x28, 0xd3, 0xf6, 0x20,
+	0x6d, 0x31, 0x66, 0xda, 0x9a, 0xed, 0x85, 0xbb, 0x29, 0x85, 0x9d, 0x33, 0xec, 0x22, 0x89, 0xba,
+	0x0d, 0x5c, 0x7e, 0xa0, 0xff, 0x58, 0x03, 0x57, 0x4f, 0x1b, 0x08, 0x6e, 0x81, 0x4b, 0x2e, 0xa2,
+	0x34, 0xff, 0x70, 0x67, 0xd5, 0xb0, 0x94, 0x84, 0xef, 0x7b, 0xf0, 0x3e, 0x58, 0x89, 0xd6, 0x8e,
+	0x90, 0x88, 0xcb, 0x82, 0xb2, 0x55, 0x7c, 0x72, 0x2d, 0x42, 0x1e, 0x46, 0xc0, 0xb1, 0xb0, 0xa5,
+	0x9e, 0xab, 0x5d, 0xa8, 0xe7, 0xe6, 0x2e, 0xd0, 0x73, 0xf3, 0x17, 0xe2, 0xb9, 0x85, 0xb3, 0x7a,
+	0x4e, 0x7f, 0xa2, 0x80, 0xc6, 0x14, 0xe1, 0x61, 0x0f, 0xdc, 0x28, 0xb5, 0x95, 0xcb, 0xb1, 0x47,
+	0xe4, 0x54, 0x79, 0x8b, 0x29, 0x5f, 0x2f, 0xf1, 0xce, 0x4e, 0x0c, 0x87, 0x0f, 0x41, 0xb3, 0x94,
+	0x7d, 0xc8, 0x3c, 0x4c, 0x2b, 0xa9, 0xae, 0x95, 0x90, 0xdf, 0x8f, 0xd0, 0xfa, 0xaf, 0x0a, 0x58,
+	0x2d, 0xfd, 0x15, 0xfa, 0x8f, 0x3d, 0x5f, 0xfa, 0x23, 0x15, 0xac, 0x94, 0xbd, 0xe1, 0xff, 0x7f,
+	0x88, 0x15, 0xba, 0xd7, 0xfe, 0x6e, 0x0e, 0x34, 0xf2, 0xce, 0x25, 0xbf, 0xd2, 0x87, 0xc9, 0x73,
+	0x08, 0xff, 0x52, 0xc0, 0x33, 0xe5, 0x33, 0x16, 0xbc, 0x3d, 0xfb, 0x2d, 0xfd, 0xc7, 0x69, 0xb4,
+	0x79, 0xe7, 0xfc, 0x04, 0xc9, 0xcc, 0xa0, 0x7f, 0xf8, 0x93, 0xdd, 0x28, 0xcc, 0x48, 0x2f, 0x16,
+	0xe6, 0x97, 0x2f, 0x9f, 0xfc, 0xf2, 0xb5, 0xba, 0xa5, 0xbf, 0x12, 0x0d, 0xfd, 0x59, 0x88, 0x30,
+	0x3f, 0x2f, 0x44, 0xbf, 0xb1, 0xf9, 0x85, 0x15, 0x96, 0xf2, 0x5b, 0xca, 0x26, 0xfc, 0x53, 0x01,
+	0xab, 0xa5, 0x03, 0x0b, 0x7c, 0xb3, 0x72, 0xda, 0xa5, 0x73, 0x5d, 0xf3, 0xf6, 0xb9, 0xf1, 0x69,
+	0xd5, 0x0f, 0x66, 0x54, 0xfd, 0x9a, 0xde, 0xa9, 0x54, 0xf5, 0x69, 0x7a, 0x4b, 0xd9, 0x6c, 0xde,
+	0x78, 0x6c, 0x6b, 0x79, 0x46, 0xe9, 0x2a, 0x20, 0xc2, 0x70, 0xd9, 0x70, 0xfb, 0x2b, 0x15, 0xac,
+	0xbb, 0x6c, 0x38, 0x33, 0xfb, 0xed, 0xb5, 0x29, 0x66, 0x3a, 0x88, 0x0c, 0x79, 0xa0, 0x3c, 0x7c,
+	0x2b, 0x65, 0x18, 0x30, 0x8a, 0xfc, 0x81, 0xc1, 0xf8, 0xc0, 0x1c, 0x60, 0x3f, 0xb6, 0xab, 0x99,
+	0xdf, 0x39, 0xfd, 0x7f, 0xb7, 0xd7, 0xb3, 0xc5, 0xb7, 0x6a, 0x6d, 0xcf, 0xb6, 0xbf, 0x57, 0x5b,
+	0x7b, 0x09, 0xa1, 0xed, 0x09, 0x23, 0x59, 0x46, 0xab, 0xa3, 0x8e, 0x91, 0x5e, 0x2c, 0x1e, 0x67,
+	0x21, 0x3d, 0xdb, 0x13, 0xbd, 0x71, 0x48, 0xef, 0xa8, 0xd3, 0xcb, 0x42, 0x7e, 0x53, 0xd7, 0x93,
+	0x7d, 0xcb, 0xb2, 0x3d, 0x61, 0x59, 0xe3, 0x20, 0xcb, 0x3a, 0xea, 0x58, 0x56, 0x16, 0xd6, 0x5f,
+	0x88, 0xf3, 0xec, 0xfc, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x96, 0x60, 0xbf, 0x4a, 0x62, 0x0e, 0x00,
+	0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ConversionUploadServiceClient is the client API for ConversionUploadService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ConversionUploadServiceClient interface {
+	// Processes the given click conversions.
+	UploadClickConversions(ctx context.Context, in *UploadClickConversionsRequest, opts ...grpc.CallOption) (*UploadClickConversionsResponse, error)
+	// Processes the given call conversions.
+	UploadCallConversions(ctx context.Context, in *UploadCallConversionsRequest, opts ...grpc.CallOption) (*UploadCallConversionsResponse, error)
+}
+
+type conversionUploadServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewConversionUploadServiceClient(cc grpc.ClientConnInterface) ConversionUploadServiceClient {
+	return &conversionUploadServiceClient{cc}
+}
+
+func (c *conversionUploadServiceClient) UploadClickConversions(ctx context.Context, in *UploadClickConversionsRequest, opts ...grpc.CallOption) (*UploadClickConversionsResponse, error) {
+	out := new(UploadClickConversionsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ConversionUploadService/UploadClickConversions", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *conversionUploadServiceClient) UploadCallConversions(ctx context.Context, in *UploadCallConversionsRequest, opts ...grpc.CallOption) (*UploadCallConversionsResponse, error) {
+	out := new(UploadCallConversionsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ConversionUploadService/UploadCallConversions", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ConversionUploadServiceServer is the server API for ConversionUploadService service.
+type ConversionUploadServiceServer interface {
+	// Processes the given click conversions.
+	UploadClickConversions(context.Context, *UploadClickConversionsRequest) (*UploadClickConversionsResponse, error)
+	// Processes the given call conversions.
+	UploadCallConversions(context.Context, *UploadCallConversionsRequest) (*UploadCallConversionsResponse, error)
+}
+
+// UnimplementedConversionUploadServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedConversionUploadServiceServer struct {
+}
+
+func (*UnimplementedConversionUploadServiceServer) UploadClickConversions(ctx context.Context, req *UploadClickConversionsRequest) (*UploadClickConversionsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method UploadClickConversions not implemented")
+}
+func (*UnimplementedConversionUploadServiceServer) UploadCallConversions(ctx context.Context, req *UploadCallConversionsRequest) (*UploadCallConversionsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method UploadCallConversions not implemented")
+}
+
+func RegisterConversionUploadServiceServer(s *grpc.Server, srv ConversionUploadServiceServer) {
+	s.RegisterService(&_ConversionUploadService_serviceDesc, srv)
+}
+
+func _ConversionUploadService_UploadClickConversions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UploadClickConversionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ConversionUploadServiceServer).UploadClickConversions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ConversionUploadService/UploadClickConversions",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ConversionUploadServiceServer).UploadClickConversions(ctx, req.(*UploadClickConversionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ConversionUploadService_UploadCallConversions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UploadCallConversionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ConversionUploadServiceServer).UploadCallConversions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ConversionUploadService/UploadCallConversions",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ConversionUploadServiceServer).UploadCallConversions(ctx, req.(*UploadCallConversionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ConversionUploadService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ConversionUploadService",
+	HandlerType: (*ConversionUploadServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "UploadClickConversions",
+			Handler:    _ConversionUploadService_UploadClickConversions_Handler,
+		},
+		{
+			MethodName: "UploadCallConversions",
+			Handler:    _ConversionUploadService_UploadCallConversions_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/conversion_upload_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/currency_constant_service.pb.go b/googleapis/ads/googleads/v3/services/currency_constant_service.pb.go
new file mode 100644
index 0000000..c51c692
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/currency_constant_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/currency_constant_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CurrencyConstantService.GetCurrencyConstant][google.ads.googleads.v3.services.CurrencyConstantService.GetCurrencyConstant].
+type GetCurrencyConstantRequest struct {
+	// Required. Resource name of the currency constant to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCurrencyConstantRequest) Reset()         { *m = GetCurrencyConstantRequest{} }
+func (m *GetCurrencyConstantRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCurrencyConstantRequest) ProtoMessage()    {}
+func (*GetCurrencyConstantRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_823f63dbbd8d219a, []int{0}
+}
+
+func (m *GetCurrencyConstantRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCurrencyConstantRequest.Unmarshal(m, b)
+}
+func (m *GetCurrencyConstantRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCurrencyConstantRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCurrencyConstantRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCurrencyConstantRequest.Merge(m, src)
+}
+func (m *GetCurrencyConstantRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCurrencyConstantRequest.Size(m)
+}
+func (m *GetCurrencyConstantRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCurrencyConstantRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCurrencyConstantRequest proto.InternalMessageInfo
+
+func (m *GetCurrencyConstantRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCurrencyConstantRequest)(nil), "google.ads.googleads.v3.services.GetCurrencyConstantRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/currency_constant_service.proto", fileDescriptor_823f63dbbd8d219a)
+}
+
+var fileDescriptor_823f63dbbd8d219a = []byte{
+	// 404 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcf, 0x8a, 0xd3, 0x40,
+	0x18, 0x27, 0x29, 0x08, 0x06, 0xbd, 0xc4, 0x43, 0x4b, 0x2c, 0x58, 0x4a, 0xc1, 0xea, 0x61, 0x06,
+	0xcc, 0xc9, 0x51, 0xd1, 0x69, 0xc1, 0x7a, 0x92, 0x52, 0xa1, 0x07, 0x09, 0x84, 0xe9, 0x64, 0x8c,
+	0x81, 0x64, 0xa6, 0xce, 0xa4, 0x01, 0x11, 0x2f, 0xf5, 0x11, 0x7c, 0x83, 0x3d, 0xee, 0x9b, 0x6c,
+	0xaf, 0x7b, 0xdb, 0xd3, 0x1e, 0xf6, 0xb4, 0x4f, 0xb1, 0xa4, 0x93, 0x49, 0xff, 0xd0, 0xd0, 0xdb,
+	0x8f, 0xfc, 0xfe, 0xcd, 0xf7, 0x7d, 0x71, 0x3e, 0xc5, 0x42, 0xc4, 0x29, 0x83, 0x24, 0x52, 0x50,
+	0xc3, 0x12, 0x15, 0x3e, 0x54, 0x4c, 0x16, 0x09, 0x65, 0x0a, 0xd2, 0x95, 0x94, 0x8c, 0xd3, 0xdf,
+	0x21, 0x15, 0x5c, 0xe5, 0x84, 0xe7, 0x61, 0x45, 0x81, 0xa5, 0x14, 0xb9, 0x70, 0x7b, 0xda, 0x06,
+	0x48, 0xa4, 0x40, 0x9d, 0x00, 0x0a, 0x1f, 0x98, 0x04, 0xef, 0x6d, 0x53, 0x87, 0x64, 0x4a, 0xac,
+	0xe4, 0xc9, 0x12, 0x1d, 0xee, 0x75, 0x8d, 0x75, 0x99, 0x40, 0xc2, 0xb9, 0xc8, 0x49, 0x9e, 0x08,
+	0xae, 0x2a, 0xb6, 0xbd, 0xc7, 0xd2, 0x34, 0x61, 0xb5, 0xed, 0xc5, 0x1e, 0xf1, 0x23, 0x61, 0x69,
+	0x14, 0x2e, 0xd8, 0x4f, 0x52, 0x24, 0x42, 0x6a, 0x41, 0xff, 0xb3, 0xe3, 0x4d, 0x58, 0x3e, 0xae,
+	0x5a, 0xc7, 0x55, 0xe9, 0x8c, 0xfd, 0x5a, 0x31, 0x95, 0xbb, 0x43, 0xe7, 0xa9, 0x79, 0x5a, 0xc8,
+	0x49, 0xc6, 0x3a, 0x56, 0xcf, 0x1a, 0x3e, 0x1e, 0xb5, 0x6e, 0xb1, 0x3d, 0x7b, 0x62, 0x98, 0xaf,
+	0x24, 0x63, 0x6f, 0xd6, 0xb6, 0xd3, 0x3e, 0x4e, 0xf9, 0xa6, 0xe7, 0x76, 0xaf, 0x2c, 0xe7, 0xd9,
+	0x89, 0x12, 0xf7, 0x3d, 0x38, 0xb7, 0x31, 0xd0, 0xfc, 0x36, 0xcf, 0x6f, 0x74, 0xd7, 0xdb, 0x04,
+	0xc7, 0xde, 0xfe, 0xc7, 0x1b, 0x7c, 0x38, 0xd1, 0xfa, 0xfa, 0xee, 0xbf, 0xfd, 0xca, 0x7d, 0x59,
+	0x5e, 0xe1, 0xcf, 0x01, 0xf3, 0x81, 0x1e, 0x99, 0x15, 0x7c, 0xfd, 0xd7, 0x7b, 0xbe, 0xc1, 0x9d,
+	0x5d, 0x59, 0x85, 0x96, 0x89, 0x02, 0x54, 0x64, 0xa3, 0x7f, 0xb6, 0x33, 0xa0, 0x22, 0x3b, 0x3b,
+	0xd6, 0xa8, 0xdb, 0xb0, 0xaa, 0x69, 0x79, 0x93, 0xa9, 0xf5, 0xfd, 0x4b, 0x95, 0x10, 0x8b, 0x94,
+	0xf0, 0x18, 0x08, 0x19, 0xc3, 0x98, 0xf1, 0xed, 0xc5, 0xe0, 0xae, 0xb3, 0xf9, 0x5f, 0x7d, 0x67,
+	0xc0, 0x85, 0xdd, 0x9a, 0x60, 0x7c, 0x69, 0xf7, 0x26, 0x3a, 0x10, 0x47, 0x0a, 0x68, 0x58, 0xa2,
+	0xb9, 0x0f, 0xaa, 0x62, 0xb5, 0x31, 0x92, 0x00, 0x47, 0x2a, 0xa8, 0x25, 0xc1, 0xdc, 0x0f, 0x8c,
+	0xe4, 0xde, 0x1e, 0xe8, 0xef, 0x08, 0xe1, 0x48, 0x21, 0x54, 0x8b, 0x10, 0x9a, 0xfb, 0x08, 0x19,
+	0xd9, 0xe2, 0xd1, 0xf6, 0x9d, 0xfe, 0x43, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe5, 0x98, 0x53, 0xcf,
+	0x52, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CurrencyConstantServiceClient is the client API for CurrencyConstantService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CurrencyConstantServiceClient interface {
+	// Returns the requested currency constant.
+	GetCurrencyConstant(ctx context.Context, in *GetCurrencyConstantRequest, opts ...grpc.CallOption) (*resources.CurrencyConstant, error)
+}
+
+type currencyConstantServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCurrencyConstantServiceClient(cc grpc.ClientConnInterface) CurrencyConstantServiceClient {
+	return &currencyConstantServiceClient{cc}
+}
+
+func (c *currencyConstantServiceClient) GetCurrencyConstant(ctx context.Context, in *GetCurrencyConstantRequest, opts ...grpc.CallOption) (*resources.CurrencyConstant, error) {
+	out := new(resources.CurrencyConstant)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CurrencyConstantService/GetCurrencyConstant", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CurrencyConstantServiceServer is the server API for CurrencyConstantService service.
+type CurrencyConstantServiceServer interface {
+	// Returns the requested currency constant.
+	GetCurrencyConstant(context.Context, *GetCurrencyConstantRequest) (*resources.CurrencyConstant, error)
+}
+
+// UnimplementedCurrencyConstantServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCurrencyConstantServiceServer struct {
+}
+
+func (*UnimplementedCurrencyConstantServiceServer) GetCurrencyConstant(ctx context.Context, req *GetCurrencyConstantRequest) (*resources.CurrencyConstant, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetCurrencyConstant not implemented")
+}
+
+func RegisterCurrencyConstantServiceServer(s *grpc.Server, srv CurrencyConstantServiceServer) {
+	s.RegisterService(&_CurrencyConstantService_serviceDesc, srv)
+}
+
+func _CurrencyConstantService_GetCurrencyConstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCurrencyConstantRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CurrencyConstantServiceServer).GetCurrencyConstant(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CurrencyConstantService/GetCurrencyConstant",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CurrencyConstantServiceServer).GetCurrencyConstant(ctx, req.(*GetCurrencyConstantRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CurrencyConstantService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CurrencyConstantService",
+	HandlerType: (*CurrencyConstantServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCurrencyConstant",
+			Handler:    _CurrencyConstantService_GetCurrencyConstant_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/currency_constant_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/custom_interest_service.pb.go b/googleapis/ads/googleads/v3/services/custom_interest_service.pb.go
new file mode 100644
index 0000000..36c8599
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/custom_interest_service.pb.go
@@ -0,0 +1,483 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/custom_interest_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CustomInterestService.GetCustomInterest][google.ads.googleads.v3.services.CustomInterestService.GetCustomInterest].
+type GetCustomInterestRequest struct {
+	// Required. The resource name of the custom interest to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCustomInterestRequest) Reset()         { *m = GetCustomInterestRequest{} }
+func (m *GetCustomInterestRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCustomInterestRequest) ProtoMessage()    {}
+func (*GetCustomInterestRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ca8c67676123c2d0, []int{0}
+}
+
+func (m *GetCustomInterestRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCustomInterestRequest.Unmarshal(m, b)
+}
+func (m *GetCustomInterestRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCustomInterestRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCustomInterestRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCustomInterestRequest.Merge(m, src)
+}
+func (m *GetCustomInterestRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCustomInterestRequest.Size(m)
+}
+func (m *GetCustomInterestRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCustomInterestRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCustomInterestRequest proto.InternalMessageInfo
+
+func (m *GetCustomInterestRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CustomInterestService.MutateCustomInterests][google.ads.googleads.v3.services.CustomInterestService.MutateCustomInterests].
+type MutateCustomInterestsRequest struct {
+	// Required. The ID of the customer whose custom interests are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual custom interests.
+	Operations []*CustomInterestOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomInterestsRequest) Reset()         { *m = MutateCustomInterestsRequest{} }
+func (m *MutateCustomInterestsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomInterestsRequest) ProtoMessage()    {}
+func (*MutateCustomInterestsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ca8c67676123c2d0, []int{1}
+}
+
+func (m *MutateCustomInterestsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomInterestsRequest.Unmarshal(m, b)
+}
+func (m *MutateCustomInterestsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomInterestsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomInterestsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomInterestsRequest.Merge(m, src)
+}
+func (m *MutateCustomInterestsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomInterestsRequest.Size(m)
+}
+func (m *MutateCustomInterestsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomInterestsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomInterestsRequest proto.InternalMessageInfo
+
+func (m *MutateCustomInterestsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCustomInterestsRequest) GetOperations() []*CustomInterestOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCustomInterestsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update) on a custom interest.
+type CustomInterestOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CustomInterestOperation_Create
+	//	*CustomInterestOperation_Update
+	Operation            isCustomInterestOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
+	XXX_unrecognized     []byte                              `json:"-"`
+	XXX_sizecache        int32                               `json:"-"`
+}
+
+func (m *CustomInterestOperation) Reset()         { *m = CustomInterestOperation{} }
+func (m *CustomInterestOperation) String() string { return proto.CompactTextString(m) }
+func (*CustomInterestOperation) ProtoMessage()    {}
+func (*CustomInterestOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ca8c67676123c2d0, []int{2}
+}
+
+func (m *CustomInterestOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomInterestOperation.Unmarshal(m, b)
+}
+func (m *CustomInterestOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomInterestOperation.Marshal(b, m, deterministic)
+}
+func (m *CustomInterestOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomInterestOperation.Merge(m, src)
+}
+func (m *CustomInterestOperation) XXX_Size() int {
+	return xxx_messageInfo_CustomInterestOperation.Size(m)
+}
+func (m *CustomInterestOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomInterestOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomInterestOperation proto.InternalMessageInfo
+
+func (m *CustomInterestOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCustomInterestOperation_Operation interface {
+	isCustomInterestOperation_Operation()
+}
+
+type CustomInterestOperation_Create struct {
+	Create *resources.CustomInterest `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CustomInterestOperation_Update struct {
+	Update *resources.CustomInterest `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+func (*CustomInterestOperation_Create) isCustomInterestOperation_Operation() {}
+
+func (*CustomInterestOperation_Update) isCustomInterestOperation_Operation() {}
+
+func (m *CustomInterestOperation) GetOperation() isCustomInterestOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CustomInterestOperation) GetCreate() *resources.CustomInterest {
+	if x, ok := m.GetOperation().(*CustomInterestOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CustomInterestOperation) GetUpdate() *resources.CustomInterest {
+	if x, ok := m.GetOperation().(*CustomInterestOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CustomInterestOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CustomInterestOperation_Create)(nil),
+		(*CustomInterestOperation_Update)(nil),
+	}
+}
+
+// Response message for custom interest mutate.
+type MutateCustomInterestsResponse struct {
+	// All results for the mutate.
+	Results              []*MutateCustomInterestResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *MutateCustomInterestsResponse) Reset()         { *m = MutateCustomInterestsResponse{} }
+func (m *MutateCustomInterestsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomInterestsResponse) ProtoMessage()    {}
+func (*MutateCustomInterestsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ca8c67676123c2d0, []int{3}
+}
+
+func (m *MutateCustomInterestsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomInterestsResponse.Unmarshal(m, b)
+}
+func (m *MutateCustomInterestsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomInterestsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomInterestsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomInterestsResponse.Merge(m, src)
+}
+func (m *MutateCustomInterestsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomInterestsResponse.Size(m)
+}
+func (m *MutateCustomInterestsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomInterestsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomInterestsResponse proto.InternalMessageInfo
+
+func (m *MutateCustomInterestsResponse) GetResults() []*MutateCustomInterestResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the custom interest mutate.
+type MutateCustomInterestResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomInterestResult) Reset()         { *m = MutateCustomInterestResult{} }
+func (m *MutateCustomInterestResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomInterestResult) ProtoMessage()    {}
+func (*MutateCustomInterestResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ca8c67676123c2d0, []int{4}
+}
+
+func (m *MutateCustomInterestResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomInterestResult.Unmarshal(m, b)
+}
+func (m *MutateCustomInterestResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomInterestResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomInterestResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomInterestResult.Merge(m, src)
+}
+func (m *MutateCustomInterestResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomInterestResult.Size(m)
+}
+func (m *MutateCustomInterestResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomInterestResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomInterestResult proto.InternalMessageInfo
+
+func (m *MutateCustomInterestResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCustomInterestRequest)(nil), "google.ads.googleads.v3.services.GetCustomInterestRequest")
+	proto.RegisterType((*MutateCustomInterestsRequest)(nil), "google.ads.googleads.v3.services.MutateCustomInterestsRequest")
+	proto.RegisterType((*CustomInterestOperation)(nil), "google.ads.googleads.v3.services.CustomInterestOperation")
+	proto.RegisterType((*MutateCustomInterestsResponse)(nil), "google.ads.googleads.v3.services.MutateCustomInterestsResponse")
+	proto.RegisterType((*MutateCustomInterestResult)(nil), "google.ads.googleads.v3.services.MutateCustomInterestResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/custom_interest_service.proto", fileDescriptor_ca8c67676123c2d0)
+}
+
+var fileDescriptor_ca8c67676123c2d0 = []byte{
+	// 684 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x4f, 0x6b, 0x13, 0x4f,
+	0x18, 0xfe, 0xed, 0xe6, 0x47, 0xb5, 0x93, 0xf6, 0xe0, 0x42, 0x6d, 0x58, 0x2b, 0x86, 0xb5, 0x87,
+	0x10, 0x64, 0x96, 0x66, 0x05, 0xe9, 0xd6, 0x56, 0x36, 0x8a, 0x6d, 0x91, 0xda, 0xb2, 0x42, 0x10,
+	0x09, 0x86, 0x49, 0x76, 0x1a, 0x97, 0xee, 0xee, 0xc4, 0x9d, 0xd9, 0x48, 0x29, 0x3d, 0xe8, 0x57,
+	0xf0, 0x1b, 0x78, 0xf4, 0x9b, 0x58, 0xf0, 0xe4, 0xad, 0x27, 0x0f, 0x9e, 0x3c, 0x7a, 0xf3, 0x20,
+	0xc8, 0xee, 0xcc, 0x24, 0xd9, 0x9a, 0x25, 0x58, 0x6f, 0x6f, 0xe6, 0x7d, 0xde, 0xe7, 0x7d, 0xde,
+	0x7f, 0x1b, 0xb0, 0xd5, 0x27, 0xa4, 0x1f, 0x60, 0x13, 0x79, 0xd4, 0xe4, 0x66, 0x6a, 0x0d, 0x2d,
+	0x93, 0xe2, 0x78, 0xe8, 0xf7, 0x30, 0x35, 0x7b, 0x09, 0x65, 0x24, 0xec, 0xf8, 0x11, 0xc3, 0x31,
+	0xa6, 0xac, 0x23, 0x1c, 0x70, 0x10, 0x13, 0x46, 0xb4, 0x2a, 0x0f, 0x82, 0xc8, 0xa3, 0x70, 0x14,
+	0x0f, 0x87, 0x16, 0x94, 0xf1, 0xfa, 0xbd, 0xa2, 0x0c, 0x31, 0xa6, 0x24, 0x89, 0xa7, 0xa4, 0xe0,
+	0xd4, 0xfa, 0x8a, 0x0c, 0x1c, 0xf8, 0x26, 0x8a, 0x22, 0xc2, 0x10, 0xf3, 0x49, 0x44, 0x85, 0x77,
+	0x79, 0xc2, 0xdb, 0x0b, 0x7c, 0x1c, 0xc9, 0xb0, 0x5b, 0x13, 0x8e, 0x43, 0x1f, 0x07, 0x5e, 0xa7,
+	0x8b, 0x5f, 0xa1, 0xa1, 0x4f, 0x62, 0x01, 0x10, 0x92, 0xcd, 0xec, 0x57, 0x37, 0x39, 0x14, 0xa8,
+	0x10, 0xd1, 0x23, 0x8e, 0x30, 0x1e, 0x81, 0xca, 0x36, 0x66, 0x0f, 0x33, 0x55, 0xbb, 0x42, 0x94,
+	0x8b, 0x5f, 0x27, 0x98, 0x32, 0xad, 0x06, 0x16, 0xa5, 0xf0, 0x4e, 0x84, 0x42, 0x5c, 0x51, 0xaa,
+	0x4a, 0x6d, 0xbe, 0x59, 0xfa, 0xea, 0xa8, 0xee, 0x82, 0xf4, 0x3c, 0x45, 0x21, 0x36, 0x3e, 0x29,
+	0x60, 0x65, 0x2f, 0x61, 0x88, 0xe1, 0x3c, 0x13, 0x95, 0x54, 0xab, 0xa0, 0xcc, 0x2b, 0xc7, 0x71,
+	0xc7, 0xf7, 0x26, 0x89, 0x80, 0x7c, 0xdf, 0xf5, 0xb4, 0x97, 0x00, 0x90, 0x01, 0x8e, 0x79, 0xf1,
+	0x15, 0xb5, 0x5a, 0xaa, 0x95, 0x1b, 0xeb, 0x70, 0x56, 0xdb, 0x61, 0x3e, 0xe7, 0xbe, 0x64, 0x10,
+	0xfc, 0x63, 0x46, 0xed, 0x36, 0x58, 0x1c, 0xa2, 0xc0, 0xf7, 0x10, 0xc3, 0x1d, 0x12, 0x05, 0xc7,
+	0x95, 0xff, 0xab, 0x4a, 0xed, 0xaa, 0xbb, 0x20, 0x1f, 0xf7, 0xa3, 0xe0, 0xd8, 0xf8, 0xa5, 0x80,
+	0xe5, 0x02, 0x46, 0x6d, 0x03, 0x94, 0x93, 0x41, 0x16, 0x9e, 0xb6, 0x30, 0x0b, 0x2f, 0x37, 0x74,
+	0xa9, 0x50, 0x76, 0x19, 0x3e, 0x4e, 0xbb, 0xbc, 0x87, 0xe8, 0x91, 0x0b, 0x38, 0x3c, 0xb5, 0xb5,
+	0x27, 0x60, 0xae, 0x17, 0x63, 0xc4, 0x78, 0x1f, 0xcb, 0x8d, 0xb5, 0xc2, 0xca, 0x46, 0xeb, 0x72,
+	0xa1, 0xb4, 0x9d, 0xff, 0x5c, 0x41, 0x91, 0x92, 0x71, 0xea, 0x8a, 0xfa, 0x0f, 0x64, 0x9c, 0xa2,
+	0x59, 0x06, 0xf3, 0xa3, 0x2e, 0x19, 0x6f, 0xc0, 0xcd, 0x82, 0x51, 0xd2, 0x01, 0x89, 0x28, 0xd6,
+	0x5a, 0xe0, 0x4a, 0x8c, 0x69, 0x12, 0x30, 0x39, 0xa2, 0xfb, 0xb3, 0x47, 0x34, 0x8d, 0xd1, 0xcd,
+	0x48, 0x5c, 0x49, 0x66, 0x38, 0x40, 0x2f, 0x86, 0xa5, 0xb3, 0x9b, 0xb2, 0x8c, 0xf9, 0x3d, 0x6c,
+	0xfc, 0x2c, 0x81, 0xa5, 0x7c, 0xf4, 0x33, 0xae, 0x40, 0xfb, 0xac, 0x80, 0x6b, 0x7f, 0x2c, 0xba,
+	0x66, 0xcf, 0x56, 0x5e, 0x74, 0x1d, 0xfa, 0xdf, 0x77, 0xdc, 0xd8, 0x3d, 0x77, 0xf2, 0x45, 0xbc,
+	0xfb, 0xf2, 0xed, 0xbd, 0x6a, 0x69, 0x6b, 0xe9, 0x37, 0xe2, 0x24, 0xe7, 0xd9, 0x94, 0x67, 0x41,
+	0xcd, 0xba, 0xf8, 0x68, 0x8c, 0x26, 0x61, 0xd6, 0x4f, 0xb5, 0x1f, 0x0a, 0x58, 0x9a, 0x3a, 0x26,
+	0x6d, 0xeb, 0x72, 0xd3, 0x90, 0xa7, 0xaa, 0x3f, 0xb8, 0x74, 0x3c, 0xdf, 0x0f, 0xe3, 0xf9, 0xb9,
+	0x73, 0x7d, 0xe2, 0xd8, 0xef, 0x8c, 0x0f, 0x30, 0x2b, 0x77, 0xdd, 0xb8, 0x9b, 0x96, 0x3b, 0xae,
+	0xef, 0x64, 0x02, 0xbc, 0x59, 0x3f, 0xbd, 0x58, 0xad, 0x1d, 0x66, 0xd9, 0x6c, 0xa5, 0xae, 0xdf,
+	0x38, 0x73, 0x2a, 0x63, 0x45, 0xc2, 0x1a, 0xf8, 0x14, 0xf6, 0x48, 0xd8, 0x7c, 0xab, 0x82, 0xd5,
+	0x1e, 0x09, 0x67, 0xaa, 0x6f, 0xea, 0x53, 0x37, 0xe4, 0x20, 0x3d, 0xde, 0x03, 0xe5, 0xc5, 0x8e,
+	0x88, 0xef, 0x93, 0x00, 0x45, 0x7d, 0x48, 0xe2, 0xbe, 0xd9, 0xc7, 0x51, 0x76, 0xda, 0xe6, 0x38,
+	0x63, 0xf1, 0x9f, 0xc8, 0x86, 0x34, 0x3e, 0xa8, 0xa5, 0x6d, 0xc7, 0xf9, 0xa8, 0x56, 0xb7, 0x39,
+	0xa1, 0xe3, 0x51, 0xc8, 0xcd, 0xd4, 0x6a, 0x59, 0x50, 0x24, 0xa6, 0x67, 0x12, 0xd2, 0x76, 0x3c,
+	0xda, 0x1e, 0x41, 0xda, 0x2d, 0xab, 0x2d, 0x21, 0xdf, 0xd5, 0x55, 0xfe, 0x6e, 0xdb, 0x8e, 0x47,
+	0x6d, 0x7b, 0x04, 0xb2, 0xed, 0x96, 0x65, 0xdb, 0x12, 0xd6, 0x9d, 0xcb, 0x74, 0x5a, 0xbf, 0x03,
+	0x00, 0x00, 0xff, 0xff, 0x63, 0xa4, 0x3d, 0xc9, 0xeb, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CustomInterestServiceClient is the client API for CustomInterestService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CustomInterestServiceClient interface {
+	// Returns the requested custom interest in full detail.
+	GetCustomInterest(ctx context.Context, in *GetCustomInterestRequest, opts ...grpc.CallOption) (*resources.CustomInterest, error)
+	// Creates or updates custom interests. Operation statuses are returned.
+	MutateCustomInterests(ctx context.Context, in *MutateCustomInterestsRequest, opts ...grpc.CallOption) (*MutateCustomInterestsResponse, error)
+}
+
+type customInterestServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCustomInterestServiceClient(cc grpc.ClientConnInterface) CustomInterestServiceClient {
+	return &customInterestServiceClient{cc}
+}
+
+func (c *customInterestServiceClient) GetCustomInterest(ctx context.Context, in *GetCustomInterestRequest, opts ...grpc.CallOption) (*resources.CustomInterest, error) {
+	out := new(resources.CustomInterest)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomInterestService/GetCustomInterest", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customInterestServiceClient) MutateCustomInterests(ctx context.Context, in *MutateCustomInterestsRequest, opts ...grpc.CallOption) (*MutateCustomInterestsResponse, error) {
+	out := new(MutateCustomInterestsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomInterestService/MutateCustomInterests", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CustomInterestServiceServer is the server API for CustomInterestService service.
+type CustomInterestServiceServer interface {
+	// Returns the requested custom interest in full detail.
+	GetCustomInterest(context.Context, *GetCustomInterestRequest) (*resources.CustomInterest, error)
+	// Creates or updates custom interests. Operation statuses are returned.
+	MutateCustomInterests(context.Context, *MutateCustomInterestsRequest) (*MutateCustomInterestsResponse, error)
+}
+
+// UnimplementedCustomInterestServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCustomInterestServiceServer struct {
+}
+
+func (*UnimplementedCustomInterestServiceServer) GetCustomInterest(ctx context.Context, req *GetCustomInterestRequest) (*resources.CustomInterest, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetCustomInterest not implemented")
+}
+func (*UnimplementedCustomInterestServiceServer) MutateCustomInterests(ctx context.Context, req *MutateCustomInterestsRequest) (*MutateCustomInterestsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateCustomInterests not implemented")
+}
+
+func RegisterCustomInterestServiceServer(s *grpc.Server, srv CustomInterestServiceServer) {
+	s.RegisterService(&_CustomInterestService_serviceDesc, srv)
+}
+
+func _CustomInterestService_GetCustomInterest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCustomInterestRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomInterestServiceServer).GetCustomInterest(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomInterestService/GetCustomInterest",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomInterestServiceServer).GetCustomInterest(ctx, req.(*GetCustomInterestRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomInterestService_MutateCustomInterests_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCustomInterestsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomInterestServiceServer).MutateCustomInterests(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomInterestService/MutateCustomInterests",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomInterestServiceServer).MutateCustomInterests(ctx, req.(*MutateCustomInterestsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CustomInterestService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CustomInterestService",
+	HandlerType: (*CustomInterestServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCustomInterest",
+			Handler:    _CustomInterestService_GetCustomInterest_Handler,
+		},
+		{
+			MethodName: "MutateCustomInterests",
+			Handler:    _CustomInterestService_MutateCustomInterests_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/custom_interest_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/customer_client_link_service.pb.go b/googleapis/ads/googleads/v3/services/customer_client_link_service.pb.go
new file mode 100644
index 0000000..505a275
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/customer_client_link_service.pb.go
@@ -0,0 +1,471 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/customer_client_link_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CustomerClientLinkService.GetCustomerClientLink][google.ads.googleads.v3.services.CustomerClientLinkService.GetCustomerClientLink].
+type GetCustomerClientLinkRequest struct {
+	// Required. The resource name of the customer client link to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCustomerClientLinkRequest) Reset()         { *m = GetCustomerClientLinkRequest{} }
+func (m *GetCustomerClientLinkRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCustomerClientLinkRequest) ProtoMessage()    {}
+func (*GetCustomerClientLinkRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0b6996d934213c3f, []int{0}
+}
+
+func (m *GetCustomerClientLinkRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCustomerClientLinkRequest.Unmarshal(m, b)
+}
+func (m *GetCustomerClientLinkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCustomerClientLinkRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCustomerClientLinkRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCustomerClientLinkRequest.Merge(m, src)
+}
+func (m *GetCustomerClientLinkRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCustomerClientLinkRequest.Size(m)
+}
+func (m *GetCustomerClientLinkRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCustomerClientLinkRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCustomerClientLinkRequest proto.InternalMessageInfo
+
+func (m *GetCustomerClientLinkRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CustomerClientLinkService.MutateCustomerClientLink][google.ads.googleads.v3.services.CustomerClientLinkService.MutateCustomerClientLink].
+type MutateCustomerClientLinkRequest struct {
+	// Required. The ID of the customer whose customer link are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The operation to perform on the individual CustomerClientLink.
+	Operation            *CustomerClientLinkOperation `protobuf:"bytes,2,opt,name=operation,proto3" json:"operation,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *MutateCustomerClientLinkRequest) Reset()         { *m = MutateCustomerClientLinkRequest{} }
+func (m *MutateCustomerClientLinkRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerClientLinkRequest) ProtoMessage()    {}
+func (*MutateCustomerClientLinkRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0b6996d934213c3f, []int{1}
+}
+
+func (m *MutateCustomerClientLinkRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerClientLinkRequest.Unmarshal(m, b)
+}
+func (m *MutateCustomerClientLinkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerClientLinkRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerClientLinkRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerClientLinkRequest.Merge(m, src)
+}
+func (m *MutateCustomerClientLinkRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerClientLinkRequest.Size(m)
+}
+func (m *MutateCustomerClientLinkRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerClientLinkRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerClientLinkRequest proto.InternalMessageInfo
+
+func (m *MutateCustomerClientLinkRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCustomerClientLinkRequest) GetOperation() *CustomerClientLinkOperation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+// A single operation (create, update) on a CustomerClientLink.
+type CustomerClientLinkOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CustomerClientLinkOperation_Create
+	//	*CustomerClientLinkOperation_Update
+	Operation            isCustomerClientLinkOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *CustomerClientLinkOperation) Reset()         { *m = CustomerClientLinkOperation{} }
+func (m *CustomerClientLinkOperation) String() string { return proto.CompactTextString(m) }
+func (*CustomerClientLinkOperation) ProtoMessage()    {}
+func (*CustomerClientLinkOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0b6996d934213c3f, []int{2}
+}
+
+func (m *CustomerClientLinkOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerClientLinkOperation.Unmarshal(m, b)
+}
+func (m *CustomerClientLinkOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerClientLinkOperation.Marshal(b, m, deterministic)
+}
+func (m *CustomerClientLinkOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerClientLinkOperation.Merge(m, src)
+}
+func (m *CustomerClientLinkOperation) XXX_Size() int {
+	return xxx_messageInfo_CustomerClientLinkOperation.Size(m)
+}
+func (m *CustomerClientLinkOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerClientLinkOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerClientLinkOperation proto.InternalMessageInfo
+
+func (m *CustomerClientLinkOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCustomerClientLinkOperation_Operation interface {
+	isCustomerClientLinkOperation_Operation()
+}
+
+type CustomerClientLinkOperation_Create struct {
+	Create *resources.CustomerClientLink `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CustomerClientLinkOperation_Update struct {
+	Update *resources.CustomerClientLink `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+func (*CustomerClientLinkOperation_Create) isCustomerClientLinkOperation_Operation() {}
+
+func (*CustomerClientLinkOperation_Update) isCustomerClientLinkOperation_Operation() {}
+
+func (m *CustomerClientLinkOperation) GetOperation() isCustomerClientLinkOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CustomerClientLinkOperation) GetCreate() *resources.CustomerClientLink {
+	if x, ok := m.GetOperation().(*CustomerClientLinkOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CustomerClientLinkOperation) GetUpdate() *resources.CustomerClientLink {
+	if x, ok := m.GetOperation().(*CustomerClientLinkOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CustomerClientLinkOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CustomerClientLinkOperation_Create)(nil),
+		(*CustomerClientLinkOperation_Update)(nil),
+	}
+}
+
+// Response message for a CustomerClientLink mutate.
+type MutateCustomerClientLinkResponse struct {
+	// A result that identifies the resource affected by the mutate request.
+	Result               *MutateCustomerClientLinkResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *MutateCustomerClientLinkResponse) Reset()         { *m = MutateCustomerClientLinkResponse{} }
+func (m *MutateCustomerClientLinkResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerClientLinkResponse) ProtoMessage()    {}
+func (*MutateCustomerClientLinkResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0b6996d934213c3f, []int{3}
+}
+
+func (m *MutateCustomerClientLinkResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerClientLinkResponse.Unmarshal(m, b)
+}
+func (m *MutateCustomerClientLinkResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerClientLinkResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerClientLinkResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerClientLinkResponse.Merge(m, src)
+}
+func (m *MutateCustomerClientLinkResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerClientLinkResponse.Size(m)
+}
+func (m *MutateCustomerClientLinkResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerClientLinkResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerClientLinkResponse proto.InternalMessageInfo
+
+func (m *MutateCustomerClientLinkResponse) GetResult() *MutateCustomerClientLinkResult {
+	if m != nil {
+		return m.Result
+	}
+	return nil
+}
+
+// The result for a single customer client link mutate.
+type MutateCustomerClientLinkResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerClientLinkResult) Reset()         { *m = MutateCustomerClientLinkResult{} }
+func (m *MutateCustomerClientLinkResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerClientLinkResult) ProtoMessage()    {}
+func (*MutateCustomerClientLinkResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0b6996d934213c3f, []int{4}
+}
+
+func (m *MutateCustomerClientLinkResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerClientLinkResult.Unmarshal(m, b)
+}
+func (m *MutateCustomerClientLinkResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerClientLinkResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerClientLinkResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerClientLinkResult.Merge(m, src)
+}
+func (m *MutateCustomerClientLinkResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerClientLinkResult.Size(m)
+}
+func (m *MutateCustomerClientLinkResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerClientLinkResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerClientLinkResult proto.InternalMessageInfo
+
+func (m *MutateCustomerClientLinkResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCustomerClientLinkRequest)(nil), "google.ads.googleads.v3.services.GetCustomerClientLinkRequest")
+	proto.RegisterType((*MutateCustomerClientLinkRequest)(nil), "google.ads.googleads.v3.services.MutateCustomerClientLinkRequest")
+	proto.RegisterType((*CustomerClientLinkOperation)(nil), "google.ads.googleads.v3.services.CustomerClientLinkOperation")
+	proto.RegisterType((*MutateCustomerClientLinkResponse)(nil), "google.ads.googleads.v3.services.MutateCustomerClientLinkResponse")
+	proto.RegisterType((*MutateCustomerClientLinkResult)(nil), "google.ads.googleads.v3.services.MutateCustomerClientLinkResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/customer_client_link_service.proto", fileDescriptor_0b6996d934213c3f)
+}
+
+var fileDescriptor_0b6996d934213c3f = []byte{
+	// 655 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xcf, 0x6b, 0xd4, 0x40,
+	0x14, 0xc7, 0x4d, 0x5a, 0x0a, 0x9d, 0xd5, 0xcb, 0x40, 0x71, 0xdd, 0x96, 0x76, 0x89, 0x3d, 0x94,
+	0x45, 0x26, 0xd0, 0xa5, 0x28, 0xa9, 0x2b, 0x66, 0x8b, 0xb6, 0x82, 0xb5, 0x65, 0x85, 0x22, 0xba,
+	0xb0, 0x4e, 0x93, 0x69, 0x0c, 0x4d, 0x32, 0x31, 0x33, 0xd9, 0x4b, 0xed, 0x45, 0xf0, 0xe0, 0xd9,
+	0x93, 0x57, 0x6f, 0xfa, 0xa7, 0xf4, 0xea, 0xad, 0x20, 0x78, 0xf0, 0xe4, 0x1f, 0x21, 0x92, 0xcc,
+	0x4c, 0x36, 0xa5, 0x9b, 0x5d, 0x68, 0x6f, 0x6f, 0xf3, 0xbe, 0xf3, 0x79, 0x3f, 0x67, 0x16, 0x6c,
+	0x79, 0x94, 0x7a, 0x01, 0x31, 0xb1, 0xcb, 0x4c, 0x61, 0x66, 0xd6, 0xb0, 0x6d, 0x32, 0x92, 0x0c,
+	0x7d, 0x87, 0x30, 0xd3, 0x49, 0x19, 0xa7, 0x21, 0x49, 0x06, 0x4e, 0xe0, 0x93, 0x88, 0x0f, 0x02,
+	0x3f, 0x3a, 0x1e, 0x48, 0x2f, 0x8a, 0x13, 0xca, 0x29, 0x6c, 0x8a, 0x93, 0x08, 0xbb, 0x0c, 0x15,
+	0x10, 0x34, 0x6c, 0x23, 0x05, 0x69, 0x3c, 0xac, 0x0a, 0x93, 0x10, 0x46, 0xd3, 0xa4, 0x2a, 0x8e,
+	0xe0, 0x37, 0x96, 0xd4, 0xe9, 0xd8, 0x37, 0x71, 0x14, 0x51, 0x8e, 0xb9, 0x4f, 0x23, 0x26, 0xbd,
+	0xb7, 0x4b, 0x5e, 0x71, 0x56, 0x3a, 0x56, 0x4a, 0x8e, 0x23, 0x9f, 0x04, 0xee, 0xe0, 0x90, 0xbc,
+	0xc3, 0x43, 0x9f, 0x26, 0x52, 0x20, 0xf3, 0x36, 0xf3, 0x5f, 0x87, 0xe9, 0x91, 0x54, 0x85, 0x98,
+	0xc9, 0xc8, 0xc6, 0x0e, 0x58, 0xda, 0x26, 0x7c, 0x4b, 0xa6, 0xb6, 0x95, 0xd3, 0x9f, 0xfb, 0xd1,
+	0x71, 0x8f, 0xbc, 0x4f, 0x09, 0xe3, 0x70, 0x0d, 0xdc, 0x52, 0x15, 0x0c, 0x22, 0x1c, 0x92, 0xba,
+	0xd6, 0xd4, 0xd6, 0xe6, 0xbb, 0x33, 0xbf, 0x6d, 0xbd, 0x77, 0x53, 0x79, 0x5e, 0xe0, 0x90, 0x18,
+	0xdf, 0x35, 0xb0, 0xb2, 0x9b, 0x72, 0xcc, 0x49, 0x35, 0x6d, 0x15, 0xd4, 0x8a, 0x2e, 0xf8, 0x6e,
+	0x99, 0x05, 0xd4, 0xf7, 0x67, 0x2e, 0x7c, 0x0b, 0xe6, 0x69, 0x4c, 0x92, 0xbc, 0x07, 0x75, 0xbd,
+	0xa9, 0xad, 0xd5, 0xd6, 0x3b, 0x68, 0xda, 0x04, 0xd0, 0xe5, 0xa8, 0x7b, 0x0a, 0x22, 0x42, 0x8c,
+	0xa0, 0xc6, 0x67, 0x1d, 0x2c, 0x4e, 0xd0, 0xc3, 0x4d, 0x50, 0x4b, 0x63, 0x17, 0x73, 0x92, 0xb7,
+	0xaa, 0x3e, 0x9b, 0xe7, 0xd0, 0x50, 0x39, 0xa8, 0x6e, 0xa2, 0xa7, 0x59, 0x37, 0x77, 0x31, 0x3b,
+	0xee, 0x01, 0x21, 0xcf, 0x6c, 0xb8, 0x07, 0xe6, 0x9c, 0x84, 0x60, 0x2e, 0x7a, 0x55, 0x5b, 0xdf,
+	0xa8, 0xcc, 0xbd, 0xd8, 0x8d, 0x31, 0xc9, 0xef, 0xdc, 0xe8, 0x49, 0x4c, 0x06, 0x14, 0x78, 0xd9,
+	0x8c, 0xab, 0x03, 0x05, 0xa6, 0x5b, 0x2b, 0x35, 0xd8, 0xf8, 0x00, 0x9a, 0xd5, 0x63, 0x63, 0x31,
+	0x8d, 0x18, 0x81, 0xaf, 0xc0, 0x5c, 0x42, 0x58, 0x1a, 0x70, 0x59, 0xd2, 0xe3, 0xe9, 0xe3, 0x98,
+	0xc0, 0x4c, 0x03, 0xde, 0x93, 0x3c, 0xe3, 0x09, 0x58, 0x9e, 0xac, 0x84, 0x77, 0xc7, 0x6e, 0xe0,
+	0xc5, 0xe5, 0x5b, 0xff, 0x3a, 0x0b, 0xee, 0x5c, 0x26, 0xbc, 0x14, 0xc9, 0xc0, 0x5f, 0x1a, 0x58,
+	0x18, 0xbb, 0xe5, 0xf0, 0xd1, 0xf4, 0x42, 0x26, 0x5d, 0x8f, 0xc6, 0xd5, 0x46, 0x61, 0xec, 0x9e,
+	0xdb, 0x17, 0x8b, 0xfa, 0xf8, 0xf3, 0xcf, 0x17, 0xfd, 0x3e, 0xdc, 0xc8, 0x5e, 0x8c, 0x93, 0x0b,
+	0x9e, 0x8e, 0xba, 0x18, 0xcc, 0x6c, 0x15, 0x4f, 0xc8, 0x08, 0xc5, 0xcc, 0xd6, 0x29, 0xfc, 0xa7,
+	0x81, 0x7a, 0x55, 0x17, 0xa1, 0x7d, 0x9d, 0x59, 0x89, 0x2a, 0xbb, 0xd7, 0x1a, 0x77, 0xbe, 0x42,
+	0xc6, 0x9b, 0x73, 0x7b, 0xa1, 0x74, 0xf7, 0xef, 0x15, 0x0b, 0x98, 0x97, 0xde, 0x31, 0x1e, 0x64,
+	0xa5, 0x8f, 0x6a, 0x3d, 0x29, 0x69, 0x3b, 0xad, 0xd3, 0x71, 0x95, 0x5b, 0x61, 0x1e, 0xd3, 0xd2,
+	0x5a, 0x8d, 0xc5, 0x33, 0xbb, 0x3e, 0xca, 0x4b, 0x5a, 0xb1, 0xcf, 0x90, 0x43, 0xc3, 0xee, 0x27,
+	0x1d, 0xac, 0x3a, 0x34, 0x9c, 0x5a, 0x43, 0x77, 0xb9, 0x72, 0x83, 0xf6, 0xb3, 0x1b, 0xbf, 0xaf,
+	0xbd, 0xde, 0x91, 0x0c, 0x8f, 0x06, 0x38, 0xf2, 0x10, 0x4d, 0x3c, 0xd3, 0x23, 0x51, 0xfe, 0x1e,
+	0x98, 0xa3, 0xa8, 0xd5, 0xff, 0x35, 0x9b, 0xca, 0xf8, 0xa6, 0xcf, 0x6c, 0xdb, 0xf6, 0x0f, 0xbd,
+	0xb9, 0x2d, 0x80, 0xb6, 0xcb, 0x90, 0x30, 0x33, 0xeb, 0xa0, 0x8d, 0x64, 0x60, 0x76, 0xa6, 0x24,
+	0x7d, 0xdb, 0x65, 0xfd, 0x42, 0xd2, 0x3f, 0x68, 0xf7, 0x95, 0xe4, 0xaf, 0xbe, 0x2a, 0xbe, 0x5b,
+	0x96, 0xed, 0x32, 0xcb, 0x2a, 0x44, 0x96, 0x75, 0xd0, 0xb6, 0x2c, 0x25, 0x3b, 0x9c, 0xcb, 0xf3,
+	0x6c, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xaf, 0x67, 0x35, 0x12, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CustomerClientLinkServiceClient is the client API for CustomerClientLinkService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CustomerClientLinkServiceClient interface {
+	// Returns the requested CustomerClientLink in full detail.
+	GetCustomerClientLink(ctx context.Context, in *GetCustomerClientLinkRequest, opts ...grpc.CallOption) (*resources.CustomerClientLink, error)
+	// Creates or updates a customer client link. Operation statuses are returned.
+	MutateCustomerClientLink(ctx context.Context, in *MutateCustomerClientLinkRequest, opts ...grpc.CallOption) (*MutateCustomerClientLinkResponse, error)
+}
+
+type customerClientLinkServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCustomerClientLinkServiceClient(cc grpc.ClientConnInterface) CustomerClientLinkServiceClient {
+	return &customerClientLinkServiceClient{cc}
+}
+
+func (c *customerClientLinkServiceClient) GetCustomerClientLink(ctx context.Context, in *GetCustomerClientLinkRequest, opts ...grpc.CallOption) (*resources.CustomerClientLink, error) {
+	out := new(resources.CustomerClientLink)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerClientLinkService/GetCustomerClientLink", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerClientLinkServiceClient) MutateCustomerClientLink(ctx context.Context, in *MutateCustomerClientLinkRequest, opts ...grpc.CallOption) (*MutateCustomerClientLinkResponse, error) {
+	out := new(MutateCustomerClientLinkResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerClientLinkService/MutateCustomerClientLink", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CustomerClientLinkServiceServer is the server API for CustomerClientLinkService service.
+type CustomerClientLinkServiceServer interface {
+	// Returns the requested CustomerClientLink in full detail.
+	GetCustomerClientLink(context.Context, *GetCustomerClientLinkRequest) (*resources.CustomerClientLink, error)
+	// Creates or updates a customer client link. Operation statuses are returned.
+	MutateCustomerClientLink(context.Context, *MutateCustomerClientLinkRequest) (*MutateCustomerClientLinkResponse, error)
+}
+
+// UnimplementedCustomerClientLinkServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCustomerClientLinkServiceServer struct {
+}
+
+func (*UnimplementedCustomerClientLinkServiceServer) GetCustomerClientLink(ctx context.Context, req *GetCustomerClientLinkRequest) (*resources.CustomerClientLink, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetCustomerClientLink not implemented")
+}
+func (*UnimplementedCustomerClientLinkServiceServer) MutateCustomerClientLink(ctx context.Context, req *MutateCustomerClientLinkRequest) (*MutateCustomerClientLinkResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateCustomerClientLink not implemented")
+}
+
+func RegisterCustomerClientLinkServiceServer(s *grpc.Server, srv CustomerClientLinkServiceServer) {
+	s.RegisterService(&_CustomerClientLinkService_serviceDesc, srv)
+}
+
+func _CustomerClientLinkService_GetCustomerClientLink_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCustomerClientLinkRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerClientLinkServiceServer).GetCustomerClientLink(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerClientLinkService/GetCustomerClientLink",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerClientLinkServiceServer).GetCustomerClientLink(ctx, req.(*GetCustomerClientLinkRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerClientLinkService_MutateCustomerClientLink_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCustomerClientLinkRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerClientLinkServiceServer).MutateCustomerClientLink(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerClientLinkService/MutateCustomerClientLink",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerClientLinkServiceServer).MutateCustomerClientLink(ctx, req.(*MutateCustomerClientLinkRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CustomerClientLinkService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CustomerClientLinkService",
+	HandlerType: (*CustomerClientLinkServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCustomerClientLink",
+			Handler:    _CustomerClientLinkService_GetCustomerClientLink_Handler,
+		},
+		{
+			MethodName: "MutateCustomerClientLink",
+			Handler:    _CustomerClientLinkService_MutateCustomerClientLink_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/customer_client_link_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/customer_client_service.pb.go b/googleapis/ads/googleads/v3/services/customer_client_service.pb.go
new file mode 100644
index 0000000..acb3895
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/customer_client_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/customer_client_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CustomerClientService.GetCustomerClient][google.ads.googleads.v3.services.CustomerClientService.GetCustomerClient].
+type GetCustomerClientRequest struct {
+	// Required. The resource name of the client to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCustomerClientRequest) Reset()         { *m = GetCustomerClientRequest{} }
+func (m *GetCustomerClientRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCustomerClientRequest) ProtoMessage()    {}
+func (*GetCustomerClientRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_275643255b459061, []int{0}
+}
+
+func (m *GetCustomerClientRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCustomerClientRequest.Unmarshal(m, b)
+}
+func (m *GetCustomerClientRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCustomerClientRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCustomerClientRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCustomerClientRequest.Merge(m, src)
+}
+func (m *GetCustomerClientRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCustomerClientRequest.Size(m)
+}
+func (m *GetCustomerClientRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCustomerClientRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCustomerClientRequest proto.InternalMessageInfo
+
+func (m *GetCustomerClientRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCustomerClientRequest)(nil), "google.ads.googleads.v3.services.GetCustomerClientRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/customer_client_service.proto", fileDescriptor_275643255b459061)
+}
+
+var fileDescriptor_275643255b459061 = []byte{
+	// 404 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x4a, 0xeb, 0x40,
+	0x14, 0x25, 0x29, 0x3c, 0x78, 0xe1, 0xbd, 0x85, 0x01, 0xb1, 0x44, 0xc1, 0x52, 0xba, 0x28, 0x5d,
+	0xcc, 0x50, 0xb3, 0x10, 0x46, 0x14, 0xa6, 0x15, 0xaa, 0x1b, 0x29, 0x15, 0xba, 0x90, 0x40, 0x98,
+	0x26, 0x63, 0x0c, 0x24, 0x99, 0x9a, 0x49, 0xb3, 0x11, 0x17, 0x8a, 0x7f, 0xe0, 0x1f, 0xb8, 0xf4,
+	0x53, 0x0a, 0xae, 0xdc, 0xb9, 0x72, 0xe1, 0xca, 0xaf, 0x90, 0x74, 0x32, 0x69, 0x83, 0x0d, 0xdd,
+	0x1d, 0x72, 0xce, 0xb9, 0x67, 0xee, 0xb9, 0xd1, 0x4e, 0x3c, 0xc6, 0xbc, 0x80, 0x42, 0xe2, 0x72,
+	0x28, 0x60, 0x86, 0x52, 0x13, 0x72, 0x1a, 0xa7, 0xbe, 0x43, 0x39, 0x74, 0x66, 0x3c, 0x61, 0x21,
+	0x8d, 0x6d, 0x27, 0xf0, 0x69, 0x94, 0xd8, 0x39, 0x01, 0xa6, 0x31, 0x4b, 0x98, 0xde, 0x10, 0x26,
+	0x40, 0x5c, 0x0e, 0x0a, 0x3f, 0x48, 0x4d, 0x20, 0xfd, 0xc6, 0x61, 0x55, 0x42, 0x4c, 0x39, 0x9b,
+	0xc5, 0x6b, 0x22, 0xc4, 0x68, 0x63, 0x4f, 0x1a, 0xa7, 0x3e, 0x24, 0x51, 0xc4, 0x12, 0x92, 0xf8,
+	0x2c, 0xe2, 0x39, 0xbb, 0xb3, 0xc2, 0x96, 0x6c, 0xfb, 0x2b, 0xc4, 0xb5, 0x4f, 0x03, 0xd7, 0x9e,
+	0xd0, 0x1b, 0x92, 0xfa, 0x2c, 0x16, 0x82, 0xe6, 0xa9, 0x56, 0x1f, 0xd0, 0xa4, 0x9f, 0x67, 0xf6,
+	0x17, 0xde, 0x11, 0xbd, 0x9d, 0x51, 0x9e, 0xe8, 0x6d, 0xed, 0xbf, 0x7c, 0x96, 0x1d, 0x91, 0x90,
+	0xd6, 0x95, 0x86, 0xd2, 0xfe, 0xdb, 0xab, 0x7d, 0x62, 0x75, 0xf4, 0x4f, 0x32, 0x17, 0x24, 0xa4,
+	0x07, 0x4f, 0xaa, 0xb6, 0x5d, 0x9e, 0x71, 0x29, 0x36, 0xd6, 0xdf, 0x14, 0x6d, 0xeb, 0x57, 0x80,
+	0x8e, 0xc0, 0xa6, 0xa6, 0x40, 0xd5, 0xab, 0x8c, 0x6e, 0xa5, 0xb7, 0xe8, 0x10, 0x94, 0x9d, 0xcd,
+	0xf3, 0x0f, 0x5c, 0xde, 0xe4, 0xf1, 0xfd, 0xeb, 0x59, 0x35, 0xf5, 0x6e, 0xd6, 0xfc, 0x5d, 0x89,
+	0x39, 0x96, 0xf5, 0x73, 0xd8, 0x29, 0x4e, 0x21, 0xc6, 0x70, 0xd8, 0xb9, 0x37, 0x76, 0xe7, 0xb8,
+	0xbe, 0x0c, 0xcd, 0xd1, 0xd4, 0xe7, 0xc0, 0x61, 0x61, 0xef, 0x41, 0xd5, 0x5a, 0x0e, 0x0b, 0x37,
+	0x2e, 0xd7, 0x33, 0xd6, 0x96, 0x35, 0xcc, 0x2e, 0x32, 0x54, 0xae, 0xce, 0x72, 0xbf, 0xc7, 0x02,
+	0x12, 0x79, 0x80, 0xc5, 0x1e, 0xf4, 0x68, 0xb4, 0xb8, 0x17, 0x5c, 0x26, 0x56, 0xff, 0xa5, 0x47,
+	0x12, 0xbc, 0xa8, 0xb5, 0x01, 0xc6, 0xaf, 0x6a, 0x63, 0x20, 0x06, 0x62, 0x97, 0x03, 0x01, 0x33,
+	0x34, 0x36, 0x41, 0x1e, 0xcc, 0xe7, 0x52, 0x62, 0x61, 0x97, 0x5b, 0x85, 0xc4, 0x1a, 0x9b, 0x96,
+	0x94, 0x7c, 0xab, 0x2d, 0xf1, 0x1d, 0x21, 0xec, 0x72, 0x84, 0x0a, 0x11, 0x42, 0x63, 0x13, 0x21,
+	0x29, 0x9b, 0xfc, 0x59, 0xbc, 0xd3, 0xfc, 0x09, 0x00, 0x00, 0xff, 0xff, 0x63, 0x55, 0x92, 0x93,
+	0x4c, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CustomerClientServiceClient is the client API for CustomerClientService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CustomerClientServiceClient interface {
+	// Returns the requested client in full detail.
+	GetCustomerClient(ctx context.Context, in *GetCustomerClientRequest, opts ...grpc.CallOption) (*resources.CustomerClient, error)
+}
+
+type customerClientServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCustomerClientServiceClient(cc grpc.ClientConnInterface) CustomerClientServiceClient {
+	return &customerClientServiceClient{cc}
+}
+
+func (c *customerClientServiceClient) GetCustomerClient(ctx context.Context, in *GetCustomerClientRequest, opts ...grpc.CallOption) (*resources.CustomerClient, error) {
+	out := new(resources.CustomerClient)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerClientService/GetCustomerClient", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CustomerClientServiceServer is the server API for CustomerClientService service.
+type CustomerClientServiceServer interface {
+	// Returns the requested client in full detail.
+	GetCustomerClient(context.Context, *GetCustomerClientRequest) (*resources.CustomerClient, error)
+}
+
+// UnimplementedCustomerClientServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCustomerClientServiceServer struct {
+}
+
+func (*UnimplementedCustomerClientServiceServer) GetCustomerClient(ctx context.Context, req *GetCustomerClientRequest) (*resources.CustomerClient, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetCustomerClient not implemented")
+}
+
+func RegisterCustomerClientServiceServer(s *grpc.Server, srv CustomerClientServiceServer) {
+	s.RegisterService(&_CustomerClientService_serviceDesc, srv)
+}
+
+func _CustomerClientService_GetCustomerClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCustomerClientRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerClientServiceServer).GetCustomerClient(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerClientService/GetCustomerClient",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerClientServiceServer).GetCustomerClient(ctx, req.(*GetCustomerClientRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CustomerClientService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CustomerClientService",
+	HandlerType: (*CustomerClientServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCustomerClient",
+			Handler:    _CustomerClientService_GetCustomerClient_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/customer_client_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/customer_extension_setting_service.pb.go b/googleapis/ads/googleads/v3/services/customer_extension_setting_service.pb.go
new file mode 100644
index 0000000..4545fcc
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/customer_extension_setting_service.pb.go
@@ -0,0 +1,539 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/customer_extension_setting_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [CustomerExtensionSettingService.GetCustomerExtensionSetting][google.ads.googleads.v3.services.CustomerExtensionSettingService.GetCustomerExtensionSetting].
+type GetCustomerExtensionSettingRequest struct {
+	// Required. The resource name of the customer extension setting to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCustomerExtensionSettingRequest) Reset()         { *m = GetCustomerExtensionSettingRequest{} }
+func (m *GetCustomerExtensionSettingRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCustomerExtensionSettingRequest) ProtoMessage()    {}
+func (*GetCustomerExtensionSettingRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_56ee6b2d7db0d86b, []int{0}
+}
+
+func (m *GetCustomerExtensionSettingRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCustomerExtensionSettingRequest.Unmarshal(m, b)
+}
+func (m *GetCustomerExtensionSettingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCustomerExtensionSettingRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCustomerExtensionSettingRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCustomerExtensionSettingRequest.Merge(m, src)
+}
+func (m *GetCustomerExtensionSettingRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCustomerExtensionSettingRequest.Size(m)
+}
+func (m *GetCustomerExtensionSettingRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCustomerExtensionSettingRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCustomerExtensionSettingRequest proto.InternalMessageInfo
+
+func (m *GetCustomerExtensionSettingRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for
+// [CustomerExtensionSettingService.MutateCustomerExtensionSettings][google.ads.googleads.v3.services.CustomerExtensionSettingService.MutateCustomerExtensionSettings].
+type MutateCustomerExtensionSettingsRequest struct {
+	// Required. The ID of the customer whose customer extension settings are being
+	// modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual customer extension
+	// settings.
+	Operations []*CustomerExtensionSettingOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerExtensionSettingsRequest) Reset() {
+	*m = MutateCustomerExtensionSettingsRequest{}
+}
+func (m *MutateCustomerExtensionSettingsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerExtensionSettingsRequest) ProtoMessage()    {}
+func (*MutateCustomerExtensionSettingsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_56ee6b2d7db0d86b, []int{1}
+}
+
+func (m *MutateCustomerExtensionSettingsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerExtensionSettingsRequest.Unmarshal(m, b)
+}
+func (m *MutateCustomerExtensionSettingsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerExtensionSettingsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerExtensionSettingsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerExtensionSettingsRequest.Merge(m, src)
+}
+func (m *MutateCustomerExtensionSettingsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerExtensionSettingsRequest.Size(m)
+}
+func (m *MutateCustomerExtensionSettingsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerExtensionSettingsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerExtensionSettingsRequest proto.InternalMessageInfo
+
+func (m *MutateCustomerExtensionSettingsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCustomerExtensionSettingsRequest) GetOperations() []*CustomerExtensionSettingOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCustomerExtensionSettingsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCustomerExtensionSettingsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a customer extension setting.
+type CustomerExtensionSettingOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CustomerExtensionSettingOperation_Create
+	//	*CustomerExtensionSettingOperation_Update
+	//	*CustomerExtensionSettingOperation_Remove
+	Operation            isCustomerExtensionSettingOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
+	XXX_unrecognized     []byte                                        `json:"-"`
+	XXX_sizecache        int32                                         `json:"-"`
+}
+
+func (m *CustomerExtensionSettingOperation) Reset()         { *m = CustomerExtensionSettingOperation{} }
+func (m *CustomerExtensionSettingOperation) String() string { return proto.CompactTextString(m) }
+func (*CustomerExtensionSettingOperation) ProtoMessage()    {}
+func (*CustomerExtensionSettingOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_56ee6b2d7db0d86b, []int{2}
+}
+
+func (m *CustomerExtensionSettingOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerExtensionSettingOperation.Unmarshal(m, b)
+}
+func (m *CustomerExtensionSettingOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerExtensionSettingOperation.Marshal(b, m, deterministic)
+}
+func (m *CustomerExtensionSettingOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerExtensionSettingOperation.Merge(m, src)
+}
+func (m *CustomerExtensionSettingOperation) XXX_Size() int {
+	return xxx_messageInfo_CustomerExtensionSettingOperation.Size(m)
+}
+func (m *CustomerExtensionSettingOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerExtensionSettingOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerExtensionSettingOperation proto.InternalMessageInfo
+
+func (m *CustomerExtensionSettingOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCustomerExtensionSettingOperation_Operation interface {
+	isCustomerExtensionSettingOperation_Operation()
+}
+
+type CustomerExtensionSettingOperation_Create struct {
+	Create *resources.CustomerExtensionSetting `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CustomerExtensionSettingOperation_Update struct {
+	Update *resources.CustomerExtensionSetting `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type CustomerExtensionSettingOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CustomerExtensionSettingOperation_Create) isCustomerExtensionSettingOperation_Operation() {}
+
+func (*CustomerExtensionSettingOperation_Update) isCustomerExtensionSettingOperation_Operation() {}
+
+func (*CustomerExtensionSettingOperation_Remove) isCustomerExtensionSettingOperation_Operation() {}
+
+func (m *CustomerExtensionSettingOperation) GetOperation() isCustomerExtensionSettingOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CustomerExtensionSettingOperation) GetCreate() *resources.CustomerExtensionSetting {
+	if x, ok := m.GetOperation().(*CustomerExtensionSettingOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CustomerExtensionSettingOperation) GetUpdate() *resources.CustomerExtensionSetting {
+	if x, ok := m.GetOperation().(*CustomerExtensionSettingOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CustomerExtensionSettingOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CustomerExtensionSettingOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CustomerExtensionSettingOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CustomerExtensionSettingOperation_Create)(nil),
+		(*CustomerExtensionSettingOperation_Update)(nil),
+		(*CustomerExtensionSettingOperation_Remove)(nil),
+	}
+}
+
+// Response message for a customer extension setting mutate.
+type MutateCustomerExtensionSettingsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCustomerExtensionSettingResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *MutateCustomerExtensionSettingsResponse) Reset() {
+	*m = MutateCustomerExtensionSettingsResponse{}
+}
+func (m *MutateCustomerExtensionSettingsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerExtensionSettingsResponse) ProtoMessage()    {}
+func (*MutateCustomerExtensionSettingsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_56ee6b2d7db0d86b, []int{3}
+}
+
+func (m *MutateCustomerExtensionSettingsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerExtensionSettingsResponse.Unmarshal(m, b)
+}
+func (m *MutateCustomerExtensionSettingsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerExtensionSettingsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerExtensionSettingsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerExtensionSettingsResponse.Merge(m, src)
+}
+func (m *MutateCustomerExtensionSettingsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerExtensionSettingsResponse.Size(m)
+}
+func (m *MutateCustomerExtensionSettingsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerExtensionSettingsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerExtensionSettingsResponse proto.InternalMessageInfo
+
+func (m *MutateCustomerExtensionSettingsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCustomerExtensionSettingsResponse) GetResults() []*MutateCustomerExtensionSettingResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the customer extension setting mutate.
+type MutateCustomerExtensionSettingResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerExtensionSettingResult) Reset()         { *m = MutateCustomerExtensionSettingResult{} }
+func (m *MutateCustomerExtensionSettingResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerExtensionSettingResult) ProtoMessage()    {}
+func (*MutateCustomerExtensionSettingResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_56ee6b2d7db0d86b, []int{4}
+}
+
+func (m *MutateCustomerExtensionSettingResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerExtensionSettingResult.Unmarshal(m, b)
+}
+func (m *MutateCustomerExtensionSettingResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerExtensionSettingResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerExtensionSettingResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerExtensionSettingResult.Merge(m, src)
+}
+func (m *MutateCustomerExtensionSettingResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerExtensionSettingResult.Size(m)
+}
+func (m *MutateCustomerExtensionSettingResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerExtensionSettingResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerExtensionSettingResult proto.InternalMessageInfo
+
+func (m *MutateCustomerExtensionSettingResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCustomerExtensionSettingRequest)(nil), "google.ads.googleads.v3.services.GetCustomerExtensionSettingRequest")
+	proto.RegisterType((*MutateCustomerExtensionSettingsRequest)(nil), "google.ads.googleads.v3.services.MutateCustomerExtensionSettingsRequest")
+	proto.RegisterType((*CustomerExtensionSettingOperation)(nil), "google.ads.googleads.v3.services.CustomerExtensionSettingOperation")
+	proto.RegisterType((*MutateCustomerExtensionSettingsResponse)(nil), "google.ads.googleads.v3.services.MutateCustomerExtensionSettingsResponse")
+	proto.RegisterType((*MutateCustomerExtensionSettingResult)(nil), "google.ads.googleads.v3.services.MutateCustomerExtensionSettingResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/customer_extension_setting_service.proto", fileDescriptor_56ee6b2d7db0d86b)
+}
+
+var fileDescriptor_56ee6b2d7db0d86b = []byte{
+	// 776 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xbf, 0x6f, 0xdb, 0x46,
+	0x14, 0xae, 0x28, 0xc3, 0xad, 0x4f, 0x76, 0x0b, 0x5c, 0xd1, 0x56, 0x90, 0x0b, 0x58, 0x65, 0x85,
+	0x5a, 0x10, 0x0a, 0x12, 0x90, 0x36, 0x0a, 0x2e, 0x40, 0xb9, 0x96, 0x6d, 0x14, 0xfe, 0x01, 0x0a,
+	0xf5, 0x50, 0x08, 0x60, 0x4f, 0xe4, 0x59, 0x26, 0x4c, 0xf2, 0x98, 0xbb, 0xa3, 0x10, 0xc3, 0xf0,
+	0x92, 0x21, 0x4b, 0xc6, 0x6c, 0x19, 0x33, 0x66, 0xcf, 0x3f, 0xe1, 0xd5, 0x9b, 0xa7, 0x0c, 0x99,
+	0xb2, 0x67, 0x0f, 0xc8, 0xe3, 0xe9, 0x87, 0x13, 0x9a, 0x01, 0xec, 0xed, 0xe9, 0xde, 0xc7, 0xef,
+	0x7d, 0xf7, 0xde, 0x77, 0x4f, 0x60, 0x7f, 0x4c, 0xc8, 0xd8, 0xc7, 0x3a, 0x72, 0x99, 0x2e, 0xc2,
+	0x24, 0x9a, 0x74, 0x74, 0x86, 0xe9, 0xc4, 0x73, 0x30, 0xd3, 0x9d, 0x98, 0x71, 0x12, 0x60, 0x6a,
+	0xe3, 0xa7, 0x1c, 0x87, 0xcc, 0x23, 0xa1, 0xcd, 0x30, 0xe7, 0x5e, 0x38, 0xb6, 0x33, 0x8c, 0x16,
+	0x51, 0xc2, 0x09, 0xac, 0x8b, 0xef, 0x35, 0xe4, 0x32, 0x6d, 0x4a, 0xa5, 0x4d, 0x3a, 0x9a, 0xa4,
+	0xaa, 0xf5, 0xf2, 0x8a, 0x51, 0xcc, 0x48, 0x4c, 0xef, 0xaf, 0x26, 0xaa, 0xd4, 0x7e, 0x95, 0x1c,
+	0x91, 0xa7, 0xa3, 0x30, 0x24, 0x1c, 0x71, 0x8f, 0x84, 0x2c, 0xcb, 0xfe, 0x32, 0x97, 0x75, 0x7c,
+	0x0f, 0x87, 0x3c, 0x4b, 0x6c, 0xcc, 0x25, 0x4e, 0x3d, 0xec, 0xbb, 0xf6, 0x08, 0x9f, 0xa1, 0x89,
+	0x47, 0x68, 0x06, 0xc8, 0xd4, 0xeb, 0xe9, 0xaf, 0x51, 0x7c, 0x9a, 0xa1, 0x02, 0xc4, 0xce, 0xef,
+	0x70, 0xd3, 0xc8, 0xd1, 0x19, 0x47, 0x3c, 0xce, 0x8a, 0xaa, 0x87, 0x40, 0xdd, 0xc5, 0x7c, 0x3b,
+	0x53, 0xbe, 0x23, 0x85, 0x0f, 0x84, 0x6e, 0x0b, 0x3f, 0x89, 0x31, 0xe3, 0xb0, 0x09, 0xd6, 0xe4,
+	0x35, 0xed, 0x10, 0x05, 0xb8, 0x5a, 0xaa, 0x97, 0x9a, 0x2b, 0xbd, 0xf2, 0x3b, 0x53, 0xb1, 0x56,
+	0x65, 0xe6, 0x10, 0x05, 0x58, 0x7d, 0xae, 0x80, 0x3f, 0x0e, 0x62, 0x8e, 0x38, 0xce, 0xe3, 0x64,
+	0x92, 0xb4, 0x01, 0x2a, 0xd3, 0x8e, 0x79, 0xee, 0x3c, 0x25, 0x90, 0xe7, 0xfb, 0x2e, 0x3c, 0x03,
+	0x80, 0x44, 0x98, 0x8a, 0x4e, 0x55, 0x95, 0x7a, 0xb9, 0x59, 0x69, 0x6f, 0x6b, 0x45, 0xe3, 0xd2,
+	0xf2, 0xaa, 0x1f, 0x49, 0xae, 0xac, 0xd2, 0x8c, 0x1b, 0x6e, 0x82, 0x1f, 0x22, 0x44, 0xb9, 0x87,
+	0x7c, 0xfb, 0x14, 0x79, 0x7e, 0x4c, 0x71, 0xb5, 0x5c, 0x2f, 0x35, 0xbf, 0xb3, 0xbe, 0xcf, 0x8e,
+	0xfb, 0xe2, 0x14, 0xfe, 0x0e, 0xd6, 0x26, 0xc8, 0xf7, 0x5c, 0xc4, 0xb1, 0x4d, 0x42, 0xff, 0xa2,
+	0xba, 0x94, 0xc2, 0x56, 0xe5, 0xe1, 0x51, 0xe8, 0x5f, 0xa8, 0x6f, 0x15, 0xf0, 0x5b, 0xa1, 0x08,
+	0xd8, 0x05, 0x95, 0x38, 0x4a, 0x89, 0x92, 0x61, 0xa5, 0x44, 0x95, 0x76, 0x4d, 0x5e, 0x4f, 0xce,
+	0x53, 0xeb, 0x27, 0xf3, 0x3c, 0x40, 0xec, 0xdc, 0x02, 0x02, 0x9e, 0xc4, 0xf0, 0x5f, 0xb0, 0xec,
+	0x50, 0x8c, 0xb8, 0x18, 0x47, 0xa5, 0xdd, 0xcd, 0x6d, 0xcb, 0xd4, 0xa3, 0xb9, 0x7d, 0xd9, 0xfb,
+	0xc6, 0xca, 0xc8, 0x12, 0x5a, 0x51, 0xa4, 0xaa, 0x3c, 0x0a, 0xad, 0x20, 0x83, 0x55, 0xb0, 0x4c,
+	0x71, 0x40, 0x26, 0xa2, 0xab, 0x2b, 0x49, 0x46, 0xfc, 0xee, 0x55, 0xc0, 0xca, 0x74, 0x0c, 0xea,
+	0x4d, 0x09, 0x6c, 0x16, 0x1a, 0x88, 0x45, 0x24, 0x64, 0x18, 0xf6, 0xc1, 0x4f, 0x77, 0x26, 0x66,
+	0x63, 0x4a, 0x09, 0x4d, 0x2b, 0x54, 0xda, 0x50, 0x0a, 0xa7, 0x91, 0xa3, 0x0d, 0x52, 0xd7, 0x5b,
+	0x3f, 0x2e, 0xce, 0x72, 0x27, 0x81, 0xc3, 0xff, 0xc1, 0xb7, 0x14, 0xb3, 0xd8, 0xe7, 0xd2, 0x60,
+	0xfd, 0x62, 0x83, 0xdd, 0xaf, 0xd1, 0x4a, 0xe9, 0x2c, 0x49, 0xab, 0xfe, 0x03, 0x1a, 0x5f, 0xf3,
+	0x41, 0x62, 0xad, 0x2f, 0x3c, 0xb4, 0xc5, 0x37, 0xd6, 0xbe, 0x59, 0x02, 0x1b, 0x79, 0x3c, 0x03,
+	0xa1, 0x0f, 0x7e, 0x2c, 0x81, 0xf5, 0x7b, 0x1e, 0x36, 0xfc, 0xbb, 0xf8, 0x86, 0xc5, 0x7b, 0xa1,
+	0xf6, 0x10, 0x6b, 0xa8, 0x83, 0x5b, 0x73, 0xf1, 0xb2, 0xcf, 0x6e, 0xde, 0xbf, 0x54, 0xb6, 0x60,
+	0x37, 0xd9, 0xaa, 0x97, 0x0b, 0x99, 0x2d, 0xb9, 0x10, 0x98, 0xde, 0x9a, 0xae, 0xd9, 0xcf, 0x7c,
+	0xa1, 0xb7, 0xae, 0xe0, 0x2b, 0x05, 0x6c, 0x14, 0xd8, 0x07, 0xee, 0x3d, 0x74, 0xba, 0x72, 0x85,
+	0xd5, 0xf6, 0x1f, 0x81, 0x49, 0x78, 0x59, 0x1d, 0xdd, 0x9a, 0x3f, 0xcf, 0xad, 0xc3, 0x3f, 0x67,
+	0x8b, 0x29, 0x6d, 0xcb, 0xb6, 0xfa, 0x57, 0xd2, 0x96, 0x59, 0x1f, 0x2e, 0xe7, 0xc0, 0x5b, 0xad,
+	0xab, 0xfc, 0xae, 0x18, 0x41, 0xaa, 0xc0, 0x28, 0xb5, 0x6a, 0xeb, 0xd7, 0x66, 0x75, 0xa6, 0x32,
+	0x8b, 0x22, 0x8f, 0x69, 0x0e, 0x09, 0x7a, 0x2f, 0x14, 0xd0, 0x70, 0x48, 0x50, 0x78, 0xa3, 0x5e,
+	0xa3, 0xc0, 0x7b, 0xc7, 0xc9, 0xd6, 0x3a, 0x2e, 0xfd, 0xb7, 0x97, 0x31, 0x8d, 0x89, 0x8f, 0xc2,
+	0xb1, 0x46, 0xe8, 0x58, 0x1f, 0xe3, 0x30, 0xdd, 0x69, 0xfa, 0xac, 0x76, 0xfe, 0xbf, 0x77, 0x57,
+	0x06, 0xaf, 0x95, 0xf2, 0xae, 0x69, 0xbe, 0x51, 0xea, 0xbb, 0x82, 0xd0, 0x74, 0x99, 0x26, 0xc2,
+	0x24, 0x3a, 0xe9, 0x68, 0x59, 0x61, 0x76, 0x2d, 0x21, 0x43, 0xd3, 0x65, 0xc3, 0x29, 0x64, 0x78,
+	0xd2, 0x19, 0x4a, 0xc8, 0x07, 0xa5, 0x21, 0xce, 0x0d, 0xc3, 0x74, 0x99, 0x61, 0x4c, 0x41, 0x86,
+	0x71, 0xd2, 0x31, 0x0c, 0x09, 0x1b, 0x2d, 0xa7, 0x3a, 0x3b, 0x9f, 0x02, 0x00, 0x00, 0xff, 0xff,
+	0xd4, 0xf0, 0x94, 0xc1, 0x64, 0x08, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CustomerExtensionSettingServiceClient is the client API for CustomerExtensionSettingService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CustomerExtensionSettingServiceClient interface {
+	// Returns the requested customer extension setting in full detail.
+	GetCustomerExtensionSetting(ctx context.Context, in *GetCustomerExtensionSettingRequest, opts ...grpc.CallOption) (*resources.CustomerExtensionSetting, error)
+	// Creates, updates, or removes customer extension settings. Operation
+	// statuses are returned.
+	MutateCustomerExtensionSettings(ctx context.Context, in *MutateCustomerExtensionSettingsRequest, opts ...grpc.CallOption) (*MutateCustomerExtensionSettingsResponse, error)
+}
+
+type customerExtensionSettingServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCustomerExtensionSettingServiceClient(cc grpc.ClientConnInterface) CustomerExtensionSettingServiceClient {
+	return &customerExtensionSettingServiceClient{cc}
+}
+
+func (c *customerExtensionSettingServiceClient) GetCustomerExtensionSetting(ctx context.Context, in *GetCustomerExtensionSettingRequest, opts ...grpc.CallOption) (*resources.CustomerExtensionSetting, error) {
+	out := new(resources.CustomerExtensionSetting)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerExtensionSettingService/GetCustomerExtensionSetting", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerExtensionSettingServiceClient) MutateCustomerExtensionSettings(ctx context.Context, in *MutateCustomerExtensionSettingsRequest, opts ...grpc.CallOption) (*MutateCustomerExtensionSettingsResponse, error) {
+	out := new(MutateCustomerExtensionSettingsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerExtensionSettingService/MutateCustomerExtensionSettings", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CustomerExtensionSettingServiceServer is the server API for CustomerExtensionSettingService service.
+type CustomerExtensionSettingServiceServer interface {
+	// Returns the requested customer extension setting in full detail.
+	GetCustomerExtensionSetting(context.Context, *GetCustomerExtensionSettingRequest) (*resources.CustomerExtensionSetting, error)
+	// Creates, updates, or removes customer extension settings. Operation
+	// statuses are returned.
+	MutateCustomerExtensionSettings(context.Context, *MutateCustomerExtensionSettingsRequest) (*MutateCustomerExtensionSettingsResponse, error)
+}
+
+// UnimplementedCustomerExtensionSettingServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCustomerExtensionSettingServiceServer struct {
+}
+
+func (*UnimplementedCustomerExtensionSettingServiceServer) GetCustomerExtensionSetting(ctx context.Context, req *GetCustomerExtensionSettingRequest) (*resources.CustomerExtensionSetting, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCustomerExtensionSetting not implemented")
+}
+func (*UnimplementedCustomerExtensionSettingServiceServer) MutateCustomerExtensionSettings(ctx context.Context, req *MutateCustomerExtensionSettingsRequest) (*MutateCustomerExtensionSettingsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCustomerExtensionSettings not implemented")
+}
+
+func RegisterCustomerExtensionSettingServiceServer(s *grpc.Server, srv CustomerExtensionSettingServiceServer) {
+	s.RegisterService(&_CustomerExtensionSettingService_serviceDesc, srv)
+}
+
+func _CustomerExtensionSettingService_GetCustomerExtensionSetting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCustomerExtensionSettingRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerExtensionSettingServiceServer).GetCustomerExtensionSetting(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerExtensionSettingService/GetCustomerExtensionSetting",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerExtensionSettingServiceServer).GetCustomerExtensionSetting(ctx, req.(*GetCustomerExtensionSettingRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerExtensionSettingService_MutateCustomerExtensionSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCustomerExtensionSettingsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerExtensionSettingServiceServer).MutateCustomerExtensionSettings(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerExtensionSettingService/MutateCustomerExtensionSettings",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerExtensionSettingServiceServer).MutateCustomerExtensionSettings(ctx, req.(*MutateCustomerExtensionSettingsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CustomerExtensionSettingService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CustomerExtensionSettingService",
+	HandlerType: (*CustomerExtensionSettingServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCustomerExtensionSetting",
+			Handler:    _CustomerExtensionSettingService_GetCustomerExtensionSetting_Handler,
+		},
+		{
+			MethodName: "MutateCustomerExtensionSettings",
+			Handler:    _CustomerExtensionSettingService_MutateCustomerExtensionSettings_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/customer_extension_setting_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/customer_feed_service.pb.go b/googleapis/ads/googleads/v3/services/customer_feed_service.pb.go
new file mode 100644
index 0000000..ab7f54b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/customer_feed_service.pb.go
@@ -0,0 +1,530 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/customer_feed_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CustomerFeedService.GetCustomerFeed][google.ads.googleads.v3.services.CustomerFeedService.GetCustomerFeed].
+type GetCustomerFeedRequest struct {
+	// Required. The resource name of the customer feed to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCustomerFeedRequest) Reset()         { *m = GetCustomerFeedRequest{} }
+func (m *GetCustomerFeedRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCustomerFeedRequest) ProtoMessage()    {}
+func (*GetCustomerFeedRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_900ccf1cb9cd0de8, []int{0}
+}
+
+func (m *GetCustomerFeedRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCustomerFeedRequest.Unmarshal(m, b)
+}
+func (m *GetCustomerFeedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCustomerFeedRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCustomerFeedRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCustomerFeedRequest.Merge(m, src)
+}
+func (m *GetCustomerFeedRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCustomerFeedRequest.Size(m)
+}
+func (m *GetCustomerFeedRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCustomerFeedRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCustomerFeedRequest proto.InternalMessageInfo
+
+func (m *GetCustomerFeedRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CustomerFeedService.MutateCustomerFeeds][google.ads.googleads.v3.services.CustomerFeedService.MutateCustomerFeeds].
+type MutateCustomerFeedsRequest struct {
+	// Required. The ID of the customer whose customer feeds are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual customer feeds.
+	Operations []*CustomerFeedOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerFeedsRequest) Reset()         { *m = MutateCustomerFeedsRequest{} }
+func (m *MutateCustomerFeedsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerFeedsRequest) ProtoMessage()    {}
+func (*MutateCustomerFeedsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_900ccf1cb9cd0de8, []int{1}
+}
+
+func (m *MutateCustomerFeedsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerFeedsRequest.Unmarshal(m, b)
+}
+func (m *MutateCustomerFeedsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerFeedsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerFeedsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerFeedsRequest.Merge(m, src)
+}
+func (m *MutateCustomerFeedsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerFeedsRequest.Size(m)
+}
+func (m *MutateCustomerFeedsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerFeedsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerFeedsRequest proto.InternalMessageInfo
+
+func (m *MutateCustomerFeedsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCustomerFeedsRequest) GetOperations() []*CustomerFeedOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCustomerFeedsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCustomerFeedsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a customer feed.
+type CustomerFeedOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CustomerFeedOperation_Create
+	//	*CustomerFeedOperation_Update
+	//	*CustomerFeedOperation_Remove
+	Operation            isCustomerFeedOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *CustomerFeedOperation) Reset()         { *m = CustomerFeedOperation{} }
+func (m *CustomerFeedOperation) String() string { return proto.CompactTextString(m) }
+func (*CustomerFeedOperation) ProtoMessage()    {}
+func (*CustomerFeedOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_900ccf1cb9cd0de8, []int{2}
+}
+
+func (m *CustomerFeedOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerFeedOperation.Unmarshal(m, b)
+}
+func (m *CustomerFeedOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerFeedOperation.Marshal(b, m, deterministic)
+}
+func (m *CustomerFeedOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerFeedOperation.Merge(m, src)
+}
+func (m *CustomerFeedOperation) XXX_Size() int {
+	return xxx_messageInfo_CustomerFeedOperation.Size(m)
+}
+func (m *CustomerFeedOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerFeedOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerFeedOperation proto.InternalMessageInfo
+
+func (m *CustomerFeedOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCustomerFeedOperation_Operation interface {
+	isCustomerFeedOperation_Operation()
+}
+
+type CustomerFeedOperation_Create struct {
+	Create *resources.CustomerFeed `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CustomerFeedOperation_Update struct {
+	Update *resources.CustomerFeed `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type CustomerFeedOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*CustomerFeedOperation_Create) isCustomerFeedOperation_Operation() {}
+
+func (*CustomerFeedOperation_Update) isCustomerFeedOperation_Operation() {}
+
+func (*CustomerFeedOperation_Remove) isCustomerFeedOperation_Operation() {}
+
+func (m *CustomerFeedOperation) GetOperation() isCustomerFeedOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CustomerFeedOperation) GetCreate() *resources.CustomerFeed {
+	if x, ok := m.GetOperation().(*CustomerFeedOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CustomerFeedOperation) GetUpdate() *resources.CustomerFeed {
+	if x, ok := m.GetOperation().(*CustomerFeedOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *CustomerFeedOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CustomerFeedOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CustomerFeedOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CustomerFeedOperation_Create)(nil),
+		(*CustomerFeedOperation_Update)(nil),
+		(*CustomerFeedOperation_Remove)(nil),
+	}
+}
+
+// Response message for a customer feed mutate.
+type MutateCustomerFeedsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCustomerFeedResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *MutateCustomerFeedsResponse) Reset()         { *m = MutateCustomerFeedsResponse{} }
+func (m *MutateCustomerFeedsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerFeedsResponse) ProtoMessage()    {}
+func (*MutateCustomerFeedsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_900ccf1cb9cd0de8, []int{3}
+}
+
+func (m *MutateCustomerFeedsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerFeedsResponse.Unmarshal(m, b)
+}
+func (m *MutateCustomerFeedsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerFeedsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerFeedsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerFeedsResponse.Merge(m, src)
+}
+func (m *MutateCustomerFeedsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerFeedsResponse.Size(m)
+}
+func (m *MutateCustomerFeedsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerFeedsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerFeedsResponse proto.InternalMessageInfo
+
+func (m *MutateCustomerFeedsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCustomerFeedsResponse) GetResults() []*MutateCustomerFeedResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the customer feed mutate.
+type MutateCustomerFeedResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerFeedResult) Reset()         { *m = MutateCustomerFeedResult{} }
+func (m *MutateCustomerFeedResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerFeedResult) ProtoMessage()    {}
+func (*MutateCustomerFeedResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_900ccf1cb9cd0de8, []int{4}
+}
+
+func (m *MutateCustomerFeedResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerFeedResult.Unmarshal(m, b)
+}
+func (m *MutateCustomerFeedResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerFeedResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerFeedResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerFeedResult.Merge(m, src)
+}
+func (m *MutateCustomerFeedResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerFeedResult.Size(m)
+}
+func (m *MutateCustomerFeedResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerFeedResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerFeedResult proto.InternalMessageInfo
+
+func (m *MutateCustomerFeedResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCustomerFeedRequest)(nil), "google.ads.googleads.v3.services.GetCustomerFeedRequest")
+	proto.RegisterType((*MutateCustomerFeedsRequest)(nil), "google.ads.googleads.v3.services.MutateCustomerFeedsRequest")
+	proto.RegisterType((*CustomerFeedOperation)(nil), "google.ads.googleads.v3.services.CustomerFeedOperation")
+	proto.RegisterType((*MutateCustomerFeedsResponse)(nil), "google.ads.googleads.v3.services.MutateCustomerFeedsResponse")
+	proto.RegisterType((*MutateCustomerFeedResult)(nil), "google.ads.googleads.v3.services.MutateCustomerFeedResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/customer_feed_service.proto", fileDescriptor_900ccf1cb9cd0de8)
+}
+
+var fileDescriptor_900ccf1cb9cd0de8 = []byte{
+	// 758 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4f, 0x6b, 0xdb, 0x48,
+	0x14, 0x5f, 0xc9, 0x4b, 0x76, 0x33, 0x4e, 0x36, 0x30, 0x21, 0x59, 0xe1, 0x2c, 0xac, 0xd1, 0x06,
+	0xd6, 0x98, 0x45, 0x62, 0x6d, 0x96, 0x2c, 0x4a, 0x42, 0x91, 0x4b, 0xed, 0xe4, 0x90, 0x26, 0x28,
+	0xc5, 0x87, 0x62, 0x30, 0x13, 0x69, 0xec, 0x8a, 0x48, 0x1a, 0x75, 0x66, 0x64, 0x08, 0x21, 0x97,
+	0x7e, 0x83, 0xd2, 0x6f, 0xd0, 0x63, 0xbf, 0x42, 0xcf, 0xbd, 0xe4, 0xda, 0x5b, 0x4e, 0x3d, 0x14,
+	0x0a, 0x39, 0xf4, 0x2b, 0xb4, 0x48, 0xa3, 0xb1, 0xe5, 0xc4, 0xc6, 0x34, 0xb7, 0xa7, 0x79, 0xbf,
+	0xf7, 0x7b, 0xff, 0x9f, 0xc0, 0xde, 0x90, 0x90, 0x61, 0x80, 0x4d, 0xe4, 0x31, 0x53, 0x88, 0xa9,
+	0x34, 0x6a, 0x9a, 0x0c, 0xd3, 0x91, 0xef, 0x62, 0x66, 0xba, 0x09, 0xe3, 0x24, 0xc4, 0xb4, 0x3f,
+	0xc0, 0xd8, 0xeb, 0xe7, 0xcf, 0x46, 0x4c, 0x09, 0x27, 0xb0, 0x2a, 0x4c, 0x0c, 0xe4, 0x31, 0x63,
+	0x6c, 0x6d, 0x8c, 0x9a, 0x86, 0xb4, 0xae, 0xfc, 0x37, 0x8f, 0x9f, 0x62, 0x46, 0x12, 0x7a, 0xcf,
+	0x81, 0x20, 0xae, 0xfc, 0x21, 0xcd, 0x62, 0xdf, 0x44, 0x51, 0x44, 0x38, 0xe2, 0x3e, 0x89, 0x58,
+	0xae, 0xfd, 0xbd, 0xa0, 0x75, 0x03, 0x1f, 0x47, 0x3c, 0x57, 0xfc, 0x59, 0x50, 0x0c, 0x7c, 0x1c,
+	0x78, 0xfd, 0x33, 0xfc, 0x02, 0x8d, 0x7c, 0x42, 0x73, 0x40, 0x1e, 0xb0, 0x99, 0x7d, 0x9d, 0x25,
+	0x83, 0x1c, 0x15, 0x22, 0x76, 0x7e, 0x87, 0x9b, 0xc6, 0xae, 0xc9, 0x38, 0xe2, 0x49, 0xee, 0x54,
+	0x6f, 0x81, 0xcd, 0x0e, 0xe6, 0x8f, 0xf3, 0x60, 0xdb, 0x18, 0x7b, 0x0e, 0x7e, 0x99, 0x60, 0xc6,
+	0x61, 0x0d, 0xac, 0xca, 0x6c, 0xfa, 0x11, 0x0a, 0xb1, 0xa6, 0x54, 0x95, 0xda, 0x72, 0xab, 0xf4,
+	0xc9, 0x56, 0x9d, 0x15, 0xa9, 0x79, 0x8a, 0x42, 0xac, 0x7f, 0x55, 0x40, 0xe5, 0x28, 0xe1, 0x88,
+	0xe3, 0x22, 0x0f, 0x93, 0x44, 0xdb, 0xa0, 0x3c, 0x2e, 0x86, 0xef, 0x15, 0x69, 0x80, 0x7c, 0x3f,
+	0xf4, 0x60, 0x0f, 0x00, 0x12, 0x63, 0x2a, 0x2a, 0xa2, 0xa9, 0xd5, 0x52, 0xad, 0xdc, 0xd8, 0x31,
+	0x16, 0x75, 0xc2, 0x28, 0x7a, 0x3c, 0x96, 0xf6, 0x39, 0xfb, 0x84, 0x0f, 0xfe, 0x0d, 0xd6, 0x62,
+	0x44, 0xb9, 0x8f, 0x82, 0xfe, 0x00, 0xf9, 0x41, 0x42, 0xb1, 0x56, 0xaa, 0x2a, 0xb5, 0x5f, 0x9d,
+	0xdf, 0xf2, 0xe7, 0xb6, 0x78, 0x85, 0x7f, 0x81, 0xd5, 0x11, 0x0a, 0x7c, 0x0f, 0x71, 0xdc, 0x27,
+	0x51, 0x70, 0xa1, 0xfd, 0x9c, 0xc1, 0x56, 0xe4, 0xe3, 0x71, 0x14, 0x5c, 0xe8, 0xaf, 0x55, 0xb0,
+	0x31, 0xd3, 0x31, 0xdc, 0x05, 0xe5, 0x24, 0xce, 0x8c, 0xd3, 0xe2, 0x67, 0xc6, 0xe5, 0x46, 0x45,
+	0xa6, 0x21, 0xfb, 0x63, 0xb4, 0xd3, 0xfe, 0x1c, 0x21, 0x76, 0xee, 0x00, 0x01, 0x4f, 0x65, 0x78,
+	0x08, 0x96, 0x5c, 0x8a, 0x11, 0x17, 0xa5, 0x2e, 0x37, 0xcc, 0xb9, 0xe9, 0x8f, 0xc7, 0x6c, 0x2a,
+	0xff, 0x83, 0x9f, 0x9c, 0x9c, 0x20, 0xa5, 0x12, 0xc4, 0x9a, 0xfa, 0x60, 0x2a, 0x41, 0x00, 0x35,
+	0xb0, 0x44, 0x71, 0x48, 0x46, 0xa2, 0x62, 0xcb, 0xa9, 0x46, 0x7c, 0xb7, 0xca, 0x60, 0x79, 0x5c,
+	0x62, 0xfd, 0xbd, 0x02, 0xb6, 0x66, 0x0e, 0x01, 0x8b, 0x49, 0xc4, 0x30, 0x6c, 0x83, 0x8d, 0x3b,
+	0x1d, 0xe8, 0x63, 0x4a, 0x09, 0xcd, 0x58, 0xcb, 0x0d, 0x28, 0x03, 0xa4, 0xb1, 0x6b, 0x9c, 0x66,
+	0x13, 0xea, 0xac, 0x4f, 0xf7, 0xe6, 0x49, 0x0a, 0x87, 0xcf, 0xc0, 0x2f, 0x14, 0xb3, 0x24, 0xe0,
+	0x72, 0x48, 0xac, 0xc5, 0x43, 0x72, 0x3f, 0x2e, 0x27, 0xa3, 0x70, 0x24, 0x95, 0xfe, 0x08, 0x68,
+	0xf3, 0x40, 0xe9, 0x48, 0xcc, 0x58, 0x84, 0xe9, 0x1d, 0x68, 0x7c, 0x29, 0x81, 0xf5, 0xa2, 0xed,
+	0xa9, 0xf0, 0x0d, 0x3f, 0x28, 0x60, 0xed, 0xce, 0x82, 0xc1, 0xff, 0x17, 0x47, 0x3c, 0x7b, 0x27,
+	0x2b, 0x3f, 0xda, 0x46, 0xbd, 0x73, 0x63, 0x4f, 0x07, 0xff, 0xea, 0xe3, 0xe7, 0x37, 0xea, 0xbf,
+	0xd0, 0x4c, 0x8f, 0xd5, 0xe5, 0x94, 0x66, 0x5f, 0x2e, 0x23, 0x33, 0xeb, 0xe3, 0xeb, 0x95, 0xf5,
+	0xd0, 0xac, 0x5f, 0xc1, 0x5b, 0x05, 0xac, 0xcf, 0x68, 0x2f, 0xdc, 0x7b, 0x48, 0xf5, 0xe5, 0x69,
+	0xa8, 0xec, 0x3f, 0xd0, 0x5a, 0xcc, 0x94, 0xde, 0xbd, 0xb1, 0x37, 0x0b, 0xa7, 0xe5, 0x9f, 0xc9,
+	0xc2, 0x67, 0x69, 0xee, 0xe8, 0x8d, 0x34, 0xcd, 0x49, 0x5e, 0x97, 0x05, 0xf0, 0x7e, 0xfd, 0x6a,
+	0x3a, 0x4b, 0x2b, 0xcc, 0x3c, 0x59, 0x4a, 0xbd, 0xb2, 0x75, 0x6d, 0x6b, 0x93, 0x68, 0x72, 0x29,
+	0xf6, 0x99, 0xe1, 0x92, 0xb0, 0xf5, 0x4d, 0x01, 0xdb, 0x2e, 0x09, 0x17, 0x46, 0xde, 0xd2, 0x66,
+	0xcc, 0xc3, 0x49, 0x7a, 0x01, 0x4e, 0x94, 0xe7, 0x07, 0xb9, 0xf5, 0x90, 0x04, 0x28, 0x1a, 0x1a,
+	0x84, 0x0e, 0xcd, 0x21, 0x8e, 0xb2, 0xfb, 0x60, 0x4e, 0xfc, 0xcd, 0xff, 0x7f, 0xed, 0x4a, 0xe1,
+	0xad, 0x5a, 0xea, 0xd8, 0xf6, 0x3b, 0xb5, 0xda, 0x11, 0x84, 0xb6, 0xc7, 0x0c, 0x21, 0xa6, 0x52,
+	0xb7, 0x69, 0xe4, 0x8e, 0xd9, 0xb5, 0x84, 0xf4, 0x6c, 0x8f, 0xf5, 0xc6, 0x90, 0x5e, 0xb7, 0xd9,
+	0x93, 0x90, 0x5b, 0x75, 0x5b, 0xbc, 0x5b, 0x96, 0xed, 0x31, 0xcb, 0x1a, 0x83, 0x2c, 0xab, 0xdb,
+	0xb4, 0x2c, 0x09, 0x3b, 0x5b, 0xca, 0xe2, 0x6c, 0x7e, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x4a, 0xcc,
+	0xb1, 0x8a, 0x66, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CustomerFeedServiceClient is the client API for CustomerFeedService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CustomerFeedServiceClient interface {
+	// Returns the requested customer feed in full detail.
+	GetCustomerFeed(ctx context.Context, in *GetCustomerFeedRequest, opts ...grpc.CallOption) (*resources.CustomerFeed, error)
+	// Creates, updates, or removes customer feeds. Operation statuses are
+	// returned.
+	MutateCustomerFeeds(ctx context.Context, in *MutateCustomerFeedsRequest, opts ...grpc.CallOption) (*MutateCustomerFeedsResponse, error)
+}
+
+type customerFeedServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCustomerFeedServiceClient(cc grpc.ClientConnInterface) CustomerFeedServiceClient {
+	return &customerFeedServiceClient{cc}
+}
+
+func (c *customerFeedServiceClient) GetCustomerFeed(ctx context.Context, in *GetCustomerFeedRequest, opts ...grpc.CallOption) (*resources.CustomerFeed, error) {
+	out := new(resources.CustomerFeed)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerFeedService/GetCustomerFeed", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerFeedServiceClient) MutateCustomerFeeds(ctx context.Context, in *MutateCustomerFeedsRequest, opts ...grpc.CallOption) (*MutateCustomerFeedsResponse, error) {
+	out := new(MutateCustomerFeedsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerFeedService/MutateCustomerFeeds", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CustomerFeedServiceServer is the server API for CustomerFeedService service.
+type CustomerFeedServiceServer interface {
+	// Returns the requested customer feed in full detail.
+	GetCustomerFeed(context.Context, *GetCustomerFeedRequest) (*resources.CustomerFeed, error)
+	// Creates, updates, or removes customer feeds. Operation statuses are
+	// returned.
+	MutateCustomerFeeds(context.Context, *MutateCustomerFeedsRequest) (*MutateCustomerFeedsResponse, error)
+}
+
+// UnimplementedCustomerFeedServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCustomerFeedServiceServer struct {
+}
+
+func (*UnimplementedCustomerFeedServiceServer) GetCustomerFeed(ctx context.Context, req *GetCustomerFeedRequest) (*resources.CustomerFeed, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCustomerFeed not implemented")
+}
+func (*UnimplementedCustomerFeedServiceServer) MutateCustomerFeeds(ctx context.Context, req *MutateCustomerFeedsRequest) (*MutateCustomerFeedsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCustomerFeeds not implemented")
+}
+
+func RegisterCustomerFeedServiceServer(s *grpc.Server, srv CustomerFeedServiceServer) {
+	s.RegisterService(&_CustomerFeedService_serviceDesc, srv)
+}
+
+func _CustomerFeedService_GetCustomerFeed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCustomerFeedRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerFeedServiceServer).GetCustomerFeed(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerFeedService/GetCustomerFeed",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerFeedServiceServer).GetCustomerFeed(ctx, req.(*GetCustomerFeedRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerFeedService_MutateCustomerFeeds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCustomerFeedsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerFeedServiceServer).MutateCustomerFeeds(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerFeedService/MutateCustomerFeeds",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerFeedServiceServer).MutateCustomerFeeds(ctx, req.(*MutateCustomerFeedsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CustomerFeedService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CustomerFeedService",
+	HandlerType: (*CustomerFeedServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCustomerFeed",
+			Handler:    _CustomerFeedService_GetCustomerFeed_Handler,
+		},
+		{
+			MethodName: "MutateCustomerFeeds",
+			Handler:    _CustomerFeedService_MutateCustomerFeeds_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/customer_feed_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/customer_label_service.pb.go b/googleapis/ads/googleads/v3/services/customer_label_service.pb.go
new file mode 100644
index 0000000..afdf515
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/customer_label_service.pb.go
@@ -0,0 +1,502 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/customer_label_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CustomerLabelService.GetCustomerLabel][google.ads.googleads.v3.services.CustomerLabelService.GetCustomerLabel].
+type GetCustomerLabelRequest struct {
+	// Required. The resource name of the customer-label relationship to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCustomerLabelRequest) Reset()         { *m = GetCustomerLabelRequest{} }
+func (m *GetCustomerLabelRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCustomerLabelRequest) ProtoMessage()    {}
+func (*GetCustomerLabelRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f8bb3d196a781b56, []int{0}
+}
+
+func (m *GetCustomerLabelRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCustomerLabelRequest.Unmarshal(m, b)
+}
+func (m *GetCustomerLabelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCustomerLabelRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCustomerLabelRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCustomerLabelRequest.Merge(m, src)
+}
+func (m *GetCustomerLabelRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCustomerLabelRequest.Size(m)
+}
+func (m *GetCustomerLabelRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCustomerLabelRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCustomerLabelRequest proto.InternalMessageInfo
+
+func (m *GetCustomerLabelRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CustomerLabelService.MutateCustomerLabels][google.ads.googleads.v3.services.CustomerLabelService.MutateCustomerLabels].
+type MutateCustomerLabelsRequest struct {
+	// Required. ID of the customer whose customer-label relationships are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on customer-label relationships.
+	Operations []*CustomerLabelOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerLabelsRequest) Reset()         { *m = MutateCustomerLabelsRequest{} }
+func (m *MutateCustomerLabelsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerLabelsRequest) ProtoMessage()    {}
+func (*MutateCustomerLabelsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f8bb3d196a781b56, []int{1}
+}
+
+func (m *MutateCustomerLabelsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerLabelsRequest.Unmarshal(m, b)
+}
+func (m *MutateCustomerLabelsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerLabelsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerLabelsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerLabelsRequest.Merge(m, src)
+}
+func (m *MutateCustomerLabelsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerLabelsRequest.Size(m)
+}
+func (m *MutateCustomerLabelsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerLabelsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerLabelsRequest proto.InternalMessageInfo
+
+func (m *MutateCustomerLabelsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCustomerLabelsRequest) GetOperations() []*CustomerLabelOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCustomerLabelsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCustomerLabelsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove) on a customer-label relationship.
+type CustomerLabelOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CustomerLabelOperation_Create
+	//	*CustomerLabelOperation_Remove
+	Operation            isCustomerLabelOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *CustomerLabelOperation) Reset()         { *m = CustomerLabelOperation{} }
+func (m *CustomerLabelOperation) String() string { return proto.CompactTextString(m) }
+func (*CustomerLabelOperation) ProtoMessage()    {}
+func (*CustomerLabelOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f8bb3d196a781b56, []int{2}
+}
+
+func (m *CustomerLabelOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerLabelOperation.Unmarshal(m, b)
+}
+func (m *CustomerLabelOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerLabelOperation.Marshal(b, m, deterministic)
+}
+func (m *CustomerLabelOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerLabelOperation.Merge(m, src)
+}
+func (m *CustomerLabelOperation) XXX_Size() int {
+	return xxx_messageInfo_CustomerLabelOperation.Size(m)
+}
+func (m *CustomerLabelOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerLabelOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerLabelOperation proto.InternalMessageInfo
+
+type isCustomerLabelOperation_Operation interface {
+	isCustomerLabelOperation_Operation()
+}
+
+type CustomerLabelOperation_Create struct {
+	Create *resources.CustomerLabel `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CustomerLabelOperation_Remove struct {
+	Remove string `protobuf:"bytes,2,opt,name=remove,proto3,oneof"`
+}
+
+func (*CustomerLabelOperation_Create) isCustomerLabelOperation_Operation() {}
+
+func (*CustomerLabelOperation_Remove) isCustomerLabelOperation_Operation() {}
+
+func (m *CustomerLabelOperation) GetOperation() isCustomerLabelOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CustomerLabelOperation) GetCreate() *resources.CustomerLabel {
+	if x, ok := m.GetOperation().(*CustomerLabelOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CustomerLabelOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CustomerLabelOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CustomerLabelOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CustomerLabelOperation_Create)(nil),
+		(*CustomerLabelOperation_Remove)(nil),
+	}
+}
+
+// Response message for a customer labels mutate.
+type MutateCustomerLabelsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCustomerLabelResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *MutateCustomerLabelsResponse) Reset()         { *m = MutateCustomerLabelsResponse{} }
+func (m *MutateCustomerLabelsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerLabelsResponse) ProtoMessage()    {}
+func (*MutateCustomerLabelsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f8bb3d196a781b56, []int{3}
+}
+
+func (m *MutateCustomerLabelsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerLabelsResponse.Unmarshal(m, b)
+}
+func (m *MutateCustomerLabelsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerLabelsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerLabelsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerLabelsResponse.Merge(m, src)
+}
+func (m *MutateCustomerLabelsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerLabelsResponse.Size(m)
+}
+func (m *MutateCustomerLabelsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerLabelsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerLabelsResponse proto.InternalMessageInfo
+
+func (m *MutateCustomerLabelsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCustomerLabelsResponse) GetResults() []*MutateCustomerLabelResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for a customer label mutate.
+type MutateCustomerLabelResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerLabelResult) Reset()         { *m = MutateCustomerLabelResult{} }
+func (m *MutateCustomerLabelResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerLabelResult) ProtoMessage()    {}
+func (*MutateCustomerLabelResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f8bb3d196a781b56, []int{4}
+}
+
+func (m *MutateCustomerLabelResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerLabelResult.Unmarshal(m, b)
+}
+func (m *MutateCustomerLabelResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerLabelResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerLabelResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerLabelResult.Merge(m, src)
+}
+func (m *MutateCustomerLabelResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerLabelResult.Size(m)
+}
+func (m *MutateCustomerLabelResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerLabelResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerLabelResult proto.InternalMessageInfo
+
+func (m *MutateCustomerLabelResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCustomerLabelRequest)(nil), "google.ads.googleads.v3.services.GetCustomerLabelRequest")
+	proto.RegisterType((*MutateCustomerLabelsRequest)(nil), "google.ads.googleads.v3.services.MutateCustomerLabelsRequest")
+	proto.RegisterType((*CustomerLabelOperation)(nil), "google.ads.googleads.v3.services.CustomerLabelOperation")
+	proto.RegisterType((*MutateCustomerLabelsResponse)(nil), "google.ads.googleads.v3.services.MutateCustomerLabelsResponse")
+	proto.RegisterType((*MutateCustomerLabelResult)(nil), "google.ads.googleads.v3.services.MutateCustomerLabelResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/customer_label_service.proto", fileDescriptor_f8bb3d196a781b56)
+}
+
+var fileDescriptor_f8bb3d196a781b56 = []byte{
+	// 711 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcd, 0x6e, 0xd3, 0x4a,
+	0x14, 0xbe, 0x76, 0xae, 0x7a, 0x6f, 0x27, 0xed, 0xbd, 0x68, 0x28, 0x6d, 0x9a, 0x56, 0x22, 0x32,
+	0x95, 0x88, 0x22, 0x64, 0x57, 0x89, 0x84, 0x8a, 0xab, 0x20, 0x9c, 0x8a, 0xb6, 0x20, 0xa0, 0x95,
+	0x2b, 0x8a, 0x84, 0x82, 0xac, 0xa9, 0x3d, 0x0d, 0x96, 0x6c, 0x8f, 0x99, 0x19, 0x47, 0xaa, 0xaa,
+	0x4a, 0x88, 0x2d, 0x4b, 0xde, 0x80, 0x25, 0xef, 0xc0, 0x03, 0xd0, 0x2d, 0xbb, 0xae, 0x58, 0xb0,
+	0x62, 0x81, 0xfa, 0x08, 0xc8, 0x3f, 0xe3, 0xc4, 0x21, 0x51, 0x44, 0x77, 0xc7, 0xe7, 0xe7, 0x3b,
+	0xe7, 0x3b, 0x3f, 0x63, 0xd0, 0xee, 0x11, 0xd2, 0xf3, 0xb0, 0x86, 0x1c, 0xa6, 0xa5, 0x62, 0x2c,
+	0xf5, 0x5b, 0x1a, 0xc3, 0xb4, 0xef, 0xda, 0x98, 0x69, 0x76, 0xc4, 0x38, 0xf1, 0x31, 0xb5, 0x3c,
+	0x74, 0x84, 0x3d, 0x2b, 0xd3, 0xab, 0x21, 0x25, 0x9c, 0xc0, 0x5a, 0x1a, 0xa3, 0x22, 0x87, 0xa9,
+	0x79, 0xb8, 0xda, 0x6f, 0xa9, 0x22, 0xbc, 0x7a, 0x77, 0x52, 0x02, 0x8a, 0x19, 0x89, 0xe8, 0xef,
+	0x19, 0x52, 0xe4, 0xea, 0xaa, 0x88, 0x0b, 0x5d, 0x0d, 0x05, 0x01, 0xe1, 0x88, 0xbb, 0x24, 0x60,
+	0x99, 0x75, 0x69, 0xc8, 0x6a, 0x7b, 0x2e, 0x0e, 0x78, 0x66, 0xb8, 0x39, 0x64, 0x38, 0x76, 0xb1,
+	0xe7, 0x58, 0x47, 0xf8, 0x35, 0xea, 0xbb, 0x84, 0x8e, 0x44, 0xd2, 0xd0, 0xd6, 0x18, 0x47, 0x3c,
+	0xca, 0x20, 0x95, 0x2d, 0xb0, 0xb4, 0x83, 0xf9, 0x56, 0x56, 0xcb, 0x93, 0xb8, 0x14, 0x13, 0xbf,
+	0x89, 0x30, 0xe3, 0xb0, 0x0e, 0xe6, 0x45, 0xb5, 0x56, 0x80, 0x7c, 0x5c, 0x91, 0x6a, 0x52, 0x7d,
+	0xb6, 0x53, 0xfa, 0x66, 0xc8, 0xe6, 0x9c, 0xb0, 0x3c, 0x43, 0x3e, 0x56, 0x2e, 0x25, 0xb0, 0xf2,
+	0x34, 0xe2, 0x88, 0xe3, 0x02, 0x10, 0x13, 0x48, 0x6b, 0xa0, 0x9c, 0xb3, 0x75, 0x9d, 0x61, 0x1c,
+	0x20, 0xf4, 0x8f, 0x1c, 0xf8, 0x0a, 0x00, 0x12, 0x62, 0x9a, 0x32, 0xae, 0xc8, 0xb5, 0x52, 0xbd,
+	0xdc, 0xdc, 0x50, 0xa7, 0xb5, 0x5a, 0x2d, 0xa4, 0xdc, 0x13, 0x00, 0x19, 0xfc, 0x00, 0x10, 0xde,
+	0x06, 0xff, 0x87, 0x88, 0x72, 0x17, 0x79, 0xd6, 0x31, 0x72, 0xbd, 0x88, 0xe2, 0x4a, 0xa9, 0x26,
+	0xd5, 0xff, 0x35, 0xff, 0xcb, 0xd4, 0xdb, 0xa9, 0x16, 0xde, 0x02, 0xf3, 0x7d, 0xe4, 0xb9, 0x0e,
+	0xe2, 0xd8, 0x22, 0x81, 0x77, 0x52, 0xf9, 0x3b, 0x71, 0x9b, 0x13, 0xca, 0xbd, 0xc0, 0x3b, 0x51,
+	0xde, 0x4b, 0x60, 0x71, 0x7c, 0x66, 0xf8, 0x18, 0xcc, 0xd8, 0x14, 0x23, 0x9e, 0x36, 0xac, 0xdc,
+	0x5c, 0x9f, 0xc8, 0x21, 0x5f, 0x86, 0x22, 0x89, 0xdd, 0xbf, 0xcc, 0x0c, 0x01, 0x56, 0xc0, 0x0c,
+	0xc5, 0x3e, 0xe9, 0xe3, 0x8a, 0x1c, 0x37, 0x2d, 0xb6, 0xa4, 0xdf, 0x9d, 0x32, 0x98, 0xcd, 0xc9,
+	0x29, 0x9f, 0x25, 0xb0, 0x3a, 0x7e, 0x00, 0x2c, 0x24, 0x01, 0xc3, 0x70, 0x1b, 0xdc, 0x18, 0x21,
+	0x6f, 0x61, 0x4a, 0x09, 0x4d, 0x5a, 0x50, 0x6e, 0x42, 0x51, 0x22, 0x0d, 0x6d, 0xf5, 0x20, 0xd9,
+	0x0f, 0xf3, 0x7a, 0xb1, 0x2d, 0x0f, 0x63, 0x77, 0xf8, 0x1c, 0xfc, 0x43, 0x31, 0x8b, 0x3c, 0x2e,
+	0x06, 0xb4, 0x39, 0x7d, 0x40, 0x63, 0x0a, 0x33, 0x13, 0x0c, 0x53, 0x60, 0x29, 0x0f, 0xc0, 0xf2,
+	0x44, 0xaf, 0x78, 0x1e, 0x63, 0xf6, 0xb0, 0xb8, 0x82, 0xcd, 0xcb, 0x12, 0x58, 0x28, 0x04, 0x1f,
+	0xa4, 0xe9, 0xe1, 0x17, 0x09, 0x5c, 0x1b, 0xdd, 0x70, 0x78, 0x6f, 0x7a, 0xd5, 0x13, 0xae, 0xa2,
+	0xfa, 0xc7, 0xd3, 0x54, 0x76, 0x2f, 0x8c, 0x22, 0x81, 0x77, 0x5f, 0xbf, 0x7f, 0x90, 0x9b, 0x70,
+	0x3d, 0x7e, 0x0f, 0x4e, 0x0b, 0x96, 0xb6, 0x38, 0x07, 0xa6, 0x35, 0xf2, 0x07, 0x22, 0x1d, 0xa5,
+	0xd6, 0x38, 0x83, 0x3f, 0x25, 0xb0, 0x30, 0x6e, 0xcc, 0xb0, 0x7d, 0xa5, 0x29, 0x88, 0xfb, 0xac,
+	0xde, 0xbf, 0x6a, 0x78, 0xba, 0x5d, 0xca, 0x8b, 0x0b, 0x63, 0x71, 0xe8, 0xc0, 0xef, 0x0c, 0xae,
+	0x2e, 0xa1, 0xba, 0xa1, 0xb4, 0x62, 0xaa, 0x03, 0x6e, 0xa7, 0x43, 0xce, 0xed, 0xc6, 0xd9, 0x08,
+	0x53, 0xdd, 0x4f, 0x72, 0xe9, 0x52, 0xa3, 0xba, 0x72, 0x6e, 0x54, 0x06, 0xf5, 0x64, 0x52, 0xe8,
+	0x32, 0xd5, 0x26, 0x7e, 0xe7, 0xad, 0x0c, 0xd6, 0x6c, 0xe2, 0x4f, 0xad, 0xbd, 0xb3, 0x3c, 0x6e,
+	0x31, 0xf6, 0xe3, 0xe7, 0x6f, 0x5f, 0x7a, 0xb9, 0x9b, 0x85, 0xf7, 0x88, 0x87, 0x82, 0x9e, 0x4a,
+	0x68, 0x4f, 0xeb, 0xe1, 0x20, 0x79, 0x1c, 0xb5, 0x41, 0xc2, 0xc9, 0x7f, 0x8a, 0x4d, 0x21, 0x7c,
+	0x94, 0x4b, 0x3b, 0x86, 0xf1, 0x49, 0xae, 0xed, 0xa4, 0x80, 0x86, 0xc3, 0xd4, 0x54, 0x8c, 0xa5,
+	0xc3, 0x96, 0x9a, 0x25, 0x66, 0xe7, 0xc2, 0xa5, 0x6b, 0x38, 0xac, 0x9b, 0xbb, 0x74, 0x0f, 0x5b,
+	0x5d, 0xe1, 0xf2, 0x43, 0x5e, 0x4b, 0xf5, 0xba, 0x6e, 0x38, 0x4c, 0xd7, 0x73, 0x27, 0x5d, 0x3f,
+	0x6c, 0xe9, 0xba, 0x70, 0x3b, 0x9a, 0x49, 0xea, 0x6c, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x05,
+	0xe9, 0xce, 0x0d, 0xd0, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CustomerLabelServiceClient is the client API for CustomerLabelService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CustomerLabelServiceClient interface {
+	// Returns the requested customer-label relationship in full detail.
+	GetCustomerLabel(ctx context.Context, in *GetCustomerLabelRequest, opts ...grpc.CallOption) (*resources.CustomerLabel, error)
+	// Creates and removes customer-label relationships.
+	// Operation statuses are returned.
+	MutateCustomerLabels(ctx context.Context, in *MutateCustomerLabelsRequest, opts ...grpc.CallOption) (*MutateCustomerLabelsResponse, error)
+}
+
+type customerLabelServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCustomerLabelServiceClient(cc grpc.ClientConnInterface) CustomerLabelServiceClient {
+	return &customerLabelServiceClient{cc}
+}
+
+func (c *customerLabelServiceClient) GetCustomerLabel(ctx context.Context, in *GetCustomerLabelRequest, opts ...grpc.CallOption) (*resources.CustomerLabel, error) {
+	out := new(resources.CustomerLabel)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerLabelService/GetCustomerLabel", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerLabelServiceClient) MutateCustomerLabels(ctx context.Context, in *MutateCustomerLabelsRequest, opts ...grpc.CallOption) (*MutateCustomerLabelsResponse, error) {
+	out := new(MutateCustomerLabelsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerLabelService/MutateCustomerLabels", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CustomerLabelServiceServer is the server API for CustomerLabelService service.
+type CustomerLabelServiceServer interface {
+	// Returns the requested customer-label relationship in full detail.
+	GetCustomerLabel(context.Context, *GetCustomerLabelRequest) (*resources.CustomerLabel, error)
+	// Creates and removes customer-label relationships.
+	// Operation statuses are returned.
+	MutateCustomerLabels(context.Context, *MutateCustomerLabelsRequest) (*MutateCustomerLabelsResponse, error)
+}
+
+// UnimplementedCustomerLabelServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCustomerLabelServiceServer struct {
+}
+
+func (*UnimplementedCustomerLabelServiceServer) GetCustomerLabel(ctx context.Context, req *GetCustomerLabelRequest) (*resources.CustomerLabel, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCustomerLabel not implemented")
+}
+func (*UnimplementedCustomerLabelServiceServer) MutateCustomerLabels(ctx context.Context, req *MutateCustomerLabelsRequest) (*MutateCustomerLabelsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCustomerLabels not implemented")
+}
+
+func RegisterCustomerLabelServiceServer(s *grpc.Server, srv CustomerLabelServiceServer) {
+	s.RegisterService(&_CustomerLabelService_serviceDesc, srv)
+}
+
+func _CustomerLabelService_GetCustomerLabel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCustomerLabelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerLabelServiceServer).GetCustomerLabel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerLabelService/GetCustomerLabel",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerLabelServiceServer).GetCustomerLabel(ctx, req.(*GetCustomerLabelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerLabelService_MutateCustomerLabels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCustomerLabelsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerLabelServiceServer).MutateCustomerLabels(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerLabelService/MutateCustomerLabels",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerLabelServiceServer).MutateCustomerLabels(ctx, req.(*MutateCustomerLabelsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CustomerLabelService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CustomerLabelService",
+	HandlerType: (*CustomerLabelServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCustomerLabel",
+			Handler:    _CustomerLabelService_GetCustomerLabel_Handler,
+		},
+		{
+			MethodName: "MutateCustomerLabels",
+			Handler:    _CustomerLabelService_MutateCustomerLabels_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/customer_label_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/customer_manager_link_service.pb.go b/googleapis/ads/googleads/v3/services/customer_manager_link_service.pb.go
new file mode 100644
index 0000000..3c698e6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/customer_manager_link_service.pb.go
@@ -0,0 +1,620 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/customer_manager_link_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CustomerManagerLinkService.GetCustomerManagerLink][google.ads.googleads.v3.services.CustomerManagerLinkService.GetCustomerManagerLink].
+type GetCustomerManagerLinkRequest struct {
+	// Required. The resource name of the CustomerManagerLink to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCustomerManagerLinkRequest) Reset()         { *m = GetCustomerManagerLinkRequest{} }
+func (m *GetCustomerManagerLinkRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCustomerManagerLinkRequest) ProtoMessage()    {}
+func (*GetCustomerManagerLinkRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_68d211747141de49, []int{0}
+}
+
+func (m *GetCustomerManagerLinkRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCustomerManagerLinkRequest.Unmarshal(m, b)
+}
+func (m *GetCustomerManagerLinkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCustomerManagerLinkRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCustomerManagerLinkRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCustomerManagerLinkRequest.Merge(m, src)
+}
+func (m *GetCustomerManagerLinkRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCustomerManagerLinkRequest.Size(m)
+}
+func (m *GetCustomerManagerLinkRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCustomerManagerLinkRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCustomerManagerLinkRequest proto.InternalMessageInfo
+
+func (m *GetCustomerManagerLinkRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CustomerManagerLinkService.MutateCustomerManagerLink][google.ads.googleads.v3.services.CustomerManagerLinkService.MutateCustomerManagerLink].
+type MutateCustomerManagerLinkRequest struct {
+	// Required. The ID of the customer whose customer manager links are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual customer manager links.
+	Operations           []*CustomerManagerLinkOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *MutateCustomerManagerLinkRequest) Reset()         { *m = MutateCustomerManagerLinkRequest{} }
+func (m *MutateCustomerManagerLinkRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerManagerLinkRequest) ProtoMessage()    {}
+func (*MutateCustomerManagerLinkRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_68d211747141de49, []int{1}
+}
+
+func (m *MutateCustomerManagerLinkRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerManagerLinkRequest.Unmarshal(m, b)
+}
+func (m *MutateCustomerManagerLinkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerManagerLinkRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerManagerLinkRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerManagerLinkRequest.Merge(m, src)
+}
+func (m *MutateCustomerManagerLinkRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerManagerLinkRequest.Size(m)
+}
+func (m *MutateCustomerManagerLinkRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerManagerLinkRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerManagerLinkRequest proto.InternalMessageInfo
+
+func (m *MutateCustomerManagerLinkRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCustomerManagerLinkRequest) GetOperations() []*CustomerManagerLinkOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+// Request message for [CustomerManagerLinkService.MoveManagerLink][google.ads.googleads.v3.services.CustomerManagerLinkService.MoveManagerLink].
+type MoveManagerLinkRequest struct {
+	// Required. The ID of the client customer that is being moved.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The resource name of the previous CustomerManagerLink.
+	// The resource name has the form:
+	// `customers/{customer_id}/customerManagerLinks/{manager_customer_id}~{manager_link_id}`
+	PreviousCustomerManagerLink string `protobuf:"bytes,2,opt,name=previous_customer_manager_link,json=previousCustomerManagerLink,proto3" json:"previous_customer_manager_link,omitempty"`
+	// Required. The resource name of the new manager customer that the client wants to move
+	// to. Customer resource names have the format: "customers/{customer_id}"
+	NewManager           string   `protobuf:"bytes,3,opt,name=new_manager,json=newManager,proto3" json:"new_manager,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MoveManagerLinkRequest) Reset()         { *m = MoveManagerLinkRequest{} }
+func (m *MoveManagerLinkRequest) String() string { return proto.CompactTextString(m) }
+func (*MoveManagerLinkRequest) ProtoMessage()    {}
+func (*MoveManagerLinkRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_68d211747141de49, []int{2}
+}
+
+func (m *MoveManagerLinkRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MoveManagerLinkRequest.Unmarshal(m, b)
+}
+func (m *MoveManagerLinkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MoveManagerLinkRequest.Marshal(b, m, deterministic)
+}
+func (m *MoveManagerLinkRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MoveManagerLinkRequest.Merge(m, src)
+}
+func (m *MoveManagerLinkRequest) XXX_Size() int {
+	return xxx_messageInfo_MoveManagerLinkRequest.Size(m)
+}
+func (m *MoveManagerLinkRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MoveManagerLinkRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MoveManagerLinkRequest proto.InternalMessageInfo
+
+func (m *MoveManagerLinkRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MoveManagerLinkRequest) GetPreviousCustomerManagerLink() string {
+	if m != nil {
+		return m.PreviousCustomerManagerLink
+	}
+	return ""
+}
+
+func (m *MoveManagerLinkRequest) GetNewManager() string {
+	if m != nil {
+		return m.NewManager
+	}
+	return ""
+}
+
+// Updates the status of a CustomerManagerLink.
+// The following actions are possible:
+// 1. Update operation with status ACTIVE accepts a pending invitation.
+// 2. Update operation with status REFUSED declines a pending invitation.
+// 3. Update operation with status INACTIVE terminates link to manager.
+type CustomerManagerLinkOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CustomerManagerLinkOperation_Update
+	Operation            isCustomerManagerLinkOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
+	XXX_unrecognized     []byte                                   `json:"-"`
+	XXX_sizecache        int32                                    `json:"-"`
+}
+
+func (m *CustomerManagerLinkOperation) Reset()         { *m = CustomerManagerLinkOperation{} }
+func (m *CustomerManagerLinkOperation) String() string { return proto.CompactTextString(m) }
+func (*CustomerManagerLinkOperation) ProtoMessage()    {}
+func (*CustomerManagerLinkOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_68d211747141de49, []int{3}
+}
+
+func (m *CustomerManagerLinkOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerManagerLinkOperation.Unmarshal(m, b)
+}
+func (m *CustomerManagerLinkOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerManagerLinkOperation.Marshal(b, m, deterministic)
+}
+func (m *CustomerManagerLinkOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerManagerLinkOperation.Merge(m, src)
+}
+func (m *CustomerManagerLinkOperation) XXX_Size() int {
+	return xxx_messageInfo_CustomerManagerLinkOperation.Size(m)
+}
+func (m *CustomerManagerLinkOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerManagerLinkOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerManagerLinkOperation proto.InternalMessageInfo
+
+func (m *CustomerManagerLinkOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isCustomerManagerLinkOperation_Operation interface {
+	isCustomerManagerLinkOperation_Operation()
+}
+
+type CustomerManagerLinkOperation_Update struct {
+	Update *resources.CustomerManagerLink `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+func (*CustomerManagerLinkOperation_Update) isCustomerManagerLinkOperation_Operation() {}
+
+func (m *CustomerManagerLinkOperation) GetOperation() isCustomerManagerLinkOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CustomerManagerLinkOperation) GetUpdate() *resources.CustomerManagerLink {
+	if x, ok := m.GetOperation().(*CustomerManagerLinkOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CustomerManagerLinkOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CustomerManagerLinkOperation_Update)(nil),
+	}
+}
+
+// Response message for a CustomerManagerLink mutate.
+type MutateCustomerManagerLinkResponse struct {
+	// A result that identifies the resource affected by the mutate request.
+	Results              []*MutateCustomerManagerLinkResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *MutateCustomerManagerLinkResponse) Reset()         { *m = MutateCustomerManagerLinkResponse{} }
+func (m *MutateCustomerManagerLinkResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerManagerLinkResponse) ProtoMessage()    {}
+func (*MutateCustomerManagerLinkResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_68d211747141de49, []int{4}
+}
+
+func (m *MutateCustomerManagerLinkResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerManagerLinkResponse.Unmarshal(m, b)
+}
+func (m *MutateCustomerManagerLinkResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerManagerLinkResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerManagerLinkResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerManagerLinkResponse.Merge(m, src)
+}
+func (m *MutateCustomerManagerLinkResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerManagerLinkResponse.Size(m)
+}
+func (m *MutateCustomerManagerLinkResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerManagerLinkResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerManagerLinkResponse proto.InternalMessageInfo
+
+func (m *MutateCustomerManagerLinkResponse) GetResults() []*MutateCustomerManagerLinkResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// Response message for a CustomerManagerLink moveManagerLink.
+type MoveManagerLinkResponse struct {
+	// Returned for successful operations. Represents a CustomerManagerLink
+	// resource of the newly created link between client customer and new manager
+	// customer.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MoveManagerLinkResponse) Reset()         { *m = MoveManagerLinkResponse{} }
+func (m *MoveManagerLinkResponse) String() string { return proto.CompactTextString(m) }
+func (*MoveManagerLinkResponse) ProtoMessage()    {}
+func (*MoveManagerLinkResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_68d211747141de49, []int{5}
+}
+
+func (m *MoveManagerLinkResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MoveManagerLinkResponse.Unmarshal(m, b)
+}
+func (m *MoveManagerLinkResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MoveManagerLinkResponse.Marshal(b, m, deterministic)
+}
+func (m *MoveManagerLinkResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MoveManagerLinkResponse.Merge(m, src)
+}
+func (m *MoveManagerLinkResponse) XXX_Size() int {
+	return xxx_messageInfo_MoveManagerLinkResponse.Size(m)
+}
+func (m *MoveManagerLinkResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MoveManagerLinkResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MoveManagerLinkResponse proto.InternalMessageInfo
+
+func (m *MoveManagerLinkResponse) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// The result for the customer manager link mutate.
+type MutateCustomerManagerLinkResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerManagerLinkResult) Reset()         { *m = MutateCustomerManagerLinkResult{} }
+func (m *MutateCustomerManagerLinkResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerManagerLinkResult) ProtoMessage()    {}
+func (*MutateCustomerManagerLinkResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_68d211747141de49, []int{6}
+}
+
+func (m *MutateCustomerManagerLinkResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerManagerLinkResult.Unmarshal(m, b)
+}
+func (m *MutateCustomerManagerLinkResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerManagerLinkResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerManagerLinkResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerManagerLinkResult.Merge(m, src)
+}
+func (m *MutateCustomerManagerLinkResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerManagerLinkResult.Size(m)
+}
+func (m *MutateCustomerManagerLinkResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerManagerLinkResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerManagerLinkResult proto.InternalMessageInfo
+
+func (m *MutateCustomerManagerLinkResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCustomerManagerLinkRequest)(nil), "google.ads.googleads.v3.services.GetCustomerManagerLinkRequest")
+	proto.RegisterType((*MutateCustomerManagerLinkRequest)(nil), "google.ads.googleads.v3.services.MutateCustomerManagerLinkRequest")
+	proto.RegisterType((*MoveManagerLinkRequest)(nil), "google.ads.googleads.v3.services.MoveManagerLinkRequest")
+	proto.RegisterType((*CustomerManagerLinkOperation)(nil), "google.ads.googleads.v3.services.CustomerManagerLinkOperation")
+	proto.RegisterType((*MutateCustomerManagerLinkResponse)(nil), "google.ads.googleads.v3.services.MutateCustomerManagerLinkResponse")
+	proto.RegisterType((*MoveManagerLinkResponse)(nil), "google.ads.googleads.v3.services.MoveManagerLinkResponse")
+	proto.RegisterType((*MutateCustomerManagerLinkResult)(nil), "google.ads.googleads.v3.services.MutateCustomerManagerLinkResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/customer_manager_link_service.proto", fileDescriptor_68d211747141de49)
+}
+
+var fileDescriptor_68d211747141de49 = []byte{
+	// 762 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xc1, 0x6e, 0xd3, 0x4c,
+	0x10, 0xfe, 0xed, 0xfc, 0x2a, 0xea, 0x06, 0x84, 0xe4, 0x43, 0x1b, 0xdc, 0x42, 0x83, 0xe9, 0x21,
+	0x8a, 0x2a, 0x5b, 0x4a, 0xa4, 0xaa, 0x75, 0xd5, 0x22, 0xa7, 0xa8, 0x69, 0x25, 0x52, 0xaa, 0x20,
+	0xf5, 0x00, 0x41, 0xd1, 0x36, 0xde, 0x1a, 0xab, 0xf6, 0xae, 0xf1, 0xda, 0xe9, 0xa1, 0xaa, 0x84,
+	0x40, 0xea, 0x95, 0x03, 0x6f, 0xc0, 0x11, 0x09, 0x6e, 0x5c, 0x78, 0x84, 0x5e, 0xb9, 0xf5, 0x04,
+	0x12, 0x27, 0x9e, 0x02, 0xd9, 0xde, 0x75, 0xdc, 0xe2, 0x24, 0x55, 0x7a, 0x9b, 0x78, 0x66, 0xbe,
+	0x6f, 0xbe, 0x99, 0xd9, 0x51, 0xc0, 0x13, 0x8b, 0x10, 0xcb, 0x41, 0x1a, 0x34, 0xa9, 0x96, 0x98,
+	0x91, 0xd5, 0xaf, 0x6b, 0x14, 0xf9, 0x7d, 0xbb, 0x87, 0xa8, 0xd6, 0x0b, 0x69, 0x40, 0x5c, 0xe4,
+	0x77, 0x5d, 0x88, 0xa1, 0x85, 0xfc, 0xae, 0x63, 0xe3, 0xa3, 0x2e, 0x73, 0xab, 0x9e, 0x4f, 0x02,
+	0x22, 0x95, 0x93, 0x54, 0x15, 0x9a, 0x54, 0x4d, 0x51, 0xd4, 0x7e, 0x5d, 0xe5, 0x28, 0xf2, 0xfa,
+	0x30, 0x1e, 0x1f, 0x51, 0x12, 0xfa, 0x43, 0x89, 0x12, 0x02, 0x79, 0x9e, 0xa7, 0x7b, 0xb6, 0x06,
+	0x31, 0x26, 0x01, 0x0c, 0x6c, 0x82, 0x29, 0xf3, 0xce, 0x66, 0xbc, 0x3d, 0xc7, 0x46, 0x38, 0x60,
+	0x8e, 0x85, 0x8c, 0xe3, 0xd0, 0x46, 0x8e, 0xd9, 0x3d, 0x40, 0xaf, 0x61, 0xdf, 0x26, 0x3e, 0x0b,
+	0x60, 0x85, 0x6b, 0xf1, 0xaf, 0x83, 0xf0, 0x90, 0x45, 0xb9, 0x90, 0x32, 0x66, 0x65, 0x07, 0xdc,
+	0x6f, 0xa2, 0x60, 0x93, 0xd5, 0xd6, 0x4a, 0x4a, 0x7b, 0x6a, 0xe3, 0xa3, 0x36, 0x7a, 0x13, 0x22,
+	0x1a, 0x48, 0x15, 0x70, 0x87, 0x6b, 0xe8, 0x62, 0xe8, 0xa2, 0x92, 0x50, 0x16, 0x2a, 0xd3, 0x8d,
+	0xc2, 0x4f, 0x43, 0x6c, 0xdf, 0xe6, 0x9e, 0x5d, 0xe8, 0x22, 0xe5, 0x8b, 0x00, 0xca, 0xad, 0x30,
+	0x80, 0x01, 0x1a, 0x01, 0xb7, 0x08, 0x8a, 0x69, 0x23, 0x6c, 0x33, 0x0b, 0x06, 0xf8, 0xf7, 0x1d,
+	0x53, 0xea, 0x01, 0x40, 0x3c, 0xe4, 0x27, 0x5d, 0x28, 0x89, 0xe5, 0x42, 0xa5, 0x58, 0xdb, 0x50,
+	0xc7, 0x4d, 0x41, 0xcd, 0xe1, 0x7d, 0xc6, 0x61, 0x18, 0xc9, 0x00, 0x56, 0xf9, 0x2a, 0x80, 0x99,
+	0x16, 0xe9, 0xa3, 0x89, 0xab, 0xdc, 0x06, 0x0f, 0x3c, 0x1f, 0xf5, 0x6d, 0x12, 0xd2, 0x6e, 0xee,
+	0x74, 0x4b, 0xe2, 0x20, 0x71, 0x8e, 0x87, 0xe6, 0x14, 0x19, 0xf1, 0x61, 0x74, 0xcc, 0x73, 0x4b,
+	0x85, 0x0c, 0x1f, 0x46, 0xc7, 0x2c, 0x52, 0xf9, 0x2e, 0x80, 0xf9, 0x51, 0x12, 0xa5, 0x35, 0x50,
+	0x0c, 0x3d, 0x13, 0x06, 0x28, 0x9e, 0x70, 0xe9, 0xff, 0xb2, 0x50, 0x29, 0xd6, 0x64, 0xde, 0x37,
+	0xbe, 0x04, 0xea, 0x56, 0xb4, 0x04, 0x2d, 0x48, 0x8f, 0xda, 0x20, 0x09, 0x8f, 0x6c, 0x69, 0x0f,
+	0x4c, 0x25, 0xbf, 0xe2, 0xaa, 0x8b, 0xb5, 0xe5, 0xa1, 0xfd, 0x4e, 0x77, 0x3a, 0xaf, 0xe1, 0xdb,
+	0xff, 0xb5, 0x19, 0x4e, 0xa3, 0x08, 0xa6, 0xd3, 0x76, 0x2b, 0x6f, 0x05, 0xf0, 0x70, 0xc4, 0x76,
+	0x50, 0x8f, 0x60, 0x8a, 0xa4, 0x97, 0xe0, 0x96, 0x8f, 0x68, 0xe8, 0x04, 0xb4, 0x24, 0xc4, 0x53,
+	0x37, 0xc6, 0x4f, 0x7d, 0x14, 0x6a, 0xe8, 0x04, 0x6d, 0x8e, 0xa8, 0x6c, 0x80, 0xd9, 0x7f, 0xe6,
+	0xcd, 0x78, 0x1f, 0xe5, 0x6e, 0xf9, 0x95, 0x05, 0xdf, 0x02, 0x0b, 0x63, 0xb8, 0xae, 0x85, 0x53,
+	0xfb, 0x36, 0x05, 0xe4, 0x1c, 0x88, 0xe7, 0x89, 0x20, 0xe9, 0x97, 0x00, 0x66, 0xf2, 0xdf, 0xa4,
+	0xf4, 0x78, 0x7c, 0x37, 0x46, 0xbe, 0x66, 0x79, 0xc2, 0xa1, 0x2a, 0xbb, 0x17, 0xc6, 0x65, 0x61,
+	0xef, 0x7e, 0xfc, 0xfe, 0x28, 0xae, 0x48, 0xcb, 0xd1, 0x8d, 0x3b, 0xb9, 0xe4, 0x59, 0xe7, 0x4f,
+	0x81, 0x6a, 0xd5, 0xf4, 0xe8, 0x65, 0xb0, 0xa8, 0x56, 0x3d, 0x95, 0xde, 0x8b, 0xe0, 0xde, 0xd0,
+	0x5e, 0x4a, 0x8d, 0x1b, 0x0d, 0x3d, 0x51, 0xba, 0x79, 0xb3, 0xc5, 0x89, 0xd7, 0x42, 0x79, 0x75,
+	0x61, 0xcc, 0x64, 0x0e, 0xc1, 0xd2, 0xe0, 0x7a, 0xc4, 0xfa, 0x37, 0x94, 0xd5, 0x48, 0xff, 0x40,
+	0xf0, 0x49, 0x26, 0x78, 0xbd, 0x7a, 0x9a, 0x2b, 0x5f, 0x77, 0x63, 0x5a, 0x5d, 0xa8, 0x4a, 0x1f,
+	0x44, 0x70, 0xf7, 0xca, 0x46, 0x4a, 0x2b, 0xd7, 0xa8, 0x3b, 0xf7, 0x68, 0xc9, 0xab, 0x13, 0x64,
+	0x32, 0x9d, 0x67, 0xc2, 0x85, 0xb1, 0x9c, 0x15, 0x3a, 0xfa, 0xae, 0x2d, 0x65, 0x8e, 0x55, 0xdc,
+	0x88, 0xa6, 0xd2, 0x98, 0xa4, 0x11, 0x97, 0xab, 0xd1, 0x85, 0xaa, 0x3c, 0x77, 0x6e, 0x94, 0x06,
+	0xa5, 0x33, 0xcb, 0xb3, 0xa9, 0xda, 0x23, 0x6e, 0xe3, 0x4c, 0x04, 0x8b, 0x3d, 0xe2, 0x8e, 0x95,
+	0xd9, 0x58, 0x18, 0xfe, 0xba, 0xf6, 0xa2, 0x23, 0xb8, 0x27, 0xbc, 0xd8, 0x66, 0x20, 0x16, 0x71,
+	0x20, 0xb6, 0x54, 0xe2, 0x5b, 0x9a, 0x85, 0x70, 0x7c, 0x22, 0xb5, 0x01, 0xed, 0xf0, 0xff, 0x0d,
+	0x6b, 0xdc, 0xf8, 0x24, 0x16, 0x9a, 0x86, 0xf1, 0x59, 0x2c, 0x37, 0x13, 0x40, 0xc3, 0xa4, 0x6a,
+	0x62, 0x46, 0xd6, 0x7e, 0x5d, 0x65, 0xc4, 0xf4, 0x9c, 0x87, 0x74, 0x0c, 0x93, 0x76, 0xd2, 0x90,
+	0xce, 0x7e, 0xbd, 0xc3, 0x43, 0xfe, 0x88, 0x8b, 0xc9, 0x77, 0x5d, 0x37, 0x4c, 0xaa, 0xeb, 0x69,
+	0x90, 0xae, 0xef, 0xd7, 0x75, 0x9d, 0x87, 0x1d, 0x4c, 0xc5, 0x75, 0xd6, 0xff, 0x06, 0x00, 0x00,
+	0xff, 0xff, 0x63, 0xd6, 0xc1, 0xd0, 0xde, 0x08, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CustomerManagerLinkServiceClient is the client API for CustomerManagerLinkService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CustomerManagerLinkServiceClient interface {
+	// Returns the requested CustomerManagerLink in full detail.
+	GetCustomerManagerLink(ctx context.Context, in *GetCustomerManagerLinkRequest, opts ...grpc.CallOption) (*resources.CustomerManagerLink, error)
+	// Creates or updates customer manager links. Operation statuses are returned.
+	MutateCustomerManagerLink(ctx context.Context, in *MutateCustomerManagerLinkRequest, opts ...grpc.CallOption) (*MutateCustomerManagerLinkResponse, error)
+	// Moves a client customer to a new manager customer.
+	// This simplifies the complex request that requires two operations to move
+	// a client customer to a new manager. i.e:
+	// 1. Update operation with Status INACTIVE (previous manager) and,
+	// 2. Update operation with Status ACTIVE (new manager).
+	MoveManagerLink(ctx context.Context, in *MoveManagerLinkRequest, opts ...grpc.CallOption) (*MoveManagerLinkResponse, error)
+}
+
+type customerManagerLinkServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCustomerManagerLinkServiceClient(cc grpc.ClientConnInterface) CustomerManagerLinkServiceClient {
+	return &customerManagerLinkServiceClient{cc}
+}
+
+func (c *customerManagerLinkServiceClient) GetCustomerManagerLink(ctx context.Context, in *GetCustomerManagerLinkRequest, opts ...grpc.CallOption) (*resources.CustomerManagerLink, error) {
+	out := new(resources.CustomerManagerLink)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerManagerLinkService/GetCustomerManagerLink", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerManagerLinkServiceClient) MutateCustomerManagerLink(ctx context.Context, in *MutateCustomerManagerLinkRequest, opts ...grpc.CallOption) (*MutateCustomerManagerLinkResponse, error) {
+	out := new(MutateCustomerManagerLinkResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerManagerLinkService/MutateCustomerManagerLink", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerManagerLinkServiceClient) MoveManagerLink(ctx context.Context, in *MoveManagerLinkRequest, opts ...grpc.CallOption) (*MoveManagerLinkResponse, error) {
+	out := new(MoveManagerLinkResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerManagerLinkService/MoveManagerLink", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CustomerManagerLinkServiceServer is the server API for CustomerManagerLinkService service.
+type CustomerManagerLinkServiceServer interface {
+	// Returns the requested CustomerManagerLink in full detail.
+	GetCustomerManagerLink(context.Context, *GetCustomerManagerLinkRequest) (*resources.CustomerManagerLink, error)
+	// Creates or updates customer manager links. Operation statuses are returned.
+	MutateCustomerManagerLink(context.Context, *MutateCustomerManagerLinkRequest) (*MutateCustomerManagerLinkResponse, error)
+	// Moves a client customer to a new manager customer.
+	// This simplifies the complex request that requires two operations to move
+	// a client customer to a new manager. i.e:
+	// 1. Update operation with Status INACTIVE (previous manager) and,
+	// 2. Update operation with Status ACTIVE (new manager).
+	MoveManagerLink(context.Context, *MoveManagerLinkRequest) (*MoveManagerLinkResponse, error)
+}
+
+// UnimplementedCustomerManagerLinkServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCustomerManagerLinkServiceServer struct {
+}
+
+func (*UnimplementedCustomerManagerLinkServiceServer) GetCustomerManagerLink(ctx context.Context, req *GetCustomerManagerLinkRequest) (*resources.CustomerManagerLink, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetCustomerManagerLink not implemented")
+}
+func (*UnimplementedCustomerManagerLinkServiceServer) MutateCustomerManagerLink(ctx context.Context, req *MutateCustomerManagerLinkRequest) (*MutateCustomerManagerLinkResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateCustomerManagerLink not implemented")
+}
+func (*UnimplementedCustomerManagerLinkServiceServer) MoveManagerLink(ctx context.Context, req *MoveManagerLinkRequest) (*MoveManagerLinkResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MoveManagerLink not implemented")
+}
+
+func RegisterCustomerManagerLinkServiceServer(s *grpc.Server, srv CustomerManagerLinkServiceServer) {
+	s.RegisterService(&_CustomerManagerLinkService_serviceDesc, srv)
+}
+
+func _CustomerManagerLinkService_GetCustomerManagerLink_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCustomerManagerLinkRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerManagerLinkServiceServer).GetCustomerManagerLink(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerManagerLinkService/GetCustomerManagerLink",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerManagerLinkServiceServer).GetCustomerManagerLink(ctx, req.(*GetCustomerManagerLinkRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerManagerLinkService_MutateCustomerManagerLink_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCustomerManagerLinkRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerManagerLinkServiceServer).MutateCustomerManagerLink(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerManagerLinkService/MutateCustomerManagerLink",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerManagerLinkServiceServer).MutateCustomerManagerLink(ctx, req.(*MutateCustomerManagerLinkRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerManagerLinkService_MoveManagerLink_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MoveManagerLinkRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerManagerLinkServiceServer).MoveManagerLink(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerManagerLinkService/MoveManagerLink",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerManagerLinkServiceServer).MoveManagerLink(ctx, req.(*MoveManagerLinkRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CustomerManagerLinkService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CustomerManagerLinkService",
+	HandlerType: (*CustomerManagerLinkServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCustomerManagerLink",
+			Handler:    _CustomerManagerLinkService_GetCustomerManagerLink_Handler,
+		},
+		{
+			MethodName: "MutateCustomerManagerLink",
+			Handler:    _CustomerManagerLinkService_MutateCustomerManagerLink_Handler,
+		},
+		{
+			MethodName: "MoveManagerLink",
+			Handler:    _CustomerManagerLinkService_MoveManagerLink_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/customer_manager_link_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/customer_negative_criterion_service.pb.go b/googleapis/ads/googleads/v3/services/customer_negative_criterion_service.pb.go
new file mode 100644
index 0000000..3bdde0d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/customer_negative_criterion_service.pb.go
@@ -0,0 +1,504 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/customer_negative_criterion_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [CustomerNegativeCriterionService.GetCustomerNegativeCriterion][google.ads.googleads.v3.services.CustomerNegativeCriterionService.GetCustomerNegativeCriterion].
+type GetCustomerNegativeCriterionRequest struct {
+	// Required. The resource name of the criterion to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCustomerNegativeCriterionRequest) Reset()         { *m = GetCustomerNegativeCriterionRequest{} }
+func (m *GetCustomerNegativeCriterionRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCustomerNegativeCriterionRequest) ProtoMessage()    {}
+func (*GetCustomerNegativeCriterionRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_80c7f57f4d9bdab2, []int{0}
+}
+
+func (m *GetCustomerNegativeCriterionRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCustomerNegativeCriterionRequest.Unmarshal(m, b)
+}
+func (m *GetCustomerNegativeCriterionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCustomerNegativeCriterionRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCustomerNegativeCriterionRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCustomerNegativeCriterionRequest.Merge(m, src)
+}
+func (m *GetCustomerNegativeCriterionRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCustomerNegativeCriterionRequest.Size(m)
+}
+func (m *GetCustomerNegativeCriterionRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCustomerNegativeCriterionRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCustomerNegativeCriterionRequest proto.InternalMessageInfo
+
+func (m *GetCustomerNegativeCriterionRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for
+// [CustomerNegativeCriterionService.MutateCustomerNegativeCriteria][google.ads.googleads.v3.services.CustomerNegativeCriterionService.MutateCustomerNegativeCriteria].
+type MutateCustomerNegativeCriteriaRequest struct {
+	// Required. The ID of the customer whose criteria are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual criteria.
+	Operations []*CustomerNegativeCriterionOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerNegativeCriteriaRequest) Reset()         { *m = MutateCustomerNegativeCriteriaRequest{} }
+func (m *MutateCustomerNegativeCriteriaRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerNegativeCriteriaRequest) ProtoMessage()    {}
+func (*MutateCustomerNegativeCriteriaRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_80c7f57f4d9bdab2, []int{1}
+}
+
+func (m *MutateCustomerNegativeCriteriaRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerNegativeCriteriaRequest.Unmarshal(m, b)
+}
+func (m *MutateCustomerNegativeCriteriaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerNegativeCriteriaRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerNegativeCriteriaRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerNegativeCriteriaRequest.Merge(m, src)
+}
+func (m *MutateCustomerNegativeCriteriaRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerNegativeCriteriaRequest.Size(m)
+}
+func (m *MutateCustomerNegativeCriteriaRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerNegativeCriteriaRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerNegativeCriteriaRequest proto.InternalMessageInfo
+
+func (m *MutateCustomerNegativeCriteriaRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCustomerNegativeCriteriaRequest) GetOperations() []*CustomerNegativeCriterionOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateCustomerNegativeCriteriaRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateCustomerNegativeCriteriaRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create or remove) on a customer level negative criterion.
+type CustomerNegativeCriterionOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*CustomerNegativeCriterionOperation_Create
+	//	*CustomerNegativeCriterionOperation_Remove
+	Operation            isCustomerNegativeCriterionOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                       `json:"-"`
+	XXX_unrecognized     []byte                                         `json:"-"`
+	XXX_sizecache        int32                                          `json:"-"`
+}
+
+func (m *CustomerNegativeCriterionOperation) Reset()         { *m = CustomerNegativeCriterionOperation{} }
+func (m *CustomerNegativeCriterionOperation) String() string { return proto.CompactTextString(m) }
+func (*CustomerNegativeCriterionOperation) ProtoMessage()    {}
+func (*CustomerNegativeCriterionOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_80c7f57f4d9bdab2, []int{2}
+}
+
+func (m *CustomerNegativeCriterionOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerNegativeCriterionOperation.Unmarshal(m, b)
+}
+func (m *CustomerNegativeCriterionOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerNegativeCriterionOperation.Marshal(b, m, deterministic)
+}
+func (m *CustomerNegativeCriterionOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerNegativeCriterionOperation.Merge(m, src)
+}
+func (m *CustomerNegativeCriterionOperation) XXX_Size() int {
+	return xxx_messageInfo_CustomerNegativeCriterionOperation.Size(m)
+}
+func (m *CustomerNegativeCriterionOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerNegativeCriterionOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerNegativeCriterionOperation proto.InternalMessageInfo
+
+type isCustomerNegativeCriterionOperation_Operation interface {
+	isCustomerNegativeCriterionOperation_Operation()
+}
+
+type CustomerNegativeCriterionOperation_Create struct {
+	Create *resources.CustomerNegativeCriterion `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type CustomerNegativeCriterionOperation_Remove struct {
+	Remove string `protobuf:"bytes,2,opt,name=remove,proto3,oneof"`
+}
+
+func (*CustomerNegativeCriterionOperation_Create) isCustomerNegativeCriterionOperation_Operation() {}
+
+func (*CustomerNegativeCriterionOperation_Remove) isCustomerNegativeCriterionOperation_Operation() {}
+
+func (m *CustomerNegativeCriterionOperation) GetOperation() isCustomerNegativeCriterionOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *CustomerNegativeCriterionOperation) GetCreate() *resources.CustomerNegativeCriterion {
+	if x, ok := m.GetOperation().(*CustomerNegativeCriterionOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *CustomerNegativeCriterionOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*CustomerNegativeCriterionOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*CustomerNegativeCriterionOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*CustomerNegativeCriterionOperation_Create)(nil),
+		(*CustomerNegativeCriterionOperation_Remove)(nil),
+	}
+}
+
+// Response message for customer negative criterion mutate.
+type MutateCustomerNegativeCriteriaResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateCustomerNegativeCriteriaResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *MutateCustomerNegativeCriteriaResponse) Reset() {
+	*m = MutateCustomerNegativeCriteriaResponse{}
+}
+func (m *MutateCustomerNegativeCriteriaResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerNegativeCriteriaResponse) ProtoMessage()    {}
+func (*MutateCustomerNegativeCriteriaResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_80c7f57f4d9bdab2, []int{3}
+}
+
+func (m *MutateCustomerNegativeCriteriaResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerNegativeCriteriaResponse.Unmarshal(m, b)
+}
+func (m *MutateCustomerNegativeCriteriaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerNegativeCriteriaResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerNegativeCriteriaResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerNegativeCriteriaResponse.Merge(m, src)
+}
+func (m *MutateCustomerNegativeCriteriaResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerNegativeCriteriaResponse.Size(m)
+}
+func (m *MutateCustomerNegativeCriteriaResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerNegativeCriteriaResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerNegativeCriteriaResponse proto.InternalMessageInfo
+
+func (m *MutateCustomerNegativeCriteriaResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateCustomerNegativeCriteriaResponse) GetResults() []*MutateCustomerNegativeCriteriaResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the criterion mutate.
+type MutateCustomerNegativeCriteriaResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerNegativeCriteriaResult) Reset()         { *m = MutateCustomerNegativeCriteriaResult{} }
+func (m *MutateCustomerNegativeCriteriaResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerNegativeCriteriaResult) ProtoMessage()    {}
+func (*MutateCustomerNegativeCriteriaResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_80c7f57f4d9bdab2, []int{4}
+}
+
+func (m *MutateCustomerNegativeCriteriaResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerNegativeCriteriaResult.Unmarshal(m, b)
+}
+func (m *MutateCustomerNegativeCriteriaResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerNegativeCriteriaResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerNegativeCriteriaResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerNegativeCriteriaResult.Merge(m, src)
+}
+func (m *MutateCustomerNegativeCriteriaResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerNegativeCriteriaResult.Size(m)
+}
+func (m *MutateCustomerNegativeCriteriaResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerNegativeCriteriaResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerNegativeCriteriaResult proto.InternalMessageInfo
+
+func (m *MutateCustomerNegativeCriteriaResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetCustomerNegativeCriterionRequest)(nil), "google.ads.googleads.v3.services.GetCustomerNegativeCriterionRequest")
+	proto.RegisterType((*MutateCustomerNegativeCriteriaRequest)(nil), "google.ads.googleads.v3.services.MutateCustomerNegativeCriteriaRequest")
+	proto.RegisterType((*CustomerNegativeCriterionOperation)(nil), "google.ads.googleads.v3.services.CustomerNegativeCriterionOperation")
+	proto.RegisterType((*MutateCustomerNegativeCriteriaResponse)(nil), "google.ads.googleads.v3.services.MutateCustomerNegativeCriteriaResponse")
+	proto.RegisterType((*MutateCustomerNegativeCriteriaResult)(nil), "google.ads.googleads.v3.services.MutateCustomerNegativeCriteriaResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/customer_negative_criterion_service.proto", fileDescriptor_80c7f57f4d9bdab2)
+}
+
+var fileDescriptor_80c7f57f4d9bdab2 = []byte{
+	// 720 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xcf, 0x6e, 0xd3, 0x4e,
+	0x10, 0xfe, 0xd9, 0xa9, 0xfa, 0xa3, 0x9b, 0x16, 0xa4, 0x45, 0x40, 0x14, 0x2a, 0x88, 0xdc, 0x14,
+	0xa2, 0x08, 0xd9, 0x52, 0x72, 0x33, 0xed, 0xc1, 0x29, 0x6d, 0x0a, 0x88, 0xb6, 0x4a, 0xa5, 0x1c,
+	0x50, 0x24, 0xb3, 0xb5, 0xb7, 0x61, 0x25, 0xc7, 0x6b, 0x76, 0xd7, 0x91, 0xaa, 0xaa, 0x17, 0x0e,
+	0x9c, 0xb8, 0x21, 0xf1, 0x00, 0x70, 0xe3, 0x51, 0x7a, 0x2c, 0xb7, 0x9e, 0x38, 0x70, 0xe2, 0x05,
+	0xb8, 0x22, 0xff, 0x59, 0x27, 0xa9, 0x70, 0x5d, 0xa9, 0xdc, 0x26, 0x33, 0xe3, 0x6f, 0xe6, 0xfb,
+	0x66, 0x76, 0x02, 0x5e, 0x0c, 0x29, 0x1d, 0x7a, 0xd8, 0x40, 0x2e, 0x37, 0x12, 0x33, 0xb2, 0xc6,
+	0x6d, 0x83, 0x63, 0x36, 0x26, 0x0e, 0xe6, 0x86, 0x13, 0x72, 0x41, 0x47, 0x98, 0xd9, 0x3e, 0x1e,
+	0x22, 0x41, 0xc6, 0xd8, 0x76, 0x18, 0x11, 0x98, 0x11, 0xea, 0xdb, 0x69, 0x92, 0x1e, 0x30, 0x2a,
+	0x28, 0xac, 0x25, 0x00, 0x3a, 0x72, 0xb9, 0x9e, 0x61, 0xe9, 0xe3, 0xb6, 0x2e, 0xb1, 0xaa, 0x1b,
+	0x79, 0xd5, 0x18, 0xe6, 0x34, 0x64, 0x05, 0xe5, 0x92, 0x32, 0xd5, 0x65, 0x09, 0x12, 0x10, 0x03,
+	0xf9, 0x3e, 0x15, 0x48, 0x10, 0xea, 0xf3, 0x34, 0x7a, 0x6f, 0x2a, 0xea, 0x78, 0x04, 0xfb, 0x22,
+	0x0d, 0x3c, 0x9c, 0x0a, 0x1c, 0x12, 0xec, 0xb9, 0xf6, 0x01, 0x7e, 0x8b, 0xc6, 0x84, 0xb2, 0x0b,
+	0x5f, 0xb2, 0xc0, 0x31, 0xb8, 0x40, 0x22, 0x4c, 0x21, 0xb5, 0x5d, 0xb0, 0xd2, 0xc5, 0x62, 0x23,
+	0x6d, 0x6c, 0x27, 0xed, 0x6b, 0x43, 0xb6, 0xd5, 0xc3, 0xef, 0x42, 0xcc, 0x05, 0x6c, 0x80, 0x25,
+	0x49, 0xc3, 0xf6, 0xd1, 0x08, 0x57, 0x94, 0x9a, 0xd2, 0x58, 0xe8, 0x94, 0x7e, 0x58, 0x6a, 0x6f,
+	0x51, 0x46, 0x76, 0xd0, 0x08, 0x6b, 0x1f, 0x54, 0xb0, 0xfa, 0x2a, 0x14, 0x48, 0xe0, 0x1c, 0x50,
+	0x24, 0x31, 0xeb, 0xa0, 0x9c, 0x09, 0x42, 0xdc, 0x69, 0x44, 0x20, 0xfd, 0xcf, 0x5d, 0x48, 0x00,
+	0xa0, 0x01, 0x66, 0x89, 0x0e, 0x15, 0xb5, 0x56, 0x6a, 0x94, 0x5b, 0xcf, 0xf4, 0xa2, 0x69, 0xe8,
+	0xb9, 0x8c, 0x76, 0x25, 0x58, 0x5a, 0x6a, 0x02, 0x0e, 0x1f, 0x83, 0x5b, 0x01, 0x62, 0x82, 0x20,
+	0xcf, 0x3e, 0x44, 0xc4, 0x0b, 0x19, 0xae, 0x94, 0x6a, 0x4a, 0xe3, 0x46, 0xef, 0x66, 0xea, 0xde,
+	0x4a, 0xbc, 0x70, 0x05, 0x2c, 0x8d, 0x91, 0x47, 0x5c, 0x24, 0xb0, 0x4d, 0x7d, 0xef, 0xa8, 0x32,
+	0x17, 0xa7, 0x2d, 0x4a, 0xe7, 0xae, 0xef, 0x1d, 0x69, 0x5f, 0x15, 0xa0, 0x15, 0x77, 0x01, 0xfb,
+	0x60, 0xde, 0x61, 0x18, 0x89, 0x44, 0xd2, 0x72, 0x6b, 0x2d, 0x97, 0x5b, 0xb6, 0x47, 0xf9, 0xe4,
+	0xb6, 0xff, 0xeb, 0xa5, 0x68, 0xb0, 0x02, 0xe6, 0x19, 0x1e, 0xd1, 0x31, 0xae, 0xa8, 0x91, 0xb0,
+	0x51, 0x24, 0xf9, 0xdd, 0x29, 0x83, 0x85, 0x8c, 0xb4, 0x76, 0xa6, 0x80, 0x47, 0x45, 0xe3, 0xe2,
+	0x01, 0xf5, 0x39, 0x86, 0x5b, 0xe0, 0xce, 0x05, 0x79, 0x6c, 0xcc, 0x18, 0x65, 0xb1, 0x48, 0xe5,
+	0x16, 0x94, 0x8d, 0xb3, 0xc0, 0xd1, 0xf7, 0xe3, 0x1d, 0xeb, 0xdd, 0x9e, 0x15, 0x6e, 0x33, 0x4a,
+	0x87, 0x6f, 0xc0, 0xff, 0x0c, 0xf3, 0xd0, 0x13, 0x72, 0x9c, 0x5b, 0xc5, 0xe3, 0x2c, 0x6c, 0x31,
+	0xf4, 0x44, 0x4f, 0xc2, 0x6a, 0x2f, 0x41, 0xfd, 0x2a, 0x1f, 0x44, 0x73, 0xfc, 0xcb, 0x56, 0xcf,
+	0x2e, 0x74, 0xeb, 0x6c, 0x0e, 0xd4, 0x72, 0x05, 0xdf, 0x4f, 0x1a, 0x84, 0xbf, 0x15, 0xb0, 0x7c,
+	0xd9, 0x3b, 0x82, 0x9b, 0xc5, 0x1c, 0xaf, 0xf0, 0x0e, 0xab, 0xd7, 0xda, 0x0e, 0xad, 0x77, 0x6e,
+	0xcd, 0x12, 0x7e, 0xff, 0xfd, 0xe7, 0x27, 0x75, 0x0d, 0x9a, 0xd1, 0x99, 0x3a, 0x9e, 0x89, 0xac,
+	0xcb, 0x27, 0xc8, 0x8d, 0x66, 0x76, 0xb7, 0x2e, 0xca, 0x68, 0x34, 0x4f, 0xe0, 0x67, 0x15, 0x3c,
+	0xb8, 0x5c, 0x6c, 0xd8, 0xbd, 0xfe, 0x7c, 0x13, 0xf6, 0xdb, 0xff, 0x60, 0x51, 0xe2, 0x5d, 0xd6,
+	0xd0, 0xb9, 0x75, 0x77, 0xea, 0xf8, 0x3c, 0x99, 0x5c, 0x81, 0x58, 0x92, 0x8e, 0xb6, 0x1e, 0x49,
+	0x32, 0xd1, 0xe0, 0x78, 0x2a, 0x79, 0xbd, 0x79, 0x92, 0xab, 0x88, 0x39, 0x8a, 0xeb, 0x9b, 0x4a,
+	0xb3, 0x7a, 0xff, 0xd4, 0xaa, 0x4c, 0x7a, 0x4c, 0xad, 0x80, 0x70, 0xdd, 0xa1, 0xa3, 0xce, 0x47,
+	0x15, 0xd4, 0x1d, 0x3a, 0x2a, 0xe4, 0xd3, 0x59, 0x2d, 0x5a, 0xbd, 0xbd, 0xe8, 0x8c, 0xef, 0x29,
+	0xaf, 0xb7, 0x53, 0xa8, 0x21, 0xf5, 0x90, 0x3f, 0xd4, 0x29, 0x1b, 0x1a, 0x43, 0xec, 0xc7, 0x47,
+	0xde, 0x98, 0x14, 0xcf, 0xff, 0x2f, 0x7c, 0x2a, 0x8d, 0x2f, 0x6a, 0xa9, 0x6b, 0x59, 0xdf, 0xd4,
+	0x5a, 0x37, 0x01, 0xb4, 0x5c, 0xae, 0x27, 0x66, 0x64, 0xf5, 0xdb, 0x7a, 0x5a, 0x98, 0x9f, 0xca,
+	0x94, 0x81, 0xe5, 0xf2, 0x41, 0x96, 0x32, 0xe8, 0xb7, 0x07, 0x32, 0xe5, 0x97, 0x5a, 0x4f, 0xfc,
+	0xa6, 0x69, 0xb9, 0xdc, 0x34, 0xb3, 0x24, 0xd3, 0xec, 0xb7, 0x4d, 0x53, 0xa6, 0x1d, 0xcc, 0xc7,
+	0x7d, 0xb6, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x7e, 0x4d, 0x94, 0x2b, 0xb2, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CustomerNegativeCriterionServiceClient is the client API for CustomerNegativeCriterionService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CustomerNegativeCriterionServiceClient interface {
+	// Returns the requested criterion in full detail.
+	GetCustomerNegativeCriterion(ctx context.Context, in *GetCustomerNegativeCriterionRequest, opts ...grpc.CallOption) (*resources.CustomerNegativeCriterion, error)
+	// Creates or removes criteria. Operation statuses are returned.
+	MutateCustomerNegativeCriteria(ctx context.Context, in *MutateCustomerNegativeCriteriaRequest, opts ...grpc.CallOption) (*MutateCustomerNegativeCriteriaResponse, error)
+}
+
+type customerNegativeCriterionServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCustomerNegativeCriterionServiceClient(cc grpc.ClientConnInterface) CustomerNegativeCriterionServiceClient {
+	return &customerNegativeCriterionServiceClient{cc}
+}
+
+func (c *customerNegativeCriterionServiceClient) GetCustomerNegativeCriterion(ctx context.Context, in *GetCustomerNegativeCriterionRequest, opts ...grpc.CallOption) (*resources.CustomerNegativeCriterion, error) {
+	out := new(resources.CustomerNegativeCriterion)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerNegativeCriterionService/GetCustomerNegativeCriterion", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerNegativeCriterionServiceClient) MutateCustomerNegativeCriteria(ctx context.Context, in *MutateCustomerNegativeCriteriaRequest, opts ...grpc.CallOption) (*MutateCustomerNegativeCriteriaResponse, error) {
+	out := new(MutateCustomerNegativeCriteriaResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerNegativeCriterionService/MutateCustomerNegativeCriteria", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CustomerNegativeCriterionServiceServer is the server API for CustomerNegativeCriterionService service.
+type CustomerNegativeCriterionServiceServer interface {
+	// Returns the requested criterion in full detail.
+	GetCustomerNegativeCriterion(context.Context, *GetCustomerNegativeCriterionRequest) (*resources.CustomerNegativeCriterion, error)
+	// Creates or removes criteria. Operation statuses are returned.
+	MutateCustomerNegativeCriteria(context.Context, *MutateCustomerNegativeCriteriaRequest) (*MutateCustomerNegativeCriteriaResponse, error)
+}
+
+// UnimplementedCustomerNegativeCriterionServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCustomerNegativeCriterionServiceServer struct {
+}
+
+func (*UnimplementedCustomerNegativeCriterionServiceServer) GetCustomerNegativeCriterion(ctx context.Context, req *GetCustomerNegativeCriterionRequest) (*resources.CustomerNegativeCriterion, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetCustomerNegativeCriterion not implemented")
+}
+func (*UnimplementedCustomerNegativeCriterionServiceServer) MutateCustomerNegativeCriteria(ctx context.Context, req *MutateCustomerNegativeCriteriaRequest) (*MutateCustomerNegativeCriteriaResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateCustomerNegativeCriteria not implemented")
+}
+
+func RegisterCustomerNegativeCriterionServiceServer(s *grpc.Server, srv CustomerNegativeCriterionServiceServer) {
+	s.RegisterService(&_CustomerNegativeCriterionService_serviceDesc, srv)
+}
+
+func _CustomerNegativeCriterionService_GetCustomerNegativeCriterion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCustomerNegativeCriterionRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerNegativeCriterionServiceServer).GetCustomerNegativeCriterion(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerNegativeCriterionService/GetCustomerNegativeCriterion",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerNegativeCriterionServiceServer).GetCustomerNegativeCriterion(ctx, req.(*GetCustomerNegativeCriterionRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerNegativeCriterionService_MutateCustomerNegativeCriteria_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCustomerNegativeCriteriaRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerNegativeCriterionServiceServer).MutateCustomerNegativeCriteria(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerNegativeCriterionService/MutateCustomerNegativeCriteria",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerNegativeCriterionServiceServer).MutateCustomerNegativeCriteria(ctx, req.(*MutateCustomerNegativeCriteriaRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CustomerNegativeCriterionService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CustomerNegativeCriterionService",
+	HandlerType: (*CustomerNegativeCriterionServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCustomerNegativeCriterion",
+			Handler:    _CustomerNegativeCriterionService_GetCustomerNegativeCriterion_Handler,
+		},
+		{
+			MethodName: "MutateCustomerNegativeCriteria",
+			Handler:    _CustomerNegativeCriterionService_MutateCustomerNegativeCriteria_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/customer_negative_criterion_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/customer_service.pb.go b/googleapis/ads/googleads/v3/services/customer_service.pb.go
new file mode 100644
index 0000000..0956c06
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/customer_service.pb.go
@@ -0,0 +1,725 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/customer_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [CustomerService.GetCustomer][google.ads.googleads.v3.services.CustomerService.GetCustomer].
+type GetCustomerRequest struct {
+	// Required. The resource name of the customer to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetCustomerRequest) Reset()         { *m = GetCustomerRequest{} }
+func (m *GetCustomerRequest) String() string { return proto.CompactTextString(m) }
+func (*GetCustomerRequest) ProtoMessage()    {}
+func (*GetCustomerRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_62d137bd13ed426f, []int{0}
+}
+
+func (m *GetCustomerRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetCustomerRequest.Unmarshal(m, b)
+}
+func (m *GetCustomerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetCustomerRequest.Marshal(b, m, deterministic)
+}
+func (m *GetCustomerRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetCustomerRequest.Merge(m, src)
+}
+func (m *GetCustomerRequest) XXX_Size() int {
+	return xxx_messageInfo_GetCustomerRequest.Size(m)
+}
+func (m *GetCustomerRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetCustomerRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetCustomerRequest proto.InternalMessageInfo
+
+func (m *GetCustomerRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CustomerService.MutateCustomer][google.ads.googleads.v3.services.CustomerService.MutateCustomer].
+type MutateCustomerRequest struct {
+	// Required. The ID of the customer being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The operation to perform on the customer
+	Operation *CustomerOperation `protobuf:"bytes,4,opt,name=operation,proto3" json:"operation,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,5,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerRequest) Reset()         { *m = MutateCustomerRequest{} }
+func (m *MutateCustomerRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerRequest) ProtoMessage()    {}
+func (*MutateCustomerRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_62d137bd13ed426f, []int{1}
+}
+
+func (m *MutateCustomerRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerRequest.Unmarshal(m, b)
+}
+func (m *MutateCustomerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerRequest.Merge(m, src)
+}
+func (m *MutateCustomerRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerRequest.Size(m)
+}
+func (m *MutateCustomerRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerRequest proto.InternalMessageInfo
+
+func (m *MutateCustomerRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateCustomerRequest) GetOperation() *CustomerOperation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *MutateCustomerRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// Request message for [CustomerService.CreateCustomerClient][google.ads.googleads.v3.services.CustomerService.CreateCustomerClient].
+type CreateCustomerClientRequest struct {
+	// Required. The ID of the Manager under whom client customer is being created.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The new client customer to create. The resource name on this customer
+	// will be ignored.
+	CustomerClient *resources.Customer `protobuf:"bytes,2,opt,name=customer_client,json=customerClient,proto3" json:"customer_client,omitempty"`
+	// Email address of the user who should be invited on the created client
+	// customer. Accessible to whitelisted customers only.
+	EmailAddress *wrappers.StringValue `protobuf:"bytes,3,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"`
+	// The proposed role of user on the created client customer.
+	// Accessible to whitelisted customers only.
+	AccessRole           enums.AccessRoleEnum_AccessRole `protobuf:"varint,4,opt,name=access_role,json=accessRole,proto3,enum=google.ads.googleads.v3.enums.AccessRoleEnum_AccessRole" json:"access_role,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *CreateCustomerClientRequest) Reset()         { *m = CreateCustomerClientRequest{} }
+func (m *CreateCustomerClientRequest) String() string { return proto.CompactTextString(m) }
+func (*CreateCustomerClientRequest) ProtoMessage()    {}
+func (*CreateCustomerClientRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_62d137bd13ed426f, []int{2}
+}
+
+func (m *CreateCustomerClientRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateCustomerClientRequest.Unmarshal(m, b)
+}
+func (m *CreateCustomerClientRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateCustomerClientRequest.Marshal(b, m, deterministic)
+}
+func (m *CreateCustomerClientRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateCustomerClientRequest.Merge(m, src)
+}
+func (m *CreateCustomerClientRequest) XXX_Size() int {
+	return xxx_messageInfo_CreateCustomerClientRequest.Size(m)
+}
+func (m *CreateCustomerClientRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateCustomerClientRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateCustomerClientRequest proto.InternalMessageInfo
+
+func (m *CreateCustomerClientRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *CreateCustomerClientRequest) GetCustomerClient() *resources.Customer {
+	if m != nil {
+		return m.CustomerClient
+	}
+	return nil
+}
+
+func (m *CreateCustomerClientRequest) GetEmailAddress() *wrappers.StringValue {
+	if m != nil {
+		return m.EmailAddress
+	}
+	return nil
+}
+
+func (m *CreateCustomerClientRequest) GetAccessRole() enums.AccessRoleEnum_AccessRole {
+	if m != nil {
+		return m.AccessRole
+	}
+	return enums.AccessRoleEnum_UNSPECIFIED
+}
+
+// A single update on a customer.
+type CustomerOperation struct {
+	// Mutate operation. Only updates are supported for customer.
+	Update *resources.Customer `protobuf:"bytes,1,opt,name=update,proto3" json:"update,omitempty"`
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *CustomerOperation) Reset()         { *m = CustomerOperation{} }
+func (m *CustomerOperation) String() string { return proto.CompactTextString(m) }
+func (*CustomerOperation) ProtoMessage()    {}
+func (*CustomerOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_62d137bd13ed426f, []int{3}
+}
+
+func (m *CustomerOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CustomerOperation.Unmarshal(m, b)
+}
+func (m *CustomerOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CustomerOperation.Marshal(b, m, deterministic)
+}
+func (m *CustomerOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CustomerOperation.Merge(m, src)
+}
+func (m *CustomerOperation) XXX_Size() int {
+	return xxx_messageInfo_CustomerOperation.Size(m)
+}
+func (m *CustomerOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CustomerOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CustomerOperation proto.InternalMessageInfo
+
+func (m *CustomerOperation) GetUpdate() *resources.Customer {
+	if m != nil {
+		return m.Update
+	}
+	return nil
+}
+
+func (m *CustomerOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+// Response message for CreateCustomerClient mutate.
+type CreateCustomerClientResponse struct {
+	// The resource name of the newly created customer client.
+	ResourceName         string   `protobuf:"bytes,2,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CreateCustomerClientResponse) Reset()         { *m = CreateCustomerClientResponse{} }
+func (m *CreateCustomerClientResponse) String() string { return proto.CompactTextString(m) }
+func (*CreateCustomerClientResponse) ProtoMessage()    {}
+func (*CreateCustomerClientResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_62d137bd13ed426f, []int{4}
+}
+
+func (m *CreateCustomerClientResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateCustomerClientResponse.Unmarshal(m, b)
+}
+func (m *CreateCustomerClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateCustomerClientResponse.Marshal(b, m, deterministic)
+}
+func (m *CreateCustomerClientResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateCustomerClientResponse.Merge(m, src)
+}
+func (m *CreateCustomerClientResponse) XXX_Size() int {
+	return xxx_messageInfo_CreateCustomerClientResponse.Size(m)
+}
+func (m *CreateCustomerClientResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateCustomerClientResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateCustomerClientResponse proto.InternalMessageInfo
+
+func (m *CreateCustomerClientResponse) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Response message for customer mutate.
+type MutateCustomerResponse struct {
+	// Result for the mutate.
+	Result               *MutateCustomerResult `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *MutateCustomerResponse) Reset()         { *m = MutateCustomerResponse{} }
+func (m *MutateCustomerResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerResponse) ProtoMessage()    {}
+func (*MutateCustomerResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_62d137bd13ed426f, []int{5}
+}
+
+func (m *MutateCustomerResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerResponse.Unmarshal(m, b)
+}
+func (m *MutateCustomerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerResponse.Merge(m, src)
+}
+func (m *MutateCustomerResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerResponse.Size(m)
+}
+func (m *MutateCustomerResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerResponse proto.InternalMessageInfo
+
+func (m *MutateCustomerResponse) GetResult() *MutateCustomerResult {
+	if m != nil {
+		return m.Result
+	}
+	return nil
+}
+
+// The result for the customer mutate.
+type MutateCustomerResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateCustomerResult) Reset()         { *m = MutateCustomerResult{} }
+func (m *MutateCustomerResult) String() string { return proto.CompactTextString(m) }
+func (*MutateCustomerResult) ProtoMessage()    {}
+func (*MutateCustomerResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_62d137bd13ed426f, []int{6}
+}
+
+func (m *MutateCustomerResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateCustomerResult.Unmarshal(m, b)
+}
+func (m *MutateCustomerResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateCustomerResult.Marshal(b, m, deterministic)
+}
+func (m *MutateCustomerResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateCustomerResult.Merge(m, src)
+}
+func (m *MutateCustomerResult) XXX_Size() int {
+	return xxx_messageInfo_MutateCustomerResult.Size(m)
+}
+func (m *MutateCustomerResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateCustomerResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateCustomerResult proto.InternalMessageInfo
+
+func (m *MutateCustomerResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [CustomerService.ListAccessibleCustomers][google.ads.googleads.v3.services.CustomerService.ListAccessibleCustomers].
+type ListAccessibleCustomersRequest struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListAccessibleCustomersRequest) Reset()         { *m = ListAccessibleCustomersRequest{} }
+func (m *ListAccessibleCustomersRequest) String() string { return proto.CompactTextString(m) }
+func (*ListAccessibleCustomersRequest) ProtoMessage()    {}
+func (*ListAccessibleCustomersRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_62d137bd13ed426f, []int{7}
+}
+
+func (m *ListAccessibleCustomersRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListAccessibleCustomersRequest.Unmarshal(m, b)
+}
+func (m *ListAccessibleCustomersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListAccessibleCustomersRequest.Marshal(b, m, deterministic)
+}
+func (m *ListAccessibleCustomersRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListAccessibleCustomersRequest.Merge(m, src)
+}
+func (m *ListAccessibleCustomersRequest) XXX_Size() int {
+	return xxx_messageInfo_ListAccessibleCustomersRequest.Size(m)
+}
+func (m *ListAccessibleCustomersRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListAccessibleCustomersRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListAccessibleCustomersRequest proto.InternalMessageInfo
+
+// Response message for [CustomerService.ListAccessibleCustomers][google.ads.googleads.v3.services.CustomerService.ListAccessibleCustomers].
+type ListAccessibleCustomersResponse struct {
+	// Resource name of customers directly accessible by the
+	// user authenticating the call.
+	ResourceNames        []string `protobuf:"bytes,1,rep,name=resource_names,json=resourceNames,proto3" json:"resource_names,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListAccessibleCustomersResponse) Reset()         { *m = ListAccessibleCustomersResponse{} }
+func (m *ListAccessibleCustomersResponse) String() string { return proto.CompactTextString(m) }
+func (*ListAccessibleCustomersResponse) ProtoMessage()    {}
+func (*ListAccessibleCustomersResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_62d137bd13ed426f, []int{8}
+}
+
+func (m *ListAccessibleCustomersResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListAccessibleCustomersResponse.Unmarshal(m, b)
+}
+func (m *ListAccessibleCustomersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListAccessibleCustomersResponse.Marshal(b, m, deterministic)
+}
+func (m *ListAccessibleCustomersResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListAccessibleCustomersResponse.Merge(m, src)
+}
+func (m *ListAccessibleCustomersResponse) XXX_Size() int {
+	return xxx_messageInfo_ListAccessibleCustomersResponse.Size(m)
+}
+func (m *ListAccessibleCustomersResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListAccessibleCustomersResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListAccessibleCustomersResponse proto.InternalMessageInfo
+
+func (m *ListAccessibleCustomersResponse) GetResourceNames() []string {
+	if m != nil {
+		return m.ResourceNames
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*GetCustomerRequest)(nil), "google.ads.googleads.v3.services.GetCustomerRequest")
+	proto.RegisterType((*MutateCustomerRequest)(nil), "google.ads.googleads.v3.services.MutateCustomerRequest")
+	proto.RegisterType((*CreateCustomerClientRequest)(nil), "google.ads.googleads.v3.services.CreateCustomerClientRequest")
+	proto.RegisterType((*CustomerOperation)(nil), "google.ads.googleads.v3.services.CustomerOperation")
+	proto.RegisterType((*CreateCustomerClientResponse)(nil), "google.ads.googleads.v3.services.CreateCustomerClientResponse")
+	proto.RegisterType((*MutateCustomerResponse)(nil), "google.ads.googleads.v3.services.MutateCustomerResponse")
+	proto.RegisterType((*MutateCustomerResult)(nil), "google.ads.googleads.v3.services.MutateCustomerResult")
+	proto.RegisterType((*ListAccessibleCustomersRequest)(nil), "google.ads.googleads.v3.services.ListAccessibleCustomersRequest")
+	proto.RegisterType((*ListAccessibleCustomersResponse)(nil), "google.ads.googleads.v3.services.ListAccessibleCustomersResponse")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/customer_service.proto", fileDescriptor_62d137bd13ed426f)
+}
+
+var fileDescriptor_62d137bd13ed426f = []byte{
+	// 899 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x4f, 0x8f, 0xdb, 0x44,
+	0x14, 0xd7, 0x64, 0x61, 0x45, 0x26, 0x9b, 0x54, 0x8c, 0xb6, 0x34, 0xca, 0xae, 0xba, 0xc1, 0xa4,
+	0x22, 0x04, 0xb0, 0x51, 0x82, 0x48, 0xe5, 0xd5, 0x56, 0x78, 0x23, 0x48, 0x91, 0xe8, 0x1f, 0xb9,
+	0x52, 0xa4, 0x42, 0xa4, 0x68, 0x62, 0x4f, 0x53, 0xab, 0xb6, 0xc7, 0x78, 0xec, 0xa0, 0xaa, 0xea,
+	0x85, 0xaf, 0x80, 0xf8, 0x02, 0xdc, 0xe0, 0x23, 0x20, 0x3e, 0x41, 0x05, 0x27, 0x6e, 0x7b, 0xe2,
+	0xc0, 0x89, 0x03, 0x07, 0xae, 0x5c, 0x90, 0xc7, 0x33, 0x8e, 0xf3, 0xc7, 0x0d, 0x59, 0x6e, 0x2f,
+	0x33, 0xef, 0xf7, 0x9b, 0xdf, 0xef, 0xbd, 0xe7, 0xb7, 0x0b, 0xfb, 0x33, 0x4a, 0x67, 0x2e, 0xd1,
+	0xb0, 0xcd, 0xb4, 0x34, 0x4c, 0xa2, 0x79, 0x4f, 0x63, 0x24, 0x9c, 0x3b, 0x16, 0x61, 0x9a, 0x15,
+	0xb3, 0x88, 0x7a, 0x24, 0x9c, 0x88, 0x13, 0x35, 0x08, 0x69, 0x44, 0x51, 0x33, 0xcd, 0x56, 0xb1,
+	0xcd, 0xd4, 0x0c, 0xa8, 0xce, 0x7b, 0xaa, 0x04, 0x36, 0xb4, 0x22, 0x6a, 0xe2, 0xc7, 0x1e, 0xd3,
+	0xb0, 0x65, 0x11, 0xc6, 0x26, 0x21, 0x75, 0x05, 0x65, 0xe3, 0x83, 0x22, 0x40, 0x48, 0x18, 0x8d,
+	0xc3, 0xbc, 0x18, 0x81, 0x38, 0x96, 0x88, 0xc0, 0xd1, 0xb0, 0xef, 0xd3, 0x08, 0x47, 0x0e, 0xf5,
+	0x99, 0xb8, 0xbd, 0x96, 0xbb, 0xb5, 0x5c, 0x87, 0xf8, 0x91, 0xb8, 0x38, 0xc9, 0x5d, 0x3c, 0x72,
+	0x88, 0x6b, 0x4f, 0xa6, 0xe4, 0x31, 0x9e, 0x3b, 0x54, 0xf2, 0x0a, 0x73, 0x1a, 0xff, 0x35, 0x8d,
+	0x1f, 0x89, 0x2c, 0x0f, 0xb3, 0x27, 0x22, 0xe3, 0xfa, 0x6a, 0xc6, 0xd7, 0x21, 0x0e, 0x02, 0x12,
+	0x8a, 0xb7, 0x95, 0x5b, 0x10, 0x0d, 0x49, 0x34, 0x10, 0x72, 0x4d, 0xf2, 0x55, 0x4c, 0x58, 0x84,
+	0xda, 0xb0, 0x2a, 0xbd, 0x4c, 0x7c, 0xec, 0x91, 0x3a, 0x68, 0x82, 0x76, 0xf9, 0x7c, 0xef, 0x77,
+	0xa3, 0x64, 0x1e, 0xc8, 0x9b, 0xbb, 0xd8, 0x23, 0xca, 0x4f, 0x00, 0x5e, 0xbd, 0x13, 0x47, 0x38,
+	0x22, 0xab, 0x1c, 0x2d, 0x58, 0xc9, 0x5a, 0xe2, 0xd8, 0x79, 0x06, 0x28, 0xcf, 0x3f, 0xb3, 0xd1,
+	0x08, 0x96, 0x69, 0x40, 0x42, 0x5e, 0x8f, 0xfa, 0x2b, 0x4d, 0xd0, 0xae, 0x74, 0x7b, 0xea, 0xb6,
+	0x96, 0xa9, 0xf2, 0xad, 0x7b, 0x12, 0x9a, 0x12, 0x2f, 0xa8, 0xd0, 0x5b, 0xb0, 0x3a, 0xc7, 0xae,
+	0x63, 0xe3, 0x88, 0x4c, 0xa8, 0xef, 0x3e, 0xad, 0xbf, 0xda, 0x04, 0xed, 0xd7, 0xcc, 0x03, 0x79,
+	0x78, 0xcf, 0x77, 0x9f, 0x2a, 0x3f, 0x97, 0xe0, 0xd1, 0x20, 0x24, 0x39, 0xf1, 0x03, 0x5e, 0xfe,
+	0xdd, 0x2c, 0x3c, 0x84, 0x57, 0xb2, 0xac, 0xb4, 0x7d, 0xf5, 0x12, 0x37, 0xf2, 0x6e, 0xa1, 0x91,
+	0x6c, 0x50, 0x32, 0x27, 0x29, 0x6d, 0xcd, 0x5a, 0xd2, 0x81, 0x0c, 0x58, 0x25, 0x1e, 0x76, 0xdc,
+	0x09, 0xb6, 0xed, 0x90, 0x30, 0x56, 0xdf, 0xe3, 0xc4, 0xc7, 0x92, 0x58, 0x76, 0x55, 0x7d, 0x10,
+	0x85, 0x8e, 0x3f, 0x1b, 0x61, 0x37, 0x26, 0xe6, 0x01, 0x87, 0x18, 0x29, 0x02, 0x3d, 0x84, 0x95,
+	0xdc, 0x04, 0xf3, 0x12, 0xd7, 0xba, 0x37, 0x0b, 0x95, 0xf1, 0x99, 0x57, 0x0d, 0x8e, 0x30, 0xa9,
+	0x4b, 0x3e, 0xf1, 0x63, 0x2f, 0xf7, 0xd3, 0x84, 0x38, 0x8b, 0x95, 0xef, 0x00, 0x7c, 0x7d, 0xad,
+	0x13, 0x68, 0x00, 0xf7, 0xe3, 0x20, 0x29, 0x31, 0xaf, 0xd7, 0x6e, 0x55, 0x30, 0x05, 0x14, 0x9d,
+	0xc2, 0x4a, 0x1a, 0xf1, 0x59, 0x16, 0xf5, 0x6c, 0xac, 0xd9, 0xfe, 0x34, 0x19, 0xf7, 0x3b, 0x98,
+	0x3d, 0x31, 0x61, 0x9a, 0x9e, 0xc4, 0xca, 0x00, 0x1e, 0x6f, 0xee, 0x2a, 0x0b, 0xa8, 0xcf, 0x48,
+	0x32, 0x1b, 0xcb, 0xd3, 0x9d, 0xd0, 0x97, 0x57, 0x06, 0xfb, 0x31, 0x7c, 0x63, 0x75, 0xae, 0x05,
+	0xfc, 0x2e, 0xdc, 0x0f, 0x09, 0x8b, 0x5d, 0xd9, 0xe6, 0x8f, 0xb6, 0xcf, 0xeb, 0x1a, 0x53, 0xec,
+	0x46, 0xa6, 0x60, 0x51, 0x4e, 0xe1, 0xe1, 0xa6, 0xfb, 0x75, 0x99, 0x60, 0x83, 0xcc, 0x26, 0xbc,
+	0xfe, 0xb9, 0xc3, 0xa2, 0xb4, 0x43, 0xce, 0xd4, 0xcd, 0x48, 0x98, 0x18, 0x62, 0xe5, 0x36, 0x3c,
+	0x29, 0xcc, 0x10, 0x8e, 0x6e, 0xc0, 0xda, 0xd2, 0x4b, 0xac, 0x0e, 0x9a, 0x7b, 0xed, 0xb2, 0x59,
+	0xcd, 0x3f, 0xc5, 0xba, 0x7f, 0xed, 0xc3, 0x2b, 0x12, 0xfc, 0x20, 0xb5, 0x86, 0x7e, 0x00, 0xb0,
+	0x92, 0x5b, 0x20, 0xe8, 0xc3, 0xed, 0xc5, 0x58, 0xdf, 0x37, 0x8d, 0x5d, 0x66, 0x44, 0xe9, 0x5f,
+	0x18, 0xcb, 0x85, 0xf9, 0xe6, 0xb7, 0x3f, 0xbe, 0x2d, 0xbd, 0x89, 0x4e, 0x92, 0x15, 0xfc, 0x6c,
+	0xe9, 0xe6, 0x4c, 0x7e, 0x4f, 0x4c, 0xeb, 0x3c, 0x47, 0xbf, 0x00, 0x58, 0x5b, 0xae, 0x34, 0xea,
+	0xef, 0xde, 0xbb, 0x54, 0xf1, 0xcd, 0x4b, 0x34, 0x9d, 0x17, 0x5b, 0x19, 0x5e, 0x18, 0x57, 0x73,
+	0x5b, 0xe5, 0xbd, 0x6c, 0x67, 0x71, 0x1b, 0xef, 0x28, 0xad, 0xc4, 0xc6, 0x42, 0xf7, 0xb3, 0x5c,
+	0xee, 0x59, 0xe7, 0xb9, 0xee, 0x71, 0x56, 0x1d, 0x74, 0xd0, 0xaf, 0x00, 0x5e, 0x2b, 0xe8, 0x2c,
+	0xfa, 0x78, 0xbb, 0xbc, 0x97, 0x8f, 0x4d, 0xc3, 0xf8, 0x1f, 0x0c, 0xc2, 0xe9, 0xfb, 0xdc, 0xd1,
+	0xdb, 0xe8, 0xc6, 0x92, 0x23, 0xdd, 0x2d, 0xd0, 0xfc, 0x37, 0x80, 0x87, 0x9b, 0xbe, 0x5b, 0x74,
+	0xf6, 0x1f, 0xfe, 0x20, 0x14, 0x6f, 0xf1, 0xc6, 0xad, 0xcb, 0xc2, 0x85, 0x8d, 0x2f, 0x2f, 0x8c,
+	0xa3, 0x7c, 0xc3, 0x56, 0x96, 0x3d, 0x37, 0xd9, 0x57, 0xba, 0x2f, 0x6f, 0x9b, 0xb5, 0xe1, 0x05,
+	0x1d, 0x74, 0x1a, 0x47, 0x2f, 0x8c, 0xfa, 0x42, 0x93, 0x88, 0x02, 0x87, 0xa9, 0x16, 0xf5, 0xce,
+	0xff, 0x01, 0xb0, 0x65, 0x51, 0x6f, 0xab, 0xfe, 0xf3, 0xc3, 0x95, 0xcf, 0xf2, 0x7e, 0xb2, 0x20,
+	0xef, 0x83, 0x2f, 0x6e, 0x0b, 0xe4, 0x8c, 0xba, 0xd8, 0x9f, 0xa9, 0x34, 0x9c, 0x69, 0x33, 0xe2,
+	0xf3, 0xf5, 0xa9, 0x2d, 0xde, 0x2a, 0xfe, 0xa7, 0xea, 0x54, 0x06, 0xdf, 0x97, 0xf6, 0x86, 0x86,
+	0xf1, 0x63, 0xa9, 0x39, 0x4c, 0x09, 0x0d, 0x9b, 0xa9, 0x69, 0x98, 0x44, 0xa3, 0x9e, 0x2a, 0x1e,
+	0x66, 0x2f, 0x64, 0xca, 0xd8, 0xb0, 0xd9, 0x38, 0x4b, 0x19, 0x8f, 0x7a, 0x63, 0x99, 0xf2, 0x67,
+	0xa9, 0x95, 0x9e, 0xeb, 0xba, 0x61, 0x33, 0x5d, 0xcf, 0x92, 0x74, 0x7d, 0xd4, 0xd3, 0x75, 0x99,
+	0x36, 0xdd, 0xe7, 0x3a, 0x7b, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x89, 0xb6, 0x52, 0xfb,
+	0x09, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// CustomerServiceClient is the client API for CustomerService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CustomerServiceClient interface {
+	// Returns the requested customer in full detail.
+	GetCustomer(ctx context.Context, in *GetCustomerRequest, opts ...grpc.CallOption) (*resources.Customer, error)
+	// Updates a customer. Operation statuses are returned.
+	MutateCustomer(ctx context.Context, in *MutateCustomerRequest, opts ...grpc.CallOption) (*MutateCustomerResponse, error)
+	// Returns resource names of customers directly accessible by the
+	// user authenticating the call.
+	ListAccessibleCustomers(ctx context.Context, in *ListAccessibleCustomersRequest, opts ...grpc.CallOption) (*ListAccessibleCustomersResponse, error)
+	// Creates a new client under manager. The new client customer is returned.
+	CreateCustomerClient(ctx context.Context, in *CreateCustomerClientRequest, opts ...grpc.CallOption) (*CreateCustomerClientResponse, error)
+}
+
+type customerServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCustomerServiceClient(cc grpc.ClientConnInterface) CustomerServiceClient {
+	return &customerServiceClient{cc}
+}
+
+func (c *customerServiceClient) GetCustomer(ctx context.Context, in *GetCustomerRequest, opts ...grpc.CallOption) (*resources.Customer, error) {
+	out := new(resources.Customer)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerService/GetCustomer", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerServiceClient) MutateCustomer(ctx context.Context, in *MutateCustomerRequest, opts ...grpc.CallOption) (*MutateCustomerResponse, error) {
+	out := new(MutateCustomerResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerService/MutateCustomer", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerServiceClient) ListAccessibleCustomers(ctx context.Context, in *ListAccessibleCustomersRequest, opts ...grpc.CallOption) (*ListAccessibleCustomersResponse, error) {
+	out := new(ListAccessibleCustomersResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerService/ListAccessibleCustomers", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *customerServiceClient) CreateCustomerClient(ctx context.Context, in *CreateCustomerClientRequest, opts ...grpc.CallOption) (*CreateCustomerClientResponse, error) {
+	out := new(CreateCustomerClientResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerService/CreateCustomerClient", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CustomerServiceServer is the server API for CustomerService service.
+type CustomerServiceServer interface {
+	// Returns the requested customer in full detail.
+	GetCustomer(context.Context, *GetCustomerRequest) (*resources.Customer, error)
+	// Updates a customer. Operation statuses are returned.
+	MutateCustomer(context.Context, *MutateCustomerRequest) (*MutateCustomerResponse, error)
+	// Returns resource names of customers directly accessible by the
+	// user authenticating the call.
+	ListAccessibleCustomers(context.Context, *ListAccessibleCustomersRequest) (*ListAccessibleCustomersResponse, error)
+	// Creates a new client under manager. The new client customer is returned.
+	CreateCustomerClient(context.Context, *CreateCustomerClientRequest) (*CreateCustomerClientResponse, error)
+}
+
+// UnimplementedCustomerServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedCustomerServiceServer struct {
+}
+
+func (*UnimplementedCustomerServiceServer) GetCustomer(ctx context.Context, req *GetCustomerRequest) (*resources.Customer, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetCustomer not implemented")
+}
+func (*UnimplementedCustomerServiceServer) MutateCustomer(ctx context.Context, req *MutateCustomerRequest) (*MutateCustomerResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateCustomer not implemented")
+}
+func (*UnimplementedCustomerServiceServer) ListAccessibleCustomers(ctx context.Context, req *ListAccessibleCustomersRequest) (*ListAccessibleCustomersResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListAccessibleCustomers not implemented")
+}
+func (*UnimplementedCustomerServiceServer) CreateCustomerClient(ctx context.Context, req *CreateCustomerClientRequest) (*CreateCustomerClientResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreateCustomerClient not implemented")
+}
+
+func RegisterCustomerServiceServer(s *grpc.Server, srv CustomerServiceServer) {
+	s.RegisterService(&_CustomerService_serviceDesc, srv)
+}
+
+func _CustomerService_GetCustomer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetCustomerRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerServiceServer).GetCustomer(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerService/GetCustomer",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerServiceServer).GetCustomer(ctx, req.(*GetCustomerRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerService_MutateCustomer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateCustomerRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerServiceServer).MutateCustomer(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerService/MutateCustomer",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerServiceServer).MutateCustomer(ctx, req.(*MutateCustomerRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerService_ListAccessibleCustomers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListAccessibleCustomersRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerServiceServer).ListAccessibleCustomers(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerService/ListAccessibleCustomers",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerServiceServer).ListAccessibleCustomers(ctx, req.(*ListAccessibleCustomersRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CustomerService_CreateCustomerClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateCustomerClientRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CustomerServiceServer).CreateCustomerClient(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.CustomerService/CreateCustomerClient",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CustomerServiceServer).CreateCustomerClient(ctx, req.(*CreateCustomerClientRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _CustomerService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.CustomerService",
+	HandlerType: (*CustomerServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetCustomer",
+			Handler:    _CustomerService_GetCustomer_Handler,
+		},
+		{
+			MethodName: "MutateCustomer",
+			Handler:    _CustomerService_MutateCustomer_Handler,
+		},
+		{
+			MethodName: "ListAccessibleCustomers",
+			Handler:    _CustomerService_ListAccessibleCustomers_Handler,
+		},
+		{
+			MethodName: "CreateCustomerClient",
+			Handler:    _CustomerService_CreateCustomerClient_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/customer_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/detail_placement_view_service.pb.go b/googleapis/ads/googleads/v3/services/detail_placement_view_service.pb.go
new file mode 100644
index 0000000..2aec8ed
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/detail_placement_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/detail_placement_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [DetailPlacementViewService.GetDetailPlacementView][google.ads.googleads.v3.services.DetailPlacementViewService.GetDetailPlacementView].
+type GetDetailPlacementViewRequest struct {
+	// Required. The resource name of the Detail Placement view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetDetailPlacementViewRequest) Reset()         { *m = GetDetailPlacementViewRequest{} }
+func (m *GetDetailPlacementViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetDetailPlacementViewRequest) ProtoMessage()    {}
+func (*GetDetailPlacementViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0191e49c6a7b6d2e, []int{0}
+}
+
+func (m *GetDetailPlacementViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetDetailPlacementViewRequest.Unmarshal(m, b)
+}
+func (m *GetDetailPlacementViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetDetailPlacementViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetDetailPlacementViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetDetailPlacementViewRequest.Merge(m, src)
+}
+func (m *GetDetailPlacementViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetDetailPlacementViewRequest.Size(m)
+}
+func (m *GetDetailPlacementViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetDetailPlacementViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetDetailPlacementViewRequest proto.InternalMessageInfo
+
+func (m *GetDetailPlacementViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetDetailPlacementViewRequest)(nil), "google.ads.googleads.v3.services.GetDetailPlacementViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/detail_placement_view_service.proto", fileDescriptor_0191e49c6a7b6d2e)
+}
+
+var fileDescriptor_0191e49c6a7b6d2e = []byte{
+	// 422 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x31, 0x8b, 0xd4, 0x40,
+	0x18, 0x25, 0x39, 0x10, 0x0c, 0xda, 0xa4, 0xd0, 0x23, 0x2a, 0xb7, 0x1c, 0x57, 0x1c, 0x57, 0xcc,
+	0x80, 0x81, 0x43, 0x46, 0x0e, 0x99, 0xe5, 0x60, 0xb5, 0x59, 0x96, 0x15, 0x52, 0x48, 0x20, 0xcc,
+	0x26, 0x9f, 0x71, 0x20, 0x99, 0x89, 0x99, 0xd9, 0x6c, 0x21, 0x36, 0x16, 0xfe, 0x01, 0x6b, 0x1b,
+	0x4b, 0x7f, 0xca, 0xb6, 0x76, 0x56, 0x0a, 0x56, 0xfe, 0x0a, 0xc9, 0x4e, 0x26, 0xbb, 0x0b, 0x1b,
+	0xb7, 0x7b, 0xe4, 0xbd, 0xef, 0xbd, 0x6f, 0xbe, 0x17, 0xef, 0x36, 0x97, 0x32, 0x2f, 0x00, 0xb3,
+	0x4c, 0x61, 0x03, 0x5b, 0xd4, 0x84, 0x58, 0x41, 0xdd, 0xf0, 0x14, 0x14, 0xce, 0x40, 0x33, 0x5e,
+	0x24, 0x55, 0xc1, 0x52, 0x28, 0x41, 0xe8, 0xa4, 0xe1, 0xb0, 0x4a, 0x3a, 0x1a, 0x55, 0xb5, 0xd4,
+	0xd2, 0x1f, 0x99, 0x51, 0xc4, 0x32, 0x85, 0x7a, 0x17, 0xd4, 0x84, 0xc8, 0xba, 0x04, 0x37, 0x43,
+	0x39, 0x35, 0x28, 0xb9, 0xac, 0x07, 0x83, 0x4c, 0x40, 0xf0, 0xd8, 0x8e, 0x57, 0x1c, 0x33, 0x21,
+	0xa4, 0x66, 0x9a, 0x4b, 0xa1, 0x3a, 0xf6, 0xe1, 0x0e, 0x9b, 0x16, 0x1c, 0x84, 0xee, 0x88, 0xb3,
+	0x1d, 0xe2, 0x2d, 0x87, 0x22, 0x4b, 0x16, 0xf0, 0x8e, 0x35, 0x5c, 0xd6, 0x46, 0x70, 0xfe, 0xca,
+	0x7b, 0x32, 0x01, 0x7d, 0xbb, 0x49, 0x9e, 0xd9, 0xe0, 0x88, 0xc3, 0x6a, 0x0e, 0xef, 0x97, 0xa0,
+	0xb4, 0x7f, 0xe9, 0xdd, 0xb7, 0x1b, 0x26, 0x82, 0x95, 0x70, 0xea, 0x8c, 0x9c, 0xcb, 0xbb, 0xe3,
+	0x93, 0x5f, 0xd4, 0x9d, 0xdf, 0xb3, 0xcc, 0x94, 0x95, 0xf0, 0xf4, 0xab, 0xeb, 0x05, 0x07, 0x8c,
+	0x5e, 0x9b, 0x0b, 0xf8, 0xbf, 0x1d, 0xef, 0xc1, 0xe1, 0x28, 0xff, 0x05, 0x3a, 0x76, 0x3e, 0xf4,
+	0xdf, 0x25, 0x83, 0xeb, 0x41, 0x83, 0xfe, 0xba, 0xe8, 0xc0, 0xf8, 0xf9, 0xf4, 0x27, 0xdd, 0x7f,
+	0xdd, 0xa7, 0x1f, 0x7f, 0xbe, 0xb8, 0xcf, 0xfc, 0xeb, 0xb6, 0x98, 0x0f, 0x7b, 0xcc, 0x4d, 0xba,
+	0x54, 0x5a, 0x96, 0x50, 0x2b, 0x7c, 0xd5, 0x35, 0xb5, 0xe7, 0xa5, 0xf0, 0xd5, 0xc7, 0xe0, 0xd1,
+	0x9a, 0x9e, 0x6e, 0xe3, 0x3b, 0x54, 0x71, 0x85, 0x52, 0x59, 0x8e, 0x3f, 0xbb, 0xde, 0x45, 0x2a,
+	0xcb, 0xa3, 0x6f, 0x1d, 0x9f, 0x0d, 0x5f, 0x71, 0xd6, 0x96, 0x36, 0x73, 0xde, 0xbc, 0xec, 0x4c,
+	0x72, 0x59, 0x30, 0x91, 0x23, 0x59, 0xe7, 0x38, 0x07, 0xb1, 0xa9, 0x14, 0x6f, 0x63, 0x87, 0x7f,
+	0xea, 0xe7, 0x16, 0x7c, 0x73, 0x4f, 0x26, 0x94, 0x7e, 0x77, 0x47, 0x13, 0x63, 0x48, 0x33, 0x85,
+	0x0c, 0x6c, 0x51, 0x14, 0xa2, 0x2e, 0x58, 0xad, 0xad, 0x24, 0xa6, 0x99, 0x8a, 0x7b, 0x49, 0x1c,
+	0x85, 0xb1, 0x95, 0xfc, 0x75, 0x2f, 0xcc, 0x77, 0x42, 0x68, 0xa6, 0x08, 0xe9, 0x45, 0x84, 0x44,
+	0x21, 0x21, 0x56, 0xb6, 0xb8, 0xb3, 0xd9, 0x33, 0xfc, 0x17, 0x00, 0x00, 0xff, 0xff, 0x67, 0xa6,
+	0xa3, 0x82, 0x7b, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// DetailPlacementViewServiceClient is the client API for DetailPlacementViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type DetailPlacementViewServiceClient interface {
+	// Returns the requested Detail Placement view in full detail.
+	GetDetailPlacementView(ctx context.Context, in *GetDetailPlacementViewRequest, opts ...grpc.CallOption) (*resources.DetailPlacementView, error)
+}
+
+type detailPlacementViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewDetailPlacementViewServiceClient(cc grpc.ClientConnInterface) DetailPlacementViewServiceClient {
+	return &detailPlacementViewServiceClient{cc}
+}
+
+func (c *detailPlacementViewServiceClient) GetDetailPlacementView(ctx context.Context, in *GetDetailPlacementViewRequest, opts ...grpc.CallOption) (*resources.DetailPlacementView, error) {
+	out := new(resources.DetailPlacementView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.DetailPlacementViewService/GetDetailPlacementView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// DetailPlacementViewServiceServer is the server API for DetailPlacementViewService service.
+type DetailPlacementViewServiceServer interface {
+	// Returns the requested Detail Placement view in full detail.
+	GetDetailPlacementView(context.Context, *GetDetailPlacementViewRequest) (*resources.DetailPlacementView, error)
+}
+
+// UnimplementedDetailPlacementViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedDetailPlacementViewServiceServer struct {
+}
+
+func (*UnimplementedDetailPlacementViewServiceServer) GetDetailPlacementView(ctx context.Context, req *GetDetailPlacementViewRequest) (*resources.DetailPlacementView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetDetailPlacementView not implemented")
+}
+
+func RegisterDetailPlacementViewServiceServer(s *grpc.Server, srv DetailPlacementViewServiceServer) {
+	s.RegisterService(&_DetailPlacementViewService_serviceDesc, srv)
+}
+
+func _DetailPlacementViewService_GetDetailPlacementView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetDetailPlacementViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DetailPlacementViewServiceServer).GetDetailPlacementView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.DetailPlacementViewService/GetDetailPlacementView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DetailPlacementViewServiceServer).GetDetailPlacementView(ctx, req.(*GetDetailPlacementViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _DetailPlacementViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.DetailPlacementViewService",
+	HandlerType: (*DetailPlacementViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetDetailPlacementView",
+			Handler:    _DetailPlacementViewService_GetDetailPlacementView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/detail_placement_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/display_keyword_view_service.pb.go b/googleapis/ads/googleads/v3/services/display_keyword_view_service.pb.go
new file mode 100644
index 0000000..e82f743
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/display_keyword_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/display_keyword_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [DisplayKeywordViewService.GetDisplayKeywordView][google.ads.googleads.v3.services.DisplayKeywordViewService.GetDisplayKeywordView].
+type GetDisplayKeywordViewRequest struct {
+	// Required. The resource name of the display keyword view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetDisplayKeywordViewRequest) Reset()         { *m = GetDisplayKeywordViewRequest{} }
+func (m *GetDisplayKeywordViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetDisplayKeywordViewRequest) ProtoMessage()    {}
+func (*GetDisplayKeywordViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_157dba0f7495fb59, []int{0}
+}
+
+func (m *GetDisplayKeywordViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetDisplayKeywordViewRequest.Unmarshal(m, b)
+}
+func (m *GetDisplayKeywordViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetDisplayKeywordViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetDisplayKeywordViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetDisplayKeywordViewRequest.Merge(m, src)
+}
+func (m *GetDisplayKeywordViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetDisplayKeywordViewRequest.Size(m)
+}
+func (m *GetDisplayKeywordViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetDisplayKeywordViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetDisplayKeywordViewRequest proto.InternalMessageInfo
+
+func (m *GetDisplayKeywordViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetDisplayKeywordViewRequest)(nil), "google.ads.googleads.v3.services.GetDisplayKeywordViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/display_keyword_view_service.proto", fileDescriptor_157dba0f7495fb59)
+}
+
+var fileDescriptor_157dba0f7495fb59 = []byte{
+	// 425 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x4d, 0x6b, 0xd5, 0x40,
+	0x14, 0xe5, 0xa5, 0x20, 0x18, 0x74, 0x13, 0x10, 0x6b, 0x2c, 0xfa, 0x28, 0x5d, 0x94, 0x2e, 0x66,
+	0xc0, 0x50, 0x84, 0xf1, 0x03, 0xe6, 0x29, 0xbc, 0x82, 0x28, 0xa5, 0x42, 0x16, 0x12, 0x08, 0xd3,
+	0xcc, 0x35, 0x0e, 0x26, 0x99, 0x38, 0x37, 0x2f, 0x8f, 0x22, 0x6e, 0x04, 0x7f, 0x81, 0x1b, 0xd7,
+	0x2e, 0xfd, 0x29, 0xdd, 0xba, 0x13, 0x04, 0x17, 0xae, 0xfc, 0x15, 0x92, 0x4e, 0x26, 0x7d, 0xa5,
+	0xc6, 0xb7, 0x3b, 0xcc, 0x39, 0xf7, 0x9c, 0xfb, 0x31, 0xfe, 0x93, 0x5c, 0xeb, 0xbc, 0x00, 0x2a,
+	0x24, 0x52, 0x0b, 0x3b, 0xd4, 0x46, 0x14, 0xc1, 0xb4, 0x2a, 0x03, 0xa4, 0x52, 0x61, 0x5d, 0x88,
+	0x93, 0xf4, 0x2d, 0x9c, 0x2c, 0xb5, 0x91, 0x69, 0xab, 0x60, 0x99, 0xf6, 0x2c, 0xa9, 0x8d, 0x6e,
+	0x74, 0x30, 0xb5, 0x95, 0x44, 0x48, 0x24, 0x83, 0x09, 0x69, 0x23, 0xe2, 0x4c, 0xc2, 0x87, 0x63,
+	0x31, 0x06, 0x50, 0x2f, 0xcc, 0x58, 0x8e, 0xf5, 0x0f, 0xb7, 0x5c, 0x75, 0xad, 0xa8, 0xa8, 0x2a,
+	0xdd, 0x88, 0x46, 0xe9, 0x0a, 0x7b, 0xf6, 0xe6, 0x0a, 0x9b, 0x15, 0x0a, 0xaa, 0xa6, 0x27, 0xee,
+	0xae, 0x10, 0xaf, 0x15, 0x14, 0x32, 0x3d, 0x86, 0x37, 0xa2, 0x55, 0xda, 0x58, 0xc1, 0xf6, 0x81,
+	0xbf, 0x35, 0x87, 0xe6, 0xa9, 0x0d, 0x7e, 0x66, 0x73, 0x63, 0x05, 0xcb, 0x23, 0x78, 0xb7, 0x00,
+	0x6c, 0x82, 0x5d, 0xff, 0xba, 0xeb, 0x2f, 0xad, 0x44, 0x09, 0x9b, 0x93, 0xe9, 0x64, 0xf7, 0xea,
+	0x6c, 0xe3, 0x17, 0xf7, 0x8e, 0xae, 0x39, 0xe6, 0x85, 0x28, 0xe1, 0xde, 0x17, 0xcf, 0xbf, 0x75,
+	0xd9, 0xe7, 0xa5, 0x1d, 0x3f, 0xf8, 0x39, 0xf1, 0x6f, 0xfc, 0x33, 0x28, 0x78, 0x4c, 0xd6, 0xad,
+	0x8e, 0xfc, 0xaf, 0xc3, 0x70, 0x7f, 0xb4, 0x7e, 0x58, 0x2c, 0xb9, 0x5c, 0xbd, 0xfd, 0xfc, 0x07,
+	0xbf, 0x38, 0xd9, 0xc7, 0xef, 0xbf, 0x3f, 0x7b, 0xf7, 0x83, 0xfd, 0xee, 0x24, 0xef, 0x2f, 0x30,
+	0x8f, 0xb2, 0x05, 0x36, 0xba, 0x04, 0x83, 0x74, 0xcf, 0xdd, 0x68, 0xc5, 0x0a, 0xe9, 0xde, 0x87,
+	0xf0, 0xf6, 0x29, 0xdf, 0x3c, 0x0f, 0xef, 0x51, 0xad, 0x90, 0x64, 0xba, 0x9c, 0x7d, 0xf2, 0xfc,
+	0x9d, 0x4c, 0x97, 0x6b, 0x07, 0x9d, 0xdd, 0x19, 0x5d, 0xe0, 0x61, 0x77, 0xad, 0xc3, 0xc9, 0xab,
+	0x83, 0xde, 0x23, 0xd7, 0x85, 0xa8, 0x72, 0xa2, 0x4d, 0x4e, 0x73, 0xa8, 0xce, 0x6e, 0x49, 0xcf,
+	0x53, 0xc7, 0xff, 0xf2, 0x03, 0x07, 0xbe, 0x7a, 0x1b, 0x73, 0xce, 0xbf, 0x79, 0xd3, 0xb9, 0x35,
+	0xe4, 0x12, 0x89, 0x85, 0x1d, 0x8a, 0x23, 0xd2, 0x07, 0xe3, 0xa9, 0x93, 0x24, 0x5c, 0x62, 0x32,
+	0x48, 0x92, 0x38, 0x4a, 0x9c, 0xe4, 0x8f, 0xb7, 0x63, 0xdf, 0x19, 0xe3, 0x12, 0x19, 0x1b, 0x44,
+	0x8c, 0xc5, 0x11, 0x63, 0x4e, 0x76, 0x7c, 0xe5, 0xac, 0xcf, 0xe8, 0x6f, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0xc6, 0xd3, 0x99, 0xcb, 0x72, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// DisplayKeywordViewServiceClient is the client API for DisplayKeywordViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type DisplayKeywordViewServiceClient interface {
+	// Returns the requested display keyword view in full detail.
+	GetDisplayKeywordView(ctx context.Context, in *GetDisplayKeywordViewRequest, opts ...grpc.CallOption) (*resources.DisplayKeywordView, error)
+}
+
+type displayKeywordViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewDisplayKeywordViewServiceClient(cc grpc.ClientConnInterface) DisplayKeywordViewServiceClient {
+	return &displayKeywordViewServiceClient{cc}
+}
+
+func (c *displayKeywordViewServiceClient) GetDisplayKeywordView(ctx context.Context, in *GetDisplayKeywordViewRequest, opts ...grpc.CallOption) (*resources.DisplayKeywordView, error) {
+	out := new(resources.DisplayKeywordView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.DisplayKeywordViewService/GetDisplayKeywordView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// DisplayKeywordViewServiceServer is the server API for DisplayKeywordViewService service.
+type DisplayKeywordViewServiceServer interface {
+	// Returns the requested display keyword view in full detail.
+	GetDisplayKeywordView(context.Context, *GetDisplayKeywordViewRequest) (*resources.DisplayKeywordView, error)
+}
+
+// UnimplementedDisplayKeywordViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedDisplayKeywordViewServiceServer struct {
+}
+
+func (*UnimplementedDisplayKeywordViewServiceServer) GetDisplayKeywordView(ctx context.Context, req *GetDisplayKeywordViewRequest) (*resources.DisplayKeywordView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetDisplayKeywordView not implemented")
+}
+
+func RegisterDisplayKeywordViewServiceServer(s *grpc.Server, srv DisplayKeywordViewServiceServer) {
+	s.RegisterService(&_DisplayKeywordViewService_serviceDesc, srv)
+}
+
+func _DisplayKeywordViewService_GetDisplayKeywordView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetDisplayKeywordViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DisplayKeywordViewServiceServer).GetDisplayKeywordView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.DisplayKeywordViewService/GetDisplayKeywordView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DisplayKeywordViewServiceServer).GetDisplayKeywordView(ctx, req.(*GetDisplayKeywordViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _DisplayKeywordViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.DisplayKeywordViewService",
+	HandlerType: (*DisplayKeywordViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetDisplayKeywordView",
+			Handler:    _DisplayKeywordViewService_GetDisplayKeywordView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/display_keyword_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/distance_view_service.pb.go b/googleapis/ads/googleads/v3/services/distance_view_service.pb.go
new file mode 100644
index 0000000..4bba9c6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/distance_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/distance_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [DistanceViewService.GetDistanceView][google.ads.googleads.v3.services.DistanceViewService.GetDistanceView].
+type GetDistanceViewRequest struct {
+	// Required. The resource name of the distance view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetDistanceViewRequest) Reset()         { *m = GetDistanceViewRequest{} }
+func (m *GetDistanceViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetDistanceViewRequest) ProtoMessage()    {}
+func (*GetDistanceViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a03294264c0658c0, []int{0}
+}
+
+func (m *GetDistanceViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetDistanceViewRequest.Unmarshal(m, b)
+}
+func (m *GetDistanceViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetDistanceViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetDistanceViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetDistanceViewRequest.Merge(m, src)
+}
+func (m *GetDistanceViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetDistanceViewRequest.Size(m)
+}
+func (m *GetDistanceViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetDistanceViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetDistanceViewRequest proto.InternalMessageInfo
+
+func (m *GetDistanceViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetDistanceViewRequest)(nil), "google.ads.googleads.v3.services.GetDistanceViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/distance_view_service.proto", fileDescriptor_a03294264c0658c0)
+}
+
+var fileDescriptor_a03294264c0658c0 = []byte{
+	// 413 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xbd, 0x8a, 0xd5, 0x40,
+	0x14, 0x26, 0x59, 0x10, 0x0c, 0x8a, 0x10, 0x41, 0x2f, 0x51, 0xf0, 0xb2, 0x6c, 0xb1, 0x6c, 0x31,
+	0x83, 0x06, 0x41, 0x46, 0x2d, 0x26, 0x08, 0xb1, 0x92, 0x65, 0x85, 0x14, 0x12, 0x08, 0xb3, 0xc9,
+	0x31, 0x0e, 0x24, 0x33, 0xd7, 0x9c, 0xb9, 0xd9, 0x42, 0x6c, 0x7c, 0x05, 0xdf, 0xc0, 0xd2, 0xf7,
+	0xb0, 0xd9, 0xd6, 0xce, 0xca, 0xc2, 0xca, 0x47, 0xb0, 0x51, 0xb2, 0x93, 0xc9, 0x66, 0xdd, 0xbd,
+	0xdc, 0xee, 0x23, 0xdf, 0xcf, 0x39, 0xe7, 0x9b, 0x04, 0xcf, 0x6a, 0xad, 0xeb, 0x06, 0xa8, 0xa8,
+	0x90, 0x5a, 0x38, 0xa0, 0x3e, 0xa6, 0x08, 0x5d, 0x2f, 0x4b, 0x40, 0x5a, 0x49, 0x34, 0x42, 0x95,
+	0x50, 0xf4, 0x12, 0x4e, 0x8a, 0xf1, 0x33, 0x59, 0x75, 0xda, 0xe8, 0x70, 0x69, 0x2d, 0x44, 0x54,
+	0x48, 0x26, 0x37, 0xe9, 0x63, 0xe2, 0xdc, 0xd1, 0xe3, 0x4d, 0xf9, 0x1d, 0xa0, 0x5e, 0x77, 0x97,
+	0x06, 0xd8, 0xe0, 0xe8, 0xbe, 0xb3, 0xad, 0x24, 0x15, 0x4a, 0x69, 0x23, 0x8c, 0xd4, 0x0a, 0x47,
+	0xf6, 0xee, 0x8c, 0x2d, 0x1b, 0x09, 0xca, 0x8c, 0xc4, 0x83, 0x19, 0xf1, 0x56, 0x42, 0x53, 0x15,
+	0xc7, 0xf0, 0x4e, 0xf4, 0x52, 0x77, 0x56, 0xb0, 0x9b, 0x04, 0x77, 0x52, 0x30, 0x2f, 0xc6, 0x89,
+	0x99, 0x84, 0x93, 0x23, 0x78, 0xbf, 0x06, 0x34, 0xe1, 0x7e, 0x70, 0xd3, 0xad, 0x54, 0x28, 0xd1,
+	0xc2, 0xc2, 0x5b, 0x7a, 0xfb, 0xd7, 0x93, 0x9d, 0x9f, 0xdc, 0x3f, 0xba, 0xe1, 0x98, 0x57, 0xa2,
+	0x85, 0x47, 0x7f, 0xbc, 0xe0, 0xf6, 0x3c, 0xe1, 0xb5, 0xbd, 0x35, 0xfc, 0xe6, 0x05, 0xb7, 0xfe,
+	0x0b, 0x0f, 0x9f, 0x90, 0x6d, 0x0d, 0x91, 0xab, 0xf7, 0x89, 0xe8, 0x46, 0xe7, 0xd4, 0x1c, 0x99,
+	0xfb, 0x76, 0xd3, 0x1f, 0xfc, 0xe2, 0x05, 0x9f, 0xbe, 0xff, 0xfa, 0xec, 0x3f, 0x0c, 0xe9, 0xd0,
+	0xf6, 0x87, 0x0b, 0xcc, 0xf3, 0x72, 0x8d, 0x46, 0xb7, 0xd0, 0x21, 0x3d, 0x98, 0xea, 0x1f, 0x42,
+	0x90, 0x1e, 0x7c, 0x8c, 0xee, 0x9d, 0xf2, 0xc5, 0xf9, 0xc0, 0x11, 0xad, 0x24, 0x92, 0x52, 0xb7,
+	0xc9, 0x5f, 0x2f, 0xd8, 0x2b, 0x75, 0xbb, 0xf5, 0xac, 0x64, 0x71, 0x45, 0x45, 0x87, 0xc3, 0x1b,
+	0x1c, 0x7a, 0x6f, 0x5e, 0x8e, 0xee, 0x5a, 0x37, 0x42, 0xd5, 0x44, 0x77, 0x35, 0xad, 0x41, 0x9d,
+	0xbd, 0x10, 0x3d, 0x9f, 0xb7, 0xf9, 0x9f, 0x7c, 0xea, 0xc0, 0x17, 0x7f, 0x27, 0xe5, 0xfc, 0xab,
+	0xbf, 0x4c, 0x6d, 0x20, 0xaf, 0x90, 0x58, 0x38, 0xa0, 0x2c, 0x26, 0xe3, 0x60, 0x3c, 0x75, 0x92,
+	0x9c, 0x57, 0x98, 0x4f, 0x92, 0x3c, 0x8b, 0x73, 0x27, 0xf9, 0xed, 0xef, 0xd9, 0xef, 0x8c, 0xf1,
+	0x0a, 0x19, 0x9b, 0x44, 0x8c, 0x65, 0x31, 0x63, 0x4e, 0x76, 0x7c, 0xed, 0x6c, 0xcf, 0xf8, 0x5f,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0x54, 0x9f, 0xf8, 0x3a, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// DistanceViewServiceClient is the client API for DistanceViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type DistanceViewServiceClient interface {
+	// Returns the attributes of the requested distance view.
+	GetDistanceView(ctx context.Context, in *GetDistanceViewRequest, opts ...grpc.CallOption) (*resources.DistanceView, error)
+}
+
+type distanceViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewDistanceViewServiceClient(cc grpc.ClientConnInterface) DistanceViewServiceClient {
+	return &distanceViewServiceClient{cc}
+}
+
+func (c *distanceViewServiceClient) GetDistanceView(ctx context.Context, in *GetDistanceViewRequest, opts ...grpc.CallOption) (*resources.DistanceView, error) {
+	out := new(resources.DistanceView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.DistanceViewService/GetDistanceView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// DistanceViewServiceServer is the server API for DistanceViewService service.
+type DistanceViewServiceServer interface {
+	// Returns the attributes of the requested distance view.
+	GetDistanceView(context.Context, *GetDistanceViewRequest) (*resources.DistanceView, error)
+}
+
+// UnimplementedDistanceViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedDistanceViewServiceServer struct {
+}
+
+func (*UnimplementedDistanceViewServiceServer) GetDistanceView(ctx context.Context, req *GetDistanceViewRequest) (*resources.DistanceView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetDistanceView not implemented")
+}
+
+func RegisterDistanceViewServiceServer(s *grpc.Server, srv DistanceViewServiceServer) {
+	s.RegisterService(&_DistanceViewService_serviceDesc, srv)
+}
+
+func _DistanceViewService_GetDistanceView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetDistanceViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DistanceViewServiceServer).GetDistanceView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.DistanceViewService/GetDistanceView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DistanceViewServiceServer).GetDistanceView(ctx, req.(*GetDistanceViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _DistanceViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.DistanceViewService",
+	HandlerType: (*DistanceViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetDistanceView",
+			Handler:    _DistanceViewService_GetDistanceView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/distance_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/domain_category_service.pb.go b/googleapis/ads/googleads/v3/services/domain_category_service.pb.go
new file mode 100644
index 0000000..15c10f7
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/domain_category_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/domain_category_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [DomainCategoryService.GetDomainCategory][google.ads.googleads.v3.services.DomainCategoryService.GetDomainCategory].
+type GetDomainCategoryRequest struct {
+	// Required. Resource name of the domain category to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetDomainCategoryRequest) Reset()         { *m = GetDomainCategoryRequest{} }
+func (m *GetDomainCategoryRequest) String() string { return proto.CompactTextString(m) }
+func (*GetDomainCategoryRequest) ProtoMessage()    {}
+func (*GetDomainCategoryRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f0e862225aa01833, []int{0}
+}
+
+func (m *GetDomainCategoryRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetDomainCategoryRequest.Unmarshal(m, b)
+}
+func (m *GetDomainCategoryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetDomainCategoryRequest.Marshal(b, m, deterministic)
+}
+func (m *GetDomainCategoryRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetDomainCategoryRequest.Merge(m, src)
+}
+func (m *GetDomainCategoryRequest) XXX_Size() int {
+	return xxx_messageInfo_GetDomainCategoryRequest.Size(m)
+}
+func (m *GetDomainCategoryRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetDomainCategoryRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetDomainCategoryRequest proto.InternalMessageInfo
+
+func (m *GetDomainCategoryRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetDomainCategoryRequest)(nil), "google.ads.googleads.v3.services.GetDomainCategoryRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/domain_category_service.proto", fileDescriptor_f0e862225aa01833)
+}
+
+var fileDescriptor_f0e862225aa01833 = []byte{
+	// 416 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x4f, 0x8b, 0xd4, 0x30,
+	0x1c, 0xa5, 0x5d, 0x10, 0x2c, 0x7a, 0xb0, 0x20, 0x0e, 0x55, 0x70, 0x58, 0xf6, 0xb0, 0xec, 0x21,
+	0xc1, 0xad, 0x20, 0x44, 0x14, 0x32, 0x2e, 0x8c, 0x78, 0x90, 0x65, 0x85, 0x39, 0x48, 0xa1, 0x64,
+	0xdb, 0x9f, 0x35, 0xd0, 0x26, 0x63, 0x92, 0x29, 0x88, 0x78, 0x50, 0xf0, 0x13, 0xf8, 0x0d, 0x3c,
+	0xfa, 0x51, 0xf6, 0xe0, 0xc5, 0x9b, 0x27, 0x0f, 0x9e, 0xfc, 0x14, 0xd2, 0x49, 0xd2, 0x99, 0xe2,
+	0x94, 0xb9, 0x3d, 0xf2, 0xde, 0xfb, 0xbd, 0xdf, 0x9f, 0x44, 0x4f, 0x2b, 0x29, 0xab, 0x1a, 0x30,
+	0x2b, 0x35, 0xb6, 0xb0, 0x43, 0x6d, 0x8a, 0x35, 0xa8, 0x96, 0x17, 0xa0, 0x71, 0x29, 0x1b, 0xc6,
+	0x45, 0x5e, 0x30, 0x03, 0x95, 0x54, 0xef, 0x73, 0x47, 0xa0, 0xa5, 0x92, 0x46, 0xc6, 0x53, 0x6b,
+	0x42, 0xac, 0xd4, 0xa8, 0xf7, 0xa3, 0x36, 0x45, 0xde, 0x9f, 0x3c, 0x1a, 0x4b, 0x50, 0xa0, 0xe5,
+	0x4a, 0xed, 0x88, 0xb0, 0xa5, 0x93, 0x7b, 0xde, 0xb8, 0xe4, 0x98, 0x09, 0x21, 0x0d, 0x33, 0x5c,
+	0x0a, 0xed, 0xd8, 0x3b, 0x5b, 0x6c, 0x51, 0x73, 0x10, 0xc6, 0x11, 0xf7, 0xb7, 0x88, 0x37, 0x1c,
+	0xea, 0x32, 0xbf, 0x84, 0xb7, 0xac, 0xe5, 0x52, 0x59, 0xc1, 0xe1, 0x59, 0x34, 0x99, 0x83, 0x39,
+	0x5b, 0x67, 0x3e, 0x73, 0x91, 0x17, 0xf0, 0x6e, 0x05, 0xda, 0xc4, 0xc7, 0xd1, 0x4d, 0xdf, 0x56,
+	0x2e, 0x58, 0x03, 0x93, 0x60, 0x1a, 0x1c, 0x5f, 0x9f, 0x1d, 0xfc, 0xa6, 0xe1, 0xc5, 0x0d, 0xcf,
+	0xbc, 0x64, 0x0d, 0x9c, 0x7e, 0x09, 0xa3, 0xdb, 0xc3, 0x1a, 0xaf, 0xec, 0xc4, 0xf1, 0x8f, 0x20,
+	0xba, 0xf5, 0x5f, 0x40, 0x4c, 0xd0, 0xbe, 0x4d, 0xa1, 0xb1, 0xae, 0x92, 0x07, 0xa3, 0xde, 0x7e,
+	0x87, 0x68, 0xe8, 0x3c, 0x7c, 0xf1, 0x8b, 0x0e, 0x27, 0xf9, 0xfc, 0xf3, 0xcf, 0xd7, 0xf0, 0x61,
+	0x7c, 0xda, 0x6d, 0xfe, 0xc3, 0x80, 0x79, 0x52, 0xac, 0xb4, 0x91, 0x0d, 0x28, 0x8d, 0x4f, 0xdc,
+	0x29, 0x5c, 0x19, 0x0e, 0x1a, 0x9f, 0x7c, 0x4c, 0xee, 0x5e, 0xd1, 0xc9, 0x26, 0xd5, 0xa1, 0x25,
+	0xd7, 0xa8, 0x90, 0xcd, 0xec, 0x53, 0x18, 0x1d, 0x15, 0xb2, 0xd9, 0x3b, 0xdd, 0x2c, 0xd9, 0xb9,
+	0xad, 0xf3, 0xee, 0x24, 0xe7, 0xc1, 0xeb, 0xe7, 0xce, 0x5f, 0xc9, 0x9a, 0x89, 0x0a, 0x49, 0x55,
+	0xe1, 0x0a, 0xc4, 0xfa, 0x60, 0x78, 0x93, 0x38, 0xfe, 0x4d, 0x1f, 0x7b, 0xf0, 0x2d, 0x3c, 0x98,
+	0x53, 0xfa, 0x3d, 0x9c, 0xce, 0x6d, 0x41, 0x5a, 0x6a, 0x64, 0x61, 0x87, 0x16, 0x29, 0x72, 0xc1,
+	0xfa, 0xca, 0x4b, 0x32, 0x5a, 0xea, 0xac, 0x97, 0x64, 0x8b, 0x34, 0xf3, 0x92, 0xbf, 0xe1, 0x91,
+	0x7d, 0x27, 0x84, 0x96, 0x9a, 0x90, 0x5e, 0x44, 0xc8, 0x22, 0x25, 0xc4, 0xcb, 0x2e, 0xaf, 0xad,
+	0xfb, 0x4c, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xcc, 0x13, 0xdc, 0xd2, 0x4d, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// DomainCategoryServiceClient is the client API for DomainCategoryService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type DomainCategoryServiceClient interface {
+	// Returns the requested domain category.
+	GetDomainCategory(ctx context.Context, in *GetDomainCategoryRequest, opts ...grpc.CallOption) (*resources.DomainCategory, error)
+}
+
+type domainCategoryServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewDomainCategoryServiceClient(cc grpc.ClientConnInterface) DomainCategoryServiceClient {
+	return &domainCategoryServiceClient{cc}
+}
+
+func (c *domainCategoryServiceClient) GetDomainCategory(ctx context.Context, in *GetDomainCategoryRequest, opts ...grpc.CallOption) (*resources.DomainCategory, error) {
+	out := new(resources.DomainCategory)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.DomainCategoryService/GetDomainCategory", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// DomainCategoryServiceServer is the server API for DomainCategoryService service.
+type DomainCategoryServiceServer interface {
+	// Returns the requested domain category.
+	GetDomainCategory(context.Context, *GetDomainCategoryRequest) (*resources.DomainCategory, error)
+}
+
+// UnimplementedDomainCategoryServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedDomainCategoryServiceServer struct {
+}
+
+func (*UnimplementedDomainCategoryServiceServer) GetDomainCategory(ctx context.Context, req *GetDomainCategoryRequest) (*resources.DomainCategory, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetDomainCategory not implemented")
+}
+
+func RegisterDomainCategoryServiceServer(s *grpc.Server, srv DomainCategoryServiceServer) {
+	s.RegisterService(&_DomainCategoryService_serviceDesc, srv)
+}
+
+func _DomainCategoryService_GetDomainCategory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetDomainCategoryRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DomainCategoryServiceServer).GetDomainCategory(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.DomainCategoryService/GetDomainCategory",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DomainCategoryServiceServer).GetDomainCategory(ctx, req.(*GetDomainCategoryRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _DomainCategoryService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.DomainCategoryService",
+	HandlerType: (*DomainCategoryServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetDomainCategory",
+			Handler:    _DomainCategoryService_GetDomainCategory_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/domain_category_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/dynamic_search_ads_search_term_view_service.pb.go b/googleapis/ads/googleads/v3/services/dynamic_search_ads_search_term_view_service.pb.go
new file mode 100644
index 0000000..52a6cb2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/dynamic_search_ads_search_term_view_service.pb.go
@@ -0,0 +1,194 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/dynamic_search_ads_search_term_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [DynamicSearchAdsSearchTermViewService.GetDynamicSearchAdsSearchTermView][google.ads.googleads.v3.services.DynamicSearchAdsSearchTermViewService.GetDynamicSearchAdsSearchTermView].
+type GetDynamicSearchAdsSearchTermViewRequest struct {
+	// Required. The resource name of the dynamic search ads search term view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetDynamicSearchAdsSearchTermViewRequest) Reset() {
+	*m = GetDynamicSearchAdsSearchTermViewRequest{}
+}
+func (m *GetDynamicSearchAdsSearchTermViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetDynamicSearchAdsSearchTermViewRequest) ProtoMessage()    {}
+func (*GetDynamicSearchAdsSearchTermViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c06f8b0bac521385, []int{0}
+}
+
+func (m *GetDynamicSearchAdsSearchTermViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetDynamicSearchAdsSearchTermViewRequest.Unmarshal(m, b)
+}
+func (m *GetDynamicSearchAdsSearchTermViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetDynamicSearchAdsSearchTermViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetDynamicSearchAdsSearchTermViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetDynamicSearchAdsSearchTermViewRequest.Merge(m, src)
+}
+func (m *GetDynamicSearchAdsSearchTermViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetDynamicSearchAdsSearchTermViewRequest.Size(m)
+}
+func (m *GetDynamicSearchAdsSearchTermViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetDynamicSearchAdsSearchTermViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetDynamicSearchAdsSearchTermViewRequest proto.InternalMessageInfo
+
+func (m *GetDynamicSearchAdsSearchTermViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetDynamicSearchAdsSearchTermViewRequest)(nil), "google.ads.googleads.v3.services.GetDynamicSearchAdsSearchTermViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/dynamic_search_ads_search_term_view_service.proto", fileDescriptor_c06f8b0bac521385)
+}
+
+var fileDescriptor_c06f8b0bac521385 = []byte{
+	// 437 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xb1, 0x8b, 0x13, 0x41,
+	0x14, 0xc6, 0xc9, 0x1e, 0x08, 0x2e, 0xda, 0x6c, 0xe3, 0x11, 0x05, 0xe3, 0x71, 0x42, 0x48, 0x31,
+	0x03, 0x6e, 0x37, 0x62, 0x31, 0x51, 0x88, 0x28, 0xc8, 0x91, 0x3b, 0x02, 0x4a, 0x60, 0x99, 0xdb,
+	0x79, 0xee, 0x0d, 0x64, 0x66, 0xe2, 0xbc, 0xc9, 0x1e, 0x22, 0x36, 0xf6, 0x16, 0xe2, 0x7f, 0x60,
+	0xe9, 0x9f, 0x72, 0xad, 0x56, 0x56, 0x16, 0x56, 0xfe, 0x15, 0x47, 0x32, 0x3b, 0xb9, 0xbb, 0x62,
+	0x93, 0x74, 0x1f, 0xf9, 0x3e, 0x7e, 0xef, 0xcb, 0x7b, 0xb3, 0xe9, 0xb8, 0xb2, 0xb6, 0x9a, 0x01,
+	0x15, 0x12, 0x69, 0x90, 0x4b, 0x55, 0xe7, 0x14, 0xc1, 0xd5, 0xaa, 0x04, 0xa4, 0xf2, 0xa3, 0x11,
+	0x5a, 0x95, 0x05, 0x82, 0x70, 0xe5, 0x59, 0x21, 0x24, 0x46, 0xe9, 0xc1, 0xe9, 0xa2, 0x56, 0x70,
+	0x5e, 0x34, 0x61, 0x32, 0x77, 0xd6, 0xdb, 0xac, 0x17, 0x40, 0x44, 0x48, 0x24, 0x6b, 0x26, 0xa9,
+	0x73, 0x12, 0x99, 0xdd, 0xd7, 0x6d, 0x53, 0x1d, 0xa0, 0x5d, 0xb8, 0x1d, 0xc7, 0x86, 0x71, 0xdd,
+	0x07, 0x11, 0x36, 0x57, 0x54, 0x18, 0x63, 0xbd, 0xf0, 0xca, 0x1a, 0x6c, 0xdc, 0x7b, 0xd7, 0xdc,
+	0x72, 0xa6, 0xc0, 0xf8, 0xc6, 0x78, 0x78, 0xcd, 0x78, 0xaf, 0x60, 0x26, 0x8b, 0x53, 0x38, 0x13,
+	0xb5, 0xb2, 0x2e, 0x04, 0x0e, 0x4e, 0xd2, 0xfe, 0x08, 0xfc, 0x8b, 0xd0, 0xe3, 0x78, 0x35, 0x9b,
+	0x4b, 0x0c, 0xe2, 0x04, 0x9c, 0x9e, 0x28, 0x38, 0x1f, 0xc3, 0x87, 0x05, 0xa0, 0xcf, 0xfa, 0xe9,
+	0xdd, 0x58, 0xbd, 0x30, 0x42, 0xc3, 0x7e, 0xa7, 0xd7, 0xe9, 0xdf, 0x1e, 0xee, 0xfd, 0xe5, 0xc9,
+	0xf8, 0x4e, 0x74, 0xde, 0x08, 0x0d, 0x4f, 0x7e, 0x27, 0xe9, 0xe3, 0xcd, 0xcc, 0xe3, 0xb0, 0xa5,
+	0xec, 0x6b, 0x92, 0x3e, 0xda, 0x5a, 0x20, 0x7b, 0x45, 0xb6, 0x6d, 0x9b, 0xec, 0xfa, 0x2f, 0xba,
+	0xbc, 0x95, 0xb5, 0xbe, 0x0b, 0xd9, 0x4c, 0x3a, 0x78, 0xfb, 0x87, 0xdf, 0xdc, 0xc4, 0x97, 0x5f,
+	0xff, 0xbe, 0x27, 0xcf, 0x33, 0xbe, 0xbc, 0xee, 0xa7, 0x1b, 0xce, 0xb3, 0x72, 0x81, 0xde, 0x6a,
+	0x70, 0x48, 0x07, 0xf1, 0xdc, 0x2d, 0x58, 0xa4, 0x83, 0xcf, 0xdd, 0xfb, 0x17, 0x7c, 0xff, 0xaa,
+	0x54, 0xa3, 0xe6, 0x0a, 0x49, 0x69, 0xf5, 0xf0, 0x5b, 0x92, 0x1e, 0x96, 0x56, 0x6f, 0x5d, 0xc6,
+	0x70, 0xb0, 0xd3, 0xf2, 0x8f, 0x96, 0x2f, 0xe0, 0xa8, 0xf3, 0xee, 0x65, 0xc3, 0xab, 0xec, 0x4c,
+	0x98, 0x8a, 0x58, 0x57, 0xd1, 0x0a, 0xcc, 0xea, 0x7d, 0xd0, 0xab, 0x06, 0xed, 0x5f, 0xcf, 0xd3,
+	0x28, 0x7e, 0x24, 0x7b, 0x23, 0xce, 0x7f, 0x26, 0xbd, 0x51, 0x00, 0x72, 0x89, 0x24, 0xc8, 0xa5,
+	0x9a, 0xe4, 0xa4, 0x19, 0x8c, 0x17, 0x31, 0x32, 0xe5, 0x12, 0xa7, 0xeb, 0xc8, 0x74, 0x92, 0x4f,
+	0x63, 0xe4, 0x7f, 0x72, 0x18, 0x7e, 0x67, 0x8c, 0x4b, 0x64, 0x6c, 0x1d, 0x62, 0x6c, 0x92, 0x33,
+	0x16, 0x63, 0xa7, 0xb7, 0x56, 0x3d, 0xf3, 0xcb, 0x00, 0x00, 0x00, 0xff, 0xff, 0xda, 0xf2, 0x87,
+	0xef, 0xe4, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// DynamicSearchAdsSearchTermViewServiceClient is the client API for DynamicSearchAdsSearchTermViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type DynamicSearchAdsSearchTermViewServiceClient interface {
+	// Returns the requested dynamic search ads search term view in full detail.
+	GetDynamicSearchAdsSearchTermView(ctx context.Context, in *GetDynamicSearchAdsSearchTermViewRequest, opts ...grpc.CallOption) (*resources.DynamicSearchAdsSearchTermView, error)
+}
+
+type dynamicSearchAdsSearchTermViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewDynamicSearchAdsSearchTermViewServiceClient(cc grpc.ClientConnInterface) DynamicSearchAdsSearchTermViewServiceClient {
+	return &dynamicSearchAdsSearchTermViewServiceClient{cc}
+}
+
+func (c *dynamicSearchAdsSearchTermViewServiceClient) GetDynamicSearchAdsSearchTermView(ctx context.Context, in *GetDynamicSearchAdsSearchTermViewRequest, opts ...grpc.CallOption) (*resources.DynamicSearchAdsSearchTermView, error) {
+	out := new(resources.DynamicSearchAdsSearchTermView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.DynamicSearchAdsSearchTermViewService/GetDynamicSearchAdsSearchTermView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// DynamicSearchAdsSearchTermViewServiceServer is the server API for DynamicSearchAdsSearchTermViewService service.
+type DynamicSearchAdsSearchTermViewServiceServer interface {
+	// Returns the requested dynamic search ads search term view in full detail.
+	GetDynamicSearchAdsSearchTermView(context.Context, *GetDynamicSearchAdsSearchTermViewRequest) (*resources.DynamicSearchAdsSearchTermView, error)
+}
+
+// UnimplementedDynamicSearchAdsSearchTermViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedDynamicSearchAdsSearchTermViewServiceServer struct {
+}
+
+func (*UnimplementedDynamicSearchAdsSearchTermViewServiceServer) GetDynamicSearchAdsSearchTermView(ctx context.Context, req *GetDynamicSearchAdsSearchTermViewRequest) (*resources.DynamicSearchAdsSearchTermView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetDynamicSearchAdsSearchTermView not implemented")
+}
+
+func RegisterDynamicSearchAdsSearchTermViewServiceServer(s *grpc.Server, srv DynamicSearchAdsSearchTermViewServiceServer) {
+	s.RegisterService(&_DynamicSearchAdsSearchTermViewService_serviceDesc, srv)
+}
+
+func _DynamicSearchAdsSearchTermViewService_GetDynamicSearchAdsSearchTermView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetDynamicSearchAdsSearchTermViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DynamicSearchAdsSearchTermViewServiceServer).GetDynamicSearchAdsSearchTermView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.DynamicSearchAdsSearchTermViewService/GetDynamicSearchAdsSearchTermView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DynamicSearchAdsSearchTermViewServiceServer).GetDynamicSearchAdsSearchTermView(ctx, req.(*GetDynamicSearchAdsSearchTermViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _DynamicSearchAdsSearchTermViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.DynamicSearchAdsSearchTermViewService",
+	HandlerType: (*DynamicSearchAdsSearchTermViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetDynamicSearchAdsSearchTermView",
+			Handler:    _DynamicSearchAdsSearchTermViewService_GetDynamicSearchAdsSearchTermView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/dynamic_search_ads_search_term_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/expanded_landing_page_view_service.pb.go b/googleapis/ads/googleads/v3/services/expanded_landing_page_view_service.pb.go
new file mode 100644
index 0000000..6a22917
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/expanded_landing_page_view_service.pb.go
@@ -0,0 +1,191 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/expanded_landing_page_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [ExpandedLandingPageViewService.GetExpandedLandingPageView][google.ads.googleads.v3.services.ExpandedLandingPageViewService.GetExpandedLandingPageView].
+type GetExpandedLandingPageViewRequest struct {
+	// Required. The resource name of the expanded landing page view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetExpandedLandingPageViewRequest) Reset()         { *m = GetExpandedLandingPageViewRequest{} }
+func (m *GetExpandedLandingPageViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetExpandedLandingPageViewRequest) ProtoMessage()    {}
+func (*GetExpandedLandingPageViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_50015c0516433256, []int{0}
+}
+
+func (m *GetExpandedLandingPageViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetExpandedLandingPageViewRequest.Unmarshal(m, b)
+}
+func (m *GetExpandedLandingPageViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetExpandedLandingPageViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetExpandedLandingPageViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetExpandedLandingPageViewRequest.Merge(m, src)
+}
+func (m *GetExpandedLandingPageViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetExpandedLandingPageViewRequest.Size(m)
+}
+func (m *GetExpandedLandingPageViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetExpandedLandingPageViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetExpandedLandingPageViewRequest proto.InternalMessageInfo
+
+func (m *GetExpandedLandingPageViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetExpandedLandingPageViewRequest)(nil), "google.ads.googleads.v3.services.GetExpandedLandingPageViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/expanded_landing_page_view_service.proto", fileDescriptor_50015c0516433256)
+}
+
+var fileDescriptor_50015c0516433256 = []byte{
+	// 429 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xb1, 0x8b, 0xd4, 0x40,
+	0x14, 0xc6, 0x49, 0x0e, 0x04, 0x83, 0x36, 0x69, 0x3c, 0xa2, 0xe8, 0x7a, 0x5e, 0x71, 0x5c, 0x31,
+	0x03, 0xa6, 0x1b, 0xb5, 0x98, 0x88, 0xac, 0x82, 0xca, 0xb2, 0x42, 0x0a, 0x09, 0x84, 0xb9, 0xcc,
+	0x73, 0x1c, 0x48, 0x66, 0x62, 0x26, 0x9b, 0x13, 0xc4, 0xc6, 0xd2, 0xd6, 0xff, 0xc0, 0xd2, 0xce,
+	0x7f, 0xe3, 0x5a, 0x3b, 0x2b, 0x0b, 0x2b, 0x3b, 0xff, 0x03, 0xc9, 0x4d, 0x26, 0xbb, 0x2b, 0x64,
+	0xb7, 0xfb, 0xd8, 0xef, 0xdb, 0xdf, 0xf7, 0xe6, 0xbd, 0x04, 0xcf, 0x84, 0xd6, 0xa2, 0x04, 0xcc,
+	0xb8, 0xc1, 0x56, 0xf6, 0xaa, 0x8b, 0xb1, 0x81, 0xa6, 0x93, 0x05, 0x18, 0x0c, 0xef, 0x6b, 0xa6,
+	0x38, 0xf0, 0xbc, 0x64, 0x8a, 0x4b, 0x25, 0xf2, 0x9a, 0x09, 0xc8, 0x3b, 0x09, 0xe7, 0xf9, 0x90,
+	0x41, 0x75, 0xa3, 0x5b, 0x1d, 0xce, 0xec, 0xff, 0x11, 0xe3, 0x06, 0x8d, 0x28, 0xd4, 0xc5, 0xc8,
+	0xa1, 0xa2, 0x64, 0xaa, 0xac, 0x01, 0xa3, 0x57, 0xcd, 0xee, 0x36, 0xdb, 0x12, 0xdd, 0x72, 0x8c,
+	0x5a, 0x62, 0xa6, 0x94, 0x6e, 0x59, 0x2b, 0xb5, 0x32, 0x83, 0x7b, 0x63, 0xc3, 0x2d, 0x4a, 0x09,
+	0xaa, 0x1d, 0x8c, 0x3b, 0x1b, 0xc6, 0x1b, 0x09, 0x25, 0xcf, 0xcf, 0xe0, 0x2d, 0xeb, 0xa4, 0x6e,
+	0x6c, 0xe0, 0xe8, 0x45, 0x70, 0x77, 0x0e, 0xed, 0x93, 0xa1, 0xfe, 0xb9, 0x6d, 0x5f, 0x30, 0x01,
+	0xa9, 0x84, 0xf3, 0x25, 0xbc, 0x5b, 0x81, 0x69, 0xc3, 0x93, 0xe0, 0xba, 0x1b, 0x35, 0x57, 0xac,
+	0x82, 0x43, 0x6f, 0xe6, 0x9d, 0x5c, 0x4d, 0x0e, 0x7e, 0x51, 0x7f, 0x79, 0xcd, 0x39, 0x2f, 0x59,
+	0x05, 0xf7, 0xbf, 0xfb, 0xc1, 0xed, 0x09, 0xd8, 0x2b, 0xbb, 0x8e, 0xf0, 0xaf, 0x17, 0x44, 0xd3,
+	0x95, 0xe1, 0x63, 0xb4, 0x6f, 0x9f, 0x68, 0xef, 0xc0, 0x11, 0x99, 0x84, 0x8c, 0x2b, 0x47, 0x13,
+	0x88, 0xa3, 0xe5, 0x4f, 0xba, 0xfd, 0xda, 0x4f, 0x3f, 0x7e, 0x7f, 0xf1, 0x1f, 0x86, 0xa4, 0xbf,
+	0xd8, 0x87, 0x2d, 0xe7, 0x51, 0xb1, 0x32, 0xad, 0xae, 0xa0, 0x31, 0xf8, 0x74, 0x3c, 0xe1, 0x7f,
+	0x3c, 0x83, 0x4f, 0x3f, 0x46, 0x37, 0x2f, 0xe8, 0xe1, 0x7a, 0x8c, 0x41, 0xd5, 0xd2, 0xa0, 0x42,
+	0x57, 0xc9, 0x67, 0x3f, 0x38, 0x2e, 0x74, 0xb5, 0xf7, 0xdd, 0xc9, 0xbd, 0xdd, 0x9b, 0x5d, 0xf4,
+	0x07, 0x5d, 0x78, 0xaf, 0x9f, 0x0e, 0x20, 0xa1, 0x4b, 0xa6, 0x04, 0xd2, 0x8d, 0xc0, 0x02, 0xd4,
+	0xe5, 0xb9, 0xf1, 0xba, 0x7a, 0xfa, 0xd3, 0x7f, 0xe0, 0xc4, 0x57, 0xff, 0x60, 0x4e, 0xe9, 0x37,
+	0x7f, 0x36, 0xb7, 0x40, 0xca, 0x0d, 0xb2, 0xb2, 0x57, 0x69, 0x8c, 0x86, 0x62, 0x73, 0xe1, 0x22,
+	0x19, 0xe5, 0x26, 0x1b, 0x23, 0x59, 0x1a, 0x67, 0x2e, 0xf2, 0xc7, 0x3f, 0xb6, 0xbf, 0x13, 0x42,
+	0xb9, 0x21, 0x64, 0x0c, 0x11, 0x92, 0xc6, 0x84, 0xb8, 0xd8, 0xd9, 0x95, 0xcb, 0x39, 0xe3, 0x7f,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0x85, 0x54, 0xcc, 0x3d, 0xa1, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ExpandedLandingPageViewServiceClient is the client API for ExpandedLandingPageViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ExpandedLandingPageViewServiceClient interface {
+	// Returns the requested expanded landing page view in full detail.
+	GetExpandedLandingPageView(ctx context.Context, in *GetExpandedLandingPageViewRequest, opts ...grpc.CallOption) (*resources.ExpandedLandingPageView, error)
+}
+
+type expandedLandingPageViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewExpandedLandingPageViewServiceClient(cc grpc.ClientConnInterface) ExpandedLandingPageViewServiceClient {
+	return &expandedLandingPageViewServiceClient{cc}
+}
+
+func (c *expandedLandingPageViewServiceClient) GetExpandedLandingPageView(ctx context.Context, in *GetExpandedLandingPageViewRequest, opts ...grpc.CallOption) (*resources.ExpandedLandingPageView, error) {
+	out := new(resources.ExpandedLandingPageView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ExpandedLandingPageViewService/GetExpandedLandingPageView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ExpandedLandingPageViewServiceServer is the server API for ExpandedLandingPageViewService service.
+type ExpandedLandingPageViewServiceServer interface {
+	// Returns the requested expanded landing page view in full detail.
+	GetExpandedLandingPageView(context.Context, *GetExpandedLandingPageViewRequest) (*resources.ExpandedLandingPageView, error)
+}
+
+// UnimplementedExpandedLandingPageViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedExpandedLandingPageViewServiceServer struct {
+}
+
+func (*UnimplementedExpandedLandingPageViewServiceServer) GetExpandedLandingPageView(ctx context.Context, req *GetExpandedLandingPageViewRequest) (*resources.ExpandedLandingPageView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetExpandedLandingPageView not implemented")
+}
+
+func RegisterExpandedLandingPageViewServiceServer(s *grpc.Server, srv ExpandedLandingPageViewServiceServer) {
+	s.RegisterService(&_ExpandedLandingPageViewService_serviceDesc, srv)
+}
+
+func _ExpandedLandingPageViewService_GetExpandedLandingPageView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetExpandedLandingPageViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ExpandedLandingPageViewServiceServer).GetExpandedLandingPageView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ExpandedLandingPageViewService/GetExpandedLandingPageView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ExpandedLandingPageViewServiceServer).GetExpandedLandingPageView(ctx, req.(*GetExpandedLandingPageViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ExpandedLandingPageViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ExpandedLandingPageViewService",
+	HandlerType: (*ExpandedLandingPageViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetExpandedLandingPageView",
+			Handler:    _ExpandedLandingPageViewService_GetExpandedLandingPageView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/expanded_landing_page_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/extension_feed_item_service.pb.go b/googleapis/ads/googleads/v3/services/extension_feed_item_service.pb.go
new file mode 100644
index 0000000..aee18fc
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/extension_feed_item_service.pb.go
@@ -0,0 +1,532 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/extension_feed_item_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [ExtensionFeedItemService.GetExtensionFeedItem][google.ads.googleads.v3.services.ExtensionFeedItemService.GetExtensionFeedItem].
+type GetExtensionFeedItemRequest struct {
+	// Required. The resource name of the extension feed item to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetExtensionFeedItemRequest) Reset()         { *m = GetExtensionFeedItemRequest{} }
+func (m *GetExtensionFeedItemRequest) String() string { return proto.CompactTextString(m) }
+func (*GetExtensionFeedItemRequest) ProtoMessage()    {}
+func (*GetExtensionFeedItemRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_67cac715d7a110a8, []int{0}
+}
+
+func (m *GetExtensionFeedItemRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetExtensionFeedItemRequest.Unmarshal(m, b)
+}
+func (m *GetExtensionFeedItemRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetExtensionFeedItemRequest.Marshal(b, m, deterministic)
+}
+func (m *GetExtensionFeedItemRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetExtensionFeedItemRequest.Merge(m, src)
+}
+func (m *GetExtensionFeedItemRequest) XXX_Size() int {
+	return xxx_messageInfo_GetExtensionFeedItemRequest.Size(m)
+}
+func (m *GetExtensionFeedItemRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetExtensionFeedItemRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetExtensionFeedItemRequest proto.InternalMessageInfo
+
+func (m *GetExtensionFeedItemRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [ExtensionFeedItemService.MutateExtensionFeedItems][google.ads.googleads.v3.services.ExtensionFeedItemService.MutateExtensionFeedItems].
+type MutateExtensionFeedItemsRequest struct {
+	// Required. The ID of the customer whose extension feed items are being
+	// modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual extension feed items.
+	Operations []*ExtensionFeedItemOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateExtensionFeedItemsRequest) Reset()         { *m = MutateExtensionFeedItemsRequest{} }
+func (m *MutateExtensionFeedItemsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateExtensionFeedItemsRequest) ProtoMessage()    {}
+func (*MutateExtensionFeedItemsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_67cac715d7a110a8, []int{1}
+}
+
+func (m *MutateExtensionFeedItemsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateExtensionFeedItemsRequest.Unmarshal(m, b)
+}
+func (m *MutateExtensionFeedItemsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateExtensionFeedItemsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateExtensionFeedItemsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateExtensionFeedItemsRequest.Merge(m, src)
+}
+func (m *MutateExtensionFeedItemsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateExtensionFeedItemsRequest.Size(m)
+}
+func (m *MutateExtensionFeedItemsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateExtensionFeedItemsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateExtensionFeedItemsRequest proto.InternalMessageInfo
+
+func (m *MutateExtensionFeedItemsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateExtensionFeedItemsRequest) GetOperations() []*ExtensionFeedItemOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateExtensionFeedItemsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateExtensionFeedItemsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on an extension feed item.
+type ExtensionFeedItemOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*ExtensionFeedItemOperation_Create
+	//	*ExtensionFeedItemOperation_Update
+	//	*ExtensionFeedItemOperation_Remove
+	Operation            isExtensionFeedItemOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *ExtensionFeedItemOperation) Reset()         { *m = ExtensionFeedItemOperation{} }
+func (m *ExtensionFeedItemOperation) String() string { return proto.CompactTextString(m) }
+func (*ExtensionFeedItemOperation) ProtoMessage()    {}
+func (*ExtensionFeedItemOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_67cac715d7a110a8, []int{2}
+}
+
+func (m *ExtensionFeedItemOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExtensionFeedItemOperation.Unmarshal(m, b)
+}
+func (m *ExtensionFeedItemOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExtensionFeedItemOperation.Marshal(b, m, deterministic)
+}
+func (m *ExtensionFeedItemOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExtensionFeedItemOperation.Merge(m, src)
+}
+func (m *ExtensionFeedItemOperation) XXX_Size() int {
+	return xxx_messageInfo_ExtensionFeedItemOperation.Size(m)
+}
+func (m *ExtensionFeedItemOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExtensionFeedItemOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExtensionFeedItemOperation proto.InternalMessageInfo
+
+func (m *ExtensionFeedItemOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isExtensionFeedItemOperation_Operation interface {
+	isExtensionFeedItemOperation_Operation()
+}
+
+type ExtensionFeedItemOperation_Create struct {
+	Create *resources.ExtensionFeedItem `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type ExtensionFeedItemOperation_Update struct {
+	Update *resources.ExtensionFeedItem `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type ExtensionFeedItemOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*ExtensionFeedItemOperation_Create) isExtensionFeedItemOperation_Operation() {}
+
+func (*ExtensionFeedItemOperation_Update) isExtensionFeedItemOperation_Operation() {}
+
+func (*ExtensionFeedItemOperation_Remove) isExtensionFeedItemOperation_Operation() {}
+
+func (m *ExtensionFeedItemOperation) GetOperation() isExtensionFeedItemOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItemOperation) GetCreate() *resources.ExtensionFeedItem {
+	if x, ok := m.GetOperation().(*ExtensionFeedItemOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItemOperation) GetUpdate() *resources.ExtensionFeedItem {
+	if x, ok := m.GetOperation().(*ExtensionFeedItemOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *ExtensionFeedItemOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*ExtensionFeedItemOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ExtensionFeedItemOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ExtensionFeedItemOperation_Create)(nil),
+		(*ExtensionFeedItemOperation_Update)(nil),
+		(*ExtensionFeedItemOperation_Remove)(nil),
+	}
+}
+
+// Response message for an extension feed item mutate.
+type MutateExtensionFeedItemsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateExtensionFeedItemResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *MutateExtensionFeedItemsResponse) Reset()         { *m = MutateExtensionFeedItemsResponse{} }
+func (m *MutateExtensionFeedItemsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateExtensionFeedItemsResponse) ProtoMessage()    {}
+func (*MutateExtensionFeedItemsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_67cac715d7a110a8, []int{3}
+}
+
+func (m *MutateExtensionFeedItemsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateExtensionFeedItemsResponse.Unmarshal(m, b)
+}
+func (m *MutateExtensionFeedItemsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateExtensionFeedItemsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateExtensionFeedItemsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateExtensionFeedItemsResponse.Merge(m, src)
+}
+func (m *MutateExtensionFeedItemsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateExtensionFeedItemsResponse.Size(m)
+}
+func (m *MutateExtensionFeedItemsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateExtensionFeedItemsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateExtensionFeedItemsResponse proto.InternalMessageInfo
+
+func (m *MutateExtensionFeedItemsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateExtensionFeedItemsResponse) GetResults() []*MutateExtensionFeedItemResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the extension feed item mutate.
+type MutateExtensionFeedItemResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateExtensionFeedItemResult) Reset()         { *m = MutateExtensionFeedItemResult{} }
+func (m *MutateExtensionFeedItemResult) String() string { return proto.CompactTextString(m) }
+func (*MutateExtensionFeedItemResult) ProtoMessage()    {}
+func (*MutateExtensionFeedItemResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_67cac715d7a110a8, []int{4}
+}
+
+func (m *MutateExtensionFeedItemResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateExtensionFeedItemResult.Unmarshal(m, b)
+}
+func (m *MutateExtensionFeedItemResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateExtensionFeedItemResult.Marshal(b, m, deterministic)
+}
+func (m *MutateExtensionFeedItemResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateExtensionFeedItemResult.Merge(m, src)
+}
+func (m *MutateExtensionFeedItemResult) XXX_Size() int {
+	return xxx_messageInfo_MutateExtensionFeedItemResult.Size(m)
+}
+func (m *MutateExtensionFeedItemResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateExtensionFeedItemResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateExtensionFeedItemResult proto.InternalMessageInfo
+
+func (m *MutateExtensionFeedItemResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetExtensionFeedItemRequest)(nil), "google.ads.googleads.v3.services.GetExtensionFeedItemRequest")
+	proto.RegisterType((*MutateExtensionFeedItemsRequest)(nil), "google.ads.googleads.v3.services.MutateExtensionFeedItemsRequest")
+	proto.RegisterType((*ExtensionFeedItemOperation)(nil), "google.ads.googleads.v3.services.ExtensionFeedItemOperation")
+	proto.RegisterType((*MutateExtensionFeedItemsResponse)(nil), "google.ads.googleads.v3.services.MutateExtensionFeedItemsResponse")
+	proto.RegisterType((*MutateExtensionFeedItemResult)(nil), "google.ads.googleads.v3.services.MutateExtensionFeedItemResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/extension_feed_item_service.proto", fileDescriptor_67cac715d7a110a8)
+}
+
+var fileDescriptor_67cac715d7a110a8 = []byte{
+	// 775 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xcd, 0x6a, 0xeb, 0x46,
+	0x14, 0xc7, 0x2b, 0x39, 0xa4, 0xcd, 0x38, 0x69, 0x61, 0xfa, 0x25, 0x9c, 0x86, 0x18, 0x35, 0x50,
+	0x63, 0x8a, 0x04, 0x76, 0x68, 0x41, 0x49, 0x28, 0x32, 0x8d, 0x9d, 0x40, 0xf3, 0x81, 0x02, 0x81,
+	0xb6, 0x06, 0x31, 0x91, 0xc6, 0xae, 0x88, 0xa4, 0x51, 0x67, 0x46, 0xa6, 0x21, 0x64, 0x53, 0xfa,
+	0x06, 0xed, 0x03, 0x94, 0x2e, 0xfb, 0x1e, 0xdd, 0x64, 0xdb, 0xd5, 0xcd, 0xea, 0x2e, 0xee, 0xea,
+	0x3e, 0xc1, 0x5d, 0x5d, 0x2e, 0xd2, 0x68, 0xfc, 0x11, 0x47, 0x31, 0x24, 0xbb, 0xe3, 0x39, 0x7f,
+	0xfd, 0xce, 0x39, 0x73, 0xce, 0x1c, 0x83, 0xce, 0x90, 0x90, 0x61, 0x88, 0x4d, 0xe4, 0x33, 0x53,
+	0x98, 0x99, 0x35, 0x6a, 0x9b, 0x0c, 0xd3, 0x51, 0xe0, 0x61, 0x66, 0xe2, 0xdf, 0x38, 0x8e, 0x59,
+	0x40, 0x62, 0x77, 0x80, 0xb1, 0xef, 0x06, 0x1c, 0x47, 0x6e, 0xe1, 0x34, 0x12, 0x4a, 0x38, 0x81,
+	0x75, 0xf1, 0xa1, 0x81, 0x7c, 0x66, 0x8c, 0x19, 0xc6, 0xa8, 0x6d, 0x48, 0x46, 0x6d, 0xa7, 0x2c,
+	0x0a, 0xc5, 0x8c, 0xa4, 0xb4, 0x24, 0x8c, 0xc0, 0xd7, 0xbe, 0x90, 0x1f, 0x27, 0x81, 0x89, 0xe2,
+	0x98, 0x70, 0xc4, 0x03, 0x12, 0xb3, 0xc2, 0xfb, 0xf9, 0x94, 0xd7, 0x0b, 0x03, 0x1c, 0xf3, 0xc2,
+	0xb1, 0x39, 0xe5, 0x18, 0x04, 0x38, 0xf4, 0xdd, 0x0b, 0xfc, 0x0b, 0x1a, 0x05, 0x84, 0x16, 0x82,
+	0x22, 0x6d, 0x33, 0xff, 0x75, 0x91, 0x0e, 0x0a, 0x55, 0x84, 0xd8, 0xe5, 0x3d, 0x36, 0x4d, 0x3c,
+	0x93, 0x71, 0xc4, 0xd3, 0x22, 0xa8, 0xde, 0x03, 0xeb, 0x3d, 0xcc, 0xf7, 0x65, 0xca, 0x5d, 0x8c,
+	0xfd, 0x43, 0x8e, 0x23, 0x07, 0xff, 0x9a, 0x62, 0xc6, 0x61, 0x03, 0xac, 0xc9, 0xc2, 0xdc, 0x18,
+	0x45, 0x58, 0x53, 0xea, 0x4a, 0x63, 0xa5, 0x53, 0x79, 0x69, 0xab, 0xce, 0xaa, 0xf4, 0x1c, 0xa3,
+	0x08, 0xeb, 0x6f, 0x14, 0xb0, 0x79, 0x94, 0x72, 0xc4, 0xf1, 0x1c, 0x8c, 0x49, 0xda, 0x16, 0xa8,
+	0x7a, 0x29, 0xe3, 0x24, 0xc2, 0xd4, 0x0d, 0xfc, 0x69, 0x16, 0x90, 0xe7, 0x87, 0x3e, 0x44, 0x00,
+	0x90, 0x04, 0x53, 0x71, 0x37, 0x9a, 0x5a, 0xaf, 0x34, 0xaa, 0xad, 0x5d, 0x63, 0x51, 0x67, 0x8c,
+	0xb9, 0xb0, 0x27, 0x12, 0x52, 0x84, 0x98, 0x40, 0xe1, 0x57, 0xe0, 0xa3, 0x04, 0x51, 0x1e, 0xa0,
+	0xd0, 0x1d, 0xa0, 0x20, 0x4c, 0x29, 0xd6, 0x2a, 0x75, 0xa5, 0xf1, 0x81, 0xf3, 0x61, 0x71, 0xdc,
+	0x15, 0xa7, 0xf0, 0x4b, 0xb0, 0x36, 0x42, 0x61, 0xe0, 0x23, 0x8e, 0x5d, 0x12, 0x87, 0x57, 0xda,
+	0x52, 0x2e, 0x5b, 0x95, 0x87, 0x27, 0x71, 0x78, 0xa5, 0xff, 0xad, 0x82, 0x5a, 0x79, 0x74, 0xb8,
+	0x03, 0xaa, 0x69, 0x92, 0x13, 0xb2, 0x86, 0xe4, 0x84, 0x6a, 0xab, 0x26, 0x0b, 0x92, 0x3d, 0x33,
+	0xba, 0x59, 0xcf, 0x8e, 0x10, 0xbb, 0x74, 0x80, 0x90, 0x67, 0x36, 0x3c, 0x06, 0xcb, 0x1e, 0xc5,
+	0x88, 0x8b, 0x9b, 0xaf, 0xb6, 0xb6, 0x4b, 0x2f, 0x62, 0x3c, 0x80, 0xf3, 0x37, 0x71, 0xf0, 0x9e,
+	0x53, 0x50, 0x32, 0x9e, 0xa0, 0x6b, 0xea, 0xf3, 0x78, 0x82, 0x02, 0x35, 0xb0, 0x4c, 0x71, 0x44,
+	0x46, 0xe2, 0x02, 0x57, 0x32, 0x8f, 0xf8, 0xdd, 0xa9, 0x82, 0x95, 0xf1, 0x8d, 0xeb, 0xff, 0x29,
+	0xa0, 0x5e, 0x3e, 0x1d, 0x2c, 0x21, 0x31, 0xc3, 0xb0, 0x0b, 0x3e, 0xbd, 0xd7, 0x15, 0x17, 0x53,
+	0x4a, 0x68, 0x8e, 0xae, 0xb6, 0xa0, 0x4c, 0x95, 0x26, 0x9e, 0x71, 0x96, 0x0f, 0xb1, 0xf3, 0xf1,
+	0x6c, 0xbf, 0xf6, 0x33, 0x39, 0xfc, 0x11, 0xbc, 0x4f, 0x31, 0x4b, 0x43, 0x2e, 0xa7, 0xe7, 0xbb,
+	0xc5, 0xd3, 0x53, 0x92, 0x9c, 0x93, 0x73, 0x1c, 0xc9, 0xd3, 0xbf, 0x07, 0x1b, 0x8f, 0x2a, 0xb3,
+	0x81, 0x79, 0xe0, 0xc1, 0xcc, 0xbe, 0x95, 0xd6, 0x5f, 0x4b, 0x40, 0x9b, 0x03, 0x9c, 0x89, 0x54,
+	0xe0, 0x0b, 0x05, 0x7c, 0xf2, 0xd0, 0x93, 0x84, 0x7b, 0x8b, 0xab, 0x78, 0xe4, 0x29, 0xd7, 0x9e,
+	0xd4, 0x69, 0xfd, 0x87, 0x3b, 0x7b, 0xb6, 0xa0, 0xdf, 0xff, 0x7f, 0xf5, 0xa7, 0xfa, 0x0d, 0xdc,
+	0xce, 0x76, 0xde, 0xf5, 0x8c, 0x67, 0x4f, 0xbe, 0x61, 0x66, 0x36, 0x27, 0x4b, 0x70, 0xdc, 0x66,
+	0xb3, 0x79, 0x03, 0xdf, 0x2a, 0x40, 0x2b, 0x1b, 0x03, 0x68, 0x3f, 0xb9, 0x4b, 0x72, 0xc1, 0xd4,
+	0x3a, 0xcf, 0x41, 0x88, 0x29, 0xd4, 0x7f, 0xbe, 0xb3, 0x3f, 0x9b, 0xda, 0x52, 0x5f, 0x4f, 0xd6,
+	0x46, 0x5e, 0xfa, 0xae, 0xfe, 0x6d, 0x56, 0xfa, 0xa4, 0xd6, 0xeb, 0x29, 0xf1, 0x5e, 0xf3, 0xe6,
+	0x81, 0xca, 0xad, 0x28, 0x8f, 0x69, 0x29, 0xcd, 0xda, 0xfa, 0xad, 0xad, 0x4d, 0xf2, 0x2a, 0xac,
+	0x24, 0x60, 0x86, 0x47, 0xa2, 0xce, 0x1f, 0x2a, 0xd8, 0xf2, 0x48, 0xb4, 0xb0, 0x86, 0xce, 0x46,
+	0xd9, 0xf0, 0x9c, 0x66, 0xcb, 0xe4, 0x54, 0xf9, 0xe9, 0xa0, 0x40, 0x0c, 0x49, 0x88, 0xe2, 0xa1,
+	0x41, 0xe8, 0xd0, 0x1c, 0xe2, 0x38, 0x5f, 0x35, 0xe6, 0x24, 0x68, 0xf9, 0x5f, 0xe5, 0x8e, 0x34,
+	0xfe, 0x51, 0x2b, 0x3d, 0xdb, 0xfe, 0x57, 0xad, 0xf7, 0x04, 0xd0, 0xf6, 0x99, 0x21, 0xcc, 0xcc,
+	0x3a, 0x6f, 0x1b, 0x45, 0x60, 0x76, 0x2b, 0x25, 0x7d, 0xdb, 0x67, 0xfd, 0xb1, 0xa4, 0x7f, 0xde,
+	0xee, 0x4b, 0xc9, 0x6b, 0x75, 0x4b, 0x9c, 0x5b, 0x96, 0xed, 0x33, 0xcb, 0x1a, 0x8b, 0x2c, 0xeb,
+	0xbc, 0x6d, 0x59, 0x52, 0x76, 0xb1, 0x9c, 0xe7, 0xd9, 0x7e, 0x17, 0x00, 0x00, 0xff, 0xff, 0xb3,
+	0x40, 0x12, 0x4d, 0xd1, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ExtensionFeedItemServiceClient is the client API for ExtensionFeedItemService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ExtensionFeedItemServiceClient interface {
+	// Returns the requested extension feed item in full detail.
+	GetExtensionFeedItem(ctx context.Context, in *GetExtensionFeedItemRequest, opts ...grpc.CallOption) (*resources.ExtensionFeedItem, error)
+	// Creates, updates, or removes extension feed items. Operation
+	// statuses are returned.
+	MutateExtensionFeedItems(ctx context.Context, in *MutateExtensionFeedItemsRequest, opts ...grpc.CallOption) (*MutateExtensionFeedItemsResponse, error)
+}
+
+type extensionFeedItemServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewExtensionFeedItemServiceClient(cc grpc.ClientConnInterface) ExtensionFeedItemServiceClient {
+	return &extensionFeedItemServiceClient{cc}
+}
+
+func (c *extensionFeedItemServiceClient) GetExtensionFeedItem(ctx context.Context, in *GetExtensionFeedItemRequest, opts ...grpc.CallOption) (*resources.ExtensionFeedItem, error) {
+	out := new(resources.ExtensionFeedItem)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ExtensionFeedItemService/GetExtensionFeedItem", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *extensionFeedItemServiceClient) MutateExtensionFeedItems(ctx context.Context, in *MutateExtensionFeedItemsRequest, opts ...grpc.CallOption) (*MutateExtensionFeedItemsResponse, error) {
+	out := new(MutateExtensionFeedItemsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ExtensionFeedItemService/MutateExtensionFeedItems", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ExtensionFeedItemServiceServer is the server API for ExtensionFeedItemService service.
+type ExtensionFeedItemServiceServer interface {
+	// Returns the requested extension feed item in full detail.
+	GetExtensionFeedItem(context.Context, *GetExtensionFeedItemRequest) (*resources.ExtensionFeedItem, error)
+	// Creates, updates, or removes extension feed items. Operation
+	// statuses are returned.
+	MutateExtensionFeedItems(context.Context, *MutateExtensionFeedItemsRequest) (*MutateExtensionFeedItemsResponse, error)
+}
+
+// UnimplementedExtensionFeedItemServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedExtensionFeedItemServiceServer struct {
+}
+
+func (*UnimplementedExtensionFeedItemServiceServer) GetExtensionFeedItem(ctx context.Context, req *GetExtensionFeedItemRequest) (*resources.ExtensionFeedItem, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetExtensionFeedItem not implemented")
+}
+func (*UnimplementedExtensionFeedItemServiceServer) MutateExtensionFeedItems(ctx context.Context, req *MutateExtensionFeedItemsRequest) (*MutateExtensionFeedItemsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateExtensionFeedItems not implemented")
+}
+
+func RegisterExtensionFeedItemServiceServer(s *grpc.Server, srv ExtensionFeedItemServiceServer) {
+	s.RegisterService(&_ExtensionFeedItemService_serviceDesc, srv)
+}
+
+func _ExtensionFeedItemService_GetExtensionFeedItem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetExtensionFeedItemRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ExtensionFeedItemServiceServer).GetExtensionFeedItem(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ExtensionFeedItemService/GetExtensionFeedItem",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ExtensionFeedItemServiceServer).GetExtensionFeedItem(ctx, req.(*GetExtensionFeedItemRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ExtensionFeedItemService_MutateExtensionFeedItems_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateExtensionFeedItemsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ExtensionFeedItemServiceServer).MutateExtensionFeedItems(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ExtensionFeedItemService/MutateExtensionFeedItems",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ExtensionFeedItemServiceServer).MutateExtensionFeedItems(ctx, req.(*MutateExtensionFeedItemsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ExtensionFeedItemService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ExtensionFeedItemService",
+	HandlerType: (*ExtensionFeedItemServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetExtensionFeedItem",
+			Handler:    _ExtensionFeedItemService_GetExtensionFeedItem_Handler,
+		},
+		{
+			MethodName: "MutateExtensionFeedItems",
+			Handler:    _ExtensionFeedItemService_MutateExtensionFeedItems_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/extension_feed_item_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/feed_item_service.pb.go b/googleapis/ads/googleads/v3/services/feed_item_service.pb.go
new file mode 100644
index 0000000..99bd21a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/feed_item_service.pb.go
@@ -0,0 +1,530 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/feed_item_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [FeedItemService.GetFeedItem][google.ads.googleads.v3.services.FeedItemService.GetFeedItem].
+type GetFeedItemRequest struct {
+	// Required. The resource name of the feed item to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetFeedItemRequest) Reset()         { *m = GetFeedItemRequest{} }
+func (m *GetFeedItemRequest) String() string { return proto.CompactTextString(m) }
+func (*GetFeedItemRequest) ProtoMessage()    {}
+func (*GetFeedItemRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a2fe5829c243597, []int{0}
+}
+
+func (m *GetFeedItemRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetFeedItemRequest.Unmarshal(m, b)
+}
+func (m *GetFeedItemRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetFeedItemRequest.Marshal(b, m, deterministic)
+}
+func (m *GetFeedItemRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetFeedItemRequest.Merge(m, src)
+}
+func (m *GetFeedItemRequest) XXX_Size() int {
+	return xxx_messageInfo_GetFeedItemRequest.Size(m)
+}
+func (m *GetFeedItemRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetFeedItemRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetFeedItemRequest proto.InternalMessageInfo
+
+func (m *GetFeedItemRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [FeedItemService.MutateFeedItems][google.ads.googleads.v3.services.FeedItemService.MutateFeedItems].
+type MutateFeedItemsRequest struct {
+	// Required. The ID of the customer whose feed items are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual feed items.
+	Operations []*FeedItemOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateFeedItemsRequest) Reset()         { *m = MutateFeedItemsRequest{} }
+func (m *MutateFeedItemsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedItemsRequest) ProtoMessage()    {}
+func (*MutateFeedItemsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a2fe5829c243597, []int{1}
+}
+
+func (m *MutateFeedItemsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedItemsRequest.Unmarshal(m, b)
+}
+func (m *MutateFeedItemsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedItemsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedItemsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedItemsRequest.Merge(m, src)
+}
+func (m *MutateFeedItemsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedItemsRequest.Size(m)
+}
+func (m *MutateFeedItemsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedItemsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedItemsRequest proto.InternalMessageInfo
+
+func (m *MutateFeedItemsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateFeedItemsRequest) GetOperations() []*FeedItemOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateFeedItemsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateFeedItemsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on an feed item.
+type FeedItemOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*FeedItemOperation_Create
+	//	*FeedItemOperation_Update
+	//	*FeedItemOperation_Remove
+	Operation            isFeedItemOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *FeedItemOperation) Reset()         { *m = FeedItemOperation{} }
+func (m *FeedItemOperation) String() string { return proto.CompactTextString(m) }
+func (*FeedItemOperation) ProtoMessage()    {}
+func (*FeedItemOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a2fe5829c243597, []int{2}
+}
+
+func (m *FeedItemOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemOperation.Unmarshal(m, b)
+}
+func (m *FeedItemOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemOperation.Marshal(b, m, deterministic)
+}
+func (m *FeedItemOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemOperation.Merge(m, src)
+}
+func (m *FeedItemOperation) XXX_Size() int {
+	return xxx_messageInfo_FeedItemOperation.Size(m)
+}
+func (m *FeedItemOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemOperation proto.InternalMessageInfo
+
+func (m *FeedItemOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isFeedItemOperation_Operation interface {
+	isFeedItemOperation_Operation()
+}
+
+type FeedItemOperation_Create struct {
+	Create *resources.FeedItem `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type FeedItemOperation_Update struct {
+	Update *resources.FeedItem `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type FeedItemOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*FeedItemOperation_Create) isFeedItemOperation_Operation() {}
+
+func (*FeedItemOperation_Update) isFeedItemOperation_Operation() {}
+
+func (*FeedItemOperation_Remove) isFeedItemOperation_Operation() {}
+
+func (m *FeedItemOperation) GetOperation() isFeedItemOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *FeedItemOperation) GetCreate() *resources.FeedItem {
+	if x, ok := m.GetOperation().(*FeedItemOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *FeedItemOperation) GetUpdate() *resources.FeedItem {
+	if x, ok := m.GetOperation().(*FeedItemOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *FeedItemOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*FeedItemOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*FeedItemOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*FeedItemOperation_Create)(nil),
+		(*FeedItemOperation_Update)(nil),
+		(*FeedItemOperation_Remove)(nil),
+	}
+}
+
+// Response message for an feed item mutate.
+type MutateFeedItemsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateFeedItemResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *MutateFeedItemsResponse) Reset()         { *m = MutateFeedItemsResponse{} }
+func (m *MutateFeedItemsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedItemsResponse) ProtoMessage()    {}
+func (*MutateFeedItemsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a2fe5829c243597, []int{3}
+}
+
+func (m *MutateFeedItemsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedItemsResponse.Unmarshal(m, b)
+}
+func (m *MutateFeedItemsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedItemsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedItemsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedItemsResponse.Merge(m, src)
+}
+func (m *MutateFeedItemsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedItemsResponse.Size(m)
+}
+func (m *MutateFeedItemsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedItemsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedItemsResponse proto.InternalMessageInfo
+
+func (m *MutateFeedItemsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateFeedItemsResponse) GetResults() []*MutateFeedItemResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the feed item mutate.
+type MutateFeedItemResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateFeedItemResult) Reset()         { *m = MutateFeedItemResult{} }
+func (m *MutateFeedItemResult) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedItemResult) ProtoMessage()    {}
+func (*MutateFeedItemResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1a2fe5829c243597, []int{4}
+}
+
+func (m *MutateFeedItemResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedItemResult.Unmarshal(m, b)
+}
+func (m *MutateFeedItemResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedItemResult.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedItemResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedItemResult.Merge(m, src)
+}
+func (m *MutateFeedItemResult) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedItemResult.Size(m)
+}
+func (m *MutateFeedItemResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedItemResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedItemResult proto.InternalMessageInfo
+
+func (m *MutateFeedItemResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetFeedItemRequest)(nil), "google.ads.googleads.v3.services.GetFeedItemRequest")
+	proto.RegisterType((*MutateFeedItemsRequest)(nil), "google.ads.googleads.v3.services.MutateFeedItemsRequest")
+	proto.RegisterType((*FeedItemOperation)(nil), "google.ads.googleads.v3.services.FeedItemOperation")
+	proto.RegisterType((*MutateFeedItemsResponse)(nil), "google.ads.googleads.v3.services.MutateFeedItemsResponse")
+	proto.RegisterType((*MutateFeedItemResult)(nil), "google.ads.googleads.v3.services.MutateFeedItemResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/feed_item_service.proto", fileDescriptor_1a2fe5829c243597)
+}
+
+var fileDescriptor_1a2fe5829c243597 = []byte{
+	// 759 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4d, 0x6b, 0xdc, 0x46,
+	0x18, 0xae, 0xb4, 0xc5, 0xad, 0x47, 0x76, 0x4d, 0xa7, 0xae, 0xbd, 0x6c, 0x0b, 0x5d, 0x54, 0x43,
+	0x97, 0x75, 0x2b, 0xd1, 0x55, 0x29, 0x8e, 0x8c, 0x03, 0xda, 0xe0, 0xb5, 0x7d, 0x70, 0x6c, 0x64,
+	0x30, 0x21, 0x2c, 0x88, 0xb1, 0x34, 0xbb, 0x11, 0x96, 0x34, 0xca, 0xcc, 0x68, 0xc1, 0x18, 0x5f,
+	0x02, 0xf9, 0x05, 0xf9, 0x07, 0x39, 0xe6, 0x1a, 0xf2, 0x0b, 0x72, 0xf3, 0x35, 0x37, 0x9f, 0x72,
+	0x08, 0x39, 0xe4, 0x2f, 0xe4, 0x12, 0xa4, 0xd1, 0xec, 0x97, 0x6d, 0x16, 0xfb, 0xf6, 0xee, 0xbc,
+	0xcf, 0xf3, 0xbc, 0xdf, 0x5a, 0xb0, 0xd1, 0x27, 0xa4, 0x1f, 0x61, 0x13, 0x05, 0xcc, 0x14, 0x66,
+	0x6e, 0x0d, 0x2c, 0x93, 0x61, 0x3a, 0x08, 0x7d, 0xcc, 0xcc, 0x1e, 0xc6, 0x81, 0x17, 0x72, 0x1c,
+	0x7b, 0xe5, 0x93, 0x91, 0x52, 0xc2, 0x09, 0xac, 0x0b, 0xb8, 0x81, 0x02, 0x66, 0x0c, 0x99, 0xc6,
+	0xc0, 0x32, 0x24, 0xb3, 0xf6, 0xef, 0x6d, 0xda, 0x14, 0x33, 0x92, 0xd1, 0x09, 0x71, 0x21, 0x5a,
+	0xfb, 0x5d, 0x52, 0xd2, 0xd0, 0x44, 0x49, 0x42, 0x38, 0xe2, 0x21, 0x49, 0x58, 0xe9, 0x5d, 0x1d,
+	0xf3, 0xfa, 0x51, 0x88, 0x13, 0x5e, 0x3a, 0xfe, 0x18, 0x73, 0xf4, 0x42, 0x1c, 0x05, 0xde, 0x09,
+	0x7e, 0x86, 0x06, 0x21, 0xa1, 0x25, 0xa0, 0x4c, 0xd6, 0x2c, 0x7e, 0x9d, 0x64, 0xbd, 0x12, 0x15,
+	0x23, 0x76, 0x3a, 0xa5, 0x4d, 0x53, 0xdf, 0x64, 0x1c, 0xf1, 0xac, 0x0c, 0xaa, 0x3f, 0x04, 0x70,
+	0x07, 0xf3, 0x0e, 0xc6, 0xc1, 0x1e, 0xc7, 0xb1, 0x8b, 0x9f, 0x67, 0x98, 0x71, 0xd8, 0x00, 0x8b,
+	0xb2, 0x0a, 0x2f, 0x41, 0x31, 0xae, 0x2a, 0x75, 0xa5, 0x31, 0xdf, 0xae, 0x7c, 0x74, 0x54, 0x77,
+	0x41, 0x7a, 0x1e, 0xa3, 0x18, 0xeb, 0x9f, 0x15, 0xb0, 0xb2, 0x9f, 0x71, 0xc4, 0xb1, 0xd4, 0x60,
+	0x52, 0x64, 0x0d, 0x68, 0x7e, 0xc6, 0x38, 0x89, 0x31, 0xf5, 0xc2, 0x60, 0x5c, 0x02, 0xc8, 0xf7,
+	0xbd, 0x00, 0x3e, 0x01, 0x80, 0xa4, 0x98, 0x8a, 0x4e, 0x54, 0xd5, 0x7a, 0xa5, 0xa1, 0xb5, 0x2c,
+	0x63, 0x56, 0xf7, 0x0d, 0x19, 0xed, 0x40, 0x72, 0x4b, 0xe5, 0x91, 0x16, 0xfc, 0x0b, 0x2c, 0xa5,
+	0x88, 0xf2, 0x10, 0x45, 0x5e, 0x0f, 0x85, 0x51, 0x46, 0x71, 0xb5, 0x52, 0x57, 0x1a, 0x3f, 0xba,
+	0x3f, 0x95, 0xcf, 0x1d, 0xf1, 0x0a, 0xff, 0x04, 0x8b, 0x03, 0x14, 0x85, 0x01, 0xe2, 0xd8, 0x23,
+	0x49, 0x74, 0x56, 0xfd, 0xbe, 0x80, 0x2d, 0xc8, 0xc7, 0x83, 0x24, 0x3a, 0xd3, 0x5f, 0xaa, 0xe0,
+	0xe7, 0x6b, 0x41, 0xe1, 0x26, 0xd0, 0xb2, 0xb4, 0x20, 0xe6, 0xcd, 0x2e, 0x88, 0x5a, 0xab, 0x26,
+	0xd3, 0x97, 0xf3, 0x30, 0x3a, 0xf9, 0x3c, 0xf6, 0x11, 0x3b, 0x75, 0x81, 0x80, 0xe7, 0x36, 0xdc,
+	0x06, 0x73, 0x3e, 0xc5, 0x88, 0x8b, 0xf6, 0x6a, 0xad, 0xf5, 0x5b, 0xcb, 0x1e, 0xae, 0xd4, 0xb0,
+	0xee, 0xdd, 0xef, 0xdc, 0x92, 0x9c, 0xcb, 0x08, 0xd1, 0xaa, 0x7a, 0x2f, 0x19, 0x41, 0x86, 0x55,
+	0x30, 0x47, 0x71, 0x4c, 0x06, 0xa2, 0x4b, 0xf3, 0xb9, 0x47, 0xfc, 0x6e, 0x6b, 0x60, 0x7e, 0xd8,
+	0x56, 0xfd, 0xad, 0x02, 0x56, 0xaf, 0x0d, 0x9c, 0xa5, 0x24, 0x61, 0x18, 0x76, 0xc0, 0xaf, 0x53,
+	0x1d, 0xf7, 0x30, 0xa5, 0x84, 0x16, 0x8a, 0x5a, 0x0b, 0xca, 0xc4, 0x68, 0xea, 0x1b, 0x47, 0xc5,
+	0x16, 0xba, 0xbf, 0x4c, 0xce, 0x62, 0x3b, 0x87, 0xc3, 0x43, 0xf0, 0x03, 0xc5, 0x2c, 0x8b, 0xb8,
+	0x5c, 0x88, 0xff, 0x67, 0x2f, 0xc4, 0x64, 0x4e, 0x6e, 0x41, 0x77, 0xa5, 0x8c, 0xbe, 0x09, 0x96,
+	0x6f, 0x02, 0xe4, 0xa3, 0xbf, 0x61, 0xd1, 0x27, 0x77, 0xbc, 0xf5, 0xbe, 0x02, 0x96, 0x24, 0xef,
+	0x48, 0xc4, 0x83, 0xef, 0x14, 0xa0, 0x8d, 0x1d, 0x0e, 0xfc, 0x6f, 0x76, 0x86, 0xd7, 0xef, 0xac,
+	0x76, 0x97, 0x51, 0xe9, 0x8f, 0xae, 0x9c, 0xc9, 0x64, 0x5f, 0x7c, 0xf8, 0xf4, 0x4a, 0xfd, 0x07,
+	0xae, 0xe7, 0x1f, 0x9d, 0xf3, 0x09, 0xcf, 0x96, 0x3c, 0x30, 0x66, 0x36, 0x8b, 0xaf, 0x50, 0x31,
+	0x27, 0xb3, 0x79, 0x01, 0xaf, 0x14, 0xb0, 0x34, 0x35, 0x3e, 0xb8, 0x71, 0xd7, 0xee, 0xca, 0x13,
+	0xaf, 0x3d, 0xb8, 0x07, 0x53, 0xec, 0x8a, 0xee, 0x5e, 0x39, 0x2b, 0x63, 0x9f, 0x87, 0xbf, 0x47,
+	0x87, 0x5b, 0x94, 0x65, 0xe9, 0x46, 0x5e, 0xd6, 0xa8, 0x8e, 0xf3, 0x31, 0xf0, 0x56, 0xf3, 0x62,
+	0x54, 0x95, 0x1d, 0x17, 0x11, 0x6c, 0xa5, 0x59, 0xfb, 0xed, 0xd2, 0xa9, 0x8e, 0xb2, 0x28, 0xad,
+	0x34, 0x64, 0x86, 0x4f, 0xe2, 0xf6, 0x57, 0x05, 0xac, 0xf9, 0x24, 0x9e, 0x99, 0x71, 0x7b, 0x79,
+	0x6a, 0xd6, 0x87, 0xf9, 0x15, 0x1f, 0x2a, 0x4f, 0x77, 0x4b, 0x66, 0x9f, 0x44, 0x28, 0xe9, 0x1b,
+	0x84, 0xf6, 0xcd, 0x3e, 0x4e, 0x8a, 0x1b, 0x37, 0x47, 0xb1, 0x6e, 0xff, 0xaf, 0xd9, 0x94, 0xc6,
+	0x6b, 0xb5, 0xb2, 0xe3, 0x38, 0x6f, 0xd4, 0xfa, 0x8e, 0x10, 0x74, 0x02, 0x66, 0x08, 0x33, 0xb7,
+	0x8e, 0x2d, 0xa3, 0x0c, 0xcc, 0x2e, 0x25, 0xa4, 0xeb, 0x04, 0xac, 0x3b, 0x84, 0x74, 0x8f, 0xad,
+	0xae, 0x84, 0x7c, 0x51, 0xd7, 0xc4, 0xbb, 0x6d, 0x3b, 0x01, 0xb3, 0xed, 0x21, 0xc8, 0xb6, 0x8f,
+	0x2d, 0xdb, 0x96, 0xb0, 0x93, 0xb9, 0x22, 0x4f, 0xeb, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe,
+	0x87, 0xfe, 0x4a, 0x12, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// FeedItemServiceClient is the client API for FeedItemService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type FeedItemServiceClient interface {
+	// Returns the requested feed item in full detail.
+	GetFeedItem(ctx context.Context, in *GetFeedItemRequest, opts ...grpc.CallOption) (*resources.FeedItem, error)
+	// Creates, updates, or removes feed items. Operation statuses are
+	// returned.
+	MutateFeedItems(ctx context.Context, in *MutateFeedItemsRequest, opts ...grpc.CallOption) (*MutateFeedItemsResponse, error)
+}
+
+type feedItemServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewFeedItemServiceClient(cc grpc.ClientConnInterface) FeedItemServiceClient {
+	return &feedItemServiceClient{cc}
+}
+
+func (c *feedItemServiceClient) GetFeedItem(ctx context.Context, in *GetFeedItemRequest, opts ...grpc.CallOption) (*resources.FeedItem, error) {
+	out := new(resources.FeedItem)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.FeedItemService/GetFeedItem", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *feedItemServiceClient) MutateFeedItems(ctx context.Context, in *MutateFeedItemsRequest, opts ...grpc.CallOption) (*MutateFeedItemsResponse, error) {
+	out := new(MutateFeedItemsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.FeedItemService/MutateFeedItems", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// FeedItemServiceServer is the server API for FeedItemService service.
+type FeedItemServiceServer interface {
+	// Returns the requested feed item in full detail.
+	GetFeedItem(context.Context, *GetFeedItemRequest) (*resources.FeedItem, error)
+	// Creates, updates, or removes feed items. Operation statuses are
+	// returned.
+	MutateFeedItems(context.Context, *MutateFeedItemsRequest) (*MutateFeedItemsResponse, error)
+}
+
+// UnimplementedFeedItemServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedFeedItemServiceServer struct {
+}
+
+func (*UnimplementedFeedItemServiceServer) GetFeedItem(ctx context.Context, req *GetFeedItemRequest) (*resources.FeedItem, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetFeedItem not implemented")
+}
+func (*UnimplementedFeedItemServiceServer) MutateFeedItems(ctx context.Context, req *MutateFeedItemsRequest) (*MutateFeedItemsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateFeedItems not implemented")
+}
+
+func RegisterFeedItemServiceServer(s *grpc.Server, srv FeedItemServiceServer) {
+	s.RegisterService(&_FeedItemService_serviceDesc, srv)
+}
+
+func _FeedItemService_GetFeedItem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetFeedItemRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FeedItemServiceServer).GetFeedItem(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.FeedItemService/GetFeedItem",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FeedItemServiceServer).GetFeedItem(ctx, req.(*GetFeedItemRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _FeedItemService_MutateFeedItems_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateFeedItemsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FeedItemServiceServer).MutateFeedItems(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.FeedItemService/MutateFeedItems",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FeedItemServiceServer).MutateFeedItems(ctx, req.(*MutateFeedItemsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _FeedItemService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.FeedItemService",
+	HandlerType: (*FeedItemServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetFeedItem",
+			Handler:    _FeedItemService_GetFeedItem_Handler,
+		},
+		{
+			MethodName: "MutateFeedItems",
+			Handler:    _FeedItemService_MutateFeedItems_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/feed_item_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/feed_item_target_service.pb.go b/googleapis/ads/googleads/v3/services/feed_item_target_service.pb.go
new file mode 100644
index 0000000..ca3c11d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/feed_item_target_service.pb.go
@@ -0,0 +1,459 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/feed_item_target_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [FeedItemTargetService.GetFeedItemTarget][google.ads.googleads.v3.services.FeedItemTargetService.GetFeedItemTarget].
+type GetFeedItemTargetRequest struct {
+	// Required. The resource name of the feed item targets to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetFeedItemTargetRequest) Reset()         { *m = GetFeedItemTargetRequest{} }
+func (m *GetFeedItemTargetRequest) String() string { return proto.CompactTextString(m) }
+func (*GetFeedItemTargetRequest) ProtoMessage()    {}
+func (*GetFeedItemTargetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aae52ecf2ca0ddf4, []int{0}
+}
+
+func (m *GetFeedItemTargetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetFeedItemTargetRequest.Unmarshal(m, b)
+}
+func (m *GetFeedItemTargetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetFeedItemTargetRequest.Marshal(b, m, deterministic)
+}
+func (m *GetFeedItemTargetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetFeedItemTargetRequest.Merge(m, src)
+}
+func (m *GetFeedItemTargetRequest) XXX_Size() int {
+	return xxx_messageInfo_GetFeedItemTargetRequest.Size(m)
+}
+func (m *GetFeedItemTargetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetFeedItemTargetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetFeedItemTargetRequest proto.InternalMessageInfo
+
+func (m *GetFeedItemTargetRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [FeedItemTargetService.MutateFeedItemTargets][google.ads.googleads.v3.services.FeedItemTargetService.MutateFeedItemTargets].
+type MutateFeedItemTargetsRequest struct {
+	// Required. The ID of the customer whose feed item targets are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual feed item targets.
+	Operations           []*FeedItemTargetOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *MutateFeedItemTargetsRequest) Reset()         { *m = MutateFeedItemTargetsRequest{} }
+func (m *MutateFeedItemTargetsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedItemTargetsRequest) ProtoMessage()    {}
+func (*MutateFeedItemTargetsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aae52ecf2ca0ddf4, []int{1}
+}
+
+func (m *MutateFeedItemTargetsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedItemTargetsRequest.Unmarshal(m, b)
+}
+func (m *MutateFeedItemTargetsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedItemTargetsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedItemTargetsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedItemTargetsRequest.Merge(m, src)
+}
+func (m *MutateFeedItemTargetsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedItemTargetsRequest.Size(m)
+}
+func (m *MutateFeedItemTargetsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedItemTargetsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedItemTargetsRequest proto.InternalMessageInfo
+
+func (m *MutateFeedItemTargetsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateFeedItemTargetsRequest) GetOperations() []*FeedItemTargetOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+// A single operation (create, remove) on an feed item target.
+type FeedItemTargetOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*FeedItemTargetOperation_Create
+	//	*FeedItemTargetOperation_Remove
+	Operation            isFeedItemTargetOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
+	XXX_unrecognized     []byte                              `json:"-"`
+	XXX_sizecache        int32                               `json:"-"`
+}
+
+func (m *FeedItemTargetOperation) Reset()         { *m = FeedItemTargetOperation{} }
+func (m *FeedItemTargetOperation) String() string { return proto.CompactTextString(m) }
+func (*FeedItemTargetOperation) ProtoMessage()    {}
+func (*FeedItemTargetOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aae52ecf2ca0ddf4, []int{2}
+}
+
+func (m *FeedItemTargetOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedItemTargetOperation.Unmarshal(m, b)
+}
+func (m *FeedItemTargetOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedItemTargetOperation.Marshal(b, m, deterministic)
+}
+func (m *FeedItemTargetOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedItemTargetOperation.Merge(m, src)
+}
+func (m *FeedItemTargetOperation) XXX_Size() int {
+	return xxx_messageInfo_FeedItemTargetOperation.Size(m)
+}
+func (m *FeedItemTargetOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedItemTargetOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedItemTargetOperation proto.InternalMessageInfo
+
+type isFeedItemTargetOperation_Operation interface {
+	isFeedItemTargetOperation_Operation()
+}
+
+type FeedItemTargetOperation_Create struct {
+	Create *resources.FeedItemTarget `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type FeedItemTargetOperation_Remove struct {
+	Remove string `protobuf:"bytes,2,opt,name=remove,proto3,oneof"`
+}
+
+func (*FeedItemTargetOperation_Create) isFeedItemTargetOperation_Operation() {}
+
+func (*FeedItemTargetOperation_Remove) isFeedItemTargetOperation_Operation() {}
+
+func (m *FeedItemTargetOperation) GetOperation() isFeedItemTargetOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *FeedItemTargetOperation) GetCreate() *resources.FeedItemTarget {
+	if x, ok := m.GetOperation().(*FeedItemTargetOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *FeedItemTargetOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*FeedItemTargetOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*FeedItemTargetOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*FeedItemTargetOperation_Create)(nil),
+		(*FeedItemTargetOperation_Remove)(nil),
+	}
+}
+
+// Response message for an feed item target mutate.
+type MutateFeedItemTargetsResponse struct {
+	// All results for the mutate.
+	Results              []*MutateFeedItemTargetResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *MutateFeedItemTargetsResponse) Reset()         { *m = MutateFeedItemTargetsResponse{} }
+func (m *MutateFeedItemTargetsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedItemTargetsResponse) ProtoMessage()    {}
+func (*MutateFeedItemTargetsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aae52ecf2ca0ddf4, []int{3}
+}
+
+func (m *MutateFeedItemTargetsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedItemTargetsResponse.Unmarshal(m, b)
+}
+func (m *MutateFeedItemTargetsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedItemTargetsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedItemTargetsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedItemTargetsResponse.Merge(m, src)
+}
+func (m *MutateFeedItemTargetsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedItemTargetsResponse.Size(m)
+}
+func (m *MutateFeedItemTargetsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedItemTargetsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedItemTargetsResponse proto.InternalMessageInfo
+
+func (m *MutateFeedItemTargetsResponse) GetResults() []*MutateFeedItemTargetResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the feed item target mutate.
+type MutateFeedItemTargetResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateFeedItemTargetResult) Reset()         { *m = MutateFeedItemTargetResult{} }
+func (m *MutateFeedItemTargetResult) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedItemTargetResult) ProtoMessage()    {}
+func (*MutateFeedItemTargetResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aae52ecf2ca0ddf4, []int{4}
+}
+
+func (m *MutateFeedItemTargetResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedItemTargetResult.Unmarshal(m, b)
+}
+func (m *MutateFeedItemTargetResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedItemTargetResult.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedItemTargetResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedItemTargetResult.Merge(m, src)
+}
+func (m *MutateFeedItemTargetResult) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedItemTargetResult.Size(m)
+}
+func (m *MutateFeedItemTargetResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedItemTargetResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedItemTargetResult proto.InternalMessageInfo
+
+func (m *MutateFeedItemTargetResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetFeedItemTargetRequest)(nil), "google.ads.googleads.v3.services.GetFeedItemTargetRequest")
+	proto.RegisterType((*MutateFeedItemTargetsRequest)(nil), "google.ads.googleads.v3.services.MutateFeedItemTargetsRequest")
+	proto.RegisterType((*FeedItemTargetOperation)(nil), "google.ads.googleads.v3.services.FeedItemTargetOperation")
+	proto.RegisterType((*MutateFeedItemTargetsResponse)(nil), "google.ads.googleads.v3.services.MutateFeedItemTargetsResponse")
+	proto.RegisterType((*MutateFeedItemTargetResult)(nil), "google.ads.googleads.v3.services.MutateFeedItemTargetResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/feed_item_target_service.proto", fileDescriptor_aae52ecf2ca0ddf4)
+}
+
+var fileDescriptor_aae52ecf2ca0ddf4 = []byte{
+	// 623 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xb1, 0x6f, 0xd3, 0x4e,
+	0x14, 0xfe, 0xd9, 0x91, 0xfa, 0x53, 0x2f, 0x30, 0x70, 0x52, 0xa9, 0x65, 0x8a, 0x88, 0x4c, 0x87,
+	0x2a, 0x42, 0xb6, 0x5a, 0x33, 0x50, 0x43, 0xa9, 0x1c, 0x21, 0xda, 0x08, 0x01, 0x55, 0x40, 0x11,
+	0x42, 0x11, 0x96, 0x6b, 0xbf, 0x1a, 0x4b, 0xb1, 0x2f, 0xdc, 0x5d, 0xc2, 0x50, 0x75, 0x80, 0x9d,
+	0x89, 0xff, 0x00, 0x31, 0xf1, 0xa7, 0x54, 0x62, 0x62, 0xeb, 0xc4, 0xc0, 0xc4, 0xc8, 0xc6, 0x86,
+	0xec, 0xf3, 0x25, 0x76, 0x89, 0x15, 0xd1, 0xed, 0xd9, 0xef, 0x7b, 0xdf, 0xf7, 0xbe, 0x7b, 0xef,
+	0x0e, 0xed, 0x46, 0x84, 0x44, 0x43, 0xb0, 0xfc, 0x90, 0x59, 0x22, 0xcc, 0xa2, 0x89, 0x6d, 0x31,
+	0xa0, 0x93, 0x38, 0x00, 0x66, 0x1d, 0x01, 0x84, 0x5e, 0xcc, 0x21, 0xf1, 0xb8, 0x4f, 0x23, 0xe0,
+	0x5e, 0x91, 0x31, 0x47, 0x94, 0x70, 0x82, 0x5b, 0xa2, 0xca, 0xf4, 0x43, 0x66, 0x4e, 0x09, 0xcc,
+	0x89, 0x6d, 0x4a, 0x02, 0xfd, 0x4e, 0x9d, 0x04, 0x05, 0x46, 0xc6, 0x74, 0x9e, 0x86, 0xe0, 0xd6,
+	0xd7, 0x64, 0xe5, 0x28, 0xb6, 0xfc, 0x34, 0x25, 0xdc, 0xe7, 0x31, 0x49, 0x59, 0x91, 0x5d, 0x2d,
+	0x65, 0x83, 0x61, 0x0c, 0xa9, 0x2c, 0xbb, 0x51, 0x4a, 0x1c, 0xc5, 0x30, 0x0c, 0xbd, 0x43, 0x78,
+	0xed, 0x4f, 0x62, 0x42, 0x05, 0xc0, 0x78, 0x80, 0xb4, 0x3d, 0xe0, 0x0f, 0x01, 0xc2, 0x2e, 0x87,
+	0xe4, 0x79, 0x2e, 0xd9, 0x83, 0x37, 0x63, 0x60, 0x1c, 0x6f, 0xa0, 0xcb, 0xb2, 0x2f, 0x2f, 0xf5,
+	0x13, 0xd0, 0x94, 0x96, 0xb2, 0xb1, 0xdc, 0x69, 0x7c, 0x77, 0xd5, 0xde, 0x25, 0x99, 0x79, 0xe2,
+	0x27, 0x60, 0x7c, 0x56, 0xd0, 0xda, 0xe3, 0x31, 0xf7, 0x39, 0x54, 0x99, 0x98, 0xa4, 0x5a, 0x47,
+	0xcd, 0x60, 0xcc, 0x38, 0x49, 0x80, 0x7a, 0x71, 0x58, 0x26, 0x42, 0xf2, 0x7f, 0x37, 0xc4, 0xaf,
+	0x10, 0x22, 0x23, 0xa0, 0xc2, 0x9a, 0xa6, 0xb6, 0x1a, 0x1b, 0xcd, 0xad, 0x6d, 0x73, 0xd1, 0xa9,
+	0x9a, 0x55, 0xcd, 0xa7, 0x92, 0xa1, 0xe0, 0x9f, 0x31, 0x1a, 0x1f, 0x14, 0xb4, 0x5a, 0x03, 0xc6,
+	0x8f, 0xd0, 0x52, 0x40, 0xc1, 0xe7, 0xc2, 0x65, 0x73, 0x6b, 0xb3, 0x56, 0x77, 0x3a, 0xab, 0x73,
+	0xc2, 0xfb, 0xff, 0xf5, 0x0a, 0x0a, 0xac, 0xa1, 0x25, 0x0a, 0x09, 0x99, 0x80, 0xa6, 0x66, 0x4e,
+	0xb3, 0x8c, 0xf8, 0xee, 0x34, 0xd1, 0xf2, 0xb4, 0x21, 0xe3, 0x2d, 0xba, 0x5e, 0x73, 0x6a, 0x6c,
+	0x44, 0x52, 0x06, 0xb8, 0x8f, 0xfe, 0xa7, 0xc0, 0xc6, 0x43, 0x2e, 0x4f, 0xe3, 0xde, 0xe2, 0xd3,
+	0x98, 0xc7, 0xd8, 0xcb, 0x49, 0x7a, 0x92, 0xcc, 0x70, 0x91, 0x5e, 0x0f, 0xc3, 0x37, 0xe7, 0xce,
+	0xbd, 0x3a, 0xf2, 0xad, 0xdf, 0x0d, 0xb4, 0x52, 0xad, 0x7e, 0x26, 0x3a, 0xc0, 0x5f, 0x15, 0x74,
+	0xe5, 0xaf, 0x9d, 0xc2, 0xce, 0xe2, 0xce, 0xeb, 0x16, 0x51, 0xff, 0xf7, 0x59, 0x18, 0xdd, 0x33,
+	0xb7, 0x6a, 0xe2, 0xfd, 0xb7, 0x1f, 0x1f, 0x55, 0x1b, 0x6f, 0x66, 0xb7, 0xed, 0xb8, 0x92, 0xd9,
+	0x91, 0x1b, 0xc8, 0xac, 0x76, 0x7e, 0xfd, 0x4a, 0x93, 0xb0, 0xda, 0x27, 0xf8, 0x97, 0x82, 0x56,
+	0xe6, 0x8e, 0x09, 0xdf, 0xbf, 0xd8, 0x34, 0xe4, 0xad, 0xd0, 0x77, 0x2f, 0x5c, 0x2f, 0xf6, 0xc3,
+	0x78, 0x71, 0xe6, 0x5e, 0x2d, 0xdd, 0xab, 0x5b, 0xb3, 0x5d, 0xcf, 0xed, 0x6e, 0x1b, 0xb7, 0x33,
+	0xbb, 0x33, 0x7f, 0xc7, 0x25, 0xf0, 0x4e, 0xfb, 0xe4, 0xbc, 0x5b, 0x27, 0xc9, 0xd5, 0x1c, 0xa5,
+	0xad, 0x5f, 0x3b, 0x75, 0xb5, 0x59, 0x47, 0x45, 0x34, 0x8a, 0x99, 0x19, 0x90, 0xa4, 0xf3, 0x4e,
+	0x45, 0xeb, 0x01, 0x49, 0x16, 0x76, 0xdf, 0xd1, 0xe7, 0x6e, 0xc8, 0x41, 0xf6, 0xf2, 0x1c, 0x28,
+	0x2f, 0xf7, 0x8b, 0xfa, 0x88, 0x0c, 0xfd, 0x34, 0x32, 0x09, 0x8d, 0xac, 0x08, 0xd2, 0xfc, 0x5d,
+	0xb2, 0x66, 0x8a, 0xf5, 0xef, 0xf1, 0x5d, 0x19, 0x7c, 0x52, 0x1b, 0x7b, 0xae, 0xfb, 0x45, 0x6d,
+	0xed, 0x09, 0x42, 0x37, 0x64, 0xa6, 0x08, 0xb3, 0xa8, 0x6f, 0x9b, 0x85, 0x30, 0x3b, 0x95, 0x90,
+	0x81, 0x1b, 0xb2, 0xc1, 0x14, 0x32, 0xe8, 0xdb, 0x03, 0x09, 0xf9, 0xa9, 0xae, 0x8b, 0xff, 0x8e,
+	0xe3, 0x86, 0xcc, 0x71, 0xa6, 0x20, 0xc7, 0xe9, 0xdb, 0x8e, 0x23, 0x61, 0x87, 0x4b, 0x79, 0x9f,
+	0xf6, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x99, 0x51, 0xef, 0x36, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// FeedItemTargetServiceClient is the client API for FeedItemTargetService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type FeedItemTargetServiceClient interface {
+	// Returns the requested feed item targets in full detail.
+	GetFeedItemTarget(ctx context.Context, in *GetFeedItemTargetRequest, opts ...grpc.CallOption) (*resources.FeedItemTarget, error)
+	// Creates or removes feed item targets. Operation statuses are returned.
+	MutateFeedItemTargets(ctx context.Context, in *MutateFeedItemTargetsRequest, opts ...grpc.CallOption) (*MutateFeedItemTargetsResponse, error)
+}
+
+type feedItemTargetServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewFeedItemTargetServiceClient(cc grpc.ClientConnInterface) FeedItemTargetServiceClient {
+	return &feedItemTargetServiceClient{cc}
+}
+
+func (c *feedItemTargetServiceClient) GetFeedItemTarget(ctx context.Context, in *GetFeedItemTargetRequest, opts ...grpc.CallOption) (*resources.FeedItemTarget, error) {
+	out := new(resources.FeedItemTarget)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.FeedItemTargetService/GetFeedItemTarget", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *feedItemTargetServiceClient) MutateFeedItemTargets(ctx context.Context, in *MutateFeedItemTargetsRequest, opts ...grpc.CallOption) (*MutateFeedItemTargetsResponse, error) {
+	out := new(MutateFeedItemTargetsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.FeedItemTargetService/MutateFeedItemTargets", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// FeedItemTargetServiceServer is the server API for FeedItemTargetService service.
+type FeedItemTargetServiceServer interface {
+	// Returns the requested feed item targets in full detail.
+	GetFeedItemTarget(context.Context, *GetFeedItemTargetRequest) (*resources.FeedItemTarget, error)
+	// Creates or removes feed item targets. Operation statuses are returned.
+	MutateFeedItemTargets(context.Context, *MutateFeedItemTargetsRequest) (*MutateFeedItemTargetsResponse, error)
+}
+
+// UnimplementedFeedItemTargetServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedFeedItemTargetServiceServer struct {
+}
+
+func (*UnimplementedFeedItemTargetServiceServer) GetFeedItemTarget(ctx context.Context, req *GetFeedItemTargetRequest) (*resources.FeedItemTarget, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetFeedItemTarget not implemented")
+}
+func (*UnimplementedFeedItemTargetServiceServer) MutateFeedItemTargets(ctx context.Context, req *MutateFeedItemTargetsRequest) (*MutateFeedItemTargetsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateFeedItemTargets not implemented")
+}
+
+func RegisterFeedItemTargetServiceServer(s *grpc.Server, srv FeedItemTargetServiceServer) {
+	s.RegisterService(&_FeedItemTargetService_serviceDesc, srv)
+}
+
+func _FeedItemTargetService_GetFeedItemTarget_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetFeedItemTargetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FeedItemTargetServiceServer).GetFeedItemTarget(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.FeedItemTargetService/GetFeedItemTarget",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FeedItemTargetServiceServer).GetFeedItemTarget(ctx, req.(*GetFeedItemTargetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _FeedItemTargetService_MutateFeedItemTargets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateFeedItemTargetsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FeedItemTargetServiceServer).MutateFeedItemTargets(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.FeedItemTargetService/MutateFeedItemTargets",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FeedItemTargetServiceServer).MutateFeedItemTargets(ctx, req.(*MutateFeedItemTargetsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _FeedItemTargetService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.FeedItemTargetService",
+	HandlerType: (*FeedItemTargetServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetFeedItemTarget",
+			Handler:    _FeedItemTargetService_GetFeedItemTarget_Handler,
+		},
+		{
+			MethodName: "MutateFeedItemTargets",
+			Handler:    _FeedItemTargetService_MutateFeedItemTargets_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/feed_item_target_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/feed_mapping_service.pb.go b/googleapis/ads/googleads/v3/services/feed_mapping_service.pb.go
new file mode 100644
index 0000000..4203eb2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/feed_mapping_service.pb.go
@@ -0,0 +1,502 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/feed_mapping_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [FeedMappingService.GetFeedMapping][google.ads.googleads.v3.services.FeedMappingService.GetFeedMapping].
+type GetFeedMappingRequest struct {
+	// Required. The resource name of the feed mapping to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetFeedMappingRequest) Reset()         { *m = GetFeedMappingRequest{} }
+func (m *GetFeedMappingRequest) String() string { return proto.CompactTextString(m) }
+func (*GetFeedMappingRequest) ProtoMessage()    {}
+func (*GetFeedMappingRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c1bab55b5a827835, []int{0}
+}
+
+func (m *GetFeedMappingRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetFeedMappingRequest.Unmarshal(m, b)
+}
+func (m *GetFeedMappingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetFeedMappingRequest.Marshal(b, m, deterministic)
+}
+func (m *GetFeedMappingRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetFeedMappingRequest.Merge(m, src)
+}
+func (m *GetFeedMappingRequest) XXX_Size() int {
+	return xxx_messageInfo_GetFeedMappingRequest.Size(m)
+}
+func (m *GetFeedMappingRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetFeedMappingRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetFeedMappingRequest proto.InternalMessageInfo
+
+func (m *GetFeedMappingRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [FeedMappingService.MutateFeedMappings][google.ads.googleads.v3.services.FeedMappingService.MutateFeedMappings].
+type MutateFeedMappingsRequest struct {
+	// Required. The ID of the customer whose feed mappings are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual feed mappings.
+	Operations []*FeedMappingOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateFeedMappingsRequest) Reset()         { *m = MutateFeedMappingsRequest{} }
+func (m *MutateFeedMappingsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedMappingsRequest) ProtoMessage()    {}
+func (*MutateFeedMappingsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c1bab55b5a827835, []int{1}
+}
+
+func (m *MutateFeedMappingsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedMappingsRequest.Unmarshal(m, b)
+}
+func (m *MutateFeedMappingsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedMappingsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedMappingsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedMappingsRequest.Merge(m, src)
+}
+func (m *MutateFeedMappingsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedMappingsRequest.Size(m)
+}
+func (m *MutateFeedMappingsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedMappingsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedMappingsRequest proto.InternalMessageInfo
+
+func (m *MutateFeedMappingsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateFeedMappingsRequest) GetOperations() []*FeedMappingOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateFeedMappingsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateFeedMappingsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove) on a feed mapping.
+type FeedMappingOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*FeedMappingOperation_Create
+	//	*FeedMappingOperation_Remove
+	Operation            isFeedMappingOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *FeedMappingOperation) Reset()         { *m = FeedMappingOperation{} }
+func (m *FeedMappingOperation) String() string { return proto.CompactTextString(m) }
+func (*FeedMappingOperation) ProtoMessage()    {}
+func (*FeedMappingOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c1bab55b5a827835, []int{2}
+}
+
+func (m *FeedMappingOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedMappingOperation.Unmarshal(m, b)
+}
+func (m *FeedMappingOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedMappingOperation.Marshal(b, m, deterministic)
+}
+func (m *FeedMappingOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedMappingOperation.Merge(m, src)
+}
+func (m *FeedMappingOperation) XXX_Size() int {
+	return xxx_messageInfo_FeedMappingOperation.Size(m)
+}
+func (m *FeedMappingOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedMappingOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedMappingOperation proto.InternalMessageInfo
+
+type isFeedMappingOperation_Operation interface {
+	isFeedMappingOperation_Operation()
+}
+
+type FeedMappingOperation_Create struct {
+	Create *resources.FeedMapping `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type FeedMappingOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*FeedMappingOperation_Create) isFeedMappingOperation_Operation() {}
+
+func (*FeedMappingOperation_Remove) isFeedMappingOperation_Operation() {}
+
+func (m *FeedMappingOperation) GetOperation() isFeedMappingOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *FeedMappingOperation) GetCreate() *resources.FeedMapping {
+	if x, ok := m.GetOperation().(*FeedMappingOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *FeedMappingOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*FeedMappingOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*FeedMappingOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*FeedMappingOperation_Create)(nil),
+		(*FeedMappingOperation_Remove)(nil),
+	}
+}
+
+// Response message for a feed mapping mutate.
+type MutateFeedMappingsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateFeedMappingResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *MutateFeedMappingsResponse) Reset()         { *m = MutateFeedMappingsResponse{} }
+func (m *MutateFeedMappingsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedMappingsResponse) ProtoMessage()    {}
+func (*MutateFeedMappingsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c1bab55b5a827835, []int{3}
+}
+
+func (m *MutateFeedMappingsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedMappingsResponse.Unmarshal(m, b)
+}
+func (m *MutateFeedMappingsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedMappingsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedMappingsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedMappingsResponse.Merge(m, src)
+}
+func (m *MutateFeedMappingsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedMappingsResponse.Size(m)
+}
+func (m *MutateFeedMappingsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedMappingsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedMappingsResponse proto.InternalMessageInfo
+
+func (m *MutateFeedMappingsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateFeedMappingsResponse) GetResults() []*MutateFeedMappingResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the feed mapping mutate.
+type MutateFeedMappingResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateFeedMappingResult) Reset()         { *m = MutateFeedMappingResult{} }
+func (m *MutateFeedMappingResult) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedMappingResult) ProtoMessage()    {}
+func (*MutateFeedMappingResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c1bab55b5a827835, []int{4}
+}
+
+func (m *MutateFeedMappingResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedMappingResult.Unmarshal(m, b)
+}
+func (m *MutateFeedMappingResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedMappingResult.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedMappingResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedMappingResult.Merge(m, src)
+}
+func (m *MutateFeedMappingResult) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedMappingResult.Size(m)
+}
+func (m *MutateFeedMappingResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedMappingResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedMappingResult proto.InternalMessageInfo
+
+func (m *MutateFeedMappingResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetFeedMappingRequest)(nil), "google.ads.googleads.v3.services.GetFeedMappingRequest")
+	proto.RegisterType((*MutateFeedMappingsRequest)(nil), "google.ads.googleads.v3.services.MutateFeedMappingsRequest")
+	proto.RegisterType((*FeedMappingOperation)(nil), "google.ads.googleads.v3.services.FeedMappingOperation")
+	proto.RegisterType((*MutateFeedMappingsResponse)(nil), "google.ads.googleads.v3.services.MutateFeedMappingsResponse")
+	proto.RegisterType((*MutateFeedMappingResult)(nil), "google.ads.googleads.v3.services.MutateFeedMappingResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/feed_mapping_service.proto", fileDescriptor_c1bab55b5a827835)
+}
+
+var fileDescriptor_c1bab55b5a827835 = []byte{
+	// 711 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x41, 0x6f, 0xd3, 0x4a,
+	0x10, 0x7e, 0x4e, 0x9e, 0xfa, 0x5e, 0x37, 0x6d, 0x9f, 0xb4, 0x8f, 0xd2, 0x10, 0x90, 0x88, 0x4c,
+	0x25, 0xa2, 0x08, 0xad, 0x21, 0x41, 0x45, 0xb8, 0x14, 0xc9, 0x91, 0x48, 0xcb, 0xa1, 0xb4, 0x4a,
+	0x45, 0x0f, 0x10, 0xc9, 0xda, 0xda, 0x5b, 0x63, 0xc9, 0xf6, 0x9a, 0xdd, 0x75, 0xa4, 0xaa, 0xea,
+	0x85, 0x0b, 0x3f, 0x80, 0x7f, 0xc0, 0x91, 0x7f, 0xc0, 0x91, 0x6b, 0xaf, 0xdc, 0x7a, 0x40, 0x1c,
+	0x10, 0x07, 0xc4, 0x6f, 0x40, 0xc8, 0x5e, 0x6f, 0xe2, 0xb4, 0x89, 0x22, 0x7a, 0x9b, 0xcc, 0xcc,
+	0xf7, 0xcd, 0x37, 0x3b, 0x33, 0x0e, 0x58, 0xf7, 0x28, 0xf5, 0x02, 0x62, 0x60, 0x97, 0x1b, 0xd2,
+	0x4c, 0xad, 0x41, 0xdb, 0xe0, 0x84, 0x0d, 0x7c, 0x87, 0x70, 0xe3, 0x90, 0x10, 0xd7, 0x0e, 0x71,
+	0x1c, 0xfb, 0x91, 0x67, 0xe7, 0x5e, 0x14, 0x33, 0x2a, 0x28, 0xac, 0x4b, 0x04, 0xc2, 0x2e, 0x47,
+	0x43, 0x30, 0x1a, 0xb4, 0x91, 0x02, 0xd7, 0xee, 0x4f, 0xa3, 0x67, 0x84, 0xd3, 0x84, 0x9d, 0xe7,
+	0x97, 0xbc, 0xb5, 0x1b, 0x0a, 0x15, 0xfb, 0x06, 0x8e, 0x22, 0x2a, 0xb0, 0xf0, 0x69, 0xc4, 0xf3,
+	0xe8, 0x4a, 0x21, 0xea, 0x04, 0x3e, 0x89, 0x44, 0x1e, 0xb8, 0x59, 0x08, 0x1c, 0xfa, 0x24, 0x70,
+	0xed, 0x03, 0xf2, 0x0a, 0x0f, 0x7c, 0xca, 0xce, 0x21, 0x59, 0xec, 0x18, 0x5c, 0x60, 0x91, 0xe4,
+	0x94, 0xba, 0x05, 0x96, 0x37, 0x89, 0xe8, 0x12, 0xe2, 0x6e, 0x4b, 0x21, 0x3d, 0xf2, 0x3a, 0x21,
+	0x5c, 0xc0, 0x06, 0x58, 0x54, 0x4a, 0xed, 0x08, 0x87, 0xa4, 0xaa, 0xd5, 0xb5, 0xc6, 0x7c, 0xa7,
+	0xfc, 0xd5, 0x2a, 0xf5, 0x16, 0x54, 0xe4, 0x19, 0x0e, 0x89, 0xfe, 0x53, 0x03, 0xd7, 0xb6, 0x13,
+	0x81, 0x05, 0x29, 0xd0, 0x70, 0xc5, 0xb3, 0x0a, 0x2a, 0x4e, 0xc2, 0x05, 0x0d, 0x09, 0xb3, 0x7d,
+	0xb7, 0xc8, 0x02, 0x94, 0xff, 0xa9, 0x0b, 0x5f, 0x02, 0x40, 0x63, 0xc2, 0x64, 0xb7, 0xd5, 0x52,
+	0xbd, 0xdc, 0xa8, 0xb4, 0xd6, 0xd0, 0xac, 0x47, 0x46, 0x85, 0x82, 0x3b, 0x0a, 0x9e, 0x93, 0x8f,
+	0xe8, 0xe0, 0x6d, 0xf0, 0x5f, 0x8c, 0x99, 0xf0, 0x71, 0x60, 0x1f, 0x62, 0x3f, 0x48, 0x18, 0xa9,
+	0x96, 0xeb, 0x5a, 0xe3, 0xdf, 0xde, 0x52, 0xee, 0xee, 0x4a, 0x2f, 0xbc, 0x05, 0x16, 0x07, 0x38,
+	0xf0, 0x5d, 0x2c, 0x88, 0x4d, 0xa3, 0xe0, 0xa8, 0xfa, 0x77, 0x96, 0xb6, 0xa0, 0x9c, 0x3b, 0x51,
+	0x70, 0xa4, 0xbf, 0xd5, 0xc0, 0x95, 0x49, 0x75, 0xe1, 0x16, 0x98, 0x73, 0x18, 0xc1, 0x42, 0x3e,
+	0x55, 0xa5, 0x85, 0xa6, 0xea, 0x1f, 0xae, 0x40, 0xb1, 0x81, 0xad, 0xbf, 0x7a, 0x39, 0x1e, 0x56,
+	0xc1, 0x1c, 0x23, 0x21, 0x1d, 0x48, 0x9d, 0xf3, 0x69, 0x44, 0xfe, 0xee, 0x54, 0xc0, 0xfc, 0xb0,
+	0x31, 0xfd, 0xa3, 0x06, 0x6a, 0x93, 0x1e, 0x9e, 0xc7, 0x34, 0xe2, 0x04, 0x76, 0xc1, 0xf2, 0xb9,
+	0xb6, 0x6d, 0xc2, 0x18, 0x65, 0x19, 0x69, 0xa5, 0x05, 0x95, 0x3c, 0x16, 0x3b, 0x68, 0x2f, 0xdb,
+	0x89, 0xde, 0xff, 0xe3, 0x0f, 0xf2, 0x24, 0x4d, 0x87, 0x7b, 0xe0, 0x1f, 0x46, 0x78, 0x12, 0x08,
+	0x35, 0x98, 0x87, 0xb3, 0x07, 0x73, 0x41, 0x56, 0x2f, 0x63, 0xe8, 0x29, 0x26, 0xfd, 0x31, 0x58,
+	0x99, 0x92, 0x93, 0x4e, 0x61, 0xc2, 0xe6, 0x8d, 0x2f, 0x5d, 0xeb, 0x4b, 0x19, 0xc0, 0x02, 0x74,
+	0x4f, 0x16, 0x86, 0x9f, 0x34, 0xb0, 0x34, 0xbe, 0xcf, 0xf0, 0xc1, 0x6c, 0xb5, 0x13, 0x2f, 0xa0,
+	0xf6, 0x87, 0xf3, 0xd3, 0xbb, 0x67, 0xd6, 0xb8, 0xf0, 0x37, 0x9f, 0xbf, 0xbd, 0x2b, 0xdd, 0x85,
+	0x28, 0xbd, 0xfa, 0xe3, 0xb1, 0xc8, 0x86, 0x5a, 0x7d, 0x6e, 0x34, 0xb3, 0xcf, 0x80, 0x1a, 0x9e,
+	0xd1, 0x3c, 0x81, 0xdf, 0x35, 0x00, 0x2f, 0x8e, 0x15, 0xae, 0x5f, 0xe2, 0xd5, 0xd5, 0x15, 0xd6,
+	0x1e, 0x5d, 0x0e, 0x2c, 0x37, 0x49, 0x7f, 0x7e, 0x66, 0x5d, 0x2d, 0x1c, 0xf1, 0x9d, 0xd1, 0x6d,
+	0x65, 0x2d, 0xae, 0xe9, 0xf7, 0xd2, 0x16, 0x47, 0x3d, 0x1d, 0x17, 0x92, 0x37, 0x9a, 0x27, 0x63,
+	0x1d, 0x9a, 0x61, 0x56, 0xc7, 0xd4, 0x9a, 0xb5, 0xeb, 0xa7, 0x56, 0x75, 0xa4, 0x25, 0xb7, 0x62,
+	0x9f, 0x23, 0x87, 0x86, 0x9d, 0x5f, 0x1a, 0x58, 0x75, 0x68, 0x38, 0x53, 0x77, 0x67, 0xe5, 0xe2,
+	0x1a, 0xec, 0xa6, 0x9f, 0xb6, 0x5d, 0xed, 0xc5, 0x56, 0x0e, 0xf6, 0x68, 0x80, 0x23, 0x0f, 0x51,
+	0xe6, 0x19, 0x1e, 0x89, 0xb2, 0x0f, 0x9f, 0x31, 0x2a, 0x37, 0xfd, 0x1f, 0x60, 0x5d, 0x19, 0xef,
+	0x4b, 0xe5, 0x4d, 0xcb, 0xfa, 0x50, 0xaa, 0x6f, 0x4a, 0x42, 0xcb, 0xe5, 0x48, 0x9a, 0xa9, 0xb5,
+	0xdf, 0x46, 0x79, 0x61, 0x7e, 0xaa, 0x52, 0xfa, 0x96, 0xcb, 0xfb, 0xc3, 0x94, 0xfe, 0x7e, 0xbb,
+	0xaf, 0x52, 0x7e, 0x94, 0x56, 0xa5, 0xdf, 0x34, 0x2d, 0x97, 0x9b, 0xe6, 0x30, 0xc9, 0x34, 0xf7,
+	0xdb, 0xa6, 0xa9, 0xd2, 0x0e, 0xe6, 0x32, 0x9d, 0xed, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x79,
+	0xb3, 0xe1, 0x28, 0xa8, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// FeedMappingServiceClient is the client API for FeedMappingService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type FeedMappingServiceClient interface {
+	// Returns the requested feed mapping in full detail.
+	GetFeedMapping(ctx context.Context, in *GetFeedMappingRequest, opts ...grpc.CallOption) (*resources.FeedMapping, error)
+	// Creates or removes feed mappings. Operation statuses are
+	// returned.
+	MutateFeedMappings(ctx context.Context, in *MutateFeedMappingsRequest, opts ...grpc.CallOption) (*MutateFeedMappingsResponse, error)
+}
+
+type feedMappingServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewFeedMappingServiceClient(cc grpc.ClientConnInterface) FeedMappingServiceClient {
+	return &feedMappingServiceClient{cc}
+}
+
+func (c *feedMappingServiceClient) GetFeedMapping(ctx context.Context, in *GetFeedMappingRequest, opts ...grpc.CallOption) (*resources.FeedMapping, error) {
+	out := new(resources.FeedMapping)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.FeedMappingService/GetFeedMapping", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *feedMappingServiceClient) MutateFeedMappings(ctx context.Context, in *MutateFeedMappingsRequest, opts ...grpc.CallOption) (*MutateFeedMappingsResponse, error) {
+	out := new(MutateFeedMappingsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.FeedMappingService/MutateFeedMappings", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// FeedMappingServiceServer is the server API for FeedMappingService service.
+type FeedMappingServiceServer interface {
+	// Returns the requested feed mapping in full detail.
+	GetFeedMapping(context.Context, *GetFeedMappingRequest) (*resources.FeedMapping, error)
+	// Creates or removes feed mappings. Operation statuses are
+	// returned.
+	MutateFeedMappings(context.Context, *MutateFeedMappingsRequest) (*MutateFeedMappingsResponse, error)
+}
+
+// UnimplementedFeedMappingServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedFeedMappingServiceServer struct {
+}
+
+func (*UnimplementedFeedMappingServiceServer) GetFeedMapping(ctx context.Context, req *GetFeedMappingRequest) (*resources.FeedMapping, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetFeedMapping not implemented")
+}
+func (*UnimplementedFeedMappingServiceServer) MutateFeedMappings(ctx context.Context, req *MutateFeedMappingsRequest) (*MutateFeedMappingsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateFeedMappings not implemented")
+}
+
+func RegisterFeedMappingServiceServer(s *grpc.Server, srv FeedMappingServiceServer) {
+	s.RegisterService(&_FeedMappingService_serviceDesc, srv)
+}
+
+func _FeedMappingService_GetFeedMapping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetFeedMappingRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FeedMappingServiceServer).GetFeedMapping(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.FeedMappingService/GetFeedMapping",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FeedMappingServiceServer).GetFeedMapping(ctx, req.(*GetFeedMappingRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _FeedMappingService_MutateFeedMappings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateFeedMappingsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FeedMappingServiceServer).MutateFeedMappings(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.FeedMappingService/MutateFeedMappings",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FeedMappingServiceServer).MutateFeedMappings(ctx, req.(*MutateFeedMappingsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _FeedMappingService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.FeedMappingService",
+	HandlerType: (*FeedMappingServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetFeedMapping",
+			Handler:    _FeedMappingService_GetFeedMapping_Handler,
+		},
+		{
+			MethodName: "MutateFeedMappings",
+			Handler:    _FeedMappingService_MutateFeedMappings_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/feed_mapping_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/feed_placeholder_view_service.pb.go b/googleapis/ads/googleads/v3/services/feed_placeholder_view_service.pb.go
new file mode 100644
index 0000000..71cd246
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/feed_placeholder_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/feed_placeholder_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [FeedPlaceholderViewService.GetFeedPlaceholderView][google.ads.googleads.v3.services.FeedPlaceholderViewService.GetFeedPlaceholderView].
+type GetFeedPlaceholderViewRequest struct {
+	// Required. The resource name of the feed placeholder view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetFeedPlaceholderViewRequest) Reset()         { *m = GetFeedPlaceholderViewRequest{} }
+func (m *GetFeedPlaceholderViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetFeedPlaceholderViewRequest) ProtoMessage()    {}
+func (*GetFeedPlaceholderViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3cdfc60d4e9a2d03, []int{0}
+}
+
+func (m *GetFeedPlaceholderViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetFeedPlaceholderViewRequest.Unmarshal(m, b)
+}
+func (m *GetFeedPlaceholderViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetFeedPlaceholderViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetFeedPlaceholderViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetFeedPlaceholderViewRequest.Merge(m, src)
+}
+func (m *GetFeedPlaceholderViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetFeedPlaceholderViewRequest.Size(m)
+}
+func (m *GetFeedPlaceholderViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetFeedPlaceholderViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetFeedPlaceholderViewRequest proto.InternalMessageInfo
+
+func (m *GetFeedPlaceholderViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetFeedPlaceholderViewRequest)(nil), "google.ads.googleads.v3.services.GetFeedPlaceholderViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/feed_placeholder_view_service.proto", fileDescriptor_3cdfc60d4e9a2d03)
+}
+
+var fileDescriptor_3cdfc60d4e9a2d03 = []byte{
+	// 424 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x31, 0x8b, 0xd4, 0x40,
+	0x18, 0x25, 0x39, 0x10, 0x0c, 0xda, 0xa4, 0xd0, 0x23, 0x2a, 0xb7, 0x1c, 0x57, 0x1c, 0x57, 0xcc,
+	0x80, 0x81, 0x43, 0x46, 0x0e, 0x99, 0x45, 0x5c, 0x6d, 0x8e, 0xe5, 0x84, 0x14, 0x12, 0x08, 0x73,
+	0x99, 0xef, 0xb2, 0x03, 0x49, 0x26, 0xce, 0x64, 0xb3, 0x85, 0xd8, 0x58, 0xf8, 0x07, 0xac, 0x6d,
+	0x2c, 0xfd, 0x29, 0xdb, 0xda, 0x59, 0x29, 0x58, 0xf9, 0x2b, 0x24, 0x3b, 0x99, 0xec, 0xae, 0x6c,
+	0x6e, 0xbb, 0x47, 0xde, 0xfb, 0xde, 0xfb, 0xe6, 0x7b, 0xf1, 0x5e, 0x66, 0x52, 0x66, 0x39, 0x60,
+	0xc6, 0x35, 0x36, 0xb0, 0x45, 0x4d, 0x88, 0x35, 0xa8, 0x46, 0xa4, 0xa0, 0xf1, 0x0d, 0x00, 0x4f,
+	0xaa, 0x9c, 0xa5, 0x30, 0x93, 0x39, 0x07, 0x95, 0x34, 0x02, 0x16, 0x49, 0x47, 0xa3, 0x4a, 0xc9,
+	0x5a, 0xfa, 0x23, 0x33, 0x8a, 0x18, 0xd7, 0xa8, 0x77, 0x41, 0x4d, 0x88, 0xac, 0x4b, 0x70, 0x31,
+	0x94, 0xa3, 0x40, 0xcb, 0xb9, 0x1a, 0x0c, 0x32, 0x01, 0xc1, 0x63, 0x3b, 0x5e, 0x09, 0xcc, 0xca,
+	0x52, 0xd6, 0xac, 0x16, 0xb2, 0xd4, 0x1d, 0xfb, 0x70, 0x83, 0x4d, 0x73, 0x01, 0x65, 0xdd, 0x11,
+	0x47, 0x1b, 0xc4, 0x8d, 0x80, 0x9c, 0x27, 0xd7, 0x30, 0x63, 0x8d, 0x90, 0xca, 0x08, 0x8e, 0xdf,
+	0x78, 0x4f, 0x26, 0x50, 0xbf, 0x02, 0xe0, 0xd3, 0x75, 0x70, 0x24, 0x60, 0x71, 0x05, 0xef, 0xe7,
+	0xa0, 0x6b, 0xff, 0xd4, 0xbb, 0x6f, 0x37, 0x4c, 0x4a, 0x56, 0xc0, 0xa1, 0x33, 0x72, 0x4e, 0xef,
+	0x8e, 0x0f, 0x7e, 0x51, 0xf7, 0xea, 0x9e, 0x65, 0x2e, 0x59, 0x01, 0x4f, 0xbf, 0xba, 0x5e, 0xb0,
+	0xc3, 0xe8, 0xad, 0xb9, 0x80, 0xff, 0xdb, 0xf1, 0x1e, 0xec, 0x8e, 0xf2, 0x5f, 0xa0, 0x7d, 0xe7,
+	0x43, 0xb7, 0x2e, 0x19, 0x9c, 0x0f, 0x1a, 0xf4, 0xd7, 0x45, 0x3b, 0xc6, 0x8f, 0x2f, 0x7f, 0xd2,
+	0xed, 0xd7, 0x7d, 0xfa, 0xf1, 0xe7, 0x8b, 0xfb, 0xcc, 0x3f, 0x6f, 0x8b, 0xf9, 0xb0, 0xc5, 0x5c,
+	0xa4, 0x73, 0x5d, 0xcb, 0x02, 0x94, 0xc6, 0x67, 0xab, 0xa6, 0xfe, 0xf3, 0xd2, 0xf8, 0xec, 0x63,
+	0xf0, 0x68, 0x49, 0x0f, 0xd7, 0xf1, 0x1d, 0xaa, 0x84, 0x46, 0xa9, 0x2c, 0xc6, 0x9f, 0x5d, 0xef,
+	0x24, 0x95, 0xc5, 0xde, 0xb7, 0x8e, 0x8f, 0x86, 0xaf, 0x38, 0x6d, 0x4b, 0x9b, 0x3a, 0xef, 0x5e,
+	0x77, 0x26, 0x99, 0xcc, 0x59, 0x99, 0x21, 0xa9, 0x32, 0x9c, 0x41, 0xb9, 0xaa, 0x14, 0xaf, 0x63,
+	0x87, 0x7f, 0xea, 0xe7, 0x16, 0x7c, 0x73, 0x0f, 0x26, 0x94, 0x7e, 0x77, 0x47, 0x13, 0x63, 0x48,
+	0xb9, 0x46, 0x06, 0xb6, 0x28, 0x0a, 0x51, 0x17, 0xac, 0x97, 0x56, 0x12, 0x53, 0xae, 0xe3, 0x5e,
+	0x12, 0x47, 0x61, 0x6c, 0x25, 0x7f, 0xdd, 0x13, 0xf3, 0x9d, 0x10, 0xca, 0x35, 0x21, 0xbd, 0x88,
+	0x90, 0x28, 0x24, 0xc4, 0xca, 0xae, 0xef, 0xac, 0xf6, 0x0c, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff,
+	0x7e, 0xa7, 0x70, 0x6c, 0x7b, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// FeedPlaceholderViewServiceClient is the client API for FeedPlaceholderViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type FeedPlaceholderViewServiceClient interface {
+	// Returns the requested feed placeholder view in full detail.
+	GetFeedPlaceholderView(ctx context.Context, in *GetFeedPlaceholderViewRequest, opts ...grpc.CallOption) (*resources.FeedPlaceholderView, error)
+}
+
+type feedPlaceholderViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewFeedPlaceholderViewServiceClient(cc grpc.ClientConnInterface) FeedPlaceholderViewServiceClient {
+	return &feedPlaceholderViewServiceClient{cc}
+}
+
+func (c *feedPlaceholderViewServiceClient) GetFeedPlaceholderView(ctx context.Context, in *GetFeedPlaceholderViewRequest, opts ...grpc.CallOption) (*resources.FeedPlaceholderView, error) {
+	out := new(resources.FeedPlaceholderView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.FeedPlaceholderViewService/GetFeedPlaceholderView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// FeedPlaceholderViewServiceServer is the server API for FeedPlaceholderViewService service.
+type FeedPlaceholderViewServiceServer interface {
+	// Returns the requested feed placeholder view in full detail.
+	GetFeedPlaceholderView(context.Context, *GetFeedPlaceholderViewRequest) (*resources.FeedPlaceholderView, error)
+}
+
+// UnimplementedFeedPlaceholderViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedFeedPlaceholderViewServiceServer struct {
+}
+
+func (*UnimplementedFeedPlaceholderViewServiceServer) GetFeedPlaceholderView(ctx context.Context, req *GetFeedPlaceholderViewRequest) (*resources.FeedPlaceholderView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetFeedPlaceholderView not implemented")
+}
+
+func RegisterFeedPlaceholderViewServiceServer(s *grpc.Server, srv FeedPlaceholderViewServiceServer) {
+	s.RegisterService(&_FeedPlaceholderViewService_serviceDesc, srv)
+}
+
+func _FeedPlaceholderViewService_GetFeedPlaceholderView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetFeedPlaceholderViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FeedPlaceholderViewServiceServer).GetFeedPlaceholderView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.FeedPlaceholderViewService/GetFeedPlaceholderView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FeedPlaceholderViewServiceServer).GetFeedPlaceholderView(ctx, req.(*GetFeedPlaceholderViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _FeedPlaceholderViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.FeedPlaceholderViewService",
+	HandlerType: (*FeedPlaceholderViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetFeedPlaceholderView",
+			Handler:    _FeedPlaceholderViewService_GetFeedPlaceholderView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/feed_placeholder_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/feed_service.pb.go b/googleapis/ads/googleads/v3/services/feed_service.pb.go
new file mode 100644
index 0000000..ff21c5e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/feed_service.pb.go
@@ -0,0 +1,529 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/feed_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [FeedService.GetFeed][google.ads.googleads.v3.services.FeedService.GetFeed].
+type GetFeedRequest struct {
+	// Required. The resource name of the feed to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetFeedRequest) Reset()         { *m = GetFeedRequest{} }
+func (m *GetFeedRequest) String() string { return proto.CompactTextString(m) }
+func (*GetFeedRequest) ProtoMessage()    {}
+func (*GetFeedRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4b4d1072354ada7f, []int{0}
+}
+
+func (m *GetFeedRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetFeedRequest.Unmarshal(m, b)
+}
+func (m *GetFeedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetFeedRequest.Marshal(b, m, deterministic)
+}
+func (m *GetFeedRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetFeedRequest.Merge(m, src)
+}
+func (m *GetFeedRequest) XXX_Size() int {
+	return xxx_messageInfo_GetFeedRequest.Size(m)
+}
+func (m *GetFeedRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetFeedRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetFeedRequest proto.InternalMessageInfo
+
+func (m *GetFeedRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [FeedService.MutateFeeds][google.ads.googleads.v3.services.FeedService.MutateFeeds].
+type MutateFeedsRequest struct {
+	// Required. The ID of the customer whose feeds are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual feeds.
+	Operations []*FeedOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateFeedsRequest) Reset()         { *m = MutateFeedsRequest{} }
+func (m *MutateFeedsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedsRequest) ProtoMessage()    {}
+func (*MutateFeedsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4b4d1072354ada7f, []int{1}
+}
+
+func (m *MutateFeedsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedsRequest.Unmarshal(m, b)
+}
+func (m *MutateFeedsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedsRequest.Merge(m, src)
+}
+func (m *MutateFeedsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedsRequest.Size(m)
+}
+func (m *MutateFeedsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedsRequest proto.InternalMessageInfo
+
+func (m *MutateFeedsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateFeedsRequest) GetOperations() []*FeedOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateFeedsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateFeedsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on an feed.
+type FeedOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*FeedOperation_Create
+	//	*FeedOperation_Update
+	//	*FeedOperation_Remove
+	Operation            isFeedOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
+	XXX_unrecognized     []byte                    `json:"-"`
+	XXX_sizecache        int32                     `json:"-"`
+}
+
+func (m *FeedOperation) Reset()         { *m = FeedOperation{} }
+func (m *FeedOperation) String() string { return proto.CompactTextString(m) }
+func (*FeedOperation) ProtoMessage()    {}
+func (*FeedOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4b4d1072354ada7f, []int{2}
+}
+
+func (m *FeedOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FeedOperation.Unmarshal(m, b)
+}
+func (m *FeedOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FeedOperation.Marshal(b, m, deterministic)
+}
+func (m *FeedOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedOperation.Merge(m, src)
+}
+func (m *FeedOperation) XXX_Size() int {
+	return xxx_messageInfo_FeedOperation.Size(m)
+}
+func (m *FeedOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_FeedOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FeedOperation proto.InternalMessageInfo
+
+func (m *FeedOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isFeedOperation_Operation interface {
+	isFeedOperation_Operation()
+}
+
+type FeedOperation_Create struct {
+	Create *resources.Feed `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type FeedOperation_Update struct {
+	Update *resources.Feed `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type FeedOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*FeedOperation_Create) isFeedOperation_Operation() {}
+
+func (*FeedOperation_Update) isFeedOperation_Operation() {}
+
+func (*FeedOperation_Remove) isFeedOperation_Operation() {}
+
+func (m *FeedOperation) GetOperation() isFeedOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *FeedOperation) GetCreate() *resources.Feed {
+	if x, ok := m.GetOperation().(*FeedOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *FeedOperation) GetUpdate() *resources.Feed {
+	if x, ok := m.GetOperation().(*FeedOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *FeedOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*FeedOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*FeedOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*FeedOperation_Create)(nil),
+		(*FeedOperation_Update)(nil),
+		(*FeedOperation_Remove)(nil),
+	}
+}
+
+// Response message for an feed mutate.
+type MutateFeedsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateFeedResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *MutateFeedsResponse) Reset()         { *m = MutateFeedsResponse{} }
+func (m *MutateFeedsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedsResponse) ProtoMessage()    {}
+func (*MutateFeedsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4b4d1072354ada7f, []int{3}
+}
+
+func (m *MutateFeedsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedsResponse.Unmarshal(m, b)
+}
+func (m *MutateFeedsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedsResponse.Merge(m, src)
+}
+func (m *MutateFeedsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedsResponse.Size(m)
+}
+func (m *MutateFeedsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedsResponse proto.InternalMessageInfo
+
+func (m *MutateFeedsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateFeedsResponse) GetResults() []*MutateFeedResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the feed mutate.
+type MutateFeedResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateFeedResult) Reset()         { *m = MutateFeedResult{} }
+func (m *MutateFeedResult) String() string { return proto.CompactTextString(m) }
+func (*MutateFeedResult) ProtoMessage()    {}
+func (*MutateFeedResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_4b4d1072354ada7f, []int{4}
+}
+
+func (m *MutateFeedResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateFeedResult.Unmarshal(m, b)
+}
+func (m *MutateFeedResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateFeedResult.Marshal(b, m, deterministic)
+}
+func (m *MutateFeedResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateFeedResult.Merge(m, src)
+}
+func (m *MutateFeedResult) XXX_Size() int {
+	return xxx_messageInfo_MutateFeedResult.Size(m)
+}
+func (m *MutateFeedResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateFeedResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateFeedResult proto.InternalMessageInfo
+
+func (m *MutateFeedResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetFeedRequest)(nil), "google.ads.googleads.v3.services.GetFeedRequest")
+	proto.RegisterType((*MutateFeedsRequest)(nil), "google.ads.googleads.v3.services.MutateFeedsRequest")
+	proto.RegisterType((*FeedOperation)(nil), "google.ads.googleads.v3.services.FeedOperation")
+	proto.RegisterType((*MutateFeedsResponse)(nil), "google.ads.googleads.v3.services.MutateFeedsResponse")
+	proto.RegisterType((*MutateFeedResult)(nil), "google.ads.googleads.v3.services.MutateFeedResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/feed_service.proto", fileDescriptor_4b4d1072354ada7f)
+}
+
+var fileDescriptor_4b4d1072354ada7f = []byte{
+	// 745 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xcd, 0x6a, 0xdb, 0x4a,
+	0x14, 0xbe, 0xb2, 0x2f, 0xc9, 0xcd, 0x28, 0xc9, 0x0d, 0x13, 0xee, 0xad, 0x71, 0x0b, 0x35, 0x6a,
+	0x20, 0xae, 0x09, 0x52, 0xb1, 0x5b, 0x0a, 0x0a, 0xa1, 0xc8, 0x50, 0x27, 0x85, 0xe6, 0x07, 0xa5,
+	0x64, 0x51, 0x0c, 0x66, 0x22, 0x8d, 0x5d, 0x11, 0x49, 0xa3, 0xce, 0x8c, 0x0c, 0x21, 0x64, 0xd3,
+	0x57, 0xe8, 0x03, 0x14, 0x0a, 0xdd, 0xb4, 0x6f, 0x92, 0x6d, 0x77, 0x59, 0x94, 0x2e, 0xba, 0xea,
+	0x0b, 0x94, 0xee, 0xca, 0x68, 0x66, 0xfc, 0x13, 0x1a, 0xdc, 0xec, 0x8e, 0xe6, 0x7c, 0xdf, 0x77,
+	0xce, 0x7c, 0x67, 0x8e, 0x0d, 0x5a, 0x03, 0x42, 0x06, 0x31, 0x76, 0x50, 0xc8, 0x1c, 0x19, 0x8a,
+	0x68, 0xd8, 0x72, 0x18, 0xa6, 0xc3, 0x28, 0xc0, 0xcc, 0xe9, 0x63, 0x1c, 0xf6, 0xd4, 0x97, 0x9d,
+	0x51, 0xc2, 0x09, 0xac, 0x49, 0xa4, 0x8d, 0x42, 0x66, 0x8f, 0x48, 0xf6, 0xb0, 0x65, 0x6b, 0x52,
+	0x75, 0xe3, 0x3a, 0x59, 0x8a, 0x19, 0xc9, 0xa9, 0xd6, 0x95, 0x7a, 0xd5, 0x3b, 0x1a, 0x9d, 0x45,
+	0x0e, 0x4a, 0x53, 0xc2, 0x11, 0x8f, 0x48, 0xca, 0x54, 0xf6, 0xd6, 0x44, 0x36, 0x88, 0x23, 0x9c,
+	0x72, 0x95, 0xb8, 0x3b, 0x91, 0xe8, 0x47, 0x38, 0x0e, 0x7b, 0xc7, 0xf8, 0x15, 0x1a, 0x46, 0x84,
+	0x2a, 0x80, 0xea, 0xd3, 0x29, 0xbe, 0x8e, 0xf3, 0xbe, 0x42, 0x25, 0x88, 0x9d, 0x5c, 0xd1, 0xa6,
+	0x59, 0xe0, 0x30, 0x8e, 0x78, 0xae, 0x8a, 0x5a, 0x2e, 0x58, 0xde, 0xc6, 0xbc, 0x83, 0x71, 0xe8,
+	0xe3, 0xd7, 0x39, 0x66, 0x1c, 0xd6, 0xc1, 0x92, 0x6e, 0xbe, 0x97, 0xa2, 0x04, 0x57, 0x8c, 0x9a,
+	0x51, 0x5f, 0x68, 0x97, 0xbf, 0x7a, 0x25, 0x7f, 0x51, 0x67, 0xf6, 0x50, 0x82, 0xad, 0x2f, 0x06,
+	0x80, 0xbb, 0x39, 0x47, 0x1c, 0x0b, 0x3e, 0xd3, 0x02, 0x6b, 0xc0, 0x0c, 0x72, 0xc6, 0x49, 0x82,
+	0x69, 0x2f, 0x0a, 0x27, 0xe9, 0x40, 0x9f, 0x3f, 0x0b, 0xe1, 0x0b, 0x00, 0x48, 0x86, 0xa9, 0x74,
+	0xa0, 0x52, 0xaa, 0x95, 0xeb, 0x66, 0xd3, 0xb1, 0x67, 0x19, 0x6e, 0x8b, 0x4a, 0xfb, 0x9a, 0xa7,
+	0x54, 0xc7, 0x3a, 0x70, 0x1d, 0xfc, 0x9b, 0x21, 0xca, 0x23, 0x14, 0xf7, 0xfa, 0x28, 0x8a, 0x73,
+	0x8a, 0x2b, 0xe5, 0x9a, 0x51, 0xff, 0xc7, 0x5f, 0x56, 0xc7, 0x1d, 0x79, 0x0a, 0xef, 0x81, 0xa5,
+	0x21, 0x8a, 0xa3, 0x10, 0x71, 0xdc, 0x23, 0x69, 0x7c, 0x5a, 0xf9, 0xbb, 0x80, 0x2d, 0xea, 0xc3,
+	0xfd, 0x34, 0x3e, 0xb5, 0x7e, 0x1a, 0x60, 0x69, 0xaa, 0x20, 0xdc, 0x04, 0x66, 0x9e, 0x15, 0x24,
+	0x61, 0x6e, 0x41, 0x32, 0x9b, 0x55, 0xdd, 0xb6, 0xf6, 0xdf, 0xee, 0x08, 0xff, 0x77, 0x11, 0x3b,
+	0xf1, 0x81, 0x84, 0x8b, 0x18, 0x7a, 0x60, 0x2e, 0xa0, 0x18, 0x71, 0x69, 0xa9, 0xd9, 0x5c, 0xbf,
+	0xf6, 0xba, 0xa3, 0xd7, 0x53, 0xdc, 0x77, 0xe7, 0x2f, 0x5f, 0x11, 0x85, 0x84, 0x14, 0xac, 0x94,
+	0x6e, 0x2c, 0x21, 0x89, 0xb0, 0x02, 0xe6, 0x28, 0x4e, 0xc8, 0x50, 0x3a, 0xb3, 0x20, 0x32, 0xf2,
+	0xbb, 0x6d, 0x82, 0x85, 0x91, 0x95, 0xd6, 0x27, 0x03, 0xac, 0x4e, 0x0d, 0x97, 0x65, 0x24, 0x65,
+	0x18, 0x76, 0xc0, 0x7f, 0x57, 0x1c, 0xee, 0x61, 0x4a, 0x09, 0x2d, 0xd4, 0xcc, 0x26, 0xd4, 0x0d,
+	0xd1, 0x2c, 0xb0, 0x0f, 0x8b, 0x97, 0xe6, 0xaf, 0x4e, 0x7b, 0xff, 0x54, 0xc0, 0xe1, 0x73, 0x30,
+	0x4f, 0x31, 0xcb, 0x63, 0xae, 0x87, 0xdf, 0x9c, 0x3d, 0xfc, 0x71, 0x3f, 0x7e, 0x41, 0xf5, 0xb5,
+	0x84, 0xf5, 0x18, 0xac, 0x5c, 0x4d, 0x8a, 0x11, 0xff, 0xe6, 0x21, 0x4f, 0xbf, 0xe1, 0xe6, 0xbb,
+	0x32, 0x30, 0x05, 0xe7, 0x50, 0xd6, 0x80, 0x1f, 0x0c, 0x30, 0xaf, 0x16, 0x02, 0x3e, 0x98, 0xdd,
+	0xd1, 0xf4, 0xee, 0x54, 0xff, 0x74, 0x1c, 0xd6, 0x93, 0x4b, 0x6f, 0xba, 0xb9, 0x37, 0x9f, 0xbf,
+	0xbd, 0x2d, 0xdd, 0x87, 0xeb, 0xe2, 0xb7, 0xe3, 0x6c, 0x2a, 0xb3, 0xa5, 0x97, 0x86, 0x39, 0x8d,
+	0xe2, 0xc7, 0x84, 0x39, 0x8d, 0x73, 0x78, 0x61, 0x00, 0x73, 0x62, 0x3c, 0xf0, 0xe1, 0x4d, 0xdc,
+	0xd3, 0xab, 0x5a, 0x7d, 0x74, 0x43, 0x96, 0x7c, 0x03, 0xd6, 0xde, 0xa5, 0xf7, 0xff, 0xc4, 0x8a,
+	0x6f, 0x8c, 0x17, 0xb0, 0xb8, 0x86, 0x63, 0x35, 0xc4, 0x35, 0xc6, 0x7d, 0x9f, 0x4d, 0x80, 0xb7,
+	0x1a, 0xe7, 0xf2, 0x16, 0x6e, 0x52, 0x28, 0xbb, 0x46, 0xa3, 0x7a, 0xfb, 0xc2, 0xab, 0x8c, 0xab,
+	0xab, 0x28, 0x8b, 0x98, 0x1d, 0x90, 0xa4, 0xfd, 0xc3, 0x00, 0x6b, 0x01, 0x49, 0x66, 0x76, 0xda,
+	0x5e, 0x99, 0x98, 0xe3, 0x81, 0xd8, 0xc4, 0x03, 0xe3, 0xe5, 0x8e, 0x62, 0x0d, 0x48, 0x8c, 0xd2,
+	0x81, 0x4d, 0xe8, 0xc0, 0x19, 0xe0, 0xb4, 0xd8, 0x53, 0x67, 0x5c, 0xe7, 0xfa, 0x7f, 0x85, 0x4d,
+	0x1d, 0xbc, 0x2f, 0x95, 0xb7, 0x3d, 0xef, 0x63, 0xa9, 0xb6, 0x2d, 0x05, 0xbd, 0x90, 0xd9, 0x32,
+	0x14, 0xd1, 0x51, 0xcb, 0x56, 0x85, 0xd9, 0x85, 0x86, 0x74, 0xbd, 0x90, 0x75, 0x47, 0x90, 0xee,
+	0x51, 0xab, 0xab, 0x21, 0xdf, 0x4b, 0x6b, 0xf2, 0xdc, 0x75, 0xbd, 0x90, 0xb9, 0xee, 0x08, 0xe4,
+	0xba, 0x47, 0x2d, 0xd7, 0xd5, 0xb0, 0xe3, 0xb9, 0xa2, 0xcf, 0xd6, 0xaf, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0x43, 0xb9, 0x76, 0xde, 0xbc, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// FeedServiceClient is the client API for FeedService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type FeedServiceClient interface {
+	// Returns the requested feed in full detail.
+	GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*resources.Feed, error)
+	// Creates, updates, or removes feeds. Operation statuses are
+	// returned.
+	MutateFeeds(ctx context.Context, in *MutateFeedsRequest, opts ...grpc.CallOption) (*MutateFeedsResponse, error)
+}
+
+type feedServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewFeedServiceClient(cc grpc.ClientConnInterface) FeedServiceClient {
+	return &feedServiceClient{cc}
+}
+
+func (c *feedServiceClient) GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*resources.Feed, error) {
+	out := new(resources.Feed)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.FeedService/GetFeed", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *feedServiceClient) MutateFeeds(ctx context.Context, in *MutateFeedsRequest, opts ...grpc.CallOption) (*MutateFeedsResponse, error) {
+	out := new(MutateFeedsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.FeedService/MutateFeeds", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// FeedServiceServer is the server API for FeedService service.
+type FeedServiceServer interface {
+	// Returns the requested feed in full detail.
+	GetFeed(context.Context, *GetFeedRequest) (*resources.Feed, error)
+	// Creates, updates, or removes feeds. Operation statuses are
+	// returned.
+	MutateFeeds(context.Context, *MutateFeedsRequest) (*MutateFeedsResponse, error)
+}
+
+// UnimplementedFeedServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedFeedServiceServer struct {
+}
+
+func (*UnimplementedFeedServiceServer) GetFeed(ctx context.Context, req *GetFeedRequest) (*resources.Feed, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetFeed not implemented")
+}
+func (*UnimplementedFeedServiceServer) MutateFeeds(ctx context.Context, req *MutateFeedsRequest) (*MutateFeedsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateFeeds not implemented")
+}
+
+func RegisterFeedServiceServer(s *grpc.Server, srv FeedServiceServer) {
+	s.RegisterService(&_FeedService_serviceDesc, srv)
+}
+
+func _FeedService_GetFeed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetFeedRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FeedServiceServer).GetFeed(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.FeedService/GetFeed",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FeedServiceServer).GetFeed(ctx, req.(*GetFeedRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _FeedService_MutateFeeds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateFeedsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(FeedServiceServer).MutateFeeds(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.FeedService/MutateFeeds",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(FeedServiceServer).MutateFeeds(ctx, req.(*MutateFeedsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _FeedService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.FeedService",
+	HandlerType: (*FeedServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetFeed",
+			Handler:    _FeedService_GetFeed_Handler,
+		},
+		{
+			MethodName: "MutateFeeds",
+			Handler:    _FeedService_MutateFeeds_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/feed_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/gender_view_service.pb.go b/googleapis/ads/googleads/v3/services/gender_view_service.pb.go
new file mode 100644
index 0000000..b6e3b93
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/gender_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/gender_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [GenderViewService.GetGenderView][google.ads.googleads.v3.services.GenderViewService.GetGenderView].
+type GetGenderViewRequest struct {
+	// Required. The resource name of the gender view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetGenderViewRequest) Reset()         { *m = GetGenderViewRequest{} }
+func (m *GetGenderViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetGenderViewRequest) ProtoMessage()    {}
+func (*GetGenderViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_75bfb9a4f4d1dcee, []int{0}
+}
+
+func (m *GetGenderViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetGenderViewRequest.Unmarshal(m, b)
+}
+func (m *GetGenderViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetGenderViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetGenderViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetGenderViewRequest.Merge(m, src)
+}
+func (m *GetGenderViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetGenderViewRequest.Size(m)
+}
+func (m *GetGenderViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetGenderViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetGenderViewRequest proto.InternalMessageInfo
+
+func (m *GetGenderViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetGenderViewRequest)(nil), "google.ads.googleads.v3.services.GetGenderViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/gender_view_service.proto", fileDescriptor_75bfb9a4f4d1dcee)
+}
+
+var fileDescriptor_75bfb9a4f4d1dcee = []byte{
+	// 409 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0xeb, 0xd3, 0x40,
+	0x18, 0x26, 0xf9, 0x81, 0x60, 0xb0, 0x83, 0x41, 0xb4, 0x44, 0xc1, 0x52, 0x3a, 0x94, 0x42, 0xef,
+	0xc0, 0x80, 0xc3, 0x89, 0xe0, 0x15, 0x24, 0x4e, 0x52, 0x2a, 0x64, 0x90, 0x40, 0xb8, 0x26, 0xaf,
+	0xf1, 0x20, 0xc9, 0xd5, 0xbb, 0x34, 0x1d, 0xc4, 0xc5, 0xaf, 0xe0, 0x37, 0x70, 0xf4, 0x3b, 0xf8,
+	0x05, 0xba, 0xba, 0x39, 0x39, 0x38, 0x39, 0xf9, 0x05, 0x04, 0x49, 0x2f, 0x97, 0xb4, 0xfa, 0x2b,
+	0xdd, 0x1e, 0xee, 0xf9, 0xf3, 0xbe, 0xef, 0x93, 0x38, 0x24, 0x13, 0x22, 0xcb, 0x01, 0xb3, 0x54,
+	0x61, 0x0d, 0x1b, 0x54, 0xfb, 0x58, 0x81, 0xac, 0x79, 0x02, 0x0a, 0x67, 0x50, 0xa6, 0x20, 0xe3,
+	0x9a, 0xc3, 0x2e, 0x6e, 0x1f, 0xd1, 0x46, 0x8a, 0x4a, 0xb8, 0x23, 0x6d, 0x40, 0x2c, 0x55, 0xa8,
+	0xf3, 0xa2, 0xda, 0x47, 0xc6, 0xeb, 0xf9, 0xe7, 0xd2, 0x25, 0x28, 0xb1, 0x95, 0xff, 0xc4, 0xeb,
+	0x58, 0xef, 0x81, 0x31, 0x6d, 0x38, 0x66, 0x65, 0x29, 0x2a, 0x56, 0x71, 0x51, 0xaa, 0x96, 0xbd,
+	0x77, 0xc4, 0x26, 0x39, 0x87, 0xb2, 0x6a, 0x89, 0x87, 0x47, 0xc4, 0x1b, 0x0e, 0x79, 0x1a, 0xaf,
+	0xe1, 0x2d, 0xab, 0xb9, 0x90, 0x5a, 0x30, 0x7e, 0xe6, 0xdc, 0x09, 0xa0, 0x0a, 0x0e, 0xf3, 0x42,
+	0x0e, 0xbb, 0x15, 0xbc, 0xdb, 0x82, 0xaa, 0xdc, 0xa9, 0x33, 0x30, 0xeb, 0xc4, 0x25, 0x2b, 0x60,
+	0x68, 0x8d, 0xac, 0xe9, 0xcd, 0xc5, 0xd5, 0x0f, 0x6a, 0xaf, 0x6e, 0x19, 0xe6, 0x25, 0x2b, 0xe0,
+	0xd1, 0x6f, 0xcb, 0xb9, 0xdd, 0xfb, 0x5f, 0xe9, 0x2b, 0xdd, 0xaf, 0x96, 0x33, 0x38, 0x09, 0x76,
+	0x1f, 0xa3, 0x4b, 0xcd, 0xa0, 0xeb, 0x36, 0xf1, 0xe6, 0x67, 0x7d, 0x5d, 0x5f, 0xa8, 0x77, 0x8d,
+	0x9f, 0x7f, 0xa7, 0xa7, 0x9b, 0x7f, 0xfc, 0xf6, 0xf3, 0x93, 0x8d, 0xdd, 0x79, 0xd3, 0xf0, 0xfb,
+	0x13, 0xe6, 0x69, 0xb2, 0x55, 0x95, 0x28, 0x40, 0x2a, 0x3c, 0x6b, 0x2b, 0x6f, 0x22, 0x14, 0x9e,
+	0x7d, 0xf0, 0xee, 0xef, 0xe9, 0xb0, 0x1f, 0xd6, 0xa2, 0x0d, 0x57, 0x28, 0x11, 0xc5, 0xe2, 0x8f,
+	0xe5, 0x4c, 0x12, 0x51, 0x5c, 0x3c, 0x68, 0x71, 0xf7, 0xbf, 0x62, 0x96, 0x4d, 0xeb, 0x4b, 0xeb,
+	0xf5, 0x8b, 0xd6, 0x9b, 0x89, 0x9c, 0x95, 0x19, 0x12, 0x32, 0x6b, 0x36, 0x38, 0x7c, 0x13, 0xdc,
+	0x4f, 0x3b, 0xff, 0x07, 0x3e, 0x31, 0xe0, 0xb3, 0x7d, 0x15, 0x50, 0xfa, 0xc5, 0x1e, 0x05, 0x3a,
+	0x90, 0xa6, 0x0a, 0x69, 0xd8, 0xa0, 0xd0, 0x47, 0xed, 0x60, 0xb5, 0x37, 0x92, 0x88, 0xa6, 0x2a,
+	0xea, 0x24, 0x51, 0xe8, 0x47, 0x46, 0xf2, 0xcb, 0x9e, 0xe8, 0x77, 0x42, 0x68, 0xaa, 0x08, 0xe9,
+	0x44, 0x84, 0x84, 0x3e, 0x21, 0x46, 0xb6, 0xbe, 0x71, 0xd8, 0xd3, 0xff, 0x1b, 0x00, 0x00, 0xff,
+	0xff, 0xfd, 0xf5, 0x10, 0xad, 0x28, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// GenderViewServiceClient is the client API for GenderViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type GenderViewServiceClient interface {
+	// Returns the requested gender view in full detail.
+	GetGenderView(ctx context.Context, in *GetGenderViewRequest, opts ...grpc.CallOption) (*resources.GenderView, error)
+}
+
+type genderViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewGenderViewServiceClient(cc grpc.ClientConnInterface) GenderViewServiceClient {
+	return &genderViewServiceClient{cc}
+}
+
+func (c *genderViewServiceClient) GetGenderView(ctx context.Context, in *GetGenderViewRequest, opts ...grpc.CallOption) (*resources.GenderView, error) {
+	out := new(resources.GenderView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GenderViewService/GetGenderView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// GenderViewServiceServer is the server API for GenderViewService service.
+type GenderViewServiceServer interface {
+	// Returns the requested gender view in full detail.
+	GetGenderView(context.Context, *GetGenderViewRequest) (*resources.GenderView, error)
+}
+
+// UnimplementedGenderViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedGenderViewServiceServer struct {
+}
+
+func (*UnimplementedGenderViewServiceServer) GetGenderView(ctx context.Context, req *GetGenderViewRequest) (*resources.GenderView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetGenderView not implemented")
+}
+
+func RegisterGenderViewServiceServer(s *grpc.Server, srv GenderViewServiceServer) {
+	s.RegisterService(&_GenderViewService_serviceDesc, srv)
+}
+
+func _GenderViewService_GetGenderView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetGenderViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GenderViewServiceServer).GetGenderView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.GenderViewService/GetGenderView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GenderViewServiceServer).GetGenderView(ctx, req.(*GetGenderViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _GenderViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.GenderViewService",
+	HandlerType: (*GenderViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetGenderView",
+			Handler:    _GenderViewService_GetGenderView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/gender_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/geo_target_constant_service.pb.go b/googleapis/ads/googleads/v3/services/geo_target_constant_service.pb.go
new file mode 100644
index 0000000..b5f5001
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/geo_target_constant_service.pb.go
@@ -0,0 +1,572 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/geo_target_constant_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [GeoTargetConstantService.GetGeoTargetConstant][google.ads.googleads.v3.services.GeoTargetConstantService.GetGeoTargetConstant].
+type GetGeoTargetConstantRequest struct {
+	// Required. The resource name of the geo target constant to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetGeoTargetConstantRequest) Reset()         { *m = GetGeoTargetConstantRequest{} }
+func (m *GetGeoTargetConstantRequest) String() string { return proto.CompactTextString(m) }
+func (*GetGeoTargetConstantRequest) ProtoMessage()    {}
+func (*GetGeoTargetConstantRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f7e25d1f3e9af1ca, []int{0}
+}
+
+func (m *GetGeoTargetConstantRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetGeoTargetConstantRequest.Unmarshal(m, b)
+}
+func (m *GetGeoTargetConstantRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetGeoTargetConstantRequest.Marshal(b, m, deterministic)
+}
+func (m *GetGeoTargetConstantRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetGeoTargetConstantRequest.Merge(m, src)
+}
+func (m *GetGeoTargetConstantRequest) XXX_Size() int {
+	return xxx_messageInfo_GetGeoTargetConstantRequest.Size(m)
+}
+func (m *GetGeoTargetConstantRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetGeoTargetConstantRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetGeoTargetConstantRequest proto.InternalMessageInfo
+
+func (m *GetGeoTargetConstantRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for
+// [GeoTargetConstantService.SuggestGeoTargetConstantsRequest][].
+type SuggestGeoTargetConstantsRequest struct {
+	// If possible, returned geo targets are translated using this locale. If not,
+	// en is used by default. This is also used as a hint for returned geo
+	// targets.
+	Locale *wrappers.StringValue `protobuf:"bytes,3,opt,name=locale,proto3" json:"locale,omitempty"`
+	// Returned geo targets are restricted to this country code.
+	CountryCode *wrappers.StringValue `protobuf:"bytes,5,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
+	// Required. A selector of geo target constants.
+	//
+	// Types that are valid to be assigned to Query:
+	//	*SuggestGeoTargetConstantsRequest_LocationNames_
+	//	*SuggestGeoTargetConstantsRequest_GeoTargets_
+	Query                isSuggestGeoTargetConstantsRequest_Query `protobuf_oneof:"query"`
+	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
+	XXX_unrecognized     []byte                                   `json:"-"`
+	XXX_sizecache        int32                                    `json:"-"`
+}
+
+func (m *SuggestGeoTargetConstantsRequest) Reset()         { *m = SuggestGeoTargetConstantsRequest{} }
+func (m *SuggestGeoTargetConstantsRequest) String() string { return proto.CompactTextString(m) }
+func (*SuggestGeoTargetConstantsRequest) ProtoMessage()    {}
+func (*SuggestGeoTargetConstantsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f7e25d1f3e9af1ca, []int{1}
+}
+
+func (m *SuggestGeoTargetConstantsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SuggestGeoTargetConstantsRequest.Unmarshal(m, b)
+}
+func (m *SuggestGeoTargetConstantsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SuggestGeoTargetConstantsRequest.Marshal(b, m, deterministic)
+}
+func (m *SuggestGeoTargetConstantsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SuggestGeoTargetConstantsRequest.Merge(m, src)
+}
+func (m *SuggestGeoTargetConstantsRequest) XXX_Size() int {
+	return xxx_messageInfo_SuggestGeoTargetConstantsRequest.Size(m)
+}
+func (m *SuggestGeoTargetConstantsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_SuggestGeoTargetConstantsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SuggestGeoTargetConstantsRequest proto.InternalMessageInfo
+
+func (m *SuggestGeoTargetConstantsRequest) GetLocale() *wrappers.StringValue {
+	if m != nil {
+		return m.Locale
+	}
+	return nil
+}
+
+func (m *SuggestGeoTargetConstantsRequest) GetCountryCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CountryCode
+	}
+	return nil
+}
+
+type isSuggestGeoTargetConstantsRequest_Query interface {
+	isSuggestGeoTargetConstantsRequest_Query()
+}
+
+type SuggestGeoTargetConstantsRequest_LocationNames_ struct {
+	LocationNames *SuggestGeoTargetConstantsRequest_LocationNames `protobuf:"bytes,1,opt,name=location_names,json=locationNames,proto3,oneof"`
+}
+
+type SuggestGeoTargetConstantsRequest_GeoTargets_ struct {
+	GeoTargets *SuggestGeoTargetConstantsRequest_GeoTargets `protobuf:"bytes,2,opt,name=geo_targets,json=geoTargets,proto3,oneof"`
+}
+
+func (*SuggestGeoTargetConstantsRequest_LocationNames_) isSuggestGeoTargetConstantsRequest_Query() {}
+
+func (*SuggestGeoTargetConstantsRequest_GeoTargets_) isSuggestGeoTargetConstantsRequest_Query() {}
+
+func (m *SuggestGeoTargetConstantsRequest) GetQuery() isSuggestGeoTargetConstantsRequest_Query {
+	if m != nil {
+		return m.Query
+	}
+	return nil
+}
+
+func (m *SuggestGeoTargetConstantsRequest) GetLocationNames() *SuggestGeoTargetConstantsRequest_LocationNames {
+	if x, ok := m.GetQuery().(*SuggestGeoTargetConstantsRequest_LocationNames_); ok {
+		return x.LocationNames
+	}
+	return nil
+}
+
+func (m *SuggestGeoTargetConstantsRequest) GetGeoTargets() *SuggestGeoTargetConstantsRequest_GeoTargets {
+	if x, ok := m.GetQuery().(*SuggestGeoTargetConstantsRequest_GeoTargets_); ok {
+		return x.GeoTargets
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*SuggestGeoTargetConstantsRequest) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*SuggestGeoTargetConstantsRequest_LocationNames_)(nil),
+		(*SuggestGeoTargetConstantsRequest_GeoTargets_)(nil),
+	}
+}
+
+// A list of location names.
+type SuggestGeoTargetConstantsRequest_LocationNames struct {
+	// A list of location names.
+	Names                []*wrappers.StringValue `protobuf:"bytes,1,rep,name=names,proto3" json:"names,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *SuggestGeoTargetConstantsRequest_LocationNames) Reset() {
+	*m = SuggestGeoTargetConstantsRequest_LocationNames{}
+}
+func (m *SuggestGeoTargetConstantsRequest_LocationNames) String() string {
+	return proto.CompactTextString(m)
+}
+func (*SuggestGeoTargetConstantsRequest_LocationNames) ProtoMessage() {}
+func (*SuggestGeoTargetConstantsRequest_LocationNames) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f7e25d1f3e9af1ca, []int{1, 0}
+}
+
+func (m *SuggestGeoTargetConstantsRequest_LocationNames) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SuggestGeoTargetConstantsRequest_LocationNames.Unmarshal(m, b)
+}
+func (m *SuggestGeoTargetConstantsRequest_LocationNames) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SuggestGeoTargetConstantsRequest_LocationNames.Marshal(b, m, deterministic)
+}
+func (m *SuggestGeoTargetConstantsRequest_LocationNames) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SuggestGeoTargetConstantsRequest_LocationNames.Merge(m, src)
+}
+func (m *SuggestGeoTargetConstantsRequest_LocationNames) XXX_Size() int {
+	return xxx_messageInfo_SuggestGeoTargetConstantsRequest_LocationNames.Size(m)
+}
+func (m *SuggestGeoTargetConstantsRequest_LocationNames) XXX_DiscardUnknown() {
+	xxx_messageInfo_SuggestGeoTargetConstantsRequest_LocationNames.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SuggestGeoTargetConstantsRequest_LocationNames proto.InternalMessageInfo
+
+func (m *SuggestGeoTargetConstantsRequest_LocationNames) GetNames() []*wrappers.StringValue {
+	if m != nil {
+		return m.Names
+	}
+	return nil
+}
+
+// A list of geo target constant resource names.
+type SuggestGeoTargetConstantsRequest_GeoTargets struct {
+	// A list of geo target constant resource names.
+	GeoTargetConstants   []*wrappers.StringValue `protobuf:"bytes,1,rep,name=geo_target_constants,json=geoTargetConstants,proto3" json:"geo_target_constants,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *SuggestGeoTargetConstantsRequest_GeoTargets) Reset() {
+	*m = SuggestGeoTargetConstantsRequest_GeoTargets{}
+}
+func (m *SuggestGeoTargetConstantsRequest_GeoTargets) String() string {
+	return proto.CompactTextString(m)
+}
+func (*SuggestGeoTargetConstantsRequest_GeoTargets) ProtoMessage() {}
+func (*SuggestGeoTargetConstantsRequest_GeoTargets) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f7e25d1f3e9af1ca, []int{1, 1}
+}
+
+func (m *SuggestGeoTargetConstantsRequest_GeoTargets) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SuggestGeoTargetConstantsRequest_GeoTargets.Unmarshal(m, b)
+}
+func (m *SuggestGeoTargetConstantsRequest_GeoTargets) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SuggestGeoTargetConstantsRequest_GeoTargets.Marshal(b, m, deterministic)
+}
+func (m *SuggestGeoTargetConstantsRequest_GeoTargets) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SuggestGeoTargetConstantsRequest_GeoTargets.Merge(m, src)
+}
+func (m *SuggestGeoTargetConstantsRequest_GeoTargets) XXX_Size() int {
+	return xxx_messageInfo_SuggestGeoTargetConstantsRequest_GeoTargets.Size(m)
+}
+func (m *SuggestGeoTargetConstantsRequest_GeoTargets) XXX_DiscardUnknown() {
+	xxx_messageInfo_SuggestGeoTargetConstantsRequest_GeoTargets.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SuggestGeoTargetConstantsRequest_GeoTargets proto.InternalMessageInfo
+
+func (m *SuggestGeoTargetConstantsRequest_GeoTargets) GetGeoTargetConstants() []*wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetConstants
+	}
+	return nil
+}
+
+// Response message for [GeoTargetConstantService.SuggestGeoTargetConstants][google.ads.googleads.v3.services.GeoTargetConstantService.SuggestGeoTargetConstants]
+type SuggestGeoTargetConstantsResponse struct {
+	// Geo target constant suggestions.
+	GeoTargetConstantSuggestions []*GeoTargetConstantSuggestion `protobuf:"bytes,1,rep,name=geo_target_constant_suggestions,json=geoTargetConstantSuggestions,proto3" json:"geo_target_constant_suggestions,omitempty"`
+	XXX_NoUnkeyedLiteral         struct{}                       `json:"-"`
+	XXX_unrecognized             []byte                         `json:"-"`
+	XXX_sizecache                int32                          `json:"-"`
+}
+
+func (m *SuggestGeoTargetConstantsResponse) Reset()         { *m = SuggestGeoTargetConstantsResponse{} }
+func (m *SuggestGeoTargetConstantsResponse) String() string { return proto.CompactTextString(m) }
+func (*SuggestGeoTargetConstantsResponse) ProtoMessage()    {}
+func (*SuggestGeoTargetConstantsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f7e25d1f3e9af1ca, []int{2}
+}
+
+func (m *SuggestGeoTargetConstantsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SuggestGeoTargetConstantsResponse.Unmarshal(m, b)
+}
+func (m *SuggestGeoTargetConstantsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SuggestGeoTargetConstantsResponse.Marshal(b, m, deterministic)
+}
+func (m *SuggestGeoTargetConstantsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SuggestGeoTargetConstantsResponse.Merge(m, src)
+}
+func (m *SuggestGeoTargetConstantsResponse) XXX_Size() int {
+	return xxx_messageInfo_SuggestGeoTargetConstantsResponse.Size(m)
+}
+func (m *SuggestGeoTargetConstantsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_SuggestGeoTargetConstantsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SuggestGeoTargetConstantsResponse proto.InternalMessageInfo
+
+func (m *SuggestGeoTargetConstantsResponse) GetGeoTargetConstantSuggestions() []*GeoTargetConstantSuggestion {
+	if m != nil {
+		return m.GeoTargetConstantSuggestions
+	}
+	return nil
+}
+
+// A geo target constant suggestion.
+type GeoTargetConstantSuggestion struct {
+	// The language this GeoTargetConstantSuggestion is currently translated to.
+	// It affects the name of geo target fields. For example, if locale=en, then
+	// name=Spain. If locale=es, then name=España. The default locale will be
+	// returned if no translation exists for the locale in the request.
+	Locale *wrappers.StringValue `protobuf:"bytes,1,opt,name=locale,proto3" json:"locale,omitempty"`
+	// Approximate user population that will be targeted, rounded to the
+	// nearest 100.
+	Reach *wrappers.Int64Value `protobuf:"bytes,2,opt,name=reach,proto3" json:"reach,omitempty"`
+	// If the request searched by location name, this is the location name that
+	// matched the geo target.
+	SearchTerm *wrappers.StringValue `protobuf:"bytes,3,opt,name=search_term,json=searchTerm,proto3" json:"search_term,omitempty"`
+	// The GeoTargetConstant result.
+	GeoTargetConstant *resources.GeoTargetConstant `protobuf:"bytes,4,opt,name=geo_target_constant,json=geoTargetConstant,proto3" json:"geo_target_constant,omitempty"`
+	// The list of parents of the geo target constant.
+	GeoTargetConstantParents []*resources.GeoTargetConstant `protobuf:"bytes,5,rep,name=geo_target_constant_parents,json=geoTargetConstantParents,proto3" json:"geo_target_constant_parents,omitempty"`
+	XXX_NoUnkeyedLiteral     struct{}                       `json:"-"`
+	XXX_unrecognized         []byte                         `json:"-"`
+	XXX_sizecache            int32                          `json:"-"`
+}
+
+func (m *GeoTargetConstantSuggestion) Reset()         { *m = GeoTargetConstantSuggestion{} }
+func (m *GeoTargetConstantSuggestion) String() string { return proto.CompactTextString(m) }
+func (*GeoTargetConstantSuggestion) ProtoMessage()    {}
+func (*GeoTargetConstantSuggestion) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f7e25d1f3e9af1ca, []int{3}
+}
+
+func (m *GeoTargetConstantSuggestion) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GeoTargetConstantSuggestion.Unmarshal(m, b)
+}
+func (m *GeoTargetConstantSuggestion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GeoTargetConstantSuggestion.Marshal(b, m, deterministic)
+}
+func (m *GeoTargetConstantSuggestion) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GeoTargetConstantSuggestion.Merge(m, src)
+}
+func (m *GeoTargetConstantSuggestion) XXX_Size() int {
+	return xxx_messageInfo_GeoTargetConstantSuggestion.Size(m)
+}
+func (m *GeoTargetConstantSuggestion) XXX_DiscardUnknown() {
+	xxx_messageInfo_GeoTargetConstantSuggestion.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GeoTargetConstantSuggestion proto.InternalMessageInfo
+
+func (m *GeoTargetConstantSuggestion) GetLocale() *wrappers.StringValue {
+	if m != nil {
+		return m.Locale
+	}
+	return nil
+}
+
+func (m *GeoTargetConstantSuggestion) GetReach() *wrappers.Int64Value {
+	if m != nil {
+		return m.Reach
+	}
+	return nil
+}
+
+func (m *GeoTargetConstantSuggestion) GetSearchTerm() *wrappers.StringValue {
+	if m != nil {
+		return m.SearchTerm
+	}
+	return nil
+}
+
+func (m *GeoTargetConstantSuggestion) GetGeoTargetConstant() *resources.GeoTargetConstant {
+	if m != nil {
+		return m.GeoTargetConstant
+	}
+	return nil
+}
+
+func (m *GeoTargetConstantSuggestion) GetGeoTargetConstantParents() []*resources.GeoTargetConstant {
+	if m != nil {
+		return m.GeoTargetConstantParents
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*GetGeoTargetConstantRequest)(nil), "google.ads.googleads.v3.services.GetGeoTargetConstantRequest")
+	proto.RegisterType((*SuggestGeoTargetConstantsRequest)(nil), "google.ads.googleads.v3.services.SuggestGeoTargetConstantsRequest")
+	proto.RegisterType((*SuggestGeoTargetConstantsRequest_LocationNames)(nil), "google.ads.googleads.v3.services.SuggestGeoTargetConstantsRequest.LocationNames")
+	proto.RegisterType((*SuggestGeoTargetConstantsRequest_GeoTargets)(nil), "google.ads.googleads.v3.services.SuggestGeoTargetConstantsRequest.GeoTargets")
+	proto.RegisterType((*SuggestGeoTargetConstantsResponse)(nil), "google.ads.googleads.v3.services.SuggestGeoTargetConstantsResponse")
+	proto.RegisterType((*GeoTargetConstantSuggestion)(nil), "google.ads.googleads.v3.services.GeoTargetConstantSuggestion")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/geo_target_constant_service.proto", fileDescriptor_f7e25d1f3e9af1ca)
+}
+
+var fileDescriptor_f7e25d1f3e9af1ca = []byte{
+	// 762 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x6f, 0xd3, 0x48,
+	0x14, 0x5f, 0x27, 0x4d, 0x57, 0x3b, 0x69, 0x57, 0xda, 0xd9, 0x4a, 0xeb, 0x4d, 0x4a, 0x1b, 0x42,
+	0x0f, 0xa1, 0x07, 0x5b, 0x24, 0x15, 0x07, 0x57, 0x15, 0x38, 0x39, 0xa4, 0x48, 0x50, 0x45, 0x69,
+	0x95, 0x03, 0x8a, 0x14, 0x4d, 0xed, 0x57, 0xd7, 0x92, 0xe3, 0x71, 0x67, 0x9c, 0xa0, 0x0a, 0x71,
+	0x41, 0xfd, 0x06, 0x7c, 0x01, 0xc4, 0xb1, 0x47, 0x3e, 0x46, 0x25, 0xc4, 0x81, 0x13, 0x9c, 0x38,
+	0x70, 0xe2, 0x53, 0x20, 0xdb, 0x63, 0x27, 0x95, 0x63, 0x12, 0x5a, 0x6e, 0x2f, 0x7e, 0xbf, 0xf7,
+	0xfb, 0xbd, 0xbf, 0xd3, 0xa2, 0xa6, 0x45, 0xa9, 0xe5, 0x80, 0x4a, 0x4c, 0xae, 0x46, 0x66, 0x60,
+	0x8d, 0x1b, 0x2a, 0x07, 0x36, 0xb6, 0x0d, 0xe0, 0xaa, 0x05, 0x74, 0xe0, 0x13, 0x66, 0x81, 0x3f,
+	0x30, 0xa8, 0xcb, 0x7d, 0xe2, 0xfa, 0x03, 0xe1, 0x54, 0x3c, 0x46, 0x7d, 0x8a, 0x2b, 0x51, 0xa0,
+	0x42, 0x4c, 0xae, 0x24, 0x1c, 0xca, 0xb8, 0xa1, 0xc4, 0x1c, 0xa5, 0xdd, 0x2c, 0x15, 0x06, 0x9c,
+	0x8e, 0x58, 0x86, 0x4c, 0x44, 0x5f, 0x5a, 0x8f, 0x83, 0x3d, 0x5b, 0x25, 0xae, 0x4b, 0x7d, 0xe2,
+	0xdb, 0xd4, 0xe5, 0xc2, 0xfb, 0xdf, 0x94, 0xd7, 0x70, 0x6c, 0x48, 0xc2, 0x36, 0xa7, 0x1c, 0x27,
+	0x36, 0x38, 0xe6, 0xe0, 0x18, 0x4e, 0xc9, 0xd8, 0xa6, 0x4c, 0x00, 0x36, 0x04, 0x20, 0xfc, 0x75,
+	0x3c, 0x3a, 0x51, 0x5f, 0x30, 0xe2, 0x79, 0xc0, 0x04, 0x73, 0xb5, 0x8d, 0xca, 0x6d, 0xf0, 0xdb,
+	0x40, 0x8f, 0xc2, 0xb4, 0x5a, 0x22, 0xab, 0x2e, 0x9c, 0x8d, 0x80, 0xfb, 0xb8, 0x86, 0x56, 0xe3,
+	0xec, 0x07, 0x2e, 0x19, 0x82, 0x2c, 0x55, 0xa4, 0xda, 0x5f, 0xcd, 0xfc, 0x57, 0x3d, 0xd7, 0x5d,
+	0x89, 0x3d, 0x07, 0x64, 0x08, 0xd5, 0xf7, 0x4b, 0xa8, 0x72, 0x38, 0xb2, 0x2c, 0xe0, 0x69, 0x36,
+	0x1e, 0xd3, 0xed, 0xa0, 0x65, 0x87, 0x1a, 0xc4, 0x01, 0x39, 0x5f, 0x91, 0x6a, 0xc5, 0xfa, 0xba,
+	0x68, 0xa5, 0x12, 0xa7, 0xa7, 0x1c, 0xfa, 0xcc, 0x76, 0xad, 0x1e, 0x71, 0x46, 0xd0, 0x15, 0x58,
+	0xfc, 0x08, 0xad, 0x18, 0x74, 0xe4, 0xfa, 0xec, 0x7c, 0x60, 0x50, 0x13, 0xe4, 0xc2, 0x02, 0xb1,
+	0x45, 0x11, 0xd1, 0xa2, 0x26, 0xe0, 0x73, 0xf4, 0x77, 0x40, 0x15, 0x74, 0x34, 0xac, 0x82, 0x87,
+	0x65, 0x14, 0xeb, 0x1d, 0x65, 0xde, 0x50, 0x95, 0x79, 0x25, 0x29, 0x4f, 0x05, 0x71, 0xd0, 0x04,
+	0xbe, 0xff, 0x47, 0x77, 0xd5, 0x99, 0xfe, 0x80, 0x3d, 0x54, 0x9c, 0x0c, 0x9d, 0xcb, 0xb9, 0x50,
+	0xf7, 0xd9, 0x6f, 0xd0, 0x4d, 0x3c, 0x81, 0x28, 0xb2, 0x92, 0x5f, 0xa5, 0x16, 0x5a, 0xbd, 0x96,
+	0x13, 0xae, 0xa3, 0x42, 0x5c, 0x74, 0x7e, 0x6e, 0xdf, 0x22, 0x68, 0xa9, 0x8f, 0xd0, 0x44, 0x00,
+	0x1f, 0xa0, 0xb5, 0x19, 0x9b, 0xbb, 0x18, 0x21, 0xb6, 0x52, 0x25, 0x34, 0xff, 0x44, 0x85, 0xb3,
+	0x11, 0xb0, 0xf3, 0xea, 0xa5, 0x84, 0xee, 0xfe, 0xa4, 0x52, 0xee, 0x51, 0x97, 0x03, 0xbe, 0x90,
+	0xd0, 0xe6, 0xcc, 0x03, 0x8d, 0x22, 0x83, 0x3b, 0x11, 0xa9, 0xec, 0xcd, 0x6f, 0x6c, 0x4a, 0xe7,
+	0x30, 0x61, 0xe9, 0xae, 0x5b, 0xd9, 0x4e, 0x5e, 0x7d, 0x9b, 0x0f, 0x6e, 0x25, 0x13, 0x30, 0xb5,
+	0xdc, 0xd2, 0x2f, 0x2c, 0xf7, 0x03, 0x54, 0x60, 0x40, 0x8c, 0x53, 0xb1, 0x1a, 0xe5, 0x54, 0xd0,
+	0x13, 0xd7, 0x7f, 0xb8, 0x23, 0x86, 0x13, 0x22, 0xf1, 0x1e, 0x2a, 0x72, 0x20, 0xcc, 0x38, 0x1d,
+	0xf8, 0xc0, 0x86, 0x0b, 0x9d, 0x12, 0x8a, 0x02, 0x8e, 0x80, 0x0d, 0xb1, 0x89, 0xfe, 0x9d, 0xd1,
+	0x4d, 0x79, 0x29, 0xa4, 0xd9, 0xc9, 0xec, 0x60, 0xf2, 0x8a, 0xa5, 0x5b, 0xd8, 0xfd, 0x27, 0xd5,
+	0x38, 0xcc, 0x51, 0x79, 0xd6, 0xcc, 0x3c, 0xc2, 0x20, 0x58, 0x9d, 0x42, 0x38, 0xaf, 0x9b, 0xa9,
+	0xc9, 0x29, 0xb5, 0x4e, 0xc4, 0x5a, 0xff, 0x9c, 0x47, 0x72, 0x7a, 0x44, 0xd1, 0xe8, 0xf1, 0x07,
+	0x09, 0xad, 0xcd, 0x7a, 0xeb, 0xf0, 0x42, 0x5b, 0x93, 0xf9, 0x46, 0x96, 0x6e, 0x54, 0x44, 0xf5,
+	0xf1, 0x17, 0xfd, 0xfa, 0xd3, 0xfa, 0xfa, 0xd3, 0xb7, 0x37, 0xb9, 0x6d, 0x5c, 0x0b, 0xfe, 0x62,
+	0xbc, 0xbc, 0xe6, 0xd9, 0x4b, 0x9f, 0x90, 0xba, 0xfd, 0x0a, 0x7f, 0x94, 0xd0, 0xff, 0x99, 0xc7,
+	0x83, 0x9b, 0xb7, 0x7f, 0x63, 0x4a, 0xad, 0x5b, 0x71, 0x44, 0xd7, 0x5b, 0xbd, 0x1f, 0x16, 0x76,
+	0xaf, 0xba, 0x11, 0x14, 0x96, 0xae, 0x44, 0x13, 0x57, 0xac, 0x49, 0xdb, 0xa5, 0xf2, 0x95, 0x2e,
+	0x4f, 0x64, 0x84, 0xe5, 0xd9, 0x5c, 0x31, 0xe8, 0xb0, 0x79, 0x91, 0x43, 0x5b, 0x06, 0x1d, 0xce,
+	0x4d, 0xa9, 0x79, 0x27, 0x6b, 0x03, 0x3a, 0xc1, 0x65, 0x74, 0xa4, 0xe7, 0xfb, 0x82, 0xc2, 0xa2,
+	0x0e, 0x71, 0x2d, 0x85, 0x32, 0x4b, 0xb5, 0xc0, 0x0d, 0xef, 0x46, 0x9d, 0x88, 0x66, 0xff, 0xb7,
+	0xb0, 0x1b, 0x1b, 0xef, 0x72, 0xf9, 0xb6, 0xae, 0x5f, 0xe6, 0x2a, 0xed, 0x88, 0x50, 0x37, 0xb9,
+	0x12, 0x99, 0x81, 0xd5, 0x6b, 0x28, 0x42, 0x98, 0x5f, 0xc5, 0x90, 0xbe, 0x6e, 0xf2, 0x7e, 0x02,
+	0xe9, 0xf7, 0x1a, 0xfd, 0x18, 0xf2, 0x3d, 0xb7, 0x15, 0x7d, 0xd7, 0x34, 0xdd, 0xe4, 0x9a, 0x96,
+	0x80, 0x34, 0xad, 0xd7, 0xd0, 0xb4, 0x18, 0x76, 0xbc, 0x1c, 0xe6, 0xd9, 0xf8, 0x11, 0x00, 0x00,
+	0xff, 0xff, 0x84, 0x49, 0xb7, 0x69, 0xd4, 0x08, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// GeoTargetConstantServiceClient is the client API for GeoTargetConstantService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type GeoTargetConstantServiceClient interface {
+	// Returns the requested geo target constant in full detail.
+	GetGeoTargetConstant(ctx context.Context, in *GetGeoTargetConstantRequest, opts ...grpc.CallOption) (*resources.GeoTargetConstant, error)
+	// Returns GeoTargetConstant suggestions by location name or by resource name.
+	SuggestGeoTargetConstants(ctx context.Context, in *SuggestGeoTargetConstantsRequest, opts ...grpc.CallOption) (*SuggestGeoTargetConstantsResponse, error)
+}
+
+type geoTargetConstantServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewGeoTargetConstantServiceClient(cc grpc.ClientConnInterface) GeoTargetConstantServiceClient {
+	return &geoTargetConstantServiceClient{cc}
+}
+
+func (c *geoTargetConstantServiceClient) GetGeoTargetConstant(ctx context.Context, in *GetGeoTargetConstantRequest, opts ...grpc.CallOption) (*resources.GeoTargetConstant, error) {
+	out := new(resources.GeoTargetConstant)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GeoTargetConstantService/GetGeoTargetConstant", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *geoTargetConstantServiceClient) SuggestGeoTargetConstants(ctx context.Context, in *SuggestGeoTargetConstantsRequest, opts ...grpc.CallOption) (*SuggestGeoTargetConstantsResponse, error) {
+	out := new(SuggestGeoTargetConstantsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GeoTargetConstantService/SuggestGeoTargetConstants", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// GeoTargetConstantServiceServer is the server API for GeoTargetConstantService service.
+type GeoTargetConstantServiceServer interface {
+	// Returns the requested geo target constant in full detail.
+	GetGeoTargetConstant(context.Context, *GetGeoTargetConstantRequest) (*resources.GeoTargetConstant, error)
+	// Returns GeoTargetConstant suggestions by location name or by resource name.
+	SuggestGeoTargetConstants(context.Context, *SuggestGeoTargetConstantsRequest) (*SuggestGeoTargetConstantsResponse, error)
+}
+
+// UnimplementedGeoTargetConstantServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedGeoTargetConstantServiceServer struct {
+}
+
+func (*UnimplementedGeoTargetConstantServiceServer) GetGeoTargetConstant(ctx context.Context, req *GetGeoTargetConstantRequest) (*resources.GeoTargetConstant, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetGeoTargetConstant not implemented")
+}
+func (*UnimplementedGeoTargetConstantServiceServer) SuggestGeoTargetConstants(ctx context.Context, req *SuggestGeoTargetConstantsRequest) (*SuggestGeoTargetConstantsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SuggestGeoTargetConstants not implemented")
+}
+
+func RegisterGeoTargetConstantServiceServer(s *grpc.Server, srv GeoTargetConstantServiceServer) {
+	s.RegisterService(&_GeoTargetConstantService_serviceDesc, srv)
+}
+
+func _GeoTargetConstantService_GetGeoTargetConstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetGeoTargetConstantRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GeoTargetConstantServiceServer).GetGeoTargetConstant(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.GeoTargetConstantService/GetGeoTargetConstant",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GeoTargetConstantServiceServer).GetGeoTargetConstant(ctx, req.(*GetGeoTargetConstantRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _GeoTargetConstantService_SuggestGeoTargetConstants_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SuggestGeoTargetConstantsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GeoTargetConstantServiceServer).SuggestGeoTargetConstants(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.GeoTargetConstantService/SuggestGeoTargetConstants",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GeoTargetConstantServiceServer).SuggestGeoTargetConstants(ctx, req.(*SuggestGeoTargetConstantsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _GeoTargetConstantService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.GeoTargetConstantService",
+	HandlerType: (*GeoTargetConstantServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetGeoTargetConstant",
+			Handler:    _GeoTargetConstantService_GetGeoTargetConstant_Handler,
+		},
+		{
+			MethodName: "SuggestGeoTargetConstants",
+			Handler:    _GeoTargetConstantService_SuggestGeoTargetConstants_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/geo_target_constant_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/geographic_view_service.pb.go b/googleapis/ads/googleads/v3/services/geographic_view_service.pb.go
new file mode 100644
index 0000000..90de7c1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/geographic_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/geographic_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [GeographicViewService.GetGeographicView][google.ads.googleads.v3.services.GeographicViewService.GetGeographicView].
+type GetGeographicViewRequest struct {
+	// Required. The resource name of the geographic view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetGeographicViewRequest) Reset()         { *m = GetGeographicViewRequest{} }
+func (m *GetGeographicViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetGeographicViewRequest) ProtoMessage()    {}
+func (*GetGeographicViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a7b00c6e68aa0240, []int{0}
+}
+
+func (m *GetGeographicViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetGeographicViewRequest.Unmarshal(m, b)
+}
+func (m *GetGeographicViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetGeographicViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetGeographicViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetGeographicViewRequest.Merge(m, src)
+}
+func (m *GetGeographicViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetGeographicViewRequest.Size(m)
+}
+func (m *GetGeographicViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetGeographicViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetGeographicViewRequest proto.InternalMessageInfo
+
+func (m *GetGeographicViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetGeographicViewRequest)(nil), "google.ads.googleads.v3.services.GetGeographicViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/geographic_view_service.proto", fileDescriptor_a7b00c6e68aa0240)
+}
+
+var fileDescriptor_a7b00c6e68aa0240 = []byte{
+	// 414 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0x8b, 0xd4, 0x40,
+	0x1c, 0x25, 0x39, 0x10, 0x0c, 0x5a, 0x18, 0x10, 0x97, 0x28, 0xb8, 0x1c, 0x57, 0x1c, 0x57, 0xcc,
+	0x70, 0xa6, 0x10, 0x46, 0x14, 0x66, 0x11, 0xa2, 0x8d, 0x1c, 0x27, 0xa4, 0x90, 0x40, 0x98, 0x4b,
+	0x7e, 0xce, 0x0d, 0x24, 0x99, 0x38, 0x93, 0xcd, 0x16, 0x62, 0xa1, 0xf8, 0x0d, 0xfc, 0x06, 0x96,
+	0x7e, 0x94, 0x05, 0x2b, 0x3b, 0x2b, 0x0b, 0x2b, 0x3f, 0x85, 0x64, 0x27, 0x93, 0xdd, 0x70, 0x1b,
+	0xb6, 0x7b, 0xcc, 0x7b, 0xef, 0xf7, 0x7e, 0x7f, 0xc6, 0x7b, 0xc1, 0xa5, 0xe4, 0x05, 0x60, 0x96,
+	0x6b, 0x6c, 0x60, 0x87, 0xda, 0x10, 0x6b, 0x50, 0xad, 0xc8, 0x40, 0x63, 0x0e, 0x92, 0x2b, 0x56,
+	0x5f, 0x8b, 0x2c, 0x6d, 0x05, 0xac, 0xd2, 0x9e, 0x40, 0xb5, 0x92, 0x8d, 0xf4, 0xe7, 0xc6, 0x84,
+	0x58, 0xae, 0xd1, 0xe0, 0x47, 0x6d, 0x88, 0xac, 0x3f, 0x78, 0x3a, 0x95, 0xa0, 0x40, 0xcb, 0xa5,
+	0xda, 0x13, 0x61, 0x4a, 0x07, 0x8f, 0xac, 0xb1, 0x16, 0x98, 0x55, 0x95, 0x6c, 0x58, 0x23, 0x64,
+	0xa5, 0x7b, 0xf6, 0xc1, 0x0e, 0x9b, 0x15, 0x02, 0xaa, 0xa6, 0x27, 0x1e, 0xef, 0x10, 0xef, 0x05,
+	0x14, 0x79, 0x7a, 0x05, 0xd7, 0xac, 0x15, 0x52, 0x19, 0xc1, 0xf1, 0x4b, 0x6f, 0x16, 0x41, 0x13,
+	0x0d, 0x99, 0xb1, 0x80, 0xd5, 0x25, 0x7c, 0x58, 0x82, 0x6e, 0xfc, 0x53, 0xef, 0xae, 0x6d, 0x2b,
+	0xad, 0x58, 0x09, 0x33, 0x67, 0xee, 0x9c, 0xde, 0x5e, 0x1c, 0xfd, 0xa1, 0xee, 0xe5, 0x1d, 0xcb,
+	0xbc, 0x61, 0x25, 0x3c, 0xf9, 0xea, 0x7a, 0xf7, 0xc7, 0x35, 0xde, 0x9a, 0x89, 0xfd, 0x9f, 0x8e,
+	0x77, 0xef, 0x46, 0x80, 0x4f, 0xd0, 0xa1, 0x4d, 0xa1, 0xa9, 0xae, 0x82, 0xf3, 0x49, 0xef, 0xb0,
+	0x43, 0x34, 0x76, 0x1e, 0xbf, 0xfe, 0x4d, 0xc7, 0x93, 0x7c, 0xf9, 0xf5, 0xf7, 0x9b, 0x1b, 0xfa,
+	0xe7, 0xdd, 0xe6, 0x3f, 0x8e, 0x98, 0xe7, 0xd9, 0x52, 0x37, 0xb2, 0x04, 0xa5, 0xf1, 0xd9, 0xce,
+	0x29, 0xba, 0x32, 0x1a, 0x9f, 0x7d, 0x0a, 0x1e, 0xae, 0xe9, 0x6c, 0x1b, 0xda, 0xa3, 0x5a, 0x68,
+	0x94, 0xc9, 0x72, 0xf1, 0xd9, 0xf5, 0x4e, 0x32, 0x59, 0x1e, 0x1c, 0x6e, 0x11, 0xec, 0x5d, 0xd6,
+	0x45, 0x77, 0x91, 0x0b, 0xe7, 0xdd, 0xab, 0xde, 0xcf, 0x65, 0xc1, 0x2a, 0x8e, 0xa4, 0xe2, 0x98,
+	0x43, 0xb5, 0xb9, 0x17, 0xde, 0x26, 0x4e, 0xff, 0xd2, 0x67, 0x16, 0x7c, 0x77, 0x8f, 0x22, 0x4a,
+	0x7f, 0xb8, 0xf3, 0xc8, 0x14, 0xa4, 0xb9, 0x46, 0x06, 0x76, 0x28, 0x0e, 0x51, 0x1f, 0xac, 0xd7,
+	0x56, 0x92, 0xd0, 0x5c, 0x27, 0x83, 0x24, 0x89, 0xc3, 0xc4, 0x4a, 0xfe, 0xb9, 0x27, 0xe6, 0x9d,
+	0x10, 0x9a, 0x6b, 0x42, 0x06, 0x11, 0x21, 0x71, 0x48, 0x88, 0x95, 0x5d, 0xdd, 0xda, 0xf4, 0x19,
+	0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x84, 0x40, 0xf7, 0xae, 0x4c, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// GeographicViewServiceClient is the client API for GeographicViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type GeographicViewServiceClient interface {
+	// Returns the requested geographic view in full detail.
+	GetGeographicView(ctx context.Context, in *GetGeographicViewRequest, opts ...grpc.CallOption) (*resources.GeographicView, error)
+}
+
+type geographicViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewGeographicViewServiceClient(cc grpc.ClientConnInterface) GeographicViewServiceClient {
+	return &geographicViewServiceClient{cc}
+}
+
+func (c *geographicViewServiceClient) GetGeographicView(ctx context.Context, in *GetGeographicViewRequest, opts ...grpc.CallOption) (*resources.GeographicView, error) {
+	out := new(resources.GeographicView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GeographicViewService/GetGeographicView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// GeographicViewServiceServer is the server API for GeographicViewService service.
+type GeographicViewServiceServer interface {
+	// Returns the requested geographic view in full detail.
+	GetGeographicView(context.Context, *GetGeographicViewRequest) (*resources.GeographicView, error)
+}
+
+// UnimplementedGeographicViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedGeographicViewServiceServer struct {
+}
+
+func (*UnimplementedGeographicViewServiceServer) GetGeographicView(ctx context.Context, req *GetGeographicViewRequest) (*resources.GeographicView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetGeographicView not implemented")
+}
+
+func RegisterGeographicViewServiceServer(s *grpc.Server, srv GeographicViewServiceServer) {
+	s.RegisterService(&_GeographicViewService_serviceDesc, srv)
+}
+
+func _GeographicViewService_GetGeographicView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetGeographicViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GeographicViewServiceServer).GetGeographicView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.GeographicViewService/GetGeographicView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GeographicViewServiceServer).GetGeographicView(ctx, req.(*GetGeographicViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _GeographicViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.GeographicViewService",
+	HandlerType: (*GeographicViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetGeographicView",
+			Handler:    _GeographicViewService_GetGeographicView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/geographic_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/google_ads_field_service.pb.go b/googleapis/ads/googleads/v3/services/google_ads_field_service.pb.go
new file mode 100644
index 0000000..7ac6ef2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/google_ads_field_service.pb.go
@@ -0,0 +1,364 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/google_ads_field_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [GoogleAdsFieldService.GetGoogleAdsField][google.ads.googleads.v3.services.GoogleAdsFieldService.GetGoogleAdsField].
+type GetGoogleAdsFieldRequest struct {
+	// Required. The resource name of the field to get.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetGoogleAdsFieldRequest) Reset()         { *m = GetGoogleAdsFieldRequest{} }
+func (m *GetGoogleAdsFieldRequest) String() string { return proto.CompactTextString(m) }
+func (*GetGoogleAdsFieldRequest) ProtoMessage()    {}
+func (*GetGoogleAdsFieldRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b52f3131d596f8fb, []int{0}
+}
+
+func (m *GetGoogleAdsFieldRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetGoogleAdsFieldRequest.Unmarshal(m, b)
+}
+func (m *GetGoogleAdsFieldRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetGoogleAdsFieldRequest.Marshal(b, m, deterministic)
+}
+func (m *GetGoogleAdsFieldRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetGoogleAdsFieldRequest.Merge(m, src)
+}
+func (m *GetGoogleAdsFieldRequest) XXX_Size() int {
+	return xxx_messageInfo_GetGoogleAdsFieldRequest.Size(m)
+}
+func (m *GetGoogleAdsFieldRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetGoogleAdsFieldRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetGoogleAdsFieldRequest proto.InternalMessageInfo
+
+func (m *GetGoogleAdsFieldRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [GoogleAdsFieldService.SearchGoogleAdsFields][google.ads.googleads.v3.services.GoogleAdsFieldService.SearchGoogleAdsFields].
+type SearchGoogleAdsFieldsRequest struct {
+	// Required. The query string.
+	Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"`
+	// Token of the page to retrieve. If not specified, the first page of
+	// results will be returned. Use the value obtained from `next_page_token`
+	// in the previous response in order to request the next page of results.
+	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// Number of elements to retrieve in a single page.
+	// When too large a page is requested, the server may decide to further
+	// limit the number of returned resources.
+	PageSize             int32    `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SearchGoogleAdsFieldsRequest) Reset()         { *m = SearchGoogleAdsFieldsRequest{} }
+func (m *SearchGoogleAdsFieldsRequest) String() string { return proto.CompactTextString(m) }
+func (*SearchGoogleAdsFieldsRequest) ProtoMessage()    {}
+func (*SearchGoogleAdsFieldsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b52f3131d596f8fb, []int{1}
+}
+
+func (m *SearchGoogleAdsFieldsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchGoogleAdsFieldsRequest.Unmarshal(m, b)
+}
+func (m *SearchGoogleAdsFieldsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchGoogleAdsFieldsRequest.Marshal(b, m, deterministic)
+}
+func (m *SearchGoogleAdsFieldsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchGoogleAdsFieldsRequest.Merge(m, src)
+}
+func (m *SearchGoogleAdsFieldsRequest) XXX_Size() int {
+	return xxx_messageInfo_SearchGoogleAdsFieldsRequest.Size(m)
+}
+func (m *SearchGoogleAdsFieldsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchGoogleAdsFieldsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchGoogleAdsFieldsRequest proto.InternalMessageInfo
+
+func (m *SearchGoogleAdsFieldsRequest) GetQuery() string {
+	if m != nil {
+		return m.Query
+	}
+	return ""
+}
+
+func (m *SearchGoogleAdsFieldsRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *SearchGoogleAdsFieldsRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+// Response message for [GoogleAdsFieldService.SearchGoogleAdsFields][google.ads.googleads.v3.services.GoogleAdsFieldService.SearchGoogleAdsFields].
+type SearchGoogleAdsFieldsResponse struct {
+	// The list of fields that matched the query.
+	Results []*resources.GoogleAdsField `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
+	// Pagination token used to retrieve the next page of results. Pass the
+	// content of this string as the `page_token` attribute of the next request.
+	// `next_page_token` is not returned for the last page.
+	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+	// Total number of results that match the query ignoring the LIMIT clause.
+	TotalResultsCount    int64    `protobuf:"varint,3,opt,name=total_results_count,json=totalResultsCount,proto3" json:"total_results_count,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SearchGoogleAdsFieldsResponse) Reset()         { *m = SearchGoogleAdsFieldsResponse{} }
+func (m *SearchGoogleAdsFieldsResponse) String() string { return proto.CompactTextString(m) }
+func (*SearchGoogleAdsFieldsResponse) ProtoMessage()    {}
+func (*SearchGoogleAdsFieldsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b52f3131d596f8fb, []int{2}
+}
+
+func (m *SearchGoogleAdsFieldsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchGoogleAdsFieldsResponse.Unmarshal(m, b)
+}
+func (m *SearchGoogleAdsFieldsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchGoogleAdsFieldsResponse.Marshal(b, m, deterministic)
+}
+func (m *SearchGoogleAdsFieldsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchGoogleAdsFieldsResponse.Merge(m, src)
+}
+func (m *SearchGoogleAdsFieldsResponse) XXX_Size() int {
+	return xxx_messageInfo_SearchGoogleAdsFieldsResponse.Size(m)
+}
+func (m *SearchGoogleAdsFieldsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchGoogleAdsFieldsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchGoogleAdsFieldsResponse proto.InternalMessageInfo
+
+func (m *SearchGoogleAdsFieldsResponse) GetResults() []*resources.GoogleAdsField {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+func (m *SearchGoogleAdsFieldsResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+func (m *SearchGoogleAdsFieldsResponse) GetTotalResultsCount() int64 {
+	if m != nil {
+		return m.TotalResultsCount
+	}
+	return 0
+}
+
+func init() {
+	proto.RegisterType((*GetGoogleAdsFieldRequest)(nil), "google.ads.googleads.v3.services.GetGoogleAdsFieldRequest")
+	proto.RegisterType((*SearchGoogleAdsFieldsRequest)(nil), "google.ads.googleads.v3.services.SearchGoogleAdsFieldsRequest")
+	proto.RegisterType((*SearchGoogleAdsFieldsResponse)(nil), "google.ads.googleads.v3.services.SearchGoogleAdsFieldsResponse")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/google_ads_field_service.proto", fileDescriptor_b52f3131d596f8fb)
+}
+
+var fileDescriptor_b52f3131d596f8fb = []byte{
+	// 584 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x41, 0x6b, 0xd4, 0x40,
+	0x14, 0x26, 0x09, 0x55, 0x3b, 0x5a, 0xa4, 0x91, 0x62, 0x4c, 0x5b, 0xba, 0x84, 0xaa, 0x4b, 0xc1,
+	0x09, 0x36, 0x17, 0x89, 0xd4, 0x92, 0x2a, 0xae, 0x20, 0xc8, 0x92, 0x95, 0x3d, 0xc8, 0x42, 0x98,
+	0x26, 0xcf, 0x34, 0x98, 0xcd, 0x6c, 0x33, 0x93, 0x45, 0x2b, 0x1e, 0xf4, 0x2f, 0xf8, 0x0f, 0x3c,
+	0xfa, 0x2f, 0x14, 0x41, 0xe8, 0xd5, 0x5b, 0x4f, 0x1e, 0x3c, 0xf9, 0x2b, 0x24, 0x99, 0xcc, 0x76,
+	0xb7, 0xdd, 0x75, 0xd1, 0xdb, 0xec, 0xfb, 0xbe, 0xf9, 0xbe, 0xf7, 0xf6, 0x7b, 0x13, 0xb4, 0x1b,
+	0x53, 0x1a, 0xa7, 0x60, 0x93, 0x88, 0xd9, 0xe2, 0x58, 0x9e, 0x86, 0x8e, 0xcd, 0x20, 0x1f, 0x26,
+	0x21, 0xc8, 0x6a, 0x40, 0x22, 0x16, 0xbc, 0x4c, 0x20, 0x8d, 0x82, 0x1a, 0xc1, 0x83, 0x9c, 0x72,
+	0xaa, 0x37, 0x04, 0x8e, 0x49, 0xc4, 0xf0, 0x48, 0x00, 0x0f, 0x1d, 0x2c, 0x05, 0xcc, 0x7b, 0xb3,
+	0x2c, 0x72, 0x60, 0xb4, 0xc8, 0xa7, 0x79, 0x08, 0x6d, 0x73, 0x4d, 0xde, 0x1c, 0x24, 0x36, 0xc9,
+	0x32, 0xca, 0x09, 0x4f, 0x68, 0xc6, 0x6a, 0xf4, 0xfa, 0x18, 0x1a, 0xa6, 0x09, 0x64, 0xbc, 0x06,
+	0x36, 0xc6, 0x00, 0xd1, 0xf2, 0x3e, 0x1c, 0x90, 0x61, 0x42, 0x73, 0x41, 0xb0, 0x1e, 0x21, 0xa3,
+	0x05, 0xbc, 0x55, 0xb1, 0xbc, 0x88, 0x3d, 0x2e, 0x39, 0x3e, 0x1c, 0x16, 0xc0, 0xb8, 0xde, 0x44,
+	0x4b, 0xb2, 0xaf, 0x20, 0x23, 0x7d, 0x30, 0x94, 0x86, 0xd2, 0x5c, 0xdc, 0xd3, 0x7e, 0x7a, 0xaa,
+	0x7f, 0x45, 0x22, 0xcf, 0x48, 0x1f, 0xac, 0x02, 0xad, 0x75, 0x80, 0xe4, 0xe1, 0xc1, 0xa4, 0x10,
+	0x93, 0x4a, 0x37, 0xd0, 0xc2, 0x61, 0x01, 0xf9, 0x9b, 0x71, 0x05, 0x51, 0xd1, 0xd7, 0x11, 0x1a,
+	0x90, 0x18, 0x02, 0x4e, 0x5f, 0x41, 0x66, 0xa8, 0x25, 0xee, 0x2f, 0x96, 0x95, 0xe7, 0x65, 0x41,
+	0x5f, 0x45, 0xd5, 0x8f, 0x80, 0x25, 0x47, 0x60, 0x68, 0x0d, 0xa5, 0xb9, 0xe0, 0x5f, 0x2a, 0x0b,
+	0x9d, 0xe4, 0x08, 0xac, 0x6f, 0x0a, 0x5a, 0x9f, 0xe1, 0xcb, 0x06, 0x34, 0x63, 0xa0, 0x3f, 0x45,
+	0x17, 0x73, 0x60, 0x45, 0xca, 0x99, 0xa1, 0x34, 0xb4, 0xe6, 0xe5, 0xed, 0xbb, 0x78, 0x56, 0x48,
+	0xa3, 0x08, 0xf0, 0x99, 0x7f, 0x43, 0x2a, 0xe8, 0xb7, 0xd0, 0xd5, 0x0c, 0x5e, 0xf3, 0xe0, 0x5c,
+	0xbf, 0x4b, 0x65, 0xb9, 0x3d, 0xea, 0x19, 0xa3, 0x6b, 0x9c, 0x72, 0x92, 0x06, 0xf5, 0xc5, 0x20,
+	0xa4, 0x45, 0xc6, 0xab, 0xee, 0x35, 0x7f, 0xb9, 0x82, 0x7c, 0x81, 0x3c, 0x2c, 0x81, 0xed, 0xaf,
+	0x1a, 0x5a, 0x99, 0xf4, 0xec, 0x88, 0x85, 0xd1, 0xbf, 0x28, 0x68, 0xf9, 0x5c, 0x3c, 0xba, 0x8b,
+	0xe7, 0x2d, 0x1a, 0x9e, 0x95, 0xa9, 0xf9, 0xef, 0xf3, 0x5b, 0x3b, 0x27, 0xde, 0xe4, 0x1e, 0x7c,
+	0xf8, 0xf1, 0xeb, 0xa3, 0x7a, 0x5b, 0xbf, 0x59, 0x2e, 0xee, 0xdb, 0x09, 0x64, 0x27, 0x9e, 0xcc,
+	0xc1, 0xde, 0x7a, 0xa7, 0x7f, 0x57, 0xd0, 0xca, 0xd4, 0x90, 0xf4, 0x07, 0xf3, 0xe7, 0xf8, 0xdb,
+	0x56, 0x99, 0xbb, 0xff, 0x7d, 0x5f, 0x6c, 0x87, 0x75, 0xe7, 0xc4, 0x13, 0x5b, 0x58, 0x4d, 0xb4,
+	0x61, 0x99, 0xe5, 0x44, 0x67, 0x46, 0x70, 0x59, 0x25, 0xe1, 0x2a, 0x5b, 0xe6, 0xea, 0xb1, 0x67,
+	0x9c, 0xda, 0xd4, 0xa7, 0x41, 0xc2, 0x70, 0x48, 0xfb, 0x7b, 0xef, 0x55, 0xb4, 0x19, 0xd2, 0xfe,
+	0xdc, 0x96, 0xf6, 0xcc, 0xa9, 0x51, 0xb7, 0xcb, 0xd7, 0xd8, 0x56, 0x5e, 0x3c, 0xa9, 0xef, 0xc7,
+	0x34, 0x25, 0x59, 0x8c, 0x69, 0x1e, 0xdb, 0x31, 0x64, 0xd5, 0x5b, 0xb5, 0x4f, 0x1d, 0x67, 0x7f,
+	0xa3, 0xee, 0xcb, 0xc3, 0x27, 0x55, 0x6b, 0x79, 0xde, 0x67, 0xb5, 0x21, 0xec, 0xb0, 0x17, 0x8d,
+	0x05, 0x8b, 0xbb, 0x0e, 0xae, 0x8d, 0xd9, 0xb1, 0xa4, 0xf4, 0xbc, 0x88, 0xf5, 0x46, 0x94, 0x5e,
+	0xd7, 0xe9, 0x49, 0xca, 0x6f, 0x75, 0x53, 0xd4, 0x5d, 0xd7, 0x8b, 0x98, 0xeb, 0x8e, 0x48, 0xae,
+	0xdb, 0x75, 0x5c, 0x57, 0xd2, 0xf6, 0x2f, 0x54, 0x7d, 0x3a, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff,
+	0x92, 0xff, 0xc6, 0x84, 0x4a, 0x05, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// GoogleAdsFieldServiceClient is the client API for GoogleAdsFieldService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type GoogleAdsFieldServiceClient interface {
+	// Returns just the requested field.
+	GetGoogleAdsField(ctx context.Context, in *GetGoogleAdsFieldRequest, opts ...grpc.CallOption) (*resources.GoogleAdsField, error)
+	// Returns all fields that match the search query.
+	SearchGoogleAdsFields(ctx context.Context, in *SearchGoogleAdsFieldsRequest, opts ...grpc.CallOption) (*SearchGoogleAdsFieldsResponse, error)
+}
+
+type googleAdsFieldServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewGoogleAdsFieldServiceClient(cc grpc.ClientConnInterface) GoogleAdsFieldServiceClient {
+	return &googleAdsFieldServiceClient{cc}
+}
+
+func (c *googleAdsFieldServiceClient) GetGoogleAdsField(ctx context.Context, in *GetGoogleAdsFieldRequest, opts ...grpc.CallOption) (*resources.GoogleAdsField, error) {
+	out := new(resources.GoogleAdsField)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GoogleAdsFieldService/GetGoogleAdsField", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *googleAdsFieldServiceClient) SearchGoogleAdsFields(ctx context.Context, in *SearchGoogleAdsFieldsRequest, opts ...grpc.CallOption) (*SearchGoogleAdsFieldsResponse, error) {
+	out := new(SearchGoogleAdsFieldsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GoogleAdsFieldService/SearchGoogleAdsFields", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// GoogleAdsFieldServiceServer is the server API for GoogleAdsFieldService service.
+type GoogleAdsFieldServiceServer interface {
+	// Returns just the requested field.
+	GetGoogleAdsField(context.Context, *GetGoogleAdsFieldRequest) (*resources.GoogleAdsField, error)
+	// Returns all fields that match the search query.
+	SearchGoogleAdsFields(context.Context, *SearchGoogleAdsFieldsRequest) (*SearchGoogleAdsFieldsResponse, error)
+}
+
+// UnimplementedGoogleAdsFieldServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedGoogleAdsFieldServiceServer struct {
+}
+
+func (*UnimplementedGoogleAdsFieldServiceServer) GetGoogleAdsField(ctx context.Context, req *GetGoogleAdsFieldRequest) (*resources.GoogleAdsField, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetGoogleAdsField not implemented")
+}
+func (*UnimplementedGoogleAdsFieldServiceServer) SearchGoogleAdsFields(ctx context.Context, req *SearchGoogleAdsFieldsRequest) (*SearchGoogleAdsFieldsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SearchGoogleAdsFields not implemented")
+}
+
+func RegisterGoogleAdsFieldServiceServer(s *grpc.Server, srv GoogleAdsFieldServiceServer) {
+	s.RegisterService(&_GoogleAdsFieldService_serviceDesc, srv)
+}
+
+func _GoogleAdsFieldService_GetGoogleAdsField_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetGoogleAdsFieldRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GoogleAdsFieldServiceServer).GetGoogleAdsField(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.GoogleAdsFieldService/GetGoogleAdsField",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GoogleAdsFieldServiceServer).GetGoogleAdsField(ctx, req.(*GetGoogleAdsFieldRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _GoogleAdsFieldService_SearchGoogleAdsFields_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SearchGoogleAdsFieldsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GoogleAdsFieldServiceServer).SearchGoogleAdsFields(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.GoogleAdsFieldService/SearchGoogleAdsFields",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GoogleAdsFieldServiceServer).SearchGoogleAdsFields(ctx, req.(*SearchGoogleAdsFieldsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _GoogleAdsFieldService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.GoogleAdsFieldService",
+	HandlerType: (*GoogleAdsFieldServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetGoogleAdsField",
+			Handler:    _GoogleAdsFieldService_GetGoogleAdsField_Handler,
+		},
+		{
+			MethodName: "SearchGoogleAdsFields",
+			Handler:    _GoogleAdsFieldService_SearchGoogleAdsFields_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/google_ads_field_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/google_ads_service.pb.go b/googleapis/ads/googleads/v3/services/google_ads_service.pb.go
new file mode 100644
index 0000000..cb800e3
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/google_ads_service.pb.go
@@ -0,0 +1,3323 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/google_ads_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [GoogleAdsService.Search][google.ads.googleads.v3.services.GoogleAdsService.Search].
+type SearchGoogleAdsRequest struct {
+	// Required. The ID of the customer being queried.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The query string.
+	Query string `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"`
+	// Token of the page to retrieve. If not specified, the first
+	// page of results will be returned. Use the value obtained from
+	// `next_page_token` in the previous response in order to request
+	// the next page of results.
+	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// Number of elements to retrieve in a single page.
+	// When too large a page is requested, the server may decide to
+	// further limit the number of returned resources.
+	PageSize int32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	// If true, the request is validated but not executed.
+	ValidateOnly bool `protobuf:"varint,5,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	// If true, the total number of results that match the query ignoring the
+	// LIMIT clause will be included in the response.
+	// Default is false.
+	ReturnTotalResultsCount bool `protobuf:"varint,7,opt,name=return_total_results_count,json=returnTotalResultsCount,proto3" json:"return_total_results_count,omitempty"`
+	// Determines whether a summary row will be returned. By default, summary row
+	// is not returned. If requested, the summary row will be sent in a response
+	// by itself after all other query results are returned.
+	SummaryRowSetting    enums.SummaryRowSettingEnum_SummaryRowSetting `protobuf:"varint,8,opt,name=summary_row_setting,json=summaryRowSetting,proto3,enum=google.ads.googleads.v3.enums.SummaryRowSettingEnum_SummaryRowSetting" json:"summary_row_setting,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
+	XXX_unrecognized     []byte                                        `json:"-"`
+	XXX_sizecache        int32                                         `json:"-"`
+}
+
+func (m *SearchGoogleAdsRequest) Reset()         { *m = SearchGoogleAdsRequest{} }
+func (m *SearchGoogleAdsRequest) String() string { return proto.CompactTextString(m) }
+func (*SearchGoogleAdsRequest) ProtoMessage()    {}
+func (*SearchGoogleAdsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da24cac89ef496be, []int{0}
+}
+
+func (m *SearchGoogleAdsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchGoogleAdsRequest.Unmarshal(m, b)
+}
+func (m *SearchGoogleAdsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchGoogleAdsRequest.Marshal(b, m, deterministic)
+}
+func (m *SearchGoogleAdsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchGoogleAdsRequest.Merge(m, src)
+}
+func (m *SearchGoogleAdsRequest) XXX_Size() int {
+	return xxx_messageInfo_SearchGoogleAdsRequest.Size(m)
+}
+func (m *SearchGoogleAdsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchGoogleAdsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchGoogleAdsRequest proto.InternalMessageInfo
+
+func (m *SearchGoogleAdsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *SearchGoogleAdsRequest) GetQuery() string {
+	if m != nil {
+		return m.Query
+	}
+	return ""
+}
+
+func (m *SearchGoogleAdsRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *SearchGoogleAdsRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *SearchGoogleAdsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+func (m *SearchGoogleAdsRequest) GetReturnTotalResultsCount() bool {
+	if m != nil {
+		return m.ReturnTotalResultsCount
+	}
+	return false
+}
+
+func (m *SearchGoogleAdsRequest) GetSummaryRowSetting() enums.SummaryRowSettingEnum_SummaryRowSetting {
+	if m != nil {
+		return m.SummaryRowSetting
+	}
+	return enums.SummaryRowSettingEnum_UNSPECIFIED
+}
+
+// Response message for [GoogleAdsService.Search][google.ads.googleads.v3.services.GoogleAdsService.Search].
+type SearchGoogleAdsResponse struct {
+	// The list of rows that matched the query.
+	Results []*GoogleAdsRow `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
+	// Pagination token used to retrieve the next page of results.
+	// Pass the content of this string as the `page_token` attribute of
+	// the next request. `next_page_token` is not returned for the last
+	// page.
+	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+	// Total number of results that match the query ignoring the LIMIT
+	// clause.
+	TotalResultsCount int64 `protobuf:"varint,3,opt,name=total_results_count,json=totalResultsCount,proto3" json:"total_results_count,omitempty"`
+	// FieldMask that represents what fields were requested by the user.
+	FieldMask *field_mask.FieldMask `protobuf:"bytes,5,opt,name=field_mask,json=fieldMask,proto3" json:"field_mask,omitempty"`
+	// Summary row that contains summary of metrics in results.
+	// Summary of metrics means aggregation of metrics across all results,
+	// here aggregation could be sum, average, rate, etc.
+	SummaryRow           *GoogleAdsRow `protobuf:"bytes,6,opt,name=summary_row,json=summaryRow,proto3" json:"summary_row,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *SearchGoogleAdsResponse) Reset()         { *m = SearchGoogleAdsResponse{} }
+func (m *SearchGoogleAdsResponse) String() string { return proto.CompactTextString(m) }
+func (*SearchGoogleAdsResponse) ProtoMessage()    {}
+func (*SearchGoogleAdsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da24cac89ef496be, []int{1}
+}
+
+func (m *SearchGoogleAdsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchGoogleAdsResponse.Unmarshal(m, b)
+}
+func (m *SearchGoogleAdsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchGoogleAdsResponse.Marshal(b, m, deterministic)
+}
+func (m *SearchGoogleAdsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchGoogleAdsResponse.Merge(m, src)
+}
+func (m *SearchGoogleAdsResponse) XXX_Size() int {
+	return xxx_messageInfo_SearchGoogleAdsResponse.Size(m)
+}
+func (m *SearchGoogleAdsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchGoogleAdsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchGoogleAdsResponse proto.InternalMessageInfo
+
+func (m *SearchGoogleAdsResponse) GetResults() []*GoogleAdsRow {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+func (m *SearchGoogleAdsResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+func (m *SearchGoogleAdsResponse) GetTotalResultsCount() int64 {
+	if m != nil {
+		return m.TotalResultsCount
+	}
+	return 0
+}
+
+func (m *SearchGoogleAdsResponse) GetFieldMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.FieldMask
+	}
+	return nil
+}
+
+func (m *SearchGoogleAdsResponse) GetSummaryRow() *GoogleAdsRow {
+	if m != nil {
+		return m.SummaryRow
+	}
+	return nil
+}
+
+// Request message for [GoogleAdsService.SearchStream][google.ads.googleads.v3.services.GoogleAdsService.SearchStream].
+// Next tag: 5
+type SearchGoogleAdsStreamRequest struct {
+	// Required. The ID of the customer being queried.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The query string.
+	Query string `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"`
+	// Determines whether a summary row will be returned. By default, summary row
+	// is not returned. If requested, the summary row will be sent in a response
+	// by itself after all other query results are returned.
+	SummaryRowSetting    enums.SummaryRowSettingEnum_SummaryRowSetting `protobuf:"varint,3,opt,name=summary_row_setting,json=summaryRowSetting,proto3,enum=google.ads.googleads.v3.enums.SummaryRowSettingEnum_SummaryRowSetting" json:"summary_row_setting,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
+	XXX_unrecognized     []byte                                        `json:"-"`
+	XXX_sizecache        int32                                         `json:"-"`
+}
+
+func (m *SearchGoogleAdsStreamRequest) Reset()         { *m = SearchGoogleAdsStreamRequest{} }
+func (m *SearchGoogleAdsStreamRequest) String() string { return proto.CompactTextString(m) }
+func (*SearchGoogleAdsStreamRequest) ProtoMessage()    {}
+func (*SearchGoogleAdsStreamRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da24cac89ef496be, []int{2}
+}
+
+func (m *SearchGoogleAdsStreamRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchGoogleAdsStreamRequest.Unmarshal(m, b)
+}
+func (m *SearchGoogleAdsStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchGoogleAdsStreamRequest.Marshal(b, m, deterministic)
+}
+func (m *SearchGoogleAdsStreamRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchGoogleAdsStreamRequest.Merge(m, src)
+}
+func (m *SearchGoogleAdsStreamRequest) XXX_Size() int {
+	return xxx_messageInfo_SearchGoogleAdsStreamRequest.Size(m)
+}
+func (m *SearchGoogleAdsStreamRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchGoogleAdsStreamRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchGoogleAdsStreamRequest proto.InternalMessageInfo
+
+func (m *SearchGoogleAdsStreamRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *SearchGoogleAdsStreamRequest) GetQuery() string {
+	if m != nil {
+		return m.Query
+	}
+	return ""
+}
+
+func (m *SearchGoogleAdsStreamRequest) GetSummaryRowSetting() enums.SummaryRowSettingEnum_SummaryRowSetting {
+	if m != nil {
+		return m.SummaryRowSetting
+	}
+	return enums.SummaryRowSettingEnum_UNSPECIFIED
+}
+
+// Response message for [GoogleAdsService.SearchStream][google.ads.googleads.v3.services.GoogleAdsService.SearchStream].
+type SearchGoogleAdsStreamResponse struct {
+	// The list of rows that matched the query.
+	Results []*GoogleAdsRow `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
+	// FieldMask that represents what fields were requested by the user.
+	FieldMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=field_mask,json=fieldMask,proto3" json:"field_mask,omitempty"`
+	// Summary row that contains summary of metrics in results.
+	// Summary of metrics means aggregation of metrics across all results,
+	// here aggregation could be sum, average, rate, etc.
+	SummaryRow           *GoogleAdsRow `protobuf:"bytes,3,opt,name=summary_row,json=summaryRow,proto3" json:"summary_row,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *SearchGoogleAdsStreamResponse) Reset()         { *m = SearchGoogleAdsStreamResponse{} }
+func (m *SearchGoogleAdsStreamResponse) String() string { return proto.CompactTextString(m) }
+func (*SearchGoogleAdsStreamResponse) ProtoMessage()    {}
+func (*SearchGoogleAdsStreamResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da24cac89ef496be, []int{3}
+}
+
+func (m *SearchGoogleAdsStreamResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchGoogleAdsStreamResponse.Unmarshal(m, b)
+}
+func (m *SearchGoogleAdsStreamResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchGoogleAdsStreamResponse.Marshal(b, m, deterministic)
+}
+func (m *SearchGoogleAdsStreamResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchGoogleAdsStreamResponse.Merge(m, src)
+}
+func (m *SearchGoogleAdsStreamResponse) XXX_Size() int {
+	return xxx_messageInfo_SearchGoogleAdsStreamResponse.Size(m)
+}
+func (m *SearchGoogleAdsStreamResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchGoogleAdsStreamResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchGoogleAdsStreamResponse proto.InternalMessageInfo
+
+func (m *SearchGoogleAdsStreamResponse) GetResults() []*GoogleAdsRow {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+func (m *SearchGoogleAdsStreamResponse) GetFieldMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.FieldMask
+	}
+	return nil
+}
+
+func (m *SearchGoogleAdsStreamResponse) GetSummaryRow() *GoogleAdsRow {
+	if m != nil {
+		return m.SummaryRow
+	}
+	return nil
+}
+
+// A returned row from the query.
+type GoogleAdsRow struct {
+	// The account budget in the query.
+	AccountBudget *resources.AccountBudget `protobuf:"bytes,42,opt,name=account_budget,json=accountBudget,proto3" json:"account_budget,omitempty"`
+	// The account budget proposal referenced in the query.
+	AccountBudgetProposal *resources.AccountBudgetProposal `protobuf:"bytes,43,opt,name=account_budget_proposal,json=accountBudgetProposal,proto3" json:"account_budget_proposal,omitempty"`
+	// The ad group referenced in the query.
+	AdGroup *resources.AdGroup `protobuf:"bytes,3,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// The ad referenced in the query.
+	AdGroupAd *resources.AdGroupAd `protobuf:"bytes,16,opt,name=ad_group_ad,json=adGroupAd,proto3" json:"ad_group_ad,omitempty"`
+	// The ad group ad asset view in the query.
+	AdGroupAdAssetView *resources.AdGroupAdAssetView `protobuf:"bytes,131,opt,name=ad_group_ad_asset_view,json=adGroupAdAssetView,proto3" json:"ad_group_ad_asset_view,omitempty"`
+	// The ad group ad label referenced in the query.
+	AdGroupAdLabel *resources.AdGroupAdLabel `protobuf:"bytes,120,opt,name=ad_group_ad_label,json=adGroupAdLabel,proto3" json:"ad_group_ad_label,omitempty"`
+	// The ad group audience view referenced in the query.
+	AdGroupAudienceView *resources.AdGroupAudienceView `protobuf:"bytes,57,opt,name=ad_group_audience_view,json=adGroupAudienceView,proto3" json:"ad_group_audience_view,omitempty"`
+	// The bid modifier referenced in the query.
+	AdGroupBidModifier *resources.AdGroupBidModifier `protobuf:"bytes,24,opt,name=ad_group_bid_modifier,json=adGroupBidModifier,proto3" json:"ad_group_bid_modifier,omitempty"`
+	// The criterion referenced in the query.
+	AdGroupCriterion *resources.AdGroupCriterion `protobuf:"bytes,17,opt,name=ad_group_criterion,json=adGroupCriterion,proto3" json:"ad_group_criterion,omitempty"`
+	// The ad group criterion label referenced in the query.
+	AdGroupCriterionLabel *resources.AdGroupCriterionLabel `protobuf:"bytes,121,opt,name=ad_group_criterion_label,json=adGroupCriterionLabel,proto3" json:"ad_group_criterion_label,omitempty"`
+	// The ad group criterion simulation referenced in the query.
+	AdGroupCriterionSimulation *resources.AdGroupCriterionSimulation `protobuf:"bytes,110,opt,name=ad_group_criterion_simulation,json=adGroupCriterionSimulation,proto3" json:"ad_group_criterion_simulation,omitempty"`
+	// The ad group extension setting referenced in the query.
+	AdGroupExtensionSetting *resources.AdGroupExtensionSetting `protobuf:"bytes,112,opt,name=ad_group_extension_setting,json=adGroupExtensionSetting,proto3" json:"ad_group_extension_setting,omitempty"`
+	// The ad group feed referenced in the query.
+	AdGroupFeed *resources.AdGroupFeed `protobuf:"bytes,67,opt,name=ad_group_feed,json=adGroupFeed,proto3" json:"ad_group_feed,omitempty"`
+	// The ad group label referenced in the query.
+	AdGroupLabel *resources.AdGroupLabel `protobuf:"bytes,115,opt,name=ad_group_label,json=adGroupLabel,proto3" json:"ad_group_label,omitempty"`
+	// The ad group simulation referenced in the query.
+	AdGroupSimulation *resources.AdGroupSimulation `protobuf:"bytes,107,opt,name=ad_group_simulation,json=adGroupSimulation,proto3" json:"ad_group_simulation,omitempty"`
+	// The ad parameter referenced in the query.
+	AdParameter *resources.AdParameter `protobuf:"bytes,130,opt,name=ad_parameter,json=adParameter,proto3" json:"ad_parameter,omitempty"`
+	// The age range view referenced in the query.
+	AgeRangeView *resources.AgeRangeView `protobuf:"bytes,48,opt,name=age_range_view,json=ageRangeView,proto3" json:"age_range_view,omitempty"`
+	// The ad schedule view referenced in the query.
+	AdScheduleView *resources.AdScheduleView `protobuf:"bytes,89,opt,name=ad_schedule_view,json=adScheduleView,proto3" json:"ad_schedule_view,omitempty"`
+	// The domain category referenced in the query.
+	DomainCategory *resources.DomainCategory `protobuf:"bytes,91,opt,name=domain_category,json=domainCategory,proto3" json:"domain_category,omitempty"`
+	// The asset referenced in the query.
+	Asset *resources.Asset `protobuf:"bytes,105,opt,name=asset,proto3" json:"asset,omitempty"`
+	// The bidding strategy referenced in the query.
+	BiddingStrategy *resources.BiddingStrategy `protobuf:"bytes,18,opt,name=bidding_strategy,json=biddingStrategy,proto3" json:"bidding_strategy,omitempty"`
+	// The billing setup referenced in the query.
+	BillingSetup *resources.BillingSetup `protobuf:"bytes,41,opt,name=billing_setup,json=billingSetup,proto3" json:"billing_setup,omitempty"`
+	// The campaign budget referenced in the query.
+	CampaignBudget *resources.CampaignBudget `protobuf:"bytes,19,opt,name=campaign_budget,json=campaignBudget,proto3" json:"campaign_budget,omitempty"`
+	// The campaign referenced in the query.
+	Campaign *resources.Campaign `protobuf:"bytes,2,opt,name=campaign,proto3" json:"campaign,omitempty"`
+	// The campaign audience view referenced in the query.
+	CampaignAudienceView *resources.CampaignAudienceView `protobuf:"bytes,69,opt,name=campaign_audience_view,json=campaignAudienceView,proto3" json:"campaign_audience_view,omitempty"`
+	// The campaign bid modifier referenced in the query.
+	CampaignBidModifier *resources.CampaignBidModifier `protobuf:"bytes,26,opt,name=campaign_bid_modifier,json=campaignBidModifier,proto3" json:"campaign_bid_modifier,omitempty"`
+	// The campaign criterion referenced in the query.
+	CampaignCriterion *resources.CampaignCriterion `protobuf:"bytes,20,opt,name=campaign_criterion,json=campaignCriterion,proto3" json:"campaign_criterion,omitempty"`
+	// The campaign criterion simulation referenced in the query.
+	CampaignCriterionSimulation *resources.CampaignCriterionSimulation `protobuf:"bytes,111,opt,name=campaign_criterion_simulation,json=campaignCriterionSimulation,proto3" json:"campaign_criterion_simulation,omitempty"`
+	// The campaign draft referenced in the query.
+	CampaignDraft *resources.CampaignDraft `protobuf:"bytes,49,opt,name=campaign_draft,json=campaignDraft,proto3" json:"campaign_draft,omitempty"`
+	// The campaign experiment referenced in the query.
+	CampaignExperiment *resources.CampaignExperiment `protobuf:"bytes,84,opt,name=campaign_experiment,json=campaignExperiment,proto3" json:"campaign_experiment,omitempty"`
+	// The campaign extension setting referenced in the query.
+	CampaignExtensionSetting *resources.CampaignExtensionSetting `protobuf:"bytes,113,opt,name=campaign_extension_setting,json=campaignExtensionSetting,proto3" json:"campaign_extension_setting,omitempty"`
+	// The campaign feed referenced in the query.
+	CampaignFeed *resources.CampaignFeed `protobuf:"bytes,63,opt,name=campaign_feed,json=campaignFeed,proto3" json:"campaign_feed,omitempty"`
+	// The campaign label referenced in the query.
+	CampaignLabel *resources.CampaignLabel `protobuf:"bytes,108,opt,name=campaign_label,json=campaignLabel,proto3" json:"campaign_label,omitempty"`
+	// Campaign Shared Set referenced in AWQL query.
+	CampaignSharedSet *resources.CampaignSharedSet `protobuf:"bytes,30,opt,name=campaign_shared_set,json=campaignSharedSet,proto3" json:"campaign_shared_set,omitempty"`
+	// The carrier constant referenced in the query.
+	CarrierConstant *resources.CarrierConstant `protobuf:"bytes,66,opt,name=carrier_constant,json=carrierConstant,proto3" json:"carrier_constant,omitempty"`
+	// The ChangeStatus referenced in the query.
+	ChangeStatus *resources.ChangeStatus `protobuf:"bytes,37,opt,name=change_status,json=changeStatus,proto3" json:"change_status,omitempty"`
+	// The conversion action referenced in the query.
+	ConversionAction *resources.ConversionAction `protobuf:"bytes,103,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
+	// The ClickView referenced in the query.
+	ClickView *resources.ClickView `protobuf:"bytes,122,opt,name=click_view,json=clickView,proto3" json:"click_view,omitempty"`
+	// The currency constant referenced in the query.
+	CurrencyConstant *resources.CurrencyConstant `protobuf:"bytes,134,opt,name=currency_constant,json=currencyConstant,proto3" json:"currency_constant,omitempty"`
+	// The CustomInterest referenced in the query.
+	CustomInterest *resources.CustomInterest `protobuf:"bytes,104,opt,name=custom_interest,json=customInterest,proto3" json:"custom_interest,omitempty"`
+	// The customer referenced in the query.
+	Customer *resources.Customer `protobuf:"bytes,1,opt,name=customer,proto3" json:"customer,omitempty"`
+	// The CustomerManagerLink referenced in the query.
+	CustomerManagerLink *resources.CustomerManagerLink `protobuf:"bytes,61,opt,name=customer_manager_link,json=customerManagerLink,proto3" json:"customer_manager_link,omitempty"`
+	// The CustomerClientLink referenced in the query.
+	CustomerClientLink *resources.CustomerClientLink `protobuf:"bytes,62,opt,name=customer_client_link,json=customerClientLink,proto3" json:"customer_client_link,omitempty"`
+	// The CustomerClient referenced in the query.
+	CustomerClient *resources.CustomerClient `protobuf:"bytes,70,opt,name=customer_client,json=customerClient,proto3" json:"customer_client,omitempty"`
+	// The customer extension setting referenced in the query.
+	CustomerExtensionSetting *resources.CustomerExtensionSetting `protobuf:"bytes,114,opt,name=customer_extension_setting,json=customerExtensionSetting,proto3" json:"customer_extension_setting,omitempty"`
+	// The customer feed referenced in the query.
+	CustomerFeed *resources.CustomerFeed `protobuf:"bytes,64,opt,name=customer_feed,json=customerFeed,proto3" json:"customer_feed,omitempty"`
+	// The customer label referenced in the query.
+	CustomerLabel *resources.CustomerLabel `protobuf:"bytes,124,opt,name=customer_label,json=customerLabel,proto3" json:"customer_label,omitempty"`
+	// The customer negative criterion referenced in the query.
+	CustomerNegativeCriterion *resources.CustomerNegativeCriterion `protobuf:"bytes,88,opt,name=customer_negative_criterion,json=customerNegativeCriterion,proto3" json:"customer_negative_criterion,omitempty"`
+	// The detail placement view referenced in the query.
+	DetailPlacementView *resources.DetailPlacementView `protobuf:"bytes,118,opt,name=detail_placement_view,json=detailPlacementView,proto3" json:"detail_placement_view,omitempty"`
+	// The display keyword view referenced in the query.
+	DisplayKeywordView *resources.DisplayKeywordView `protobuf:"bytes,47,opt,name=display_keyword_view,json=displayKeywordView,proto3" json:"display_keyword_view,omitempty"`
+	// The distance view referenced in the query.
+	DistanceView *resources.DistanceView `protobuf:"bytes,132,opt,name=distance_view,json=distanceView,proto3" json:"distance_view,omitempty"`
+	// The dynamic search ads search term view referenced in the query.
+	DynamicSearchAdsSearchTermView *resources.DynamicSearchAdsSearchTermView `protobuf:"bytes,106,opt,name=dynamic_search_ads_search_term_view,json=dynamicSearchAdsSearchTermView,proto3" json:"dynamic_search_ads_search_term_view,omitempty"`
+	// The expanded landing page view referenced in the query.
+	ExpandedLandingPageView *resources.ExpandedLandingPageView `protobuf:"bytes,128,opt,name=expanded_landing_page_view,json=expandedLandingPageView,proto3" json:"expanded_landing_page_view,omitempty"`
+	// The extension feed item referenced in the query.
+	ExtensionFeedItem *resources.ExtensionFeedItem `protobuf:"bytes,85,opt,name=extension_feed_item,json=extensionFeedItem,proto3" json:"extension_feed_item,omitempty"`
+	// The feed referenced in the query.
+	Feed *resources.Feed `protobuf:"bytes,46,opt,name=feed,proto3" json:"feed,omitempty"`
+	// The feed item referenced in the query.
+	FeedItem *resources.FeedItem `protobuf:"bytes,50,opt,name=feed_item,json=feedItem,proto3" json:"feed_item,omitempty"`
+	// The feed item target referenced in the query.
+	FeedItemTarget *resources.FeedItemTarget `protobuf:"bytes,116,opt,name=feed_item_target,json=feedItemTarget,proto3" json:"feed_item_target,omitempty"`
+	// The feed mapping referenced in the query.
+	FeedMapping *resources.FeedMapping `protobuf:"bytes,58,opt,name=feed_mapping,json=feedMapping,proto3" json:"feed_mapping,omitempty"`
+	// The feed placeholder view referenced in the query.
+	FeedPlaceholderView *resources.FeedPlaceholderView `protobuf:"bytes,97,opt,name=feed_placeholder_view,json=feedPlaceholderView,proto3" json:"feed_placeholder_view,omitempty"`
+	// The gender view referenced in the query.
+	GenderView *resources.GenderView `protobuf:"bytes,40,opt,name=gender_view,json=genderView,proto3" json:"gender_view,omitempty"`
+	// The geo target constant referenced in the query.
+	GeoTargetConstant *resources.GeoTargetConstant `protobuf:"bytes,23,opt,name=geo_target_constant,json=geoTargetConstant,proto3" json:"geo_target_constant,omitempty"`
+	// The geographic view referenced in the query.
+	GeographicView *resources.GeographicView `protobuf:"bytes,125,opt,name=geographic_view,json=geographicView,proto3" json:"geographic_view,omitempty"`
+	// The group placement view referenced in the query.
+	GroupPlacementView *resources.GroupPlacementView `protobuf:"bytes,119,opt,name=group_placement_view,json=groupPlacementView,proto3" json:"group_placement_view,omitempty"`
+	// The hotel group view referenced in the query.
+	HotelGroupView *resources.HotelGroupView `protobuf:"bytes,51,opt,name=hotel_group_view,json=hotelGroupView,proto3" json:"hotel_group_view,omitempty"`
+	// The hotel performance view referenced in the query.
+	HotelPerformanceView *resources.HotelPerformanceView `protobuf:"bytes,71,opt,name=hotel_performance_view,json=hotelPerformanceView,proto3" json:"hotel_performance_view,omitempty"`
+	// The keyword view referenced in the query.
+	KeywordView *resources.KeywordView `protobuf:"bytes,21,opt,name=keyword_view,json=keywordView,proto3" json:"keyword_view,omitempty"`
+	// The keyword plan referenced in the query.
+	KeywordPlan *resources.KeywordPlan `protobuf:"bytes,32,opt,name=keyword_plan,json=keywordPlan,proto3" json:"keyword_plan,omitempty"`
+	// The keyword plan campaign referenced in the query.
+	KeywordPlanCampaign *resources.KeywordPlanCampaign `protobuf:"bytes,33,opt,name=keyword_plan_campaign,json=keywordPlanCampaign,proto3" json:"keyword_plan_campaign,omitempty"`
+	// The keyword plan negative keyword referenced in the query.
+	KeywordPlanNegativeKeyword *resources.KeywordPlanNegativeKeyword `protobuf:"bytes,34,opt,name=keyword_plan_negative_keyword,json=keywordPlanNegativeKeyword,proto3" json:"keyword_plan_negative_keyword,omitempty"`
+	// The keyword plan ad group referenced in the query.
+	KeywordPlanAdGroup *resources.KeywordPlanAdGroup `protobuf:"bytes,35,opt,name=keyword_plan_ad_group,json=keywordPlanAdGroup,proto3" json:"keyword_plan_ad_group,omitempty"`
+	// The keyword plan keyword referenced in the query.
+	KeywordPlanKeyword *resources.KeywordPlanKeyword `protobuf:"bytes,36,opt,name=keyword_plan_keyword,json=keywordPlanKeyword,proto3" json:"keyword_plan_keyword,omitempty"`
+	// The label referenced in the query.
+	Label *resources.Label `protobuf:"bytes,52,opt,name=label,proto3" json:"label,omitempty"`
+	// The landing page view referenced in the query.
+	LandingPageView *resources.LandingPageView `protobuf:"bytes,126,opt,name=landing_page_view,json=landingPageView,proto3" json:"landing_page_view,omitempty"`
+	// The language constant referenced in the query.
+	LanguageConstant *resources.LanguageConstant `protobuf:"bytes,55,opt,name=language_constant,json=languageConstant,proto3" json:"language_constant,omitempty"`
+	// The location view referenced in the query.
+	LocationView *resources.LocationView `protobuf:"bytes,123,opt,name=location_view,json=locationView,proto3" json:"location_view,omitempty"`
+	// The managed placement view referenced in the query.
+	ManagedPlacementView *resources.ManagedPlacementView `protobuf:"bytes,53,opt,name=managed_placement_view,json=managedPlacementView,proto3" json:"managed_placement_view,omitempty"`
+	// The media file referenced in the query.
+	MediaFile *resources.MediaFile `protobuf:"bytes,90,opt,name=media_file,json=mediaFile,proto3" json:"media_file,omitempty"`
+	// The mobile app category constant referenced in the query.
+	MobileAppCategoryConstant *resources.MobileAppCategoryConstant `protobuf:"bytes,87,opt,name=mobile_app_category_constant,json=mobileAppCategoryConstant,proto3" json:"mobile_app_category_constant,omitempty"`
+	// The mobile device constant referenced in the query.
+	MobileDeviceConstant *resources.MobileDeviceConstant `protobuf:"bytes,98,opt,name=mobile_device_constant,json=mobileDeviceConstant,proto3" json:"mobile_device_constant,omitempty"`
+	// The mutate job referenced in the query.
+	MutateJob *resources.MutateJob `protobuf:"bytes,127,opt,name=mutate_job,json=mutateJob,proto3" json:"mutate_job,omitempty"`
+	// The operating system version constant referenced in the query.
+	OperatingSystemVersionConstant *resources.OperatingSystemVersionConstant `protobuf:"bytes,86,opt,name=operating_system_version_constant,json=operatingSystemVersionConstant,proto3" json:"operating_system_version_constant,omitempty"`
+	// The paid organic search term view referenced in the query.
+	PaidOrganicSearchTermView *resources.PaidOrganicSearchTermView `protobuf:"bytes,129,opt,name=paid_organic_search_term_view,json=paidOrganicSearchTermView,proto3" json:"paid_organic_search_term_view,omitempty"`
+	// The parental status view referenced in the query.
+	ParentalStatusView *resources.ParentalStatusView `protobuf:"bytes,45,opt,name=parental_status_view,json=parentalStatusView,proto3" json:"parental_status_view,omitempty"`
+	// The Product Bidding Category referenced in the query.
+	ProductBiddingCategoryConstant *resources.ProductBiddingCategoryConstant `protobuf:"bytes,109,opt,name=product_bidding_category_constant,json=productBiddingCategoryConstant,proto3" json:"product_bidding_category_constant,omitempty"`
+	// The product group view referenced in the query.
+	ProductGroupView *resources.ProductGroupView `protobuf:"bytes,54,opt,name=product_group_view,json=productGroupView,proto3" json:"product_group_view,omitempty"`
+	// The recommendation referenced in the query.
+	Recommendation *resources.Recommendation `protobuf:"bytes,22,opt,name=recommendation,proto3" json:"recommendation,omitempty"`
+	// The search term view referenced in the query.
+	SearchTermView *resources.SearchTermView `protobuf:"bytes,68,opt,name=search_term_view,json=searchTermView,proto3" json:"search_term_view,omitempty"`
+	// The shared set referenced in the query.
+	SharedCriterion *resources.SharedCriterion `protobuf:"bytes,29,opt,name=shared_criterion,json=sharedCriterion,proto3" json:"shared_criterion,omitempty"`
+	// The shared set referenced in the query.
+	SharedSet *resources.SharedSet `protobuf:"bytes,27,opt,name=shared_set,json=sharedSet,proto3" json:"shared_set,omitempty"`
+	// The shopping performance view referenced in the query.
+	ShoppingPerformanceView *resources.ShoppingPerformanceView `protobuf:"bytes,117,opt,name=shopping_performance_view,json=shoppingPerformanceView,proto3" json:"shopping_performance_view,omitempty"`
+	// The topic view referenced in the query.
+	TopicView *resources.TopicView `protobuf:"bytes,44,opt,name=topic_view,json=topicView,proto3" json:"topic_view,omitempty"`
+	// The user interest referenced in the query.
+	UserInterest *resources.UserInterest `protobuf:"bytes,59,opt,name=user_interest,json=userInterest,proto3" json:"user_interest,omitempty"`
+	// The user list referenced in the query.
+	UserList *resources.UserList `protobuf:"bytes,38,opt,name=user_list,json=userList,proto3" json:"user_list,omitempty"`
+	// The user location view referenced in the query.
+	UserLocationView *resources.UserLocationView `protobuf:"bytes,135,opt,name=user_location_view,json=userLocationView,proto3" json:"user_location_view,omitempty"`
+	// The remarketing action referenced in the query.
+	RemarketingAction *resources.RemarketingAction `protobuf:"bytes,60,opt,name=remarketing_action,json=remarketingAction,proto3" json:"remarketing_action,omitempty"`
+	// The topic constant referenced in the query.
+	TopicConstant *resources.TopicConstant `protobuf:"bytes,31,opt,name=topic_constant,json=topicConstant,proto3" json:"topic_constant,omitempty"`
+	// The video referenced in the query.
+	Video *resources.Video `protobuf:"bytes,39,opt,name=video,proto3" json:"video,omitempty"`
+	// The metrics.
+	Metrics *common.Metrics `protobuf:"bytes,4,opt,name=metrics,proto3" json:"metrics,omitempty"`
+	// The segments.
+	Segments             *common.Segments `protobuf:"bytes,102,opt,name=segments,proto3" json:"segments,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *GoogleAdsRow) Reset()         { *m = GoogleAdsRow{} }
+func (m *GoogleAdsRow) String() string { return proto.CompactTextString(m) }
+func (*GoogleAdsRow) ProtoMessage()    {}
+func (*GoogleAdsRow) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da24cac89ef496be, []int{4}
+}
+
+func (m *GoogleAdsRow) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GoogleAdsRow.Unmarshal(m, b)
+}
+func (m *GoogleAdsRow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GoogleAdsRow.Marshal(b, m, deterministic)
+}
+func (m *GoogleAdsRow) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GoogleAdsRow.Merge(m, src)
+}
+func (m *GoogleAdsRow) XXX_Size() int {
+	return xxx_messageInfo_GoogleAdsRow.Size(m)
+}
+func (m *GoogleAdsRow) XXX_DiscardUnknown() {
+	xxx_messageInfo_GoogleAdsRow.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GoogleAdsRow proto.InternalMessageInfo
+
+func (m *GoogleAdsRow) GetAccountBudget() *resources.AccountBudget {
+	if m != nil {
+		return m.AccountBudget
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAccountBudgetProposal() *resources.AccountBudgetProposal {
+	if m != nil {
+		return m.AccountBudgetProposal
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroup() *resources.AdGroup {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupAd() *resources.AdGroupAd {
+	if m != nil {
+		return m.AdGroupAd
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupAdAssetView() *resources.AdGroupAdAssetView {
+	if m != nil {
+		return m.AdGroupAdAssetView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupAdLabel() *resources.AdGroupAdLabel {
+	if m != nil {
+		return m.AdGroupAdLabel
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupAudienceView() *resources.AdGroupAudienceView {
+	if m != nil {
+		return m.AdGroupAudienceView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupBidModifier() *resources.AdGroupBidModifier {
+	if m != nil {
+		return m.AdGroupBidModifier
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupCriterion() *resources.AdGroupCriterion {
+	if m != nil {
+		return m.AdGroupCriterion
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupCriterionLabel() *resources.AdGroupCriterionLabel {
+	if m != nil {
+		return m.AdGroupCriterionLabel
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupCriterionSimulation() *resources.AdGroupCriterionSimulation {
+	if m != nil {
+		return m.AdGroupCriterionSimulation
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupExtensionSetting() *resources.AdGroupExtensionSetting {
+	if m != nil {
+		return m.AdGroupExtensionSetting
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupFeed() *resources.AdGroupFeed {
+	if m != nil {
+		return m.AdGroupFeed
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupLabel() *resources.AdGroupLabel {
+	if m != nil {
+		return m.AdGroupLabel
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdGroupSimulation() *resources.AdGroupSimulation {
+	if m != nil {
+		return m.AdGroupSimulation
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdParameter() *resources.AdParameter {
+	if m != nil {
+		return m.AdParameter
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAgeRangeView() *resources.AgeRangeView {
+	if m != nil {
+		return m.AgeRangeView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAdScheduleView() *resources.AdScheduleView {
+	if m != nil {
+		return m.AdScheduleView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetDomainCategory() *resources.DomainCategory {
+	if m != nil {
+		return m.DomainCategory
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetAsset() *resources.Asset {
+	if m != nil {
+		return m.Asset
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetBiddingStrategy() *resources.BiddingStrategy {
+	if m != nil {
+		return m.BiddingStrategy
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetBillingSetup() *resources.BillingSetup {
+	if m != nil {
+		return m.BillingSetup
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignBudget() *resources.CampaignBudget {
+	if m != nil {
+		return m.CampaignBudget
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaign() *resources.Campaign {
+	if m != nil {
+		return m.Campaign
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignAudienceView() *resources.CampaignAudienceView {
+	if m != nil {
+		return m.CampaignAudienceView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignBidModifier() *resources.CampaignBidModifier {
+	if m != nil {
+		return m.CampaignBidModifier
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignCriterion() *resources.CampaignCriterion {
+	if m != nil {
+		return m.CampaignCriterion
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignCriterionSimulation() *resources.CampaignCriterionSimulation {
+	if m != nil {
+		return m.CampaignCriterionSimulation
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignDraft() *resources.CampaignDraft {
+	if m != nil {
+		return m.CampaignDraft
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignExperiment() *resources.CampaignExperiment {
+	if m != nil {
+		return m.CampaignExperiment
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignExtensionSetting() *resources.CampaignExtensionSetting {
+	if m != nil {
+		return m.CampaignExtensionSetting
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignFeed() *resources.CampaignFeed {
+	if m != nil {
+		return m.CampaignFeed
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignLabel() *resources.CampaignLabel {
+	if m != nil {
+		return m.CampaignLabel
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCampaignSharedSet() *resources.CampaignSharedSet {
+	if m != nil {
+		return m.CampaignSharedSet
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCarrierConstant() *resources.CarrierConstant {
+	if m != nil {
+		return m.CarrierConstant
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetChangeStatus() *resources.ChangeStatus {
+	if m != nil {
+		return m.ChangeStatus
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetConversionAction() *resources.ConversionAction {
+	if m != nil {
+		return m.ConversionAction
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetClickView() *resources.ClickView {
+	if m != nil {
+		return m.ClickView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCurrencyConstant() *resources.CurrencyConstant {
+	if m != nil {
+		return m.CurrencyConstant
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCustomInterest() *resources.CustomInterest {
+	if m != nil {
+		return m.CustomInterest
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCustomer() *resources.Customer {
+	if m != nil {
+		return m.Customer
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCustomerManagerLink() *resources.CustomerManagerLink {
+	if m != nil {
+		return m.CustomerManagerLink
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCustomerClientLink() *resources.CustomerClientLink {
+	if m != nil {
+		return m.CustomerClientLink
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCustomerClient() *resources.CustomerClient {
+	if m != nil {
+		return m.CustomerClient
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCustomerExtensionSetting() *resources.CustomerExtensionSetting {
+	if m != nil {
+		return m.CustomerExtensionSetting
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCustomerFeed() *resources.CustomerFeed {
+	if m != nil {
+		return m.CustomerFeed
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCustomerLabel() *resources.CustomerLabel {
+	if m != nil {
+		return m.CustomerLabel
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetCustomerNegativeCriterion() *resources.CustomerNegativeCriterion {
+	if m != nil {
+		return m.CustomerNegativeCriterion
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetDetailPlacementView() *resources.DetailPlacementView {
+	if m != nil {
+		return m.DetailPlacementView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetDisplayKeywordView() *resources.DisplayKeywordView {
+	if m != nil {
+		return m.DisplayKeywordView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetDistanceView() *resources.DistanceView {
+	if m != nil {
+		return m.DistanceView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetDynamicSearchAdsSearchTermView() *resources.DynamicSearchAdsSearchTermView {
+	if m != nil {
+		return m.DynamicSearchAdsSearchTermView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetExpandedLandingPageView() *resources.ExpandedLandingPageView {
+	if m != nil {
+		return m.ExpandedLandingPageView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetExtensionFeedItem() *resources.ExtensionFeedItem {
+	if m != nil {
+		return m.ExtensionFeedItem
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetFeed() *resources.Feed {
+	if m != nil {
+		return m.Feed
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetFeedItem() *resources.FeedItem {
+	if m != nil {
+		return m.FeedItem
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetFeedItemTarget() *resources.FeedItemTarget {
+	if m != nil {
+		return m.FeedItemTarget
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetFeedMapping() *resources.FeedMapping {
+	if m != nil {
+		return m.FeedMapping
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetFeedPlaceholderView() *resources.FeedPlaceholderView {
+	if m != nil {
+		return m.FeedPlaceholderView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetGenderView() *resources.GenderView {
+	if m != nil {
+		return m.GenderView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetGeoTargetConstant() *resources.GeoTargetConstant {
+	if m != nil {
+		return m.GeoTargetConstant
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetGeographicView() *resources.GeographicView {
+	if m != nil {
+		return m.GeographicView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetGroupPlacementView() *resources.GroupPlacementView {
+	if m != nil {
+		return m.GroupPlacementView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetHotelGroupView() *resources.HotelGroupView {
+	if m != nil {
+		return m.HotelGroupView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetHotelPerformanceView() *resources.HotelPerformanceView {
+	if m != nil {
+		return m.HotelPerformanceView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetKeywordView() *resources.KeywordView {
+	if m != nil {
+		return m.KeywordView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetKeywordPlan() *resources.KeywordPlan {
+	if m != nil {
+		return m.KeywordPlan
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetKeywordPlanCampaign() *resources.KeywordPlanCampaign {
+	if m != nil {
+		return m.KeywordPlanCampaign
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetKeywordPlanNegativeKeyword() *resources.KeywordPlanNegativeKeyword {
+	if m != nil {
+		return m.KeywordPlanNegativeKeyword
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetKeywordPlanAdGroup() *resources.KeywordPlanAdGroup {
+	if m != nil {
+		return m.KeywordPlanAdGroup
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetKeywordPlanKeyword() *resources.KeywordPlanKeyword {
+	if m != nil {
+		return m.KeywordPlanKeyword
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetLabel() *resources.Label {
+	if m != nil {
+		return m.Label
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetLandingPageView() *resources.LandingPageView {
+	if m != nil {
+		return m.LandingPageView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetLanguageConstant() *resources.LanguageConstant {
+	if m != nil {
+		return m.LanguageConstant
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetLocationView() *resources.LocationView {
+	if m != nil {
+		return m.LocationView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetManagedPlacementView() *resources.ManagedPlacementView {
+	if m != nil {
+		return m.ManagedPlacementView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetMediaFile() *resources.MediaFile {
+	if m != nil {
+		return m.MediaFile
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetMobileAppCategoryConstant() *resources.MobileAppCategoryConstant {
+	if m != nil {
+		return m.MobileAppCategoryConstant
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetMobileDeviceConstant() *resources.MobileDeviceConstant {
+	if m != nil {
+		return m.MobileDeviceConstant
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetMutateJob() *resources.MutateJob {
+	if m != nil {
+		return m.MutateJob
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetOperatingSystemVersionConstant() *resources.OperatingSystemVersionConstant {
+	if m != nil {
+		return m.OperatingSystemVersionConstant
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetPaidOrganicSearchTermView() *resources.PaidOrganicSearchTermView {
+	if m != nil {
+		return m.PaidOrganicSearchTermView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetParentalStatusView() *resources.ParentalStatusView {
+	if m != nil {
+		return m.ParentalStatusView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetProductBiddingCategoryConstant() *resources.ProductBiddingCategoryConstant {
+	if m != nil {
+		return m.ProductBiddingCategoryConstant
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetProductGroupView() *resources.ProductGroupView {
+	if m != nil {
+		return m.ProductGroupView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetRecommendation() *resources.Recommendation {
+	if m != nil {
+		return m.Recommendation
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetSearchTermView() *resources.SearchTermView {
+	if m != nil {
+		return m.SearchTermView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetSharedCriterion() *resources.SharedCriterion {
+	if m != nil {
+		return m.SharedCriterion
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetSharedSet() *resources.SharedSet {
+	if m != nil {
+		return m.SharedSet
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetShoppingPerformanceView() *resources.ShoppingPerformanceView {
+	if m != nil {
+		return m.ShoppingPerformanceView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetTopicView() *resources.TopicView {
+	if m != nil {
+		return m.TopicView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetUserInterest() *resources.UserInterest {
+	if m != nil {
+		return m.UserInterest
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetUserList() *resources.UserList {
+	if m != nil {
+		return m.UserList
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetUserLocationView() *resources.UserLocationView {
+	if m != nil {
+		return m.UserLocationView
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetRemarketingAction() *resources.RemarketingAction {
+	if m != nil {
+		return m.RemarketingAction
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetTopicConstant() *resources.TopicConstant {
+	if m != nil {
+		return m.TopicConstant
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetVideo() *resources.Video {
+	if m != nil {
+		return m.Video
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetMetrics() *common.Metrics {
+	if m != nil {
+		return m.Metrics
+	}
+	return nil
+}
+
+func (m *GoogleAdsRow) GetSegments() *common.Segments {
+	if m != nil {
+		return m.Segments
+	}
+	return nil
+}
+
+// Request message for [GoogleAdsService.Mutate][google.ads.googleads.v3.services.GoogleAdsService.Mutate].
+type MutateGoogleAdsRequest struct {
+	// Required. The ID of the customer whose resources are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual resources.
+	MutateOperations []*MutateOperation `protobuf:"bytes,2,rep,name=mutate_operations,json=mutateOperations,proto3" json:"mutate_operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateGoogleAdsRequest) Reset()         { *m = MutateGoogleAdsRequest{} }
+func (m *MutateGoogleAdsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateGoogleAdsRequest) ProtoMessage()    {}
+func (*MutateGoogleAdsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da24cac89ef496be, []int{5}
+}
+
+func (m *MutateGoogleAdsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateGoogleAdsRequest.Unmarshal(m, b)
+}
+func (m *MutateGoogleAdsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateGoogleAdsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateGoogleAdsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateGoogleAdsRequest.Merge(m, src)
+}
+func (m *MutateGoogleAdsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateGoogleAdsRequest.Size(m)
+}
+func (m *MutateGoogleAdsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateGoogleAdsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateGoogleAdsRequest proto.InternalMessageInfo
+
+func (m *MutateGoogleAdsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateGoogleAdsRequest) GetMutateOperations() []*MutateOperation {
+	if m != nil {
+		return m.MutateOperations
+	}
+	return nil
+}
+
+func (m *MutateGoogleAdsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateGoogleAdsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// Response message for [GoogleAdsService.Mutate][google.ads.googleads.v3.services.GoogleAdsService.Mutate].
+type MutateGoogleAdsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g., auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All responses for the mutate.
+	MutateOperationResponses []*MutateOperationResponse `protobuf:"bytes,1,rep,name=mutate_operation_responses,json=mutateOperationResponses,proto3" json:"mutate_operation_responses,omitempty"`
+	XXX_NoUnkeyedLiteral     struct{}                   `json:"-"`
+	XXX_unrecognized         []byte                     `json:"-"`
+	XXX_sizecache            int32                      `json:"-"`
+}
+
+func (m *MutateGoogleAdsResponse) Reset()         { *m = MutateGoogleAdsResponse{} }
+func (m *MutateGoogleAdsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateGoogleAdsResponse) ProtoMessage()    {}
+func (*MutateGoogleAdsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da24cac89ef496be, []int{6}
+}
+
+func (m *MutateGoogleAdsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateGoogleAdsResponse.Unmarshal(m, b)
+}
+func (m *MutateGoogleAdsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateGoogleAdsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateGoogleAdsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateGoogleAdsResponse.Merge(m, src)
+}
+func (m *MutateGoogleAdsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateGoogleAdsResponse.Size(m)
+}
+func (m *MutateGoogleAdsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateGoogleAdsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateGoogleAdsResponse proto.InternalMessageInfo
+
+func (m *MutateGoogleAdsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateGoogleAdsResponse) GetMutateOperationResponses() []*MutateOperationResponse {
+	if m != nil {
+		return m.MutateOperationResponses
+	}
+	return nil
+}
+
+// A single operation (create, update, remove) on a resource.
+type MutateOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*MutateOperation_AdGroupAdLabelOperation
+	//	*MutateOperation_AdGroupAdOperation
+	//	*MutateOperation_AdGroupBidModifierOperation
+	//	*MutateOperation_AdGroupCriterionLabelOperation
+	//	*MutateOperation_AdGroupCriterionOperation
+	//	*MutateOperation_AdGroupExtensionSettingOperation
+	//	*MutateOperation_AdGroupFeedOperation
+	//	*MutateOperation_AdGroupLabelOperation
+	//	*MutateOperation_AdGroupOperation
+	//	*MutateOperation_AdParameterOperation
+	//	*MutateOperation_AssetOperation
+	//	*MutateOperation_BiddingStrategyOperation
+	//	*MutateOperation_CampaignBidModifierOperation
+	//	*MutateOperation_CampaignBudgetOperation
+	//	*MutateOperation_CampaignCriterionOperation
+	//	*MutateOperation_CampaignDraftOperation
+	//	*MutateOperation_CampaignExperimentOperation
+	//	*MutateOperation_CampaignExtensionSettingOperation
+	//	*MutateOperation_CampaignFeedOperation
+	//	*MutateOperation_CampaignLabelOperation
+	//	*MutateOperation_CampaignOperation
+	//	*MutateOperation_CampaignSharedSetOperation
+	//	*MutateOperation_ConversionActionOperation
+	//	*MutateOperation_CustomerExtensionSettingOperation
+	//	*MutateOperation_CustomerFeedOperation
+	//	*MutateOperation_CustomerLabelOperation
+	//	*MutateOperation_CustomerNegativeCriterionOperation
+	//	*MutateOperation_CustomerOperation
+	//	*MutateOperation_ExtensionFeedItemOperation
+	//	*MutateOperation_FeedItemOperation
+	//	*MutateOperation_FeedItemTargetOperation
+	//	*MutateOperation_FeedMappingOperation
+	//	*MutateOperation_FeedOperation
+	//	*MutateOperation_LabelOperation
+	//	*MutateOperation_MediaFileOperation
+	//	*MutateOperation_RemarketingActionOperation
+	//	*MutateOperation_SharedCriterionOperation
+	//	*MutateOperation_SharedSetOperation
+	//	*MutateOperation_UserListOperation
+	Operation            isMutateOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *MutateOperation) Reset()         { *m = MutateOperation{} }
+func (m *MutateOperation) String() string { return proto.CompactTextString(m) }
+func (*MutateOperation) ProtoMessage()    {}
+func (*MutateOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da24cac89ef496be, []int{7}
+}
+
+func (m *MutateOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateOperation.Unmarshal(m, b)
+}
+func (m *MutateOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateOperation.Marshal(b, m, deterministic)
+}
+func (m *MutateOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateOperation.Merge(m, src)
+}
+func (m *MutateOperation) XXX_Size() int {
+	return xxx_messageInfo_MutateOperation.Size(m)
+}
+func (m *MutateOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateOperation proto.InternalMessageInfo
+
+type isMutateOperation_Operation interface {
+	isMutateOperation_Operation()
+}
+
+type MutateOperation_AdGroupAdLabelOperation struct {
+	AdGroupAdLabelOperation *AdGroupAdLabelOperation `protobuf:"bytes,17,opt,name=ad_group_ad_label_operation,json=adGroupAdLabelOperation,proto3,oneof"`
+}
+
+type MutateOperation_AdGroupAdOperation struct {
+	AdGroupAdOperation *AdGroupAdOperation `protobuf:"bytes,1,opt,name=ad_group_ad_operation,json=adGroupAdOperation,proto3,oneof"`
+}
+
+type MutateOperation_AdGroupBidModifierOperation struct {
+	AdGroupBidModifierOperation *AdGroupBidModifierOperation `protobuf:"bytes,2,opt,name=ad_group_bid_modifier_operation,json=adGroupBidModifierOperation,proto3,oneof"`
+}
+
+type MutateOperation_AdGroupCriterionLabelOperation struct {
+	AdGroupCriterionLabelOperation *AdGroupCriterionLabelOperation `protobuf:"bytes,18,opt,name=ad_group_criterion_label_operation,json=adGroupCriterionLabelOperation,proto3,oneof"`
+}
+
+type MutateOperation_AdGroupCriterionOperation struct {
+	AdGroupCriterionOperation *AdGroupCriterionOperation `protobuf:"bytes,3,opt,name=ad_group_criterion_operation,json=adGroupCriterionOperation,proto3,oneof"`
+}
+
+type MutateOperation_AdGroupExtensionSettingOperation struct {
+	AdGroupExtensionSettingOperation *AdGroupExtensionSettingOperation `protobuf:"bytes,19,opt,name=ad_group_extension_setting_operation,json=adGroupExtensionSettingOperation,proto3,oneof"`
+}
+
+type MutateOperation_AdGroupFeedOperation struct {
+	AdGroupFeedOperation *AdGroupFeedOperation `protobuf:"bytes,20,opt,name=ad_group_feed_operation,json=adGroupFeedOperation,proto3,oneof"`
+}
+
+type MutateOperation_AdGroupLabelOperation struct {
+	AdGroupLabelOperation *AdGroupLabelOperation `protobuf:"bytes,21,opt,name=ad_group_label_operation,json=adGroupLabelOperation,proto3,oneof"`
+}
+
+type MutateOperation_AdGroupOperation struct {
+	AdGroupOperation *AdGroupOperation `protobuf:"bytes,5,opt,name=ad_group_operation,json=adGroupOperation,proto3,oneof"`
+}
+
+type MutateOperation_AdParameterOperation struct {
+	AdParameterOperation *AdParameterOperation `protobuf:"bytes,22,opt,name=ad_parameter_operation,json=adParameterOperation,proto3,oneof"`
+}
+
+type MutateOperation_AssetOperation struct {
+	AssetOperation *AssetOperation `protobuf:"bytes,23,opt,name=asset_operation,json=assetOperation,proto3,oneof"`
+}
+
+type MutateOperation_BiddingStrategyOperation struct {
+	BiddingStrategyOperation *BiddingStrategyOperation `protobuf:"bytes,6,opt,name=bidding_strategy_operation,json=biddingStrategyOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignBidModifierOperation struct {
+	CampaignBidModifierOperation *CampaignBidModifierOperation `protobuf:"bytes,7,opt,name=campaign_bid_modifier_operation,json=campaignBidModifierOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignBudgetOperation struct {
+	CampaignBudgetOperation *CampaignBudgetOperation `protobuf:"bytes,8,opt,name=campaign_budget_operation,json=campaignBudgetOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignCriterionOperation struct {
+	CampaignCriterionOperation *CampaignCriterionOperation `protobuf:"bytes,13,opt,name=campaign_criterion_operation,json=campaignCriterionOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignDraftOperation struct {
+	CampaignDraftOperation *CampaignDraftOperation `protobuf:"bytes,24,opt,name=campaign_draft_operation,json=campaignDraftOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignExperimentOperation struct {
+	CampaignExperimentOperation *CampaignExperimentOperation `protobuf:"bytes,25,opt,name=campaign_experiment_operation,json=campaignExperimentOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignExtensionSettingOperation struct {
+	CampaignExtensionSettingOperation *CampaignExtensionSettingOperation `protobuf:"bytes,26,opt,name=campaign_extension_setting_operation,json=campaignExtensionSettingOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignFeedOperation struct {
+	CampaignFeedOperation *CampaignFeedOperation `protobuf:"bytes,27,opt,name=campaign_feed_operation,json=campaignFeedOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignLabelOperation struct {
+	CampaignLabelOperation *CampaignLabelOperation `protobuf:"bytes,28,opt,name=campaign_label_operation,json=campaignLabelOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignOperation struct {
+	CampaignOperation *CampaignOperation `protobuf:"bytes,10,opt,name=campaign_operation,json=campaignOperation,proto3,oneof"`
+}
+
+type MutateOperation_CampaignSharedSetOperation struct {
+	CampaignSharedSetOperation *CampaignSharedSetOperation `protobuf:"bytes,11,opt,name=campaign_shared_set_operation,json=campaignSharedSetOperation,proto3,oneof"`
+}
+
+type MutateOperation_ConversionActionOperation struct {
+	ConversionActionOperation *ConversionActionOperation `protobuf:"bytes,12,opt,name=conversion_action_operation,json=conversionActionOperation,proto3,oneof"`
+}
+
+type MutateOperation_CustomerExtensionSettingOperation struct {
+	CustomerExtensionSettingOperation *CustomerExtensionSettingOperation `protobuf:"bytes,30,opt,name=customer_extension_setting_operation,json=customerExtensionSettingOperation,proto3,oneof"`
+}
+
+type MutateOperation_CustomerFeedOperation struct {
+	CustomerFeedOperation *CustomerFeedOperation `protobuf:"bytes,31,opt,name=customer_feed_operation,json=customerFeedOperation,proto3,oneof"`
+}
+
+type MutateOperation_CustomerLabelOperation struct {
+	CustomerLabelOperation *CustomerLabelOperation `protobuf:"bytes,32,opt,name=customer_label_operation,json=customerLabelOperation,proto3,oneof"`
+}
+
+type MutateOperation_CustomerNegativeCriterionOperation struct {
+	CustomerNegativeCriterionOperation *CustomerNegativeCriterionOperation `protobuf:"bytes,34,opt,name=customer_negative_criterion_operation,json=customerNegativeCriterionOperation,proto3,oneof"`
+}
+
+type MutateOperation_CustomerOperation struct {
+	CustomerOperation *CustomerOperation `protobuf:"bytes,35,opt,name=customer_operation,json=customerOperation,proto3,oneof"`
+}
+
+type MutateOperation_ExtensionFeedItemOperation struct {
+	ExtensionFeedItemOperation *ExtensionFeedItemOperation `protobuf:"bytes,36,opt,name=extension_feed_item_operation,json=extensionFeedItemOperation,proto3,oneof"`
+}
+
+type MutateOperation_FeedItemOperation struct {
+	FeedItemOperation *FeedItemOperation `protobuf:"bytes,37,opt,name=feed_item_operation,json=feedItemOperation,proto3,oneof"`
+}
+
+type MutateOperation_FeedItemTargetOperation struct {
+	FeedItemTargetOperation *FeedItemTargetOperation `protobuf:"bytes,38,opt,name=feed_item_target_operation,json=feedItemTargetOperation,proto3,oneof"`
+}
+
+type MutateOperation_FeedMappingOperation struct {
+	FeedMappingOperation *FeedMappingOperation `protobuf:"bytes,39,opt,name=feed_mapping_operation,json=feedMappingOperation,proto3,oneof"`
+}
+
+type MutateOperation_FeedOperation struct {
+	FeedOperation *FeedOperation `protobuf:"bytes,40,opt,name=feed_operation,json=feedOperation,proto3,oneof"`
+}
+
+type MutateOperation_LabelOperation struct {
+	LabelOperation *LabelOperation `protobuf:"bytes,41,opt,name=label_operation,json=labelOperation,proto3,oneof"`
+}
+
+type MutateOperation_MediaFileOperation struct {
+	MediaFileOperation *MediaFileOperation `protobuf:"bytes,42,opt,name=media_file_operation,json=mediaFileOperation,proto3,oneof"`
+}
+
+type MutateOperation_RemarketingActionOperation struct {
+	RemarketingActionOperation *RemarketingActionOperation `protobuf:"bytes,43,opt,name=remarketing_action_operation,json=remarketingActionOperation,proto3,oneof"`
+}
+
+type MutateOperation_SharedCriterionOperation struct {
+	SharedCriterionOperation *SharedCriterionOperation `protobuf:"bytes,14,opt,name=shared_criterion_operation,json=sharedCriterionOperation,proto3,oneof"`
+}
+
+type MutateOperation_SharedSetOperation struct {
+	SharedSetOperation *SharedSetOperation `protobuf:"bytes,15,opt,name=shared_set_operation,json=sharedSetOperation,proto3,oneof"`
+}
+
+type MutateOperation_UserListOperation struct {
+	UserListOperation *UserListOperation `protobuf:"bytes,16,opt,name=user_list_operation,json=userListOperation,proto3,oneof"`
+}
+
+func (*MutateOperation_AdGroupAdLabelOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AdGroupAdOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AdGroupBidModifierOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AdGroupCriterionLabelOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AdGroupCriterionOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AdGroupExtensionSettingOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AdGroupFeedOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AdGroupLabelOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AdGroupOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AdParameterOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_AssetOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_BiddingStrategyOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignBidModifierOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignBudgetOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignCriterionOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignDraftOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignExperimentOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignExtensionSettingOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignFeedOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignLabelOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CampaignSharedSetOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_ConversionActionOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CustomerExtensionSettingOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CustomerFeedOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CustomerLabelOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CustomerNegativeCriterionOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_CustomerOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_ExtensionFeedItemOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_FeedItemOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_FeedItemTargetOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_FeedMappingOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_FeedOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_LabelOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_MediaFileOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_RemarketingActionOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_SharedCriterionOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_SharedSetOperation) isMutateOperation_Operation() {}
+
+func (*MutateOperation_UserListOperation) isMutateOperation_Operation() {}
+
+func (m *MutateOperation) GetOperation() isMutateOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdGroupAdLabelOperation() *AdGroupAdLabelOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdGroupAdLabelOperation); ok {
+		return x.AdGroupAdLabelOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdGroupAdOperation() *AdGroupAdOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdGroupAdOperation); ok {
+		return x.AdGroupAdOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdGroupBidModifierOperation() *AdGroupBidModifierOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdGroupBidModifierOperation); ok {
+		return x.AdGroupBidModifierOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdGroupCriterionLabelOperation() *AdGroupCriterionLabelOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdGroupCriterionLabelOperation); ok {
+		return x.AdGroupCriterionLabelOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdGroupCriterionOperation() *AdGroupCriterionOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdGroupCriterionOperation); ok {
+		return x.AdGroupCriterionOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdGroupExtensionSettingOperation() *AdGroupExtensionSettingOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdGroupExtensionSettingOperation); ok {
+		return x.AdGroupExtensionSettingOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdGroupFeedOperation() *AdGroupFeedOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdGroupFeedOperation); ok {
+		return x.AdGroupFeedOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdGroupLabelOperation() *AdGroupLabelOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdGroupLabelOperation); ok {
+		return x.AdGroupLabelOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdGroupOperation() *AdGroupOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdGroupOperation); ok {
+		return x.AdGroupOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAdParameterOperation() *AdParameterOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AdParameterOperation); ok {
+		return x.AdParameterOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetAssetOperation() *AssetOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_AssetOperation); ok {
+		return x.AssetOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetBiddingStrategyOperation() *BiddingStrategyOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_BiddingStrategyOperation); ok {
+		return x.BiddingStrategyOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignBidModifierOperation() *CampaignBidModifierOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignBidModifierOperation); ok {
+		return x.CampaignBidModifierOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignBudgetOperation() *CampaignBudgetOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignBudgetOperation); ok {
+		return x.CampaignBudgetOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignCriterionOperation() *CampaignCriterionOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignCriterionOperation); ok {
+		return x.CampaignCriterionOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignDraftOperation() *CampaignDraftOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignDraftOperation); ok {
+		return x.CampaignDraftOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignExperimentOperation() *CampaignExperimentOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignExperimentOperation); ok {
+		return x.CampaignExperimentOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignExtensionSettingOperation() *CampaignExtensionSettingOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignExtensionSettingOperation); ok {
+		return x.CampaignExtensionSettingOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignFeedOperation() *CampaignFeedOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignFeedOperation); ok {
+		return x.CampaignFeedOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignLabelOperation() *CampaignLabelOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignLabelOperation); ok {
+		return x.CampaignLabelOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignOperation() *CampaignOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignOperation); ok {
+		return x.CampaignOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCampaignSharedSetOperation() *CampaignSharedSetOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CampaignSharedSetOperation); ok {
+		return x.CampaignSharedSetOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetConversionActionOperation() *ConversionActionOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_ConversionActionOperation); ok {
+		return x.ConversionActionOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCustomerExtensionSettingOperation() *CustomerExtensionSettingOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CustomerExtensionSettingOperation); ok {
+		return x.CustomerExtensionSettingOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCustomerFeedOperation() *CustomerFeedOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CustomerFeedOperation); ok {
+		return x.CustomerFeedOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCustomerLabelOperation() *CustomerLabelOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CustomerLabelOperation); ok {
+		return x.CustomerLabelOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCustomerNegativeCriterionOperation() *CustomerNegativeCriterionOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CustomerNegativeCriterionOperation); ok {
+		return x.CustomerNegativeCriterionOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetCustomerOperation() *CustomerOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_CustomerOperation); ok {
+		return x.CustomerOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetExtensionFeedItemOperation() *ExtensionFeedItemOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_ExtensionFeedItemOperation); ok {
+		return x.ExtensionFeedItemOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetFeedItemOperation() *FeedItemOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_FeedItemOperation); ok {
+		return x.FeedItemOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetFeedItemTargetOperation() *FeedItemTargetOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_FeedItemTargetOperation); ok {
+		return x.FeedItemTargetOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetFeedMappingOperation() *FeedMappingOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_FeedMappingOperation); ok {
+		return x.FeedMappingOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetFeedOperation() *FeedOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_FeedOperation); ok {
+		return x.FeedOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetLabelOperation() *LabelOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_LabelOperation); ok {
+		return x.LabelOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetMediaFileOperation() *MediaFileOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_MediaFileOperation); ok {
+		return x.MediaFileOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetRemarketingActionOperation() *RemarketingActionOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_RemarketingActionOperation); ok {
+		return x.RemarketingActionOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetSharedCriterionOperation() *SharedCriterionOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_SharedCriterionOperation); ok {
+		return x.SharedCriterionOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetSharedSetOperation() *SharedSetOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_SharedSetOperation); ok {
+		return x.SharedSetOperation
+	}
+	return nil
+}
+
+func (m *MutateOperation) GetUserListOperation() *UserListOperation {
+	if x, ok := m.GetOperation().(*MutateOperation_UserListOperation); ok {
+		return x.UserListOperation
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*MutateOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*MutateOperation_AdGroupAdLabelOperation)(nil),
+		(*MutateOperation_AdGroupAdOperation)(nil),
+		(*MutateOperation_AdGroupBidModifierOperation)(nil),
+		(*MutateOperation_AdGroupCriterionLabelOperation)(nil),
+		(*MutateOperation_AdGroupCriterionOperation)(nil),
+		(*MutateOperation_AdGroupExtensionSettingOperation)(nil),
+		(*MutateOperation_AdGroupFeedOperation)(nil),
+		(*MutateOperation_AdGroupLabelOperation)(nil),
+		(*MutateOperation_AdGroupOperation)(nil),
+		(*MutateOperation_AdParameterOperation)(nil),
+		(*MutateOperation_AssetOperation)(nil),
+		(*MutateOperation_BiddingStrategyOperation)(nil),
+		(*MutateOperation_CampaignBidModifierOperation)(nil),
+		(*MutateOperation_CampaignBudgetOperation)(nil),
+		(*MutateOperation_CampaignCriterionOperation)(nil),
+		(*MutateOperation_CampaignDraftOperation)(nil),
+		(*MutateOperation_CampaignExperimentOperation)(nil),
+		(*MutateOperation_CampaignExtensionSettingOperation)(nil),
+		(*MutateOperation_CampaignFeedOperation)(nil),
+		(*MutateOperation_CampaignLabelOperation)(nil),
+		(*MutateOperation_CampaignOperation)(nil),
+		(*MutateOperation_CampaignSharedSetOperation)(nil),
+		(*MutateOperation_ConversionActionOperation)(nil),
+		(*MutateOperation_CustomerExtensionSettingOperation)(nil),
+		(*MutateOperation_CustomerFeedOperation)(nil),
+		(*MutateOperation_CustomerLabelOperation)(nil),
+		(*MutateOperation_CustomerNegativeCriterionOperation)(nil),
+		(*MutateOperation_CustomerOperation)(nil),
+		(*MutateOperation_ExtensionFeedItemOperation)(nil),
+		(*MutateOperation_FeedItemOperation)(nil),
+		(*MutateOperation_FeedItemTargetOperation)(nil),
+		(*MutateOperation_FeedMappingOperation)(nil),
+		(*MutateOperation_FeedOperation)(nil),
+		(*MutateOperation_LabelOperation)(nil),
+		(*MutateOperation_MediaFileOperation)(nil),
+		(*MutateOperation_RemarketingActionOperation)(nil),
+		(*MutateOperation_SharedCriterionOperation)(nil),
+		(*MutateOperation_SharedSetOperation)(nil),
+		(*MutateOperation_UserListOperation)(nil),
+	}
+}
+
+// Response message for the resource mutate.
+type MutateOperationResponse struct {
+	// The mutate response.
+	//
+	// Types that are valid to be assigned to Response:
+	//	*MutateOperationResponse_AdGroupAdLabelResult
+	//	*MutateOperationResponse_AdGroupAdResult
+	//	*MutateOperationResponse_AdGroupBidModifierResult
+	//	*MutateOperationResponse_AdGroupCriterionLabelResult
+	//	*MutateOperationResponse_AdGroupCriterionResult
+	//	*MutateOperationResponse_AdGroupExtensionSettingResult
+	//	*MutateOperationResponse_AdGroupFeedResult
+	//	*MutateOperationResponse_AdGroupLabelResult
+	//	*MutateOperationResponse_AdGroupResult
+	//	*MutateOperationResponse_AdParameterResult
+	//	*MutateOperationResponse_AssetResult
+	//	*MutateOperationResponse_BiddingStrategyResult
+	//	*MutateOperationResponse_CampaignBidModifierResult
+	//	*MutateOperationResponse_CampaignBudgetResult
+	//	*MutateOperationResponse_CampaignCriterionResult
+	//	*MutateOperationResponse_CampaignDraftResult
+	//	*MutateOperationResponse_CampaignExperimentResult
+	//	*MutateOperationResponse_CampaignExtensionSettingResult
+	//	*MutateOperationResponse_CampaignFeedResult
+	//	*MutateOperationResponse_CampaignLabelResult
+	//	*MutateOperationResponse_CampaignResult
+	//	*MutateOperationResponse_CampaignSharedSetResult
+	//	*MutateOperationResponse_ConversionActionResult
+	//	*MutateOperationResponse_CustomerExtensionSettingResult
+	//	*MutateOperationResponse_CustomerFeedResult
+	//	*MutateOperationResponse_CustomerLabelResult
+	//	*MutateOperationResponse_CustomerNegativeCriterionResult
+	//	*MutateOperationResponse_CustomerResult
+	//	*MutateOperationResponse_ExtensionFeedItemResult
+	//	*MutateOperationResponse_FeedItemResult
+	//	*MutateOperationResponse_FeedItemTargetResult
+	//	*MutateOperationResponse_FeedMappingResult
+	//	*MutateOperationResponse_FeedResult
+	//	*MutateOperationResponse_LabelResult
+	//	*MutateOperationResponse_MediaFileResult
+	//	*MutateOperationResponse_RemarketingActionResult
+	//	*MutateOperationResponse_SharedCriterionResult
+	//	*MutateOperationResponse_SharedSetResult
+	//	*MutateOperationResponse_UserListResult
+	Response             isMutateOperationResponse_Response `protobuf_oneof:"response"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *MutateOperationResponse) Reset()         { *m = MutateOperationResponse{} }
+func (m *MutateOperationResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateOperationResponse) ProtoMessage()    {}
+func (*MutateOperationResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_da24cac89ef496be, []int{8}
+}
+
+func (m *MutateOperationResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateOperationResponse.Unmarshal(m, b)
+}
+func (m *MutateOperationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateOperationResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateOperationResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateOperationResponse.Merge(m, src)
+}
+func (m *MutateOperationResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateOperationResponse.Size(m)
+}
+func (m *MutateOperationResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateOperationResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateOperationResponse proto.InternalMessageInfo
+
+type isMutateOperationResponse_Response interface {
+	isMutateOperationResponse_Response()
+}
+
+type MutateOperationResponse_AdGroupAdLabelResult struct {
+	AdGroupAdLabelResult *MutateAdGroupAdLabelResult `protobuf:"bytes,17,opt,name=ad_group_ad_label_result,json=adGroupAdLabelResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AdGroupAdResult struct {
+	AdGroupAdResult *MutateAdGroupAdResult `protobuf:"bytes,1,opt,name=ad_group_ad_result,json=adGroupAdResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AdGroupBidModifierResult struct {
+	AdGroupBidModifierResult *MutateAdGroupBidModifierResult `protobuf:"bytes,2,opt,name=ad_group_bid_modifier_result,json=adGroupBidModifierResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AdGroupCriterionLabelResult struct {
+	AdGroupCriterionLabelResult *MutateAdGroupCriterionLabelResult `protobuf:"bytes,18,opt,name=ad_group_criterion_label_result,json=adGroupCriterionLabelResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AdGroupCriterionResult struct {
+	AdGroupCriterionResult *MutateAdGroupCriterionResult `protobuf:"bytes,3,opt,name=ad_group_criterion_result,json=adGroupCriterionResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AdGroupExtensionSettingResult struct {
+	AdGroupExtensionSettingResult *MutateAdGroupExtensionSettingResult `protobuf:"bytes,19,opt,name=ad_group_extension_setting_result,json=adGroupExtensionSettingResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AdGroupFeedResult struct {
+	AdGroupFeedResult *MutateAdGroupFeedResult `protobuf:"bytes,20,opt,name=ad_group_feed_result,json=adGroupFeedResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AdGroupLabelResult struct {
+	AdGroupLabelResult *MutateAdGroupLabelResult `protobuf:"bytes,21,opt,name=ad_group_label_result,json=adGroupLabelResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AdGroupResult struct {
+	AdGroupResult *MutateAdGroupResult `protobuf:"bytes,5,opt,name=ad_group_result,json=adGroupResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AdParameterResult struct {
+	AdParameterResult *MutateAdParameterResult `protobuf:"bytes,22,opt,name=ad_parameter_result,json=adParameterResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_AssetResult struct {
+	AssetResult *MutateAssetResult `protobuf:"bytes,23,opt,name=asset_result,json=assetResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_BiddingStrategyResult struct {
+	BiddingStrategyResult *MutateBiddingStrategyResult `protobuf:"bytes,6,opt,name=bidding_strategy_result,json=biddingStrategyResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignBidModifierResult struct {
+	CampaignBidModifierResult *MutateCampaignBidModifierResult `protobuf:"bytes,7,opt,name=campaign_bid_modifier_result,json=campaignBidModifierResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignBudgetResult struct {
+	CampaignBudgetResult *MutateCampaignBudgetResult `protobuf:"bytes,8,opt,name=campaign_budget_result,json=campaignBudgetResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignCriterionResult struct {
+	CampaignCriterionResult *MutateCampaignCriterionResult `protobuf:"bytes,13,opt,name=campaign_criterion_result,json=campaignCriterionResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignDraftResult struct {
+	CampaignDraftResult *MutateCampaignDraftResult `protobuf:"bytes,24,opt,name=campaign_draft_result,json=campaignDraftResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignExperimentResult struct {
+	CampaignExperimentResult *MutateCampaignExperimentResult `protobuf:"bytes,25,opt,name=campaign_experiment_result,json=campaignExperimentResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignExtensionSettingResult struct {
+	CampaignExtensionSettingResult *MutateCampaignExtensionSettingResult `protobuf:"bytes,26,opt,name=campaign_extension_setting_result,json=campaignExtensionSettingResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignFeedResult struct {
+	CampaignFeedResult *MutateCampaignFeedResult `protobuf:"bytes,27,opt,name=campaign_feed_result,json=campaignFeedResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignLabelResult struct {
+	CampaignLabelResult *MutateCampaignLabelResult `protobuf:"bytes,28,opt,name=campaign_label_result,json=campaignLabelResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignResult struct {
+	CampaignResult *MutateCampaignResult `protobuf:"bytes,10,opt,name=campaign_result,json=campaignResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CampaignSharedSetResult struct {
+	CampaignSharedSetResult *MutateCampaignSharedSetResult `protobuf:"bytes,11,opt,name=campaign_shared_set_result,json=campaignSharedSetResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_ConversionActionResult struct {
+	ConversionActionResult *MutateConversionActionResult `protobuf:"bytes,12,opt,name=conversion_action_result,json=conversionActionResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CustomerExtensionSettingResult struct {
+	CustomerExtensionSettingResult *MutateCustomerExtensionSettingResult `protobuf:"bytes,30,opt,name=customer_extension_setting_result,json=customerExtensionSettingResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CustomerFeedResult struct {
+	CustomerFeedResult *MutateCustomerFeedResult `protobuf:"bytes,31,opt,name=customer_feed_result,json=customerFeedResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CustomerLabelResult struct {
+	CustomerLabelResult *MutateCustomerLabelResult `protobuf:"bytes,32,opt,name=customer_label_result,json=customerLabelResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CustomerNegativeCriterionResult struct {
+	CustomerNegativeCriterionResult *MutateCustomerNegativeCriteriaResult `protobuf:"bytes,34,opt,name=customer_negative_criterion_result,json=customerNegativeCriterionResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_CustomerResult struct {
+	CustomerResult *MutateCustomerResult `protobuf:"bytes,35,opt,name=customer_result,json=customerResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_ExtensionFeedItemResult struct {
+	ExtensionFeedItemResult *MutateExtensionFeedItemResult `protobuf:"bytes,36,opt,name=extension_feed_item_result,json=extensionFeedItemResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_FeedItemResult struct {
+	FeedItemResult *MutateFeedItemResult `protobuf:"bytes,37,opt,name=feed_item_result,json=feedItemResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_FeedItemTargetResult struct {
+	FeedItemTargetResult *MutateFeedItemTargetResult `protobuf:"bytes,38,opt,name=feed_item_target_result,json=feedItemTargetResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_FeedMappingResult struct {
+	FeedMappingResult *MutateFeedMappingResult `protobuf:"bytes,39,opt,name=feed_mapping_result,json=feedMappingResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_FeedResult struct {
+	FeedResult *MutateFeedResult `protobuf:"bytes,40,opt,name=feed_result,json=feedResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_LabelResult struct {
+	LabelResult *MutateLabelResult `protobuf:"bytes,41,opt,name=label_result,json=labelResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_MediaFileResult struct {
+	MediaFileResult *MutateMediaFileResult `protobuf:"bytes,42,opt,name=media_file_result,json=mediaFileResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_RemarketingActionResult struct {
+	RemarketingActionResult *MutateRemarketingActionResult `protobuf:"bytes,43,opt,name=remarketing_action_result,json=remarketingActionResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_SharedCriterionResult struct {
+	SharedCriterionResult *MutateSharedCriterionResult `protobuf:"bytes,14,opt,name=shared_criterion_result,json=sharedCriterionResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_SharedSetResult struct {
+	SharedSetResult *MutateSharedSetResult `protobuf:"bytes,15,opt,name=shared_set_result,json=sharedSetResult,proto3,oneof"`
+}
+
+type MutateOperationResponse_UserListResult struct {
+	UserListResult *MutateUserListResult `protobuf:"bytes,16,opt,name=user_list_result,json=userListResult,proto3,oneof"`
+}
+
+func (*MutateOperationResponse_AdGroupAdLabelResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AdGroupAdResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AdGroupBidModifierResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AdGroupCriterionLabelResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AdGroupCriterionResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AdGroupExtensionSettingResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AdGroupFeedResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AdGroupLabelResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AdGroupResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AdParameterResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_AssetResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_BiddingStrategyResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignBidModifierResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignBudgetResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignCriterionResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignDraftResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignExperimentResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignExtensionSettingResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignFeedResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignLabelResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CampaignSharedSetResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_ConversionActionResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CustomerExtensionSettingResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CustomerFeedResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CustomerLabelResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CustomerNegativeCriterionResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_CustomerResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_ExtensionFeedItemResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_FeedItemResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_FeedItemTargetResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_FeedMappingResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_FeedResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_LabelResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_MediaFileResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_RemarketingActionResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_SharedCriterionResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_SharedSetResult) isMutateOperationResponse_Response() {}
+
+func (*MutateOperationResponse_UserListResult) isMutateOperationResponse_Response() {}
+
+func (m *MutateOperationResponse) GetResponse() isMutateOperationResponse_Response {
+	if m != nil {
+		return m.Response
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdGroupAdLabelResult() *MutateAdGroupAdLabelResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdGroupAdLabelResult); ok {
+		return x.AdGroupAdLabelResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdGroupAdResult() *MutateAdGroupAdResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdGroupAdResult); ok {
+		return x.AdGroupAdResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdGroupBidModifierResult() *MutateAdGroupBidModifierResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdGroupBidModifierResult); ok {
+		return x.AdGroupBidModifierResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdGroupCriterionLabelResult() *MutateAdGroupCriterionLabelResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdGroupCriterionLabelResult); ok {
+		return x.AdGroupCriterionLabelResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdGroupCriterionResult() *MutateAdGroupCriterionResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdGroupCriterionResult); ok {
+		return x.AdGroupCriterionResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdGroupExtensionSettingResult() *MutateAdGroupExtensionSettingResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdGroupExtensionSettingResult); ok {
+		return x.AdGroupExtensionSettingResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdGroupFeedResult() *MutateAdGroupFeedResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdGroupFeedResult); ok {
+		return x.AdGroupFeedResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdGroupLabelResult() *MutateAdGroupLabelResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdGroupLabelResult); ok {
+		return x.AdGroupLabelResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdGroupResult() *MutateAdGroupResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdGroupResult); ok {
+		return x.AdGroupResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAdParameterResult() *MutateAdParameterResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AdParameterResult); ok {
+		return x.AdParameterResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetAssetResult() *MutateAssetResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_AssetResult); ok {
+		return x.AssetResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetBiddingStrategyResult() *MutateBiddingStrategyResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_BiddingStrategyResult); ok {
+		return x.BiddingStrategyResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignBidModifierResult() *MutateCampaignBidModifierResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignBidModifierResult); ok {
+		return x.CampaignBidModifierResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignBudgetResult() *MutateCampaignBudgetResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignBudgetResult); ok {
+		return x.CampaignBudgetResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignCriterionResult() *MutateCampaignCriterionResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignCriterionResult); ok {
+		return x.CampaignCriterionResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignDraftResult() *MutateCampaignDraftResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignDraftResult); ok {
+		return x.CampaignDraftResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignExperimentResult() *MutateCampaignExperimentResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignExperimentResult); ok {
+		return x.CampaignExperimentResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignExtensionSettingResult() *MutateCampaignExtensionSettingResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignExtensionSettingResult); ok {
+		return x.CampaignExtensionSettingResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignFeedResult() *MutateCampaignFeedResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignFeedResult); ok {
+		return x.CampaignFeedResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignLabelResult() *MutateCampaignLabelResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignLabelResult); ok {
+		return x.CampaignLabelResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignResult() *MutateCampaignResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignResult); ok {
+		return x.CampaignResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCampaignSharedSetResult() *MutateCampaignSharedSetResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CampaignSharedSetResult); ok {
+		return x.CampaignSharedSetResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetConversionActionResult() *MutateConversionActionResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_ConversionActionResult); ok {
+		return x.ConversionActionResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCustomerExtensionSettingResult() *MutateCustomerExtensionSettingResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CustomerExtensionSettingResult); ok {
+		return x.CustomerExtensionSettingResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCustomerFeedResult() *MutateCustomerFeedResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CustomerFeedResult); ok {
+		return x.CustomerFeedResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCustomerLabelResult() *MutateCustomerLabelResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CustomerLabelResult); ok {
+		return x.CustomerLabelResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCustomerNegativeCriterionResult() *MutateCustomerNegativeCriteriaResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CustomerNegativeCriterionResult); ok {
+		return x.CustomerNegativeCriterionResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetCustomerResult() *MutateCustomerResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_CustomerResult); ok {
+		return x.CustomerResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetExtensionFeedItemResult() *MutateExtensionFeedItemResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_ExtensionFeedItemResult); ok {
+		return x.ExtensionFeedItemResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetFeedItemResult() *MutateFeedItemResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_FeedItemResult); ok {
+		return x.FeedItemResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetFeedItemTargetResult() *MutateFeedItemTargetResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_FeedItemTargetResult); ok {
+		return x.FeedItemTargetResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetFeedMappingResult() *MutateFeedMappingResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_FeedMappingResult); ok {
+		return x.FeedMappingResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetFeedResult() *MutateFeedResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_FeedResult); ok {
+		return x.FeedResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetLabelResult() *MutateLabelResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_LabelResult); ok {
+		return x.LabelResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetMediaFileResult() *MutateMediaFileResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_MediaFileResult); ok {
+		return x.MediaFileResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetRemarketingActionResult() *MutateRemarketingActionResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_RemarketingActionResult); ok {
+		return x.RemarketingActionResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetSharedCriterionResult() *MutateSharedCriterionResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_SharedCriterionResult); ok {
+		return x.SharedCriterionResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetSharedSetResult() *MutateSharedSetResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_SharedSetResult); ok {
+		return x.SharedSetResult
+	}
+	return nil
+}
+
+func (m *MutateOperationResponse) GetUserListResult() *MutateUserListResult {
+	if x, ok := m.GetResponse().(*MutateOperationResponse_UserListResult); ok {
+		return x.UserListResult
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*MutateOperationResponse) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*MutateOperationResponse_AdGroupAdLabelResult)(nil),
+		(*MutateOperationResponse_AdGroupAdResult)(nil),
+		(*MutateOperationResponse_AdGroupBidModifierResult)(nil),
+		(*MutateOperationResponse_AdGroupCriterionLabelResult)(nil),
+		(*MutateOperationResponse_AdGroupCriterionResult)(nil),
+		(*MutateOperationResponse_AdGroupExtensionSettingResult)(nil),
+		(*MutateOperationResponse_AdGroupFeedResult)(nil),
+		(*MutateOperationResponse_AdGroupLabelResult)(nil),
+		(*MutateOperationResponse_AdGroupResult)(nil),
+		(*MutateOperationResponse_AdParameterResult)(nil),
+		(*MutateOperationResponse_AssetResult)(nil),
+		(*MutateOperationResponse_BiddingStrategyResult)(nil),
+		(*MutateOperationResponse_CampaignBidModifierResult)(nil),
+		(*MutateOperationResponse_CampaignBudgetResult)(nil),
+		(*MutateOperationResponse_CampaignCriterionResult)(nil),
+		(*MutateOperationResponse_CampaignDraftResult)(nil),
+		(*MutateOperationResponse_CampaignExperimentResult)(nil),
+		(*MutateOperationResponse_CampaignExtensionSettingResult)(nil),
+		(*MutateOperationResponse_CampaignFeedResult)(nil),
+		(*MutateOperationResponse_CampaignLabelResult)(nil),
+		(*MutateOperationResponse_CampaignResult)(nil),
+		(*MutateOperationResponse_CampaignSharedSetResult)(nil),
+		(*MutateOperationResponse_ConversionActionResult)(nil),
+		(*MutateOperationResponse_CustomerExtensionSettingResult)(nil),
+		(*MutateOperationResponse_CustomerFeedResult)(nil),
+		(*MutateOperationResponse_CustomerLabelResult)(nil),
+		(*MutateOperationResponse_CustomerNegativeCriterionResult)(nil),
+		(*MutateOperationResponse_CustomerResult)(nil),
+		(*MutateOperationResponse_ExtensionFeedItemResult)(nil),
+		(*MutateOperationResponse_FeedItemResult)(nil),
+		(*MutateOperationResponse_FeedItemTargetResult)(nil),
+		(*MutateOperationResponse_FeedMappingResult)(nil),
+		(*MutateOperationResponse_FeedResult)(nil),
+		(*MutateOperationResponse_LabelResult)(nil),
+		(*MutateOperationResponse_MediaFileResult)(nil),
+		(*MutateOperationResponse_RemarketingActionResult)(nil),
+		(*MutateOperationResponse_SharedCriterionResult)(nil),
+		(*MutateOperationResponse_SharedSetResult)(nil),
+		(*MutateOperationResponse_UserListResult)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*SearchGoogleAdsRequest)(nil), "google.ads.googleads.v3.services.SearchGoogleAdsRequest")
+	proto.RegisterType((*SearchGoogleAdsResponse)(nil), "google.ads.googleads.v3.services.SearchGoogleAdsResponse")
+	proto.RegisterType((*SearchGoogleAdsStreamRequest)(nil), "google.ads.googleads.v3.services.SearchGoogleAdsStreamRequest")
+	proto.RegisterType((*SearchGoogleAdsStreamResponse)(nil), "google.ads.googleads.v3.services.SearchGoogleAdsStreamResponse")
+	proto.RegisterType((*GoogleAdsRow)(nil), "google.ads.googleads.v3.services.GoogleAdsRow")
+	proto.RegisterType((*MutateGoogleAdsRequest)(nil), "google.ads.googleads.v3.services.MutateGoogleAdsRequest")
+	proto.RegisterType((*MutateGoogleAdsResponse)(nil), "google.ads.googleads.v3.services.MutateGoogleAdsResponse")
+	proto.RegisterType((*MutateOperation)(nil), "google.ads.googleads.v3.services.MutateOperation")
+	proto.RegisterType((*MutateOperationResponse)(nil), "google.ads.googleads.v3.services.MutateOperationResponse")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/google_ads_service.proto", fileDescriptor_da24cac89ef496be)
+}
+
+var fileDescriptor_da24cac89ef496be = []byte{
+	// 5611 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x7d, 0xcb, 0x73, 0x1c, 0x47,
+	0x72, 0xf7, 0x37, 0xa0, 0x48, 0x82, 0x05, 0x10, 0x8f, 0x02, 0x49, 0x14, 0xc1, 0xa7, 0x20, 0x4a,
+	0xa2, 0x28, 0x69, 0x20, 0x91, 0xd4, 0x83, 0xe0, 0x4b, 0x00, 0xf8, 0x90, 0x56, 0xe4, 0x0a, 0x5f,
+	0x83, 0xa2, 0x9e, 0xeb, 0xd9, 0x42, 0x77, 0xcd, 0xa0, 0x85, 0x99, 0xee, 0x61, 0x77, 0x0f, 0x40,
+	0x48, 0x2b, 0xad, 0x56, 0xbb, 0xf6, 0x46, 0xd8, 0x8e, 0x8d, 0x70, 0xac, 0xed, 0x08, 0x5f, 0x7d,
+	0x72, 0xf8, 0xcf, 0xf0, 0xc5, 0x11, 0x1b, 0xbe, 0xf9, 0x60, 0x87, 0x4e, 0x3e, 0x38, 0x7c, 0xf0,
+	0xc5, 0xe1, 0x83, 0x6f, 0x76, 0x84, 0xa3, 0xab, 0xab, 0xbb, 0xab, 0xaa, 0xab, 0x31, 0x59, 0xa3,
+	0xf5, 0x6d, 0x3a, 0xab, 0x7f, 0x99, 0x59, 0x55, 0x99, 0x55, 0x59, 0xd9, 0x59, 0x00, 0xba, 0xd6,
+	0x09, 0xc3, 0x4e, 0x97, 0x2d, 0x51, 0x2f, 0x5e, 0xca, 0x7e, 0xa6, 0xbf, 0x76, 0xae, 0x2c, 0xc5,
+	0x2c, 0xda, 0xf1, 0x5d, 0x96, 0x53, 0x5b, 0xd4, 0x8b, 0x5b, 0x82, 0xd6, 0xec, 0x47, 0x61, 0x12,
+	0xe2, 0xf3, 0x59, 0x4b, 0x93, 0x7a, 0x71, 0xb3, 0x80, 0x36, 0x77, 0xae, 0x34, 0x73, 0xe8, 0xc2,
+	0x2b, 0x75, 0xcc, 0xdd, 0xb0, 0xd7, 0x0b, 0x83, 0xa5, 0x1e, 0x4b, 0x22, 0xdf, 0x8d, 0x33, 0x7e,
+	0x0b, 0xaf, 0x0e, 0x79, 0x3b, 0x66, 0x9d, 0x1e, 0x0b, 0x92, 0xfc, 0xf5, 0xb7, 0xea, 0x5e, 0x67,
+	0xc1, 0xa0, 0x17, 0x2f, 0xc5, 0x83, 0x5e, 0x8f, 0x46, 0x7b, 0xad, 0x28, 0xdc, 0x6d, 0xc5, 0x2c,
+	0x49, 0xfc, 0xa0, 0x23, 0x80, 0x6f, 0xd6, 0x01, 0x23, 0x16, 0x87, 0x83, 0x28, 0xed, 0x33, 0x75,
+	0xdd, 0x70, 0x10, 0x24, 0xad, 0xcd, 0x81, 0xd7, 0x61, 0x89, 0xc0, 0xdd, 0xb6, 0xc5, 0xb5, 0xfa,
+	0x51, 0xd8, 0x0f, 0x63, 0xda, 0x15, 0x0c, 0x5e, 0x03, 0x30, 0xf0, 0x5a, 0x9d, 0x28, 0x1c, 0xf4,
+	0x05, 0xe2, 0x0a, 0x1c, 0xd1, 0xa2, 0x9e, 0x00, 0xdd, 0xb2, 0x02, 0xb5, 0x68, 0x1c, 0xb3, 0xa4,
+	0xb5, 0xe3, 0xb3, 0x5d, 0x81, 0xbf, 0x66, 0x87, 0xef, 0xd2, 0x4d, 0xd6, 0x1d, 0x45, 0xf4, 0xc0,
+	0xf3, 0x59, 0xe0, 0x32, 0x59, 0xf4, 0x4d, 0x0b, 0xfc, 0xa6, 0xef, 0xb5, 0x7a, 0xa1, 0xe7, 0xb7,
+	0x7d, 0x16, 0x09, 0xf8, 0xb2, 0x05, 0xdc, 0x8d, 0xfc, 0x84, 0x45, 0x7e, 0x18, 0x08, 0xec, 0x3b,
+	0xa3, 0x60, 0x95, 0xce, 0xdf, 0x1d, 0x89, 0x43, 0xec, 0xf7, 0x06, 0x5d, 0x9a, 0x94, 0x8a, 0xac,
+	0x5a, 0xb0, 0x61, 0x4f, 0x13, 0x16, 0xc4, 0x9c, 0x8d, 0x62, 0xe2, 0x6f, 0x58, 0xf0, 0x68, 0x33,
+	0xe6, 0x59, 0x78, 0x46, 0x0e, 0x93, 0x7b, 0x7e, 0xdd, 0x02, 0x57, 0xe9, 0xef, 0x55, 0x10, 0xb8,
+	0x4f, 0x23, 0xda, 0x63, 0x49, 0x31, 0xd5, 0x6f, 0x83, 0x50, 0xb1, 0xbb, 0xc5, 0xbc, 0x41, 0x57,
+	0xb1, 0x31, 0x48, 0x27, 0x3b, 0xac, 0x15, 0xd1, 0xa0, 0xa3, 0xe0, 0x5e, 0x05, 0xe0, 0x52, 0x57,
+	0x82, 0x2b, 0xb8, 0xe9, 0x7b, 0x9e, 0x1f, 0x74, 0x5a, 0x71, 0x12, 0xd1, 0x84, 0x75, 0xf6, 0xe0,
+	0x93, 0xb7, 0xe9, 0x77, 0xbb, 0x1c, 0xc9, 0x92, 0x62, 0xad, 0x00, 0xac, 0x2e, 0x2e, 0xed, 0xf5,
+	0xa9, 0xdf, 0x09, 0xe0, 0xde, 0x9a, 0x23, 0x46, 0xf5, 0xd6, 0x02, 0x6f, 0xf0, 0xd6, 0xb7, 0x6c,
+	0xe0, 0xf2, 0x42, 0xbc, 0x6c, 0x01, 0xd4, 0xdd, 0xfc, 0xee, 0x28, 0xd8, 0xaa, 0xd1, 0xbe, 0x69,
+	0xc1, 0xc6, 0x8b, 0x68, 0x3b, 0x81, 0x7b, 0x4a, 0x81, 0x63, 0x4f, 0xfb, 0x2c, 0xf2, 0xd3, 0x2d,
+	0x0f, 0xbe, 0x32, 0x48, 0xe0, 0x91, 0x57, 0x86, 0x82, 0x87, 0xdd, 0xca, 0x50, 0xc0, 0x2c, 0x57,
+	0x86, 0x02, 0x17, 0x6f, 0xd1, 0x88, 0x79, 0x2d, 0x2b, 0x17, 0x72, 0x69, 0x14, 0xf9, 0x2c, 0x6a,
+	0xb9, 0x61, 0x10, 0x27, 0xb4, 0x18, 0x29, 0x48, 0x2f, 0xb7, 0xb8, 0x83, 0xc7, 0x09, 0x4d, 0x06,
+	0x79, 0x48, 0x71, 0x19, 0x00, 0xeb, 0xfa, 0xee, 0xb6, 0xe5, 0x6e, 0xe9, 0x86, 0xc1, 0x0e, 0x8b,
+	0xf8, 0x64, 0x50, 0x57, 0x32, 0x22, 0x08, 0x74, 0x10, 0x45, 0x2c, 0x70, 0xf7, 0xf4, 0x0e, 0x42,
+	0x7c, 0x67, 0x10, 0x27, 0x61, 0xaf, 0xe5, 0x07, 0x09, 0x8b, 0x58, 0x9c, 0x58, 0xac, 0x12, 0x1c,
+	0x68, 0xe5, 0xa6, 0x02, 0xd1, 0x72, 0xbb, 0x7e, 0x69, 0xae, 0x37, 0xac, 0x81, 0xad, 0xae, 0x1f,
+	0x6c, 0x5b, 0x18, 0x7b, 0x8e, 0xfe, 0x21, 0xc6, 0x9e, 0xf3, 0xb0, 0x34, 0xf6, 0x1c, 0x26, 0x1b,
+	0xfb, 0x4d, 0x0b, 0x5c, 0x8f, 0x06, 0xb4, 0x93, 0xe2, 0xcb, 0x1e, 0xaf, 0x59, 0xc0, 0x03, 0xd6,
+	0xa1, 0x89, 0xbf, 0xc3, 0x2a, 0xeb, 0x1b, 0x40, 0x07, 0x8f, 0x25, 0xd4, 0xef, 0xb6, 0xfa, 0x5d,
+	0xea, 0xb2, 0x74, 0x75, 0x91, 0xad, 0x19, 0x30, 0x67, 0x9e, 0x1f, 0xf7, 0xbb, 0x74, 0xaf, 0xb5,
+	0xcd, 0xf6, 0x76, 0xc3, 0xc8, 0x93, 0xd1, 0x6f, 0x80, 0xd0, 0x09, 0xd5, 0xf6, 0x11, 0x80, 0x85,
+	0x79, 0x61, 0x8f, 0xfa, 0x41, 0xcb, 0x4d, 0xf7, 0xc9, 0x30, 0xca, 0x77, 0xca, 0xf7, 0x01, 0xc0,
+	0xbd, 0x80, 0xf6, 0x7c, 0xb7, 0x15, 0x33, 0x1a, 0xb9, 0x5b, 0xe2, 0x14, 0xc3, 0x7f, 0x26, 0x2c,
+	0xea, 0xc9, 0x5a, 0x00, 0x0c, 0x8e, 0x3d, 0xed, 0xd3, 0xc0, 0x63, 0x69, 0xcc, 0x1b, 0xf0, 0x9d,
+	0xbb, 0x4f, 0xd5, 0x18, 0xe1, 0x3a, 0x84, 0x47, 0x6e, 0xab, 0xa9, 0xc5, 0xb5, 0xfc, 0x84, 0xf5,
+	0x04, 0xf8, 0x95, 0xe1, 0x60, 0xc9, 0x48, 0x5f, 0x87, 0xbd, 0x2d, 0x0b, 0x78, 0xdb, 0x02, 0xd2,
+	0x4a, 0x68, 0x54, 0xee, 0xb8, 0x57, 0x81, 0xc8, 0x1e, 0xed, 0xf7, 0x4b, 0xf7, 0xbb, 0x09, 0x44,
+	0x71, 0x4b, 0xdc, 0x0a, 0xbb, 0x1e, 0x8b, 0xe4, 0xc1, 0x04, 0x1c, 0x7e, 0x3a, 0x2c, 0xd0, 0x40,
+	0xd7, 0x21, 0xa0, 0x50, 0xf4, 0x6e, 0x84, 0x55, 0xb5, 0xc3, 0xc2, 0x4e, 0x44, 0xfb, 0x5b, 0xbe,
+	0x6b, 0xe9, 0x36, 0x59, 0xf4, 0x6b, 0x74, 0x3a, 0xc0, 0xbc, 0x6c, 0x85, 0x09, 0xeb, 0x8a, 0x08,
+	0x5a, 0x42, 0xde, 0x82, 0x22, 0xfb, 0x2c, 0x6a, 0x87, 0x51, 0x4f, 0xf7, 0x3c, 0xc0, 0xbc, 0xe6,
+	0x6e, 0xde, 0xef, 0x52, 0x8b, 0x35, 0x46, 0x46, 0xb5, 0xb4, 0x43, 0xad, 0x2d, 0x5c, 0x8b, 0x5a,
+	0x6f, 0x58, 0xc2, 0xc5, 0x03, 0x3c, 0xfe, 0x53, 0xd0, 0xc5, 0x42, 0xab, 0xb2, 0xb1, 0x18, 0x38,
+	0xbb, 0x23, 0x84, 0xbc, 0x9f, 0x5c, 0x83, 0xbc, 0x6e, 0x5e, 0x88, 0x60, 0xd0, 0xce, 0x20, 0x85,
+	0xd9, 0xc7, 0x4e, 0xdd, 0xd0, 0xe5, 0xc1, 0xb0, 0xa5, 0x29, 0x66, 0x7b, 0x9e, 0x67, 0x76, 0x02,
+	0x40, 0xec, 0xd5, 0x63, 0x9e, 0x4f, 0x5b, 0x6d, 0xbf, 0x2b, 0x32, 0x50, 0x0b, 0x77, 0x00, 0x98,
+	0x70, 0xd3, 0xef, 0xb2, 0x16, 0xed, 0xf7, 0x8b, 0xcd, 0x43, 0xef, 0xf0, 0x2d, 0x30, 0x17, 0x8f,
+	0xed, 0xf8, 0x6e, 0x65, 0xc0, 0x20, 0x9a, 0x0f, 0x12, 0x9a, 0xb0, 0xd6, 0x17, 0xe1, 0xa6, 0xc0,
+	0xbc, 0x37, 0x1c, 0x13, 0xf6, 0x59, 0x44, 0x13, 0x7e, 0xca, 0xdb, 0x8b, 0xd3, 0x15, 0x39, 0x8f,
+	0x21, 0x35, 0xf1, 0x00, 0x8b, 0xee, 0x53, 0xdf, 0x6b, 0x85, 0x51, 0x87, 0x06, 0xe5, 0x4e, 0xa8,
+	0x6f, 0x7f, 0x37, 0x20, 0x6c, 0x22, 0x16, 0x24, 0xb4, 0x2b, 0x82, 0x66, 0x19, 0x0d, 0xe8, 0x4f,
+	0x3f, 0x0a, 0xbd, 0x81, 0x9b, 0xb4, 0xf2, 0x53, 0x6f, 0xdd, 0x74, 0x2c, 0xc3, 0x59, 0x55, 0xd6,
+	0x43, 0x40, 0xe4, 0x16, 0x31, 0x37, 0xec, 0xf5, 0x58, 0xe0, 0xc9, 0xc7, 0xb9, 0x65, 0x08, 0xae,
+	0x47, 0xa3, 0x6d, 0xc6, 0x27, 0x44, 0x89, 0xe2, 0x01, 0xab, 0x77, 0xcd, 0x90, 0x43, 0x90, 0xd9,
+	0x99, 0x48, 0x8f, 0xf2, 0x2e, 0x83, 0x91, 0xe5, 0x69, 0x6a, 0x05, 0x82, 0x09, 0xf9, 0xfe, 0x5d,
+	0xb7, 0x5d, 0x00, 0x86, 0x37, 0x09, 0xfb, 0xbe, 0x3b, 0x82, 0x87, 0x64, 0x38, 0xbb, 0x58, 0x72,
+	0x10, 0xb3, 0x48, 0x3f, 0xdf, 0xbc, 0x0e, 0x84, 0x75, 0xfd, 0xd8, 0xc2, 0xe0, 0x32, 0x88, 0x61,
+	0xd5, 0x03, 0xac, 0xe8, 0x3b, 0xbe, 0xc7, 0xc2, 0x61, 0x49, 0xc6, 0x22, 0xdb, 0x5e, 0xc9, 0xac,
+	0xaa, 0x49, 0xf7, 0x7a, 0x65, 0x8d, 0x1c, 0x54, 0xec, 0x1d, 0x38, 0x56, 0x4e, 0xd7, 0x68, 0x5c,
+	0xee, 0xc3, 0xb9, 0x68, 0x79, 0x52, 0x8d, 0xd1, 0xca, 0x28, 0x8c, 0x54, 0x16, 0xef, 0xc1, 0x59,
+	0x54, 0xce, 0x88, 0x1a, 0xab, 0x1b, 0x70, 0x56, 0x3c, 0x68, 0x55, 0xd1, 0x37, 0xe1, 0x68, 0xd3,
+	0x50, 0xbc, 0x05, 0x87, 0xab, 0xc0, 0xeb, 0x10, 0x60, 0x91, 0x3b, 0xd5, 0xc0, 0x57, 0x87, 0x83,
+	0xf9, 0xb7, 0x01, 0x15, 0x75, 0x7b, 0x28, 0x4a, 0xcf, 0x6b, 0x5a, 0x9b, 0xa1, 0x31, 0x6b, 0xa8,
+	0x71, 0xb9, 0x65, 0xc1, 0x25, 0xfb, 0x1a, 0x63, 0x6b, 0x7d, 0xa6, 0x3c, 0xa0, 0xe5, 0xa4, 0xab,
+	0x39, 0x40, 0x0d, 0xbe, 0x0a, 0x87, 0x97, 0xa9, 0x40, 0x6b, 0x07, 0xa8, 0xcf, 0x08, 0x5a, 0x3b,
+	0x80, 0x92, 0x18, 0x1c, 0x7d, 0x2c, 0x46, 0x73, 0x80, 0x32, 0x4d, 0x38, 0xea, 0x20, 0x96, 0x3b,
+	0xa2, 0xc6, 0x63, 0xf8, 0xaa, 0x5c, 0xc9, 0xe0, 0xd9, 0x4f, 0x43, 0x6d, 0xae, 0xca, 0x7e, 0x1a,
+	0xe4, 0x94, 0x95, 0xfd, 0x34, 0x28, 0x99, 0x2b, 0x0d, 0xfe, 0x23, 0x38, 0xbc, 0x9a, 0x81, 0xb2,
+	0x9f, 0xd2, 0x9c, 0x97, 0xed, 0x94, 0x1a, 0x72, 0x28, 0x1a, 0x8f, 0xb7, 0x87, 0xf2, 0xa8, 0x43,
+	0xde, 0xb6, 0x40, 0x8a, 0x2c, 0x82, 0xed, 0x92, 0x2c, 0xa7, 0x4a, 0x34, 0xf0, 0x15, 0x18, 0xd8,
+	0x76, 0x1d, 0x37, 0xcd, 0xf5, 0xf0, 0x2f, 0xff, 0xe5, 0x79, 0xcb, 0x7a, 0xed, 0xac, 0x46, 0xcb,
+	0xd6, 0xc3, 0xac, 0x87, 0xbe, 0xd6, 0xea, 0xd7, 0xfa, 0xfb, 0x70, 0xe3, 0x28, 0x42, 0x44, 0x0d,
+	0x79, 0x3a, 0x47, 0xf6, 0xfd, 0x25, 0x1a, 0x04, 0x61, 0xc2, 0x03, 0xc2, 0xfc, 0xf3, 0xc1, 0xbc,
+	0xd4, 0xaa, 0x64, 0xc2, 0xcf, 0x49, 0x0d, 0x6d, 0x9f, 0x75, 0xbd, 0xd6, 0x26, 0xdb, 0xa2, 0x3b,
+	0x7e, 0x98, 0xe7, 0xd8, 0x45, 0x29, 0xc5, 0x12, 0x7f, 0xda, 0x1c, 0xb4, 0xc5, 0x5b, 0x3d, 0x1a,
+	0x6f, 0x6b, 0xbc, 0xa3, 0xbe, 0xbb, 0x24, 0x7f, 0xb3, 0x58, 0xfc, 0x8f, 0x31, 0x74, 0x62, 0x83,
+	0x9f, 0x2f, 0xee, 0xf3, 0x37, 0x56, 0xbc, 0xd8, 0x61, 0x4f, 0x06, 0x2c, 0x4e, 0xf0, 0x05, 0x34,
+	0x51, 0xb8, 0x98, 0xef, 0x91, 0xc6, 0xf9, 0xc6, 0xc5, 0x23, 0xab, 0x07, 0xfe, 0x65, 0x65, 0xcc,
+	0x41, 0x39, 0xfd, 0x3d, 0x0f, 0x9f, 0x44, 0x07, 0x9f, 0x0c, 0x58, 0xb4, 0x47, 0xc6, 0xca, 0xf6,
+	0x8c, 0x82, 0xcf, 0x20, 0xc4, 0x13, 0x0b, 0x49, 0xb8, 0xcd, 0x02, 0x72, 0x20, 0x6d, 0x77, 0x8e,
+	0xa4, 0x94, 0x47, 0x29, 0x01, 0x9f, 0x42, 0xfc, 0xa1, 0x15, 0xfb, 0x5f, 0x32, 0xf2, 0xcc, 0xf9,
+	0xc6, 0xc5, 0x83, 0xce, 0x78, 0x4a, 0xd8, 0xf0, 0xbf, 0x64, 0xf8, 0x39, 0x74, 0x74, 0x87, 0x76,
+	0x7d, 0x2f, 0x3d, 0xf7, 0x86, 0x41, 0x77, 0x8f, 0x1c, 0x3c, 0xdf, 0xb8, 0x38, 0xee, 0x4c, 0xe6,
+	0xc4, 0x0f, 0x82, 0xee, 0x1e, 0xbe, 0x8e, 0x16, 0x22, 0x96, 0x0c, 0xa2, 0xa0, 0x95, 0x84, 0xe9,
+	0xc1, 0x32, 0x62, 0xf1, 0xa0, 0x9b, 0xc4, 0x2d, 0x5e, 0x45, 0x41, 0x0e, 0x73, 0xc4, 0x7c, 0xf6,
+	0xc6, 0xa3, 0xf4, 0x05, 0x27, 0x6b, 0x5f, 0x4b, 0x9b, 0xf1, 0x0e, 0x9a, 0x33, 0x14, 0x79, 0x90,
+	0xf1, 0xf3, 0x8d, 0x8b, 0x53, 0x97, 0xef, 0x35, 0xeb, 0xaa, 0x53, 0x78, 0x79, 0x48, 0x73, 0x23,
+	0x43, 0x3a, 0xe1, 0xee, 0x46, 0x86, 0xbb, 0x1b, 0x0c, 0x7a, 0x55, 0xaa, 0x33, 0x1b, 0xeb, 0xa4,
+	0xc5, 0xbf, 0x1f, 0x43, 0xf3, 0x95, 0x11, 0x8f, 0xfb, 0x61, 0x10, 0x33, 0xfc, 0x2e, 0x3a, 0x2c,
+	0xfa, 0x40, 0x1a, 0xe7, 0x0f, 0x5c, 0x9c, 0xb8, 0xdc, 0x6c, 0x0e, 0xab, 0x92, 0x69, 0x96, 0x5c,
+	0xc2, 0x5d, 0x27, 0x87, 0xe3, 0x17, 0xd0, 0x74, 0xc0, 0x9e, 0x26, 0x2d, 0x69, 0x02, 0xf8, 0x04,
+	0x39, 0x47, 0x53, 0xf2, 0x7a, 0x31, 0x09, 0x4d, 0x34, 0x67, 0x1a, 0xbb, 0x74, 0xb2, 0x0e, 0x38,
+	0xb3, 0x49, 0x65, 0xd4, 0xae, 0x21, 0x54, 0x1a, 0x17, 0x9f, 0x94, 0x89, 0xcb, 0x0b, 0xb9, 0x92,
+	0xb9, 0xfd, 0x35, 0xef, 0xa5, 0xaf, 0x3c, 0xa4, 0xf1, 0xb6, 0x73, 0xa4, 0x9d, 0xff, 0xc4, 0x1f,
+	0xa0, 0x09, 0x69, 0xc0, 0xc9, 0x21, 0x8e, 0xb5, 0xed, 0x20, 0x2a, 0x07, 0x74, 0xf1, 0x9f, 0x1a,
+	0xe8, 0xb4, 0x36, 0x92, 0x1b, 0x49, 0xc4, 0x68, 0xef, 0xf7, 0x66, 0xc1, 0x35, 0x36, 0x72, 0xe0,
+	0xff, 0xda, 0x46, 0xfe, 0xab, 0x81, 0xce, 0xd4, 0xf4, 0xec, 0xf7, 0x6e, 0x29, 0xea, 0x8c, 0x8e,
+	0xfd, 0x80, 0x19, 0x3d, 0xf0, 0x83, 0x67, 0xf4, 0x6f, 0xde, 0x47, 0x93, 0x72, 0x23, 0xfe, 0x08,
+	0x4d, 0xa9, 0x45, 0x51, 0xe4, 0x12, 0x17, 0xf2, 0x5a, 0xad, 0x90, 0xe2, 0xe4, 0xdc, 0x5c, 0xc9,
+	0x80, 0xab, 0x1c, 0xe7, 0x1c, 0xa5, 0xf2, 0x23, 0xee, 0xa3, 0xf9, 0x9a, 0x6a, 0x2b, 0xf2, 0x32,
+	0x97, 0xf0, 0xb6, 0xad, 0x84, 0x75, 0x81, 0x77, 0x8e, 0x53, 0x13, 0x19, 0xdf, 0x45, 0xe3, 0xf9,
+	0x29, 0x4c, 0x8c, 0xd4, 0x25, 0x88, 0x08, 0xef, 0x7e, 0x8a, 0x70, 0x0e, 0xd3, 0xec, 0x07, 0x7e,
+	0x80, 0x26, 0xa4, 0x23, 0x3a, 0x99, 0xe1, 0x9c, 0x5e, 0x81, 0x73, 0x5a, 0xf1, 0x9c, 0x23, 0x34,
+	0xff, 0x89, 0xbf, 0x40, 0x27, 0xcc, 0xc5, 0x5c, 0xe4, 0x97, 0x0d, 0xce, 0xf9, 0x0d, 0x1b, 0xce,
+	0x2b, 0x29, 0xfc, 0xb1, 0xcf, 0x76, 0x1d, 0x4c, 0x2b, 0x34, 0xfc, 0x39, 0x9a, 0xad, 0xa4, 0x27,
+	0xc8, 0x53, 0x2e, 0xe5, 0x75, 0x1b, 0x29, 0x0f, 0x52, 0xa0, 0x33, 0x45, 0x95, 0x67, 0xbc, 0x2d,
+	0xf7, 0x44, 0xae, 0x36, 0x21, 0xd7, 0xb8, 0x88, 0x37, 0x2d, 0x44, 0x08, 0x38, 0xef, 0xc9, 0x1c,
+	0xad, 0x12, 0xf1, 0x16, 0x3a, 0x6e, 0xcc, 0x75, 0x10, 0x62, 0x3b, 0x68, 0xab, 0xbe, 0xf7, 0x50,
+	0x80, 0x8b, 0x41, 0x93, 0x68, 0x98, 0x22, 0x5c, 0x4d, 0x63, 0x90, 0x59, 0x2e, 0xe6, 0x0a, 0x5c,
+	0xcc, 0x5a, 0x0e, 0x75, 0x66, 0xa8, 0x46, 0xc1, 0x4f, 0x10, 0xa9, 0x4b, 0xb9, 0x90, 0x3d, 0xb8,
+	0x2f, 0x68, 0x6c, 0xb3, 0x59, 0x3a, 0x4e, 0x4d, 0x64, 0xfc, 0x6d, 0x03, 0x9d, 0xd9, 0xb7, 0x98,
+	0x8d, 0x04, 0x5c, 0xf0, 0xcd, 0x11, 0x04, 0x6f, 0x14, 0x4c, 0x9c, 0x05, 0x5a, 0xdb, 0x86, 0x77,
+	0xd1, 0x42, 0x7d, 0x72, 0x87, 0xf4, 0xb9, 0xf8, 0x65, 0xb8, 0xf8, 0xbb, 0x39, 0x8b, 0x7c, 0x55,
+	0x9f, 0xa7, 0xe6, 0x06, 0xec, 0xa0, 0xa3, 0x4a, 0x2a, 0x88, 0xac, 0x0d, 0x59, 0x36, 0x2b, 0xb2,
+	0xee, 0x31, 0xe6, 0x39, 0x13, 0xb4, 0x7c, 0xc0, 0x1f, 0xa2, 0x29, 0x35, 0x41, 0x44, 0x62, 0xce,
+	0x74, 0x09, 0xce, 0x34, 0x9b, 0xaf, 0x49, 0x2a, 0x3d, 0x61, 0x0f, 0xcd, 0x19, 0x0a, 0xef, 0xc8,
+	0x36, 0xe7, 0x7d, 0x15, 0xce, 0x5b, 0x9a, 0x92, 0x59, 0xaa, 0x93, 0xb0, 0x83, 0x26, 0xe5, 0x2c,
+	0x13, 0xf9, 0xae, 0x61, 0x31, 0x20, 0xeb, 0x39, 0x2c, 0x1d, 0x90, 0xe2, 0x81, 0x0f, 0x88, 0x52,
+	0x85, 0x47, 0x5e, 0x83, 0x0f, 0x48, 0x87, 0x39, 0x29, 0x8e, 0xbb, 0xff, 0x24, 0x95, 0x9e, 0xf0,
+	0x67, 0x68, 0x46, 0x2f, 0x0b, 0x24, 0x9f, 0x58, 0xac, 0x60, 0x1b, 0x02, 0xc9, 0x59, 0x4f, 0x51,
+	0xe5, 0x19, 0x7f, 0x8a, 0xa6, 0xb5, 0x3a, 0x05, 0xf2, 0x19, 0x98, 0xf7, 0x1d, 0x8e, 0x5c, 0x13,
+	0x40, 0x67, 0xca, 0x53, 0x9e, 0xf1, 0x2d, 0x74, 0x90, 0xaf, 0xed, 0xc4, 0xe7, 0x1c, 0x2f, 0x42,
+	0xb4, 0x4d, 0xdf, 0x77, 0x32, 0x18, 0xfe, 0x09, 0x9a, 0xd1, 0xd3, 0x72, 0x04, 0x73, 0x56, 0x97,
+	0x01, 0xac, 0x56, 0x33, 0xe8, 0x86, 0x40, 0x3a, 0xd3, 0x9b, 0x2a, 0x01, 0x3f, 0x42, 0x47, 0x95,
+	0x9a, 0x44, 0xf2, 0x12, 0x78, 0xb6, 0x56, 0x33, 0xdc, 0x46, 0x0a, 0x73, 0x26, 0x37, 0xa5, 0xa7,
+	0x74, 0x40, 0xb5, 0x24, 0x1e, 0x99, 0x03, 0x0f, 0xe8, 0x9a, 0x40, 0x8a, 0xf0, 0x61, 0xca, 0x55,
+	0x9e, 0xf1, 0x7d, 0x34, 0x9e, 0x53, 0x44, 0xcc, 0xf4, 0xb2, 0x05, 0x53, 0xa7, 0x00, 0xe3, 0x1e,
+	0x3a, 0x61, 0xae, 0x92, 0x24, 0x77, 0x39, 0xdb, 0xb7, 0x2c, 0xd8, 0x2a, 0x1b, 0xd7, 0x31, 0xd7,
+	0x40, 0xc5, 0x5f, 0xa0, 0xe3, 0xc6, 0xf4, 0x28, 0x59, 0x00, 0xef, 0x92, 0xc5, 0xc8, 0x48, 0x5b,
+	0xd7, 0x9c, 0x5b, 0x25, 0x62, 0x17, 0xe1, 0x6a, 0x12, 0x94, 0x1c, 0x03, 0xaf, 0x1e, 0xb9, 0xa0,
+	0x72, 0xf3, 0x9a, 0x75, 0x75, 0x12, 0xfe, 0xae, 0x81, 0xce, 0xec, 0x5b, 0x72, 0x49, 0x42, 0x2e,
+	0xf0, 0xd6, 0x28, 0x02, 0xa5, 0x85, 0xeb, 0x94, 0x5b, 0xdf, 0x98, 0x86, 0xa9, 0x6a, 0xae, 0x96,
+	0xbc, 0x0e, 0x0e, 0x53, 0x73, 0xa1, 0x77, 0x52, 0x9c, 0x73, 0xd4, 0x95, 0x1f, 0x71, 0x1b, 0xcd,
+	0x19, 0xb2, 0xb8, 0xe4, 0x11, 0x38, 0xcc, 0xc8, 0xb9, 0xdf, 0x2d, 0xc0, 0x4e, 0x31, 0x29, 0x25,
+	0x0d, 0xef, 0xa1, 0x85, 0xfa, 0x4c, 0x2f, 0x79, 0xc2, 0xc5, 0x5d, 0xb7, 0x12, 0xa7, 0x6d, 0x87,
+	0xc4, 0xad, 0x69, 0x49, 0x7d, 0x5f, 0xc9, 0x0c, 0x93, 0xdb, 0x60, 0xdf, 0xcf, 0xa5, 0xf1, 0x0d,
+	0x71, 0xd2, 0x95, 0x9e, 0x94, 0x19, 0xc9, 0x76, 0xc4, 0xae, 0xf5, 0x8c, 0x64, 0x5b, 0x62, 0xa1,
+	0x5d, 0xb1, 0x27, 0x1a, 0x52, 0xc2, 0xe4, 0xac, 0xb5, 0x55, 0x6f, 0x70, 0xf0, 0x06, 0x4b, 0x4a,
+	0xab, 0x2e, 0x48, 0xe9, 0x7a, 0xab, 0xd7, 0xa6, 0x92, 0x55, 0xf0, 0x7a, 0xbb, 0x96, 0x41, 0xd7,
+	0x04, 0xd2, 0x99, 0x76, 0x55, 0x02, 0x1f, 0x73, 0xb9, 0x80, 0x95, 0x3c, 0x0f, 0x1f, 0x73, 0x8e,
+	0xdb, 0xe0, 0x30, 0x67, 0xd2, 0x95, 0x9e, 0xf0, 0x4f, 0xd1, 0x6c, 0x25, 0xd3, 0x4d, 0x3a, 0xe0,
+	0x50, 0x75, 0xad, 0xc0, 0xae, 0x70, 0xa8, 0x33, 0xe3, 0x6a, 0x14, 0xfc, 0x3e, 0x42, 0x65, 0x05,
+	0x2d, 0xf9, 0x12, 0x7c, 0xf6, 0x59, 0x4b, 0x41, 0x7c, 0x55, 0x3c, 0xe2, 0xe6, 0x3f, 0x31, 0x45,
+	0xb3, 0x95, 0xfa, 0x58, 0xf2, 0x47, 0x0d, 0xb8, 0xbe, 0x02, 0x5c, 0x0c, 0xf3, 0x8c, 0xab, 0x51,
+	0xf8, 0x0e, 0xa4, 0xd6, 0xd1, 0x92, 0x2d, 0xf8, 0x0e, 0xc4, 0x91, 0xef, 0x09, 0xa0, 0x33, 0xe5,
+	0x2a, 0xcf, 0x7c, 0x07, 0x12, 0x49, 0x0c, 0xd2, 0x80, 0xef, 0x40, 0x02, 0xe2, 0x14, 0x60, 0xbe,
+	0x25, 0x98, 0xea, 0x4a, 0xc9, 0x4d, 0xf8, 0x96, 0x20, 0xf0, 0x0f, 0x33, 0xf8, 0x03, 0x3f, 0xd8,
+	0x76, 0xe6, 0xdc, 0x2a, 0x11, 0x77, 0xd0, 0x31, 0x53, 0xd1, 0x2e, 0xb9, 0x05, 0x5f, 0xd0, 0x04,
+	0x7c, 0x8d, 0xa3, 0xb9, 0x24, 0xec, 0x56, 0x68, 0xe5, 0xc8, 0x17, 0x82, 0xc8, 0x3d, 0xcb, 0x91,
+	0xcf, 0xf9, 0xe5, 0x23, 0x9f, 0x3f, 0xf3, 0xc5, 0xb2, 0xf6, 0x7b, 0x0c, 0x89, 0xe0, 0x8b, 0xa5,
+	0x60, 0x62, 0x58, 0x2c, 0x6b, 0x5a, 0xb8, 0xe3, 0xca, 0xdf, 0x6f, 0xc8, 0x3b, 0x70, 0xc7, 0x15,
+	0x38, 0xb1, 0x58, 0x4a, 0x4f, 0x7c, 0xb1, 0x54, 0xbe, 0xeb, 0x90, 0x9f, 0xc1, 0x17, 0x4b, 0x01,
+	0xcc, 0x17, 0x4b, 0xf9, 0x11, 0xff, 0x0c, 0x9d, 0xda, 0xe7, 0x8b, 0x0f, 0xf9, 0x98, 0x4b, 0xb9,
+	0x61, 0x21, 0xe5, 0xc7, 0x82, 0x49, 0x19, 0x12, 0x9c, 0x74, 0xeb, 0x9a, 0x52, 0xc3, 0x36, 0x16,
+	0x2b, 0x93, 0x1d, 0xb0, 0x61, 0xdf, 0xe1, 0xf8, 0xf5, 0x1c, 0x9e, 0x65, 0x04, 0xbc, 0x2a, 0x31,
+	0x35, 0x6c, 0x53, 0x65, 0x33, 0x59, 0x02, 0x1b, 0xf6, 0x9d, 0x0c, 0xfe, 0x7e, 0x86, 0xce, 0xb2,
+	0x28, 0x5e, 0x85, 0x86, 0x3f, 0x44, 0x47, 0x95, 0x22, 0x68, 0xf2, 0xab, 0x06, 0xd8, 0x04, 0xee,
+	0x08, 0x60, 0x76, 0xb2, 0xf1, 0xa4, 0x27, 0xfc, 0x9b, 0x06, 0x7a, 0x0e, 0x50, 0xec, 0x4c, 0xbe,
+	0xe0, 0xc2, 0x56, 0x20, 0xc2, 0x32, 0x6e, 0x59, 0x1a, 0x73, 0xc5, 0x8b, 0xb3, 0x1f, 0x8f, 0x58,
+	0xd4, 0xe3, 0xe2, 0xcf, 0x7a, 0xfb, 0xb6, 0xe3, 0xa7, 0x68, 0xa1, 0xbe, 0x5e, 0x9a, 0x7c, 0xdb,
+	0x00, 0x1f, 0xd0, 0xef, 0x0a, 0x2e, 0x0f, 0x32, 0x26, 0xeb, 0x54, 0x9c, 0xec, 0xe6, 0x99, 0xb9,
+	0x21, 0xdd, 0xe1, 0x0d, 0x5f, 0x08, 0xc9, 0x87, 0xe0, 0x1d, 0xbe, 0xf0, 0xda, 0xd4, 0xb9, 0xde,
+	0x4b, 0x58, 0xcf, 0x99, 0x65, 0x3a, 0x09, 0x5f, 0x47, 0xcf, 0x70, 0x07, 0x6e, 0x72, 0xb6, 0x2f,
+	0x02, 0xd8, 0x72, 0xc7, 0xe5, 0x20, 0xfc, 0x2e, 0x3a, 0x52, 0x2a, 0x76, 0x19, 0xbc, 0xf8, 0x17,
+	0xfa, 0x8c, 0xb7, 0x73, 0x35, 0x3e, 0x43, 0x33, 0xfa, 0x07, 0x49, 0x92, 0x80, 0x17, 0xca, 0x9c,
+	0xe1, 0x23, 0x0e, 0x74, 0xa6, 0xda, 0xca, 0x33, 0xfe, 0xff, 0x68, 0x52, 0xfe, 0x58, 0x49, 0x96,
+	0xc1, 0x07, 0xfb, 0x94, 0xf1, 0xc3, 0x0c, 0xe5, 0x4c, 0xb4, 0xcb, 0x87, 0xd4, 0xa7, 0x8d, 0x45,
+	0xdf, 0x84, 0x82, 0x7d, 0x3a, 0xe5, 0xbd, 0x5e, 0xc2, 0x33, 0x9f, 0x6e, 0x57, 0x89, 0xf8, 0xc7,
+	0x68, 0x42, 0xaa, 0x10, 0x27, 0x17, 0xb9, 0x84, 0x57, 0x01, 0x12, 0xee, 0x73, 0x14, 0x67, 0x8c,
+	0x3a, 0xc5, 0xef, 0xd4, 0xb0, 0x0c, 0xc5, 0xe3, 0x64, 0x1e, 0x6c, 0x58, 0xf7, 0x59, 0x98, 0x8d,
+	0x6c, 0x11, 0x72, 0xcc, 0x76, 0x74, 0x52, 0xba, 0xf3, 0x69, 0x55, 0xe6, 0xe4, 0x6b, 0xf0, 0x84,
+	0xde, 0x2f, 0x90, 0x59, 0x8a, 0xa2, 0xa3, 0x3c, 0xa7, 0xab, 0x9c, 0xa9, 0x10, 0x9d, 0xec, 0x82,
+	0x57, 0x39, 0x9e, 0xfc, 0x51, 0xd7, 0x53, 0xdc, 0xa9, 0xd0, 0x52, 0xb3, 0xd4, 0x6b, 0xd6, 0xc9,
+	0x15, 0x70, 0x2f, 0xde, 0x4d, 0xa1, 0x5c, 0x52, 0xd6, 0x8b, 0x2d, 0xe5, 0x39, 0x3d, 0x72, 0x9b,
+	0xcb, 0xda, 0xc9, 0x7d, 0xf0, 0x91, 0x9b, 0x8b, 0x58, 0x2f, 0xf1, 0xd9, 0x91, 0x7b, 0xcb, 0x40,
+	0x4d, 0xbd, 0x40, 0xd9, 0x12, 0x8e, 0x83, 0xbd, 0x40, 0xde, 0x0b, 0x26, 0xb6, 0xa5, 0x4d, 0x40,
+	0x62, 0xd9, 0xef, 0xd2, 0x80, 0x9c, 0xb7, 0x65, 0xb9, 0xde, 0xa5, 0x41, 0xc1, 0x32, 0x7d, 0x48,
+	0x1d, 0xcb, 0x58, 0x36, 0x4f, 0x9e, 0x05, 0x3b, 0x96, 0xc4, 0xbb, 0x48, 0x74, 0xcc, 0x6d, 0x57,
+	0x89, 0x3c, 0xfd, 0xbb, 0x6f, 0x99, 0x3c, 0x59, 0x04, 0xa7, 0x7f, 0x25, 0xa1, 0x79, 0x04, 0x20,
+	0x48, 0xce, 0xc2, 0x76, 0x6d, 0x1b, 0xde, 0xd2, 0xba, 0x5b, 0x7c, 0x9a, 0x79, 0x0e, 0x6c, 0xca,
+	0x92, 0xe4, 0xfc, 0x2b, 0x0d, 0xde, 0xae, 0xd0, 0x52, 0x9f, 0x31, 0x5d, 0x28, 0x20, 0x17, 0x46,
+	0x11, 0x94, 0x77, 0x4d, 0x16, 0x94, 0x77, 0xe9, 0x16, 0x3a, 0x98, 0x05, 0x6f, 0x57, 0xc1, 0x39,
+	0xbe, 0x2c, 0x68, 0xcb, 0x60, 0xf8, 0x0f, 0xd0, 0x6c, 0x75, 0xa3, 0xfd, 0x06, 0x7c, 0xe8, 0xd4,
+	0xf7, 0xd7, 0xe9, 0xae, 0xb6, 0xaf, 0xfe, 0x94, 0xf3, 0x57, 0x2f, 0x0d, 0x90, 0xb7, 0xc0, 0xc7,
+	0xad, 0x07, 0x02, 0x5b, 0x1e, 0xb7, 0xba, 0x1a, 0x25, 0x8d, 0x8e, 0x95, 0x2a, 0x5b, 0xf2, 0x15,
+	0x38, 0x34, 0x7a, 0x20, 0x70, 0x59, 0x68, 0xd4, 0x95, 0x9e, 0xd2, 0xe5, 0xc2, 0x7c, 0xf5, 0x80,
+	0xbc, 0x01, 0x5e, 0x2e, 0xb2, 0x33, 0x90, 0xa7, 0x2e, 0x7c, 0xc7, 0x7a, 0x06, 0x6a, 0x7a, 0xc6,
+	0x2d, 0x2b, 0x67, 0xc8, 0xa7, 0xe0, 0x33, 0xee, 0xc3, 0x14, 0x74, 0xcf, 0xef, 0x32, 0xe7, 0x48,
+	0x2f, 0xff, 0x89, 0xbf, 0x46, 0xa7, 0xf7, 0xbb, 0xc2, 0x40, 0x3e, 0x02, 0x47, 0xe0, 0x0f, 0x39,
+	0x9b, 0x95, 0x7e, 0x3f, 0xcf, 0x29, 0x17, 0xf3, 0x70, 0xb2, 0x57, 0xd7, 0xc4, 0x87, 0xce, 0x78,
+	0xf7, 0x81, 0x6c, 0xc2, 0x87, 0x8e, 0x33, 0xb8, 0xc3, 0xf1, 0x85, 0xcc, 0x63, 0x3d, 0x03, 0x95,
+	0x0f, 0x5d, 0x71, 0x55, 0x82, 0xfc, 0x1c, 0x3e, 0x74, 0x1c, 0xf4, 0xa3, 0x70, 0xd3, 0x39, 0xd2,
+	0xcb, 0x7f, 0xe2, 0x3f, 0x6d, 0xa0, 0x67, 0x87, 0x5e, 0xa2, 0x20, 0x8f, 0xc1, 0xf1, 0xf0, 0x07,
+	0x39, 0xaf, 0x0d, 0xce, 0xea, 0x71, 0xc6, 0xa9, 0xe8, 0xd1, 0xd9, 0x70, 0xdf, 0x76, 0xfc, 0x73,
+	0x74, 0x66, 0xdf, 0x7b, 0x18, 0xe4, 0x17, 0x0d, 0xf0, 0x5c, 0xae, 0x53, 0xdf, 0xfb, 0x20, 0xe3,
+	0xa3, 0x45, 0xe5, 0x27, 0xfb, 0x75, 0x4d, 0xe9, 0x3a, 0x66, 0xba, 0xc1, 0x41, 0x5e, 0x05, 0xaf,
+	0x63, 0xeb, 0x02, 0x9e, 0xa5, 0x8b, 0xb2, 0xbd, 0xbf, 0x5f, 0xa1, 0xf1, 0x81, 0x1f, 0x7a, 0xdb,
+	0x83, 0xf4, 0xc0, 0x03, 0xbf, 0x9e, 0xf1, 0x12, 0x1f, 0x21, 0x2a, 0xe6, 0x7b, 0xb6, 0xbf, 0x6f,
+	0x3b, 0xa6, 0x08, 0x57, 0x2f, 0x8c, 0x90, 0x37, 0xc1, 0xeb, 0x96, 0x10, 0x5f, 0x86, 0x23, 0x33,
+	0x7d, 0x8d, 0x82, 0x3f, 0x41, 0x53, 0xea, 0xbd, 0x12, 0x72, 0x02, 0x1c, 0xeb, 0x38, 0x0a, 0xd0,
+	0xd1, 0x18, 0xa5, 0x81, 0x54, 0xc5, 0x52, 0xee, 0x80, 0x99, 0x6b, 0xd6, 0x31, 0x15, 0xab, 0x26,
+	0xf1, 0x13, 0x34, 0xa3, 0x97, 0xd9, 0x91, 0x33, 0xe0, 0x0d, 0x23, 0xcb, 0x76, 0x96, 0x27, 0xf9,
+	0xe9, 0x58, 0x25, 0xa4, 0xee, 0x2c, 0x65, 0x58, 0x4f, 0x81, 0xdd, 0xb9, 0xcc, 0xac, 0x1e, 0x89,
+	0x8b, 0x8c, 0xea, 0x0e, 0x3a, 0x59, 0x7b, 0x3f, 0x85, 0x0c, 0xc0, 0xa7, 0xc9, 0x0d, 0xc1, 0x43,
+	0x0f, 0xfd, 0xe6, 0x63, 0x73, 0x43, 0xda, 0x89, 0xf2, 0x72, 0x0a, 0x79, 0x05, 0xdc, 0x89, 0x47,
+	0x29, 0x28, 0x4b, 0x59, 0x26, 0xf9, 0xcf, 0x74, 0x83, 0x53, 0x6e, 0xad, 0x90, 0xeb, 0xe0, 0x0d,
+	0xee, 0xc3, 0x98, 0x45, 0x45, 0x2e, 0x71, 0x72, 0x20, 0x3d, 0xa5, 0xa7, 0xc9, 0xa2, 0x62, 0x91,
+	0xbc, 0x00, 0x3e, 0x4d, 0xa6, 0x1c, 0x1f, 0xf8, 0x71, 0xe2, 0x8c, 0x0f, 0xc4, 0x2f, 0xbc, 0x89,
+	0x70, 0xf5, 0xae, 0x0b, 0xf9, 0x35, 0x3c, 0xa7, 0xca, 0x79, 0xca, 0x5b, 0xf1, 0xcc, 0x40, 0xa3,
+	0x60, 0x17, 0xe1, 0x6a, 0x79, 0x28, 0xb9, 0x01, 0x3e, 0x44, 0x39, 0x25, 0x58, 0xe4, 0x99, 0x67,
+	0x23, 0x9d, 0x84, 0x3f, 0x42, 0x53, 0xea, 0x55, 0x24, 0x72, 0x0e, 0x9c, 0x11, 0xe3, 0x33, 0x57,
+	0x2c, 0x2f, 0x47, 0x13, 0xf9, 0x31, 0x0d, 0xd2, 0xf8, 0x8d, 0x1e, 0xf2, 0x22, 0x38, 0x48, 0x7b,
+	0x9c, 0xbe, 0xef, 0x64, 0x30, 0xbc, 0x82, 0x0e, 0x8b, 0x3f, 0x7b, 0xc5, 0x4b, 0x26, 0xf7, 0xcb,
+	0x1c, 0x64, 0x7f, 0xf7, 0xaa, 0xf9, 0x30, 0x7b, 0xdd, 0xc9, 0x71, 0xf8, 0x0e, 0x1a, 0xcf, 0xff,
+	0x16, 0x16, 0x69, 0x0f, 0xd1, 0x42, 0xf0, 0xd8, 0x10, 0xef, 0x3b, 0x05, 0x72, 0xf1, 0x3f, 0x1b,
+	0xe8, 0x44, 0xb6, 0x6f, 0x8e, 0x58, 0x38, 0xea, 0xa2, 0x59, 0xb1, 0x59, 0x8b, 0x9d, 0x2f, 0x0c,
+	0x62, 0x32, 0xc6, 0x6b, 0xd9, 0x5e, 0x1f, 0x5e, 0x42, 0x96, 0x89, 0xfe, 0x20, 0x47, 0x66, 0xec,
+	0x67, 0x7a, 0x2a, 0x35, 0xc6, 0x2f, 0xa2, 0xe9, 0x3e, 0x8d, 0x12, 0x9f, 0x76, 0x5b, 0x6d, 0xea,
+	0x77, 0x07, 0x11, 0xe3, 0xb5, 0x57, 0xe3, 0xce, 0x94, 0x20, 0xdf, 0xcb, 0xa8, 0xd5, 0x7a, 0xd3,
+	0x67, 0xaa, 0xf5, 0xa6, 0x8b, 0xdf, 0x37, 0xd0, 0x7c, 0xa5, 0xcf, 0xa2, 0x20, 0xef, 0x1e, 0x3a,
+	0xae, 0x49, 0x6a, 0xb1, 0x28, 0x0a, 0x23, 0x51, 0xeb, 0x85, 0xf3, 0x2e, 0x45, 0x7d, 0xb7, 0x29,
+	0xbe, 0x9e, 0xcc, 0xa9, 0x3a, 0xdc, 0x4d, 0x5f, 0xc7, 0xbb, 0x68, 0x41, 0x1f, 0x96, 0x56, 0x24,
+	0x84, 0xe4, 0xb5, 0x7e, 0xd7, 0xac, 0xc7, 0x27, 0x57, 0xd3, 0x21, 0x3d, 0x73, 0x43, 0xbc, 0xf8,
+	0x3f, 0x17, 0xd0, 0xb4, 0x86, 0xc2, 0x7b, 0xe8, 0x54, 0xf5, 0x46, 0x59, 0xa1, 0x97, 0x28, 0x43,
+	0x02, 0x68, 0xa3, 0xd6, 0x6e, 0x15, 0xfc, 0xdf, 0xfd, 0x7f, 0x45, 0x99, 0x8c, 0xde, 0x84, 0x7d,
+	0xa9, 0xc4, 0x8a, 0x7a, 0x92, 0xd0, 0xc6, 0x10, 0x4f, 0xaf, 0x0a, 0x95, 0xe5, 0x95, 0x85, 0x69,
+	0xa5, 0xa8, 0x3f, 0x6c, 0xa0, 0x73, 0xe6, 0xab, 0x6b, 0xa5, 0xd4, 0xb1, 0x21, 0x07, 0x52, 0x5d,
+	0xaa, 0xf4, 0x1d, 0x5c, 0x16, 0x7f, 0x8a, 0xd6, 0x37, 0xe3, 0xdf, 0x34, 0xd0, 0x62, 0xed, 0xe5,
+	0xb7, 0x52, 0x95, 0xac, 0xee, 0xe2, 0x1d, 0xb0, 0x2a, 0x6a, 0xed, 0x95, 0xac, 0xcd, 0x59, 0xba,
+	0xef, 0x1b, 0xf8, 0x1b, 0x74, 0xda, 0xa0, 0x4f, 0xa9, 0xc9, 0x81, 0x21, 0x9f, 0x3a, 0x6a, 0x35,
+	0x91, 0x95, 0x38, 0x49, 0xeb, 0x1a, 0xf1, 0x9f, 0x37, 0xd0, 0x85, 0x7d, 0x6e, 0xe0, 0x95, 0x8a,
+	0x64, 0x65, 0x1d, 0xab, 0x60, 0x45, 0xf4, 0xef, 0x2a, 0xb2, 0x3e, 0xe7, 0xe9, 0x90, 0x77, 0x70,
+	0x88, 0xe6, 0xd5, 0xcb, 0x7c, 0xa5, 0x22, 0xc7, 0x86, 0x24, 0x4b, 0x74, 0x45, 0xee, 0x31, 0xa6,
+	0x98, 0xe7, 0x31, 0x6a, 0xa0, 0xe3, 0x48, 0xaa, 0xd0, 0xd3, 0xad, 0xe1, 0xf8, 0x90, 0x83, 0x94,
+	0x2e, 0xb1, 0x62, 0x04, 0xc7, 0xa9, 0xa9, 0x21, 0xdd, 0xca, 0x0b, 0x99, 0xa5, 0xb4, 0x83, 0x43,
+	0xa2, 0x3b, 0x5d, 0x9a, 0x2c, 0x28, 0xaf, 0x3c, 0x2c, 0x65, 0x04, 0xbc, 0x66, 0xb3, 0xbc, 0x5f,
+	0x58, 0xca, 0x39, 0x01, 0x1f, 0xc7, 0xa2, 0xe8, 0x4b, 0x1b, 0xc7, 0x2a, 0x1d, 0x7f, 0x86, 0xa6,
+	0xb3, 0x0a, 0xd7, 0x52, 0xd0, 0xfc, 0x90, 0x6d, 0xbd, 0x14, 0x94, 0x02, 0x65, 0x11, 0x53, 0x54,
+	0xa1, 0xe0, 0x2f, 0xd1, 0x42, 0xe5, 0xe6, 0x62, 0x29, 0xe7, 0xd0, 0x90, 0x08, 0xb3, 0x90, 0xa3,
+	0xd5, 0x4a, 0xc9, 0x12, 0xc9, 0x66, 0x4d, 0x1b, 0xfe, 0x75, 0x03, 0x9d, 0x33, 0xdf, 0x7a, 0x2c,
+	0x35, 0x38, 0x3c, 0xa4, 0x0c, 0xa6, 0xd0, 0xc0, 0x50, 0xdf, 0x23, 0x6b, 0x71, 0xda, 0xdd, 0xa7,
+	0x1d, 0xef, 0xa2, 0x93, 0xfa, 0xc5, 0xc9, 0x52, 0x85, 0x71, 0xe8, 0x7e, 0xa1, 0x16, 0x5f, 0x29,
+	0xfb, 0x85, 0x6b, 0x6e, 0xc2, 0xdf, 0x36, 0xd0, 0x69, 0x43, 0x1d, 0x50, 0x29, 0xfc, 0xe8, 0x90,
+	0xe3, 0x71, 0x45, 0xb8, 0x71, 0xb5, 0x5a, 0x70, 0x6b, 0x5b, 0x71, 0x82, 0x88, 0x76, 0x63, 0xb3,
+	0x94, 0x4e, 0x86, 0x14, 0xd2, 0x56, 0xa4, 0xf3, 0xfa, 0x1f, 0x59, 0xf2, 0x09, 0xd7, 0xd8, 0x82,
+	0x7f, 0x29, 0x17, 0x40, 0x49, 0x37, 0x3d, 0x4b, 0xd9, 0x27, 0xa1, 0x7b, 0x57, 0xb5, 0x58, 0x48,
+	0xd9, 0xbb, 0xdc, 0xfa, 0x66, 0xfc, 0x97, 0x0d, 0x74, 0x61, 0x9f, 0xbb, 0xa2, 0xa5, 0x32, 0x59,
+	0x9d, 0xd9, 0x9a, 0x8d, 0x32, 0xf5, 0x6b, 0xf5, 0xb3, 0xee, 0xb0, 0x97, 0xf0, 0x13, 0x34, 0xaf,
+	0x5e, 0x3c, 0x2d, 0x55, 0x39, 0x05, 0x5d, 0x3a, 0xe5, 0x3a, 0x23, 0x65, 0xe9, 0x74, 0x4d, 0x0d,
+	0x8a, 0x1d, 0xe8, 0xcb, 0xf5, 0x69, 0x5b, 0x3b, 0xa8, 0xac, 0xd7, 0x27, 0x5c, 0x63, 0x0b, 0xf6,
+	0xa4, 0x6a, 0xbb, 0x52, 0x1e, 0x1a, 0x72, 0xf4, 0xaa, 0xc8, 0x93, 0x45, 0x15, 0x85, 0x49, 0xa5,
+	0x94, 0x5f, 0xc8, 0xd6, 0x26, 0x5d, 0x91, 0x2b, 0x25, 0x4e, 0xd8, 0xfa, 0x59, 0x71, 0x5c, 0x37,
+	0xfa, 0x59, 0xb5, 0x15, 0x7f, 0x8d, 0x4e, 0x55, 0x6f, 0xd4, 0x96, 0x0a, 0x4c, 0x42, 0xa3, 0x12,
+	0xbd, 0xe0, 0x48, 0x89, 0x4a, 0xdc, 0xba, 0xc6, 0xcc, 0xd4, 0xeb, 0xef, 0xe3, 0x96, 0x8a, 0x9c,
+	0x05, 0x9b, 0x7a, 0x4d, 0xb9, 0x87, 0x6a, 0xea, 0xc3, 0x5e, 0xe2, 0xa6, 0xae, 0x5c, 0xee, 0x2d,
+	0x55, 0x39, 0x07, 0x36, 0x75, 0xa9, 0x2e, 0x44, 0x35, 0x75, 0x53, 0x03, 0x37, 0x75, 0xf5, 0x46,
+	0x70, 0x29, 0xf3, 0x3c, 0xd8, 0xd4, 0xe5, 0x9a, 0x11, 0xd5, 0xd4, 0x8d, 0x2d, 0xf8, 0xaf, 0x1a,
+	0xe8, 0xf9, 0xfd, 0x6e, 0x12, 0x97, 0x3a, 0x64, 0xdf, 0x91, 0xee, 0xc0, 0x75, 0xa8, 0x54, 0x91,
+	0xc8, 0xfa, 0x2c, 0xba, 0x43, 0xdf, 0xe2, 0x6e, 0x98, 0xab, 0x56, 0xea, 0xf1, 0x1c, 0xd8, 0x0d,
+	0x05, 0x56, 0x75, 0x43, 0x9d, 0xc8, 0xdd, 0xd0, 0x74, 0x8d, 0xb9, 0x94, 0x78, 0x01, 0xea, 0x86,
+	0x95, 0x6a, 0x05, 0xc5, 0x0d, 0x59, 0x6d, 0x2b, 0x66, 0x68, 0xce, 0x24, 0xf8, 0x79, 0x68, 0x57,
+	0x4d, 0xf2, 0x66, 0xdb, 0x15, 0x31, 0x4f, 0xd1, 0x42, 0xe5, 0xca, 0x74, 0x29, 0xed, 0x05, 0x68,
+	0x48, 0xa1, 0x96, 0x2a, 0x28, 0x21, 0x45, 0xdb, 0xdc, 0x94, 0x86, 0xa7, 0xca, 0x5d, 0xeb, 0x52,
+	0xea, 0x8b, 0xd0, 0xf0, 0x54, 0xaa, 0x63, 0x50, 0xc2, 0xd3, 0xb6, 0x81, 0x8e, 0x3f, 0x46, 0x53,
+	0x9a, 0xdb, 0x5e, 0x1c, 0x92, 0xde, 0x53, 0xe4, 0xc8, 0x02, 0x8e, 0xb6, 0x15, 0x37, 0xfd, 0x0c,
+	0x4d, 0xeb, 0xde, 0xf9, 0x12, 0x34, 0xf0, 0xad, 0x78, 0xe5, 0x54, 0x57, 0xf5, 0xc6, 0x2d, 0x74,
+	0x4c, 0xba, 0xea, 0x5d, 0x4a, 0xb8, 0x04, 0x3d, 0xa8, 0x17, 0x5f, 0xae, 0x94, 0x83, 0x7a, 0xaf,
+	0x42, 0xe5, 0x31, 0x9e, 0xe1, 0x6a, 0x78, 0x29, 0xf2, 0x65, 0xa8, 0xd1, 0x57, 0x92, 0x80, 0x8a,
+	0xd1, 0x47, 0xb5, 0xad, 0x69, 0x94, 0x5f, 0xb9, 0x59, 0x5e, 0xca, 0x9f, 0x82, 0x46, 0xf9, 0x5a,
+	0xee, 0x5b, 0x89, 0xf2, 0xe3, 0x9a, 0xb6, 0x74, 0xa0, 0x8d, 0x3b, 0xee, 0x34, 0x74, 0xa0, 0x8d,
+	0x3b, 0x2d, 0x8e, 0xab, 0x3b, 0x2c, 0x43, 0x73, 0xe5, 0x1d, 0xf6, 0x52, 0xd0, 0x0c, 0xd4, 0xb5,
+	0xf3, 0xd4, 0xb0, 0xe2, 0xda, 0x03, 0x9d, 0xb8, 0x3a, 0x81, 0x8e, 0x14, 0xcc, 0x17, 0xff, 0xf8,
+	0x42, 0x9e, 0x5c, 0xab, 0x24, 0xa7, 0xf0, 0x8e, 0x74, 0x00, 0x2e, 0xf2, 0x50, 0xd9, 0x05, 0x56,
+	0x91, 0x84, 0xba, 0x01, 0x4d, 0x89, 0x69, 0xd7, 0x08, 0x39, 0x0f, 0xe9, 0xe0, 0xad, 0xd0, 0x71,
+	0x5b, 0x3a, 0x04, 0x53, 0x2f, 0x97, 0xd8, 0x80, 0x6e, 0xa6, 0x9a, 0xc4, 0x42, 0xd8, 0x34, 0x55,
+	0x49, 0xf8, 0xbb, 0x86, 0x94, 0x69, 0x51, 0xce, 0x6f, 0x42, 0xe4, 0x18, 0x34, 0xe7, 0xa3, 0x88,
+	0x94, 0x6f, 0x68, 0xe4, 0xb2, 0x09, 0xad, 0x69, 0xc3, 0x7f, 0x22, 0xa7, 0xc1, 0xf4, 0xf4, 0x93,
+	0xd0, 0x03, 0x43, 0x43, 0x1a, 0x45, 0x0f, 0xed, 0x52, 0x60, 0xae, 0xca, 0x29, 0x5a, 0xdf, 0x8c,
+	0xbf, 0x42, 0x27, 0x0d, 0xca, 0x08, 0x35, 0x0e, 0x40, 0xcf, 0xb2, 0x66, 0x35, 0x0a, 0x0d, 0x4e,
+	0x50, 0x63, 0x0b, 0xfe, 0xb3, 0x06, 0x7a, 0x76, 0x9f, 0xc4, 0x93, 0xd0, 0x22, 0xcb, 0x3a, 0xdd,
+	0xb5, 0xd4, 0xa2, 0x52, 0xed, 0x9b, 0x2b, 0x73, 0x86, 0xee, 0xf7, 0x02, 0xee, 0xa2, 0x63, 0x6a,
+	0xd6, 0x49, 0x68, 0x71, 0x0c, 0xba, 0x03, 0x2a, 0x5a, 0xf0, 0x62, 0xc2, 0x5c, 0xf2, 0x2c, 0xd5,
+	0x89, 0x38, 0x94, 0xd2, 0xaf, 0x8a, 0x05, 0x1c, 0x87, 0x2e, 0x71, 0x8a, 0x38, 0x75, 0xe2, 0x31,
+	0xad, 0x50, 0x71, 0x0b, 0x4d, 0x17, 0x02, 0x85, 0xa8, 0x83, 0x43, 0xbe, 0x2c, 0x9b, 0x45, 0x15,
+	0x52, 0x8e, 0x52, 0x99, 0x80, 0xb7, 0xf9, 0x65, 0xc6, 0x32, 0xd9, 0x24, 0x84, 0x9c, 0xb0, 0x1d,
+	0xbe, 0xf2, 0xc6, 0xa1, 0x34, 0x7c, 0x1a, 0x11, 0x7f, 0x8c, 0x26, 0xb3, 0x4c, 0x93, 0x90, 0x32,
+	0x0f, 0x5d, 0x39, 0x85, 0x14, 0x7e, 0xf7, 0x2e, 0xe7, 0x3f, 0x41, 0xcb, 0x47, 0xbc, 0x8b, 0xe6,
+	0x2b, 0x69, 0x26, 0x21, 0xe4, 0x10, 0xf4, 0x9c, 0x9f, 0x09, 0xd1, 0x6f, 0xe5, 0xe5, 0xe2, 0x8e,
+	0x6f, 0x9a, 0x1a, 0xf0, 0xaf, 0xe4, 0x04, 0x8b, 0x69, 0x8d, 0x3a, 0x3c, 0xe4, 0x8b, 0xbc, 0x26,
+	0xde, 0x74, 0x8d, 0x2c, 0x57, 0xe1, 0xa4, 0x5b, 0xd7, 0x88, 0x13, 0xe9, 0xbe, 0x9c, 0x48, 0x30,
+	0x09, 0xf9, 0xe3, 0x76, 0x1b, 0x81, 0x76, 0xc1, 0xaf, 0xd8, 0x08, 0x5c, 0x03, 0x1d, 0x7f, 0x2d,
+	0xa5, 0xb5, 0x2a, 0xab, 0x51, 0x96, 0x59, 0xba, 0x6d, 0x2b, 0xb8, 0xba, 0x1c, 0xcd, 0xbb, 0xe6,
+	0x26, 0xfc, 0x44, 0xba, 0xb5, 0x97, 0x65, 0x96, 0x84, 0x68, 0x02, 0x3d, 0xeb, 0xaa, 0xa2, 0xb3,
+	0xbb, 0x66, 0xb9, 0xd8, 0x39, 0xb7, 0x4a, 0x4e, 0x63, 0xad, 0x05, 0x53, 0x5a, 0x49, 0x08, 0x3e,
+	0x69, 0xb7, 0x21, 0x19, 0xae, 0xa1, 0x15, 0x1b, 0x92, 0x5b, 0xd3, 0x86, 0x7f, 0xdb, 0x40, 0xcf,
+	0xee, 0x93, 0x53, 0x12, 0x9a, 0x64, 0x09, 0xa5, 0x7b, 0xf6, 0x9a, 0xd4, 0x2c, 0xc3, 0x67, 0xdd,
+	0x7d, 0xdf, 0xc0, 0x01, 0x3a, 0xa6, 0x26, 0x94, 0x84, 0x1e, 0xa7, 0xec, 0x16, 0x46, 0xe5, 0xee,
+	0x5a, 0xb1, 0x30, 0xba, 0x15, 0xaa, 0x32, 0xf7, 0xca, 0x4a, 0x7c, 0x7a, 0xb4, 0xb9, 0x57, 0x97,
+	0xe2, 0x39, 0xb7, 0x4a, 0xc6, 0x54, 0xba, 0x38, 0x2b, 0x84, 0x21, 0xe8, 0x89, 0x47, 0x15, 0x56,
+	0xc8, 0x29, 0x6e, 0xe3, 0x09, 0x11, 0xdf, 0x48, 0xd6, 0x25, 0x05, 0xb5, 0x42, 0xda, 0xc4, 0x68,
+	0x1e, 0x55, 0x16, 0x7e, 0x54, 0x3c, 0x4a, 0x6b, 0xc2, 0x5f, 0x22, 0x52, 0xcd, 0x21, 0x09, 0xe9,
+	0x93, 0x76, 0xd1, 0x45, 0xe5, 0xde, 0x5a, 0x11, 0x5d, 0xb8, 0xc6, 0x96, 0xcc, 0xae, 0xeb, 0x13,
+	0x48, 0x42, 0x8b, 0xb3, 0x96, 0x76, 0x5d, 0x77, 0x99, 0xa8, 0xb4, 0xeb, 0x7d, 0xdf, 0xe0, 0x76,
+	0xad, 0x64, 0x8f, 0x84, 0x1e, 0xe7, 0x2c, 0xed, 0x5a, 0xbe, 0x66, 0x54, 0xda, 0x75, 0x85, 0xca,
+	0xed, 0x5a, 0x4d, 0x1d, 0x09, 0x81, 0xe7, 0x2d, 0xed, 0x5a, 0xb9, 0x80, 0x54, 0xda, 0x75, 0x95,
+	0x8c, 0xff, 0xa2, 0x81, 0x16, 0xf7, 0xcb, 0x1b, 0x09, 0x05, 0x16, 0x47, 0x1b, 0x79, 0x2d, 0x29,
+	0x44, 0x0b, 0x5d, 0xce, 0xd5, 0xa6, 0x8d, 0x24, 0x7f, 0xcb, 0xd5, 0x12, 0x3a, 0x3c, 0x67, 0xe9,
+	0x6f, 0xf9, 0xb5, 0xbe, 0xd2, 0xdf, 0x14, 0x4a, 0xea, 0x6f, 0xa6, 0x7c, 0x91, 0x90, 0x76, 0xc1,
+	0xce, 0xdf, 0xaa, 0x17, 0x5c, 0x0a, 0x7f, 0x63, 0xe6, 0x26, 0xbc, 0x29, 0xdf, 0x33, 0x11, 0x52,
+	0x9f, 0xb7, 0xeb, 0x63, 0x45, 0x58, 0x71, 0xdd, 0x44, 0xc8, 0x18, 0xa0, 0xf9, 0x4a, 0xa6, 0x48,
+	0x88, 0x7a, 0xc1, 0x2e, 0x36, 0xd0, 0xee, 0xb5, 0x14, 0xb1, 0x41, 0xdb, 0x40, 0x4f, 0x03, 0x4b,
+	0x25, 0x4d, 0x24, 0x44, 0xbe, 0x68, 0x17, 0x58, 0xca, 0x37, 0x5e, 0x8a, 0xc0, 0xb2, 0xad, 0x13,
+	0xf1, 0x87, 0x68, 0x42, 0x76, 0xce, 0x8b, 0xd0, 0xef, 0xb1, 0xa5, 0x90, 0x82, 0x3b, 0x6a, 0x97,
+	0xce, 0xf8, 0x31, 0x9a, 0x54, 0x7c, 0xf0, 0x25, 0xbb, 0x78, 0x55, 0xf5, 0xbd, 0x89, 0xae, 0xe4,
+	0x73, 0x0c, 0xcd, 0x4a, 0xd9, 0x21, 0xc1, 0xfe, 0x92, 0xdd, 0x09, 0xba, 0x2c, 0x6d, 0x2e, 0x4e,
+	0xd0, 0x3d, 0x95, 0x94, 0x06, 0x68, 0x86, 0xcc, 0x90, 0x10, 0xf7, 0xb2, 0x9d, 0x79, 0x57, 0x2b,
+	0xc4, 0x0a, 0xf3, 0x8e, 0xcc, 0x4d, 0x69, 0x54, 0x5e, 0x49, 0x0b, 0x09, 0xe1, 0x53, 0x76, 0x51,
+	0xb9, 0x5e, 0x15, 0x59, 0x44, 0xe5, 0xb1, 0xa9, 0x21, 0x1d, 0xde, 0xea, 0xf6, 0x39, 0x6d, 0x37,
+	0xbc, 0xd5, 0x6d, 0x73, 0x3a, 0xd6, 0xb6, 0xcb, 0x4d, 0x34, 0x53, 0x26, 0x84, 0x84, 0x94, 0x19,
+	0x3b, 0xf7, 0x2d, 0xca, 0x05, 0x0b, 0xf7, 0x1d, 0x28, 0x94, 0x55, 0x84, 0xc6, 0xf3, 0x42, 0xa7,
+	0xcb, 0x7f, 0x77, 0x10, 0xcd, 0x94, 0x7f, 0xfa, 0x2c, 0x63, 0x84, 0xff, 0xa1, 0x81, 0x0e, 0x65,
+	0x15, 0xa9, 0x18, 0xf0, 0x55, 0xc1, 0xfc, 0x57, 0x0d, 0x17, 0xae, 0x8d, 0x80, 0xcc, 0x94, 0x5a,
+	0x7c, 0xf8, 0xfd, 0xca, 0xac, 0x54, 0xd8, 0xf6, 0x0a, 0xff, 0x1b, 0x71, 0xdf, 0xfd, 0xe3, 0xbf,
+	0xfe, 0x76, 0xec, 0xca, 0x62, 0x93, 0xff, 0xa7, 0x49, 0xd1, 0x18, 0x2f, 0x7d, 0x25, 0xbd, 0x77,
+	0xf3, 0xd2, 0xd7, 0xe2, 0xef, 0x44, 0xae, 0x78, 0xf1, 0x72, 0x56, 0x42, 0xbb, 0xdc, 0xb8, 0x84,
+	0xff, 0xad, 0x81, 0x26, 0x33, 0x51, 0xd9, 0xdf, 0x76, 0xc3, 0xb7, 0xac, 0x55, 0x53, 0xfe, 0xdc,
+	0xdd, 0xc2, 0xed, 0x91, 0xf1, 0xa2, 0x83, 0x1b, 0xb5, 0x1d, 0xbc, 0xb6, 0x78, 0xd5, 0xae, 0x83,
+	0x19, 0xe7, 0xe5, 0xc6, 0xa5, 0xd7, 0x1a, 0xf8, 0x9f, 0x1b, 0xe8, 0x50, 0x66, 0x03, 0x90, 0x79,
+	0x33, 0x17, 0x15, 0x2e, 0x5c, 0x1b, 0x01, 0x29, 0xba, 0xf5, 0xc9, 0xf7, 0x2b, 0x67, 0xe4, 0x6e,
+	0x55, 0xca, 0x0e, 0x6d, 0xe7, 0x30, 0x63, 0xb0, 0xdc, 0xb8, 0xb4, 0x70, 0xea, 0x77, 0x2b, 0xa4,
+	0x54, 0x46, 0xfc, 0xea, 0xfb, 0x71, 0xd3, 0x0d, 0x7b, 0xab, 0xff, 0xdd, 0x40, 0x17, 0xdc, 0xb0,
+	0x37, 0x54, 0xf1, 0xd5, 0xe3, 0xba, 0xa9, 0xaf, 0x47, 0x61, 0x12, 0xae, 0x37, 0x3e, 0x7d, 0x57,
+	0x40, 0x3b, 0x61, 0x97, 0x06, 0x9d, 0x66, 0x18, 0x75, 0x96, 0x3a, 0x2c, 0xe0, 0x7f, 0x94, 0x6f,
+	0xa9, 0x14, 0x56, 0xff, 0x97, 0x48, 0xaf, 0xe7, 0x3f, 0xfe, 0x7a, 0xec, 0xc0, 0xfd, 0x95, 0x95,
+	0xbf, 0x1d, 0x3b, 0x9f, 0x49, 0x6a, 0xae, 0x78, 0xd2, 0x5f, 0xe1, 0x6b, 0x3e, 0xbe, 0xd2, 0x14,
+	0x82, 0xe3, 0xdf, 0xe5, 0xaf, 0x7c, 0xbe, 0xe2, 0xc5, 0x9f, 0x17, 0xaf, 0x7c, 0xfe, 0xf8, 0xca,
+	0xe7, 0xf9, 0x2b, 0xff, 0x3e, 0x76, 0x21, 0xa3, 0x2f, 0x2f, 0xa7, 0x83, 0xb1, 0x5c, 0xbc, 0xb4,
+	0xbc, 0xfc, 0xf8, 0xca, 0xf2, 0x72, 0xfe, 0xda, 0xe6, 0x21, 0xae, 0xe7, 0x95, 0xff, 0x0d, 0x00,
+	0x00, 0xff, 0xff, 0x1f, 0x5e, 0x07, 0x62, 0x24, 0x76, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// GoogleAdsServiceClient is the client API for GoogleAdsService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type GoogleAdsServiceClient interface {
+	// Returns all rows that match the search query.
+	Search(ctx context.Context, in *SearchGoogleAdsRequest, opts ...grpc.CallOption) (*SearchGoogleAdsResponse, error)
+	// Returns all rows that match the search stream query.
+	SearchStream(ctx context.Context, in *SearchGoogleAdsStreamRequest, opts ...grpc.CallOption) (GoogleAdsService_SearchStreamClient, error)
+	// Creates, updates, or removes resources. This method supports atomic
+	// transactions with multiple types of resources. For example, you can
+	// atomically create a campaign and a campaign budget, or perform up to
+	// thousands of mutates atomically.
+	//
+	// This method is essentially a wrapper around a series of mutate methods. The
+	// only features it offers over calling those methods directly are:
+	//
+	// - Atomic transactions
+	// - Temp resource names (described below)
+	// - Somewhat reduced latency over making a series of mutate calls
+	//
+	// Note: Only resources that support atomic transactions are included, so this
+	// method can't replace all calls to individual services.
+	//
+	// ## Atomic Transaction Benefits
+	//
+	// Atomicity makes error handling much easier. If you're making a series of
+	// changes and one fails, it can leave your account in an inconsistent state.
+	// With atomicity, you either reach the desired state directly, or the request
+	// fails and you can retry.
+	//
+	// ## Temp Resource Names
+	//
+	// Temp resource names are a special type of resource name used to create a
+	// resource and reference that resource in the same request. For example, if a
+	// campaign budget is created with `resource_name` equal to
+	// `customers/123/campaignBudgets/-1`, that resource name can be reused in
+	// the `Campaign.budget` field in the same request. That way, the two
+	// resources are created and linked atomically.
+	//
+	// To create a temp resource name, put a negative number in the part of the
+	// name that the server would normally allocate.
+	//
+	// Note:
+	//
+	// - Resources must be created with a temp name before the name can be reused.
+	//   For example, the previous CampaignBudget+Campaign example would fail if
+	//   the mutate order was reversed.
+	// - Temp names are not remembered across requests.
+	// - There's no limit to the number of temp names in a request.
+	// - Each temp name must use a unique negative number, even if the resource
+	//   types differ.
+	//
+	// ## Latency
+	//
+	// It's important to group mutates by resource type or the request may time
+	// out and fail. Latency is roughly equal to a series of calls to individual
+	// mutate methods, where each change in resource type is a new call. For
+	// example, mutating 10 campaigns then 10 ad groups is like 2 calls, while
+	// mutating 1 campaign, 1 ad group, 1 campaign, 1 ad group is like 4 calls.
+	Mutate(ctx context.Context, in *MutateGoogleAdsRequest, opts ...grpc.CallOption) (*MutateGoogleAdsResponse, error)
+}
+
+type googleAdsServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewGoogleAdsServiceClient(cc grpc.ClientConnInterface) GoogleAdsServiceClient {
+	return &googleAdsServiceClient{cc}
+}
+
+func (c *googleAdsServiceClient) Search(ctx context.Context, in *SearchGoogleAdsRequest, opts ...grpc.CallOption) (*SearchGoogleAdsResponse, error) {
+	out := new(SearchGoogleAdsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GoogleAdsService/Search", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *googleAdsServiceClient) SearchStream(ctx context.Context, in *SearchGoogleAdsStreamRequest, opts ...grpc.CallOption) (GoogleAdsService_SearchStreamClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_GoogleAdsService_serviceDesc.Streams[0], "/google.ads.googleads.v3.services.GoogleAdsService/SearchStream", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &googleAdsServiceSearchStreamClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type GoogleAdsService_SearchStreamClient interface {
+	Recv() (*SearchGoogleAdsStreamResponse, error)
+	grpc.ClientStream
+}
+
+type googleAdsServiceSearchStreamClient struct {
+	grpc.ClientStream
+}
+
+func (x *googleAdsServiceSearchStreamClient) Recv() (*SearchGoogleAdsStreamResponse, error) {
+	m := new(SearchGoogleAdsStreamResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *googleAdsServiceClient) Mutate(ctx context.Context, in *MutateGoogleAdsRequest, opts ...grpc.CallOption) (*MutateGoogleAdsResponse, error) {
+	out := new(MutateGoogleAdsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GoogleAdsService/Mutate", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// GoogleAdsServiceServer is the server API for GoogleAdsService service.
+type GoogleAdsServiceServer interface {
+	// Returns all rows that match the search query.
+	Search(context.Context, *SearchGoogleAdsRequest) (*SearchGoogleAdsResponse, error)
+	// Returns all rows that match the search stream query.
+	SearchStream(*SearchGoogleAdsStreamRequest, GoogleAdsService_SearchStreamServer) error
+	// Creates, updates, or removes resources. This method supports atomic
+	// transactions with multiple types of resources. For example, you can
+	// atomically create a campaign and a campaign budget, or perform up to
+	// thousands of mutates atomically.
+	//
+	// This method is essentially a wrapper around a series of mutate methods. The
+	// only features it offers over calling those methods directly are:
+	//
+	// - Atomic transactions
+	// - Temp resource names (described below)
+	// - Somewhat reduced latency over making a series of mutate calls
+	//
+	// Note: Only resources that support atomic transactions are included, so this
+	// method can't replace all calls to individual services.
+	//
+	// ## Atomic Transaction Benefits
+	//
+	// Atomicity makes error handling much easier. If you're making a series of
+	// changes and one fails, it can leave your account in an inconsistent state.
+	// With atomicity, you either reach the desired state directly, or the request
+	// fails and you can retry.
+	//
+	// ## Temp Resource Names
+	//
+	// Temp resource names are a special type of resource name used to create a
+	// resource and reference that resource in the same request. For example, if a
+	// campaign budget is created with `resource_name` equal to
+	// `customers/123/campaignBudgets/-1`, that resource name can be reused in
+	// the `Campaign.budget` field in the same request. That way, the two
+	// resources are created and linked atomically.
+	//
+	// To create a temp resource name, put a negative number in the part of the
+	// name that the server would normally allocate.
+	//
+	// Note:
+	//
+	// - Resources must be created with a temp name before the name can be reused.
+	//   For example, the previous CampaignBudget+Campaign example would fail if
+	//   the mutate order was reversed.
+	// - Temp names are not remembered across requests.
+	// - There's no limit to the number of temp names in a request.
+	// - Each temp name must use a unique negative number, even if the resource
+	//   types differ.
+	//
+	// ## Latency
+	//
+	// It's important to group mutates by resource type or the request may time
+	// out and fail. Latency is roughly equal to a series of calls to individual
+	// mutate methods, where each change in resource type is a new call. For
+	// example, mutating 10 campaigns then 10 ad groups is like 2 calls, while
+	// mutating 1 campaign, 1 ad group, 1 campaign, 1 ad group is like 4 calls.
+	Mutate(context.Context, *MutateGoogleAdsRequest) (*MutateGoogleAdsResponse, error)
+}
+
+// UnimplementedGoogleAdsServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedGoogleAdsServiceServer struct {
+}
+
+func (*UnimplementedGoogleAdsServiceServer) Search(ctx context.Context, req *SearchGoogleAdsRequest) (*SearchGoogleAdsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method Search not implemented")
+}
+func (*UnimplementedGoogleAdsServiceServer) SearchStream(req *SearchGoogleAdsStreamRequest, srv GoogleAdsService_SearchStreamServer) error {
+	return status1.Errorf(codes.Unimplemented, "method SearchStream not implemented")
+}
+func (*UnimplementedGoogleAdsServiceServer) Mutate(ctx context.Context, req *MutateGoogleAdsRequest) (*MutateGoogleAdsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method Mutate not implemented")
+}
+
+func RegisterGoogleAdsServiceServer(s *grpc.Server, srv GoogleAdsServiceServer) {
+	s.RegisterService(&_GoogleAdsService_serviceDesc, srv)
+}
+
+func _GoogleAdsService_Search_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SearchGoogleAdsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GoogleAdsServiceServer).Search(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.GoogleAdsService/Search",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GoogleAdsServiceServer).Search(ctx, req.(*SearchGoogleAdsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _GoogleAdsService_SearchStream_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(SearchGoogleAdsStreamRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(GoogleAdsServiceServer).SearchStream(m, &googleAdsServiceSearchStreamServer{stream})
+}
+
+type GoogleAdsService_SearchStreamServer interface {
+	Send(*SearchGoogleAdsStreamResponse) error
+	grpc.ServerStream
+}
+
+type googleAdsServiceSearchStreamServer struct {
+	grpc.ServerStream
+}
+
+func (x *googleAdsServiceSearchStreamServer) Send(m *SearchGoogleAdsStreamResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _GoogleAdsService_Mutate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateGoogleAdsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GoogleAdsServiceServer).Mutate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.GoogleAdsService/Mutate",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GoogleAdsServiceServer).Mutate(ctx, req.(*MutateGoogleAdsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _GoogleAdsService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.GoogleAdsService",
+	HandlerType: (*GoogleAdsServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Search",
+			Handler:    _GoogleAdsService_Search_Handler,
+		},
+		{
+			MethodName: "Mutate",
+			Handler:    _GoogleAdsService_Mutate_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "SearchStream",
+			Handler:       _GoogleAdsService_SearchStream_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "google/ads/googleads/v3/services/google_ads_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/group_placement_view_service.pb.go b/googleapis/ads/googleads/v3/services/group_placement_view_service.pb.go
new file mode 100644
index 0000000..917a9b5
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/group_placement_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/group_placement_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [GroupPlacementViewService.GetGroupPlacementView][google.ads.googleads.v3.services.GroupPlacementViewService.GetGroupPlacementView].
+type GetGroupPlacementViewRequest struct {
+	// Required. The resource name of the Group Placement view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetGroupPlacementViewRequest) Reset()         { *m = GetGroupPlacementViewRequest{} }
+func (m *GetGroupPlacementViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetGroupPlacementViewRequest) ProtoMessage()    {}
+func (*GetGroupPlacementViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_366e0655413e5b2b, []int{0}
+}
+
+func (m *GetGroupPlacementViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetGroupPlacementViewRequest.Unmarshal(m, b)
+}
+func (m *GetGroupPlacementViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetGroupPlacementViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetGroupPlacementViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetGroupPlacementViewRequest.Merge(m, src)
+}
+func (m *GetGroupPlacementViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetGroupPlacementViewRequest.Size(m)
+}
+func (m *GetGroupPlacementViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetGroupPlacementViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetGroupPlacementViewRequest proto.InternalMessageInfo
+
+func (m *GetGroupPlacementViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetGroupPlacementViewRequest)(nil), "google.ads.googleads.v3.services.GetGroupPlacementViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/group_placement_view_service.proto", fileDescriptor_366e0655413e5b2b)
+}
+
+var fileDescriptor_366e0655413e5b2b = []byte{
+	// 422 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcd, 0x6a, 0xd5, 0x40,
+	0x18, 0x25, 0x29, 0x08, 0x06, 0xdd, 0x04, 0xc4, 0x1a, 0x8b, 0x5e, 0x4a, 0x17, 0xa5, 0x8b, 0x19,
+	0x30, 0x14, 0x61, 0xfc, 0x81, 0xb9, 0x2e, 0xd2, 0x8d, 0x72, 0xa9, 0x90, 0x85, 0x04, 0xc2, 0x34,
+	0xf9, 0x8c, 0x03, 0xc9, 0x4c, 0x9c, 0x99, 0xa4, 0x0b, 0x71, 0x23, 0xf8, 0x04, 0x6e, 0x5c, 0xbb,
+	0xf4, 0x51, 0xba, 0x75, 0x27, 0x08, 0x2e, 0x5c, 0xf9, 0x14, 0x92, 0x4e, 0x26, 0xed, 0xa5, 0xa6,
+	0x77, 0x77, 0x98, 0x73, 0xbe, 0x73, 0xbe, 0x9f, 0x09, 0x5e, 0x54, 0x52, 0x56, 0x35, 0x60, 0x56,
+	0x6a, 0x6c, 0xe1, 0x80, 0xfa, 0x18, 0x6b, 0x50, 0x3d, 0x2f, 0x40, 0xe3, 0x4a, 0xc9, 0xae, 0xcd,
+	0xdb, 0x9a, 0x15, 0xd0, 0x80, 0x30, 0x79, 0xcf, 0xe1, 0x34, 0x1f, 0x59, 0xd4, 0x2a, 0x69, 0x64,
+	0xb8, 0xb0, 0x95, 0x88, 0x95, 0x1a, 0x4d, 0x26, 0xa8, 0x8f, 0x91, 0x33, 0x89, 0x9e, 0xce, 0xc5,
+	0x28, 0xd0, 0xb2, 0x53, 0x73, 0x39, 0xd6, 0x3f, 0xda, 0x71, 0xd5, 0x2d, 0xc7, 0x4c, 0x08, 0x69,
+	0x98, 0xe1, 0x52, 0xe8, 0x91, 0xbd, 0x7b, 0x89, 0x2d, 0x6a, 0x0e, 0xc2, 0x8c, 0xc4, 0xc3, 0x4b,
+	0xc4, 0x5b, 0x0e, 0x75, 0x99, 0x9f, 0xc0, 0x3b, 0xd6, 0x73, 0xa9, 0xac, 0x60, 0xf7, 0x28, 0xd8,
+	0x49, 0xc0, 0x24, 0x43, 0xf0, 0xca, 0xe5, 0xa6, 0x1c, 0x4e, 0x8f, 0xe1, 0x7d, 0x07, 0xda, 0x84,
+	0xfb, 0xc1, 0x6d, 0xd7, 0x5f, 0x2e, 0x58, 0x03, 0xdb, 0xde, 0xc2, 0xdb, 0xbf, 0xb9, 0xdc, 0xfa,
+	0x4d, 0xfd, 0xe3, 0x5b, 0x8e, 0x79, 0xc5, 0x1a, 0x78, 0xf4, 0xd5, 0x0f, 0xee, 0x5d, 0xf5, 0x79,
+	0x6d, 0xc7, 0x0f, 0x7f, 0x79, 0xc1, 0x9d, 0xff, 0x06, 0x85, 0xcf, 0xd1, 0xa6, 0xd5, 0xa1, 0xeb,
+	0x3a, 0x8c, 0x0e, 0x67, 0xeb, 0xa7, 0xc5, 0xa2, 0xab, 0xd5, 0xbb, 0x2f, 0x7f, 0xd2, 0xf5, 0xc9,
+	0x3e, 0xfd, 0xf8, 0xf3, 0xc5, 0x7f, 0x1c, 0x1e, 0x0e, 0x27, 0xf9, 0xb0, 0xc6, 0x3c, 0x2b, 0x3a,
+	0x6d, 0x64, 0x03, 0x4a, 0xe3, 0x03, 0x7b, 0xa3, 0x35, 0x2b, 0x8d, 0x0f, 0x3e, 0x46, 0xf7, 0xcf,
+	0xe8, 0xf6, 0x45, 0xf8, 0x88, 0x5a, 0xae, 0x51, 0x21, 0x9b, 0xe5, 0x67, 0x3f, 0xd8, 0x2b, 0x64,
+	0xb3, 0x71, 0xd0, 0xe5, 0x83, 0xd9, 0x05, 0xae, 0x86, 0x6b, 0xad, 0xbc, 0x37, 0x47, 0xa3, 0x47,
+	0x25, 0x6b, 0x26, 0x2a, 0x24, 0x55, 0x85, 0x2b, 0x10, 0xe7, 0xb7, 0xc4, 0x17, 0xa9, 0xf3, 0x7f,
+	0xf9, 0x89, 0x03, 0xdf, 0xfc, 0xad, 0x84, 0xd2, 0xef, 0xfe, 0x22, 0xb1, 0x86, 0xb4, 0xd4, 0xc8,
+	0xc2, 0x01, 0xa5, 0x31, 0x1a, 0x83, 0xf5, 0x99, 0x93, 0x64, 0xb4, 0xd4, 0xd9, 0x24, 0xc9, 0xd2,
+	0x38, 0x73, 0x92, 0xbf, 0xfe, 0x9e, 0x7d, 0x27, 0x84, 0x96, 0x9a, 0x90, 0x49, 0x44, 0x48, 0x1a,
+	0x13, 0xe2, 0x64, 0x27, 0x37, 0xce, 0xfb, 0x8c, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x57, 0x82,
+	0x4b, 0x5c, 0x72, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// GroupPlacementViewServiceClient is the client API for GroupPlacementViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type GroupPlacementViewServiceClient interface {
+	// Returns the requested Group Placement view in full detail.
+	GetGroupPlacementView(ctx context.Context, in *GetGroupPlacementViewRequest, opts ...grpc.CallOption) (*resources.GroupPlacementView, error)
+}
+
+type groupPlacementViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewGroupPlacementViewServiceClient(cc grpc.ClientConnInterface) GroupPlacementViewServiceClient {
+	return &groupPlacementViewServiceClient{cc}
+}
+
+func (c *groupPlacementViewServiceClient) GetGroupPlacementView(ctx context.Context, in *GetGroupPlacementViewRequest, opts ...grpc.CallOption) (*resources.GroupPlacementView, error) {
+	out := new(resources.GroupPlacementView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GroupPlacementViewService/GetGroupPlacementView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// GroupPlacementViewServiceServer is the server API for GroupPlacementViewService service.
+type GroupPlacementViewServiceServer interface {
+	// Returns the requested Group Placement view in full detail.
+	GetGroupPlacementView(context.Context, *GetGroupPlacementViewRequest) (*resources.GroupPlacementView, error)
+}
+
+// UnimplementedGroupPlacementViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedGroupPlacementViewServiceServer struct {
+}
+
+func (*UnimplementedGroupPlacementViewServiceServer) GetGroupPlacementView(ctx context.Context, req *GetGroupPlacementViewRequest) (*resources.GroupPlacementView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetGroupPlacementView not implemented")
+}
+
+func RegisterGroupPlacementViewServiceServer(s *grpc.Server, srv GroupPlacementViewServiceServer) {
+	s.RegisterService(&_GroupPlacementViewService_serviceDesc, srv)
+}
+
+func _GroupPlacementViewService_GetGroupPlacementView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetGroupPlacementViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GroupPlacementViewServiceServer).GetGroupPlacementView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.GroupPlacementViewService/GetGroupPlacementView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GroupPlacementViewServiceServer).GetGroupPlacementView(ctx, req.(*GetGroupPlacementViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _GroupPlacementViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.GroupPlacementViewService",
+	HandlerType: (*GroupPlacementViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetGroupPlacementView",
+			Handler:    _GroupPlacementViewService_GetGroupPlacementView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/group_placement_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/hotel_group_view_service.pb.go b/googleapis/ads/googleads/v3/services/hotel_group_view_service.pb.go
new file mode 100644
index 0000000..2426806
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/hotel_group_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/hotel_group_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [HotelGroupViewService.GetHotelGroupView][google.ads.googleads.v3.services.HotelGroupViewService.GetHotelGroupView].
+type GetHotelGroupViewRequest struct {
+	// Required. Resource name of the Hotel Group View to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetHotelGroupViewRequest) Reset()         { *m = GetHotelGroupViewRequest{} }
+func (m *GetHotelGroupViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetHotelGroupViewRequest) ProtoMessage()    {}
+func (*GetHotelGroupViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8e9ace710ca955f4, []int{0}
+}
+
+func (m *GetHotelGroupViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetHotelGroupViewRequest.Unmarshal(m, b)
+}
+func (m *GetHotelGroupViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetHotelGroupViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetHotelGroupViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetHotelGroupViewRequest.Merge(m, src)
+}
+func (m *GetHotelGroupViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetHotelGroupViewRequest.Size(m)
+}
+func (m *GetHotelGroupViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetHotelGroupViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetHotelGroupViewRequest proto.InternalMessageInfo
+
+func (m *GetHotelGroupViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetHotelGroupViewRequest)(nil), "google.ads.googleads.v3.services.GetHotelGroupViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/hotel_group_view_service.proto", fileDescriptor_8e9ace710ca955f4)
+}
+
+var fileDescriptor_8e9ace710ca955f4 = []byte{
+	// 416 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xbf, 0x8a, 0xd4, 0x40,
+	0x18, 0x27, 0x39, 0x10, 0x0c, 0x5a, 0x18, 0x10, 0x97, 0x28, 0xb8, 0x1c, 0x57, 0x1c, 0x57, 0xcc,
+	0x70, 0xa6, 0x91, 0x11, 0x91, 0x59, 0x84, 0x9c, 0x8d, 0x1c, 0x27, 0xa4, 0x90, 0x40, 0x98, 0x4b,
+	0x3e, 0x73, 0x03, 0x49, 0x26, 0xce, 0x4c, 0x72, 0x85, 0x58, 0x28, 0xbe, 0x81, 0x6f, 0x60, 0xe9,
+	0xa3, 0x1c, 0x58, 0xd9, 0x59, 0x59, 0x58, 0xf9, 0x14, 0x92, 0x9d, 0x4c, 0x76, 0x83, 0x1b, 0xb6,
+	0xfb, 0x91, 0xdf, 0xbf, 0xf9, 0xbe, 0x2f, 0xde, 0x8b, 0x42, 0x88, 0xa2, 0x04, 0xcc, 0x72, 0x85,
+	0x0d, 0xec, 0x51, 0x17, 0x62, 0x05, 0xb2, 0xe3, 0x19, 0x28, 0x7c, 0x25, 0x34, 0x94, 0x69, 0x21,
+	0x45, 0xdb, 0xa4, 0x1d, 0x87, 0xeb, 0x74, 0x60, 0x50, 0x23, 0x85, 0x16, 0xfe, 0xd2, 0xb8, 0x10,
+	0xcb, 0x15, 0x1a, 0x03, 0x50, 0x17, 0x22, 0x1b, 0x10, 0x3c, 0x9d, 0xab, 0x90, 0xa0, 0x44, 0x2b,
+	0x77, 0x75, 0x98, 0xec, 0xe0, 0x91, 0x75, 0x36, 0x1c, 0xb3, 0xba, 0x16, 0x9a, 0x69, 0x2e, 0x6a,
+	0x35, 0xb0, 0x0f, 0xb6, 0xd8, 0xac, 0xe4, 0x50, 0xeb, 0x81, 0x78, 0xbc, 0x45, 0xbc, 0xe3, 0x50,
+	0xe6, 0xe9, 0x25, 0x5c, 0xb1, 0x8e, 0x0b, 0x69, 0x04, 0x87, 0x2f, 0xbd, 0x45, 0x04, 0xfa, 0xac,
+	0x2f, 0x8d, 0xfa, 0xce, 0x98, 0xc3, 0xf5, 0x05, 0xbc, 0x6f, 0x41, 0x69, 0xff, 0xd8, 0xbb, 0x6b,
+	0xdf, 0x95, 0xd6, 0xac, 0x82, 0x85, 0xb3, 0x74, 0x8e, 0x6f, 0xaf, 0x0e, 0x7e, 0x53, 0xf7, 0xe2,
+	0x8e, 0x65, 0x5e, 0xb3, 0x0a, 0x9e, 0x7c, 0x71, 0xbd, 0xfb, 0xd3, 0x8c, 0x37, 0x66, 0x64, 0xff,
+	0x87, 0xe3, 0xdd, 0xfb, 0xaf, 0xc0, 0x27, 0x68, 0xdf, 0xaa, 0xd0, 0xdc, 0xab, 0x82, 0xd3, 0x59,
+	0xef, 0xb8, 0x44, 0x34, 0x75, 0x1e, 0xbe, 0xfa, 0x45, 0xa7, 0x93, 0x7c, 0xfe, 0xf9, 0xe7, 0xab,
+	0x1b, 0xfa, 0xa7, 0xfd, 0xea, 0x3f, 0x4c, 0x98, 0xe7, 0x59, 0xab, 0xb4, 0xa8, 0x40, 0x2a, 0x7c,
+	0x62, 0x6e, 0x31, 0xc6, 0x28, 0x7c, 0xf2, 0x31, 0x78, 0x78, 0x43, 0x17, 0x9b, 0xd2, 0x01, 0x35,
+	0x5c, 0xa1, 0x4c, 0x54, 0xab, 0x4f, 0xae, 0x77, 0x94, 0x89, 0x6a, 0xef, 0x70, 0xab, 0x60, 0xe7,
+	0xb2, 0xce, 0xfb, 0x8b, 0x9c, 0x3b, 0x6f, 0xcf, 0x06, 0x7f, 0x21, 0x4a, 0x56, 0x17, 0x48, 0xc8,
+	0x02, 0x17, 0x50, 0xaf, 0xef, 0x85, 0x37, 0x8d, 0xf3, 0xff, 0xe9, 0x33, 0x0b, 0xbe, 0xb9, 0x07,
+	0x11, 0xa5, 0xdf, 0xdd, 0x65, 0x64, 0x02, 0x69, 0xae, 0x90, 0x81, 0x3d, 0x8a, 0x43, 0x34, 0x14,
+	0xab, 0x1b, 0x2b, 0x49, 0x68, 0xae, 0x92, 0x51, 0x92, 0xc4, 0x61, 0x62, 0x25, 0x7f, 0xdd, 0x23,
+	0xf3, 0x9d, 0x10, 0x9a, 0x2b, 0x42, 0x46, 0x11, 0x21, 0x71, 0x48, 0x88, 0x95, 0x5d, 0xde, 0x5a,
+	0xbf, 0x33, 0xfc, 0x17, 0x00, 0x00, 0xff, 0xff, 0x90, 0x5b, 0x0c, 0x86, 0x4e, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// HotelGroupViewServiceClient is the client API for HotelGroupViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type HotelGroupViewServiceClient interface {
+	// Returns the requested Hotel Group View in full detail.
+	GetHotelGroupView(ctx context.Context, in *GetHotelGroupViewRequest, opts ...grpc.CallOption) (*resources.HotelGroupView, error)
+}
+
+type hotelGroupViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewHotelGroupViewServiceClient(cc grpc.ClientConnInterface) HotelGroupViewServiceClient {
+	return &hotelGroupViewServiceClient{cc}
+}
+
+func (c *hotelGroupViewServiceClient) GetHotelGroupView(ctx context.Context, in *GetHotelGroupViewRequest, opts ...grpc.CallOption) (*resources.HotelGroupView, error) {
+	out := new(resources.HotelGroupView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.HotelGroupViewService/GetHotelGroupView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// HotelGroupViewServiceServer is the server API for HotelGroupViewService service.
+type HotelGroupViewServiceServer interface {
+	// Returns the requested Hotel Group View in full detail.
+	GetHotelGroupView(context.Context, *GetHotelGroupViewRequest) (*resources.HotelGroupView, error)
+}
+
+// UnimplementedHotelGroupViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedHotelGroupViewServiceServer struct {
+}
+
+func (*UnimplementedHotelGroupViewServiceServer) GetHotelGroupView(ctx context.Context, req *GetHotelGroupViewRequest) (*resources.HotelGroupView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetHotelGroupView not implemented")
+}
+
+func RegisterHotelGroupViewServiceServer(s *grpc.Server, srv HotelGroupViewServiceServer) {
+	s.RegisterService(&_HotelGroupViewService_serviceDesc, srv)
+}
+
+func _HotelGroupViewService_GetHotelGroupView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetHotelGroupViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(HotelGroupViewServiceServer).GetHotelGroupView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.HotelGroupViewService/GetHotelGroupView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(HotelGroupViewServiceServer).GetHotelGroupView(ctx, req.(*GetHotelGroupViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _HotelGroupViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.HotelGroupViewService",
+	HandlerType: (*HotelGroupViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetHotelGroupView",
+			Handler:    _HotelGroupViewService_GetHotelGroupView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/hotel_group_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/hotel_performance_view_service.pb.go b/googleapis/ads/googleads/v3/services/hotel_performance_view_service.pb.go
new file mode 100644
index 0000000..0ac0412
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/hotel_performance_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/hotel_performance_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [HotelPerformanceViewService.GetHotelPerformanceView][google.ads.googleads.v3.services.HotelPerformanceViewService.GetHotelPerformanceView].
+type GetHotelPerformanceViewRequest struct {
+	// Required. Resource name of the Hotel Performance View to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetHotelPerformanceViewRequest) Reset()         { *m = GetHotelPerformanceViewRequest{} }
+func (m *GetHotelPerformanceViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetHotelPerformanceViewRequest) ProtoMessage()    {}
+func (*GetHotelPerformanceViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c592119b3f671921, []int{0}
+}
+
+func (m *GetHotelPerformanceViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetHotelPerformanceViewRequest.Unmarshal(m, b)
+}
+func (m *GetHotelPerformanceViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetHotelPerformanceViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetHotelPerformanceViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetHotelPerformanceViewRequest.Merge(m, src)
+}
+func (m *GetHotelPerformanceViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetHotelPerformanceViewRequest.Size(m)
+}
+func (m *GetHotelPerformanceViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetHotelPerformanceViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetHotelPerformanceViewRequest proto.InternalMessageInfo
+
+func (m *GetHotelPerformanceViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetHotelPerformanceViewRequest)(nil), "google.ads.googleads.v3.services.GetHotelPerformanceViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/hotel_performance_view_service.proto", fileDescriptor_c592119b3f671921)
+}
+
+var fileDescriptor_c592119b3f671921 = []byte{
+	// 423 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x6a, 0xd5, 0x40,
+	0x14, 0x25, 0x29, 0x08, 0x06, 0xdd, 0x64, 0xd3, 0x92, 0x8a, 0x86, 0xd2, 0x45, 0x71, 0x31, 0x03,
+	0x46, 0x14, 0x46, 0x14, 0xe7, 0x81, 0xbc, 0x22, 0x22, 0x8f, 0x0a, 0x59, 0x48, 0x20, 0x4c, 0x93,
+	0xdb, 0x74, 0x20, 0x99, 0x89, 0x33, 0xf3, 0xd2, 0x85, 0xb8, 0x71, 0xe3, 0x07, 0xf8, 0x01, 0x82,
+	0x4b, 0x3f, 0xa5, 0x5b, 0x77, 0xae, 0x44, 0x5c, 0xf9, 0x15, 0x92, 0x4e, 0x26, 0xaf, 0x2d, 0xcd,
+	0x7b, 0xbb, 0x43, 0xce, 0xb9, 0xe7, 0xdc, 0xb9, 0x27, 0xc1, 0xab, 0x4a, 0xca, 0xaa, 0x06, 0xcc,
+	0x4a, 0x8d, 0x2d, 0xec, 0x51, 0x97, 0x60, 0x0d, 0xaa, 0xe3, 0x05, 0x68, 0x7c, 0x2a, 0x0d, 0xd4,
+	0x79, 0x0b, 0xea, 0x44, 0xaa, 0x86, 0x89, 0x02, 0xf2, 0x8e, 0xc3, 0x59, 0x3e, 0xf0, 0xa8, 0x55,
+	0xd2, 0xc8, 0x30, 0xb6, 0xb3, 0x88, 0x95, 0x1a, 0x8d, 0x36, 0xa8, 0x4b, 0x90, 0xb3, 0x89, 0x5e,
+	0x4c, 0x05, 0x29, 0xd0, 0x72, 0xa9, 0xa6, 0x93, 0x6c, 0x42, 0x74, 0xcf, 0xcd, 0xb7, 0x1c, 0x33,
+	0x21, 0xa4, 0x61, 0x86, 0x4b, 0xa1, 0x07, 0x76, 0xfb, 0x12, 0x5b, 0xd4, 0x1c, 0x84, 0x19, 0x88,
+	0x07, 0x97, 0x88, 0x13, 0x0e, 0x75, 0x99, 0x1f, 0xc3, 0x29, 0xeb, 0xb8, 0x54, 0x56, 0xb0, 0xf7,
+	0x3a, 0xb8, 0x3f, 0x07, 0x73, 0xd8, 0x47, 0x2f, 0x56, 0xc9, 0x29, 0x87, 0xb3, 0x23, 0xf8, 0xb0,
+	0x04, 0x6d, 0xc2, 0x83, 0xe0, 0xae, 0xdb, 0x31, 0x17, 0xac, 0x81, 0x1d, 0x2f, 0xf6, 0x0e, 0x6e,
+	0xcf, 0xb6, 0x7e, 0x53, 0xff, 0xe8, 0x8e, 0x63, 0xde, 0xb2, 0x06, 0x1e, 0x7d, 0xf3, 0x83, 0xdd,
+	0x9b, 0x9c, 0xde, 0xd9, 0x23, 0x84, 0x7f, 0xbc, 0x60, 0x7b, 0x22, 0x2c, 0x7c, 0x89, 0x36, 0x9d,
+	0x10, 0xad, 0xdf, 0x33, 0x7a, 0x3a, 0xe9, 0x30, 0x9e, 0x18, 0xdd, 0x34, 0xbf, 0xf7, 0xe6, 0x17,
+	0xbd, 0xfa, 0xc2, 0xcf, 0x3f, 0xff, 0x7e, 0xf5, 0x9f, 0x84, 0x8f, 0xfb, 0x7a, 0x3e, 0x5e, 0x61,
+	0x9e, 0x17, 0x4b, 0x6d, 0x64, 0x03, 0x4a, 0xe3, 0x87, 0xb6, 0xaf, 0x6b, 0x66, 0x9f, 0xa2, 0xdd,
+	0x73, 0xba, 0xb3, 0x4a, 0x1f, 0x50, 0xcb, 0x35, 0x2a, 0x64, 0x33, 0xfb, 0xe2, 0x07, 0xfb, 0x85,
+	0x6c, 0x36, 0xbe, 0x75, 0x16, 0xaf, 0xb9, 0xe3, 0xa2, 0x2f, 0x6e, 0xe1, 0xbd, 0x3f, 0x1c, 0x5c,
+	0x2a, 0x59, 0x33, 0x51, 0x21, 0xa9, 0x2a, 0x5c, 0x81, 0xb8, 0xa8, 0x15, 0xaf, 0x72, 0xa7, 0x7f,
+	0xed, 0x67, 0x0e, 0x7c, 0xf7, 0xb7, 0xe6, 0x94, 0xfe, 0xf0, 0xe3, 0xb9, 0x35, 0xa4, 0xa5, 0x46,
+	0x16, 0xf6, 0x28, 0x4d, 0xd0, 0x10, 0xac, 0xcf, 0x9d, 0x24, 0xa3, 0xa5, 0xce, 0x46, 0x49, 0x96,
+	0x26, 0x99, 0x93, 0xfc, 0xf3, 0xf7, 0xed, 0x77, 0x42, 0x68, 0xa9, 0x09, 0x19, 0x45, 0x84, 0xa4,
+	0x09, 0x21, 0x4e, 0x76, 0x7c, 0xeb, 0x62, 0xcf, 0xe4, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x60,
+	0x24, 0x6c, 0x45, 0x81, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// HotelPerformanceViewServiceClient is the client API for HotelPerformanceViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type HotelPerformanceViewServiceClient interface {
+	// Returns the requested Hotel Performance View in full detail.
+	GetHotelPerformanceView(ctx context.Context, in *GetHotelPerformanceViewRequest, opts ...grpc.CallOption) (*resources.HotelPerformanceView, error)
+}
+
+type hotelPerformanceViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewHotelPerformanceViewServiceClient(cc grpc.ClientConnInterface) HotelPerformanceViewServiceClient {
+	return &hotelPerformanceViewServiceClient{cc}
+}
+
+func (c *hotelPerformanceViewServiceClient) GetHotelPerformanceView(ctx context.Context, in *GetHotelPerformanceViewRequest, opts ...grpc.CallOption) (*resources.HotelPerformanceView, error) {
+	out := new(resources.HotelPerformanceView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.HotelPerformanceViewService/GetHotelPerformanceView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// HotelPerformanceViewServiceServer is the server API for HotelPerformanceViewService service.
+type HotelPerformanceViewServiceServer interface {
+	// Returns the requested Hotel Performance View in full detail.
+	GetHotelPerformanceView(context.Context, *GetHotelPerformanceViewRequest) (*resources.HotelPerformanceView, error)
+}
+
+// UnimplementedHotelPerformanceViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedHotelPerformanceViewServiceServer struct {
+}
+
+func (*UnimplementedHotelPerformanceViewServiceServer) GetHotelPerformanceView(ctx context.Context, req *GetHotelPerformanceViewRequest) (*resources.HotelPerformanceView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetHotelPerformanceView not implemented")
+}
+
+func RegisterHotelPerformanceViewServiceServer(s *grpc.Server, srv HotelPerformanceViewServiceServer) {
+	s.RegisterService(&_HotelPerformanceViewService_serviceDesc, srv)
+}
+
+func _HotelPerformanceViewService_GetHotelPerformanceView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetHotelPerformanceViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(HotelPerformanceViewServiceServer).GetHotelPerformanceView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.HotelPerformanceViewService/GetHotelPerformanceView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(HotelPerformanceViewServiceServer).GetHotelPerformanceView(ctx, req.(*GetHotelPerformanceViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _HotelPerformanceViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.HotelPerformanceViewService",
+	HandlerType: (*HotelPerformanceViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetHotelPerformanceView",
+			Handler:    _HotelPerformanceViewService_GetHotelPerformanceView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/hotel_performance_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/invoice_service.pb.go b/googleapis/ads/googleads/v3/services/invoice_service.pb.go
new file mode 100644
index 0000000..8640e1b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/invoice_service.pb.go
@@ -0,0 +1,271 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/invoice_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for fetching the invoices of a given billing setup that were
+// issued during a given month.
+type ListInvoicesRequest struct {
+	// Required. The ID of the customer to fetch invoices for.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The billing setup resource name of the requested invoices.
+	//
+	// `customers/{customer_id}/billingSetups/{billing_setup_id}`
+	BillingSetup string `protobuf:"bytes,2,opt,name=billing_setup,json=billingSetup,proto3" json:"billing_setup,omitempty"`
+	// Required. The issue year to retrieve invoices, in yyyy format. Only
+	// invoices issued in 2019 or later can be retrieved.
+	IssueYear string `protobuf:"bytes,3,opt,name=issue_year,json=issueYear,proto3" json:"issue_year,omitempty"`
+	// Required. The issue month to retrieve invoices.
+	IssueMonth           enums.MonthOfYearEnum_MonthOfYear `protobuf:"varint,4,opt,name=issue_month,json=issueMonth,proto3,enum=google.ads.googleads.v3.enums.MonthOfYearEnum_MonthOfYear" json:"issue_month,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *ListInvoicesRequest) Reset()         { *m = ListInvoicesRequest{} }
+func (m *ListInvoicesRequest) String() string { return proto.CompactTextString(m) }
+func (*ListInvoicesRequest) ProtoMessage()    {}
+func (*ListInvoicesRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1dd40029722f2c33, []int{0}
+}
+
+func (m *ListInvoicesRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListInvoicesRequest.Unmarshal(m, b)
+}
+func (m *ListInvoicesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListInvoicesRequest.Marshal(b, m, deterministic)
+}
+func (m *ListInvoicesRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListInvoicesRequest.Merge(m, src)
+}
+func (m *ListInvoicesRequest) XXX_Size() int {
+	return xxx_messageInfo_ListInvoicesRequest.Size(m)
+}
+func (m *ListInvoicesRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListInvoicesRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListInvoicesRequest proto.InternalMessageInfo
+
+func (m *ListInvoicesRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *ListInvoicesRequest) GetBillingSetup() string {
+	if m != nil {
+		return m.BillingSetup
+	}
+	return ""
+}
+
+func (m *ListInvoicesRequest) GetIssueYear() string {
+	if m != nil {
+		return m.IssueYear
+	}
+	return ""
+}
+
+func (m *ListInvoicesRequest) GetIssueMonth() enums.MonthOfYearEnum_MonthOfYear {
+	if m != nil {
+		return m.IssueMonth
+	}
+	return enums.MonthOfYearEnum_UNSPECIFIED
+}
+
+// Response message for [InvoiceService.ListInvoices][google.ads.googleads.v3.services.InvoiceService.ListInvoices].
+type ListInvoicesResponse struct {
+	// The list of invoices that match the billing setup and time period.
+	Invoices             []*resources.Invoice `protobuf:"bytes,1,rep,name=invoices,proto3" json:"invoices,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *ListInvoicesResponse) Reset()         { *m = ListInvoicesResponse{} }
+func (m *ListInvoicesResponse) String() string { return proto.CompactTextString(m) }
+func (*ListInvoicesResponse) ProtoMessage()    {}
+func (*ListInvoicesResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1dd40029722f2c33, []int{1}
+}
+
+func (m *ListInvoicesResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListInvoicesResponse.Unmarshal(m, b)
+}
+func (m *ListInvoicesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListInvoicesResponse.Marshal(b, m, deterministic)
+}
+func (m *ListInvoicesResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListInvoicesResponse.Merge(m, src)
+}
+func (m *ListInvoicesResponse) XXX_Size() int {
+	return xxx_messageInfo_ListInvoicesResponse.Size(m)
+}
+func (m *ListInvoicesResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListInvoicesResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListInvoicesResponse proto.InternalMessageInfo
+
+func (m *ListInvoicesResponse) GetInvoices() []*resources.Invoice {
+	if m != nil {
+		return m.Invoices
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ListInvoicesRequest)(nil), "google.ads.googleads.v3.services.ListInvoicesRequest")
+	proto.RegisterType((*ListInvoicesResponse)(nil), "google.ads.googleads.v3.services.ListInvoicesResponse")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/invoice_service.proto", fileDescriptor_1dd40029722f2c33)
+}
+
+var fileDescriptor_1dd40029722f2c33 = []byte{
+	// 542 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4f, 0x8b, 0xd3, 0x40,
+	0x14, 0x27, 0xa9, 0x88, 0x3b, 0x5d, 0xf7, 0x90, 0x15, 0x0c, 0x55, 0xb0, 0x94, 0x22, 0x65, 0x29,
+	0x33, 0xda, 0xe0, 0x1e, 0x22, 0x1e, 0x52, 0xd0, 0x75, 0x41, 0x71, 0xe9, 0x42, 0x41, 0x29, 0xc6,
+	0x34, 0x99, 0x66, 0x07, 0x92, 0x99, 0x9a, 0x97, 0x14, 0x44, 0xbc, 0xf8, 0x09, 0x04, 0xbf, 0x81,
+	0x47, 0x3f, 0xca, 0x5e, 0xbd, 0x79, 0xda, 0x83, 0x27, 0xfd, 0x06, 0x9e, 0x24, 0x99, 0xc9, 0x9f,
+	0x82, 0x61, 0xd9, 0xdb, 0xcb, 0x7b, 0xbf, 0xdf, 0xef, 0xbd, 0xf9, 0xbd, 0x17, 0x74, 0x18, 0x0a,
+	0x11, 0x46, 0x94, 0x78, 0x01, 0x10, 0x19, 0xe6, 0xd1, 0xc6, 0x22, 0x40, 0x93, 0x0d, 0xf3, 0x29,
+	0x10, 0xc6, 0x37, 0x82, 0xf9, 0xd4, 0x55, 0x09, 0xbc, 0x4e, 0x44, 0x2a, 0x8c, 0xbe, 0x04, 0x63,
+	0x2f, 0x00, 0x5c, 0xf1, 0xf0, 0xc6, 0xc2, 0x25, 0xaf, 0xf7, 0xb0, 0x4d, 0x99, 0xf2, 0x2c, 0x06,
+	0x12, 0x0b, 0x9e, 0x9e, 0xb9, 0x62, 0xe5, 0x7e, 0xa0, 0x5e, 0x22, 0x45, 0x7b, 0xa4, 0x8d, 0x92,
+	0x50, 0x10, 0x59, 0xd2, 0x98, 0x46, 0x11, 0xee, 0x96, 0x84, 0x35, 0x23, 0x1e, 0xe7, 0x22, 0xf5,
+	0x52, 0x26, 0x38, 0xa8, 0xea, 0xed, 0x46, 0xd5, 0x8f, 0x18, 0xe5, 0xa9, 0x2a, 0xdc, 0x6b, 0x14,
+	0x56, 0x8c, 0x46, 0x81, 0xbb, 0xa4, 0x67, 0xde, 0x86, 0x09, 0x35, 0xc8, 0xe0, 0x8f, 0x86, 0xf6,
+	0x5f, 0x30, 0x48, 0x8f, 0x65, 0x37, 0x98, 0xd1, 0xf7, 0x19, 0x85, 0xd4, 0x18, 0xa2, 0xae, 0x9f,
+	0x41, 0x2a, 0x62, 0x9a, 0xb8, 0x2c, 0x30, 0xb5, 0xbe, 0x36, 0xda, 0x99, 0x76, 0x2e, 0x1c, 0x7d,
+	0x86, 0xca, 0xfc, 0x71, 0x60, 0x8c, 0xd0, 0xcd, 0x25, 0x8b, 0x22, 0xc6, 0x43, 0x17, 0x68, 0x9a,
+	0xad, 0x4d, 0xbd, 0xc6, 0xed, 0xaa, 0xca, 0x69, 0x5e, 0x30, 0x06, 0x08, 0x31, 0x80, 0x8c, 0x16,
+	0x26, 0x98, 0x9d, 0x1a, 0xb6, 0x53, 0xa4, 0x5f, 0x53, 0x2f, 0x31, 0xde, 0xa1, 0xae, 0xc4, 0x14,
+	0x8e, 0x99, 0xd7, 0xfa, 0xda, 0x68, 0x6f, 0x62, 0xe3, 0x36, 0xff, 0x0b, 0x77, 0xf1, 0xcb, 0x1c,
+	0xfb, 0x6a, 0x95, 0x0b, 0x3c, 0xe5, 0x59, 0xdc, 0xfc, 0x56, 0xf3, 0x16, 0x9a, 0x45, 0x7a, 0xf0,
+	0x16, 0xdd, 0xda, 0x7e, 0x2c, 0xac, 0x05, 0x07, 0x6a, 0x3c, 0x43, 0x37, 0x94, 0xdd, 0x60, 0x6a,
+	0xfd, 0xce, 0xa8, 0x3b, 0x39, 0x68, 0x6d, 0x5b, 0x6d, 0x08, 0x2b, 0x99, 0x59, 0xc5, 0x9d, 0x7c,
+	0xd1, 0xd1, 0x9e, 0xca, 0x9e, 0xca, 0xeb, 0x30, 0x2e, 0x34, 0xb4, 0xdb, 0xec, 0x69, 0x3c, 0xc2,
+	0x97, 0x1d, 0x14, 0xfe, 0xcf, 0x42, 0x7a, 0x87, 0x57, 0xa5, 0xc9, 0xa7, 0x0d, 0xbc, 0x9f, 0xce,
+	0x83, 0xc6, 0x26, 0xc7, 0x5b, 0xfb, 0x1a, 0xd7, 0x3b, 0x19, 0x37, 0xac, 0xff, 0xfc, 0xe3, 0xd7,
+	0x57, 0x7d, 0x64, 0xdc, 0xcf, 0x0f, 0xb2, 0xe4, 0x02, 0xf9, 0xd8, 0x90, 0x79, 0x72, 0xf0, 0xa9,
+	0x3c, 0x50, 0xe8, 0xdd, 0x39, 0x77, 0xcc, 0x7a, 0x22, 0x15, 0xad, 0x19, 0x60, 0x5f, 0xc4, 0xd3,
+	0xbf, 0x1a, 0x1a, 0xfa, 0x22, 0xbe, 0x74, 0xfa, 0xe9, 0xfe, 0xb6, 0x71, 0x27, 0xf9, 0x79, 0x9e,
+	0x68, 0x6f, 0x9e, 0x2b, 0x62, 0x28, 0x22, 0x8f, 0x87, 0x58, 0x24, 0x21, 0x09, 0x29, 0x2f, 0x8e,
+	0x97, 0xd4, 0xad, 0xda, 0xff, 0xea, 0xc7, 0x65, 0xf0, 0x4d, 0xef, 0x1c, 0x39, 0xce, 0x77, 0xbd,
+	0x7f, 0x24, 0x05, 0x9d, 0x00, 0xb0, 0x0c, 0xf3, 0x68, 0x6e, 0x61, 0xd5, 0x18, 0xce, 0x4b, 0xc8,
+	0xc2, 0x09, 0x60, 0x51, 0x41, 0x16, 0x73, 0x6b, 0x51, 0x42, 0x7e, 0xeb, 0x43, 0x99, 0xb7, 0x6d,
+	0x27, 0x00, 0xdb, 0xae, 0x40, 0xb6, 0x3d, 0xb7, 0x6c, 0xbb, 0x84, 0x2d, 0xaf, 0x17, 0x73, 0x5a,
+	0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x08, 0xd8, 0xe2, 0x58, 0x7c, 0x04, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// InvoiceServiceClient is the client API for InvoiceService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type InvoiceServiceClient interface {
+	// Returns all invoices associated with a billing setup, for a given month.
+	ListInvoices(ctx context.Context, in *ListInvoicesRequest, opts ...grpc.CallOption) (*ListInvoicesResponse, error)
+}
+
+type invoiceServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewInvoiceServiceClient(cc grpc.ClientConnInterface) InvoiceServiceClient {
+	return &invoiceServiceClient{cc}
+}
+
+func (c *invoiceServiceClient) ListInvoices(ctx context.Context, in *ListInvoicesRequest, opts ...grpc.CallOption) (*ListInvoicesResponse, error) {
+	out := new(ListInvoicesResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.InvoiceService/ListInvoices", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// InvoiceServiceServer is the server API for InvoiceService service.
+type InvoiceServiceServer interface {
+	// Returns all invoices associated with a billing setup, for a given month.
+	ListInvoices(context.Context, *ListInvoicesRequest) (*ListInvoicesResponse, error)
+}
+
+// UnimplementedInvoiceServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedInvoiceServiceServer struct {
+}
+
+func (*UnimplementedInvoiceServiceServer) ListInvoices(ctx context.Context, req *ListInvoicesRequest) (*ListInvoicesResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListInvoices not implemented")
+}
+
+func RegisterInvoiceServiceServer(s *grpc.Server, srv InvoiceServiceServer) {
+	s.RegisterService(&_InvoiceService_serviceDesc, srv)
+}
+
+func _InvoiceService_ListInvoices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListInvoicesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(InvoiceServiceServer).ListInvoices(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.InvoiceService/ListInvoices",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(InvoiceServiceServer).ListInvoices(ctx, req.(*ListInvoicesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _InvoiceService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.InvoiceService",
+	HandlerType: (*InvoiceServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListInvoices",
+			Handler:    _InvoiceService_ListInvoices_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/invoice_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/keyword_plan_ad_group_service.pb.go b/googleapis/ads/googleads/v3/services/keyword_plan_ad_group_service.pb.go
new file mode 100644
index 0000000..5fd8b1a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/keyword_plan_ad_group_service.pb.go
@@ -0,0 +1,532 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/keyword_plan_ad_group_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [KeywordPlanAdGroupService.GetKeywordPlanAdGroup][google.ads.googleads.v3.services.KeywordPlanAdGroupService.GetKeywordPlanAdGroup].
+type GetKeywordPlanAdGroupRequest struct {
+	// Required. The resource name of the Keyword Plan ad group to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetKeywordPlanAdGroupRequest) Reset()         { *m = GetKeywordPlanAdGroupRequest{} }
+func (m *GetKeywordPlanAdGroupRequest) String() string { return proto.CompactTextString(m) }
+func (*GetKeywordPlanAdGroupRequest) ProtoMessage()    {}
+func (*GetKeywordPlanAdGroupRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_276f25299ec71286, []int{0}
+}
+
+func (m *GetKeywordPlanAdGroupRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetKeywordPlanAdGroupRequest.Unmarshal(m, b)
+}
+func (m *GetKeywordPlanAdGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetKeywordPlanAdGroupRequest.Marshal(b, m, deterministic)
+}
+func (m *GetKeywordPlanAdGroupRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetKeywordPlanAdGroupRequest.Merge(m, src)
+}
+func (m *GetKeywordPlanAdGroupRequest) XXX_Size() int {
+	return xxx_messageInfo_GetKeywordPlanAdGroupRequest.Size(m)
+}
+func (m *GetKeywordPlanAdGroupRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetKeywordPlanAdGroupRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetKeywordPlanAdGroupRequest proto.InternalMessageInfo
+
+func (m *GetKeywordPlanAdGroupRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [KeywordPlanAdGroupService.MutateKeywordPlanAdGroups][google.ads.googleads.v3.services.KeywordPlanAdGroupService.MutateKeywordPlanAdGroups].
+type MutateKeywordPlanAdGroupsRequest struct {
+	// Required. The ID of the customer whose Keyword Plan ad groups are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual Keyword Plan ad groups.
+	Operations []*KeywordPlanAdGroupOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlanAdGroupsRequest) Reset()         { *m = MutateKeywordPlanAdGroupsRequest{} }
+func (m *MutateKeywordPlanAdGroupsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanAdGroupsRequest) ProtoMessage()    {}
+func (*MutateKeywordPlanAdGroupsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_276f25299ec71286, []int{1}
+}
+
+func (m *MutateKeywordPlanAdGroupsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanAdGroupsRequest.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanAdGroupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanAdGroupsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanAdGroupsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanAdGroupsRequest.Merge(m, src)
+}
+func (m *MutateKeywordPlanAdGroupsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanAdGroupsRequest.Size(m)
+}
+func (m *MutateKeywordPlanAdGroupsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanAdGroupsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanAdGroupsRequest proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanAdGroupsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateKeywordPlanAdGroupsRequest) GetOperations() []*KeywordPlanAdGroupOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlanAdGroupsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateKeywordPlanAdGroupsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a Keyword Plan ad group.
+type KeywordPlanAdGroupOperation struct {
+	// The FieldMask that determines which resource fields are modified in an
+	// update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*KeywordPlanAdGroupOperation_Create
+	//	*KeywordPlanAdGroupOperation_Update
+	//	*KeywordPlanAdGroupOperation_Remove
+	Operation            isKeywordPlanAdGroupOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *KeywordPlanAdGroupOperation) Reset()         { *m = KeywordPlanAdGroupOperation{} }
+func (m *KeywordPlanAdGroupOperation) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanAdGroupOperation) ProtoMessage()    {}
+func (*KeywordPlanAdGroupOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_276f25299ec71286, []int{2}
+}
+
+func (m *KeywordPlanAdGroupOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanAdGroupOperation.Unmarshal(m, b)
+}
+func (m *KeywordPlanAdGroupOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanAdGroupOperation.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanAdGroupOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanAdGroupOperation.Merge(m, src)
+}
+func (m *KeywordPlanAdGroupOperation) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanAdGroupOperation.Size(m)
+}
+func (m *KeywordPlanAdGroupOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanAdGroupOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanAdGroupOperation proto.InternalMessageInfo
+
+func (m *KeywordPlanAdGroupOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isKeywordPlanAdGroupOperation_Operation interface {
+	isKeywordPlanAdGroupOperation_Operation()
+}
+
+type KeywordPlanAdGroupOperation_Create struct {
+	Create *resources.KeywordPlanAdGroup `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type KeywordPlanAdGroupOperation_Update struct {
+	Update *resources.KeywordPlanAdGroup `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type KeywordPlanAdGroupOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*KeywordPlanAdGroupOperation_Create) isKeywordPlanAdGroupOperation_Operation() {}
+
+func (*KeywordPlanAdGroupOperation_Update) isKeywordPlanAdGroupOperation_Operation() {}
+
+func (*KeywordPlanAdGroupOperation_Remove) isKeywordPlanAdGroupOperation_Operation() {}
+
+func (m *KeywordPlanAdGroupOperation) GetOperation() isKeywordPlanAdGroupOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *KeywordPlanAdGroupOperation) GetCreate() *resources.KeywordPlanAdGroup {
+	if x, ok := m.GetOperation().(*KeywordPlanAdGroupOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *KeywordPlanAdGroupOperation) GetUpdate() *resources.KeywordPlanAdGroup {
+	if x, ok := m.GetOperation().(*KeywordPlanAdGroupOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *KeywordPlanAdGroupOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*KeywordPlanAdGroupOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*KeywordPlanAdGroupOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*KeywordPlanAdGroupOperation_Create)(nil),
+		(*KeywordPlanAdGroupOperation_Update)(nil),
+		(*KeywordPlanAdGroupOperation_Remove)(nil),
+	}
+}
+
+// Response message for a Keyword Plan ad group mutate.
+type MutateKeywordPlanAdGroupsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateKeywordPlanAdGroupResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *MutateKeywordPlanAdGroupsResponse) Reset()         { *m = MutateKeywordPlanAdGroupsResponse{} }
+func (m *MutateKeywordPlanAdGroupsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanAdGroupsResponse) ProtoMessage()    {}
+func (*MutateKeywordPlanAdGroupsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_276f25299ec71286, []int{3}
+}
+
+func (m *MutateKeywordPlanAdGroupsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanAdGroupsResponse.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanAdGroupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanAdGroupsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanAdGroupsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanAdGroupsResponse.Merge(m, src)
+}
+func (m *MutateKeywordPlanAdGroupsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanAdGroupsResponse.Size(m)
+}
+func (m *MutateKeywordPlanAdGroupsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanAdGroupsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanAdGroupsResponse proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanAdGroupsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlanAdGroupsResponse) GetResults() []*MutateKeywordPlanAdGroupResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the Keyword Plan ad group mutate.
+type MutateKeywordPlanAdGroupResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlanAdGroupResult) Reset()         { *m = MutateKeywordPlanAdGroupResult{} }
+func (m *MutateKeywordPlanAdGroupResult) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanAdGroupResult) ProtoMessage()    {}
+func (*MutateKeywordPlanAdGroupResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_276f25299ec71286, []int{4}
+}
+
+func (m *MutateKeywordPlanAdGroupResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanAdGroupResult.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanAdGroupResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanAdGroupResult.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanAdGroupResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanAdGroupResult.Merge(m, src)
+}
+func (m *MutateKeywordPlanAdGroupResult) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanAdGroupResult.Size(m)
+}
+func (m *MutateKeywordPlanAdGroupResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanAdGroupResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanAdGroupResult proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanAdGroupResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetKeywordPlanAdGroupRequest)(nil), "google.ads.googleads.v3.services.GetKeywordPlanAdGroupRequest")
+	proto.RegisterType((*MutateKeywordPlanAdGroupsRequest)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanAdGroupsRequest")
+	proto.RegisterType((*KeywordPlanAdGroupOperation)(nil), "google.ads.googleads.v3.services.KeywordPlanAdGroupOperation")
+	proto.RegisterType((*MutateKeywordPlanAdGroupsResponse)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanAdGroupsResponse")
+	proto.RegisterType((*MutateKeywordPlanAdGroupResult)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanAdGroupResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/keyword_plan_ad_group_service.proto", fileDescriptor_276f25299ec71286)
+}
+
+var fileDescriptor_276f25299ec71286 = []byte{
+	// 780 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xcf, 0x6b, 0xdb, 0x4a,
+	0x10, 0xc7, 0x9f, 0xe4, 0x90, 0xf7, 0xb2, 0x4e, 0xde, 0x83, 0x7d, 0xa4, 0x75, 0x9c, 0x90, 0xba,
+	0x6a, 0xa0, 0xc6, 0x14, 0x09, 0x6c, 0x42, 0x8b, 0x82, 0x4b, 0xe5, 0x36, 0x71, 0x4a, 0x49, 0x13,
+	0x14, 0xc8, 0x21, 0x18, 0xc4, 0x5a, 0xda, 0xb8, 0x22, 0x92, 0x56, 0xdd, 0x95, 0x5c, 0x42, 0xc8,
+	0x25, 0xd0, 0xbf, 0xa0, 0xe7, 0x5e, 0xda, 0x5b, 0xff, 0x91, 0x42, 0xae, 0xbd, 0x05, 0x0a, 0x3d,
+	0xf4, 0xd4, 0x3f, 0xa1, 0xa7, 0x22, 0xad, 0xd6, 0x3f, 0x12, 0xff, 0x80, 0xe4, 0x36, 0xde, 0xf9,
+	0xea, 0x33, 0x33, 0x3b, 0xb3, 0x63, 0xf0, 0xa2, 0x43, 0x48, 0xc7, 0xc3, 0x1a, 0x72, 0x98, 0xc6,
+	0xcd, 0xc4, 0xea, 0xd6, 0x34, 0x86, 0x69, 0xd7, 0xb5, 0x31, 0xd3, 0x8e, 0xf1, 0xc9, 0x3b, 0x42,
+	0x1d, 0x2b, 0xf4, 0x50, 0x60, 0x21, 0xc7, 0xea, 0x50, 0x12, 0x87, 0x56, 0xe6, 0x56, 0x43, 0x4a,
+	0x22, 0x02, 0x4b, 0xfc, 0x53, 0x15, 0x39, 0x4c, 0xed, 0x51, 0xd4, 0x6e, 0x4d, 0x15, 0x94, 0x62,
+	0x7d, 0x5c, 0x1c, 0x8a, 0x19, 0x89, 0xe9, 0xd8, 0x40, 0x3c, 0x40, 0x71, 0x45, 0x7c, 0x1e, 0xba,
+	0x1a, 0x0a, 0x02, 0x12, 0xa1, 0xc8, 0x25, 0x01, 0xcb, 0xbc, 0x77, 0x07, 0xbc, 0xb6, 0xe7, 0xe2,
+	0x20, 0xca, 0x1c, 0xf7, 0x06, 0x1c, 0x47, 0x2e, 0xf6, 0x1c, 0xab, 0x8d, 0xdf, 0xa0, 0xae, 0x4b,
+	0x68, 0x26, 0xc8, 0x12, 0xd7, 0xd2, 0x5f, 0xed, 0xf8, 0x28, 0x53, 0xf9, 0x88, 0x1d, 0x5f, 0x61,
+	0xd3, 0xd0, 0xd6, 0x58, 0x84, 0xa2, 0x38, 0x0b, 0xaa, 0x6c, 0x83, 0x95, 0x26, 0x8e, 0x5e, 0xf1,
+	0xa4, 0xf7, 0x3c, 0x14, 0x18, 0x4e, 0x33, 0xc9, 0xd8, 0xc4, 0x6f, 0x63, 0xcc, 0x22, 0x58, 0x06,
+	0x0b, 0xa2, 0x36, 0x2b, 0x40, 0x3e, 0x2e, 0x48, 0x25, 0xa9, 0x3c, 0xd7, 0xc8, 0xfd, 0x30, 0x64,
+	0x73, 0x5e, 0x78, 0x5e, 0x23, 0x1f, 0x2b, 0xbf, 0x25, 0x50, 0xda, 0x89, 0x23, 0x14, 0xe1, 0xeb,
+	0x34, 0x26, 0x70, 0x6b, 0x20, 0x6f, 0xc7, 0x2c, 0x22, 0x3e, 0xa6, 0x96, 0xeb, 0x0c, 0xc2, 0x80,
+	0x38, 0x7f, 0xe9, 0xc0, 0x36, 0x00, 0x24, 0xc4, 0x94, 0xdf, 0x4e, 0x41, 0x2e, 0xe5, 0xca, 0xf9,
+	0x6a, 0x5d, 0x9d, 0xd6, 0x1d, 0xf5, 0x7a, 0xdc, 0x5d, 0x41, 0xc9, 0x62, 0xf4, 0xa9, 0xf0, 0x21,
+	0xf8, 0x2f, 0x44, 0x34, 0x72, 0x91, 0x67, 0x1d, 0x21, 0xd7, 0x8b, 0x29, 0x2e, 0xe4, 0x4a, 0x52,
+	0xf9, 0x1f, 0xf3, 0xdf, 0xec, 0x78, 0x8b, 0x9f, 0xc2, 0x07, 0x60, 0xa1, 0x8b, 0x3c, 0xd7, 0x41,
+	0x11, 0xb6, 0x48, 0xe0, 0x9d, 0x14, 0x66, 0x52, 0xd9, 0xbc, 0x38, 0xdc, 0x0d, 0xbc, 0x13, 0xe5,
+	0xb3, 0x0c, 0x96, 0x27, 0x84, 0x87, 0x1b, 0x20, 0x1f, 0x87, 0x29, 0x22, 0x69, 0x4a, 0x8a, 0xc8,
+	0x57, 0x8b, 0xa2, 0x24, 0xd1, 0x37, 0x75, 0x2b, 0xe9, 0xdb, 0x0e, 0x62, 0xc7, 0x26, 0xe0, 0xf2,
+	0xc4, 0x86, 0xbb, 0x60, 0xd6, 0xa6, 0x18, 0x45, 0xfc, 0xf2, 0xf3, 0xd5, 0xf5, 0xb1, 0x57, 0xd1,
+	0x1b, 0xc3, 0x11, 0x77, 0xb1, 0xfd, 0x97, 0x99, 0x61, 0x12, 0x20, 0xc7, 0x17, 0xe4, 0x5b, 0x02,
+	0x39, 0x06, 0x16, 0xc0, 0x2c, 0xc5, 0x3e, 0xe9, 0xf2, 0x3b, 0x9c, 0x4b, 0x3c, 0xfc, 0x77, 0x23,
+	0x0f, 0xe6, 0x7a, 0x97, 0xae, 0x7c, 0x95, 0xc0, 0xfd, 0x09, 0x23, 0xc2, 0x42, 0x12, 0x30, 0x0c,
+	0xb7, 0xc0, 0xe2, 0x95, 0xce, 0x58, 0x98, 0x52, 0x42, 0x53, 0x76, 0xbe, 0x0a, 0x45, 0xb2, 0x34,
+	0xb4, 0xd5, 0xfd, 0x74, 0x96, 0xcd, 0xff, 0x87, 0x7b, 0xb6, 0x99, 0xc8, 0xe1, 0x21, 0xf8, 0x9b,
+	0x62, 0x16, 0x7b, 0x91, 0x18, 0xa1, 0x67, 0xd3, 0x47, 0x68, 0x5c, 0x76, 0x66, 0x0a, 0x32, 0x05,
+	0x50, 0xd9, 0x04, 0xab, 0x93, 0xa5, 0xc9, 0xd8, 0x8c, 0x78, 0x38, 0xc3, 0x6f, 0xa6, 0xfa, 0x71,
+	0x06, 0x2c, 0x5d, 0x27, 0xec, 0xf3, 0x6c, 0xe0, 0x77, 0x09, 0x2c, 0x8e, 0x7c, 0x9c, 0xf0, 0xe9,
+	0xf4, 0x4a, 0x26, 0xbd, 0xea, 0xe2, 0xcd, 0x1a, 0xae, 0xec, 0x5c, 0x1a, 0xc3, 0x45, 0x9d, 0x7f,
+	0xfb, 0xf9, 0x41, 0x7e, 0x0c, 0xd7, 0x93, 0x15, 0x78, 0x3a, 0xe4, 0xa9, 0x8b, 0xe7, 0xcc, 0xb4,
+	0x8a, 0xd8, 0x89, 0x83, 0xdd, 0xd6, 0x2a, 0x67, 0xf0, 0x5c, 0x06, 0x4b, 0x63, 0xc7, 0x01, 0x36,
+	0x6e, 0xde, 0x2d, 0xb1, 0x6e, 0x8a, 0xcf, 0x6f, 0xc5, 0xe0, 0xf3, 0xa8, 0xb4, 0x2e, 0x8d, 0x3b,
+	0x03, 0x4b, 0xeb, 0x51, 0x7f, 0x89, 0xa4, 0xe5, 0xd7, 0x95, 0x27, 0x49, 0xf9, 0xfd, 0x7a, 0x4f,
+	0x07, 0xc4, 0xf5, 0xca, 0xd9, 0xa8, 0xea, 0x75, 0x3f, 0x8d, 0xaa, 0x4b, 0x95, 0xe2, 0xf2, 0x85,
+	0x51, 0xe8, 0x67, 0x96, 0x59, 0xa1, 0xcb, 0x54, 0x9b, 0xf8, 0x8d, 0xf7, 0x32, 0x58, 0xb3, 0x89,
+	0x3f, 0xb5, 0x8a, 0xc6, 0xea, 0xd8, 0x29, 0xda, 0x4b, 0x76, 0xcb, 0x9e, 0x74, 0xb8, 0x9d, 0x31,
+	0x3a, 0xc4, 0x43, 0x41, 0x47, 0x25, 0xb4, 0xa3, 0x75, 0x70, 0x90, 0x6e, 0x1e, 0xad, 0x1f, 0x75,
+	0xfc, 0x3f, 0xe8, 0x86, 0x30, 0x3e, 0xc9, 0xb9, 0xa6, 0x61, 0x7c, 0x91, 0x4b, 0x4d, 0x0e, 0x34,
+	0x1c, 0xa6, 0x72, 0x33, 0xb1, 0x0e, 0x6a, 0x6a, 0x16, 0x98, 0x5d, 0x08, 0x49, 0xcb, 0x70, 0x58,
+	0xab, 0x27, 0x69, 0x1d, 0xd4, 0x5a, 0x42, 0xf2, 0x4b, 0x5e, 0xe3, 0xe7, 0xba, 0x6e, 0x38, 0x4c,
+	0xd7, 0x7b, 0x22, 0x5d, 0x3f, 0xa8, 0xe9, 0xba, 0x90, 0xb5, 0x67, 0xd3, 0x3c, 0x6b, 0x7f, 0x02,
+	0x00, 0x00, 0xff, 0xff, 0x5b, 0x3f, 0x8a, 0xca, 0xe8, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// KeywordPlanAdGroupServiceClient is the client API for KeywordPlanAdGroupService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type KeywordPlanAdGroupServiceClient interface {
+	// Returns the requested Keyword Plan ad group in full detail.
+	GetKeywordPlanAdGroup(ctx context.Context, in *GetKeywordPlanAdGroupRequest, opts ...grpc.CallOption) (*resources.KeywordPlanAdGroup, error)
+	// Creates, updates, or removes Keyword Plan ad groups. Operation statuses are
+	// returned.
+	MutateKeywordPlanAdGroups(ctx context.Context, in *MutateKeywordPlanAdGroupsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanAdGroupsResponse, error)
+}
+
+type keywordPlanAdGroupServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewKeywordPlanAdGroupServiceClient(cc grpc.ClientConnInterface) KeywordPlanAdGroupServiceClient {
+	return &keywordPlanAdGroupServiceClient{cc}
+}
+
+func (c *keywordPlanAdGroupServiceClient) GetKeywordPlanAdGroup(ctx context.Context, in *GetKeywordPlanAdGroupRequest, opts ...grpc.CallOption) (*resources.KeywordPlanAdGroup, error) {
+	out := new(resources.KeywordPlanAdGroup)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanAdGroupService/GetKeywordPlanAdGroup", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *keywordPlanAdGroupServiceClient) MutateKeywordPlanAdGroups(ctx context.Context, in *MutateKeywordPlanAdGroupsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanAdGroupsResponse, error) {
+	out := new(MutateKeywordPlanAdGroupsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanAdGroupService/MutateKeywordPlanAdGroups", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// KeywordPlanAdGroupServiceServer is the server API for KeywordPlanAdGroupService service.
+type KeywordPlanAdGroupServiceServer interface {
+	// Returns the requested Keyword Plan ad group in full detail.
+	GetKeywordPlanAdGroup(context.Context, *GetKeywordPlanAdGroupRequest) (*resources.KeywordPlanAdGroup, error)
+	// Creates, updates, or removes Keyword Plan ad groups. Operation statuses are
+	// returned.
+	MutateKeywordPlanAdGroups(context.Context, *MutateKeywordPlanAdGroupsRequest) (*MutateKeywordPlanAdGroupsResponse, error)
+}
+
+// UnimplementedKeywordPlanAdGroupServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedKeywordPlanAdGroupServiceServer struct {
+}
+
+func (*UnimplementedKeywordPlanAdGroupServiceServer) GetKeywordPlanAdGroup(ctx context.Context, req *GetKeywordPlanAdGroupRequest) (*resources.KeywordPlanAdGroup, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetKeywordPlanAdGroup not implemented")
+}
+func (*UnimplementedKeywordPlanAdGroupServiceServer) MutateKeywordPlanAdGroups(ctx context.Context, req *MutateKeywordPlanAdGroupsRequest) (*MutateKeywordPlanAdGroupsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateKeywordPlanAdGroups not implemented")
+}
+
+func RegisterKeywordPlanAdGroupServiceServer(s *grpc.Server, srv KeywordPlanAdGroupServiceServer) {
+	s.RegisterService(&_KeywordPlanAdGroupService_serviceDesc, srv)
+}
+
+func _KeywordPlanAdGroupService_GetKeywordPlanAdGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetKeywordPlanAdGroupRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanAdGroupServiceServer).GetKeywordPlanAdGroup(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanAdGroupService/GetKeywordPlanAdGroup",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanAdGroupServiceServer).GetKeywordPlanAdGroup(ctx, req.(*GetKeywordPlanAdGroupRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _KeywordPlanAdGroupService_MutateKeywordPlanAdGroups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateKeywordPlanAdGroupsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanAdGroupServiceServer).MutateKeywordPlanAdGroups(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanAdGroupService/MutateKeywordPlanAdGroups",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanAdGroupServiceServer).MutateKeywordPlanAdGroups(ctx, req.(*MutateKeywordPlanAdGroupsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _KeywordPlanAdGroupService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.KeywordPlanAdGroupService",
+	HandlerType: (*KeywordPlanAdGroupServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetKeywordPlanAdGroup",
+			Handler:    _KeywordPlanAdGroupService_GetKeywordPlanAdGroup_Handler,
+		},
+		{
+			MethodName: "MutateKeywordPlanAdGroups",
+			Handler:    _KeywordPlanAdGroupService_MutateKeywordPlanAdGroups_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/keyword_plan_ad_group_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/keyword_plan_campaign_service.pb.go b/googleapis/ads/googleads/v3/services/keyword_plan_campaign_service.pb.go
new file mode 100644
index 0000000..f6bb507
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/keyword_plan_campaign_service.pb.go
@@ -0,0 +1,533 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/keyword_plan_campaign_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [KeywordPlanCampaignService.GetKeywordPlanCampaign][google.ads.googleads.v3.services.KeywordPlanCampaignService.GetKeywordPlanCampaign].
+type GetKeywordPlanCampaignRequest struct {
+	// Required. The resource name of the Keyword Plan campaign to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetKeywordPlanCampaignRequest) Reset()         { *m = GetKeywordPlanCampaignRequest{} }
+func (m *GetKeywordPlanCampaignRequest) String() string { return proto.CompactTextString(m) }
+func (*GetKeywordPlanCampaignRequest) ProtoMessage()    {}
+func (*GetKeywordPlanCampaignRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f01e9912da6d3c86, []int{0}
+}
+
+func (m *GetKeywordPlanCampaignRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetKeywordPlanCampaignRequest.Unmarshal(m, b)
+}
+func (m *GetKeywordPlanCampaignRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetKeywordPlanCampaignRequest.Marshal(b, m, deterministic)
+}
+func (m *GetKeywordPlanCampaignRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetKeywordPlanCampaignRequest.Merge(m, src)
+}
+func (m *GetKeywordPlanCampaignRequest) XXX_Size() int {
+	return xxx_messageInfo_GetKeywordPlanCampaignRequest.Size(m)
+}
+func (m *GetKeywordPlanCampaignRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetKeywordPlanCampaignRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetKeywordPlanCampaignRequest proto.InternalMessageInfo
+
+func (m *GetKeywordPlanCampaignRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for
+// [KeywordPlanCampaignService.MutateKeywordPlanCampaigns][google.ads.googleads.v3.services.KeywordPlanCampaignService.MutateKeywordPlanCampaigns].
+type MutateKeywordPlanCampaignsRequest struct {
+	// Required. The ID of the customer whose Keyword Plan campaigns are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual Keyword Plan campaigns.
+	Operations []*KeywordPlanCampaignOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlanCampaignsRequest) Reset()         { *m = MutateKeywordPlanCampaignsRequest{} }
+func (m *MutateKeywordPlanCampaignsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanCampaignsRequest) ProtoMessage()    {}
+func (*MutateKeywordPlanCampaignsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f01e9912da6d3c86, []int{1}
+}
+
+func (m *MutateKeywordPlanCampaignsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanCampaignsRequest.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanCampaignsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanCampaignsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanCampaignsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanCampaignsRequest.Merge(m, src)
+}
+func (m *MutateKeywordPlanCampaignsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanCampaignsRequest.Size(m)
+}
+func (m *MutateKeywordPlanCampaignsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanCampaignsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanCampaignsRequest proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanCampaignsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateKeywordPlanCampaignsRequest) GetOperations() []*KeywordPlanCampaignOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlanCampaignsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateKeywordPlanCampaignsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a Keyword Plan campaign.
+type KeywordPlanCampaignOperation struct {
+	// The FieldMask that determines which resource fields are modified in an
+	// update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*KeywordPlanCampaignOperation_Create
+	//	*KeywordPlanCampaignOperation_Update
+	//	*KeywordPlanCampaignOperation_Remove
+	Operation            isKeywordPlanCampaignOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
+	XXX_unrecognized     []byte                                   `json:"-"`
+	XXX_sizecache        int32                                    `json:"-"`
+}
+
+func (m *KeywordPlanCampaignOperation) Reset()         { *m = KeywordPlanCampaignOperation{} }
+func (m *KeywordPlanCampaignOperation) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanCampaignOperation) ProtoMessage()    {}
+func (*KeywordPlanCampaignOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f01e9912da6d3c86, []int{2}
+}
+
+func (m *KeywordPlanCampaignOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanCampaignOperation.Unmarshal(m, b)
+}
+func (m *KeywordPlanCampaignOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanCampaignOperation.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanCampaignOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanCampaignOperation.Merge(m, src)
+}
+func (m *KeywordPlanCampaignOperation) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanCampaignOperation.Size(m)
+}
+func (m *KeywordPlanCampaignOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanCampaignOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanCampaignOperation proto.InternalMessageInfo
+
+func (m *KeywordPlanCampaignOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isKeywordPlanCampaignOperation_Operation interface {
+	isKeywordPlanCampaignOperation_Operation()
+}
+
+type KeywordPlanCampaignOperation_Create struct {
+	Create *resources.KeywordPlanCampaign `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type KeywordPlanCampaignOperation_Update struct {
+	Update *resources.KeywordPlanCampaign `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type KeywordPlanCampaignOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*KeywordPlanCampaignOperation_Create) isKeywordPlanCampaignOperation_Operation() {}
+
+func (*KeywordPlanCampaignOperation_Update) isKeywordPlanCampaignOperation_Operation() {}
+
+func (*KeywordPlanCampaignOperation_Remove) isKeywordPlanCampaignOperation_Operation() {}
+
+func (m *KeywordPlanCampaignOperation) GetOperation() isKeywordPlanCampaignOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *KeywordPlanCampaignOperation) GetCreate() *resources.KeywordPlanCampaign {
+	if x, ok := m.GetOperation().(*KeywordPlanCampaignOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *KeywordPlanCampaignOperation) GetUpdate() *resources.KeywordPlanCampaign {
+	if x, ok := m.GetOperation().(*KeywordPlanCampaignOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *KeywordPlanCampaignOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*KeywordPlanCampaignOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*KeywordPlanCampaignOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*KeywordPlanCampaignOperation_Create)(nil),
+		(*KeywordPlanCampaignOperation_Update)(nil),
+		(*KeywordPlanCampaignOperation_Remove)(nil),
+	}
+}
+
+// Response message for a Keyword Plan campaign mutate.
+type MutateKeywordPlanCampaignsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateKeywordPlanCampaignResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *MutateKeywordPlanCampaignsResponse) Reset()         { *m = MutateKeywordPlanCampaignsResponse{} }
+func (m *MutateKeywordPlanCampaignsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanCampaignsResponse) ProtoMessage()    {}
+func (*MutateKeywordPlanCampaignsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f01e9912da6d3c86, []int{3}
+}
+
+func (m *MutateKeywordPlanCampaignsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanCampaignsResponse.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanCampaignsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanCampaignsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanCampaignsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanCampaignsResponse.Merge(m, src)
+}
+func (m *MutateKeywordPlanCampaignsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanCampaignsResponse.Size(m)
+}
+func (m *MutateKeywordPlanCampaignsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanCampaignsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanCampaignsResponse proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanCampaignsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlanCampaignsResponse) GetResults() []*MutateKeywordPlanCampaignResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the Keyword Plan campaign mutate.
+type MutateKeywordPlanCampaignResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlanCampaignResult) Reset()         { *m = MutateKeywordPlanCampaignResult{} }
+func (m *MutateKeywordPlanCampaignResult) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanCampaignResult) ProtoMessage()    {}
+func (*MutateKeywordPlanCampaignResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f01e9912da6d3c86, []int{4}
+}
+
+func (m *MutateKeywordPlanCampaignResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanCampaignResult.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanCampaignResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanCampaignResult.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanCampaignResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanCampaignResult.Merge(m, src)
+}
+func (m *MutateKeywordPlanCampaignResult) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanCampaignResult.Size(m)
+}
+func (m *MutateKeywordPlanCampaignResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanCampaignResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanCampaignResult proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanCampaignResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetKeywordPlanCampaignRequest)(nil), "google.ads.googleads.v3.services.GetKeywordPlanCampaignRequest")
+	proto.RegisterType((*MutateKeywordPlanCampaignsRequest)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanCampaignsRequest")
+	proto.RegisterType((*KeywordPlanCampaignOperation)(nil), "google.ads.googleads.v3.services.KeywordPlanCampaignOperation")
+	proto.RegisterType((*MutateKeywordPlanCampaignsResponse)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanCampaignsResponse")
+	proto.RegisterType((*MutateKeywordPlanCampaignResult)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanCampaignResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/keyword_plan_campaign_service.proto", fileDescriptor_f01e9912da6d3c86)
+}
+
+var fileDescriptor_f01e9912da6d3c86 = []byte{
+	// 777 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0x4d, 0x4f, 0xdb, 0x4c,
+	0x10, 0xc7, 0x1f, 0x3b, 0x88, 0xe7, 0x61, 0x03, 0x4f, 0xa5, 0xad, 0x4a, 0x23, 0x97, 0x8a, 0xd4,
+	0x45, 0x6a, 0x14, 0x55, 0xb6, 0x94, 0x48, 0xa8, 0x35, 0x82, 0xca, 0x81, 0x06, 0x50, 0x05, 0x44,
+	0x46, 0xe2, 0xd0, 0xa6, 0xb2, 0x16, 0x7b, 0x49, 0x2d, 0x6c, 0xaf, 0xbb, 0x6b, 0xa7, 0x42, 0x88,
+	0x4b, 0x0f, 0x7c, 0x81, 0x7e, 0x83, 0x1e, 0x38, 0xf4, 0x9b, 0x94, 0x6b, 0x6f, 0x9c, 0x5a, 0xa9,
+	0xa7, 0x7e, 0x86, 0x1e, 0x2a, 0x7b, 0xbd, 0x79, 0x41, 0x09, 0x91, 0xca, 0x6d, 0xb2, 0xf3, 0xf7,
+	0x6f, 0x66, 0x67, 0x66, 0x27, 0x60, 0xa3, 0x43, 0x48, 0xc7, 0xc7, 0x3a, 0x72, 0x99, 0xce, 0xcd,
+	0xd4, 0xea, 0xd6, 0x75, 0x86, 0x69, 0xd7, 0x73, 0x30, 0xd3, 0x8f, 0xf1, 0xc9, 0x07, 0x42, 0x5d,
+	0x3b, 0xf2, 0x51, 0x68, 0x3b, 0x28, 0x88, 0x90, 0xd7, 0x09, 0xed, 0xdc, 0xad, 0x45, 0x94, 0xc4,
+	0x04, 0x96, 0xf9, 0xa7, 0x1a, 0x72, 0x99, 0xd6, 0xa3, 0x68, 0xdd, 0xba, 0x26, 0x28, 0xca, 0xea,
+	0xb8, 0x38, 0x14, 0x33, 0x92, 0xd0, 0xb1, 0x81, 0x78, 0x00, 0x65, 0x41, 0x7c, 0x1e, 0x79, 0x3a,
+	0x0a, 0x43, 0x12, 0xa3, 0xd8, 0x23, 0x21, 0xcb, 0xbd, 0xf7, 0x07, 0xbc, 0x8e, 0xef, 0xe1, 0x30,
+	0xce, 0x1d, 0x8b, 0x03, 0x8e, 0x23, 0x0f, 0xfb, 0xae, 0x7d, 0x88, 0xdf, 0xa1, 0xae, 0x47, 0x68,
+	0x2e, 0xc8, 0x13, 0xd7, 0xb3, 0x5f, 0x87, 0xc9, 0x51, 0xae, 0x0a, 0x10, 0x3b, 0xbe, 0xc6, 0xa6,
+	0x91, 0xa3, 0xb3, 0x18, 0xc5, 0x49, 0x1e, 0x54, 0xdd, 0x06, 0x0f, 0x37, 0x71, 0xfc, 0x8a, 0x27,
+	0xdd, 0xf2, 0x51, 0xb8, 0x9e, 0xa7, 0x6c, 0xe1, 0xf7, 0x09, 0x66, 0x31, 0xac, 0x80, 0x39, 0x71,
+	0x39, 0x3b, 0x44, 0x01, 0x2e, 0x49, 0x65, 0xa9, 0x32, 0xd3, 0x28, 0x7c, 0x37, 0x65, 0x6b, 0x56,
+	0x78, 0x76, 0x51, 0x80, 0xd5, 0xdf, 0x12, 0x78, 0xb4, 0x93, 0xc4, 0x28, 0xc6, 0x23, 0x70, 0x4c,
+	0xf0, 0x96, 0x40, 0xd1, 0x49, 0x58, 0x4c, 0x02, 0x4c, 0x6d, 0xcf, 0x1d, 0xa4, 0x01, 0x71, 0xbe,
+	0xed, 0x42, 0x07, 0x00, 0x12, 0x61, 0xca, 0xeb, 0x53, 0x92, 0xcb, 0x85, 0x4a, 0xb1, 0xb6, 0xa6,
+	0x4d, 0xea, 0x8f, 0x36, 0x22, 0xf0, 0x9e, 0xc0, 0xe4, 0x41, 0xfa, 0x58, 0xf8, 0x04, 0xdc, 0x89,
+	0x10, 0x8d, 0x3d, 0xe4, 0xdb, 0x47, 0xc8, 0xf3, 0x13, 0x8a, 0x4b, 0x85, 0xb2, 0x54, 0xf9, 0xcf,
+	0xfa, 0x3f, 0x3f, 0x6e, 0xf2, 0x53, 0xf8, 0x18, 0xcc, 0x75, 0x91, 0xef, 0xb9, 0x28, 0xc6, 0x36,
+	0x09, 0xfd, 0x93, 0xd2, 0x54, 0x26, 0x9b, 0x15, 0x87, 0x7b, 0xa1, 0x7f, 0xa2, 0x5e, 0xc8, 0x60,
+	0xe1, 0xa6, 0xf8, 0x70, 0x05, 0x14, 0x93, 0x28, 0x63, 0xa4, 0x8d, 0xc9, 0x18, 0xc5, 0x9a, 0x22,
+	0x2e, 0x25, 0x7a, 0xa7, 0x35, 0xd3, 0xde, 0xed, 0x20, 0x76, 0x6c, 0x01, 0x2e, 0x4f, 0x6d, 0xd8,
+	0x02, 0xd3, 0x0e, 0xc5, 0x28, 0xe6, 0xf5, 0x2f, 0xd6, 0x96, 0xc7, 0x16, 0xa3, 0x37, 0x8a, 0xa3,
+	0xaa, 0xb1, 0xf5, 0x8f, 0x95, 0x73, 0x52, 0x22, 0xe7, 0x97, 0xe4, 0xdb, 0x12, 0x39, 0x07, 0x96,
+	0xc0, 0x34, 0xc5, 0x01, 0xe9, 0xf2, 0x32, 0xce, 0xa4, 0x1e, 0xfe, 0xbb, 0x51, 0x04, 0x33, 0xbd,
+	0xba, 0xab, 0x5f, 0x25, 0xa0, 0xde, 0x34, 0x27, 0x2c, 0x22, 0x21, 0xc3, 0xb0, 0x09, 0xee, 0x5d,
+	0xeb, 0x8e, 0x8d, 0x29, 0x25, 0x34, 0x83, 0x17, 0x6b, 0x50, 0xa4, 0x4b, 0x23, 0x47, 0xdb, 0xcf,
+	0x46, 0xda, 0xba, 0x3b, 0xdc, 0xb7, 0x97, 0xa9, 0x1c, 0xbe, 0x01, 0xff, 0x52, 0xcc, 0x12, 0x3f,
+	0x16, 0x73, 0x64, 0x4e, 0x9e, 0xa3, 0xb1, 0xe9, 0x59, 0x19, 0xc9, 0x12, 0x44, 0xb5, 0x09, 0x16,
+	0x27, 0x68, 0xd3, 0xe1, 0x19, 0xf1, 0x80, 0x86, 0xdf, 0x4e, 0xed, 0x62, 0x0a, 0x28, 0x23, 0x10,
+	0xfb, 0x3c, 0x21, 0xf8, 0x43, 0x02, 0xf3, 0xa3, 0x9f, 0x29, 0x7c, 0x31, 0xf9, 0x36, 0x37, 0x3e,
+	0x70, 0xe5, 0x2f, 0xfb, 0xae, 0xee, 0x5e, 0x99, 0xc3, 0x17, 0xfb, 0xf8, 0xed, 0xe7, 0x27, 0xf9,
+	0x19, 0x5c, 0x4e, 0xf7, 0xe1, 0xe9, 0x90, 0x67, 0x55, 0xbc, 0x6c, 0xa6, 0x57, 0xc5, 0x82, 0x1c,
+	0x6a, 0xba, 0x5e, 0x3d, 0x83, 0xe7, 0x32, 0x50, 0xc6, 0x8f, 0x05, 0x5c, 0xbf, 0x45, 0xd7, 0xc4,
+	0xf2, 0x51, 0x36, 0x6e, 0x07, 0xe1, 0x93, 0xa9, 0xbe, 0xbd, 0x32, 0xe7, 0x07, 0x76, 0xd8, 0xd3,
+	0xfe, 0x4a, 0xc9, 0x4a, 0xb0, 0xa6, 0x3e, 0x4f, 0x4b, 0xd0, 0xbf, 0xf3, 0xe9, 0x80, 0x78, 0xb5,
+	0x7a, 0x36, 0xb2, 0x02, 0x46, 0x90, 0xc5, 0x35, 0xa4, 0xaa, 0xf2, 0xe0, 0xd2, 0x2c, 0xf5, 0x73,
+	0xcb, 0xad, 0xc8, 0x63, 0x9a, 0x43, 0x82, 0xc6, 0xb9, 0x0c, 0x96, 0x1c, 0x12, 0x4c, 0xbc, 0x47,
+	0x63, 0x71, 0xfc, 0x38, 0xb5, 0xd2, 0x55, 0xd3, 0x92, 0x5e, 0x6f, 0xe5, 0x90, 0x0e, 0xf1, 0x51,
+	0xd8, 0xd1, 0x08, 0xed, 0xe8, 0x1d, 0x1c, 0x66, 0x8b, 0x48, 0xef, 0x87, 0x1d, 0xff, 0xa7, 0xba,
+	0x22, 0x8c, 0xcf, 0x72, 0x61, 0xd3, 0x34, 0xbf, 0xc8, 0xe5, 0x4d, 0x0e, 0x34, 0x5d, 0xa6, 0x71,
+	0x33, 0xb5, 0x0e, 0xea, 0x5a, 0x1e, 0x98, 0x5d, 0x0a, 0x49, 0xdb, 0x74, 0x59, 0xbb, 0x27, 0x69,
+	0x1f, 0xd4, 0xdb, 0x42, 0xf2, 0x4b, 0x5e, 0xe2, 0xe7, 0x86, 0x61, 0xba, 0xcc, 0x30, 0x7a, 0x22,
+	0xc3, 0x38, 0xa8, 0x1b, 0x86, 0x90, 0x1d, 0x4e, 0x67, 0x79, 0xd6, 0xff, 0x04, 0x00, 0x00, 0xff,
+	0xff, 0xa9, 0xd4, 0x40, 0xb3, 0xfb, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// KeywordPlanCampaignServiceClient is the client API for KeywordPlanCampaignService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type KeywordPlanCampaignServiceClient interface {
+	// Returns the requested Keyword Plan campaign in full detail.
+	GetKeywordPlanCampaign(ctx context.Context, in *GetKeywordPlanCampaignRequest, opts ...grpc.CallOption) (*resources.KeywordPlanCampaign, error)
+	// Creates, updates, or removes Keyword Plan campaigns. Operation statuses are
+	// returned.
+	MutateKeywordPlanCampaigns(ctx context.Context, in *MutateKeywordPlanCampaignsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanCampaignsResponse, error)
+}
+
+type keywordPlanCampaignServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewKeywordPlanCampaignServiceClient(cc grpc.ClientConnInterface) KeywordPlanCampaignServiceClient {
+	return &keywordPlanCampaignServiceClient{cc}
+}
+
+func (c *keywordPlanCampaignServiceClient) GetKeywordPlanCampaign(ctx context.Context, in *GetKeywordPlanCampaignRequest, opts ...grpc.CallOption) (*resources.KeywordPlanCampaign, error) {
+	out := new(resources.KeywordPlanCampaign)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanCampaignService/GetKeywordPlanCampaign", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *keywordPlanCampaignServiceClient) MutateKeywordPlanCampaigns(ctx context.Context, in *MutateKeywordPlanCampaignsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanCampaignsResponse, error) {
+	out := new(MutateKeywordPlanCampaignsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanCampaignService/MutateKeywordPlanCampaigns", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// KeywordPlanCampaignServiceServer is the server API for KeywordPlanCampaignService service.
+type KeywordPlanCampaignServiceServer interface {
+	// Returns the requested Keyword Plan campaign in full detail.
+	GetKeywordPlanCampaign(context.Context, *GetKeywordPlanCampaignRequest) (*resources.KeywordPlanCampaign, error)
+	// Creates, updates, or removes Keyword Plan campaigns. Operation statuses are
+	// returned.
+	MutateKeywordPlanCampaigns(context.Context, *MutateKeywordPlanCampaignsRequest) (*MutateKeywordPlanCampaignsResponse, error)
+}
+
+// UnimplementedKeywordPlanCampaignServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedKeywordPlanCampaignServiceServer struct {
+}
+
+func (*UnimplementedKeywordPlanCampaignServiceServer) GetKeywordPlanCampaign(ctx context.Context, req *GetKeywordPlanCampaignRequest) (*resources.KeywordPlanCampaign, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetKeywordPlanCampaign not implemented")
+}
+func (*UnimplementedKeywordPlanCampaignServiceServer) MutateKeywordPlanCampaigns(ctx context.Context, req *MutateKeywordPlanCampaignsRequest) (*MutateKeywordPlanCampaignsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateKeywordPlanCampaigns not implemented")
+}
+
+func RegisterKeywordPlanCampaignServiceServer(s *grpc.Server, srv KeywordPlanCampaignServiceServer) {
+	s.RegisterService(&_KeywordPlanCampaignService_serviceDesc, srv)
+}
+
+func _KeywordPlanCampaignService_GetKeywordPlanCampaign_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetKeywordPlanCampaignRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanCampaignServiceServer).GetKeywordPlanCampaign(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanCampaignService/GetKeywordPlanCampaign",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanCampaignServiceServer).GetKeywordPlanCampaign(ctx, req.(*GetKeywordPlanCampaignRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _KeywordPlanCampaignService_MutateKeywordPlanCampaigns_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateKeywordPlanCampaignsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanCampaignServiceServer).MutateKeywordPlanCampaigns(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanCampaignService/MutateKeywordPlanCampaigns",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanCampaignServiceServer).MutateKeywordPlanCampaigns(ctx, req.(*MutateKeywordPlanCampaignsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _KeywordPlanCampaignService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.KeywordPlanCampaignService",
+	HandlerType: (*KeywordPlanCampaignServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetKeywordPlanCampaign",
+			Handler:    _KeywordPlanCampaignService_GetKeywordPlanCampaign_Handler,
+		},
+		{
+			MethodName: "MutateKeywordPlanCampaigns",
+			Handler:    _KeywordPlanCampaignService_MutateKeywordPlanCampaigns_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/keyword_plan_campaign_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/keyword_plan_idea_service.pb.go b/googleapis/ads/googleads/v3/services/keyword_plan_idea_service.pb.go
new file mode 100644
index 0000000..d90b88a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/keyword_plan_idea_service.pb.go
@@ -0,0 +1,538 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/keyword_plan_idea_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [KeywordIdeaService.GenerateKeywordIdeas][].
+type GenerateKeywordIdeasRequest struct {
+	// The ID of the customer with the recommendation.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// The resource name of the language to target.
+	// Required
+	Language *wrappers.StringValue `protobuf:"bytes,7,opt,name=language,proto3" json:"language,omitempty"`
+	// The resource names of the location to target.
+	// Max 10
+	GeoTargetConstants []*wrappers.StringValue `protobuf:"bytes,8,rep,name=geo_target_constants,json=geoTargetConstants,proto3" json:"geo_target_constants,omitempty"`
+	// Targeting network.
+	KeywordPlanNetwork enums.KeywordPlanNetworkEnum_KeywordPlanNetwork `protobuf:"varint,9,opt,name=keyword_plan_network,json=keywordPlanNetwork,proto3,enum=google.ads.googleads.v3.enums.KeywordPlanNetworkEnum_KeywordPlanNetwork" json:"keyword_plan_network,omitempty"`
+	// The type of seed to generate keyword ideas.
+	//
+	// Types that are valid to be assigned to Seed:
+	//	*GenerateKeywordIdeasRequest_KeywordAndUrlSeed
+	//	*GenerateKeywordIdeasRequest_KeywordSeed
+	//	*GenerateKeywordIdeasRequest_UrlSeed
+	Seed                 isGenerateKeywordIdeasRequest_Seed `protobuf_oneof:"seed"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
+}
+
+func (m *GenerateKeywordIdeasRequest) Reset()         { *m = GenerateKeywordIdeasRequest{} }
+func (m *GenerateKeywordIdeasRequest) String() string { return proto.CompactTextString(m) }
+func (*GenerateKeywordIdeasRequest) ProtoMessage()    {}
+func (*GenerateKeywordIdeasRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_26269aab04477620, []int{0}
+}
+
+func (m *GenerateKeywordIdeasRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateKeywordIdeasRequest.Unmarshal(m, b)
+}
+func (m *GenerateKeywordIdeasRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateKeywordIdeasRequest.Marshal(b, m, deterministic)
+}
+func (m *GenerateKeywordIdeasRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateKeywordIdeasRequest.Merge(m, src)
+}
+func (m *GenerateKeywordIdeasRequest) XXX_Size() int {
+	return xxx_messageInfo_GenerateKeywordIdeasRequest.Size(m)
+}
+func (m *GenerateKeywordIdeasRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateKeywordIdeasRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateKeywordIdeasRequest proto.InternalMessageInfo
+
+func (m *GenerateKeywordIdeasRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *GenerateKeywordIdeasRequest) GetLanguage() *wrappers.StringValue {
+	if m != nil {
+		return m.Language
+	}
+	return nil
+}
+
+func (m *GenerateKeywordIdeasRequest) GetGeoTargetConstants() []*wrappers.StringValue {
+	if m != nil {
+		return m.GeoTargetConstants
+	}
+	return nil
+}
+
+func (m *GenerateKeywordIdeasRequest) GetKeywordPlanNetwork() enums.KeywordPlanNetworkEnum_KeywordPlanNetwork {
+	if m != nil {
+		return m.KeywordPlanNetwork
+	}
+	return enums.KeywordPlanNetworkEnum_UNSPECIFIED
+}
+
+type isGenerateKeywordIdeasRequest_Seed interface {
+	isGenerateKeywordIdeasRequest_Seed()
+}
+
+type GenerateKeywordIdeasRequest_KeywordAndUrlSeed struct {
+	KeywordAndUrlSeed *KeywordAndUrlSeed `protobuf:"bytes,2,opt,name=keyword_and_url_seed,json=keywordAndUrlSeed,proto3,oneof"`
+}
+
+type GenerateKeywordIdeasRequest_KeywordSeed struct {
+	KeywordSeed *KeywordSeed `protobuf:"bytes,3,opt,name=keyword_seed,json=keywordSeed,proto3,oneof"`
+}
+
+type GenerateKeywordIdeasRequest_UrlSeed struct {
+	UrlSeed *UrlSeed `protobuf:"bytes,5,opt,name=url_seed,json=urlSeed,proto3,oneof"`
+}
+
+func (*GenerateKeywordIdeasRequest_KeywordAndUrlSeed) isGenerateKeywordIdeasRequest_Seed() {}
+
+func (*GenerateKeywordIdeasRequest_KeywordSeed) isGenerateKeywordIdeasRequest_Seed() {}
+
+func (*GenerateKeywordIdeasRequest_UrlSeed) isGenerateKeywordIdeasRequest_Seed() {}
+
+func (m *GenerateKeywordIdeasRequest) GetSeed() isGenerateKeywordIdeasRequest_Seed {
+	if m != nil {
+		return m.Seed
+	}
+	return nil
+}
+
+func (m *GenerateKeywordIdeasRequest) GetKeywordAndUrlSeed() *KeywordAndUrlSeed {
+	if x, ok := m.GetSeed().(*GenerateKeywordIdeasRequest_KeywordAndUrlSeed); ok {
+		return x.KeywordAndUrlSeed
+	}
+	return nil
+}
+
+func (m *GenerateKeywordIdeasRequest) GetKeywordSeed() *KeywordSeed {
+	if x, ok := m.GetSeed().(*GenerateKeywordIdeasRequest_KeywordSeed); ok {
+		return x.KeywordSeed
+	}
+	return nil
+}
+
+func (m *GenerateKeywordIdeasRequest) GetUrlSeed() *UrlSeed {
+	if x, ok := m.GetSeed().(*GenerateKeywordIdeasRequest_UrlSeed); ok {
+		return x.UrlSeed
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*GenerateKeywordIdeasRequest) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*GenerateKeywordIdeasRequest_KeywordAndUrlSeed)(nil),
+		(*GenerateKeywordIdeasRequest_KeywordSeed)(nil),
+		(*GenerateKeywordIdeasRequest_UrlSeed)(nil),
+	}
+}
+
+// Keyword And Url Seed
+type KeywordAndUrlSeed struct {
+	// The URL to crawl in order to generate keyword ideas.
+	Url *wrappers.StringValue `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
+	// Requires at least one keyword.
+	Keywords             []*wrappers.StringValue `protobuf:"bytes,2,rep,name=keywords,proto3" json:"keywords,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *KeywordAndUrlSeed) Reset()         { *m = KeywordAndUrlSeed{} }
+func (m *KeywordAndUrlSeed) String() string { return proto.CompactTextString(m) }
+func (*KeywordAndUrlSeed) ProtoMessage()    {}
+func (*KeywordAndUrlSeed) Descriptor() ([]byte, []int) {
+	return fileDescriptor_26269aab04477620, []int{1}
+}
+
+func (m *KeywordAndUrlSeed) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordAndUrlSeed.Unmarshal(m, b)
+}
+func (m *KeywordAndUrlSeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordAndUrlSeed.Marshal(b, m, deterministic)
+}
+func (m *KeywordAndUrlSeed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordAndUrlSeed.Merge(m, src)
+}
+func (m *KeywordAndUrlSeed) XXX_Size() int {
+	return xxx_messageInfo_KeywordAndUrlSeed.Size(m)
+}
+func (m *KeywordAndUrlSeed) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordAndUrlSeed.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordAndUrlSeed proto.InternalMessageInfo
+
+func (m *KeywordAndUrlSeed) GetUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.Url
+	}
+	return nil
+}
+
+func (m *KeywordAndUrlSeed) GetKeywords() []*wrappers.StringValue {
+	if m != nil {
+		return m.Keywords
+	}
+	return nil
+}
+
+// Keyword Seed
+type KeywordSeed struct {
+	// Requires at least one keyword.
+	Keywords             []*wrappers.StringValue `protobuf:"bytes,1,rep,name=keywords,proto3" json:"keywords,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *KeywordSeed) Reset()         { *m = KeywordSeed{} }
+func (m *KeywordSeed) String() string { return proto.CompactTextString(m) }
+func (*KeywordSeed) ProtoMessage()    {}
+func (*KeywordSeed) Descriptor() ([]byte, []int) {
+	return fileDescriptor_26269aab04477620, []int{2}
+}
+
+func (m *KeywordSeed) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordSeed.Unmarshal(m, b)
+}
+func (m *KeywordSeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordSeed.Marshal(b, m, deterministic)
+}
+func (m *KeywordSeed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordSeed.Merge(m, src)
+}
+func (m *KeywordSeed) XXX_Size() int {
+	return xxx_messageInfo_KeywordSeed.Size(m)
+}
+func (m *KeywordSeed) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordSeed.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordSeed proto.InternalMessageInfo
+
+func (m *KeywordSeed) GetKeywords() []*wrappers.StringValue {
+	if m != nil {
+		return m.Keywords
+	}
+	return nil
+}
+
+// Url Seed
+type UrlSeed struct {
+	// The URL to crawl in order to generate keyword ideas.
+	Url                  *wrappers.StringValue `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UrlSeed) Reset()         { *m = UrlSeed{} }
+func (m *UrlSeed) String() string { return proto.CompactTextString(m) }
+func (*UrlSeed) ProtoMessage()    {}
+func (*UrlSeed) Descriptor() ([]byte, []int) {
+	return fileDescriptor_26269aab04477620, []int{3}
+}
+
+func (m *UrlSeed) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UrlSeed.Unmarshal(m, b)
+}
+func (m *UrlSeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UrlSeed.Marshal(b, m, deterministic)
+}
+func (m *UrlSeed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UrlSeed.Merge(m, src)
+}
+func (m *UrlSeed) XXX_Size() int {
+	return xxx_messageInfo_UrlSeed.Size(m)
+}
+func (m *UrlSeed) XXX_DiscardUnknown() {
+	xxx_messageInfo_UrlSeed.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UrlSeed proto.InternalMessageInfo
+
+func (m *UrlSeed) GetUrl() *wrappers.StringValue {
+	if m != nil {
+		return m.Url
+	}
+	return nil
+}
+
+// Response message for [KeywordIdeaService.GenerateKeywordIdeas][].
+type GenerateKeywordIdeaResponse struct {
+	// Results of generating keyword ideas.
+	Results              []*GenerateKeywordIdeaResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *GenerateKeywordIdeaResponse) Reset()         { *m = GenerateKeywordIdeaResponse{} }
+func (m *GenerateKeywordIdeaResponse) String() string { return proto.CompactTextString(m) }
+func (*GenerateKeywordIdeaResponse) ProtoMessage()    {}
+func (*GenerateKeywordIdeaResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_26269aab04477620, []int{4}
+}
+
+func (m *GenerateKeywordIdeaResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateKeywordIdeaResponse.Unmarshal(m, b)
+}
+func (m *GenerateKeywordIdeaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateKeywordIdeaResponse.Marshal(b, m, deterministic)
+}
+func (m *GenerateKeywordIdeaResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateKeywordIdeaResponse.Merge(m, src)
+}
+func (m *GenerateKeywordIdeaResponse) XXX_Size() int {
+	return xxx_messageInfo_GenerateKeywordIdeaResponse.Size(m)
+}
+func (m *GenerateKeywordIdeaResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateKeywordIdeaResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateKeywordIdeaResponse proto.InternalMessageInfo
+
+func (m *GenerateKeywordIdeaResponse) GetResults() []*GenerateKeywordIdeaResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result of generating keyword ideas.
+type GenerateKeywordIdeaResult struct {
+	// Text of the keyword idea.
+	// As in Keyword Plan historical metrics, this text may not be an actual
+	// keyword, but the canonical form of multiple keywords.
+	// See KeywordPlanKeywordHistoricalMetrics message in KeywordPlanService.
+	Text *wrappers.StringValue `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"`
+	// The historical metrics for the keyword
+	KeywordIdeaMetrics   *common.KeywordPlanHistoricalMetrics `protobuf:"bytes,3,opt,name=keyword_idea_metrics,json=keywordIdeaMetrics,proto3" json:"keyword_idea_metrics,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
+	XXX_unrecognized     []byte                               `json:"-"`
+	XXX_sizecache        int32                                `json:"-"`
+}
+
+func (m *GenerateKeywordIdeaResult) Reset()         { *m = GenerateKeywordIdeaResult{} }
+func (m *GenerateKeywordIdeaResult) String() string { return proto.CompactTextString(m) }
+func (*GenerateKeywordIdeaResult) ProtoMessage()    {}
+func (*GenerateKeywordIdeaResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_26269aab04477620, []int{5}
+}
+
+func (m *GenerateKeywordIdeaResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateKeywordIdeaResult.Unmarshal(m, b)
+}
+func (m *GenerateKeywordIdeaResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateKeywordIdeaResult.Marshal(b, m, deterministic)
+}
+func (m *GenerateKeywordIdeaResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateKeywordIdeaResult.Merge(m, src)
+}
+func (m *GenerateKeywordIdeaResult) XXX_Size() int {
+	return xxx_messageInfo_GenerateKeywordIdeaResult.Size(m)
+}
+func (m *GenerateKeywordIdeaResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateKeywordIdeaResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateKeywordIdeaResult proto.InternalMessageInfo
+
+func (m *GenerateKeywordIdeaResult) GetText() *wrappers.StringValue {
+	if m != nil {
+		return m.Text
+	}
+	return nil
+}
+
+func (m *GenerateKeywordIdeaResult) GetKeywordIdeaMetrics() *common.KeywordPlanHistoricalMetrics {
+	if m != nil {
+		return m.KeywordIdeaMetrics
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*GenerateKeywordIdeasRequest)(nil), "google.ads.googleads.v3.services.GenerateKeywordIdeasRequest")
+	proto.RegisterType((*KeywordAndUrlSeed)(nil), "google.ads.googleads.v3.services.KeywordAndUrlSeed")
+	proto.RegisterType((*KeywordSeed)(nil), "google.ads.googleads.v3.services.KeywordSeed")
+	proto.RegisterType((*UrlSeed)(nil), "google.ads.googleads.v3.services.UrlSeed")
+	proto.RegisterType((*GenerateKeywordIdeaResponse)(nil), "google.ads.googleads.v3.services.GenerateKeywordIdeaResponse")
+	proto.RegisterType((*GenerateKeywordIdeaResult)(nil), "google.ads.googleads.v3.services.GenerateKeywordIdeaResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/keyword_plan_idea_service.proto", fileDescriptor_26269aab04477620)
+}
+
+var fileDescriptor_26269aab04477620 = []byte{
+	// 748 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4f, 0x4f, 0xdb, 0x48,
+	0x14, 0x5f, 0x3b, 0x2c, 0x81, 0xc9, 0x6a, 0x25, 0x46, 0x68, 0x37, 0x0b, 0x68, 0x37, 0x8a, 0x38,
+	0xb0, 0x48, 0xb5, 0xab, 0xe4, 0x50, 0x6a, 0x1a, 0xa9, 0xa1, 0x6a, 0x13, 0x54, 0x15, 0x21, 0x53,
+	0x72, 0xa8, 0x22, 0x59, 0x83, 0xfd, 0xb0, 0xac, 0x38, 0x33, 0xe9, 0xcc, 0x18, 0xfa, 0x47, 0x5c,
+	0xb8, 0xf6, 0xd8, 0x6f, 0xd0, 0x63, 0xbf, 0x43, 0xbf, 0x00, 0xa7, 0x4a, 0x7c, 0x85, 0x9e, 0xfa,
+	0x29, 0x2a, 0xdb, 0x33, 0x49, 0x80, 0xa4, 0xa1, 0xdc, 0x9e, 0xdf, 0xfb, 0xbd, 0xdf, 0xfb, 0xcd,
+	0x9b, 0x37, 0xcf, 0xe8, 0x71, 0xc8, 0x58, 0x18, 0x83, 0x4d, 0x02, 0x61, 0xe7, 0x66, 0x6a, 0x9d,
+	0xd4, 0x6d, 0x01, 0xfc, 0x24, 0xf2, 0x41, 0xd8, 0x3d, 0x78, 0x7b, 0xca, 0x78, 0xe0, 0x0d, 0x62,
+	0x42, 0xbd, 0x28, 0x00, 0xe2, 0xa9, 0x90, 0x35, 0xe0, 0x4c, 0x32, 0x5c, 0xc9, 0xd3, 0x2c, 0x12,
+	0x08, 0x6b, 0xc8, 0x60, 0x9d, 0xd4, 0x2d, 0xcd, 0xb0, 0xb2, 0x35, 0xad, 0x86, 0xcf, 0xfa, 0x7d,
+	0x46, 0xaf, 0x56, 0xc8, 0x7d, 0x39, 0xf7, 0xf4, 0x4c, 0xa0, 0x49, 0xff, 0x9a, 0x34, 0x0a, 0xf2,
+	0x94, 0xf1, 0x9e, 0xca, 0x5c, 0xd3, 0x99, 0x83, 0xc8, 0x26, 0x94, 0x32, 0x49, 0x64, 0xc4, 0xa8,
+	0x50, 0xd1, 0x7f, 0x55, 0x34, 0xfb, 0x3a, 0x4a, 0x8e, 0xed, 0x53, 0x4e, 0x06, 0x03, 0xe0, 0x3a,
+	0xfe, 0xf7, 0x58, 0xb6, 0x1f, 0x47, 0x40, 0x65, 0x1e, 0xa8, 0x7e, 0x9d, 0x43, 0xab, 0x2d, 0xa0,
+	0xc0, 0x89, 0x84, 0xe7, 0x79, 0xf5, 0xdd, 0x00, 0x88, 0x70, 0xe1, 0x75, 0x02, 0x42, 0xe2, 0xff,
+	0x50, 0xc9, 0x4f, 0x84, 0x64, 0x7d, 0xe0, 0x5e, 0x14, 0x94, 0x8d, 0x8a, 0xb1, 0xb1, 0xe8, 0x22,
+	0xed, 0xda, 0x0d, 0xf0, 0x16, 0x5a, 0x88, 0x09, 0x0d, 0x13, 0x12, 0x42, 0xb9, 0x58, 0x31, 0x36,
+	0x4a, 0xb5, 0x35, 0xd5, 0x35, 0x4b, 0x8b, 0xb1, 0x0e, 0x24, 0x8f, 0x68, 0xd8, 0x21, 0x71, 0x02,
+	0xee, 0x10, 0x8d, 0xf7, 0xd0, 0x72, 0x08, 0xcc, 0x93, 0x84, 0x87, 0x20, 0x3d, 0x9f, 0x51, 0x21,
+	0x09, 0x95, 0xa2, 0xbc, 0x50, 0x29, 0xcc, 0x64, 0xc1, 0x21, 0xb0, 0x97, 0x59, 0xe2, 0x13, 0x9d,
+	0x87, 0xdf, 0xa1, 0xe5, 0x49, 0xfd, 0x2b, 0x2f, 0x56, 0x8c, 0x8d, 0x3f, 0x6b, 0x6d, 0x6b, 0xda,
+	0xb5, 0x66, 0xad, 0xb7, 0xd4, 0xe1, 0xf7, 0x63, 0x42, 0xf7, 0xf2, 0xc4, 0xa7, 0x34, 0xe9, 0x4f,
+	0x70, 0xbb, 0xb8, 0x77, 0xc3, 0x87, 0x8f, 0x47, 0xb5, 0x09, 0x0d, 0xbc, 0x84, 0xc7, 0x9e, 0x00,
+	0x08, 0xca, 0x66, 0xd6, 0x91, 0xba, 0x35, 0x6b, 0xa4, 0x74, 0x9d, 0x26, 0x0d, 0x0e, 0x79, 0x7c,
+	0x00, 0x10, 0xb4, 0x7f, 0x73, 0x97, 0x7a, 0xd7, 0x9d, 0xd8, 0x45, 0x7f, 0xe8, 0x3a, 0x19, 0x7f,
+	0x21, 0xe3, 0xbf, 0x77, 0x6b, 0x7e, 0xc5, 0x5c, 0xea, 0x8d, 0x3e, 0xf1, 0x33, 0xb4, 0x30, 0xd4,
+	0xfb, 0x7b, 0xc6, 0xf7, 0xff, 0x6c, 0xbe, 0x91, 0xca, 0x62, 0x92, 0x9b, 0x3b, 0xf3, 0x68, 0x2e,
+	0xe5, 0xa8, 0x9e, 0xa1, 0xa5, 0x1b, 0xa7, 0xc1, 0x16, 0x2a, 0x24, 0x3c, 0xce, 0xe6, 0x67, 0xd6,
+	0xdd, 0xa6, 0xc0, 0x74, 0xac, 0x94, 0x46, 0x51, 0x36, 0x6f, 0x31, 0x10, 0x43, 0x74, 0xb5, 0x85,
+	0x4a, 0x63, 0x87, 0xbd, 0x42, 0x64, 0xfc, 0x12, 0xd1, 0x43, 0x54, 0xbc, 0xa3, 0xfa, 0xaa, 0x9c,
+	0xf8, 0xa8, 0x5c, 0x10, 0x03, 0x46, 0x05, 0xe0, 0x43, 0x54, 0xe4, 0x20, 0x92, 0x58, 0x6a, 0x49,
+	0xdb, 0xb3, 0x1b, 0x3e, 0x99, 0x2f, 0x89, 0xa5, 0xab, 0xb9, 0xaa, 0x5f, 0x0c, 0xf4, 0xcf, 0x54,
+	0x18, 0xbe, 0x8f, 0xe6, 0x24, 0xbc, 0x91, 0x6a, 0x24, 0x7f, 0x7e, 0x88, 0x0c, 0x89, 0xe9, 0x68,
+	0xa8, 0xb3, 0x35, 0xd9, 0x07, 0xc9, 0x23, 0x5f, 0xa8, 0xa1, 0x7b, 0x34, 0x55, 0xb3, 0xda, 0x78,
+	0x63, 0x4f, 0xa7, 0x1d, 0x09, 0xc9, 0x78, 0xe4, 0x93, 0xf8, 0x45, 0xce, 0x31, 0x7c, 0x44, 0xa9,
+	0x40, 0xe5, 0xab, 0x7d, 0x30, 0xd1, 0x5f, 0x63, 0x49, 0x69, 0xe8, 0x20, 0x3f, 0x3e, 0xbe, 0x34,
+	0xd0, 0xf2, 0xa4, 0x35, 0x85, 0x1b, 0x77, 0xea, 0x9c, 0x5e, 0x6f, 0x2b, 0x8d, 0xbb, 0x36, 0x3e,
+	0xbb, 0xc8, 0x6a, 0xe3, 0xfc, 0xf2, 0xdb, 0x47, 0xf3, 0x41, 0xb5, 0x96, 0x2d, 0x7f, 0xb5, 0x14,
+	0x85, 0xfd, 0x7e, 0x6c, 0x65, 0x36, 0x36, 0xcf, 0x9c, 0x70, 0x82, 0x02, 0xc7, 0xd8, 0x5c, 0x59,
+	0xbd, 0x68, 0x96, 0x47, 0x45, 0x95, 0x35, 0x88, 0x44, 0xda, 0xc1, 0x9d, 0x73, 0x13, 0xad, 0xfb,
+	0xac, 0x3f, 0x53, 0xe0, 0xce, 0xea, 0xe4, 0x9e, 0xed, 0xa7, 0x17, 0xbb, 0x6f, 0xbc, 0x6a, 0x2b,
+	0x82, 0x90, 0xa5, 0x9b, 0xd7, 0x62, 0x3c, 0xb4, 0x43, 0xa0, 0xd9, 0xb5, 0xdb, 0xa3, 0x92, 0xd3,
+	0xff, 0x97, 0xdb, 0xda, 0xf8, 0x64, 0x16, 0x5a, 0xcd, 0xe6, 0x67, 0xb3, 0xd2, 0xca, 0x09, 0x9b,
+	0x81, 0xb0, 0x72, 0x33, 0xb5, 0x3a, 0x75, 0x4b, 0x15, 0x16, 0x17, 0x1a, 0xd2, 0x6d, 0x06, 0xa2,
+	0x3b, 0x84, 0x74, 0x3b, 0xf5, 0xae, 0x86, 0x7c, 0x37, 0xd7, 0x73, 0xbf, 0xe3, 0x34, 0x03, 0xe1,
+	0x38, 0x43, 0x90, 0xe3, 0x74, 0xea, 0x8e, 0xa3, 0x61, 0x47, 0xf3, 0x99, 0xce, 0xfa, 0x8f, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0x97, 0x74, 0x32, 0x68, 0xd6, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// KeywordPlanIdeaServiceClient is the client API for KeywordPlanIdeaService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type KeywordPlanIdeaServiceClient interface {
+	// Returns a list of keyword ideas.
+	GenerateKeywordIdeas(ctx context.Context, in *GenerateKeywordIdeasRequest, opts ...grpc.CallOption) (*GenerateKeywordIdeaResponse, error)
+}
+
+type keywordPlanIdeaServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewKeywordPlanIdeaServiceClient(cc grpc.ClientConnInterface) KeywordPlanIdeaServiceClient {
+	return &keywordPlanIdeaServiceClient{cc}
+}
+
+func (c *keywordPlanIdeaServiceClient) GenerateKeywordIdeas(ctx context.Context, in *GenerateKeywordIdeasRequest, opts ...grpc.CallOption) (*GenerateKeywordIdeaResponse, error) {
+	out := new(GenerateKeywordIdeaResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanIdeaService/GenerateKeywordIdeas", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// KeywordPlanIdeaServiceServer is the server API for KeywordPlanIdeaService service.
+type KeywordPlanIdeaServiceServer interface {
+	// Returns a list of keyword ideas.
+	GenerateKeywordIdeas(context.Context, *GenerateKeywordIdeasRequest) (*GenerateKeywordIdeaResponse, error)
+}
+
+// UnimplementedKeywordPlanIdeaServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedKeywordPlanIdeaServiceServer struct {
+}
+
+func (*UnimplementedKeywordPlanIdeaServiceServer) GenerateKeywordIdeas(ctx context.Context, req *GenerateKeywordIdeasRequest) (*GenerateKeywordIdeaResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GenerateKeywordIdeas not implemented")
+}
+
+func RegisterKeywordPlanIdeaServiceServer(s *grpc.Server, srv KeywordPlanIdeaServiceServer) {
+	s.RegisterService(&_KeywordPlanIdeaService_serviceDesc, srv)
+}
+
+func _KeywordPlanIdeaService_GenerateKeywordIdeas_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GenerateKeywordIdeasRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanIdeaServiceServer).GenerateKeywordIdeas(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanIdeaService/GenerateKeywordIdeas",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanIdeaServiceServer).GenerateKeywordIdeas(ctx, req.(*GenerateKeywordIdeasRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _KeywordPlanIdeaService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.KeywordPlanIdeaService",
+	HandlerType: (*KeywordPlanIdeaServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GenerateKeywordIdeas",
+			Handler:    _KeywordPlanIdeaService_GenerateKeywordIdeas_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/keyword_plan_idea_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/keyword_plan_keyword_service.pb.go b/googleapis/ads/googleads/v3/services/keyword_plan_keyword_service.pb.go
new file mode 100644
index 0000000..ef76080
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/keyword_plan_keyword_service.pb.go
@@ -0,0 +1,532 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/keyword_plan_keyword_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [KeywordPlanKeywordService.GetKeywordPlanKeyword][google.ads.googleads.v3.services.KeywordPlanKeywordService.GetKeywordPlanKeyword].
+type GetKeywordPlanKeywordRequest struct {
+	// Required. The resource name of the ad group keyword to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetKeywordPlanKeywordRequest) Reset()         { *m = GetKeywordPlanKeywordRequest{} }
+func (m *GetKeywordPlanKeywordRequest) String() string { return proto.CompactTextString(m) }
+func (*GetKeywordPlanKeywordRequest) ProtoMessage()    {}
+func (*GetKeywordPlanKeywordRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0d3bbba4938b674a, []int{0}
+}
+
+func (m *GetKeywordPlanKeywordRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetKeywordPlanKeywordRequest.Unmarshal(m, b)
+}
+func (m *GetKeywordPlanKeywordRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetKeywordPlanKeywordRequest.Marshal(b, m, deterministic)
+}
+func (m *GetKeywordPlanKeywordRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetKeywordPlanKeywordRequest.Merge(m, src)
+}
+func (m *GetKeywordPlanKeywordRequest) XXX_Size() int {
+	return xxx_messageInfo_GetKeywordPlanKeywordRequest.Size(m)
+}
+func (m *GetKeywordPlanKeywordRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetKeywordPlanKeywordRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetKeywordPlanKeywordRequest proto.InternalMessageInfo
+
+func (m *GetKeywordPlanKeywordRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [KeywordPlanKeywordService.MutateKeywordPlanKeywords][google.ads.googleads.v3.services.KeywordPlanKeywordService.MutateKeywordPlanKeywords].
+type MutateKeywordPlanKeywordsRequest struct {
+	// Required. The ID of the customer whose Keyword Plan keywords are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual Keyword Plan keywords.
+	Operations []*KeywordPlanKeywordOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlanKeywordsRequest) Reset()         { *m = MutateKeywordPlanKeywordsRequest{} }
+func (m *MutateKeywordPlanKeywordsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanKeywordsRequest) ProtoMessage()    {}
+func (*MutateKeywordPlanKeywordsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0d3bbba4938b674a, []int{1}
+}
+
+func (m *MutateKeywordPlanKeywordsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanKeywordsRequest.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanKeywordsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanKeywordsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanKeywordsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanKeywordsRequest.Merge(m, src)
+}
+func (m *MutateKeywordPlanKeywordsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanKeywordsRequest.Size(m)
+}
+func (m *MutateKeywordPlanKeywordsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanKeywordsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanKeywordsRequest proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanKeywordsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateKeywordPlanKeywordsRequest) GetOperations() []*KeywordPlanKeywordOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlanKeywordsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateKeywordPlanKeywordsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a Keyword Plan keyword.
+type KeywordPlanKeywordOperation struct {
+	// The FieldMask that determines which resource fields are modified in an
+	// update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*KeywordPlanKeywordOperation_Create
+	//	*KeywordPlanKeywordOperation_Update
+	//	*KeywordPlanKeywordOperation_Remove
+	Operation            isKeywordPlanKeywordOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *KeywordPlanKeywordOperation) Reset()         { *m = KeywordPlanKeywordOperation{} }
+func (m *KeywordPlanKeywordOperation) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanKeywordOperation) ProtoMessage()    {}
+func (*KeywordPlanKeywordOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0d3bbba4938b674a, []int{2}
+}
+
+func (m *KeywordPlanKeywordOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanKeywordOperation.Unmarshal(m, b)
+}
+func (m *KeywordPlanKeywordOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanKeywordOperation.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanKeywordOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanKeywordOperation.Merge(m, src)
+}
+func (m *KeywordPlanKeywordOperation) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanKeywordOperation.Size(m)
+}
+func (m *KeywordPlanKeywordOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanKeywordOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanKeywordOperation proto.InternalMessageInfo
+
+func (m *KeywordPlanKeywordOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isKeywordPlanKeywordOperation_Operation interface {
+	isKeywordPlanKeywordOperation_Operation()
+}
+
+type KeywordPlanKeywordOperation_Create struct {
+	Create *resources.KeywordPlanKeyword `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type KeywordPlanKeywordOperation_Update struct {
+	Update *resources.KeywordPlanKeyword `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type KeywordPlanKeywordOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*KeywordPlanKeywordOperation_Create) isKeywordPlanKeywordOperation_Operation() {}
+
+func (*KeywordPlanKeywordOperation_Update) isKeywordPlanKeywordOperation_Operation() {}
+
+func (*KeywordPlanKeywordOperation_Remove) isKeywordPlanKeywordOperation_Operation() {}
+
+func (m *KeywordPlanKeywordOperation) GetOperation() isKeywordPlanKeywordOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *KeywordPlanKeywordOperation) GetCreate() *resources.KeywordPlanKeyword {
+	if x, ok := m.GetOperation().(*KeywordPlanKeywordOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *KeywordPlanKeywordOperation) GetUpdate() *resources.KeywordPlanKeyword {
+	if x, ok := m.GetOperation().(*KeywordPlanKeywordOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *KeywordPlanKeywordOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*KeywordPlanKeywordOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*KeywordPlanKeywordOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*KeywordPlanKeywordOperation_Create)(nil),
+		(*KeywordPlanKeywordOperation_Update)(nil),
+		(*KeywordPlanKeywordOperation_Remove)(nil),
+	}
+}
+
+// Response message for a Keyword Plan keyword mutate.
+type MutateKeywordPlanKeywordsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateKeywordPlanKeywordResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *MutateKeywordPlanKeywordsResponse) Reset()         { *m = MutateKeywordPlanKeywordsResponse{} }
+func (m *MutateKeywordPlanKeywordsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanKeywordsResponse) ProtoMessage()    {}
+func (*MutateKeywordPlanKeywordsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0d3bbba4938b674a, []int{3}
+}
+
+func (m *MutateKeywordPlanKeywordsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanKeywordsResponse.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanKeywordsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanKeywordsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanKeywordsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanKeywordsResponse.Merge(m, src)
+}
+func (m *MutateKeywordPlanKeywordsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanKeywordsResponse.Size(m)
+}
+func (m *MutateKeywordPlanKeywordsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanKeywordsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanKeywordsResponse proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanKeywordsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlanKeywordsResponse) GetResults() []*MutateKeywordPlanKeywordResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the Keyword Plan keyword mutate.
+type MutateKeywordPlanKeywordResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlanKeywordResult) Reset()         { *m = MutateKeywordPlanKeywordResult{} }
+func (m *MutateKeywordPlanKeywordResult) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanKeywordResult) ProtoMessage()    {}
+func (*MutateKeywordPlanKeywordResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0d3bbba4938b674a, []int{4}
+}
+
+func (m *MutateKeywordPlanKeywordResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanKeywordResult.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanKeywordResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanKeywordResult.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanKeywordResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanKeywordResult.Merge(m, src)
+}
+func (m *MutateKeywordPlanKeywordResult) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanKeywordResult.Size(m)
+}
+func (m *MutateKeywordPlanKeywordResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanKeywordResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanKeywordResult proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanKeywordResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetKeywordPlanKeywordRequest)(nil), "google.ads.googleads.v3.services.GetKeywordPlanKeywordRequest")
+	proto.RegisterType((*MutateKeywordPlanKeywordsRequest)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanKeywordsRequest")
+	proto.RegisterType((*KeywordPlanKeywordOperation)(nil), "google.ads.googleads.v3.services.KeywordPlanKeywordOperation")
+	proto.RegisterType((*MutateKeywordPlanKeywordsResponse)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanKeywordsResponse")
+	proto.RegisterType((*MutateKeywordPlanKeywordResult)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanKeywordResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/keyword_plan_keyword_service.proto", fileDescriptor_0d3bbba4938b674a)
+}
+
+var fileDescriptor_0d3bbba4938b674a = []byte{
+	// 771 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0x4d, 0x6b, 0xdb, 0x4c,
+	0x10, 0xc7, 0x1f, 0xc9, 0x21, 0xcf, 0x93, 0x75, 0xf2, 0x14, 0xb6, 0xa4, 0x75, 0x9c, 0x90, 0xba,
+	0x6a, 0xa0, 0xc6, 0x14, 0x09, 0x6c, 0x42, 0x8b, 0x52, 0x97, 0xca, 0x21, 0x2f, 0xa5, 0xa4, 0x09,
+	0x0a, 0xe4, 0x10, 0x0c, 0x62, 0x2d, 0x6d, 0x5c, 0x11, 0x49, 0xab, 0xee, 0x4a, 0x2e, 0x21, 0xe4,
+	0x12, 0xe8, 0x27, 0xe8, 0xb9, 0x97, 0xf6, 0xd6, 0x2f, 0x52, 0xc8, 0xb5, 0xb7, 0x40, 0xa1, 0x87,
+	0x9e, 0xfa, 0x11, 0x7a, 0x2a, 0xd2, 0x6a, 0xfd, 0x92, 0xf8, 0x05, 0x92, 0xdb, 0x68, 0xe7, 0xef,
+	0xdf, 0xcc, 0xec, 0xcc, 0x8e, 0xc1, 0x7a, 0x9b, 0x90, 0xb6, 0x87, 0x35, 0xe4, 0x30, 0x8d, 0x9b,
+	0x89, 0xd5, 0xa9, 0x69, 0x0c, 0xd3, 0x8e, 0x6b, 0x63, 0xa6, 0x1d, 0xe3, 0x93, 0xf7, 0x84, 0x3a,
+	0x56, 0xe8, 0xa1, 0xc0, 0x12, 0x1f, 0x99, 0x57, 0x0d, 0x29, 0x89, 0x08, 0x2c, 0xf1, 0x5f, 0xaa,
+	0xc8, 0x61, 0x6a, 0x17, 0xa2, 0x76, 0x6a, 0xaa, 0x80, 0x14, 0x9f, 0x8f, 0x0a, 0x43, 0x31, 0x23,
+	0x31, 0x1d, 0x15, 0x87, 0xf3, 0x8b, 0x4b, 0xe2, 0xd7, 0xa1, 0xab, 0xa1, 0x20, 0x20, 0x11, 0x8a,
+	0x5c, 0x12, 0xb0, 0xcc, 0x7b, 0xbf, 0xcf, 0x6b, 0x7b, 0x2e, 0x0e, 0xa2, 0xcc, 0xf1, 0xa0, 0xcf,
+	0x71, 0xe4, 0x62, 0xcf, 0xb1, 0x5a, 0xf8, 0x2d, 0xea, 0xb8, 0x84, 0x66, 0x82, 0x2c, 0x6f, 0x2d,
+	0xfd, 0x6a, 0xc5, 0x47, 0x99, 0xca, 0x47, 0xec, 0xf8, 0x0a, 0x9b, 0x86, 0xb6, 0xc6, 0x22, 0x14,
+	0xc5, 0x59, 0x50, 0x65, 0x1b, 0x2c, 0x6d, 0xe1, 0xe8, 0x35, 0x4f, 0x73, 0xcf, 0x43, 0x41, 0x66,
+	0x9a, 0xf8, 0x5d, 0x8c, 0x59, 0x04, 0xcb, 0x60, 0x4e, 0x94, 0x66, 0x05, 0xc8, 0xc7, 0x05, 0xa9,
+	0x24, 0x95, 0x67, 0x1a, 0xb9, 0x9f, 0x86, 0x6c, 0xce, 0x0a, 0xcf, 0x1b, 0xe4, 0x63, 0xe5, 0x8f,
+	0x04, 0x4a, 0x3b, 0x71, 0x84, 0x22, 0x7c, 0x9d, 0xc6, 0x04, 0x6e, 0x05, 0xe4, 0xed, 0x98, 0x45,
+	0xc4, 0xc7, 0xd4, 0x72, 0x9d, 0x7e, 0x18, 0x10, 0xe7, 0xaf, 0x1c, 0xd8, 0x02, 0x80, 0x84, 0x98,
+	0xf2, 0xdb, 0x29, 0xc8, 0xa5, 0x5c, 0x39, 0x5f, 0xad, 0xab, 0x93, 0x9a, 0xa3, 0x5e, 0x8f, 0xbb,
+	0x2b, 0x28, 0x59, 0x8c, 0x1e, 0x15, 0x3e, 0x06, 0x77, 0x42, 0x44, 0x23, 0x17, 0x79, 0xd6, 0x11,
+	0x72, 0xbd, 0x98, 0xe2, 0x42, 0xae, 0x24, 0x95, 0xff, 0x33, 0xff, 0xcf, 0x8e, 0x37, 0xf9, 0x29,
+	0x7c, 0x04, 0xe6, 0x3a, 0xc8, 0x73, 0x1d, 0x14, 0x61, 0x8b, 0x04, 0xde, 0x49, 0x61, 0x2a, 0x95,
+	0xcd, 0x8a, 0xc3, 0xdd, 0xc0, 0x3b, 0x51, 0xbe, 0xc8, 0x60, 0x71, 0x4c, 0x78, 0xb8, 0x06, 0xf2,
+	0x71, 0x98, 0x22, 0x92, 0xa6, 0xa4, 0x88, 0x7c, 0xb5, 0x28, 0x4a, 0x12, 0x7d, 0x53, 0x37, 0x93,
+	0xbe, 0xed, 0x20, 0x76, 0x6c, 0x02, 0x2e, 0x4f, 0x6c, 0xb8, 0x0b, 0xa6, 0x6d, 0x8a, 0x51, 0xc4,
+	0x2f, 0x3f, 0x5f, 0x5d, 0x1d, 0x79, 0x15, 0xdd, 0x29, 0x1c, 0x72, 0x17, 0xdb, 0xff, 0x98, 0x19,
+	0x26, 0x01, 0x72, 0x7c, 0x41, 0xbe, 0x25, 0x90, 0x63, 0x60, 0x01, 0x4c, 0x53, 0xec, 0x93, 0x0e,
+	0xbf, 0xc3, 0x99, 0xc4, 0xc3, 0xbf, 0x1b, 0x79, 0x30, 0xd3, 0xbd, 0x74, 0xe5, 0x9b, 0x04, 0x1e,
+	0x8e, 0x19, 0x11, 0x16, 0x92, 0x80, 0x61, 0xb8, 0x09, 0xe6, 0xaf, 0x74, 0xc6, 0xc2, 0x94, 0x12,
+	0x9a, 0xb2, 0xf3, 0x55, 0x28, 0x92, 0xa5, 0xa1, 0xad, 0xee, 0xa7, 0xb3, 0x6c, 0xde, 0x1d, 0xec,
+	0xd9, 0x46, 0x22, 0x87, 0x87, 0xe0, 0x5f, 0x8a, 0x59, 0xec, 0x45, 0x62, 0x84, 0x5e, 0x4e, 0x1e,
+	0xa1, 0x51, 0xd9, 0x99, 0x29, 0xc8, 0x14, 0x40, 0x65, 0x03, 0x2c, 0x8f, 0x97, 0x26, 0x63, 0x33,
+	0xe4, 0xe1, 0x0c, 0xbe, 0x99, 0xea, 0xa7, 0x29, 0xb0, 0x70, 0x9d, 0xb0, 0xcf, 0xb3, 0x81, 0x3f,
+	0x24, 0x30, 0x3f, 0xf4, 0x71, 0xc2, 0x17, 0x93, 0x2b, 0x19, 0xf7, 0xaa, 0x8b, 0x37, 0x6b, 0xb8,
+	0xb2, 0x73, 0x69, 0x0c, 0x16, 0x75, 0xfe, 0xfd, 0xd7, 0x47, 0xf9, 0x29, 0x5c, 0x4d, 0x36, 0xe0,
+	0xe9, 0x80, 0xa7, 0x2e, 0x9e, 0x33, 0xd3, 0x2a, 0x62, 0x25, 0xf6, 0x77, 0x5b, 0xab, 0x9c, 0xc1,
+	0x73, 0x19, 0x2c, 0x8c, 0x1c, 0x07, 0xd8, 0xb8, 0x79, 0xb7, 0xc4, 0xba, 0x29, 0xae, 0xdf, 0x8a,
+	0xc1, 0xe7, 0x51, 0x69, 0x5e, 0x1a, 0xf7, 0xfa, 0x96, 0xd6, 0x93, 0xde, 0x12, 0x49, 0xcb, 0xaf,
+	0x2b, 0xcf, 0x92, 0xf2, 0x7b, 0xf5, 0x9e, 0xf6, 0x89, 0xeb, 0x95, 0xb3, 0x61, 0xd5, 0xeb, 0x7e,
+	0x1a, 0x55, 0x97, 0x2a, 0xc5, 0xc5, 0x0b, 0xa3, 0xd0, 0xcb, 0x2c, 0xb3, 0x42, 0x97, 0xa9, 0x36,
+	0xf1, 0x1b, 0x1f, 0x64, 0xb0, 0x62, 0x13, 0x7f, 0x62, 0x15, 0x8d, 0xe5, 0x91, 0x53, 0xb4, 0x97,
+	0xec, 0x96, 0x3d, 0xe9, 0x70, 0x3b, 0x63, 0xb4, 0x89, 0x87, 0x82, 0xb6, 0x4a, 0x68, 0x5b, 0x6b,
+	0xe3, 0x20, 0xdd, 0x3c, 0x5a, 0x2f, 0xea, 0xe8, 0xff, 0xcf, 0x35, 0x61, 0x7c, 0x96, 0x73, 0x5b,
+	0x86, 0xf1, 0x55, 0x2e, 0x6d, 0x71, 0xa0, 0xe1, 0x30, 0x95, 0x9b, 0x89, 0x75, 0x50, 0x53, 0xb3,
+	0xc0, 0xec, 0x42, 0x48, 0x9a, 0x86, 0xc3, 0x9a, 0x5d, 0x49, 0xf3, 0xa0, 0xd6, 0x14, 0x92, 0xdf,
+	0xf2, 0x0a, 0x3f, 0xd7, 0x75, 0xc3, 0x61, 0xba, 0xde, 0x15, 0xe9, 0xfa, 0x41, 0x4d, 0xd7, 0x85,
+	0xac, 0x35, 0x9d, 0xe6, 0x59, 0xfb, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xb6, 0x18, 0x97, 0xe6,
+	0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// KeywordPlanKeywordServiceClient is the client API for KeywordPlanKeywordService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type KeywordPlanKeywordServiceClient interface {
+	// Returns the requested Keyword Plan keyword in full detail.
+	GetKeywordPlanKeyword(ctx context.Context, in *GetKeywordPlanKeywordRequest, opts ...grpc.CallOption) (*resources.KeywordPlanKeyword, error)
+	// Creates, updates, or removes Keyword Plan keywords. Operation statuses are
+	// returned.
+	MutateKeywordPlanKeywords(ctx context.Context, in *MutateKeywordPlanKeywordsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanKeywordsResponse, error)
+}
+
+type keywordPlanKeywordServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewKeywordPlanKeywordServiceClient(cc grpc.ClientConnInterface) KeywordPlanKeywordServiceClient {
+	return &keywordPlanKeywordServiceClient{cc}
+}
+
+func (c *keywordPlanKeywordServiceClient) GetKeywordPlanKeyword(ctx context.Context, in *GetKeywordPlanKeywordRequest, opts ...grpc.CallOption) (*resources.KeywordPlanKeyword, error) {
+	out := new(resources.KeywordPlanKeyword)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanKeywordService/GetKeywordPlanKeyword", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *keywordPlanKeywordServiceClient) MutateKeywordPlanKeywords(ctx context.Context, in *MutateKeywordPlanKeywordsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanKeywordsResponse, error) {
+	out := new(MutateKeywordPlanKeywordsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanKeywordService/MutateKeywordPlanKeywords", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// KeywordPlanKeywordServiceServer is the server API for KeywordPlanKeywordService service.
+type KeywordPlanKeywordServiceServer interface {
+	// Returns the requested Keyword Plan keyword in full detail.
+	GetKeywordPlanKeyword(context.Context, *GetKeywordPlanKeywordRequest) (*resources.KeywordPlanKeyword, error)
+	// Creates, updates, or removes Keyword Plan keywords. Operation statuses are
+	// returned.
+	MutateKeywordPlanKeywords(context.Context, *MutateKeywordPlanKeywordsRequest) (*MutateKeywordPlanKeywordsResponse, error)
+}
+
+// UnimplementedKeywordPlanKeywordServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedKeywordPlanKeywordServiceServer struct {
+}
+
+func (*UnimplementedKeywordPlanKeywordServiceServer) GetKeywordPlanKeyword(ctx context.Context, req *GetKeywordPlanKeywordRequest) (*resources.KeywordPlanKeyword, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetKeywordPlanKeyword not implemented")
+}
+func (*UnimplementedKeywordPlanKeywordServiceServer) MutateKeywordPlanKeywords(ctx context.Context, req *MutateKeywordPlanKeywordsRequest) (*MutateKeywordPlanKeywordsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateKeywordPlanKeywords not implemented")
+}
+
+func RegisterKeywordPlanKeywordServiceServer(s *grpc.Server, srv KeywordPlanKeywordServiceServer) {
+	s.RegisterService(&_KeywordPlanKeywordService_serviceDesc, srv)
+}
+
+func _KeywordPlanKeywordService_GetKeywordPlanKeyword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetKeywordPlanKeywordRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanKeywordServiceServer).GetKeywordPlanKeyword(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanKeywordService/GetKeywordPlanKeyword",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanKeywordServiceServer).GetKeywordPlanKeyword(ctx, req.(*GetKeywordPlanKeywordRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _KeywordPlanKeywordService_MutateKeywordPlanKeywords_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateKeywordPlanKeywordsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanKeywordServiceServer).MutateKeywordPlanKeywords(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanKeywordService/MutateKeywordPlanKeywords",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanKeywordServiceServer).MutateKeywordPlanKeywords(ctx, req.(*MutateKeywordPlanKeywordsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _KeywordPlanKeywordService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.KeywordPlanKeywordService",
+	HandlerType: (*KeywordPlanKeywordServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetKeywordPlanKeyword",
+			Handler:    _KeywordPlanKeywordService_GetKeywordPlanKeyword_Handler,
+		},
+		{
+			MethodName: "MutateKeywordPlanKeywords",
+			Handler:    _KeywordPlanKeywordService_MutateKeywordPlanKeywords_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/keyword_plan_keyword_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/keyword_plan_negative_keyword_service.pb.go b/googleapis/ads/googleads/v3/services/keyword_plan_negative_keyword_service.pb.go
new file mode 100644
index 0000000..b021bae
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/keyword_plan_negative_keyword_service.pb.go
@@ -0,0 +1,542 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/keyword_plan_negative_keyword_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [KeywordPlanNegativeKeywordService.GetKeywordPlanNegativeKeyword][google.ads.googleads.v3.services.KeywordPlanNegativeKeywordService.GetKeywordPlanNegativeKeyword].
+type GetKeywordPlanNegativeKeywordRequest struct {
+	// Required. The resource name of the plan to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetKeywordPlanNegativeKeywordRequest) Reset()         { *m = GetKeywordPlanNegativeKeywordRequest{} }
+func (m *GetKeywordPlanNegativeKeywordRequest) String() string { return proto.CompactTextString(m) }
+func (*GetKeywordPlanNegativeKeywordRequest) ProtoMessage()    {}
+func (*GetKeywordPlanNegativeKeywordRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6976b9c3cb471824, []int{0}
+}
+
+func (m *GetKeywordPlanNegativeKeywordRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetKeywordPlanNegativeKeywordRequest.Unmarshal(m, b)
+}
+func (m *GetKeywordPlanNegativeKeywordRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetKeywordPlanNegativeKeywordRequest.Marshal(b, m, deterministic)
+}
+func (m *GetKeywordPlanNegativeKeywordRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetKeywordPlanNegativeKeywordRequest.Merge(m, src)
+}
+func (m *GetKeywordPlanNegativeKeywordRequest) XXX_Size() int {
+	return xxx_messageInfo_GetKeywordPlanNegativeKeywordRequest.Size(m)
+}
+func (m *GetKeywordPlanNegativeKeywordRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetKeywordPlanNegativeKeywordRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetKeywordPlanNegativeKeywordRequest proto.InternalMessageInfo
+
+func (m *GetKeywordPlanNegativeKeywordRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for
+// [KeywordPlanNegativeKeywordService.MutateKeywordPlanNegativeKeywords][google.ads.googleads.v3.services.KeywordPlanNegativeKeywordService.MutateKeywordPlanNegativeKeywords].
+type MutateKeywordPlanNegativeKeywordsRequest struct {
+	// Required. The ID of the customer whose negative keywords are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual Keyword Plan negative
+	// keywords.
+	Operations []*KeywordPlanNegativeKeywordOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlanNegativeKeywordsRequest) Reset() {
+	*m = MutateKeywordPlanNegativeKeywordsRequest{}
+}
+func (m *MutateKeywordPlanNegativeKeywordsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanNegativeKeywordsRequest) ProtoMessage()    {}
+func (*MutateKeywordPlanNegativeKeywordsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6976b9c3cb471824, []int{1}
+}
+
+func (m *MutateKeywordPlanNegativeKeywordsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanNegativeKeywordsRequest.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanNegativeKeywordsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanNegativeKeywordsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanNegativeKeywordsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanNegativeKeywordsRequest.Merge(m, src)
+}
+func (m *MutateKeywordPlanNegativeKeywordsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanNegativeKeywordsRequest.Size(m)
+}
+func (m *MutateKeywordPlanNegativeKeywordsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanNegativeKeywordsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanNegativeKeywordsRequest proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanNegativeKeywordsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateKeywordPlanNegativeKeywordsRequest) GetOperations() []*KeywordPlanNegativeKeywordOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlanNegativeKeywordsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateKeywordPlanNegativeKeywordsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a Keyword Plan negative
+// keyword.
+type KeywordPlanNegativeKeywordOperation struct {
+	// The FieldMask that determines which resource fields are modified in an
+	// update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*KeywordPlanNegativeKeywordOperation_Create
+	//	*KeywordPlanNegativeKeywordOperation_Update
+	//	*KeywordPlanNegativeKeywordOperation_Remove
+	Operation            isKeywordPlanNegativeKeywordOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                        `json:"-"`
+	XXX_unrecognized     []byte                                          `json:"-"`
+	XXX_sizecache        int32                                           `json:"-"`
+}
+
+func (m *KeywordPlanNegativeKeywordOperation) Reset()         { *m = KeywordPlanNegativeKeywordOperation{} }
+func (m *KeywordPlanNegativeKeywordOperation) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanNegativeKeywordOperation) ProtoMessage()    {}
+func (*KeywordPlanNegativeKeywordOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6976b9c3cb471824, []int{2}
+}
+
+func (m *KeywordPlanNegativeKeywordOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanNegativeKeywordOperation.Unmarshal(m, b)
+}
+func (m *KeywordPlanNegativeKeywordOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanNegativeKeywordOperation.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanNegativeKeywordOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanNegativeKeywordOperation.Merge(m, src)
+}
+func (m *KeywordPlanNegativeKeywordOperation) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanNegativeKeywordOperation.Size(m)
+}
+func (m *KeywordPlanNegativeKeywordOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanNegativeKeywordOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanNegativeKeywordOperation proto.InternalMessageInfo
+
+func (m *KeywordPlanNegativeKeywordOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isKeywordPlanNegativeKeywordOperation_Operation interface {
+	isKeywordPlanNegativeKeywordOperation_Operation()
+}
+
+type KeywordPlanNegativeKeywordOperation_Create struct {
+	Create *resources.KeywordPlanNegativeKeyword `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type KeywordPlanNegativeKeywordOperation_Update struct {
+	Update *resources.KeywordPlanNegativeKeyword `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type KeywordPlanNegativeKeywordOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*KeywordPlanNegativeKeywordOperation_Create) isKeywordPlanNegativeKeywordOperation_Operation() {}
+
+func (*KeywordPlanNegativeKeywordOperation_Update) isKeywordPlanNegativeKeywordOperation_Operation() {}
+
+func (*KeywordPlanNegativeKeywordOperation_Remove) isKeywordPlanNegativeKeywordOperation_Operation() {}
+
+func (m *KeywordPlanNegativeKeywordOperation) GetOperation() isKeywordPlanNegativeKeywordOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *KeywordPlanNegativeKeywordOperation) GetCreate() *resources.KeywordPlanNegativeKeyword {
+	if x, ok := m.GetOperation().(*KeywordPlanNegativeKeywordOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *KeywordPlanNegativeKeywordOperation) GetUpdate() *resources.KeywordPlanNegativeKeyword {
+	if x, ok := m.GetOperation().(*KeywordPlanNegativeKeywordOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *KeywordPlanNegativeKeywordOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*KeywordPlanNegativeKeywordOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*KeywordPlanNegativeKeywordOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*KeywordPlanNegativeKeywordOperation_Create)(nil),
+		(*KeywordPlanNegativeKeywordOperation_Update)(nil),
+		(*KeywordPlanNegativeKeywordOperation_Remove)(nil),
+	}
+}
+
+// Response message for a Keyword Plan negative keyword mutate.
+type MutateKeywordPlanNegativeKeywordsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateKeywordPlanNegativeKeywordResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
+	XXX_unrecognized     []byte                                    `json:"-"`
+	XXX_sizecache        int32                                     `json:"-"`
+}
+
+func (m *MutateKeywordPlanNegativeKeywordsResponse) Reset() {
+	*m = MutateKeywordPlanNegativeKeywordsResponse{}
+}
+func (m *MutateKeywordPlanNegativeKeywordsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanNegativeKeywordsResponse) ProtoMessage()    {}
+func (*MutateKeywordPlanNegativeKeywordsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6976b9c3cb471824, []int{3}
+}
+
+func (m *MutateKeywordPlanNegativeKeywordsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanNegativeKeywordsResponse.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanNegativeKeywordsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanNegativeKeywordsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanNegativeKeywordsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanNegativeKeywordsResponse.Merge(m, src)
+}
+func (m *MutateKeywordPlanNegativeKeywordsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanNegativeKeywordsResponse.Size(m)
+}
+func (m *MutateKeywordPlanNegativeKeywordsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanNegativeKeywordsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanNegativeKeywordsResponse proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanNegativeKeywordsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlanNegativeKeywordsResponse) GetResults() []*MutateKeywordPlanNegativeKeywordResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the Keyword Plan negative keyword mutate.
+type MutateKeywordPlanNegativeKeywordResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlanNegativeKeywordResult) Reset() {
+	*m = MutateKeywordPlanNegativeKeywordResult{}
+}
+func (m *MutateKeywordPlanNegativeKeywordResult) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlanNegativeKeywordResult) ProtoMessage()    {}
+func (*MutateKeywordPlanNegativeKeywordResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6976b9c3cb471824, []int{4}
+}
+
+func (m *MutateKeywordPlanNegativeKeywordResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlanNegativeKeywordResult.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlanNegativeKeywordResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlanNegativeKeywordResult.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlanNegativeKeywordResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlanNegativeKeywordResult.Merge(m, src)
+}
+func (m *MutateKeywordPlanNegativeKeywordResult) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlanNegativeKeywordResult.Size(m)
+}
+func (m *MutateKeywordPlanNegativeKeywordResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlanNegativeKeywordResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlanNegativeKeywordResult proto.InternalMessageInfo
+
+func (m *MutateKeywordPlanNegativeKeywordResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetKeywordPlanNegativeKeywordRequest)(nil), "google.ads.googleads.v3.services.GetKeywordPlanNegativeKeywordRequest")
+	proto.RegisterType((*MutateKeywordPlanNegativeKeywordsRequest)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanNegativeKeywordsRequest")
+	proto.RegisterType((*KeywordPlanNegativeKeywordOperation)(nil), "google.ads.googleads.v3.services.KeywordPlanNegativeKeywordOperation")
+	proto.RegisterType((*MutateKeywordPlanNegativeKeywordsResponse)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanNegativeKeywordsResponse")
+	proto.RegisterType((*MutateKeywordPlanNegativeKeywordResult)(nil), "google.ads.googleads.v3.services.MutateKeywordPlanNegativeKeywordResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/keyword_plan_negative_keyword_service.proto", fileDescriptor_6976b9c3cb471824)
+}
+
+var fileDescriptor_6976b9c3cb471824 = []byte{
+	// 784 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0x4f, 0x6b, 0xe3, 0x46,
+	0x14, 0xc0, 0x6b, 0x39, 0xa4, 0xcd, 0x38, 0x69, 0x61, 0x4a, 0x5b, 0xe3, 0xb6, 0xd4, 0x51, 0x4c,
+	0xea, 0x9a, 0x22, 0x81, 0x7d, 0x53, 0x30, 0xad, 0x0c, 0x76, 0xd2, 0xa6, 0x49, 0x8c, 0x42, 0x53,
+	0x28, 0x06, 0x31, 0x96, 0x26, 0xae, 0x1a, 0x49, 0xa3, 0xce, 0x8c, 0x5c, 0x42, 0xc8, 0x65, 0x8f,
+	0x0b, 0x7b, 0xda, 0x6f, 0x90, 0xe3, 0x7e, 0x85, 0xfd, 0x06, 0xb9, 0xee, 0x61, 0x21, 0xa7, 0x3d,
+	0xec, 0x5e, 0xf6, 0x3b, 0x2c, 0x2c, 0xd2, 0x68, 0xfc, 0x27, 0xc4, 0x91, 0x21, 0xb9, 0x3d, 0xbd,
+	0xf7, 0xfc, 0x7b, 0x7f, 0xe7, 0x19, 0xfc, 0x31, 0x22, 0x64, 0xe4, 0x63, 0x1d, 0xb9, 0x4c, 0x17,
+	0x62, 0x22, 0x8d, 0x5b, 0x3a, 0xc3, 0x74, 0xec, 0x39, 0x98, 0xe9, 0x67, 0xf8, 0xfc, 0x7f, 0x42,
+	0x5d, 0x3b, 0xf2, 0x51, 0x68, 0x87, 0x78, 0x84, 0xb8, 0x37, 0xc6, 0xb6, 0xd4, 0x66, 0x6e, 0x5a,
+	0x44, 0x09, 0x27, 0xb0, 0x2a, 0x10, 0x1a, 0x72, 0x99, 0x36, 0xa1, 0x69, 0xe3, 0x96, 0x26, 0x69,
+	0x95, 0xee, 0xa2, 0x78, 0x14, 0x33, 0x12, 0xd3, 0xdc, 0x80, 0x22, 0x50, 0xe5, 0x3b, 0x89, 0x89,
+	0x3c, 0x1d, 0x85, 0x21, 0xe1, 0x88, 0x7b, 0x24, 0x64, 0x99, 0xf5, 0x9b, 0x19, 0xab, 0xe3, 0x7b,
+	0x38, 0xe4, 0x99, 0xe1, 0x87, 0x19, 0xc3, 0xa9, 0x87, 0x7d, 0xd7, 0x1e, 0xe2, 0x7f, 0xd0, 0xd8,
+	0x23, 0x34, 0x73, 0xc8, 0x0a, 0xd0, 0xd3, 0xaf, 0x61, 0x7c, 0x9a, 0x79, 0x05, 0x88, 0x9d, 0xdd,
+	0x62, 0xd3, 0xc8, 0xd1, 0x19, 0x47, 0x3c, 0xce, 0x82, 0xaa, 0x7d, 0x50, 0xdb, 0xc5, 0x7c, 0x5f,
+	0xa4, 0xd9, 0xf7, 0x51, 0x78, 0x98, 0xa5, 0x9e, 0xa9, 0x2c, 0xfc, 0x5f, 0x8c, 0x19, 0x87, 0x75,
+	0xb0, 0x21, 0x6b, 0xb5, 0x43, 0x14, 0xe0, 0x72, 0xa1, 0x5a, 0xa8, 0xaf, 0x75, 0x8a, 0x6f, 0x4c,
+	0xc5, 0x5a, 0x97, 0x96, 0x43, 0x14, 0x60, 0xf5, 0xa9, 0x02, 0xea, 0x07, 0x31, 0x47, 0x1c, 0x2f,
+	0xa6, 0x32, 0x89, 0xad, 0x81, 0x92, 0x13, 0x33, 0x4e, 0x02, 0x4c, 0x6d, 0xcf, 0x9d, 0x85, 0x02,
+	0xa9, 0xff, 0xcd, 0x85, 0xff, 0x02, 0x40, 0x22, 0x4c, 0x45, 0xb7, 0xca, 0x4a, 0xb5, 0x58, 0x2f,
+	0x35, 0xbb, 0x5a, 0xde, 0xd4, 0xb4, 0xc5, 0xf1, 0x8f, 0x24, 0x2d, 0x8b, 0x35, 0xa5, 0xc3, 0x1f,
+	0xc1, 0x17, 0x11, 0xa2, 0xdc, 0x43, 0xbe, 0x7d, 0x8a, 0x3c, 0x3f, 0xa6, 0xb8, 0x5c, 0xac, 0x16,
+	0xea, 0x9f, 0x59, 0x9f, 0x67, 0xea, 0x9e, 0xd0, 0xc2, 0x2d, 0xb0, 0x31, 0x46, 0xbe, 0xe7, 0x22,
+	0x8e, 0x6d, 0x12, 0xfa, 0xe7, 0xe5, 0x95, 0xd4, 0x6d, 0x5d, 0x2a, 0x8f, 0x42, 0xff, 0x5c, 0x7d,
+	0xa9, 0x80, 0xad, 0x25, 0xd2, 0x80, 0x3b, 0xa0, 0x14, 0x47, 0x29, 0x2a, 0x19, 0x5a, 0x8a, 0x2a,
+	0x35, 0x2b, 0xb2, 0x44, 0x39, 0x57, 0xad, 0x97, 0xcc, 0xf5, 0x00, 0xb1, 0x33, 0x0b, 0x08, 0xf7,
+	0x44, 0x86, 0x7f, 0x81, 0x55, 0x87, 0x62, 0xc4, 0xc5, 0x50, 0x4a, 0xcd, 0xf6, 0xc2, 0xd6, 0x4c,
+	0xd6, 0xf5, 0x9e, 0xde, 0xec, 0x7d, 0x62, 0x65, 0xb8, 0x04, 0x2c, 0xc2, 0x94, 0x95, 0x47, 0x02,
+	0x0b, 0x1c, 0x2c, 0x83, 0x55, 0x8a, 0x03, 0x32, 0x16, 0xbd, 0x5d, 0x4b, 0x2c, 0xe2, 0xbb, 0x53,
+	0x02, 0x6b, 0x93, 0x61, 0xa8, 0xaf, 0x0b, 0xe0, 0xa7, 0x25, 0x56, 0x89, 0x45, 0x24, 0x64, 0x18,
+	0xf6, 0xc0, 0x57, 0xb7, 0x26, 0x67, 0x63, 0x4a, 0x09, 0x4d, 0x63, 0x94, 0x9a, 0x50, 0x26, 0x4f,
+	0x23, 0x47, 0x3b, 0x4e, 0xdf, 0x80, 0xf5, 0xe5, 0xfc, 0x4c, 0xbb, 0x89, 0x3b, 0x1c, 0x82, 0x4f,
+	0x29, 0x66, 0xb1, 0xcf, 0xe5, 0xaa, 0xed, 0xe5, 0xaf, 0x5a, 0x5e, 0x96, 0x56, 0x0a, 0xb4, 0x24,
+	0x58, 0x3d, 0x00, 0xdb, 0xcb, 0xfd, 0x24, 0x59, 0xb3, 0x3b, 0x1e, 0xde, 0xfc, 0x9b, 0x6b, 0xbe,
+	0x5b, 0x01, 0x9b, 0x8b, 0x49, 0xc7, 0x22, 0x4b, 0xf8, 0xa1, 0x00, 0xbe, 0xbf, 0xf7, 0xb1, 0xc3,
+	0x5e, 0x7e, 0xa5, 0xcb, 0x5c, 0x8b, 0xca, 0xc3, 0x16, 0x45, 0xfd, 0xf3, 0xc6, 0x9c, 0x2f, 0xfa,
+	0xc9, 0xab, 0xb7, 0xcf, 0x95, 0x5f, 0x60, 0x3b, 0x39, 0xb9, 0x17, 0x73, 0x96, 0xb6, 0x3c, 0x13,
+	0x4c, 0x6f, 0xc8, 0x1b, 0x7c, 0xd7, 0x96, 0xe8, 0x8d, 0x4b, 0x78, 0xa5, 0x80, 0xcd, 0xdc, 0x75,
+	0x82, 0xbf, 0x3f, 0x7c, 0xda, 0xf2, 0xbc, 0x55, 0xf6, 0x1f, 0x85, 0x25, 0xf6, 0x5b, 0x75, 0x6f,
+	0xcc, 0xaf, 0x67, 0x8e, 0xe5, 0xcf, 0xd3, 0xa3, 0x95, 0xb6, 0xa7, 0xab, 0xfe, 0x9a, 0xb4, 0x67,
+	0xda, 0x8f, 0x8b, 0x19, 0xe7, 0x76, 0xe3, 0xf2, 0xbe, 0xee, 0x18, 0x41, 0x9a, 0x85, 0x51, 0x68,
+	0x54, 0xbe, 0xbd, 0x36, 0xcb, 0xd3, 0x4c, 0x33, 0x29, 0xf2, 0x98, 0xe6, 0x90, 0xa0, 0xf3, 0x4c,
+	0x01, 0x35, 0x87, 0x04, 0xb9, 0x55, 0x75, 0xb6, 0x73, 0xb7, 0xb1, 0x9f, 0xdc, 0xb4, 0x7e, 0xe1,
+	0xef, 0xbd, 0x8c, 0x35, 0x22, 0x3e, 0x0a, 0x47, 0x1a, 0xa1, 0x23, 0x7d, 0x84, 0xc3, 0xf4, 0xe2,
+	0xe9, 0xd3, 0xe8, 0x8b, 0xff, 0xe9, 0x77, 0xa4, 0x70, 0xa5, 0x14, 0x77, 0x4d, 0xf3, 0x85, 0x52,
+	0xdd, 0x15, 0x40, 0xd3, 0x65, 0x9a, 0x10, 0x13, 0xe9, 0xa4, 0xa5, 0x65, 0x81, 0xd9, 0xb5, 0x74,
+	0x19, 0x98, 0x2e, 0x1b, 0x4c, 0x5c, 0x06, 0x27, 0xad, 0x81, 0x74, 0x79, 0xaf, 0xd4, 0x84, 0xde,
+	0x30, 0x4c, 0x97, 0x19, 0xc6, 0xc4, 0xc9, 0x30, 0x4e, 0x5a, 0x86, 0x21, 0xdd, 0x86, 0xab, 0x69,
+	0x9e, 0xad, 0x8f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x32, 0xf9, 0xc4, 0x90, 0x08, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// KeywordPlanNegativeKeywordServiceClient is the client API for KeywordPlanNegativeKeywordService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type KeywordPlanNegativeKeywordServiceClient interface {
+	// Returns the requested plan in full detail.
+	GetKeywordPlanNegativeKeyword(ctx context.Context, in *GetKeywordPlanNegativeKeywordRequest, opts ...grpc.CallOption) (*resources.KeywordPlanNegativeKeyword, error)
+	// Creates, updates, or removes Keyword Plan negative keywords. Operation
+	// statuses are returned.
+	MutateKeywordPlanNegativeKeywords(ctx context.Context, in *MutateKeywordPlanNegativeKeywordsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanNegativeKeywordsResponse, error)
+}
+
+type keywordPlanNegativeKeywordServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewKeywordPlanNegativeKeywordServiceClient(cc grpc.ClientConnInterface) KeywordPlanNegativeKeywordServiceClient {
+	return &keywordPlanNegativeKeywordServiceClient{cc}
+}
+
+func (c *keywordPlanNegativeKeywordServiceClient) GetKeywordPlanNegativeKeyword(ctx context.Context, in *GetKeywordPlanNegativeKeywordRequest, opts ...grpc.CallOption) (*resources.KeywordPlanNegativeKeyword, error) {
+	out := new(resources.KeywordPlanNegativeKeyword)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanNegativeKeywordService/GetKeywordPlanNegativeKeyword", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *keywordPlanNegativeKeywordServiceClient) MutateKeywordPlanNegativeKeywords(ctx context.Context, in *MutateKeywordPlanNegativeKeywordsRequest, opts ...grpc.CallOption) (*MutateKeywordPlanNegativeKeywordsResponse, error) {
+	out := new(MutateKeywordPlanNegativeKeywordsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanNegativeKeywordService/MutateKeywordPlanNegativeKeywords", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// KeywordPlanNegativeKeywordServiceServer is the server API for KeywordPlanNegativeKeywordService service.
+type KeywordPlanNegativeKeywordServiceServer interface {
+	// Returns the requested plan in full detail.
+	GetKeywordPlanNegativeKeyword(context.Context, *GetKeywordPlanNegativeKeywordRequest) (*resources.KeywordPlanNegativeKeyword, error)
+	// Creates, updates, or removes Keyword Plan negative keywords. Operation
+	// statuses are returned.
+	MutateKeywordPlanNegativeKeywords(context.Context, *MutateKeywordPlanNegativeKeywordsRequest) (*MutateKeywordPlanNegativeKeywordsResponse, error)
+}
+
+// UnimplementedKeywordPlanNegativeKeywordServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedKeywordPlanNegativeKeywordServiceServer struct {
+}
+
+func (*UnimplementedKeywordPlanNegativeKeywordServiceServer) GetKeywordPlanNegativeKeyword(ctx context.Context, req *GetKeywordPlanNegativeKeywordRequest) (*resources.KeywordPlanNegativeKeyword, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetKeywordPlanNegativeKeyword not implemented")
+}
+func (*UnimplementedKeywordPlanNegativeKeywordServiceServer) MutateKeywordPlanNegativeKeywords(ctx context.Context, req *MutateKeywordPlanNegativeKeywordsRequest) (*MutateKeywordPlanNegativeKeywordsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateKeywordPlanNegativeKeywords not implemented")
+}
+
+func RegisterKeywordPlanNegativeKeywordServiceServer(s *grpc.Server, srv KeywordPlanNegativeKeywordServiceServer) {
+	s.RegisterService(&_KeywordPlanNegativeKeywordService_serviceDesc, srv)
+}
+
+func _KeywordPlanNegativeKeywordService_GetKeywordPlanNegativeKeyword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetKeywordPlanNegativeKeywordRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanNegativeKeywordServiceServer).GetKeywordPlanNegativeKeyword(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanNegativeKeywordService/GetKeywordPlanNegativeKeyword",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanNegativeKeywordServiceServer).GetKeywordPlanNegativeKeyword(ctx, req.(*GetKeywordPlanNegativeKeywordRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _KeywordPlanNegativeKeywordService_MutateKeywordPlanNegativeKeywords_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateKeywordPlanNegativeKeywordsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanNegativeKeywordServiceServer).MutateKeywordPlanNegativeKeywords(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanNegativeKeywordService/MutateKeywordPlanNegativeKeywords",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanNegativeKeywordServiceServer).MutateKeywordPlanNegativeKeywords(ctx, req.(*MutateKeywordPlanNegativeKeywordsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _KeywordPlanNegativeKeywordService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.KeywordPlanNegativeKeywordService",
+	HandlerType: (*KeywordPlanNegativeKeywordServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetKeywordPlanNegativeKeyword",
+			Handler:    _KeywordPlanNegativeKeywordService_GetKeywordPlanNegativeKeyword_Handler,
+		},
+		{
+			MethodName: "MutateKeywordPlanNegativeKeywords",
+			Handler:    _KeywordPlanNegativeKeywordService_MutateKeywordPlanNegativeKeywords_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/keyword_plan_negative_keyword_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/keyword_plan_service.pb.go b/googleapis/ads/googleads/v3/services/keyword_plan_service.pb.go
new file mode 100644
index 0000000..54fbe9e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/keyword_plan_service.pb.go
@@ -0,0 +1,1126 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/keyword_plan_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [KeywordPlanService.GetKeywordPlan][google.ads.googleads.v3.services.KeywordPlanService.GetKeywordPlan].
+type GetKeywordPlanRequest struct {
+	// Required. The resource name of the plan to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetKeywordPlanRequest) Reset()         { *m = GetKeywordPlanRequest{} }
+func (m *GetKeywordPlanRequest) String() string { return proto.CompactTextString(m) }
+func (*GetKeywordPlanRequest) ProtoMessage()    {}
+func (*GetKeywordPlanRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{0}
+}
+
+func (m *GetKeywordPlanRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetKeywordPlanRequest.Unmarshal(m, b)
+}
+func (m *GetKeywordPlanRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetKeywordPlanRequest.Marshal(b, m, deterministic)
+}
+func (m *GetKeywordPlanRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetKeywordPlanRequest.Merge(m, src)
+}
+func (m *GetKeywordPlanRequest) XXX_Size() int {
+	return xxx_messageInfo_GetKeywordPlanRequest.Size(m)
+}
+func (m *GetKeywordPlanRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetKeywordPlanRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetKeywordPlanRequest proto.InternalMessageInfo
+
+func (m *GetKeywordPlanRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [KeywordPlanService.MutateKeywordPlans][google.ads.googleads.v3.services.KeywordPlanService.MutateKeywordPlans].
+type MutateKeywordPlansRequest struct {
+	// Required. The ID of the customer whose keyword plans are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual keyword plans.
+	Operations []*KeywordPlanOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlansRequest) Reset()         { *m = MutateKeywordPlansRequest{} }
+func (m *MutateKeywordPlansRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlansRequest) ProtoMessage()    {}
+func (*MutateKeywordPlansRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{1}
+}
+
+func (m *MutateKeywordPlansRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlansRequest.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlansRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlansRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlansRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlansRequest.Merge(m, src)
+}
+func (m *MutateKeywordPlansRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlansRequest.Size(m)
+}
+func (m *MutateKeywordPlansRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlansRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlansRequest proto.InternalMessageInfo
+
+func (m *MutateKeywordPlansRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateKeywordPlansRequest) GetOperations() []*KeywordPlanOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlansRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateKeywordPlansRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on a keyword plan.
+type KeywordPlanOperation struct {
+	// The FieldMask that determines which resource fields are modified in an
+	// update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*KeywordPlanOperation_Create
+	//	*KeywordPlanOperation_Update
+	//	*KeywordPlanOperation_Remove
+	Operation            isKeywordPlanOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *KeywordPlanOperation) Reset()         { *m = KeywordPlanOperation{} }
+func (m *KeywordPlanOperation) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanOperation) ProtoMessage()    {}
+func (*KeywordPlanOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{2}
+}
+
+func (m *KeywordPlanOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanOperation.Unmarshal(m, b)
+}
+func (m *KeywordPlanOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanOperation.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanOperation.Merge(m, src)
+}
+func (m *KeywordPlanOperation) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanOperation.Size(m)
+}
+func (m *KeywordPlanOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanOperation proto.InternalMessageInfo
+
+func (m *KeywordPlanOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isKeywordPlanOperation_Operation interface {
+	isKeywordPlanOperation_Operation()
+}
+
+type KeywordPlanOperation_Create struct {
+	Create *resources.KeywordPlan `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type KeywordPlanOperation_Update struct {
+	Update *resources.KeywordPlan `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type KeywordPlanOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*KeywordPlanOperation_Create) isKeywordPlanOperation_Operation() {}
+
+func (*KeywordPlanOperation_Update) isKeywordPlanOperation_Operation() {}
+
+func (*KeywordPlanOperation_Remove) isKeywordPlanOperation_Operation() {}
+
+func (m *KeywordPlanOperation) GetOperation() isKeywordPlanOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *KeywordPlanOperation) GetCreate() *resources.KeywordPlan {
+	if x, ok := m.GetOperation().(*KeywordPlanOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *KeywordPlanOperation) GetUpdate() *resources.KeywordPlan {
+	if x, ok := m.GetOperation().(*KeywordPlanOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *KeywordPlanOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*KeywordPlanOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*KeywordPlanOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*KeywordPlanOperation_Create)(nil),
+		(*KeywordPlanOperation_Update)(nil),
+		(*KeywordPlanOperation_Remove)(nil),
+	}
+}
+
+// Response message for a keyword plan mutate.
+type MutateKeywordPlansResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateKeywordPlansResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *MutateKeywordPlansResponse) Reset()         { *m = MutateKeywordPlansResponse{} }
+func (m *MutateKeywordPlansResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlansResponse) ProtoMessage()    {}
+func (*MutateKeywordPlansResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{3}
+}
+
+func (m *MutateKeywordPlansResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlansResponse.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlansResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlansResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlansResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlansResponse.Merge(m, src)
+}
+func (m *MutateKeywordPlansResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlansResponse.Size(m)
+}
+func (m *MutateKeywordPlansResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlansResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlansResponse proto.InternalMessageInfo
+
+func (m *MutateKeywordPlansResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateKeywordPlansResponse) GetResults() []*MutateKeywordPlansResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the keyword plan mutate.
+type MutateKeywordPlansResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateKeywordPlansResult) Reset()         { *m = MutateKeywordPlansResult{} }
+func (m *MutateKeywordPlansResult) String() string { return proto.CompactTextString(m) }
+func (*MutateKeywordPlansResult) ProtoMessage()    {}
+func (*MutateKeywordPlansResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{4}
+}
+
+func (m *MutateKeywordPlansResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateKeywordPlansResult.Unmarshal(m, b)
+}
+func (m *MutateKeywordPlansResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateKeywordPlansResult.Marshal(b, m, deterministic)
+}
+func (m *MutateKeywordPlansResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateKeywordPlansResult.Merge(m, src)
+}
+func (m *MutateKeywordPlansResult) XXX_Size() int {
+	return xxx_messageInfo_MutateKeywordPlansResult.Size(m)
+}
+func (m *MutateKeywordPlansResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateKeywordPlansResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateKeywordPlansResult proto.InternalMessageInfo
+
+func (m *MutateKeywordPlansResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [KeywordPlanService.GenerateForecastMetrics][google.ads.googleads.v3.services.KeywordPlanService.GenerateForecastMetrics].
+type GenerateForecastMetricsRequest struct {
+	// Required. The resource name of the keyword plan to be forecasted.
+	KeywordPlan          string   `protobuf:"bytes,1,opt,name=keyword_plan,json=keywordPlan,proto3" json:"keyword_plan,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GenerateForecastMetricsRequest) Reset()         { *m = GenerateForecastMetricsRequest{} }
+func (m *GenerateForecastMetricsRequest) String() string { return proto.CompactTextString(m) }
+func (*GenerateForecastMetricsRequest) ProtoMessage()    {}
+func (*GenerateForecastMetricsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{5}
+}
+
+func (m *GenerateForecastMetricsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateForecastMetricsRequest.Unmarshal(m, b)
+}
+func (m *GenerateForecastMetricsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateForecastMetricsRequest.Marshal(b, m, deterministic)
+}
+func (m *GenerateForecastMetricsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateForecastMetricsRequest.Merge(m, src)
+}
+func (m *GenerateForecastMetricsRequest) XXX_Size() int {
+	return xxx_messageInfo_GenerateForecastMetricsRequest.Size(m)
+}
+func (m *GenerateForecastMetricsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateForecastMetricsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateForecastMetricsRequest proto.InternalMessageInfo
+
+func (m *GenerateForecastMetricsRequest) GetKeywordPlan() string {
+	if m != nil {
+		return m.KeywordPlan
+	}
+	return ""
+}
+
+// Response message for [KeywordPlanService.GenerateForecastMetrics][google.ads.googleads.v3.services.KeywordPlanService.GenerateForecastMetrics].
+type GenerateForecastMetricsResponse struct {
+	// List of campaign forecasts.
+	// One maximum.
+	CampaignForecasts []*KeywordPlanCampaignForecast `protobuf:"bytes,1,rep,name=campaign_forecasts,json=campaignForecasts,proto3" json:"campaign_forecasts,omitempty"`
+	// List of ad group forecasts.
+	AdGroupForecasts []*KeywordPlanAdGroupForecast `protobuf:"bytes,2,rep,name=ad_group_forecasts,json=adGroupForecasts,proto3" json:"ad_group_forecasts,omitempty"`
+	// List of keyword forecasts.
+	KeywordForecasts     []*KeywordPlanKeywordForecast `protobuf:"bytes,3,rep,name=keyword_forecasts,json=keywordForecasts,proto3" json:"keyword_forecasts,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *GenerateForecastMetricsResponse) Reset()         { *m = GenerateForecastMetricsResponse{} }
+func (m *GenerateForecastMetricsResponse) String() string { return proto.CompactTextString(m) }
+func (*GenerateForecastMetricsResponse) ProtoMessage()    {}
+func (*GenerateForecastMetricsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{6}
+}
+
+func (m *GenerateForecastMetricsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateForecastMetricsResponse.Unmarshal(m, b)
+}
+func (m *GenerateForecastMetricsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateForecastMetricsResponse.Marshal(b, m, deterministic)
+}
+func (m *GenerateForecastMetricsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateForecastMetricsResponse.Merge(m, src)
+}
+func (m *GenerateForecastMetricsResponse) XXX_Size() int {
+	return xxx_messageInfo_GenerateForecastMetricsResponse.Size(m)
+}
+func (m *GenerateForecastMetricsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateForecastMetricsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateForecastMetricsResponse proto.InternalMessageInfo
+
+func (m *GenerateForecastMetricsResponse) GetCampaignForecasts() []*KeywordPlanCampaignForecast {
+	if m != nil {
+		return m.CampaignForecasts
+	}
+	return nil
+}
+
+func (m *GenerateForecastMetricsResponse) GetAdGroupForecasts() []*KeywordPlanAdGroupForecast {
+	if m != nil {
+		return m.AdGroupForecasts
+	}
+	return nil
+}
+
+func (m *GenerateForecastMetricsResponse) GetKeywordForecasts() []*KeywordPlanKeywordForecast {
+	if m != nil {
+		return m.KeywordForecasts
+	}
+	return nil
+}
+
+// A campaign forecast.
+type KeywordPlanCampaignForecast struct {
+	// The resource name of the Keyword Plan campaign related to the forecast.
+	//
+	// `customers/{customer_id}/keywordPlanCampaigns/{keyword+plan_campaign_id}`
+	KeywordPlanCampaign *wrappers.StringValue `protobuf:"bytes,1,opt,name=keyword_plan_campaign,json=keywordPlanCampaign,proto3" json:"keyword_plan_campaign,omitempty"`
+	// The forecast for the Keyword Plan campaign.
+	CampaignForecast     *ForecastMetrics `protobuf:"bytes,2,opt,name=campaign_forecast,json=campaignForecast,proto3" json:"campaign_forecast,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *KeywordPlanCampaignForecast) Reset()         { *m = KeywordPlanCampaignForecast{} }
+func (m *KeywordPlanCampaignForecast) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanCampaignForecast) ProtoMessage()    {}
+func (*KeywordPlanCampaignForecast) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{7}
+}
+
+func (m *KeywordPlanCampaignForecast) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanCampaignForecast.Unmarshal(m, b)
+}
+func (m *KeywordPlanCampaignForecast) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanCampaignForecast.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanCampaignForecast) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanCampaignForecast.Merge(m, src)
+}
+func (m *KeywordPlanCampaignForecast) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanCampaignForecast.Size(m)
+}
+func (m *KeywordPlanCampaignForecast) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanCampaignForecast.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanCampaignForecast proto.InternalMessageInfo
+
+func (m *KeywordPlanCampaignForecast) GetKeywordPlanCampaign() *wrappers.StringValue {
+	if m != nil {
+		return m.KeywordPlanCampaign
+	}
+	return nil
+}
+
+func (m *KeywordPlanCampaignForecast) GetCampaignForecast() *ForecastMetrics {
+	if m != nil {
+		return m.CampaignForecast
+	}
+	return nil
+}
+
+// An ad group forecast.
+type KeywordPlanAdGroupForecast struct {
+	// The resource name of the Keyword Plan ad group related to the forecast.
+	//
+	// `customers/{customer_id}/keywordPlanAdGroups/{keyword_plan_ad_group_id}`
+	KeywordPlanAdGroup *wrappers.StringValue `protobuf:"bytes,1,opt,name=keyword_plan_ad_group,json=keywordPlanAdGroup,proto3" json:"keyword_plan_ad_group,omitempty"`
+	// The forecast for the Keyword Plan ad group.
+	AdGroupForecast      *ForecastMetrics `protobuf:"bytes,2,opt,name=ad_group_forecast,json=adGroupForecast,proto3" json:"ad_group_forecast,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *KeywordPlanAdGroupForecast) Reset()         { *m = KeywordPlanAdGroupForecast{} }
+func (m *KeywordPlanAdGroupForecast) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanAdGroupForecast) ProtoMessage()    {}
+func (*KeywordPlanAdGroupForecast) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{8}
+}
+
+func (m *KeywordPlanAdGroupForecast) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanAdGroupForecast.Unmarshal(m, b)
+}
+func (m *KeywordPlanAdGroupForecast) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanAdGroupForecast.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanAdGroupForecast) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanAdGroupForecast.Merge(m, src)
+}
+func (m *KeywordPlanAdGroupForecast) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanAdGroupForecast.Size(m)
+}
+func (m *KeywordPlanAdGroupForecast) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanAdGroupForecast.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanAdGroupForecast proto.InternalMessageInfo
+
+func (m *KeywordPlanAdGroupForecast) GetKeywordPlanAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.KeywordPlanAdGroup
+	}
+	return nil
+}
+
+func (m *KeywordPlanAdGroupForecast) GetAdGroupForecast() *ForecastMetrics {
+	if m != nil {
+		return m.AdGroupForecast
+	}
+	return nil
+}
+
+// A keyword forecast.
+type KeywordPlanKeywordForecast struct {
+	// The resource name of the Keyword Plan keyword related to the forecast.
+	//
+	// `customers/{customer_id}/keywordPlanAdGroupKeywords/{keyword_plan_ad_group_keyword_id}`
+	KeywordPlanAdGroupKeyword *wrappers.StringValue `protobuf:"bytes,1,opt,name=keyword_plan_ad_group_keyword,json=keywordPlanAdGroupKeyword,proto3" json:"keyword_plan_ad_group_keyword,omitempty"`
+	// The forecast for the Keyword Plan keyword.
+	KeywordForecast      *ForecastMetrics `protobuf:"bytes,2,opt,name=keyword_forecast,json=keywordForecast,proto3" json:"keyword_forecast,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *KeywordPlanKeywordForecast) Reset()         { *m = KeywordPlanKeywordForecast{} }
+func (m *KeywordPlanKeywordForecast) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanKeywordForecast) ProtoMessage()    {}
+func (*KeywordPlanKeywordForecast) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{9}
+}
+
+func (m *KeywordPlanKeywordForecast) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanKeywordForecast.Unmarshal(m, b)
+}
+func (m *KeywordPlanKeywordForecast) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanKeywordForecast.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanKeywordForecast) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanKeywordForecast.Merge(m, src)
+}
+func (m *KeywordPlanKeywordForecast) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanKeywordForecast.Size(m)
+}
+func (m *KeywordPlanKeywordForecast) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanKeywordForecast.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanKeywordForecast proto.InternalMessageInfo
+
+func (m *KeywordPlanKeywordForecast) GetKeywordPlanAdGroupKeyword() *wrappers.StringValue {
+	if m != nil {
+		return m.KeywordPlanAdGroupKeyword
+	}
+	return nil
+}
+
+func (m *KeywordPlanKeywordForecast) GetKeywordForecast() *ForecastMetrics {
+	if m != nil {
+		return m.KeywordForecast
+	}
+	return nil
+}
+
+// Forecast metrics.
+type ForecastMetrics struct {
+	// Impressions
+	Impressions *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=impressions,proto3" json:"impressions,omitempty"`
+	// Ctr
+	Ctr *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=ctr,proto3" json:"ctr,omitempty"`
+	// AVG cpc
+	AverageCpc *wrappers.Int64Value `protobuf:"bytes,3,opt,name=average_cpc,json=averageCpc,proto3" json:"average_cpc,omitempty"`
+	// Clicks
+	Clicks *wrappers.DoubleValue `protobuf:"bytes,5,opt,name=clicks,proto3" json:"clicks,omitempty"`
+	// Cost
+	CostMicros           *wrappers.Int64Value `protobuf:"bytes,6,opt,name=cost_micros,json=costMicros,proto3" json:"cost_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *ForecastMetrics) Reset()         { *m = ForecastMetrics{} }
+func (m *ForecastMetrics) String() string { return proto.CompactTextString(m) }
+func (*ForecastMetrics) ProtoMessage()    {}
+func (*ForecastMetrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{10}
+}
+
+func (m *ForecastMetrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ForecastMetrics.Unmarshal(m, b)
+}
+func (m *ForecastMetrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ForecastMetrics.Marshal(b, m, deterministic)
+}
+func (m *ForecastMetrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ForecastMetrics.Merge(m, src)
+}
+func (m *ForecastMetrics) XXX_Size() int {
+	return xxx_messageInfo_ForecastMetrics.Size(m)
+}
+func (m *ForecastMetrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_ForecastMetrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ForecastMetrics proto.InternalMessageInfo
+
+func (m *ForecastMetrics) GetImpressions() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Impressions
+	}
+	return nil
+}
+
+func (m *ForecastMetrics) GetCtr() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Ctr
+	}
+	return nil
+}
+
+func (m *ForecastMetrics) GetAverageCpc() *wrappers.Int64Value {
+	if m != nil {
+		return m.AverageCpc
+	}
+	return nil
+}
+
+func (m *ForecastMetrics) GetClicks() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Clicks
+	}
+	return nil
+}
+
+func (m *ForecastMetrics) GetCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CostMicros
+	}
+	return nil
+}
+
+// Request message for [KeywordPlanService.GenerateHistoricalMetrics][google.ads.googleads.v3.services.KeywordPlanService.GenerateHistoricalMetrics].
+type GenerateHistoricalMetricsRequest struct {
+	// Required. The resource name of the keyword plan of which historical metrics are
+	// requested.
+	KeywordPlan          string   `protobuf:"bytes,1,opt,name=keyword_plan,json=keywordPlan,proto3" json:"keyword_plan,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GenerateHistoricalMetricsRequest) Reset()         { *m = GenerateHistoricalMetricsRequest{} }
+func (m *GenerateHistoricalMetricsRequest) String() string { return proto.CompactTextString(m) }
+func (*GenerateHistoricalMetricsRequest) ProtoMessage()    {}
+func (*GenerateHistoricalMetricsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{11}
+}
+
+func (m *GenerateHistoricalMetricsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateHistoricalMetricsRequest.Unmarshal(m, b)
+}
+func (m *GenerateHistoricalMetricsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateHistoricalMetricsRequest.Marshal(b, m, deterministic)
+}
+func (m *GenerateHistoricalMetricsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateHistoricalMetricsRequest.Merge(m, src)
+}
+func (m *GenerateHistoricalMetricsRequest) XXX_Size() int {
+	return xxx_messageInfo_GenerateHistoricalMetricsRequest.Size(m)
+}
+func (m *GenerateHistoricalMetricsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateHistoricalMetricsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateHistoricalMetricsRequest proto.InternalMessageInfo
+
+func (m *GenerateHistoricalMetricsRequest) GetKeywordPlan() string {
+	if m != nil {
+		return m.KeywordPlan
+	}
+	return ""
+}
+
+// Response message for [KeywordPlanService.GenerateHistoricalMetrics][google.ads.googleads.v3.services.KeywordPlanService.GenerateHistoricalMetrics].
+type GenerateHistoricalMetricsResponse struct {
+	// List of keyword historical metrics.
+	Metrics              []*KeywordPlanKeywordHistoricalMetrics `protobuf:"bytes,1,rep,name=metrics,proto3" json:"metrics,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *GenerateHistoricalMetricsResponse) Reset()         { *m = GenerateHistoricalMetricsResponse{} }
+func (m *GenerateHistoricalMetricsResponse) String() string { return proto.CompactTextString(m) }
+func (*GenerateHistoricalMetricsResponse) ProtoMessage()    {}
+func (*GenerateHistoricalMetricsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{12}
+}
+
+func (m *GenerateHistoricalMetricsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateHistoricalMetricsResponse.Unmarshal(m, b)
+}
+func (m *GenerateHistoricalMetricsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateHistoricalMetricsResponse.Marshal(b, m, deterministic)
+}
+func (m *GenerateHistoricalMetricsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateHistoricalMetricsResponse.Merge(m, src)
+}
+func (m *GenerateHistoricalMetricsResponse) XXX_Size() int {
+	return xxx_messageInfo_GenerateHistoricalMetricsResponse.Size(m)
+}
+func (m *GenerateHistoricalMetricsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateHistoricalMetricsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateHistoricalMetricsResponse proto.InternalMessageInfo
+
+func (m *GenerateHistoricalMetricsResponse) GetMetrics() []*KeywordPlanKeywordHistoricalMetrics {
+	if m != nil {
+		return m.Metrics
+	}
+	return nil
+}
+
+// A keyword historical metrics.
+type KeywordPlanKeywordHistoricalMetrics struct {
+	// The text of the query associated with one or more ad_group_keywords in the
+	// plan.
+	//
+	// Note that we de-dupe your keywords list, eliminating close variants before
+	// returning the plan's keywords as text. For example, if your plan originally
+	// contained the keywords 'car' and 'cars', the returned search query will
+	// only contain 'car'.
+	SearchQuery *wrappers.StringValue `protobuf:"bytes,1,opt,name=search_query,json=searchQuery,proto3" json:"search_query,omitempty"`
+	// The historical metrics for the query associated with one or more
+	// ad_group_keywords in the plan.
+	KeywordMetrics       *common.KeywordPlanHistoricalMetrics `protobuf:"bytes,2,opt,name=keyword_metrics,json=keywordMetrics,proto3" json:"keyword_metrics,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
+	XXX_unrecognized     []byte                               `json:"-"`
+	XXX_sizecache        int32                                `json:"-"`
+}
+
+func (m *KeywordPlanKeywordHistoricalMetrics) Reset()         { *m = KeywordPlanKeywordHistoricalMetrics{} }
+func (m *KeywordPlanKeywordHistoricalMetrics) String() string { return proto.CompactTextString(m) }
+func (*KeywordPlanKeywordHistoricalMetrics) ProtoMessage()    {}
+func (*KeywordPlanKeywordHistoricalMetrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_512873c5d5249363, []int{13}
+}
+
+func (m *KeywordPlanKeywordHistoricalMetrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_KeywordPlanKeywordHistoricalMetrics.Unmarshal(m, b)
+}
+func (m *KeywordPlanKeywordHistoricalMetrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_KeywordPlanKeywordHistoricalMetrics.Marshal(b, m, deterministic)
+}
+func (m *KeywordPlanKeywordHistoricalMetrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_KeywordPlanKeywordHistoricalMetrics.Merge(m, src)
+}
+func (m *KeywordPlanKeywordHistoricalMetrics) XXX_Size() int {
+	return xxx_messageInfo_KeywordPlanKeywordHistoricalMetrics.Size(m)
+}
+func (m *KeywordPlanKeywordHistoricalMetrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_KeywordPlanKeywordHistoricalMetrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_KeywordPlanKeywordHistoricalMetrics proto.InternalMessageInfo
+
+func (m *KeywordPlanKeywordHistoricalMetrics) GetSearchQuery() *wrappers.StringValue {
+	if m != nil {
+		return m.SearchQuery
+	}
+	return nil
+}
+
+func (m *KeywordPlanKeywordHistoricalMetrics) GetKeywordMetrics() *common.KeywordPlanHistoricalMetrics {
+	if m != nil {
+		return m.KeywordMetrics
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*GetKeywordPlanRequest)(nil), "google.ads.googleads.v3.services.GetKeywordPlanRequest")
+	proto.RegisterType((*MutateKeywordPlansRequest)(nil), "google.ads.googleads.v3.services.MutateKeywordPlansRequest")
+	proto.RegisterType((*KeywordPlanOperation)(nil), "google.ads.googleads.v3.services.KeywordPlanOperation")
+	proto.RegisterType((*MutateKeywordPlansResponse)(nil), "google.ads.googleads.v3.services.MutateKeywordPlansResponse")
+	proto.RegisterType((*MutateKeywordPlansResult)(nil), "google.ads.googleads.v3.services.MutateKeywordPlansResult")
+	proto.RegisterType((*GenerateForecastMetricsRequest)(nil), "google.ads.googleads.v3.services.GenerateForecastMetricsRequest")
+	proto.RegisterType((*GenerateForecastMetricsResponse)(nil), "google.ads.googleads.v3.services.GenerateForecastMetricsResponse")
+	proto.RegisterType((*KeywordPlanCampaignForecast)(nil), "google.ads.googleads.v3.services.KeywordPlanCampaignForecast")
+	proto.RegisterType((*KeywordPlanAdGroupForecast)(nil), "google.ads.googleads.v3.services.KeywordPlanAdGroupForecast")
+	proto.RegisterType((*KeywordPlanKeywordForecast)(nil), "google.ads.googleads.v3.services.KeywordPlanKeywordForecast")
+	proto.RegisterType((*ForecastMetrics)(nil), "google.ads.googleads.v3.services.ForecastMetrics")
+	proto.RegisterType((*GenerateHistoricalMetricsRequest)(nil), "google.ads.googleads.v3.services.GenerateHistoricalMetricsRequest")
+	proto.RegisterType((*GenerateHistoricalMetricsResponse)(nil), "google.ads.googleads.v3.services.GenerateHistoricalMetricsResponse")
+	proto.RegisterType((*KeywordPlanKeywordHistoricalMetrics)(nil), "google.ads.googleads.v3.services.KeywordPlanKeywordHistoricalMetrics")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/keyword_plan_service.proto", fileDescriptor_512873c5d5249363)
+}
+
+var fileDescriptor_512873c5d5249363 = []byte{
+	// 1299 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xcf, 0x73, 0xdb, 0xc4,
+	0x17, 0xff, 0xca, 0xf9, 0x92, 0xd2, 0xe7, 0xf4, 0x47, 0xb6, 0x94, 0xba, 0x6e, 0x69, 0x83, 0xda,
+	0x81, 0x4c, 0x86, 0x91, 0x69, 0xd2, 0x29, 0x8c, 0xd2, 0x52, 0x94, 0xd2, 0x38, 0x2d, 0x84, 0x06,
+	0x17, 0x72, 0x80, 0x50, 0xcd, 0x46, 0xde, 0xb8, 0xc2, 0x92, 0x56, 0xdd, 0x95, 0xdc, 0xc9, 0x74,
+	0x7a, 0x61, 0x98, 0xe1, 0xc6, 0x85, 0xff, 0x80, 0x23, 0x57, 0x6e, 0xdc, 0xb8, 0x76, 0x60, 0x38,
+	0x70, 0xcb, 0x89, 0x03, 0xd3, 0x43, 0x87, 0xbf, 0x01, 0x18, 0x69, 0x77, 0x6d, 0x59, 0xb2, 0x12,
+	0xd7, 0xbd, 0xad, 0x77, 0x3f, 0xef, 0xf3, 0xf6, 0xf3, 0xde, 0xdb, 0xa7, 0x97, 0xc0, 0x72, 0x87,
+	0xd2, 0x8e, 0x47, 0x1a, 0xb8, 0xcd, 0x1b, 0x62, 0x99, 0xac, 0x7a, 0x4b, 0x0d, 0x4e, 0x58, 0xcf,
+	0x75, 0x08, 0x6f, 0x74, 0xc9, 0xee, 0x43, 0xca, 0xda, 0x76, 0xe8, 0xe1, 0xc0, 0x96, 0xbb, 0x46,
+	0xc8, 0x68, 0x44, 0xd1, 0x9c, 0xb0, 0x30, 0x70, 0x9b, 0x1b, 0x7d, 0x63, 0xa3, 0xb7, 0x64, 0x28,
+	0xe3, 0xfa, 0xbb, 0x65, 0xf4, 0x0e, 0xf5, 0x7d, 0x1a, 0x0c, 0x93, 0x8b, 0x3d, 0xc1, 0x5d, 0xbf,
+	0x5c, 0x66, 0xc9, 0x08, 0xa7, 0x31, 0xcb, 0xdf, 0x4c, 0x5a, 0x9d, 0x55, 0x56, 0xa1, 0xdb, 0xc0,
+	0x41, 0x40, 0x23, 0x1c, 0xb9, 0x34, 0xe0, 0xf2, 0xf4, 0x54, 0xe6, 0xd4, 0xf1, 0x5c, 0x12, 0x44,
+	0xf2, 0xe0, 0x7c, 0xe6, 0x60, 0xc7, 0x25, 0x5e, 0xdb, 0xde, 0x26, 0xf7, 0x71, 0xcf, 0xa5, 0x4c,
+	0x02, 0xa4, 0xd2, 0x46, 0xfa, 0x6b, 0x3b, 0xde, 0x91, 0x28, 0x1f, 0xf3, 0xae, 0x44, 0x9c, 0xcb,
+	0x23, 0x1e, 0x32, 0x1c, 0x86, 0x84, 0xe5, 0x7d, 0xb3, 0xd0, 0x69, 0xf0, 0x08, 0x47, 0xb1, 0x3c,
+	0xd0, 0x2d, 0x38, 0xd9, 0x24, 0xd1, 0x87, 0x42, 0xcb, 0x86, 0x87, 0x83, 0x16, 0x79, 0x10, 0x13,
+	0x1e, 0xa1, 0x79, 0x38, 0xa2, 0xb4, 0xda, 0x01, 0xf6, 0x49, 0x4d, 0x9b, 0xd3, 0xe6, 0x0f, 0xaf,
+	0x4c, 0xfd, 0x69, 0x55, 0x5a, 0x33, 0xea, 0xe4, 0x63, 0xec, 0x13, 0xfd, 0x6f, 0x0d, 0x4e, 0xaf,
+	0xc7, 0x11, 0x8e, 0x48, 0x86, 0x86, 0x2b, 0x9e, 0x8b, 0x50, 0x75, 0x62, 0x1e, 0x51, 0x9f, 0x30,
+	0xdb, 0x6d, 0x67, 0x59, 0x40, 0xed, 0xdf, 0x6a, 0xa3, 0x2f, 0x00, 0x68, 0x48, 0x98, 0x88, 0x57,
+	0xad, 0x32, 0x37, 0x35, 0x5f, 0x5d, 0xbc, 0x62, 0x1c, 0x94, 0x60, 0x23, 0xe3, 0xf0, 0x8e, 0x32,
+	0x97, 0xe4, 0x03, 0x3a, 0xf4, 0x26, 0x1c, 0x0b, 0x31, 0x8b, 0x5c, 0xec, 0xd9, 0x3b, 0xd8, 0xf5,
+	0x62, 0x46, 0x6a, 0x53, 0x73, 0xda, 0xfc, 0xcb, 0xad, 0xa3, 0x72, 0x7b, 0x55, 0xec, 0xa2, 0x0b,
+	0x70, 0xa4, 0x87, 0x3d, 0xb7, 0x8d, 0x23, 0x62, 0xd3, 0xc0, 0xdb, 0xad, 0xfd, 0x3f, 0x85, 0xcd,
+	0xa8, 0xcd, 0x3b, 0x81, 0xb7, 0xab, 0x7f, 0x57, 0x81, 0x57, 0x46, 0xf9, 0x45, 0xcb, 0x50, 0x8d,
+	0xc3, 0xd4, 0x36, 0x49, 0x4c, 0x6a, 0x5b, 0x5d, 0xac, 0x2b, 0x11, 0x2a, 0x33, 0xc6, 0x6a, 0x92,
+	0xbb, 0x75, 0xcc, 0xbb, 0x2d, 0x10, 0xf0, 0x64, 0x8d, 0xd6, 0x60, 0xda, 0x61, 0x04, 0x47, 0x22,
+	0xce, 0xd5, 0x45, 0xa3, 0x54, 0x7c, 0xbf, 0x02, 0xb3, 0xea, 0xd7, 0xfe, 0xd7, 0x92, 0xf6, 0x09,
+	0x93, 0xe0, 0xad, 0x55, 0x26, 0x65, 0x12, 0xf6, 0xa8, 0x06, 0xd3, 0x8c, 0xf8, 0xb4, 0x27, 0xc2,
+	0x75, 0x38, 0x39, 0x11, 0xbf, 0x57, 0xaa, 0x70, 0xb8, 0x1f, 0x5f, 0xfd, 0x67, 0x0d, 0xea, 0xa3,
+	0xf2, 0xcf, 0x43, 0x1a, 0x70, 0x82, 0x56, 0xe1, 0x64, 0x2e, 0xfa, 0x36, 0x61, 0x8c, 0xb2, 0x94,
+	0xb4, 0xba, 0x88, 0xd4, 0xf5, 0x58, 0xe8, 0x18, 0x77, 0xd3, 0xd2, 0x6c, 0x9d, 0x18, 0xce, 0xcb,
+	0xcd, 0x04, 0x8e, 0x3e, 0x85, 0x43, 0x8c, 0xf0, 0xd8, 0x8b, 0x54, 0x7d, 0x98, 0x07, 0xd7, 0xc7,
+	0xc8, 0x6b, 0xc5, 0x5e, 0xd4, 0x52, 0x54, 0xfa, 0x75, 0xa8, 0x95, 0x81, 0x92, 0x72, 0x18, 0xf1,
+	0x04, 0x72, 0xd5, 0xbf, 0x06, 0xe7, 0x9a, 0x24, 0x48, 0x62, 0x41, 0x56, 0x29, 0x23, 0x0e, 0xe6,
+	0xd1, 0x3a, 0x89, 0x98, 0xeb, 0xf4, 0x5f, 0xc0, 0x1b, 0x30, 0x93, 0xed, 0x15, 0xd9, 0x27, 0x50,
+	0xed, 0x0e, 0xbc, 0xea, 0x4f, 0x2b, 0x70, 0xbe, 0x94, 0x4a, 0x06, 0xd3, 0x03, 0xe4, 0x60, 0x3f,
+	0xc4, 0x6e, 0x27, 0xb0, 0x77, 0x24, 0x86, 0xd7, 0xb4, 0x34, 0x1e, 0xd7, 0x9e, 0xeb, 0xbd, 0xdc,
+	0x90, 0x34, 0xca, 0x53, 0x6b, 0xd6, 0xc9, 0xed, 0x70, 0xf4, 0x15, 0x20, 0xdc, 0xb6, 0x3b, 0x8c,
+	0xc6, 0x61, 0xc6, 0x9b, 0x88, 0xfe, 0xd5, 0xe7, 0xf2, 0x66, 0xb5, 0x9b, 0x09, 0x4b, 0xdf, 0xd9,
+	0x71, 0x3c, 0xbc, 0xc1, 0x91, 0x0b, 0xb3, 0x2a, 0x4a, 0x03, 0x57, 0x53, 0x13, 0xb8, 0x92, 0xcb,
+	0x81, 0xab, 0xee, 0xf0, 0x06, 0xd7, 0x7f, 0xd7, 0xe0, 0xcc, 0x3e, 0x91, 0x40, 0x1b, 0x70, 0x72,
+	0xf8, 0xcb, 0x20, 0x01, 0xf2, 0x69, 0x9e, 0x2d, 0x3c, 0xe9, 0xbb, 0x11, 0x73, 0x83, 0xce, 0x26,
+	0xf6, 0x62, 0xd2, 0x3a, 0xd1, 0x2d, 0x32, 0xa3, 0x7b, 0x30, 0x5b, 0x48, 0x9b, 0x7c, 0x9e, 0x97,
+	0x0e, 0x16, 0x97, 0x2f, 0x86, 0xe3, 0xf9, 0x4c, 0xe9, 0xbf, 0x6a, 0x50, 0x2f, 0x8f, 0x36, 0xba,
+	0x93, 0x13, 0xa4, 0x92, 0x3a, 0x96, 0x20, 0xd4, 0x2d, 0x10, 0xa3, 0x2f, 0x61, 0xb6, 0x50, 0x18,
+	0x93, 0xeb, 0x39, 0x96, 0x2b, 0x06, 0x7d, 0x6f, 0x58, 0x4e, 0x2e, 0xa3, 0xe8, 0x1e, 0xbc, 0x36,
+	0x52, 0x8e, 0x2d, 0x77, 0xc7, 0x92, 0x75, 0xba, 0x28, 0x4b, 0xfa, 0x41, 0x5b, 0x70, 0x3c, 0x5f,
+	0x8a, 0x2f, 0x20, 0x2e, 0x57, 0x7e, 0xfa, 0x4f, 0x15, 0x38, 0x96, 0x03, 0xa1, 0xf7, 0xa0, 0xea,
+	0xfa, 0x21, 0x23, 0x9c, 0xa7, 0xdf, 0xbf, 0xb2, 0xfb, 0x7f, 0x40, 0xe3, 0x6d, 0x8f, 0x88, 0xfb,
+	0x67, 0x0d, 0x90, 0x01, 0x53, 0x4e, 0xc4, 0xe4, 0x25, 0xf7, 0xb7, 0x4b, 0x80, 0xe8, 0x2a, 0x54,
+	0x71, 0x8f, 0x30, 0xdc, 0x21, 0xb6, 0x13, 0x3a, 0xb2, 0x13, 0x9f, 0x29, 0xd8, 0xdd, 0x0a, 0xa2,
+	0x2b, 0x97, 0x85, 0x19, 0x48, 0xfc, 0x8d, 0xd0, 0x41, 0x97, 0x61, 0xda, 0xf1, 0x5c, 0xa7, 0xcb,
+	0x6b, 0x2f, 0x8d, 0xe1, 0x50, 0x62, 0x13, 0x9f, 0x0e, 0xe5, 0x91, 0xed, 0xbb, 0x0e, 0xa3, 0xbc,
+	0x36, 0x3d, 0x86, 0xcf, 0x04, 0xbf, 0x9e, 0xc2, 0xf5, 0xdb, 0x30, 0xa7, 0x7a, 0xe3, 0x9a, 0xcb,
+	0x23, 0xca, 0x5c, 0x07, 0x7b, 0x13, 0x36, 0xda, 0x6f, 0x34, 0x78, 0x7d, 0x1f, 0x32, 0xd9, 0x6a,
+	0x6d, 0x38, 0xe4, 0x8b, 0x2d, 0xd9, 0x5f, 0x6f, 0x4e, 0xd2, 0x86, 0x8a, 0xfc, 0x8a, 0x55, 0xff,
+	0x4d, 0x83, 0x0b, 0x63, 0x18, 0xa0, 0xeb, 0x30, 0xc3, 0x09, 0x66, 0xce, 0x7d, 0xfb, 0x41, 0x4c,
+	0xd8, 0xee, 0x58, 0xd5, 0x5d, 0x15, 0x16, 0x9f, 0x24, 0x06, 0x88, 0x80, 0x2a, 0x42, 0x5b, 0x29,
+	0x12, 0x95, 0x52, 0xde, 0x58, 0xe5, 0x30, 0x9c, 0x9d, 0x0b, 0x0a, 0x42, 0x8e, 0x4a, 0x52, 0xf9,
+	0x7b, 0xf1, 0xd9, 0x21, 0x40, 0x19, 0x83, 0xbb, 0x22, 0x28, 0xe8, 0x17, 0x0d, 0x8e, 0x0e, 0x8f,
+	0x98, 0xe8, 0x9d, 0x83, 0x23, 0x39, 0x72, 0x28, 0xad, 0x3f, 0xe7, 0x2c, 0xa3, 0xaf, 0xee, 0x59,
+	0xc3, 0x9f, 0xf0, 0xaf, 0xff, 0xf8, 0xeb, 0xfb, 0xca, 0xdb, 0xc8, 0x48, 0x46, 0xf9, 0x47, 0x43,
+	0x27, 0xd7, 0xd4, 0x34, 0xca, 0x1b, 0x0b, 0x8d, 0x4c, 0xb5, 0xf0, 0xc6, 0xc2, 0x63, 0xf4, 0x54,
+	0x03, 0x54, 0x1c, 0x13, 0xd0, 0xf2, 0x64, 0x13, 0x88, 0xd0, 0x72, 0x75, 0xc2, 0xf1, 0x25, 0xad,
+	0x4e, 0xfd, 0xb3, 0x3d, 0xeb, 0xd5, 0xcc, 0x5c, 0xfd, 0xd6, 0x60, 0xdc, 0x4d, 0x25, 0x5e, 0xd1,
+	0x2f, 0xa5, 0x7f, 0xe7, 0xf4, 0x35, 0x3d, 0xca, 0x80, 0xaf, 0x2d, 0x3c, 0x1e, 0x52, 0x68, 0xfa,
+	0xa9, 0x1f, 0x53, 0x5b, 0x40, 0xff, 0x6a, 0x70, 0xaa, 0x64, 0x06, 0x41, 0xef, 0x8f, 0x93, 0xb5,
+	0xfd, 0x26, 0xa1, 0xba, 0xf5, 0x02, 0x0c, 0x52, 0xb7, 0xbd, 0x67, 0x0d, 0x3d, 0xf2, 0x54, 0xed,
+	0x6d, 0xfd, 0x66, 0x9a, 0xd0, 0xec, 0xc1, 0x7e, 0xf9, 0x34, 0x3b, 0xa3, 0xbd, 0x24, 0x11, 0xf8,
+	0xb6, 0x02, 0xa7, 0x4b, 0x9b, 0x03, 0x5a, 0x19, 0x5f, 0x41, 0x59, 0x9b, 0xaa, 0xdf, 0x78, 0x21,
+	0x0e, 0x19, 0x07, 0x3c, 0x2a, 0x0e, 0x1f, 0xe9, 0xcd, 0xc9, 0xe2, 0x50, 0xf0, 0x63, 0x6a, 0x0b,
+	0xf5, 0x33, 0x4f, 0xac, 0xda, 0xe0, 0x7a, 0x72, 0x15, 0xba, 0x3c, 0x69, 0x0e, 0x2b, 0xff, 0x68,
+	0x70, 0xd1, 0xa1, 0xfe, 0x81, 0x52, 0x56, 0x4e, 0x15, 0x5b, 0xc2, 0x46, 0xd2, 0xb1, 0x36, 0xb4,
+	0xcf, 0xd7, 0xa4, 0x71, 0x87, 0x7a, 0x38, 0xe8, 0x18, 0x94, 0x75, 0x1a, 0x1d, 0x12, 0xa4, 0xfd,
+	0xac, 0x31, 0x70, 0x57, 0xfe, 0xcf, 0x81, 0x65, 0xb5, 0xf8, 0xa1, 0x32, 0xd5, 0xb4, 0xac, 0x1f,
+	0x2b, 0x73, 0x4d, 0x41, 0x68, 0xb5, 0xb9, 0x21, 0x96, 0xc9, 0x6a, 0x73, 0xc9, 0x90, 0x8e, 0xf9,
+	0x13, 0x05, 0xd9, 0xb2, 0xda, 0x7c, 0xab, 0x0f, 0xd9, 0xda, 0x5c, 0xda, 0x52, 0x90, 0x67, 0x95,
+	0x8b, 0x62, 0xdf, 0x34, 0xad, 0x36, 0x37, 0xcd, 0x3e, 0xc8, 0x34, 0x37, 0x97, 0x4c, 0x53, 0xc1,
+	0xb6, 0xa7, 0xd3, 0x7b, 0x2e, 0xfd, 0x17, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x6a, 0x7c, 0x44, 0xc3,
+	0x10, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// KeywordPlanServiceClient is the client API for KeywordPlanService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type KeywordPlanServiceClient interface {
+	// Returns the requested plan in full detail.
+	GetKeywordPlan(ctx context.Context, in *GetKeywordPlanRequest, opts ...grpc.CallOption) (*resources.KeywordPlan, error)
+	// Creates, updates, or removes keyword plans. Operation statuses are
+	// returned.
+	MutateKeywordPlans(ctx context.Context, in *MutateKeywordPlansRequest, opts ...grpc.CallOption) (*MutateKeywordPlansResponse, error)
+	// Returns the requested Keyword Plan forecasts.
+	GenerateForecastMetrics(ctx context.Context, in *GenerateForecastMetricsRequest, opts ...grpc.CallOption) (*GenerateForecastMetricsResponse, error)
+	// Returns the requested Keyword Plan historical metrics.
+	GenerateHistoricalMetrics(ctx context.Context, in *GenerateHistoricalMetricsRequest, opts ...grpc.CallOption) (*GenerateHistoricalMetricsResponse, error)
+}
+
+type keywordPlanServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewKeywordPlanServiceClient(cc grpc.ClientConnInterface) KeywordPlanServiceClient {
+	return &keywordPlanServiceClient{cc}
+}
+
+func (c *keywordPlanServiceClient) GetKeywordPlan(ctx context.Context, in *GetKeywordPlanRequest, opts ...grpc.CallOption) (*resources.KeywordPlan, error) {
+	out := new(resources.KeywordPlan)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanService/GetKeywordPlan", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *keywordPlanServiceClient) MutateKeywordPlans(ctx context.Context, in *MutateKeywordPlansRequest, opts ...grpc.CallOption) (*MutateKeywordPlansResponse, error) {
+	out := new(MutateKeywordPlansResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanService/MutateKeywordPlans", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *keywordPlanServiceClient) GenerateForecastMetrics(ctx context.Context, in *GenerateForecastMetricsRequest, opts ...grpc.CallOption) (*GenerateForecastMetricsResponse, error) {
+	out := new(GenerateForecastMetricsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanService/GenerateForecastMetrics", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *keywordPlanServiceClient) GenerateHistoricalMetrics(ctx context.Context, in *GenerateHistoricalMetricsRequest, opts ...grpc.CallOption) (*GenerateHistoricalMetricsResponse, error) {
+	out := new(GenerateHistoricalMetricsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanService/GenerateHistoricalMetrics", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// KeywordPlanServiceServer is the server API for KeywordPlanService service.
+type KeywordPlanServiceServer interface {
+	// Returns the requested plan in full detail.
+	GetKeywordPlan(context.Context, *GetKeywordPlanRequest) (*resources.KeywordPlan, error)
+	// Creates, updates, or removes keyword plans. Operation statuses are
+	// returned.
+	MutateKeywordPlans(context.Context, *MutateKeywordPlansRequest) (*MutateKeywordPlansResponse, error)
+	// Returns the requested Keyword Plan forecasts.
+	GenerateForecastMetrics(context.Context, *GenerateForecastMetricsRequest) (*GenerateForecastMetricsResponse, error)
+	// Returns the requested Keyword Plan historical metrics.
+	GenerateHistoricalMetrics(context.Context, *GenerateHistoricalMetricsRequest) (*GenerateHistoricalMetricsResponse, error)
+}
+
+// UnimplementedKeywordPlanServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedKeywordPlanServiceServer struct {
+}
+
+func (*UnimplementedKeywordPlanServiceServer) GetKeywordPlan(ctx context.Context, req *GetKeywordPlanRequest) (*resources.KeywordPlan, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetKeywordPlan not implemented")
+}
+func (*UnimplementedKeywordPlanServiceServer) MutateKeywordPlans(ctx context.Context, req *MutateKeywordPlansRequest) (*MutateKeywordPlansResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateKeywordPlans not implemented")
+}
+func (*UnimplementedKeywordPlanServiceServer) GenerateForecastMetrics(ctx context.Context, req *GenerateForecastMetricsRequest) (*GenerateForecastMetricsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GenerateForecastMetrics not implemented")
+}
+func (*UnimplementedKeywordPlanServiceServer) GenerateHistoricalMetrics(ctx context.Context, req *GenerateHistoricalMetricsRequest) (*GenerateHistoricalMetricsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GenerateHistoricalMetrics not implemented")
+}
+
+func RegisterKeywordPlanServiceServer(s *grpc.Server, srv KeywordPlanServiceServer) {
+	s.RegisterService(&_KeywordPlanService_serviceDesc, srv)
+}
+
+func _KeywordPlanService_GetKeywordPlan_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetKeywordPlanRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanServiceServer).GetKeywordPlan(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanService/GetKeywordPlan",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanServiceServer).GetKeywordPlan(ctx, req.(*GetKeywordPlanRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _KeywordPlanService_MutateKeywordPlans_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateKeywordPlansRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanServiceServer).MutateKeywordPlans(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanService/MutateKeywordPlans",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanServiceServer).MutateKeywordPlans(ctx, req.(*MutateKeywordPlansRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _KeywordPlanService_GenerateForecastMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GenerateForecastMetricsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanServiceServer).GenerateForecastMetrics(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanService/GenerateForecastMetrics",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanServiceServer).GenerateForecastMetrics(ctx, req.(*GenerateForecastMetricsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _KeywordPlanService_GenerateHistoricalMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GenerateHistoricalMetricsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordPlanServiceServer).GenerateHistoricalMetrics(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanService/GenerateHistoricalMetrics",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordPlanServiceServer).GenerateHistoricalMetrics(ctx, req.(*GenerateHistoricalMetricsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _KeywordPlanService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.KeywordPlanService",
+	HandlerType: (*KeywordPlanServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetKeywordPlan",
+			Handler:    _KeywordPlanService_GetKeywordPlan_Handler,
+		},
+		{
+			MethodName: "MutateKeywordPlans",
+			Handler:    _KeywordPlanService_MutateKeywordPlans_Handler,
+		},
+		{
+			MethodName: "GenerateForecastMetrics",
+			Handler:    _KeywordPlanService_GenerateForecastMetrics_Handler,
+		},
+		{
+			MethodName: "GenerateHistoricalMetrics",
+			Handler:    _KeywordPlanService_GenerateHistoricalMetrics_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/keyword_plan_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/keyword_view_service.pb.go b/googleapis/ads/googleads/v3/services/keyword_view_service.pb.go
new file mode 100644
index 0000000..43dba1b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/keyword_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/keyword_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [KeywordViewService.GetKeywordView][google.ads.googleads.v3.services.KeywordViewService.GetKeywordView].
+type GetKeywordViewRequest struct {
+	// Required. The resource name of the keyword view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetKeywordViewRequest) Reset()         { *m = GetKeywordViewRequest{} }
+func (m *GetKeywordViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetKeywordViewRequest) ProtoMessage()    {}
+func (*GetKeywordViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_38e9ec08eaed78b3, []int{0}
+}
+
+func (m *GetKeywordViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetKeywordViewRequest.Unmarshal(m, b)
+}
+func (m *GetKeywordViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetKeywordViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetKeywordViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetKeywordViewRequest.Merge(m, src)
+}
+func (m *GetKeywordViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetKeywordViewRequest.Size(m)
+}
+func (m *GetKeywordViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetKeywordViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetKeywordViewRequest proto.InternalMessageInfo
+
+func (m *GetKeywordViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetKeywordViewRequest)(nil), "google.ads.googleads.v3.services.GetKeywordViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/keyword_view_service.proto", fileDescriptor_38e9ec08eaed78b3)
+}
+
+var fileDescriptor_38e9ec08eaed78b3 = []byte{
+	// 410 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0xeb, 0xd3, 0x40,
+	0x18, 0x26, 0x29, 0x08, 0x06, 0x75, 0x08, 0x48, 0x4b, 0x14, 0x2c, 0xa5, 0x43, 0xe9, 0x70, 0x27,
+	0x46, 0x10, 0xae, 0x38, 0x5c, 0x07, 0x2b, 0x08, 0x52, 0x2a, 0x64, 0x90, 0x40, 0xb8, 0x26, 0xaf,
+	0xf1, 0x30, 0xc9, 0xd5, 0xbb, 0x34, 0x45, 0xc4, 0xc5, 0xaf, 0xe0, 0x37, 0x70, 0xf4, 0x5b, 0xb8,
+	0x76, 0x75, 0x73, 0x72, 0x70, 0x72, 0x77, 0x15, 0x49, 0x2f, 0x97, 0xa6, 0xfa, 0x2b, 0xdd, 0x1e,
+	0xee, 0xf9, 0xf3, 0xbe, 0xef, 0x93, 0x38, 0xb3, 0x54, 0x88, 0x34, 0x03, 0xcc, 0x12, 0x85, 0x35,
+	0xac, 0x51, 0xe5, 0x63, 0x05, 0xb2, 0xe2, 0x31, 0x28, 0xfc, 0x06, 0xde, 0xed, 0x84, 0x4c, 0xa2,
+	0x8a, 0xc3, 0x2e, 0x6a, 0x5e, 0xd1, 0x46, 0x8a, 0x52, 0xb8, 0x43, 0xed, 0x40, 0x2c, 0x51, 0xa8,
+	0x35, 0xa3, 0xca, 0x47, 0xc6, 0xec, 0x3d, 0x3c, 0x17, 0x2f, 0x41, 0x89, 0xad, 0xfc, 0x37, 0x5f,
+	0xe7, 0x7a, 0x77, 0x8d, 0x6b, 0xc3, 0x31, 0x2b, 0x0a, 0x51, 0xb2, 0x92, 0x8b, 0x42, 0x35, 0x6c,
+	0xbf, 0xc3, 0xc6, 0x19, 0x87, 0xa2, 0x6c, 0x88, 0x7b, 0x1d, 0xe2, 0x15, 0x87, 0x2c, 0x89, 0xd6,
+	0xf0, 0x9a, 0x55, 0x5c, 0x48, 0x2d, 0x18, 0x51, 0xe7, 0xf6, 0x02, 0xca, 0x67, 0x7a, 0x60, 0xc0,
+	0x61, 0xb7, 0x82, 0xb7, 0x5b, 0x50, 0xa5, 0x3b, 0x71, 0x6e, 0x9a, 0x85, 0xa2, 0x82, 0xe5, 0x30,
+	0xb0, 0x86, 0xd6, 0xe4, 0xfa, 0xbc, 0xf7, 0x83, 0xda, 0xab, 0x1b, 0x86, 0x79, 0xce, 0x72, 0x78,
+	0xf0, 0xdb, 0x72, 0xdc, 0x4e, 0xc0, 0x0b, 0x7d, 0xa8, 0xfb, 0xd5, 0x72, 0x6e, 0x9d, 0x46, 0xbb,
+	0x8f, 0xd0, 0xa5, 0x76, 0xd0, 0x95, 0xcb, 0x78, 0xe8, 0xac, 0xb1, 0x2d, 0x0d, 0x75, 0x6c, 0xa3,
+	0x27, 0xdf, 0xe9, 0xe9, 0xf6, 0x1f, 0xbf, 0xfd, 0xfc, 0x64, 0xdf, 0x77, 0x51, 0xdd, 0xf3, 0xfb,
+	0x13, 0xe6, 0x71, 0xbc, 0x55, 0xa5, 0xc8, 0x41, 0x2a, 0x3c, 0x35, 0xc5, 0xd7, 0x19, 0x0a, 0x4f,
+	0x3f, 0x78, 0x77, 0xf6, 0x74, 0x70, 0x1c, 0xd7, 0xa0, 0x0d, 0x57, 0x28, 0x16, 0xf9, 0xfc, 0x8f,
+	0xe5, 0x8c, 0x63, 0x91, 0x5f, 0xbc, 0x69, 0xde, 0xff, 0xbf, 0x9d, 0x65, 0x5d, 0xfe, 0xd2, 0x7a,
+	0xf9, 0xb4, 0x31, 0xa7, 0x22, 0x63, 0x45, 0x8a, 0x84, 0x4c, 0x71, 0x0a, 0xc5, 0xe1, 0xd3, 0xe0,
+	0xe3, 0xb8, 0xf3, 0xbf, 0xe2, 0xcc, 0x80, 0xcf, 0x76, 0x6f, 0x41, 0xe9, 0x17, 0x7b, 0xb8, 0xd0,
+	0x81, 0x34, 0x51, 0x48, 0xc3, 0x1a, 0x05, 0x3e, 0x6a, 0x06, 0xab, 0xbd, 0x91, 0x84, 0x34, 0x51,
+	0x61, 0x2b, 0x09, 0x03, 0x3f, 0x34, 0x92, 0x5f, 0xf6, 0x58, 0xbf, 0x13, 0x42, 0x13, 0x45, 0x48,
+	0x2b, 0x22, 0x24, 0xf0, 0x09, 0x31, 0xb2, 0xf5, 0xb5, 0xc3, 0x9e, 0xfe, 0xdf, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0x0e, 0xbe, 0x83, 0xd8, 0x31, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// KeywordViewServiceClient is the client API for KeywordViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type KeywordViewServiceClient interface {
+	// Returns the requested keyword view in full detail.
+	GetKeywordView(ctx context.Context, in *GetKeywordViewRequest, opts ...grpc.CallOption) (*resources.KeywordView, error)
+}
+
+type keywordViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewKeywordViewServiceClient(cc grpc.ClientConnInterface) KeywordViewServiceClient {
+	return &keywordViewServiceClient{cc}
+}
+
+func (c *keywordViewServiceClient) GetKeywordView(ctx context.Context, in *GetKeywordViewRequest, opts ...grpc.CallOption) (*resources.KeywordView, error) {
+	out := new(resources.KeywordView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordViewService/GetKeywordView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// KeywordViewServiceServer is the server API for KeywordViewService service.
+type KeywordViewServiceServer interface {
+	// Returns the requested keyword view in full detail.
+	GetKeywordView(context.Context, *GetKeywordViewRequest) (*resources.KeywordView, error)
+}
+
+// UnimplementedKeywordViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedKeywordViewServiceServer struct {
+}
+
+func (*UnimplementedKeywordViewServiceServer) GetKeywordView(ctx context.Context, req *GetKeywordViewRequest) (*resources.KeywordView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetKeywordView not implemented")
+}
+
+func RegisterKeywordViewServiceServer(s *grpc.Server, srv KeywordViewServiceServer) {
+	s.RegisterService(&_KeywordViewService_serviceDesc, srv)
+}
+
+func _KeywordViewService_GetKeywordView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetKeywordViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(KeywordViewServiceServer).GetKeywordView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.KeywordViewService/GetKeywordView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(KeywordViewServiceServer).GetKeywordView(ctx, req.(*GetKeywordViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _KeywordViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.KeywordViewService",
+	HandlerType: (*KeywordViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetKeywordView",
+			Handler:    _KeywordViewService_GetKeywordView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/keyword_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/label_service.pb.go b/googleapis/ads/googleads/v3/services/label_service.pb.go
new file mode 100644
index 0000000..ef90bd1
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/label_service.pb.go
@@ -0,0 +1,527 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/label_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [LabelService.GetLabel][google.ads.googleads.v3.services.LabelService.GetLabel].
+type GetLabelRequest struct {
+	// Required. The resource name of the label to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetLabelRequest) Reset()         { *m = GetLabelRequest{} }
+func (m *GetLabelRequest) String() string { return proto.CompactTextString(m) }
+func (*GetLabelRequest) ProtoMessage()    {}
+func (*GetLabelRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a44839ef2e1ad921, []int{0}
+}
+
+func (m *GetLabelRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetLabelRequest.Unmarshal(m, b)
+}
+func (m *GetLabelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetLabelRequest.Marshal(b, m, deterministic)
+}
+func (m *GetLabelRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetLabelRequest.Merge(m, src)
+}
+func (m *GetLabelRequest) XXX_Size() int {
+	return xxx_messageInfo_GetLabelRequest.Size(m)
+}
+func (m *GetLabelRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetLabelRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetLabelRequest proto.InternalMessageInfo
+
+func (m *GetLabelRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [LabelService.MutateLabels][google.ads.googleads.v3.services.LabelService.MutateLabels].
+type MutateLabelsRequest struct {
+	// Required. ID of the customer whose labels are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on labels.
+	Operations []*LabelOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateLabelsRequest) Reset()         { *m = MutateLabelsRequest{} }
+func (m *MutateLabelsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateLabelsRequest) ProtoMessage()    {}
+func (*MutateLabelsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a44839ef2e1ad921, []int{1}
+}
+
+func (m *MutateLabelsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateLabelsRequest.Unmarshal(m, b)
+}
+func (m *MutateLabelsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateLabelsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateLabelsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateLabelsRequest.Merge(m, src)
+}
+func (m *MutateLabelsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateLabelsRequest.Size(m)
+}
+func (m *MutateLabelsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateLabelsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateLabelsRequest proto.InternalMessageInfo
+
+func (m *MutateLabelsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateLabelsRequest) GetOperations() []*LabelOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateLabelsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateLabelsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove, update) on a label.
+type LabelOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*LabelOperation_Create
+	//	*LabelOperation_Update
+	//	*LabelOperation_Remove
+	Operation            isLabelOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *LabelOperation) Reset()         { *m = LabelOperation{} }
+func (m *LabelOperation) String() string { return proto.CompactTextString(m) }
+func (*LabelOperation) ProtoMessage()    {}
+func (*LabelOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a44839ef2e1ad921, []int{2}
+}
+
+func (m *LabelOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LabelOperation.Unmarshal(m, b)
+}
+func (m *LabelOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LabelOperation.Marshal(b, m, deterministic)
+}
+func (m *LabelOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LabelOperation.Merge(m, src)
+}
+func (m *LabelOperation) XXX_Size() int {
+	return xxx_messageInfo_LabelOperation.Size(m)
+}
+func (m *LabelOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_LabelOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LabelOperation proto.InternalMessageInfo
+
+func (m *LabelOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isLabelOperation_Operation interface {
+	isLabelOperation_Operation()
+}
+
+type LabelOperation_Create struct {
+	Create *resources.Label `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type LabelOperation_Update struct {
+	Update *resources.Label `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type LabelOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*LabelOperation_Create) isLabelOperation_Operation() {}
+
+func (*LabelOperation_Update) isLabelOperation_Operation() {}
+
+func (*LabelOperation_Remove) isLabelOperation_Operation() {}
+
+func (m *LabelOperation) GetOperation() isLabelOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *LabelOperation) GetCreate() *resources.Label {
+	if x, ok := m.GetOperation().(*LabelOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *LabelOperation) GetUpdate() *resources.Label {
+	if x, ok := m.GetOperation().(*LabelOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *LabelOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*LabelOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*LabelOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*LabelOperation_Create)(nil),
+		(*LabelOperation_Update)(nil),
+		(*LabelOperation_Remove)(nil),
+	}
+}
+
+// Response message for a labels mutate.
+type MutateLabelsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateLabelResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *MutateLabelsResponse) Reset()         { *m = MutateLabelsResponse{} }
+func (m *MutateLabelsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateLabelsResponse) ProtoMessage()    {}
+func (*MutateLabelsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a44839ef2e1ad921, []int{3}
+}
+
+func (m *MutateLabelsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateLabelsResponse.Unmarshal(m, b)
+}
+func (m *MutateLabelsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateLabelsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateLabelsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateLabelsResponse.Merge(m, src)
+}
+func (m *MutateLabelsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateLabelsResponse.Size(m)
+}
+func (m *MutateLabelsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateLabelsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateLabelsResponse proto.InternalMessageInfo
+
+func (m *MutateLabelsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateLabelsResponse) GetResults() []*MutateLabelResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for a label mutate.
+type MutateLabelResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateLabelResult) Reset()         { *m = MutateLabelResult{} }
+func (m *MutateLabelResult) String() string { return proto.CompactTextString(m) }
+func (*MutateLabelResult) ProtoMessage()    {}
+func (*MutateLabelResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a44839ef2e1ad921, []int{4}
+}
+
+func (m *MutateLabelResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateLabelResult.Unmarshal(m, b)
+}
+func (m *MutateLabelResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateLabelResult.Marshal(b, m, deterministic)
+}
+func (m *MutateLabelResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateLabelResult.Merge(m, src)
+}
+func (m *MutateLabelResult) XXX_Size() int {
+	return xxx_messageInfo_MutateLabelResult.Size(m)
+}
+func (m *MutateLabelResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateLabelResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateLabelResult proto.InternalMessageInfo
+
+func (m *MutateLabelResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetLabelRequest)(nil), "google.ads.googleads.v3.services.GetLabelRequest")
+	proto.RegisterType((*MutateLabelsRequest)(nil), "google.ads.googleads.v3.services.MutateLabelsRequest")
+	proto.RegisterType((*LabelOperation)(nil), "google.ads.googleads.v3.services.LabelOperation")
+	proto.RegisterType((*MutateLabelsResponse)(nil), "google.ads.googleads.v3.services.MutateLabelsResponse")
+	proto.RegisterType((*MutateLabelResult)(nil), "google.ads.googleads.v3.services.MutateLabelResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/label_service.proto", fileDescriptor_a44839ef2e1ad921)
+}
+
+var fileDescriptor_a44839ef2e1ad921 = []byte{
+	// 747 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0x4f, 0x6f, 0xd3, 0x30,
+	0x14, 0x27, 0x2d, 0x1a, 0x9b, 0xdb, 0x6d, 0x9a, 0xc7, 0x9f, 0xaa, 0x20, 0x51, 0x85, 0x49, 0x54,
+	0x05, 0x92, 0xd1, 0x02, 0x42, 0x99, 0x26, 0x91, 0x4a, 0x6c, 0x43, 0x62, 0x6c, 0xca, 0xc4, 0x0e,
+	0xa8, 0x52, 0xe5, 0x26, 0x5e, 0x89, 0x96, 0xc4, 0xc1, 0x76, 0x2a, 0x4d, 0xd3, 0x2e, 0x7c, 0x05,
+	0xbe, 0x01, 0x27, 0x40, 0xe2, 0x8b, 0xec, 0xc0, 0x85, 0xdb, 0x4e, 0x3b, 0x70, 0xe2, 0x13, 0x70,
+	0xe0, 0x80, 0x12, 0xdb, 0x6d, 0x3a, 0x98, 0xca, 0x6e, 0xcf, 0x7e, 0xbf, 0xdf, 0xef, 0x3d, 0xbf,
+	0x3f, 0x09, 0x78, 0xd4, 0x27, 0xa4, 0x1f, 0x60, 0x13, 0x79, 0xcc, 0x14, 0x66, 0x6a, 0x0d, 0x5a,
+	0x26, 0xc3, 0x74, 0xe0, 0xbb, 0x98, 0x99, 0x01, 0xea, 0xe1, 0xa0, 0x2b, 0x8f, 0x46, 0x4c, 0x09,
+	0x27, 0xb0, 0x26, 0xa0, 0x06, 0xf2, 0x98, 0x31, 0x64, 0x19, 0x83, 0x96, 0xa1, 0x58, 0xd5, 0x07,
+	0xe7, 0xe9, 0x52, 0xcc, 0x48, 0x42, 0x87, 0xc2, 0x42, 0xb0, 0x7a, 0x4b, 0xc1, 0x63, 0xdf, 0x44,
+	0x51, 0x44, 0x38, 0xe2, 0x3e, 0x89, 0x98, 0xf4, 0xde, 0xc8, 0x79, 0xdd, 0xc0, 0xc7, 0x11, 0x97,
+	0x8e, 0xdb, 0x39, 0xc7, 0x9e, 0x8f, 0x03, 0xaf, 0xdb, 0xc3, 0x6f, 0xd1, 0xc0, 0x27, 0x54, 0x02,
+	0x64, 0xa2, 0x66, 0x76, 0xea, 0x25, 0x7b, 0x12, 0x15, 0x22, 0xb6, 0x7f, 0x46, 0x9b, 0xc6, 0xae,
+	0xc9, 0x38, 0xe2, 0x89, 0x0c, 0xaa, 0xaf, 0x80, 0xf9, 0x75, 0xcc, 0x5f, 0xa6, 0x49, 0x3a, 0xf8,
+	0x5d, 0x82, 0x19, 0x87, 0x75, 0x30, 0xab, 0xd2, 0xef, 0x46, 0x28, 0xc4, 0x15, 0xad, 0xa6, 0xd5,
+	0x67, 0xda, 0xc5, 0x53, 0xbb, 0xe0, 0x94, 0x95, 0xe7, 0x15, 0x0a, 0xb1, 0x7e, 0xaa, 0x81, 0xc5,
+	0xcd, 0x84, 0x23, 0x8e, 0x33, 0x01, 0xa6, 0x14, 0x96, 0x40, 0xc9, 0x4d, 0x18, 0x27, 0x21, 0xa6,
+	0x5d, 0xdf, 0xcb, 0xf3, 0x81, 0xba, 0x7f, 0xe1, 0xc1, 0xd7, 0x00, 0x90, 0x18, 0x53, 0x51, 0x83,
+	0x4a, 0xa1, 0x56, 0xac, 0x97, 0x9a, 0xcb, 0xc6, 0xa4, 0x9a, 0x1b, 0x59, 0xa8, 0x2d, 0x45, 0x94,
+	0xb2, 0x23, 0x21, 0x78, 0x17, 0xcc, 0xc7, 0x88, 0x72, 0x1f, 0x05, 0xdd, 0x3d, 0xe4, 0x07, 0x09,
+	0xc5, 0x95, 0x62, 0x4d, 0xab, 0x4f, 0x3b, 0x73, 0xf2, 0x7a, 0x4d, 0xdc, 0xc2, 0x3b, 0x60, 0x76,
+	0x80, 0x02, 0xdf, 0x43, 0x1c, 0x77, 0x49, 0x14, 0x1c, 0x54, 0x2e, 0x67, 0xb0, 0xb2, 0xba, 0xdc,
+	0x8a, 0x82, 0x03, 0xfd, 0xb7, 0x06, 0xe6, 0xc6, 0x23, 0xc2, 0x15, 0x50, 0x4a, 0xe2, 0x8c, 0x95,
+	0x16, 0x38, 0x63, 0x95, 0x9a, 0x55, 0x95, 0xb8, 0xea, 0x81, 0xb1, 0x96, 0xf6, 0x60, 0x13, 0xb1,
+	0x7d, 0x07, 0x08, 0x78, 0x6a, 0xc3, 0x36, 0x98, 0x72, 0x29, 0x46, 0x5c, 0x54, 0xb5, 0xd4, 0xac,
+	0x9f, 0xfb, 0xe0, 0xe1, 0x08, 0x89, 0x17, 0x6f, 0x5c, 0x72, 0x24, 0x33, 0xd5, 0x10, 0x8a, 0x95,
+	0xc2, 0xc5, 0x35, 0x04, 0x13, 0x56, 0xc0, 0x14, 0xc5, 0x21, 0x19, 0x88, 0xe2, 0xcc, 0xa4, 0x1e,
+	0x71, 0x6e, 0x97, 0xc0, 0xcc, 0xb0, 0x9a, 0xfa, 0x57, 0x0d, 0x5c, 0x1d, 0xef, 0x30, 0x8b, 0x49,
+	0xc4, 0x30, 0x5c, 0x03, 0xd7, 0xce, 0x54, 0xb9, 0x8b, 0x29, 0x25, 0x34, 0x93, 0x2b, 0x35, 0xa1,
+	0x4a, 0x89, 0xc6, 0xae, 0xb1, 0x93, 0x0d, 0x9c, 0xb3, 0x38, 0x5e, 0xff, 0xe7, 0x29, 0x1c, 0x6e,
+	0x82, 0x2b, 0x14, 0xb3, 0x24, 0xe0, 0x6a, 0x02, 0x5a, 0x93, 0x27, 0x20, 0x97, 0x90, 0x93, 0x71,
+	0x1d, 0xa5, 0xa1, 0x3f, 0x05, 0x0b, 0x7f, 0x79, 0xd3, 0x46, 0xff, 0x63, 0xa0, 0xc7, 0x67, 0xb9,
+	0xf9, 0xa9, 0x08, 0xca, 0x19, 0x69, 0x47, 0x84, 0x81, 0x9f, 0x35, 0x30, 0xad, 0x56, 0x03, 0x3e,
+	0x9c, 0x9c, 0xd5, 0x99, 0x35, 0xaa, 0xfe, 0x77, 0x57, 0xf4, 0x67, 0x27, 0xf6, 0x78, 0x82, 0xef,
+	0xbf, 0xff, 0xf8, 0x50, 0x68, 0xc0, 0x7a, 0xfa, 0x25, 0x39, 0x1c, 0xf3, 0xac, 0xaa, 0xfd, 0x61,
+	0x66, 0x43, 0x7c, 0x5a, 0x98, 0xd9, 0x38, 0x82, 0xdf, 0x34, 0x50, 0xce, 0xb7, 0x09, 0x3e, 0xbe,
+	0x50, 0x15, 0xd5, 0xe2, 0x56, 0x9f, 0x5c, 0x94, 0x26, 0xa6, 0x41, 0xdf, 0x3a, 0xb1, 0xaf, 0xe7,
+	0x36, 0xfe, 0xfe, 0x68, 0x1d, 0xb3, 0xa7, 0x2c, 0xeb, 0xf7, 0xd2, 0xa7, 0x8c, 0x72, 0x3f, 0xcc,
+	0x81, 0x57, 0x1b, 0x47, 0xf2, 0x25, 0x56, 0x98, 0x69, 0x5b, 0x5a, 0xa3, 0x7a, 0xf3, 0xd8, 0xae,
+	0x8c, 0xe2, 0x4b, 0x2b, 0xf6, 0x99, 0xe1, 0x92, 0xb0, 0xfd, 0x4b, 0x03, 0x4b, 0x2e, 0x09, 0x27,
+	0xe6, 0xda, 0x5e, 0xc8, 0x37, 0x74, 0x3b, 0x5d, 0xcc, 0x6d, 0xed, 0xcd, 0x86, 0xa4, 0xf5, 0x49,
+	0x80, 0xa2, 0xbe, 0x41, 0x68, 0xdf, 0xec, 0xe3, 0x28, 0x5b, 0x5b, 0x73, 0x14, 0xe8, 0xfc, 0x5f,
+	0xc5, 0x8a, 0x32, 0x3e, 0x16, 0x8a, 0xeb, 0xb6, 0xfd, 0xa5, 0x50, 0x5b, 0x17, 0x82, 0xb6, 0xc7,
+	0x0c, 0x61, 0xa6, 0xd6, 0x6e, 0xcb, 0x90, 0x81, 0xd9, 0xb1, 0x82, 0x74, 0x6c, 0x8f, 0x75, 0x86,
+	0x90, 0xce, 0x6e, 0xab, 0xa3, 0x20, 0x3f, 0x0b, 0x4b, 0xe2, 0xde, 0xb2, 0x6c, 0x8f, 0x59, 0xd6,
+	0x10, 0x64, 0x59, 0xbb, 0x2d, 0xcb, 0x52, 0xb0, 0xde, 0x54, 0x96, 0x67, 0xeb, 0x4f, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0x0a, 0x59, 0x01, 0xe0, 0xd1, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// LabelServiceClient is the client API for LabelService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type LabelServiceClient interface {
+	// Returns the requested label in full detail.
+	GetLabel(ctx context.Context, in *GetLabelRequest, opts ...grpc.CallOption) (*resources.Label, error)
+	// Creates, updates, or removes labels. Operation statuses are returned.
+	MutateLabels(ctx context.Context, in *MutateLabelsRequest, opts ...grpc.CallOption) (*MutateLabelsResponse, error)
+}
+
+type labelServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewLabelServiceClient(cc grpc.ClientConnInterface) LabelServiceClient {
+	return &labelServiceClient{cc}
+}
+
+func (c *labelServiceClient) GetLabel(ctx context.Context, in *GetLabelRequest, opts ...grpc.CallOption) (*resources.Label, error) {
+	out := new(resources.Label)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.LabelService/GetLabel", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *labelServiceClient) MutateLabels(ctx context.Context, in *MutateLabelsRequest, opts ...grpc.CallOption) (*MutateLabelsResponse, error) {
+	out := new(MutateLabelsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.LabelService/MutateLabels", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// LabelServiceServer is the server API for LabelService service.
+type LabelServiceServer interface {
+	// Returns the requested label in full detail.
+	GetLabel(context.Context, *GetLabelRequest) (*resources.Label, error)
+	// Creates, updates, or removes labels. Operation statuses are returned.
+	MutateLabels(context.Context, *MutateLabelsRequest) (*MutateLabelsResponse, error)
+}
+
+// UnimplementedLabelServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedLabelServiceServer struct {
+}
+
+func (*UnimplementedLabelServiceServer) GetLabel(ctx context.Context, req *GetLabelRequest) (*resources.Label, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetLabel not implemented")
+}
+func (*UnimplementedLabelServiceServer) MutateLabels(ctx context.Context, req *MutateLabelsRequest) (*MutateLabelsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateLabels not implemented")
+}
+
+func RegisterLabelServiceServer(s *grpc.Server, srv LabelServiceServer) {
+	s.RegisterService(&_LabelService_serviceDesc, srv)
+}
+
+func _LabelService_GetLabel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetLabelRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(LabelServiceServer).GetLabel(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.LabelService/GetLabel",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(LabelServiceServer).GetLabel(ctx, req.(*GetLabelRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _LabelService_MutateLabels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateLabelsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(LabelServiceServer).MutateLabels(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.LabelService/MutateLabels",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(LabelServiceServer).MutateLabels(ctx, req.(*MutateLabelsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _LabelService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.LabelService",
+	HandlerType: (*LabelServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetLabel",
+			Handler:    _LabelService_GetLabel_Handler,
+		},
+		{
+			MethodName: "MutateLabels",
+			Handler:    _LabelService_MutateLabels_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/label_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/landing_page_view_service.pb.go b/googleapis/ads/googleads/v3/services/landing_page_view_service.pb.go
new file mode 100644
index 0000000..18ad360
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/landing_page_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/landing_page_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [LandingPageViewService.GetLandingPageView][google.ads.googleads.v3.services.LandingPageViewService.GetLandingPageView].
+type GetLandingPageViewRequest struct {
+	// Required. The resource name of the landing page view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetLandingPageViewRequest) Reset()         { *m = GetLandingPageViewRequest{} }
+func (m *GetLandingPageViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetLandingPageViewRequest) ProtoMessage()    {}
+func (*GetLandingPageViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0c3c342ff39fd41d, []int{0}
+}
+
+func (m *GetLandingPageViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetLandingPageViewRequest.Unmarshal(m, b)
+}
+func (m *GetLandingPageViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetLandingPageViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetLandingPageViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetLandingPageViewRequest.Merge(m, src)
+}
+func (m *GetLandingPageViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetLandingPageViewRequest.Size(m)
+}
+func (m *GetLandingPageViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetLandingPageViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetLandingPageViewRequest proto.InternalMessageInfo
+
+func (m *GetLandingPageViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetLandingPageViewRequest)(nil), "google.ads.googleads.v3.services.GetLandingPageViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/landing_page_view_service.proto", fileDescriptor_0c3c342ff39fd41d)
+}
+
+var fileDescriptor_0c3c342ff39fd41d = []byte{
+	// 418 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0x8b, 0xd4, 0x40,
+	0x1c, 0x25, 0x39, 0x10, 0x0c, 0xda, 0xa4, 0xd0, 0x33, 0x27, 0xb8, 0x1c, 0x57, 0x1c, 0x57, 0xcc,
+	0xc0, 0xc6, 0xc6, 0x39, 0x04, 0x67, 0x41, 0x56, 0x44, 0x64, 0x39, 0x21, 0x85, 0x04, 0xc2, 0x5c,
+	0xf2, 0x73, 0x1c, 0x48, 0x66, 0x62, 0x26, 0x9b, 0x2b, 0xc4, 0x66, 0x3b, 0x6b, 0xbf, 0x81, 0xa5,
+	0x1f, 0x65, 0x3b, 0xb1, 0xb3, 0xb2, 0xb0, 0xf2, 0x53, 0x48, 0x76, 0x32, 0xd9, 0x3f, 0xb7, 0x61,
+	0xbb, 0xc7, 0xbc, 0xf7, 0x7b, 0xef, 0xf7, 0x67, 0xbc, 0x17, 0x5c, 0x29, 0x9e, 0x03, 0x66, 0x99,
+	0xc6, 0x06, 0xb6, 0xa8, 0x09, 0xb1, 0x86, 0xaa, 0x11, 0x29, 0x68, 0x9c, 0x33, 0x99, 0x09, 0xc9,
+	0x93, 0x92, 0x71, 0x48, 0x1a, 0x01, 0x37, 0x49, 0x47, 0xa1, 0xb2, 0x52, 0xb5, 0xf2, 0x47, 0xa6,
+	0x0c, 0xb1, 0x4c, 0xa3, 0xde, 0x01, 0x35, 0x21, 0xb2, 0x0e, 0xc1, 0xb3, 0xa1, 0x8c, 0x0a, 0xb4,
+	0x9a, 0x57, 0x7b, 0x43, 0x8c, 0x79, 0xf0, 0xd8, 0x96, 0x96, 0x02, 0x33, 0x29, 0x55, 0xcd, 0x6a,
+	0xa1, 0xa4, 0xee, 0xd8, 0x87, 0x1b, 0x6c, 0x9a, 0x0b, 0x90, 0x75, 0x47, 0x3c, 0xd9, 0x20, 0x3e,
+	0x08, 0xc8, 0xb3, 0xe4, 0x1a, 0x3e, 0xb2, 0x46, 0xa8, 0xca, 0x08, 0x4e, 0x5f, 0x7a, 0x8f, 0xa6,
+	0x50, 0xbf, 0x31, 0xa9, 0x33, 0xc6, 0x21, 0x12, 0x70, 0x73, 0x05, 0x9f, 0xe6, 0xa0, 0x6b, 0xff,
+	0xdc, 0xbb, 0x6f, 0x3b, 0x4b, 0x24, 0x2b, 0xe0, 0xd8, 0x19, 0x39, 0xe7, 0x77, 0x27, 0x47, 0x7f,
+	0xa8, 0x7b, 0x75, 0xcf, 0x32, 0x6f, 0x59, 0x01, 0xe3, 0xaf, 0xae, 0xf7, 0x60, 0xc7, 0xe4, 0x9d,
+	0x99, 0xda, 0xff, 0xe9, 0x78, 0xfe, 0xed, 0x08, 0xff, 0x12, 0x1d, 0x5a, 0x17, 0x1a, 0x6c, 0x2c,
+	0x18, 0x0f, 0x16, 0xf7, 0x9b, 0x44, 0x3b, 0xa5, 0xa7, 0xaf, 0x7f, 0xd3, 0xed, 0x69, 0x16, 0xbf,
+	0xfe, 0x7e, 0x73, 0x9f, 0xfa, 0xe3, 0xf6, 0x00, 0x9f, 0xb7, 0x98, 0xe7, 0xe9, 0x5c, 0xd7, 0xaa,
+	0x80, 0x4a, 0xe3, 0x0b, 0x7b, 0x11, 0xeb, 0xa3, 0xf1, 0xc5, 0x97, 0xe0, 0x64, 0x49, 0x8f, 0xd7,
+	0xb1, 0x1d, 0x2a, 0x85, 0x46, 0xa9, 0x2a, 0x26, 0x0b, 0xd7, 0x3b, 0x4b, 0x55, 0x71, 0x70, 0xbe,
+	0xc9, 0xc9, 0xfe, 0x8d, 0xcd, 0xda, 0xc3, 0xcc, 0x9c, 0xf7, 0xaf, 0x3a, 0x03, 0xae, 0x72, 0x26,
+	0x39, 0x52, 0x15, 0xc7, 0x1c, 0xe4, 0xea, 0x6c, 0x78, 0x1d, 0x39, 0xfc, 0x61, 0x2f, 0x2d, 0xf8,
+	0xee, 0x1e, 0x4d, 0x29, 0xfd, 0xe1, 0x8e, 0xa6, 0xc6, 0x90, 0x66, 0x1a, 0x19, 0xd8, 0xa2, 0x28,
+	0x44, 0x5d, 0xb0, 0x5e, 0x5a, 0x49, 0x4c, 0x33, 0x1d, 0xf7, 0x92, 0x38, 0x0a, 0x63, 0x2b, 0xf9,
+	0xe7, 0x9e, 0x99, 0x77, 0x42, 0x68, 0xa6, 0x09, 0xe9, 0x45, 0x84, 0x44, 0x21, 0x21, 0x56, 0x76,
+	0x7d, 0x67, 0xd5, 0x67, 0xf8, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x2c, 0x97, 0xd2, 0x08, 0x57, 0x03,
+	0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// LandingPageViewServiceClient is the client API for LandingPageViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type LandingPageViewServiceClient interface {
+	// Returns the requested landing page view in full detail.
+	GetLandingPageView(ctx context.Context, in *GetLandingPageViewRequest, opts ...grpc.CallOption) (*resources.LandingPageView, error)
+}
+
+type landingPageViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewLandingPageViewServiceClient(cc grpc.ClientConnInterface) LandingPageViewServiceClient {
+	return &landingPageViewServiceClient{cc}
+}
+
+func (c *landingPageViewServiceClient) GetLandingPageView(ctx context.Context, in *GetLandingPageViewRequest, opts ...grpc.CallOption) (*resources.LandingPageView, error) {
+	out := new(resources.LandingPageView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.LandingPageViewService/GetLandingPageView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// LandingPageViewServiceServer is the server API for LandingPageViewService service.
+type LandingPageViewServiceServer interface {
+	// Returns the requested landing page view in full detail.
+	GetLandingPageView(context.Context, *GetLandingPageViewRequest) (*resources.LandingPageView, error)
+}
+
+// UnimplementedLandingPageViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedLandingPageViewServiceServer struct {
+}
+
+func (*UnimplementedLandingPageViewServiceServer) GetLandingPageView(ctx context.Context, req *GetLandingPageViewRequest) (*resources.LandingPageView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetLandingPageView not implemented")
+}
+
+func RegisterLandingPageViewServiceServer(s *grpc.Server, srv LandingPageViewServiceServer) {
+	s.RegisterService(&_LandingPageViewService_serviceDesc, srv)
+}
+
+func _LandingPageViewService_GetLandingPageView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetLandingPageViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(LandingPageViewServiceServer).GetLandingPageView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.LandingPageViewService/GetLandingPageView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(LandingPageViewServiceServer).GetLandingPageView(ctx, req.(*GetLandingPageViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _LandingPageViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.LandingPageViewService",
+	HandlerType: (*LandingPageViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetLandingPageView",
+			Handler:    _LandingPageViewService_GetLandingPageView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/landing_page_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/language_constant_service.pb.go b/googleapis/ads/googleads/v3/services/language_constant_service.pb.go
new file mode 100644
index 0000000..8b41a88
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/language_constant_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/language_constant_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [LanguageConstantService.GetLanguageConstant][google.ads.googleads.v3.services.LanguageConstantService.GetLanguageConstant].
+type GetLanguageConstantRequest struct {
+	// Required. Resource name of the language constant to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetLanguageConstantRequest) Reset()         { *m = GetLanguageConstantRequest{} }
+func (m *GetLanguageConstantRequest) String() string { return proto.CompactTextString(m) }
+func (*GetLanguageConstantRequest) ProtoMessage()    {}
+func (*GetLanguageConstantRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_450309200542a061, []int{0}
+}
+
+func (m *GetLanguageConstantRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetLanguageConstantRequest.Unmarshal(m, b)
+}
+func (m *GetLanguageConstantRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetLanguageConstantRequest.Marshal(b, m, deterministic)
+}
+func (m *GetLanguageConstantRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetLanguageConstantRequest.Merge(m, src)
+}
+func (m *GetLanguageConstantRequest) XXX_Size() int {
+	return xxx_messageInfo_GetLanguageConstantRequest.Size(m)
+}
+func (m *GetLanguageConstantRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetLanguageConstantRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetLanguageConstantRequest proto.InternalMessageInfo
+
+func (m *GetLanguageConstantRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetLanguageConstantRequest)(nil), "google.ads.googleads.v3.services.GetLanguageConstantRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/language_constant_service.proto", fileDescriptor_450309200542a061)
+}
+
+var fileDescriptor_450309200542a061 = []byte{
+	// 403 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcf, 0x4a, 0xe3, 0x40,
+	0x18, 0x27, 0x29, 0x2c, 0x6c, 0xd8, 0xbd, 0x64, 0x0f, 0x2d, 0xd9, 0xc2, 0x96, 0x52, 0xd8, 0xee,
+	0x1e, 0x66, 0x60, 0x73, 0xda, 0x51, 0xd1, 0xa9, 0x60, 0x3d, 0x88, 0x94, 0x0a, 0x3d, 0x48, 0x20,
+	0x4c, 0x93, 0x31, 0x06, 0x92, 0x99, 0x9a, 0x49, 0x73, 0x11, 0x2f, 0xf5, 0x11, 0x7c, 0x03, 0x8f,
+	0xbe, 0x89, 0xbd, 0x7a, 0xf3, 0xe4, 0xc1, 0x93, 0x4f, 0x21, 0xe9, 0x64, 0xd2, 0x3f, 0x34, 0xf4,
+	0xf6, 0x23, 0xbf, 0x7f, 0xdf, 0x7c, 0x5f, 0x8c, 0xa3, 0x80, 0xf3, 0x20, 0xa2, 0x90, 0xf8, 0x02,
+	0x4a, 0x98, 0xa3, 0xcc, 0x86, 0x82, 0x26, 0x59, 0xe8, 0x51, 0x01, 0x23, 0xc2, 0x82, 0x29, 0x09,
+	0xa8, 0xeb, 0x71, 0x26, 0x52, 0xc2, 0x52, 0xb7, 0xa0, 0xc0, 0x24, 0xe1, 0x29, 0x37, 0x5b, 0xd2,
+	0x06, 0x88, 0x2f, 0x40, 0x99, 0x00, 0x32, 0x1b, 0xa8, 0x04, 0xeb, 0x7f, 0x55, 0x47, 0x42, 0x05,
+	0x9f, 0x26, 0x5b, 0x4b, 0x64, 0xb8, 0xd5, 0x54, 0xd6, 0x49, 0x08, 0x09, 0x63, 0x3c, 0x25, 0x69,
+	0xc8, 0x99, 0x28, 0xd8, 0xfa, 0x0a, 0xeb, 0x45, 0x21, 0x2d, 0x6d, 0xbf, 0x56, 0x88, 0xab, 0x90,
+	0x46, 0xbe, 0x3b, 0xa6, 0xd7, 0x24, 0x0b, 0x79, 0x22, 0x05, 0xed, 0x13, 0xc3, 0xea, 0xd3, 0xf4,
+	0xac, 0x68, 0x3d, 0x2e, 0x4a, 0x87, 0xf4, 0x66, 0x4a, 0x45, 0x6a, 0x76, 0x8d, 0xef, 0x6a, 0x34,
+	0x97, 0x91, 0x98, 0x36, 0xb4, 0x96, 0xd6, 0xfd, 0xda, 0xab, 0xbd, 0x61, 0x7d, 0xf8, 0x4d, 0x31,
+	0xe7, 0x24, 0xa6, 0xff, 0x66, 0xba, 0x51, 0xdf, 0x4c, 0xb9, 0x90, 0xef, 0x36, 0x9f, 0x35, 0xe3,
+	0xc7, 0x96, 0x12, 0x73, 0x1f, 0xec, 0xda, 0x18, 0xa8, 0x9e, 0xcd, 0xb2, 0x2b, 0xdd, 0xe5, 0x36,
+	0xc1, 0xa6, 0xb7, 0x7d, 0xf8, 0x8a, 0xd7, 0x5f, 0x34, 0x7b, 0x79, 0x7f, 0xd0, 0xff, 0x98, 0xbf,
+	0xf3, 0x2b, 0xdc, 0xae, 0x31, 0x07, 0xd1, 0x86, 0x59, 0xc0, 0xbf, 0x77, 0xd6, 0xcf, 0x39, 0x6e,
+	0x2c, 0xcb, 0x0a, 0x34, 0x09, 0x05, 0xf0, 0x78, 0xdc, 0xbb, 0xd7, 0x8d, 0x8e, 0xc7, 0xe3, 0x9d,
+	0xcf, 0xea, 0x35, 0x2b, 0x56, 0x35, 0xc8, 0x6f, 0x32, 0xd0, 0x2e, 0x4f, 0x8b, 0x84, 0x80, 0xe7,
+	0x43, 0x00, 0x9e, 0x04, 0x30, 0xa0, 0x6c, 0x71, 0x31, 0xb8, 0xec, 0xac, 0xfe, 0x57, 0xf7, 0x14,
+	0x78, 0xd4, 0x6b, 0x7d, 0x8c, 0x9f, 0xf4, 0x56, 0x5f, 0x06, 0x62, 0x5f, 0x00, 0x09, 0x73, 0x34,
+	0xb2, 0x41, 0x51, 0x2c, 0xe6, 0x4a, 0xe2, 0x60, 0x5f, 0x38, 0xa5, 0xc4, 0x19, 0xd9, 0x8e, 0x92,
+	0x7c, 0xe8, 0x1d, 0xf9, 0x1d, 0x21, 0xec, 0x0b, 0x84, 0x4a, 0x11, 0x42, 0x23, 0x1b, 0x21, 0x25,
+	0x1b, 0x7f, 0x59, 0xcc, 0x69, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x71, 0x1d, 0x0c, 0x73, 0x52,
+	0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// LanguageConstantServiceClient is the client API for LanguageConstantService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type LanguageConstantServiceClient interface {
+	// Returns the requested language constant.
+	GetLanguageConstant(ctx context.Context, in *GetLanguageConstantRequest, opts ...grpc.CallOption) (*resources.LanguageConstant, error)
+}
+
+type languageConstantServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewLanguageConstantServiceClient(cc grpc.ClientConnInterface) LanguageConstantServiceClient {
+	return &languageConstantServiceClient{cc}
+}
+
+func (c *languageConstantServiceClient) GetLanguageConstant(ctx context.Context, in *GetLanguageConstantRequest, opts ...grpc.CallOption) (*resources.LanguageConstant, error) {
+	out := new(resources.LanguageConstant)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.LanguageConstantService/GetLanguageConstant", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// LanguageConstantServiceServer is the server API for LanguageConstantService service.
+type LanguageConstantServiceServer interface {
+	// Returns the requested language constant.
+	GetLanguageConstant(context.Context, *GetLanguageConstantRequest) (*resources.LanguageConstant, error)
+}
+
+// UnimplementedLanguageConstantServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedLanguageConstantServiceServer struct {
+}
+
+func (*UnimplementedLanguageConstantServiceServer) GetLanguageConstant(ctx context.Context, req *GetLanguageConstantRequest) (*resources.LanguageConstant, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetLanguageConstant not implemented")
+}
+
+func RegisterLanguageConstantServiceServer(s *grpc.Server, srv LanguageConstantServiceServer) {
+	s.RegisterService(&_LanguageConstantService_serviceDesc, srv)
+}
+
+func _LanguageConstantService_GetLanguageConstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetLanguageConstantRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(LanguageConstantServiceServer).GetLanguageConstant(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.LanguageConstantService/GetLanguageConstant",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(LanguageConstantServiceServer).GetLanguageConstant(ctx, req.(*GetLanguageConstantRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _LanguageConstantService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.LanguageConstantService",
+	HandlerType: (*LanguageConstantServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetLanguageConstant",
+			Handler:    _LanguageConstantService_GetLanguageConstant_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/language_constant_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/location_view_service.pb.go b/googleapis/ads/googleads/v3/services/location_view_service.pb.go
new file mode 100644
index 0000000..33e0038
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/location_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/location_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [LocationViewService.GetLocationView][google.ads.googleads.v3.services.LocationViewService.GetLocationView].
+type GetLocationViewRequest struct {
+	// Required. The resource name of the location view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetLocationViewRequest) Reset()         { *m = GetLocationViewRequest{} }
+func (m *GetLocationViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetLocationViewRequest) ProtoMessage()    {}
+func (*GetLocationViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dd56f84abb1064dc, []int{0}
+}
+
+func (m *GetLocationViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetLocationViewRequest.Unmarshal(m, b)
+}
+func (m *GetLocationViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetLocationViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetLocationViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetLocationViewRequest.Merge(m, src)
+}
+func (m *GetLocationViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetLocationViewRequest.Size(m)
+}
+func (m *GetLocationViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetLocationViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetLocationViewRequest proto.InternalMessageInfo
+
+func (m *GetLocationViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetLocationViewRequest)(nil), "google.ads.googleads.v3.services.GetLocationViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/location_view_service.proto", fileDescriptor_dd56f84abb1064dc)
+}
+
+var fileDescriptor_dd56f84abb1064dc = []byte{
+	// 411 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0xcb, 0xd3, 0x40,
+	0x18, 0x27, 0x29, 0x08, 0x06, 0x45, 0x88, 0xa0, 0x25, 0x0a, 0x96, 0xd2, 0xa1, 0x74, 0xb8, 0x43,
+	0x83, 0x20, 0xa7, 0x0e, 0x97, 0x25, 0x0e, 0x22, 0xa5, 0x42, 0x06, 0x09, 0x84, 0x6b, 0xf2, 0x18,
+	0x0f, 0x92, 0x5c, 0xcd, 0xa5, 0xe9, 0x20, 0x2e, 0x7e, 0x05, 0xbf, 0x81, 0xa3, 0xdf, 0xc3, 0xa5,
+	0xab, 0x9b, 0x93, 0x83, 0x93, 0x1f, 0xe1, 0x5d, 0xde, 0x97, 0xf4, 0x72, 0x69, 0xfa, 0xbe, 0x2d,
+	0xdd, 0x7e, 0xe4, 0xf7, 0xe7, 0x79, 0x9e, 0xdf, 0xc5, 0x7a, 0x95, 0x0a, 0x91, 0x66, 0x80, 0x59,
+	0x22, 0xb1, 0x82, 0x0d, 0xaa, 0x5d, 0x2c, 0xa1, 0xac, 0x79, 0x0c, 0x12, 0x67, 0x22, 0x66, 0x15,
+	0x17, 0x45, 0x54, 0x73, 0xd8, 0x44, 0xed, 0x67, 0xb4, 0x2a, 0x45, 0x25, 0xec, 0x91, 0xb2, 0x20,
+	0x96, 0x48, 0xd4, 0xb9, 0x51, 0xed, 0x22, 0xed, 0x76, 0x9e, 0x9f, 0xca, 0x2f, 0x41, 0x8a, 0x75,
+	0x79, 0x63, 0x80, 0x0a, 0x76, 0x1e, 0x6b, 0xdb, 0x8a, 0x63, 0x56, 0x14, 0xa2, 0xda, 0x29, 0x64,
+	0xcb, 0x3e, 0xec, 0xb1, 0x71, 0xc6, 0xa1, 0xa8, 0x5a, 0xe2, 0x49, 0x8f, 0xf8, 0xc8, 0x21, 0x4b,
+	0xa2, 0x25, 0x7c, 0x62, 0x35, 0x17, 0xa5, 0x12, 0x8c, 0x3d, 0xeb, 0x81, 0x0f, 0xd5, 0xdb, 0x76,
+	0x62, 0xc0, 0x61, 0xb3, 0x80, 0xcf, 0x6b, 0x90, 0x95, 0x3d, 0xb5, 0xee, 0xea, 0x95, 0xa2, 0x82,
+	0xe5, 0x30, 0x34, 0x46, 0xc6, 0xf4, 0xb6, 0x37, 0xf8, 0x4b, 0xcd, 0xc5, 0x1d, 0xcd, 0xbc, 0x63,
+	0x39, 0x3c, 0xbb, 0x30, 0xac, 0xfb, 0xfd, 0x84, 0xf7, 0xea, 0x56, 0xfb, 0x97, 0x61, 0xdd, 0xbb,
+	0x16, 0x6e, 0xbf, 0x40, 0xe7, 0x1a, 0x42, 0xc7, 0xf7, 0x71, 0xf0, 0x49, 0x67, 0xd7, 0x1c, 0xea,
+	0xfb, 0xc6, 0xfe, 0x1f, 0x7a, 0x78, 0xc1, 0xb7, 0xdf, 0xff, 0xbe, 0x9b, 0x4f, 0x6d, 0xdc, 0xb4,
+	0xfd, 0xe5, 0x80, 0x79, 0x1d, 0xaf, 0x65, 0x25, 0x72, 0x28, 0x25, 0x9e, 0x75, 0xf5, 0x37, 0x21,
+	0x12, 0xcf, 0xbe, 0x3a, 0x8f, 0xb6, 0x74, 0xb8, 0x1f, 0xd8, 0xa2, 0x15, 0x97, 0x28, 0x16, 0xb9,
+	0x77, 0x69, 0x58, 0x93, 0x58, 0xe4, 0x67, 0xcf, 0xf2, 0x86, 0x47, 0x2a, 0x9a, 0x37, 0x6f, 0x30,
+	0x37, 0x3e, 0xbc, 0x69, 0xdd, 0xa9, 0xc8, 0x58, 0x91, 0x22, 0x51, 0xa6, 0x38, 0x85, 0x62, 0xf7,
+	0x42, 0x78, 0x3f, 0xef, 0xf4, 0x3f, 0xf9, 0x52, 0x83, 0x1f, 0xe6, 0xc0, 0xa7, 0xf4, 0xa7, 0x39,
+	0xf2, 0x55, 0x20, 0x4d, 0x24, 0x52, 0xb0, 0x41, 0x81, 0x8b, 0xda, 0xc1, 0x72, 0xab, 0x25, 0x21,
+	0x4d, 0x64, 0xd8, 0x49, 0xc2, 0xc0, 0x0d, 0xb5, 0xe4, 0xbf, 0x39, 0x51, 0xdf, 0x09, 0xa1, 0x89,
+	0x24, 0xa4, 0x13, 0x11, 0x12, 0xb8, 0x84, 0x68, 0xd9, 0xf2, 0xd6, 0x6e, 0x4f, 0xf7, 0x2a, 0x00,
+	0x00, 0xff, 0xff, 0xfa, 0xae, 0xea, 0x6c, 0x3a, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// LocationViewServiceClient is the client API for LocationViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type LocationViewServiceClient interface {
+	// Returns the requested location view in full detail.
+	GetLocationView(ctx context.Context, in *GetLocationViewRequest, opts ...grpc.CallOption) (*resources.LocationView, error)
+}
+
+type locationViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewLocationViewServiceClient(cc grpc.ClientConnInterface) LocationViewServiceClient {
+	return &locationViewServiceClient{cc}
+}
+
+func (c *locationViewServiceClient) GetLocationView(ctx context.Context, in *GetLocationViewRequest, opts ...grpc.CallOption) (*resources.LocationView, error) {
+	out := new(resources.LocationView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.LocationViewService/GetLocationView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// LocationViewServiceServer is the server API for LocationViewService service.
+type LocationViewServiceServer interface {
+	// Returns the requested location view in full detail.
+	GetLocationView(context.Context, *GetLocationViewRequest) (*resources.LocationView, error)
+}
+
+// UnimplementedLocationViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedLocationViewServiceServer struct {
+}
+
+func (*UnimplementedLocationViewServiceServer) GetLocationView(ctx context.Context, req *GetLocationViewRequest) (*resources.LocationView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetLocationView not implemented")
+}
+
+func RegisterLocationViewServiceServer(s *grpc.Server, srv LocationViewServiceServer) {
+	s.RegisterService(&_LocationViewService_serviceDesc, srv)
+}
+
+func _LocationViewService_GetLocationView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetLocationViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(LocationViewServiceServer).GetLocationView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.LocationViewService/GetLocationView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(LocationViewServiceServer).GetLocationView(ctx, req.(*GetLocationViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _LocationViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.LocationViewService",
+	HandlerType: (*LocationViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetLocationView",
+			Handler:    _LocationViewService_GetLocationView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/location_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/managed_placement_view_service.pb.go b/googleapis/ads/googleads/v3/services/managed_placement_view_service.pb.go
new file mode 100644
index 0000000..82cce69
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/managed_placement_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/managed_placement_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [ManagedPlacementViewService.GetManagedPlacementView][google.ads.googleads.v3.services.ManagedPlacementViewService.GetManagedPlacementView].
+type GetManagedPlacementViewRequest struct {
+	// Required. The resource name of the Managed Placement View to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetManagedPlacementViewRequest) Reset()         { *m = GetManagedPlacementViewRequest{} }
+func (m *GetManagedPlacementViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetManagedPlacementViewRequest) ProtoMessage()    {}
+func (*GetManagedPlacementViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d6ee6f7f223a331f, []int{0}
+}
+
+func (m *GetManagedPlacementViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetManagedPlacementViewRequest.Unmarshal(m, b)
+}
+func (m *GetManagedPlacementViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetManagedPlacementViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetManagedPlacementViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetManagedPlacementViewRequest.Merge(m, src)
+}
+func (m *GetManagedPlacementViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetManagedPlacementViewRequest.Size(m)
+}
+func (m *GetManagedPlacementViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetManagedPlacementViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetManagedPlacementViewRequest proto.InternalMessageInfo
+
+func (m *GetManagedPlacementViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetManagedPlacementViewRequest)(nil), "google.ads.googleads.v3.services.GetManagedPlacementViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/managed_placement_view_service.proto", fileDescriptor_d6ee6f7f223a331f)
+}
+
+var fileDescriptor_d6ee6f7f223a331f = []byte{
+	// 424 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x31, 0x8b, 0xd4, 0x40,
+	0x18, 0x25, 0x39, 0x10, 0x0c, 0xda, 0xa4, 0xb9, 0x23, 0x27, 0x1a, 0x8e, 0x2b, 0x8e, 0x2b, 0x66,
+	0xc0, 0x14, 0x87, 0x23, 0x8a, 0xb3, 0x20, 0x2b, 0x82, 0xba, 0x9c, 0x90, 0x42, 0x02, 0x61, 0x2e,
+	0xf9, 0x8c, 0x03, 0xc9, 0x4c, 0xcc, 0xcc, 0xe6, 0x0a, 0xb1, 0xb1, 0xf1, 0x07, 0xf8, 0x0f, 0xae,
+	0xf4, 0xa7, 0x6c, 0x6b, 0x67, 0x65, 0xa1, 0x8d, 0xbf, 0xe2, 0xc8, 0x4e, 0x26, 0xbb, 0x0b, 0x9b,
+	0xdd, 0xee, 0x91, 0xf7, 0xbe, 0xf7, 0xbe, 0xf9, 0x5e, 0xbc, 0x97, 0x85, 0x94, 0x45, 0x09, 0x98,
+	0xe5, 0x0a, 0x1b, 0xd8, 0xa1, 0x36, 0xc2, 0x0a, 0x9a, 0x96, 0x67, 0xa0, 0x70, 0xc5, 0x04, 0x2b,
+	0x20, 0x4f, 0xeb, 0x92, 0x65, 0x50, 0x81, 0xd0, 0x69, 0xcb, 0xe1, 0x3a, 0xed, 0x79, 0x54, 0x37,
+	0x52, 0x4b, 0x3f, 0x34, 0xb3, 0x88, 0xe5, 0x0a, 0x0d, 0x36, 0xa8, 0x8d, 0x90, 0xb5, 0x09, 0x9e,
+	0x8f, 0x05, 0x35, 0xa0, 0xe4, 0xbc, 0x19, 0x4f, 0x32, 0x09, 0xc1, 0x03, 0x3b, 0x5f, 0x73, 0xcc,
+	0x84, 0x90, 0x9a, 0x69, 0x2e, 0x85, 0xea, 0xd9, 0xc3, 0x35, 0x36, 0x2b, 0x39, 0x08, 0xdd, 0x13,
+	0x8f, 0xd6, 0x88, 0x8f, 0x1c, 0xca, 0x3c, 0xbd, 0x82, 0x4f, 0xac, 0xe5, 0xb2, 0x31, 0x82, 0x93,
+	0xd7, 0xde, 0xc3, 0x29, 0xe8, 0x37, 0x26, 0x7a, 0x66, 0x93, 0x63, 0x0e, 0xd7, 0x97, 0xf0, 0x79,
+	0x0e, 0x4a, 0xfb, 0x67, 0xde, 0x7d, 0xbb, 0x63, 0x2a, 0x58, 0x05, 0x47, 0x4e, 0xe8, 0x9c, 0xdd,
+	0x9d, 0x1c, 0xfc, 0xa1, 0xee, 0xe5, 0x3d, 0xcb, 0xbc, 0x65, 0x15, 0x3c, 0xbe, 0x71, 0xbd, 0xe3,
+	0x6d, 0x4e, 0xef, 0xcd, 0x11, 0xfc, 0x7f, 0x8e, 0x77, 0x38, 0x12, 0xe6, 0xbf, 0x40, 0xfb, 0x4e,
+	0x88, 0x76, 0xef, 0x19, 0x5c, 0x8c, 0x3a, 0x0c, 0x27, 0x46, 0xdb, 0xe6, 0x4f, 0xde, 0xfd, 0xa6,
+	0x9b, 0x2f, 0xfc, 0xf6, 0xeb, 0xef, 0x0f, 0xf7, 0x89, 0x7f, 0xd1, 0xd5, 0xf3, 0x65, 0x83, 0x79,
+	0x96, 0xcd, 0x95, 0x96, 0x15, 0x34, 0x0a, 0x9f, 0xdb, 0xbe, 0x36, 0xcc, 0x14, 0x3e, 0xff, 0x1a,
+	0x1c, 0x2f, 0xe8, 0xd1, 0x6a, 0x81, 0x1e, 0xd5, 0x5c, 0xa1, 0x4c, 0x56, 0x93, 0xef, 0xae, 0x77,
+	0x9a, 0xc9, 0x6a, 0xef, 0x73, 0x27, 0xe1, 0x8e, 0x53, 0xce, 0xba, 0xee, 0x66, 0xce, 0x87, 0x57,
+	0xbd, 0x4b, 0x21, 0x4b, 0x26, 0x0a, 0x24, 0x9b, 0x02, 0x17, 0x20, 0x96, 0xcd, 0xe2, 0x55, 0xee,
+	0xf8, 0xdf, 0xfd, 0xd4, 0x82, 0x1b, 0xf7, 0x60, 0x4a, 0xe9, 0x4f, 0x37, 0x9c, 0x1a, 0x43, 0x9a,
+	0x2b, 0x64, 0x60, 0x87, 0xe2, 0x08, 0xf5, 0xc1, 0x6a, 0x61, 0x25, 0x09, 0xcd, 0x55, 0x32, 0x48,
+	0x92, 0x38, 0x4a, 0xac, 0xe4, 0xbf, 0x7b, 0x6a, 0xbe, 0x13, 0x42, 0x73, 0x45, 0xc8, 0x20, 0x22,
+	0x24, 0x8e, 0x08, 0xb1, 0xb2, 0xab, 0x3b, 0xcb, 0x3d, 0xa3, 0xdb, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0xc2, 0xdd, 0xdf, 0xe2, 0x84, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ManagedPlacementViewServiceClient is the client API for ManagedPlacementViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ManagedPlacementViewServiceClient interface {
+	// Returns the requested Managed Placement view in full detail.
+	GetManagedPlacementView(ctx context.Context, in *GetManagedPlacementViewRequest, opts ...grpc.CallOption) (*resources.ManagedPlacementView, error)
+}
+
+type managedPlacementViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewManagedPlacementViewServiceClient(cc grpc.ClientConnInterface) ManagedPlacementViewServiceClient {
+	return &managedPlacementViewServiceClient{cc}
+}
+
+func (c *managedPlacementViewServiceClient) GetManagedPlacementView(ctx context.Context, in *GetManagedPlacementViewRequest, opts ...grpc.CallOption) (*resources.ManagedPlacementView, error) {
+	out := new(resources.ManagedPlacementView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ManagedPlacementViewService/GetManagedPlacementView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ManagedPlacementViewServiceServer is the server API for ManagedPlacementViewService service.
+type ManagedPlacementViewServiceServer interface {
+	// Returns the requested Managed Placement view in full detail.
+	GetManagedPlacementView(context.Context, *GetManagedPlacementViewRequest) (*resources.ManagedPlacementView, error)
+}
+
+// UnimplementedManagedPlacementViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedManagedPlacementViewServiceServer struct {
+}
+
+func (*UnimplementedManagedPlacementViewServiceServer) GetManagedPlacementView(ctx context.Context, req *GetManagedPlacementViewRequest) (*resources.ManagedPlacementView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetManagedPlacementView not implemented")
+}
+
+func RegisterManagedPlacementViewServiceServer(s *grpc.Server, srv ManagedPlacementViewServiceServer) {
+	s.RegisterService(&_ManagedPlacementViewService_serviceDesc, srv)
+}
+
+func _ManagedPlacementViewService_GetManagedPlacementView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetManagedPlacementViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ManagedPlacementViewServiceServer).GetManagedPlacementView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ManagedPlacementViewService/GetManagedPlacementView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ManagedPlacementViewServiceServer).GetManagedPlacementView(ctx, req.(*GetManagedPlacementViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ManagedPlacementViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ManagedPlacementViewService",
+	HandlerType: (*ManagedPlacementViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetManagedPlacementView",
+			Handler:    _ManagedPlacementViewService_GetManagedPlacementView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/managed_placement_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/media_file_service.pb.go b/googleapis/ads/googleads/v3/services/media_file_service.pb.go
new file mode 100644
index 0000000..f8d8177
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/media_file_service.pb.go
@@ -0,0 +1,484 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/media_file_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [MediaFileService.GetMediaFile][google.ads.googleads.v3.services.MediaFileService.GetMediaFile]
+type GetMediaFileRequest struct {
+	// Required. The resource name of the media file to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetMediaFileRequest) Reset()         { *m = GetMediaFileRequest{} }
+func (m *GetMediaFileRequest) String() string { return proto.CompactTextString(m) }
+func (*GetMediaFileRequest) ProtoMessage()    {}
+func (*GetMediaFileRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d3d91a63d8171090, []int{0}
+}
+
+func (m *GetMediaFileRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMediaFileRequest.Unmarshal(m, b)
+}
+func (m *GetMediaFileRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMediaFileRequest.Marshal(b, m, deterministic)
+}
+func (m *GetMediaFileRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMediaFileRequest.Merge(m, src)
+}
+func (m *GetMediaFileRequest) XXX_Size() int {
+	return xxx_messageInfo_GetMediaFileRequest.Size(m)
+}
+func (m *GetMediaFileRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMediaFileRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMediaFileRequest proto.InternalMessageInfo
+
+func (m *GetMediaFileRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [MediaFileService.MutateMediaFiles][google.ads.googleads.v3.services.MediaFileService.MutateMediaFiles]
+type MutateMediaFilesRequest struct {
+	// Required. The ID of the customer whose media files are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual media file.
+	Operations []*MediaFileOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateMediaFilesRequest) Reset()         { *m = MutateMediaFilesRequest{} }
+func (m *MutateMediaFilesRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateMediaFilesRequest) ProtoMessage()    {}
+func (*MutateMediaFilesRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d3d91a63d8171090, []int{1}
+}
+
+func (m *MutateMediaFilesRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateMediaFilesRequest.Unmarshal(m, b)
+}
+func (m *MutateMediaFilesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateMediaFilesRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateMediaFilesRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateMediaFilesRequest.Merge(m, src)
+}
+func (m *MutateMediaFilesRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateMediaFilesRequest.Size(m)
+}
+func (m *MutateMediaFilesRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateMediaFilesRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateMediaFilesRequest proto.InternalMessageInfo
+
+func (m *MutateMediaFilesRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateMediaFilesRequest) GetOperations() []*MediaFileOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateMediaFilesRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateMediaFilesRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation to create media file.
+type MediaFileOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*MediaFileOperation_Create
+	Operation            isMediaFileOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
+	XXX_unrecognized     []byte                         `json:"-"`
+	XXX_sizecache        int32                          `json:"-"`
+}
+
+func (m *MediaFileOperation) Reset()         { *m = MediaFileOperation{} }
+func (m *MediaFileOperation) String() string { return proto.CompactTextString(m) }
+func (*MediaFileOperation) ProtoMessage()    {}
+func (*MediaFileOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d3d91a63d8171090, []int{2}
+}
+
+func (m *MediaFileOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MediaFileOperation.Unmarshal(m, b)
+}
+func (m *MediaFileOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MediaFileOperation.Marshal(b, m, deterministic)
+}
+func (m *MediaFileOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MediaFileOperation.Merge(m, src)
+}
+func (m *MediaFileOperation) XXX_Size() int {
+	return xxx_messageInfo_MediaFileOperation.Size(m)
+}
+func (m *MediaFileOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_MediaFileOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MediaFileOperation proto.InternalMessageInfo
+
+type isMediaFileOperation_Operation interface {
+	isMediaFileOperation_Operation()
+}
+
+type MediaFileOperation_Create struct {
+	Create *resources.MediaFile `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+func (*MediaFileOperation_Create) isMediaFileOperation_Operation() {}
+
+func (m *MediaFileOperation) GetOperation() isMediaFileOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *MediaFileOperation) GetCreate() *resources.MediaFile {
+	if x, ok := m.GetOperation().(*MediaFileOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*MediaFileOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*MediaFileOperation_Create)(nil),
+	}
+}
+
+// Response message for a media file mutate.
+type MutateMediaFilesResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateMediaFileResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *MutateMediaFilesResponse) Reset()         { *m = MutateMediaFilesResponse{} }
+func (m *MutateMediaFilesResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateMediaFilesResponse) ProtoMessage()    {}
+func (*MutateMediaFilesResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d3d91a63d8171090, []int{3}
+}
+
+func (m *MutateMediaFilesResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateMediaFilesResponse.Unmarshal(m, b)
+}
+func (m *MutateMediaFilesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateMediaFilesResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateMediaFilesResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateMediaFilesResponse.Merge(m, src)
+}
+func (m *MutateMediaFilesResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateMediaFilesResponse.Size(m)
+}
+func (m *MutateMediaFilesResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateMediaFilesResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateMediaFilesResponse proto.InternalMessageInfo
+
+func (m *MutateMediaFilesResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateMediaFilesResponse) GetResults() []*MutateMediaFileResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the media file mutate.
+type MutateMediaFileResult struct {
+	// The resource name returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateMediaFileResult) Reset()         { *m = MutateMediaFileResult{} }
+func (m *MutateMediaFileResult) String() string { return proto.CompactTextString(m) }
+func (*MutateMediaFileResult) ProtoMessage()    {}
+func (*MutateMediaFileResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d3d91a63d8171090, []int{4}
+}
+
+func (m *MutateMediaFileResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateMediaFileResult.Unmarshal(m, b)
+}
+func (m *MutateMediaFileResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateMediaFileResult.Marshal(b, m, deterministic)
+}
+func (m *MutateMediaFileResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateMediaFileResult.Merge(m, src)
+}
+func (m *MutateMediaFileResult) XXX_Size() int {
+	return xxx_messageInfo_MutateMediaFileResult.Size(m)
+}
+func (m *MutateMediaFileResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateMediaFileResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateMediaFileResult proto.InternalMessageInfo
+
+func (m *MutateMediaFileResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetMediaFileRequest)(nil), "google.ads.googleads.v3.services.GetMediaFileRequest")
+	proto.RegisterType((*MutateMediaFilesRequest)(nil), "google.ads.googleads.v3.services.MutateMediaFilesRequest")
+	proto.RegisterType((*MediaFileOperation)(nil), "google.ads.googleads.v3.services.MediaFileOperation")
+	proto.RegisterType((*MutateMediaFilesResponse)(nil), "google.ads.googleads.v3.services.MutateMediaFilesResponse")
+	proto.RegisterType((*MutateMediaFileResult)(nil), "google.ads.googleads.v3.services.MutateMediaFileResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/media_file_service.proto", fileDescriptor_d3d91a63d8171090)
+}
+
+var fileDescriptor_d3d91a63d8171090 = []byte{
+	// 692 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xcd, 0x6a, 0x14, 0x4b,
+	0x14, 0xbe, 0x3d, 0x73, 0xc9, 0xbd, 0xa9, 0x49, 0xee, 0x0d, 0x15, 0x62, 0x86, 0x51, 0x70, 0x68,
+	0x03, 0x0e, 0x43, 0xa8, 0x86, 0x99, 0x88, 0xa4, 0x35, 0x48, 0x0f, 0x3a, 0x89, 0x8b, 0x98, 0xd8,
+	0x81, 0x80, 0x32, 0xd0, 0x54, 0xba, 0x2b, 0x63, 0x41, 0x77, 0x57, 0x5b, 0x55, 0x3d, 0x10, 0x42,
+	0x36, 0xbe, 0x82, 0x6f, 0xe0, 0xd2, 0xbd, 0x0b, 0x5f, 0x21, 0xb8, 0x73, 0x97, 0x85, 0xb8, 0x70,
+	0x21, 0x3e, 0x83, 0x0b, 0xe9, 0x9f, 0xea, 0xe9, 0x99, 0x24, 0xc4, 0xb8, 0x3b, 0x9c, 0x73, 0xbe,
+	0xef, 0x7c, 0xe7, 0xa7, 0x0a, 0xac, 0x0f, 0x19, 0x1b, 0xfa, 0xc4, 0xc0, 0x9e, 0x30, 0x32, 0x33,
+	0xb1, 0x46, 0x5d, 0x43, 0x10, 0x3e, 0xa2, 0x2e, 0x11, 0x46, 0x40, 0x3c, 0x8a, 0x9d, 0x43, 0xea,
+	0x13, 0x27, 0xf7, 0xa1, 0x88, 0x33, 0xc9, 0x60, 0x33, 0xcb, 0x47, 0xd8, 0x13, 0xa8, 0x80, 0xa2,
+	0x51, 0x17, 0x29, 0x68, 0xa3, 0x73, 0x19, 0x39, 0x27, 0x82, 0xc5, 0x7c, 0x92, 0x3d, 0x63, 0x6d,
+	0xdc, 0x52, 0x98, 0x88, 0x1a, 0x38, 0x0c, 0x99, 0xc4, 0x92, 0xb2, 0x50, 0xe4, 0xd1, 0xe5, 0x52,
+	0xd4, 0xf5, 0x29, 0x09, 0x65, 0x1e, 0xb8, 0x5d, 0x0a, 0x1c, 0x52, 0xe2, 0x7b, 0xce, 0x01, 0x79,
+	0x85, 0x47, 0x94, 0xf1, 0x29, 0x24, 0x8f, 0x5c, 0x43, 0x48, 0x2c, 0xe3, 0x9c, 0x52, 0x7f, 0x04,
+	0x16, 0x37, 0x89, 0xdc, 0x4e, 0x74, 0xf4, 0xa9, 0x4f, 0x6c, 0xf2, 0x3a, 0x26, 0x42, 0xc2, 0x16,
+	0x98, 0x57, 0x2a, 0x9d, 0x10, 0x07, 0xa4, 0xae, 0x35, 0xb5, 0xd6, 0x6c, 0xaf, 0xfa, 0xd5, 0xaa,
+	0xd8, 0x73, 0x2a, 0xf2, 0x0c, 0x07, 0x44, 0xff, 0xae, 0x81, 0xe5, 0xed, 0x58, 0x62, 0x49, 0x0a,
+	0x12, 0xa1, 0x58, 0x56, 0x40, 0xcd, 0x8d, 0x85, 0x64, 0x01, 0xe1, 0x0e, 0xf5, 0xca, 0x1c, 0x40,
+	0xf9, 0x9f, 0x7a, 0xf0, 0x05, 0x00, 0x2c, 0x22, 0x3c, 0xeb, 0xb4, 0x5e, 0x69, 0x56, 0x5b, 0xb5,
+	0xce, 0x1a, 0xba, 0x6a, 0xbc, 0xa8, 0x28, 0xb7, 0xa3, 0xc0, 0x39, 0xf5, 0x98, 0x0c, 0xde, 0x05,
+	0xff, 0x47, 0x98, 0x4b, 0x8a, 0x7d, 0xe7, 0x10, 0x53, 0x3f, 0xe6, 0xa4, 0x5e, 0x6d, 0x6a, 0xad,
+	0x7f, 0xed, 0xff, 0x72, 0x77, 0x3f, 0xf3, 0xc2, 0x3b, 0x60, 0x7e, 0x84, 0x7d, 0xea, 0x61, 0x49,
+	0x1c, 0x16, 0xfa, 0x47, 0xf5, 0xbf, 0xd3, 0xb4, 0x39, 0xe5, 0xdc, 0x09, 0xfd, 0x23, 0x9d, 0x02,
+	0x78, 0xbe, 0x28, 0xec, 0x83, 0x19, 0x97, 0x13, 0x2c, 0xb3, 0x19, 0xd5, 0x3a, 0xab, 0x97, 0x4a,
+	0x2f, 0xf6, 0x3e, 0xd6, 0xbe, 0xf5, 0x97, 0x9d, 0xa3, 0x7b, 0x35, 0x30, 0x5b, 0x28, 0xd7, 0x3f,
+	0x68, 0xa0, 0x7e, 0x7e, 0xaa, 0x22, 0x62, 0xa1, 0x20, 0xb0, 0x0f, 0x96, 0xa6, 0xba, 0x72, 0x08,
+	0xe7, 0x8c, 0xa7, 0xbd, 0xd5, 0x3a, 0x50, 0x09, 0xe0, 0x91, 0x8b, 0xf6, 0xd2, 0x65, 0xdb, 0x8b,
+	0x93, 0xfd, 0x3e, 0x49, 0xd2, 0xe1, 0x73, 0xf0, 0x0f, 0x27, 0x22, 0xf6, 0xa5, 0x9a, 0xfa, 0xfd,
+	0xdf, 0x98, 0xfa, 0xa4, 0x28, 0x3b, 0xc5, 0xdb, 0x8a, 0x47, 0x7f, 0x08, 0x96, 0x2e, 0xcc, 0x48,
+	0x06, 0x7c, 0xc1, 0x41, 0x4d, 0xde, 0x52, 0xe7, 0x53, 0x15, 0x2c, 0x14, 0xc0, 0xbd, 0xac, 0x24,
+	0xfc, 0xa8, 0x81, 0xb9, 0xf2, 0x89, 0xc2, 0x7b, 0x57, 0xab, 0xbc, 0xe0, 0xa4, 0x1b, 0xd7, 0xda,
+	0x8b, 0xfe, 0xf8, 0xcc, 0x9a, 0x14, 0xfc, 0xe6, 0xf3, 0xb7, 0xb7, 0x15, 0x04, 0x57, 0x93, 0x07,
+	0x7c, 0x3c, 0x11, 0xd9, 0x50, 0xb7, 0x2c, 0x8c, 0x76, 0xf6, 0xa2, 0xd3, 0x75, 0x19, 0xed, 0x13,
+	0xf8, 0x45, 0x03, 0x0b, 0xd3, 0x6b, 0x84, 0xeb, 0xd7, 0x9e, 0xb2, 0x7a, 0x50, 0x0d, 0xf3, 0x4f,
+	0xa0, 0xd9, 0xd5, 0xe8, 0x7b, 0x67, 0xd6, 0x8d, 0xd2, 0x6b, 0x5c, 0x1d, 0x3f, 0x93, 0xb4, 0xb5,
+	0x35, 0xdd, 0x48, 0x5a, 0x1b, 0xf7, 0x72, 0x5c, 0x4a, 0xde, 0x68, 0x9f, 0x94, 0x3a, 0x33, 0x83,
+	0xb4, 0x86, 0xa9, 0xb5, 0x1b, 0x37, 0x4f, 0xad, 0xfa, 0x58, 0x47, 0x6e, 0x45, 0x54, 0x20, 0x97,
+	0x05, 0xbd, 0x9f, 0x1a, 0x58, 0x71, 0x59, 0x70, 0xa5, 0xe6, 0xde, 0xd2, 0xf4, 0xd2, 0x77, 0x93,
+	0xbf, 0x69, 0x57, 0x7b, 0xb9, 0x95, 0x43, 0x87, 0xcc, 0xc7, 0xe1, 0x10, 0x31, 0x3e, 0x34, 0x86,
+	0x24, 0x4c, 0x7f, 0x2e, 0x63, 0x5c, 0xec, 0xf2, 0xef, 0xfb, 0x81, 0x32, 0xde, 0x55, 0xaa, 0x9b,
+	0x96, 0xf5, 0xbe, 0xd2, 0xdc, 0xcc, 0x08, 0x2d, 0x4f, 0xa0, 0xcc, 0x4c, 0xac, 0xfd, 0x2e, 0xca,
+	0x0b, 0x8b, 0x53, 0x95, 0x32, 0xb0, 0x3c, 0x31, 0x28, 0x52, 0x06, 0xfb, 0xdd, 0x81, 0x4a, 0xf9,
+	0x51, 0x59, 0xc9, 0xfc, 0xa6, 0x69, 0x79, 0xc2, 0x34, 0x8b, 0x24, 0xd3, 0xdc, 0xef, 0x9a, 0xa6,
+	0x4a, 0x3b, 0x98, 0x49, 0x75, 0x76, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x75, 0x0d, 0x1f,
+	0x65, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// MediaFileServiceClient is the client API for MediaFileService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type MediaFileServiceClient interface {
+	// Returns the requested media file in full detail.
+	GetMediaFile(ctx context.Context, in *GetMediaFileRequest, opts ...grpc.CallOption) (*resources.MediaFile, error)
+	// Creates media files. Operation statuses are returned.
+	MutateMediaFiles(ctx context.Context, in *MutateMediaFilesRequest, opts ...grpc.CallOption) (*MutateMediaFilesResponse, error)
+}
+
+type mediaFileServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewMediaFileServiceClient(cc grpc.ClientConnInterface) MediaFileServiceClient {
+	return &mediaFileServiceClient{cc}
+}
+
+func (c *mediaFileServiceClient) GetMediaFile(ctx context.Context, in *GetMediaFileRequest, opts ...grpc.CallOption) (*resources.MediaFile, error) {
+	out := new(resources.MediaFile)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MediaFileService/GetMediaFile", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *mediaFileServiceClient) MutateMediaFiles(ctx context.Context, in *MutateMediaFilesRequest, opts ...grpc.CallOption) (*MutateMediaFilesResponse, error) {
+	out := new(MutateMediaFilesResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MediaFileService/MutateMediaFiles", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// MediaFileServiceServer is the server API for MediaFileService service.
+type MediaFileServiceServer interface {
+	// Returns the requested media file in full detail.
+	GetMediaFile(context.Context, *GetMediaFileRequest) (*resources.MediaFile, error)
+	// Creates media files. Operation statuses are returned.
+	MutateMediaFiles(context.Context, *MutateMediaFilesRequest) (*MutateMediaFilesResponse, error)
+}
+
+// UnimplementedMediaFileServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedMediaFileServiceServer struct {
+}
+
+func (*UnimplementedMediaFileServiceServer) GetMediaFile(ctx context.Context, req *GetMediaFileRequest) (*resources.MediaFile, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetMediaFile not implemented")
+}
+func (*UnimplementedMediaFileServiceServer) MutateMediaFiles(ctx context.Context, req *MutateMediaFilesRequest) (*MutateMediaFilesResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateMediaFiles not implemented")
+}
+
+func RegisterMediaFileServiceServer(s *grpc.Server, srv MediaFileServiceServer) {
+	s.RegisterService(&_MediaFileService_serviceDesc, srv)
+}
+
+func _MediaFileService_GetMediaFile_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetMediaFileRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MediaFileServiceServer).GetMediaFile(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MediaFileService/GetMediaFile",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MediaFileServiceServer).GetMediaFile(ctx, req.(*GetMediaFileRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MediaFileService_MutateMediaFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateMediaFilesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MediaFileServiceServer).MutateMediaFiles(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MediaFileService/MutateMediaFiles",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MediaFileServiceServer).MutateMediaFiles(ctx, req.(*MutateMediaFilesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _MediaFileService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.MediaFileService",
+	HandlerType: (*MediaFileServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetMediaFile",
+			Handler:    _MediaFileService_GetMediaFile_Handler,
+		},
+		{
+			MethodName: "MutateMediaFiles",
+			Handler:    _MediaFileService_MutateMediaFiles_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/media_file_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/merchant_center_link_service.pb.go b/googleapis/ads/googleads/v3/services/merchant_center_link_service.pb.go
new file mode 100644
index 0000000..50b2a66
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/merchant_center_link_service.pb.go
@@ -0,0 +1,600 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/merchant_center_link_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [MerchantCenterLinkService.ListMerchantCenterLinks][google.ads.googleads.v3.services.MerchantCenterLinkService.ListMerchantCenterLinks].
+type ListMerchantCenterLinksRequest struct {
+	// Required. The ID of the customer onto which to apply the Merchant Center link list
+	// operation.
+	CustomerId           string   `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListMerchantCenterLinksRequest) Reset()         { *m = ListMerchantCenterLinksRequest{} }
+func (m *ListMerchantCenterLinksRequest) String() string { return proto.CompactTextString(m) }
+func (*ListMerchantCenterLinksRequest) ProtoMessage()    {}
+func (*ListMerchantCenterLinksRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_70858648997893d9, []int{0}
+}
+
+func (m *ListMerchantCenterLinksRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListMerchantCenterLinksRequest.Unmarshal(m, b)
+}
+func (m *ListMerchantCenterLinksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListMerchantCenterLinksRequest.Marshal(b, m, deterministic)
+}
+func (m *ListMerchantCenterLinksRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListMerchantCenterLinksRequest.Merge(m, src)
+}
+func (m *ListMerchantCenterLinksRequest) XXX_Size() int {
+	return xxx_messageInfo_ListMerchantCenterLinksRequest.Size(m)
+}
+func (m *ListMerchantCenterLinksRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListMerchantCenterLinksRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListMerchantCenterLinksRequest proto.InternalMessageInfo
+
+func (m *ListMerchantCenterLinksRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+// Response message for [MerchantCenterLinkService.ListMerchantCenterLinks][google.ads.googleads.v3.services.MerchantCenterLinkService.ListMerchantCenterLinks].
+type ListMerchantCenterLinksResponse struct {
+	// Merchant Center links available for the requested customer
+	MerchantCenterLinks  []*resources.MerchantCenterLink `protobuf:"bytes,1,rep,name=merchant_center_links,json=merchantCenterLinks,proto3" json:"merchant_center_links,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *ListMerchantCenterLinksResponse) Reset()         { *m = ListMerchantCenterLinksResponse{} }
+func (m *ListMerchantCenterLinksResponse) String() string { return proto.CompactTextString(m) }
+func (*ListMerchantCenterLinksResponse) ProtoMessage()    {}
+func (*ListMerchantCenterLinksResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_70858648997893d9, []int{1}
+}
+
+func (m *ListMerchantCenterLinksResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListMerchantCenterLinksResponse.Unmarshal(m, b)
+}
+func (m *ListMerchantCenterLinksResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListMerchantCenterLinksResponse.Marshal(b, m, deterministic)
+}
+func (m *ListMerchantCenterLinksResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListMerchantCenterLinksResponse.Merge(m, src)
+}
+func (m *ListMerchantCenterLinksResponse) XXX_Size() int {
+	return xxx_messageInfo_ListMerchantCenterLinksResponse.Size(m)
+}
+func (m *ListMerchantCenterLinksResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListMerchantCenterLinksResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListMerchantCenterLinksResponse proto.InternalMessageInfo
+
+func (m *ListMerchantCenterLinksResponse) GetMerchantCenterLinks() []*resources.MerchantCenterLink {
+	if m != nil {
+		return m.MerchantCenterLinks
+	}
+	return nil
+}
+
+// Request message for [MerchantCenterLinkService.GetMerchantCenterLink][google.ads.googleads.v3.services.MerchantCenterLinkService.GetMerchantCenterLink].
+type GetMerchantCenterLinkRequest struct {
+	// Required. Resource name of the Merchant Center link.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetMerchantCenterLinkRequest) Reset()         { *m = GetMerchantCenterLinkRequest{} }
+func (m *GetMerchantCenterLinkRequest) String() string { return proto.CompactTextString(m) }
+func (*GetMerchantCenterLinkRequest) ProtoMessage()    {}
+func (*GetMerchantCenterLinkRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_70858648997893d9, []int{2}
+}
+
+func (m *GetMerchantCenterLinkRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMerchantCenterLinkRequest.Unmarshal(m, b)
+}
+func (m *GetMerchantCenterLinkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMerchantCenterLinkRequest.Marshal(b, m, deterministic)
+}
+func (m *GetMerchantCenterLinkRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMerchantCenterLinkRequest.Merge(m, src)
+}
+func (m *GetMerchantCenterLinkRequest) XXX_Size() int {
+	return xxx_messageInfo_GetMerchantCenterLinkRequest.Size(m)
+}
+func (m *GetMerchantCenterLinkRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMerchantCenterLinkRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMerchantCenterLinkRequest proto.InternalMessageInfo
+
+func (m *GetMerchantCenterLinkRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [MerchantCenterLinkService.MutateMerchantCenterLink][google.ads.googleads.v3.services.MerchantCenterLinkService.MutateMerchantCenterLink].
+type MutateMerchantCenterLinkRequest struct {
+	// Required. The ID of the customer being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The operation to perform on the link
+	Operation            *MerchantCenterLinkOperation `protobuf:"bytes,2,opt,name=operation,proto3" json:"operation,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *MutateMerchantCenterLinkRequest) Reset()         { *m = MutateMerchantCenterLinkRequest{} }
+func (m *MutateMerchantCenterLinkRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateMerchantCenterLinkRequest) ProtoMessage()    {}
+func (*MutateMerchantCenterLinkRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_70858648997893d9, []int{3}
+}
+
+func (m *MutateMerchantCenterLinkRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateMerchantCenterLinkRequest.Unmarshal(m, b)
+}
+func (m *MutateMerchantCenterLinkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateMerchantCenterLinkRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateMerchantCenterLinkRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateMerchantCenterLinkRequest.Merge(m, src)
+}
+func (m *MutateMerchantCenterLinkRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateMerchantCenterLinkRequest.Size(m)
+}
+func (m *MutateMerchantCenterLinkRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateMerchantCenterLinkRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateMerchantCenterLinkRequest proto.InternalMessageInfo
+
+func (m *MutateMerchantCenterLinkRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateMerchantCenterLinkRequest) GetOperation() *MerchantCenterLinkOperation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+// A single update on a Merchant Center link.
+type MerchantCenterLinkOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The operation to perform
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*MerchantCenterLinkOperation_Update
+	//	*MerchantCenterLinkOperation_Remove
+	Operation            isMerchantCenterLinkOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *MerchantCenterLinkOperation) Reset()         { *m = MerchantCenterLinkOperation{} }
+func (m *MerchantCenterLinkOperation) String() string { return proto.CompactTextString(m) }
+func (*MerchantCenterLinkOperation) ProtoMessage()    {}
+func (*MerchantCenterLinkOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_70858648997893d9, []int{4}
+}
+
+func (m *MerchantCenterLinkOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MerchantCenterLinkOperation.Unmarshal(m, b)
+}
+func (m *MerchantCenterLinkOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MerchantCenterLinkOperation.Marshal(b, m, deterministic)
+}
+func (m *MerchantCenterLinkOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MerchantCenterLinkOperation.Merge(m, src)
+}
+func (m *MerchantCenterLinkOperation) XXX_Size() int {
+	return xxx_messageInfo_MerchantCenterLinkOperation.Size(m)
+}
+func (m *MerchantCenterLinkOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_MerchantCenterLinkOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MerchantCenterLinkOperation proto.InternalMessageInfo
+
+func (m *MerchantCenterLinkOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isMerchantCenterLinkOperation_Operation interface {
+	isMerchantCenterLinkOperation_Operation()
+}
+
+type MerchantCenterLinkOperation_Update struct {
+	Update *resources.MerchantCenterLink `protobuf:"bytes,1,opt,name=update,proto3,oneof"`
+}
+
+type MerchantCenterLinkOperation_Remove struct {
+	Remove string `protobuf:"bytes,2,opt,name=remove,proto3,oneof"`
+}
+
+func (*MerchantCenterLinkOperation_Update) isMerchantCenterLinkOperation_Operation() {}
+
+func (*MerchantCenterLinkOperation_Remove) isMerchantCenterLinkOperation_Operation() {}
+
+func (m *MerchantCenterLinkOperation) GetOperation() isMerchantCenterLinkOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *MerchantCenterLinkOperation) GetUpdate() *resources.MerchantCenterLink {
+	if x, ok := m.GetOperation().(*MerchantCenterLinkOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *MerchantCenterLinkOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*MerchantCenterLinkOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*MerchantCenterLinkOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*MerchantCenterLinkOperation_Update)(nil),
+		(*MerchantCenterLinkOperation_Remove)(nil),
+	}
+}
+
+// Response message for Merchant Center link mutate.
+type MutateMerchantCenterLinkResponse struct {
+	// Result for the mutate.
+	Result               *MutateMerchantCenterLinkResult `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *MutateMerchantCenterLinkResponse) Reset()         { *m = MutateMerchantCenterLinkResponse{} }
+func (m *MutateMerchantCenterLinkResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateMerchantCenterLinkResponse) ProtoMessage()    {}
+func (*MutateMerchantCenterLinkResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_70858648997893d9, []int{5}
+}
+
+func (m *MutateMerchantCenterLinkResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateMerchantCenterLinkResponse.Unmarshal(m, b)
+}
+func (m *MutateMerchantCenterLinkResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateMerchantCenterLinkResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateMerchantCenterLinkResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateMerchantCenterLinkResponse.Merge(m, src)
+}
+func (m *MutateMerchantCenterLinkResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateMerchantCenterLinkResponse.Size(m)
+}
+func (m *MutateMerchantCenterLinkResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateMerchantCenterLinkResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateMerchantCenterLinkResponse proto.InternalMessageInfo
+
+func (m *MutateMerchantCenterLinkResponse) GetResult() *MutateMerchantCenterLinkResult {
+	if m != nil {
+		return m.Result
+	}
+	return nil
+}
+
+// The result for the Merchant Center link mutate.
+type MutateMerchantCenterLinkResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateMerchantCenterLinkResult) Reset()         { *m = MutateMerchantCenterLinkResult{} }
+func (m *MutateMerchantCenterLinkResult) String() string { return proto.CompactTextString(m) }
+func (*MutateMerchantCenterLinkResult) ProtoMessage()    {}
+func (*MutateMerchantCenterLinkResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_70858648997893d9, []int{6}
+}
+
+func (m *MutateMerchantCenterLinkResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateMerchantCenterLinkResult.Unmarshal(m, b)
+}
+func (m *MutateMerchantCenterLinkResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateMerchantCenterLinkResult.Marshal(b, m, deterministic)
+}
+func (m *MutateMerchantCenterLinkResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateMerchantCenterLinkResult.Merge(m, src)
+}
+func (m *MutateMerchantCenterLinkResult) XXX_Size() int {
+	return xxx_messageInfo_MutateMerchantCenterLinkResult.Size(m)
+}
+func (m *MutateMerchantCenterLinkResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateMerchantCenterLinkResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateMerchantCenterLinkResult proto.InternalMessageInfo
+
+func (m *MutateMerchantCenterLinkResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ListMerchantCenterLinksRequest)(nil), "google.ads.googleads.v3.services.ListMerchantCenterLinksRequest")
+	proto.RegisterType((*ListMerchantCenterLinksResponse)(nil), "google.ads.googleads.v3.services.ListMerchantCenterLinksResponse")
+	proto.RegisterType((*GetMerchantCenterLinkRequest)(nil), "google.ads.googleads.v3.services.GetMerchantCenterLinkRequest")
+	proto.RegisterType((*MutateMerchantCenterLinkRequest)(nil), "google.ads.googleads.v3.services.MutateMerchantCenterLinkRequest")
+	proto.RegisterType((*MerchantCenterLinkOperation)(nil), "google.ads.googleads.v3.services.MerchantCenterLinkOperation")
+	proto.RegisterType((*MutateMerchantCenterLinkResponse)(nil), "google.ads.googleads.v3.services.MutateMerchantCenterLinkResponse")
+	proto.RegisterType((*MutateMerchantCenterLinkResult)(nil), "google.ads.googleads.v3.services.MutateMerchantCenterLinkResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/merchant_center_link_service.proto", fileDescriptor_70858648997893d9)
+}
+
+var fileDescriptor_70858648997893d9 = []byte{
+	// 738 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x41, 0x6b, 0xd4, 0x4e,
+	0x14, 0xff, 0x27, 0x0b, 0x0b, 0x9d, 0xfd, 0x7b, 0x19, 0x29, 0x8d, 0xdb, 0xd2, 0x2e, 0xb1, 0x87,
+	0x65, 0x91, 0x04, 0x1b, 0x8a, 0x92, 0xba, 0x62, 0xb6, 0xd8, 0xad, 0xd0, 0xb5, 0x65, 0x85, 0x22,
+	0xba, 0xb0, 0xa6, 0xc9, 0x74, 0x1b, 0x9a, 0x64, 0xd6, 0xcc, 0x64, 0x2f, 0xb5, 0x17, 0xc5, 0x9b,
+	0x37, 0xbf, 0x81, 0x37, 0xfd, 0x28, 0x3d, 0xea, 0xad, 0x20, 0x78, 0x10, 0x04, 0x3f, 0x84, 0x48,
+	0x32, 0x33, 0xbb, 0x29, 0x4d, 0xb6, 0xb5, 0xbd, 0xbd, 0x99, 0xf7, 0xf2, 0x7b, 0xef, 0xf7, 0xde,
+	0xef, 0x4d, 0xc0, 0xfa, 0x00, 0xe3, 0x81, 0x8f, 0x74, 0xdb, 0x25, 0x3a, 0x33, 0x13, 0x6b, 0x64,
+	0xe8, 0x04, 0x45, 0x23, 0xcf, 0x41, 0x44, 0x0f, 0x50, 0xe4, 0x1c, 0xd8, 0x21, 0xed, 0x3b, 0x28,
+	0xa4, 0x28, 0xea, 0xfb, 0x5e, 0x78, 0xd8, 0xe7, 0x5e, 0x6d, 0x18, 0x61, 0x8a, 0x61, 0x8d, 0x7d,
+	0xa9, 0xd9, 0x2e, 0xd1, 0xc6, 0x20, 0xda, 0xc8, 0xd0, 0x04, 0x48, 0xf5, 0x41, 0x51, 0x9a, 0x08,
+	0x11, 0x1c, 0x47, 0x45, 0x79, 0x18, 0x7e, 0x75, 0x41, 0x7c, 0x3d, 0xf4, 0x74, 0x3b, 0x0c, 0x31,
+	0xb5, 0xa9, 0x87, 0x43, 0xc2, 0xbd, 0x73, 0x19, 0xaf, 0xe3, 0x7b, 0x28, 0xa4, 0xdc, 0xb1, 0x94,
+	0x71, 0xec, 0x7b, 0xc8, 0x77, 0xfb, 0x7b, 0xe8, 0xc0, 0x1e, 0x79, 0x38, 0xe2, 0x01, 0xbc, 0x6e,
+	0x3d, 0x3d, 0xed, 0xc5, 0xfb, 0x3c, 0x2a, 0xb0, 0x09, 0xcf, 0xac, 0x6e, 0x80, 0xc5, 0x2d, 0x8f,
+	0xd0, 0x0e, 0xaf, 0x6d, 0x3d, 0x2d, 0x6d, 0xcb, 0x0b, 0x0f, 0x49, 0x17, 0xbd, 0x8e, 0x11, 0xa1,
+	0x70, 0x19, 0x54, 0x9c, 0x98, 0x50, 0x1c, 0xa0, 0xa8, 0xef, 0xb9, 0x8a, 0x54, 0x93, 0xea, 0x33,
+	0xad, 0xd2, 0x0f, 0x4b, 0xee, 0x02, 0x71, 0xff, 0xc4, 0x55, 0x3f, 0x48, 0x60, 0xa9, 0x10, 0x88,
+	0x0c, 0x71, 0x48, 0x10, 0xf4, 0xc0, 0x6c, 0x5e, 0x0f, 0x88, 0x22, 0xd5, 0x4a, 0xf5, 0xca, 0xca,
+	0xaa, 0x56, 0xd4, 0xe5, 0x71, 0x0f, 0xb5, 0xf3, 0xf0, 0xdd, 0x9b, 0xc1, 0xf9, 0x94, 0xea, 0x26,
+	0x58, 0x68, 0xa3, 0x9c, 0x62, 0x04, 0xa9, 0x3a, 0xb8, 0x21, 0x40, 0xfb, 0xa1, 0x1d, 0xa0, 0x2c,
+	0xad, 0xff, 0x85, 0xe7, 0xa9, 0x1d, 0x20, 0xf5, 0xb3, 0x04, 0x96, 0x3a, 0x31, 0xb5, 0x29, 0x2a,
+	0x46, 0xbb, 0x54, 0x8b, 0xe0, 0x2b, 0x30, 0x83, 0x87, 0x28, 0x4a, 0x47, 0xab, 0xc8, 0x35, 0xa9,
+	0x5e, 0x59, 0x69, 0x6a, 0x17, 0x09, 0x2b, 0x87, 0xf1, 0xb6, 0x00, 0x61, 0x29, 0x26, 0xa0, 0xea,
+	0x57, 0x09, 0xcc, 0x4f, 0x89, 0x87, 0x6b, 0xa0, 0x12, 0x0f, 0x5d, 0x9b, 0xa2, 0x54, 0x01, 0x4a,
+	0x29, 0xad, 0xa1, 0x2a, 0x6a, 0x10, 0x22, 0xd1, 0x36, 0x12, 0x91, 0x74, 0x6c, 0x72, 0xd8, 0x05,
+	0x2c, 0x3c, 0xb1, 0xe1, 0x36, 0x28, 0xb3, 0x53, 0xca, 0xef, 0xaa, 0xe3, 0xda, 0xfc, 0xaf, 0xcb,
+	0x61, 0xa0, 0x02, 0xca, 0x11, 0x0a, 0xf0, 0x08, 0xa5, 0xcd, 0x98, 0x49, 0x3c, 0xec, 0xdc, 0xaa,
+	0x64, 0x3a, 0xa5, 0xbe, 0x01, 0xb5, 0xe2, 0xfe, 0x73, 0x65, 0x3d, 0x4f, 0xa0, 0x48, 0xec, 0x53,
+	0xde, 0xd7, 0x47, 0x97, 0xe8, 0x6b, 0x31, 0x66, 0xec, 0xd3, 0x2e, 0xc7, 0x53, 0x1f, 0x83, 0xc5,
+	0xe9, 0x91, 0xf0, 0x76, 0xae, 0x94, 0xce, 0xaa, 0x68, 0xe5, 0x5d, 0x19, 0xdc, 0x3a, 0x8f, 0xf0,
+	0x8c, 0x15, 0x03, 0x7f, 0x49, 0x60, 0xae, 0x60, 0x79, 0xe0, 0x25, 0xa8, 0x4c, 0x5f, 0xe0, 0xaa,
+	0x75, 0x0d, 0x04, 0xd6, 0x5f, 0xb5, 0x7d, 0x6a, 0x65, 0x15, 0xfe, 0xf6, 0xdb, 0xcf, 0x8f, 0xb2,
+	0x01, 0xef, 0x26, 0xef, 0x9b, 0xb8, 0x26, 0xfa, 0x51, 0x26, 0xa2, 0xd9, 0x38, 0xd6, 0x73, 0xf6,
+	0x12, 0x7e, 0x97, 0xc0, 0x6c, 0xee, 0x62, 0xc2, 0x87, 0x17, 0x57, 0x39, 0x6d, 0xa3, 0xab, 0x57,
+	0x93, 0xa3, 0xda, 0x39, 0xb5, 0xce, 0x8e, 0x2f, 0xe5, 0x76, 0x0f, 0xae, 0x26, 0xdc, 0x8e, 0xce,
+	0x78, 0x9a, 0x13, 0xaa, 0x8d, 0x3c, 0x72, 0x7a, 0xe3, 0x18, 0xfe, 0x91, 0x80, 0x52, 0xa4, 0x17,
+	0x68, 0x5d, 0x47, 0x95, 0x8c, 0x65, 0xeb, 0x5a, 0xc2, 0x66, 0xc3, 0x7c, 0x79, 0x6a, 0xcd, 0x66,
+	0x46, 0x75, 0x67, 0xbc, 0x6a, 0x29, 0xf5, 0xa6, 0x7a, 0xff, 0x9f, 0xc7, 0x6a, 0x06, 0x69, 0x4e,
+	0x53, 0x6a, 0x54, 0xe7, 0x4f, 0x2c, 0x65, 0x52, 0x17, 0xb7, 0x86, 0x1e, 0xd1, 0x1c, 0x1c, 0xb4,
+	0xde, 0xcb, 0x60, 0xd9, 0xc1, 0xc1, 0x85, 0x1c, 0x5a, 0x8b, 0x85, 0xbb, 0xb2, 0x93, 0x3c, 0x52,
+	0x3b, 0xd2, 0x8b, 0x4d, 0x8e, 0x31, 0xc0, 0xbe, 0x1d, 0x0e, 0x34, 0x1c, 0x0d, 0xf4, 0x01, 0x0a,
+	0xd3, 0x27, 0x4c, 0x9f, 0x64, 0x2d, 0xfe, 0xeb, 0xaf, 0x09, 0xe3, 0x93, 0x5c, 0x6a, 0x5b, 0xd6,
+	0x17, 0xb9, 0xd6, 0x66, 0x80, 0x96, 0x4b, 0x34, 0x66, 0x26, 0xd6, 0xae, 0xa1, 0xf1, 0xc4, 0xe4,
+	0x44, 0x84, 0xf4, 0x2c, 0x97, 0xf4, 0xc6, 0x21, 0xbd, 0x5d, 0xa3, 0x27, 0x42, 0x7e, 0xcb, 0xcb,
+	0xec, 0xde, 0x34, 0x2d, 0x97, 0x98, 0xe6, 0x38, 0xc8, 0x34, 0x77, 0x0d, 0xd3, 0x14, 0x61, 0x7b,
+	0xe5, 0xb4, 0x4e, 0xe3, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3a, 0xe6, 0x7c, 0xb3, 0x9c, 0x08,
+	0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// MerchantCenterLinkServiceClient is the client API for MerchantCenterLinkService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type MerchantCenterLinkServiceClient interface {
+	// Returns Merchant Center links available for this customer.
+	ListMerchantCenterLinks(ctx context.Context, in *ListMerchantCenterLinksRequest, opts ...grpc.CallOption) (*ListMerchantCenterLinksResponse, error)
+	// Returns the Merchant Center link in full detail.
+	GetMerchantCenterLink(ctx context.Context, in *GetMerchantCenterLinkRequest, opts ...grpc.CallOption) (*resources.MerchantCenterLink, error)
+	// Updates status or removes a Merchant Center link.
+	MutateMerchantCenterLink(ctx context.Context, in *MutateMerchantCenterLinkRequest, opts ...grpc.CallOption) (*MutateMerchantCenterLinkResponse, error)
+}
+
+type merchantCenterLinkServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewMerchantCenterLinkServiceClient(cc grpc.ClientConnInterface) MerchantCenterLinkServiceClient {
+	return &merchantCenterLinkServiceClient{cc}
+}
+
+func (c *merchantCenterLinkServiceClient) ListMerchantCenterLinks(ctx context.Context, in *ListMerchantCenterLinksRequest, opts ...grpc.CallOption) (*ListMerchantCenterLinksResponse, error) {
+	out := new(ListMerchantCenterLinksResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MerchantCenterLinkService/ListMerchantCenterLinks", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *merchantCenterLinkServiceClient) GetMerchantCenterLink(ctx context.Context, in *GetMerchantCenterLinkRequest, opts ...grpc.CallOption) (*resources.MerchantCenterLink, error) {
+	out := new(resources.MerchantCenterLink)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MerchantCenterLinkService/GetMerchantCenterLink", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *merchantCenterLinkServiceClient) MutateMerchantCenterLink(ctx context.Context, in *MutateMerchantCenterLinkRequest, opts ...grpc.CallOption) (*MutateMerchantCenterLinkResponse, error) {
+	out := new(MutateMerchantCenterLinkResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MerchantCenterLinkService/MutateMerchantCenterLink", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// MerchantCenterLinkServiceServer is the server API for MerchantCenterLinkService service.
+type MerchantCenterLinkServiceServer interface {
+	// Returns Merchant Center links available for this customer.
+	ListMerchantCenterLinks(context.Context, *ListMerchantCenterLinksRequest) (*ListMerchantCenterLinksResponse, error)
+	// Returns the Merchant Center link in full detail.
+	GetMerchantCenterLink(context.Context, *GetMerchantCenterLinkRequest) (*resources.MerchantCenterLink, error)
+	// Updates status or removes a Merchant Center link.
+	MutateMerchantCenterLink(context.Context, *MutateMerchantCenterLinkRequest) (*MutateMerchantCenterLinkResponse, error)
+}
+
+// UnimplementedMerchantCenterLinkServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedMerchantCenterLinkServiceServer struct {
+}
+
+func (*UnimplementedMerchantCenterLinkServiceServer) ListMerchantCenterLinks(ctx context.Context, req *ListMerchantCenterLinksRequest) (*ListMerchantCenterLinksResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListMerchantCenterLinks not implemented")
+}
+func (*UnimplementedMerchantCenterLinkServiceServer) GetMerchantCenterLink(ctx context.Context, req *GetMerchantCenterLinkRequest) (*resources.MerchantCenterLink, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetMerchantCenterLink not implemented")
+}
+func (*UnimplementedMerchantCenterLinkServiceServer) MutateMerchantCenterLink(ctx context.Context, req *MutateMerchantCenterLinkRequest) (*MutateMerchantCenterLinkResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MutateMerchantCenterLink not implemented")
+}
+
+func RegisterMerchantCenterLinkServiceServer(s *grpc.Server, srv MerchantCenterLinkServiceServer) {
+	s.RegisterService(&_MerchantCenterLinkService_serviceDesc, srv)
+}
+
+func _MerchantCenterLinkService_ListMerchantCenterLinks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListMerchantCenterLinksRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MerchantCenterLinkServiceServer).ListMerchantCenterLinks(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MerchantCenterLinkService/ListMerchantCenterLinks",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MerchantCenterLinkServiceServer).ListMerchantCenterLinks(ctx, req.(*ListMerchantCenterLinksRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MerchantCenterLinkService_GetMerchantCenterLink_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetMerchantCenterLinkRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MerchantCenterLinkServiceServer).GetMerchantCenterLink(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MerchantCenterLinkService/GetMerchantCenterLink",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MerchantCenterLinkServiceServer).GetMerchantCenterLink(ctx, req.(*GetMerchantCenterLinkRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MerchantCenterLinkService_MutateMerchantCenterLink_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateMerchantCenterLinkRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MerchantCenterLinkServiceServer).MutateMerchantCenterLink(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MerchantCenterLinkService/MutateMerchantCenterLink",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MerchantCenterLinkServiceServer).MutateMerchantCenterLink(ctx, req.(*MutateMerchantCenterLinkRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _MerchantCenterLinkService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.MerchantCenterLinkService",
+	HandlerType: (*MerchantCenterLinkServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListMerchantCenterLinks",
+			Handler:    _MerchantCenterLinkService_ListMerchantCenterLinks_Handler,
+		},
+		{
+			MethodName: "GetMerchantCenterLink",
+			Handler:    _MerchantCenterLinkService_GetMerchantCenterLink_Handler,
+		},
+		{
+			MethodName: "MutateMerchantCenterLink",
+			Handler:    _MerchantCenterLinkService_MutateMerchantCenterLink_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/merchant_center_link_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/mobile_app_category_constant_service.pb.go b/googleapis/ads/googleads/v3/services/mobile_app_category_constant_service.pb.go
new file mode 100644
index 0000000..9835354
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/mobile_app_category_constant_service.pb.go
@@ -0,0 +1,191 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/mobile_app_category_constant_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [MobileAppCategoryConstantService.GetMobileAppCategoryConstant][google.ads.googleads.v3.services.MobileAppCategoryConstantService.GetMobileAppCategoryConstant].
+type GetMobileAppCategoryConstantRequest struct {
+	// Required. Resource name of the mobile app category constant to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetMobileAppCategoryConstantRequest) Reset()         { *m = GetMobileAppCategoryConstantRequest{} }
+func (m *GetMobileAppCategoryConstantRequest) String() string { return proto.CompactTextString(m) }
+func (*GetMobileAppCategoryConstantRequest) ProtoMessage()    {}
+func (*GetMobileAppCategoryConstantRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1ec6a53799fd6176, []int{0}
+}
+
+func (m *GetMobileAppCategoryConstantRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMobileAppCategoryConstantRequest.Unmarshal(m, b)
+}
+func (m *GetMobileAppCategoryConstantRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMobileAppCategoryConstantRequest.Marshal(b, m, deterministic)
+}
+func (m *GetMobileAppCategoryConstantRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMobileAppCategoryConstantRequest.Merge(m, src)
+}
+func (m *GetMobileAppCategoryConstantRequest) XXX_Size() int {
+	return xxx_messageInfo_GetMobileAppCategoryConstantRequest.Size(m)
+}
+func (m *GetMobileAppCategoryConstantRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMobileAppCategoryConstantRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMobileAppCategoryConstantRequest proto.InternalMessageInfo
+
+func (m *GetMobileAppCategoryConstantRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetMobileAppCategoryConstantRequest)(nil), "google.ads.googleads.v3.services.GetMobileAppCategoryConstantRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/mobile_app_category_constant_service.proto", fileDescriptor_1ec6a53799fd6176)
+}
+
+var fileDescriptor_1ec6a53799fd6176 = []byte{
+	// 419 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x31, 0xeb, 0xd3, 0x40,
+	0x18, 0xc6, 0x49, 0x0a, 0x82, 0x41, 0x97, 0x2c, 0x96, 0x58, 0x30, 0xd4, 0x0a, 0xc5, 0xe1, 0x4e,
+	0x9a, 0xed, 0xd4, 0xe1, 0x5a, 0xa5, 0x05, 0x51, 0x4b, 0x85, 0x0e, 0x12, 0x08, 0xd7, 0xe4, 0x8c,
+	0x07, 0xc9, 0x5d, 0xcc, 0x5d, 0x03, 0x22, 0x2e, 0xce, 0x6e, 0x7e, 0x03, 0x47, 0x17, 0xbf, 0x47,
+	0x57, 0x37, 0x27, 0x07, 0x27, 0xc1, 0xef, 0x20, 0xe9, 0xe5, 0xd2, 0x76, 0x88, 0xf9, 0x6f, 0x0f,
+	0x7d, 0x9e, 0xfe, 0x9e, 0xf7, 0xde, 0x97, 0x38, 0xcf, 0x52, 0x21, 0xd2, 0x8c, 0x42, 0x92, 0x48,
+	0xa8, 0x65, 0xad, 0xaa, 0x00, 0x4a, 0x5a, 0x56, 0x2c, 0xa6, 0x12, 0xe6, 0x62, 0xc7, 0x32, 0x1a,
+	0x91, 0xa2, 0x88, 0x62, 0xa2, 0x68, 0x2a, 0xca, 0xf7, 0x51, 0x2c, 0xb8, 0x54, 0x84, 0xab, 0xa8,
+	0x49, 0x81, 0xa2, 0x14, 0x4a, 0xb8, 0xbe, 0x26, 0x00, 0x92, 0x48, 0xd0, 0xc2, 0x40, 0x15, 0x00,
+	0x03, 0xf3, 0x9e, 0x74, 0xd5, 0x95, 0x54, 0x8a, 0x7d, 0xd9, 0xd7, 0xa7, 0x7b, 0xbc, 0x91, 0xa1,
+	0x14, 0x0c, 0x12, 0xce, 0x85, 0x22, 0x8a, 0x09, 0x2e, 0x1b, 0xf7, 0xd6, 0x99, 0x1b, 0x67, 0x8c,
+	0xb6, 0x7f, 0xbb, 0x73, 0x66, 0xbc, 0x61, 0x34, 0x4b, 0xa2, 0x1d, 0x7d, 0x4b, 0x2a, 0x26, 0x4a,
+	0x1d, 0x18, 0xbf, 0x74, 0xee, 0x2e, 0xa9, 0x7a, 0x7e, 0x1c, 0x00, 0x17, 0xc5, 0xa2, 0xa9, 0x5f,
+	0x34, 0xed, 0x1b, 0xfa, 0x6e, 0x4f, 0xa5, 0x72, 0xa7, 0xce, 0x4d, 0x33, 0x6e, 0xc4, 0x49, 0x4e,
+	0x87, 0x96, 0x6f, 0x4d, 0xaf, 0xcf, 0x07, 0xbf, 0xb0, 0xbd, 0xb9, 0x61, 0x9c, 0x17, 0x24, 0xa7,
+	0xb3, 0xef, 0xb6, 0xe3, 0x77, 0xe2, 0x5e, 0xe9, 0xa5, 0xb8, 0x7f, 0x2d, 0x67, 0xf4, 0xbf, 0x5a,
+	0xf7, 0x29, 0xe8, 0xdb, 0x2b, 0xb8, 0xc2, 0xd8, 0xde, 0xa3, 0x4e, 0x4c, 0xbb, 0x7c, 0xd0, 0x09,
+	0x19, 0xaf, 0x7e, 0xe2, 0xcb, 0x57, 0x7f, 0xfa, 0xf1, 0xfb, 0x8b, 0x3d, 0x73, 0x1f, 0xd4, 0xd7,
+	0xfb, 0x70, 0xe1, 0x3c, 0xce, 0xbb, 0x28, 0x12, 0xde, 0xff, 0xe8, 0xdd, 0x3e, 0xe0, 0xe1, 0xa9,
+	0xbe, 0x51, 0x05, 0x93, 0x20, 0x16, 0xf9, 0xfc, 0xb3, 0xed, 0x4c, 0x62, 0x91, 0xf7, 0xbe, 0x78,
+	0x7e, 0xaf, 0x6f, 0xaf, 0xeb, 0xfa, 0xa4, 0x6b, 0xeb, 0xf5, 0xaa, 0x41, 0xa5, 0x22, 0x23, 0x3c,
+	0x05, 0xa2, 0x4c, 0x61, 0x4a, 0xf9, 0xf1, 0xe0, 0xf0, 0x54, 0xde, 0xfd, 0x01, 0x3c, 0x34, 0xe2,
+	0xab, 0x3d, 0x58, 0x62, 0xfc, 0xcd, 0xf6, 0x97, 0x1a, 0x88, 0x13, 0x09, 0xb4, 0xac, 0xd5, 0x36,
+	0x00, 0x4d, 0xb1, 0x3c, 0x98, 0x48, 0x88, 0x13, 0x19, 0xb6, 0x91, 0x70, 0x1b, 0x84, 0x26, 0xf2,
+	0xc7, 0x9e, 0xe8, 0xdf, 0x11, 0xc2, 0x89, 0x44, 0xa8, 0x0d, 0x21, 0xb4, 0x0d, 0x10, 0x32, 0xb1,
+	0xdd, 0xb5, 0xe3, 0x9c, 0xc1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x48, 0x6a, 0x14, 0xe6, 0xa7,
+	0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// MobileAppCategoryConstantServiceClient is the client API for MobileAppCategoryConstantService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type MobileAppCategoryConstantServiceClient interface {
+	// Returns the requested mobile app category constant.
+	GetMobileAppCategoryConstant(ctx context.Context, in *GetMobileAppCategoryConstantRequest, opts ...grpc.CallOption) (*resources.MobileAppCategoryConstant, error)
+}
+
+type mobileAppCategoryConstantServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewMobileAppCategoryConstantServiceClient(cc grpc.ClientConnInterface) MobileAppCategoryConstantServiceClient {
+	return &mobileAppCategoryConstantServiceClient{cc}
+}
+
+func (c *mobileAppCategoryConstantServiceClient) GetMobileAppCategoryConstant(ctx context.Context, in *GetMobileAppCategoryConstantRequest, opts ...grpc.CallOption) (*resources.MobileAppCategoryConstant, error) {
+	out := new(resources.MobileAppCategoryConstant)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MobileAppCategoryConstantService/GetMobileAppCategoryConstant", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// MobileAppCategoryConstantServiceServer is the server API for MobileAppCategoryConstantService service.
+type MobileAppCategoryConstantServiceServer interface {
+	// Returns the requested mobile app category constant.
+	GetMobileAppCategoryConstant(context.Context, *GetMobileAppCategoryConstantRequest) (*resources.MobileAppCategoryConstant, error)
+}
+
+// UnimplementedMobileAppCategoryConstantServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedMobileAppCategoryConstantServiceServer struct {
+}
+
+func (*UnimplementedMobileAppCategoryConstantServiceServer) GetMobileAppCategoryConstant(ctx context.Context, req *GetMobileAppCategoryConstantRequest) (*resources.MobileAppCategoryConstant, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetMobileAppCategoryConstant not implemented")
+}
+
+func RegisterMobileAppCategoryConstantServiceServer(s *grpc.Server, srv MobileAppCategoryConstantServiceServer) {
+	s.RegisterService(&_MobileAppCategoryConstantService_serviceDesc, srv)
+}
+
+func _MobileAppCategoryConstantService_GetMobileAppCategoryConstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetMobileAppCategoryConstantRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MobileAppCategoryConstantServiceServer).GetMobileAppCategoryConstant(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MobileAppCategoryConstantService/GetMobileAppCategoryConstant",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MobileAppCategoryConstantServiceServer).GetMobileAppCategoryConstant(ctx, req.(*GetMobileAppCategoryConstantRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _MobileAppCategoryConstantService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.MobileAppCategoryConstantService",
+	HandlerType: (*MobileAppCategoryConstantServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetMobileAppCategoryConstant",
+			Handler:    _MobileAppCategoryConstantService_GetMobileAppCategoryConstant_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/mobile_app_category_constant_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/mobile_device_constant_service.pb.go b/googleapis/ads/googleads/v3/services/mobile_device_constant_service.pb.go
new file mode 100644
index 0000000..b2a2a95
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/mobile_device_constant_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/mobile_device_constant_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [MobileDeviceConstantService.GetMobileDeviceConstant][google.ads.googleads.v3.services.MobileDeviceConstantService.GetMobileDeviceConstant].
+type GetMobileDeviceConstantRequest struct {
+	// Required. Resource name of the mobile device to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetMobileDeviceConstantRequest) Reset()         { *m = GetMobileDeviceConstantRequest{} }
+func (m *GetMobileDeviceConstantRequest) String() string { return proto.CompactTextString(m) }
+func (*GetMobileDeviceConstantRequest) ProtoMessage()    {}
+func (*GetMobileDeviceConstantRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3657ef6f30658246, []int{0}
+}
+
+func (m *GetMobileDeviceConstantRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMobileDeviceConstantRequest.Unmarshal(m, b)
+}
+func (m *GetMobileDeviceConstantRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMobileDeviceConstantRequest.Marshal(b, m, deterministic)
+}
+func (m *GetMobileDeviceConstantRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMobileDeviceConstantRequest.Merge(m, src)
+}
+func (m *GetMobileDeviceConstantRequest) XXX_Size() int {
+	return xxx_messageInfo_GetMobileDeviceConstantRequest.Size(m)
+}
+func (m *GetMobileDeviceConstantRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMobileDeviceConstantRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMobileDeviceConstantRequest proto.InternalMessageInfo
+
+func (m *GetMobileDeviceConstantRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetMobileDeviceConstantRequest)(nil), "google.ads.googleads.v3.services.GetMobileDeviceConstantRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/mobile_device_constant_service.proto", fileDescriptor_3657ef6f30658246)
+}
+
+var fileDescriptor_3657ef6f30658246 = []byte{
+	// 414 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x4f, 0x8b, 0xd3, 0x40,
+	0x1c, 0x25, 0x29, 0x08, 0x06, 0xbd, 0xe4, 0xd2, 0x92, 0x8a, 0x86, 0xd2, 0x43, 0x51, 0x9c, 0x01,
+	0x73, 0x10, 0x46, 0x14, 0xa7, 0x55, 0x2a, 0x82, 0x52, 0x2a, 0xf4, 0x20, 0x81, 0x30, 0x4d, 0xc6,
+	0x38, 0x90, 0xcc, 0xd4, 0x4c, 0x9a, 0x8b, 0x78, 0xf1, 0xe2, 0x07, 0x10, 0xf6, 0x03, 0xec, 0x71,
+	0x3f, 0x4a, 0xaf, 0x7b, 0xda, 0x3d, 0xed, 0x61, 0x4f, 0xfb, 0x29, 0x96, 0x64, 0x32, 0x69, 0x0b,
+	0x4d, 0x7b, 0x7b, 0xc9, 0x7b, 0xbf, 0xf7, 0x7e, 0x7f, 0xc6, 0xfa, 0x18, 0x0b, 0x11, 0x27, 0x14,
+	0x92, 0x48, 0x42, 0x05, 0x4b, 0x54, 0x78, 0x50, 0xd2, 0xac, 0x60, 0x21, 0x95, 0x30, 0x15, 0x4b,
+	0x96, 0xd0, 0x20, 0xa2, 0xe5, 0x67, 0x10, 0x0a, 0x2e, 0x73, 0xc2, 0xf3, 0xa0, 0xe6, 0xc1, 0x2a,
+	0x13, 0xb9, 0xb0, 0x5d, 0x55, 0x0b, 0x48, 0x24, 0x41, 0x63, 0x03, 0x0a, 0x0f, 0x68, 0x1b, 0xe7,
+	0x5d, 0x5b, 0x50, 0x46, 0xa5, 0x58, 0x67, 0xed, 0x49, 0x2a, 0xc1, 0x79, 0xa2, 0xeb, 0x57, 0x0c,
+	0x12, 0xce, 0x45, 0x4e, 0x72, 0x26, 0xb8, 0xac, 0xd9, 0xee, 0x0e, 0x1b, 0x26, 0x8c, 0x36, 0x65,
+	0xcf, 0x76, 0x88, 0x1f, 0x8c, 0x26, 0x51, 0xb0, 0xa4, 0x3f, 0x49, 0xc1, 0x44, 0xa6, 0x04, 0x83,
+	0xcf, 0xd6, 0xd3, 0x29, 0xcd, 0xbf, 0x54, 0xd1, 0x1f, 0xaa, 0xe4, 0x49, 0x1d, 0x3c, 0xa7, 0xbf,
+	0xd6, 0x54, 0xe6, 0xf6, 0xc8, 0x7a, 0xac, 0x7b, 0x0c, 0x38, 0x49, 0x69, 0xcf, 0x70, 0x8d, 0xd1,
+	0xc3, 0x71, 0xe7, 0x06, 0x9b, 0xf3, 0x47, 0x9a, 0xf9, 0x4a, 0x52, 0xfa, 0xea, 0xcc, 0xb4, 0xfa,
+	0x87, 0x9c, 0xbe, 0xa9, 0x25, 0xd8, 0x57, 0x86, 0xd5, 0x6d, 0x09, 0xb3, 0xdf, 0x83, 0x53, 0x2b,
+	0x04, 0xc7, 0xfb, 0x74, 0x5e, 0xb7, 0x3a, 0x34, 0x2b, 0x06, 0x87, 0xea, 0x07, 0x93, 0x6b, 0xbc,
+	0x3f, 0xe1, 0xdf, 0xcb, 0xdb, 0xff, 0xe6, 0x4b, 0xfb, 0x45, 0x79, 0x9e, 0xdf, 0x7b, 0xcc, 0xdb,
+	0xf4, 0x80, 0x81, 0x84, 0xcf, 0xff, 0x38, 0xfd, 0x0d, 0xee, 0x6d, 0x43, 0x6b, 0xb4, 0x62, 0x12,
+	0x84, 0x22, 0x1d, 0xff, 0x33, 0xad, 0x61, 0x28, 0xd2, 0x93, 0x23, 0x8e, 0xdd, 0x23, 0xeb, 0x9b,
+	0x95, 0xf7, 0x9a, 0x19, 0xdf, 0x3f, 0xd5, 0x2e, 0xb1, 0x48, 0x08, 0x8f, 0x81, 0xc8, 0x62, 0x18,
+	0x53, 0x5e, 0x5d, 0x13, 0x6e, 0x73, 0xdb, 0x5f, 0xf4, 0x1b, 0x0d, 0xce, 0xcd, 0xce, 0x14, 0xe3,
+	0x0b, 0xd3, 0x9d, 0x2a, 0x43, 0x1c, 0x49, 0xa0, 0x60, 0x89, 0x16, 0x1e, 0xa8, 0x83, 0xe5, 0x46,
+	0x4b, 0x7c, 0x1c, 0x49, 0xbf, 0x91, 0xf8, 0x0b, 0xcf, 0xd7, 0x92, 0x3b, 0x73, 0xa8, 0xfe, 0x23,
+	0x84, 0x23, 0x89, 0x50, 0x23, 0x42, 0x68, 0xe1, 0x21, 0xa4, 0x65, 0xcb, 0x07, 0x55, 0x9f, 0xde,
+	0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe7, 0x70, 0x2b, 0x8c, 0x78, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// MobileDeviceConstantServiceClient is the client API for MobileDeviceConstantService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type MobileDeviceConstantServiceClient interface {
+	// Returns the requested mobile device constant in full detail.
+	GetMobileDeviceConstant(ctx context.Context, in *GetMobileDeviceConstantRequest, opts ...grpc.CallOption) (*resources.MobileDeviceConstant, error)
+}
+
+type mobileDeviceConstantServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewMobileDeviceConstantServiceClient(cc grpc.ClientConnInterface) MobileDeviceConstantServiceClient {
+	return &mobileDeviceConstantServiceClient{cc}
+}
+
+func (c *mobileDeviceConstantServiceClient) GetMobileDeviceConstant(ctx context.Context, in *GetMobileDeviceConstantRequest, opts ...grpc.CallOption) (*resources.MobileDeviceConstant, error) {
+	out := new(resources.MobileDeviceConstant)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MobileDeviceConstantService/GetMobileDeviceConstant", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// MobileDeviceConstantServiceServer is the server API for MobileDeviceConstantService service.
+type MobileDeviceConstantServiceServer interface {
+	// Returns the requested mobile device constant in full detail.
+	GetMobileDeviceConstant(context.Context, *GetMobileDeviceConstantRequest) (*resources.MobileDeviceConstant, error)
+}
+
+// UnimplementedMobileDeviceConstantServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedMobileDeviceConstantServiceServer struct {
+}
+
+func (*UnimplementedMobileDeviceConstantServiceServer) GetMobileDeviceConstant(ctx context.Context, req *GetMobileDeviceConstantRequest) (*resources.MobileDeviceConstant, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetMobileDeviceConstant not implemented")
+}
+
+func RegisterMobileDeviceConstantServiceServer(s *grpc.Server, srv MobileDeviceConstantServiceServer) {
+	s.RegisterService(&_MobileDeviceConstantService_serviceDesc, srv)
+}
+
+func _MobileDeviceConstantService_GetMobileDeviceConstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetMobileDeviceConstantRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MobileDeviceConstantServiceServer).GetMobileDeviceConstant(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MobileDeviceConstantService/GetMobileDeviceConstant",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MobileDeviceConstantServiceServer).GetMobileDeviceConstant(ctx, req.(*GetMobileDeviceConstantRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _MobileDeviceConstantService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.MobileDeviceConstantService",
+	HandlerType: (*MobileDeviceConstantServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetMobileDeviceConstant",
+			Handler:    _MobileDeviceConstantService_GetMobileDeviceConstant_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/mobile_device_constant_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/mutate_job_service.pb.go b/googleapis/ads/googleads/v3/services/mutate_job_service.pb.go
new file mode 100644
index 0000000..3356ba0
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/mutate_job_service.pb.go
@@ -0,0 +1,820 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/mutate_job_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	longrunning "google.golang.org/genproto/googleapis/longrunning"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [MutateJobService.CreateMutateJobRequest][]
+type CreateMutateJobRequest struct {
+	// Required. The ID of the customer for which to create a mutate job.
+	CustomerId           string   `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CreateMutateJobRequest) Reset()         { *m = CreateMutateJobRequest{} }
+func (m *CreateMutateJobRequest) String() string { return proto.CompactTextString(m) }
+func (*CreateMutateJobRequest) ProtoMessage()    {}
+func (*CreateMutateJobRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f886c171116bc7fb, []int{0}
+}
+
+func (m *CreateMutateJobRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateMutateJobRequest.Unmarshal(m, b)
+}
+func (m *CreateMutateJobRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateMutateJobRequest.Marshal(b, m, deterministic)
+}
+func (m *CreateMutateJobRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateMutateJobRequest.Merge(m, src)
+}
+func (m *CreateMutateJobRequest) XXX_Size() int {
+	return xxx_messageInfo_CreateMutateJobRequest.Size(m)
+}
+func (m *CreateMutateJobRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateMutateJobRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateMutateJobRequest proto.InternalMessageInfo
+
+func (m *CreateMutateJobRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+// Response message for [MutateJobService.CreateMutateJobResponse][]
+type CreateMutateJobResponse struct {
+	// The resource name of the MutateJob.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CreateMutateJobResponse) Reset()         { *m = CreateMutateJobResponse{} }
+func (m *CreateMutateJobResponse) String() string { return proto.CompactTextString(m) }
+func (*CreateMutateJobResponse) ProtoMessage()    {}
+func (*CreateMutateJobResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f886c171116bc7fb, []int{1}
+}
+
+func (m *CreateMutateJobResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateMutateJobResponse.Unmarshal(m, b)
+}
+func (m *CreateMutateJobResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateMutateJobResponse.Marshal(b, m, deterministic)
+}
+func (m *CreateMutateJobResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateMutateJobResponse.Merge(m, src)
+}
+func (m *CreateMutateJobResponse) XXX_Size() int {
+	return xxx_messageInfo_CreateMutateJobResponse.Size(m)
+}
+func (m *CreateMutateJobResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateMutateJobResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateMutateJobResponse proto.InternalMessageInfo
+
+func (m *CreateMutateJobResponse) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [MutateJobService.GetMutateJob][google.ads.googleads.v3.services.MutateJobService.GetMutateJob]
+type GetMutateJobRequest struct {
+	// Required. The resource name of the MutateJob to get.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetMutateJobRequest) Reset()         { *m = GetMutateJobRequest{} }
+func (m *GetMutateJobRequest) String() string { return proto.CompactTextString(m) }
+func (*GetMutateJobRequest) ProtoMessage()    {}
+func (*GetMutateJobRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f886c171116bc7fb, []int{2}
+}
+
+func (m *GetMutateJobRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMutateJobRequest.Unmarshal(m, b)
+}
+func (m *GetMutateJobRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMutateJobRequest.Marshal(b, m, deterministic)
+}
+func (m *GetMutateJobRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMutateJobRequest.Merge(m, src)
+}
+func (m *GetMutateJobRequest) XXX_Size() int {
+	return xxx_messageInfo_GetMutateJobRequest.Size(m)
+}
+func (m *GetMutateJobRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMutateJobRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMutateJobRequest proto.InternalMessageInfo
+
+func (m *GetMutateJobRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [MutateJobService.RunMutateJob][google.ads.googleads.v3.services.MutateJobService.RunMutateJob]
+type RunMutateJobRequest struct {
+	// Required. The resource name of the MutateJob to run.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *RunMutateJobRequest) Reset()         { *m = RunMutateJobRequest{} }
+func (m *RunMutateJobRequest) String() string { return proto.CompactTextString(m) }
+func (*RunMutateJobRequest) ProtoMessage()    {}
+func (*RunMutateJobRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f886c171116bc7fb, []int{3}
+}
+
+func (m *RunMutateJobRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RunMutateJobRequest.Unmarshal(m, b)
+}
+func (m *RunMutateJobRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RunMutateJobRequest.Marshal(b, m, deterministic)
+}
+func (m *RunMutateJobRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RunMutateJobRequest.Merge(m, src)
+}
+func (m *RunMutateJobRequest) XXX_Size() int {
+	return xxx_messageInfo_RunMutateJobRequest.Size(m)
+}
+func (m *RunMutateJobRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_RunMutateJobRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RunMutateJobRequest proto.InternalMessageInfo
+
+func (m *RunMutateJobRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [MutateJobService.AddMutateJobOperations][google.ads.googleads.v3.services.MutateJobService.AddMutateJobOperations]
+type AddMutateJobOperationsRequest struct {
+	// Required. The resource name of the MutateJob.
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// A token used to enforce sequencing.
+	//
+	// The first AddMutateJobOperations request for a MutateJob should not set
+	// sequence_token. Subsequent requests must set sequence_token to the value of
+	// next_sequence_token received in the previous AddMutateJobOperations
+	// response.
+	SequenceToken string `protobuf:"bytes,2,opt,name=sequence_token,json=sequenceToken,proto3" json:"sequence_token,omitempty"`
+	// Required. The list of mutates being added.
+	//
+	// Operations can use negative integers as temp ids to signify dependencies
+	// between entities created in this MutateJob. For example, a customer with
+	// id = 1234 can create a campaign and an ad group in that same campaign by
+	// creating a campaign in the first operation with the resource name
+	// explicitly set to "customers/1234/campaigns/-1", and creating an ad group
+	// in the second operation with the campaign field also set to
+	// "customers/1234/campaigns/-1".
+	MutateOperations     []*MutateOperation `protobuf:"bytes,3,rep,name=mutate_operations,json=mutateOperations,proto3" json:"mutate_operations,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
+	XXX_unrecognized     []byte             `json:"-"`
+	XXX_sizecache        int32              `json:"-"`
+}
+
+func (m *AddMutateJobOperationsRequest) Reset()         { *m = AddMutateJobOperationsRequest{} }
+func (m *AddMutateJobOperationsRequest) String() string { return proto.CompactTextString(m) }
+func (*AddMutateJobOperationsRequest) ProtoMessage()    {}
+func (*AddMutateJobOperationsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f886c171116bc7fb, []int{4}
+}
+
+func (m *AddMutateJobOperationsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AddMutateJobOperationsRequest.Unmarshal(m, b)
+}
+func (m *AddMutateJobOperationsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AddMutateJobOperationsRequest.Marshal(b, m, deterministic)
+}
+func (m *AddMutateJobOperationsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AddMutateJobOperationsRequest.Merge(m, src)
+}
+func (m *AddMutateJobOperationsRequest) XXX_Size() int {
+	return xxx_messageInfo_AddMutateJobOperationsRequest.Size(m)
+}
+func (m *AddMutateJobOperationsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_AddMutateJobOperationsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AddMutateJobOperationsRequest proto.InternalMessageInfo
+
+func (m *AddMutateJobOperationsRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *AddMutateJobOperationsRequest) GetSequenceToken() string {
+	if m != nil {
+		return m.SequenceToken
+	}
+	return ""
+}
+
+func (m *AddMutateJobOperationsRequest) GetMutateOperations() []*MutateOperation {
+	if m != nil {
+		return m.MutateOperations
+	}
+	return nil
+}
+
+// Response message for [MutateJobService.AddMutateJobOperations][google.ads.googleads.v3.services.MutateJobService.AddMutateJobOperations]
+type AddMutateJobOperationsResponse struct {
+	// The total number of operations added so far for this job.
+	TotalOperations int64 `protobuf:"varint,1,opt,name=total_operations,json=totalOperations,proto3" json:"total_operations,omitempty"`
+	// The sequence token to be used when calling AddMutateJobOperations again if
+	// more operations need to be added. The next AddMutateJobOperations request
+	// must set the sequence_token field to the value of this field.
+	NextSequenceToken    string   `protobuf:"bytes,2,opt,name=next_sequence_token,json=nextSequenceToken,proto3" json:"next_sequence_token,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AddMutateJobOperationsResponse) Reset()         { *m = AddMutateJobOperationsResponse{} }
+func (m *AddMutateJobOperationsResponse) String() string { return proto.CompactTextString(m) }
+func (*AddMutateJobOperationsResponse) ProtoMessage()    {}
+func (*AddMutateJobOperationsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f886c171116bc7fb, []int{5}
+}
+
+func (m *AddMutateJobOperationsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AddMutateJobOperationsResponse.Unmarshal(m, b)
+}
+func (m *AddMutateJobOperationsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AddMutateJobOperationsResponse.Marshal(b, m, deterministic)
+}
+func (m *AddMutateJobOperationsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AddMutateJobOperationsResponse.Merge(m, src)
+}
+func (m *AddMutateJobOperationsResponse) XXX_Size() int {
+	return xxx_messageInfo_AddMutateJobOperationsResponse.Size(m)
+}
+func (m *AddMutateJobOperationsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_AddMutateJobOperationsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AddMutateJobOperationsResponse proto.InternalMessageInfo
+
+func (m *AddMutateJobOperationsResponse) GetTotalOperations() int64 {
+	if m != nil {
+		return m.TotalOperations
+	}
+	return 0
+}
+
+func (m *AddMutateJobOperationsResponse) GetNextSequenceToken() string {
+	if m != nil {
+		return m.NextSequenceToken
+	}
+	return ""
+}
+
+// Request message for [MutateJobService.ListMutateJobResults][google.ads.googleads.v3.services.MutateJobService.ListMutateJobResults].
+type ListMutateJobResultsRequest struct {
+	// Required. The resource name of the MutateJob whose results are being listed.
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Token of the page to retrieve. If not specified, the first
+	// page of results will be returned. Use the value obtained from
+	// `next_page_token` in the previous response in order to request
+	// the next page of results.
+	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// Number of elements to retrieve in a single page.
+	// When a page request is too large, the server may decide to
+	// further limit the number of returned resources.
+	PageSize             int32    `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListMutateJobResultsRequest) Reset()         { *m = ListMutateJobResultsRequest{} }
+func (m *ListMutateJobResultsRequest) String() string { return proto.CompactTextString(m) }
+func (*ListMutateJobResultsRequest) ProtoMessage()    {}
+func (*ListMutateJobResultsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f886c171116bc7fb, []int{6}
+}
+
+func (m *ListMutateJobResultsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListMutateJobResultsRequest.Unmarshal(m, b)
+}
+func (m *ListMutateJobResultsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListMutateJobResultsRequest.Marshal(b, m, deterministic)
+}
+func (m *ListMutateJobResultsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListMutateJobResultsRequest.Merge(m, src)
+}
+func (m *ListMutateJobResultsRequest) XXX_Size() int {
+	return xxx_messageInfo_ListMutateJobResultsRequest.Size(m)
+}
+func (m *ListMutateJobResultsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListMutateJobResultsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListMutateJobResultsRequest proto.InternalMessageInfo
+
+func (m *ListMutateJobResultsRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func (m *ListMutateJobResultsRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *ListMutateJobResultsRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+// Response message for [MutateJobService.ListMutateJobResults][google.ads.googleads.v3.services.MutateJobService.ListMutateJobResults].
+type ListMutateJobResultsResponse struct {
+	// The list of rows that matched the query.
+	Results []*MutateJobResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
+	// Pagination token used to retrieve the next page of results.
+	// Pass the content of this string as the `page_token` attribute of
+	// the next request. `next_page_token` is not returned for the last
+	// page.
+	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListMutateJobResultsResponse) Reset()         { *m = ListMutateJobResultsResponse{} }
+func (m *ListMutateJobResultsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListMutateJobResultsResponse) ProtoMessage()    {}
+func (*ListMutateJobResultsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f886c171116bc7fb, []int{7}
+}
+
+func (m *ListMutateJobResultsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListMutateJobResultsResponse.Unmarshal(m, b)
+}
+func (m *ListMutateJobResultsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListMutateJobResultsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListMutateJobResultsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListMutateJobResultsResponse.Merge(m, src)
+}
+func (m *ListMutateJobResultsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListMutateJobResultsResponse.Size(m)
+}
+func (m *ListMutateJobResultsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListMutateJobResultsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListMutateJobResultsResponse proto.InternalMessageInfo
+
+func (m *ListMutateJobResultsResponse) GetResults() []*MutateJobResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+func (m *ListMutateJobResultsResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+// MutateJob result.
+type MutateJobResult struct {
+	// Index of the mutate operation.
+	OperationIndex int64 `protobuf:"varint,1,opt,name=operation_index,json=operationIndex,proto3" json:"operation_index,omitempty"`
+	// Response for the mutate.
+	// May be empty if errors occurred.
+	MutateOperationResponse *MutateOperationResponse `protobuf:"bytes,2,opt,name=mutate_operation_response,json=mutateOperationResponse,proto3" json:"mutate_operation_response,omitempty"`
+	// Details of the errors when processing the operation.
+	Status               *status.Status `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
+}
+
+func (m *MutateJobResult) Reset()         { *m = MutateJobResult{} }
+func (m *MutateJobResult) String() string { return proto.CompactTextString(m) }
+func (*MutateJobResult) ProtoMessage()    {}
+func (*MutateJobResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_f886c171116bc7fb, []int{8}
+}
+
+func (m *MutateJobResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateJobResult.Unmarshal(m, b)
+}
+func (m *MutateJobResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateJobResult.Marshal(b, m, deterministic)
+}
+func (m *MutateJobResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateJobResult.Merge(m, src)
+}
+func (m *MutateJobResult) XXX_Size() int {
+	return xxx_messageInfo_MutateJobResult.Size(m)
+}
+func (m *MutateJobResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateJobResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateJobResult proto.InternalMessageInfo
+
+func (m *MutateJobResult) GetOperationIndex() int64 {
+	if m != nil {
+		return m.OperationIndex
+	}
+	return 0
+}
+
+func (m *MutateJobResult) GetMutateOperationResponse() *MutateOperationResponse {
+	if m != nil {
+		return m.MutateOperationResponse
+	}
+	return nil
+}
+
+func (m *MutateJobResult) GetStatus() *status.Status {
+	if m != nil {
+		return m.Status
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*CreateMutateJobRequest)(nil), "google.ads.googleads.v3.services.CreateMutateJobRequest")
+	proto.RegisterType((*CreateMutateJobResponse)(nil), "google.ads.googleads.v3.services.CreateMutateJobResponse")
+	proto.RegisterType((*GetMutateJobRequest)(nil), "google.ads.googleads.v3.services.GetMutateJobRequest")
+	proto.RegisterType((*RunMutateJobRequest)(nil), "google.ads.googleads.v3.services.RunMutateJobRequest")
+	proto.RegisterType((*AddMutateJobOperationsRequest)(nil), "google.ads.googleads.v3.services.AddMutateJobOperationsRequest")
+	proto.RegisterType((*AddMutateJobOperationsResponse)(nil), "google.ads.googleads.v3.services.AddMutateJobOperationsResponse")
+	proto.RegisterType((*ListMutateJobResultsRequest)(nil), "google.ads.googleads.v3.services.ListMutateJobResultsRequest")
+	proto.RegisterType((*ListMutateJobResultsResponse)(nil), "google.ads.googleads.v3.services.ListMutateJobResultsResponse")
+	proto.RegisterType((*MutateJobResult)(nil), "google.ads.googleads.v3.services.MutateJobResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/mutate_job_service.proto", fileDescriptor_f886c171116bc7fb)
+}
+
+var fileDescriptor_f886c171116bc7fb = []byte{
+	// 976 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x4f, 0x6f, 0xdc, 0x44,
+	0x14, 0x97, 0x77, 0x45, 0x21, 0x93, 0xa4, 0x9b, 0x4e, 0x69, 0xb3, 0x38, 0x0d, 0x5d, 0xb9, 0x01,
+	0xc2, 0x2a, 0xb2, 0x61, 0x97, 0x4a, 0x8d, 0x51, 0x12, 0x1c, 0x40, 0x69, 0x0b, 0x85, 0xc8, 0x41,
+	0x39, 0xa0, 0x48, 0xd6, 0xac, 0x3d, 0x35, 0x86, 0xf5, 0x8c, 0xf1, 0x8c, 0xa3, 0xd2, 0xa8, 0x17,
+	0x38, 0x72, 0xec, 0x85, 0x33, 0xe2, 0xc4, 0x07, 0x40, 0xe2, 0x2b, 0xe4, 0x84, 0x84, 0xb8, 0x44,
+	0x42, 0xe2, 0x80, 0x84, 0xc4, 0x85, 0x2f, 0xc0, 0x01, 0xd9, 0x9e, 0xf1, 0xda, 0x59, 0x27, 0xcb,
+	0xa6, 0xb7, 0xd9, 0xdf, 0xfb, 0xfb, 0x7b, 0xef, 0xf9, 0xbd, 0x05, 0xeb, 0x3e, 0xa5, 0xfe, 0x10,
+	0x1b, 0xc8, 0x63, 0x46, 0xfe, 0x4c, 0x5f, 0x87, 0x7d, 0x83, 0xe1, 0xf8, 0x30, 0x70, 0x31, 0x33,
+	0xc2, 0x84, 0x23, 0x8e, 0x9d, 0xcf, 0xe9, 0xc0, 0x11, 0x98, 0x1e, 0xc5, 0x94, 0x53, 0xd8, 0xc9,
+	0xf5, 0x75, 0xe4, 0x31, 0xbd, 0x30, 0xd5, 0x0f, 0xfb, 0xba, 0x34, 0x55, 0x7b, 0x67, 0x39, 0x8f,
+	0x31, 0xa3, 0x49, 0x5c, 0xf5, 0x9e, 0x7b, 0x55, 0x27, 0x27, 0x94, 0xa3, 0x0e, 0xf2, 0x58, 0x35,
+	0x21, 0xf5, 0x86, 0x34, 0x8d, 0x02, 0x03, 0x11, 0x42, 0x39, 0xe2, 0x01, 0x25, 0x4c, 0x48, 0x17,
+	0x4b, 0x52, 0x77, 0x18, 0x60, 0xc2, 0x85, 0xe0, 0x66, 0x49, 0xf0, 0x30, 0xc0, 0x43, 0xcf, 0x19,
+	0xe0, 0xcf, 0xd0, 0x61, 0x40, 0x63, 0xa1, 0x70, 0x4b, 0x28, 0x0c, 0x29, 0xf1, 0xe3, 0x84, 0x90,
+	0x80, 0xf8, 0x06, 0x8d, 0x70, 0x5c, 0xeb, 0x3e, 0x8e, 0x5c, 0x83, 0x71, 0xc4, 0x13, 0x21, 0xd0,
+	0x36, 0xc1, 0xf5, 0x77, 0x63, 0x8c, 0x38, 0x7e, 0x90, 0x51, 0xbd, 0x4f, 0x07, 0x36, 0xfe, 0x32,
+	0xc1, 0x8c, 0xc3, 0x15, 0x30, 0xeb, 0x26, 0x8c, 0xd3, 0x10, 0xc7, 0x4e, 0xe0, 0xb5, 0x95, 0x8e,
+	0xb2, 0x3a, 0xb3, 0xdd, 0xfc, 0xc3, 0x6a, 0xd8, 0x40, 0xe2, 0xf7, 0x3c, 0x6d, 0x13, 0x2c, 0x8e,
+	0xd9, 0xb3, 0x88, 0x12, 0x86, 0xe1, 0x2d, 0x30, 0x2f, 0x2b, 0xe9, 0x10, 0x14, 0xe2, 0xdc, 0x85,
+	0x3d, 0x27, 0xc1, 0x8f, 0x50, 0x88, 0xb5, 0x2d, 0x70, 0x75, 0x07, 0xf3, 0xb1, 0xe0, 0xab, 0xb5,
+	0xb6, 0x79, 0xf8, 0x31, 0x07, 0x76, 0x42, 0x9e, 0xc1, 0xc1, 0x6f, 0x0a, 0x58, 0xb6, 0x3c, 0xaf,
+	0xf0, 0xf0, 0x71, 0x51, 0xbb, 0xa9, 0x7d, 0xc1, 0x57, 0xc0, 0x65, 0x96, 0x1a, 0x11, 0x17, 0x3b,
+	0x9c, 0x7e, 0x81, 0x49, 0xbb, 0x91, 0x71, 0x9e, 0x97, 0xe8, 0x27, 0x29, 0x08, 0x5d, 0x70, 0x45,
+	0x4c, 0xd6, 0xa8, 0x51, 0xed, 0x66, 0xa7, 0xb9, 0x3a, 0xdb, 0x7b, 0x53, 0x9f, 0x34, 0xb7, 0x7a,
+	0x9e, 0x69, 0x91, 0x66, 0x9e, 0xc7, 0x42, 0x58, 0x45, 0x99, 0x76, 0x04, 0x5e, 0x3e, 0x8b, 0x96,
+	0x68, 0xd0, 0xeb, 0x60, 0x81, 0x53, 0x8e, 0x86, 0xe5, 0x2c, 0x52, 0x6a, 0x4d, 0xbb, 0x95, 0xe1,
+	0x23, 0x13, 0xa8, 0x83, 0xab, 0x04, 0x3f, 0xe2, 0x4e, 0x2d, 0xbb, 0x2b, 0xa9, 0x68, 0xaf, 0xcc,
+	0x50, 0xfb, 0x46, 0x01, 0x4b, 0x1f, 0x06, 0xac, 0xdc, 0x58, 0x96, 0x0c, 0xf9, 0x05, 0x4a, 0xba,
+	0x0c, 0x40, 0x84, 0xfc, 0x6a, 0xc0, 0x99, 0x14, 0xc9, 0x4b, 0xb9, 0x04, 0xb2, 0x1f, 0x0e, 0x0b,
+	0x1e, 0xe3, 0x76, 0xb3, 0xa3, 0xac, 0x3e, 0x67, 0xbf, 0x90, 0x02, 0x7b, 0xc1, 0x63, 0xac, 0x3d,
+	0x55, 0xc0, 0x8d, 0xfa, 0x2c, 0x44, 0x05, 0x3e, 0x00, 0xcf, 0xc7, 0x39, 0xd4, 0x56, 0xa6, 0x2b,
+	0x7f, 0xe1, 0xcc, 0x96, 0x1e, 0xe0, 0xab, 0xa0, 0x95, 0xd5, 0x68, 0x2c, 0xdd, 0xf9, 0x14, 0xde,
+	0x95, 0x29, 0x6b, 0xbf, 0x2b, 0xa0, 0x75, 0xca, 0x09, 0x7c, 0x0d, 0xb4, 0x8a, 0x26, 0x38, 0x01,
+	0xf1, 0xf0, 0x23, 0xd1, 0x89, 0xcb, 0x05, 0x7c, 0x2f, 0x45, 0x61, 0x02, 0x5e, 0x3a, 0x3d, 0x3a,
+	0x4e, 0x2c, 0xe8, 0x64, 0xe1, 0x66, 0x7b, 0xeb, 0x53, 0x8f, 0x90, 0xac, 0x87, 0xbd, 0x18, 0xd6,
+	0x0b, 0x60, 0x17, 0x5c, 0xca, 0xd7, 0x46, 0x56, 0xe3, 0xd9, 0x1e, 0x94, 0x31, 0xe2, 0xc8, 0xd5,
+	0xf7, 0x32, 0x89, 0x2d, 0x34, 0x7a, 0xff, 0xcc, 0x80, 0x85, 0x82, 0xdf, 0x5e, 0x1e, 0x12, 0xfe,
+	0xa2, 0x80, 0xd6, 0xa9, 0x45, 0x01, 0xef, 0x4c, 0x4e, 0xb4, 0x7e, 0x37, 0xa9, 0xeb, 0x17, 0xb0,
+	0xcc, 0x99, 0x68, 0x77, 0x4f, 0xac, 0xf2, 0x5e, 0xfb, 0xfa, 0xd7, 0x3f, 0x9f, 0x36, 0xde, 0xd2,
+	0x8c, 0x74, 0x87, 0x4b, 0x98, 0x19, 0x47, 0x25, 0x8d, 0x8d, 0xee, 0x13, 0x71, 0x07, 0xee, 0xd3,
+	0x01, 0x33, 0xdd, 0xcc, 0xaf, 0xa9, 0x74, 0xe1, 0xcf, 0x0a, 0x98, 0x2b, 0xef, 0x2e, 0x78, 0x7b,
+	0x72, 0x56, 0x35, 0xbb, 0x4e, 0x5d, 0x3b, 0xd3, 0xac, 0x38, 0x44, 0xa3, 0xa1, 0xd3, 0xde, 0x3b,
+	0xb1, 0xaa, 0x9f, 0x4e, 0xc6, 0x40, 0x87, 0x6b, 0x29, 0x83, 0xa3, 0x8a, 0x64, 0x63, 0x44, 0xa8,
+	0x5b, 0xa2, 0x60, 0x74, 0x9f, 0xc0, 0xbf, 0x14, 0xf0, 0x62, 0xdd, 0x97, 0x01, 0x37, 0x26, 0x73,
+	0x38, 0xe7, 0xbb, 0x56, 0x37, 0x2f, 0x6a, 0x2e, 0xba, 0xb3, 0x5b, 0xcb, 0xce, 0x84, 0x77, 0xa6,
+	0x61, 0x67, 0x0e, 0x03, 0xc6, 0x25, 0xa1, 0x6f, 0x1b, 0x60, 0xae, 0x7c, 0x20, 0xfe, 0x4f, 0x97,
+	0x6a, 0x0e, 0x8a, 0xba, 0x2c, 0xcd, 0x4a, 0x77, 0x56, 0x2f, 0x3e, 0x14, 0xed, 0x07, 0xe5, 0xd8,
+	0xda, 0x07, 0xd7, 0x84, 0x4e, 0x76, 0x5b, 0x07, 0xc9, 0x43, 0xfd, 0xfd, 0x30, 0xe2, 0x5f, 0xc1,
+	0x8d, 0x29, 0x1a, 0x3c, 0x7a, 0x3d, 0xc0, 0x1c, 0x79, 0x88, 0xa3, 0xda, 0x92, 0xdc, 0xd6, 0xde,
+	0x98, 0xaa, 0x24, 0x71, 0x42, 0xd2, 0x99, 0xfd, 0xa9, 0x01, 0xae, 0xd7, 0x5f, 0x05, 0xb8, 0x35,
+	0xb9, 0x2e, 0xe7, 0x9e, 0x49, 0xf5, 0x9d, 0x8b, 0x3b, 0x10, 0xdd, 0xff, 0x4e, 0x39, 0xb1, 0xf4,
+	0x0a, 0xa3, 0xb5, 0xea, 0xc1, 0x59, 0x1b, 0x3b, 0x9b, 0x27, 0xd6, 0xcd, 0xaa, 0xc1, 0x98, 0x46,
+	0x56, 0xae, 0x2d, 0xcd, 0x9c, 0xaa, 0x5c, 0xc8, 0xf3, 0x46, 0xf9, 0x99, 0x4a, 0x57, 0x5d, 0x3a,
+	0xb6, 0xda, 0x23, 0x4e, 0xe2, 0x15, 0x05, 0x4c, 0x77, 0x69, 0xb8, 0xfd, 0xaf, 0x02, 0x56, 0x5c,
+	0x1a, 0x4e, 0xe4, 0xbf, 0x7d, 0xed, 0xf4, 0x5e, 0xdc, 0x4d, 0x07, 0x65, 0x57, 0xf9, 0xf4, 0xae,
+	0x30, 0xf5, 0xe9, 0x10, 0x11, 0x5f, 0xa7, 0xb1, 0x6f, 0xf8, 0x98, 0x64, 0x63, 0x64, 0x8c, 0x82,
+	0x9d, 0xfd, 0xb7, 0xf3, 0x6d, 0xf9, 0xf8, 0xbe, 0xd1, 0xdc, 0xb1, 0xac, 0x1f, 0x1b, 0x9d, 0x9d,
+	0xdc, 0xa1, 0xe5, 0x31, 0x3d, 0x7f, 0xa6, 0xaf, 0xfd, 0xbe, 0x2e, 0x02, 0xb3, 0x63, 0xa9, 0x72,
+	0x60, 0x79, 0xec, 0xa0, 0x50, 0x39, 0xd8, 0xef, 0x1f, 0x48, 0x95, 0xbf, 0x1b, 0x2b, 0x39, 0x6e,
+	0x9a, 0x96, 0xc7, 0x4c, 0xb3, 0x50, 0x32, 0xcd, 0xfd, 0xbe, 0x69, 0x4a, 0xb5, 0xc1, 0xa5, 0x2c,
+	0xcf, 0xfe, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x99, 0x07, 0x1b, 0xa6, 0xae, 0x0b, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// MutateJobServiceClient is the client API for MutateJobService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type MutateJobServiceClient interface {
+	// Creates a mutate job.
+	CreateMutateJob(ctx context.Context, in *CreateMutateJobRequest, opts ...grpc.CallOption) (*CreateMutateJobResponse, error)
+	// Returns the mutate job.
+	GetMutateJob(ctx context.Context, in *GetMutateJobRequest, opts ...grpc.CallOption) (*resources.MutateJob, error)
+	// Returns the results of the mutate job. The job must be done.
+	// Supports standard list paging.
+	ListMutateJobResults(ctx context.Context, in *ListMutateJobResultsRequest, opts ...grpc.CallOption) (*ListMutateJobResultsResponse, error)
+	// Runs the mutate job.
+	//
+	// The Operation.metadata field type is MutateJobMetadata. When finished, the
+	// long running operation will not contain errors or a response. Instead, use
+	// ListMutateJobResults to get the results of the job.
+	RunMutateJob(ctx context.Context, in *RunMutateJobRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
+	// Add operations to the mutate job.
+	AddMutateJobOperations(ctx context.Context, in *AddMutateJobOperationsRequest, opts ...grpc.CallOption) (*AddMutateJobOperationsResponse, error)
+}
+
+type mutateJobServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewMutateJobServiceClient(cc grpc.ClientConnInterface) MutateJobServiceClient {
+	return &mutateJobServiceClient{cc}
+}
+
+func (c *mutateJobServiceClient) CreateMutateJob(ctx context.Context, in *CreateMutateJobRequest, opts ...grpc.CallOption) (*CreateMutateJobResponse, error) {
+	out := new(CreateMutateJobResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MutateJobService/CreateMutateJob", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *mutateJobServiceClient) GetMutateJob(ctx context.Context, in *GetMutateJobRequest, opts ...grpc.CallOption) (*resources.MutateJob, error) {
+	out := new(resources.MutateJob)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MutateJobService/GetMutateJob", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *mutateJobServiceClient) ListMutateJobResults(ctx context.Context, in *ListMutateJobResultsRequest, opts ...grpc.CallOption) (*ListMutateJobResultsResponse, error) {
+	out := new(ListMutateJobResultsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MutateJobService/ListMutateJobResults", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *mutateJobServiceClient) RunMutateJob(ctx context.Context, in *RunMutateJobRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
+	out := new(longrunning.Operation)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MutateJobService/RunMutateJob", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *mutateJobServiceClient) AddMutateJobOperations(ctx context.Context, in *AddMutateJobOperationsRequest, opts ...grpc.CallOption) (*AddMutateJobOperationsResponse, error) {
+	out := new(AddMutateJobOperationsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.MutateJobService/AddMutateJobOperations", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// MutateJobServiceServer is the server API for MutateJobService service.
+type MutateJobServiceServer interface {
+	// Creates a mutate job.
+	CreateMutateJob(context.Context, *CreateMutateJobRequest) (*CreateMutateJobResponse, error)
+	// Returns the mutate job.
+	GetMutateJob(context.Context, *GetMutateJobRequest) (*resources.MutateJob, error)
+	// Returns the results of the mutate job. The job must be done.
+	// Supports standard list paging.
+	ListMutateJobResults(context.Context, *ListMutateJobResultsRequest) (*ListMutateJobResultsResponse, error)
+	// Runs the mutate job.
+	//
+	// The Operation.metadata field type is MutateJobMetadata. When finished, the
+	// long running operation will not contain errors or a response. Instead, use
+	// ListMutateJobResults to get the results of the job.
+	RunMutateJob(context.Context, *RunMutateJobRequest) (*longrunning.Operation, error)
+	// Add operations to the mutate job.
+	AddMutateJobOperations(context.Context, *AddMutateJobOperationsRequest) (*AddMutateJobOperationsResponse, error)
+}
+
+// UnimplementedMutateJobServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedMutateJobServiceServer struct {
+}
+
+func (*UnimplementedMutateJobServiceServer) CreateMutateJob(ctx context.Context, req *CreateMutateJobRequest) (*CreateMutateJobResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method CreateMutateJob not implemented")
+}
+func (*UnimplementedMutateJobServiceServer) GetMutateJob(ctx context.Context, req *GetMutateJobRequest) (*resources.MutateJob, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetMutateJob not implemented")
+}
+func (*UnimplementedMutateJobServiceServer) ListMutateJobResults(ctx context.Context, req *ListMutateJobResultsRequest) (*ListMutateJobResultsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method ListMutateJobResults not implemented")
+}
+func (*UnimplementedMutateJobServiceServer) RunMutateJob(ctx context.Context, req *RunMutateJobRequest) (*longrunning.Operation, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method RunMutateJob not implemented")
+}
+func (*UnimplementedMutateJobServiceServer) AddMutateJobOperations(ctx context.Context, req *AddMutateJobOperationsRequest) (*AddMutateJobOperationsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method AddMutateJobOperations not implemented")
+}
+
+func RegisterMutateJobServiceServer(s *grpc.Server, srv MutateJobServiceServer) {
+	s.RegisterService(&_MutateJobService_serviceDesc, srv)
+}
+
+func _MutateJobService_CreateMutateJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateMutateJobRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MutateJobServiceServer).CreateMutateJob(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MutateJobService/CreateMutateJob",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MutateJobServiceServer).CreateMutateJob(ctx, req.(*CreateMutateJobRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MutateJobService_GetMutateJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetMutateJobRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MutateJobServiceServer).GetMutateJob(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MutateJobService/GetMutateJob",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MutateJobServiceServer).GetMutateJob(ctx, req.(*GetMutateJobRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MutateJobService_ListMutateJobResults_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListMutateJobResultsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MutateJobServiceServer).ListMutateJobResults(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MutateJobService/ListMutateJobResults",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MutateJobServiceServer).ListMutateJobResults(ctx, req.(*ListMutateJobResultsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MutateJobService_RunMutateJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(RunMutateJobRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MutateJobServiceServer).RunMutateJob(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MutateJobService/RunMutateJob",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MutateJobServiceServer).RunMutateJob(ctx, req.(*RunMutateJobRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MutateJobService_AddMutateJobOperations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(AddMutateJobOperationsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MutateJobServiceServer).AddMutateJobOperations(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.MutateJobService/AddMutateJobOperations",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MutateJobServiceServer).AddMutateJobOperations(ctx, req.(*AddMutateJobOperationsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _MutateJobService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.MutateJobService",
+	HandlerType: (*MutateJobServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "CreateMutateJob",
+			Handler:    _MutateJobService_CreateMutateJob_Handler,
+		},
+		{
+			MethodName: "GetMutateJob",
+			Handler:    _MutateJobService_GetMutateJob_Handler,
+		},
+		{
+			MethodName: "ListMutateJobResults",
+			Handler:    _MutateJobService_ListMutateJobResults_Handler,
+		},
+		{
+			MethodName: "RunMutateJob",
+			Handler:    _MutateJobService_RunMutateJob_Handler,
+		},
+		{
+			MethodName: "AddMutateJobOperations",
+			Handler:    _MutateJobService_AddMutateJobOperations_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/mutate_job_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/operating_system_version_constant_service.pb.go b/googleapis/ads/googleads/v3/services/operating_system_version_constant_service.pb.go
new file mode 100644
index 0000000..af52301
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/operating_system_version_constant_service.pb.go
@@ -0,0 +1,193 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/operating_system_version_constant_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [OperatingSystemVersionConstantService.GetOperatingSystemVersionConstant][google.ads.googleads.v3.services.OperatingSystemVersionConstantService.GetOperatingSystemVersionConstant].
+type GetOperatingSystemVersionConstantRequest struct {
+	// Required. Resource name of the OS version to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetOperatingSystemVersionConstantRequest) Reset() {
+	*m = GetOperatingSystemVersionConstantRequest{}
+}
+func (m *GetOperatingSystemVersionConstantRequest) String() string { return proto.CompactTextString(m) }
+func (*GetOperatingSystemVersionConstantRequest) ProtoMessage()    {}
+func (*GetOperatingSystemVersionConstantRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0b1505ba5b934207, []int{0}
+}
+
+func (m *GetOperatingSystemVersionConstantRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetOperatingSystemVersionConstantRequest.Unmarshal(m, b)
+}
+func (m *GetOperatingSystemVersionConstantRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetOperatingSystemVersionConstantRequest.Marshal(b, m, deterministic)
+}
+func (m *GetOperatingSystemVersionConstantRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetOperatingSystemVersionConstantRequest.Merge(m, src)
+}
+func (m *GetOperatingSystemVersionConstantRequest) XXX_Size() int {
+	return xxx_messageInfo_GetOperatingSystemVersionConstantRequest.Size(m)
+}
+func (m *GetOperatingSystemVersionConstantRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetOperatingSystemVersionConstantRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetOperatingSystemVersionConstantRequest proto.InternalMessageInfo
+
+func (m *GetOperatingSystemVersionConstantRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetOperatingSystemVersionConstantRequest)(nil), "google.ads.googleads.v3.services.GetOperatingSystemVersionConstantRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/operating_system_version_constant_service.proto", fileDescriptor_0b1505ba5b934207)
+}
+
+var fileDescriptor_0b1505ba5b934207 = []byte{
+	// 427 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x4f, 0x8b, 0xd3, 0x40,
+	0x18, 0xc6, 0x69, 0x16, 0x04, 0x83, 0x5e, 0x72, 0x71, 0xa9, 0x82, 0x75, 0x59, 0xa1, 0xec, 0x61,
+	0x06, 0x0c, 0x22, 0x8c, 0x78, 0x98, 0x7a, 0xa8, 0x0a, 0x6a, 0xd9, 0x95, 0x1e, 0xa4, 0x10, 0x66,
+	0x93, 0xd7, 0x38, 0xd0, 0xcc, 0x5b, 0xe7, 0x9d, 0x0d, 0x88, 0x78, 0xd0, 0x6f, 0x20, 0x7e, 0x03,
+	0x8f, 0x7e, 0x12, 0xd9, 0xab, 0x37, 0x4f, 0x1e, 0x3c, 0xf9, 0x29, 0x96, 0x74, 0x32, 0xd9, 0xed,
+	0xa1, 0x7f, 0x6e, 0x0f, 0x7d, 0x9f, 0xfe, 0xde, 0x27, 0xcf, 0x9b, 0xc4, 0x93, 0x12, 0xb1, 0x9c,
+	0x03, 0x57, 0x05, 0x71, 0x2f, 0x1b, 0x55, 0xa7, 0x9c, 0xc0, 0xd6, 0x3a, 0x07, 0xe2, 0xb8, 0x00,
+	0xab, 0x9c, 0x36, 0x65, 0x46, 0x1f, 0xc9, 0x41, 0x95, 0xd5, 0x60, 0x49, 0xa3, 0xc9, 0x72, 0x34,
+	0xe4, 0x94, 0x71, 0x59, 0x6b, 0x65, 0x0b, 0x8b, 0x0e, 0x93, 0x81, 0xc7, 0x30, 0x55, 0x10, 0xeb,
+	0x88, 0xac, 0x4e, 0x59, 0x20, 0xf6, 0x9f, 0xaf, 0xdb, 0x69, 0x81, 0xf0, 0xcc, 0xee, 0xb4, 0xd4,
+	0x2f, 0xeb, 0xdf, 0x09, 0xa8, 0x85, 0xe6, 0xca, 0x18, 0x74, 0xca, 0x69, 0x34, 0xd4, 0x4e, 0x6f,
+	0x5d, 0x99, 0xe6, 0x73, 0x0d, 0xdd, 0xdf, 0xee, 0x5e, 0x19, 0xbc, 0xd3, 0x30, 0x2f, 0xb2, 0x53,
+	0x78, 0xaf, 0x6a, 0x8d, 0xd6, 0x1b, 0x0e, 0xde, 0xc4, 0xc3, 0x31, 0xb8, 0xd7, 0x21, 0xc5, 0xc9,
+	0x32, 0xc4, 0xd4, 0x67, 0x78, 0xda, 0x46, 0x38, 0x86, 0x0f, 0x67, 0x40, 0x2e, 0x19, 0xc6, 0x37,
+	0x43, 0xf0, 0xcc, 0xa8, 0x0a, 0xf6, 0x7b, 0x83, 0xde, 0xf0, 0xfa, 0x68, 0xef, 0xaf, 0x8c, 0x8e,
+	0x6f, 0x84, 0xc9, 0x2b, 0x55, 0xc1, 0x83, 0x5f, 0x51, 0x7c, 0x7f, 0x33, 0xf3, 0xc4, 0x77, 0x94,
+	0x7c, 0x89, 0xe2, 0x7b, 0x5b, 0x03, 0x24, 0x2f, 0xd8, 0xb6, 0xae, 0xd9, 0xae, 0x4f, 0xd1, 0x97,
+	0x6b, 0x59, 0xdd, 0x55, 0xd8, 0x66, 0xd2, 0xc1, 0xcb, 0x3f, 0x72, 0xb5, 0x89, 0xaf, 0xbf, 0xff,
+	0x7d, 0x8f, 0x1e, 0x25, 0x0f, 0x9b, 0xdb, 0x7e, 0x5a, 0x99, 0x3c, 0xc1, 0x8d, 0x28, 0xe2, 0x47,
+	0x9f, 0xfb, 0xb7, 0xcf, 0xe5, 0xfe, 0x65, 0x90, 0x56, 0x2d, 0x34, 0xb1, 0x1c, 0xab, 0xd1, 0xb7,
+	0x28, 0x3e, 0xcc, 0xb1, 0xda, 0x5a, 0xc0, 0xe8, 0x68, 0xa7, 0xc2, 0x27, 0xcd, 0xd5, 0x27, 0xbd,
+	0xb7, 0xcf, 0x5a, 0x5e, 0x89, 0x73, 0x65, 0x4a, 0x86, 0xb6, 0xe4, 0x25, 0x98, 0xe5, 0x3b, 0xc1,
+	0x2f, 0x13, 0xac, 0xff, 0x5a, 0x1e, 0x07, 0xf1, 0x23, 0xda, 0x1b, 0x4b, 0xf9, 0x33, 0x1a, 0x8c,
+	0x3d, 0x50, 0x16, 0xc4, 0xbc, 0x6c, 0xd4, 0x34, 0x65, 0xed, 0x62, 0x3a, 0x0f, 0x96, 0x99, 0x2c,
+	0x68, 0xd6, 0x59, 0x66, 0xd3, 0x74, 0x16, 0x2c, 0xff, 0xa3, 0x43, 0xff, 0xbb, 0x10, 0xb2, 0x20,
+	0x21, 0x3a, 0x93, 0x10, 0xd3, 0x54, 0x88, 0x60, 0x3b, 0xbd, 0xb6, 0xcc, 0x99, 0x5e, 0x04, 0x00,
+	0x00, 0xff, 0xff, 0x19, 0xa8, 0x93, 0xae, 0xd4, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// OperatingSystemVersionConstantServiceClient is the client API for OperatingSystemVersionConstantService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type OperatingSystemVersionConstantServiceClient interface {
+	// Returns the requested OS version constant in full detail.
+	GetOperatingSystemVersionConstant(ctx context.Context, in *GetOperatingSystemVersionConstantRequest, opts ...grpc.CallOption) (*resources.OperatingSystemVersionConstant, error)
+}
+
+type operatingSystemVersionConstantServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewOperatingSystemVersionConstantServiceClient(cc grpc.ClientConnInterface) OperatingSystemVersionConstantServiceClient {
+	return &operatingSystemVersionConstantServiceClient{cc}
+}
+
+func (c *operatingSystemVersionConstantServiceClient) GetOperatingSystemVersionConstant(ctx context.Context, in *GetOperatingSystemVersionConstantRequest, opts ...grpc.CallOption) (*resources.OperatingSystemVersionConstant, error) {
+	out := new(resources.OperatingSystemVersionConstant)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.OperatingSystemVersionConstantService/GetOperatingSystemVersionConstant", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// OperatingSystemVersionConstantServiceServer is the server API for OperatingSystemVersionConstantService service.
+type OperatingSystemVersionConstantServiceServer interface {
+	// Returns the requested OS version constant in full detail.
+	GetOperatingSystemVersionConstant(context.Context, *GetOperatingSystemVersionConstantRequest) (*resources.OperatingSystemVersionConstant, error)
+}
+
+// UnimplementedOperatingSystemVersionConstantServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedOperatingSystemVersionConstantServiceServer struct {
+}
+
+func (*UnimplementedOperatingSystemVersionConstantServiceServer) GetOperatingSystemVersionConstant(ctx context.Context, req *GetOperatingSystemVersionConstantRequest) (*resources.OperatingSystemVersionConstant, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetOperatingSystemVersionConstant not implemented")
+}
+
+func RegisterOperatingSystemVersionConstantServiceServer(s *grpc.Server, srv OperatingSystemVersionConstantServiceServer) {
+	s.RegisterService(&_OperatingSystemVersionConstantService_serviceDesc, srv)
+}
+
+func _OperatingSystemVersionConstantService_GetOperatingSystemVersionConstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetOperatingSystemVersionConstantRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OperatingSystemVersionConstantServiceServer).GetOperatingSystemVersionConstant(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.OperatingSystemVersionConstantService/GetOperatingSystemVersionConstant",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OperatingSystemVersionConstantServiceServer).GetOperatingSystemVersionConstant(ctx, req.(*GetOperatingSystemVersionConstantRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _OperatingSystemVersionConstantService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.OperatingSystemVersionConstantService",
+	HandlerType: (*OperatingSystemVersionConstantServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetOperatingSystemVersionConstant",
+			Handler:    _OperatingSystemVersionConstantService_GetOperatingSystemVersionConstant_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/operating_system_version_constant_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/paid_organic_search_term_view_service.pb.go b/googleapis/ads/googleads/v3/services/paid_organic_search_term_view_service.pb.go
new file mode 100644
index 0000000..1e585e2
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/paid_organic_search_term_view_service.pb.go
@@ -0,0 +1,192 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/paid_organic_search_term_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [PaidOrganicSearchTermViewService.GetPaidOrganicSearchTermView][google.ads.googleads.v3.services.PaidOrganicSearchTermViewService.GetPaidOrganicSearchTermView].
+type GetPaidOrganicSearchTermViewRequest struct {
+	// Required. The resource name of the paid organic search term view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetPaidOrganicSearchTermViewRequest) Reset()         { *m = GetPaidOrganicSearchTermViewRequest{} }
+func (m *GetPaidOrganicSearchTermViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetPaidOrganicSearchTermViewRequest) ProtoMessage()    {}
+func (*GetPaidOrganicSearchTermViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3d009f350eeeb233, []int{0}
+}
+
+func (m *GetPaidOrganicSearchTermViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetPaidOrganicSearchTermViewRequest.Unmarshal(m, b)
+}
+func (m *GetPaidOrganicSearchTermViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetPaidOrganicSearchTermViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetPaidOrganicSearchTermViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetPaidOrganicSearchTermViewRequest.Merge(m, src)
+}
+func (m *GetPaidOrganicSearchTermViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetPaidOrganicSearchTermViewRequest.Size(m)
+}
+func (m *GetPaidOrganicSearchTermViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetPaidOrganicSearchTermViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetPaidOrganicSearchTermViewRequest proto.InternalMessageInfo
+
+func (m *GetPaidOrganicSearchTermViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetPaidOrganicSearchTermViewRequest)(nil), "google.ads.googleads.v3.services.GetPaidOrganicSearchTermViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/paid_organic_search_term_view_service.proto", fileDescriptor_3d009f350eeeb233)
+}
+
+var fileDescriptor_3d009f350eeeb233 = []byte{
+	// 439 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x31, 0x6b, 0x14, 0x41,
+	0x14, 0xc7, 0xb9, 0x0d, 0x08, 0x2e, 0xda, 0x6c, 0x63, 0x38, 0x03, 0x1e, 0x31, 0x42, 0x48, 0x31,
+	0x03, 0x6e, 0x37, 0x46, 0x61, 0x0e, 0xc2, 0x59, 0x88, 0x39, 0x92, 0x70, 0x85, 0x1c, 0x2c, 0x93,
+	0x9d, 0xe7, 0x66, 0xe0, 0x76, 0xe6, 0x9c, 0x37, 0xb7, 0x29, 0xc4, 0xc6, 0xda, 0xce, 0x6f, 0x60,
+	0xe9, 0x57, 0xf0, 0x1b, 0xa4, 0xb5, 0xb3, 0xb2, 0xb0, 0xf2, 0x1b, 0xd8, 0xc9, 0xed, 0xec, 0x6c,
+	0x72, 0xe0, 0xba, 0xe9, 0xfe, 0xec, 0xff, 0xcf, 0xef, 0xff, 0xe6, 0x3d, 0x36, 0x7e, 0x55, 0x18,
+	0x53, 0x2c, 0x80, 0x0a, 0x89, 0xd4, 0xcb, 0xb5, 0xaa, 0x52, 0x8a, 0x60, 0x2b, 0x95, 0x03, 0xd2,
+	0xa5, 0x50, 0x32, 0x33, 0xb6, 0x10, 0x5a, 0xe5, 0x19, 0x82, 0xb0, 0xf9, 0x45, 0xe6, 0xc0, 0x96,
+	0x59, 0xa5, 0xe0, 0x32, 0x6b, 0x62, 0x64, 0x69, 0x8d, 0x33, 0xc9, 0xc8, 0x23, 0x88, 0x90, 0x48,
+	0x5a, 0x1a, 0xa9, 0x52, 0x12, 0x68, 0xc3, 0xa3, 0xae, 0x3e, 0x0b, 0x68, 0x56, 0xb6, 0xb7, 0xd0,
+	0x17, 0x0d, 0x77, 0x02, 0x66, 0xa9, 0xa8, 0xd0, 0xda, 0x38, 0xe1, 0x94, 0xd1, 0xd8, 0xb8, 0x0f,
+	0x6e, 0xb8, 0xf9, 0x42, 0x81, 0x76, 0x8d, 0xf1, 0xe8, 0x86, 0xf1, 0x56, 0xc1, 0x42, 0x66, 0xe7,
+	0x70, 0x21, 0x2a, 0x65, 0xac, 0x0f, 0xec, 0x1e, 0xc7, 0x8f, 0x27, 0xe0, 0xa6, 0x42, 0xc9, 0x63,
+	0x3f, 0xc0, 0x69, 0xdd, 0x7f, 0x06, 0xb6, 0x9c, 0x29, 0xb8, 0x3c, 0x81, 0x77, 0x2b, 0x40, 0x97,
+	0xec, 0xc7, 0xf7, 0xc3, 0xbc, 0x99, 0x16, 0x25, 0x6c, 0x0f, 0x46, 0x83, 0xfd, 0xbb, 0xe3, 0xad,
+	0x9f, 0x3c, 0x3a, 0xb9, 0x17, 0x9c, 0xd7, 0xa2, 0x84, 0xa7, 0xdf, 0xa2, 0x78, 0xd4, 0x89, 0x3b,
+	0xf5, 0x5b, 0x49, 0xfe, 0x0c, 0xe2, 0x9d, 0xff, 0xd5, 0x26, 0x47, 0xa4, 0x6f, 0xb1, 0xe4, 0x16,
+	0x63, 0x0f, 0x0f, 0x3b, 0x31, 0xed, 0xf6, 0x49, 0x27, 0x64, 0xf7, 0xec, 0x07, 0xdf, 0x7c, 0xf5,
+	0xc7, 0xef, 0xbf, 0x3e, 0x47, 0x2f, 0x92, 0xc3, 0xf5, 0xf9, 0xde, 0x6f, 0x38, 0xcf, 0xf3, 0x15,
+	0x3a, 0x53, 0x82, 0x45, 0x7a, 0x50, 0xdf, 0xf3, 0x9f, 0x44, 0xa4, 0x07, 0x1f, 0x86, 0x0f, 0xaf,
+	0xf8, 0xf6, 0xf5, 0x28, 0x8d, 0x5a, 0x2a, 0x24, 0xb9, 0x29, 0xc7, 0x9f, 0xa2, 0x78, 0x2f, 0x37,
+	0x65, 0xef, 0xeb, 0xc7, 0x4f, 0xfa, 0x76, 0x3c, 0x5d, 0x9f, 0x77, 0x3a, 0x78, 0xf3, 0xb2, 0x41,
+	0x15, 0x66, 0x21, 0x74, 0x41, 0x8c, 0x2d, 0x68, 0x01, 0xba, 0x3e, 0x3e, 0xbd, 0x2e, 0xef, 0xfe,
+	0x1d, 0x9e, 0x05, 0xf1, 0x25, 0xda, 0x9a, 0x70, 0xfe, 0x35, 0x1a, 0x4d, 0x3c, 0x90, 0x4b, 0x24,
+	0x5e, 0xae, 0xd5, 0x2c, 0x25, 0x4d, 0x31, 0x5e, 0x85, 0xc8, 0x9c, 0x4b, 0x9c, 0xb7, 0x91, 0xf9,
+	0x2c, 0x9d, 0x87, 0xc8, 0xef, 0x68, 0xcf, 0x7f, 0x67, 0x8c, 0x4b, 0x64, 0xac, 0x0d, 0x31, 0x36,
+	0x4b, 0x19, 0x0b, 0xb1, 0xf3, 0x3b, 0xf5, 0x9c, 0xe9, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc5,
+	0xb4, 0x90, 0x79, 0xb5, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// PaidOrganicSearchTermViewServiceClient is the client API for PaidOrganicSearchTermViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type PaidOrganicSearchTermViewServiceClient interface {
+	// Returns the requested paid organic search term view in full detail.
+	GetPaidOrganicSearchTermView(ctx context.Context, in *GetPaidOrganicSearchTermViewRequest, opts ...grpc.CallOption) (*resources.PaidOrganicSearchTermView, error)
+}
+
+type paidOrganicSearchTermViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewPaidOrganicSearchTermViewServiceClient(cc grpc.ClientConnInterface) PaidOrganicSearchTermViewServiceClient {
+	return &paidOrganicSearchTermViewServiceClient{cc}
+}
+
+func (c *paidOrganicSearchTermViewServiceClient) GetPaidOrganicSearchTermView(ctx context.Context, in *GetPaidOrganicSearchTermViewRequest, opts ...grpc.CallOption) (*resources.PaidOrganicSearchTermView, error) {
+	out := new(resources.PaidOrganicSearchTermView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.PaidOrganicSearchTermViewService/GetPaidOrganicSearchTermView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// PaidOrganicSearchTermViewServiceServer is the server API for PaidOrganicSearchTermViewService service.
+type PaidOrganicSearchTermViewServiceServer interface {
+	// Returns the requested paid organic search term view in full detail.
+	GetPaidOrganicSearchTermView(context.Context, *GetPaidOrganicSearchTermViewRequest) (*resources.PaidOrganicSearchTermView, error)
+}
+
+// UnimplementedPaidOrganicSearchTermViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedPaidOrganicSearchTermViewServiceServer struct {
+}
+
+func (*UnimplementedPaidOrganicSearchTermViewServiceServer) GetPaidOrganicSearchTermView(ctx context.Context, req *GetPaidOrganicSearchTermViewRequest) (*resources.PaidOrganicSearchTermView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetPaidOrganicSearchTermView not implemented")
+}
+
+func RegisterPaidOrganicSearchTermViewServiceServer(s *grpc.Server, srv PaidOrganicSearchTermViewServiceServer) {
+	s.RegisterService(&_PaidOrganicSearchTermViewService_serviceDesc, srv)
+}
+
+func _PaidOrganicSearchTermViewService_GetPaidOrganicSearchTermView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetPaidOrganicSearchTermViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PaidOrganicSearchTermViewServiceServer).GetPaidOrganicSearchTermView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.PaidOrganicSearchTermViewService/GetPaidOrganicSearchTermView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PaidOrganicSearchTermViewServiceServer).GetPaidOrganicSearchTermView(ctx, req.(*GetPaidOrganicSearchTermViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _PaidOrganicSearchTermViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.PaidOrganicSearchTermViewService",
+	HandlerType: (*PaidOrganicSearchTermViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetPaidOrganicSearchTermView",
+			Handler:    _PaidOrganicSearchTermViewService_GetPaidOrganicSearchTermView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/paid_organic_search_term_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/parental_status_view_service.pb.go b/googleapis/ads/googleads/v3/services/parental_status_view_service.pb.go
new file mode 100644
index 0000000..e00e091
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/parental_status_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/parental_status_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [ParentalStatusViewService.GetParentalStatusView][google.ads.googleads.v3.services.ParentalStatusViewService.GetParentalStatusView].
+type GetParentalStatusViewRequest struct {
+	// Required. The resource name of the parental status view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetParentalStatusViewRequest) Reset()         { *m = GetParentalStatusViewRequest{} }
+func (m *GetParentalStatusViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetParentalStatusViewRequest) ProtoMessage()    {}
+func (*GetParentalStatusViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1481d5b1312f10e7, []int{0}
+}
+
+func (m *GetParentalStatusViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetParentalStatusViewRequest.Unmarshal(m, b)
+}
+func (m *GetParentalStatusViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetParentalStatusViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetParentalStatusViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetParentalStatusViewRequest.Merge(m, src)
+}
+func (m *GetParentalStatusViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetParentalStatusViewRequest.Size(m)
+}
+func (m *GetParentalStatusViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetParentalStatusViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetParentalStatusViewRequest proto.InternalMessageInfo
+
+func (m *GetParentalStatusViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetParentalStatusViewRequest)(nil), "google.ads.googleads.v3.services.GetParentalStatusViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/parental_status_view_service.proto", fileDescriptor_1481d5b1312f10e7)
+}
+
+var fileDescriptor_1481d5b1312f10e7 = []byte{
+	// 423 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcf, 0x6b, 0xd4, 0x40,
+	0x18, 0x65, 0x53, 0x10, 0x0c, 0x7a, 0x09, 0x88, 0x75, 0x2d, 0xba, 0x94, 0x1e, 0x4a, 0x0f, 0x33,
+	0x60, 0x28, 0xc2, 0xf8, 0x03, 0x66, 0x3d, 0x6c, 0x2f, 0xca, 0xd2, 0xc2, 0x1e, 0x24, 0x10, 0xa6,
+	0xc9, 0x67, 0x1c, 0x48, 0x66, 0xe2, 0x7c, 0x93, 0xf4, 0x20, 0x5e, 0x04, 0xff, 0x02, 0x2f, 0x9e,
+	0x3d, 0xfa, 0xa7, 0xf4, 0xea, 0x4d, 0x10, 0x3c, 0x78, 0xf2, 0xaf, 0x90, 0xec, 0x64, 0xb2, 0x2d,
+	0x35, 0xf6, 0xf6, 0x98, 0xf7, 0xbe, 0xf7, 0xbe, 0x1f, 0x13, 0xbe, 0x28, 0xb4, 0x2e, 0x4a, 0xa0,
+	0x22, 0x47, 0xea, 0x60, 0x87, 0xda, 0x98, 0x22, 0x98, 0x56, 0x66, 0x80, 0xb4, 0x16, 0x06, 0x94,
+	0x15, 0x65, 0x8a, 0x56, 0xd8, 0x06, 0xd3, 0x56, 0xc2, 0x59, 0xda, 0xb3, 0xa4, 0x36, 0xda, 0xea,
+	0x68, 0xe6, 0x2a, 0x89, 0xc8, 0x91, 0x0c, 0x26, 0xa4, 0x8d, 0x89, 0x37, 0x99, 0x3e, 0x1d, 0x8b,
+	0x31, 0x80, 0xba, 0x31, 0x63, 0x39, 0xce, 0x7f, 0xba, 0xe3, 0xab, 0x6b, 0x49, 0x85, 0x52, 0xda,
+	0x0a, 0x2b, 0xb5, 0xc2, 0x9e, 0xbd, 0x7b, 0x81, 0xcd, 0x4a, 0x09, 0xca, 0xf6, 0xc4, 0xc3, 0x0b,
+	0xc4, 0x1b, 0x09, 0x65, 0x9e, 0x9e, 0xc2, 0x5b, 0xd1, 0x4a, 0x6d, 0x9c, 0x60, 0xf7, 0x28, 0xdc,
+	0x59, 0x80, 0x5d, 0xf6, 0xc1, 0x27, 0xeb, 0xdc, 0x95, 0x84, 0xb3, 0x63, 0x78, 0xd7, 0x00, 0xda,
+	0x68, 0x3f, 0xbc, 0xed, 0xfb, 0x4b, 0x95, 0xa8, 0x60, 0x7b, 0x32, 0x9b, 0xec, 0xdf, 0x9c, 0x6f,
+	0xfd, 0xe2, 0xc1, 0xf1, 0x2d, 0xcf, 0xbc, 0x12, 0x15, 0x3c, 0xfa, 0x12, 0x84, 0xf7, 0xae, 0xfa,
+	0x9c, 0xb8, 0xf1, 0xa3, 0x9f, 0x93, 0xf0, 0xce, 0x3f, 0x83, 0xa2, 0xe7, 0xe4, 0xba, 0xd5, 0x91,
+	0xff, 0x75, 0x38, 0x3d, 0x1c, 0xad, 0x1f, 0x16, 0x4b, 0xae, 0x56, 0xef, 0xbe, 0xfc, 0xc1, 0x2f,
+	0x4f, 0xf6, 0xf1, 0xfb, 0xef, 0xcf, 0xc1, 0xe3, 0xe8, 0xb0, 0x3b, 0xc9, 0xfb, 0x4b, 0xcc, 0xb3,
+	0xac, 0x41, 0xab, 0x2b, 0x30, 0x48, 0x0f, 0x86, 0x1b, 0x6d, 0xac, 0x90, 0x1e, 0x7c, 0x98, 0xde,
+	0x3f, 0xe7, 0xdb, 0x9b, 0xf0, 0x1e, 0xd5, 0x12, 0x49, 0xa6, 0xab, 0xf9, 0xa7, 0x20, 0xdc, 0xcb,
+	0x74, 0x75, 0xed, 0xa0, 0xf3, 0x07, 0xa3, 0x0b, 0x5c, 0x76, 0xd7, 0x5a, 0x4e, 0x5e, 0x1f, 0xf5,
+	0x1e, 0x85, 0x2e, 0x85, 0x2a, 0x88, 0x36, 0x05, 0x2d, 0x40, 0xad, 0x6f, 0x49, 0x37, 0xa9, 0xe3,
+	0x7f, 0xf9, 0x89, 0x07, 0x5f, 0x83, 0xad, 0x05, 0xe7, 0xdf, 0x82, 0xd9, 0xc2, 0x19, 0xf2, 0x1c,
+	0x89, 0x83, 0x1d, 0x5a, 0xc5, 0xa4, 0x0f, 0xc6, 0x73, 0x2f, 0x49, 0x78, 0x8e, 0xc9, 0x20, 0x49,
+	0x56, 0x71, 0xe2, 0x25, 0x7f, 0x82, 0x3d, 0xf7, 0xce, 0x18, 0xcf, 0x91, 0xb1, 0x41, 0xc4, 0xd8,
+	0x2a, 0x66, 0xcc, 0xcb, 0x4e, 0x6f, 0xac, 0xfb, 0x8c, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xba,
+	0x37, 0x7a, 0x88, 0x72, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ParentalStatusViewServiceClient is the client API for ParentalStatusViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ParentalStatusViewServiceClient interface {
+	// Returns the requested parental status view in full detail.
+	GetParentalStatusView(ctx context.Context, in *GetParentalStatusViewRequest, opts ...grpc.CallOption) (*resources.ParentalStatusView, error)
+}
+
+type parentalStatusViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewParentalStatusViewServiceClient(cc grpc.ClientConnInterface) ParentalStatusViewServiceClient {
+	return &parentalStatusViewServiceClient{cc}
+}
+
+func (c *parentalStatusViewServiceClient) GetParentalStatusView(ctx context.Context, in *GetParentalStatusViewRequest, opts ...grpc.CallOption) (*resources.ParentalStatusView, error) {
+	out := new(resources.ParentalStatusView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ParentalStatusViewService/GetParentalStatusView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ParentalStatusViewServiceServer is the server API for ParentalStatusViewService service.
+type ParentalStatusViewServiceServer interface {
+	// Returns the requested parental status view in full detail.
+	GetParentalStatusView(context.Context, *GetParentalStatusViewRequest) (*resources.ParentalStatusView, error)
+}
+
+// UnimplementedParentalStatusViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedParentalStatusViewServiceServer struct {
+}
+
+func (*UnimplementedParentalStatusViewServiceServer) GetParentalStatusView(ctx context.Context, req *GetParentalStatusViewRequest) (*resources.ParentalStatusView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetParentalStatusView not implemented")
+}
+
+func RegisterParentalStatusViewServiceServer(s *grpc.Server, srv ParentalStatusViewServiceServer) {
+	s.RegisterService(&_ParentalStatusViewService_serviceDesc, srv)
+}
+
+func _ParentalStatusViewService_GetParentalStatusView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetParentalStatusViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ParentalStatusViewServiceServer).GetParentalStatusView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ParentalStatusViewService/GetParentalStatusView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ParentalStatusViewServiceServer).GetParentalStatusView(ctx, req.(*GetParentalStatusViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ParentalStatusViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ParentalStatusViewService",
+	HandlerType: (*ParentalStatusViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetParentalStatusView",
+			Handler:    _ParentalStatusViewService_GetParentalStatusView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/parental_status_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/payments_account_service.pb.go b/googleapis/ads/googleads/v3/services/payments_account_service.pb.go
new file mode 100644
index 0000000..a363f79
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/payments_account_service.pb.go
@@ -0,0 +1,237 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/payments_account_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for fetching all accessible payments accounts.
+type ListPaymentsAccountsRequest struct {
+	// Required. The ID of the customer to apply the PaymentsAccount list operation to.
+	CustomerId           string   `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListPaymentsAccountsRequest) Reset()         { *m = ListPaymentsAccountsRequest{} }
+func (m *ListPaymentsAccountsRequest) String() string { return proto.CompactTextString(m) }
+func (*ListPaymentsAccountsRequest) ProtoMessage()    {}
+func (*ListPaymentsAccountsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5c270c0495c602d6, []int{0}
+}
+
+func (m *ListPaymentsAccountsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListPaymentsAccountsRequest.Unmarshal(m, b)
+}
+func (m *ListPaymentsAccountsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListPaymentsAccountsRequest.Marshal(b, m, deterministic)
+}
+func (m *ListPaymentsAccountsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListPaymentsAccountsRequest.Merge(m, src)
+}
+func (m *ListPaymentsAccountsRequest) XXX_Size() int {
+	return xxx_messageInfo_ListPaymentsAccountsRequest.Size(m)
+}
+func (m *ListPaymentsAccountsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListPaymentsAccountsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListPaymentsAccountsRequest proto.InternalMessageInfo
+
+func (m *ListPaymentsAccountsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+// Response message for [PaymentsAccountService.ListPaymentsAccounts][google.ads.googleads.v3.services.PaymentsAccountService.ListPaymentsAccounts].
+type ListPaymentsAccountsResponse struct {
+	// The list of accessible payments accounts.
+	PaymentsAccounts     []*resources.PaymentsAccount `protobuf:"bytes,1,rep,name=payments_accounts,json=paymentsAccounts,proto3" json:"payments_accounts,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *ListPaymentsAccountsResponse) Reset()         { *m = ListPaymentsAccountsResponse{} }
+func (m *ListPaymentsAccountsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListPaymentsAccountsResponse) ProtoMessage()    {}
+func (*ListPaymentsAccountsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5c270c0495c602d6, []int{1}
+}
+
+func (m *ListPaymentsAccountsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListPaymentsAccountsResponse.Unmarshal(m, b)
+}
+func (m *ListPaymentsAccountsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListPaymentsAccountsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListPaymentsAccountsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListPaymentsAccountsResponse.Merge(m, src)
+}
+func (m *ListPaymentsAccountsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListPaymentsAccountsResponse.Size(m)
+}
+func (m *ListPaymentsAccountsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListPaymentsAccountsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListPaymentsAccountsResponse proto.InternalMessageInfo
+
+func (m *ListPaymentsAccountsResponse) GetPaymentsAccounts() []*resources.PaymentsAccount {
+	if m != nil {
+		return m.PaymentsAccounts
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ListPaymentsAccountsRequest)(nil), "google.ads.googleads.v3.services.ListPaymentsAccountsRequest")
+	proto.RegisterType((*ListPaymentsAccountsResponse)(nil), "google.ads.googleads.v3.services.ListPaymentsAccountsResponse")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/payments_account_service.proto", fileDescriptor_5c270c0495c602d6)
+}
+
+var fileDescriptor_5c270c0495c602d6 = []byte{
+	// 444 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x53, 0x41, 0x8b, 0xd3, 0x40,
+	0x14, 0x26, 0x29, 0x08, 0xce, 0x5e, 0x34, 0x88, 0x96, 0x76, 0xc1, 0x52, 0x7a, 0x58, 0x3c, 0xcc,
+	0x48, 0x73, 0x91, 0x91, 0x55, 0xa6, 0x0a, 0xab, 0xe0, 0xa1, 0x54, 0xe8, 0x41, 0x0a, 0x61, 0x36,
+	0x33, 0xc6, 0x81, 0x76, 0x26, 0xe6, 0x4d, 0x0b, 0x22, 0x22, 0xec, 0x5f, 0xd8, 0x7f, 0xe0, 0xd1,
+	0x9f, 0xb2, 0x57, 0x6f, 0x7a, 0xf1, 0xe0, 0xc9, 0x5f, 0x21, 0xd9, 0xc9, 0x64, 0x43, 0x48, 0x5d,
+	0xd8, 0xdb, 0xc7, 0x7b, 0xdf, 0xfb, 0xbe, 0x37, 0x5f, 0x5e, 0xd0, 0xf3, 0xcc, 0x98, 0x6c, 0x2d,
+	0x09, 0x17, 0x40, 0x1c, 0x2c, 0xd1, 0x2e, 0x26, 0x20, 0x8b, 0x9d, 0x4a, 0x25, 0x90, 0x9c, 0x7f,
+	0xda, 0x48, 0x6d, 0x21, 0xe1, 0x69, 0x6a, 0xb6, 0xda, 0x26, 0x55, 0x07, 0xe7, 0x85, 0xb1, 0x26,
+	0x1a, 0xb9, 0x29, 0xcc, 0x05, 0xe0, 0x5a, 0x00, 0xef, 0x62, 0xec, 0x05, 0x06, 0x4f, 0xf6, 0x59,
+	0x14, 0x12, 0xcc, 0xb6, 0xe8, 0xf2, 0x70, 0xda, 0x83, 0x43, 0x3f, 0x99, 0x2b, 0xc2, 0xb5, 0x36,
+	0x96, 0x5b, 0x65, 0x34, 0x54, 0xdd, 0x07, 0x8d, 0x6e, 0xba, 0x56, 0xb2, 0x1e, 0x7b, 0xd8, 0x68,
+	0xbc, 0x57, 0x72, 0x2d, 0x92, 0x53, 0xf9, 0x81, 0xef, 0x94, 0x29, 0x1c, 0x61, 0xfc, 0x02, 0x0d,
+	0xdf, 0x28, 0xb0, 0xf3, 0xca, 0x95, 0x39, 0x53, 0x58, 0xc8, 0x8f, 0x5b, 0x09, 0x36, 0x9a, 0xa0,
+	0x83, 0x74, 0x0b, 0xd6, 0x6c, 0x64, 0x91, 0x28, 0xd1, 0x0f, 0x46, 0xc1, 0xd1, 0xed, 0x59, 0xef,
+	0x37, 0x0b, 0x17, 0xc8, 0xd7, 0x5f, 0x8b, 0xf1, 0x57, 0x74, 0xd8, 0x2d, 0x02, 0xb9, 0xd1, 0x20,
+	0xa3, 0x04, 0xdd, 0x6d, 0x3f, 0x0b, 0xfa, 0xc1, 0xa8, 0x77, 0x74, 0x30, 0x9d, 0xe2, 0x7d, 0xa1,
+	0xd5, 0x91, 0xe0, 0x96, 0xee, 0xe2, 0x4e, 0xde, 0x32, 0x9a, 0x9e, 0x87, 0xe8, 0x7e, 0x8b, 0xf5,
+	0xd6, 0x65, 0x1e, 0xfd, 0x0a, 0xd0, 0xbd, 0xae, 0xe5, 0xa2, 0x63, 0x7c, 0xdd, 0xe7, 0xc2, 0xff,
+	0x49, 0x66, 0xf0, 0xec, 0xa6, 0xe3, 0x2e, 0x93, 0xf1, 0xcb, 0x9f, 0xac, 0x19, 0xed, 0xd9, 0x8f,
+	0x3f, 0xe7, 0xe1, 0xe3, 0x08, 0x97, 0xc7, 0xe0, 0xcb, 0x40, 0x3e, 0x37, 0x18, 0xc7, 0x8f, 0xbe,
+	0x90, 0xf6, 0xc3, 0x07, 0xc3, 0x0b, 0xd6, 0xbf, 0x32, 0xaf, 0x50, 0xae, 0x00, 0xa7, 0x66, 0x33,
+	0x3b, 0x0b, 0xd1, 0x24, 0x35, 0x9b, 0x6b, 0x17, 0x9d, 0x0d, 0xbb, 0xb3, 0x9b, 0x97, 0x17, 0x32,
+	0x0f, 0xde, 0xbd, 0xaa, 0x04, 0x32, 0xb3, 0xe6, 0x3a, 0xc3, 0xa6, 0xc8, 0x48, 0x26, 0xf5, 0xe5,
+	0xfd, 0x90, 0x2b, 0xcb, 0xfd, 0xff, 0xcd, 0x53, 0x0f, 0xbe, 0x85, 0xbd, 0x13, 0xc6, 0xbe, 0x87,
+	0xa3, 0x13, 0x27, 0xc8, 0x04, 0x60, 0x07, 0x4b, 0xb4, 0x8c, 0x71, 0x65, 0x0c, 0x17, 0x9e, 0xb2,
+	0x62, 0x02, 0x56, 0x35, 0x65, 0xb5, 0x8c, 0x57, 0x9e, 0xf2, 0x37, 0x9c, 0xb8, 0x3a, 0xa5, 0x4c,
+	0x00, 0xa5, 0x35, 0x89, 0xd2, 0x65, 0x4c, 0xa9, 0xa7, 0x9d, 0xde, 0xba, 0xdc, 0x33, 0xfe, 0x17,
+	0x00, 0x00, 0xff, 0xff, 0x20, 0xf3, 0xe8, 0x7e, 0xde, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// PaymentsAccountServiceClient is the client API for PaymentsAccountService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type PaymentsAccountServiceClient interface {
+	// Returns all payments accounts associated with all managers
+	// between the login customer ID and specified serving customer in the
+	// hierarchy, inclusive.
+	ListPaymentsAccounts(ctx context.Context, in *ListPaymentsAccountsRequest, opts ...grpc.CallOption) (*ListPaymentsAccountsResponse, error)
+}
+
+type paymentsAccountServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewPaymentsAccountServiceClient(cc grpc.ClientConnInterface) PaymentsAccountServiceClient {
+	return &paymentsAccountServiceClient{cc}
+}
+
+func (c *paymentsAccountServiceClient) ListPaymentsAccounts(ctx context.Context, in *ListPaymentsAccountsRequest, opts ...grpc.CallOption) (*ListPaymentsAccountsResponse, error) {
+	out := new(ListPaymentsAccountsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.PaymentsAccountService/ListPaymentsAccounts", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// PaymentsAccountServiceServer is the server API for PaymentsAccountService service.
+type PaymentsAccountServiceServer interface {
+	// Returns all payments accounts associated with all managers
+	// between the login customer ID and specified serving customer in the
+	// hierarchy, inclusive.
+	ListPaymentsAccounts(context.Context, *ListPaymentsAccountsRequest) (*ListPaymentsAccountsResponse, error)
+}
+
+// UnimplementedPaymentsAccountServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedPaymentsAccountServiceServer struct {
+}
+
+func (*UnimplementedPaymentsAccountServiceServer) ListPaymentsAccounts(ctx context.Context, req *ListPaymentsAccountsRequest) (*ListPaymentsAccountsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListPaymentsAccounts not implemented")
+}
+
+func RegisterPaymentsAccountServiceServer(s *grpc.Server, srv PaymentsAccountServiceServer) {
+	s.RegisterService(&_PaymentsAccountService_serviceDesc, srv)
+}
+
+func _PaymentsAccountService_ListPaymentsAccounts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListPaymentsAccountsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PaymentsAccountServiceServer).ListPaymentsAccounts(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.PaymentsAccountService/ListPaymentsAccounts",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PaymentsAccountServiceServer).ListPaymentsAccounts(ctx, req.(*ListPaymentsAccountsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _PaymentsAccountService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.PaymentsAccountService",
+	HandlerType: (*PaymentsAccountServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListPaymentsAccounts",
+			Handler:    _PaymentsAccountService_ListPaymentsAccounts_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/payments_account_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/product_bidding_category_constant_service.pb.go b/googleapis/ads/googleads/v3/services/product_bidding_category_constant_service.pb.go
new file mode 100644
index 0000000..f5f593f
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/product_bidding_category_constant_service.pb.go
@@ -0,0 +1,193 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/product_bidding_category_constant_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [ProductBiddingCategoryService.GetProductBiddingCategory][].
+type GetProductBiddingCategoryConstantRequest struct {
+	// Required. Resource name of the Product Bidding Category to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetProductBiddingCategoryConstantRequest) Reset() {
+	*m = GetProductBiddingCategoryConstantRequest{}
+}
+func (m *GetProductBiddingCategoryConstantRequest) String() string { return proto.CompactTextString(m) }
+func (*GetProductBiddingCategoryConstantRequest) ProtoMessage()    {}
+func (*GetProductBiddingCategoryConstantRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8f0f8e22f494321d, []int{0}
+}
+
+func (m *GetProductBiddingCategoryConstantRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetProductBiddingCategoryConstantRequest.Unmarshal(m, b)
+}
+func (m *GetProductBiddingCategoryConstantRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetProductBiddingCategoryConstantRequest.Marshal(b, m, deterministic)
+}
+func (m *GetProductBiddingCategoryConstantRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetProductBiddingCategoryConstantRequest.Merge(m, src)
+}
+func (m *GetProductBiddingCategoryConstantRequest) XXX_Size() int {
+	return xxx_messageInfo_GetProductBiddingCategoryConstantRequest.Size(m)
+}
+func (m *GetProductBiddingCategoryConstantRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetProductBiddingCategoryConstantRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetProductBiddingCategoryConstantRequest proto.InternalMessageInfo
+
+func (m *GetProductBiddingCategoryConstantRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetProductBiddingCategoryConstantRequest)(nil), "google.ads.googleads.v3.services.GetProductBiddingCategoryConstantRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/product_bidding_category_constant_service.proto", fileDescriptor_8f0f8e22f494321d)
+}
+
+var fileDescriptor_8f0f8e22f494321d = []byte{
+	// 426 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x4f, 0x8b, 0xd4, 0x30,
+	0x18, 0xc6, 0x99, 0x2c, 0x08, 0x16, 0xbd, 0xf4, 0xe2, 0x52, 0x05, 0xc7, 0x65, 0x85, 0x61, 0x0f,
+	0x09, 0x58, 0x44, 0x88, 0x78, 0x48, 0xf7, 0x30, 0x2a, 0x28, 0x65, 0x95, 0x39, 0x48, 0xa1, 0x64,
+	0x9a, 0x18, 0x03, 0x6d, 0x52, 0x93, 0x4c, 0x41, 0xc4, 0x83, 0x7e, 0x03, 0xf1, 0x1b, 0x78, 0xf4,
+	0x93, 0xc8, 0x5e, 0xbd, 0x79, 0xf2, 0xe0, 0xc9, 0x4f, 0x21, 0xdd, 0x34, 0xdd, 0x9d, 0xc3, 0xfc,
+	0xb9, 0x3d, 0xcc, 0xfb, 0xcc, 0xef, 0x7d, 0xfa, 0xbc, 0x6d, 0x94, 0x0b, 0xad, 0x45, 0xcd, 0x11,
+	0x65, 0x16, 0x79, 0xd9, 0xab, 0x2e, 0x45, 0x96, 0x9b, 0x4e, 0x56, 0xdc, 0xa2, 0xd6, 0x68, 0xb6,
+	0xaa, 0x5c, 0xb9, 0x94, 0x8c, 0x49, 0x25, 0xca, 0x8a, 0x3a, 0x2e, 0xb4, 0xf9, 0x50, 0x56, 0x5a,
+	0x59, 0x47, 0x95, 0x2b, 0x07, 0x2b, 0x6c, 0x8d, 0x76, 0x3a, 0x9e, 0x7a, 0x0c, 0xa4, 0xcc, 0xc2,
+	0x91, 0x08, 0xbb, 0x14, 0x06, 0x62, 0xf2, 0x6c, 0xd3, 0x4e, 0xc3, 0xad, 0x5e, 0x99, 0xbd, 0x96,
+	0xfa, 0x65, 0xc9, 0x9d, 0x80, 0x6a, 0x25, 0xa2, 0x4a, 0x69, 0x47, 0x9d, 0xd4, 0xca, 0x0e, 0xd3,
+	0x5b, 0x57, 0xa6, 0x55, 0x2d, 0xf9, 0xf8, 0xb7, 0xbb, 0x57, 0x06, 0x6f, 0x25, 0xaf, 0x59, 0xb9,
+	0xe4, 0xef, 0x68, 0x27, 0xb5, 0xf1, 0x86, 0xa3, 0xd7, 0xd1, 0x6c, 0xce, 0x5d, 0xee, 0x53, 0x64,
+	0x3e, 0xc4, 0xe9, 0x90, 0xe1, 0x74, 0x88, 0x70, 0xc6, 0xdf, 0xaf, 0xb8, 0x75, 0xf1, 0x2c, 0xba,
+	0x19, 0x82, 0x97, 0x8a, 0x36, 0xfc, 0x70, 0x32, 0x9d, 0xcc, 0xae, 0x67, 0x07, 0x7f, 0x08, 0x38,
+	0xbb, 0x11, 0x26, 0x2f, 0x69, 0xc3, 0x1f, 0xfc, 0x04, 0xd1, 0xfd, 0xed, 0xcc, 0x57, 0xbe, 0xa3,
+	0xf8, 0x33, 0x88, 0xee, 0xed, 0x0c, 0x10, 0x3f, 0x87, 0xbb, 0xba, 0x86, 0xfb, 0x3e, 0x45, 0x42,
+	0x36, 0xb2, 0xc6, 0xab, 0xc0, 0xed, 0xa4, 0xa3, 0x17, 0xbf, 0xc9, 0x7a, 0x13, 0x5f, 0x7e, 0xfd,
+	0xfd, 0x06, 0x1e, 0xc5, 0x0f, 0xfb, 0xdb, 0x7e, 0x5c, 0x9b, 0x3c, 0x69, 0xb7, 0xa2, 0x2c, 0x3a,
+	0xf9, 0x94, 0xdc, 0x3e, 0x27, 0x87, 0x97, 0x41, 0x06, 0xd5, 0x4a, 0x0b, 0x2b, 0xdd, 0x64, 0x5f,
+	0x41, 0x74, 0x5c, 0xe9, 0x66, 0x67, 0x01, 0xd9, 0xc9, 0x5e, 0x85, 0xe7, 0xfd, 0xd5, 0xf3, 0xc9,
+	0x9b, 0xa7, 0x03, 0x4f, 0xe8, 0x9a, 0x2a, 0x01, 0xb5, 0x11, 0x48, 0x70, 0x75, 0xf1, 0x4e, 0xa0,
+	0xcb, 0x04, 0x9b, 0xbf, 0x96, 0xc7, 0x41, 0x7c, 0x07, 0x07, 0x73, 0x42, 0x7e, 0x80, 0xe9, 0xdc,
+	0x03, 0x09, 0xb3, 0xd0, 0xcb, 0x5e, 0x2d, 0x52, 0x38, 0x2c, 0xb6, 0xe7, 0xc1, 0x52, 0x10, 0x66,
+	0x8b, 0xd1, 0x52, 0x2c, 0xd2, 0x22, 0x58, 0xfe, 0x81, 0x63, 0xff, 0x3b, 0xc6, 0x84, 0x59, 0x8c,
+	0x47, 0x13, 0xc6, 0x8b, 0x14, 0xe3, 0x60, 0x5b, 0x5e, 0xbb, 0xc8, 0x99, 0xfe, 0x0f, 0x00, 0x00,
+	0xff, 0xff, 0x56, 0x1a, 0x52, 0x8c, 0xd4, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ProductBiddingCategoryConstantServiceClient is the client API for ProductBiddingCategoryConstantService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ProductBiddingCategoryConstantServiceClient interface {
+	// Returns the requested Product Bidding Category in full detail.
+	GetProductBiddingCategoryConstant(ctx context.Context, in *GetProductBiddingCategoryConstantRequest, opts ...grpc.CallOption) (*resources.ProductBiddingCategoryConstant, error)
+}
+
+type productBiddingCategoryConstantServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewProductBiddingCategoryConstantServiceClient(cc grpc.ClientConnInterface) ProductBiddingCategoryConstantServiceClient {
+	return &productBiddingCategoryConstantServiceClient{cc}
+}
+
+func (c *productBiddingCategoryConstantServiceClient) GetProductBiddingCategoryConstant(ctx context.Context, in *GetProductBiddingCategoryConstantRequest, opts ...grpc.CallOption) (*resources.ProductBiddingCategoryConstant, error) {
+	out := new(resources.ProductBiddingCategoryConstant)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ProductBiddingCategoryConstantService/GetProductBiddingCategoryConstant", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ProductBiddingCategoryConstantServiceServer is the server API for ProductBiddingCategoryConstantService service.
+type ProductBiddingCategoryConstantServiceServer interface {
+	// Returns the requested Product Bidding Category in full detail.
+	GetProductBiddingCategoryConstant(context.Context, *GetProductBiddingCategoryConstantRequest) (*resources.ProductBiddingCategoryConstant, error)
+}
+
+// UnimplementedProductBiddingCategoryConstantServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedProductBiddingCategoryConstantServiceServer struct {
+}
+
+func (*UnimplementedProductBiddingCategoryConstantServiceServer) GetProductBiddingCategoryConstant(ctx context.Context, req *GetProductBiddingCategoryConstantRequest) (*resources.ProductBiddingCategoryConstant, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetProductBiddingCategoryConstant not implemented")
+}
+
+func RegisterProductBiddingCategoryConstantServiceServer(s *grpc.Server, srv ProductBiddingCategoryConstantServiceServer) {
+	s.RegisterService(&_ProductBiddingCategoryConstantService_serviceDesc, srv)
+}
+
+func _ProductBiddingCategoryConstantService_GetProductBiddingCategoryConstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetProductBiddingCategoryConstantRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProductBiddingCategoryConstantServiceServer).GetProductBiddingCategoryConstant(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ProductBiddingCategoryConstantService/GetProductBiddingCategoryConstant",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProductBiddingCategoryConstantServiceServer).GetProductBiddingCategoryConstant(ctx, req.(*GetProductBiddingCategoryConstantRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ProductBiddingCategoryConstantService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ProductBiddingCategoryConstantService",
+	HandlerType: (*ProductBiddingCategoryConstantServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetProductBiddingCategoryConstant",
+			Handler:    _ProductBiddingCategoryConstantService_GetProductBiddingCategoryConstant_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/product_bidding_category_constant_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/product_group_view_service.pb.go b/googleapis/ads/googleads/v3/services/product_group_view_service.pb.go
new file mode 100644
index 0000000..c52625c
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/product_group_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/product_group_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [ProductGroupViewService.GetProductGroupView][google.ads.googleads.v3.services.ProductGroupViewService.GetProductGroupView].
+type GetProductGroupViewRequest struct {
+	// Required. The resource name of the product group view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetProductGroupViewRequest) Reset()         { *m = GetProductGroupViewRequest{} }
+func (m *GetProductGroupViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetProductGroupViewRequest) ProtoMessage()    {}
+func (*GetProductGroupViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a629789fd6fc67c7, []int{0}
+}
+
+func (m *GetProductGroupViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetProductGroupViewRequest.Unmarshal(m, b)
+}
+func (m *GetProductGroupViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetProductGroupViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetProductGroupViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetProductGroupViewRequest.Merge(m, src)
+}
+func (m *GetProductGroupViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetProductGroupViewRequest.Size(m)
+}
+func (m *GetProductGroupViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetProductGroupViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetProductGroupViewRequest proto.InternalMessageInfo
+
+func (m *GetProductGroupViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetProductGroupViewRequest)(nil), "google.ads.googleads.v3.services.GetProductGroupViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/product_group_view_service.proto", fileDescriptor_a629789fd6fc67c7)
+}
+
+var fileDescriptor_a629789fd6fc67c7 = []byte{
+	// 417 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0x8b, 0xd4, 0x40,
+	0x1c, 0x25, 0x39, 0x10, 0x0c, 0xda, 0xc4, 0xe2, 0x8e, 0x78, 0xe0, 0x72, 0x5c, 0x71, 0x5c, 0x31,
+	0x03, 0x0e, 0x36, 0xa3, 0x16, 0xb3, 0x85, 0x11, 0x04, 0x59, 0x4e, 0x48, 0x21, 0x81, 0x30, 0x97,
+	0xfc, 0x8c, 0x03, 0x49, 0x26, 0xce, 0x4c, 0x72, 0x85, 0xd8, 0x68, 0x6f, 0xe3, 0x37, 0xb0, 0xf4,
+	0xa3, 0x5c, 0x2b, 0x36, 0x56, 0x16, 0x56, 0x7e, 0x0a, 0xc9, 0x4d, 0x26, 0xb7, 0xbb, 0x6c, 0xd8,
+	0xee, 0x31, 0xef, 0xfd, 0xde, 0xfb, 0xfd, 0x99, 0x80, 0x95, 0x52, 0x96, 0x15, 0x60, 0x5e, 0x68,
+	0x6c, 0xe1, 0x80, 0x7a, 0x82, 0x35, 0xa8, 0x5e, 0xe4, 0xa0, 0x71, 0xab, 0x64, 0xd1, 0xe5, 0x26,
+	0x2b, 0x95, 0xec, 0xda, 0xac, 0x17, 0x70, 0x95, 0x8d, 0x1c, 0x6a, 0x95, 0x34, 0x32, 0x5c, 0xd8,
+	0x3a, 0xc4, 0x0b, 0x8d, 0x26, 0x0b, 0xd4, 0x13, 0xe4, 0x2c, 0x22, 0x3a, 0x17, 0xa2, 0x40, 0xcb,
+	0x4e, 0xed, 0x4e, 0xb1, 0xee, 0xd1, 0xb1, 0xab, 0x6d, 0x05, 0xe6, 0x4d, 0x23, 0x0d, 0x37, 0x42,
+	0x36, 0x7a, 0x64, 0x0f, 0xd7, 0xd8, 0xbc, 0x12, 0xd0, 0x98, 0x91, 0x78, 0xb4, 0x46, 0xbc, 0x13,
+	0x50, 0x15, 0xd9, 0x25, 0xbc, 0xe7, 0xbd, 0x90, 0xca, 0x0a, 0x4e, 0x5e, 0x04, 0x51, 0x0c, 0x66,
+	0x65, 0x63, 0xe3, 0x21, 0x35, 0x11, 0x70, 0x75, 0x01, 0x1f, 0x3a, 0xd0, 0x26, 0x3c, 0x0b, 0xee,
+	0xbb, 0xde, 0xb2, 0x86, 0xd7, 0x70, 0xe4, 0x2d, 0xbc, 0xb3, 0xbb, 0xcb, 0x83, 0x3f, 0xcc, 0xbf,
+	0xb8, 0xe7, 0x98, 0xd7, 0xbc, 0x86, 0xc7, 0x5f, 0xfd, 0xe0, 0x70, 0xdb, 0xe5, 0x8d, 0x1d, 0x3c,
+	0xfc, 0xe5, 0x05, 0x0f, 0x76, 0x84, 0x84, 0xcf, 0xd0, 0xbe, 0x95, 0xa1, 0xf9, 0xde, 0x22, 0x32,
+	0x5b, 0x3d, 0xad, 0x13, 0x6d, 0xd7, 0x9e, 0xbc, 0xfa, 0xcd, 0x36, 0x27, 0xfa, 0xfc, 0xf3, 0xef,
+	0x37, 0xff, 0x49, 0x48, 0x86, 0x33, 0x7c, 0xdc, 0x60, 0x9e, 0xe7, 0x9d, 0x36, 0xb2, 0x06, 0xa5,
+	0xf1, 0xb9, 0xbb, 0xcb, 0x64, 0xa4, 0xf1, 0xf9, 0xa7, 0xe8, 0xe1, 0x35, 0x3b, 0xba, 0x0d, 0x1e,
+	0x51, 0x2b, 0x34, 0xca, 0x65, 0xbd, 0xfc, 0xe2, 0x07, 0xa7, 0xb9, 0xac, 0xf7, 0x8e, 0xb8, 0x3c,
+	0x9e, 0x59, 0xdb, 0x6a, 0xb8, 0xcf, 0xca, 0x7b, 0xfb, 0x72, 0x74, 0x28, 0x65, 0xc5, 0x9b, 0x12,
+	0x49, 0x55, 0xe2, 0x12, 0x9a, 0x9b, 0xeb, 0xe1, 0xdb, 0xcc, 0xf9, 0x9f, 0xfb, 0xd4, 0x81, 0xef,
+	0xfe, 0x41, 0xcc, 0xd8, 0x0f, 0x7f, 0x11, 0x5b, 0x43, 0x56, 0x68, 0x64, 0xe1, 0x80, 0x12, 0x82,
+	0xc6, 0x60, 0x7d, 0xed, 0x24, 0x29, 0x2b, 0x74, 0x3a, 0x49, 0xd2, 0x84, 0xa4, 0x4e, 0xf2, 0xcf,
+	0x3f, 0xb5, 0xef, 0x94, 0xb2, 0x42, 0x53, 0x3a, 0x89, 0x28, 0x4d, 0x08, 0xa5, 0x4e, 0x76, 0x79,
+	0xe7, 0xa6, 0x4f, 0xf2, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xf2, 0x26, 0x5d, 0xa0, 0x60, 0x03, 0x00,
+	0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ProductGroupViewServiceClient is the client API for ProductGroupViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ProductGroupViewServiceClient interface {
+	// Returns the requested product group view in full detail.
+	GetProductGroupView(ctx context.Context, in *GetProductGroupViewRequest, opts ...grpc.CallOption) (*resources.ProductGroupView, error)
+}
+
+type productGroupViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewProductGroupViewServiceClient(cc grpc.ClientConnInterface) ProductGroupViewServiceClient {
+	return &productGroupViewServiceClient{cc}
+}
+
+func (c *productGroupViewServiceClient) GetProductGroupView(ctx context.Context, in *GetProductGroupViewRequest, opts ...grpc.CallOption) (*resources.ProductGroupView, error) {
+	out := new(resources.ProductGroupView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ProductGroupViewService/GetProductGroupView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ProductGroupViewServiceServer is the server API for ProductGroupViewService service.
+type ProductGroupViewServiceServer interface {
+	// Returns the requested product group view in full detail.
+	GetProductGroupView(context.Context, *GetProductGroupViewRequest) (*resources.ProductGroupView, error)
+}
+
+// UnimplementedProductGroupViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedProductGroupViewServiceServer struct {
+}
+
+func (*UnimplementedProductGroupViewServiceServer) GetProductGroupView(ctx context.Context, req *GetProductGroupViewRequest) (*resources.ProductGroupView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetProductGroupView not implemented")
+}
+
+func RegisterProductGroupViewServiceServer(s *grpc.Server, srv ProductGroupViewServiceServer) {
+	s.RegisterService(&_ProductGroupViewService_serviceDesc, srv)
+}
+
+func _ProductGroupViewService_GetProductGroupView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetProductGroupViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProductGroupViewServiceServer).GetProductGroupView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ProductGroupViewService/GetProductGroupView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProductGroupViewServiceServer).GetProductGroupView(ctx, req.(*GetProductGroupViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ProductGroupViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ProductGroupViewService",
+	HandlerType: (*ProductGroupViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetProductGroupView",
+			Handler:    _ProductGroupViewService_GetProductGroupView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/product_group_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/reach_plan_service.pb.go b/googleapis/ads/googleads/v3/services/reach_plan_service.pb.go
new file mode 100644
index 0000000..7fcdb27
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/reach_plan_service.pb.go
@@ -0,0 +1,1544 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/reach_plan_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [ReachForecastService.ListPlannableLocations][]
+type ListPlannableLocationsRequest struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListPlannableLocationsRequest) Reset()         { *m = ListPlannableLocationsRequest{} }
+func (m *ListPlannableLocationsRequest) String() string { return proto.CompactTextString(m) }
+func (*ListPlannableLocationsRequest) ProtoMessage()    {}
+func (*ListPlannableLocationsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{0}
+}
+
+func (m *ListPlannableLocationsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListPlannableLocationsRequest.Unmarshal(m, b)
+}
+func (m *ListPlannableLocationsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListPlannableLocationsRequest.Marshal(b, m, deterministic)
+}
+func (m *ListPlannableLocationsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListPlannableLocationsRequest.Merge(m, src)
+}
+func (m *ListPlannableLocationsRequest) XXX_Size() int {
+	return xxx_messageInfo_ListPlannableLocationsRequest.Size(m)
+}
+func (m *ListPlannableLocationsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListPlannableLocationsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListPlannableLocationsRequest proto.InternalMessageInfo
+
+// The list of plannable locations.
+type ListPlannableLocationsResponse struct {
+	// The list of locations available for planning (Countries, DMAs,
+	// sub-countries).
+	// For locations like Countries, DMAs see
+	// https://developers.google.com/adwords/api/docs/appendix/geotargeting for
+	// more information.
+	PlannableLocations   []*PlannableLocation `protobuf:"bytes,1,rep,name=plannable_locations,json=plannableLocations,proto3" json:"plannable_locations,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *ListPlannableLocationsResponse) Reset()         { *m = ListPlannableLocationsResponse{} }
+func (m *ListPlannableLocationsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListPlannableLocationsResponse) ProtoMessage()    {}
+func (*ListPlannableLocationsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{1}
+}
+
+func (m *ListPlannableLocationsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListPlannableLocationsResponse.Unmarshal(m, b)
+}
+func (m *ListPlannableLocationsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListPlannableLocationsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListPlannableLocationsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListPlannableLocationsResponse.Merge(m, src)
+}
+func (m *ListPlannableLocationsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListPlannableLocationsResponse.Size(m)
+}
+func (m *ListPlannableLocationsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListPlannableLocationsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListPlannableLocationsResponse proto.InternalMessageInfo
+
+func (m *ListPlannableLocationsResponse) GetPlannableLocations() []*PlannableLocation {
+	if m != nil {
+		return m.PlannableLocations
+	}
+	return nil
+}
+
+// A plannable location: a country, a DMA, a metro region, a tv region,
+// a province.
+type PlannableLocation struct {
+	// The location identifier.
+	Id *wrappers.StringValue `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	// The unique location name in english.
+	Name *wrappers.StringValue `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	// The parent country code, not present if location is a country.
+	// If present will always be a criterion id: additional information, such as
+	// country name are returned both via ListPlannableLocations or directly by
+	// accessing GeoTargetConstantService with the criterion id.
+	ParentCountryId      *wrappers.Int64Value `protobuf:"bytes,3,opt,name=parent_country_id,json=parentCountryId,proto3" json:"parent_country_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *PlannableLocation) Reset()         { *m = PlannableLocation{} }
+func (m *PlannableLocation) String() string { return proto.CompactTextString(m) }
+func (*PlannableLocation) ProtoMessage()    {}
+func (*PlannableLocation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{2}
+}
+
+func (m *PlannableLocation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PlannableLocation.Unmarshal(m, b)
+}
+func (m *PlannableLocation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PlannableLocation.Marshal(b, m, deterministic)
+}
+func (m *PlannableLocation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PlannableLocation.Merge(m, src)
+}
+func (m *PlannableLocation) XXX_Size() int {
+	return xxx_messageInfo_PlannableLocation.Size(m)
+}
+func (m *PlannableLocation) XXX_DiscardUnknown() {
+	xxx_messageInfo_PlannableLocation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PlannableLocation proto.InternalMessageInfo
+
+func (m *PlannableLocation) GetId() *wrappers.StringValue {
+	if m != nil {
+		return m.Id
+	}
+	return nil
+}
+
+func (m *PlannableLocation) GetName() *wrappers.StringValue {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *PlannableLocation) GetParentCountryId() *wrappers.Int64Value {
+	if m != nil {
+		return m.ParentCountryId
+	}
+	return nil
+}
+
+// Request to list available products in a given location.
+type ListPlannableProductsRequest struct {
+	// Required. The ID of the selected location for planning. To list the available
+	// plannable location ids use ListPlannableLocations.
+	PlannableLocationId  *wrappers.StringValue `protobuf:"bytes,1,opt,name=plannable_location_id,json=plannableLocationId,proto3" json:"plannable_location_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ListPlannableProductsRequest) Reset()         { *m = ListPlannableProductsRequest{} }
+func (m *ListPlannableProductsRequest) String() string { return proto.CompactTextString(m) }
+func (*ListPlannableProductsRequest) ProtoMessage()    {}
+func (*ListPlannableProductsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{3}
+}
+
+func (m *ListPlannableProductsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListPlannableProductsRequest.Unmarshal(m, b)
+}
+func (m *ListPlannableProductsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListPlannableProductsRequest.Marshal(b, m, deterministic)
+}
+func (m *ListPlannableProductsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListPlannableProductsRequest.Merge(m, src)
+}
+func (m *ListPlannableProductsRequest) XXX_Size() int {
+	return xxx_messageInfo_ListPlannableProductsRequest.Size(m)
+}
+func (m *ListPlannableProductsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListPlannableProductsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListPlannableProductsRequest proto.InternalMessageInfo
+
+func (m *ListPlannableProductsRequest) GetPlannableLocationId() *wrappers.StringValue {
+	if m != nil {
+		return m.PlannableLocationId
+	}
+	return nil
+}
+
+// A response with all available products.
+type ListPlannableProductsResponse struct {
+	// The list of products available for planning and related targeting metadata.
+	ProductMetadata      []*ProductMetadata `protobuf:"bytes,1,rep,name=product_metadata,json=productMetadata,proto3" json:"product_metadata,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
+	XXX_unrecognized     []byte             `json:"-"`
+	XXX_sizecache        int32              `json:"-"`
+}
+
+func (m *ListPlannableProductsResponse) Reset()         { *m = ListPlannableProductsResponse{} }
+func (m *ListPlannableProductsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListPlannableProductsResponse) ProtoMessage()    {}
+func (*ListPlannableProductsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{4}
+}
+
+func (m *ListPlannableProductsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListPlannableProductsResponse.Unmarshal(m, b)
+}
+func (m *ListPlannableProductsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListPlannableProductsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListPlannableProductsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListPlannableProductsResponse.Merge(m, src)
+}
+func (m *ListPlannableProductsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListPlannableProductsResponse.Size(m)
+}
+func (m *ListPlannableProductsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListPlannableProductsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListPlannableProductsResponse proto.InternalMessageInfo
+
+func (m *ListPlannableProductsResponse) GetProductMetadata() []*ProductMetadata {
+	if m != nil {
+		return m.ProductMetadata
+	}
+	return nil
+}
+
+// The metadata associated with an available plannable product.
+type ProductMetadata struct {
+	// The code associated with the ad product. E.g. Trueview, Bumper
+	// To list the available plannable product codes use ListPlannableProducts.
+	PlannableProductCode *wrappers.StringValue `protobuf:"bytes,1,opt,name=plannable_product_code,json=plannableProductCode,proto3" json:"plannable_product_code,omitempty"`
+	// The allowed plannable targeting for this product.
+	PlannableTargeting   *PlannableTargeting `protobuf:"bytes,2,opt,name=plannable_targeting,json=plannableTargeting,proto3" json:"plannable_targeting,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *ProductMetadata) Reset()         { *m = ProductMetadata{} }
+func (m *ProductMetadata) String() string { return proto.CompactTextString(m) }
+func (*ProductMetadata) ProtoMessage()    {}
+func (*ProductMetadata) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{5}
+}
+
+func (m *ProductMetadata) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductMetadata.Unmarshal(m, b)
+}
+func (m *ProductMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductMetadata.Marshal(b, m, deterministic)
+}
+func (m *ProductMetadata) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductMetadata.Merge(m, src)
+}
+func (m *ProductMetadata) XXX_Size() int {
+	return xxx_messageInfo_ProductMetadata.Size(m)
+}
+func (m *ProductMetadata) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductMetadata.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductMetadata proto.InternalMessageInfo
+
+func (m *ProductMetadata) GetPlannableProductCode() *wrappers.StringValue {
+	if m != nil {
+		return m.PlannableProductCode
+	}
+	return nil
+}
+
+func (m *ProductMetadata) GetPlannableTargeting() *PlannableTargeting {
+	if m != nil {
+		return m.PlannableTargeting
+	}
+	return nil
+}
+
+// The targeting for which traffic metrics will be reported.
+type PlannableTargeting struct {
+	// Allowed plannable age ranges for the product for which metrics will be
+	// reported. Actual targeting is computed by mapping this age range onto
+	// standard Google common.AgeRangeInfo values.
+	AgeRanges []enums.ReachPlanAgeRangeEnum_ReachPlanAgeRange `protobuf:"varint,1,rep,packed,name=age_ranges,json=ageRanges,proto3,enum=google.ads.googleads.v3.enums.ReachPlanAgeRangeEnum_ReachPlanAgeRange" json:"age_ranges,omitempty"`
+	// Targetable genders for the ad product.
+	Genders []*common.GenderInfo `protobuf:"bytes,2,rep,name=genders,proto3" json:"genders,omitempty"`
+	// Targetable devices for the ad product.
+	Devices []*common.DeviceInfo `protobuf:"bytes,3,rep,name=devices,proto3" json:"devices,omitempty"`
+	// Targetable networks for the ad product.
+	Networks             []enums.ReachPlanNetworkEnum_ReachPlanNetwork `protobuf:"varint,4,rep,packed,name=networks,proto3,enum=google.ads.googleads.v3.enums.ReachPlanNetworkEnum_ReachPlanNetwork" json:"networks,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
+	XXX_unrecognized     []byte                                        `json:"-"`
+	XXX_sizecache        int32                                         `json:"-"`
+}
+
+func (m *PlannableTargeting) Reset()         { *m = PlannableTargeting{} }
+func (m *PlannableTargeting) String() string { return proto.CompactTextString(m) }
+func (*PlannableTargeting) ProtoMessage()    {}
+func (*PlannableTargeting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{6}
+}
+
+func (m *PlannableTargeting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PlannableTargeting.Unmarshal(m, b)
+}
+func (m *PlannableTargeting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PlannableTargeting.Marshal(b, m, deterministic)
+}
+func (m *PlannableTargeting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PlannableTargeting.Merge(m, src)
+}
+func (m *PlannableTargeting) XXX_Size() int {
+	return xxx_messageInfo_PlannableTargeting.Size(m)
+}
+func (m *PlannableTargeting) XXX_DiscardUnknown() {
+	xxx_messageInfo_PlannableTargeting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PlannableTargeting proto.InternalMessageInfo
+
+func (m *PlannableTargeting) GetAgeRanges() []enums.ReachPlanAgeRangeEnum_ReachPlanAgeRange {
+	if m != nil {
+		return m.AgeRanges
+	}
+	return nil
+}
+
+func (m *PlannableTargeting) GetGenders() []*common.GenderInfo {
+	if m != nil {
+		return m.Genders
+	}
+	return nil
+}
+
+func (m *PlannableTargeting) GetDevices() []*common.DeviceInfo {
+	if m != nil {
+		return m.Devices
+	}
+	return nil
+}
+
+func (m *PlannableTargeting) GetNetworks() []enums.ReachPlanNetworkEnum_ReachPlanNetwork {
+	if m != nil {
+		return m.Networks
+	}
+	return nil
+}
+
+// Request message for [ReachForecastService.GenerateProductMixIdeas][].
+type GenerateProductMixIdeasRequest struct {
+	// Required. The ID of the customer.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The ID of the location, this is one of the ids returned by
+	// ListPlannableLocations.
+	PlannableLocationId *wrappers.StringValue `protobuf:"bytes,2,opt,name=plannable_location_id,json=plannableLocationId,proto3" json:"plannable_location_id,omitempty"`
+	// Required. Currency code.
+	// Three-character ISO 4217 currency code.
+	CurrencyCode *wrappers.StringValue `protobuf:"bytes,3,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	// Required. Total budget.
+	// Amount in micros. One million is equivalent to one unit.
+	BudgetMicros *wrappers.Int64Value `protobuf:"bytes,4,opt,name=budget_micros,json=budgetMicros,proto3" json:"budget_micros,omitempty"`
+	// The preferences of the suggested product mix.
+	// An unset preference is interpreted as all possible values are allowed,
+	// unless explicitly specified.
+	Preferences          *Preferences `protobuf:"bytes,5,opt,name=preferences,proto3" json:"preferences,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *GenerateProductMixIdeasRequest) Reset()         { *m = GenerateProductMixIdeasRequest{} }
+func (m *GenerateProductMixIdeasRequest) String() string { return proto.CompactTextString(m) }
+func (*GenerateProductMixIdeasRequest) ProtoMessage()    {}
+func (*GenerateProductMixIdeasRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{7}
+}
+
+func (m *GenerateProductMixIdeasRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateProductMixIdeasRequest.Unmarshal(m, b)
+}
+func (m *GenerateProductMixIdeasRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateProductMixIdeasRequest.Marshal(b, m, deterministic)
+}
+func (m *GenerateProductMixIdeasRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateProductMixIdeasRequest.Merge(m, src)
+}
+func (m *GenerateProductMixIdeasRequest) XXX_Size() int {
+	return xxx_messageInfo_GenerateProductMixIdeasRequest.Size(m)
+}
+func (m *GenerateProductMixIdeasRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateProductMixIdeasRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateProductMixIdeasRequest proto.InternalMessageInfo
+
+func (m *GenerateProductMixIdeasRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *GenerateProductMixIdeasRequest) GetPlannableLocationId() *wrappers.StringValue {
+	if m != nil {
+		return m.PlannableLocationId
+	}
+	return nil
+}
+
+func (m *GenerateProductMixIdeasRequest) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+func (m *GenerateProductMixIdeasRequest) GetBudgetMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.BudgetMicros
+	}
+	return nil
+}
+
+func (m *GenerateProductMixIdeasRequest) GetPreferences() *Preferences {
+	if m != nil {
+		return m.Preferences
+	}
+	return nil
+}
+
+// Set of preferences about the planned mix.
+type Preferences struct {
+	// True if ad skippable.
+	// If not set, default is any value.
+	IsSkippable *wrappers.BoolValue `protobuf:"bytes,1,opt,name=is_skippable,json=isSkippable,proto3" json:"is_skippable,omitempty"`
+	// True if ad start with sound.
+	// If not set, default is any value.
+	StartsWithSound *wrappers.BoolValue `protobuf:"bytes,2,opt,name=starts_with_sound,json=startsWithSound,proto3" json:"starts_with_sound,omitempty"`
+	// The length of the ad.
+	// If not set, default is any value.
+	AdLength enums.ReachPlanAdLengthEnum_ReachPlanAdLength `protobuf:"varint,3,opt,name=ad_length,json=adLength,proto3,enum=google.ads.googleads.v3.enums.ReachPlanAdLengthEnum_ReachPlanAdLength" json:"ad_length,omitempty"`
+	// True if ad will only show on the top content.
+	// If not set, default is false.
+	TopContentOnly *wrappers.BoolValue `protobuf:"bytes,4,opt,name=top_content_only,json=topContentOnly,proto3" json:"top_content_only,omitempty"`
+	// True if the price guaranteed. The cost of serving the ad is agreed upfront
+	// and not subject to an auction.
+	// If not set, default is any value.
+	HasGuaranteedPrice   *wrappers.BoolValue `protobuf:"bytes,5,opt,name=has_guaranteed_price,json=hasGuaranteedPrice,proto3" json:"has_guaranteed_price,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *Preferences) Reset()         { *m = Preferences{} }
+func (m *Preferences) String() string { return proto.CompactTextString(m) }
+func (*Preferences) ProtoMessage()    {}
+func (*Preferences) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{8}
+}
+
+func (m *Preferences) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Preferences.Unmarshal(m, b)
+}
+func (m *Preferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Preferences.Marshal(b, m, deterministic)
+}
+func (m *Preferences) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Preferences.Merge(m, src)
+}
+func (m *Preferences) XXX_Size() int {
+	return xxx_messageInfo_Preferences.Size(m)
+}
+func (m *Preferences) XXX_DiscardUnknown() {
+	xxx_messageInfo_Preferences.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Preferences proto.InternalMessageInfo
+
+func (m *Preferences) GetIsSkippable() *wrappers.BoolValue {
+	if m != nil {
+		return m.IsSkippable
+	}
+	return nil
+}
+
+func (m *Preferences) GetStartsWithSound() *wrappers.BoolValue {
+	if m != nil {
+		return m.StartsWithSound
+	}
+	return nil
+}
+
+func (m *Preferences) GetAdLength() enums.ReachPlanAdLengthEnum_ReachPlanAdLength {
+	if m != nil {
+		return m.AdLength
+	}
+	return enums.ReachPlanAdLengthEnum_UNSPECIFIED
+}
+
+func (m *Preferences) GetTopContentOnly() *wrappers.BoolValue {
+	if m != nil {
+		return m.TopContentOnly
+	}
+	return nil
+}
+
+func (m *Preferences) GetHasGuaranteedPrice() *wrappers.BoolValue {
+	if m != nil {
+		return m.HasGuaranteedPrice
+	}
+	return nil
+}
+
+// The suggested product mix.
+type GenerateProductMixIdeasResponse struct {
+	// A list of products (ad formats) and the associated budget allocation idea.
+	ProductAllocation    []*ProductAllocation `protobuf:"bytes,1,rep,name=product_allocation,json=productAllocation,proto3" json:"product_allocation,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *GenerateProductMixIdeasResponse) Reset()         { *m = GenerateProductMixIdeasResponse{} }
+func (m *GenerateProductMixIdeasResponse) String() string { return proto.CompactTextString(m) }
+func (*GenerateProductMixIdeasResponse) ProtoMessage()    {}
+func (*GenerateProductMixIdeasResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{9}
+}
+
+func (m *GenerateProductMixIdeasResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateProductMixIdeasResponse.Unmarshal(m, b)
+}
+func (m *GenerateProductMixIdeasResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateProductMixIdeasResponse.Marshal(b, m, deterministic)
+}
+func (m *GenerateProductMixIdeasResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateProductMixIdeasResponse.Merge(m, src)
+}
+func (m *GenerateProductMixIdeasResponse) XXX_Size() int {
+	return xxx_messageInfo_GenerateProductMixIdeasResponse.Size(m)
+}
+func (m *GenerateProductMixIdeasResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateProductMixIdeasResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateProductMixIdeasResponse proto.InternalMessageInfo
+
+func (m *GenerateProductMixIdeasResponse) GetProductAllocation() []*ProductAllocation {
+	if m != nil {
+		return m.ProductAllocation
+	}
+	return nil
+}
+
+// An allocation of a part of the budget on a given product.
+type ProductAllocation struct {
+	// Selected product for planning. The product codes returned are within the
+	// set of the ones returned by ListPlannableProducts when using the same
+	// location id.
+	PlannableProductCode *wrappers.StringValue `protobuf:"bytes,1,opt,name=plannable_product_code,json=plannableProductCode,proto3" json:"plannable_product_code,omitempty"`
+	// The value to be allocated for the suggested product in requested currency.
+	// Amount in micros. One million is equivalent to one unit.
+	BudgetMicros         *wrappers.Int64Value `protobuf:"bytes,2,opt,name=budget_micros,json=budgetMicros,proto3" json:"budget_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *ProductAllocation) Reset()         { *m = ProductAllocation{} }
+func (m *ProductAllocation) String() string { return proto.CompactTextString(m) }
+func (*ProductAllocation) ProtoMessage()    {}
+func (*ProductAllocation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{10}
+}
+
+func (m *ProductAllocation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProductAllocation.Unmarshal(m, b)
+}
+func (m *ProductAllocation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProductAllocation.Marshal(b, m, deterministic)
+}
+func (m *ProductAllocation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProductAllocation.Merge(m, src)
+}
+func (m *ProductAllocation) XXX_Size() int {
+	return xxx_messageInfo_ProductAllocation.Size(m)
+}
+func (m *ProductAllocation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProductAllocation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProductAllocation proto.InternalMessageInfo
+
+func (m *ProductAllocation) GetPlannableProductCode() *wrappers.StringValue {
+	if m != nil {
+		return m.PlannableProductCode
+	}
+	return nil
+}
+
+func (m *ProductAllocation) GetBudgetMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.BudgetMicros
+	}
+	return nil
+}
+
+// Request message for [ReachPlanService.GenerateReachForecast][google.ads.googleads.v3.services.ReachPlanService.GenerateReachForecast].
+type GenerateReachForecastRequest struct {
+	// Required. The ID of the customer.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// The currency code.
+	// Three-character ISO 4217 currency code.
+	CurrencyCode *wrappers.StringValue `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	// Required. Campaign duration.
+	CampaignDuration *CampaignDuration `protobuf:"bytes,3,opt,name=campaign_duration,json=campaignDuration,proto3" json:"campaign_duration,omitempty"`
+	// Desired cookie frequency cap that will be applied to each planned product.
+	// This is equivalent to the frequency cap exposed in Google Ads when creating
+	// a campaign, it represents the maximum number of times an ad can be shown to
+	// the same user.
+	// If not specified no cap is applied.
+	CookieFrequencyCap *wrappers.Int32Value `protobuf:"bytes,4,opt,name=cookie_frequency_cap,json=cookieFrequencyCap,proto3" json:"cookie_frequency_cap,omitempty"`
+	// Desired minimum effective frequency (the number of times a person was
+	// exposed to the ad) for the reported reach metrics [1-10].
+	// This won't affect the targeting, but just the reporting.
+	// If not specified, a default of 1 is applied.
+	MinEffectiveFrequency *wrappers.Int32Value `protobuf:"bytes,5,opt,name=min_effective_frequency,json=minEffectiveFrequency,proto3" json:"min_effective_frequency,omitempty"`
+	// The targeting to be applied to all products selected in the product mix.
+	//
+	// This is planned targeting: execution details might vary based on the
+	// advertising product, please consult an implementation specialist.
+	//
+	// If no targeting dimensions are specified, then campaigns will target
+	// everywhere and everyone.
+	//
+	// See specific metrics for details on how targeting affects them.
+	//
+	// In some cases, targeting may be overridden using the
+	// PlannedProduct.advanced_product_targeting field.
+	Targeting *Targeting `protobuf:"bytes,6,opt,name=targeting,proto3" json:"targeting,omitempty"`
+	// Required. The product to be planned.
+	PlannedProducts      []*PlannedProduct `protobuf:"bytes,7,rep,name=planned_products,json=plannedProducts,proto3" json:"planned_products,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *GenerateReachForecastRequest) Reset()         { *m = GenerateReachForecastRequest{} }
+func (m *GenerateReachForecastRequest) String() string { return proto.CompactTextString(m) }
+func (*GenerateReachForecastRequest) ProtoMessage()    {}
+func (*GenerateReachForecastRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{11}
+}
+
+func (m *GenerateReachForecastRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateReachForecastRequest.Unmarshal(m, b)
+}
+func (m *GenerateReachForecastRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateReachForecastRequest.Marshal(b, m, deterministic)
+}
+func (m *GenerateReachForecastRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateReachForecastRequest.Merge(m, src)
+}
+func (m *GenerateReachForecastRequest) XXX_Size() int {
+	return xxx_messageInfo_GenerateReachForecastRequest.Size(m)
+}
+func (m *GenerateReachForecastRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateReachForecastRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateReachForecastRequest proto.InternalMessageInfo
+
+func (m *GenerateReachForecastRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *GenerateReachForecastRequest) GetCurrencyCode() *wrappers.StringValue {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return nil
+}
+
+func (m *GenerateReachForecastRequest) GetCampaignDuration() *CampaignDuration {
+	if m != nil {
+		return m.CampaignDuration
+	}
+	return nil
+}
+
+func (m *GenerateReachForecastRequest) GetCookieFrequencyCap() *wrappers.Int32Value {
+	if m != nil {
+		return m.CookieFrequencyCap
+	}
+	return nil
+}
+
+func (m *GenerateReachForecastRequest) GetMinEffectiveFrequency() *wrappers.Int32Value {
+	if m != nil {
+		return m.MinEffectiveFrequency
+	}
+	return nil
+}
+
+func (m *GenerateReachForecastRequest) GetTargeting() *Targeting {
+	if m != nil {
+		return m.Targeting
+	}
+	return nil
+}
+
+func (m *GenerateReachForecastRequest) GetPlannedProducts() []*PlannedProduct {
+	if m != nil {
+		return m.PlannedProducts
+	}
+	return nil
+}
+
+// The targeting for which traffic metrics will be reported.
+type Targeting struct {
+	// Required. The ID of the selected location.
+	// Plannable locations ID can be obtained from ListPlannableLocations.
+	PlannableLocationId *wrappers.StringValue `protobuf:"bytes,1,opt,name=plannable_location_id,json=plannableLocationId,proto3" json:"plannable_location_id,omitempty"`
+	// Required
+	// Selected age range to be planned on.
+	AgeRange enums.ReachPlanAgeRangeEnum_ReachPlanAgeRange `protobuf:"varint,2,opt,name=age_range,json=ageRange,proto3,enum=google.ads.googleads.v3.enums.ReachPlanAgeRangeEnum_ReachPlanAgeRange" json:"age_range,omitempty"`
+	// Targetable genders for the ad product.
+	Genders []*common.GenderInfo `protobuf:"bytes,3,rep,name=genders,proto3" json:"genders,omitempty"`
+	// Targetable devices for the ad product.
+	Devices []*common.DeviceInfo `protobuf:"bytes,4,rep,name=devices,proto3" json:"devices,omitempty"`
+	// Targetable network for the ad product.
+	Network              enums.ReachPlanNetworkEnum_ReachPlanNetwork `protobuf:"varint,5,opt,name=network,proto3,enum=google.ads.googleads.v3.enums.ReachPlanNetworkEnum_ReachPlanNetwork" json:"network,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *Targeting) Reset()         { *m = Targeting{} }
+func (m *Targeting) String() string { return proto.CompactTextString(m) }
+func (*Targeting) ProtoMessage()    {}
+func (*Targeting) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{12}
+}
+
+func (m *Targeting) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Targeting.Unmarshal(m, b)
+}
+func (m *Targeting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Targeting.Marshal(b, m, deterministic)
+}
+func (m *Targeting) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Targeting.Merge(m, src)
+}
+func (m *Targeting) XXX_Size() int {
+	return xxx_messageInfo_Targeting.Size(m)
+}
+func (m *Targeting) XXX_DiscardUnknown() {
+	xxx_messageInfo_Targeting.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Targeting proto.InternalMessageInfo
+
+func (m *Targeting) GetPlannableLocationId() *wrappers.StringValue {
+	if m != nil {
+		return m.PlannableLocationId
+	}
+	return nil
+}
+
+func (m *Targeting) GetAgeRange() enums.ReachPlanAgeRangeEnum_ReachPlanAgeRange {
+	if m != nil {
+		return m.AgeRange
+	}
+	return enums.ReachPlanAgeRangeEnum_UNSPECIFIED
+}
+
+func (m *Targeting) GetGenders() []*common.GenderInfo {
+	if m != nil {
+		return m.Genders
+	}
+	return nil
+}
+
+func (m *Targeting) GetDevices() []*common.DeviceInfo {
+	if m != nil {
+		return m.Devices
+	}
+	return nil
+}
+
+func (m *Targeting) GetNetwork() enums.ReachPlanNetworkEnum_ReachPlanNetwork {
+	if m != nil {
+		return m.Network
+	}
+	return enums.ReachPlanNetworkEnum_UNSPECIFIED
+}
+
+// The duration of a planned campaign.
+type CampaignDuration struct {
+	// The duration value in days.
+	DurationInDays       *wrappers.Int32Value `protobuf:"bytes,1,opt,name=duration_in_days,json=durationInDays,proto3" json:"duration_in_days,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *CampaignDuration) Reset()         { *m = CampaignDuration{} }
+func (m *CampaignDuration) String() string { return proto.CompactTextString(m) }
+func (*CampaignDuration) ProtoMessage()    {}
+func (*CampaignDuration) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{13}
+}
+
+func (m *CampaignDuration) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CampaignDuration.Unmarshal(m, b)
+}
+func (m *CampaignDuration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CampaignDuration.Marshal(b, m, deterministic)
+}
+func (m *CampaignDuration) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CampaignDuration.Merge(m, src)
+}
+func (m *CampaignDuration) XXX_Size() int {
+	return xxx_messageInfo_CampaignDuration.Size(m)
+}
+func (m *CampaignDuration) XXX_DiscardUnknown() {
+	xxx_messageInfo_CampaignDuration.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CampaignDuration proto.InternalMessageInfo
+
+func (m *CampaignDuration) GetDurationInDays() *wrappers.Int32Value {
+	if m != nil {
+		return m.DurationInDays
+	}
+	return nil
+}
+
+// A product being planned for reach.
+type PlannedProduct struct {
+	// Required. Selected product for planning.
+	// Plannable products codes can be obtained from ListPlannableProducts.
+	PlannableProductCode *wrappers.StringValue `protobuf:"bytes,1,opt,name=plannable_product_code,json=plannableProductCode,proto3" json:"plannable_product_code,omitempty"`
+	// Required. Maximum budget allocation in micros for the selected product.
+	// The value is specified in the selected planning currency_code.
+	// E.g. 1 000 000$ = 1 000 000 000 000 micros.
+	BudgetMicros         *wrappers.Int64Value `protobuf:"bytes,2,opt,name=budget_micros,json=budgetMicros,proto3" json:"budget_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *PlannedProduct) Reset()         { *m = PlannedProduct{} }
+func (m *PlannedProduct) String() string { return proto.CompactTextString(m) }
+func (*PlannedProduct) ProtoMessage()    {}
+func (*PlannedProduct) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{14}
+}
+
+func (m *PlannedProduct) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PlannedProduct.Unmarshal(m, b)
+}
+func (m *PlannedProduct) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PlannedProduct.Marshal(b, m, deterministic)
+}
+func (m *PlannedProduct) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PlannedProduct.Merge(m, src)
+}
+func (m *PlannedProduct) XXX_Size() int {
+	return xxx_messageInfo_PlannedProduct.Size(m)
+}
+func (m *PlannedProduct) XXX_DiscardUnknown() {
+	xxx_messageInfo_PlannedProduct.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PlannedProduct proto.InternalMessageInfo
+
+func (m *PlannedProduct) GetPlannableProductCode() *wrappers.StringValue {
+	if m != nil {
+		return m.PlannableProductCode
+	}
+	return nil
+}
+
+func (m *PlannedProduct) GetBudgetMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.BudgetMicros
+	}
+	return nil
+}
+
+// Response message containing the generated reach curve.
+type GenerateReachForecastResponse struct {
+	// Reference on target audiences for this curve.
+	OnTargetAudienceMetrics *OnTargetAudienceMetrics `protobuf:"bytes,1,opt,name=on_target_audience_metrics,json=onTargetAudienceMetrics,proto3" json:"on_target_audience_metrics,omitempty"`
+	// The generated reach curve for the planned product mix.
+	ReachCurve           *ReachCurve `protobuf:"bytes,2,opt,name=reach_curve,json=reachCurve,proto3" json:"reach_curve,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *GenerateReachForecastResponse) Reset()         { *m = GenerateReachForecastResponse{} }
+func (m *GenerateReachForecastResponse) String() string { return proto.CompactTextString(m) }
+func (*GenerateReachForecastResponse) ProtoMessage()    {}
+func (*GenerateReachForecastResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{15}
+}
+
+func (m *GenerateReachForecastResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GenerateReachForecastResponse.Unmarshal(m, b)
+}
+func (m *GenerateReachForecastResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GenerateReachForecastResponse.Marshal(b, m, deterministic)
+}
+func (m *GenerateReachForecastResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GenerateReachForecastResponse.Merge(m, src)
+}
+func (m *GenerateReachForecastResponse) XXX_Size() int {
+	return xxx_messageInfo_GenerateReachForecastResponse.Size(m)
+}
+func (m *GenerateReachForecastResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GenerateReachForecastResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenerateReachForecastResponse proto.InternalMessageInfo
+
+func (m *GenerateReachForecastResponse) GetOnTargetAudienceMetrics() *OnTargetAudienceMetrics {
+	if m != nil {
+		return m.OnTargetAudienceMetrics
+	}
+	return nil
+}
+
+func (m *GenerateReachForecastResponse) GetReachCurve() *ReachCurve {
+	if m != nil {
+		return m.ReachCurve
+	}
+	return nil
+}
+
+// The reach curve for the planned products.
+type ReachCurve struct {
+	// All points on the reach curve.
+	ReachForecasts       []*ReachForecast `protobuf:"bytes,1,rep,name=reach_forecasts,json=reachForecasts,proto3" json:"reach_forecasts,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *ReachCurve) Reset()         { *m = ReachCurve{} }
+func (m *ReachCurve) String() string { return proto.CompactTextString(m) }
+func (*ReachCurve) ProtoMessage()    {}
+func (*ReachCurve) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{16}
+}
+
+func (m *ReachCurve) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ReachCurve.Unmarshal(m, b)
+}
+func (m *ReachCurve) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ReachCurve.Marshal(b, m, deterministic)
+}
+func (m *ReachCurve) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ReachCurve.Merge(m, src)
+}
+func (m *ReachCurve) XXX_Size() int {
+	return xxx_messageInfo_ReachCurve.Size(m)
+}
+func (m *ReachCurve) XXX_DiscardUnknown() {
+	xxx_messageInfo_ReachCurve.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ReachCurve proto.InternalMessageInfo
+
+func (m *ReachCurve) GetReachForecasts() []*ReachForecast {
+	if m != nil {
+		return m.ReachForecasts
+	}
+	return nil
+}
+
+// A point on reach curve.
+type ReachForecast struct {
+	// The cost in micros.
+	CostMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=cost_micros,json=costMicros,proto3" json:"cost_micros,omitempty"`
+	// Forecasted traffic metrics for this point.
+	Forecast *Forecast `protobuf:"bytes,2,opt,name=forecast,proto3" json:"forecast,omitempty"`
+	// The forecasted allocation. This differs from the input allocation if one
+	// or more product cannot fulfill the budget because of limited inventory.
+	ForecastedProductAllocations []*ProductAllocation `protobuf:"bytes,3,rep,name=forecasted_product_allocations,json=forecastedProductAllocations,proto3" json:"forecasted_product_allocations,omitempty"`
+	XXX_NoUnkeyedLiteral         struct{}             `json:"-"`
+	XXX_unrecognized             []byte               `json:"-"`
+	XXX_sizecache                int32                `json:"-"`
+}
+
+func (m *ReachForecast) Reset()         { *m = ReachForecast{} }
+func (m *ReachForecast) String() string { return proto.CompactTextString(m) }
+func (*ReachForecast) ProtoMessage()    {}
+func (*ReachForecast) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{17}
+}
+
+func (m *ReachForecast) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ReachForecast.Unmarshal(m, b)
+}
+func (m *ReachForecast) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ReachForecast.Marshal(b, m, deterministic)
+}
+func (m *ReachForecast) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ReachForecast.Merge(m, src)
+}
+func (m *ReachForecast) XXX_Size() int {
+	return xxx_messageInfo_ReachForecast.Size(m)
+}
+func (m *ReachForecast) XXX_DiscardUnknown() {
+	xxx_messageInfo_ReachForecast.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ReachForecast proto.InternalMessageInfo
+
+func (m *ReachForecast) GetCostMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CostMicros
+	}
+	return nil
+}
+
+func (m *ReachForecast) GetForecast() *Forecast {
+	if m != nil {
+		return m.Forecast
+	}
+	return nil
+}
+
+func (m *ReachForecast) GetForecastedProductAllocations() []*ProductAllocation {
+	if m != nil {
+		return m.ForecastedProductAllocations
+	}
+	return nil
+}
+
+// Forecasted traffic metrics for the planned products and targeting.
+type Forecast struct {
+	// Number of unique people reached at least
+	// GenerateReachForecastRequest.min_effective_frequency times that exactly
+	// matches the Targeting.
+	OnTargetReach *wrappers.Int64Value `protobuf:"bytes,1,opt,name=on_target_reach,json=onTargetReach,proto3" json:"on_target_reach,omitempty"`
+	// Total number of unique people reached at least
+	// GenerateReachForecastRequest.min_effective_frequency times. This includes
+	// people that may fall outside the specified Targeting.
+	TotalReach *wrappers.Int64Value `protobuf:"bytes,2,opt,name=total_reach,json=totalReach,proto3" json:"total_reach,omitempty"`
+	// Number of ad impressions that exactly matches the Targeting.
+	OnTargetImpressions *wrappers.Int64Value `protobuf:"bytes,3,opt,name=on_target_impressions,json=onTargetImpressions,proto3" json:"on_target_impressions,omitempty"`
+	// Total number of ad impressions. This includes impressions that may fall
+	// outside the specified Targeting, due to insufficent information on
+	// signed-in users.
+	TotalImpressions     *wrappers.Int64Value `protobuf:"bytes,4,opt,name=total_impressions,json=totalImpressions,proto3" json:"total_impressions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *Forecast) Reset()         { *m = Forecast{} }
+func (m *Forecast) String() string { return proto.CompactTextString(m) }
+func (*Forecast) ProtoMessage()    {}
+func (*Forecast) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{18}
+}
+
+func (m *Forecast) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Forecast.Unmarshal(m, b)
+}
+func (m *Forecast) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Forecast.Marshal(b, m, deterministic)
+}
+func (m *Forecast) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Forecast.Merge(m, src)
+}
+func (m *Forecast) XXX_Size() int {
+	return xxx_messageInfo_Forecast.Size(m)
+}
+func (m *Forecast) XXX_DiscardUnknown() {
+	xxx_messageInfo_Forecast.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Forecast proto.InternalMessageInfo
+
+func (m *Forecast) GetOnTargetReach() *wrappers.Int64Value {
+	if m != nil {
+		return m.OnTargetReach
+	}
+	return nil
+}
+
+func (m *Forecast) GetTotalReach() *wrappers.Int64Value {
+	if m != nil {
+		return m.TotalReach
+	}
+	return nil
+}
+
+func (m *Forecast) GetOnTargetImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.OnTargetImpressions
+	}
+	return nil
+}
+
+func (m *Forecast) GetTotalImpressions() *wrappers.Int64Value {
+	if m != nil {
+		return m.TotalImpressions
+	}
+	return nil
+}
+
+// Audience metrics for the planned products.
+// These metrics consider the following targeting dimensions:
+//
+// - Location
+// - PlannableAgeRange
+// - Gender
+type OnTargetAudienceMetrics struct {
+	// Reference audience size matching the considered targeting for YouTube.
+	YoutubeAudienceSize *wrappers.Int64Value `protobuf:"bytes,1,opt,name=youtube_audience_size,json=youtubeAudienceSize,proto3" json:"youtube_audience_size,omitempty"`
+	// Reference audience size matching the considered targeting for Census.
+	CensusAudienceSize   *wrappers.Int64Value `protobuf:"bytes,2,opt,name=census_audience_size,json=censusAudienceSize,proto3" json:"census_audience_size,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *OnTargetAudienceMetrics) Reset()         { *m = OnTargetAudienceMetrics{} }
+func (m *OnTargetAudienceMetrics) String() string { return proto.CompactTextString(m) }
+func (*OnTargetAudienceMetrics) ProtoMessage()    {}
+func (*OnTargetAudienceMetrics) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d80b4ff3bff090d4, []int{19}
+}
+
+func (m *OnTargetAudienceMetrics) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnTargetAudienceMetrics.Unmarshal(m, b)
+}
+func (m *OnTargetAudienceMetrics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnTargetAudienceMetrics.Marshal(b, m, deterministic)
+}
+func (m *OnTargetAudienceMetrics) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnTargetAudienceMetrics.Merge(m, src)
+}
+func (m *OnTargetAudienceMetrics) XXX_Size() int {
+	return xxx_messageInfo_OnTargetAudienceMetrics.Size(m)
+}
+func (m *OnTargetAudienceMetrics) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnTargetAudienceMetrics.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnTargetAudienceMetrics proto.InternalMessageInfo
+
+func (m *OnTargetAudienceMetrics) GetYoutubeAudienceSize() *wrappers.Int64Value {
+	if m != nil {
+		return m.YoutubeAudienceSize
+	}
+	return nil
+}
+
+func (m *OnTargetAudienceMetrics) GetCensusAudienceSize() *wrappers.Int64Value {
+	if m != nil {
+		return m.CensusAudienceSize
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ListPlannableLocationsRequest)(nil), "google.ads.googleads.v3.services.ListPlannableLocationsRequest")
+	proto.RegisterType((*ListPlannableLocationsResponse)(nil), "google.ads.googleads.v3.services.ListPlannableLocationsResponse")
+	proto.RegisterType((*PlannableLocation)(nil), "google.ads.googleads.v3.services.PlannableLocation")
+	proto.RegisterType((*ListPlannableProductsRequest)(nil), "google.ads.googleads.v3.services.ListPlannableProductsRequest")
+	proto.RegisterType((*ListPlannableProductsResponse)(nil), "google.ads.googleads.v3.services.ListPlannableProductsResponse")
+	proto.RegisterType((*ProductMetadata)(nil), "google.ads.googleads.v3.services.ProductMetadata")
+	proto.RegisterType((*PlannableTargeting)(nil), "google.ads.googleads.v3.services.PlannableTargeting")
+	proto.RegisterType((*GenerateProductMixIdeasRequest)(nil), "google.ads.googleads.v3.services.GenerateProductMixIdeasRequest")
+	proto.RegisterType((*Preferences)(nil), "google.ads.googleads.v3.services.Preferences")
+	proto.RegisterType((*GenerateProductMixIdeasResponse)(nil), "google.ads.googleads.v3.services.GenerateProductMixIdeasResponse")
+	proto.RegisterType((*ProductAllocation)(nil), "google.ads.googleads.v3.services.ProductAllocation")
+	proto.RegisterType((*GenerateReachForecastRequest)(nil), "google.ads.googleads.v3.services.GenerateReachForecastRequest")
+	proto.RegisterType((*Targeting)(nil), "google.ads.googleads.v3.services.Targeting")
+	proto.RegisterType((*CampaignDuration)(nil), "google.ads.googleads.v3.services.CampaignDuration")
+	proto.RegisterType((*PlannedProduct)(nil), "google.ads.googleads.v3.services.PlannedProduct")
+	proto.RegisterType((*GenerateReachForecastResponse)(nil), "google.ads.googleads.v3.services.GenerateReachForecastResponse")
+	proto.RegisterType((*ReachCurve)(nil), "google.ads.googleads.v3.services.ReachCurve")
+	proto.RegisterType((*ReachForecast)(nil), "google.ads.googleads.v3.services.ReachForecast")
+	proto.RegisterType((*Forecast)(nil), "google.ads.googleads.v3.services.Forecast")
+	proto.RegisterType((*OnTargetAudienceMetrics)(nil), "google.ads.googleads.v3.services.OnTargetAudienceMetrics")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/reach_plan_service.proto", fileDescriptor_d80b4ff3bff090d4)
+}
+
+var fileDescriptor_d80b4ff3bff090d4 = []byte{
+	// 1769 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0xcb, 0x6f, 0x24, 0x47,
+	0x19, 0x57, 0xf7, 0x2c, 0x59, 0xbb, 0x9c, 0xf5, 0xa3, 0x76, 0x1d, 0x0f, 0x13, 0xc7, 0xbb, 0x6a,
+	0x2d, 0x52, 0x64, 0x9c, 0x99, 0xe0, 0x09, 0x51, 0x32, 0x64, 0x49, 0x66, 0xed, 0xb5, 0x33, 0xd2,
+	0x9a, 0xb5, 0xda, 0xb0, 0x3c, 0x64, 0xd1, 0x29, 0x77, 0xd7, 0xb4, 0x4b, 0x3b, 0x53, 0xd5, 0x54,
+	0x55, 0x7b, 0x99, 0xa0, 0x48, 0x08, 0x09, 0x24, 0x0e, 0x48, 0x48, 0xfc, 0x05, 0x70, 0x40, 0xc0,
+	0x81, 0x3b, 0x12, 0xe2, 0xc0, 0x31, 0xe2, 0x86, 0xc4, 0x61, 0x4f, 0x1c, 0x10, 0x12, 0xfc, 0x0d,
+	0x44, 0x42, 0x5d, 0x8f, 0x9e, 0xf7, 0x4c, 0xdb, 0xbb, 0x48, 0xdc, 0xca, 0x55, 0xdf, 0xef, 0x57,
+	0xf5, 0xbd, 0xbf, 0x1e, 0x83, 0x77, 0x63, 0xc6, 0xe2, 0x0e, 0xae, 0xa1, 0x48, 0xd4, 0xf4, 0x32,
+	0x5b, 0x5d, 0xd4, 0x6b, 0x02, 0xf3, 0x0b, 0x12, 0x62, 0x51, 0xe3, 0x18, 0x85, 0xe7, 0x41, 0xd2,
+	0x41, 0x34, 0x30, 0x7b, 0xd5, 0x84, 0x33, 0xc9, 0xe0, 0x1d, 0x2d, 0x5f, 0x45, 0x91, 0xa8, 0xe6,
+	0xd0, 0xea, 0x45, 0xbd, 0x6a, 0xa1, 0x95, 0x37, 0xa6, 0x91, 0x87, 0xac, 0xdb, 0x65, 0xb4, 0x16,
+	0x72, 0x22, 0x31, 0x27, 0x48, 0x13, 0x56, 0xde, 0x99, 0x26, 0x8e, 0x69, 0xda, 0x1d, 0x7a, 0x08,
+	0x8a, 0x82, 0x0e, 0xa6, 0xb1, 0x3c, 0xbf, 0x3c, 0x32, 0xc6, 0x01, 0x47, 0x34, 0x36, 0x4a, 0x54,
+	0xde, 0x2e, 0x8c, 0xa4, 0x58, 0x3e, 0x65, 0xfc, 0x89, 0xc1, 0x6d, 0x5a, 0x5c, 0x42, 0x6a, 0x88,
+	0x52, 0x26, 0x91, 0x24, 0x8c, 0x0a, 0x73, 0xba, 0x31, 0x70, 0x1a, 0x76, 0x08, 0xa6, 0xd2, 0x1c,
+	0xdc, 0x1e, 0x38, 0x68, 0x13, 0xdc, 0x89, 0x82, 0x33, 0x7c, 0x8e, 0x2e, 0x08, 0xe3, 0x46, 0x60,
+	0xcb, 0x08, 0xa8, 0xbf, 0xce, 0xd2, 0x76, 0xed, 0x29, 0x47, 0x49, 0x82, 0xb9, 0x61, 0xf6, 0x6e,
+	0x83, 0xd7, 0x1e, 0x12, 0x21, 0x8f, 0x3b, 0x88, 0x52, 0x74, 0xd6, 0xc1, 0x0f, 0x59, 0xa8, 0x6f,
+	0xf6, 0xf1, 0xf7, 0x52, 0x2c, 0xa4, 0xf7, 0x13, 0x07, 0x6c, 0x4d, 0x93, 0x10, 0x09, 0xa3, 0x02,
+	0xc3, 0x08, 0xdc, 0x4c, 0xec, 0x69, 0xd0, 0xb1, 0xc7, 0x65, 0xe7, 0x4e, 0xe9, 0xf5, 0xa5, 0xdd,
+	0x7a, 0x75, 0x9e, 0x5b, 0xab, 0x63, 0xd4, 0x3e, 0x4c, 0xc6, 0x6e, 0xf3, 0xfe, 0xe8, 0x80, 0xb5,
+	0x31, 0x49, 0xb8, 0x03, 0x5c, 0x12, 0x95, 0x9d, 0x3b, 0xce, 0xeb, 0x4b, 0xbb, 0x9b, 0xf6, 0x2a,
+	0xab, 0x6c, 0xf5, 0x44, 0x72, 0x42, 0xe3, 0xc7, 0xa8, 0x93, 0x62, 0xdf, 0x25, 0x11, 0x7c, 0x13,
+	0x5c, 0xa3, 0xa8, 0x8b, 0xcb, 0x6e, 0x01, 0x79, 0x25, 0x09, 0x0f, 0xc1, 0x5a, 0x82, 0x38, 0xa6,
+	0x32, 0x08, 0x59, 0x4a, 0x25, 0xef, 0x05, 0x24, 0x2a, 0x97, 0x14, 0xfc, 0xd5, 0x31, 0x78, 0x8b,
+	0xca, 0xb7, 0xdf, 0xd2, 0xe8, 0x15, 0x8d, 0xda, 0xd3, 0xa0, 0x56, 0xe4, 0xa5, 0x60, 0x73, 0xc8,
+	0x8c, 0xc7, 0x9c, 0x45, 0x69, 0x28, 0xad, 0x9d, 0xe1, 0x37, 0xc0, 0xfa, 0xb8, 0x11, 0x83, 0x62,
+	0xba, 0xdd, 0x2f, 0xfd, 0xbd, 0xe9, 0xfa, 0x37, 0xc7, 0x8c, 0xd6, 0x8a, 0xbc, 0x4f, 0x46, 0xfc,
+	0xdb, 0xbf, 0xd6, 0x38, 0xef, 0x14, 0xac, 0x26, 0x7a, 0x2f, 0xe8, 0x62, 0x89, 0x22, 0x24, 0x91,
+	0xf1, 0xdc, 0x97, 0x0a, 0x78, 0x4e, 0x23, 0x8f, 0x0c, 0xd0, 0x5f, 0x49, 0x86, 0x37, 0xbc, 0xbf,
+	0x38, 0x60, 0x65, 0x44, 0x08, 0xfa, 0xe0, 0x95, 0xbe, 0xa6, 0xf6, 0xee, 0x90, 0x45, 0xb8, 0x90,
+	0x1b, 0x6f, 0x25, 0x23, 0xaa, 0xec, 0xb1, 0x08, 0x43, 0x3c, 0x18, 0x82, 0x12, 0xf1, 0x18, 0x4b,
+	0x42, 0x63, 0xe3, 0xe7, 0xb7, 0x2e, 0x11, 0x82, 0x5f, 0xb7, 0xd8, 0x81, 0x18, 0xcc, 0xf7, 0xbc,
+	0x7f, 0xb9, 0x00, 0x8e, 0x8b, 0x42, 0x0c, 0x40, 0x5e, 0x07, 0x74, 0xdc, 0x2f, 0xef, 0x1e, 0x4c,
+	0xbd, 0x54, 0x55, 0x82, 0xaa, 0x9f, 0x55, 0x82, 0x8c, 0xab, 0x19, 0x63, 0x3f, 0x03, 0x3e, 0xa0,
+	0x69, 0x77, 0x7c, 0xd7, 0x5f, 0x44, 0x66, 0x25, 0xe0, 0x3e, 0xb8, 0x1e, 0x63, 0x1a, 0x61, 0x2e,
+	0xca, 0xae, 0xf2, 0xd0, 0xf6, 0xd4, 0x3b, 0x74, 0x41, 0xac, 0x1e, 0x2a, 0xf1, 0x16, 0x6d, 0x33,
+	0xdf, 0x42, 0x33, 0x96, 0x08, 0x2b, 0xad, 0xcb, 0xa5, 0x62, 0x2c, 0xfb, 0x4a, 0x5c, 0xb3, 0x18,
+	0x28, 0xfc, 0x08, 0x2c, 0x98, 0x02, 0x26, 0xca, 0xd7, 0x94, 0xc2, 0xfb, 0x45, 0x15, 0xfe, 0x9a,
+	0xc6, 0x0d, 0xeb, 0x6b, 0x36, 0xfd, 0x9c, 0xd5, 0xfb, 0xcc, 0x05, 0x5b, 0x87, 0x98, 0x62, 0x8e,
+	0xa4, 0x75, 0xf5, 0x11, 0xf9, 0x7e, 0x2b, 0xc2, 0x28, 0xcf, 0x99, 0xbb, 0x60, 0x29, 0x4c, 0x85,
+	0x64, 0x5d, 0xcc, 0x6d, 0xa6, 0x2c, 0xea, 0x5c, 0x00, 0x76, 0xbf, 0x15, 0x4d, 0xcf, 0x2c, 0xf7,
+	0x79, 0x32, 0x0b, 0x1e, 0x80, 0x1b, 0x61, 0xca, 0x39, 0xa6, 0x61, 0x4f, 0x47, 0x6f, 0xa9, 0x28,
+	0xdd, 0xcb, 0x16, 0xa7, 0x42, 0xf7, 0x01, 0xb8, 0x71, 0x96, 0x46, 0x31, 0x96, 0x41, 0x97, 0x84,
+	0x9c, 0x65, 0xe6, 0x9c, 0x57, 0x5d, 0x0c, 0x8d, 0x86, 0x1d, 0x29, 0x14, 0x7c, 0x04, 0x96, 0x12,
+	0x8e, 0xdb, 0x38, 0x23, 0xc6, 0xa2, 0xfc, 0x39, 0x45, 0xf2, 0x46, 0x91, 0x14, 0xce, 0x41, 0xfe,
+	0x20, 0x83, 0xf7, 0xb3, 0x12, 0x58, 0x1a, 0x38, 0x84, 0xf7, 0xc0, 0xcb, 0x44, 0x04, 0xe2, 0x09,
+	0x49, 0x92, 0xcc, 0x12, 0x26, 0x59, 0x2b, 0x63, 0xcf, 0xbc, 0xcf, 0x58, 0x47, 0xa7, 0xea, 0x12,
+	0x11, 0x27, 0x56, 0x1c, 0x1e, 0x80, 0x35, 0x21, 0x11, 0x97, 0x22, 0x78, 0x4a, 0xe4, 0x79, 0x20,
+	0x58, 0x4a, 0xad, 0x07, 0x66, 0x71, 0xac, 0x68, 0xd0, 0x37, 0x89, 0x3c, 0x3f, 0xc9, 0x20, 0x30,
+	0x04, 0x8b, 0x79, 0xb7, 0x56, 0x26, 0xbf, 0x4c, 0xaa, 0x45, 0x0f, 0x15, 0x6e, 0x24, 0xd5, 0xcc,
+	0xae, 0xbf, 0x80, 0xcc, 0x0a, 0xee, 0x83, 0x55, 0xc9, 0x92, 0x20, 0x64, 0x54, 0x66, 0xa5, 0x9f,
+	0xd1, 0x4e, 0xcf, 0xb8, 0x65, 0xd6, 0x5b, 0x97, 0x25, 0x4b, 0xf6, 0x34, 0xe4, 0x11, 0xed, 0xf4,
+	0xe0, 0x43, 0x70, 0xeb, 0x1c, 0x89, 0x20, 0x4e, 0x11, 0x47, 0x54, 0x62, 0x1c, 0x05, 0x09, 0x27,
+	0x21, 0x36, 0xbe, 0x99, 0xc5, 0x04, 0xcf, 0x91, 0x38, 0xcc, 0x61, 0xc7, 0x19, 0xca, 0xfb, 0xb1,
+	0x03, 0x6e, 0x4f, 0xcd, 0x07, 0x53, 0xcc, 0xcf, 0x00, 0xb4, 0x05, 0x15, 0x75, 0x6c, 0xa8, 0x5f,
+	0xa2, 0x11, 0x6b, 0x6c, 0x33, 0x87, 0xfa, 0x6b, 0xc9, 0xe8, 0x96, 0xf7, 0xdb, 0xac, 0x0f, 0x8f,
+	0xee, 0xfe, 0x4f, 0x8a, 0xfa, 0x07, 0xa3, 0x99, 0xe1, 0xce, 0xef, 0xbb, 0x43, 0x49, 0xe1, 0xfd,
+	0xe9, 0x1a, 0xd8, 0xb4, 0x36, 0x53, 0xfe, 0x3e, 0x60, 0x1c, 0x87, 0x48, 0xc8, 0xcb, 0x55, 0x90,
+	0xe6, 0x68, 0xaa, 0x17, 0x99, 0x1f, 0x86, 0xb3, 0x3c, 0x02, 0x6b, 0x21, 0xea, 0x26, 0x88, 0xc4,
+	0x34, 0x88, 0x52, 0xae, 0x1d, 0xa3, 0x2b, 0xc6, 0xee, 0x7c, 0xc7, 0xec, 0x19, 0xe8, 0xbe, 0x41,
+	0xea, 0x27, 0xae, 0x86, 0x23, 0xdb, 0xf0, 0x08, 0xdc, 0x0a, 0x19, 0x7b, 0x42, 0x70, 0xd0, 0xe6,
+	0x99, 0x86, 0xea, 0xc1, 0x28, 0x99, 0x55, 0x52, 0xea, 0xbb, 0x26, 0xe4, 0x34, 0xf0, 0xc0, 0xe2,
+	0xf6, 0x50, 0x02, 0x4f, 0xc0, 0x46, 0x97, 0xd0, 0x00, 0xb7, 0xdb, 0x38, 0x94, 0xe4, 0x62, 0x80,
+	0xd5, 0xc4, 0xf0, 0x4c, 0xc6, 0xf5, 0x2e, 0xa1, 0x0f, 0x2c, 0x34, 0xe7, 0x85, 0x2d, 0xb0, 0xd8,
+	0x6f, 0xd0, 0x2f, 0x29, 0x9a, 0x2f, 0xce, 0xb7, 0x40, 0xbf, 0x2f, 0xf7, 0xd1, 0xf0, 0x23, 0xb0,
+	0xaa, 0x02, 0x47, 0x65, 0x96, 0x9e, 0x6b, 0xca, 0xd7, 0x55, 0xb0, 0xbf, 0x59, 0xb0, 0xe5, 0x67,
+	0xc9, 0xa5, 0x80, 0xda, 0xa2, 0x2b, 0xc9, 0xd0, 0xa6, 0xf0, 0x7e, 0x5f, 0x02, 0x8b, 0xfd, 0x3e,
+	0x7f, 0xfc, 0x1c, 0x33, 0xda, 0xe4, 0x26, 0x92, 0x55, 0x33, 0x3b, 0x39, 0xa8, 0xa8, 0x7a, 0x71,
+	0x83, 0xc3, 0x82, 0x1d, 0x1c, 0x06, 0xe7, 0x86, 0xd2, 0x0b, 0x99, 0x1b, 0xae, 0x5d, 0x7d, 0x6e,
+	0xf8, 0x2e, 0xb8, 0x6e, 0x3a, 0xbc, 0x0a, 0xa1, 0x17, 0x35, 0x36, 0x58, 0x52, 0xef, 0xdb, 0x60,
+	0x75, 0x34, 0x59, 0xe0, 0x03, 0xb0, 0x6a, 0x53, 0x2e, 0x20, 0x34, 0x88, 0x50, 0x4f, 0x18, 0x8f,
+	0xcd, 0x8c, 0xdf, 0x65, 0x0b, 0x6a, 0xd1, 0x7d, 0xd4, 0x13, 0xde, 0xaf, 0x1d, 0xb0, 0x3c, 0x1c,
+	0x34, 0xff, 0xa7, 0x55, 0xef, 0x9f, 0x0e, 0x78, 0x6d, 0x4a, 0xd5, 0x33, 0x7d, 0xe2, 0x02, 0x54,
+	0x18, 0x35, 0x73, 0x72, 0x80, 0xd2, 0x88, 0x64, 0x2d, 0x3e, 0x9b, 0xff, 0x39, 0x09, 0xad, 0x6d,
+	0xde, 0x9d, 0x9f, 0x42, 0x8f, 0xa8, 0xce, 0x8d, 0xa6, 0x61, 0x38, 0xd2, 0x04, 0xfe, 0x06, 0x9b,
+	0x7c, 0x00, 0x8f, 0xc0, 0x92, 0xfe, 0x02, 0x0e, 0x53, 0x7e, 0x61, 0xcb, 0xe8, 0xce, 0xfc, 0x8b,
+	0x94, 0x16, 0x7b, 0x19, 0xc6, 0x07, 0x3c, 0x5f, 0x7b, 0x6d, 0x00, 0xfa, 0x27, 0xf0, 0x5b, 0x60,
+	0x45, 0x93, 0xb7, 0x8d, 0xba, 0xf6, 0x13, 0xb4, 0x56, 0xf0, 0x82, 0xdc, 0x4c, 0xcb, 0x7c, 0xf0,
+	0x4f, 0xe1, 0xfd, 0xdc, 0x05, 0x37, 0x86, 0x24, 0xe0, 0x7b, 0x60, 0x29, 0x64, 0x22, 0x77, 0x91,
+	0x33, 0xdf, 0x45, 0x20, 0x93, 0x37, 0xb3, 0xda, 0x01, 0x58, 0xb0, 0x6f, 0x34, 0x36, 0xd8, 0x9e,
+	0xff, 0xc4, 0xfc, 0x75, 0x39, 0x16, 0xf6, 0xc0, 0x96, 0x5d, 0xf7, 0x4b, 0xe0, 0x40, 0xe7, 0xb7,
+	0xf9, 0x7e, 0xa5, 0xd6, 0xbf, 0xd9, 0xa7, 0x1e, 0x3b, 0x14, 0xde, 0x6f, 0x5c, 0xb0, 0x90, 0x5b,
+	0x63, 0x0f, 0xac, 0xf4, 0xc3, 0x49, 0xd9, 0xae, 0x88, 0x45, 0x6e, 0xd8, 0x28, 0x51, 0xa6, 0xcd,
+	0x4c, 0x2a, 0x99, 0x44, 0x1d, 0x43, 0x50, 0x20, 0xea, 0x81, 0x92, 0xd7, 0xe8, 0x47, 0x60, 0xbd,
+	0xff, 0x04, 0xd2, 0x4d, 0x38, 0x16, 0xc2, 0x58, 0x60, 0x2e, 0xcf, 0x4d, 0xfb, 0x90, 0x56, 0x1f,
+	0x07, 0x3f, 0x04, 0x6b, 0xfa, 0x39, 0x83, 0x64, 0xf3, 0x47, 0x73, 0x7f, 0x55, 0xa1, 0x06, 0x98,
+	0xbc, 0x3f, 0x38, 0x60, 0x63, 0x4a, 0xa6, 0x64, 0xcf, 0xee, 0xb1, 0x54, 0xa6, 0x67, 0xb8, 0x9f,
+	0x86, 0x82, 0x7c, 0x8c, 0x8b, 0xd8, 0xef, 0xa6, 0x41, 0x5a, 0xce, 0x13, 0xf2, 0x31, 0x56, 0x13,
+	0x00, 0xa6, 0x22, 0x15, 0x23, 0x7c, 0x05, 0xcc, 0x09, 0x35, 0x70, 0x90, 0x6e, 0xf7, 0xb3, 0xeb,
+	0x60, 0x35, 0x2f, 0xb6, 0x27, 0x3a, 0x58, 0xe0, 0x9f, 0x1d, 0xf0, 0xca, 0xe4, 0x9f, 0x84, 0xe0,
+	0xfb, 0xf3, 0x23, 0x6d, 0xe6, 0xcf, 0x4d, 0x95, 0x0f, 0xae, 0x4e, 0xa0, 0x6b, 0x9b, 0xf7, 0x85,
+	0x1f, 0xfd, 0xf5, 0x1f, 0xbf, 0x70, 0x6f, 0x7b, 0x95, 0xda, 0x45, 0xbd, 0xd1, 0x99, 0x28, 0xdb,
+	0x70, 0xb6, 0xe1, 0xdf, 0x1c, 0xb0, 0x3e, 0xf1, 0x97, 0x11, 0xf8, 0xd5, 0x4b, 0x3e, 0x61, 0xe4,
+	0x97, 0x9c, 0xca, 0xfb, 0x57, 0xc6, 0x1b, 0x0d, 0xde, 0x7b, 0xd6, 0x9c, 0x3c, 0x67, 0x28, 0xcd,
+	0xb6, 0xbc, 0xcf, 0x8f, 0x69, 0x66, 0x29, 0x32, 0xc5, 0x7e, 0xe9, 0x82, 0x8d, 0x29, 0xdf, 0x09,
+	0xb0, 0x80, 0x75, 0x67, 0x7f, 0x72, 0x57, 0x9a, 0xcf, 0xc1, 0x60, 0xd4, 0xfb, 0xa1, 0xf3, 0xac,
+	0x79, 0x6f, 0x60, 0xea, 0xde, 0x99, 0xa8, 0xeb, 0xce, 0xd0, 0xc4, 0xbd, 0x33, 0xd4, 0x12, 0x95,
+	0x1d, 0x1a, 0xde, 0x97, 0xd5, 0x4f, 0xbf, 0x86, 0x48, 0xd4, 0x7e, 0x30, 0xc0, 0x79, 0x6f, 0xfb,
+	0x93, 0x46, 0x3c, 0xf9, 0x1d, 0x99, 0x8d, 0x7e, 0xea, 0x82, 0xf5, 0x89, 0x1d, 0xb2, 0x88, 0xf3,
+	0x67, 0x7d, 0x50, 0x14, 0x71, 0xfe, 0xcc, 0xd6, 0xec, 0xb1, 0x67, 0xcd, 0xea, 0xa0, 0x71, 0xc6,
+	0xbe, 0x1a, 0x76, 0x46, 0x47, 0x5e, 0x65, 0x8d, 0x77, 0xbc, 0x7a, 0x31, 0x6b, 0x0c, 0xdd, 0xda,
+	0x70, 0xb6, 0x2b, 0xaf, 0x7e, 0xda, 0x2c, 0xf7, 0x1f, 0x6a, 0x56, 0x09, 0x11, 0xd9, 0x14, 0x77,
+	0xff, 0x3f, 0x0e, 0xb8, 0x1b, 0xb2, 0xee, 0x5c, 0xa5, 0xee, 0xaf, 0x8f, 0x56, 0x89, 0xe3, 0xac,
+	0xc2, 0x1c, 0x3b, 0xdf, 0xf9, 0xd0, 0x40, 0x63, 0xd6, 0x41, 0x34, 0xae, 0x32, 0x1e, 0xd7, 0x62,
+	0x4c, 0x55, 0xfd, 0xa9, 0xf5, 0x2f, 0x9b, 0xfe, 0xff, 0x82, 0xaf, 0xd8, 0xc5, 0xaf, 0xdc, 0xd2,
+	0x61, 0xb3, 0xf9, 0x3b, 0xf7, 0xce, 0xa1, 0x26, 0x6c, 0x46, 0xa2, 0xaa, 0x97, 0xd9, 0xea, 0x71,
+	0xbd, 0x6a, 0x2e, 0x16, 0x9f, 0x5a, 0x91, 0xd3, 0x66, 0x24, 0x4e, 0x73, 0x91, 0xd3, 0xc7, 0xf5,
+	0x53, 0x2b, 0xf2, 0x6f, 0xf7, 0xae, 0xde, 0x6f, 0x34, 0x9a, 0x91, 0x68, 0x34, 0x72, 0xa1, 0x46,
+	0xe3, 0x71, 0xbd, 0xd1, 0xb0, 0x62, 0x67, 0x2f, 0xa9, 0x77, 0xd6, 0xff, 0x1b, 0x00, 0x00, 0xff,
+	0xff, 0x4d, 0x42, 0xf6, 0x7e, 0xd6, 0x18, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ReachPlanServiceClient is the client API for ReachPlanService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ReachPlanServiceClient interface {
+	// Returns the list of plannable locations (for example, countries & DMAs).
+	ListPlannableLocations(ctx context.Context, in *ListPlannableLocationsRequest, opts ...grpc.CallOption) (*ListPlannableLocationsResponse, error)
+	// Returns the list of per-location plannable YouTube ad formats with allowed
+	// targeting.
+	ListPlannableProducts(ctx context.Context, in *ListPlannableProductsRequest, opts ...grpc.CallOption) (*ListPlannableProductsResponse, error)
+	// Generates a product mix ideas given a set of preferences. This method
+	// helps the advertiser to obtain a good mix of ad formats and budget
+	// allocations based on its preferences.
+	GenerateProductMixIdeas(ctx context.Context, in *GenerateProductMixIdeasRequest, opts ...grpc.CallOption) (*GenerateProductMixIdeasResponse, error)
+	// Generates a reach forecast for a given targeting / product mix.
+	GenerateReachForecast(ctx context.Context, in *GenerateReachForecastRequest, opts ...grpc.CallOption) (*GenerateReachForecastResponse, error)
+}
+
+type reachPlanServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewReachPlanServiceClient(cc grpc.ClientConnInterface) ReachPlanServiceClient {
+	return &reachPlanServiceClient{cc}
+}
+
+func (c *reachPlanServiceClient) ListPlannableLocations(ctx context.Context, in *ListPlannableLocationsRequest, opts ...grpc.CallOption) (*ListPlannableLocationsResponse, error) {
+	out := new(ListPlannableLocationsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ReachPlanService/ListPlannableLocations", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *reachPlanServiceClient) ListPlannableProducts(ctx context.Context, in *ListPlannableProductsRequest, opts ...grpc.CallOption) (*ListPlannableProductsResponse, error) {
+	out := new(ListPlannableProductsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ReachPlanService/ListPlannableProducts", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *reachPlanServiceClient) GenerateProductMixIdeas(ctx context.Context, in *GenerateProductMixIdeasRequest, opts ...grpc.CallOption) (*GenerateProductMixIdeasResponse, error) {
+	out := new(GenerateProductMixIdeasResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ReachPlanService/GenerateProductMixIdeas", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *reachPlanServiceClient) GenerateReachForecast(ctx context.Context, in *GenerateReachForecastRequest, opts ...grpc.CallOption) (*GenerateReachForecastResponse, error) {
+	out := new(GenerateReachForecastResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ReachPlanService/GenerateReachForecast", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ReachPlanServiceServer is the server API for ReachPlanService service.
+type ReachPlanServiceServer interface {
+	// Returns the list of plannable locations (for example, countries & DMAs).
+	ListPlannableLocations(context.Context, *ListPlannableLocationsRequest) (*ListPlannableLocationsResponse, error)
+	// Returns the list of per-location plannable YouTube ad formats with allowed
+	// targeting.
+	ListPlannableProducts(context.Context, *ListPlannableProductsRequest) (*ListPlannableProductsResponse, error)
+	// Generates a product mix ideas given a set of preferences. This method
+	// helps the advertiser to obtain a good mix of ad formats and budget
+	// allocations based on its preferences.
+	GenerateProductMixIdeas(context.Context, *GenerateProductMixIdeasRequest) (*GenerateProductMixIdeasResponse, error)
+	// Generates a reach forecast for a given targeting / product mix.
+	GenerateReachForecast(context.Context, *GenerateReachForecastRequest) (*GenerateReachForecastResponse, error)
+}
+
+// UnimplementedReachPlanServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedReachPlanServiceServer struct {
+}
+
+func (*UnimplementedReachPlanServiceServer) ListPlannableLocations(ctx context.Context, req *ListPlannableLocationsRequest) (*ListPlannableLocationsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListPlannableLocations not implemented")
+}
+func (*UnimplementedReachPlanServiceServer) ListPlannableProducts(ctx context.Context, req *ListPlannableProductsRequest) (*ListPlannableProductsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListPlannableProducts not implemented")
+}
+func (*UnimplementedReachPlanServiceServer) GenerateProductMixIdeas(ctx context.Context, req *GenerateProductMixIdeasRequest) (*GenerateProductMixIdeasResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GenerateProductMixIdeas not implemented")
+}
+func (*UnimplementedReachPlanServiceServer) GenerateReachForecast(ctx context.Context, req *GenerateReachForecastRequest) (*GenerateReachForecastResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GenerateReachForecast not implemented")
+}
+
+func RegisterReachPlanServiceServer(s *grpc.Server, srv ReachPlanServiceServer) {
+	s.RegisterService(&_ReachPlanService_serviceDesc, srv)
+}
+
+func _ReachPlanService_ListPlannableLocations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListPlannableLocationsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReachPlanServiceServer).ListPlannableLocations(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ReachPlanService/ListPlannableLocations",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReachPlanServiceServer).ListPlannableLocations(ctx, req.(*ListPlannableLocationsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReachPlanService_ListPlannableProducts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListPlannableProductsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReachPlanServiceServer).ListPlannableProducts(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ReachPlanService/ListPlannableProducts",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReachPlanServiceServer).ListPlannableProducts(ctx, req.(*ListPlannableProductsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReachPlanService_GenerateProductMixIdeas_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GenerateProductMixIdeasRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReachPlanServiceServer).GenerateProductMixIdeas(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ReachPlanService/GenerateProductMixIdeas",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReachPlanServiceServer).GenerateProductMixIdeas(ctx, req.(*GenerateProductMixIdeasRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _ReachPlanService_GenerateReachForecast_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GenerateReachForecastRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ReachPlanServiceServer).GenerateReachForecast(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ReachPlanService/GenerateReachForecast",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ReachPlanServiceServer).GenerateReachForecast(ctx, req.(*GenerateReachForecastRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ReachPlanService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ReachPlanService",
+	HandlerType: (*ReachPlanServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListPlannableLocations",
+			Handler:    _ReachPlanService_ListPlannableLocations_Handler,
+		},
+		{
+			MethodName: "ListPlannableProducts",
+			Handler:    _ReachPlanService_ListPlannableProducts_Handler,
+		},
+		{
+			MethodName: "GenerateProductMixIdeas",
+			Handler:    _ReachPlanService_GenerateProductMixIdeas_Handler,
+		},
+		{
+			MethodName: "GenerateReachForecast",
+			Handler:    _ReachPlanService_GenerateReachForecast_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/reach_plan_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/recommendation_service.pb.go b/googleapis/ads/googleads/v3/services/recommendation_service.pb.go
new file mode 100644
index 0000000..db7bffa
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/recommendation_service.pb.go
@@ -0,0 +1,1290 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/recommendation_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
+	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [RecommendationService.GetRecommendation][google.ads.googleads.v3.services.RecommendationService.GetRecommendation].
+type GetRecommendationRequest struct {
+	// Required. The resource name of the recommendation to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetRecommendationRequest) Reset()         { *m = GetRecommendationRequest{} }
+func (m *GetRecommendationRequest) String() string { return proto.CompactTextString(m) }
+func (*GetRecommendationRequest) ProtoMessage()    {}
+func (*GetRecommendationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{0}
+}
+
+func (m *GetRecommendationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetRecommendationRequest.Unmarshal(m, b)
+}
+func (m *GetRecommendationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetRecommendationRequest.Marshal(b, m, deterministic)
+}
+func (m *GetRecommendationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetRecommendationRequest.Merge(m, src)
+}
+func (m *GetRecommendationRequest) XXX_Size() int {
+	return xxx_messageInfo_GetRecommendationRequest.Size(m)
+}
+func (m *GetRecommendationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetRecommendationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetRecommendationRequest proto.InternalMessageInfo
+
+func (m *GetRecommendationRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [RecommendationService.ApplyRecommendation][google.ads.googleads.v3.services.RecommendationService.ApplyRecommendation].
+type ApplyRecommendationRequest struct {
+	// Required. The ID of the customer with the recommendation.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to apply recommendations.
+	// If partial_failure=false all recommendations should be of the same type
+	// There is a limit of 100 operations per request.
+	Operations []*ApplyRecommendationOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, operations will be carried
+	// out as a transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure       bool     `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ApplyRecommendationRequest) Reset()         { *m = ApplyRecommendationRequest{} }
+func (m *ApplyRecommendationRequest) String() string { return proto.CompactTextString(m) }
+func (*ApplyRecommendationRequest) ProtoMessage()    {}
+func (*ApplyRecommendationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{1}
+}
+
+func (m *ApplyRecommendationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationRequest.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationRequest.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationRequest.Merge(m, src)
+}
+func (m *ApplyRecommendationRequest) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationRequest.Size(m)
+}
+func (m *ApplyRecommendationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationRequest proto.InternalMessageInfo
+
+func (m *ApplyRecommendationRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *ApplyRecommendationRequest) GetOperations() []*ApplyRecommendationOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+// Information about the operation to apply a recommendation and any parameters
+// to customize it.
+type ApplyRecommendationOperation struct {
+	// The resource name of the recommendation to apply.
+	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	// Parameters to use when applying the recommendation.
+	//
+	// Types that are valid to be assigned to ApplyParameters:
+	//	*ApplyRecommendationOperation_CampaignBudget
+	//	*ApplyRecommendationOperation_TextAd
+	//	*ApplyRecommendationOperation_Keyword
+	//	*ApplyRecommendationOperation_TargetCpaOptIn
+	//	*ApplyRecommendationOperation_CalloutExtension
+	//	*ApplyRecommendationOperation_CallExtension
+	//	*ApplyRecommendationOperation_SitelinkExtension
+	//	*ApplyRecommendationOperation_MoveUnusedBudget
+	ApplyParameters      isApplyRecommendationOperation_ApplyParameters `protobuf_oneof:"apply_parameters"`
+	XXX_NoUnkeyedLiteral struct{}                                       `json:"-"`
+	XXX_unrecognized     []byte                                         `json:"-"`
+	XXX_sizecache        int32                                          `json:"-"`
+}
+
+func (m *ApplyRecommendationOperation) Reset()         { *m = ApplyRecommendationOperation{} }
+func (m *ApplyRecommendationOperation) String() string { return proto.CompactTextString(m) }
+func (*ApplyRecommendationOperation) ProtoMessage()    {}
+func (*ApplyRecommendationOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{2}
+}
+
+func (m *ApplyRecommendationOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationOperation.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationOperation.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationOperation.Merge(m, src)
+}
+func (m *ApplyRecommendationOperation) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationOperation.Size(m)
+}
+func (m *ApplyRecommendationOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationOperation proto.InternalMessageInfo
+
+func (m *ApplyRecommendationOperation) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+type isApplyRecommendationOperation_ApplyParameters interface {
+	isApplyRecommendationOperation_ApplyParameters()
+}
+
+type ApplyRecommendationOperation_CampaignBudget struct {
+	CampaignBudget *ApplyRecommendationOperation_CampaignBudgetParameters `protobuf:"bytes,2,opt,name=campaign_budget,json=campaignBudget,proto3,oneof"`
+}
+
+type ApplyRecommendationOperation_TextAd struct {
+	TextAd *ApplyRecommendationOperation_TextAdParameters `protobuf:"bytes,3,opt,name=text_ad,json=textAd,proto3,oneof"`
+}
+
+type ApplyRecommendationOperation_Keyword struct {
+	Keyword *ApplyRecommendationOperation_KeywordParameters `protobuf:"bytes,4,opt,name=keyword,proto3,oneof"`
+}
+
+type ApplyRecommendationOperation_TargetCpaOptIn struct {
+	TargetCpaOptIn *ApplyRecommendationOperation_TargetCpaOptInParameters `protobuf:"bytes,5,opt,name=target_cpa_opt_in,json=targetCpaOptIn,proto3,oneof"`
+}
+
+type ApplyRecommendationOperation_CalloutExtension struct {
+	CalloutExtension *ApplyRecommendationOperation_CalloutExtensionParameters `protobuf:"bytes,6,opt,name=callout_extension,json=calloutExtension,proto3,oneof"`
+}
+
+type ApplyRecommendationOperation_CallExtension struct {
+	CallExtension *ApplyRecommendationOperation_CallExtensionParameters `protobuf:"bytes,7,opt,name=call_extension,json=callExtension,proto3,oneof"`
+}
+
+type ApplyRecommendationOperation_SitelinkExtension struct {
+	SitelinkExtension *ApplyRecommendationOperation_SitelinkExtensionParameters `protobuf:"bytes,8,opt,name=sitelink_extension,json=sitelinkExtension,proto3,oneof"`
+}
+
+type ApplyRecommendationOperation_MoveUnusedBudget struct {
+	MoveUnusedBudget *ApplyRecommendationOperation_MoveUnusedBudgetParameters `protobuf:"bytes,9,opt,name=move_unused_budget,json=moveUnusedBudget,proto3,oneof"`
+}
+
+func (*ApplyRecommendationOperation_CampaignBudget) isApplyRecommendationOperation_ApplyParameters() {}
+
+func (*ApplyRecommendationOperation_TextAd) isApplyRecommendationOperation_ApplyParameters() {}
+
+func (*ApplyRecommendationOperation_Keyword) isApplyRecommendationOperation_ApplyParameters() {}
+
+func (*ApplyRecommendationOperation_TargetCpaOptIn) isApplyRecommendationOperation_ApplyParameters() {}
+
+func (*ApplyRecommendationOperation_CalloutExtension) isApplyRecommendationOperation_ApplyParameters() {
+}
+
+func (*ApplyRecommendationOperation_CallExtension) isApplyRecommendationOperation_ApplyParameters() {}
+
+func (*ApplyRecommendationOperation_SitelinkExtension) isApplyRecommendationOperation_ApplyParameters() {
+}
+
+func (*ApplyRecommendationOperation_MoveUnusedBudget) isApplyRecommendationOperation_ApplyParameters() {
+}
+
+func (m *ApplyRecommendationOperation) GetApplyParameters() isApplyRecommendationOperation_ApplyParameters {
+	if m != nil {
+		return m.ApplyParameters
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation) GetCampaignBudget() *ApplyRecommendationOperation_CampaignBudgetParameters {
+	if x, ok := m.GetApplyParameters().(*ApplyRecommendationOperation_CampaignBudget); ok {
+		return x.CampaignBudget
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation) GetTextAd() *ApplyRecommendationOperation_TextAdParameters {
+	if x, ok := m.GetApplyParameters().(*ApplyRecommendationOperation_TextAd); ok {
+		return x.TextAd
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation) GetKeyword() *ApplyRecommendationOperation_KeywordParameters {
+	if x, ok := m.GetApplyParameters().(*ApplyRecommendationOperation_Keyword); ok {
+		return x.Keyword
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation) GetTargetCpaOptIn() *ApplyRecommendationOperation_TargetCpaOptInParameters {
+	if x, ok := m.GetApplyParameters().(*ApplyRecommendationOperation_TargetCpaOptIn); ok {
+		return x.TargetCpaOptIn
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation) GetCalloutExtension() *ApplyRecommendationOperation_CalloutExtensionParameters {
+	if x, ok := m.GetApplyParameters().(*ApplyRecommendationOperation_CalloutExtension); ok {
+		return x.CalloutExtension
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation) GetCallExtension() *ApplyRecommendationOperation_CallExtensionParameters {
+	if x, ok := m.GetApplyParameters().(*ApplyRecommendationOperation_CallExtension); ok {
+		return x.CallExtension
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation) GetSitelinkExtension() *ApplyRecommendationOperation_SitelinkExtensionParameters {
+	if x, ok := m.GetApplyParameters().(*ApplyRecommendationOperation_SitelinkExtension); ok {
+		return x.SitelinkExtension
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation) GetMoveUnusedBudget() *ApplyRecommendationOperation_MoveUnusedBudgetParameters {
+	if x, ok := m.GetApplyParameters().(*ApplyRecommendationOperation_MoveUnusedBudget); ok {
+		return x.MoveUnusedBudget
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ApplyRecommendationOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ApplyRecommendationOperation_CampaignBudget)(nil),
+		(*ApplyRecommendationOperation_TextAd)(nil),
+		(*ApplyRecommendationOperation_Keyword)(nil),
+		(*ApplyRecommendationOperation_TargetCpaOptIn)(nil),
+		(*ApplyRecommendationOperation_CalloutExtension)(nil),
+		(*ApplyRecommendationOperation_CallExtension)(nil),
+		(*ApplyRecommendationOperation_SitelinkExtension)(nil),
+		(*ApplyRecommendationOperation_MoveUnusedBudget)(nil),
+	}
+}
+
+// Parameters to use when applying a campaign budget recommendation.
+type ApplyRecommendationOperation_CampaignBudgetParameters struct {
+	// New budget amount to set for target budget resource. This is a required
+	// field.
+	NewBudgetAmountMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=new_budget_amount_micros,json=newBudgetAmountMicros,proto3" json:"new_budget_amount_micros,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{}             `json:"-"`
+	XXX_unrecognized      []byte               `json:"-"`
+	XXX_sizecache         int32                `json:"-"`
+}
+
+func (m *ApplyRecommendationOperation_CampaignBudgetParameters) Reset() {
+	*m = ApplyRecommendationOperation_CampaignBudgetParameters{}
+}
+func (m *ApplyRecommendationOperation_CampaignBudgetParameters) String() string {
+	return proto.CompactTextString(m)
+}
+func (*ApplyRecommendationOperation_CampaignBudgetParameters) ProtoMessage() {}
+func (*ApplyRecommendationOperation_CampaignBudgetParameters) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{2, 0}
+}
+
+func (m *ApplyRecommendationOperation_CampaignBudgetParameters) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationOperation_CampaignBudgetParameters.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationOperation_CampaignBudgetParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationOperation_CampaignBudgetParameters.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationOperation_CampaignBudgetParameters) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationOperation_CampaignBudgetParameters.Merge(m, src)
+}
+func (m *ApplyRecommendationOperation_CampaignBudgetParameters) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationOperation_CampaignBudgetParameters.Size(m)
+}
+func (m *ApplyRecommendationOperation_CampaignBudgetParameters) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationOperation_CampaignBudgetParameters.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationOperation_CampaignBudgetParameters proto.InternalMessageInfo
+
+func (m *ApplyRecommendationOperation_CampaignBudgetParameters) GetNewBudgetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.NewBudgetAmountMicros
+	}
+	return nil
+}
+
+// Parameters to use when applying a text ad recommendation.
+type ApplyRecommendationOperation_TextAdParameters struct {
+	// New ad to add to recommended ad group. All necessary fields need to be
+	// set in this message. This is a required field.
+	Ad                   *resources.Ad `protobuf:"bytes,1,opt,name=ad,proto3" json:"ad,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *ApplyRecommendationOperation_TextAdParameters) Reset() {
+	*m = ApplyRecommendationOperation_TextAdParameters{}
+}
+func (m *ApplyRecommendationOperation_TextAdParameters) String() string {
+	return proto.CompactTextString(m)
+}
+func (*ApplyRecommendationOperation_TextAdParameters) ProtoMessage() {}
+func (*ApplyRecommendationOperation_TextAdParameters) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{2, 1}
+}
+
+func (m *ApplyRecommendationOperation_TextAdParameters) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationOperation_TextAdParameters.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationOperation_TextAdParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationOperation_TextAdParameters.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationOperation_TextAdParameters) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationOperation_TextAdParameters.Merge(m, src)
+}
+func (m *ApplyRecommendationOperation_TextAdParameters) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationOperation_TextAdParameters.Size(m)
+}
+func (m *ApplyRecommendationOperation_TextAdParameters) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationOperation_TextAdParameters.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationOperation_TextAdParameters proto.InternalMessageInfo
+
+func (m *ApplyRecommendationOperation_TextAdParameters) GetAd() *resources.Ad {
+	if m != nil {
+		return m.Ad
+	}
+	return nil
+}
+
+// Parameters to use when applying keyword recommendation.
+type ApplyRecommendationOperation_KeywordParameters struct {
+	// The ad group resource to add keyword to. This is a required field.
+	AdGroup *wrappers.StringValue `protobuf:"bytes,1,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
+	// The match type of the keyword. This is a required field.
+	MatchType enums.KeywordMatchTypeEnum_KeywordMatchType `protobuf:"varint,2,opt,name=match_type,json=matchType,proto3,enum=google.ads.googleads.v3.enums.KeywordMatchTypeEnum_KeywordMatchType" json:"match_type,omitempty"`
+	// Optional, CPC bid to set for the keyword. If not set, keyword will use
+	// bid based on bidding strategy used by target ad group.
+	CpcBidMicros         *wrappers.Int64Value `protobuf:"bytes,3,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *ApplyRecommendationOperation_KeywordParameters) Reset() {
+	*m = ApplyRecommendationOperation_KeywordParameters{}
+}
+func (m *ApplyRecommendationOperation_KeywordParameters) String() string {
+	return proto.CompactTextString(m)
+}
+func (*ApplyRecommendationOperation_KeywordParameters) ProtoMessage() {}
+func (*ApplyRecommendationOperation_KeywordParameters) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{2, 2}
+}
+
+func (m *ApplyRecommendationOperation_KeywordParameters) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationOperation_KeywordParameters.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationOperation_KeywordParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationOperation_KeywordParameters.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationOperation_KeywordParameters) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationOperation_KeywordParameters.Merge(m, src)
+}
+func (m *ApplyRecommendationOperation_KeywordParameters) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationOperation_KeywordParameters.Size(m)
+}
+func (m *ApplyRecommendationOperation_KeywordParameters) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationOperation_KeywordParameters.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationOperation_KeywordParameters proto.InternalMessageInfo
+
+func (m *ApplyRecommendationOperation_KeywordParameters) GetAdGroup() *wrappers.StringValue {
+	if m != nil {
+		return m.AdGroup
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation_KeywordParameters) GetMatchType() enums.KeywordMatchTypeEnum_KeywordMatchType {
+	if m != nil {
+		return m.MatchType
+	}
+	return enums.KeywordMatchTypeEnum_UNSPECIFIED
+}
+
+func (m *ApplyRecommendationOperation_KeywordParameters) GetCpcBidMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.CpcBidMicros
+	}
+	return nil
+}
+
+// Parameters to use when applying Target CPA recommendation.
+type ApplyRecommendationOperation_TargetCpaOptInParameters struct {
+	// Average CPA to use for Target CPA bidding strategy. This is a required
+	// field.
+	TargetCpaMicros *wrappers.Int64Value `protobuf:"bytes,1,opt,name=target_cpa_micros,json=targetCpaMicros,proto3" json:"target_cpa_micros,omitempty"`
+	// Optional, budget amount to set for the campaign.
+	NewCampaignBudgetAmountMicros *wrappers.Int64Value `protobuf:"bytes,2,opt,name=new_campaign_budget_amount_micros,json=newCampaignBudgetAmountMicros,proto3" json:"new_campaign_budget_amount_micros,omitempty"`
+	XXX_NoUnkeyedLiteral          struct{}             `json:"-"`
+	XXX_unrecognized              []byte               `json:"-"`
+	XXX_sizecache                 int32                `json:"-"`
+}
+
+func (m *ApplyRecommendationOperation_TargetCpaOptInParameters) Reset() {
+	*m = ApplyRecommendationOperation_TargetCpaOptInParameters{}
+}
+func (m *ApplyRecommendationOperation_TargetCpaOptInParameters) String() string {
+	return proto.CompactTextString(m)
+}
+func (*ApplyRecommendationOperation_TargetCpaOptInParameters) ProtoMessage() {}
+func (*ApplyRecommendationOperation_TargetCpaOptInParameters) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{2, 3}
+}
+
+func (m *ApplyRecommendationOperation_TargetCpaOptInParameters) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationOperation_TargetCpaOptInParameters.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationOperation_TargetCpaOptInParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationOperation_TargetCpaOptInParameters.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationOperation_TargetCpaOptInParameters) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationOperation_TargetCpaOptInParameters.Merge(m, src)
+}
+func (m *ApplyRecommendationOperation_TargetCpaOptInParameters) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationOperation_TargetCpaOptInParameters.Size(m)
+}
+func (m *ApplyRecommendationOperation_TargetCpaOptInParameters) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationOperation_TargetCpaOptInParameters.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationOperation_TargetCpaOptInParameters proto.InternalMessageInfo
+
+func (m *ApplyRecommendationOperation_TargetCpaOptInParameters) GetTargetCpaMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.TargetCpaMicros
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationOperation_TargetCpaOptInParameters) GetNewCampaignBudgetAmountMicros() *wrappers.Int64Value {
+	if m != nil {
+		return m.NewCampaignBudgetAmountMicros
+	}
+	return nil
+}
+
+// Parameters to use when applying callout extension recommendation.
+type ApplyRecommendationOperation_CalloutExtensionParameters struct {
+	// Callout extensions to be added. This is a required field.
+	CalloutExtensions    []*common.CalloutFeedItem `protobuf:"bytes,1,rep,name=callout_extensions,json=calloutExtensions,proto3" json:"callout_extensions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
+	XXX_unrecognized     []byte                    `json:"-"`
+	XXX_sizecache        int32                     `json:"-"`
+}
+
+func (m *ApplyRecommendationOperation_CalloutExtensionParameters) Reset() {
+	*m = ApplyRecommendationOperation_CalloutExtensionParameters{}
+}
+func (m *ApplyRecommendationOperation_CalloutExtensionParameters) String() string {
+	return proto.CompactTextString(m)
+}
+func (*ApplyRecommendationOperation_CalloutExtensionParameters) ProtoMessage() {}
+func (*ApplyRecommendationOperation_CalloutExtensionParameters) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{2, 4}
+}
+
+func (m *ApplyRecommendationOperation_CalloutExtensionParameters) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationOperation_CalloutExtensionParameters.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationOperation_CalloutExtensionParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationOperation_CalloutExtensionParameters.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationOperation_CalloutExtensionParameters) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationOperation_CalloutExtensionParameters.Merge(m, src)
+}
+func (m *ApplyRecommendationOperation_CalloutExtensionParameters) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationOperation_CalloutExtensionParameters.Size(m)
+}
+func (m *ApplyRecommendationOperation_CalloutExtensionParameters) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationOperation_CalloutExtensionParameters.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationOperation_CalloutExtensionParameters proto.InternalMessageInfo
+
+func (m *ApplyRecommendationOperation_CalloutExtensionParameters) GetCalloutExtensions() []*common.CalloutFeedItem {
+	if m != nil {
+		return m.CalloutExtensions
+	}
+	return nil
+}
+
+// Parameters to use when applying call extension recommendation.
+type ApplyRecommendationOperation_CallExtensionParameters struct {
+	// Call extensions to be added. This is a required field.
+	CallExtensions       []*common.CallFeedItem `protobuf:"bytes,1,rep,name=call_extensions,json=callExtensions,proto3" json:"call_extensions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *ApplyRecommendationOperation_CallExtensionParameters) Reset() {
+	*m = ApplyRecommendationOperation_CallExtensionParameters{}
+}
+func (m *ApplyRecommendationOperation_CallExtensionParameters) String() string {
+	return proto.CompactTextString(m)
+}
+func (*ApplyRecommendationOperation_CallExtensionParameters) ProtoMessage() {}
+func (*ApplyRecommendationOperation_CallExtensionParameters) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{2, 5}
+}
+
+func (m *ApplyRecommendationOperation_CallExtensionParameters) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationOperation_CallExtensionParameters.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationOperation_CallExtensionParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationOperation_CallExtensionParameters.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationOperation_CallExtensionParameters) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationOperation_CallExtensionParameters.Merge(m, src)
+}
+func (m *ApplyRecommendationOperation_CallExtensionParameters) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationOperation_CallExtensionParameters.Size(m)
+}
+func (m *ApplyRecommendationOperation_CallExtensionParameters) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationOperation_CallExtensionParameters.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationOperation_CallExtensionParameters proto.InternalMessageInfo
+
+func (m *ApplyRecommendationOperation_CallExtensionParameters) GetCallExtensions() []*common.CallFeedItem {
+	if m != nil {
+		return m.CallExtensions
+	}
+	return nil
+}
+
+// Parameters to use when applying sitelink extension recommendation.
+type ApplyRecommendationOperation_SitelinkExtensionParameters struct {
+	// Sitelink extensions to be added. This is a required field.
+	SitelinkExtensions   []*common.SitelinkFeedItem `protobuf:"bytes,1,rep,name=sitelink_extensions,json=sitelinkExtensions,proto3" json:"sitelink_extensions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *ApplyRecommendationOperation_SitelinkExtensionParameters) Reset() {
+	*m = ApplyRecommendationOperation_SitelinkExtensionParameters{}
+}
+func (m *ApplyRecommendationOperation_SitelinkExtensionParameters) String() string {
+	return proto.CompactTextString(m)
+}
+func (*ApplyRecommendationOperation_SitelinkExtensionParameters) ProtoMessage() {}
+func (*ApplyRecommendationOperation_SitelinkExtensionParameters) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{2, 6}
+}
+
+func (m *ApplyRecommendationOperation_SitelinkExtensionParameters) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationOperation_SitelinkExtensionParameters.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationOperation_SitelinkExtensionParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationOperation_SitelinkExtensionParameters.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationOperation_SitelinkExtensionParameters) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationOperation_SitelinkExtensionParameters.Merge(m, src)
+}
+func (m *ApplyRecommendationOperation_SitelinkExtensionParameters) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationOperation_SitelinkExtensionParameters.Size(m)
+}
+func (m *ApplyRecommendationOperation_SitelinkExtensionParameters) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationOperation_SitelinkExtensionParameters.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationOperation_SitelinkExtensionParameters proto.InternalMessageInfo
+
+func (m *ApplyRecommendationOperation_SitelinkExtensionParameters) GetSitelinkExtensions() []*common.SitelinkFeedItem {
+	if m != nil {
+		return m.SitelinkExtensions
+	}
+	return nil
+}
+
+// Parameters to use when applying move unused budget recommendation.
+type ApplyRecommendationOperation_MoveUnusedBudgetParameters struct {
+	// Budget amount to move from excess budget to constrained budget. This is
+	// a required field.
+	BudgetMicrosToMove   *wrappers.Int64Value `protobuf:"bytes,1,opt,name=budget_micros_to_move,json=budgetMicrosToMove,proto3" json:"budget_micros_to_move,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *ApplyRecommendationOperation_MoveUnusedBudgetParameters) Reset() {
+	*m = ApplyRecommendationOperation_MoveUnusedBudgetParameters{}
+}
+func (m *ApplyRecommendationOperation_MoveUnusedBudgetParameters) String() string {
+	return proto.CompactTextString(m)
+}
+func (*ApplyRecommendationOperation_MoveUnusedBudgetParameters) ProtoMessage() {}
+func (*ApplyRecommendationOperation_MoveUnusedBudgetParameters) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{2, 7}
+}
+
+func (m *ApplyRecommendationOperation_MoveUnusedBudgetParameters) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationOperation_MoveUnusedBudgetParameters.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationOperation_MoveUnusedBudgetParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationOperation_MoveUnusedBudgetParameters.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationOperation_MoveUnusedBudgetParameters) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationOperation_MoveUnusedBudgetParameters.Merge(m, src)
+}
+func (m *ApplyRecommendationOperation_MoveUnusedBudgetParameters) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationOperation_MoveUnusedBudgetParameters.Size(m)
+}
+func (m *ApplyRecommendationOperation_MoveUnusedBudgetParameters) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationOperation_MoveUnusedBudgetParameters.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationOperation_MoveUnusedBudgetParameters proto.InternalMessageInfo
+
+func (m *ApplyRecommendationOperation_MoveUnusedBudgetParameters) GetBudgetMicrosToMove() *wrappers.Int64Value {
+	if m != nil {
+		return m.BudgetMicrosToMove
+	}
+	return nil
+}
+
+// Response message for [RecommendationService.ApplyRecommendation][google.ads.googleads.v3.services.RecommendationService.ApplyRecommendation].
+type ApplyRecommendationResponse struct {
+	// Results of operations to apply recommendations.
+	Results []*ApplyRecommendationResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors)
+	// we return the RPC level error.
+	PartialFailureError  *status.Status `protobuf:"bytes,2,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
+}
+
+func (m *ApplyRecommendationResponse) Reset()         { *m = ApplyRecommendationResponse{} }
+func (m *ApplyRecommendationResponse) String() string { return proto.CompactTextString(m) }
+func (*ApplyRecommendationResponse) ProtoMessage()    {}
+func (*ApplyRecommendationResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{3}
+}
+
+func (m *ApplyRecommendationResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationResponse.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationResponse.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationResponse.Merge(m, src)
+}
+func (m *ApplyRecommendationResponse) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationResponse.Size(m)
+}
+func (m *ApplyRecommendationResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationResponse proto.InternalMessageInfo
+
+func (m *ApplyRecommendationResponse) GetResults() []*ApplyRecommendationResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+func (m *ApplyRecommendationResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+// The result of applying a recommendation.
+type ApplyRecommendationResult struct {
+	// Returned for successful applies.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ApplyRecommendationResult) Reset()         { *m = ApplyRecommendationResult{} }
+func (m *ApplyRecommendationResult) String() string { return proto.CompactTextString(m) }
+func (*ApplyRecommendationResult) ProtoMessage()    {}
+func (*ApplyRecommendationResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{4}
+}
+
+func (m *ApplyRecommendationResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ApplyRecommendationResult.Unmarshal(m, b)
+}
+func (m *ApplyRecommendationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ApplyRecommendationResult.Marshal(b, m, deterministic)
+}
+func (m *ApplyRecommendationResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ApplyRecommendationResult.Merge(m, src)
+}
+func (m *ApplyRecommendationResult) XXX_Size() int {
+	return xxx_messageInfo_ApplyRecommendationResult.Size(m)
+}
+func (m *ApplyRecommendationResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_ApplyRecommendationResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ApplyRecommendationResult proto.InternalMessageInfo
+
+func (m *ApplyRecommendationResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [RecommendationService.DismissRecommendation][google.ads.googleads.v3.services.RecommendationService.DismissRecommendation].
+type DismissRecommendationRequest struct {
+	// Required. The ID of the customer with the recommendation.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to dismiss recommendations.
+	// If partial_failure=false all recommendations should be of the same type
+	// There is a limit of 100 operations per request.
+	Operations []*DismissRecommendationRequest_DismissRecommendationOperation `protobuf:"bytes,3,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, operations will be carried in a
+	// single transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure       bool     `protobuf:"varint,2,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DismissRecommendationRequest) Reset()         { *m = DismissRecommendationRequest{} }
+func (m *DismissRecommendationRequest) String() string { return proto.CompactTextString(m) }
+func (*DismissRecommendationRequest) ProtoMessage()    {}
+func (*DismissRecommendationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{5}
+}
+
+func (m *DismissRecommendationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DismissRecommendationRequest.Unmarshal(m, b)
+}
+func (m *DismissRecommendationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DismissRecommendationRequest.Marshal(b, m, deterministic)
+}
+func (m *DismissRecommendationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DismissRecommendationRequest.Merge(m, src)
+}
+func (m *DismissRecommendationRequest) XXX_Size() int {
+	return xxx_messageInfo_DismissRecommendationRequest.Size(m)
+}
+func (m *DismissRecommendationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DismissRecommendationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DismissRecommendationRequest proto.InternalMessageInfo
+
+func (m *DismissRecommendationRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *DismissRecommendationRequest) GetOperations() []*DismissRecommendationRequest_DismissRecommendationOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *DismissRecommendationRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+// Operation to dismiss a single recommendation identified by resource_name.
+type DismissRecommendationRequest_DismissRecommendationOperation struct {
+	// The resource name of the recommendation to dismiss.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DismissRecommendationRequest_DismissRecommendationOperation) Reset() {
+	*m = DismissRecommendationRequest_DismissRecommendationOperation{}
+}
+func (m *DismissRecommendationRequest_DismissRecommendationOperation) String() string {
+	return proto.CompactTextString(m)
+}
+func (*DismissRecommendationRequest_DismissRecommendationOperation) ProtoMessage() {}
+func (*DismissRecommendationRequest_DismissRecommendationOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{5, 0}
+}
+
+func (m *DismissRecommendationRequest_DismissRecommendationOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DismissRecommendationRequest_DismissRecommendationOperation.Unmarshal(m, b)
+}
+func (m *DismissRecommendationRequest_DismissRecommendationOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DismissRecommendationRequest_DismissRecommendationOperation.Marshal(b, m, deterministic)
+}
+func (m *DismissRecommendationRequest_DismissRecommendationOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DismissRecommendationRequest_DismissRecommendationOperation.Merge(m, src)
+}
+func (m *DismissRecommendationRequest_DismissRecommendationOperation) XXX_Size() int {
+	return xxx_messageInfo_DismissRecommendationRequest_DismissRecommendationOperation.Size(m)
+}
+func (m *DismissRecommendationRequest_DismissRecommendationOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_DismissRecommendationRequest_DismissRecommendationOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DismissRecommendationRequest_DismissRecommendationOperation proto.InternalMessageInfo
+
+func (m *DismissRecommendationRequest_DismissRecommendationOperation) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Response message for [RecommendationService.DismissRecommendation][google.ads.googleads.v3.services.RecommendationService.DismissRecommendation].
+type DismissRecommendationResponse struct {
+	// Results of operations to dismiss recommendations.
+	Results []*DismissRecommendationResponse_DismissRecommendationResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors)
+	// we return the RPC level error.
+	PartialFailureError  *status.Status `protobuf:"bytes,2,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
+}
+
+func (m *DismissRecommendationResponse) Reset()         { *m = DismissRecommendationResponse{} }
+func (m *DismissRecommendationResponse) String() string { return proto.CompactTextString(m) }
+func (*DismissRecommendationResponse) ProtoMessage()    {}
+func (*DismissRecommendationResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{6}
+}
+
+func (m *DismissRecommendationResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DismissRecommendationResponse.Unmarshal(m, b)
+}
+func (m *DismissRecommendationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DismissRecommendationResponse.Marshal(b, m, deterministic)
+}
+func (m *DismissRecommendationResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DismissRecommendationResponse.Merge(m, src)
+}
+func (m *DismissRecommendationResponse) XXX_Size() int {
+	return xxx_messageInfo_DismissRecommendationResponse.Size(m)
+}
+func (m *DismissRecommendationResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_DismissRecommendationResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DismissRecommendationResponse proto.InternalMessageInfo
+
+func (m *DismissRecommendationResponse) GetResults() []*DismissRecommendationResponse_DismissRecommendationResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+func (m *DismissRecommendationResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+// The result of dismissing a recommendation.
+type DismissRecommendationResponse_DismissRecommendationResult struct {
+	// Returned for successful dismissals.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DismissRecommendationResponse_DismissRecommendationResult) Reset() {
+	*m = DismissRecommendationResponse_DismissRecommendationResult{}
+}
+func (m *DismissRecommendationResponse_DismissRecommendationResult) String() string {
+	return proto.CompactTextString(m)
+}
+func (*DismissRecommendationResponse_DismissRecommendationResult) ProtoMessage() {}
+func (*DismissRecommendationResponse_DismissRecommendationResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_973145c253202d21, []int{6, 0}
+}
+
+func (m *DismissRecommendationResponse_DismissRecommendationResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DismissRecommendationResponse_DismissRecommendationResult.Unmarshal(m, b)
+}
+func (m *DismissRecommendationResponse_DismissRecommendationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DismissRecommendationResponse_DismissRecommendationResult.Marshal(b, m, deterministic)
+}
+func (m *DismissRecommendationResponse_DismissRecommendationResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DismissRecommendationResponse_DismissRecommendationResult.Merge(m, src)
+}
+func (m *DismissRecommendationResponse_DismissRecommendationResult) XXX_Size() int {
+	return xxx_messageInfo_DismissRecommendationResponse_DismissRecommendationResult.Size(m)
+}
+func (m *DismissRecommendationResponse_DismissRecommendationResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_DismissRecommendationResponse_DismissRecommendationResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DismissRecommendationResponse_DismissRecommendationResult proto.InternalMessageInfo
+
+func (m *DismissRecommendationResponse_DismissRecommendationResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetRecommendationRequest)(nil), "google.ads.googleads.v3.services.GetRecommendationRequest")
+	proto.RegisterType((*ApplyRecommendationRequest)(nil), "google.ads.googleads.v3.services.ApplyRecommendationRequest")
+	proto.RegisterType((*ApplyRecommendationOperation)(nil), "google.ads.googleads.v3.services.ApplyRecommendationOperation")
+	proto.RegisterType((*ApplyRecommendationOperation_CampaignBudgetParameters)(nil), "google.ads.googleads.v3.services.ApplyRecommendationOperation.CampaignBudgetParameters")
+	proto.RegisterType((*ApplyRecommendationOperation_TextAdParameters)(nil), "google.ads.googleads.v3.services.ApplyRecommendationOperation.TextAdParameters")
+	proto.RegisterType((*ApplyRecommendationOperation_KeywordParameters)(nil), "google.ads.googleads.v3.services.ApplyRecommendationOperation.KeywordParameters")
+	proto.RegisterType((*ApplyRecommendationOperation_TargetCpaOptInParameters)(nil), "google.ads.googleads.v3.services.ApplyRecommendationOperation.TargetCpaOptInParameters")
+	proto.RegisterType((*ApplyRecommendationOperation_CalloutExtensionParameters)(nil), "google.ads.googleads.v3.services.ApplyRecommendationOperation.CalloutExtensionParameters")
+	proto.RegisterType((*ApplyRecommendationOperation_CallExtensionParameters)(nil), "google.ads.googleads.v3.services.ApplyRecommendationOperation.CallExtensionParameters")
+	proto.RegisterType((*ApplyRecommendationOperation_SitelinkExtensionParameters)(nil), "google.ads.googleads.v3.services.ApplyRecommendationOperation.SitelinkExtensionParameters")
+	proto.RegisterType((*ApplyRecommendationOperation_MoveUnusedBudgetParameters)(nil), "google.ads.googleads.v3.services.ApplyRecommendationOperation.MoveUnusedBudgetParameters")
+	proto.RegisterType((*ApplyRecommendationResponse)(nil), "google.ads.googleads.v3.services.ApplyRecommendationResponse")
+	proto.RegisterType((*ApplyRecommendationResult)(nil), "google.ads.googleads.v3.services.ApplyRecommendationResult")
+	proto.RegisterType((*DismissRecommendationRequest)(nil), "google.ads.googleads.v3.services.DismissRecommendationRequest")
+	proto.RegisterType((*DismissRecommendationRequest_DismissRecommendationOperation)(nil), "google.ads.googleads.v3.services.DismissRecommendationRequest.DismissRecommendationOperation")
+	proto.RegisterType((*DismissRecommendationResponse)(nil), "google.ads.googleads.v3.services.DismissRecommendationResponse")
+	proto.RegisterType((*DismissRecommendationResponse_DismissRecommendationResult)(nil), "google.ads.googleads.v3.services.DismissRecommendationResponse.DismissRecommendationResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/recommendation_service.proto", fileDescriptor_973145c253202d21)
+}
+
+var fileDescriptor_973145c253202d21 = []byte{
+	// 1396 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x41, 0x6f, 0xdc, 0xc4,
+	0x17, 0xff, 0xdb, 0xf9, 0xb7, 0x69, 0x27, 0x6d, 0x9a, 0x9d, 0x2a, 0x74, 0x71, 0xd2, 0x12, 0x96,
+	0x22, 0xa2, 0xa8, 0xb2, 0x69, 0x96, 0x16, 0xb4, 0x25, 0x05, 0x6f, 0x9b, 0xa6, 0x11, 0x6a, 0x1b,
+	0x6d, 0xd2, 0x54, 0x2d, 0x01, 0x6b, 0x62, 0x4f, 0xb7, 0xa6, 0xb6, 0x67, 0x98, 0x19, 0x27, 0x8d,
+	0x4a, 0x05, 0x54, 0x1c, 0x40, 0x1c, 0xf9, 0x06, 0x3d, 0xf2, 0x0d, 0x90, 0xb8, 0x72, 0xa9, 0x84,
+	0x84, 0xc4, 0xad, 0x27, 0x0e, 0x1c, 0x10, 0x1c, 0xe1, 0x03, 0x20, 0x8f, 0x3d, 0x9b, 0xf5, 0xee,
+	0x3a, 0xbb, 0xcd, 0x96, 0xdb, 0xec, 0xbc, 0x79, 0xbf, 0xdf, 0x7b, 0x6f, 0xe6, 0xfd, 0x66, 0xbc,
+	0x60, 0xa1, 0x49, 0x48, 0x33, 0xc0, 0x16, 0xf2, 0xb8, 0x95, 0x0e, 0x93, 0xd1, 0x56, 0xd5, 0xe2,
+	0x98, 0x6d, 0xf9, 0x2e, 0xe6, 0x16, 0xc3, 0x2e, 0x09, 0x43, 0x1c, 0x79, 0x48, 0xf8, 0x24, 0x72,
+	0xb2, 0x79, 0x93, 0x32, 0x22, 0x08, 0x9c, 0x49, 0x7d, 0x4c, 0xe4, 0x71, 0xb3, 0xe5, 0x6e, 0x6e,
+	0x55, 0x4d, 0xe5, 0x6e, 0x58, 0x45, 0x04, 0x09, 0x2a, 0x89, 0x2c, 0xfc, 0x40, 0xe0, 0x88, 0xfb,
+	0x24, 0xe2, 0x29, 0xa4, 0x71, 0xbe, 0xc8, 0x01, 0x47, 0x71, 0xc8, 0xad, 0xfb, 0x78, 0x67, 0x9b,
+	0x30, 0xcf, 0x09, 0x91, 0x70, 0xef, 0x39, 0x62, 0x87, 0x66, 0xa1, 0x18, 0x73, 0x45, 0x7e, 0x0c,
+	0x73, 0x12, 0xb3, 0x24, 0x15, 0xe4, 0xf5, 0xe3, 0xd8, 0x5d, 0x9b, 0x4f, 0x3b, 0xf3, 0x9b, 0x56,
+	0x7e, 0xd4, 0xb7, 0x50, 0x14, 0x11, 0x21, 0x8d, 0x2a, 0xf2, 0x13, 0x6d, 0x56, 0x37, 0xf0, 0x71,
+	0x24, 0x32, 0xc3, 0x2b, 0x6d, 0x86, 0xbb, 0x3e, 0x0e, 0x3c, 0x67, 0x13, 0xdf, 0x43, 0x5b, 0x3e,
+	0x61, 0xd9, 0x82, 0x53, 0xd9, 0x02, 0xf9, 0x6b, 0x33, 0xbe, 0x6b, 0x6d, 0x33, 0x44, 0x29, 0x66,
+	0x9d, 0xc8, 0x8c, 0xba, 0x16, 0x17, 0x48, 0xc4, 0x99, 0xa1, 0x72, 0x19, 0x94, 0x97, 0xb0, 0x68,
+	0xe4, 0x62, 0x6d, 0xe0, 0x4f, 0x63, 0xcc, 0x05, 0x9c, 0x05, 0x47, 0x55, 0x3a, 0x4e, 0x84, 0x42,
+	0x5c, 0xd6, 0x66, 0xb4, 0xd9, 0xc3, 0xf5, 0x91, 0xdf, 0x6c, 0xbd, 0x71, 0x44, 0x59, 0xae, 0xa3,
+	0x10, 0x57, 0x7e, 0xd1, 0x80, 0x61, 0x53, 0x1a, 0xec, 0xf4, 0x06, 0x3a, 0x0d, 0xc6, 0xdc, 0x98,
+	0x0b, 0x12, 0x62, 0xe6, 0xf8, 0x5e, 0x3b, 0x0c, 0x50, 0xf3, 0xcb, 0x1e, 0x74, 0x01, 0x20, 0x14,
+	0xb3, 0xb4, 0x22, 0x65, 0x7d, 0x66, 0x64, 0x76, 0x6c, 0xfe, 0xa2, 0xd9, 0xef, 0x7c, 0x98, 0x3d,
+	0x78, 0x6f, 0x28, 0x98, 0x8c, 0x64, 0x17, 0x16, 0xbe, 0x01, 0x8e, 0x51, 0xc4, 0x84, 0x8f, 0x02,
+	0xe7, 0x2e, 0xf2, 0x83, 0x98, 0xe1, 0xf2, 0xc8, 0x8c, 0x36, 0x7b, 0xa8, 0x31, 0x9e, 0x4d, 0x5f,
+	0x49, 0x67, 0x2b, 0x3f, 0x95, 0xc0, 0xf4, 0x5e, 0xd0, 0xf0, 0xb5, 0x9e, 0xd5, 0xc9, 0x17, 0x06,
+	0x3e, 0xd6, 0xc0, 0x31, 0x17, 0x85, 0x14, 0xf9, 0xcd, 0xc8, 0xd9, 0x8c, 0xbd, 0x26, 0x16, 0x65,
+	0x7d, 0x46, 0x9b, 0x1d, 0x9b, 0xbf, 0x35, 0x5c, 0x66, 0xe6, 0xa5, 0x0c, 0xb5, 0x2e, 0x41, 0x57,
+	0x10, 0x43, 0x21, 0x16, 0x98, 0xf1, 0xab, 0xff, 0x6b, 0x8c, 0xbb, 0x39, 0x1b, 0xfc, 0x04, 0x8c,
+	0x0a, 0xfc, 0x40, 0x38, 0xc8, 0x93, 0xb9, 0x8e, 0xcd, 0xdf, 0x18, 0x92, 0x7b, 0x0d, 0x3f, 0x10,
+	0xb6, 0x97, 0xe3, 0x3c, 0x28, 0xe4, 0x1c, 0x0c, 0xc0, 0x68, 0xd6, 0x60, 0xe5, 0xff, 0x4b, 0xae,
+	0x95, 0x21, 0xb9, 0x3e, 0x48, 0xd1, 0x72, 0x64, 0x8a, 0x02, 0x7e, 0xa5, 0x81, 0x92, 0x40, 0xac,
+	0x89, 0x85, 0xe3, 0x52, 0xe4, 0x10, 0x2a, 0x1c, 0x3f, 0x2a, 0x1f, 0x78, 0x21, 0x05, 0x5e, 0x93,
+	0xb8, 0x97, 0x28, 0xba, 0x41, 0xc5, 0x72, 0x94, 0x2f, 0xb0, 0xc8, 0xd9, 0xe0, 0xd7, 0x1a, 0x28,
+	0xb9, 0x28, 0x08, 0x48, 0x2c, 0x9c, 0x96, 0x1c, 0x95, 0x0f, 0xca, 0x30, 0x6e, 0x0f, 0xbd, 0xcf,
+	0x12, 0x77, 0x51, 0xc1, 0xe6, 0x02, 0x99, 0x70, 0x3b, 0xac, 0xf0, 0x73, 0x30, 0x9e, 0xcc, 0xb5,
+	0x85, 0x31, 0x2a, 0xc3, 0x58, 0x7f, 0x01, 0x61, 0xf4, 0x8e, 0xe1, 0xa8, 0xdb, 0x6e, 0x82, 0xdf,
+	0x6a, 0x00, 0x72, 0x5f, 0xe0, 0xc0, 0x8f, 0xee, 0xb7, 0x45, 0x71, 0x48, 0x46, 0x71, 0x67, 0xc8,
+	0x28, 0x56, 0x33, 0xe0, 0xde, 0x91, 0x94, 0x78, 0xa7, 0x19, 0x7e, 0xa3, 0x01, 0x18, 0x92, 0x2d,
+	0xec, 0xc4, 0x51, 0xcc, 0xb1, 0xa7, 0x5a, 0xf0, 0xf0, 0x0b, 0xd9, 0x9a, 0x6b, 0x64, 0x0b, 0xdf,
+	0x94, 0xb8, 0x3d, 0x9a, 0x70, 0x22, 0xec, 0xb0, 0x1a, 0x14, 0x94, 0x8b, 0x9a, 0x16, 0xae, 0x81,
+	0x72, 0x84, 0xb7, 0xb3, 0xf0, 0x1c, 0x14, 0x92, 0x38, 0x12, 0x4e, 0xe8, 0xbb, 0x8c, 0x70, 0xa9,
+	0x2b, 0x63, 0xf3, 0x53, 0x2a, 0x58, 0x25, 0xf1, 0xe6, 0x72, 0x24, 0xce, 0xbf, 0xb5, 0x8e, 0x82,
+	0x18, 0x37, 0x26, 0x23, 0xbc, 0x9d, 0x62, 0xda, 0xd2, 0xf5, 0x9a, 0xf4, 0x34, 0x96, 0xc1, 0x44,
+	0x67, 0xab, 0xc2, 0x73, 0x40, 0x47, 0x5e, 0x86, 0xf9, 0x7a, 0x61, 0x01, 0x5a, 0xd7, 0x98, 0x69,
+	0x7b, 0x0d, 0x1d, 0x79, 0xc6, 0x3f, 0x1a, 0x28, 0x75, 0xb5, 0x22, 0x7c, 0x1b, 0x1c, 0x42, 0x9e,
+	0xd3, 0x64, 0x24, 0xa6, 0x19, 0xe4, 0x74, 0x57, 0x98, 0xab, 0x82, 0xf9, 0x51, 0x33, 0x8d, 0x73,
+	0x14, 0x79, 0x4b, 0xc9, 0xe2, 0x44, 0xeb, 0x77, 0xef, 0x5f, 0xa9, 0x88, 0xe3, 0xf3, 0x97, 0x0b,
+	0xa3, 0x91, 0x17, 0xb7, 0x52, 0x82, 0x6b, 0x89, 0xdf, 0xda, 0x0e, 0xc5, 0x8b, 0x51, 0x1c, 0x76,
+	0x4d, 0x36, 0x0e, 0x87, 0x6a, 0x08, 0x6d, 0x30, 0xee, 0x52, 0xd7, 0xd9, 0xf4, 0x3d, 0x55, 0xca,
+	0x91, 0xfe, 0xa5, 0x3c, 0xe2, 0x52, 0xb7, 0xee, 0x7b, 0x59, 0x05, 0x9f, 0x6a, 0xa0, 0x5c, 0x24,
+	0x04, 0x70, 0x29, 0x27, 0x3e, 0x83, 0xef, 0xd6, 0xb1, 0x96, 0x7c, 0xa4, 0x2c, 0x10, 0x83, 0x57,
+	0x93, 0xdd, 0xef, 0xb8, 0x28, 0x3a, 0x8e, 0x81, 0xde, 0x1f, 0xf8, 0x64, 0x84, 0xb7, 0xf3, 0x47,
+	0x2c, 0x77, 0x1c, 0x3e, 0x03, 0x46, 0xb1, 0x9a, 0xc0, 0x8f, 0x01, 0xec, 0xd2, 0xb0, 0x24, 0x9d,
+	0xe4, 0x1a, 0xb6, 0x0a, 0xb7, 0x26, 0x7d, 0x84, 0x29, 0x95, 0xba, 0x82, 0xb1, 0xb7, 0x2c, 0x70,
+	0xd8, 0x28, 0x75, 0x0a, 0x13, 0x37, 0x28, 0x38, 0x51, 0x20, 0x22, 0xf0, 0x66, 0x72, 0x49, 0xb6,
+	0x8b, 0x96, 0xe2, 0x3d, 0x33, 0x08, 0x6f, 0x8b, 0x74, 0x3c, 0xa7, 0x44, 0xdc, 0xf8, 0x42, 0x03,
+	0x53, 0x7b, 0x28, 0x06, 0x44, 0xe0, 0x78, 0xb7, 0x52, 0x29, 0xea, 0x37, 0xfb, 0x51, 0x2b, 0xe4,
+	0x16, 0x3d, 0xec, 0x92, 0x1f, 0x6e, 0x04, 0xc0, 0x28, 0x56, 0x09, 0x78, 0x1d, 0x4c, 0x66, 0x5b,
+	0x9d, 0xee, 0xb1, 0x23, 0x88, 0x93, 0xc8, 0xc6, 0x20, 0x87, 0x08, 0xa6, 0x9e, 0xe9, 0xd6, 0xae,
+	0x91, 0x84, 0xa5, 0x0e, 0xc1, 0x04, 0x4a, 0x04, 0xcb, 0xa1, 0x2d, 0x8e, 0xca, 0x8f, 0x1a, 0x98,
+	0xea, 0xf9, 0x34, 0xe3, 0x94, 0x44, 0x1c, 0xc3, 0x9b, 0x60, 0x94, 0x61, 0x1e, 0x07, 0x42, 0x25,
+	0x7e, 0x61, 0x5f, 0xaa, 0xd8, 0x90, 0x18, 0x0d, 0x85, 0x05, 0xaf, 0x80, 0xc9, 0x8e, 0x77, 0x96,
+	0x83, 0x19, 0x23, 0x2c, 0x3b, 0xc6, 0x50, 0x91, 0x30, 0xea, 0x9a, 0xab, 0xf2, 0x41, 0xda, 0x38,
+	0x9e, 0x7f, 0x81, 0x2d, 0x26, 0xcb, 0x2b, 0xef, 0x83, 0x97, 0x0b, 0xd9, 0x06, 0x7a, 0x82, 0x55,
+	0x7e, 0xd0, 0xc1, 0xf4, 0x65, 0x9f, 0x87, 0x3e, 0xe7, 0xc3, 0xbc, 0x4e, 0x1f, 0x6b, 0xb9, 0xe7,
+	0xe9, 0x88, 0xac, 0xd5, 0x47, 0xfd, 0x6b, 0xb5, 0x17, 0x75, 0x6f, 0xe3, 0xf3, 0xbd, 0x5e, 0xf5,
+	0x5e, 0xaf, 0x57, 0x63, 0x11, 0x9c, 0xda, 0x1b, 0x7b, 0xb0, 0xda, 0x3d, 0xd1, 0xc1, 0xc9, 0x82,
+	0x04, 0xb2, 0xe3, 0x13, 0x77, 0x1e, 0x9f, 0x0f, 0xf7, 0x5d, 0x92, 0x14, 0xb1, 0xd0, 0xfa, 0x5f,
+	0x1c, 0x2f, 0xa3, 0x0e, 0xa6, 0xf6, 0xe0, 0x1b, 0xa8, 0x48, 0xf3, 0x7f, 0x1c, 0x00, 0x93, 0x79,
+	0xef, 0xd5, 0x34, 0x53, 0xf8, 0xb3, 0x06, 0x4a, 0x5d, 0x5f, 0x57, 0xb0, 0xd6, 0xbf, 0x42, 0x45,
+	0x9f, 0x64, 0xc6, 0xd9, 0x01, 0x6e, 0xec, 0xbc, 0x67, 0x65, 0xf9, 0x99, 0x9d, 0x4f, 0xe2, 0xf1,
+	0xaf, 0xbf, 0x7f, 0xa7, 0x57, 0xe1, 0xd9, 0xe4, 0x73, 0xf5, 0x61, 0xce, 0xb2, 0xa0, 0xce, 0x3b,
+	0xb7, 0xe6, 0x3a, 0xbe, 0x5f, 0xb9, 0x35, 0xf7, 0x08, 0xfe, 0xa5, 0x81, 0xe3, 0x3d, 0xba, 0x11,
+	0xbe, 0xbb, 0x4f, 0xc9, 0x48, 0x73, 0x5a, 0xd8, 0xaf, 0xe0, 0xc8, 0xf3, 0x52, 0xb9, 0xf5, 0xcc,
+	0x7e, 0xa9, 0xad, 0x7f, 0xcf, 0xec, 0xb6, 0x8b, 0x4c, 0xf4, 0x9d, 0x4a, 0x55, 0xfe, 0x59, 0xd0,
+	0xca, 0xec, 0x61, 0xdb, 0xe2, 0x85, 0xb9, 0x47, 0x9d, 0x79, 0xd6, 0xa4, 0x82, 0xd6, 0xb4, 0x39,
+	0xf8, 0xb7, 0x06, 0x26, 0x7b, 0x1e, 0x0e, 0x78, 0x71, 0xb8, 0xb6, 0x37, 0xde, 0x1b, 0xb2, 0x47,
+	0x2a, 0xb7, 0xf7, 0xce, 0xb9, 0x56, 0x39, 0xf7, 0x7c, 0x39, 0x7b, 0x29, 0x5b, 0x4d, 0x9b, 0x33,
+	0xa6, 0x9e, 0xda, 0xe5, 0xdd, 0x90, 0xb2, 0x11, 0xf5, 0x79, 0x72, 0xed, 0xd5, 0xbf, 0xd4, 0xc1,
+	0x69, 0x97, 0x84, 0x7d, 0xc3, 0xaf, 0x1b, 0x3d, 0x1b, 0x62, 0x25, 0xb9, 0xc7, 0x56, 0xb4, 0x3b,
+	0x57, 0x33, 0xff, 0x26, 0x09, 0x50, 0xd4, 0x34, 0x09, 0x6b, 0x5a, 0x4d, 0x1c, 0xc9, 0x5b, 0xce,
+	0xda, 0x65, 0x2c, 0xfe, 0x4b, 0xe9, 0x82, 0x1a, 0x3c, 0xd1, 0x47, 0x96, 0x6c, 0xfb, 0x7b, 0x7d,
+	0x66, 0x29, 0x05, 0xb4, 0x3d, 0x6e, 0xa6, 0xc3, 0x64, 0xb4, 0x5e, 0x35, 0x33, 0x62, 0xfe, 0x54,
+	0x2d, 0xd9, 0xb0, 0x3d, 0xbe, 0xd1, 0x5a, 0xb2, 0xb1, 0x5e, 0xdd, 0x50, 0x4b, 0xfe, 0xd4, 0x4f,
+	0xa7, 0xf3, 0xb5, 0x9a, 0xed, 0xf1, 0x5a, 0xad, 0xb5, 0xa8, 0x56, 0x5b, 0xaf, 0xd6, 0x6a, 0x6a,
+	0xd9, 0xe6, 0x41, 0x19, 0x67, 0xf5, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x39, 0x44, 0x72, 0xfa,
+	0xf9, 0x12, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// RecommendationServiceClient is the client API for RecommendationService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type RecommendationServiceClient interface {
+	// Returns the requested recommendation in full detail.
+	GetRecommendation(ctx context.Context, in *GetRecommendationRequest, opts ...grpc.CallOption) (*resources.Recommendation, error)
+	// Applies given recommendations with corresponding apply parameters.
+	ApplyRecommendation(ctx context.Context, in *ApplyRecommendationRequest, opts ...grpc.CallOption) (*ApplyRecommendationResponse, error)
+	// Dismisses given recommendations.
+	DismissRecommendation(ctx context.Context, in *DismissRecommendationRequest, opts ...grpc.CallOption) (*DismissRecommendationResponse, error)
+}
+
+type recommendationServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewRecommendationServiceClient(cc grpc.ClientConnInterface) RecommendationServiceClient {
+	return &recommendationServiceClient{cc}
+}
+
+func (c *recommendationServiceClient) GetRecommendation(ctx context.Context, in *GetRecommendationRequest, opts ...grpc.CallOption) (*resources.Recommendation, error) {
+	out := new(resources.Recommendation)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.RecommendationService/GetRecommendation", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *recommendationServiceClient) ApplyRecommendation(ctx context.Context, in *ApplyRecommendationRequest, opts ...grpc.CallOption) (*ApplyRecommendationResponse, error) {
+	out := new(ApplyRecommendationResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.RecommendationService/ApplyRecommendation", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *recommendationServiceClient) DismissRecommendation(ctx context.Context, in *DismissRecommendationRequest, opts ...grpc.CallOption) (*DismissRecommendationResponse, error) {
+	out := new(DismissRecommendationResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.RecommendationService/DismissRecommendation", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// RecommendationServiceServer is the server API for RecommendationService service.
+type RecommendationServiceServer interface {
+	// Returns the requested recommendation in full detail.
+	GetRecommendation(context.Context, *GetRecommendationRequest) (*resources.Recommendation, error)
+	// Applies given recommendations with corresponding apply parameters.
+	ApplyRecommendation(context.Context, *ApplyRecommendationRequest) (*ApplyRecommendationResponse, error)
+	// Dismisses given recommendations.
+	DismissRecommendation(context.Context, *DismissRecommendationRequest) (*DismissRecommendationResponse, error)
+}
+
+// UnimplementedRecommendationServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedRecommendationServiceServer struct {
+}
+
+func (*UnimplementedRecommendationServiceServer) GetRecommendation(ctx context.Context, req *GetRecommendationRequest) (*resources.Recommendation, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetRecommendation not implemented")
+}
+func (*UnimplementedRecommendationServiceServer) ApplyRecommendation(ctx context.Context, req *ApplyRecommendationRequest) (*ApplyRecommendationResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method ApplyRecommendation not implemented")
+}
+func (*UnimplementedRecommendationServiceServer) DismissRecommendation(ctx context.Context, req *DismissRecommendationRequest) (*DismissRecommendationResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method DismissRecommendation not implemented")
+}
+
+func RegisterRecommendationServiceServer(s *grpc.Server, srv RecommendationServiceServer) {
+	s.RegisterService(&_RecommendationService_serviceDesc, srv)
+}
+
+func _RecommendationService_GetRecommendation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetRecommendationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RecommendationServiceServer).GetRecommendation(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.RecommendationService/GetRecommendation",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RecommendationServiceServer).GetRecommendation(ctx, req.(*GetRecommendationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RecommendationService_ApplyRecommendation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ApplyRecommendationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RecommendationServiceServer).ApplyRecommendation(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.RecommendationService/ApplyRecommendation",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RecommendationServiceServer).ApplyRecommendation(ctx, req.(*ApplyRecommendationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RecommendationService_DismissRecommendation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DismissRecommendationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RecommendationServiceServer).DismissRecommendation(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.RecommendationService/DismissRecommendation",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RecommendationServiceServer).DismissRecommendation(ctx, req.(*DismissRecommendationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _RecommendationService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.RecommendationService",
+	HandlerType: (*RecommendationServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetRecommendation",
+			Handler:    _RecommendationService_GetRecommendation_Handler,
+		},
+		{
+			MethodName: "ApplyRecommendation",
+			Handler:    _RecommendationService_ApplyRecommendation_Handler,
+		},
+		{
+			MethodName: "DismissRecommendation",
+			Handler:    _RecommendationService_DismissRecommendation_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/recommendation_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/remarketing_action_service.pb.go b/googleapis/ads/googleads/v3/services/remarketing_action_service.pb.go
new file mode 100644
index 0000000..a23c748
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/remarketing_action_service.pb.go
@@ -0,0 +1,513 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/remarketing_action_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [RemarketingActionService.GetRemarketingAction][google.ads.googleads.v3.services.RemarketingActionService.GetRemarketingAction].
+type GetRemarketingActionRequest struct {
+	// Required. The resource name of the remarketing action to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetRemarketingActionRequest) Reset()         { *m = GetRemarketingActionRequest{} }
+func (m *GetRemarketingActionRequest) String() string { return proto.CompactTextString(m) }
+func (*GetRemarketingActionRequest) ProtoMessage()    {}
+func (*GetRemarketingActionRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_890528f85438186a, []int{0}
+}
+
+func (m *GetRemarketingActionRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetRemarketingActionRequest.Unmarshal(m, b)
+}
+func (m *GetRemarketingActionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetRemarketingActionRequest.Marshal(b, m, deterministic)
+}
+func (m *GetRemarketingActionRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetRemarketingActionRequest.Merge(m, src)
+}
+func (m *GetRemarketingActionRequest) XXX_Size() int {
+	return xxx_messageInfo_GetRemarketingActionRequest.Size(m)
+}
+func (m *GetRemarketingActionRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetRemarketingActionRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetRemarketingActionRequest proto.InternalMessageInfo
+
+func (m *GetRemarketingActionRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [RemarketingActionService.MutateRemarketingActions][google.ads.googleads.v3.services.RemarketingActionService.MutateRemarketingActions].
+type MutateRemarketingActionsRequest struct {
+	// Required. The ID of the customer whose remarketing actions are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual remarketing actions.
+	Operations []*RemarketingActionOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateRemarketingActionsRequest) Reset()         { *m = MutateRemarketingActionsRequest{} }
+func (m *MutateRemarketingActionsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateRemarketingActionsRequest) ProtoMessage()    {}
+func (*MutateRemarketingActionsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_890528f85438186a, []int{1}
+}
+
+func (m *MutateRemarketingActionsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateRemarketingActionsRequest.Unmarshal(m, b)
+}
+func (m *MutateRemarketingActionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateRemarketingActionsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateRemarketingActionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateRemarketingActionsRequest.Merge(m, src)
+}
+func (m *MutateRemarketingActionsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateRemarketingActionsRequest.Size(m)
+}
+func (m *MutateRemarketingActionsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateRemarketingActionsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateRemarketingActionsRequest proto.InternalMessageInfo
+
+func (m *MutateRemarketingActionsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateRemarketingActionsRequest) GetOperations() []*RemarketingActionOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateRemarketingActionsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateRemarketingActionsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update) on a remarketing action.
+type RemarketingActionOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*RemarketingActionOperation_Create
+	//	*RemarketingActionOperation_Update
+	Operation            isRemarketingActionOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *RemarketingActionOperation) Reset()         { *m = RemarketingActionOperation{} }
+func (m *RemarketingActionOperation) String() string { return proto.CompactTextString(m) }
+func (*RemarketingActionOperation) ProtoMessage()    {}
+func (*RemarketingActionOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_890528f85438186a, []int{2}
+}
+
+func (m *RemarketingActionOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RemarketingActionOperation.Unmarshal(m, b)
+}
+func (m *RemarketingActionOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RemarketingActionOperation.Marshal(b, m, deterministic)
+}
+func (m *RemarketingActionOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RemarketingActionOperation.Merge(m, src)
+}
+func (m *RemarketingActionOperation) XXX_Size() int {
+	return xxx_messageInfo_RemarketingActionOperation.Size(m)
+}
+func (m *RemarketingActionOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_RemarketingActionOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RemarketingActionOperation proto.InternalMessageInfo
+
+func (m *RemarketingActionOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isRemarketingActionOperation_Operation interface {
+	isRemarketingActionOperation_Operation()
+}
+
+type RemarketingActionOperation_Create struct {
+	Create *resources.RemarketingAction `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type RemarketingActionOperation_Update struct {
+	Update *resources.RemarketingAction `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+func (*RemarketingActionOperation_Create) isRemarketingActionOperation_Operation() {}
+
+func (*RemarketingActionOperation_Update) isRemarketingActionOperation_Operation() {}
+
+func (m *RemarketingActionOperation) GetOperation() isRemarketingActionOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *RemarketingActionOperation) GetCreate() *resources.RemarketingAction {
+	if x, ok := m.GetOperation().(*RemarketingActionOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *RemarketingActionOperation) GetUpdate() *resources.RemarketingAction {
+	if x, ok := m.GetOperation().(*RemarketingActionOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*RemarketingActionOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*RemarketingActionOperation_Create)(nil),
+		(*RemarketingActionOperation_Update)(nil),
+	}
+}
+
+// Response message for remarketing action mutate.
+type MutateRemarketingActionsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateRemarketingActionResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *MutateRemarketingActionsResponse) Reset()         { *m = MutateRemarketingActionsResponse{} }
+func (m *MutateRemarketingActionsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateRemarketingActionsResponse) ProtoMessage()    {}
+func (*MutateRemarketingActionsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_890528f85438186a, []int{3}
+}
+
+func (m *MutateRemarketingActionsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateRemarketingActionsResponse.Unmarshal(m, b)
+}
+func (m *MutateRemarketingActionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateRemarketingActionsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateRemarketingActionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateRemarketingActionsResponse.Merge(m, src)
+}
+func (m *MutateRemarketingActionsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateRemarketingActionsResponse.Size(m)
+}
+func (m *MutateRemarketingActionsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateRemarketingActionsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateRemarketingActionsResponse proto.InternalMessageInfo
+
+func (m *MutateRemarketingActionsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateRemarketingActionsResponse) GetResults() []*MutateRemarketingActionResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the remarketing action mutate.
+type MutateRemarketingActionResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateRemarketingActionResult) Reset()         { *m = MutateRemarketingActionResult{} }
+func (m *MutateRemarketingActionResult) String() string { return proto.CompactTextString(m) }
+func (*MutateRemarketingActionResult) ProtoMessage()    {}
+func (*MutateRemarketingActionResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_890528f85438186a, []int{4}
+}
+
+func (m *MutateRemarketingActionResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateRemarketingActionResult.Unmarshal(m, b)
+}
+func (m *MutateRemarketingActionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateRemarketingActionResult.Marshal(b, m, deterministic)
+}
+func (m *MutateRemarketingActionResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateRemarketingActionResult.Merge(m, src)
+}
+func (m *MutateRemarketingActionResult) XXX_Size() int {
+	return xxx_messageInfo_MutateRemarketingActionResult.Size(m)
+}
+func (m *MutateRemarketingActionResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateRemarketingActionResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateRemarketingActionResult proto.InternalMessageInfo
+
+func (m *MutateRemarketingActionResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetRemarketingActionRequest)(nil), "google.ads.googleads.v3.services.GetRemarketingActionRequest")
+	proto.RegisterType((*MutateRemarketingActionsRequest)(nil), "google.ads.googleads.v3.services.MutateRemarketingActionsRequest")
+	proto.RegisterType((*RemarketingActionOperation)(nil), "google.ads.googleads.v3.services.RemarketingActionOperation")
+	proto.RegisterType((*MutateRemarketingActionsResponse)(nil), "google.ads.googleads.v3.services.MutateRemarketingActionsResponse")
+	proto.RegisterType((*MutateRemarketingActionResult)(nil), "google.ads.googleads.v3.services.MutateRemarketingActionResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/remarketing_action_service.proto", fileDescriptor_890528f85438186a)
+}
+
+var fileDescriptor_890528f85438186a = []byte{
+	// 757 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xcd, 0x6a, 0xdb, 0x4a,
+	0x14, 0xc7, 0xaf, 0xe4, 0x90, 0x7b, 0x33, 0x4e, 0xee, 0x85, 0xb9, 0xf7, 0xb6, 0xc2, 0x69, 0x88,
+	0x51, 0x03, 0x35, 0xa6, 0x48, 0x60, 0x87, 0x16, 0x94, 0x84, 0x22, 0xd3, 0xc6, 0x29, 0x34, 0x1f,
+	0x28, 0x10, 0x68, 0x6b, 0x10, 0x13, 0x69, 0xe2, 0x8a, 0x48, 0x1a, 0x75, 0x66, 0x64, 0x08, 0x21,
+	0x9b, 0x52, 0xfa, 0x02, 0xed, 0x13, 0x74, 0xd9, 0xf7, 0xe8, 0x26, 0xdb, 0xae, 0x9a, 0x55, 0x17,
+	0x5d, 0xf5, 0x09, 0xba, 0x2a, 0x45, 0x1f, 0xe3, 0x8f, 0xd8, 0x8a, 0x21, 0xd9, 0x1d, 0xcf, 0xf9,
+	0xeb, 0x77, 0xce, 0x99, 0x73, 0xe6, 0x18, 0x98, 0x5d, 0x42, 0xba, 0x3e, 0xd6, 0x91, 0xcb, 0xf4,
+	0xcc, 0x4c, 0xac, 0x5e, 0x53, 0x67, 0x98, 0xf6, 0x3c, 0x07, 0x33, 0x9d, 0xe2, 0x00, 0xd1, 0x63,
+	0xcc, 0xbd, 0xb0, 0x6b, 0x23, 0x87, 0x7b, 0x24, 0xb4, 0x73, 0x9f, 0x16, 0x51, 0xc2, 0x09, 0xac,
+	0x66, 0xdf, 0x69, 0xc8, 0x65, 0x5a, 0x1f, 0xa1, 0xf5, 0x9a, 0x9a, 0x40, 0x54, 0x8c, 0xa2, 0x20,
+	0x14, 0x33, 0x12, 0xd3, 0xc9, 0x51, 0x32, 0x7a, 0xe5, 0x8e, 0xf8, 0x36, 0xf2, 0x74, 0x14, 0x86,
+	0x84, 0xa3, 0xc4, 0xc9, 0x72, 0xef, 0xed, 0x21, 0xaf, 0xe3, 0x7b, 0x38, 0xe4, 0xb9, 0x63, 0x79,
+	0xc8, 0x71, 0xe4, 0x61, 0xdf, 0xb5, 0x0f, 0xf1, 0x2b, 0xd4, 0xf3, 0x08, 0xcd, 0x05, 0x79, 0xd6,
+	0x7a, 0xfa, 0xeb, 0x30, 0x3e, 0xca, 0x55, 0x01, 0x62, 0xc7, 0x97, 0xd8, 0x34, 0x72, 0x74, 0xc6,
+	0x11, 0x8f, 0xf3, 0xa0, 0x6a, 0x1b, 0x2c, 0xb6, 0x31, 0xb7, 0x06, 0x19, 0x9b, 0x69, 0xc2, 0x16,
+	0x7e, 0x1d, 0x63, 0xc6, 0x61, 0x0d, 0x2c, 0x88, 0xba, 0xec, 0x10, 0x05, 0x58, 0x91, 0xaa, 0x52,
+	0x6d, 0xae, 0x55, 0xfa, 0x66, 0xca, 0xd6, 0xbc, 0xf0, 0xec, 0xa0, 0x00, 0xab, 0x3f, 0x25, 0xb0,
+	0xbc, 0x1d, 0x73, 0xc4, 0xf1, 0x18, 0x8c, 0x09, 0xda, 0x0a, 0x28, 0x3b, 0x31, 0xe3, 0x24, 0xc0,
+	0xd4, 0xf6, 0xdc, 0x61, 0x16, 0x10, 0xe7, 0x4f, 0x5d, 0x88, 0x00, 0x20, 0x11, 0xa6, 0xd9, 0xdd,
+	0x28, 0x72, 0xb5, 0x54, 0x2b, 0x37, 0xd6, 0xb5, 0x69, 0x8d, 0xd1, 0xc6, 0xc2, 0xee, 0x0a, 0x48,
+	0x1e, 0x62, 0x00, 0x85, 0xf7, 0xc0, 0x3f, 0x11, 0xa2, 0xdc, 0x43, 0xbe, 0x7d, 0x84, 0x3c, 0x3f,
+	0xa6, 0x58, 0x29, 0x55, 0xa5, 0xda, 0x5f, 0xd6, 0xdf, 0xf9, 0xf1, 0x66, 0x76, 0x0a, 0xef, 0x82,
+	0x85, 0x1e, 0xf2, 0x3d, 0x17, 0x71, 0x6c, 0x93, 0xd0, 0x3f, 0x51, 0x66, 0x52, 0xd9, 0xbc, 0x38,
+	0xdc, 0x0d, 0xfd, 0x13, 0xf5, 0x9d, 0x0c, 0x2a, 0xc5, 0xd1, 0xe1, 0x1a, 0x28, 0xc7, 0x51, 0x4a,
+	0x48, 0x1a, 0x92, 0x12, 0xca, 0x8d, 0x8a, 0x28, 0x48, 0xf4, 0x4c, 0xdb, 0x4c, 0x7a, 0xb6, 0x8d,
+	0xd8, 0xb1, 0x05, 0x32, 0x79, 0x62, 0xc3, 0x1d, 0x30, 0xeb, 0x50, 0x8c, 0x78, 0x76, 0xf3, 0xe5,
+	0xc6, 0x6a, 0xe1, 0x45, 0xf4, 0xe7, 0x6f, 0xfc, 0x26, 0xb6, 0xfe, 0xb0, 0x72, 0x4a, 0xc2, 0xcb,
+	0xe8, 0x8a, 0x7c, 0x33, 0x5e, 0x46, 0x69, 0x95, 0xc1, 0x5c, 0xff, 0x5e, 0xd5, 0xcf, 0x12, 0xa8,
+	0x16, 0xcf, 0x00, 0x8b, 0x48, 0xc8, 0x30, 0xdc, 0x04, 0xff, 0x5f, 0xba, 0x7b, 0x1b, 0x53, 0x4a,
+	0x68, 0xda, 0x81, 0x72, 0x03, 0x8a, 0x84, 0x68, 0xe4, 0x68, 0xfb, 0xe9, 0xa8, 0x5a, 0xff, 0x8e,
+	0x76, 0xe5, 0x49, 0x22, 0x87, 0xcf, 0xc1, 0x9f, 0x14, 0xb3, 0xd8, 0xe7, 0x62, 0x46, 0x1e, 0x4d,
+	0x9f, 0x91, 0x82, 0xe4, 0xac, 0x94, 0x63, 0x09, 0x9e, 0xfa, 0x18, 0x2c, 0x5d, 0xa9, 0x4c, 0xc6,
+	0x62, 0xc2, 0xb3, 0x18, 0x7d, 0x11, 0x8d, 0x0f, 0x33, 0x40, 0x19, 0x03, 0xec, 0x67, 0xa9, 0xc0,
+	0xaf, 0x12, 0xf8, 0x6f, 0xd2, 0xc3, 0x83, 0x1b, 0xd3, 0xab, 0xb8, 0xe2, 0xc1, 0x56, 0xae, 0xd5,
+	0x4f, 0xf5, 0xd9, 0x85, 0x39, 0x5a, 0xd0, 0x9b, 0x2f, 0xdf, 0xdf, 0xcb, 0x0f, 0xe0, 0x6a, 0xb2,
+	0xd8, 0x4e, 0x47, 0x3c, 0x1b, 0xe2, 0xa5, 0x32, 0xbd, 0x3e, 0xbc, 0xe9, 0xf2, 0x36, 0xeb, 0xf5,
+	0x33, 0xf8, 0x4b, 0x02, 0x4a, 0xd1, 0x18, 0x40, 0xf3, 0xda, 0x5d, 0x12, 0x6b, 0xa4, 0xd2, 0xba,
+	0x09, 0x22, 0x9b, 0x42, 0xf5, 0xe5, 0x85, 0x79, 0x6b, 0x68, 0x17, 0xdd, 0x1f, 0x2c, 0x87, 0xb4,
+	0xf4, 0x75, 0xf5, 0x61, 0x52, 0xfa, 0xa0, 0xd6, 0xd3, 0x21, 0xf1, 0x46, 0xfd, 0x6c, 0x42, 0xe5,
+	0x46, 0x90, 0xc6, 0x34, 0xa4, 0x7a, 0x65, 0xf1, 0xdc, 0x54, 0x06, 0x79, 0xe5, 0x56, 0xe4, 0x31,
+	0xcd, 0x21, 0x41, 0xeb, 0xad, 0x0c, 0x56, 0x1c, 0x12, 0x4c, 0xad, 0xa1, 0xb5, 0x54, 0x34, 0x3c,
+	0x7b, 0xc9, 0xca, 0xd8, 0x93, 0x5e, 0x6c, 0xe5, 0x88, 0x2e, 0xf1, 0x51, 0xd8, 0xd5, 0x08, 0xed,
+	0xea, 0x5d, 0x1c, 0xa6, 0x0b, 0x45, 0x1f, 0x04, 0x2d, 0xfe, 0x3b, 0x5c, 0x13, 0xc6, 0x47, 0xb9,
+	0xd4, 0x36, 0xcd, 0x4f, 0x72, 0xb5, 0x9d, 0x01, 0x4d, 0x97, 0x69, 0x99, 0x99, 0x58, 0x07, 0x4d,
+	0x2d, 0x0f, 0xcc, 0xce, 0x85, 0xa4, 0x63, 0xba, 0xac, 0xd3, 0x97, 0x74, 0x0e, 0x9a, 0x1d, 0x21,
+	0xf9, 0x21, 0xaf, 0x64, 0xe7, 0x86, 0x61, 0xba, 0xcc, 0x30, 0xfa, 0x22, 0xc3, 0x38, 0x68, 0x1a,
+	0x86, 0x90, 0x1d, 0xce, 0xa6, 0x79, 0x36, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x9f, 0x1a, 0x5b,
+	0x02, 0xb5, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// RemarketingActionServiceClient is the client API for RemarketingActionService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type RemarketingActionServiceClient interface {
+	// Returns the requested remarketing action in full detail.
+	GetRemarketingAction(ctx context.Context, in *GetRemarketingActionRequest, opts ...grpc.CallOption) (*resources.RemarketingAction, error)
+	// Creates or updates remarketing actions. Operation statuses are returned.
+	MutateRemarketingActions(ctx context.Context, in *MutateRemarketingActionsRequest, opts ...grpc.CallOption) (*MutateRemarketingActionsResponse, error)
+}
+
+type remarketingActionServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewRemarketingActionServiceClient(cc grpc.ClientConnInterface) RemarketingActionServiceClient {
+	return &remarketingActionServiceClient{cc}
+}
+
+func (c *remarketingActionServiceClient) GetRemarketingAction(ctx context.Context, in *GetRemarketingActionRequest, opts ...grpc.CallOption) (*resources.RemarketingAction, error) {
+	out := new(resources.RemarketingAction)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.RemarketingActionService/GetRemarketingAction", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *remarketingActionServiceClient) MutateRemarketingActions(ctx context.Context, in *MutateRemarketingActionsRequest, opts ...grpc.CallOption) (*MutateRemarketingActionsResponse, error) {
+	out := new(MutateRemarketingActionsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.RemarketingActionService/MutateRemarketingActions", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// RemarketingActionServiceServer is the server API for RemarketingActionService service.
+type RemarketingActionServiceServer interface {
+	// Returns the requested remarketing action in full detail.
+	GetRemarketingAction(context.Context, *GetRemarketingActionRequest) (*resources.RemarketingAction, error)
+	// Creates or updates remarketing actions. Operation statuses are returned.
+	MutateRemarketingActions(context.Context, *MutateRemarketingActionsRequest) (*MutateRemarketingActionsResponse, error)
+}
+
+// UnimplementedRemarketingActionServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedRemarketingActionServiceServer struct {
+}
+
+func (*UnimplementedRemarketingActionServiceServer) GetRemarketingAction(ctx context.Context, req *GetRemarketingActionRequest) (*resources.RemarketingAction, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetRemarketingAction not implemented")
+}
+func (*UnimplementedRemarketingActionServiceServer) MutateRemarketingActions(ctx context.Context, req *MutateRemarketingActionsRequest) (*MutateRemarketingActionsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateRemarketingActions not implemented")
+}
+
+func RegisterRemarketingActionServiceServer(s *grpc.Server, srv RemarketingActionServiceServer) {
+	s.RegisterService(&_RemarketingActionService_serviceDesc, srv)
+}
+
+func _RemarketingActionService_GetRemarketingAction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetRemarketingActionRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RemarketingActionServiceServer).GetRemarketingAction(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.RemarketingActionService/GetRemarketingAction",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RemarketingActionServiceServer).GetRemarketingAction(ctx, req.(*GetRemarketingActionRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RemarketingActionService_MutateRemarketingActions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateRemarketingActionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RemarketingActionServiceServer).MutateRemarketingActions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.RemarketingActionService/MutateRemarketingActions",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RemarketingActionServiceServer).MutateRemarketingActions(ctx, req.(*MutateRemarketingActionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _RemarketingActionService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.RemarketingActionService",
+	HandlerType: (*RemarketingActionServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetRemarketingAction",
+			Handler:    _RemarketingActionService_GetRemarketingAction_Handler,
+		},
+		{
+			MethodName: "MutateRemarketingActions",
+			Handler:    _RemarketingActionService_MutateRemarketingActions_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/remarketing_action_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/search_term_view_service.pb.go b/googleapis/ads/googleads/v3/services/search_term_view_service.pb.go
new file mode 100644
index 0000000..0d71709
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/search_term_view_service.pb.go
@@ -0,0 +1,190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/search_term_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [SearchTermViewService.GetSearchTermView][google.ads.googleads.v3.services.SearchTermViewService.GetSearchTermView].
+type GetSearchTermViewRequest struct {
+	// Required. The resource name of the search term view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetSearchTermViewRequest) Reset()         { *m = GetSearchTermViewRequest{} }
+func (m *GetSearchTermViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetSearchTermViewRequest) ProtoMessage()    {}
+func (*GetSearchTermViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1667b609515952c8, []int{0}
+}
+
+func (m *GetSearchTermViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetSearchTermViewRequest.Unmarshal(m, b)
+}
+func (m *GetSearchTermViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetSearchTermViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetSearchTermViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetSearchTermViewRequest.Merge(m, src)
+}
+func (m *GetSearchTermViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetSearchTermViewRequest.Size(m)
+}
+func (m *GetSearchTermViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetSearchTermViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetSearchTermViewRequest proto.InternalMessageInfo
+
+func (m *GetSearchTermViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetSearchTermViewRequest)(nil), "google.ads.googleads.v3.services.GetSearchTermViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/search_term_view_service.proto", fileDescriptor_1667b609515952c8)
+}
+
+var fileDescriptor_1667b609515952c8 = []byte{
+	// 417 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x4f, 0x6b, 0xd4, 0x40,
+	0x14, 0x27, 0x29, 0x08, 0x06, 0x3d, 0x18, 0x10, 0x97, 0x28, 0xb8, 0x94, 0x1e, 0x4a, 0x0f, 0x33,
+	0xd4, 0x5c, 0x64, 0x44, 0x64, 0x16, 0x61, 0xf5, 0x22, 0xa5, 0x95, 0x1c, 0x24, 0x10, 0xa6, 0xc9,
+	0x33, 0x1d, 0x48, 0x32, 0xeb, 0xbc, 0xd9, 0xf4, 0x20, 0x1e, 0x14, 0xbf, 0x81, 0xdf, 0xc0, 0xa3,
+	0x1f, 0xa5, 0xe0, 0xc9, 0x9b, 0x27, 0x0f, 0x9e, 0xfc, 0x14, 0x92, 0x9d, 0x4c, 0xda, 0xd0, 0x86,
+	0xbd, 0xfd, 0xc8, 0xef, 0xdf, 0xbc, 0xf7, 0x12, 0xbc, 0x28, 0x95, 0x2a, 0x2b, 0xa0, 0xa2, 0x40,
+	0x6a, 0x61, 0x87, 0xda, 0x98, 0x22, 0xe8, 0x56, 0xe6, 0x80, 0x14, 0x41, 0xe8, 0xfc, 0x2c, 0x33,
+	0xa0, 0xeb, 0xac, 0x95, 0x70, 0x9e, 0xf5, 0x0c, 0x59, 0x69, 0x65, 0x54, 0x38, 0xb7, 0x2e, 0x22,
+	0x0a, 0x24, 0x43, 0x00, 0x69, 0x63, 0xe2, 0x02, 0xa2, 0xa7, 0x53, 0x15, 0x1a, 0x50, 0xad, 0xf5,
+	0x4d, 0x1d, 0x36, 0x3b, 0x7a, 0xe4, 0x9c, 0x2b, 0x49, 0x45, 0xd3, 0x28, 0x23, 0x8c, 0x54, 0x0d,
+	0xf6, 0xec, 0x83, 0x2b, 0x6c, 0x5e, 0x49, 0x68, 0x4c, 0x4f, 0x3c, 0xbe, 0x42, 0xbc, 0x97, 0x50,
+	0x15, 0xd9, 0x29, 0x9c, 0x89, 0x56, 0x2a, 0x6d, 0x05, 0xbb, 0x2f, 0x83, 0xd9, 0x12, 0xcc, 0xc9,
+	0xa6, 0xf4, 0x2d, 0xe8, 0x3a, 0x91, 0x70, 0x7e, 0x0c, 0x1f, 0xd6, 0x80, 0x26, 0xdc, 0x0f, 0xee,
+	0xba, 0x77, 0x65, 0x8d, 0xa8, 0x61, 0xe6, 0xcd, 0xbd, 0xfd, 0xdb, 0x8b, 0x9d, 0x3f, 0xdc, 0x3f,
+	0xbe, 0xe3, 0x98, 0x37, 0xa2, 0x86, 0x27, 0x5f, 0xfd, 0xe0, 0xfe, 0x38, 0xe3, 0xc4, 0x8e, 0x1c,
+	0xfe, 0xf4, 0x82, 0x7b, 0xd7, 0x0a, 0x42, 0x46, 0xb6, 0xad, 0x8a, 0x4c, 0xbd, 0x2a, 0x3a, 0x9c,
+	0xf4, 0x0e, 0x4b, 0x24, 0x63, 0xe7, 0xee, 0xeb, 0xdf, 0x7c, 0x3c, 0xc9, 0x97, 0x5f, 0x7f, 0xbf,
+	0xf9, 0x71, 0x78, 0xd8, 0xad, 0xfe, 0xe3, 0x88, 0x79, 0x9e, 0xaf, 0xd1, 0xa8, 0x1a, 0x34, 0xd2,
+	0x83, 0xfe, 0x16, 0x2e, 0x06, 0xe9, 0xc1, 0xa7, 0xe8, 0xe1, 0x05, 0x9f, 0x5d, 0x96, 0xf6, 0x68,
+	0x25, 0x91, 0xe4, 0xaa, 0x5e, 0x7c, 0xf6, 0x83, 0xbd, 0x5c, 0xd5, 0x5b, 0x87, 0x5b, 0x44, 0x37,
+	0x2e, 0xeb, 0xa8, 0xbb, 0xc8, 0x91, 0xf7, 0xee, 0x55, 0xef, 0x2f, 0x55, 0x25, 0x9a, 0x92, 0x28,
+	0x5d, 0xd2, 0x12, 0x9a, 0xcd, 0xbd, 0xe8, 0x65, 0xe3, 0xf4, 0x7f, 0xfa, 0xcc, 0x81, 0xef, 0xfe,
+	0xce, 0x92, 0xf3, 0x1f, 0xfe, 0x7c, 0x69, 0x03, 0x79, 0x81, 0xc4, 0xc2, 0x0e, 0x25, 0x31, 0xe9,
+	0x8b, 0xf1, 0xc2, 0x49, 0x52, 0x5e, 0x60, 0x3a, 0x48, 0xd2, 0x24, 0x4e, 0x9d, 0xe4, 0x9f, 0xbf,
+	0x67, 0xbf, 0x33, 0xc6, 0x0b, 0x64, 0x6c, 0x10, 0x31, 0x96, 0xc4, 0x8c, 0x39, 0xd9, 0xe9, 0xad,
+	0xcd, 0x3b, 0xe3, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x58, 0xa3, 0xde, 0xec, 0x4e, 0x03, 0x00,
+	0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// SearchTermViewServiceClient is the client API for SearchTermViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type SearchTermViewServiceClient interface {
+	// Returns the attributes of the requested search term view.
+	GetSearchTermView(ctx context.Context, in *GetSearchTermViewRequest, opts ...grpc.CallOption) (*resources.SearchTermView, error)
+}
+
+type searchTermViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewSearchTermViewServiceClient(cc grpc.ClientConnInterface) SearchTermViewServiceClient {
+	return &searchTermViewServiceClient{cc}
+}
+
+func (c *searchTermViewServiceClient) GetSearchTermView(ctx context.Context, in *GetSearchTermViewRequest, opts ...grpc.CallOption) (*resources.SearchTermView, error) {
+	out := new(resources.SearchTermView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.SearchTermViewService/GetSearchTermView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// SearchTermViewServiceServer is the server API for SearchTermViewService service.
+type SearchTermViewServiceServer interface {
+	// Returns the attributes of the requested search term view.
+	GetSearchTermView(context.Context, *GetSearchTermViewRequest) (*resources.SearchTermView, error)
+}
+
+// UnimplementedSearchTermViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedSearchTermViewServiceServer struct {
+}
+
+func (*UnimplementedSearchTermViewServiceServer) GetSearchTermView(ctx context.Context, req *GetSearchTermViewRequest) (*resources.SearchTermView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetSearchTermView not implemented")
+}
+
+func RegisterSearchTermViewServiceServer(s *grpc.Server, srv SearchTermViewServiceServer) {
+	s.RegisterService(&_SearchTermViewService_serviceDesc, srv)
+}
+
+func _SearchTermViewService_GetSearchTermView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSearchTermViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SearchTermViewServiceServer).GetSearchTermView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.SearchTermViewService/GetSearchTermView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SearchTermViewServiceServer).GetSearchTermView(ctx, req.(*GetSearchTermViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _SearchTermViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.SearchTermViewService",
+	HandlerType: (*SearchTermViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetSearchTermView",
+			Handler:    _SearchTermViewService_GetSearchTermView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/search_term_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/shared_criterion_service.pb.go b/googleapis/ads/googleads/v3/services/shared_criterion_service.pb.go
new file mode 100644
index 0000000..9ae32a8
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/shared_criterion_service.pb.go
@@ -0,0 +1,500 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/shared_criterion_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [SharedCriterionService.GetSharedCriterion][google.ads.googleads.v3.services.SharedCriterionService.GetSharedCriterion].
+type GetSharedCriterionRequest struct {
+	// Required. The resource name of the shared criterion to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetSharedCriterionRequest) Reset()         { *m = GetSharedCriterionRequest{} }
+func (m *GetSharedCriterionRequest) String() string { return proto.CompactTextString(m) }
+func (*GetSharedCriterionRequest) ProtoMessage()    {}
+func (*GetSharedCriterionRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_759802b7b62c0df4, []int{0}
+}
+
+func (m *GetSharedCriterionRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetSharedCriterionRequest.Unmarshal(m, b)
+}
+func (m *GetSharedCriterionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetSharedCriterionRequest.Marshal(b, m, deterministic)
+}
+func (m *GetSharedCriterionRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetSharedCriterionRequest.Merge(m, src)
+}
+func (m *GetSharedCriterionRequest) XXX_Size() int {
+	return xxx_messageInfo_GetSharedCriterionRequest.Size(m)
+}
+func (m *GetSharedCriterionRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetSharedCriterionRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetSharedCriterionRequest proto.InternalMessageInfo
+
+func (m *GetSharedCriterionRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [SharedCriterionService.MutateSharedCriteria][google.ads.googleads.v3.services.SharedCriterionService.MutateSharedCriteria].
+type MutateSharedCriteriaRequest struct {
+	// Required. The ID of the customer whose shared criteria are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual shared criteria.
+	Operations []*SharedCriterionOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateSharedCriteriaRequest) Reset()         { *m = MutateSharedCriteriaRequest{} }
+func (m *MutateSharedCriteriaRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateSharedCriteriaRequest) ProtoMessage()    {}
+func (*MutateSharedCriteriaRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_759802b7b62c0df4, []int{1}
+}
+
+func (m *MutateSharedCriteriaRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateSharedCriteriaRequest.Unmarshal(m, b)
+}
+func (m *MutateSharedCriteriaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateSharedCriteriaRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateSharedCriteriaRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateSharedCriteriaRequest.Merge(m, src)
+}
+func (m *MutateSharedCriteriaRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateSharedCriteriaRequest.Size(m)
+}
+func (m *MutateSharedCriteriaRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateSharedCriteriaRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateSharedCriteriaRequest proto.InternalMessageInfo
+
+func (m *MutateSharedCriteriaRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateSharedCriteriaRequest) GetOperations() []*SharedCriterionOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateSharedCriteriaRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateSharedCriteriaRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, remove) on an shared criterion.
+type SharedCriterionOperation struct {
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*SharedCriterionOperation_Create
+	//	*SharedCriterionOperation_Remove
+	Operation            isSharedCriterionOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
+	XXX_unrecognized     []byte                               `json:"-"`
+	XXX_sizecache        int32                                `json:"-"`
+}
+
+func (m *SharedCriterionOperation) Reset()         { *m = SharedCriterionOperation{} }
+func (m *SharedCriterionOperation) String() string { return proto.CompactTextString(m) }
+func (*SharedCriterionOperation) ProtoMessage()    {}
+func (*SharedCriterionOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_759802b7b62c0df4, []int{2}
+}
+
+func (m *SharedCriterionOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SharedCriterionOperation.Unmarshal(m, b)
+}
+func (m *SharedCriterionOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SharedCriterionOperation.Marshal(b, m, deterministic)
+}
+func (m *SharedCriterionOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SharedCriterionOperation.Merge(m, src)
+}
+func (m *SharedCriterionOperation) XXX_Size() int {
+	return xxx_messageInfo_SharedCriterionOperation.Size(m)
+}
+func (m *SharedCriterionOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_SharedCriterionOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SharedCriterionOperation proto.InternalMessageInfo
+
+type isSharedCriterionOperation_Operation interface {
+	isSharedCriterionOperation_Operation()
+}
+
+type SharedCriterionOperation_Create struct {
+	Create *resources.SharedCriterion `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type SharedCriterionOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*SharedCriterionOperation_Create) isSharedCriterionOperation_Operation() {}
+
+func (*SharedCriterionOperation_Remove) isSharedCriterionOperation_Operation() {}
+
+func (m *SharedCriterionOperation) GetOperation() isSharedCriterionOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *SharedCriterionOperation) GetCreate() *resources.SharedCriterion {
+	if x, ok := m.GetOperation().(*SharedCriterionOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *SharedCriterionOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*SharedCriterionOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*SharedCriterionOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*SharedCriterionOperation_Create)(nil),
+		(*SharedCriterionOperation_Remove)(nil),
+	}
+}
+
+// Response message for a shared criterion mutate.
+type MutateSharedCriteriaResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateSharedCriterionResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
+	XXX_unrecognized     []byte                         `json:"-"`
+	XXX_sizecache        int32                          `json:"-"`
+}
+
+func (m *MutateSharedCriteriaResponse) Reset()         { *m = MutateSharedCriteriaResponse{} }
+func (m *MutateSharedCriteriaResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateSharedCriteriaResponse) ProtoMessage()    {}
+func (*MutateSharedCriteriaResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_759802b7b62c0df4, []int{3}
+}
+
+func (m *MutateSharedCriteriaResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateSharedCriteriaResponse.Unmarshal(m, b)
+}
+func (m *MutateSharedCriteriaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateSharedCriteriaResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateSharedCriteriaResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateSharedCriteriaResponse.Merge(m, src)
+}
+func (m *MutateSharedCriteriaResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateSharedCriteriaResponse.Size(m)
+}
+func (m *MutateSharedCriteriaResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateSharedCriteriaResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateSharedCriteriaResponse proto.InternalMessageInfo
+
+func (m *MutateSharedCriteriaResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateSharedCriteriaResponse) GetResults() []*MutateSharedCriterionResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the shared criterion mutate.
+type MutateSharedCriterionResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateSharedCriterionResult) Reset()         { *m = MutateSharedCriterionResult{} }
+func (m *MutateSharedCriterionResult) String() string { return proto.CompactTextString(m) }
+func (*MutateSharedCriterionResult) ProtoMessage()    {}
+func (*MutateSharedCriterionResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_759802b7b62c0df4, []int{4}
+}
+
+func (m *MutateSharedCriterionResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateSharedCriterionResult.Unmarshal(m, b)
+}
+func (m *MutateSharedCriterionResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateSharedCriterionResult.Marshal(b, m, deterministic)
+}
+func (m *MutateSharedCriterionResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateSharedCriterionResult.Merge(m, src)
+}
+func (m *MutateSharedCriterionResult) XXX_Size() int {
+	return xxx_messageInfo_MutateSharedCriterionResult.Size(m)
+}
+func (m *MutateSharedCriterionResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateSharedCriterionResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateSharedCriterionResult proto.InternalMessageInfo
+
+func (m *MutateSharedCriterionResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetSharedCriterionRequest)(nil), "google.ads.googleads.v3.services.GetSharedCriterionRequest")
+	proto.RegisterType((*MutateSharedCriteriaRequest)(nil), "google.ads.googleads.v3.services.MutateSharedCriteriaRequest")
+	proto.RegisterType((*SharedCriterionOperation)(nil), "google.ads.googleads.v3.services.SharedCriterionOperation")
+	proto.RegisterType((*MutateSharedCriteriaResponse)(nil), "google.ads.googleads.v3.services.MutateSharedCriteriaResponse")
+	proto.RegisterType((*MutateSharedCriterionResult)(nil), "google.ads.googleads.v3.services.MutateSharedCriterionResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/shared_criterion_service.proto", fileDescriptor_759802b7b62c0df4)
+}
+
+var fileDescriptor_759802b7b62c0df4 = []byte{
+	// 711 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4f, 0x6b, 0xd4, 0x40,
+	0x14, 0x37, 0x59, 0xa9, 0x76, 0xb6, 0x55, 0x18, 0xb5, 0xc6, 0x6d, 0xc1, 0x25, 0x16, 0x5c, 0x16,
+	0x49, 0x64, 0x73, 0x29, 0x29, 0x55, 0xb2, 0xd2, 0x3f, 0x82, 0xda, 0xb2, 0x85, 0x16, 0x64, 0x21,
+	0x4c, 0x93, 0xe9, 0x36, 0x90, 0x64, 0xe2, 0xcc, 0x64, 0xa1, 0x94, 0x5e, 0xfa, 0x05, 0x3c, 0xf8,
+	0x0d, 0x3c, 0xfa, 0x25, 0xbc, 0xf7, 0xe2, 0xc1, 0x5b, 0x4f, 0x1e, 0x3c, 0x79, 0xf0, 0xe0, 0xc9,
+	0xa3, 0x24, 0x93, 0xd9, 0x7f, 0x66, 0x59, 0xe8, 0xed, 0x65, 0xde, 0x7b, 0xbf, 0xf7, 0x7b, 0xf3,
+	0x7e, 0x6f, 0x02, 0x5e, 0xf6, 0x08, 0xe9, 0x85, 0xd8, 0x44, 0x3e, 0x33, 0x85, 0x99, 0x59, 0x7d,
+	0xcb, 0x64, 0x98, 0xf6, 0x03, 0x0f, 0x33, 0x93, 0x9d, 0x20, 0x8a, 0x7d, 0xd7, 0xa3, 0x01, 0xc7,
+	0x34, 0x20, 0xb1, 0x5b, 0x78, 0x8c, 0x84, 0x12, 0x4e, 0x60, 0x5d, 0x64, 0x19, 0xc8, 0x67, 0xc6,
+	0x00, 0xc0, 0xe8, 0x5b, 0x86, 0x04, 0xa8, 0xad, 0x4d, 0x2b, 0x41, 0x31, 0x23, 0x29, 0x2d, 0xab,
+	0x21, 0xb0, 0x6b, 0x2b, 0x32, 0x33, 0x09, 0x4c, 0x14, 0xc7, 0x84, 0x23, 0x1e, 0x90, 0x98, 0x15,
+	0xde, 0x87, 0x23, 0x5e, 0x2f, 0x0c, 0x70, 0xcc, 0x0b, 0xc7, 0xe3, 0x11, 0xc7, 0x71, 0x80, 0x43,
+	0xdf, 0x3d, 0xc2, 0x27, 0xa8, 0x1f, 0x10, 0x3a, 0x91, 0x49, 0x13, 0xcf, 0x64, 0x1c, 0xf1, 0xb4,
+	0x80, 0xd4, 0x37, 0xc1, 0xa3, 0x6d, 0xcc, 0xf7, 0x73, 0x36, 0xaf, 0x24, 0x99, 0x0e, 0xfe, 0x90,
+	0x62, 0xc6, 0x61, 0x03, 0x2c, 0x4a, 0xc6, 0x6e, 0x8c, 0x22, 0xac, 0x29, 0x75, 0xa5, 0x31, 0xdf,
+	0xae, 0xfc, 0x70, 0xd4, 0xce, 0x82, 0xf4, 0xbc, 0x43, 0x11, 0xd6, 0xff, 0x28, 0x60, 0xf9, 0x6d,
+	0xca, 0x11, 0xc7, 0x63, 0x50, 0x48, 0x22, 0xad, 0x82, 0xaa, 0x97, 0x32, 0x4e, 0x22, 0x4c, 0xdd,
+	0xc0, 0x1f, 0xc5, 0x01, 0xf2, 0xfc, 0xb5, 0x0f, 0x5d, 0x00, 0x48, 0x82, 0xa9, 0xe8, 0x59, 0x53,
+	0xeb, 0x95, 0x46, 0xb5, 0x65, 0x1b, 0xb3, 0xae, 0xdb, 0x98, 0x60, 0xbf, 0x2b, 0x21, 0x8a, 0x02,
+	0x43, 0x48, 0xf8, 0x14, 0xdc, 0x4d, 0x10, 0xe5, 0x01, 0x0a, 0xdd, 0x63, 0x14, 0x84, 0x29, 0xc5,
+	0x5a, 0xa5, 0xae, 0x34, 0x6e, 0x77, 0xee, 0x14, 0xc7, 0x5b, 0xe2, 0x14, 0x3e, 0x01, 0x8b, 0x7d,
+	0x14, 0x06, 0x3e, 0xe2, 0xd8, 0x25, 0x71, 0x78, 0xaa, 0xdd, 0xcc, 0xc3, 0x16, 0xe4, 0xe1, 0x6e,
+	0x1c, 0x9e, 0xea, 0x1f, 0x15, 0xa0, 0x4d, 0xab, 0x0d, 0xdf, 0x80, 0x39, 0x8f, 0x62, 0xc4, 0xc5,
+	0xa5, 0x55, 0x5b, 0xad, 0xa9, 0x7d, 0x0c, 0x44, 0x31, 0xd9, 0xc8, 0xce, 0x8d, 0x4e, 0x81, 0x01,
+	0x35, 0x30, 0x47, 0x71, 0x44, 0xfa, 0x82, 0xef, 0x7c, 0xe6, 0x11, 0xdf, 0xed, 0x2a, 0x98, 0x1f,
+	0x34, 0xa8, 0x7f, 0x55, 0xc0, 0x4a, 0xf9, 0x18, 0x58, 0x42, 0x62, 0x86, 0xe1, 0x16, 0x78, 0x30,
+	0x71, 0x01, 0x2e, 0xa6, 0x94, 0xd0, 0x1c, 0xb6, 0xda, 0x82, 0x92, 0x24, 0x4d, 0x3c, 0x63, 0x3f,
+	0xd7, 0x49, 0xe7, 0xde, 0xf8, 0xd5, 0x6c, 0x66, 0xe1, 0xf0, 0x10, 0xdc, 0xa2, 0x98, 0xa5, 0x21,
+	0x97, 0x63, 0xda, 0x98, 0x3d, 0xa6, 0x12, 0x62, 0x99, 0xd4, 0x32, 0x94, 0x8e, 0x44, 0xd3, 0xdb,
+	0xa5, 0x3a, 0x92, 0x71, 0xd9, 0x5c, 0x4a, 0x14, 0x39, 0x2e, 0xc6, 0xd6, 0xdf, 0x0a, 0x58, 0x9a,
+	0x48, 0xdf, 0x17, 0x24, 0xe0, 0x37, 0x05, 0xc0, 0xff, 0xf5, 0x0e, 0xd7, 0x67, 0xb3, 0x9f, 0xba,
+	0x25, 0xb5, 0x6b, 0x4c, 0x56, 0xdf, 0xb9, 0x72, 0xc6, 0x1b, 0xb9, 0xf8, 0xfe, 0xf3, 0x93, 0xda,
+	0x82, 0xcf, 0xb3, 0x57, 0xe2, 0x6c, 0xcc, 0xb3, 0x21, 0x17, 0x84, 0x99, 0xcd, 0xe2, 0xd9, 0x90,
+	0x63, 0x35, 0x9b, 0xe7, 0xf0, 0xb7, 0x02, 0xee, 0x97, 0x8d, 0x1c, 0x5e, 0x6f, 0x22, 0x72, 0x63,
+	0x6b, 0x2f, 0xae, 0x9b, 0x2e, 0x94, 0xa6, 0x1f, 0x5e, 0x39, 0x4b, 0x23, 0x2b, 0xff, 0x6c, 0xb8,
+	0x85, 0x79, 0xab, 0x6b, 0xba, 0x95, 0xb5, 0x3a, 0xec, 0xed, 0x6c, 0x24, 0x78, 0xa3, 0x79, 0x3e,
+	0xd1, 0xa9, 0x1d, 0xe5, 0xb5, 0x6c, 0xa5, 0x59, 0x5b, 0xbe, 0x74, 0xb4, 0x21, 0x9f, 0xc2, 0x4a,
+	0x02, 0x66, 0x78, 0x24, 0x6a, 0x5f, 0xa8, 0x60, 0xd5, 0x23, 0xd1, 0x4c, 0xee, 0xed, 0xe5, 0x72,
+	0x81, 0xec, 0x65, 0x8f, 0xe2, 0x9e, 0xf2, 0x7e, 0xa7, 0x00, 0xe8, 0x91, 0x10, 0xc5, 0x3d, 0x83,
+	0xd0, 0x9e, 0xd9, 0xc3, 0x71, 0xfe, 0x64, 0x9a, 0xc3, 0x92, 0xd3, 0xff, 0x21, 0xeb, 0xd2, 0xf8,
+	0xac, 0x56, 0xb6, 0x1d, 0xe7, 0x8b, 0x5a, 0xdf, 0x16, 0x80, 0x8e, 0xcf, 0x0c, 0x61, 0x66, 0xd6,
+	0x81, 0x65, 0x14, 0x85, 0xd9, 0xa5, 0x0c, 0xe9, 0x3a, 0x3e, 0xeb, 0x0e, 0x42, 0xba, 0x07, 0x56,
+	0x57, 0x86, 0xfc, 0x52, 0x57, 0xc5, 0xb9, 0x6d, 0x3b, 0x3e, 0xb3, 0xed, 0x41, 0x90, 0x6d, 0x1f,
+	0x58, 0xb6, 0x2d, 0xc3, 0x8e, 0xe6, 0x72, 0x9e, 0xd6, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x96,
+	0xed, 0xaf, 0x7a, 0xea, 0x06, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// SharedCriterionServiceClient is the client API for SharedCriterionService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type SharedCriterionServiceClient interface {
+	// Returns the requested shared criterion in full detail.
+	GetSharedCriterion(ctx context.Context, in *GetSharedCriterionRequest, opts ...grpc.CallOption) (*resources.SharedCriterion, error)
+	// Creates or removes shared criteria. Operation statuses are returned.
+	MutateSharedCriteria(ctx context.Context, in *MutateSharedCriteriaRequest, opts ...grpc.CallOption) (*MutateSharedCriteriaResponse, error)
+}
+
+type sharedCriterionServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewSharedCriterionServiceClient(cc grpc.ClientConnInterface) SharedCriterionServiceClient {
+	return &sharedCriterionServiceClient{cc}
+}
+
+func (c *sharedCriterionServiceClient) GetSharedCriterion(ctx context.Context, in *GetSharedCriterionRequest, opts ...grpc.CallOption) (*resources.SharedCriterion, error) {
+	out := new(resources.SharedCriterion)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.SharedCriterionService/GetSharedCriterion", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sharedCriterionServiceClient) MutateSharedCriteria(ctx context.Context, in *MutateSharedCriteriaRequest, opts ...grpc.CallOption) (*MutateSharedCriteriaResponse, error) {
+	out := new(MutateSharedCriteriaResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.SharedCriterionService/MutateSharedCriteria", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// SharedCriterionServiceServer is the server API for SharedCriterionService service.
+type SharedCriterionServiceServer interface {
+	// Returns the requested shared criterion in full detail.
+	GetSharedCriterion(context.Context, *GetSharedCriterionRequest) (*resources.SharedCriterion, error)
+	// Creates or removes shared criteria. Operation statuses are returned.
+	MutateSharedCriteria(context.Context, *MutateSharedCriteriaRequest) (*MutateSharedCriteriaResponse, error)
+}
+
+// UnimplementedSharedCriterionServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedSharedCriterionServiceServer struct {
+}
+
+func (*UnimplementedSharedCriterionServiceServer) GetSharedCriterion(ctx context.Context, req *GetSharedCriterionRequest) (*resources.SharedCriterion, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetSharedCriterion not implemented")
+}
+func (*UnimplementedSharedCriterionServiceServer) MutateSharedCriteria(ctx context.Context, req *MutateSharedCriteriaRequest) (*MutateSharedCriteriaResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateSharedCriteria not implemented")
+}
+
+func RegisterSharedCriterionServiceServer(s *grpc.Server, srv SharedCriterionServiceServer) {
+	s.RegisterService(&_SharedCriterionService_serviceDesc, srv)
+}
+
+func _SharedCriterionService_GetSharedCriterion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSharedCriterionRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SharedCriterionServiceServer).GetSharedCriterion(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.SharedCriterionService/GetSharedCriterion",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SharedCriterionServiceServer).GetSharedCriterion(ctx, req.(*GetSharedCriterionRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SharedCriterionService_MutateSharedCriteria_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateSharedCriteriaRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SharedCriterionServiceServer).MutateSharedCriteria(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.SharedCriterionService/MutateSharedCriteria",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SharedCriterionServiceServer).MutateSharedCriteria(ctx, req.(*MutateSharedCriteriaRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _SharedCriterionService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.SharedCriterionService",
+	HandlerType: (*SharedCriterionServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetSharedCriterion",
+			Handler:    _SharedCriterionService_GetSharedCriterion_Handler,
+		},
+		{
+			MethodName: "MutateSharedCriteria",
+			Handler:    _SharedCriterionService_MutateSharedCriteria_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/shared_criterion_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/shared_set_service.pb.go b/googleapis/ads/googleads/v3/services/shared_set_service.pb.go
new file mode 100644
index 0000000..3aa8f1b
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/shared_set_service.pb.go
@@ -0,0 +1,528 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/shared_set_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [SharedSetService.GetSharedSet][google.ads.googleads.v3.services.SharedSetService.GetSharedSet].
+type GetSharedSetRequest struct {
+	// Required. The resource name of the shared set to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetSharedSetRequest) Reset()         { *m = GetSharedSetRequest{} }
+func (m *GetSharedSetRequest) String() string { return proto.CompactTextString(m) }
+func (*GetSharedSetRequest) ProtoMessage()    {}
+func (*GetSharedSetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a612c7f11f5fd3bc, []int{0}
+}
+
+func (m *GetSharedSetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetSharedSetRequest.Unmarshal(m, b)
+}
+func (m *GetSharedSetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetSharedSetRequest.Marshal(b, m, deterministic)
+}
+func (m *GetSharedSetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetSharedSetRequest.Merge(m, src)
+}
+func (m *GetSharedSetRequest) XXX_Size() int {
+	return xxx_messageInfo_GetSharedSetRequest.Size(m)
+}
+func (m *GetSharedSetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetSharedSetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetSharedSetRequest proto.InternalMessageInfo
+
+func (m *GetSharedSetRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [SharedSetService.MutateSharedSets][google.ads.googleads.v3.services.SharedSetService.MutateSharedSets].
+type MutateSharedSetsRequest struct {
+	// Required. The ID of the customer whose shared sets are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual shared sets.
+	Operations []*SharedSetOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateSharedSetsRequest) Reset()         { *m = MutateSharedSetsRequest{} }
+func (m *MutateSharedSetsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateSharedSetsRequest) ProtoMessage()    {}
+func (*MutateSharedSetsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a612c7f11f5fd3bc, []int{1}
+}
+
+func (m *MutateSharedSetsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateSharedSetsRequest.Unmarshal(m, b)
+}
+func (m *MutateSharedSetsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateSharedSetsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateSharedSetsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateSharedSetsRequest.Merge(m, src)
+}
+func (m *MutateSharedSetsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateSharedSetsRequest.Size(m)
+}
+func (m *MutateSharedSetsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateSharedSetsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateSharedSetsRequest proto.InternalMessageInfo
+
+func (m *MutateSharedSetsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateSharedSetsRequest) GetOperations() []*SharedSetOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateSharedSetsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateSharedSetsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update, remove) on an shared set.
+type SharedSetOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*SharedSetOperation_Create
+	//	*SharedSetOperation_Update
+	//	*SharedSetOperation_Remove
+	Operation            isSharedSetOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
+	XXX_unrecognized     []byte                         `json:"-"`
+	XXX_sizecache        int32                          `json:"-"`
+}
+
+func (m *SharedSetOperation) Reset()         { *m = SharedSetOperation{} }
+func (m *SharedSetOperation) String() string { return proto.CompactTextString(m) }
+func (*SharedSetOperation) ProtoMessage()    {}
+func (*SharedSetOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a612c7f11f5fd3bc, []int{2}
+}
+
+func (m *SharedSetOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SharedSetOperation.Unmarshal(m, b)
+}
+func (m *SharedSetOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SharedSetOperation.Marshal(b, m, deterministic)
+}
+func (m *SharedSetOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SharedSetOperation.Merge(m, src)
+}
+func (m *SharedSetOperation) XXX_Size() int {
+	return xxx_messageInfo_SharedSetOperation.Size(m)
+}
+func (m *SharedSetOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_SharedSetOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SharedSetOperation proto.InternalMessageInfo
+
+func (m *SharedSetOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isSharedSetOperation_Operation interface {
+	isSharedSetOperation_Operation()
+}
+
+type SharedSetOperation_Create struct {
+	Create *resources.SharedSet `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type SharedSetOperation_Update struct {
+	Update *resources.SharedSet `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type SharedSetOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*SharedSetOperation_Create) isSharedSetOperation_Operation() {}
+
+func (*SharedSetOperation_Update) isSharedSetOperation_Operation() {}
+
+func (*SharedSetOperation_Remove) isSharedSetOperation_Operation() {}
+
+func (m *SharedSetOperation) GetOperation() isSharedSetOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *SharedSetOperation) GetCreate() *resources.SharedSet {
+	if x, ok := m.GetOperation().(*SharedSetOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *SharedSetOperation) GetUpdate() *resources.SharedSet {
+	if x, ok := m.GetOperation().(*SharedSetOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *SharedSetOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*SharedSetOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*SharedSetOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*SharedSetOperation_Create)(nil),
+		(*SharedSetOperation_Update)(nil),
+		(*SharedSetOperation_Remove)(nil),
+	}
+}
+
+// Response message for a shared set mutate.
+type MutateSharedSetsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateSharedSetResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *MutateSharedSetsResponse) Reset()         { *m = MutateSharedSetsResponse{} }
+func (m *MutateSharedSetsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateSharedSetsResponse) ProtoMessage()    {}
+func (*MutateSharedSetsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a612c7f11f5fd3bc, []int{3}
+}
+
+func (m *MutateSharedSetsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateSharedSetsResponse.Unmarshal(m, b)
+}
+func (m *MutateSharedSetsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateSharedSetsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateSharedSetsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateSharedSetsResponse.Merge(m, src)
+}
+func (m *MutateSharedSetsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateSharedSetsResponse.Size(m)
+}
+func (m *MutateSharedSetsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateSharedSetsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateSharedSetsResponse proto.InternalMessageInfo
+
+func (m *MutateSharedSetsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateSharedSetsResponse) GetResults() []*MutateSharedSetResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the shared set mutate.
+type MutateSharedSetResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateSharedSetResult) Reset()         { *m = MutateSharedSetResult{} }
+func (m *MutateSharedSetResult) String() string { return proto.CompactTextString(m) }
+func (*MutateSharedSetResult) ProtoMessage()    {}
+func (*MutateSharedSetResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a612c7f11f5fd3bc, []int{4}
+}
+
+func (m *MutateSharedSetResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateSharedSetResult.Unmarshal(m, b)
+}
+func (m *MutateSharedSetResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateSharedSetResult.Marshal(b, m, deterministic)
+}
+func (m *MutateSharedSetResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateSharedSetResult.Merge(m, src)
+}
+func (m *MutateSharedSetResult) XXX_Size() int {
+	return xxx_messageInfo_MutateSharedSetResult.Size(m)
+}
+func (m *MutateSharedSetResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateSharedSetResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateSharedSetResult proto.InternalMessageInfo
+
+func (m *MutateSharedSetResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetSharedSetRequest)(nil), "google.ads.googleads.v3.services.GetSharedSetRequest")
+	proto.RegisterType((*MutateSharedSetsRequest)(nil), "google.ads.googleads.v3.services.MutateSharedSetsRequest")
+	proto.RegisterType((*SharedSetOperation)(nil), "google.ads.googleads.v3.services.SharedSetOperation")
+	proto.RegisterType((*MutateSharedSetsResponse)(nil), "google.ads.googleads.v3.services.MutateSharedSetsResponse")
+	proto.RegisterType((*MutateSharedSetResult)(nil), "google.ads.googleads.v3.services.MutateSharedSetResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/shared_set_service.proto", fileDescriptor_a612c7f11f5fd3bc)
+}
+
+var fileDescriptor_a612c7f11f5fd3bc = []byte{
+	// 757 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4d, 0x6b, 0xdb, 0x48,
+	0x18, 0x5e, 0xc9, 0x4b, 0x76, 0x33, 0x4e, 0x76, 0xc3, 0x84, 0x6c, 0x84, 0x77, 0x61, 0x8d, 0x36,
+	0xb0, 0xc6, 0x04, 0x09, 0xec, 0x94, 0x12, 0xa5, 0xa1, 0xc8, 0xb4, 0x49, 0x7a, 0x48, 0x93, 0xca,
+	0x10, 0x68, 0x31, 0x88, 0x89, 0x34, 0x71, 0x44, 0x24, 0x8d, 0x3a, 0x33, 0x32, 0x84, 0x90, 0x4b,
+	0x4f, 0xbd, 0xf7, 0x1f, 0xf4, 0xd8, 0x7b, 0x0f, 0xfd, 0x0b, 0xa1, 0xb7, 0xde, 0x72, 0x28, 0x3d,
+	0xf4, 0x50, 0xfa, 0x1b, 0x7a, 0x28, 0xd2, 0x68, 0xe4, 0x8f, 0x24, 0x98, 0xe4, 0xf6, 0x7a, 0xde,
+	0xe7, 0x79, 0xde, 0x6f, 0x19, 0xac, 0xf7, 0x09, 0xe9, 0x87, 0xd8, 0x44, 0x3e, 0x33, 0x85, 0x99,
+	0x59, 0x83, 0xb6, 0xc9, 0x30, 0x1d, 0x04, 0x1e, 0x66, 0x26, 0x3b, 0x46, 0x14, 0xfb, 0x2e, 0xc3,
+	0xdc, 0x2d, 0xde, 0x8c, 0x84, 0x12, 0x4e, 0x60, 0x5d, 0xe0, 0x0d, 0xe4, 0x33, 0xa3, 0xa4, 0x1a,
+	0x83, 0xb6, 0x21, 0xa9, 0xb5, 0xd6, 0x4d, 0xe2, 0x14, 0x33, 0x92, 0xd2, 0x71, 0x75, 0xa1, 0x5a,
+	0xfb, 0x47, 0x72, 0x92, 0xc0, 0x44, 0x71, 0x4c, 0x38, 0xe2, 0x01, 0x89, 0x59, 0xe1, 0x5d, 0x1e,
+	0xf1, 0x7a, 0x61, 0x80, 0x63, 0x49, 0xfb, 0x77, 0xc4, 0x71, 0x14, 0xe0, 0xd0, 0x77, 0x0f, 0xf1,
+	0x31, 0x1a, 0x04, 0x84, 0x16, 0x80, 0x22, 0x5b, 0x33, 0xff, 0x75, 0x98, 0x1e, 0x15, 0xa8, 0x08,
+	0xb1, 0x93, 0x09, 0x6d, 0x9a, 0x78, 0x26, 0xe3, 0x88, 0xa7, 0x45, 0x50, 0xfd, 0x21, 0x58, 0xdc,
+	0xc6, 0xbc, 0x9b, 0x67, 0xda, 0xc5, 0xdc, 0xc1, 0x2f, 0x53, 0xcc, 0x38, 0x6c, 0x80, 0x79, 0x59,
+	0x87, 0x1b, 0xa3, 0x08, 0x6b, 0x4a, 0x5d, 0x69, 0xcc, 0x76, 0x2a, 0x5f, 0x6c, 0xd5, 0x99, 0x93,
+	0x9e, 0xa7, 0x28, 0xc2, 0xfa, 0x37, 0x05, 0x2c, 0xef, 0xa6, 0x1c, 0x71, 0x5c, 0x8a, 0x30, 0xa9,
+	0xb2, 0x02, 0xaa, 0x5e, 0xca, 0x38, 0x89, 0x30, 0x75, 0x03, 0x7f, 0x54, 0x03, 0xc8, 0xf7, 0x27,
+	0x3e, 0x7c, 0x0e, 0x00, 0x49, 0x30, 0x15, 0xbd, 0xd0, 0xd4, 0x7a, 0xa5, 0x51, 0x6d, 0xad, 0x19,
+	0xd3, 0x06, 0x60, 0x94, 0xe1, 0xf6, 0x24, 0xb9, 0x90, 0x1e, 0x8a, 0xc1, 0xff, 0xc1, 0x9f, 0x09,
+	0xa2, 0x3c, 0x40, 0xa1, 0x7b, 0x84, 0x82, 0x30, 0xa5, 0x58, 0xab, 0xd4, 0x95, 0xc6, 0xef, 0xce,
+	0x1f, 0xc5, 0xf3, 0x96, 0x78, 0x85, 0xff, 0x81, 0xf9, 0x01, 0x0a, 0x03, 0x1f, 0x71, 0xec, 0x92,
+	0x38, 0x3c, 0xd5, 0x7e, 0xcd, 0x61, 0x73, 0xf2, 0x71, 0x2f, 0x0e, 0x4f, 0xf5, 0xd7, 0x2a, 0x80,
+	0x57, 0xa3, 0xc2, 0x0d, 0x50, 0x4d, 0x93, 0x9c, 0x99, 0x35, 0x3c, 0x67, 0x56, 0x5b, 0x35, 0x59,
+	0x80, 0x9c, 0x89, 0xb1, 0x95, 0xcd, 0x64, 0x17, 0xb1, 0x13, 0x07, 0x08, 0x78, 0x66, 0xc3, 0x2d,
+	0x30, 0xe3, 0x51, 0x8c, 0xb8, 0xe8, 0x70, 0xb5, 0xb5, 0x7a, 0x63, 0xe1, 0xe5, 0x5e, 0x0d, 0x2b,
+	0xdf, 0xf9, 0xc5, 0x29, 0xd8, 0x99, 0x8e, 0x50, 0xd5, 0xd4, 0xbb, 0xe9, 0x08, 0x36, 0xd4, 0xc0,
+	0x0c, 0xc5, 0x11, 0x19, 0x88, 0x46, 0xcd, 0x66, 0x1e, 0xf1, 0xbb, 0x53, 0x05, 0xb3, 0x65, 0x67,
+	0xf5, 0xf7, 0x0a, 0xd0, 0xae, 0x4e, 0x9d, 0x25, 0x24, 0x66, 0x59, 0x2e, 0x4b, 0x13, 0x5d, 0x77,
+	0x31, 0xa5, 0x84, 0xe6, 0x92, 0xd5, 0x16, 0x94, 0xa9, 0xd1, 0xc4, 0x33, 0xba, 0xf9, 0x32, 0x3a,
+	0x8b, 0xe3, 0xf3, 0x78, 0x9c, 0xc1, 0xe1, 0x33, 0xf0, 0x1b, 0xc5, 0x2c, 0x0d, 0xb9, 0xdc, 0x8a,
+	0xfb, 0xd3, 0xb7, 0x62, 0x22, 0x29, 0x27, 0xe7, 0x3b, 0x52, 0x47, 0x7f, 0x00, 0x96, 0xae, 0x45,
+	0x64, 0x0b, 0x70, 0xcd, 0xc2, 0x8f, 0xef, 0x7a, 0xeb, 0x63, 0x05, 0x2c, 0x94, 0xc4, 0xae, 0x08,
+	0x09, 0x3f, 0x28, 0x60, 0x6e, 0xf4, 0x84, 0xe0, 0xbd, 0xe9, 0x59, 0x5e, 0x73, 0x72, 0xb5, 0x5b,
+	0x4d, 0x4c, 0x7f, 0x74, 0x69, 0x8f, 0x27, 0xfc, 0xea, 0xd3, 0xd7, 0x37, 0xaa, 0x01, 0x57, 0xb3,
+	0x4f, 0xd0, 0xd9, 0x98, 0x67, 0x53, 0xde, 0x1a, 0x33, 0x9b, 0xc5, 0x37, 0x29, 0x1b, 0x97, 0xd9,
+	0x3c, 0x87, 0x9f, 0x15, 0xb0, 0x30, 0x39, 0x46, 0xb8, 0x7e, 0xeb, 0x2e, 0xcb, 0x83, 0xaf, 0x59,
+	0x77, 0xa1, 0x8a, 0xad, 0xd1, 0xbb, 0x97, 0xf6, 0x5f, 0x23, 0x5f, 0x8b, 0xd5, 0xe1, 0x19, 0xe7,
+	0xa5, 0xad, 0xe9, 0x66, 0x56, 0xda, 0xb0, 0x96, 0xb3, 0x11, 0xf0, 0x66, 0xf3, 0x7c, 0xa4, 0x32,
+	0x2b, 0xca, 0x63, 0x58, 0x4a, 0xb3, 0xf6, 0xf7, 0x85, 0xad, 0x0d, 0xf3, 0x28, 0xac, 0x24, 0x60,
+	0x86, 0x47, 0xa2, 0xce, 0x0f, 0x05, 0xac, 0x78, 0x24, 0x9a, 0x9a, 0x73, 0x67, 0x69, 0x72, 0xe8,
+	0xfb, 0xd9, 0x51, 0xef, 0x2b, 0x2f, 0x76, 0x0a, 0x6a, 0x9f, 0x84, 0x28, 0xee, 0x1b, 0x84, 0xf6,
+	0xcd, 0x3e, 0x8e, 0xf3, 0x93, 0x37, 0x87, 0xc1, 0x6e, 0xfe, 0x03, 0xda, 0x90, 0xc6, 0x5b, 0xb5,
+	0xb2, 0x6d, 0xdb, 0xef, 0xd4, 0xfa, 0xb6, 0x10, 0xb4, 0x7d, 0x66, 0x08, 0x33, 0xb3, 0x0e, 0xda,
+	0x46, 0x11, 0x98, 0x5d, 0x48, 0x48, 0xcf, 0xf6, 0x59, 0xaf, 0x84, 0xf4, 0x0e, 0xda, 0x3d, 0x09,
+	0xf9, 0xae, 0xae, 0x88, 0x77, 0xcb, 0xb2, 0x7d, 0x66, 0x59, 0x25, 0xc8, 0xb2, 0x0e, 0xda, 0x96,
+	0x25, 0x61, 0x87, 0x33, 0x79, 0x9e, 0xed, 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7c, 0x4c, 0xb1,
+	0x43, 0x27, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// SharedSetServiceClient is the client API for SharedSetService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type SharedSetServiceClient interface {
+	// Returns the requested shared set in full detail.
+	GetSharedSet(ctx context.Context, in *GetSharedSetRequest, opts ...grpc.CallOption) (*resources.SharedSet, error)
+	// Creates, updates, or removes shared sets. Operation statuses are returned.
+	MutateSharedSets(ctx context.Context, in *MutateSharedSetsRequest, opts ...grpc.CallOption) (*MutateSharedSetsResponse, error)
+}
+
+type sharedSetServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewSharedSetServiceClient(cc grpc.ClientConnInterface) SharedSetServiceClient {
+	return &sharedSetServiceClient{cc}
+}
+
+func (c *sharedSetServiceClient) GetSharedSet(ctx context.Context, in *GetSharedSetRequest, opts ...grpc.CallOption) (*resources.SharedSet, error) {
+	out := new(resources.SharedSet)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.SharedSetService/GetSharedSet", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *sharedSetServiceClient) MutateSharedSets(ctx context.Context, in *MutateSharedSetsRequest, opts ...grpc.CallOption) (*MutateSharedSetsResponse, error) {
+	out := new(MutateSharedSetsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.SharedSetService/MutateSharedSets", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// SharedSetServiceServer is the server API for SharedSetService service.
+type SharedSetServiceServer interface {
+	// Returns the requested shared set in full detail.
+	GetSharedSet(context.Context, *GetSharedSetRequest) (*resources.SharedSet, error)
+	// Creates, updates, or removes shared sets. Operation statuses are returned.
+	MutateSharedSets(context.Context, *MutateSharedSetsRequest) (*MutateSharedSetsResponse, error)
+}
+
+// UnimplementedSharedSetServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedSharedSetServiceServer struct {
+}
+
+func (*UnimplementedSharedSetServiceServer) GetSharedSet(ctx context.Context, req *GetSharedSetRequest) (*resources.SharedSet, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetSharedSet not implemented")
+}
+func (*UnimplementedSharedSetServiceServer) MutateSharedSets(ctx context.Context, req *MutateSharedSetsRequest) (*MutateSharedSetsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateSharedSets not implemented")
+}
+
+func RegisterSharedSetServiceServer(s *grpc.Server, srv SharedSetServiceServer) {
+	s.RegisterService(&_SharedSetService_serviceDesc, srv)
+}
+
+func _SharedSetService_GetSharedSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSharedSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SharedSetServiceServer).GetSharedSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.SharedSetService/GetSharedSet",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SharedSetServiceServer).GetSharedSet(ctx, req.(*GetSharedSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SharedSetService_MutateSharedSets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateSharedSetsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SharedSetServiceServer).MutateSharedSets(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.SharedSetService/MutateSharedSets",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SharedSetServiceServer).MutateSharedSets(ctx, req.(*MutateSharedSetsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _SharedSetService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.SharedSetService",
+	HandlerType: (*SharedSetServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetSharedSet",
+			Handler:    _SharedSetService_GetSharedSet_Handler,
+		},
+		{
+			MethodName: "MutateSharedSets",
+			Handler:    _SharedSetService_MutateSharedSets_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/shared_set_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/shopping_performance_view_service.pb.go b/googleapis/ads/googleads/v3/services/shopping_performance_view_service.pb.go
new file mode 100644
index 0000000..a8d269d
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/shopping_performance_view_service.pb.go
@@ -0,0 +1,191 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/shopping_performance_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for
+// [ShoppingPerformanceViewService.GetShoppingPerformanceView][google.ads.googleads.v3.services.ShoppingPerformanceViewService.GetShoppingPerformanceView].
+type GetShoppingPerformanceViewRequest struct {
+	// Required. The resource name of the Shopping performance view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetShoppingPerformanceViewRequest) Reset()         { *m = GetShoppingPerformanceViewRequest{} }
+func (m *GetShoppingPerformanceViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetShoppingPerformanceViewRequest) ProtoMessage()    {}
+func (*GetShoppingPerformanceViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9f8e4c8a85feddc3, []int{0}
+}
+
+func (m *GetShoppingPerformanceViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetShoppingPerformanceViewRequest.Unmarshal(m, b)
+}
+func (m *GetShoppingPerformanceViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetShoppingPerformanceViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetShoppingPerformanceViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetShoppingPerformanceViewRequest.Merge(m, src)
+}
+func (m *GetShoppingPerformanceViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetShoppingPerformanceViewRequest.Size(m)
+}
+func (m *GetShoppingPerformanceViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetShoppingPerformanceViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetShoppingPerformanceViewRequest proto.InternalMessageInfo
+
+func (m *GetShoppingPerformanceViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetShoppingPerformanceViewRequest)(nil), "google.ads.googleads.v3.services.GetShoppingPerformanceViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/shopping_performance_view_service.proto", fileDescriptor_9f8e4c8a85feddc3)
+}
+
+var fileDescriptor_9f8e4c8a85feddc3 = []byte{
+	// 423 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xb1, 0xae, 0xd3, 0x30,
+	0x14, 0x55, 0xf2, 0x24, 0x24, 0x22, 0x58, 0xb2, 0xf0, 0x14, 0x10, 0x94, 0xc7, 0x1b, 0x9e, 0x18,
+	0x6c, 0x89, 0x0c, 0x08, 0x23, 0x06, 0x97, 0xa1, 0x2c, 0x40, 0xf5, 0x2a, 0x65, 0x40, 0x91, 0x22,
+	0x37, 0xb9, 0x4d, 0x2d, 0x25, 0x76, 0xb0, 0xd3, 0x74, 0x40, 0x2c, 0x8c, 0xac, 0xfc, 0x01, 0x23,
+	0x03, 0x1f, 0xd2, 0x95, 0x8d, 0x89, 0x81, 0x89, 0x81, 0x6f, 0x40, 0xa9, 0xe3, 0xb4, 0x45, 0x4a,
+	0xbb, 0x1d, 0xe5, 0x9c, 0x9c, 0x73, 0x7d, 0xcf, 0xf5, 0x5e, 0xe5, 0x52, 0xe6, 0x05, 0x60, 0x96,
+	0x69, 0x6c, 0x60, 0x8b, 0x9a, 0x10, 0x6b, 0x50, 0x0d, 0x4f, 0x41, 0x63, 0xbd, 0x94, 0x55, 0xc5,
+	0x45, 0x9e, 0x54, 0xa0, 0x16, 0x52, 0x95, 0x4c, 0xa4, 0x90, 0x34, 0x1c, 0xd6, 0x49, 0x27, 0x41,
+	0x95, 0x92, 0xb5, 0xf4, 0x47, 0xe6, 0x77, 0xc4, 0x32, 0x8d, 0x7a, 0x27, 0xd4, 0x84, 0xc8, 0x3a,
+	0x05, 0x74, 0x28, 0x4b, 0x81, 0x96, 0x2b, 0x75, 0x34, 0xcc, 0x84, 0x04, 0xf7, 0xac, 0x45, 0xc5,
+	0x31, 0x13, 0x42, 0xd6, 0xac, 0xe6, 0x52, 0xe8, 0x8e, 0xbd, 0xb3, 0xc7, 0xa6, 0x05, 0x07, 0x51,
+	0x77, 0xc4, 0x83, 0x3d, 0x62, 0xc1, 0xa1, 0xc8, 0x92, 0x39, 0x2c, 0x59, 0xc3, 0xa5, 0x32, 0x82,
+	0x8b, 0xd7, 0xde, 0xc3, 0x09, 0xd4, 0xb3, 0x2e, 0x7d, 0xba, 0x0b, 0x8f, 0x38, 0xac, 0xaf, 0xe1,
+	0xfd, 0x0a, 0x74, 0xed, 0x5f, 0x79, 0xb7, 0xed, 0xa4, 0x89, 0x60, 0x25, 0x9c, 0x3b, 0x23, 0xe7,
+	0xea, 0xe6, 0xf8, 0xec, 0x17, 0x75, 0xaf, 0x6f, 0x59, 0xe6, 0x0d, 0x2b, 0xe1, 0xc9, 0x77, 0xd7,
+	0xbb, 0x3f, 0x60, 0x36, 0x33, 0xdb, 0xf0, 0xff, 0x3a, 0x5e, 0x30, 0x1c, 0xe9, 0xbf, 0x44, 0xa7,
+	0xd6, 0x89, 0x4e, 0x0e, 0x1c, 0x90, 0x41, 0x93, 0x7e, 0xe3, 0x68, 0xc0, 0xe2, 0xe2, 0xed, 0x4f,
+	0x7a, 0xf8, 0xda, 0x4f, 0x3f, 0x7e, 0x7f, 0x71, 0x9f, 0xf9, 0x4f, 0xdb, 0xc2, 0x3e, 0x1c, 0x30,
+	0x2f, 0xd2, 0x95, 0xae, 0x65, 0x09, 0x4a, 0xe3, 0xc7, 0x7d, 0x83, 0xff, 0xf9, 0x7d, 0x0c, 0xee,
+	0x6e, 0xe8, 0xf9, 0x6e, 0x86, 0x0e, 0x55, 0x5c, 0xa3, 0x54, 0x96, 0xe3, 0xcf, 0xae, 0x77, 0x99,
+	0xca, 0xf2, 0xe4, 0xa3, 0xc7, 0x8f, 0x8e, 0xaf, 0x75, 0xda, 0xb6, 0x39, 0x75, 0xde, 0x75, 0x67,
+	0x8d, 0x72, 0x59, 0x30, 0x91, 0x23, 0xa9, 0x72, 0x9c, 0x83, 0xd8, 0x76, 0x8d, 0x77, 0xd1, 0xc3,
+	0x57, 0xff, 0xdc, 0x82, 0xaf, 0xee, 0xd9, 0x84, 0xd2, 0x6f, 0xee, 0x68, 0x62, 0x0c, 0x69, 0xa6,
+	0x91, 0x81, 0x2d, 0x8a, 0x42, 0xd4, 0x05, 0xeb, 0x8d, 0x95, 0xc4, 0x34, 0xd3, 0x71, 0x2f, 0x89,
+	0xa3, 0x30, 0xb6, 0x92, 0x3f, 0xee, 0xa5, 0xf9, 0x4e, 0x08, 0xcd, 0x34, 0x21, 0xbd, 0x88, 0x90,
+	0x28, 0x24, 0xc4, 0xca, 0xe6, 0x37, 0xb6, 0x73, 0x86, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x43,
+	0xdb, 0x03, 0x47, 0x9c, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// ShoppingPerformanceViewServiceClient is the client API for ShoppingPerformanceViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type ShoppingPerformanceViewServiceClient interface {
+	// Returns the requested Shopping performance view in full detail.
+	GetShoppingPerformanceView(ctx context.Context, in *GetShoppingPerformanceViewRequest, opts ...grpc.CallOption) (*resources.ShoppingPerformanceView, error)
+}
+
+type shoppingPerformanceViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewShoppingPerformanceViewServiceClient(cc grpc.ClientConnInterface) ShoppingPerformanceViewServiceClient {
+	return &shoppingPerformanceViewServiceClient{cc}
+}
+
+func (c *shoppingPerformanceViewServiceClient) GetShoppingPerformanceView(ctx context.Context, in *GetShoppingPerformanceViewRequest, opts ...grpc.CallOption) (*resources.ShoppingPerformanceView, error) {
+	out := new(resources.ShoppingPerformanceView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ShoppingPerformanceViewService/GetShoppingPerformanceView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// ShoppingPerformanceViewServiceServer is the server API for ShoppingPerformanceViewService service.
+type ShoppingPerformanceViewServiceServer interface {
+	// Returns the requested Shopping performance view in full detail.
+	GetShoppingPerformanceView(context.Context, *GetShoppingPerformanceViewRequest) (*resources.ShoppingPerformanceView, error)
+}
+
+// UnimplementedShoppingPerformanceViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedShoppingPerformanceViewServiceServer struct {
+}
+
+func (*UnimplementedShoppingPerformanceViewServiceServer) GetShoppingPerformanceView(ctx context.Context, req *GetShoppingPerformanceViewRequest) (*resources.ShoppingPerformanceView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetShoppingPerformanceView not implemented")
+}
+
+func RegisterShoppingPerformanceViewServiceServer(s *grpc.Server, srv ShoppingPerformanceViewServiceServer) {
+	s.RegisterService(&_ShoppingPerformanceViewService_serviceDesc, srv)
+}
+
+func _ShoppingPerformanceViewService_GetShoppingPerformanceView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetShoppingPerformanceViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ShoppingPerformanceViewServiceServer).GetShoppingPerformanceView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.ShoppingPerformanceViewService/GetShoppingPerformanceView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ShoppingPerformanceViewServiceServer).GetShoppingPerformanceView(ctx, req.(*GetShoppingPerformanceViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _ShoppingPerformanceViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.ShoppingPerformanceViewService",
+	HandlerType: (*ShoppingPerformanceViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetShoppingPerformanceView",
+			Handler:    _ShoppingPerformanceViewService_GetShoppingPerformanceView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/shopping_performance_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/topic_constant_service.pb.go b/googleapis/ads/googleads/v3/services/topic_constant_service.pb.go
new file mode 100644
index 0000000..c2823cc
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/topic_constant_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/topic_constant_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [TopicConstantService.GetTopicConstant][google.ads.googleads.v3.services.TopicConstantService.GetTopicConstant].
+type GetTopicConstantRequest struct {
+	// Required. Resource name of the Topic to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetTopicConstantRequest) Reset()         { *m = GetTopicConstantRequest{} }
+func (m *GetTopicConstantRequest) String() string { return proto.CompactTextString(m) }
+func (*GetTopicConstantRequest) ProtoMessage()    {}
+func (*GetTopicConstantRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5b4ada837764fee6, []int{0}
+}
+
+func (m *GetTopicConstantRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetTopicConstantRequest.Unmarshal(m, b)
+}
+func (m *GetTopicConstantRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetTopicConstantRequest.Marshal(b, m, deterministic)
+}
+func (m *GetTopicConstantRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetTopicConstantRequest.Merge(m, src)
+}
+func (m *GetTopicConstantRequest) XXX_Size() int {
+	return xxx_messageInfo_GetTopicConstantRequest.Size(m)
+}
+func (m *GetTopicConstantRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetTopicConstantRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetTopicConstantRequest proto.InternalMessageInfo
+
+func (m *GetTopicConstantRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetTopicConstantRequest)(nil), "google.ads.googleads.v3.services.GetTopicConstantRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/topic_constant_service.proto", fileDescriptor_5b4ada837764fee6)
+}
+
+var fileDescriptor_5b4ada837764fee6 = []byte{
+	// 405 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x41, 0x8b, 0xd3, 0x40,
+	0x18, 0x25, 0x29, 0x08, 0x06, 0x05, 0x09, 0x42, 0x6b, 0x14, 0x2c, 0xa5, 0x48, 0xf1, 0x30, 0x23,
+	0x06, 0x04, 0x47, 0x7b, 0x98, 0xf6, 0x50, 0x4f, 0x52, 0xaa, 0xf4, 0x20, 0x81, 0x30, 0x4d, 0xc6,
+	0x38, 0x90, 0xcc, 0xc4, 0xcc, 0x34, 0x17, 0x11, 0xc4, 0xbf, 0xe0, 0x3f, 0xf0, 0xe8, 0x7f, 0xf0,
+	0x0f, 0xf4, 0xea, 0xcd, 0xd3, 0x1e, 0xf6, 0xb4, 0xd7, 0xfd, 0x03, 0x4b, 0x3a, 0x99, 0xb4, 0xd9,
+	0xdd, 0xd0, 0xdb, 0x63, 0xde, 0x7b, 0xdf, 0xfb, 0xbe, 0x97, 0x38, 0xd3, 0x44, 0x88, 0x24, 0xa5,
+	0x90, 0xc4, 0x12, 0x6a, 0x58, 0xa1, 0xd2, 0x87, 0x92, 0x16, 0x25, 0x8b, 0xa8, 0x84, 0x4a, 0xe4,
+	0x2c, 0x0a, 0x23, 0xc1, 0xa5, 0x22, 0x5c, 0x85, 0xf5, 0x3b, 0xc8, 0x0b, 0xa1, 0x84, 0x3b, 0xd4,
+	0x1e, 0x40, 0x62, 0x09, 0x1a, 0x3b, 0x28, 0x7d, 0x60, 0xec, 0xde, 0xab, 0xae, 0x80, 0x82, 0x4a,
+	0xb1, 0x2d, 0x6e, 0x26, 0xe8, 0xc9, 0xde, 0x13, 0xe3, 0xcb, 0x19, 0x24, 0x9c, 0x0b, 0x45, 0x14,
+	0x13, 0x5c, 0xd6, 0x6c, 0xff, 0x88, 0x8d, 0x52, 0x46, 0x1b, 0xdb, 0xd3, 0x23, 0xe2, 0x33, 0xa3,
+	0x69, 0x1c, 0x6e, 0xe8, 0x17, 0x52, 0x32, 0x51, 0x68, 0xc1, 0x68, 0xee, 0xf4, 0x17, 0x54, 0x7d,
+	0xac, 0x22, 0xe7, 0x75, 0xe2, 0x8a, 0x7e, 0xdd, 0x52, 0xa9, 0xdc, 0x89, 0x73, 0xdf, 0x2c, 0x15,
+	0x72, 0x92, 0xd1, 0x81, 0x35, 0xb4, 0x26, 0x77, 0x67, 0xbd, 0x33, 0x6c, 0xaf, 0xee, 0x19, 0xe6,
+	0x3d, 0xc9, 0xe8, 0xcb, 0x4b, 0xcb, 0x79, 0xd8, 0x1a, 0xf1, 0x41, 0x9f, 0xeb, 0xfe, 0xb5, 0x9c,
+	0x07, 0xd7, 0xc7, 0xbb, 0xaf, 0xc1, 0xa9, 0x96, 0x40, 0xc7, 0x4a, 0xde, 0x8b, 0x4e, 0x6b, 0x53,
+	0x1f, 0x68, 0x19, 0x47, 0x6f, 0xff, 0xe3, 0xf6, 0x15, 0x3f, 0xff, 0x9d, 0xff, 0xb2, 0x9f, 0xb9,
+	0xe3, 0xaa, 0xf3, 0x6f, 0x2d, 0x66, 0xaa, 0x8e, 0x9d, 0x12, 0x3e, 0xff, 0xee, 0x3d, 0xde, 0xe1,
+	0xc1, 0x21, 0xa6, 0x46, 0x39, 0x93, 0x20, 0x12, 0xd9, 0xec, 0x87, 0xed, 0x8c, 0x23, 0x91, 0x9d,
+	0xbc, 0x66, 0xf6, 0xe8, 0xb6, 0x6e, 0x96, 0x55, 0xfd, 0x4b, 0xeb, 0xd3, 0xbb, 0xda, 0x9e, 0x88,
+	0x94, 0xf0, 0x04, 0x88, 0x22, 0x81, 0x09, 0xe5, 0xfb, 0x8f, 0x03, 0x0f, 0x81, 0xdd, 0x3f, 0xe4,
+	0x1b, 0x03, 0x7e, 0xdb, 0xbd, 0x05, 0xc6, 0x7f, 0xec, 0xe1, 0x42, 0x0f, 0xc4, 0xb1, 0x04, 0x1a,
+	0x56, 0x68, 0xed, 0x83, 0x3a, 0x58, 0xee, 0x8c, 0x24, 0xc0, 0xb1, 0x0c, 0x1a, 0x49, 0xb0, 0xf6,
+	0x03, 0x23, 0xb9, 0xb0, 0xc7, 0xfa, 0x1d, 0x21, 0x1c, 0x4b, 0x84, 0x1a, 0x11, 0x42, 0x6b, 0x1f,
+	0x21, 0x23, 0xdb, 0xdc, 0xd9, 0xef, 0xe9, 0x5f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x40, 0x95, 0xc9,
+	0x25, 0x37, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// TopicConstantServiceClient is the client API for TopicConstantService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type TopicConstantServiceClient interface {
+	// Returns the requested topic constant in full detail.
+	GetTopicConstant(ctx context.Context, in *GetTopicConstantRequest, opts ...grpc.CallOption) (*resources.TopicConstant, error)
+}
+
+type topicConstantServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewTopicConstantServiceClient(cc grpc.ClientConnInterface) TopicConstantServiceClient {
+	return &topicConstantServiceClient{cc}
+}
+
+func (c *topicConstantServiceClient) GetTopicConstant(ctx context.Context, in *GetTopicConstantRequest, opts ...grpc.CallOption) (*resources.TopicConstant, error) {
+	out := new(resources.TopicConstant)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.TopicConstantService/GetTopicConstant", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// TopicConstantServiceServer is the server API for TopicConstantService service.
+type TopicConstantServiceServer interface {
+	// Returns the requested topic constant in full detail.
+	GetTopicConstant(context.Context, *GetTopicConstantRequest) (*resources.TopicConstant, error)
+}
+
+// UnimplementedTopicConstantServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedTopicConstantServiceServer struct {
+}
+
+func (*UnimplementedTopicConstantServiceServer) GetTopicConstant(ctx context.Context, req *GetTopicConstantRequest) (*resources.TopicConstant, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetTopicConstant not implemented")
+}
+
+func RegisterTopicConstantServiceServer(s *grpc.Server, srv TopicConstantServiceServer) {
+	s.RegisterService(&_TopicConstantService_serviceDesc, srv)
+}
+
+func _TopicConstantService_GetTopicConstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetTopicConstantRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(TopicConstantServiceServer).GetTopicConstant(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.TopicConstantService/GetTopicConstant",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(TopicConstantServiceServer).GetTopicConstant(ctx, req.(*GetTopicConstantRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _TopicConstantService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.TopicConstantService",
+	HandlerType: (*TopicConstantServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetTopicConstant",
+			Handler:    _TopicConstantService_GetTopicConstant_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/topic_constant_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/topic_view_service.pb.go b/googleapis/ads/googleads/v3/services/topic_view_service.pb.go
new file mode 100644
index 0000000..c3d8a3e
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/topic_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/topic_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [TopicViewService.GetTopicView][google.ads.googleads.v3.services.TopicViewService.GetTopicView].
+type GetTopicViewRequest struct {
+	// Required. The resource name of the topic view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetTopicViewRequest) Reset()         { *m = GetTopicViewRequest{} }
+func (m *GetTopicViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetTopicViewRequest) ProtoMessage()    {}
+func (*GetTopicViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9cc4db1367a5244f, []int{0}
+}
+
+func (m *GetTopicViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetTopicViewRequest.Unmarshal(m, b)
+}
+func (m *GetTopicViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetTopicViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetTopicViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetTopicViewRequest.Merge(m, src)
+}
+func (m *GetTopicViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetTopicViewRequest.Size(m)
+}
+func (m *GetTopicViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetTopicViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetTopicViewRequest proto.InternalMessageInfo
+
+func (m *GetTopicViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetTopicViewRequest)(nil), "google.ads.googleads.v3.services.GetTopicViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/topic_view_service.proto", fileDescriptor_9cc4db1367a5244f)
+}
+
+var fileDescriptor_9cc4db1367a5244f = []byte{
+	// 409 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcd, 0xca, 0xd3, 0x40,
+	0x14, 0x25, 0xf9, 0x40, 0x30, 0x54, 0x90, 0x88, 0x58, 0xa2, 0x60, 0x29, 0x5d, 0x94, 0x52, 0x66,
+	0xa0, 0xc1, 0x85, 0x23, 0x22, 0x53, 0x84, 0xba, 0x92, 0x52, 0x25, 0x0b, 0x09, 0x84, 0x69, 0x72,
+	0x8d, 0x03, 0x49, 0x26, 0x66, 0xa6, 0xe9, 0x42, 0xdc, 0xf8, 0x0a, 0xbe, 0x81, 0x4b, 0xdf, 0xc0,
+	0x57, 0xe8, 0xd6, 0x9d, 0x2b, 0x17, 0xae, 0xf4, 0x15, 0x5c, 0x48, 0x3a, 0x99, 0xb4, 0x95, 0xaf,
+	0x74, 0x77, 0x98, 0xf3, 0x73, 0xef, 0x3d, 0x89, 0xf3, 0x38, 0x15, 0x22, 0xcd, 0x00, 0xb3, 0x44,
+	0x62, 0x0d, 0x1b, 0x54, 0xfb, 0x58, 0x42, 0x55, 0xf3, 0x18, 0x24, 0x56, 0xa2, 0xe4, 0x71, 0x54,
+	0x73, 0xd8, 0x46, 0xed, 0x1b, 0x2a, 0x2b, 0xa1, 0x84, 0x3b, 0xd0, 0x7a, 0xc4, 0x12, 0x89, 0x3a,
+	0x2b, 0xaa, 0x7d, 0x64, 0xac, 0xde, 0xec, 0x5c, 0x78, 0x05, 0x52, 0x6c, 0xaa, 0xd3, 0x74, 0x9d,
+	0xea, 0x3d, 0x30, 0x9e, 0x92, 0x63, 0x56, 0x14, 0x42, 0x31, 0xc5, 0x45, 0x21, 0x5b, 0xf6, 0xde,
+	0x11, 0x1b, 0x67, 0x1c, 0x0a, 0xd5, 0x12, 0x0f, 0x8f, 0x88, 0xb7, 0x1c, 0xb2, 0x24, 0x5a, 0xc3,
+	0x3b, 0x56, 0x73, 0x51, 0x69, 0xc1, 0xf0, 0x99, 0x73, 0x67, 0x01, 0xea, 0x75, 0x33, 0x2e, 0xe0,
+	0xb0, 0x5d, 0xc1, 0xfb, 0x0d, 0x48, 0xe5, 0x8e, 0x9d, 0x5b, 0x66, 0x99, 0xa8, 0x60, 0x39, 0xf4,
+	0xad, 0x81, 0x35, 0xbe, 0x39, 0xbf, 0xfa, 0x49, 0xed, 0x55, 0xcf, 0x30, 0x2f, 0x59, 0x0e, 0xb3,
+	0x3f, 0x96, 0x73, 0xbb, 0xb3, 0xbf, 0xd2, 0x27, 0xba, 0xdf, 0x2c, 0xa7, 0x77, 0x1c, 0xeb, 0x3e,
+	0x42, 0x97, 0x5a, 0x41, 0xd7, 0xac, 0xe1, 0x4d, 0xcf, 0xda, 0xba, 0xaa, 0x50, 0x67, 0x1a, 0x3e,
+	0xff, 0x41, 0x4f, 0xb7, 0xfe, 0xf4, 0xfd, 0xd7, 0x67, 0x1b, 0xb9, 0xd3, 0xa6, 0xdb, 0x0f, 0x27,
+	0xcc, 0xd3, 0x78, 0x23, 0x95, 0xc8, 0xa1, 0x92, 0x78, 0xa2, 0xcb, 0x6e, 0x12, 0x24, 0x9e, 0x7c,
+	0xf4, 0xee, 0xef, 0x68, 0xff, 0x30, 0xaa, 0x45, 0x25, 0x97, 0x28, 0x16, 0xf9, 0xfc, 0xaf, 0xe5,
+	0x8c, 0x62, 0x91, 0x5f, 0xbc, 0x66, 0x7e, 0xf7, 0xff, 0x4e, 0x96, 0x4d, 0xdd, 0x4b, 0xeb, 0xcd,
+	0x8b, 0xd6, 0x9a, 0x8a, 0x8c, 0x15, 0x29, 0x12, 0x55, 0x8a, 0x53, 0x28, 0xf6, 0x1f, 0x03, 0x1f,
+	0x86, 0x9d, 0xff, 0xf1, 0x9e, 0x18, 0xf0, 0xc5, 0xbe, 0x5a, 0x50, 0xfa, 0xd5, 0x1e, 0x2c, 0x74,
+	0x20, 0x4d, 0x24, 0xd2, 0xb0, 0x41, 0x81, 0x8f, 0xda, 0xc1, 0x72, 0x67, 0x24, 0x21, 0x4d, 0x64,
+	0xd8, 0x49, 0xc2, 0xc0, 0x0f, 0x8d, 0xe4, 0xb7, 0x3d, 0xd2, 0xef, 0x84, 0xd0, 0x44, 0x12, 0xd2,
+	0x89, 0x08, 0x09, 0x7c, 0x42, 0x8c, 0x6c, 0x7d, 0x63, 0xbf, 0xa7, 0xff, 0x2f, 0x00, 0x00, 0xff,
+	0xff, 0xac, 0x59, 0x01, 0xa5, 0x1f, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// TopicViewServiceClient is the client API for TopicViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type TopicViewServiceClient interface {
+	// Returns the requested topic view in full detail.
+	GetTopicView(ctx context.Context, in *GetTopicViewRequest, opts ...grpc.CallOption) (*resources.TopicView, error)
+}
+
+type topicViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewTopicViewServiceClient(cc grpc.ClientConnInterface) TopicViewServiceClient {
+	return &topicViewServiceClient{cc}
+}
+
+func (c *topicViewServiceClient) GetTopicView(ctx context.Context, in *GetTopicViewRequest, opts ...grpc.CallOption) (*resources.TopicView, error) {
+	out := new(resources.TopicView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.TopicViewService/GetTopicView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// TopicViewServiceServer is the server API for TopicViewService service.
+type TopicViewServiceServer interface {
+	// Returns the requested topic view in full detail.
+	GetTopicView(context.Context, *GetTopicViewRequest) (*resources.TopicView, error)
+}
+
+// UnimplementedTopicViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedTopicViewServiceServer struct {
+}
+
+func (*UnimplementedTopicViewServiceServer) GetTopicView(ctx context.Context, req *GetTopicViewRequest) (*resources.TopicView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetTopicView not implemented")
+}
+
+func RegisterTopicViewServiceServer(s *grpc.Server, srv TopicViewServiceServer) {
+	s.RegisterService(&_TopicViewService_serviceDesc, srv)
+}
+
+func _TopicViewService_GetTopicView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetTopicViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(TopicViewServiceServer).GetTopicView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.TopicViewService/GetTopicView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(TopicViewServiceServer).GetTopicView(ctx, req.(*GetTopicViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _TopicViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.TopicViewService",
+	HandlerType: (*TopicViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetTopicView",
+			Handler:    _TopicViewService_GetTopicView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/topic_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/user_interest_service.pb.go b/googleapis/ads/googleads/v3/services/user_interest_service.pb.go
new file mode 100644
index 0000000..4bd5490
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/user_interest_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/user_interest_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [UserInterestService.GetUserInterest][google.ads.googleads.v3.services.UserInterestService.GetUserInterest].
+type GetUserInterestRequest struct {
+	// Required. Resource name of the UserInterest to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetUserInterestRequest) Reset()         { *m = GetUserInterestRequest{} }
+func (m *GetUserInterestRequest) String() string { return proto.CompactTextString(m) }
+func (*GetUserInterestRequest) ProtoMessage()    {}
+func (*GetUserInterestRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a82485cc994a3e73, []int{0}
+}
+
+func (m *GetUserInterestRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUserInterestRequest.Unmarshal(m, b)
+}
+func (m *GetUserInterestRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUserInterestRequest.Marshal(b, m, deterministic)
+}
+func (m *GetUserInterestRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUserInterestRequest.Merge(m, src)
+}
+func (m *GetUserInterestRequest) XXX_Size() int {
+	return xxx_messageInfo_GetUserInterestRequest.Size(m)
+}
+func (m *GetUserInterestRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUserInterestRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUserInterestRequest proto.InternalMessageInfo
+
+func (m *GetUserInterestRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetUserInterestRequest)(nil), "google.ads.googleads.v3.services.GetUserInterestRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/user_interest_service.proto", fileDescriptor_a82485cc994a3e73)
+}
+
+var fileDescriptor_a82485cc994a3e73 = []byte{
+	// 411 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0x8b, 0xd4, 0x40,
+	0x14, 0x27, 0x39, 0x10, 0x0c, 0x8a, 0x10, 0x41, 0x97, 0x55, 0x70, 0x39, 0xae, 0x38, 0xae, 0x98,
+	0x41, 0x83, 0x20, 0xa3, 0x16, 0xb3, 0x4d, 0xb4, 0x91, 0xe3, 0xc4, 0x2d, 0x24, 0x10, 0xe6, 0x92,
+	0x67, 0x1c, 0x48, 0x66, 0xd6, 0x79, 0x93, 0x34, 0x62, 0xe3, 0x57, 0xf0, 0x1b, 0x58, 0xfa, 0x3d,
+	0x6c, 0xae, 0xb5, 0xb3, 0xb2, 0xb0, 0xf2, 0x23, 0xd8, 0x28, 0xd9, 0xc9, 0xe4, 0x72, 0x7a, 0xcb,
+	0x76, 0x3f, 0xf2, 0x7e, 0x7f, 0xde, 0xfb, 0x4d, 0xa2, 0x27, 0x95, 0xd6, 0x55, 0x0d, 0x54, 0x94,
+	0x48, 0x1d, 0xec, 0x51, 0x97, 0x50, 0x04, 0xd3, 0xc9, 0x02, 0x90, 0xb6, 0x08, 0x26, 0x97, 0xca,
+	0x82, 0x01, 0xb4, 0xf9, 0xf0, 0x99, 0xac, 0x8d, 0xb6, 0x3a, 0x5e, 0x38, 0x09, 0x11, 0x25, 0x92,
+	0x51, 0x4d, 0xba, 0x84, 0x78, 0xf5, 0xfc, 0xe1, 0x36, 0x7f, 0x03, 0xa8, 0x5b, 0xf3, 0x5f, 0x80,
+	0x33, 0x9e, 0xdf, 0xf5, 0xb2, 0xb5, 0xa4, 0x42, 0x29, 0x6d, 0x85, 0x95, 0x5a, 0xe1, 0x30, 0xbd,
+	0x3d, 0x99, 0x16, 0xb5, 0x04, 0xe5, 0x65, 0xf7, 0x26, 0x83, 0x37, 0x12, 0xea, 0x32, 0x3f, 0x85,
+	0xb7, 0xa2, 0x93, 0xda, 0x38, 0xc2, 0xfe, 0x32, 0xba, 0x95, 0x82, 0x7d, 0x85, 0x60, 0x9e, 0x0f,
+	0x81, 0x27, 0xf0, 0xae, 0x05, 0xb4, 0xf1, 0x61, 0x74, 0xdd, 0xaf, 0x94, 0x2b, 0xd1, 0xc0, 0x2c,
+	0x58, 0x04, 0x87, 0x57, 0x97, 0x7b, 0x3f, 0x78, 0x78, 0x72, 0xcd, 0x4f, 0x5e, 0x88, 0x06, 0x1e,
+	0xfc, 0x0e, 0xa2, 0x9b, 0x53, 0x87, 0x97, 0xee, 0xd6, 0xf8, 0x6b, 0x10, 0xdd, 0xf8, 0xc7, 0x3c,
+	0x7e, 0x44, 0x76, 0x35, 0x44, 0x2e, 0xdf, 0x67, 0x4e, 0xb7, 0x2a, 0xc7, 0xe6, 0xc8, 0x54, 0xb7,
+	0x9f, 0x7e, 0xe7, 0x17, 0x2f, 0xf8, 0xf8, 0xed, 0xe7, 0xa7, 0xf0, 0x7e, 0x4c, 0xfb, 0xb6, 0xdf,
+	0x5f, 0x98, 0x3c, 0x2d, 0x5a, 0xb4, 0xba, 0x01, 0x83, 0xf4, 0x68, 0x53, 0xbf, 0x37, 0x41, 0x7a,
+	0xf4, 0x61, 0x7e, 0xe7, 0x8c, 0xcf, 0xce, 0x03, 0x07, 0xb4, 0x96, 0x48, 0x0a, 0xdd, 0x2c, 0xff,
+	0x04, 0xd1, 0x41, 0xa1, 0x9b, 0x9d, 0x67, 0x2d, 0x67, 0x97, 0x54, 0x74, 0xdc, 0xbf, 0xc1, 0x71,
+	0xf0, 0xfa, 0xd9, 0xa0, 0xae, 0x74, 0x2d, 0x54, 0x45, 0xb4, 0xa9, 0x68, 0x05, 0x6a, 0xf3, 0x42,
+	0xf4, 0x3c, 0x6f, 0xfb, 0x3f, 0xf9, 0xd8, 0x83, 0xcf, 0xe1, 0x5e, 0xca, 0xf9, 0x97, 0x70, 0x91,
+	0x3a, 0x43, 0x5e, 0x22, 0x71, 0xb0, 0x47, 0xab, 0x84, 0x0c, 0xc1, 0x78, 0xe6, 0x29, 0x19, 0x2f,
+	0x31, 0x1b, 0x29, 0xd9, 0x2a, 0xc9, 0x3c, 0xe5, 0x57, 0x78, 0xe0, 0xbe, 0x33, 0xc6, 0x4b, 0x64,
+	0x6c, 0x24, 0x31, 0xb6, 0x4a, 0x18, 0xf3, 0xb4, 0xd3, 0x2b, 0x9b, 0x3d, 0x93, 0xbf, 0x01, 0x00,
+	0x00, 0xff, 0xff, 0x21, 0xc7, 0xa4, 0xbc, 0x3a, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// UserInterestServiceClient is the client API for UserInterestService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type UserInterestServiceClient interface {
+	// Returns the requested user interest in full detail
+	GetUserInterest(ctx context.Context, in *GetUserInterestRequest, opts ...grpc.CallOption) (*resources.UserInterest, error)
+}
+
+type userInterestServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewUserInterestServiceClient(cc grpc.ClientConnInterface) UserInterestServiceClient {
+	return &userInterestServiceClient{cc}
+}
+
+func (c *userInterestServiceClient) GetUserInterest(ctx context.Context, in *GetUserInterestRequest, opts ...grpc.CallOption) (*resources.UserInterest, error) {
+	out := new(resources.UserInterest)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.UserInterestService/GetUserInterest", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// UserInterestServiceServer is the server API for UserInterestService service.
+type UserInterestServiceServer interface {
+	// Returns the requested user interest in full detail
+	GetUserInterest(context.Context, *GetUserInterestRequest) (*resources.UserInterest, error)
+}
+
+// UnimplementedUserInterestServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedUserInterestServiceServer struct {
+}
+
+func (*UnimplementedUserInterestServiceServer) GetUserInterest(ctx context.Context, req *GetUserInterestRequest) (*resources.UserInterest, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetUserInterest not implemented")
+}
+
+func RegisterUserInterestServiceServer(s *grpc.Server, srv UserInterestServiceServer) {
+	s.RegisterService(&_UserInterestService_serviceDesc, srv)
+}
+
+func _UserInterestService_GetUserInterest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetUserInterestRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(UserInterestServiceServer).GetUserInterest(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.UserInterestService/GetUserInterest",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(UserInterestServiceServer).GetUserInterest(ctx, req.(*GetUserInterestRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _UserInterestService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.UserInterestService",
+	HandlerType: (*UserInterestServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetUserInterest",
+			Handler:    _UserInterestService_GetUserInterest_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/user_interest_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/user_list_service.pb.go b/googleapis/ads/googleads/v3/services/user_list_service.pb.go
new file mode 100644
index 0000000..492a0b8
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/user_list_service.pb.go
@@ -0,0 +1,528 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/user_list_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	status "google.golang.org/genproto/googleapis/rpc/status"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status1 "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [UserListService.GetUserList][google.ads.googleads.v3.services.UserListService.GetUserList].
+type GetUserListRequest struct {
+	// Required. The resource name of the user list to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetUserListRequest) Reset()         { *m = GetUserListRequest{} }
+func (m *GetUserListRequest) String() string { return proto.CompactTextString(m) }
+func (*GetUserListRequest) ProtoMessage()    {}
+func (*GetUserListRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1187560e29a12465, []int{0}
+}
+
+func (m *GetUserListRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUserListRequest.Unmarshal(m, b)
+}
+func (m *GetUserListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUserListRequest.Marshal(b, m, deterministic)
+}
+func (m *GetUserListRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUserListRequest.Merge(m, src)
+}
+func (m *GetUserListRequest) XXX_Size() int {
+	return xxx_messageInfo_GetUserListRequest.Size(m)
+}
+func (m *GetUserListRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUserListRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUserListRequest proto.InternalMessageInfo
+
+func (m *GetUserListRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+// Request message for [UserListService.MutateUserLists][google.ads.googleads.v3.services.UserListService.MutateUserLists].
+type MutateUserListsRequest struct {
+	// Required. The ID of the customer whose user lists are being modified.
+	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
+	// Required. The list of operations to perform on individual user lists.
+	Operations []*UserListOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
+	// If true, successful operations will be carried out and invalid
+	// operations will return errors. If false, all operations will be carried
+	// out in one transaction if and only if they are all valid.
+	// Default is false.
+	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
+	// If true, the request is validated but not executed. Only errors are
+	// returned, not results.
+	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateUserListsRequest) Reset()         { *m = MutateUserListsRequest{} }
+func (m *MutateUserListsRequest) String() string { return proto.CompactTextString(m) }
+func (*MutateUserListsRequest) ProtoMessage()    {}
+func (*MutateUserListsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1187560e29a12465, []int{1}
+}
+
+func (m *MutateUserListsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateUserListsRequest.Unmarshal(m, b)
+}
+func (m *MutateUserListsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateUserListsRequest.Marshal(b, m, deterministic)
+}
+func (m *MutateUserListsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateUserListsRequest.Merge(m, src)
+}
+func (m *MutateUserListsRequest) XXX_Size() int {
+	return xxx_messageInfo_MutateUserListsRequest.Size(m)
+}
+func (m *MutateUserListsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateUserListsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateUserListsRequest proto.InternalMessageInfo
+
+func (m *MutateUserListsRequest) GetCustomerId() string {
+	if m != nil {
+		return m.CustomerId
+	}
+	return ""
+}
+
+func (m *MutateUserListsRequest) GetOperations() []*UserListOperation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *MutateUserListsRequest) GetPartialFailure() bool {
+	if m != nil {
+		return m.PartialFailure
+	}
+	return false
+}
+
+func (m *MutateUserListsRequest) GetValidateOnly() bool {
+	if m != nil {
+		return m.ValidateOnly
+	}
+	return false
+}
+
+// A single operation (create, update) on a user list.
+type UserListOperation struct {
+	// FieldMask that determines which resource fields are modified in an update.
+	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	// The mutate operation.
+	//
+	// Types that are valid to be assigned to Operation:
+	//	*UserListOperation_Create
+	//	*UserListOperation_Update
+	//	*UserListOperation_Remove
+	Operation            isUserListOperation_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *UserListOperation) Reset()         { *m = UserListOperation{} }
+func (m *UserListOperation) String() string { return proto.CompactTextString(m) }
+func (*UserListOperation) ProtoMessage()    {}
+func (*UserListOperation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1187560e29a12465, []int{2}
+}
+
+func (m *UserListOperation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserListOperation.Unmarshal(m, b)
+}
+func (m *UserListOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserListOperation.Marshal(b, m, deterministic)
+}
+func (m *UserListOperation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserListOperation.Merge(m, src)
+}
+func (m *UserListOperation) XXX_Size() int {
+	return xxx_messageInfo_UserListOperation.Size(m)
+}
+func (m *UserListOperation) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserListOperation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UserListOperation proto.InternalMessageInfo
+
+func (m *UserListOperation) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+type isUserListOperation_Operation interface {
+	isUserListOperation_Operation()
+}
+
+type UserListOperation_Create struct {
+	Create *resources.UserList `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
+}
+
+type UserListOperation_Update struct {
+	Update *resources.UserList `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
+}
+
+type UserListOperation_Remove struct {
+	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
+}
+
+func (*UserListOperation_Create) isUserListOperation_Operation() {}
+
+func (*UserListOperation_Update) isUserListOperation_Operation() {}
+
+func (*UserListOperation_Remove) isUserListOperation_Operation() {}
+
+func (m *UserListOperation) GetOperation() isUserListOperation_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *UserListOperation) GetCreate() *resources.UserList {
+	if x, ok := m.GetOperation().(*UserListOperation_Create); ok {
+		return x.Create
+	}
+	return nil
+}
+
+func (m *UserListOperation) GetUpdate() *resources.UserList {
+	if x, ok := m.GetOperation().(*UserListOperation_Update); ok {
+		return x.Update
+	}
+	return nil
+}
+
+func (m *UserListOperation) GetRemove() string {
+	if x, ok := m.GetOperation().(*UserListOperation_Remove); ok {
+		return x.Remove
+	}
+	return ""
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*UserListOperation) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*UserListOperation_Create)(nil),
+		(*UserListOperation_Update)(nil),
+		(*UserListOperation_Remove)(nil),
+	}
+}
+
+// Response message for user list mutate.
+type MutateUserListsResponse struct {
+	// Errors that pertain to operation failures in the partial failure mode.
+	// Returned only when partial_failure = true and all errors occur inside the
+	// operations. If any errors occur outside the operations (e.g. auth errors),
+	// we return an RPC level error.
+	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
+	// All results for the mutate.
+	Results              []*MutateUserListResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *MutateUserListsResponse) Reset()         { *m = MutateUserListsResponse{} }
+func (m *MutateUserListsResponse) String() string { return proto.CompactTextString(m) }
+func (*MutateUserListsResponse) ProtoMessage()    {}
+func (*MutateUserListsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1187560e29a12465, []int{3}
+}
+
+func (m *MutateUserListsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateUserListsResponse.Unmarshal(m, b)
+}
+func (m *MutateUserListsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateUserListsResponse.Marshal(b, m, deterministic)
+}
+func (m *MutateUserListsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateUserListsResponse.Merge(m, src)
+}
+func (m *MutateUserListsResponse) XXX_Size() int {
+	return xxx_messageInfo_MutateUserListsResponse.Size(m)
+}
+func (m *MutateUserListsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateUserListsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateUserListsResponse proto.InternalMessageInfo
+
+func (m *MutateUserListsResponse) GetPartialFailureError() *status.Status {
+	if m != nil {
+		return m.PartialFailureError
+	}
+	return nil
+}
+
+func (m *MutateUserListsResponse) GetResults() []*MutateUserListResult {
+	if m != nil {
+		return m.Results
+	}
+	return nil
+}
+
+// The result for the user list mutate.
+type MutateUserListResult struct {
+	// Returned for successful operations.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MutateUserListResult) Reset()         { *m = MutateUserListResult{} }
+func (m *MutateUserListResult) String() string { return proto.CompactTextString(m) }
+func (*MutateUserListResult) ProtoMessage()    {}
+func (*MutateUserListResult) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1187560e29a12465, []int{4}
+}
+
+func (m *MutateUserListResult) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MutateUserListResult.Unmarshal(m, b)
+}
+func (m *MutateUserListResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MutateUserListResult.Marshal(b, m, deterministic)
+}
+func (m *MutateUserListResult) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MutateUserListResult.Merge(m, src)
+}
+func (m *MutateUserListResult) XXX_Size() int {
+	return xxx_messageInfo_MutateUserListResult.Size(m)
+}
+func (m *MutateUserListResult) XXX_DiscardUnknown() {
+	xxx_messageInfo_MutateUserListResult.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MutateUserListResult proto.InternalMessageInfo
+
+func (m *MutateUserListResult) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetUserListRequest)(nil), "google.ads.googleads.v3.services.GetUserListRequest")
+	proto.RegisterType((*MutateUserListsRequest)(nil), "google.ads.googleads.v3.services.MutateUserListsRequest")
+	proto.RegisterType((*UserListOperation)(nil), "google.ads.googleads.v3.services.UserListOperation")
+	proto.RegisterType((*MutateUserListsResponse)(nil), "google.ads.googleads.v3.services.MutateUserListsResponse")
+	proto.RegisterType((*MutateUserListResult)(nil), "google.ads.googleads.v3.services.MutateUserListResult")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/user_list_service.proto", fileDescriptor_1187560e29a12465)
+}
+
+var fileDescriptor_1187560e29a12465 = []byte{
+	// 757 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4d, 0x6b, 0xdb, 0x48,
+	0x18, 0x5e, 0xc9, 0x4b, 0x76, 0x33, 0x4a, 0x36, 0xec, 0x6c, 0x36, 0x31, 0xde, 0x85, 0x35, 0xda,
+	0x40, 0x8d, 0xd3, 0x4a, 0xd4, 0x2a, 0x25, 0x55, 0x48, 0x41, 0x2e, 0xf9, 0x28, 0x34, 0x4d, 0x50,
+	0x68, 0x28, 0xc5, 0x20, 0x26, 0xd2, 0xc4, 0x15, 0x91, 0x34, 0xea, 0xcc, 0xc8, 0x10, 0x42, 0x2e,
+	0x85, 0xfe, 0x82, 0xfe, 0x83, 0x1e, 0x7b, 0x2d, 0xfd, 0x05, 0xbd, 0xe5, 0xda, 0x5b, 0x4e, 0x3d,
+	0x94, 0x1e, 0xfa, 0x17, 0x7a, 0x29, 0xd2, 0x68, 0xfc, 0x95, 0x04, 0x93, 0xdc, 0x5e, 0xcf, 0xfb,
+	0x3c, 0xcf, 0xfb, 0x2d, 0x83, 0x95, 0x2e, 0x21, 0xdd, 0x08, 0x9b, 0x28, 0x60, 0xa6, 0x30, 0x73,
+	0xab, 0x67, 0x99, 0x0c, 0xd3, 0x5e, 0xe8, 0x63, 0x66, 0x66, 0x0c, 0x53, 0x2f, 0x0a, 0x19, 0xf7,
+	0xca, 0x27, 0x23, 0xa5, 0x84, 0x13, 0x58, 0x17, 0x70, 0x03, 0x05, 0xcc, 0xe8, 0x33, 0x8d, 0x9e,
+	0x65, 0x48, 0x66, 0xed, 0xee, 0x55, 0xda, 0x14, 0x33, 0x92, 0xd1, 0x11, 0x71, 0x21, 0x5a, 0xfb,
+	0x57, 0x52, 0xd2, 0xd0, 0x44, 0x49, 0x42, 0x38, 0xe2, 0x21, 0x49, 0x58, 0xe9, 0x5d, 0x1c, 0xf2,
+	0xfa, 0x51, 0x88, 0x13, 0x49, 0xfb, 0x6f, 0xc8, 0x71, 0x18, 0xe2, 0x28, 0xf0, 0x0e, 0xf0, 0x4b,
+	0xd4, 0x0b, 0x09, 0x2d, 0x01, 0x65, 0xb2, 0x66, 0xf1, 0xeb, 0x20, 0x3b, 0x2c, 0x51, 0x31, 0x62,
+	0x47, 0x63, 0xda, 0x34, 0xf5, 0x4d, 0xc6, 0x11, 0xcf, 0xca, 0xa0, 0xfa, 0x43, 0x00, 0x37, 0x31,
+	0x7f, 0xc6, 0x30, 0x7d, 0x12, 0x32, 0xee, 0xe2, 0x57, 0x19, 0x66, 0x1c, 0x36, 0xc0, 0xac, 0xac,
+	0xc2, 0x4b, 0x50, 0x8c, 0xab, 0x4a, 0x5d, 0x69, 0x4c, 0xb7, 0x2b, 0x5f, 0x1c, 0xd5, 0x9d, 0x91,
+	0x9e, 0xa7, 0x28, 0xc6, 0xfa, 0x37, 0x05, 0x2c, 0x6c, 0x67, 0x1c, 0x71, 0x2c, 0x35, 0x98, 0x14,
+	0x59, 0x02, 0x9a, 0x9f, 0x31, 0x4e, 0x62, 0x4c, 0xbd, 0x30, 0x18, 0x96, 0x00, 0xf2, 0xfd, 0x71,
+	0x00, 0x9f, 0x03, 0x40, 0x52, 0x4c, 0x45, 0x27, 0xaa, 0x6a, 0xbd, 0xd2, 0xd0, 0x5a, 0x96, 0x31,
+	0xa9, 0xfb, 0x86, 0x8c, 0xb6, 0x23, 0xb9, 0xa5, 0xf2, 0x40, 0x0b, 0xde, 0x02, 0x73, 0x29, 0xa2,
+	0x3c, 0x44, 0x91, 0x77, 0x88, 0xc2, 0x28, 0xa3, 0xb8, 0x5a, 0xa9, 0x2b, 0x8d, 0xdf, 0xdd, 0x3f,
+	0xca, 0xe7, 0x0d, 0xf1, 0x0a, 0xff, 0x07, 0xb3, 0x3d, 0x14, 0x85, 0x01, 0xe2, 0xd8, 0x23, 0x49,
+	0x74, 0x5c, 0xfd, 0xb5, 0x80, 0xcd, 0xc8, 0xc7, 0x9d, 0x24, 0x3a, 0xd6, 0xdf, 0xa8, 0xe0, 0xcf,
+	0x0b, 0x41, 0xe1, 0x2a, 0xd0, 0xb2, 0xb4, 0x20, 0xe6, 0xcd, 0x2e, 0x88, 0x5a, 0xab, 0x26, 0xd3,
+	0x97, 0xf3, 0x30, 0x36, 0xf2, 0x79, 0x6c, 0x23, 0x76, 0xe4, 0x02, 0x01, 0xcf, 0x6d, 0xb8, 0x0e,
+	0xa6, 0x7c, 0x8a, 0x11, 0x17, 0xed, 0xd5, 0x5a, 0xcb, 0x57, 0x96, 0xdd, 0x5f, 0xa9, 0x7e, 0xdd,
+	0x5b, 0xbf, 0xb8, 0x25, 0x39, 0x97, 0x11, 0xa2, 0x55, 0xf5, 0x46, 0x32, 0x82, 0x0c, 0xab, 0x60,
+	0x8a, 0xe2, 0x98, 0xf4, 0x44, 0x97, 0xa6, 0x73, 0x8f, 0xf8, 0xdd, 0xd6, 0xc0, 0x74, 0xbf, 0xad,
+	0xfa, 0x07, 0x05, 0x2c, 0x5e, 0x18, 0x38, 0x4b, 0x49, 0xc2, 0x30, 0xdc, 0x00, 0x7f, 0x8f, 0x75,
+	0xdc, 0xc3, 0x94, 0x12, 0x5a, 0x28, 0x6a, 0x2d, 0x28, 0x13, 0xa3, 0xa9, 0x6f, 0xec, 0x15, 0x5b,
+	0xe8, 0xfe, 0x35, 0x3a, 0x8b, 0xf5, 0x1c, 0x0e, 0x77, 0xc1, 0x6f, 0x14, 0xb3, 0x2c, 0xe2, 0x72,
+	0x21, 0xee, 0x4f, 0x5e, 0x88, 0xd1, 0x9c, 0xdc, 0x82, 0xee, 0x4a, 0x19, 0x7d, 0x15, 0xcc, 0x5f,
+	0x06, 0xc8, 0x47, 0x7f, 0xc9, 0xa2, 0x8f, 0xee, 0x78, 0xeb, 0x53, 0x05, 0xcc, 0x49, 0xde, 0x9e,
+	0x88, 0x07, 0x3f, 0x2a, 0x40, 0x1b, 0x3a, 0x1c, 0x78, 0x6f, 0x72, 0x86, 0x17, 0xef, 0xac, 0x76,
+	0x9d, 0x51, 0xe9, 0x8f, 0xce, 0x9d, 0xd1, 0x64, 0x5f, 0x7f, 0xfe, 0xfa, 0x56, 0xbd, 0x03, 0x97,
+	0xf3, 0x8f, 0xce, 0xc9, 0x88, 0x67, 0x4d, 0x1e, 0x18, 0x33, 0x9b, 0xc5, 0x57, 0xa8, 0x98, 0x93,
+	0xd9, 0x3c, 0x85, 0xe7, 0x0a, 0x98, 0x1b, 0x1b, 0x1f, 0x5c, 0xb9, 0x6e, 0x77, 0xe5, 0x89, 0xd7,
+	0x1e, 0xdc, 0x80, 0x29, 0x76, 0x45, 0x77, 0xcf, 0x9d, 0x85, 0xa1, 0xcf, 0xc3, 0xed, 0xc1, 0xe1,
+	0x16, 0x65, 0x59, 0xba, 0x91, 0x97, 0x35, 0xa8, 0xe3, 0x64, 0x08, 0xbc, 0xd6, 0x3c, 0x1d, 0x54,
+	0x65, 0xc7, 0x45, 0x04, 0x5b, 0x69, 0xd6, 0xfe, 0x39, 0x73, 0xaa, 0x83, 0x2c, 0x4a, 0x2b, 0x0d,
+	0x99, 0xe1, 0x93, 0xb8, 0xfd, 0x43, 0x01, 0x4b, 0x3e, 0x89, 0x27, 0x66, 0xdc, 0x9e, 0x1f, 0x9b,
+	0xf5, 0x6e, 0x7e, 0xc5, 0xbb, 0xca, 0x8b, 0xad, 0x92, 0xd9, 0x25, 0x11, 0x4a, 0xba, 0x06, 0xa1,
+	0x5d, 0xb3, 0x8b, 0x93, 0xe2, 0xc6, 0xcd, 0x41, 0xac, 0xab, 0xff, 0x6b, 0x56, 0xa5, 0xf1, 0x4e,
+	0xad, 0x6c, 0x3a, 0xce, 0x7b, 0xb5, 0xbe, 0x29, 0x04, 0x9d, 0x80, 0x19, 0xc2, 0xcc, 0xad, 0x7d,
+	0xcb, 0x28, 0x03, 0xb3, 0x33, 0x09, 0xe9, 0x38, 0x01, 0xeb, 0xf4, 0x21, 0x9d, 0x7d, 0xab, 0x23,
+	0x21, 0xdf, 0xd5, 0x25, 0xf1, 0x6e, 0xdb, 0x4e, 0xc0, 0x6c, 0xbb, 0x0f, 0xb2, 0xed, 0x7d, 0xcb,
+	0xb6, 0x25, 0xec, 0x60, 0xaa, 0xc8, 0xd3, 0xfa, 0x19, 0x00, 0x00, 0xff, 0xff, 0x16, 0x2a, 0xc1,
+	0xa6, 0x12, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// UserListServiceClient is the client API for UserListService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type UserListServiceClient interface {
+	// Returns the requested user list.
+	GetUserList(ctx context.Context, in *GetUserListRequest, opts ...grpc.CallOption) (*resources.UserList, error)
+	// Creates or updates user lists. Operation statuses are returned.
+	MutateUserLists(ctx context.Context, in *MutateUserListsRequest, opts ...grpc.CallOption) (*MutateUserListsResponse, error)
+}
+
+type userListServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewUserListServiceClient(cc grpc.ClientConnInterface) UserListServiceClient {
+	return &userListServiceClient{cc}
+}
+
+func (c *userListServiceClient) GetUserList(ctx context.Context, in *GetUserListRequest, opts ...grpc.CallOption) (*resources.UserList, error) {
+	out := new(resources.UserList)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.UserListService/GetUserList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *userListServiceClient) MutateUserLists(ctx context.Context, in *MutateUserListsRequest, opts ...grpc.CallOption) (*MutateUserListsResponse, error) {
+	out := new(MutateUserListsResponse)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.UserListService/MutateUserLists", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// UserListServiceServer is the server API for UserListService service.
+type UserListServiceServer interface {
+	// Returns the requested user list.
+	GetUserList(context.Context, *GetUserListRequest) (*resources.UserList, error)
+	// Creates or updates user lists. Operation statuses are returned.
+	MutateUserLists(context.Context, *MutateUserListsRequest) (*MutateUserListsResponse, error)
+}
+
+// UnimplementedUserListServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedUserListServiceServer struct {
+}
+
+func (*UnimplementedUserListServiceServer) GetUserList(ctx context.Context, req *GetUserListRequest) (*resources.UserList, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method GetUserList not implemented")
+}
+func (*UnimplementedUserListServiceServer) MutateUserLists(ctx context.Context, req *MutateUserListsRequest) (*MutateUserListsResponse, error) {
+	return nil, status1.Errorf(codes.Unimplemented, "method MutateUserLists not implemented")
+}
+
+func RegisterUserListServiceServer(s *grpc.Server, srv UserListServiceServer) {
+	s.RegisterService(&_UserListService_serviceDesc, srv)
+}
+
+func _UserListService_GetUserList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetUserListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(UserListServiceServer).GetUserList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.UserListService/GetUserList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(UserListServiceServer).GetUserList(ctx, req.(*GetUserListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _UserListService_MutateUserLists_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MutateUserListsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(UserListServiceServer).MutateUserLists(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.UserListService/MutateUserLists",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(UserListServiceServer).MutateUserLists(ctx, req.(*MutateUserListsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _UserListService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.UserListService",
+	HandlerType: (*UserListServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetUserList",
+			Handler:    _UserListService_GetUserList_Handler,
+		},
+		{
+			MethodName: "MutateUserLists",
+			Handler:    _UserListService_MutateUserLists_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/user_list_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/user_location_view_service.pb.go b/googleapis/ads/googleads/v3/services/user_location_view_service.pb.go
new file mode 100644
index 0000000..30464f6
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/user_location_view_service.pb.go
@@ -0,0 +1,189 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/user_location_view_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [UserLocationViewService.GetUserLocationView][google.ads.googleads.v3.services.UserLocationViewService.GetUserLocationView].
+type GetUserLocationViewRequest struct {
+	// Required. The resource name of the user location view to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetUserLocationViewRequest) Reset()         { *m = GetUserLocationViewRequest{} }
+func (m *GetUserLocationViewRequest) String() string { return proto.CompactTextString(m) }
+func (*GetUserLocationViewRequest) ProtoMessage()    {}
+func (*GetUserLocationViewRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7fcc93788fa7dbb3, []int{0}
+}
+
+func (m *GetUserLocationViewRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUserLocationViewRequest.Unmarshal(m, b)
+}
+func (m *GetUserLocationViewRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUserLocationViewRequest.Marshal(b, m, deterministic)
+}
+func (m *GetUserLocationViewRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUserLocationViewRequest.Merge(m, src)
+}
+func (m *GetUserLocationViewRequest) XXX_Size() int {
+	return xxx_messageInfo_GetUserLocationViewRequest.Size(m)
+}
+func (m *GetUserLocationViewRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUserLocationViewRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUserLocationViewRequest proto.InternalMessageInfo
+
+func (m *GetUserLocationViewRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetUserLocationViewRequest)(nil), "google.ads.googleads.v3.services.GetUserLocationViewRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/user_location_view_service.proto", fileDescriptor_7fcc93788fa7dbb3)
+}
+
+var fileDescriptor_7fcc93788fa7dbb3 = []byte{
+	// 416 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3d, 0x8b, 0xd5, 0x40,
+	0x14, 0x25, 0x59, 0x10, 0x0c, 0xda, 0xc4, 0x62, 0x97, 0xb8, 0xe0, 0x63, 0xd9, 0x62, 0xd9, 0x62,
+	0x06, 0x1c, 0x6c, 0x46, 0x2d, 0xe6, 0x15, 0x3e, 0x41, 0x91, 0x65, 0xc5, 0x14, 0x12, 0x08, 0xb3,
+	0xc9, 0x35, 0x0e, 0x24, 0x99, 0xe7, 0xdc, 0x24, 0x5b, 0x88, 0x8d, 0xf6, 0x36, 0xfe, 0x03, 0x4b,
+	0x7f, 0xca, 0xb6, 0x62, 0x63, 0x65, 0x61, 0xe5, 0xaf, 0x90, 0x64, 0x32, 0xd9, 0xb7, 0xcb, 0x86,
+	0xd7, 0x1d, 0xe6, 0x9c, 0x7b, 0xce, 0xfd, 0x98, 0x40, 0x14, 0x5a, 0x17, 0x25, 0x50, 0x99, 0x23,
+	0xb5, 0xb0, 0x47, 0x1d, 0xa3, 0x08, 0xa6, 0x53, 0x19, 0x20, 0x6d, 0x11, 0x4c, 0x5a, 0xea, 0x4c,
+	0x36, 0x4a, 0xd7, 0x69, 0xa7, 0xe0, 0x3c, 0x1d, 0x39, 0xb2, 0x36, 0xba, 0xd1, 0xe1, 0xc2, 0xd6,
+	0x11, 0x99, 0x23, 0x99, 0x2c, 0x48, 0xc7, 0x88, 0xb3, 0x88, 0xf8, 0x5c, 0x88, 0x01, 0xd4, 0xad,
+	0xb9, 0x39, 0xc5, 0xba, 0x47, 0xfb, 0xae, 0x76, 0xad, 0xa8, 0xac, 0x6b, 0xdd, 0x0c, 0x0a, 0x1c,
+	0xd9, 0xdd, 0x0d, 0x36, 0x2b, 0x15, 0xd4, 0xcd, 0x48, 0x3c, 0xd8, 0x20, 0xde, 0x29, 0x28, 0xf3,
+	0xf4, 0x0c, 0xde, 0xcb, 0x4e, 0x69, 0x63, 0x05, 0x07, 0xcf, 0x82, 0x68, 0x05, 0xcd, 0x1b, 0x04,
+	0xf3, 0x72, 0x4c, 0x8d, 0x15, 0x9c, 0x9f, 0xc2, 0x87, 0x16, 0xb0, 0x09, 0x8f, 0x82, 0xbb, 0xae,
+	0xb7, 0xb4, 0x96, 0x15, 0xec, 0x79, 0x0b, 0xef, 0xe8, 0xf6, 0x72, 0xe7, 0x8f, 0xf0, 0x4f, 0xef,
+	0x38, 0xe6, 0x95, 0xac, 0xe0, 0xe1, 0x57, 0x3f, 0xd8, 0xbd, 0xee, 0xf2, 0xda, 0x0e, 0x1e, 0xfe,
+	0xf2, 0x82, 0x7b, 0x37, 0x84, 0x84, 0x4f, 0xc8, 0xb6, 0x95, 0x91, 0xf9, 0xde, 0x22, 0x36, 0x5b,
+	0x3d, 0xad, 0x93, 0x5c, 0xaf, 0x3d, 0x78, 0xf1, 0x5b, 0x5c, 0x9d, 0xe8, 0xf3, 0xcf, 0xbf, 0xdf,
+	0xfc, 0x47, 0x21, 0xeb, 0xcf, 0xf0, 0xf1, 0x0a, 0xf3, 0x34, 0x6b, 0xb1, 0xd1, 0x15, 0x18, 0xa4,
+	0xc7, 0xc3, 0x5d, 0x36, 0x8d, 0x90, 0x1e, 0x7f, 0x8a, 0xee, 0x5f, 0x88, 0xbd, 0xcb, 0xe0, 0x11,
+	0xad, 0x15, 0x92, 0x4c, 0x57, 0xcb, 0x2f, 0x7e, 0x70, 0x98, 0xe9, 0x6a, 0xeb, 0x88, 0xcb, 0xfd,
+	0x99, 0xb5, 0x9d, 0xf4, 0xf7, 0x39, 0xf1, 0xde, 0x3e, 0x1f, 0x1d, 0x0a, 0x5d, 0xca, 0xba, 0x20,
+	0xda, 0x14, 0xb4, 0x80, 0x7a, 0xb8, 0x1e, 0xbd, 0xcc, 0x9c, 0xff, 0xb9, 0x8f, 0x1d, 0xf8, 0xee,
+	0xef, 0xac, 0x84, 0xf8, 0xe1, 0x2f, 0x56, 0xd6, 0x50, 0xe4, 0x48, 0x2c, 0xec, 0x51, 0xcc, 0xc8,
+	0x18, 0x8c, 0x17, 0x4e, 0x92, 0x88, 0x1c, 0x93, 0x49, 0x92, 0xc4, 0x2c, 0x71, 0x92, 0x7f, 0xfe,
+	0xa1, 0x7d, 0xe7, 0x5c, 0xe4, 0xc8, 0xf9, 0x24, 0xe2, 0x3c, 0x66, 0x9c, 0x3b, 0xd9, 0xd9, 0xad,
+	0xa1, 0x4f, 0xf6, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xa0, 0x4c, 0x17, 0x4e, 0x60, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// UserLocationViewServiceClient is the client API for UserLocationViewService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type UserLocationViewServiceClient interface {
+	// Returns the requested user location view in full detail.
+	GetUserLocationView(ctx context.Context, in *GetUserLocationViewRequest, opts ...grpc.CallOption) (*resources.UserLocationView, error)
+}
+
+type userLocationViewServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewUserLocationViewServiceClient(cc grpc.ClientConnInterface) UserLocationViewServiceClient {
+	return &userLocationViewServiceClient{cc}
+}
+
+func (c *userLocationViewServiceClient) GetUserLocationView(ctx context.Context, in *GetUserLocationViewRequest, opts ...grpc.CallOption) (*resources.UserLocationView, error) {
+	out := new(resources.UserLocationView)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.UserLocationViewService/GetUserLocationView", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// UserLocationViewServiceServer is the server API for UserLocationViewService service.
+type UserLocationViewServiceServer interface {
+	// Returns the requested user location view in full detail.
+	GetUserLocationView(context.Context, *GetUserLocationViewRequest) (*resources.UserLocationView, error)
+}
+
+// UnimplementedUserLocationViewServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedUserLocationViewServiceServer struct {
+}
+
+func (*UnimplementedUserLocationViewServiceServer) GetUserLocationView(ctx context.Context, req *GetUserLocationViewRequest) (*resources.UserLocationView, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetUserLocationView not implemented")
+}
+
+func RegisterUserLocationViewServiceServer(s *grpc.Server, srv UserLocationViewServiceServer) {
+	s.RegisterService(&_UserLocationViewService_serviceDesc, srv)
+}
+
+func _UserLocationViewService_GetUserLocationView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetUserLocationViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(UserLocationViewServiceServer).GetUserLocationView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.UserLocationViewService/GetUserLocationView",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(UserLocationViewServiceServer).GetUserLocationView(ctx, req.(*GetUserLocationViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _UserLocationViewService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.UserLocationViewService",
+	HandlerType: (*UserLocationViewServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetUserLocationView",
+			Handler:    _UserLocationViewService_GetUserLocationView_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/user_location_view_service.proto",
+}
diff --git a/googleapis/ads/googleads/v3/services/video_service.pb.go b/googleapis/ads/googleads/v3/services/video_service.pb.go
new file mode 100644
index 0000000..683a13a
--- /dev/null
+++ b/googleapis/ads/googleads/v3/services/video_service.pb.go
@@ -0,0 +1,188 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/ads/googleads/v3/services/video_service.proto
+
+package services
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Request message for [VideoService.GetVideo][google.ads.googleads.v3.services.VideoService.GetVideo].
+type GetVideoRequest struct {
+	// Required. The resource name of the video to fetch.
+	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetVideoRequest) Reset()         { *m = GetVideoRequest{} }
+func (m *GetVideoRequest) String() string { return proto.CompactTextString(m) }
+func (*GetVideoRequest) ProtoMessage()    {}
+func (*GetVideoRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a293e66e60f3b801, []int{0}
+}
+
+func (m *GetVideoRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetVideoRequest.Unmarshal(m, b)
+}
+func (m *GetVideoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetVideoRequest.Marshal(b, m, deterministic)
+}
+func (m *GetVideoRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetVideoRequest.Merge(m, src)
+}
+func (m *GetVideoRequest) XXX_Size() int {
+	return xxx_messageInfo_GetVideoRequest.Size(m)
+}
+func (m *GetVideoRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetVideoRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetVideoRequest proto.InternalMessageInfo
+
+func (m *GetVideoRequest) GetResourceName() string {
+	if m != nil {
+		return m.ResourceName
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*GetVideoRequest)(nil), "google.ads.googleads.v3.services.GetVideoRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/ads/googleads/v3/services/video_service.proto", fileDescriptor_a293e66e60f3b801)
+}
+
+var fileDescriptor_a293e66e60f3b801 = []byte{
+	// 398 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x4a, 0xeb, 0x40,
+	0x14, 0x25, 0x29, 0x3c, 0xde, 0x0b, 0x7d, 0x3c, 0x5e, 0x36, 0x96, 0x28, 0x58, 0x4a, 0x17, 0xa1,
+	0xe0, 0x0c, 0x1a, 0x57, 0x53, 0x04, 0xa7, 0x9b, 0xba, 0x92, 0x52, 0x21, 0x0b, 0x09, 0x94, 0x69,
+	0x32, 0xc6, 0x81, 0x24, 0x53, 0x33, 0x69, 0x36, 0xe2, 0xc6, 0x5f, 0xf0, 0x0f, 0xdc, 0xe9, 0xa7,
+	0x74, 0xeb, 0x42, 0x70, 0xe5, 0xc2, 0x95, 0x5f, 0xe0, 0x52, 0x92, 0xc9, 0xa4, 0xad, 0x50, 0xba,
+	0x3b, 0xc9, 0x39, 0xe7, 0x9e, 0x7b, 0x0f, 0x63, 0x1c, 0x87, 0x9c, 0x87, 0x11, 0x85, 0x24, 0x10,
+	0x50, 0xc2, 0x02, 0xe5, 0x0e, 0x14, 0x34, 0xcd, 0x99, 0x4f, 0x05, 0xcc, 0x59, 0x40, 0xf9, 0xa4,
+	0xfa, 0x04, 0xb3, 0x94, 0x67, 0xdc, 0x6c, 0x4b, 0x29, 0x20, 0x81, 0x00, 0xb5, 0x0b, 0xe4, 0x0e,
+	0x50, 0x2e, 0xeb, 0x60, 0xd3, 0xdc, 0x94, 0x0a, 0x3e, 0x4f, 0xeb, 0xc1, 0x72, 0xa0, 0xb5, 0xa7,
+	0xe4, 0x33, 0x06, 0x49, 0x92, 0xf0, 0x8c, 0x64, 0x8c, 0x27, 0xa2, 0x62, 0x77, 0x56, 0x58, 0x3f,
+	0x62, 0x34, 0xc9, 0x2a, 0x62, 0x7f, 0x85, 0xb8, 0x62, 0x34, 0x0a, 0x26, 0x53, 0x7a, 0x4d, 0x72,
+	0xc6, 0x53, 0x29, 0xe8, 0xf4, 0x8d, 0x7f, 0x43, 0x9a, 0xb9, 0x45, 0xd2, 0x98, 0xde, 0xcc, 0xa9,
+	0xc8, 0x4c, 0xdb, 0xf8, 0xab, 0x76, 0x98, 0x24, 0x24, 0xa6, 0x2d, 0xad, 0xad, 0xd9, 0x7f, 0x06,
+	0x8d, 0x77, 0xac, 0x8f, 0x9b, 0x8a, 0x39, 0x27, 0x31, 0x3d, 0x7a, 0xd5, 0x8c, 0x66, 0x69, 0xbd,
+	0x90, 0x57, 0x99, 0x4f, 0x9a, 0xf1, 0x5b, 0x8d, 0x33, 0x0f, 0xc1, 0xb6, 0x12, 0xc0, 0x8f, 0x68,
+	0xcb, 0xde, 0x68, 0xa9, 0x5b, 0x01, 0xa5, 0xa1, 0x73, 0xfa, 0x86, 0xd7, 0xb7, 0xbc, 0x7f, 0xf9,
+	0x78, 0xd0, 0x7b, 0xa6, 0x5d, 0x54, 0x78, 0xbb, 0xc6, 0x9c, 0xf8, 0x73, 0x91, 0xf1, 0x98, 0xa6,
+	0x02, 0xf6, 0x64, 0xa7, 0x02, 0xf6, 0xee, 0xac, 0xdd, 0x05, 0x6e, 0x2d, 0x23, 0x2a, 0x34, 0x63,
+	0x02, 0xf8, 0x3c, 0x1e, 0x7c, 0x69, 0x46, 0xd7, 0xe7, 0xf1, 0xd6, 0x0b, 0x06, 0xff, 0x57, 0xef,
+	0x1f, 0x15, 0x95, 0x8e, 0xb4, 0xcb, 0xb3, 0xca, 0x16, 0xf2, 0x88, 0x24, 0x21, 0xe0, 0x69, 0x08,
+	0x43, 0x9a, 0x94, 0x85, 0xc3, 0x65, 0xd0, 0xe6, 0x27, 0xd5, 0x57, 0xe0, 0x51, 0x6f, 0x0c, 0x31,
+	0x7e, 0xd6, 0xdb, 0x43, 0x39, 0x10, 0x07, 0x02, 0x48, 0x58, 0x20, 0xd7, 0x01, 0x55, 0xb0, 0x58,
+	0x28, 0x89, 0x87, 0x03, 0xe1, 0xd5, 0x12, 0xcf, 0x75, 0x3c, 0x25, 0xf9, 0xd4, 0xbb, 0xf2, 0x3f,
+	0x42, 0x38, 0x10, 0x08, 0xd5, 0x22, 0x84, 0x5c, 0x07, 0x21, 0x25, 0x9b, 0xfe, 0x2a, 0xf7, 0x74,
+	0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x86, 0x46, 0x0c, 0xf9, 0x02, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// VideoServiceClient is the client API for VideoService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type VideoServiceClient interface {
+	// Returns the requested video in full detail.
+	GetVideo(ctx context.Context, in *GetVideoRequest, opts ...grpc.CallOption) (*resources.Video, error)
+}
+
+type videoServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewVideoServiceClient(cc grpc.ClientConnInterface) VideoServiceClient {
+	return &videoServiceClient{cc}
+}
+
+func (c *videoServiceClient) GetVideo(ctx context.Context, in *GetVideoRequest, opts ...grpc.CallOption) (*resources.Video, error) {
+	out := new(resources.Video)
+	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.VideoService/GetVideo", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// VideoServiceServer is the server API for VideoService service.
+type VideoServiceServer interface {
+	// Returns the requested video in full detail.
+	GetVideo(context.Context, *GetVideoRequest) (*resources.Video, error)
+}
+
+// UnimplementedVideoServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedVideoServiceServer struct {
+}
+
+func (*UnimplementedVideoServiceServer) GetVideo(ctx context.Context, req *GetVideoRequest) (*resources.Video, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetVideo not implemented")
+}
+
+func RegisterVideoServiceServer(s *grpc.Server, srv VideoServiceServer) {
+	s.RegisterService(&_VideoService_serviceDesc, srv)
+}
+
+func _VideoService_GetVideo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetVideoRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VideoServiceServer).GetVideo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.ads.googleads.v3.services.VideoService/GetVideo",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VideoServiceServer).GetVideo(ctx, req.(*GetVideoRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _VideoService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.ads.googleads.v3.services.VideoService",
+	HandlerType: (*VideoServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetVideo",
+			Handler:    _VideoService_GetVideo_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/ads/googleads/v3/services/video_service.proto",
+}
diff --git a/googleapis/cloud/asset/v1p4beta1/asset_service.pb.go b/googleapis/cloud/asset/v1p4beta1/asset_service.pb.go
index a0e4aa4..f27582b 100644
--- a/googleapis/cloud/asset/v1p4beta1/asset_service.pb.go
+++ b/googleapis/cloud/asset/v1p4beta1/asset_service.pb.go
@@ -685,9 +685,7 @@
 	// gsutil. For example: "gs://bucket_name/object_name". See [Viewing and
 	// Editing Object
 	// Metadata](https://cloud.google.com/storage/docs/viewing-editing-metadata)
-	// for more information. An INVALID_ARGUMENT error will be
-	// returned if file with the same name "gs://bucket_name/object_name"
-	// already exists.
+	// for more information.
 	Uri                  string   `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -944,83 +942,85 @@
 }
 
 var fileDescriptor_6d37c6d1bea9ee6a = []byte{
-	// 1204 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0xb1, 0x53, 0x24, 0xc5,
-	0x17, 0xfe, 0xcd, 0xc2, 0x1e, 0x5c, 0xc3, 0x2e, 0x4b, 0x5f, 0xf1, 0x63, 0x19, 0xb9, 0x3b, 0x6a,
-	0xaf, 0x38, 0xf1, 0x82, 0x19, 0xe1, 0xb8, 0xbb, 0x52, 0x38, 0x75, 0x81, 0x95, 0x43, 0xab, 0x04,
-	0x07, 0x8b, 0x40, 0xa9, 0x9a, 0x6b, 0x66, 0x9b, 0x71, 0xaa, 0x66, 0xba, 0x87, 0xee, 0x1e, 0x5c,
-	0xbc, 0x32, 0xf1, 0x4f, 0xd0, 0xd8, 0x2a, 0x63, 0x33, 0x33, 0x13, 0x03, 0x2d, 0x23, 0x02, 0x0d,
-	0xfc, 0x07, 0x0c, 0x8c, 0x0c, 0xcc, 0xcd, 0xac, 0xe9, 0xee, 0xd9, 0x9d, 0x5d, 0x60, 0xbd, 0x5b,
-	0x28, 0x23, 0xc3, 0x7e, 0xef, 0x7d, 0xdf, 0x7b, 0xfd, 0xf5, 0x9b, 0xd7, 0xd3, 0xe0, 0x55, 0x9f,
-	0x52, 0x3f, 0xc4, 0xb6, 0x17, 0xd2, 0xa4, 0x69, 0x23, 0xce, 0xb1, 0xb0, 0x8f, 0x17, 0xe3, 0xe5,
-	0x03, 0x2c, 0xd0, 0xa2, 0x5a, 0xbb, 0x1c, 0xb3, 0xe3, 0xc0, 0xc3, 0x56, 0xcc, 0xa8, 0xa0, 0x70,
-	0x56, 0x21, 0x2c, 0x89, 0xb0, 0x64, 0x84, 0xd5, 0x46, 0x98, 0xda, 0x6b, 0xa3, 0x38, 0xb0, 0x11,
-	0x21, 0x54, 0x20, 0x11, 0x50, 0xc2, 0x15, 0xd6, 0xbc, 0x9d, 0xf3, 0x1e, 0x06, 0x38, 0x6c, 0xba,
-	0x07, 0xf8, 0x63, 0x74, 0x1c, 0x50, 0xa6, 0x03, 0x5e, 0xf9, 0xe7, 0x72, 0x32, 0x2e, 0x53, 0x87,
-	0x06, 0x28, 0xb2, 0x8f, 0x17, 0xed, 0x98, 0x86, 0x81, 0x77, 0xa2, 0x7d, 0x77, 0xb4, 0x2f, 0xa4,
-	0xc4, 0x67, 0x09, 0x21, 0x01, 0xf1, 0x6d, 0x1a, 0x63, 0xd6, 0x55, 0xcc, 0x2d, 0x1d, 0x24, 0x57,
-	0x07, 0xc9, 0xa1, 0xdd, 0x4c, 0x54, 0x80, 0xf6, 0x4f, 0xe7, 0x8a, 0xf5, 0xc2, 0x00, 0x13, 0xa1,
-	0x1c, 0xb5, 0x3f, 0x86, 0xc1, 0xff, 0xb7, 0x50, 0xb4, 0x23, 0x33, 0xd6, 0x09, 0x0a, 0x4f, 0x78,
-	0xc0, 0xdf, 0x4f, 0x30, 0x3b, 0x81, 0x2f, 0x81, 0x6b, 0x31, 0x62, 0x98, 0x88, 0xaa, 0x31, 0x67,
-	0x2c, 0x5c, 0x5f, 0x1b, 0xfa, 0xad, 0x5e, 0x70, 0xb4, 0x09, 0x7e, 0x02, 0x26, 0x19, 0xe6, 0x34,
-	0x61, 0x1e, 0x76, 0x39, 0x0e, 0xb1, 0x27, 0x28, 0xab, 0x16, 0xe6, 0x8c, 0x85, 0xb1, 0xa5, 0x86,
-	0xd5, 0x4f, 0x55, 0xeb, 0xfc, 0x6c, 0x96, 0xa3, 0xd9, 0x76, 0x35, 0x59, 0x9a, 0xce, 0x70, 0x2a,
-	0xac, 0xc7, 0x9c, 0x26, 0x0e, 0x9a, 0x98, 0x88, 0x40, 0x9c, 0x74, 0x12, 0x0f, 0x5d, 0x22, 0xf1,
-	0x96, 0x66, 0xeb, 0x49, 0x1c, 0xf4, 0x98, 0xe1, 0x11, 0x98, 0x40, 0x9e, 0x87, 0x39, 0xef, 0xa4,
-	0x1d, 0x96, 0x69, 0xd7, 0x07, 0x4a, 0x5b, 0x97, 0x5c, 0xdd, 0x49, 0xcb, 0xa8, 0xcb, 0x68, 0x36,
-	0x40, 0xa5, 0x57, 0x16, 0xb8, 0x08, 0xe0, 0x61, 0x12, 0x86, 0x6e, 0x5b, 0x7d, 0x82, 0x22, 0x9c,
-	0x3f, 0xa1, 0x4a, 0xea, 0xce, 0x60, 0xef, 0xa1, 0x08, 0x9b, 0xf7, 0x41, 0xa5, 0x77, 0x93, 0xf0,
-	0x36, 0x18, 0xcd, 0x76, 0x98, 0x07, 0xb7, 0x8d, 0xa6, 0x03, 0xca, 0xdd, 0x25, 0xc2, 0x19, 0x50,
-	0x64, 0x34, 0xc4, 0xbc, 0x6a, 0xcc, 0x0d, 0xa9, 0x78, 0xc3, 0x51, 0x16, 0x38, 0x0f, 0xc6, 0x62,
-	0xcc, 0xa2, 0x80, 0xf3, 0xb4, 0x27, 0xab, 0x85, 0x4e, 0x40, 0xde, 0x5e, 0xfb, 0xb3, 0x08, 0xa6,
-	0xa5, 0x0a, 0x9f, 0xe2, 0xb6, 0x2a, 0x0e, 0x3e, 0x4a, 0x30, 0x17, 0xf0, 0x29, 0x28, 0x23, 0x2d,
-	0x90, 0x7b, 0x94, 0x2a, 0x24, 0xcb, 0x1a, 0x5b, 0x5a, 0x1e, 0x44, 0x5d, 0xb5, 0x99, 0x12, 0xea,
-	0xea, 0xe7, 0x7d, 0x30, 0x42, 0x63, 0xa1, 0x0b, 0x4c, 0xa9, 0x1f, 0xf7, 0xa7, 0xbe, 0xa0, 0x52,
-	0x6b, 0x5b, 0x91, 0xa8, 0xfd, 0x65, 0x94, 0xe6, 0x17, 0xc3, 0x60, 0x44, 0x7b, 0xe0, 0x02, 0x28,
-	0xe1, 0x56, 0x8c, 0x48, 0xd3, 0xf5, 0x19, 0x4d, 0x62, 0x2e, 0xb7, 0x32, 0xaa, 0x00, 0xe3, 0xca,
-	0xb3, 0x29, 0x1d, 0xf0, 0x2e, 0xd0, 0x6b, 0x57, 0x49, 0x5b, 0xe8, 0x04, 0x8e, 0x29, 0x87, 0x23,
-	0x05, 0xb6, 0x40, 0x25, 0x8b, 0xd3, 0x27, 0xcb, 0x65, 0xd3, 0xeb, 0xd8, 0x09, 0x1d, 0x9b, 0xf9,
-	0xe0, 0x23, 0x30, 0x45, 0x13, 0x11, 0x27, 0xa2, 0xd3, 0x27, 0xb8, 0xe9, 0x63, 0x2e, 0x5b, 0x56,
-	0x83, 0x6e, 0xa8, 0x88, 0x0c, 0xd4, 0x48, 0xfd, 0x69, 0x7b, 0x69, 0xa0, 0x2c, 0x5d, 0xa3, 0x8a,
-	0x1d, 0x54, 0x45, 0xb9, 0x65, 0xfd, 0x0a, 0xb2, 0x07, 0xe6, 0x91, 0x92, 0x2a, 0x9b, 0xae, 0x2e,
-	0xf2, 0x3c, 0x9a, 0x10, 0xe1, 0x06, 0x51, 0x8c, 0x19, 0xa7, 0x44, 0x8e, 0xa2, 0xea, 0xb5, 0x0e,
-	0x4b, 0x4d, 0x23, 0x76, 0x15, 0xa0, 0xae, 0xe2, 0xb7, 0xf2, 0xe1, 0xf0, 0x5d, 0x30, 0x89, 0x5b,
-	0xd8, 0x4b, 0xd2, 0x85, 0x2b, 0x82, 0x08, 0xd3, 0x44, 0x54, 0x47, 0xe4, 0xc9, 0xcd, 0x64, 0x27,
-	0x97, 0xcd, 0x3b, 0x6b, 0x43, 0xcf, 0x3b, 0x5d, 0x64, 0x1b, 0xf8, 0x81, 0xc2, 0xc1, 0x87, 0x60,
-	0x2a, 0x42, 0x2d, 0xf7, 0x10, 0x11, 0x9a, 0x08, 0xee, 0xc6, 0x98, 0xa9, 0x0d, 0x56, 0x47, 0xe7,
-	0x8c, 0x85, 0xa2, 0x42, 0xc1, 0x08, 0xb5, 0xde, 0x56, 0x01, 0x3b, 0x98, 0xc9, 0x1d, 0xc2, 0x55,
-	0x50, 0xed, 0xc5, 0x65, 0x8a, 0x56, 0xaf, 0x77, 0xa0, 0x53, 0x5d, 0xd0, 0x4c, 0xd2, 0xda, 0x0f,
-	0x45, 0x50, 0x3d, 0xdb, 0x46, 0x3c, 0xa6, 0x84, 0x63, 0x18, 0x81, 0x52, 0x84, 0x02, 0xe2, 0x66,
-	0x5d, 0xaa, 0x1b, 0xfe, 0xc9, 0x8b, 0x76, 0xa5, 0xa2, 0x3b, 0xfb, 0x25, 0x38, 0xe3, 0x29, 0x7d,
-	0xb6, 0x82, 0x5f, 0x19, 0xe0, 0x6e, 0xdf, 0xf3, 0xe9, 0x14, 0x92, 0x7e, 0xbf, 0x57, 0x59, 0xc8,
-	0x1d, 0x7e, 0xf1, 0x31, 0xb7, 0xeb, 0x9b, 0x07, 0xe5, 0x74, 0x72, 0x9d, 0xb8, 0xb8, 0x15, 0x87,
-	0x94, 0xe1, 0xa6, 0x6a, 0x70, 0xa7, 0x24, 0xad, 0x0d, 0x6d, 0x84, 0x1c, 0xdc, 0x20, 0x94, 0xb8,
-	0x1e, 0x0b, 0x44, 0xe0, 0xa1, 0xd0, 0xc5, 0x8c, 0x51, 0x96, 0xf6, 0xf5, 0xd0, 0x00, 0xa3, 0xd8,
-	0xc1, 0x3c, 0x09, 0x85, 0x95, 0x2d, 0x77, 0x05, 0x12, 0xd8, 0x99, 0x24, 0x94, 0xac, 0x6b, 0xfa,
-	0x86, 0x64, 0x37, 0xff, 0x32, 0xc0, 0xe4, 0x19, 0x30, 0xfc, 0xe8, 0x2a, 0x47, 0x56, 0xef, 0xb4,
-	0x7a, 0x0a, 0x2a, 0x6d, 0x72, 0x26, 0xcb, 0xcc, 0xce, 0xe5, 0xc1, 0x40, 0x9b, 0x74, 0x26, 0x50,
-	0xd7, 0xfa, 0x79, 0x05, 0xaf, 0xfd, 0x6c, 0x80, 0x9b, 0x67, 0x38, 0xb7, 0xe5, 0x10, 0x58, 0xa7,
-	0xe4, 0x30, 0xf0, 0x61, 0x02, 0x26, 0x7c, 0x8f, 0xbb, 0x4d, 0xcc, 0x45, 0xa0, 0x3f, 0x75, 0x25,
-	0xc4, 0x3b, 0x2f, 0x58, 0x69, 0x9e, 0xd5, 0xda, 0xf4, 0xf8, 0x46, 0x87, 0xf1, 0xc9, 0xff, 0x9c,
-	0xb2, 0xdf, 0x65, 0x31, 0x5f, 0x06, 0xe5, 0xee, 0x18, 0x38, 0x05, 0x86, 0x12, 0x16, 0xe4, 0xef,
-	0xb3, 0x74, 0xbd, 0x56, 0x02, 0x63, 0xb9, 0xda, 0x6a, 0x5f, 0x17, 0xc1, 0xad, 0x46, 0x2b, 0xa6,
-	0x4c, 0x9c, 0x23, 0xd5, 0xbf, 0x75, 0x19, 0x79, 0xbd, 0x97, 0xd1, 0x46, 0x7f, 0xea, 0xfe, 0x05,
-	0x9f, 0x7f, 0x27, 0x41, 0x0c, 0x4a, 0x7a, 0x98, 0x7b, 0x52, 0x53, 0xfd, 0x9f, 0xb4, 0x72, 0x89,
-	0x63, 0x51, 0x9b, 0x19, 0xa7, 0x39, 0x93, 0xf9, 0x4b, 0xe1, 0xbf, 0xab, 0xef, 0x4a, 0xaf, 0xbe,
-	0xa5, 0x6f, 0x87, 0xc1, 0x78, 0x3d, 0x3d, 0x16, 0x1d, 0x04, 0x7f, 0x34, 0x40, 0xa5, 0x77, 0xe0,
-	0xc2, 0x07, 0x03, 0xfd, 0xbf, 0x98, 0x0f, 0x07, 0x9b, 0xeb, 0xb5, 0x37, 0x3f, 0xff, 0xf5, 0xf7,
-	0x2f, 0x0b, 0xaf, 0xc1, 0x47, 0xb9, 0x57, 0xcc, 0xb3, 0xee, 0xcf, 0xc4, 0x52, 0xaf, 0x83, 0xc7,
-	0xf7, 0xec, 0x7b, 0x9f, 0xbd, 0x8e, 0x7a, 0xeb, 0xfd, 0xbe, 0x00, 0xa6, 0x2f, 0xe8, 0x63, 0xb8,
-	0x7a, 0x99, 0xf6, 0x37, 0x6f, 0x66, 0xe8, 0xdc, 0x23, 0xc9, 0xda, 0xce, 0x1e, 0x49, 0xb5, 0x9f,
-	0x8c, 0xd3, 0xfa, 0x33, 0xb0, 0x3a, 0x58, 0x06, 0x7d, 0x5b, 0xaf, 0x5c, 0xa2, 0x3e, 0x29, 0xdc,
-	0x5b, 0xf0, 0x8d, 0xe7, 0x14, 0x0e, 0x9f, 0x4f, 0x66, 0xce, 0x9e, 0xd6, 0x67, 0x64, 0x7a, 0x95,
-	0x5d, 0x15, 0x84, 0xe2, 0x80, 0x5b, 0x1e, 0x8d, 0xd6, 0xbe, 0x33, 0xc0, 0x9c, 0x47, 0xa3, 0xbe,
-	0x3a, 0xae, 0x4d, 0xe6, 0xbb, 0x6a, 0x27, 0xfd, 0x79, 0xda, 0x31, 0x3e, 0xac, 0x6b, 0x88, 0x4f,
-	0x43, 0x44, 0x7c, 0x8b, 0x32, 0xdf, 0xf6, 0x31, 0x91, 0xbf, 0x56, 0x76, 0x27, 0xc9, 0xf9, 0xef,
-	0xd8, 0x15, 0xb9, 0xfe, 0xa6, 0x30, 0xbb, 0xa9, 0x38, 0xd6, 0x65, 0x5a, 0x99, 0xc5, 0xda, 0x5b,
-	0xdc, 0x59, 0x5e, 0x4b, 0x83, 0x4e, 0x33, 0xf7, 0xbe, 0x74, 0xef, 0x4b, 0xf7, 0xfe, 0x5e, 0xc6,
-	0x71, 0x70, 0x4d, 0xe6, 0xba, 0xff, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8b, 0xfc, 0x5b, 0x40,
-	0xc1, 0x0f, 0x00, 0x00,
+	// 1234 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0x4f, 0x6f, 0xe3, 0x44,
+	0x14, 0xc7, 0x69, 0xb3, 0x7f, 0xa6, 0x4d, 0x9a, 0xce, 0xaa, 0x6c, 0xd6, 0xec, 0x9f, 0x2a, 0xab,
+	0x5d, 0xca, 0x4a, 0xd8, 0x74, 0xff, 0x8a, 0xb6, 0x0b, 0x4a, 0xdb, 0xd0, 0x2d, 0x08, 0x5a, 0x5c,
+	0xd4, 0x03, 0x54, 0xf2, 0x4e, 0x9d, 0x89, 0x6b, 0xc9, 0x9e, 0x71, 0x67, 0xc6, 0x6d, 0xca, 0x8a,
+	0x0b, 0x1f, 0x01, 0xce, 0x48, 0x9c, 0xf9, 0x04, 0x1c, 0x81, 0x0b, 0x52, 0x0f, 0x20, 0xc1, 0x17,
+	0xe0, 0x00, 0x17, 0x0e, 0xdc, 0xb9, 0x21, 0xcf, 0x8c, 0x13, 0x27, 0x6d, 0xc3, 0x6e, 0x5a, 0x71,
+	0xe2, 0x38, 0xef, 0xbd, 0xdf, 0xef, 0xfd, 0xe6, 0xcd, 0xf3, 0x1b, 0x0f, 0x78, 0xc3, 0xa7, 0xd4,
+	0x0f, 0xb1, 0xed, 0x85, 0x34, 0x69, 0xda, 0x88, 0x73, 0x2c, 0xec, 0xbd, 0xd9, 0xf8, 0xfe, 0x36,
+	0x16, 0x68, 0x56, 0xad, 0x5d, 0x8e, 0xd9, 0x5e, 0xe0, 0x61, 0x2b, 0x66, 0x54, 0x50, 0x78, 0x55,
+	0x21, 0x2c, 0x89, 0xb0, 0x64, 0x84, 0xd5, 0x41, 0x98, 0xda, 0x6b, 0xa3, 0x38, 0xb0, 0x11, 0x21,
+	0x54, 0x20, 0x11, 0x50, 0xc2, 0x15, 0xd6, 0xbc, 0x91, 0xf3, 0xb6, 0x02, 0x1c, 0x36, 0xdd, 0x6d,
+	0xbc, 0x83, 0xf6, 0x02, 0xca, 0x74, 0xc0, 0x6b, 0xff, 0x2e, 0x27, 0xe3, 0x32, 0x75, 0x68, 0x80,
+	0x22, 0x7b, 0x6f, 0xd6, 0x8e, 0x69, 0x18, 0x78, 0x07, 0xda, 0x77, 0x53, 0xfb, 0x42, 0x4a, 0x7c,
+	0x96, 0x10, 0x12, 0x10, 0xdf, 0xa6, 0x31, 0x66, 0x3d, 0x62, 0xae, 0xeb, 0x20, 0xb9, 0xda, 0x4e,
+	0x5a, 0x76, 0x33, 0x51, 0x01, 0xda, 0x7f, 0x39, 0x27, 0xd6, 0x0b, 0x03, 0x4c, 0x84, 0x72, 0xd4,
+	0xfe, 0x1c, 0x05, 0x2f, 0xaf, 0xa2, 0x68, 0x5d, 0x66, 0xac, 0x13, 0x14, 0x1e, 0xf0, 0x80, 0x7f,
+	0x98, 0x60, 0x76, 0x00, 0x5f, 0x01, 0xe7, 0x62, 0xc4, 0x30, 0x11, 0x55, 0x63, 0xda, 0x98, 0xb9,
+	0xb8, 0x38, 0xf2, 0x5b, 0xbd, 0xe0, 0x68, 0x13, 0xdc, 0x07, 0x93, 0x0c, 0x73, 0x9a, 0x30, 0x0f,
+	0xbb, 0x1c, 0x87, 0xd8, 0x13, 0x94, 0x55, 0x0b, 0xd3, 0xc6, 0xcc, 0xd8, 0xdd, 0x86, 0x35, 0xa8,
+	0xaa, 0xd6, 0xf1, 0xd9, 0x2c, 0x47, 0xb3, 0x6d, 0x68, 0xb2, 0x34, 0x9d, 0xe1, 0x54, 0x58, 0x9f,
+	0x39, 0x4d, 0x1c, 0x34, 0x31, 0x11, 0x81, 0x38, 0xe8, 0x26, 0x1e, 0x39, 0x45, 0xe2, 0x55, 0xcd,
+	0xd6, 0x97, 0x38, 0xe8, 0x33, 0xc3, 0x5d, 0x30, 0x81, 0x3c, 0x0f, 0x73, 0xde, 0x4d, 0x3b, 0x2a,
+	0xd3, 0x2e, 0x0d, 0x95, 0xb6, 0x2e, 0xb9, 0x7a, 0x93, 0x96, 0x51, 0x8f, 0xd1, 0x6c, 0x80, 0x4a,
+	0x7f, 0x59, 0xe0, 0x2c, 0x80, 0xad, 0x24, 0x0c, 0xdd, 0x4e, 0xf5, 0x09, 0x8a, 0x70, 0xfe, 0x84,
+	0x2a, 0xa9, 0x3b, 0x83, 0x7d, 0x80, 0x22, 0x6c, 0xde, 0x03, 0x95, 0xfe, 0x4d, 0xc2, 0x1b, 0xe0,
+	0x42, 0xb6, 0xc3, 0x3c, 0xb8, 0x63, 0x34, 0x1d, 0x50, 0xee, 0x95, 0x08, 0xaf, 0x80, 0x22, 0xa3,
+	0x21, 0xe6, 0x55, 0x63, 0x7a, 0x44, 0xc5, 0x1b, 0x8e, 0xb2, 0xc0, 0x5b, 0x60, 0x2c, 0xc6, 0x2c,
+	0x0a, 0x38, 0x4f, 0x7b, 0xb2, 0x5a, 0xe8, 0x06, 0xe4, 0xed, 0xb5, 0xbf, 0x8a, 0xe0, 0xb2, 0xac,
+	0xc2, 0xa7, 0xb8, 0x53, 0x15, 0x07, 0xef, 0x26, 0x98, 0x0b, 0xf8, 0x14, 0x94, 0x91, 0x2e, 0x90,
+	0xbb, 0x9b, 0x56, 0x48, 0xca, 0x1a, 0xbb, 0x7b, 0x7f, 0x98, 0xea, 0xaa, 0xcd, 0x94, 0x50, 0x4f,
+	0x3f, 0x6f, 0x81, 0xf3, 0x34, 0x16, 0x5a, 0x60, 0x4a, 0xfd, 0x78, 0x30, 0xf5, 0x09, 0x4a, 0xad,
+	0x35, 0x45, 0xa2, 0xf6, 0x97, 0x51, 0x9a, 0x5f, 0x8c, 0x82, 0xf3, 0xda, 0x03, 0x67, 0x40, 0x09,
+	0xb7, 0x63, 0x44, 0x9a, 0xae, 0xcf, 0x68, 0x12, 0x73, 0xb9, 0x95, 0x0b, 0x0a, 0x30, 0xae, 0x3c,
+	0x2b, 0xd2, 0x01, 0x6f, 0x03, 0xbd, 0x76, 0x55, 0x69, 0x0b, 0xdd, 0xc0, 0x31, 0xe5, 0x70, 0x64,
+	0x81, 0x2d, 0x50, 0xc9, 0xe2, 0xf4, 0xc9, 0x72, 0xd9, 0xf4, 0x3a, 0x76, 0x42, 0xc7, 0x66, 0x3e,
+	0xf8, 0x08, 0x4c, 0xd1, 0x44, 0xc4, 0x89, 0xe8, 0xf6, 0x09, 0x6e, 0xfa, 0x98, 0xcb, 0x96, 0xd5,
+	0xa0, 0x4b, 0x2a, 0x22, 0x03, 0x35, 0x52, 0x7f, 0xda, 0x5e, 0x1a, 0x28, 0xa5, 0x6b, 0x54, 0xb1,
+	0x8b, 0xaa, 0x28, 0xb7, 0xd4, 0xaf, 0x20, 0x9b, 0xe0, 0x16, 0x52, 0xa5, 0xca, 0xa6, 0xab, 0x8b,
+	0x3c, 0x8f, 0x26, 0x44, 0xb8, 0x41, 0x14, 0x63, 0xc6, 0x29, 0x91, 0xa3, 0xa8, 0x7a, 0xae, 0xcb,
+	0x52, 0xd3, 0x88, 0x0d, 0x05, 0xa8, 0xab, 0xf8, 0xd5, 0x7c, 0x38, 0x7c, 0x0f, 0x4c, 0xe2, 0x36,
+	0xf6, 0x92, 0x74, 0xe1, 0x8a, 0x20, 0xc2, 0x34, 0x11, 0xd5, 0xf3, 0xf2, 0xe4, 0xae, 0x64, 0x27,
+	0x97, 0xcd, 0x3b, 0x6b, 0x59, 0xcf, 0x3b, 0x2d, 0xb2, 0x03, 0xfc, 0x48, 0xe1, 0xe0, 0x43, 0x30,
+	0x15, 0xa1, 0xb6, 0xdb, 0x42, 0x84, 0x26, 0x82, 0xbb, 0x31, 0x66, 0x6a, 0x83, 0xd5, 0x0b, 0xd3,
+	0xc6, 0x4c, 0x51, 0xa1, 0x60, 0x84, 0xda, 0xef, 0xa8, 0x80, 0x75, 0xcc, 0xe4, 0x0e, 0xe1, 0x02,
+	0xa8, 0xf6, 0xe3, 0xb2, 0x8a, 0x56, 0x2f, 0x76, 0xa1, 0x53, 0x3d, 0xd0, 0xac, 0xa4, 0xb5, 0xef,
+	0x8b, 0xa0, 0x7a, 0xb4, 0x8d, 0x78, 0x4c, 0x09, 0xc7, 0x30, 0x02, 0xa5, 0x08, 0x05, 0xc4, 0xcd,
+	0xba, 0x54, 0x37, 0xfc, 0x93, 0x17, 0xed, 0x4a, 0x45, 0x77, 0xf4, 0x4b, 0x70, 0xc6, 0x53, 0xfa,
+	0x6c, 0x05, 0xbf, 0x32, 0xc0, 0xed, 0x81, 0xe7, 0xd3, 0x15, 0x92, 0x7e, 0xbf, 0x67, 0x29, 0xe4,
+	0x26, 0x3f, 0xf9, 0x98, 0x3b, 0xfa, 0x6e, 0x81, 0x72, 0x3a, 0xb9, 0x0e, 0x5c, 0xdc, 0x8e, 0x43,
+	0xca, 0x70, 0x53, 0x35, 0xb8, 0x53, 0x92, 0xd6, 0x86, 0x36, 0x42, 0x0e, 0x2e, 0x11, 0x4a, 0x5c,
+	0x8f, 0x05, 0x22, 0xf0, 0x50, 0xe8, 0x62, 0xc6, 0x28, 0x4b, 0xfb, 0x7a, 0x64, 0x88, 0x51, 0xec,
+	0x60, 0x9e, 0x84, 0xc2, 0xca, 0x96, 0x1b, 0x02, 0x09, 0xec, 0x4c, 0x12, 0x4a, 0x96, 0x34, 0x7d,
+	0x43, 0xb2, 0x9b, 0x7f, 0x1b, 0x60, 0xf2, 0x08, 0x18, 0x7e, 0x72, 0x96, 0x23, 0xab, 0x7f, 0x5a,
+	0x3d, 0x05, 0x95, 0x0e, 0x39, 0x93, 0x32, 0xb3, 0x73, 0x79, 0x30, 0xd4, 0x26, 0x9d, 0x09, 0xd4,
+	0xb3, 0x7e, 0xde, 0x82, 0xd7, 0x7e, 0x32, 0xc0, 0xb5, 0x23, 0x9c, 0x6b, 0x72, 0x08, 0x2c, 0x51,
+	0xd2, 0x0a, 0x7c, 0x98, 0x80, 0x09, 0xdf, 0xe3, 0x6e, 0x13, 0x73, 0x11, 0xe8, 0x4f, 0x5d, 0x15,
+	0xe2, 0xdd, 0x17, 0x54, 0x9a, 0x67, 0xb5, 0x56, 0x3c, 0xbe, 0xdc, 0x65, 0x7c, 0xf2, 0x92, 0x53,
+	0xf6, 0x7b, 0x2c, 0xe6, 0xab, 0xa0, 0xdc, 0x1b, 0x03, 0xa7, 0xc0, 0x48, 0xc2, 0x82, 0xfc, 0x7d,
+	0x96, 0xae, 0x17, 0x4b, 0x60, 0x2c, 0xa7, 0xad, 0xf6, 0x75, 0x11, 0x5c, 0x6f, 0xb4, 0x63, 0xca,
+	0xc4, 0x31, 0xa5, 0xfa, 0xaf, 0x2e, 0x23, 0xaf, 0xff, 0x32, 0x5a, 0x1e, 0x4c, 0x3d, 0x58, 0xf0,
+	0xf1, 0x77, 0x12, 0xc4, 0xa0, 0xa4, 0x87, 0xb9, 0x27, 0x6b, 0xaa, 0xff, 0x93, 0xe6, 0x4f, 0x71,
+	0x2c, 0x6a, 0x33, 0xe3, 0x34, 0x67, 0x32, 0x7f, 0x2e, 0xfc, 0x7f, 0xf5, 0x9d, 0xe9, 0xd5, 0x77,
+	0xf7, 0x8f, 0x51, 0x30, 0x5e, 0x4f, 0x8f, 0x45, 0x07, 0xc1, 0x1f, 0x0c, 0x50, 0xe9, 0x1f, 0xb8,
+	0xf0, 0xc1, 0x50, 0xff, 0x2f, 0xe6, 0xc3, 0xe1, 0xe6, 0x7a, 0xed, 0xed, 0xcf, 0x7f, 0xfd, 0xfd,
+	0xcb, 0xc2, 0x9b, 0xf0, 0x51, 0xee, 0x15, 0xf3, 0xac, 0xf7, 0x33, 0xb1, 0xd4, 0xeb, 0xe0, 0xf1,
+	0x1d, 0xfb, 0xce, 0x67, 0x73, 0xa8, 0x5f, 0xef, 0x77, 0x05, 0x70, 0xf9, 0x84, 0x3e, 0x86, 0x0b,
+	0xa7, 0x69, 0x7f, 0xf3, 0x5a, 0x86, 0xce, 0x3d, 0x92, 0xac, 0xb5, 0xec, 0x91, 0x54, 0xfb, 0xd1,
+	0x38, 0xac, 0x3f, 0x03, 0x0b, 0xc3, 0x65, 0xd0, 0xb7, 0xf5, 0xfc, 0x29, 0xf4, 0xc9, 0xc2, 0x2d,
+	0xd5, 0xde, 0x7a, 0xce, 0xc2, 0xe1, 0xe3, 0xc9, 0xe6, 0x8c, 0x3b, 0xe6, 0xfb, 0x87, 0xf5, 0x2b,
+	0x52, 0x81, 0x12, 0xa0, 0x34, 0xa1, 0x38, 0xe0, 0x96, 0x47, 0xa3, 0x5f, 0xea, 0xd6, 0x8e, 0x10,
+	0x31, 0x9f, 0xb3, 0xed, 0xfd, 0xfd, 0xfd, 0x3e, 0xa7, 0x8d, 0x12, 0xb1, 0xa3, 0xde, 0xa2, 0xaf,
+	0xc7, 0x21, 0x12, 0x2d, 0xca, 0xa2, 0xc5, 0x6f, 0x0d, 0x30, 0xed, 0xd1, 0x68, 0x60, 0xed, 0x17,
+	0x27, 0xf3, 0x9d, 0xb8, 0x9e, 0xfe, 0x70, 0xad, 0x1b, 0x1f, 0xd7, 0x35, 0xc4, 0xa7, 0x21, 0x22,
+	0xbe, 0x45, 0x99, 0x6f, 0xfb, 0x98, 0xc8, 0xdf, 0x31, 0xbb, 0x9b, 0xf8, 0xf8, 0xb7, 0xef, 0xbc,
+	0x5c, 0x7f, 0x53, 0xb8, 0xba, 0xa2, 0x38, 0x96, 0x64, 0x5a, 0x99, 0xc5, 0xda, 0x9c, 0x5d, 0xbf,
+	0xbf, 0x98, 0x06, 0x1d, 0x66, 0xee, 0x2d, 0xe9, 0xde, 0x92, 0xee, 0xad, 0xcd, 0x8c, 0x63, 0xfb,
+	0x9c, 0xcc, 0x75, 0xef, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa3, 0xc1, 0xab, 0x59, 0xf5, 0x0f,
+	0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
diff --git a/googleapis/cloud/securitycenter/v1/asset.pb.go b/googleapis/cloud/securitycenter/v1/asset.pb.go
index d55d60d..5aa0d7d 100644
--- a/googleapis/cloud/securitycenter/v1/asset.pb.go
+++ b/googleapis/cloud/securitycenter/v1/asset.pb.go
@@ -302,48 +302,48 @@
 }
 
 var fileDescriptor_8afac45fcf79e390 = []byte{
-	// 680 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdf, 0x4e, 0xd4, 0x4e,
-	0x14, 0xce, 0xee, 0xf2, 0x6f, 0xcf, 0xfe, 0xf8, 0x93, 0xf9, 0x45, 0x2d, 0x0d, 0xc2, 0x0a, 0x17,
-	0xa2, 0x62, 0x9b, 0x85, 0x1b, 0x53, 0xa2, 0x06, 0xd0, 0x18, 0x13, 0x45, 0x52, 0x71, 0x2f, 0x0c,
-	0x66, 0x33, 0x5b, 0xc6, 0xa6, 0xd2, 0x76, 0x9a, 0x99, 0x29, 0xa6, 0x22, 0x0f, 0xe2, 0x23, 0xe8,
-	0xa3, 0xf8, 0x08, 0x3e, 0x02, 0x4f, 0x61, 0x3a, 0xd3, 0x76, 0xdb, 0x92, 0x75, 0xb9, 0x6a, 0xe7,
-	0xcc, 0xf7, 0x7d, 0xe7, 0x9c, 0xf9, 0xce, 0x0c, 0x3c, 0x74, 0x29, 0x75, 0x7d, 0x62, 0x3a, 0x3e,
-	0x8d, 0x4f, 0x4d, 0x4e, 0x9c, 0x98, 0x79, 0x22, 0x71, 0x48, 0x28, 0x08, 0x33, 0xcf, 0x7b, 0x26,
-	0xe6, 0x9c, 0x08, 0x23, 0x62, 0x54, 0x50, 0xb4, 0xaa, 0xb0, 0x86, 0xc4, 0x1a, 0x55, 0xac, 0x71,
-	0xde, 0xd3, 0x97, 0x33, 0x2d, 0x1c, 0x79, 0x26, 0x23, 0x9c, 0xc6, 0xcc, 0x21, 0x8a, 0xaa, 0xef,
-	0x4c, 0x48, 0x93, 0x47, 0x06, 0x01, 0x66, 0x67, 0x3c, 0x23, 0xad, 0x64, 0x24, 0xb9, 0x1a, 0xc6,
-	0x9f, 0x4d, 0x2e, 0x58, 0xec, 0x64, 0xd5, 0xe8, 0x6b, 0xf5, 0x5d, 0xe1, 0x05, 0x84, 0x0b, 0x1c,
-	0x44, 0x35, 0x7a, 0x5a, 0x0e, 0x0e, 0x43, 0x2a, 0xb0, 0xf0, 0x68, 0x98, 0x89, 0xaf, 0xff, 0x6c,
-	0xc3, 0xf4, 0x5e, 0xda, 0x1c, 0x42, 0x30, 0x15, 0xe2, 0x80, 0x68, 0x8d, 0x6e, 0x63, 0xb3, 0x6d,
-	0xcb, 0x7f, 0xf4, 0x1d, 0xf4, 0xa2, 0x24, 0x55, 0xe5, 0x20, 0x62, 0x34, 0x22, 0x4c, 0x78, 0x84,
-	0x6b, 0xcd, 0x6e, 0x63, 0xb3, 0xb3, 0xfd, 0xcc, 0xf8, 0xf7, 0x79, 0x18, 0x52, 0xde, 0x78, 0x9f,
-	0xc5, 0x0f, 0x64, 0xfc, 0xa8, 0x50, 0xb1, 0x35, 0x3e, 0x66, 0x07, 0x85, 0xf0, 0x7f, 0x7e, 0x7e,
-	0xe5, 0xb4, 0xb3, 0xdd, 0xd6, 0x66, 0x67, 0xfb, 0xe9, 0xcd, 0xd2, 0xda, 0x99, 0xc0, 0x48, 0xf6,
-	0x65, 0x28, 0x58, 0x62, 0x23, 0x76, 0x6d, 0x03, 0x1d, 0xc3, 0x42, 0xd5, 0x00, 0x6d, 0x4e, 0x76,
-	0xf8, 0x78, 0x52, 0xaa, 0xbc, 0xb7, 0xb7, 0x29, 0xc9, 0x9e, 0xe7, 0xe5, 0x25, 0xda, 0x85, 0x8e,
-	0xc3, 0x08, 0x16, 0x64, 0x90, 0x3a, 0xa3, 0xb5, 0xa5, 0xa4, 0x9e, 0x4b, 0xe6, 0xb6, 0x19, 0xc7,
-	0xb9, 0x6d, 0x36, 0x28, 0x78, 0x1a, 0x48, 0xc9, 0x71, 0x74, 0x5a, 0x90, 0x61, 0x32, 0x59, 0xc1,
-	0x25, 0xf9, 0x10, 0xc0, 0xc3, 0xc1, 0x20, 0xa2, 0xbe, 0xe7, 0x24, 0x5a, 0x47, 0x72, 0xcd, 0x9b,
-	0x1d, 0xdb, 0x6b, 0x1c, 0x1c, 0x49, 0x9a, 0xdd, 0xf6, 0xf2, 0x5f, 0xfd, 0x47, 0x0b, 0xb4, 0x71,
-	0x36, 0xa2, 0x0d, 0x98, 0x2f, 0xcc, 0x2a, 0xcd, 0xd1, 0x7f, 0x79, 0xf0, 0x30, 0x9d, 0xa7, 0x32,
-	0x48, 0x24, 0x11, 0x91, 0x23, 0x54, 0x02, 0x1d, 0x27, 0x11, 0x41, 0xf7, 0x61, 0x71, 0x64, 0x3b,
-	0x66, 0x24, 0x14, 0x5a, 0x4b, 0xc2, 0x16, 0x0a, 0xcf, 0x64, 0x14, 0x3d, 0x80, 0xa5, 0xf2, 0x7c,
-	0x7c, 0x21, 0x8e, 0xd0, 0xa6, 0x24, 0x72, 0xb1, 0xe4, 0x6e, 0x1a, 0xae, 0x68, 0xd2, 0xaf, 0x21,
-	0x61, 0x5c, 0x9b, 0xee, 0xb6, 0xca, 0x9a, 0xef, 0x64, 0x14, 0x6d, 0xc3, 0xad, 0x02, 0x78, 0xea,
-	0xf1, 0xc8, 0xc7, 0x89, 0x6a, 0x67, 0x46, 0x0a, 0x17, 0x03, 0xf9, 0x42, 0xed, 0xc9, 0xae, 0x9e,
-	0xc3, 0x4a, 0xad, 0xe0, 0x2a, 0x75, 0x56, 0x52, 0x97, 0xab, 0xd5, 0x97, 0x05, 0xf6, 0xe0, 0x6e,
-	0xbd, 0x91, 0xaa, 0xc2, 0x9c, 0x54, 0xd0, 0x6b, 0x5d, 0x95, 0x24, 0xf4, 0x2d, 0x68, 0x17, 0x9e,
-	0xa1, 0x35, 0xe8, 0x28, 0xd3, 0x07, 0x43, 0x9f, 0x0e, 0x33, 0x27, 0x40, 0x85, 0xf6, 0x7d, 0x3a,
-	0xd4, 0x3f, 0xc1, 0x9d, 0x31, 0x17, 0x03, 0x2d, 0x41, 0xeb, 0x8c, 0x24, 0x19, 0x27, 0xfd, 0x45,
-	0x5b, 0x30, 0x7d, 0x8e, 0xfd, 0x98, 0x64, 0xf7, 0xfd, 0xf6, 0xb5, 0xe9, 0xeb, 0xa7, 0xbb, 0xb6,
-	0x02, 0x59, 0xcd, 0x27, 0x0d, 0xeb, 0xc3, 0xd5, 0x9e, 0x0d, 0x1b, 0xb5, 0xd9, 0x52, 0x2c, 0x1c,
-	0x79, 0xdc, 0x70, 0x68, 0x60, 0xaa, 0x47, 0xe7, 0x11, 0x65, 0x2e, 0x0e, 0xbd, 0x6f, 0xea, 0x4d,
-	0x32, 0x2f, 0xca, 0xcb, 0x4b, 0xf5, 0xea, 0x72, 0xf3, 0x42, 0x7e, 0x2f, 0xf7, 0xff, 0x34, 0x60,
-	0xdd, 0xa1, 0xc1, 0x84, 0x09, 0x3e, 0x6a, 0x7c, 0x7c, 0x93, 0x21, 0x5c, 0xea, 0xe3, 0xd0, 0x35,
-	0x28, 0x73, 0x4d, 0x97, 0x84, 0xb2, 0x5e, 0x73, 0x54, 0xc6, 0xb8, 0x57, 0x78, 0xb7, 0x1a, 0xf9,
-	0xd5, 0x5c, 0x7d, 0xa5, 0xe4, 0x0e, 0x64, 0xc2, 0xea, 0x0d, 0x30, 0xfa, 0xbd, 0xdf, 0x39, 0xe0,
-	0x44, 0x02, 0x4e, 0xaa, 0x80, 0x93, 0x7e, 0xef, 0xaa, 0x79, 0x4f, 0x01, 0x2c, 0x4b, 0x22, 0x2c,
-	0xab, 0x0a, 0xb1, 0xac, 0x7e, 0x6f, 0x38, 0x23, 0xcb, 0xdb, 0xf9, 0x1b, 0x00, 0x00, 0xff, 0xff,
-	0xe3, 0x3f, 0x99, 0x99, 0x8a, 0x06, 0x00, 0x00,
+	// 678 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdd, 0x4e, 0xd4, 0x4c,
+	0x18, 0x4e, 0x77, 0xf9, 0xdb, 0x77, 0x3f, 0x7e, 0x32, 0x5f, 0xd4, 0xd2, 0x20, 0xac, 0x70, 0x20,
+	0x2a, 0xb6, 0x59, 0x38, 0x31, 0x25, 0x6a, 0x00, 0x8d, 0x31, 0x51, 0x24, 0x15, 0xf7, 0xc0, 0x60,
+	0x36, 0xb3, 0x65, 0x6c, 0x2a, 0x6d, 0xa7, 0x99, 0x99, 0x62, 0x2a, 0x72, 0x21, 0x5e, 0x82, 0x5e,
+	0x8a, 0x97, 0xe0, 0x25, 0x70, 0x15, 0xa6, 0x33, 0x6d, 0xb7, 0x5d, 0xb2, 0x2e, 0x47, 0xed, 0xbc,
+	0xef, 0xf3, 0x3c, 0xef, 0xef, 0x0c, 0x3c, 0xf4, 0x28, 0xf5, 0x02, 0x62, 0xb9, 0x01, 0x4d, 0x4e,
+	0x2d, 0x4e, 0xdc, 0x84, 0xf9, 0x22, 0x75, 0x49, 0x24, 0x08, 0xb3, 0xce, 0xbb, 0x16, 0xe6, 0x9c,
+	0x08, 0x33, 0x66, 0x54, 0x50, 0xb4, 0xaa, 0xb0, 0xa6, 0xc4, 0x9a, 0x75, 0xac, 0x79, 0xde, 0x35,
+	0x56, 0x72, 0x2d, 0x1c, 0xfb, 0x16, 0x8e, 0x22, 0x2a, 0xb0, 0xf0, 0x69, 0xc4, 0x15, 0xdb, 0x58,
+	0xae, 0x78, 0x19, 0xe1, 0x34, 0x61, 0x2e, 0xc9, 0x5d, 0x3b, 0x13, 0x92, 0x28, 0x2c, 0xfd, 0x10,
+	0xb3, 0xb3, 0x42, 0xaf, 0x88, 0x26, 0x4f, 0x83, 0xe4, 0xb3, 0xc5, 0x05, 0x4b, 0xdc, 0x3c, 0x57,
+	0x63, 0x6d, 0xd4, 0x2b, 0xfc, 0x90, 0x70, 0x81, 0xc3, 0x58, 0x01, 0xd6, 0x7f, 0xb6, 0x60, 0x7a,
+	0x2f, 0x2b, 0x0e, 0x21, 0x98, 0x8a, 0x70, 0x48, 0x74, 0xad, 0xa3, 0x6d, 0xb6, 0x1c, 0xf9, 0x8f,
+	0xbe, 0x83, 0x51, 0x06, 0x55, 0x79, 0xf4, 0x63, 0x46, 0x63, 0xc2, 0x84, 0x4f, 0xb8, 0xde, 0xe8,
+	0x68, 0x9b, 0xed, 0xed, 0x67, 0xe6, 0xbf, 0xfb, 0x61, 0x4a, 0x79, 0xf3, 0x7d, 0x6e, 0x3f, 0x90,
+	0xf6, 0xa3, 0x52, 0xc5, 0xd1, 0xf9, 0x18, 0x0f, 0x8a, 0xe0, 0xff, 0xa2, 0x43, 0xd5, 0xb0, 0xb3,
+	0x9d, 0xe6, 0x66, 0x7b, 0xfb, 0xe9, 0xcd, 0xc2, 0x3a, 0xb9, 0xc0, 0x50, 0xf6, 0x65, 0x24, 0x58,
+	0xea, 0x20, 0x76, 0xcd, 0x81, 0x8e, 0x61, 0xa1, 0xde, 0x62, 0x7d, 0x4e, 0x56, 0xf8, 0x78, 0x52,
+	0xa8, 0xa2, 0xb6, 0xb7, 0x19, 0xc9, 0x99, 0xe7, 0xd5, 0x23, 0xda, 0x85, 0xb6, 0xcb, 0x08, 0x16,
+	0xa4, 0x9f, 0xf5, 0x5e, 0x6f, 0x49, 0x49, 0xa3, 0x90, 0x2c, 0x06, 0x63, 0x1e, 0x17, 0x83, 0x71,
+	0x40, 0xc1, 0x33, 0x43, 0x46, 0x4e, 0xe2, 0xd3, 0x92, 0x0c, 0x93, 0xc9, 0x0a, 0x2e, 0xc9, 0x87,
+	0x00, 0x3e, 0x0e, 0xfb, 0x31, 0x0d, 0x7c, 0x37, 0xd5, 0xdb, 0x92, 0x6b, 0xdd, 0xac, 0x6d, 0xaf,
+	0x71, 0x78, 0x24, 0x69, 0x4e, 0xcb, 0x2f, 0x7e, 0x8d, 0x1f, 0x4d, 0xd0, 0xc7, 0x8d, 0x11, 0x6d,
+	0xc0, 0x7c, 0x39, 0xac, 0xca, 0x1e, 0xfd, 0x57, 0x18, 0x0f, 0xb3, 0x7d, 0xaa, 0x82, 0x44, 0x1a,
+	0x13, 0xb9, 0x42, 0x15, 0xd0, 0x71, 0x1a, 0x13, 0x74, 0x1f, 0x16, 0x87, 0x63, 0xc7, 0x8c, 0x44,
+	0x42, 0x6f, 0x4a, 0xd8, 0x42, 0x39, 0x33, 0x69, 0x45, 0x0f, 0x60, 0xa9, 0xba, 0x1f, 0x5f, 0x88,
+	0x2b, 0xf4, 0x29, 0x89, 0x5c, 0xac, 0x4c, 0x37, 0x33, 0xd7, 0x34, 0xe9, 0xd7, 0x88, 0x30, 0xae,
+	0x4f, 0x77, 0x9a, 0x55, 0xcd, 0x77, 0xd2, 0x8a, 0xb6, 0xe1, 0x56, 0x09, 0x3c, 0xf5, 0x79, 0x1c,
+	0xe0, 0x54, 0x95, 0x33, 0x23, 0x85, 0xcb, 0x85, 0x7c, 0xa1, 0x7c, 0xb2, 0xaa, 0xe7, 0xb0, 0x32,
+	0x92, 0x70, 0x9d, 0x3a, 0x2b, 0xa9, 0xcb, 0xf5, 0xec, 0xab, 0x02, 0x7b, 0x70, 0x77, 0xb4, 0x90,
+	0xba, 0xc2, 0x9c, 0x54, 0x30, 0x46, 0xaa, 0xaa, 0x48, 0x18, 0x5b, 0xd0, 0x2a, 0x67, 0x86, 0xd6,
+	0xa0, 0xad, 0x86, 0xde, 0x1f, 0x04, 0x74, 0x90, 0x4f, 0x02, 0x94, 0x69, 0x3f, 0xa0, 0x03, 0xe3,
+	0x13, 0xdc, 0x19, 0x73, 0x31, 0xd0, 0x12, 0x34, 0xcf, 0x48, 0x9a, 0x73, 0xb2, 0x5f, 0xb4, 0x05,
+	0xd3, 0xe7, 0x38, 0x48, 0x48, 0x7e, 0xdf, 0x6f, 0x5f, 0xdb, 0xbe, 0x5e, 0xe6, 0x75, 0x14, 0xc8,
+	0x6e, 0x3c, 0xd1, 0xec, 0x0f, 0x57, 0x7b, 0x0e, 0x6c, 0x8c, 0xec, 0x96, 0x62, 0xe1, 0xd8, 0xe7,
+	0xa6, 0x4b, 0x43, 0x4b, 0x3d, 0x3a, 0x8f, 0x28, 0xf3, 0x70, 0xe4, 0x7f, 0x53, 0x4f, 0xa4, 0x75,
+	0x51, 0x3d, 0x5e, 0xaa, 0x57, 0x97, 0x5b, 0x17, 0xf2, 0x7b, 0xb9, 0xff, 0x47, 0x83, 0x75, 0x97,
+	0x86, 0x13, 0x36, 0xf8, 0x48, 0xfb, 0xf8, 0x26, 0x47, 0x78, 0x34, 0xc0, 0x91, 0x67, 0x52, 0xe6,
+	0x59, 0x1e, 0x89, 0x64, 0xbe, 0xd6, 0x30, 0x8d, 0x71, 0xef, 0xec, 0x6e, 0xdd, 0xf2, 0xab, 0xb1,
+	0xfa, 0x4a, 0xc9, 0x1d, 0xc8, 0x80, 0xf5, 0x1b, 0x60, 0xf6, 0xba, 0xbf, 0x0b, 0xc0, 0x89, 0x04,
+	0x9c, 0xd4, 0x01, 0x27, 0xbd, 0xee, 0x55, 0xe3, 0x9e, 0x02, 0xd8, 0xb6, 0x44, 0xd8, 0x76, 0x1d,
+	0x62, 0xdb, 0xbd, 0xee, 0x60, 0x46, 0xa6, 0xb7, 0xf3, 0x37, 0x00, 0x00, 0xff, 0xff, 0x81, 0x34,
+	0x4a, 0x76, 0x8a, 0x06, 0x00, 0x00,
 }
diff --git a/googleapis/cloud/securitycenter/v1/finding.pb.go b/googleapis/cloud/securitycenter/v1/finding.pb.go
index 176e584..c2a5023 100644
--- a/googleapis/cloud/securitycenter/v1/finding.pb.go
+++ b/googleapis/cloud/securitycenter/v1/finding.pb.go
@@ -219,45 +219,45 @@
 }
 
 var fileDescriptor_b75f23af5a63668d = []byte{
-	// 633 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdd, 0x4e, 0x13, 0x41,
-	0x14, 0x76, 0x5b, 0x5a, 0xe0, 0x14, 0x48, 0x99, 0x04, 0xb2, 0x36, 0x06, 0x0a, 0xc6, 0xa4, 0x17,
-	0xb8, 0x9b, 0xc2, 0x0d, 0x2e, 0x31, 0xb1, 0xd4, 0x62, 0x9a, 0x28, 0x21, 0x6d, 0x69, 0xa2, 0x92,
-	0x34, 0xc3, 0x32, 0xac, 0x23, 0xdb, 0x99, 0xcd, 0xec, 0x6c, 0x63, 0x25, 0xbc, 0x8c, 0x97, 0x3e,
-	0x8a, 0x8f, 0xe0, 0x95, 0xd7, 0x3c, 0x85, 0xd9, 0x99, 0x59, 0xa4, 0xf5, 0xa7, 0xde, 0x9d, 0xf3,
-	0x9d, 0xef, 0x3b, 0x3f, 0x73, 0xce, 0x2e, 0xec, 0x04, 0x9c, 0x07, 0x21, 0x71, 0xfd, 0x90, 0x27,
-	0x17, 0x6e, 0x4c, 0xfc, 0x44, 0x50, 0x39, 0xf6, 0x09, 0x93, 0x44, 0xb8, 0xa3, 0xba, 0x7b, 0x49,
-	0xd9, 0x05, 0x65, 0x81, 0x13, 0x09, 0x2e, 0x39, 0xda, 0xd0, 0x6c, 0x47, 0xb1, 0x9d, 0x49, 0xb6,
-	0x33, 0xaa, 0x57, 0x36, 0x4d, 0x36, 0x1c, 0x51, 0xf7, 0x92, 0x92, 0xf0, 0x62, 0x70, 0x4e, 0x3e,
-	0xe0, 0x11, 0xe5, 0x42, 0x27, 0xa8, 0x3c, 0xbc, 0x47, 0x10, 0x24, 0xe6, 0x89, 0xf0, 0x89, 0x09,
-	0xed, 0xcd, 0xe8, 0x24, 0x43, 0x06, 0x43, 0x2c, 0xae, 0x62, 0x23, 0x7a, 0x64, 0x44, 0xca, 0x3b,
-	0x4f, 0x2e, 0xdd, 0x58, 0x8a, 0xc4, 0x97, 0x26, 0xba, 0x39, 0x1d, 0x95, 0x74, 0x48, 0x62, 0x89,
-	0x87, 0xd1, 0x94, 0x3c, 0x6d, 0x07, 0x33, 0xc6, 0x25, 0x96, 0x94, 0x33, 0x93, 0x7c, 0xfb, 0x4b,
-	0x11, 0xe6, 0x8f, 0xf4, 0xfc, 0x08, 0xc1, 0x1c, 0xc3, 0x43, 0x62, 0x5b, 0x55, 0xab, 0xb6, 0xd8,
-	0x51, 0x36, 0x5a, 0x87, 0x62, 0x84, 0x05, 0x61, 0xd2, 0xce, 0x29, 0xd4, 0x78, 0xe8, 0x31, 0x2c,
-	0x67, 0xb3, 0x0d, 0x94, 0x28, 0xaf, 0xc2, 0x4b, 0x19, 0x78, 0x9c, 0x8a, 0x9b, 0x50, 0x88, 0x25,
-	0x96, 0xc4, 0x9e, 0xab, 0x5a, 0xb5, 0x95, 0xdd, 0xa7, 0xce, 0xbf, 0x9f, 0xd6, 0x31, 0x8d, 0x38,
-	0xdd, 0x54, 0xd4, 0xd1, 0x5a, 0x54, 0x81, 0x05, 0x1f, 0x4b, 0x12, 0x70, 0x31, 0xb6, 0x0b, 0xaa,
-	0xc8, 0x9d, 0x8f, 0xb6, 0x60, 0x89, 0x7c, 0x92, 0x44, 0x30, 0x1c, 0x0e, 0x12, 0x41, 0xed, 0xa2,
-	0x8a, 0x97, 0x32, 0xec, 0x54, 0x50, 0xf4, 0x11, 0x56, 0x4d, 0x9b, 0x91, 0xe0, 0x11, 0x11, 0x92,
-	0x92, 0xd8, 0x9e, 0xaf, 0xe6, 0x6b, 0xa5, 0xdd, 0xe7, 0xff, 0xdd, 0x8f, 0x4a, 0x70, 0x72, 0xa7,
-	0x6f, 0x31, 0x29, 0xc6, 0x9d, 0x72, 0x3c, 0x05, 0xa3, 0xb7, 0xb0, 0x32, 0xb9, 0x41, 0x7b, 0xa1,
-	0x6a, 0xd5, 0x4a, 0xb3, 0x07, 0xef, 0x1a, 0xe4, 0x4d, 0x2a, 0x3a, 0xcc, 0xff, 0x68, 0xe4, 0x3b,
-	0xcb, 0xf1, 0x7d, 0x0c, 0x3d, 0x03, 0x20, 0x23, 0xc2, 0xe4, 0x20, 0x5d, 0xaf, 0xbd, 0xa8, 0xd2,
-	0x56, 0xb2, 0xb4, 0xd9, 0xee, 0x9d, 0x5e, 0xb6, 0xfb, 0xce, 0xa2, 0x62, 0xa7, 0x3e, 0x3a, 0x80,
-	0x92, 0x2f, 0x08, 0x96, 0x44, 0x6b, 0x61, 0xa6, 0x16, 0x34, 0x3d, 0x05, 0x2a, 0xef, 0x61, 0xed,
-	0x8f, 0xd3, 0xa3, 0x32, 0xe4, 0xaf, 0xc8, 0xd8, 0xdc, 0x4a, 0x6a, 0xa2, 0x1d, 0x28, 0x8c, 0x70,
-	0x98, 0x10, 0x75, 0x29, 0xa5, 0xdd, 0xf5, 0xdf, 0x2a, 0xf4, 0xd3, 0x68, 0x47, 0x93, 0xbc, 0xdc,
-	0xbe, 0xb5, 0xbd, 0x0f, 0x05, 0xb5, 0x6a, 0xb4, 0x06, 0xab, 0xdd, 0x5e, 0xa3, 0xd7, 0x1a, 0x9c,
-	0x1e, 0x77, 0x4f, 0x5a, 0xcd, 0xf6, 0x51, 0xbb, 0xf5, 0xb2, 0xfc, 0x00, 0x01, 0x14, 0x1b, 0xcd,
-	0x5e, 0xbb, 0xdf, 0x2a, 0x5b, 0x68, 0x09, 0x16, 0xda, 0xc7, 0xc6, 0xcb, 0x79, 0xe1, 0x6d, 0x83,
-	0xc2, 0x93, 0xa9, 0x87, 0xd4, 0xf5, 0x70, 0x44, 0x63, 0xc7, 0xe7, 0x43, 0x37, 0x3b, 0xeb, 0x17,
-	0x5c, 0x04, 0x98, 0xd1, 0xcf, 0xfa, 0xee, 0xdd, 0xeb, 0xfb, 0xee, 0x8d, 0xab, 0x97, 0x18, 0xbb,
-	0xd7, 0xda, 0xb8, 0xc9, 0xfe, 0x06, 0xb1, 0x7b, 0x6d, 0xac, 0x9b, 0xc3, 0xef, 0x16, 0x6c, 0xfb,
-	0x7c, 0x38, 0x63, 0x8b, 0x27, 0xd6, 0xbb, 0xd7, 0x86, 0x11, 0xf0, 0x10, 0xb3, 0xc0, 0xe1, 0x22,
-	0x70, 0x03, 0xc2, 0xd4, 0x03, 0xb8, 0xbf, 0xba, 0xfb, 0xdb, 0xe7, 0x7f, 0x30, 0x89, 0x7c, 0xcd,
-	0x6d, 0xbc, 0xd2, 0xe9, 0x9a, 0xaa, 0x60, 0x76, 0x24, 0x4d, 0x5d, 0xb0, 0x5f, 0xff, 0x96, 0x11,
-	0xce, 0x14, 0xe1, 0x6c, 0x92, 0x70, 0xd6, 0xaf, 0xdf, 0xe6, 0xb6, 0x34, 0xc1, 0xf3, 0x14, 0xc3,
-	0xf3, 0x26, 0x29, 0x9e, 0xd7, 0xaf, 0x9f, 0x17, 0x55, 0x7b, 0x7b, 0x3f, 0x03, 0x00, 0x00, 0xff,
-	0xff, 0x68, 0xec, 0xf4, 0xff, 0x26, 0x05, 0x00, 0x00,
+	// 634 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdf, 0x4e, 0xdb, 0x3e,
+	0x14, 0xfe, 0xa5, 0xa5, 0x05, 0x4e, 0x01, 0x15, 0x4b, 0xa0, 0xfc, 0xaa, 0x89, 0x15, 0xa6, 0x49,
+	0xbd, 0x60, 0x89, 0x0a, 0x37, 0x2c, 0x68, 0xd2, 0x4a, 0x57, 0xa6, 0x4a, 0x1b, 0x42, 0x6d, 0xa9,
+	0xb4, 0x0d, 0xa9, 0x32, 0xc1, 0x64, 0x1e, 0xa9, 0x1d, 0x39, 0x4e, 0xb5, 0x0e, 0xf1, 0x32, 0xbb,
+	0xdc, 0xa3, 0xec, 0x11, 0x76, 0xb5, 0x6b, 0x9e, 0x62, 0x8a, 0x1d, 0xb3, 0xb6, 0xfb, 0xd3, 0xdd,
+	0xf9, 0x7c, 0xe7, 0xfb, 0xce, 0xf9, 0xec, 0x73, 0x12, 0xd8, 0x0d, 0x38, 0x0f, 0x42, 0xe2, 0xfa,
+	0x21, 0x4f, 0x2e, 0xdd, 0x98, 0xf8, 0x89, 0xa0, 0x72, 0xec, 0x13, 0x26, 0x89, 0x70, 0x47, 0x75,
+	0xf7, 0x8a, 0xb2, 0x4b, 0xca, 0x02, 0x27, 0x12, 0x5c, 0x72, 0xb4, 0xa5, 0xd9, 0x8e, 0x62, 0x3b,
+	0xd3, 0x6c, 0x67, 0x54, 0xaf, 0x3c, 0xc8, 0xaa, 0xe1, 0x88, 0xba, 0x98, 0x31, 0x2e, 0xb1, 0xa4,
+	0x9c, 0xc5, 0x5a, 0x5d, 0x79, 0x38, 0x91, 0xbd, 0xa2, 0x24, 0xbc, 0x1c, 0x5c, 0x90, 0xf7, 0x78,
+	0x44, 0xb9, 0xc8, 0x08, 0xff, 0x4f, 0x10, 0x04, 0x89, 0x79, 0x22, 0x7c, 0x92, 0xa5, 0xf6, 0xe7,
+	0xf8, 0x34, 0xc8, 0x60, 0x88, 0xc5, 0xb5, 0x69, 0x68, 0xec, 0xa8, 0xe8, 0x22, 0xb9, 0x72, 0x63,
+	0x29, 0x12, 0x5f, 0xce, 0xd8, 0xb9, 0xcf, 0x4a, 0x3a, 0x24, 0xb1, 0xc4, 0xc3, 0x48, 0x13, 0x76,
+	0x3e, 0x17, 0x61, 0xf1, 0x58, 0xdf, 0x1f, 0x21, 0x58, 0x60, 0x78, 0x48, 0x6c, 0xab, 0x6a, 0xd5,
+	0x96, 0x3b, 0xea, 0x8c, 0x36, 0xa1, 0x18, 0x61, 0x41, 0x98, 0xb4, 0x73, 0x0a, 0xcd, 0x22, 0xf4,
+	0x08, 0x56, 0x8d, 0xfb, 0x81, 0x12, 0xe5, 0x55, 0x7a, 0xc5, 0x80, 0x27, 0xa9, 0xb8, 0x09, 0x85,
+	0x58, 0x62, 0x49, 0xec, 0x85, 0xaa, 0x55, 0x5b, 0xdb, 0x7b, 0xe2, 0xfc, 0xfd, 0x69, 0x9d, 0xcc,
+	0x88, 0xd3, 0x4d, 0x45, 0x1d, 0xad, 0x45, 0x15, 0x58, 0xf2, 0xb1, 0x24, 0x01, 0x17, 0x63, 0xbb,
+	0xa0, 0x9a, 0xdc, 0xc7, 0x68, 0x1b, 0x56, 0xc8, 0x47, 0x49, 0x04, 0xc3, 0xe1, 0x20, 0x11, 0xd4,
+	0x2e, 0xaa, 0x7c, 0xc9, 0x60, 0x67, 0x82, 0xa2, 0x0f, 0xb0, 0x9e, 0xd9, 0x8c, 0x04, 0x8f, 0x88,
+	0x90, 0x94, 0xc4, 0xf6, 0x62, 0x35, 0x5f, 0x2b, 0xed, 0x3d, 0xfb, 0x67, 0x3f, 0xaa, 0xc0, 0xe9,
+	0xbd, 0xbe, 0xc5, 0xa4, 0x18, 0x77, 0xca, 0xf1, 0x0c, 0x8c, 0xde, 0xc0, 0xda, 0xf4, 0x8c, 0xec,
+	0xa5, 0xaa, 0x55, 0x2b, 0xcd, 0xbf, 0x78, 0x37, 0x43, 0x5e, 0xa7, 0xa2, 0xa3, 0xfc, 0xf7, 0x46,
+	0xbe, 0xb3, 0x1a, 0x4f, 0x62, 0xe8, 0x29, 0x00, 0x19, 0x11, 0x26, 0x07, 0xe9, 0x00, 0xed, 0x65,
+	0x55, 0xb6, 0x62, 0xca, 0x9a, 0xe9, 0x3a, 0x3d, 0x33, 0xdd, 0xce, 0xb2, 0x62, 0xa7, 0x31, 0x3a,
+	0x84, 0x92, 0x2f, 0x08, 0x96, 0x44, 0x6b, 0x61, 0xae, 0x16, 0x34, 0x3d, 0x05, 0x2a, 0xef, 0x60,
+	0xe3, 0xb7, 0xb7, 0x47, 0x65, 0xc8, 0x5f, 0x93, 0x71, 0xb6, 0x2b, 0xe9, 0x11, 0xed, 0x42, 0x61,
+	0x84, 0xc3, 0x84, 0xa8, 0x4d, 0x29, 0xed, 0x6d, 0xfe, 0xd2, 0xa1, 0x9f, 0x66, 0x3b, 0x9a, 0xe4,
+	0xe5, 0x0e, 0xac, 0x9d, 0x03, 0x28, 0xa8, 0x51, 0xa3, 0x0d, 0x58, 0xef, 0xf6, 0x1a, 0xbd, 0xd6,
+	0xe0, 0xec, 0xa4, 0x7b, 0xda, 0x6a, 0xb6, 0x8f, 0xdb, 0xad, 0x17, 0xe5, 0xff, 0x10, 0x40, 0xb1,
+	0xd1, 0xec, 0xb5, 0xfb, 0xad, 0xb2, 0x85, 0x56, 0x60, 0xa9, 0x7d, 0x92, 0x45, 0x39, 0x2f, 0xbc,
+	0x6b, 0x50, 0x78, 0x3c, 0xf3, 0x90, 0xba, 0x1f, 0x8e, 0x68, 0xec, 0xf8, 0x7c, 0xe8, 0x9a, 0xb5,
+	0x7e, 0xce, 0x45, 0x80, 0x19, 0xfd, 0xa4, 0xbf, 0x53, 0xf7, 0x66, 0x32, 0xbc, 0x75, 0xf5, 0x10,
+	0x63, 0xf7, 0x46, 0x1f, 0x6e, 0xcd, 0xdf, 0x20, 0x76, 0x6f, 0xb2, 0xd3, 0xed, 0xd1, 0x37, 0x0b,
+	0x76, 0x7c, 0x3e, 0x9c, 0x33, 0xc5, 0x53, 0xeb, 0xed, 0xab, 0x8c, 0x11, 0xf0, 0x10, 0xb3, 0xc0,
+	0xe1, 0x22, 0x70, 0x03, 0xc2, 0xd4, 0x03, 0xb8, 0x3f, 0xdd, 0xfd, 0xe9, 0x03, 0x3f, 0x9c, 0x46,
+	0xbe, 0xe4, 0xb6, 0x5e, 0xea, 0x72, 0x4d, 0xd5, 0xd0, 0x2c, 0x49, 0x53, 0x37, 0xec, 0xd7, 0xbf,
+	0x1a, 0xc2, 0xb9, 0x22, 0x9c, 0x4f, 0x13, 0xce, 0xfb, 0xf5, 0xbb, 0xdc, 0xb6, 0x26, 0x78, 0x9e,
+	0x62, 0x78, 0xde, 0x34, 0xc5, 0xf3, 0xfa, 0xf5, 0x8b, 0xa2, 0xb2, 0xb7, 0xff, 0x23, 0x00, 0x00,
+	0xff, 0xff, 0x2b, 0x16, 0xec, 0x2d, 0x26, 0x05, 0x00, 0x00,
 }
diff --git a/googleapis/cloud/securitycenter/v1/notification_config.pb.go b/googleapis/cloud/securitycenter/v1/notification_config.pb.go
new file mode 100644
index 0000000..773d7e5
--- /dev/null
+++ b/googleapis/cloud/securitycenter/v1/notification_config.pb.go
@@ -0,0 +1,241 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/cloud/securitycenter/v1/notification_config.proto
+
+package securitycenter
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Cloud Security Command Center (Cloud SCC) notification configs.
+//
+// A notification config is a Cloud SCC resource that contains the configuration
+// to send notifications for create/update events of findings, assets and etc.
+type NotificationConfig struct {
+	// The relative resource name of this notification config. See:
+	// https://cloud.google.com/apis/design/resource_names#relative_resource_name
+	// Example:
+	// "organizations/{organization_id}/notificationConfigs/notify_public_bucket".
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The description of the notification config (max of 1024 characters).
+	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	// The PubSub topic to send notifications to. Its format is
+	// "projects/[project_id]/topics/[topic]".
+	PubsubTopic string `protobuf:"bytes,3,opt,name=pubsub_topic,json=pubsubTopic,proto3" json:"pubsub_topic,omitempty"`
+	// Output only. The service account that needs "pubsub.topics.publish"
+	// permission to publish to the PubSub topic.
+	ServiceAccount string `protobuf:"bytes,4,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"`
+	// The config for triggering notifications.
+	//
+	// Types that are valid to be assigned to NotifyConfig:
+	//	*NotificationConfig_StreamingConfig_
+	NotifyConfig         isNotificationConfig_NotifyConfig `protobuf_oneof:"notify_config"`
+	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
+	XXX_unrecognized     []byte                            `json:"-"`
+	XXX_sizecache        int32                             `json:"-"`
+}
+
+func (m *NotificationConfig) Reset()         { *m = NotificationConfig{} }
+func (m *NotificationConfig) String() string { return proto.CompactTextString(m) }
+func (*NotificationConfig) ProtoMessage()    {}
+func (*NotificationConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8283693b130632bd, []int{0}
+}
+
+func (m *NotificationConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_NotificationConfig.Unmarshal(m, b)
+}
+func (m *NotificationConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_NotificationConfig.Marshal(b, m, deterministic)
+}
+func (m *NotificationConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_NotificationConfig.Merge(m, src)
+}
+func (m *NotificationConfig) XXX_Size() int {
+	return xxx_messageInfo_NotificationConfig.Size(m)
+}
+func (m *NotificationConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_NotificationConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_NotificationConfig proto.InternalMessageInfo
+
+func (m *NotificationConfig) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *NotificationConfig) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+func (m *NotificationConfig) GetPubsubTopic() string {
+	if m != nil {
+		return m.PubsubTopic
+	}
+	return ""
+}
+
+func (m *NotificationConfig) GetServiceAccount() string {
+	if m != nil {
+		return m.ServiceAccount
+	}
+	return ""
+}
+
+type isNotificationConfig_NotifyConfig interface {
+	isNotificationConfig_NotifyConfig()
+}
+
+type NotificationConfig_StreamingConfig_ struct {
+	StreamingConfig *NotificationConfig_StreamingConfig `protobuf:"bytes,5,opt,name=streaming_config,json=streamingConfig,proto3,oneof"`
+}
+
+func (*NotificationConfig_StreamingConfig_) isNotificationConfig_NotifyConfig() {}
+
+func (m *NotificationConfig) GetNotifyConfig() isNotificationConfig_NotifyConfig {
+	if m != nil {
+		return m.NotifyConfig
+	}
+	return nil
+}
+
+func (m *NotificationConfig) GetStreamingConfig() *NotificationConfig_StreamingConfig {
+	if x, ok := m.GetNotifyConfig().(*NotificationConfig_StreamingConfig_); ok {
+		return x.StreamingConfig
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*NotificationConfig) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*NotificationConfig_StreamingConfig_)(nil),
+	}
+}
+
+// The config for streaming-based notifications, which send each event as soon
+// as it is detected.
+type NotificationConfig_StreamingConfig struct {
+	// Expression that defines the filter to apply across create/update events
+	// of assets or findings as specified by the event type. The expression is a
+	// list of zero or more restrictions combined via logical operators `AND`
+	// and `OR`. Parentheses are supported, and `OR` has higher precedence than
+	// `AND`.
+	//
+	// Restrictions have the form `<field> <operator> <value>` and may have a
+	// `-` character in front of them to indicate negation. The fields map to
+	// those defined in the corresponding resource.
+	//
+	// The supported operators are:
+	//
+	// * `=` for all value types.
+	// * `>`, `<`, `>=`, `<=` for integer values.
+	// * `:`, meaning substring matching, for strings.
+	//
+	// The supported value types are:
+	//
+	// * string literals in quotes.
+	// * integer literals without quotes.
+	// * boolean literals `true` and `false` without quotes.
+	Filter               string   `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *NotificationConfig_StreamingConfig) Reset()         { *m = NotificationConfig_StreamingConfig{} }
+func (m *NotificationConfig_StreamingConfig) String() string { return proto.CompactTextString(m) }
+func (*NotificationConfig_StreamingConfig) ProtoMessage()    {}
+func (*NotificationConfig_StreamingConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8283693b130632bd, []int{0, 0}
+}
+
+func (m *NotificationConfig_StreamingConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_NotificationConfig_StreamingConfig.Unmarshal(m, b)
+}
+func (m *NotificationConfig_StreamingConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_NotificationConfig_StreamingConfig.Marshal(b, m, deterministic)
+}
+func (m *NotificationConfig_StreamingConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_NotificationConfig_StreamingConfig.Merge(m, src)
+}
+func (m *NotificationConfig_StreamingConfig) XXX_Size() int {
+	return xxx_messageInfo_NotificationConfig_StreamingConfig.Size(m)
+}
+func (m *NotificationConfig_StreamingConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_NotificationConfig_StreamingConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_NotificationConfig_StreamingConfig proto.InternalMessageInfo
+
+func (m *NotificationConfig_StreamingConfig) GetFilter() string {
+	if m != nil {
+		return m.Filter
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*NotificationConfig)(nil), "google.cloud.securitycenter.v1.NotificationConfig")
+	proto.RegisterType((*NotificationConfig_StreamingConfig)(nil), "google.cloud.securitycenter.v1.NotificationConfig.StreamingConfig")
+}
+
+func init() {
+	proto.RegisterFile("google/cloud/securitycenter/v1/notification_config.proto", fileDescriptor_8283693b130632bd)
+}
+
+var fileDescriptor_8283693b130632bd = []byte{
+	// 495 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xc1, 0x6e, 0x13, 0x3d,
+	0x10, 0xc7, 0xbf, 0x24, 0xfd, 0x2a, 0xe1, 0x00, 0x41, 0x3e, 0x40, 0x08, 0x50, 0xd2, 0x9e, 0x8a,
+	0x84, 0x6c, 0x02, 0x17, 0xb4, 0x5c, 0xd8, 0x8d, 0x04, 0x1c, 0x10, 0xaa, 0x52, 0x94, 0x03, 0x8a,
+	0x14, 0x39, 0x8e, 0xb3, 0x18, 0x6d, 0x3c, 0x2b, 0xdb, 0x1b, 0xa9, 0x8d, 0xf6, 0x85, 0x78, 0x00,
+	0x1e, 0x82, 0xa7, 0xe0, 0x4a, 0x1e, 0x81, 0x13, 0x8a, 0xed, 0x8a, 0xdd, 0xb4, 0x94, 0x53, 0x3c,
+	0xf3, 0xff, 0xcd, 0xe4, 0xef, 0xf1, 0x2c, 0x7a, 0x99, 0x02, 0xa4, 0x99, 0xa0, 0x3c, 0x83, 0x62,
+	0x4e, 0x8d, 0xe0, 0x85, 0x96, 0xf6, 0x8c, 0x0b, 0x65, 0x85, 0xa6, 0xab, 0x01, 0x55, 0x60, 0xe5,
+	0x42, 0x72, 0x66, 0x25, 0xa8, 0x29, 0x07, 0xb5, 0x90, 0x29, 0xc9, 0x35, 0x58, 0xc0, 0x07, 0xbe,
+	0x92, 0xb8, 0x4a, 0x52, 0xaf, 0x24, 0xab, 0x41, 0xef, 0x61, 0xe8, 0xcc, 0x72, 0x49, 0x99, 0x52,
+	0x60, 0x5d, 0x0f, 0xe3, 0xab, 0x7b, 0x8f, 0x2b, 0xea, 0x42, 0x8a, 0x6c, 0x3e, 0x9d, 0x89, 0xcf,
+	0x6c, 0x25, 0x41, 0x07, 0xe0, 0x7e, 0x05, 0xd0, 0xc2, 0x40, 0xa1, 0xb9, 0xf0, 0xd2, 0xd1, 0xcf,
+	0x16, 0xc2, 0x1f, 0x2a, 0xbe, 0x86, 0xce, 0x16, 0xc6, 0x68, 0x4f, 0xb1, 0xa5, 0xe8, 0x36, 0xfa,
+	0x8d, 0xe3, 0x1b, 0x23, 0x77, 0xc6, 0x7d, 0xd4, 0x9e, 0x0b, 0xc3, 0xb5, 0xcc, 0xb7, 0x60, 0xb7,
+	0xe9, 0xa4, 0x6a, 0x0a, 0x0f, 0xd1, 0xcd, 0xbc, 0x98, 0x99, 0x62, 0x36, 0xb5, 0x90, 0x4b, 0xde,
+	0x6d, 0x6d, 0x91, 0xa4, 0xff, 0x2b, 0x7e, 0x84, 0x1e, 0x78, 0x81, 0x78, 0x27, 0x2c, 0x97, 0x86,
+	0x70, 0x58, 0xd2, 0x8f, 0x5b, 0x6e, 0xd4, 0xf6, 0xa2, 0x0b, 0xf0, 0x53, 0xd4, 0x31, 0x42, 0xaf,
+	0x24, 0x17, 0x53, 0xc6, 0x39, 0x14, 0xca, 0x76, 0xf7, 0x5c, 0x9f, 0xd6, 0x8f, 0xb8, 0x35, 0xba,
+	0x1d, 0xb4, 0xd8, 0x4b, 0x18, 0xd0, 0x1d, 0x63, 0xb5, 0x60, 0x4b, 0xa9, 0xd2, 0x30, 0xd3, 0xee,
+	0xff, 0xfd, 0xc6, 0x71, 0xfb, 0x79, 0x42, 0xae, 0x1f, 0x2a, 0xb9, 0x7c, 0x6d, 0x72, 0x7a, 0xd1,
+	0xca, 0xc7, 0xef, 0xfe, 0x1b, 0x75, 0x4c, 0x3d, 0xd5, 0x7b, 0x82, 0x3a, 0x3b, 0x14, 0xbe, 0x8b,
+	0xf6, 0x17, 0x32, 0xb3, 0x42, 0x87, 0x71, 0x85, 0x28, 0x2a, 0x37, 0xf1, 0x39, 0x7a, 0xb6, 0xf3,
+	0xc7, 0x3b, 0x03, 0xb8, 0x62, 0xf6, 0x6f, 0x40, 0xa7, 0x4c, 0xc9, 0x73, 0xff, 0xc6, 0x74, 0x5d,
+	0x0d, 0xcb, 0xda, 0x12, 0xf9, 0x02, 0x43, 0xd7, 0x57, 0x6c, 0x56, 0x99, 0x74, 0xd0, 0x2d, 0x97,
+	0x3f, 0x0b, 0x99, 0xe4, 0x5b, 0x73, 0x13, 0xbf, 0xbe, 0xf6, 0x25, 0xf0, 0x61, 0xae, 0xe1, 0x8b,
+	0xe0, 0xd6, 0xd0, 0x75, 0x38, 0x95, 0xd4, 0xbd, 0xa5, 0xa1, 0x6b, 0xf7, 0x5b, 0xa2, 0x23, 0x0e,
+	0xcb, 0x7f, 0x8c, 0x36, 0xb9, 0x77, 0xf9, 0x5a, 0x27, 0xdb, 0x75, 0x3b, 0x69, 0x7c, 0x7a, 0x1f,
+	0x4a, 0x53, 0xc8, 0x98, 0x4a, 0x09, 0xe8, 0x94, 0xa6, 0x42, 0xb9, 0x65, 0xa4, 0x7f, 0x2c, 0xfd,
+	0xed, 0x1b, 0x7a, 0x55, 0xcf, 0x7c, 0x6d, 0x1e, 0xbc, 0xf5, 0xed, 0x86, 0xce, 0xc9, 0x69, 0x50,
+	0x87, 0xde, 0xc9, 0x78, 0xf0, 0xfd, 0x02, 0x98, 0x38, 0x60, 0x52, 0x07, 0x26, 0xe3, 0xc1, 0xa6,
+	0x79, 0xe8, 0x81, 0x28, 0x72, 0x44, 0x14, 0xd5, 0x91, 0x28, 0x1a, 0x0f, 0x66, 0xfb, 0xce, 0xde,
+	0x8b, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x5f, 0x53, 0x87, 0xe1, 0x03, 0x00, 0x00,
+}
diff --git a/googleapis/cloud/securitycenter/v1/notification_message.pb.go b/googleapis/cloud/securitycenter/v1/notification_message.pb.go
new file mode 100644
index 0000000..c72f78f
--- /dev/null
+++ b/googleapis/cloud/securitycenter/v1/notification_message.pb.go
@@ -0,0 +1,132 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/cloud/securitycenter/v1/notification_message.proto
+
+package securitycenter
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Cloud SCC's Notification
+type NotificationMessage struct {
+	// Name of the notification config that generated current notification.
+	NotificationConfigName string `protobuf:"bytes,1,opt,name=notification_config_name,json=notificationConfigName,proto3" json:"notification_config_name,omitempty"`
+	// Notification Event.
+	//
+	// Types that are valid to be assigned to Event:
+	//	*NotificationMessage_Finding
+	Event                isNotificationMessage_Event `protobuf_oneof:"event"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *NotificationMessage) Reset()         { *m = NotificationMessage{} }
+func (m *NotificationMessage) String() string { return proto.CompactTextString(m) }
+func (*NotificationMessage) ProtoMessage()    {}
+func (*NotificationMessage) Descriptor() ([]byte, []int) {
+	return fileDescriptor_63db66f0787c1bb5, []int{0}
+}
+
+func (m *NotificationMessage) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_NotificationMessage.Unmarshal(m, b)
+}
+func (m *NotificationMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_NotificationMessage.Marshal(b, m, deterministic)
+}
+func (m *NotificationMessage) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_NotificationMessage.Merge(m, src)
+}
+func (m *NotificationMessage) XXX_Size() int {
+	return xxx_messageInfo_NotificationMessage.Size(m)
+}
+func (m *NotificationMessage) XXX_DiscardUnknown() {
+	xxx_messageInfo_NotificationMessage.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_NotificationMessage proto.InternalMessageInfo
+
+func (m *NotificationMessage) GetNotificationConfigName() string {
+	if m != nil {
+		return m.NotificationConfigName
+	}
+	return ""
+}
+
+type isNotificationMessage_Event interface {
+	isNotificationMessage_Event()
+}
+
+type NotificationMessage_Finding struct {
+	Finding *Finding `protobuf:"bytes,2,opt,name=finding,proto3,oneof"`
+}
+
+func (*NotificationMessage_Finding) isNotificationMessage_Event() {}
+
+func (m *NotificationMessage) GetEvent() isNotificationMessage_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (m *NotificationMessage) GetFinding() *Finding {
+	if x, ok := m.GetEvent().(*NotificationMessage_Finding); ok {
+		return x.Finding
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*NotificationMessage) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*NotificationMessage_Finding)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterType((*NotificationMessage)(nil), "google.cloud.securitycenter.v1.NotificationMessage")
+}
+
+func init() {
+	proto.RegisterFile("google/cloud/securitycenter/v1/notification_message.proto", fileDescriptor_63db66f0787c1bb5)
+}
+
+var fileDescriptor_63db66f0787c1bb5 = []byte{
+	// 310 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0xc1, 0x4a, 0x33, 0x31,
+	0x14, 0x85, 0xff, 0x14, 0x7e, 0x8b, 0x71, 0x57, 0x41, 0x86, 0x22, 0xa5, 0x76, 0x63, 0x17, 0x92,
+	0x30, 0xba, 0xd1, 0xb8, 0xeb, 0x80, 0xba, 0xd0, 0x52, 0x2a, 0x74, 0x21, 0x85, 0x12, 0xd3, 0x34,
+	0x04, 0x66, 0xee, 0x1d, 0x66, 0xd2, 0x01, 0x1f, 0xc6, 0x17, 0xf0, 0x51, 0x7c, 0x14, 0xd7, 0x3e,
+	0x80, 0x98, 0x4c, 0xa1, 0x03, 0x6a, 0xb7, 0x39, 0xdf, 0x39, 0xf7, 0x9c, 0xd0, 0x2b, 0x83, 0x68,
+	0x52, 0xcd, 0x55, 0x8a, 0xeb, 0x25, 0x2f, 0xb5, 0x5a, 0x17, 0xd6, 0xbd, 0x28, 0x0d, 0x4e, 0x17,
+	0xbc, 0x8a, 0x39, 0xa0, 0xb3, 0x2b, 0xab, 0xa4, 0xb3, 0x08, 0x8b, 0x4c, 0x97, 0xa5, 0x34, 0x9a,
+	0xe5, 0x05, 0x3a, 0xec, 0xf4, 0x82, 0x95, 0x79, 0x2b, 0x6b, 0x5a, 0x59, 0x15, 0x77, 0x8f, 0xeb,
+	0x68, 0x99, 0x5b, 0x2e, 0x01, 0xd0, 0xf9, 0x90, 0x32, 0xb8, 0xbb, 0x67, 0x3b, 0x0e, 0xaf, 0x2c,
+	0x2c, 0x2d, 0x98, 0x40, 0x0f, 0x5e, 0x09, 0x3d, 0x1c, 0x6f, 0x55, 0x79, 0x08, 0x4d, 0x3a, 0x97,
+	0x34, 0x6a, 0x34, 0x54, 0x08, 0x2b, 0x6b, 0x16, 0x20, 0x33, 0x1d, 0x91, 0x3e, 0x19, 0xee, 0x4f,
+	0x8f, 0xb6, 0xf5, 0xc4, 0xcb, 0x63, 0x99, 0xe9, 0x4e, 0x42, 0xdb, 0xf5, 0x89, 0xa8, 0xd5, 0x27,
+	0xc3, 0x83, 0xf3, 0x53, 0xf6, 0xf7, 0x1e, 0x76, 0x13, 0xf0, 0xbb, 0x7f, 0xd3, 0x8d, 0x73, 0xd4,
+	0xa6, 0xff, 0x75, 0xa5, 0xc1, 0x8d, 0x3e, 0x09, 0x1d, 0x28, 0xcc, 0x76, 0x44, 0x8c, 0xa2, 0x1f,
+	0x36, 0x4c, 0xbe, 0x07, 0x4e, 0xc8, 0xd3, 0x7d, 0xed, 0x35, 0x98, 0x4a, 0x30, 0x0c, 0x0b, 0xc3,
+	0x8d, 0x06, 0x3f, 0x9f, 0x07, 0x49, 0xe6, 0xb6, 0xfc, 0xed, 0xbf, 0xae, 0x9b, 0x2f, 0x6f, 0xad,
+	0xde, 0x6d, 0x88, 0x4b, 0x7c, 0x95, 0xc7, 0x5a, 0x4d, 0x42, 0x95, 0x59, 0xfc, 0xbe, 0x01, 0xe6,
+	0x1e, 0x98, 0x37, 0x81, 0xf9, 0x2c, 0xfe, 0x68, 0x9d, 0x04, 0x40, 0x08, 0x4f, 0x08, 0xd1, 0x44,
+	0x84, 0x98, 0xc5, 0xcf, 0x7b, 0xbe, 0xde, 0xc5, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xda, 0x1f,
+	0xf5, 0x40, 0x46, 0x02, 0x00, 0x00,
+}
diff --git a/googleapis/cloud/securitycenter/v1/organization_settings.pb.go b/googleapis/cloud/securitycenter/v1/organization_settings.pb.go
index a3bf09b..1703ce7 100644
--- a/googleapis/cloud/securitycenter/v1/organization_settings.pb.go
+++ b/googleapis/cloud/securitycenter/v1/organization_settings.pb.go
@@ -202,27 +202,27 @@
 	0xdf, 0x49, 0xbe, 0x20, 0x57, 0x00, 0x88, 0x94, 0xdb, 0x2c, 0x85, 0x75, 0x62, 0x6b, 0xce, 0xd6,
 	0x99, 0xcc, 0xaf, 0x18, 0x57, 0x39, 0xcf, 0xec, 0x8d, 0x63, 0x43, 0x26, 0xa8, 0x92, 0x1f, 0x68,
 	0x2e, 0x41, 0xc5, 0x9a, 0xe7, 0xb9, 0x54, 0x42, 0x93, 0x55, 0x06, 0x39, 0xe0, 0x5e, 0xa1, 0x25,
-	0x46, 0x4b, 0xea, 0x5a, 0xb2, 0x71, 0xba, 0x0f, 0x4b, 0x6f, 0xba, 0x92, 0x76, 0xc6, 0x35, 0xac,
-	0x33, 0xc6, 0x0b, 0x69, 0xf7, 0x51, 0x05, 0xa2, 0x4a, 0x41, 0x6e, 0x02, 0x4a, 0xe3, 0xc1, 0x8f,
-	0x7d, 0xd4, 0x9e, 0x56, 0x82, 0x67, 0x65, 0x2e, 0xc6, 0x68, 0x5f, 0xd1, 0x25, 0xef, 0x58, 0x7d,
-	0x6b, 0x78, 0x10, 0x99, 0x67, 0xfc, 0x0c, 0x1d, 0x73, 0x45, 0x2f, 0x52, 0x1e, 0x53, 0xad, 0x79,
-	0x1e, 0x27, 0x52, 0x33, 0xd8, 0xf0, 0xec, 0xaa, 0xd3, 0xe8, 0x5b, 0xc3, 0xfb, 0x51, 0xbb, 0x40,
-	0x4f, 0x6e, 0xc0, 0xf1, 0x16, 0xc3, 0x5f, 0xd0, 0xf1, 0x2d, 0x7a, 0xcc, 0x40, 0xbd, 0x97, 0xa2,
-	0xb3, 0xd7, 0xb7, 0x86, 0xcd, 0x51, 0x40, 0xfe, 0x7e, 0x39, 0xb2, 0xab, 0x1f, 0xa9, 0x87, 0x78,
-	0xc6, 0x30, 0x6a, 0xd3, 0x1d, 0xd3, 0xee, 0xd7, 0x06, 0x6a, 0xef, 0xa2, 0xe3, 0xc7, 0xa8, 0xb9,
-	0xca, 0xe0, 0x92, 0xb3, 0x3c, 0x96, 0x89, 0xee, 0x58, 0xfd, 0xbd, 0xe1, 0x41, 0x84, 0xca, 0x51,
-	0x90, 0x68, 0xfc, 0x19, 0x1d, 0x49, 0xc5, 0xd2, 0xb5, 0xbe, 0xf9, 0x24, 0x4b, 0x48, 0xb8, 0xb9,
-	0xe8, 0xd1, 0xe8, 0xf5, 0x7f, 0xab, 0x4c, 0x82, 0xad, 0xff, 0x29, 0x24, 0x3c, 0x3a, 0x94, 0xd5,
-	0xe3, 0x20, 0x44, 0x87, 0x35, 0x1c, 0xf7, 0x50, 0x37, 0x08, 0xbd, 0xc9, 0xf9, 0x2c, 0x98, 0x86,
-	0xf1, 0xe9, 0x74, 0xec, 0xc7, 0xe7, 0xe1, 0xec, 0xcc, 0xf7, 0x82, 0x97, 0x81, 0x3f, 0x6e, 0xdd,
-	0xc1, 0x2d, 0xf4, 0xc0, 0xe0, 0x63, 0x3f, 0x9e, 0x86, 0x93, 0xb7, 0x2d, 0x0b, 0x37, 0xd1, 0x3d,
-	0xff, 0x8d, 0x99, 0xb4, 0x1a, 0xee, 0xe5, 0xf5, 0x89, 0x40, 0xa3, 0x5b, 0x75, 0x8b, 0xab, 0xd0,
-	0x95, 0xd4, 0x84, 0xc1, 0xd2, 0xde, 0xb9, 0x0d, 0x4e, 0x75, 0x39, 0xb5, 0xfd, 0xb1, 0x7a, 0xfc,
-	0x54, 0xdb, 0xdc, 0xad, 0xe4, 0xc5, 0x4f, 0x0b, 0x0d, 0x18, 0x2c, 0xff, 0xf1, 0xa6, 0xce, 0xac,
-	0x77, 0x93, 0x92, 0x21, 0x20, 0xa5, 0x4a, 0x10, 0xc8, 0x84, 0x2d, 0xb8, 0x32, 0xeb, 0x69, 0xff,
-	0xee, 0xf6, 0xa7, 0xdf, 0xe6, 0x79, 0x7d, 0xf2, 0xad, 0xd1, 0x7b, 0x55, 0xd8, 0x79, 0x26, 0x70,
-	0x56, 0xa2, 0x5e, 0x11, 0x38, 0x77, 0xbe, 0x6f, 0x09, 0x0b, 0x43, 0x58, 0xd4, 0x09, 0x8b, 0xb9,
-	0x73, 0xdd, 0x78, 0x52, 0x10, 0x5c, 0xd7, 0x30, 0x5c, 0xb7, 0x4e, 0x71, 0xdd, 0xb9, 0x73, 0x71,
-	0xd7, 0xd4, 0x7b, 0xfa, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x53, 0xc2, 0x39, 0x76, 0xd4, 0x03, 0x00,
+	0x46, 0x4b, 0xea, 0x5a, 0xb2, 0x71, 0xba, 0x8f, 0x4a, 0x6f, 0xba, 0x92, 0x36, 0x55, 0x0a, 0x72,
+	0xe3, 0x52, 0xaa, 0xbb, 0x0f, 0x2b, 0x68, 0xc6, 0x35, 0xac, 0x33, 0xc6, 0x0b, 0x68, 0xf0, 0x63,
+	0x1f, 0xb5, 0xa7, 0x95, 0xe0, 0x59, 0x99, 0x8b, 0x31, 0xda, 0x57, 0x74, 0xc9, 0x3b, 0x56, 0xdf,
+	0x1a, 0x1e, 0x44, 0xe6, 0x19, 0x3f, 0x43, 0xc7, 0x5c, 0xd1, 0x8b, 0x94, 0xc7, 0x54, 0x6b, 0x9e,
+	0xc7, 0x89, 0xd4, 0x0c, 0x36, 0x3c, 0xbb, 0xea, 0x34, 0xfa, 0xd6, 0xf0, 0x7e, 0xd4, 0x2e, 0xd0,
+	0x93, 0x1b, 0x70, 0xbc, 0xc5, 0xf0, 0x17, 0x74, 0x7c, 0x8b, 0x1e, 0x33, 0x50, 0xef, 0xa5, 0xe8,
+	0xec, 0xf5, 0xad, 0x61, 0x73, 0x14, 0x90, 0xbf, 0x5f, 0x8e, 0xec, 0xea, 0x47, 0xea, 0x21, 0x9e,
+	0x31, 0x8c, 0xda, 0x74, 0xc7, 0xb4, 0xfb, 0xb5, 0x81, 0xda, 0xbb, 0xe8, 0xf8, 0x31, 0x6a, 0xae,
+	0x32, 0xb8, 0xe4, 0x2c, 0x8f, 0x65, 0xa2, 0x3b, 0x56, 0x7f, 0x6f, 0x78, 0x10, 0xa1, 0x72, 0x14,
+	0x24, 0x1a, 0x7f, 0x46, 0x47, 0x52, 0xb1, 0x74, 0xad, 0x6f, 0x3e, 0xc9, 0x12, 0x12, 0x6e, 0x2e,
+	0x7a, 0x34, 0x7a, 0xfd, 0xdf, 0x2a, 0x93, 0x60, 0xeb, 0x7f, 0x0a, 0x09, 0x8f, 0x0e, 0x65, 0xf5,
+	0x38, 0x08, 0xd1, 0x61, 0x0d, 0xc7, 0x3d, 0xd4, 0x0d, 0x42, 0x6f, 0x72, 0x3e, 0x0b, 0xa6, 0x61,
+	0x7c, 0x3a, 0x1d, 0xfb, 0xf1, 0x79, 0x38, 0x3b, 0xf3, 0xbd, 0xe0, 0x65, 0xe0, 0x8f, 0x5b, 0x77,
+	0x70, 0x0b, 0x3d, 0x30, 0xf8, 0xd8, 0x8f, 0xa7, 0xe1, 0xe4, 0x6d, 0xcb, 0xc2, 0x4d, 0x74, 0xcf,
+	0x7f, 0x63, 0x26, 0xad, 0x86, 0x7b, 0x79, 0x7d, 0x22, 0xd0, 0xe8, 0x56, 0xdd, 0xe2, 0x2a, 0x74,
+	0x25, 0x35, 0x61, 0xb0, 0xb4, 0x77, 0x6e, 0x83, 0x53, 0x5d, 0x4e, 0x6d, 0x7f, 0xac, 0x1e, 0x3f,
+	0xd5, 0x36, 0x77, 0x2b, 0x79, 0xf1, 0xd3, 0x42, 0x03, 0x06, 0xcb, 0x7f, 0xbc, 0xa9, 0x33, 0xeb,
+	0xdd, 0xa4, 0x64, 0x08, 0x48, 0xa9, 0x12, 0x04, 0x32, 0x61, 0x0b, 0xae, 0xcc, 0x7a, 0xda, 0xbf,
+	0xbb, 0xfd, 0xe9, 0xb7, 0x79, 0x5e, 0x9f, 0x7c, 0x6b, 0xf4, 0x5e, 0x15, 0x76, 0x9e, 0x09, 0x9c,
+	0x95, 0xa8, 0x57, 0x04, 0xce, 0x9d, 0xef, 0x5b, 0xc2, 0xc2, 0x10, 0x16, 0x75, 0xc2, 0x62, 0xee,
+	0x5c, 0x37, 0x9e, 0x14, 0x04, 0xd7, 0x35, 0x0c, 0xd7, 0xad, 0x53, 0x5c, 0x77, 0xee, 0x5c, 0xdc,
+	0x35, 0xf5, 0x9e, 0xfe, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x6c, 0xcd, 0x64, 0xa3, 0xd4, 0x03, 0x00,
 	0x00,
 }
diff --git a/googleapis/cloud/securitycenter/v1/run_asset_discovery_response.pb.go b/googleapis/cloud/securitycenter/v1/run_asset_discovery_response.pb.go
index 1a9e272..4465222 100644
--- a/googleapis/cloud/securitycenter/v1/run_asset_discovery_response.pb.go
+++ b/googleapis/cloud/securitycenter/v1/run_asset_discovery_response.pb.go
@@ -121,28 +121,28 @@
 
 var fileDescriptor_421ea6ed240ae1f7 = []byte{
 	// 374 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x41, 0x8a, 0xdb, 0x30,
-	0x14, 0x86, 0x6b, 0x97, 0x94, 0x56, 0xa5, 0x21, 0x35, 0x14, 0x92, 0x50, 0x42, 0x9a, 0x55, 0x56,
-	0x12, 0x4e, 0xe9, 0xc6, 0x5d, 0x14, 0xd7, 0x56, 0x4b, 0x20, 0x49, 0x8d, 0xed, 0x64, 0x51, 0x02,
-	0xc6, 0x71, 0x54, 0x63, 0x48, 0x25, 0x23, 0xc9, 0x81, 0x5c, 0x69, 0x8e, 0x32, 0x47, 0x98, 0x23,
-	0xcc, 0x09, 0x66, 0x39, 0x58, 0xb2, 0x07, 0xbc, 0xc8, 0xcc, 0x52, 0xfa, 0x3f, 0x7d, 0xef, 0x7f,
-	0x08, 0xb8, 0x39, 0x63, 0xf9, 0x89, 0xa0, 0xec, 0xc4, 0xaa, 0x23, 0x12, 0x24, 0xab, 0x78, 0x21,
-	0x2f, 0x19, 0xa1, 0x92, 0x70, 0x74, 0xb6, 0x11, 0xaf, 0x68, 0x92, 0x0a, 0x41, 0x64, 0x72, 0x2c,
-	0x44, 0xc6, 0xce, 0x84, 0x5f, 0x12, 0x4e, 0x44, 0xc9, 0xa8, 0x20, 0xb0, 0xe4, 0x4c, 0x32, 0x6b,
-	0xa2, 0x15, 0x50, 0x29, 0x60, 0x57, 0x01, 0xcf, 0xf6, 0xb8, 0xc9, 0x91, 0xa2, 0x0f, 0xd5, 0x3f,
-	0x74, 0xac, 0x78, 0x2a, 0x0b, 0x46, 0xf5, 0xfb, 0xf1, 0xe7, 0x26, 0x4f, 0xcb, 0x02, 0xa5, 0x94,
-	0x32, 0xa9, 0x42, 0xa1, 0xd3, 0xd9, 0x83, 0x01, 0x46, 0x61, 0x45, 0xdd, 0xba, 0x83, 0xdf, 0x56,
-	0x08, 0x9b, 0x06, 0xd6, 0x16, 0xf4, 0x84, 0x4c, 0x25, 0x19, 0x1a, 0x53, 0x63, 0xde, 0x5f, 0xfc,
-	0x80, 0xcf, 0x77, 0x81, 0x57, 0x4d, 0x30, 0xaa, 0x35, 0xa1, 0xb6, 0x59, 0xdf, 0xc0, 0xdb, 0xb6,
-	0xe4, 0xd0, 0x9c, 0x1a, 0xf3, 0xf7, 0x8b, 0x51, 0x6b, 0x6e, 0xb7, 0x80, 0x7e, 0x03, 0x84, 0x4f,
-	0xe8, 0x6c, 0x0d, 0x7a, 0x4a, 0x63, 0x7d, 0x02, 0x1f, 0xa3, 0xd8, 0x8d, 0x71, 0xb2, 0xdd, 0x44,
-	0x01, 0xf6, 0x96, 0xbf, 0x96, 0xd8, 0x1f, 0xbc, 0xb2, 0x3e, 0x80, 0x77, 0xde, 0x9f, 0x75, 0xb0,
-	0xc2, 0x31, 0xf6, 0x07, 0x86, 0xd5, 0x07, 0x20, 0xda, 0x06, 0x38, 0x8c, 0xb0, 0x8f, 0xfd, 0x81,
-	0x59, 0x9f, 0x63, 0x1c, 0xae, 0x97, 0x1b, 0xb7, 0xce, 0x5f, 0xff, 0xbc, 0x33, 0xc0, 0x2c, 0x63,
-	0xff, 0x5f, 0xd8, 0x29, 0x30, 0xfe, 0xae, 0x1a, 0x22, 0x67, 0xa7, 0x94, 0xe6, 0x90, 0xf1, 0x1c,
-	0xe5, 0x84, 0xaa, 0xa6, 0x48, 0x47, 0x69, 0x59, 0x88, 0x6b, 0x7f, 0xfc, 0xbd, 0x7b, 0x73, 0x63,
-	0x4e, 0x7e, 0x6b, 0x9d, 0xa7, 0x06, 0x46, 0x4d, 0xea, 0xe9, 0x81, 0x3b, 0xfb, 0xb6, 0x05, 0xf6,
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x8a, 0x9b, 0x40,
+	0x18, 0x80, 0xab, 0x25, 0xa5, 0x9d, 0xd2, 0x90, 0x0a, 0x85, 0x24, 0x94, 0x90, 0xe6, 0x94, 0xd3,
+	0x0c, 0xa6, 0xf4, 0x62, 0x0f, 0xc5, 0xea, 0xb4, 0x04, 0x92, 0x54, 0xd4, 0xe4, 0x50, 0x02, 0x62,
+	0xcc, 0x54, 0x84, 0x74, 0x46, 0x66, 0xc6, 0x40, 0x5e, 0x69, 0x1f, 0x65, 0x1f, 0x61, 0x1f, 0x61,
+	0x9f, 0x60, 0x8f, 0x8b, 0x33, 0xba, 0xe0, 0x21, 0xbb, 0xc7, 0xf1, 0xff, 0xe6, 0xfb, 0x3f, 0x19,
+	0xe0, 0xe6, 0x8c, 0xe5, 0x27, 0x82, 0xb2, 0x13, 0xab, 0x8e, 0x48, 0x90, 0xac, 0xe2, 0x85, 0xbc,
+	0x64, 0x84, 0x4a, 0xc2, 0xd1, 0xd9, 0x46, 0xbc, 0xa2, 0x49, 0x2a, 0x04, 0x91, 0xc9, 0xb1, 0x10,
+	0x19, 0x3b, 0x13, 0x7e, 0x49, 0x38, 0x11, 0x25, 0xa3, 0x82, 0xc0, 0x92, 0x33, 0xc9, 0xac, 0x89,
+	0x56, 0x40, 0xa5, 0x80, 0x5d, 0x05, 0x3c, 0xdb, 0xe3, 0xcf, 0xcd, 0x8a, 0xb4, 0x2c, 0x50, 0x4a,
+	0x29, 0x93, 0xa9, 0x2c, 0x18, 0x15, 0xfa, 0xf6, 0xb8, 0xb9, 0x8d, 0xd4, 0xe9, 0x50, 0xfd, 0x43,
+	0xc7, 0x8a, 0x2b, 0x40, 0xcf, 0x67, 0x0f, 0x06, 0x18, 0x85, 0x15, 0x75, 0xeb, 0x06, 0xbf, 0x4d,
+	0x08, 0x9b, 0x02, 0x6b, 0x0b, 0x7a, 0x42, 0xa6, 0x92, 0x0c, 0x8d, 0xa9, 0x31, 0xef, 0x2f, 0x7e,
+	0xc0, 0xe7, 0x5b, 0xe0, 0x55, 0x13, 0x8c, 0x6a, 0x4d, 0xa8, 0x6d, 0xd6, 0x37, 0xf0, 0xb6, 0xcd,
+	0x18, 0x9a, 0x53, 0x63, 0xfe, 0x7e, 0x31, 0x6a, 0xcd, 0x6d, 0x27, 0xf4, 0x1b, 0x20, 0x7c, 0x42,
+	0x67, 0x6b, 0xd0, 0x53, 0x1a, 0xeb, 0x13, 0xf8, 0x18, 0xc5, 0x6e, 0x8c, 0x93, 0xed, 0x26, 0x0a,
+	0xb0, 0xb7, 0xfc, 0xb5, 0xc4, 0xfe, 0xe0, 0x95, 0xf5, 0x01, 0xbc, 0xf3, 0xfe, 0xac, 0x83, 0x15,
+	0x8e, 0xb1, 0x3f, 0x30, 0xac, 0x3e, 0x00, 0xd1, 0x36, 0xc0, 0x61, 0x84, 0x7d, 0xec, 0x0f, 0xcc,
+	0xfa, 0x1c, 0xe3, 0x70, 0xbd, 0xdc, 0xb8, 0xf5, 0xfc, 0xf5, 0xcf, 0x3b, 0x03, 0xcc, 0x32, 0xf6,
+	0xff, 0x85, 0x7f, 0x0a, 0x8c, 0xbf, 0xab, 0x86, 0xc8, 0xd9, 0x29, 0xa5, 0x39, 0x64, 0x3c, 0x47,
+	0x39, 0xa1, 0xaa, 0x14, 0xe9, 0x51, 0x5a, 0x16, 0xe2, 0xda, 0x1b, 0x7f, 0xef, 0x7e, 0xb9, 0x31,
+	0x27, 0xbf, 0xb5, 0xce, 0x53, 0x0b, 0xa3, 0x66, 0xea, 0xe9, 0x85, 0x3b, 0xfb, 0xb6, 0x05, 0xf6,
 	0x0a, 0xd8, 0x77, 0x81, 0xfd, 0xce, 0xbe, 0x37, 0xbf, 0x68, 0xc0, 0x71, 0x14, 0xe1, 0x38, 0x5d,
-	0xc4, 0x71, 0x76, 0xf6, 0xe1, 0x8d, 0xaa, 0xf7, 0xf5, 0x31, 0x00, 0x00, 0xff, 0xff, 0x47, 0x3a,
-	0x54, 0xc6, 0x81, 0x02, 0x00, 0x00,
+	0xc4, 0x71, 0x76, 0xf6, 0xe1, 0x8d, 0xca, 0xfb, 0xfa, 0x18, 0x00, 0x00, 0xff, 0xff, 0x8e, 0xd3,
+	0x2e, 0xc5, 0x81, 0x02, 0x00, 0x00,
 }
diff --git a/googleapis/cloud/securitycenter/v1/security_marks.pb.go b/googleapis/cloud/securitycenter/v1/security_marks.pb.go
index 592442e..c8c6e6f 100644
--- a/googleapis/cloud/securitycenter/v1/security_marks.pb.go
+++ b/googleapis/cloud/securitycenter/v1/security_marks.pb.go
@@ -101,24 +101,24 @@
 	0x14, 0x66, 0xa6, 0xb7, 0x17, 0x6e, 0x2e, 0x82, 0x0c, 0x2e, 0x6a, 0x91, 0x52, 0xbb, 0x2a, 0x08,
 	0x09, 0x63, 0x37, 0x35, 0xae, 0xb4, 0x88, 0x1b, 0x2d, 0x52, 0xa1, 0x0b, 0x29, 0x48, 0x9c, 0xc6,
 	0x10, 0x3a, 0x93, 0x94, 0x24, 0x53, 0xa8, 0x43, 0x5f, 0xc8, 0x27, 0x70, 0xe1, 0x13, 0xf8, 0x08,
-	0x3e, 0x42, 0xf1, 0x21, 0xa4, 0xc9, 0xf4, 0x67, 0x0a, 0xd6, 0xcd, 0xcc, 0xc9, 0x99, 0xef, 0xe7,
-	0x9c, 0x6f, 0x02, 0x5a, 0x4c, 0x4a, 0x16, 0x53, 0x14, 0xc5, 0x32, 0x1d, 0x22, 0x4d, 0xa3, 0x54,
+	0x3e, 0x42, 0xf1, 0x21, 0xa4, 0xc9, 0xf4, 0x67, 0x0a, 0xd6, 0xcd, 0xcc, 0xc9, 0xc9, 0xf7, 0x73,
+	0xce, 0x37, 0x03, 0x5a, 0x4c, 0x4a, 0x16, 0x53, 0x14, 0xc5, 0x32, 0x1d, 0x22, 0x4d, 0xa3, 0x54,
 	0x71, 0x33, 0x8d, 0xa8, 0x30, 0x54, 0xa1, 0x49, 0xb8, 0xea, 0x3c, 0x26, 0x44, 0x8d, 0x34, 0x1c,
-	0x2b, 0x69, 0x64, 0x50, 0x73, 0x24, 0x68, 0x49, 0xb0, 0x48, 0x82, 0x93, 0xb0, 0x7a, 0x98, 0x8b,
-	0x92, 0x31, 0x47, 0x8a, 0x6a, 0x99, 0xaa, 0x88, 0x3a, 0x6a, 0xf5, 0x68, 0xe3, 0x13, 0x11, 0x42,
-	0x1a, 0x62, 0xb8, 0x14, 0xb9, 0x70, 0xe3, 0xcb, 0x07, 0x7b, 0xf7, 0xb9, 0xdc, 0xed, 0xc2, 0x30,
-	0x08, 0xc0, 0x1f, 0x41, 0x12, 0x5a, 0xf1, 0xea, 0x5e, 0xf3, 0x5f, 0xcf, 0xd6, 0x41, 0x17, 0x94,
-	0xed, 0x34, 0x15, 0xbf, 0x5e, 0x6a, 0xfe, 0x3f, 0x6d, 0xc3, 0xdd, 0xe3, 0xc0, 0x82, 0x22, 0xb4,
-	0xcf, 0x2b, 0x61, 0xd4, 0xb4, 0xe7, 0x64, 0xaa, 0x6d, 0x00, 0xd6, 0xcd, 0x60, 0x1f, 0x94, 0x46,
-	0x74, 0x9a, 0x1b, 0x2e, 0xca, 0xe0, 0x00, 0x94, 0x27, 0x24, 0x4e, 0x69, 0xc5, 0xb7, 0x3d, 0x77,
-	0xc0, 0x7e, 0xdb, 0xc3, 0xef, 0xde, 0xfc, 0xe2, 0xcd, 0x03, 0x27, 0x5b, 0x9e, 0x6e, 0x1e, 0x32,
-	0xe6, 0x1a, 0x46, 0x32, 0x41, 0xc5, 0x8d, 0xce, 0xa4, 0x62, 0x44, 0xf0, 0x17, 0xb7, 0x38, 0xca,
-	0x36, 0x8f, 0x33, 0x44, 0xb4, 0xa6, 0x46, 0xa3, 0xcc, 0xbe, 0x67, 0xab, 0xf8, 0x1d, 0xb5, 0xbb,
-	0x93, 0xea, 0x72, 0xd6, 0x28, 0x73, 0xc5, 0x0c, 0x3d, 0x73, 0x31, 0xe4, 0x82, 0x69, 0x94, 0xe5,
-	0xd5, 0x96, 0xde, 0xe5, 0xa7, 0x07, 0x1a, 0x91, 0x4c, 0x7e, 0xc9, 0xef, 0xce, 0x7b, 0xb8, 0xc9,
-	0x11, 0x4c, 0xc6, 0x44, 0x30, 0x28, 0x15, 0x43, 0x8c, 0x0a, 0xfb, 0xcf, 0xd0, 0x7a, 0xd9, 0x9f,
-	0x2e, 0xd1, 0x79, 0xb1, 0xf3, 0xea, 0xd7, 0xae, 0x9d, 0x5c, 0xc7, 0x1a, 0x2e, 0xe3, 0xe9, 0x38,
+	0x2b, 0x69, 0x64, 0x50, 0x73, 0x24, 0x68, 0x49, 0xb0, 0x48, 0x82, 0x93, 0xb0, 0x7a, 0x94, 0x8b,
+	0x92, 0x31, 0x47, 0x44, 0x08, 0x69, 0x88, 0xe1, 0x52, 0xe4, 0xec, 0xea, 0xe1, 0xc6, 0xad, 0xa2,
+	0x5a, 0xa6, 0x2a, 0xa2, 0xee, 0xaa, 0xf1, 0xe5, 0x83, 0xbd, 0xfb, 0x5c, 0xee, 0x76, 0x61, 0x18,
+	0x04, 0xe0, 0x8f, 0x20, 0x09, 0xad, 0x78, 0x75, 0xaf, 0xf9, 0xaf, 0x67, 0xeb, 0xa0, 0x0b, 0xca,
+	0x76, 0x9a, 0x8a, 0x5f, 0x2f, 0x35, 0xff, 0x9f, 0xb6, 0xe1, 0xee, 0x71, 0x60, 0x41, 0x11, 0xda,
+	0xe7, 0x95, 0x30, 0x6a, 0xda, 0x73, 0x32, 0xd5, 0x36, 0x00, 0xeb, 0x66, 0xb0, 0x0f, 0x4a, 0x23,
+	0x3a, 0xcd, 0x0d, 0x17, 0x65, 0x70, 0x00, 0xca, 0x13, 0x12, 0xa7, 0xb4, 0xe2, 0xdb, 0x9e, 0x3b,
+	0x60, 0xbf, 0xed, 0xe1, 0x77, 0x6f, 0x7e, 0xf1, 0xe6, 0x81, 0x93, 0x2d, 0x4f, 0x37, 0x0f, 0x19,
+	0x73, 0x0d, 0x23, 0x99, 0xa0, 0xe2, 0x46, 0x67, 0x52, 0x31, 0x22, 0xf8, 0x8b, 0xcb, 0x04, 0x65,
+	0x9b, 0xc7, 0x19, 0x22, 0x5a, 0x53, 0xa3, 0x51, 0x66, 0xdf, 0xb3, 0x55, 0xfc, 0x8e, 0xda, 0xdd,
+	0x49, 0x75, 0x49, 0x6a, 0x94, 0xb9, 0x62, 0x86, 0x9e, 0xb9, 0x18, 0x72, 0xc1, 0x34, 0xca, 0xf2,
+	0x6a, 0x4b, 0xef, 0xf2, 0xd3, 0x03, 0x8d, 0x48, 0x26, 0xbf, 0xe4, 0x77, 0xe7, 0x3d, 0xdc, 0xe4,
+	0x08, 0x26, 0x63, 0x22, 0x18, 0x94, 0x8a, 0x21, 0x46, 0x85, 0xfd, 0x66, 0x68, 0xbd, 0xec, 0x4f,
+	0x3f, 0xd1, 0x79, 0xb1, 0xf3, 0xea, 0xd7, 0xae, 0x9d, 0x5c, 0xc7, 0x1a, 0x2e, 0xe3, 0xe9, 0x38,
 	0xc3, 0x7e, 0xf8, 0xb1, 0x04, 0x0c, 0x2c, 0x60, 0x50, 0x04, 0x0c, 0xfa, 0xe1, 0xdc, 0x3f, 0x76,
 	0x00, 0x8c, 0x2d, 0x02, 0xe3, 0x22, 0x04, 0xe3, 0x7e, 0xf8, 0xf4, 0xd7, 0x8e, 0xd7, 0xfa, 0x0e,
-	0x00, 0x00, 0xff, 0xff, 0x90, 0xea, 0xfc, 0x33, 0xe2, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0xb0, 0x0b, 0xf6, 0x45, 0xe2, 0x02, 0x00, 0x00,
 }
diff --git a/googleapis/cloud/securitycenter/v1/securitycenter_service.pb.go b/googleapis/cloud/securitycenter/v1/securitycenter_service.pb.go
index 4f6625f..6e6478f 100644
--- a/googleapis/cloud/securitycenter/v1/securitycenter_service.pb.go
+++ b/googleapis/cloud/securitycenter/v1/securitycenter_service.pb.go
@@ -10,7 +10,7 @@
 
 	proto "github.com/golang/protobuf/proto"
 	duration "github.com/golang/protobuf/ptypes/duration"
-	_ "github.com/golang/protobuf/ptypes/empty"
+	empty "github.com/golang/protobuf/ptypes/empty"
 	_struct "github.com/golang/protobuf/ptypes/struct"
 	timestamp "github.com/golang/protobuf/ptypes/timestamp"
 	_ "google.golang.org/genproto/googleapis/api/annotations"
@@ -71,7 +71,7 @@
 }
 
 func (ListAssetsResponse_ListAssetsResult_StateChange) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{12, 0, 0}
+	return fileDescriptor_dd84f222a6a48f30, []int{17, 0, 0}
 }
 
 // The change in state of the finding.
@@ -121,7 +121,7 @@
 }
 
 func (ListFindingsResponse_ListFindingsResult_StateChange) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{14, 0, 0}
+	return fileDescriptor_dd84f222a6a48f30, []int{19, 0, 0}
 }
 
 // Request message for creating a finding.
@@ -133,8 +133,8 @@
 	// It must be alphanumeric and less than or equal to 32 characters and
 	// greater than 0 characters in length.
 	FindingId string `protobuf:"bytes,2,opt,name=finding_id,json=findingId,proto3" json:"finding_id,omitempty"`
-	// Required. The Finding being created. The name and security_marks will be ignored as
-	// they are both output only fields on this resource.
+	// Required. The Finding being created. The name and security_marks will be
+	// ignored as they are both output only fields on this resource.
 	Finding              *Finding `protobuf:"bytes,3,opt,name=finding,proto3" json:"finding,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -187,13 +187,78 @@
 	return nil
 }
 
+// Request message for creating a notification config.
+type CreateNotificationConfigRequest struct {
+	// Required. Resource name of the new notification config's parent. Its format
+	// is "organizations/[organization_id]".
+	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
+	// Required.
+	// Unique identifier provided by the client within the parent scope.
+	// It must be between 1 and 128 characters, and contains alphanumeric
+	// characters, underscores or hyphens only.
+	ConfigId string `protobuf:"bytes,2,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"`
+	// Required. The notification config being created. The name and the service
+	// account will be ignored as they are both output only fields on this
+	// resource.
+	NotificationConfig   *NotificationConfig `protobuf:"bytes,3,opt,name=notification_config,json=notificationConfig,proto3" json:"notification_config,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *CreateNotificationConfigRequest) Reset()         { *m = CreateNotificationConfigRequest{} }
+func (m *CreateNotificationConfigRequest) String() string { return proto.CompactTextString(m) }
+func (*CreateNotificationConfigRequest) ProtoMessage()    {}
+func (*CreateNotificationConfigRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dd84f222a6a48f30, []int{1}
+}
+
+func (m *CreateNotificationConfigRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateNotificationConfigRequest.Unmarshal(m, b)
+}
+func (m *CreateNotificationConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateNotificationConfigRequest.Marshal(b, m, deterministic)
+}
+func (m *CreateNotificationConfigRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateNotificationConfigRequest.Merge(m, src)
+}
+func (m *CreateNotificationConfigRequest) XXX_Size() int {
+	return xxx_messageInfo_CreateNotificationConfigRequest.Size(m)
+}
+func (m *CreateNotificationConfigRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateNotificationConfigRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateNotificationConfigRequest proto.InternalMessageInfo
+
+func (m *CreateNotificationConfigRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *CreateNotificationConfigRequest) GetConfigId() string {
+	if m != nil {
+		return m.ConfigId
+	}
+	return ""
+}
+
+func (m *CreateNotificationConfigRequest) GetNotificationConfig() *NotificationConfig {
+	if m != nil {
+		return m.NotificationConfig
+	}
+	return nil
+}
+
 // Request message for creating a source.
 type CreateSourceRequest struct {
 	// Required. Resource name of the new source's parent. Its format should be
 	// "organizations/[organization_id]".
 	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
-	// Required. The Source being created, only the display_name and description will be
-	// used. All other fields will be ignored.
+	// Required. The Source being created, only the display_name and description
+	// will be used. All other fields will be ignored.
 	Source               *Source  `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -204,7 +269,7 @@
 func (m *CreateSourceRequest) String() string { return proto.CompactTextString(m) }
 func (*CreateSourceRequest) ProtoMessage()    {}
 func (*CreateSourceRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{1}
+	return fileDescriptor_dd84f222a6a48f30, []int{2}
 }
 
 func (m *CreateSourceRequest) XXX_Unmarshal(b []byte) error {
@@ -239,10 +304,94 @@
 	return nil
 }
 
+// Request message for deleting a notification config.
+type DeleteNotificationConfigRequest struct {
+	// Required. Name of the notification config to delete. Its format is
+	// "organizations/[organization_id]/notificationConfigs/[config_id]".
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeleteNotificationConfigRequest) Reset()         { *m = DeleteNotificationConfigRequest{} }
+func (m *DeleteNotificationConfigRequest) String() string { return proto.CompactTextString(m) }
+func (*DeleteNotificationConfigRequest) ProtoMessage()    {}
+func (*DeleteNotificationConfigRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dd84f222a6a48f30, []int{3}
+}
+
+func (m *DeleteNotificationConfigRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeleteNotificationConfigRequest.Unmarshal(m, b)
+}
+func (m *DeleteNotificationConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeleteNotificationConfigRequest.Marshal(b, m, deterministic)
+}
+func (m *DeleteNotificationConfigRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteNotificationConfigRequest.Merge(m, src)
+}
+func (m *DeleteNotificationConfigRequest) XXX_Size() int {
+	return xxx_messageInfo_DeleteNotificationConfigRequest.Size(m)
+}
+func (m *DeleteNotificationConfigRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeleteNotificationConfigRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeleteNotificationConfigRequest proto.InternalMessageInfo
+
+func (m *DeleteNotificationConfigRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// Request message for getting a notification config.
+type GetNotificationConfigRequest struct {
+	// Required. Name of the notification config to get. Its format is
+	// "organizations/[organization_id]/notificationConfigs/[config_id]".
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetNotificationConfigRequest) Reset()         { *m = GetNotificationConfigRequest{} }
+func (m *GetNotificationConfigRequest) String() string { return proto.CompactTextString(m) }
+func (*GetNotificationConfigRequest) ProtoMessage()    {}
+func (*GetNotificationConfigRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dd84f222a6a48f30, []int{4}
+}
+
+func (m *GetNotificationConfigRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetNotificationConfigRequest.Unmarshal(m, b)
+}
+func (m *GetNotificationConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetNotificationConfigRequest.Marshal(b, m, deterministic)
+}
+func (m *GetNotificationConfigRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetNotificationConfigRequest.Merge(m, src)
+}
+func (m *GetNotificationConfigRequest) XXX_Size() int {
+	return xxx_messageInfo_GetNotificationConfigRequest.Size(m)
+}
+func (m *GetNotificationConfigRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetNotificationConfigRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetNotificationConfigRequest proto.InternalMessageInfo
+
+func (m *GetNotificationConfigRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
 // Request message for getting organization settings.
 type GetOrganizationSettingsRequest struct {
-	// Required. Name of the organization to get organization settings for. Its format is
-	// "organizations/[organization_id]/organizationSettings".
+	// Required. Name of the organization to get organization settings for. Its
+	// format is "organizations/[organization_id]/organizationSettings".
 	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -253,7 +402,7 @@
 func (m *GetOrganizationSettingsRequest) String() string { return proto.CompactTextString(m) }
 func (*GetOrganizationSettingsRequest) ProtoMessage()    {}
 func (*GetOrganizationSettingsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{2}
+	return fileDescriptor_dd84f222a6a48f30, []int{5}
 }
 
 func (m *GetOrganizationSettingsRequest) XXX_Unmarshal(b []byte) error {
@@ -295,7 +444,7 @@
 func (m *GetSourceRequest) String() string { return proto.CompactTextString(m) }
 func (*GetSourceRequest) ProtoMessage()    {}
 func (*GetSourceRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{3}
+	return fileDescriptor_dd84f222a6a48f30, []int{6}
 }
 
 func (m *GetSourceRequest) XXX_Unmarshal(b []byte) error {
@@ -385,9 +534,9 @@
 	//
 	// For example, `resource_properties.size = 100` is a valid filter string.
 	Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"`
-	// Required. Expression that defines what assets fields to use for grouping. The string
-	// value should follow SQL syntax: comma separated list of fields. For
-	// example:
+	// Required. Expression that defines what assets fields to use for grouping.
+	// The string value should follow SQL syntax: comma separated list of fields.
+	// For example:
 	// "security_center_properties.resource_project,security_center_properties.project".
 	//
 	// The following fields are supported when compare_duration is not set:
@@ -453,7 +602,7 @@
 func (m *GroupAssetsRequest) String() string { return proto.CompactTextString(m) }
 func (*GroupAssetsRequest) ProtoMessage()    {}
 func (*GroupAssetsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{4}
+	return fileDescriptor_dd84f222a6a48f30, []int{7}
 }
 
 func (m *GroupAssetsRequest) XXX_Unmarshal(b []byte) error {
@@ -545,7 +694,7 @@
 func (m *GroupAssetsResponse) String() string { return proto.CompactTextString(m) }
 func (*GroupAssetsResponse) ProtoMessage()    {}
 func (*GroupAssetsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{5}
+	return fileDescriptor_dd84f222a6a48f30, []int{8}
 }
 
 func (m *GroupAssetsResponse) XXX_Unmarshal(b []byte) error {
@@ -645,9 +794,9 @@
 	//
 	// For example, `source_properties.size = 100` is a valid filter string.
 	Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"`
-	// Required. Expression that defines what assets fields to use for grouping (including
-	// `state_change`). The string value should follow SQL syntax: comma separated
-	// list of fields. For example: "parent,resource_name".
+	// Required. Expression that defines what assets fields to use for grouping
+	// (including `state_change`). The string value should follow SQL syntax:
+	// comma separated list of fields. For example: "parent,resource_name".
 	//
 	// The following fields are supported:
 	//
@@ -678,12 +827,18 @@
 	//
 	// Possible "state_change" values when compare_duration is specified:
 	//
-	// * "CHANGED":   indicates that the finding was present at the start of
-	//                  compare_duration, but changed its state at read_time.
-	// * "UNCHANGED": indicates that the finding was present at the start of
-	//                  compare_duration and did not change state at read_time.
-	// * "ADDED":     indicates that the finding was not present at the start
-	//                  of compare_duration, but was present at read_time.
+	// * "CHANGED":   indicates that the finding was present and matched the given
+	//                  filter at the start of compare_duration, but changed its
+	//                  state at read_time.
+	// * "UNCHANGED": indicates that the finding was present and matched the given
+	//                  filter at the start of compare_duration and did not change
+	//                  state at read_time.
+	// * "ADDED":     indicates that the finding did not match the given filter or
+	//                  was not present at the start of compare_duration, but was
+	//                  present at read_time.
+	// * "REMOVED":   indicates that the finding was present and matched the
+	//                  filter at the start of compare_duration, but did not match
+	//                  the filter at read_time.
 	//
 	// If compare_duration is not specified, then the only possible state_change
 	// is "UNUSED",  which will be the state_change set for all findings present
@@ -708,7 +863,7 @@
 func (m *GroupFindingsRequest) String() string { return proto.CompactTextString(m) }
 func (*GroupFindingsRequest) ProtoMessage()    {}
 func (*GroupFindingsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{6}
+	return fileDescriptor_dd84f222a6a48f30, []int{9}
 }
 
 func (m *GroupFindingsRequest) XXX_Unmarshal(b []byte) error {
@@ -800,7 +955,7 @@
 func (m *GroupFindingsResponse) String() string { return proto.CompactTextString(m) }
 func (*GroupFindingsResponse) ProtoMessage()    {}
 func (*GroupFindingsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{7}
+	return fileDescriptor_dd84f222a6a48f30, []int{10}
 }
 
 func (m *GroupFindingsResponse) XXX_Unmarshal(b []byte) error {
@@ -864,7 +1019,7 @@
 func (m *GroupResult) String() string { return proto.CompactTextString(m) }
 func (*GroupResult) ProtoMessage()    {}
 func (*GroupResult) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{8}
+	return fileDescriptor_dd84f222a6a48f30, []int{11}
 }
 
 func (m *GroupResult) XXX_Unmarshal(b []byte) error {
@@ -899,10 +1054,124 @@
 	return 0
 }
 
+// Request message for listing notification configs.
+type ListNotificationConfigsRequest struct {
+	// Required. Name of the organization to list notification configs.
+	// Its format is "organizations/[organization_id]".
+	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
+	// The value returned by the last `ListNotificationConfigsResponse`; indicates
+	// that this is a continuation of a prior `ListNotificationConfigs` call, and
+	// that the system should return the next page of data.
+	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// The maximum number of results to return in a single response. Default is
+	// 10, minimum is 1, maximum is 1000.
+	PageSize             int32    `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListNotificationConfigsRequest) Reset()         { *m = ListNotificationConfigsRequest{} }
+func (m *ListNotificationConfigsRequest) String() string { return proto.CompactTextString(m) }
+func (*ListNotificationConfigsRequest) ProtoMessage()    {}
+func (*ListNotificationConfigsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dd84f222a6a48f30, []int{12}
+}
+
+func (m *ListNotificationConfigsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListNotificationConfigsRequest.Unmarshal(m, b)
+}
+func (m *ListNotificationConfigsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListNotificationConfigsRequest.Marshal(b, m, deterministic)
+}
+func (m *ListNotificationConfigsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListNotificationConfigsRequest.Merge(m, src)
+}
+func (m *ListNotificationConfigsRequest) XXX_Size() int {
+	return xxx_messageInfo_ListNotificationConfigsRequest.Size(m)
+}
+func (m *ListNotificationConfigsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListNotificationConfigsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListNotificationConfigsRequest proto.InternalMessageInfo
+
+func (m *ListNotificationConfigsRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *ListNotificationConfigsRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *ListNotificationConfigsRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+// Response message for listing notification configs.
+type ListNotificationConfigsResponse struct {
+	// Notification configs belonging to the requested parent.
+	NotificationConfigs []*NotificationConfig `protobuf:"bytes,1,rep,name=notification_configs,json=notificationConfigs,proto3" json:"notification_configs,omitempty"`
+	// Token to retrieve the next page of results, or empty if there are no more
+	// results.
+	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListNotificationConfigsResponse) Reset()         { *m = ListNotificationConfigsResponse{} }
+func (m *ListNotificationConfigsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListNotificationConfigsResponse) ProtoMessage()    {}
+func (*ListNotificationConfigsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dd84f222a6a48f30, []int{13}
+}
+
+func (m *ListNotificationConfigsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListNotificationConfigsResponse.Unmarshal(m, b)
+}
+func (m *ListNotificationConfigsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListNotificationConfigsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListNotificationConfigsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListNotificationConfigsResponse.Merge(m, src)
+}
+func (m *ListNotificationConfigsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListNotificationConfigsResponse.Size(m)
+}
+func (m *ListNotificationConfigsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListNotificationConfigsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListNotificationConfigsResponse proto.InternalMessageInfo
+
+func (m *ListNotificationConfigsResponse) GetNotificationConfigs() []*NotificationConfig {
+	if m != nil {
+		return m.NotificationConfigs
+	}
+	return nil
+}
+
+func (m *ListNotificationConfigsResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
 // Request message for listing sources.
 type ListSourcesRequest struct {
-	// Required. Resource name of the parent of sources to list. Its format should be
-	// "organizations/[organization_id]".
+	// Required. Resource name of the parent of sources to list. Its format should
+	// be "organizations/[organization_id]".
 	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
 	// The value returned by the last `ListSourcesResponse`; indicates
 	// that this is a continuation of a prior `ListSources` call, and
@@ -920,7 +1189,7 @@
 func (m *ListSourcesRequest) String() string { return proto.CompactTextString(m) }
 func (*ListSourcesRequest) ProtoMessage()    {}
 func (*ListSourcesRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{9}
+	return fileDescriptor_dd84f222a6a48f30, []int{14}
 }
 
 func (m *ListSourcesRequest) XXX_Unmarshal(b []byte) error {
@@ -978,7 +1247,7 @@
 func (m *ListSourcesResponse) String() string { return proto.CompactTextString(m) }
 func (*ListSourcesResponse) ProtoMessage()    {}
 func (*ListSourcesResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{10}
+	return fileDescriptor_dd84f222a6a48f30, []int{15}
 }
 
 func (m *ListSourcesResponse) XXX_Unmarshal(b []byte) error {
@@ -1127,9 +1396,8 @@
 	// is "UNUSED",  which will be the state_change set for all assets present at
 	// read_time.
 	CompareDuration *duration.Duration `protobuf:"bytes,5,opt,name=compare_duration,json=compareDuration,proto3" json:"compare_duration,omitempty"`
-	// Optional. A field mask to specify the ListAssetsResult fields to be listed in the
-	// response.
-	// An empty field mask will list all fields.
+	// Optional. A field mask to specify the ListAssetsResult fields to be listed
+	// in the response. An empty field mask will list all fields.
 	FieldMask *field_mask.FieldMask `protobuf:"bytes,7,opt,name=field_mask,json=fieldMask,proto3" json:"field_mask,omitempty"`
 	// The value returned by the last `ListAssetsResponse`; indicates
 	// that this is a continuation of a prior `ListAssets` call, and
@@ -1147,7 +1415,7 @@
 func (m *ListAssetsRequest) String() string { return proto.CompactTextString(m) }
 func (*ListAssetsRequest) ProtoMessage()    {}
 func (*ListAssetsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{11}
+	return fileDescriptor_dd84f222a6a48f30, []int{16}
 }
 
 func (m *ListAssetsRequest) XXX_Unmarshal(b []byte) error {
@@ -1244,7 +1512,7 @@
 func (m *ListAssetsResponse) String() string { return proto.CompactTextString(m) }
 func (*ListAssetsResponse) ProtoMessage()    {}
 func (*ListAssetsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{12}
+	return fileDescriptor_dd84f222a6a48f30, []int{17}
 }
 
 func (m *ListAssetsResponse) XXX_Unmarshal(b []byte) error {
@@ -1308,7 +1576,7 @@
 func (m *ListAssetsResponse_ListAssetsResult) String() string { return proto.CompactTextString(m) }
 func (*ListAssetsResponse_ListAssetsResult) ProtoMessage()    {}
 func (*ListAssetsResponse_ListAssetsResult) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{12, 0}
+	return fileDescriptor_dd84f222a6a48f30, []int{17, 0}
 }
 
 func (m *ListAssetsResponse_ListAssetsResult) XXX_Unmarshal(b []byte) error {
@@ -1432,19 +1700,25 @@
 	//
 	// Possible "state_change" values when compare_duration is specified:
 	//
-	// * "CHANGED":   indicates that the finding was present at the start of
-	//                  compare_duration, but changed its state at read_time.
-	// * "UNCHANGED": indicates that the finding was present at the start of
-	//                  compare_duration and did not change state at read_time.
-	// * "ADDED":     indicates that the finding was not present at the start
-	//                  of compare_duration, but was present at read_time.
+	// * "CHANGED":   indicates that the finding was present and matched the given
+	//                  filter at the start of compare_duration, but changed its
+	//                  state at read_time.
+	// * "UNCHANGED": indicates that the finding was present and matched the given
+	//                  filter at the start of compare_duration and did not change
+	//                  state at read_time.
+	// * "ADDED":     indicates that the finding did not match the given filter or
+	//                  was not present at the start of compare_duration, but was
+	//                  present at read_time.
+	// * "REMOVED":   indicates that the finding was present and matched the
+	//                  filter at the start of compare_duration, but did not match
+	//                  the filter at read_time.
 	//
 	// If compare_duration is not specified, then the only possible state_change
 	// is "UNUSED", which will be the state_change set for all findings present at
 	// read_time.
 	CompareDuration *duration.Duration `protobuf:"bytes,5,opt,name=compare_duration,json=compareDuration,proto3" json:"compare_duration,omitempty"`
-	// Optional. A field mask to specify the Finding fields to be listed in the response.
-	// An empty field mask will list all fields.
+	// Optional. A field mask to specify the Finding fields to be listed in the
+	// response. An empty field mask will list all fields.
 	FieldMask *field_mask.FieldMask `protobuf:"bytes,7,opt,name=field_mask,json=fieldMask,proto3" json:"field_mask,omitempty"`
 	// The value returned by the last `ListFindingsResponse`; indicates
 	// that this is a continuation of a prior `ListFindings` call, and
@@ -1462,7 +1736,7 @@
 func (m *ListFindingsRequest) String() string { return proto.CompactTextString(m) }
 func (*ListFindingsRequest) ProtoMessage()    {}
 func (*ListFindingsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{13}
+	return fileDescriptor_dd84f222a6a48f30, []int{18}
 }
 
 func (m *ListFindingsRequest) XXX_Unmarshal(b []byte) error {
@@ -1559,7 +1833,7 @@
 func (m *ListFindingsResponse) String() string { return proto.CompactTextString(m) }
 func (*ListFindingsResponse) ProtoMessage()    {}
 func (*ListFindingsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{14}
+	return fileDescriptor_dd84f222a6a48f30, []int{19}
 }
 
 func (m *ListFindingsResponse) XXX_Unmarshal(b []byte) error {
@@ -1627,7 +1901,7 @@
 func (m *ListFindingsResponse_ListFindingsResult) String() string { return proto.CompactTextString(m) }
 func (*ListFindingsResponse_ListFindingsResult) ProtoMessage()    {}
 func (*ListFindingsResponse_ListFindingsResult) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{14, 0}
+	return fileDescriptor_dd84f222a6a48f30, []int{19, 0}
 }
 
 func (m *ListFindingsResponse_ListFindingsResult) XXX_Unmarshal(b []byte) error {
@@ -1696,7 +1970,7 @@
 }
 func (*ListFindingsResponse_ListFindingsResult_Resource) ProtoMessage() {}
 func (*ListFindingsResponse_ListFindingsResult_Resource) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{14, 0, 0}
+	return fileDescriptor_dd84f222a6a48f30, []int{19, 0, 0}
 }
 
 func (m *ListFindingsResponse_ListFindingsResult_Resource) XXX_Unmarshal(b []byte) error {
@@ -1772,7 +2046,7 @@
 func (m *SetFindingStateRequest) String() string { return proto.CompactTextString(m) }
 func (*SetFindingStateRequest) ProtoMessage()    {}
 func (*SetFindingStateRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{15}
+	return fileDescriptor_dd84f222a6a48f30, []int{20}
 }
 
 func (m *SetFindingStateRequest) XXX_Unmarshal(b []byte) error {
@@ -1816,8 +2090,8 @@
 
 // Request message for running asset discovery for an organization.
 type RunAssetDiscoveryRequest struct {
-	// Required. Name of the organization to run asset discovery for. Its format is
-	// "organizations/[organization_id]".
+	// Required. Name of the organization to run asset discovery for. Its format
+	// is "organizations/[organization_id]".
 	Parent               string   `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -1828,7 +2102,7 @@
 func (m *RunAssetDiscoveryRequest) String() string { return proto.CompactTextString(m) }
 func (*RunAssetDiscoveryRequest) ProtoMessage()    {}
 func (*RunAssetDiscoveryRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{16}
+	return fileDescriptor_dd84f222a6a48f30, []int{21}
 }
 
 func (m *RunAssetDiscoveryRequest) XXX_Unmarshal(b []byte) error {
@@ -1858,8 +2132,8 @@
 
 // Request message for updating or creating a finding.
 type UpdateFindingRequest struct {
-	// Required. The finding resource to update or create if it does not already exist.
-	// parent, security_marks, and update_time will be ignored.
+	// Required. The finding resource to update or create if it does not already
+	// exist. parent, security_marks, and update_time will be ignored.
 	//
 	// In the case of creation, the finding id portion of the name must be
 	// alphanumeric and less than or equal to 32 characters and greater than 0
@@ -1882,7 +2156,7 @@
 func (m *UpdateFindingRequest) String() string { return proto.CompactTextString(m) }
 func (*UpdateFindingRequest) ProtoMessage()    {}
 func (*UpdateFindingRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{17}
+	return fileDescriptor_dd84f222a6a48f30, []int{22}
 }
 
 func (m *UpdateFindingRequest) XXX_Unmarshal(b []byte) error {
@@ -1917,6 +2191,58 @@
 	return nil
 }
 
+// Request message for updating a notification config.
+type UpdateNotificationConfigRequest struct {
+	// Required. The notification config to update.
+	NotificationConfig *NotificationConfig `protobuf:"bytes,1,opt,name=notification_config,json=notificationConfig,proto3" json:"notification_config,omitempty"`
+	// The FieldMask to use when updating the notification config.
+	//
+	// If empty all mutable fields will be updated.
+	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UpdateNotificationConfigRequest) Reset()         { *m = UpdateNotificationConfigRequest{} }
+func (m *UpdateNotificationConfigRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateNotificationConfigRequest) ProtoMessage()    {}
+func (*UpdateNotificationConfigRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_dd84f222a6a48f30, []int{23}
+}
+
+func (m *UpdateNotificationConfigRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateNotificationConfigRequest.Unmarshal(m, b)
+}
+func (m *UpdateNotificationConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateNotificationConfigRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateNotificationConfigRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateNotificationConfigRequest.Merge(m, src)
+}
+func (m *UpdateNotificationConfigRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateNotificationConfigRequest.Size(m)
+}
+func (m *UpdateNotificationConfigRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateNotificationConfigRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateNotificationConfigRequest proto.InternalMessageInfo
+
+func (m *UpdateNotificationConfigRequest) GetNotificationConfig() *NotificationConfig {
+	if m != nil {
+		return m.NotificationConfig
+	}
+	return nil
+}
+
+func (m *UpdateNotificationConfigRequest) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
 // Request message for updating an organization's settings.
 type UpdateOrganizationSettingsRequest struct {
 	// Required. The organization settings resource to update.
@@ -1934,7 +2260,7 @@
 func (m *UpdateOrganizationSettingsRequest) String() string { return proto.CompactTextString(m) }
 func (*UpdateOrganizationSettingsRequest) ProtoMessage()    {}
 func (*UpdateOrganizationSettingsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{18}
+	return fileDescriptor_dd84f222a6a48f30, []int{24}
 }
 
 func (m *UpdateOrganizationSettingsRequest) XXX_Unmarshal(b []byte) error {
@@ -1986,7 +2312,7 @@
 func (m *UpdateSourceRequest) String() string { return proto.CompactTextString(m) }
 func (*UpdateSourceRequest) ProtoMessage()    {}
 func (*UpdateSourceRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{19}
+	return fileDescriptor_dd84f222a6a48f30, []int{25}
 }
 
 func (m *UpdateSourceRequest) XXX_Unmarshal(b []byte) error {
@@ -2044,7 +2370,7 @@
 func (m *UpdateSecurityMarksRequest) String() string { return proto.CompactTextString(m) }
 func (*UpdateSecurityMarksRequest) ProtoMessage()    {}
 func (*UpdateSecurityMarksRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_dd84f222a6a48f30, []int{20}
+	return fileDescriptor_dd84f222a6a48f30, []int{26}
 }
 
 func (m *UpdateSecurityMarksRequest) XXX_Unmarshal(b []byte) error {
@@ -2090,7 +2416,10 @@
 	proto.RegisterEnum("google.cloud.securitycenter.v1.ListAssetsResponse_ListAssetsResult_StateChange", ListAssetsResponse_ListAssetsResult_StateChange_name, ListAssetsResponse_ListAssetsResult_StateChange_value)
 	proto.RegisterEnum("google.cloud.securitycenter.v1.ListFindingsResponse_ListFindingsResult_StateChange", ListFindingsResponse_ListFindingsResult_StateChange_name, ListFindingsResponse_ListFindingsResult_StateChange_value)
 	proto.RegisterType((*CreateFindingRequest)(nil), "google.cloud.securitycenter.v1.CreateFindingRequest")
+	proto.RegisterType((*CreateNotificationConfigRequest)(nil), "google.cloud.securitycenter.v1.CreateNotificationConfigRequest")
 	proto.RegisterType((*CreateSourceRequest)(nil), "google.cloud.securitycenter.v1.CreateSourceRequest")
+	proto.RegisterType((*DeleteNotificationConfigRequest)(nil), "google.cloud.securitycenter.v1.DeleteNotificationConfigRequest")
+	proto.RegisterType((*GetNotificationConfigRequest)(nil), "google.cloud.securitycenter.v1.GetNotificationConfigRequest")
 	proto.RegisterType((*GetOrganizationSettingsRequest)(nil), "google.cloud.securitycenter.v1.GetOrganizationSettingsRequest")
 	proto.RegisterType((*GetSourceRequest)(nil), "google.cloud.securitycenter.v1.GetSourceRequest")
 	proto.RegisterType((*GroupAssetsRequest)(nil), "google.cloud.securitycenter.v1.GroupAssetsRequest")
@@ -2099,6 +2428,8 @@
 	proto.RegisterType((*GroupFindingsResponse)(nil), "google.cloud.securitycenter.v1.GroupFindingsResponse")
 	proto.RegisterType((*GroupResult)(nil), "google.cloud.securitycenter.v1.GroupResult")
 	proto.RegisterMapType((map[string]*_struct.Value)(nil), "google.cloud.securitycenter.v1.GroupResult.PropertiesEntry")
+	proto.RegisterType((*ListNotificationConfigsRequest)(nil), "google.cloud.securitycenter.v1.ListNotificationConfigsRequest")
+	proto.RegisterType((*ListNotificationConfigsResponse)(nil), "google.cloud.securitycenter.v1.ListNotificationConfigsResponse")
 	proto.RegisterType((*ListSourcesRequest)(nil), "google.cloud.securitycenter.v1.ListSourcesRequest")
 	proto.RegisterType((*ListSourcesResponse)(nil), "google.cloud.securitycenter.v1.ListSourcesResponse")
 	proto.RegisterType((*ListAssetsRequest)(nil), "google.cloud.securitycenter.v1.ListAssetsRequest")
@@ -2111,6 +2442,7 @@
 	proto.RegisterType((*SetFindingStateRequest)(nil), "google.cloud.securitycenter.v1.SetFindingStateRequest")
 	proto.RegisterType((*RunAssetDiscoveryRequest)(nil), "google.cloud.securitycenter.v1.RunAssetDiscoveryRequest")
 	proto.RegisterType((*UpdateFindingRequest)(nil), "google.cloud.securitycenter.v1.UpdateFindingRequest")
+	proto.RegisterType((*UpdateNotificationConfigRequest)(nil), "google.cloud.securitycenter.v1.UpdateNotificationConfigRequest")
 	proto.RegisterType((*UpdateOrganizationSettingsRequest)(nil), "google.cloud.securitycenter.v1.UpdateOrganizationSettingsRequest")
 	proto.RegisterType((*UpdateSourceRequest)(nil), "google.cloud.securitycenter.v1.UpdateSourceRequest")
 	proto.RegisterType((*UpdateSecurityMarksRequest)(nil), "google.cloud.securitycenter.v1.UpdateSecurityMarksRequest")
@@ -2121,157 +2453,179 @@
 }
 
 var fileDescriptor_dd84f222a6a48f30 = []byte{
-	// 2398 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x6f, 0x1b, 0xc7,
-	0x15, 0xcf, 0x90, 0xfa, 0x7c, 0x94, 0x6c, 0x79, 0x24, 0x39, 0x32, 0x53, 0x39, 0xf2, 0xc6, 0x76,
-	0x14, 0x5b, 0x26, 0x2d, 0xca, 0xaa, 0x55, 0x0a, 0x36, 0xbc, 0x16, 0x65, 0xc5, 0xa8, 0x2d, 0x2b,
-	0xab, 0x0f, 0xa0, 0x89, 0x1b, 0x62, 0x4d, 0x8e, 0xe8, 0xad, 0xc8, 0x5d, 0x76, 0x77, 0x28, 0x57,
-	0x4e, 0x8d, 0x02, 0xb9, 0x14, 0xbd, 0xf4, 0x62, 0xa0, 0x2d, 0x5a, 0xb4, 0x28, 0x7a, 0x2c, 0xd2,
-	0x43, 0xf3, 0x27, 0x14, 0x3d, 0x04, 0x46, 0x8b, 0x04, 0xcd, 0xa1, 0x28, 0x4f, 0x39, 0xb4, 0x87,
-	0x16, 0x45, 0x7b, 0xef, 0xa9, 0xd8, 0xf9, 0x20, 0x77, 0x57, 0x2b, 0xee, 0x52, 0x96, 0x6b, 0xa0,
-	0xc8, 0x8d, 0x33, 0xf3, 0xde, 0x9b, 0xf7, 0x9b, 0x79, 0x1f, 0xf3, 0x1e, 0x17, 0x16, 0x2b, 0x96,
-	0x55, 0xa9, 0x92, 0x6c, 0xa9, 0x6a, 0x35, 0xca, 0x59, 0x87, 0x94, 0x1a, 0xb6, 0x41, 0xf7, 0x4a,
-	0xc4, 0xa4, 0xc4, 0xce, 0xee, 0xce, 0x06, 0x66, 0x8a, 0x0e, 0xb1, 0x77, 0x8d, 0x12, 0xc9, 0xd4,
-	0x6d, 0x8b, 0x5a, 0xf8, 0x34, 0x67, 0xce, 0x30, 0xe6, 0x8c, 0x9f, 0x34, 0xb3, 0x3b, 0x9b, 0x56,
-	0x23, 0x84, 0xdb, 0x0d, 0xb3, 0xa8, 0x3b, 0x0e, 0xa1, 0xc5, 0xb2, 0xe1, 0x94, 0xac, 0x5d, 0x62,
-	0xef, 0x15, 0x6d, 0xe2, 0xd4, 0x2d, 0xd3, 0x11, 0x5b, 0xa4, 0xbf, 0x22, 0x44, 0xe8, 0x75, 0x23,
-	0xab, 0x9b, 0xa6, 0x45, 0x75, 0x6a, 0x58, 0xa6, 0x23, 0x56, 0x5f, 0xf5, 0xac, 0x96, 0xaa, 0x06,
-	0x31, 0xa9, 0x58, 0x78, 0xdd, 0xb3, 0xb0, 0x6d, 0x90, 0x6a, 0xb9, 0xf8, 0x80, 0x3c, 0xd4, 0x77,
-	0x0d, 0xcb, 0x16, 0x04, 0xa7, 0x3c, 0x04, 0x36, 0x71, 0xac, 0x86, 0x2d, 0x51, 0xa5, 0x2f, 0x44,
-	0x68, 0xcd, 0x34, 0x16, 0xb4, 0x33, 0x11, 0xb4, 0xdb, 0x86, 0x59, 0x36, 0xcc, 0x8a, 0xa0, 0xce,
-	0x47, 0x50, 0x5b, 0x76, 0x45, 0x37, 0x8d, 0xc7, 0x0c, 0x62, 0xd1, 0x21, 0x94, 0x1a, 0x66, 0x45,
-	0x42, 0x9d, 0x8b, 0x79, 0x51, 0xc5, 0x9a, 0x6e, 0xef, 0x48, 0xa6, 0x8b, 0x51, 0x4c, 0x5e, 0xdc,
-	0xe2, 0x36, 0xb3, 0x86, 0x5e, 0x73, 0xd7, 0x0c, 0xbd, 0x56, 0xac, 0x5b, 0x55, 0xa3, 0xb4, 0x27,
-	0xd6, 0xd3, 0xfe, 0x75, 0xdf, 0xda, 0x1b, 0x62, 0xad, 0x6a, 0x99, 0x15, 0xbb, 0x61, 0x9a, 0x86,
-	0x59, 0xc9, 0x5a, 0x75, 0x62, 0xfb, 0x6e, 0x4b, 0x6e, 0xc0, 0x46, 0x0f, 0x1a, 0xdb, 0xd9, 0x72,
-	0x83, 0x13, 0x88, 0xf5, 0xd7, 0x82, 0xeb, 0xa4, 0x56, 0xa7, 0x72, 0x87, 0xa9, 0xe0, 0x22, 0xbf,
-	0xd6, 0x9a, 0xee, 0xec, 0x04, 0x4c, 0xa5, 0x45, 0xe1, 0x50, 0xbb, 0x51, 0x0a, 0x5a, 0x44, 0x6b,
-	0x95, 0x1a, 0x35, 0xe2, 0x50, 0xbd, 0x56, 0xe7, 0x04, 0xca, 0x27, 0x08, 0xc6, 0x96, 0x6c, 0xa2,
-	0x53, 0x72, 0x8b, 0x5f, 0x9a, 0x46, 0xbe, 0xdd, 0x20, 0x0e, 0xc5, 0x05, 0xe8, 0xab, 0xeb, 0x36,
-	0x31, 0xe9, 0x04, 0x9a, 0x42, 0xd3, 0x83, 0x37, 0x67, 0xbe, 0x50, 0x13, 0xff, 0x51, 0xcf, 0xc3,
-	0xd9, 0x80, 0xc1, 0xf3, 0x0d, 0xf4, 0xba, 0xe1, 0x64, 0x4a, 0x56, 0x2d, 0xbb, 0xce, 0xce, 0x56,
-	0x13, 0xbc, 0x58, 0x01, 0x10, 0xc6, 0x50, 0x34, 0xca, 0x13, 0x09, 0x26, 0x29, 0xf9, 0x85, 0x9a,
-	0xd0, 0x06, 0xc5, 0xf4, 0xed, 0x32, 0xbe, 0x05, 0xfd, 0x62, 0x30, 0x91, 0x9c, 0x42, 0xd3, 0xa9,
-	0xdc, 0x9b, 0x99, 0xce, 0x1e, 0x96, 0x11, 0xaa, 0x72, 0x49, 0x92, 0x59, 0xf9, 0x08, 0xc1, 0x28,
-	0x87, 0x22, 0x94, 0x10, 0x48, 0xd6, 0x02, 0x48, 0x16, 0x18, 0x92, 0x1c, 0x5c, 0x66, 0xe2, 0xa5,
-	0x1b, 0xd4, 0x74, 0x53, 0xaf, 0xec, 0xc7, 0x73, 0xcf, 0x63, 0x9c, 0x2d, 0x54, 0x4b, 0xd0, 0xc7,
-	0x99, 0x18, 0xa2, 0x54, 0xee, 0x7c, 0x94, 0xc2, 0x5c, 0x21, 0xae, 0xaf, 0x60, 0x55, 0xea, 0x70,
-	0x7a, 0x85, 0x50, 0xaf, 0xfc, 0x75, 0x61, 0xfb, 0x52, 0xf1, 0x55, 0xe8, 0x31, 0xf5, 0x1a, 0x11,
-	0x6a, 0xe7, 0x99, 0xda, 0x57, 0x20, 0xd7, 0xf9, 0x02, 0x42, 0x05, 0x32, 0x39, 0xca, 0x06, 0x8c,
-	0xac, 0x10, 0xea, 0x3f, 0x9c, 0x1b, 0xbe, 0x3d, 0xba, 0xbb, 0x64, 0x2e, 0xf5, 0x2f, 0x09, 0xc0,
-	0x2b, 0xb6, 0xd5, 0xa8, 0xab, 0x6e, 0x84, 0x70, 0x5e, 0xdc, 0xa9, 0x9f, 0x84, 0xbe, 0x6d, 0xa3,
-	0x4a, 0x89, 0xcd, 0xed, 0x48, 0x13, 0x23, 0x7c, 0x1a, 0x06, 0x2a, 0xee, 0xfe, 0xc5, 0x07, 0x7b,
-	0xcc, 0x80, 0x84, 0x85, 0xf5, 0xb3, 0xc9, 0x9b, 0x7b, 0xb8, 0x00, 0x23, 0x25, 0xab, 0xe6, 0x0a,
-	0x29, 0x4a, 0xd7, 0x9b, 0xe8, 0x61, 0xf7, 0x76, 0x4a, 0xde, 0x9b, 0x74, 0x8f, 0x4c, 0x41, 0x10,
-	0x68, 0xc7, 0x05, 0x8b, 0x9c, 0xc0, 0x57, 0x61, 0xd0, 0x26, 0x7a, 0xb9, 0xe8, 0x3a, 0xd0, 0x44,
-	0x2f, 0x63, 0x4f, 0xef, 0x63, 0xdf, 0x90, 0xde, 0xa5, 0x0d, 0xb8, 0xc4, 0xee, 0x10, 0x4f, 0x02,
-	0xd4, 0xf5, 0x0a, 0x29, 0x52, 0x6b, 0x87, 0x98, 0x13, 0xfd, 0x4c, 0xf5, 0x41, 0x77, 0x66, 0xc3,
-	0x9d, 0xc0, 0xaf, 0x01, 0x1b, 0x14, 0x1d, 0xe3, 0x31, 0x99, 0x18, 0x98, 0x42, 0xd3, 0xbd, 0xda,
-	0x80, 0x3b, 0xb1, 0x6e, 0x3c, 0x26, 0xca, 0x3f, 0x11, 0x8c, 0xfa, 0xce, 0x96, 0x67, 0x09, 0xbc,
-	0x09, 0x23, 0x12, 0xb2, 0x9b, 0x3a, 0x1a, 0x55, 0xea, 0x4c, 0xa0, 0xa9, 0xe4, 0x74, 0x2a, 0x77,
-	0x31, 0xca, 0x14, 0x99, 0x38, 0x8d, 0xf1, 0x68, 0xc7, 0xc4, 0x11, 0xf1, 0xa1, 0xe3, 0xc7, 0x98,
-	0xe8, 0x02, 0xe3, 0x79, 0x38, 0x6e, 0x92, 0xef, 0xd0, 0xa2, 0x07, 0x28, 0xbb, 0x09, 0x6d, 0xd8,
-	0x9d, 0x5e, 0x6b, 0x81, 0x9d, 0x04, 0xa0, 0x16, 0xd5, 0xab, 0x1c, 0x6d, 0x0f, 0x43, 0x3b, 0xc8,
-	0x66, 0x18, 0xdc, 0x4f, 0x13, 0x30, 0xc6, 0xf4, 0x13, 0x0e, 0xee, 0x1c, 0x6d, 0x30, 0x3a, 0xac,
-	0x01, 0xf9, 0x8e, 0xa5, 0xa7, 0x8b, 0x63, 0x09, 0xb3, 0xbc, 0xde, 0xae, 0x2d, 0xef, 0x79, 0x0c,
-	0xe8, 0x5f, 0x08, 0xc6, 0x03, 0x27, 0xfa, 0xff, 0x6d, 0x42, 0x7f, 0x46, 0x90, 0xf2, 0xe8, 0x87,
-	0xdf, 0x03, 0xa8, 0xdb, 0x6e, 0x4e, 0xa6, 0x06, 0x91, 0x00, 0x17, 0xbb, 0x00, 0x98, 0x59, 0x6b,
-	0x71, 0x2f, 0x9b, 0xd4, 0xde, 0xd3, 0x3c, 0xe2, 0xf0, 0x18, 0xf4, 0x96, 0xac, 0x86, 0x49, 0x19,
-	0xd0, 0xa4, 0xc6, 0x07, 0xe9, 0x4d, 0x38, 0x1e, 0x60, 0xc2, 0x23, 0x90, 0xdc, 0x21, 0x7b, 0xdc,
-	0x78, 0x35, 0xf7, 0x27, 0x9e, 0x81, 0xde, 0x5d, 0xbd, 0xda, 0x90, 0x67, 0x74, 0x72, 0xdf, 0x19,
-	0x6d, 0xb9, 0xab, 0x1a, 0x27, 0xca, 0x27, 0x16, 0x90, 0xf2, 0x2b, 0x04, 0xf8, 0x8e, 0xe1, 0x88,
-	0xf8, 0xfd, 0x02, 0xe3, 0xac, 0xdf, 0xde, 0x12, 0x1d, 0xed, 0xad, 0x3f, 0x60, 0x6f, 0xdf, 0x83,
-	0x51, 0x9f, 0x8e, 0xc2, 0xd8, 0x6e, 0x40, 0x3f, 0xd7, 0x43, 0x5e, 0x41, 0xcc, 0x8c, 0xa9, 0x49,
-	0xb6, 0x30, 0xf3, 0x48, 0x84, 0x98, 0x87, 0xf2, 0x34, 0x09, 0x27, 0x5c, 0x0d, 0x5e, 0x56, 0x32,
-	0x3a, 0x05, 0x03, 0x96, 0x5d, 0x26, 0x76, 0x2b, 0x96, 0x68, 0xfd, 0x6c, 0xfc, 0xf2, 0xc3, 0xc8,
-	0x75, 0xf7, 0x29, 0x26, 0x1f, 0x8f, 0xec, 0xe2, 0xc2, 0xf6, 0xbf, 0xe5, 0x92, 0xdc, 0xd5, 0x9d,
-	0x1d, 0x37, 0x06, 0x22, 0xf7, 0x99, 0x26, 0xc6, 0x01, 0xb3, 0x18, 0xe8, 0x68, 0x16, 0x83, 0x01,
-	0xb3, 0xf8, 0x61, 0x0f, 0xb7, 0xdd, 0x40, 0x1a, 0x73, 0x60, 0xb4, 0x6a, 0x38, 0x94, 0x57, 0x43,
-	0x4e, 0x20, 0x0c, 0x2d, 0x45, 0x99, 0xc8, 0x7e, 0x81, 0xfe, 0x29, 0x37, 0x3c, 0x9d, 0xa8, 0x06,
-	0x66, 0x5e, 0x7a, 0x84, 0x4a, 0x7f, 0x98, 0x80, 0x91, 0xa0, 0x9e, 0x78, 0x11, 0x7a, 0xd9, 0x21,
-	0x30, 0xfb, 0x4c, 0xe5, 0xce, 0x45, 0x61, 0x67, 0xcc, 0x1a, 0xe7, 0xc1, 0x36, 0x0c, 0x39, 0x54,
-	0xa7, 0xa4, 0x58, 0x7a, 0xa8, 0x9b, 0x15, 0x0e, 0xea, 0x58, 0xee, 0xde, 0x11, 0x9c, 0x5f, 0x66,
-	0xdd, 0x95, 0xbb, 0xc4, 0xc4, 0x6a, 0x29, 0xa7, 0x3d, 0x50, 0xae, 0x41, 0xca, 0xb3, 0x86, 0x01,
-	0xfa, 0x36, 0x57, 0x37, 0xd7, 0x97, 0x0b, 0x23, 0xaf, 0xe0, 0x41, 0xe8, 0x55, 0x0b, 0x85, 0xe5,
-	0xc2, 0x08, 0xc2, 0x29, 0xe8, 0xd7, 0x96, 0xef, 0xde, 0xdb, 0x5a, 0x2e, 0x8c, 0x24, 0x5c, 0x1a,
-	0x75, 0x69, 0xe3, 0xf6, 0xd6, 0xf2, 0x48, 0x52, 0xf9, 0x41, 0x92, 0x07, 0x8a, 0xff, 0x6d, 0xa2,
-	0xff, 0xd2, 0x39, 0xc3, 0x9c, 0xf3, 0xef, 0x7d, 0x30, 0xe6, 0xbf, 0x0b, 0xe1, 0x9e, 0x1f, 0xc0,
-	0x38, 0x73, 0x4f, 0x51, 0x60, 0x05, 0x1d, 0x74, 0x25, 0x8e, 0x81, 0x05, 0x85, 0x06, 0x27, 0x5d,
-	0x27, 0x65, 0x41, 0xc0, 0x3f, 0xf7, 0xf2, 0xdd, 0xf4, 0x73, 0x11, 0xb2, 0xfc, 0x7a, 0x61, 0xb5,
-	0x5d, 0xac, 0xa2, 0xae, 0x8a, 0xd5, 0x56, 0x9d, 0x8a, 0x77, 0x43, 0xdd, 0x75, 0xfd, 0x88, 0x4e,
-	0xf3, 0x40, 0x97, 0xc5, 0x55, 0x18, 0x90, 0x99, 0x4e, 0x14, 0xda, 0x6b, 0x47, 0xb5, 0xa7, 0x26,
-	0xe4, 0x6a, 0xad, 0x1d, 0xd2, 0xbf, 0x47, 0x30, 0x20, 0xa7, 0x31, 0xf6, 0x56, 0x99, 0xbc, 0x6e,
-	0xc4, 0x67, 0x60, 0xa8, 0x6e, 0x5b, 0xdf, 0x22, 0x25, 0x5a, 0x64, 0x6b, 0xdc, 0x55, 0x53, 0x62,
-	0x6e, 0xd5, 0x25, 0xb9, 0x0c, 0x63, 0x92, 0xa4, 0x6c, 0x38, 0xf5, 0xaa, 0xbe, 0xc7, 0x49, 0xf9,
-	0x7d, 0x62, 0xb1, 0x56, 0xe0, 0x4b, 0x8c, 0xe3, 0x75, 0x48, 0xf1, 0x18, 0xc0, 0x09, 0x7b, 0x18,
-	0x21, 0xf0, 0x29, 0x46, 0x90, 0x81, 0x51, 0x41, 0xe0, 0x93, 0xd8, 0xcb, 0x08, 0x4f, 0xf0, 0x25,
-	0x8f, 0x40, 0xe5, 0xee, 0xc1, 0x71, 0x2e, 0x05, 0xfd, 0x4b, 0x6f, 0xab, 0xab, 0x2b, 0x2c, 0xd2,
-	0x0d, 0xc3, 0xe0, 0xe6, 0xaa, 0x1c, 0x26, 0xda, 0x31, 0x30, 0xe9, 0x8d, 0x81, 0x3d, 0xca, 0xdf,
-	0x10, 0x9c, 0x5c, 0x27, 0xf2, 0xf8, 0x98, 0x64, 0x19, 0xfa, 0x54, 0x5f, 0x25, 0x7e, 0x89, 0x05,
-	0xbe, 0x37, 0xe1, 0x5c, 0xe7, 0xc0, 0x27, 0x8d, 0x8b, 0x1f, 0xe9, 0xdb, 0xd0, 0xcb, 0x2e, 0x5c,
-	0x98, 0xd4, 0xa5, 0x98, 0xa6, 0xc9, 0x4d, 0x86, 0x17, 0x3d, 0x5c, 0x80, 0x1b, 0x8f, 0x1c, 0xaa,
-	0xdb, 0x94, 0xbb, 0x5f, 0x32, 0xca, 0xfd, 0x44, 0x4f, 0x87, 0xb1, 0xb8, 0x93, 0x4a, 0x15, 0x26,
-	0xb4, 0x86, 0xc9, 0x52, 0x49, 0x41, 0x36, 0x39, 0x5f, 0xd8, 0x63, 0x4c, 0xf9, 0x19, 0x82, 0xb1,
-	0xcd, 0x7a, 0x79, 0x7f, 0x13, 0xeb, 0xd6, 0x61, 0xbd, 0xd5, 0xdf, 0x5a, 0xc2, 0x8b, 0x90, 0x6a,
-	0x30, 0xf9, 0x3c, 0x3e, 0x27, 0xa2, 0xe2, 0xb3, 0x06, 0x9c, 0xdc, 0xfd, 0xad, 0x7c, 0x86, 0xe0,
-	0x0c, 0xd7, 0xae, 0x53, 0xb3, 0xc7, 0x84, 0xf1, 0xd0, 0x46, 0xa8, 0x50, 0xfc, 0x4a, 0x94, 0xe2,
-	0x61, 0xb2, 0x39, 0x8a, 0x31, 0x2b, 0x64, 0xe9, 0xf9, 0x20, 0xfd, 0x18, 0xc1, 0x28, 0x87, 0xe4,
-	0xef, 0x26, 0xb5, 0x1b, 0x63, 0xe8, 0xd0, 0x8d, 0xb1, 0xe7, 0xd3, 0xec, 0xdf, 0x08, 0xd2, 0x42,
-	0x33, 0xb1, 0xd9, 0x5d, 0xdd, 0xde, 0x69, 0x9d, 0xf2, 0x37, 0xe0, 0x98, 0xbf, 0x65, 0x2c, 0x14,
-	0x8d, 0x74, 0x15, 0x9f, 0x34, 0xae, 0xef, 0xb0, 0xe3, 0x9d, 0x7b, 0x2e, 0xb5, 0xf1, 0xd7, 0xba,
-	0xf3, 0x37, 0x8f, 0xab, 0xe5, 0x7e, 0x31, 0x09, 0xc7, 0xa4, 0x76, 0x4b, 0x4c, 0x5f, 0xfc, 0x5b,
-	0x04, 0x43, 0xde, 0x4e, 0x28, 0x9e, 0x8b, 0x82, 0x17, 0xd2, 0x37, 0x4d, 0xc7, 0xbc, 0x3c, 0xa5,
-	0xd0, 0x54, 0x87, 0xb9, 0x23, 0xce, 0xf0, 0x1b, 0xfc, 0xf0, 0xf3, 0xbf, 0x3e, 0x4d, 0x64, 0x94,
-	0xb3, 0xd9, 0xdd, 0xd9, 0xec, 0x07, 0x7c, 0xe5, 0x9a, 0xd7, 0x06, 0x9d, 0xec, 0x85, 0x27, 0xa2,
-	0x09, 0xef, 0xe4, 0xe5, 0xad, 0xff, 0x01, 0xc1, 0xb0, 0xaf, 0x11, 0x8d, 0xaf, 0xc4, 0x53, 0xda,
-	0xef, 0xf2, 0xe9, 0xb8, 0x1e, 0xae, 0xdc, 0x6f, 0xaa, 0xa7, 0x84, 0xda, 0xed, 0x16, 0xb5, 0xfc,
-	0xc9, 0x20, 0xe4, 0x95, 0x6c, 0x07, 0x08, 0x12, 0x81, 0x0b, 0x46, 0xbe, 0x90, 0xf2, 0xad, 0x88,
-	0xf1, 0x23, 0x04, 0x43, 0x2b, 0x84, 0xde, 0xd6, 0x6b, 0x6b, 0xec, 0x1f, 0x03, 0xac, 0x48, 0xbd,
-	0x0c, 0xbd, 0xc6, 0x7a, 0x0c, 0x9e, 0x45, 0xa9, 0xfb, 0x78, 0x80, 0x86, 0xaf, 0x2a, 0x5f, 0x6f,
-	0xaa, 0xad, 0xbc, 0x2a, 0x14, 0x9b, 0x67, 0x8a, 0xc9, 0xc9, 0x0e, 0xaa, 0xe5, 0x2b, 0x9e, 0x7d,
-	0xf2, 0xe8, 0x02, 0xfe, 0x14, 0xc1, 0xab, 0x07, 0xf4, 0x9d, 0xf1, 0xf5, 0xc8, 0xc6, 0x48, 0xc7,
-	0x86, 0x75, 0xfa, 0x50, 0x41, 0x4a, 0xb9, 0xde, 0x54, 0x59, 0xfa, 0x62, 0xd0, 0x66, 0x31, 0x3f,
-	0x73, 0x77, 0x62, 0x1f, 0xac, 0xb0, 0x40, 0xf6, 0x04, 0xff, 0x14, 0xc1, 0x60, 0xab, 0xaf, 0x8d,
-	0x2f, 0xc7, 0xc0, 0x70, 0x38, 0x3b, 0x9f, 0xf3, 0xea, 0x79, 0x1e, 0x9f, 0x3d, 0x58, 0xcf, 0xf6,
-	0xf1, 0xe3, 0x8f, 0x64, 0x3f, 0x8a, 0x97, 0x55, 0x38, 0x17, 0xab, 0xf7, 0xe4, 0xeb, 0x5e, 0xa4,
-	0xe7, 0xba, 0xe2, 0xe1, 0xaf, 0x34, 0xe5, 0x8a, 0xf0, 0xc2, 0xb7, 0x3a, 0x7a, 0x21, 0xaf, 0xbc,
-	0xf3, 0xac, 0x89, 0xe7, 0x5a, 0xc7, 0x67, 0x08, 0x86, 0x7d, 0xfd, 0xc2, 0x68, 0x2f, 0x0c, 0x6b,
-	0xd8, 0xa6, 0xe7, 0xbb, 0xe4, 0x12, 0x4a, 0x6b, 0x4d, 0xf5, 0xb8, 0xf0, 0x49, 0xd9, 0x9c, 0xf4,
-	0x19, 0x7c, 0x17, 0x9e, 0xd8, 0x82, 0xf4, 0x4b, 0x04, 0xd0, 0xae, 0x6b, 0xf1, 0x6c, 0x37, 0x65,
-	0x31, 0x07, 0x93, 0xeb, 0xbe, 0x92, 0x56, 0x2e, 0x32, 0xbd, 0xcf, 0xe1, 0x37, 0x62, 0x1c, 0x3f,
-	0xfe, 0x18, 0xc1, 0x90, 0xf7, 0x55, 0x1d, 0x1d, 0xaf, 0x43, 0x6a, 0xe7, 0x68, 0xef, 0x0b, 0x7b,
-	0xcd, 0x2b, 0x57, 0x7d, 0x6e, 0x17, 0xff, 0x80, 0xf1, 0x6f, 0x10, 0xa4, 0x3c, 0xbd, 0x3e, 0x1c,
-	0xeb, 0x94, 0xfc, 0xcd, 0xcb, 0xf4, 0x5c, 0x57, 0x3c, 0x42, 0xe3, 0xf9, 0xa6, 0x2a, 0x1e, 0x7e,
-	0x3e, 0x4f, 0x8c, 0x48, 0x34, 0xf8, 0xfb, 0x09, 0x38, 0xb1, 0xef, 0x4d, 0x8a, 0x17, 0xa2, 0x34,
-	0x38, 0xe8, 0x19, 0x9b, 0x9e, 0x94, 0x9c, 0x9e, 0x7f, 0x7f, 0x33, 0xf7, 0xe4, 0xbf, 0xbf, 0xca,
-	0x4f, 0xd0, 0x33, 0xf5, 0x1d, 0x58, 0xe8, 0x5e, 0xba, 0x28, 0xbe, 0xc7, 0x83, 0xc9, 0x7f, 0xb9,
-	0x56, 0xa7, 0x7b, 0x7e, 0xe8, 0xf3, 0xca, 0xe5, 0x38, 0xde, 0x6d, 0x37, 0xcc, 0x96, 0x7c, 0x91,
-	0x02, 0x8e, 0x07, 0x8a, 0x10, 0xfc, 0xd5, 0xe8, 0x07, 0x50, 0x58, 0xd5, 0x12, 0x3f, 0xdd, 0xbe,
-	0xd7, 0x54, 0xc7, 0xdd, 0x60, 0x39, 0xc3, 0x0a, 0x8c, 0x99, 0xf6, 0x6b, 0x87, 0x21, 0xb9, 0xa6,
-	0x2c, 0xc4, 0x08, 0xa7, 0x2d, 0xe3, 0x73, 0x13, 0x9b, 0x43, 0x28, 0xd3, 0xc4, 0x45, 0xf4, 0x73,
-	0x04, 0x43, 0xeb, 0x9d, 0xb2, 0xed, 0x7a, 0xfc, 0x6c, 0xeb, 0xc6, 0x20, 0x99, 0x58, 0x67, 0xf8,
-	0xdf, 0xfd, 0x5d, 0x27, 0x5d, 0x27, 0x90, 0x74, 0x3f, 0x41, 0x80, 0x37, 0x88, 0xc3, 0x26, 0x89,
-	0x5d, 0x33, 0x1c, 0xc7, 0xe5, 0xc1, 0xd3, 0x01, 0x0d, 0xf6, 0x93, 0x48, 0x5d, 0xdf, 0x8a, 0x41,
-	0x29, 0xdc, 0xe3, 0x9b, 0x4d, 0x75, 0xac, 0xad, 0x7f, 0x9b, 0x80, 0x81, 0xb8, 0xa1, 0x2c, 0xc6,
-	0x06, 0x41, 0xf7, 0xed, 0xe1, 0x42, 0xf9, 0x1d, 0x82, 0x61, 0x5f, 0xad, 0x15, 0x9d, 0x21, 0xc2,
-	0x4a, 0xb3, 0xf8, 0x86, 0xa3, 0x35, 0xd5, 0x7e, 0xef, 0xab, 0xec, 0x66, 0xee, 0x2a, 0x83, 0x20,
-	0x3f, 0x32, 0xe9, 0xc2, 0x64, 0x5a, 0xaf, 0xb3, 0xa7, 0x09, 0x59, 0x25, 0x84, 0xbe, 0x83, 0xd4,
-	0x78, 0x88, 0x8e, 0xfe, 0x29, 0xf4, 0xdd, 0xa6, 0x1a, 0x5e, 0x05, 0x32, 0xe4, 0xef, 0xe7, 0x96,
-	0x19, 0xf2, 0xf0, 0x0f, 0x66, 0xe2, 0xbf, 0x98, 0xf2, 0xe1, 0x7b, 0xb0, 0xb2, 0xc1, 0x5b, 0xd5,
-	0x45, 0xa7, 0xa1, 0x90, 0x1a, 0xb0, 0x9b, 0xb2, 0xa1, 0xcf, 0xf3, 0xa6, 0x9d, 0xcf, 0x5d, 0x64,
-	0xe0, 0xc4, 0xc7, 0x39, 0x11, 0xef, 0xaa, 0x56, 0xd9, 0xf0, 0xc7, 0x44, 0xab, 0x12, 0xf5, 0x55,
-	0x63, 0xf9, 0x98, 0xaa, 0x87, 0x14, 0x89, 0xe9, 0xee, 0x8a, 0x41, 0xe5, 0x19, 0x6a, 0xaa, 0x81,
-	0xaa, 0x92, 0x21, 0xfa, 0x18, 0xe5, 0x6e, 0x70, 0x48, 0xfe, 0x8f, 0x94, 0x42, 0xa1, 0xf1, 0x50,
-	0xed, 0x62, 0xf4, 0xca, 0x7e, 0x92, 0x0f, 0x08, 0x7e, 0xf7, 0xfd, 0xdc, 0x9d, 0xd8, 0x32, 0xc3,
-	0x9c, 0x20, 0x42, 0x7e, 0xfa, 0x9d, 0x67, 0xea, 0x64, 0xc7, 0x96, 0xd3, 0x9f, 0xd4, 0xcc, 0x43,
-	0x4a, 0xeb, 0x4e, 0x3e, 0x9b, 0x7d, 0xf4, 0xe8, 0x51, 0xb0, 0x3d, 0xa3, 0x37, 0xe8, 0x43, 0xfe,
-	0xdd, 0xd5, 0xa5, 0x7a, 0x55, 0xa7, 0xdb, 0x96, 0x5d, 0xbb, 0xd9, 0x44, 0xa0, 0x94, 0xac, 0x5a,
-	0xc4, 0xa1, 0xae, 0xa1, 0x77, 0xef, 0x08, 0x8a, 0x8a, 0x55, 0xd5, 0xcd, 0x4a, 0xc6, 0xb2, 0x2b,
-	0xd9, 0x0a, 0x31, 0x59, 0x02, 0xcc, 0xb6, 0xf7, 0x39, 0xe8, 0xb3, 0xae, 0x45, 0xff, 0xcc, 0xaf,
-	0x13, 0xa7, 0x57, 0xb8, 0xb8, 0x25, 0xb6, 0xa1, 0xbf, 0x44, 0xce, 0x6c, 0xcd, 0x3e, 0x93, 0x04,
-	0xf7, 0x19, 0xc1, 0x7d, 0x3f, 0xc1, 0xfd, 0xad, 0xd9, 0x7f, 0x24, 0xce, 0x70, 0x82, 0x7c, 0x9e,
-	0x51, 0xe4, 0xf3, 0x7e, 0x92, 0x7c, 0x7e, 0x6b, 0x76, 0xed, 0x95, 0x07, 0x7d, 0x4c, 0xc1, 0xb9,
-	0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x55, 0x09, 0xc5, 0x1d, 0x54, 0x28, 0x00, 0x00,
+	// 2744 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xdd, 0x6f, 0x1b, 0x59,
+	0x15, 0xdf, 0xeb, 0x7c, 0x1f, 0x27, 0x6d, 0x7a, 0x93, 0xec, 0xba, 0xb3, 0xdb, 0x26, 0x3b, 0xdb,
+	0x76, 0xbb, 0x6d, 0x6a, 0x37, 0x4e, 0x4b, 0x83, 0x43, 0x3f, 0xa6, 0x71, 0x9a, 0xad, 0x68, 0xd3,
+	0xec, 0xa4, 0x89, 0xc4, 0xb6, 0xac, 0x35, 0xb5, 0x6f, 0xdc, 0x21, 0xf6, 0x8c, 0x99, 0x19, 0xa7,
+	0xa4, 0x4b, 0x85, 0xb4, 0x2f, 0x88, 0x17, 0x24, 0x54, 0x89, 0x4f, 0x21, 0x21, 0x78, 0x83, 0x05,
+	0xc1, 0x8a, 0xbf, 0x00, 0xf1, 0x50, 0x55, 0xa0, 0xae, 0x58, 0x09, 0x84, 0x25, 0xa4, 0x7d, 0x80,
+	0x07, 0x10, 0x82, 0x77, 0x5e, 0x40, 0x73, 0x3f, 0x9c, 0x99, 0xf1, 0xd8, 0x33, 0x4e, 0xd3, 0x2d,
+	0x42, 0xbc, 0x79, 0xee, 0x3d, 0xe7, 0xdc, 0xf3, 0x3b, 0xf7, 0x9c, 0x73, 0xcf, 0x3d, 0xd7, 0x30,
+	0x5f, 0x36, 0xcd, 0x72, 0x85, 0x64, 0x8a, 0x15, 0xb3, 0x5e, 0xca, 0xd8, 0xa4, 0x58, 0xb7, 0x74,
+	0x67, 0xbb, 0x48, 0x0c, 0x87, 0x58, 0x99, 0xad, 0x99, 0xc0, 0x48, 0xc1, 0x26, 0xd6, 0x96, 0x5e,
+	0x24, 0xe9, 0x9a, 0x65, 0x3a, 0x26, 0x3e, 0xcc, 0x98, 0xd3, 0x94, 0x39, 0xed, 0x27, 0x4d, 0x6f,
+	0xcd, 0x48, 0x4a, 0x84, 0x70, 0xab, 0x6e, 0x14, 0x34, 0xdb, 0x26, 0x4e, 0xa1, 0xa4, 0xdb, 0x45,
+	0x73, 0x8b, 0x58, 0xdb, 0x05, 0x8b, 0xd8, 0x35, 0xd3, 0xb0, 0xf9, 0x12, 0xd2, 0x2b, 0x5c, 0x84,
+	0x56, 0xd3, 0x33, 0x9a, 0x61, 0x98, 0x8e, 0xe6, 0xe8, 0xa6, 0x61, 0xf3, 0xd9, 0x97, 0x3c, 0xb3,
+	0xc5, 0x8a, 0x4e, 0x0c, 0x87, 0x4f, 0x4c, 0x7a, 0x26, 0x36, 0x74, 0x52, 0x29, 0x15, 0xee, 0x90,
+	0xbb, 0xda, 0x96, 0x6e, 0x5a, 0x9c, 0xe0, 0xa0, 0x87, 0xc0, 0x22, 0xb6, 0x59, 0xb7, 0x04, 0x2a,
+	0xe9, 0x44, 0x84, 0xd6, 0x54, 0x63, 0x4e, 0x3b, 0x1d, 0x41, 0xbb, 0xa1, 0x1b, 0x25, 0xdd, 0x28,
+	0x73, 0xea, 0xb9, 0x08, 0x6a, 0xc3, 0x74, 0xf4, 0x0d, 0xbd, 0x48, 0x21, 0x16, 0x8a, 0xa6, 0xb1,
+	0xa1, 0x0b, 0xce, 0x5c, 0x04, 0xa7, 0x69, 0x95, 0x35, 0x43, 0xbf, 0xcf, 0x38, 0x6d, 0xe2, 0x38,
+	0xba, 0x51, 0x16, 0x46, 0x9a, 0x8d, 0xb9, 0xc5, 0x85, 0xaa, 0x66, 0x6d, 0x0a, 0xa6, 0x93, 0x51,
+	0x4c, 0x5e, 0x8b, 0x71, 0x3f, 0xc8, 0xe8, 0x5a, 0xd5, 0x9d, 0xd3, 0xb5, 0x6a, 0xa1, 0x66, 0x56,
+	0xf4, 0xe2, 0x36, 0x9f, 0x97, 0xfc, 0xf3, 0xbe, 0xb9, 0xd7, 0xf8, 0x5c, 0xc5, 0x34, 0xca, 0x56,
+	0xdd, 0x30, 0x74, 0xa3, 0x9c, 0x31, 0x6b, 0xc4, 0xf2, 0xed, 0xb3, 0x58, 0x80, 0x7e, 0xdd, 0xa9,
+	0x6f, 0x64, 0x4a, 0x75, 0x46, 0xc0, 0xe7, 0x5f, 0x0e, 0xce, 0x93, 0x6a, 0xcd, 0x11, 0x2b, 0x4c,
+	0x05, 0x27, 0x99, 0x43, 0x54, 0x35, 0x7b, 0x33, 0xe0, 0x64, 0x4d, 0x0a, 0xdb, 0xb1, 0xea, 0xc5,
+	0xa0, 0x2f, 0x35, 0x67, 0x1d, 0xbd, 0x4a, 0x6c, 0x47, 0xab, 0xd6, 0x18, 0x81, 0xfc, 0x08, 0xc1,
+	0xf8, 0x82, 0x45, 0x34, 0x87, 0x5c, 0x61, 0xdb, 0xad, 0x92, 0x2f, 0xd6, 0x89, 0xed, 0xe0, 0x3c,
+	0xf4, 0xd7, 0x34, 0x8b, 0x18, 0x4e, 0x0a, 0x4d, 0xa1, 0xe3, 0x43, 0x97, 0xa7, 0x3f, 0x56, 0x12,
+	0xff, 0x52, 0x8e, 0xc1, 0x91, 0x40, 0xa8, 0xb0, 0x05, 0xb4, 0x9a, 0x6e, 0xa7, 0x8b, 0x66, 0x35,
+	0xb3, 0x4a, 0x6d, 0xab, 0x72, 0x5e, 0x2c, 0x03, 0x70, 0x37, 0x2a, 0xe8, 0xa5, 0x54, 0x82, 0x4a,
+	0xea, 0xf9, 0x58, 0x49, 0xa8, 0x43, 0x7c, 0xf8, 0x6a, 0x09, 0x5f, 0x81, 0x01, 0xfe, 0x91, 0xea,
+	0x99, 0x42, 0xc7, 0x93, 0xd9, 0xd7, 0xd3, 0x9d, 0x63, 0x33, 0xcd, 0x55, 0x65, 0x92, 0x04, 0xb3,
+	0xfc, 0x6f, 0x04, 0x93, 0x0c, 0xca, 0xb2, 0xc7, 0x17, 0x17, 0xa8, 0x2b, 0x0a, 0x54, 0x2b, 0x01,
+	0x54, 0x73, 0x14, 0x55, 0x16, 0x4e, 0xd3, 0xa5, 0x44, 0x30, 0x55, 0x35, 0x43, 0x2b, 0xb7, 0x62,
+	0xbb, 0xe1, 0x71, 0xd4, 0x26, 0xc2, 0x29, 0x18, 0x62, 0xde, 0x1e, 0x00, 0x38, 0xc8, 0x46, 0xaf,
+	0x96, 0xf0, 0x5d, 0x18, 0x0b, 0x09, 0x0e, 0x8e, 0x35, 0x1b, 0x85, 0xb5, 0x15, 0x0b, 0x93, 0x8f,
+	0x8d, 0x96, 0x09, 0xf9, 0x7d, 0x04, 0x63, 0xcc, 0x02, 0x7c, 0x1b, 0x9e, 0x19, 0xea, 0x05, 0xe8,
+	0x67, 0x4c, 0x14, 0x72, 0x32, 0x7b, 0x2c, 0x0a, 0x06, 0x53, 0x88, 0xa9, 0xce, 0x59, 0x65, 0x13,
+	0x26, 0xf3, 0xa4, 0x42, 0x3a, 0xed, 0xd7, 0x35, 0xe8, 0x35, 0xb4, 0x2a, 0x09, 0xea, 0xdd, 0xd9,
+	0x07, 0x43, 0xc4, 0x51, 0x29, 0x72, 0x05, 0x5e, 0x59, 0x22, 0xce, 0x27, 0xb5, 0x5a, 0x0d, 0x0e,
+	0x2f, 0x11, 0xc7, 0x6b, 0xbe, 0x55, 0x9e, 0xdc, 0xc4, 0x7a, 0xcb, 0xbe, 0xf5, 0x72, 0x74, 0xbd,
+	0x33, 0x90, 0xed, 0xbc, 0x5e, 0xa8, 0x40, 0xb6, 0xe2, 0x4d, 0x18, 0x5d, 0x22, 0x8e, 0x7f, 0xef,
+	0x2f, 0xf9, 0xd6, 0xe8, 0x2e, 0x8a, 0x99, 0xd4, 0x3f, 0x26, 0x00, 0x2f, 0x59, 0x66, 0xbd, 0xa6,
+	0xb8, 0x87, 0x87, 0xfd, 0xec, 0x9c, 0xea, 0x45, 0xe8, 0xdf, 0xd0, 0x2b, 0x0e, 0xb1, 0x58, 0x1c,
+	0xa9, 0xfc, 0x0b, 0x1f, 0x86, 0xc1, 0xb2, 0xbb, 0x7e, 0xe1, 0xce, 0x36, 0x8d, 0x1a, 0x1e, 0x61,
+	0x03, 0x74, 0xf0, 0xf2, 0x36, 0xce, 0xc3, 0x68, 0xd1, 0xac, 0xba, 0x42, 0x0a, 0x22, 0xb7, 0xa6,
+	0x7a, 0xa9, 0x5b, 0x1e, 0x14, 0x6e, 0x29, 0xf2, 0x5f, 0x3a, 0xcf, 0x09, 0xd4, 0xfd, 0x9c, 0x45,
+	0x0c, 0xe0, 0x73, 0x30, 0x64, 0x11, 0xad, 0x54, 0x70, 0x33, 0x64, 0xaa, 0x8f, 0xb2, 0x4b, 0x2d,
+	0xec, 0x37, 0x45, 0xfa, 0x54, 0x07, 0x5d, 0x62, 0xf7, 0x13, 0x1f, 0x02, 0xa8, 0x69, 0x65, 0x52,
+	0x70, 0xcc, 0x4d, 0x62, 0xa4, 0x06, 0xa8, 0xea, 0x43, 0xee, 0xc8, 0x4d, 0x77, 0x00, 0xbf, 0x0c,
+	0xf4, 0xa3, 0x60, 0xeb, 0xf7, 0x49, 0x6a, 0x70, 0x0a, 0x1d, 0xef, 0x53, 0x07, 0xdd, 0x81, 0x55,
+	0xfd, 0x3e, 0x91, 0xff, 0x8e, 0x60, 0xcc, 0x67, 0x5b, 0x56, 0x40, 0xe0, 0x35, 0x18, 0x15, 0x90,
+	0xdd, 0xaa, 0xa2, 0x5e, 0x71, 0xec, 0x14, 0x9a, 0xea, 0x39, 0x9e, 0xcc, 0x9e, 0x8c, 0x8a, 0x34,
+	0x2a, 0x4e, 0xa5, 0x3c, 0xea, 0x3e, 0x6e, 0x22, 0xf6, 0x69, 0xfb, 0x31, 0x26, 0xba, 0xc0, 0x78,
+	0x0c, 0xf6, 0x1b, 0xe4, 0x4b, 0x4e, 0xc1, 0x03, 0x94, 0xee, 0x84, 0x3a, 0xe2, 0x0e, 0xaf, 0x34,
+	0xc1, 0x1e, 0x02, 0x70, 0x4c, 0x47, 0xab, 0x30, 0xb4, 0xbd, 0x14, 0xed, 0x10, 0x1d, 0xa1, 0x70,
+	0x9f, 0x24, 0x60, 0x9c, 0xea, 0xc7, 0x33, 0xb8, 0xbd, 0xb7, 0xa7, 0xcd, 0x6e, 0x1d, 0xc8, 0x67,
+	0x96, 0xde, 0x2e, 0xcc, 0x12, 0xe6, 0x79, 0x7d, 0x5d, 0x7b, 0xde, 0xd3, 0x38, 0xd0, 0x3f, 0x10,
+	0x4c, 0x04, 0x2c, 0xfa, 0xbf, 0xed, 0x42, 0x7f, 0x40, 0x90, 0xf4, 0xe8, 0x87, 0x6f, 0x01, 0xd4,
+	0x2c, 0xb7, 0xe8, 0x72, 0x74, 0x22, 0x00, 0xce, 0x77, 0x01, 0x30, 0xbd, 0xd2, 0xe4, 0x5e, 0x34,
+	0x1c, 0x6b, 0x5b, 0xf5, 0x88, 0xc3, 0xe3, 0xd0, 0x57, 0x34, 0xeb, 0x86, 0x43, 0x81, 0xf6, 0xa8,
+	0xec, 0x43, 0x5a, 0x83, 0xfd, 0x01, 0x26, 0x3c, 0x0a, 0x3d, 0x9b, 0x64, 0x9b, 0x39, 0xaf, 0xea,
+	0xfe, 0xc4, 0xd3, 0xd0, 0xb7, 0xa5, 0x55, 0xea, 0xc2, 0x46, 0x2f, 0xb6, 0xd8, 0x68, 0xdd, 0x9d,
+	0x55, 0x19, 0x51, 0x2e, 0x31, 0x87, 0xe4, 0x9f, 0x21, 0x38, 0x7c, 0x4d, 0xb7, 0x43, 0xce, 0xa7,
+	0x67, 0x98, 0x73, 0xfd, 0xbe, 0x97, 0xe8, 0xe8, 0x7b, 0x3d, 0x01, 0xdf, 0xfb, 0x39, 0x82, 0xc9,
+	0xb6, 0x0a, 0x73, 0x2f, 0x24, 0x30, 0x1e, 0x52, 0xfc, 0x88, 0x8d, 0xda, 0x45, 0xf5, 0xa3, 0x8e,
+	0xb5, 0x16, 0x3e, 0x76, 0x98, 0x73, 0x25, 0x42, 0x9c, 0x4b, 0xfe, 0x21, 0x02, 0xec, 0xaa, 0xcc,
+	0x12, 0xc7, 0x7f, 0x89, 0x5d, 0x07, 0x02, 0x76, 0xfd, 0x0a, 0x8c, 0xf9, 0x74, 0xe4, 0xa6, 0xbc,
+	0x04, 0x03, 0x4c, 0x0f, 0x61, 0xbd, 0x98, 0x45, 0x97, 0x2a, 0xd8, 0x62, 0x5b, 0xe9, 0x61, 0x0f,
+	0x1c, 0x70, 0x35, 0x78, 0x5e, 0x07, 0xfe, 0x41, 0x18, 0x34, 0xad, 0x12, 0xb1, 0x9a, 0xf9, 0x5a,
+	0x1d, 0xa0, 0xdf, 0xcf, 0x3f, 0x55, 0x5f, 0x70, 0xef, 0x33, 0xe2, 0x06, 0x46, 0x37, 0x2e, 0x6c,
+	0xfd, 0x2b, 0x2e, 0xc9, 0x75, 0xcd, 0xde, 0x74, 0xcf, 0x19, 0xe4, 0xde, 0x75, 0xf8, 0x77, 0xc0,
+	0x2d, 0x06, 0x3b, 0xba, 0xc5, 0x50, 0xc0, 0x2d, 0xbe, 0xde, 0xcb, 0x7c, 0x37, 0x50, 0x2a, 0xd8,
+	0x30, 0x56, 0xd1, 0x6d, 0x87, 0x35, 0x23, 0xec, 0x40, 0xaa, 0x5f, 0x88, 0x72, 0x91, 0x56, 0x81,
+	0xfe, 0x21, 0xf7, 0x08, 0x38, 0x50, 0x09, 0x8c, 0x3c, 0xf7, 0x53, 0x40, 0x7a, 0x2f, 0x01, 0xa3,
+	0x41, 0x3d, 0xf1, 0x3c, 0xf4, 0x51, 0x23, 0x50, 0xff, 0x4c, 0x66, 0x8f, 0x46, 0x61, 0xa7, 0xcc,
+	0x2a, 0xe3, 0xc1, 0x16, 0x0c, 0xdb, 0x8e, 0xe6, 0x90, 0x42, 0xf1, 0xae, 0x66, 0x94, 0x19, 0xa8,
+	0x7d, 0xd9, 0x1b, 0x7b, 0x60, 0xbf, 0xf4, 0xaa, 0x2b, 0x77, 0x81, 0x8a, 0x55, 0x93, 0xf6, 0xce,
+	0x87, 0x7c, 0x1e, 0x92, 0x9e, 0x39, 0x0c, 0xd0, 0xbf, 0xb6, 0xbc, 0xb6, 0xba, 0x98, 0x1f, 0x7d,
+	0x01, 0x0f, 0x41, 0x9f, 0x92, 0xcf, 0x2f, 0xe6, 0x47, 0x11, 0x4e, 0xc2, 0x80, 0xba, 0x78, 0xfd,
+	0xc6, 0xfa, 0x62, 0x7e, 0x34, 0xe1, 0xd2, 0x28, 0x0b, 0x37, 0xaf, 0xae, 0x2f, 0x8e, 0xf6, 0xc8,
+	0x5f, 0xeb, 0x61, 0x89, 0xe2, 0x93, 0x2d, 0xa6, 0xfe, 0x1f, 0x9c, 0x61, 0xc1, 0xf9, 0xd7, 0x7e,
+	0x18, 0xf7, 0xef, 0x05, 0x0f, 0xcf, 0x77, 0x61, 0x82, 0x86, 0x27, 0xef, 0x52, 0x04, 0x03, 0x74,
+	0x29, 0x8e, 0x83, 0x05, 0x85, 0x06, 0x07, 0xdd, 0x20, 0xa5, 0x49, 0xc0, 0x3f, 0xf6, 0xfc, 0xc3,
+	0xf4, 0x23, 0x9e, 0xb2, 0xfc, 0x7a, 0x61, 0x65, 0xa7, 0xe3, 0x83, 0xba, 0xea, 0xf8, 0x34, 0x9b,
+	0x3d, 0x78, 0x2b, 0x34, 0x5c, 0x57, 0xf7, 0xc8, 0x9a, 0x6d, 0x43, 0x16, 0x57, 0x60, 0x50, 0x9c,
+	0x74, 0xbc, 0x83, 0xb3, 0xb2, 0x57, 0x6b, 0xaa, 0x5c, 0xae, 0xda, 0x5c, 0x41, 0xfa, 0x35, 0x82,
+	0x41, 0x31, 0x8c, 0xb1, 0xf7, 0x26, 0xcf, 0xee, 0xe6, 0xf8, 0x55, 0x18, 0xae, 0x59, 0xe6, 0x17,
+	0x48, 0xd1, 0x29, 0xd0, 0x39, 0x16, 0xaa, 0x49, 0x3e, 0xb6, 0xec, 0x92, 0x9c, 0x86, 0x71, 0x41,
+	0x52, 0xd2, 0xed, 0x5a, 0x45, 0xdb, 0x66, 0xa4, 0x6c, 0x3f, 0x31, 0x9f, 0xcb, 0xb3, 0x29, 0xca,
+	0x31, 0x09, 0x49, 0x96, 0x03, 0x18, 0x61, 0x2f, 0x25, 0x04, 0x36, 0x44, 0x09, 0xd2, 0x30, 0xc6,
+	0x09, 0x7c, 0x12, 0xfb, 0x28, 0xe1, 0x01, 0x36, 0xe5, 0x11, 0x28, 0x5f, 0x6f, 0x9f, 0xe7, 0x92,
+	0x30, 0xb0, 0xf0, 0xa6, 0xb2, 0xbc, 0x44, 0x33, 0xdd, 0x08, 0x0c, 0xad, 0x2d, 0x8b, 0xcf, 0xc4,
+	0x4e, 0x0e, 0xec, 0xf1, 0xe6, 0xc0, 0x5e, 0xf9, 0x2f, 0x08, 0x5e, 0x5c, 0x25, 0xc2, 0x7c, 0x54,
+	0xb2, 0x48, 0x7d, 0x8a, 0xaf, 0xdb, 0x71, 0x8a, 0x26, 0xbe, 0xd7, 0xe1, 0x68, 0xe7, 0xc4, 0x27,
+	0x9c, 0x8b, 0x99, 0xf4, 0x4d, 0xe8, 0xa3, 0x1b, 0xce, 0x5d, 0xea, 0x54, 0x4c, 0xd7, 0x64, 0x2e,
+	0xc3, 0x2e, 0x96, 0x4c, 0x80, 0x9b, 0x8f, 0x6c, 0x47, 0xb3, 0x1c, 0x16, 0x7e, 0x3d, 0x51, 0xe1,
+	0xc7, 0x1b, 0xa3, 0x94, 0xc5, 0x1d, 0x94, 0x2b, 0x90, 0x52, 0xeb, 0x06, 0x3d, 0x4a, 0xf2, 0xe2,
+	0x8d, 0xe1, 0x99, 0x15, 0x63, 0xf2, 0xf7, 0x10, 0x8c, 0xaf, 0xd5, 0x4a, 0xad, 0x9d, 0xe0, 0x2b,
+	0xbb, 0x8d, 0x56, 0x7f, 0x7f, 0x16, 0xcf, 0x43, 0xb2, 0x4e, 0xe5, 0xb3, 0xfc, 0x9c, 0x88, 0xca,
+	0xcf, 0x2a, 0x30, 0x72, 0xf7, 0xb7, 0xfc, 0x08, 0xc1, 0x24, 0xd3, 0xae, 0x7d, 0xfb, 0xae, 0x4d,
+	0xa3, 0x15, 0xed, 0x79, 0xa3, 0xf5, 0xe9, 0xa0, 0x7c, 0x88, 0xe0, 0x55, 0x06, 0xa5, 0x53, 0x6f,
+	0xd0, 0x80, 0x89, 0xd0, 0x87, 0x11, 0x0e, 0xe7, 0x4c, 0x14, 0x9c, 0x30, 0xd9, 0x0c, 0xd0, 0xb8,
+	0x19, 0x32, 0xf5, 0x74, 0x90, 0xbe, 0x85, 0x60, 0x8c, 0x41, 0xf2, 0x37, 0x1f, 0x77, 0xda, 0xc4,
+	0x68, 0xd7, 0x6d, 0xe2, 0xa7, 0xd3, 0xec, 0x9f, 0x08, 0x24, 0xae, 0x19, 0x5f, 0xec, 0xba, 0x66,
+	0x6d, 0x36, 0xad, 0xfc, 0x39, 0xd8, 0xe7, 0x7f, 0x42, 0xe2, 0x8a, 0x46, 0x46, 0xbd, 0x4f, 0x1a,
+	0xd3, 0x77, 0xc4, 0xf6, 0x8e, 0x3d, 0x95, 0xda, 0xf8, 0xd3, 0xdd, 0xa5, 0x0e, 0x4f, 0xd6, 0xc8,
+	0xfe, 0xfe, 0x18, 0xec, 0x13, 0xda, 0x2d, 0x50, 0x7d, 0xf1, 0x2f, 0x10, 0x0c, 0x7b, 0xdf, 0x05,
+	0xf0, 0x6c, 0x14, 0xbc, 0x90, 0x57, 0x04, 0x29, 0xe6, 0xe6, 0xc9, 0xf9, 0x86, 0x32, 0xc2, 0x72,
+	0xca, 0x34, 0xdb, 0xc1, 0xf7, 0x3e, 0xfa, 0xf3, 0xc3, 0x44, 0x5a, 0x3e, 0x92, 0xd9, 0x9a, 0xc9,
+	0xbc, 0xcb, 0x66, 0xce, 0x7b, 0x7d, 0xd0, 0xce, 0x9c, 0x78, 0xc0, 0x1f, 0xe5, 0xec, 0x9c, 0xd8,
+	0xf5, 0xdf, 0x20, 0x18, 0xf1, 0x3d, 0x4c, 0xe1, 0x33, 0xf1, 0x94, 0xf6, 0x67, 0x2f, 0x29, 0x6e,
+	0xb2, 0x92, 0x6f, 0x37, 0x94, 0x83, 0x5c, 0xed, 0x9d, 0x27, 0x2b, 0xf1, 0x93, 0x42, 0xc8, 0xc9,
+	0x99, 0x0e, 0x10, 0x04, 0x02, 0x17, 0x8c, 0x28, 0xf6, 0x72, 0xcd, 0xe4, 0xf7, 0xa3, 0x04, 0xa4,
+	0xda, 0x3d, 0x4e, 0xe1, 0x8b, 0xf1, 0x90, 0xb5, 0xcd, 0x7c, 0xd2, 0x2e, 0x92, 0x9b, 0xfc, 0x0d,
+	0xd4, 0x50, 0x8e, 0x70, 0xc0, 0xcd, 0x17, 0xac, 0xe9, 0x90, 0x04, 0xda, 0x50, 0x24, 0x4e, 0x16,
+	0x32, 0x49, 0x0d, 0xb3, 0x24, 0x9f, 0xee, 0xb8, 0xb7, 0x21, 0x1d, 0x9b, 0x5c, 0x58, 0xaa, 0xc6,
+	0xbf, 0x44, 0x90, 0x6a, 0xf7, 0x24, 0x14, 0x6d, 0xa5, 0x88, 0xc7, 0x24, 0xa9, 0xb5, 0x07, 0xb7,
+	0x58, 0xad, 0x39, 0xdb, 0xf2, 0xc5, 0x86, 0x42, 0x8f, 0x7e, 0x8a, 0x25, 0x7b, 0x82, 0x61, 0x71,
+	0x07, 0x5a, 0xb6, 0x38, 0x04, 0x48, 0xe6, 0xc4, 0x03, 0xfc, 0x4d, 0x04, 0xc3, 0x4b, 0xc4, 0xb9,
+	0xaa, 0x55, 0x57, 0xe8, 0xf3, 0x30, 0x96, 0xc5, 0x4a, 0xba, 0x56, 0xa5, 0xfd, 0x46, 0xcf, 0xa4,
+	0xd0, 0x66, 0x22, 0x40, 0xc3, 0x66, 0xe5, 0xcf, 0x36, 0x94, 0x66, 0xfd, 0xc7, 0xbd, 0xee, 0x2c,
+	0x55, 0x48, 0x0c, 0x76, 0xf0, 0xbb, 0x5c, 0xd9, 0xb3, 0x4e, 0x0e, 0x9d, 0xc0, 0x8f, 0x11, 0x4c,
+	0x84, 0xbe, 0x78, 0xe1, 0xcf, 0x44, 0xb6, 0x48, 0x3b, 0x3c, 0x94, 0xed, 0xca, 0xdf, 0xfc, 0x56,
+	0xc6, 0xdd, 0x5b, 0xf9, 0x09, 0x82, 0x97, 0xda, 0x3c, 0xa8, 0xe1, 0x0b, 0x31, 0xe0, 0x74, 0x38,
+	0x6d, 0xa5, 0x5d, 0x1d, 0xa7, 0xf2, 0x05, 0x2f, 0xa4, 0x19, 0x9c, 0x69, 0x0f, 0x29, 0xec, 0xc8,
+	0x7d, 0x80, 0xbf, 0x8b, 0x60, 0xa8, 0xf9, 0x60, 0x87, 0x4f, 0xc7, 0xc0, 0xb0, 0xbb, 0x8c, 0x3c,
+	0xeb, 0xd5, 0xf3, 0x18, 0x3e, 0xd2, 0x5e, 0xcf, 0x1d, 0x5f, 0xc2, 0xef, 0x8b, 0x46, 0x3b, 0xeb,
+	0x65, 0xe0, 0x6c, 0xac, 0xa6, 0xba, 0xaf, 0x65, 0x28, 0xcd, 0x76, 0xc5, 0xc3, 0xae, 0x46, 0xf2,
+	0x19, 0x7e, 0x5e, 0xbc, 0xd1, 0x31, 0xa7, 0xb0, 0x76, 0x57, 0x8e, 0xbe, 0x4e, 0xb8, 0xae, 0xfe,
+	0x21, 0x82, 0x11, 0xdf, 0x43, 0x48, 0xf4, 0x79, 0x11, 0xf6, 0x12, 0x25, 0x9d, 0xed, 0x92, 0x8b,
+	0x2b, 0xad, 0x36, 0x94, 0xfd, 0x3c, 0x4b, 0x8a, 0x57, 0x17, 0x5f, 0xf4, 0x76, 0x71, 0x66, 0x34,
+	0x21, 0xfd, 0x00, 0x01, 0xec, 0x34, 0x93, 0xf0, 0x4c, 0x37, 0xbd, 0xa8, 0x98, 0x71, 0xda, 0xda,
+	0xbe, 0x92, 0x4f, 0x52, 0xbd, 0x8f, 0xe2, 0xd7, 0x62, 0x98, 0x1f, 0x7f, 0x80, 0x60, 0xd8, 0x7b,
+	0x95, 0x8d, 0xae, 0x2c, 0x42, 0x1a, 0x56, 0xd1, 0xd1, 0x17, 0x76, 0x85, 0x96, 0xcf, 0xf9, 0xc2,
+	0x2e, 0xbe, 0x81, 0xf1, 0x9f, 0x10, 0xbc, 0xd4, 0xe6, 0xdd, 0x22, 0x3a, 0x91, 0x74, 0x7e, 0xa1,
+	0x91, 0x2e, 0xee, 0x9a, 0x9f, 0xa3, 0x52, 0x1a, 0x0a, 0xbf, 0x91, 0xf9, 0x12, 0x65, 0x17, 0x47,
+	0x2b, 0xfe, 0x29, 0x82, 0xa4, 0xe7, 0x01, 0x01, 0xc7, 0xf2, 0x02, 0xff, 0x8b, 0x88, 0x34, 0xdb,
+	0x15, 0x0f, 0xd7, 0xfd, 0xac, 0x5f, 0x77, 0x91, 0x69, 0x22, 0x4a, 0x3e, 0xfc, 0xd5, 0x04, 0x1c,
+	0x68, 0xb9, 0xe8, 0xe2, 0xb9, 0x28, 0x0d, 0xda, 0xdd, 0x8d, 0xa5, 0x43, 0x82, 0xd3, 0xf3, 0xbf,
+	0xac, 0xf4, 0x0d, 0xf1, 0xbf, 0x2c, 0xf9, 0xdb, 0xe8, 0xb1, 0xf2, 0x16, 0xcc, 0x75, 0x2f, 0x9d,
+	0x77, 0xf4, 0x26, 0x42, 0xab, 0x08, 0x3f, 0xf4, 0xb3, 0x11, 0x15, 0x11, 0xcf, 0x5e, 0x56, 0xdd,
+	0x68, 0xca, 0x77, 0x23, 0xfe, 0x09, 0x82, 0xfd, 0x81, 0xce, 0x06, 0xfe, 0x54, 0xf4, 0x55, 0x24,
+	0xac, 0x15, 0x12, 0xbf, 0xf0, 0xbd, 0xd5, 0x50, 0x26, 0xdc, 0xc3, 0x60, 0x9a, 0x76, 0x2d, 0xa6,
+	0x77, 0xee, 0x1d, 0x14, 0xc9, 0x79, 0x79, 0x2e, 0xc6, 0x71, 0xd1, 0x0c, 0x2e, 0xb7, 0x0a, 0xb1,
+	0x89, 0x43, 0x35, 0x71, 0x11, 0x7d, 0x1f, 0xc1, 0xf0, 0x6a, 0xa7, 0xd2, 0x68, 0x35, 0x7e, 0x69,
+	0xe4, 0xe6, 0x58, 0x51, 0x05, 0x4d, 0xb3, 0x3f, 0xe2, 0x75, 0x5d, 0x21, 0xd9, 0x81, 0x0a, 0xe9,
+	0x11, 0x02, 0x7c, 0x93, 0xd8, 0x74, 0x90, 0x58, 0x55, 0xdd, 0xb6, 0x5d, 0x1e, 0x7c, 0x3c, 0xa0,
+	0x41, 0x2b, 0x89, 0xd0, 0xf5, 0x8d, 0x18, 0x94, 0x3c, 0x3c, 0x3e, 0xdf, 0x50, 0xc6, 0x77, 0xf4,
+	0xdf, 0x21, 0xa0, 0x20, 0x2e, 0xc9, 0xf3, 0xb1, 0x41, 0x38, 0x2d, 0x6b, 0xb8, 0x50, 0x7e, 0x85,
+	0x60, 0xc4, 0xd7, 0xc0, 0x89, 0x3e, 0x01, 0xc3, 0xfa, 0x3d, 0xf1, 0x1d, 0x47, 0x6d, 0x28, 0x03,
+	0xde, 0xfb, 0xd1, 0xe5, 0xec, 0x39, 0x0a, 0x41, 0xfc, 0x71, 0xb4, 0x0b, 0x97, 0x69, 0xde, 0x93,
+	0x7e, 0x92, 0x80, 0x54, 0xbb, 0x3e, 0x4f, 0xf4, 0x0d, 0x20, 0xa2, 0x43, 0xb4, 0xab, 0xba, 0xf5,
+	0x3b, 0xa8, 0xa1, 0x8c, 0x85, 0x5e, 0x8b, 0x26, 0x43, 0x46, 0xa7, 0x3d, 0x77, 0x7e, 0x6a, 0x94,
+	0x5b, 0xd9, 0x3c, 0x8b, 0x9f, 0x90, 0xff, 0xc7, 0x76, 0x51, 0xfd, 0x86, 0xdf, 0x97, 0x1e, 0x26,
+	0x44, 0x77, 0x23, 0xb4, 0x2a, 0x56, 0xe2, 0xd9, 0x6b, 0xef, 0x0b, 0xe3, 0x2f, 0x37, 0x94, 0xf0,
+	0xee, 0x15, 0x35, 0xc9, 0x3b, 0xd9, 0x45, 0x6a, 0x92, 0xf0, 0x3f, 0xfe, 0xc6, 0xaf, 0x9f, 0x73,
+	0xe1, 0x6b, 0xd0, 0x76, 0x87, 0xb7, 0x1b, 0x15, 0x5d, 0x94, 0x84, 0xf4, 0xae, 0xba, 0x69, 0x77,
+	0xf4, 0x7b, 0xae, 0x6b, 0x67, 0xb3, 0x27, 0x29, 0x38, 0xfe, 0x27, 0xe3, 0x88, 0x2a, 0xbb, 0xd9,
+	0xee, 0xf8, 0x6d, 0xa2, 0xd9, 0x41, 0xf3, 0x75, 0x91, 0x72, 0x31, 0x55, 0x0f, 0x69, 0x6e, 0x49,
+	0xdd, 0x35, 0xb1, 0xe4, 0xc7, 0xa8, 0xa1, 0x04, 0xba, 0x61, 0x14, 0xd1, 0x07, 0x28, 0x7b, 0x89,
+	0x41, 0xf2, 0xff, 0xd9, 0x3a, 0x14, 0x1a, 0x3b, 0xd8, 0x5c, 0x8c, 0x5e, 0xd9, 0x0f, 0x72, 0x01,
+	0xc1, 0x6f, 0xbf, 0x93, 0xbd, 0x16, 0x5b, 0x66, 0x58, 0xca, 0x88, 0x90, 0x2f, 0xbd, 0xf5, 0x58,
+	0x39, 0xd4, 0xb1, 0xeb, 0xff, 0x3b, 0x25, 0x7d, 0xd7, 0x71, 0x6a, 0x76, 0x2e, 0x93, 0xb9, 0x77,
+	0xef, 0x5e, 0xb0, 0x43, 0xae, 0xd5, 0x9d, 0xbb, 0xec, 0xff, 0xe3, 0xa7, 0x6a, 0x15, 0xcd, 0xd9,
+	0x30, 0xad, 0xea, 0xe5, 0x06, 0x02, 0xb9, 0x68, 0x56, 0x23, 0x8c, 0xba, 0x82, 0xde, 0xbe, 0xc6,
+	0x29, 0xca, 0x66, 0x45, 0x33, 0xca, 0x69, 0xd3, 0x2a, 0x67, 0xca, 0xc4, 0xa0, 0xe5, 0x42, 0x66,
+	0x67, 0x9d, 0x76, 0x7f, 0x4f, 0x9f, 0xf7, 0x8f, 0xfc, 0x38, 0x71, 0x78, 0x89, 0x89, 0x5b, 0xa0,
+	0x0b, 0xfa, 0x5b, 0x7b, 0xe9, 0xf5, 0x99, 0xc7, 0x82, 0xe0, 0x36, 0x25, 0xb8, 0xed, 0x27, 0xb8,
+	0xbd, 0x3e, 0xf3, 0xb7, 0xc4, 0xab, 0x8c, 0x20, 0x97, 0xa3, 0x14, 0xb9, 0x9c, 0x9f, 0x24, 0x97,
+	0x5b, 0x9f, 0x59, 0x79, 0xe1, 0x4e, 0x3f, 0x55, 0x70, 0xf6, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0x46, 0x4e, 0xfd, 0x02, 0x56, 0x31, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -2291,8 +2645,14 @@
 	// Creates a finding. The corresponding source must exist for finding creation
 	// to succeed.
 	CreateFinding(ctx context.Context, in *CreateFindingRequest, opts ...grpc.CallOption) (*Finding, error)
+	// Creates a notification config.
+	CreateNotificationConfig(ctx context.Context, in *CreateNotificationConfigRequest, opts ...grpc.CallOption) (*NotificationConfig, error)
+	// Deletes a notification config.
+	DeleteNotificationConfig(ctx context.Context, in *DeleteNotificationConfigRequest, opts ...grpc.CallOption) (*empty.Empty, error)
 	// Gets the access control policy on the specified Source.
 	GetIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error)
+	// Gets a notification config.
+	GetNotificationConfig(ctx context.Context, in *GetNotificationConfigRequest, opts ...grpc.CallOption) (*NotificationConfig, error)
 	// Gets the settings for an organization.
 	GetOrganizationSettings(ctx context.Context, in *GetOrganizationSettingsRequest, opts ...grpc.CallOption) (*OrganizationSettings, error)
 	// Gets a source.
@@ -2313,6 +2673,8 @@
 	// To list across all sources provide a `-` as the source id.
 	// Example: /v1/organizations/{organization_id}/sources/-/findings
 	ListFindings(ctx context.Context, in *ListFindingsRequest, opts ...grpc.CallOption) (*ListFindingsResponse, error)
+	// Lists notification configs.
+	ListNotificationConfigs(ctx context.Context, in *ListNotificationConfigsRequest, opts ...grpc.CallOption) (*ListNotificationConfigsResponse, error)
 	// Lists all sources belonging to an organization.
 	ListSources(ctx context.Context, in *ListSourcesRequest, opts ...grpc.CallOption) (*ListSourcesResponse, error)
 	// Runs asset discovery. The discovery is tracked with a long-running
@@ -2331,6 +2693,9 @@
 	// Creates or updates a finding. The corresponding source must exist for a
 	// finding creation to succeed.
 	UpdateFinding(ctx context.Context, in *UpdateFindingRequest, opts ...grpc.CallOption) (*Finding, error)
+	//
+	// Updates a notification config.
+	UpdateNotificationConfig(ctx context.Context, in *UpdateNotificationConfigRequest, opts ...grpc.CallOption) (*NotificationConfig, error)
 	// Updates an organization's settings.
 	UpdateOrganizationSettings(ctx context.Context, in *UpdateOrganizationSettingsRequest, opts ...grpc.CallOption) (*OrganizationSettings, error)
 	// Updates a source.
@@ -2365,6 +2730,24 @@
 	return out, nil
 }
 
+func (c *securityCenterClient) CreateNotificationConfig(ctx context.Context, in *CreateNotificationConfigRequest, opts ...grpc.CallOption) (*NotificationConfig, error) {
+	out := new(NotificationConfig)
+	err := c.cc.Invoke(ctx, "/google.cloud.securitycenter.v1.SecurityCenter/CreateNotificationConfig", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *securityCenterClient) DeleteNotificationConfig(ctx context.Context, in *DeleteNotificationConfigRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
+	out := new(empty.Empty)
+	err := c.cc.Invoke(ctx, "/google.cloud.securitycenter.v1.SecurityCenter/DeleteNotificationConfig", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *securityCenterClient) GetIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) {
 	out := new(v1.Policy)
 	err := c.cc.Invoke(ctx, "/google.cloud.securitycenter.v1.SecurityCenter/GetIamPolicy", in, out, opts...)
@@ -2374,6 +2757,15 @@
 	return out, nil
 }
 
+func (c *securityCenterClient) GetNotificationConfig(ctx context.Context, in *GetNotificationConfigRequest, opts ...grpc.CallOption) (*NotificationConfig, error) {
+	out := new(NotificationConfig)
+	err := c.cc.Invoke(ctx, "/google.cloud.securitycenter.v1.SecurityCenter/GetNotificationConfig", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *securityCenterClient) GetOrganizationSettings(ctx context.Context, in *GetOrganizationSettingsRequest, opts ...grpc.CallOption) (*OrganizationSettings, error) {
 	out := new(OrganizationSettings)
 	err := c.cc.Invoke(ctx, "/google.cloud.securitycenter.v1.SecurityCenter/GetOrganizationSettings", in, out, opts...)
@@ -2428,6 +2820,15 @@
 	return out, nil
 }
 
+func (c *securityCenterClient) ListNotificationConfigs(ctx context.Context, in *ListNotificationConfigsRequest, opts ...grpc.CallOption) (*ListNotificationConfigsResponse, error) {
+	out := new(ListNotificationConfigsResponse)
+	err := c.cc.Invoke(ctx, "/google.cloud.securitycenter.v1.SecurityCenter/ListNotificationConfigs", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *securityCenterClient) ListSources(ctx context.Context, in *ListSourcesRequest, opts ...grpc.CallOption) (*ListSourcesResponse, error) {
 	out := new(ListSourcesResponse)
 	err := c.cc.Invoke(ctx, "/google.cloud.securitycenter.v1.SecurityCenter/ListSources", in, out, opts...)
@@ -2482,6 +2883,15 @@
 	return out, nil
 }
 
+func (c *securityCenterClient) UpdateNotificationConfig(ctx context.Context, in *UpdateNotificationConfigRequest, opts ...grpc.CallOption) (*NotificationConfig, error) {
+	out := new(NotificationConfig)
+	err := c.cc.Invoke(ctx, "/google.cloud.securitycenter.v1.SecurityCenter/UpdateNotificationConfig", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *securityCenterClient) UpdateOrganizationSettings(ctx context.Context, in *UpdateOrganizationSettingsRequest, opts ...grpc.CallOption) (*OrganizationSettings, error) {
 	out := new(OrganizationSettings)
 	err := c.cc.Invoke(ctx, "/google.cloud.securitycenter.v1.SecurityCenter/UpdateOrganizationSettings", in, out, opts...)
@@ -2516,8 +2926,14 @@
 	// Creates a finding. The corresponding source must exist for finding creation
 	// to succeed.
 	CreateFinding(context.Context, *CreateFindingRequest) (*Finding, error)
+	// Creates a notification config.
+	CreateNotificationConfig(context.Context, *CreateNotificationConfigRequest) (*NotificationConfig, error)
+	// Deletes a notification config.
+	DeleteNotificationConfig(context.Context, *DeleteNotificationConfigRequest) (*empty.Empty, error)
 	// Gets the access control policy on the specified Source.
 	GetIamPolicy(context.Context, *v1.GetIamPolicyRequest) (*v1.Policy, error)
+	// Gets a notification config.
+	GetNotificationConfig(context.Context, *GetNotificationConfigRequest) (*NotificationConfig, error)
 	// Gets the settings for an organization.
 	GetOrganizationSettings(context.Context, *GetOrganizationSettingsRequest) (*OrganizationSettings, error)
 	// Gets a source.
@@ -2538,6 +2954,8 @@
 	// To list across all sources provide a `-` as the source id.
 	// Example: /v1/organizations/{organization_id}/sources/-/findings
 	ListFindings(context.Context, *ListFindingsRequest) (*ListFindingsResponse, error)
+	// Lists notification configs.
+	ListNotificationConfigs(context.Context, *ListNotificationConfigsRequest) (*ListNotificationConfigsResponse, error)
 	// Lists all sources belonging to an organization.
 	ListSources(context.Context, *ListSourcesRequest) (*ListSourcesResponse, error)
 	// Runs asset discovery. The discovery is tracked with a long-running
@@ -2556,6 +2974,9 @@
 	// Creates or updates a finding. The corresponding source must exist for a
 	// finding creation to succeed.
 	UpdateFinding(context.Context, *UpdateFindingRequest) (*Finding, error)
+	//
+	// Updates a notification config.
+	UpdateNotificationConfig(context.Context, *UpdateNotificationConfigRequest) (*NotificationConfig, error)
 	// Updates an organization's settings.
 	UpdateOrganizationSettings(context.Context, *UpdateOrganizationSettingsRequest) (*OrganizationSettings, error)
 	// Updates a source.
@@ -2574,9 +2995,18 @@
 func (*UnimplementedSecurityCenterServer) CreateFinding(ctx context.Context, req *CreateFindingRequest) (*Finding, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method CreateFinding not implemented")
 }
+func (*UnimplementedSecurityCenterServer) CreateNotificationConfig(ctx context.Context, req *CreateNotificationConfigRequest) (*NotificationConfig, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreateNotificationConfig not implemented")
+}
+func (*UnimplementedSecurityCenterServer) DeleteNotificationConfig(ctx context.Context, req *DeleteNotificationConfigRequest) (*empty.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteNotificationConfig not implemented")
+}
 func (*UnimplementedSecurityCenterServer) GetIamPolicy(ctx context.Context, req *v1.GetIamPolicyRequest) (*v1.Policy, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented")
 }
+func (*UnimplementedSecurityCenterServer) GetNotificationConfig(ctx context.Context, req *GetNotificationConfigRequest) (*NotificationConfig, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetNotificationConfig not implemented")
+}
 func (*UnimplementedSecurityCenterServer) GetOrganizationSettings(ctx context.Context, req *GetOrganizationSettingsRequest) (*OrganizationSettings, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetOrganizationSettings not implemented")
 }
@@ -2595,6 +3025,9 @@
 func (*UnimplementedSecurityCenterServer) ListFindings(ctx context.Context, req *ListFindingsRequest) (*ListFindingsResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method ListFindings not implemented")
 }
+func (*UnimplementedSecurityCenterServer) ListNotificationConfigs(ctx context.Context, req *ListNotificationConfigsRequest) (*ListNotificationConfigsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListNotificationConfigs not implemented")
+}
 func (*UnimplementedSecurityCenterServer) ListSources(ctx context.Context, req *ListSourcesRequest) (*ListSourcesResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method ListSources not implemented")
 }
@@ -2613,6 +3046,9 @@
 func (*UnimplementedSecurityCenterServer) UpdateFinding(ctx context.Context, req *UpdateFindingRequest) (*Finding, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method UpdateFinding not implemented")
 }
+func (*UnimplementedSecurityCenterServer) UpdateNotificationConfig(ctx context.Context, req *UpdateNotificationConfigRequest) (*NotificationConfig, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateNotificationConfig not implemented")
+}
 func (*UnimplementedSecurityCenterServer) UpdateOrganizationSettings(ctx context.Context, req *UpdateOrganizationSettingsRequest) (*OrganizationSettings, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method UpdateOrganizationSettings not implemented")
 }
@@ -2663,6 +3099,42 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _SecurityCenter_CreateNotificationConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateNotificationConfigRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SecurityCenterServer).CreateNotificationConfig(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.securitycenter.v1.SecurityCenter/CreateNotificationConfig",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SecurityCenterServer).CreateNotificationConfig(ctx, req.(*CreateNotificationConfigRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SecurityCenter_DeleteNotificationConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteNotificationConfigRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SecurityCenterServer).DeleteNotificationConfig(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.securitycenter.v1.SecurityCenter/DeleteNotificationConfig",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SecurityCenterServer).DeleteNotificationConfig(ctx, req.(*DeleteNotificationConfigRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _SecurityCenter_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(v1.GetIamPolicyRequest)
 	if err := dec(in); err != nil {
@@ -2681,6 +3153,24 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _SecurityCenter_GetNotificationConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetNotificationConfigRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SecurityCenterServer).GetNotificationConfig(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.securitycenter.v1.SecurityCenter/GetNotificationConfig",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SecurityCenterServer).GetNotificationConfig(ctx, req.(*GetNotificationConfigRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _SecurityCenter_GetOrganizationSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(GetOrganizationSettingsRequest)
 	if err := dec(in); err != nil {
@@ -2789,6 +3279,24 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _SecurityCenter_ListNotificationConfigs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListNotificationConfigsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SecurityCenterServer).ListNotificationConfigs(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.securitycenter.v1.SecurityCenter/ListNotificationConfigs",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SecurityCenterServer).ListNotificationConfigs(ctx, req.(*ListNotificationConfigsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _SecurityCenter_ListSources_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(ListSourcesRequest)
 	if err := dec(in); err != nil {
@@ -2897,6 +3405,24 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _SecurityCenter_UpdateNotificationConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UpdateNotificationConfigRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SecurityCenterServer).UpdateNotificationConfig(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.securitycenter.v1.SecurityCenter/UpdateNotificationConfig",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SecurityCenterServer).UpdateNotificationConfig(ctx, req.(*UpdateNotificationConfigRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _SecurityCenter_UpdateOrganizationSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(UpdateOrganizationSettingsRequest)
 	if err := dec(in); err != nil {
@@ -2964,10 +3490,22 @@
 			Handler:    _SecurityCenter_CreateFinding_Handler,
 		},
 		{
+			MethodName: "CreateNotificationConfig",
+			Handler:    _SecurityCenter_CreateNotificationConfig_Handler,
+		},
+		{
+			MethodName: "DeleteNotificationConfig",
+			Handler:    _SecurityCenter_DeleteNotificationConfig_Handler,
+		},
+		{
 			MethodName: "GetIamPolicy",
 			Handler:    _SecurityCenter_GetIamPolicy_Handler,
 		},
 		{
+			MethodName: "GetNotificationConfig",
+			Handler:    _SecurityCenter_GetNotificationConfig_Handler,
+		},
+		{
 			MethodName: "GetOrganizationSettings",
 			Handler:    _SecurityCenter_GetOrganizationSettings_Handler,
 		},
@@ -2992,6 +3530,10 @@
 			Handler:    _SecurityCenter_ListFindings_Handler,
 		},
 		{
+			MethodName: "ListNotificationConfigs",
+			Handler:    _SecurityCenter_ListNotificationConfigs_Handler,
+		},
+		{
 			MethodName: "ListSources",
 			Handler:    _SecurityCenter_ListSources_Handler,
 		},
@@ -3016,6 +3558,10 @@
 			Handler:    _SecurityCenter_UpdateFinding_Handler,
 		},
 		{
+			MethodName: "UpdateNotificationConfig",
+			Handler:    _SecurityCenter_UpdateNotificationConfig_Handler,
+		},
+		{
 			MethodName: "UpdateOrganizationSettings",
 			Handler:    _SecurityCenter_UpdateOrganizationSettings_Handler,
 		},
diff --git a/googleapis/cloud/securitycenter/v1/source.pb.go b/googleapis/cloud/securitycenter/v1/source.pb.go
index 83eea32..58dfe5e 100644
--- a/googleapis/cloud/securitycenter/v1/source.pb.go
+++ b/googleapis/cloud/securitycenter/v1/source.pb.go
@@ -106,25 +106,25 @@
 }
 
 var fileDescriptor_43f5cbeb6a51b224 = []byte{
-	// 312 bytes of a gzipped FileDescriptorProto
+	// 313 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xd1, 0x4a, 0xc3, 0x30,
 	0x14, 0x86, 0xe9, 0x94, 0x81, 0x99, 0x57, 0xbd, 0x9a, 0x43, 0xc6, 0x36, 0xbc, 0x10, 0xc4, 0x84,
 	0xe2, 0x5d, 0xbc, 0xd2, 0x5d, 0x78, 0x23, 0x22, 0x0e, 0x87, 0x48, 0x41, 0x62, 0x1a, 0x42, 0xa0,
 	0xcd, 0x29, 0x49, 0x3b, 0x98, 0x63, 0x2f, 0xe4, 0x2b, 0xf8, 0x06, 0x3e, 0x82, 0x8f, 0xb0, 0xa7,
-	0x90, 0x25, 0x91, 0xb5, 0x82, 0xde, 0x9d, 0x9e, 0xff, 0xeb, 0x39, 0x1f, 0x27, 0xe8, 0x4c, 0x02,
-	0xc8, 0x5c, 0x10, 0x9e, 0x43, 0x9d, 0x11, 0x2b, 0x78, 0x6d, 0x54, 0xb5, 0xe4, 0x42, 0x57, 0xc2,
-	0x90, 0x45, 0x42, 0x2c, 0xd4, 0x86, 0x0b, 0x5c, 0x1a, 0xa8, 0x20, 0x1e, 0x7a, 0x18, 0x3b, 0x18,
-	0xb7, 0x61, 0xbc, 0x48, 0x06, 0x47, 0x61, 0x18, 0x2b, 0x15, 0x31, 0xa2, 0xf9, 0xeb, 0xe0, 0xb8,
-	0x11, 0x31, 0xad, 0xa1, 0x62, 0x95, 0x02, 0x6d, 0x7d, 0x3a, 0xf9, 0x88, 0x50, 0x77, 0xe6, 0xf0,
-	0x38, 0x46, 0xfb, 0x9a, 0x15, 0xa2, 0x1f, 0x8d, 0xa2, 0xd3, 0x83, 0x07, 0x57, 0xc7, 0x63, 0x74,
-	0x98, 0x29, 0x5b, 0xe6, 0x6c, 0xf9, 0xe2, 0xb2, 0x8e, 0xcb, 0x7a, 0xa1, 0x77, 0xb7, 0x45, 0x46,
-	0xa8, 0x97, 0x09, 0xcb, 0x8d, 0x2a, 0xb7, 0x73, 0xfb, 0x7b, 0x81, 0xd8, 0xb5, 0xe8, 0xd3, 0xe6,
-	0xea, 0x11, 0x9d, 0xfc, 0x92, 0xf6, 0x56, 0xac, 0x54, 0x16, 0x73, 0x28, 0x48, 0x70, 0x38, 0x07,
-	0x23, 0x99, 0x56, 0x6f, 0xde, 0x91, 0xac, 0x9a, 0x9f, 0xeb, 0x70, 0x12, 0x4b, 0x56, 0xbe, 0x58,
-	0x5f, 0x7f, 0x45, 0x68, 0xc2, 0xa1, 0xc0, 0xff, 0x5f, 0xe7, 0x3e, 0x7a, 0xbe, 0x0d, 0x84, 0x84,
-	0x9c, 0x69, 0x89, 0xc1, 0x48, 0x22, 0x85, 0x76, 0x27, 0x20, 0x3b, 0x93, 0xbf, 0xde, 0xe2, 0xb2,
-	0xdd, 0x79, 0xef, 0x0c, 0x6f, 0xfc, 0xb8, 0xa9, 0x5b, 0x38, 0x0b, 0xe9, 0xd4, 0x2f, 0x9c, 0x27,
-	0x9f, 0x3f, 0x40, 0xea, 0x80, 0xb4, 0x0d, 0xa4, 0xf3, 0x64, 0xd3, 0x19, 0x7b, 0x80, 0x52, 0x47,
-	0x50, 0xda, 0x46, 0x28, 0x9d, 0x27, 0xaf, 0x5d, 0xa7, 0x77, 0xf1, 0x1d, 0x00, 0x00, 0xff, 0xff,
-	0x3a, 0x3c, 0xa2, 0xf3, 0x29, 0x02, 0x00, 0x00,
+	0x90, 0x25, 0x91, 0xb5, 0x82, 0xde, 0x9d, 0xfe, 0xff, 0xd7, 0x73, 0x7e, 0xfe, 0xa0, 0x33, 0x09,
+	0x20, 0x73, 0x41, 0x78, 0x0e, 0x75, 0x46, 0xac, 0xe0, 0xb5, 0x51, 0xd5, 0x92, 0x0b, 0x5d, 0x09,
+	0x43, 0x16, 0x09, 0xb1, 0x50, 0x1b, 0x2e, 0x70, 0x69, 0xa0, 0x82, 0x78, 0xe8, 0x61, 0xec, 0x60,
+	0xdc, 0x86, 0xf1, 0x22, 0x19, 0x1c, 0x87, 0x65, 0xac, 0x54, 0x84, 0x69, 0x0d, 0x15, 0xab, 0x14,
+	0x68, 0xeb, 0xff, 0x1e, 0x1c, 0x35, 0x5c, 0x23, 0x9a, 0x8b, 0x27, 0x1f, 0x11, 0xea, 0xce, 0x9c,
+	0x10, 0xc7, 0x68, 0x5f, 0xb3, 0x42, 0xf4, 0xa3, 0x51, 0x74, 0x7a, 0xf0, 0xe0, 0xe6, 0x78, 0x8c,
+	0x0e, 0x33, 0x65, 0xcb, 0x9c, 0x2d, 0x5f, 0x9c, 0xd7, 0x71, 0x5e, 0x2f, 0x68, 0x77, 0x5b, 0x64,
+	0x84, 0x7a, 0x99, 0xb0, 0xdc, 0xa8, 0x72, 0x7b, 0xb2, 0xbf, 0x17, 0x88, 0x9d, 0x44, 0x9f, 0x36,
+	0x57, 0x8f, 0xe8, 0xe4, 0x57, 0x68, 0x1f, 0x89, 0x95, 0xca, 0x62, 0x0e, 0x05, 0x09, 0x19, 0xce,
+	0xc1, 0x48, 0xa6, 0xd5, 0x9b, 0x8f, 0x4f, 0x56, 0xcd, 0xcf, 0x75, 0xa8, 0xc4, 0x92, 0x95, 0x1f,
+	0xd6, 0xd7, 0x5f, 0x11, 0x9a, 0x70, 0x28, 0xf0, 0xff, 0xed, 0xdc, 0x47, 0xcf, 0xb7, 0x81, 0x90,
+	0x90, 0x33, 0x2d, 0x31, 0x18, 0x49, 0xa4, 0xd0, 0xae, 0x02, 0xb2, 0x4b, 0xf2, 0xd7, 0x5b, 0x5c,
+	0xb6, 0x95, 0xf7, 0xce, 0xf0, 0xc6, 0xaf, 0x9b, 0xba, 0x83, 0xb3, 0xe0, 0x4e, 0xfd, 0xc1, 0x79,
+	0xf2, 0xf9, 0x03, 0xa4, 0x0e, 0x48, 0xdb, 0x40, 0x3a, 0x4f, 0x36, 0x9d, 0xb1, 0x07, 0x28, 0x75,
+	0x04, 0xa5, 0x6d, 0x84, 0xd2, 0x79, 0xf2, 0xda, 0x75, 0xf1, 0x2e, 0xbe, 0x03, 0x00, 0x00, 0xff,
+	0xff, 0x5a, 0x2b, 0x23, 0xf9, 0x29, 0x02, 0x00, 0x00,
 }
diff --git a/googleapis/cloud/servicedirectory/v1beta1/endpoint.pb.go b/googleapis/cloud/servicedirectory/v1beta1/endpoint.pb.go
new file mode 100644
index 0000000..476e409
--- /dev/null
+++ b/googleapis/cloud/servicedirectory/v1beta1/endpoint.pb.go
@@ -0,0 +1,143 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/cloud/servicedirectory/v1beta1/endpoint.proto
+
+package servicedirectory
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An individual endpoint that provides a
+// [service][google.cloud.servicedirectory.v1beta1.Service]. The service must
+// already exist to create an endpoint.
+type Endpoint struct {
+	// Immutable. The resource name for the endpoint in the format
+	// 'projects/*/locations/*/namespaces/*/services/*/endpoints/*'.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Optional. An IPv4 or IPv6 address. Service Directory will reject bad
+	// addresses like:
+	//   "8.8.8"
+	//   "8.8.8.8:53"
+	//   "test:bad:address"
+	//   "[::1]"
+	//   "[::1]:8080"
+	// Limited to 45 characters.
+	Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"`
+	// Optional. Service Directory will reject values outside of [0, 65535].
+	Port int32 `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"`
+	// Optional. Metadata for the endpoint. This data can be consumed by service
+	// clients.  The entire metadata dictionary may contain up to 512 characters,
+	// spread accoss all key-value pairs. Metadata that goes beyond any these
+	// limits will be rejected.
+	Metadata             map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *Endpoint) Reset()         { *m = Endpoint{} }
+func (m *Endpoint) String() string { return proto.CompactTextString(m) }
+func (*Endpoint) ProtoMessage()    {}
+func (*Endpoint) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b682dd88b410ee12, []int{0}
+}
+
+func (m *Endpoint) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Endpoint.Unmarshal(m, b)
+}
+func (m *Endpoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Endpoint.Marshal(b, m, deterministic)
+}
+func (m *Endpoint) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Endpoint.Merge(m, src)
+}
+func (m *Endpoint) XXX_Size() int {
+	return xxx_messageInfo_Endpoint.Size(m)
+}
+func (m *Endpoint) XXX_DiscardUnknown() {
+	xxx_messageInfo_Endpoint.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Endpoint proto.InternalMessageInfo
+
+func (m *Endpoint) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Endpoint) GetAddress() string {
+	if m != nil {
+		return m.Address
+	}
+	return ""
+}
+
+func (m *Endpoint) GetPort() int32 {
+	if m != nil {
+		return m.Port
+	}
+	return 0
+}
+
+func (m *Endpoint) GetMetadata() map[string]string {
+	if m != nil {
+		return m.Metadata
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Endpoint)(nil), "google.cloud.servicedirectory.v1beta1.Endpoint")
+	proto.RegisterMapType((map[string]string)(nil), "google.cloud.servicedirectory.v1beta1.Endpoint.MetadataEntry")
+}
+
+func init() {
+	proto.RegisterFile("google/cloud/servicedirectory/v1beta1/endpoint.proto", fileDescriptor_b682dd88b410ee12)
+}
+
+var fileDescriptor_b682dd88b410ee12 = []byte{
+	// 401 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x41, 0x8b, 0xd4, 0x30,
+	0x18, 0x25, 0xdb, 0x1d, 0x5d, 0x23, 0x0b, 0x52, 0x04, 0xeb, 0xa0, 0x38, 0x08, 0x42, 0xbd, 0x24,
+	0xac, 0x7a, 0x90, 0x5d, 0x3c, 0xec, 0xc0, 0x1e, 0x85, 0xa5, 0xe0, 0xc5, 0x83, 0x92, 0x49, 0xbf,
+	0xad, 0xd1, 0x36, 0x5f, 0x49, 0x32, 0x85, 0xa1, 0xf4, 0x47, 0xe8, 0x61, 0x7e, 0x9f, 0x67, 0x7f,
+	0x81, 0x47, 0x69, 0x93, 0xd6, 0x71, 0x3c, 0xec, 0xdc, 0x5e, 0xbf, 0xd7, 0xf7, 0x78, 0xdf, 0xcb,
+	0x47, 0xdf, 0x14, 0x88, 0x45, 0x09, 0x5c, 0x96, 0xb8, 0xce, 0xb9, 0x05, 0xd3, 0x28, 0x09, 0xb9,
+	0x32, 0x20, 0x1d, 0x9a, 0x0d, 0x6f, 0xce, 0x56, 0xe0, 0xc4, 0x19, 0x07, 0x9d, 0xd7, 0xa8, 0xb4,
+	0x63, 0xb5, 0x41, 0x87, 0xf1, 0x0b, 0xaf, 0x62, 0x83, 0x8a, 0xed, 0xab, 0x58, 0x50, 0xcd, 0x9f,
+	0x05, 0x73, 0x51, 0x2b, 0x7e, 0xa3, 0xa0, 0xcc, 0x3f, 0xaf, 0xe0, 0x8b, 0x68, 0x14, 0x1a, 0xef,
+	0x33, 0x7f, 0xbc, 0xf3, 0x83, 0x01, 0x8b, 0x6b, 0x23, 0x21, 0x50, 0x4f, 0x76, 0x28, 0xa1, 0x35,
+	0x3a, 0xe1, 0x14, 0x6a, 0xeb, 0xd9, 0xe7, 0xdf, 0x23, 0x7a, 0x72, 0x15, 0x32, 0xc5, 0x8f, 0xe8,
+	0xb1, 0x16, 0x15, 0x24, 0x64, 0x41, 0xd2, 0x7b, 0xcb, 0xe8, 0xe7, 0xe5, 0x2c, 0x1b, 0x06, 0xf1,
+	0x53, 0x7a, 0x57, 0xe4, 0xb9, 0x01, 0x6b, 0x93, 0xa3, 0x91, 0x23, 0xd9, 0x38, 0xeb, 0x75, 0x35,
+	0x1a, 0x97, 0x44, 0x0b, 0x92, 0xce, 0x3c, 0x37, 0x0c, 0xe2, 0x4f, 0xf4, 0xa4, 0x02, 0x27, 0x72,
+	0xe1, 0x44, 0x72, 0xbc, 0x88, 0xd2, 0xfb, 0xaf, 0xde, 0xb1, 0x83, 0x36, 0x66, 0x63, 0x26, 0xf6,
+	0x3e, 0xe8, 0xaf, 0xb4, 0x33, 0x1b, 0xef, 0x3d, 0x79, 0xce, 0x2f, 0xe8, 0xe9, 0x3f, 0x7c, 0xfc,
+	0x80, 0x46, 0xdf, 0x60, 0xe3, 0x17, 0xc8, 0x7a, 0x18, 0x3f, 0xa4, 0xb3, 0x46, 0x94, 0x6b, 0xf0,
+	0xc1, 0x33, 0xff, 0x71, 0x7e, 0xf4, 0x96, 0x9c, 0x6f, 0xc9, 0xaf, 0xcb, 0x1f, 0x84, 0xa6, 0xff,
+	0x65, 0xf0, 0x09, 0x45, 0xad, 0x2c, 0x93, 0x58, 0xf1, 0xa9, 0x9e, 0x9b, 0xda, 0xe0, 0x57, 0x90,
+	0xce, 0xf2, 0x36, 0xa0, 0x8e, 0x97, 0x28, 0x7d, 0x9f, 0xbc, 0x1d, 0x61, 0xc7, 0xfb, 0xce, 0x6c,
+	0x2d, 0x24, 0x58, 0xde, 0x4e, 0xb8, 0x1b, 0x8f, 0xc2, 0xf2, 0x36, 0xa0, 0x6e, 0x3a, 0x07, 0xcb,
+	0xdb, 0x11, 0x76, 0xcb, 0x2d, 0xa1, 0x2f, 0x25, 0x56, 0x87, 0x35, 0xb5, 0x3c, 0x1d, 0xf3, 0x5d,
+	0xf7, 0x0f, 0x7a, 0x4d, 0x3e, 0x7e, 0x08, 0xba, 0x02, 0x4b, 0xa1, 0x0b, 0x86, 0xa6, 0xe0, 0x05,
+	0xe8, 0xe1, 0xb9, 0xf9, 0xdf, 0xd5, 0x6e, 0x39, 0xd4, 0x8b, 0x7d, 0xe2, 0x37, 0x21, 0xab, 0x3b,
+	0x83, 0xc9, 0xeb, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x87, 0x47, 0xb3, 0x0b, 0xec, 0x02, 0x00,
+	0x00,
+}
diff --git a/googleapis/cloud/servicedirectory/v1beta1/lookup_service.pb.go b/googleapis/cloud/servicedirectory/v1beta1/lookup_service.pb.go
new file mode 100644
index 0000000..cebf332
--- /dev/null
+++ b/googleapis/cloud/servicedirectory/v1beta1/lookup_service.pb.go
@@ -0,0 +1,276 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/cloud/servicedirectory/v1beta1/lookup_service.proto
+
+package servicedirectory
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The request message for [LookupService.ResolveService][google.cloud.servicedirectory.v1beta1.LookupService.ResolveService].
+// Looks up a service by its name, returns the service and its endpoints.
+type ResolveServiceRequest struct {
+	// Required. The name of the service to resolve.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Optional. The maximum number of endpoints to return. Defaults to 25. Maximum is 100.
+	// If a value less than one is specified, the Default is used.
+	// If a value greater than the Maximum is specified, the Maximum is used.
+	MaxEndpoints int32 `protobuf:"varint,2,opt,name=max_endpoints,json=maxEndpoints,proto3" json:"max_endpoints,omitempty"`
+	// Optional. The filter applied to the endpoints of the resolved service.
+	//
+	// General filter string syntax:
+	// <field> <operator> <value> (<logical connector>)
+	// <field> can be "name" or "metadata.<key>" for map field.
+	// <operator> can be "<, >, <=, >=, !=, =, :". Of which ":" means HAS and is
+	// roughly the same as "=".
+	// <value> must be the same data type as the field.
+	// <logical connector> can be "AND, OR, NOT".
+	//
+	// Examples of valid filters:
+	// * "metadata.owner" returns Endpoints that have a label with the
+	//   key "owner", this is the same as "metadata:owner"
+	// * "metadata.protocol=gRPC" returns Endpoints that have key/value
+	//   "protocol=gRPC"
+	// * "metadata.owner!=sd AND metadata.foo=bar" returns
+	//   Endpoints that have "owner" field in metadata with a value that is not
+	//   "sd" AND have the key/value foo=bar.
+	EndpointFilter       string   `protobuf:"bytes,3,opt,name=endpoint_filter,json=endpointFilter,proto3" json:"endpoint_filter,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ResolveServiceRequest) Reset()         { *m = ResolveServiceRequest{} }
+func (m *ResolveServiceRequest) String() string { return proto.CompactTextString(m) }
+func (*ResolveServiceRequest) ProtoMessage()    {}
+func (*ResolveServiceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3fa925bc9d6d26cd, []int{0}
+}
+
+func (m *ResolveServiceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResolveServiceRequest.Unmarshal(m, b)
+}
+func (m *ResolveServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResolveServiceRequest.Marshal(b, m, deterministic)
+}
+func (m *ResolveServiceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResolveServiceRequest.Merge(m, src)
+}
+func (m *ResolveServiceRequest) XXX_Size() int {
+	return xxx_messageInfo_ResolveServiceRequest.Size(m)
+}
+func (m *ResolveServiceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResolveServiceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResolveServiceRequest proto.InternalMessageInfo
+
+func (m *ResolveServiceRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *ResolveServiceRequest) GetMaxEndpoints() int32 {
+	if m != nil {
+		return m.MaxEndpoints
+	}
+	return 0
+}
+
+func (m *ResolveServiceRequest) GetEndpointFilter() string {
+	if m != nil {
+		return m.EndpointFilter
+	}
+	return ""
+}
+
+// The response message for [LookupService.ResolveService][google.cloud.servicedirectory.v1beta1.LookupService.ResolveService].
+type ResolveServiceResponse struct {
+	Service              *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ResolveServiceResponse) Reset()         { *m = ResolveServiceResponse{} }
+func (m *ResolveServiceResponse) String() string { return proto.CompactTextString(m) }
+func (*ResolveServiceResponse) ProtoMessage()    {}
+func (*ResolveServiceResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3fa925bc9d6d26cd, []int{1}
+}
+
+func (m *ResolveServiceResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResolveServiceResponse.Unmarshal(m, b)
+}
+func (m *ResolveServiceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResolveServiceResponse.Marshal(b, m, deterministic)
+}
+func (m *ResolveServiceResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResolveServiceResponse.Merge(m, src)
+}
+func (m *ResolveServiceResponse) XXX_Size() int {
+	return xxx_messageInfo_ResolveServiceResponse.Size(m)
+}
+func (m *ResolveServiceResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResolveServiceResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResolveServiceResponse proto.InternalMessageInfo
+
+func (m *ResolveServiceResponse) GetService() *Service {
+	if m != nil {
+		return m.Service
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ResolveServiceRequest)(nil), "google.cloud.servicedirectory.v1beta1.ResolveServiceRequest")
+	proto.RegisterType((*ResolveServiceResponse)(nil), "google.cloud.servicedirectory.v1beta1.ResolveServiceResponse")
+}
+
+func init() {
+	proto.RegisterFile("google/cloud/servicedirectory/v1beta1/lookup_service.proto", fileDescriptor_3fa925bc9d6d26cd)
+}
+
+var fileDescriptor_3fa925bc9d6d26cd = []byte{
+	// 487 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x53, 0xcd, 0x8a, 0x13, 0x41,
+	0x10, 0xa6, 0xb3, 0xfe, 0x60, 0xeb, 0xae, 0x30, 0xa0, 0xc6, 0x41, 0xd8, 0x25, 0x20, 0x66, 0x83,
+	0x76, 0xb3, 0xbb, 0xb7, 0xe8, 0x1e, 0x12, 0x71, 0x11, 0xf4, 0xb0, 0x66, 0xf1, 0xe2, 0x25, 0x74,
+	0x26, 0x95, 0x49, 0x6b, 0x4f, 0x57, 0xdb, 0xdd, 0x93, 0xac, 0x88, 0x17, 0x5f, 0xc1, 0xa3, 0xaf,
+	0xe1, 0x3b, 0x08, 0x1e, 0xf5, 0x05, 0x72, 0xf0, 0x21, 0xc4, 0x93, 0x64, 0x7a, 0x46, 0x93, 0x28,
+	0x6c, 0xf0, 0xd8, 0x7c, 0xf5, 0x7d, 0xf5, 0x55, 0xd5, 0xd7, 0xb4, 0x9d, 0x22, 0xa6, 0x0a, 0x78,
+	0xa2, 0x30, 0x1f, 0x72, 0x07, 0x76, 0x22, 0x13, 0x18, 0x4a, 0x0b, 0x89, 0x47, 0xfb, 0x86, 0x4f,
+	0xf6, 0x06, 0xe0, 0xc5, 0x1e, 0x57, 0x88, 0xaf, 0x72, 0xd3, 0x2f, 0x71, 0x66, 0x2c, 0x7a, 0x8c,
+	0x6e, 0x07, 0x2e, 0x2b, 0xb8, 0x6c, 0x95, 0xcb, 0x4a, 0x6e, 0x7c, 0xab, 0x6c, 0x21, 0x8c, 0xe4,
+	0x42, 0x6b, 0xf4, 0xc2, 0x4b, 0xd4, 0x2e, 0x88, 0xc4, 0xdb, 0x0b, 0xe8, 0x48, 0x82, 0x1a, 0xf6,
+	0x07, 0x30, 0x16, 0x13, 0x89, 0xb6, 0x2c, 0xb8, 0xb9, 0x50, 0x60, 0xc1, 0x61, 0x6e, 0x2b, 0x03,
+	0xf1, 0xc1, 0x7a, 0xe6, 0x97, 0x5c, 0xc7, 0x37, 0x16, 0xf4, 0x12, 0x25, 0x41, 0xfb, 0x00, 0x34,
+	0x3e, 0x11, 0x7a, 0xad, 0x07, 0x0e, 0xd5, 0x04, 0x4e, 0x02, 0xa3, 0x07, 0xaf, 0x73, 0x70, 0x3e,
+	0x7a, 0x48, 0xcf, 0x69, 0x91, 0x41, 0x9d, 0xec, 0x90, 0xe6, 0xa5, 0x2e, 0x9f, 0x75, 0x6a, 0x3f,
+	0x3b, 0xbb, 0xf4, 0xce, 0x5f, 0x13, 0x07, 0x65, 0x61, 0xa4, 0x63, 0x09, 0x66, 0xbc, 0x52, 0x29,
+	0xc8, 0x51, 0x93, 0x6e, 0x66, 0xe2, 0xb4, 0x0f, 0x7a, 0x68, 0x50, 0x6a, 0xef, 0xea, 0xb5, 0x1d,
+	0xd2, 0x3c, 0xdf, 0xdd, 0x98, 0x75, 0x48, 0xef, 0x4a, 0x26, 0x4e, 0x1f, 0x55, 0x40, 0x74, 0x97,
+	0x5e, 0xad, 0xaa, 0xfa, 0x23, 0xa9, 0x3c, 0xd8, 0xfa, 0x46, 0xd1, 0xb9, 0xa8, 0xdd, 0xaa, 0xb0,
+	0xa3, 0x02, 0x6a, 0x0c, 0xe8, 0xf5, 0x55, 0xd7, 0xce, 0xa0, 0x76, 0x10, 0x3d, 0xa6, 0x17, 0x4b,
+	0x8b, 0x85, 0xf3, 0xcb, 0xfb, 0x8c, 0xad, 0x75, 0x31, 0x56, 0x09, 0x55, 0xf4, 0xfd, 0xcf, 0x35,
+	0xba, 0xf9, 0xb4, 0x88, 0x40, 0x09, 0x45, 0x33, 0x42, 0xb7, 0x96, 0xdb, 0x46, 0x0f, 0xd6, 0x54,
+	0xff, 0xe7, 0x8e, 0xe3, 0xc3, 0xff, 0x64, 0x87, 0x59, 0x1b, 0xcf, 0xde, 0x7f, 0xfb, 0xfe, 0xa1,
+	0xf6, 0xa4, 0x71, 0xf4, 0xfb, 0xea, 0x6f, 0xe7, 0x5b, 0x3f, 0x34, 0x16, 0x5f, 0x42, 0xe2, 0x1d,
+	0x6f, 0x71, 0x85, 0x49, 0x48, 0x1e, 0x6f, 0xf1, 0x39, 0xe6, 0x8c, 0x48, 0x60, 0xfe, 0x28, 0x7b,
+	0x39, 0xde, 0x7a, 0xd7, 0xb6, 0x41, 0xbe, 0x4d, 0x5a, 0xf1, 0xc9, 0x97, 0xce, 0xf6, 0x19, 0x27,
+	0xfe, 0xda, 0x61, 0x63, 0xef, 0x8d, 0x6b, 0x73, 0x3e, 0x9d, 0x4e, 0x57, 0xef, 0x2f, 0x72, 0x3f,
+	0x0e, 0xd9, 0xbc, 0x67, 0x94, 0xf0, 0x23, 0xb4, 0x59, 0xf7, 0x23, 0xa1, 0xbb, 0x09, 0x66, 0xeb,
+	0x0d, 0xdb, 0x8d, 0x96, 0x96, 0x7e, 0x3c, 0x8f, 0xe9, 0x31, 0x79, 0xf1, 0xbc, 0x24, 0xa7, 0xa8,
+	0x84, 0x4e, 0x19, 0xda, 0x94, 0xa7, 0xa0, 0x8b, 0x10, 0xf3, 0x3f, 0x16, 0xce, 0xf8, 0x15, 0xf7,
+	0x57, 0x81, 0x1f, 0x84, 0x0c, 0x2e, 0x14, 0x22, 0x07, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x2e,
+	0xca, 0x4c, 0x51, 0x16, 0x04, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// LookupServiceClient is the client API for LookupService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type LookupServiceClient interface {
+	// Returns a [service][google.cloud.servicedirectory.v1beta1.Service] and its
+	// associated endpoints.
+	// Resolving a service is not considered an active developer method.
+	ResolveService(ctx context.Context, in *ResolveServiceRequest, opts ...grpc.CallOption) (*ResolveServiceResponse, error)
+}
+
+type lookupServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewLookupServiceClient(cc grpc.ClientConnInterface) LookupServiceClient {
+	return &lookupServiceClient{cc}
+}
+
+func (c *lookupServiceClient) ResolveService(ctx context.Context, in *ResolveServiceRequest, opts ...grpc.CallOption) (*ResolveServiceResponse, error) {
+	out := new(ResolveServiceResponse)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.LookupService/ResolveService", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// LookupServiceServer is the server API for LookupService service.
+type LookupServiceServer interface {
+	// Returns a [service][google.cloud.servicedirectory.v1beta1.Service] and its
+	// associated endpoints.
+	// Resolving a service is not considered an active developer method.
+	ResolveService(context.Context, *ResolveServiceRequest) (*ResolveServiceResponse, error)
+}
+
+// UnimplementedLookupServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedLookupServiceServer struct {
+}
+
+func (*UnimplementedLookupServiceServer) ResolveService(ctx context.Context, req *ResolveServiceRequest) (*ResolveServiceResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ResolveService not implemented")
+}
+
+func RegisterLookupServiceServer(s *grpc.Server, srv LookupServiceServer) {
+	s.RegisterService(&_LookupService_serviceDesc, srv)
+}
+
+func _LookupService_ResolveService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ResolveServiceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(LookupServiceServer).ResolveService(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.LookupService/ResolveService",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(LookupServiceServer).ResolveService(ctx, req.(*ResolveServiceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _LookupService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.cloud.servicedirectory.v1beta1.LookupService",
+	HandlerType: (*LookupServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ResolveService",
+			Handler:    _LookupService_ResolveService_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/cloud/servicedirectory/v1beta1/lookup_service.proto",
+}
diff --git a/googleapis/cloud/servicedirectory/v1beta1/namespace.pb.go b/googleapis/cloud/servicedirectory/v1beta1/namespace.pb.go
new file mode 100644
index 0000000..e80e826
--- /dev/null
+++ b/googleapis/cloud/servicedirectory/v1beta1/namespace.pb.go
@@ -0,0 +1,114 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/cloud/servicedirectory/v1beta1/namespace.proto
+
+package servicedirectory
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// A container for [services][google.cloud.servicedirectory.v1beta1.Service].
+// Namespaces allow administrators to group services together and define
+// permissions for a collection of services.
+type Namespace struct {
+	// Immutable. The resource name for the namespace in the format
+	// 'projects/*/locations/*/namespaces/*'.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Optional. Resource labels associated with this Namespace.
+	// No more than 64 user labels can be associated with a given resource.  Label
+	// keys and values can be no longer than 63 characters.
+	Labels               map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *Namespace) Reset()         { *m = Namespace{} }
+func (m *Namespace) String() string { return proto.CompactTextString(m) }
+func (*Namespace) ProtoMessage()    {}
+func (*Namespace) Descriptor() ([]byte, []int) {
+	return fileDescriptor_aedd900d4e39df62, []int{0}
+}
+
+func (m *Namespace) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Namespace.Unmarshal(m, b)
+}
+func (m *Namespace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Namespace.Marshal(b, m, deterministic)
+}
+func (m *Namespace) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Namespace.Merge(m, src)
+}
+func (m *Namespace) XXX_Size() int {
+	return xxx_messageInfo_Namespace.Size(m)
+}
+func (m *Namespace) XXX_DiscardUnknown() {
+	xxx_messageInfo_Namespace.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Namespace proto.InternalMessageInfo
+
+func (m *Namespace) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Namespace) GetLabels() map[string]string {
+	if m != nil {
+		return m.Labels
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Namespace)(nil), "google.cloud.servicedirectory.v1beta1.Namespace")
+	proto.RegisterMapType((map[string]string)(nil), "google.cloud.servicedirectory.v1beta1.Namespace.LabelsEntry")
+}
+
+func init() {
+	proto.RegisterFile("google/cloud/servicedirectory/v1beta1/namespace.proto", fileDescriptor_aedd900d4e39df62)
+}
+
+var fileDescriptor_aedd900d4e39df62 = []byte{
+	// 354 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x4d, 0x4b, 0xc3, 0x40,
+	0x10, 0x65, 0x53, 0x5b, 0xe8, 0x16, 0x44, 0x82, 0x60, 0x0d, 0x82, 0x45, 0x10, 0xda, 0xcb, 0x2e,
+	0x55, 0x04, 0xad, 0x22, 0xb4, 0xe0, 0x4d, 0xa4, 0x14, 0x3c, 0xe8, 0x45, 0x36, 0xdb, 0x31, 0xc6,
+	0x6e, 0x77, 0xc2, 0x6e, 0x1a, 0x28, 0xa5, 0xbf, 0xc3, 0xff, 0xe0, 0xaf, 0xf2, 0xec, 0x2f, 0xf0,
+	0x28, 0xf9, 0xe8, 0x07, 0xf5, 0x60, 0x6f, 0x2f, 0xf3, 0xf2, 0xde, 0xbc, 0x99, 0x59, 0x7a, 0x11,
+	0x20, 0x06, 0x0a, 0xb8, 0x54, 0x38, 0x19, 0x72, 0x0b, 0x26, 0x09, 0x25, 0x0c, 0x43, 0x03, 0x32,
+	0x46, 0x33, 0xe5, 0x49, 0xdb, 0x87, 0x58, 0xb4, 0xb9, 0x16, 0x63, 0xb0, 0x91, 0x90, 0xc0, 0x22,
+	0x83, 0x31, 0xba, 0xa7, 0xb9, 0x8c, 0x65, 0x32, 0xb6, 0x29, 0x63, 0x85, 0xcc, 0x3b, 0x2e, 0xdc,
+	0x45, 0x14, 0xf2, 0xd7, 0x10, 0xd4, 0xf0, 0xc5, 0x87, 0x37, 0x91, 0x84, 0x68, 0x72, 0x1f, 0xef,
+	0x70, 0xed, 0x07, 0x03, 0x16, 0x27, 0x66, 0xd1, 0xc2, 0x3b, 0x5a, 0xa3, 0x84, 0xd6, 0x18, 0x8b,
+	0x38, 0x44, 0x6d, 0x73, 0xf6, 0xe4, 0xd3, 0xa1, 0xd5, 0x87, 0x45, 0x28, 0xf7, 0x80, 0xee, 0xa4,
+	0x09, 0xeb, 0xa4, 0x41, 0x9a, 0xd5, 0x5e, 0xe9, 0xab, 0x5b, 0x1e, 0x64, 0x05, 0xf7, 0x89, 0x56,
+	0x94, 0xf0, 0x41, 0xd9, 0xba, 0xd3, 0x28, 0x35, 0x6b, 0x67, 0x37, 0x6c, 0xab, 0xe0, 0x6c, 0x69,
+	0xcd, 0xee, 0x33, 0xf9, 0x9d, 0x8e, 0xcd, 0x34, 0x35, 0x26, 0x83, 0xc2, 0xd0, 0xbb, 0xa2, 0xb5,
+	0x35, 0xce, 0xdd, 0xa3, 0xa5, 0x11, 0x4c, 0xf3, 0x04, 0x83, 0x14, 0xba, 0xfb, 0xb4, 0x9c, 0x08,
+	0x35, 0x81, 0xba, 0x93, 0xd5, 0xf2, 0x8f, 0x8e, 0x73, 0x49, 0x3a, 0xfa, 0xbb, 0x3b, 0xa2, 0xad,
+	0x3f, 0xcd, 0xf3, 0x68, 0x22, 0x0a, 0x2d, 0x93, 0x38, 0xe6, 0xab, 0xf1, 0x6e, 0x23, 0x83, 0xef,
+	0x20, 0x63, 0xcb, 0x67, 0x05, 0x9a, 0x73, 0x85, 0x32, 0x5f, 0x08, 0x9f, 0x2d, 0xe0, 0x7c, 0x75,
+	0x26, 0xcb, 0x67, 0x4b, 0x3c, 0xef, 0x7d, 0x10, 0xda, 0x92, 0x38, 0xde, 0x6e, 0xf6, 0xde, 0xee,
+	0xb2, 0x71, 0x3f, 0x5d, 0x75, 0x9f, 0x3c, 0x3f, 0x16, 0xc2, 0x00, 0x95, 0xd0, 0x01, 0x43, 0x13,
+	0xf0, 0x00, 0x74, 0x76, 0x08, 0xbe, 0x0a, 0xfd, 0xcf, 0x1b, 0xba, 0xde, 0x24, 0x7e, 0x08, 0xf1,
+	0x2b, 0x99, 0xc9, 0xf9, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x3b, 0x4e, 0xe5, 0x87, 0x02,
+	0x00, 0x00,
+}
diff --git a/googleapis/cloud/servicedirectory/v1beta1/registration_service.pb.go b/googleapis/cloud/servicedirectory/v1beta1/registration_service.pb.go
new file mode 100644
index 0000000..71ce1b2
--- /dev/null
+++ b/googleapis/cloud/servicedirectory/v1beta1/registration_service.pb.go
@@ -0,0 +1,1952 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/cloud/servicedirectory/v1beta1/registration_service.proto
+
+package servicedirectory
+
+import (
+	context "context"
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	empty "github.com/golang/protobuf/ptypes/empty"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	v1 "google.golang.org/genproto/googleapis/iam/v1"
+	field_mask "google.golang.org/genproto/protobuf/field_mask"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The request message for [RegistrationService.CreateNamespace][google.cloud.servicedirectory.v1beta1.RegistrationService.CreateNamespace].
+type CreateNamespaceRequest struct {
+	// Required. The resource name of the project and location the namespace
+	// will be created in.
+	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
+	// Required. The Resource ID must be 1-63 characters long, and comply with
+	// <a href="https://www.ietf.org/rfc/rfc1035.txt" target="_blank">RFC1035</a>.
+	// Specifically, the name must be 1-63 characters long and match the regular
+	// expression `[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?` which means the first
+	// character must be a lowercase letter, and all following characters must
+	// be a dash, lowercase letter, or digit, except the last character, which
+	// cannot be a dash.
+	NamespaceId string `protobuf:"bytes,2,opt,name=namespace_id,json=namespaceId,proto3" json:"namespace_id,omitempty"`
+	// Required. A namespace with initial fields set.
+	Namespace            *Namespace `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *CreateNamespaceRequest) Reset()         { *m = CreateNamespaceRequest{} }
+func (m *CreateNamespaceRequest) String() string { return proto.CompactTextString(m) }
+func (*CreateNamespaceRequest) ProtoMessage()    {}
+func (*CreateNamespaceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{0}
+}
+
+func (m *CreateNamespaceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateNamespaceRequest.Unmarshal(m, b)
+}
+func (m *CreateNamespaceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateNamespaceRequest.Marshal(b, m, deterministic)
+}
+func (m *CreateNamespaceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateNamespaceRequest.Merge(m, src)
+}
+func (m *CreateNamespaceRequest) XXX_Size() int {
+	return xxx_messageInfo_CreateNamespaceRequest.Size(m)
+}
+func (m *CreateNamespaceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateNamespaceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateNamespaceRequest proto.InternalMessageInfo
+
+func (m *CreateNamespaceRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *CreateNamespaceRequest) GetNamespaceId() string {
+	if m != nil {
+		return m.NamespaceId
+	}
+	return ""
+}
+
+func (m *CreateNamespaceRequest) GetNamespace() *Namespace {
+	if m != nil {
+		return m.Namespace
+	}
+	return nil
+}
+
+// The request message for [RegistrationService.ListNamespaces][google.cloud.servicedirectory.v1beta1.RegistrationService.ListNamespaces].
+type ListNamespacesRequest struct {
+	// Required. The resource name of the project and location whose namespaces we'd like to
+	// list.
+	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
+	// Optional. The maximum number of items to return.
+	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	// Optional. The next_page_token value returned from a previous List request, if any.
+	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// Optional. The filter to list result by.
+	//
+	// General filter string syntax:
+	// <field> <operator> <value> (<logical connector>)
+	// <field> can be "name", or "labels.<key>" for map field.
+	// <operator> can be "<, >, <=, >=, !=, =, :". Of which ":" means HAS, and
+	// is roughly the same as "=".
+	// <value> must be the same data type as field.
+	// <logical connector> can be "AND, OR, NOT".
+	//
+	// Examples of valid filters:
+	// * "labels.owner" returns Namespaces that have a label with the key "owner"
+	//   this is the same as "labels:owner".
+	// * "labels.protocol=gRPC" returns Namespaces that have key/value
+	//   "protocol=gRPC".
+	// * "name>projects/my-project/locations/us-east/namespaces/namespace-c"
+	//   returns Namespaces that have name that is alphabetically later than the
+	//   string, so "namespace-e" will be returned but "namespace-a" will not be.
+	// * "labels.owner!=sd AND labels.foo=bar" returns Namespaces that have
+	//   "owner" in label key but value is not "sd" AND have key/value foo=bar.
+	// * "doesnotexist.foo=bar" returns an empty list. Note that Namespace doesn't
+	//   have a field called "doesnotexist". Since the filter does not match any
+	//   Namespaces, it returns no results.
+	Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"`
+	// Optional. The order to list result by.
+	//
+	// General order by string syntax:
+	// <field> (<asc|desc>) (,)
+	// <field> allows values {"name"}
+	// <asc/desc> ascending or descending order by <field>. If this is left
+	// blank, "asc" is used.
+	// Note that an empty order_by string result in default order, which is order
+	// by name in ascending order.
+	OrderBy              string   `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListNamespacesRequest) Reset()         { *m = ListNamespacesRequest{} }
+func (m *ListNamespacesRequest) String() string { return proto.CompactTextString(m) }
+func (*ListNamespacesRequest) ProtoMessage()    {}
+func (*ListNamespacesRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{1}
+}
+
+func (m *ListNamespacesRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListNamespacesRequest.Unmarshal(m, b)
+}
+func (m *ListNamespacesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListNamespacesRequest.Marshal(b, m, deterministic)
+}
+func (m *ListNamespacesRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListNamespacesRequest.Merge(m, src)
+}
+func (m *ListNamespacesRequest) XXX_Size() int {
+	return xxx_messageInfo_ListNamespacesRequest.Size(m)
+}
+func (m *ListNamespacesRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListNamespacesRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListNamespacesRequest proto.InternalMessageInfo
+
+func (m *ListNamespacesRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *ListNamespacesRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *ListNamespacesRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *ListNamespacesRequest) GetFilter() string {
+	if m != nil {
+		return m.Filter
+	}
+	return ""
+}
+
+func (m *ListNamespacesRequest) GetOrderBy() string {
+	if m != nil {
+		return m.OrderBy
+	}
+	return ""
+}
+
+// The response message for [RegistrationService.ListNamespaces][google.cloud.servicedirectory.v1beta1.RegistrationService.ListNamespaces].
+type ListNamespacesResponse struct {
+	// The list of namespaces.
+	Namespaces []*Namespace `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"`
+	// Token to retrieve the next page of results, or empty if there are no
+	// more results in the list.
+	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListNamespacesResponse) Reset()         { *m = ListNamespacesResponse{} }
+func (m *ListNamespacesResponse) String() string { return proto.CompactTextString(m) }
+func (*ListNamespacesResponse) ProtoMessage()    {}
+func (*ListNamespacesResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{2}
+}
+
+func (m *ListNamespacesResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListNamespacesResponse.Unmarshal(m, b)
+}
+func (m *ListNamespacesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListNamespacesResponse.Marshal(b, m, deterministic)
+}
+func (m *ListNamespacesResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListNamespacesResponse.Merge(m, src)
+}
+func (m *ListNamespacesResponse) XXX_Size() int {
+	return xxx_messageInfo_ListNamespacesResponse.Size(m)
+}
+func (m *ListNamespacesResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListNamespacesResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListNamespacesResponse proto.InternalMessageInfo
+
+func (m *ListNamespacesResponse) GetNamespaces() []*Namespace {
+	if m != nil {
+		return m.Namespaces
+	}
+	return nil
+}
+
+func (m *ListNamespacesResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+// The request message for [RegistrationService.GetNamespace][google.cloud.servicedirectory.v1beta1.RegistrationService.GetNamespace].
+type GetNamespaceRequest struct {
+	// Required. The name of the namespace to retrieve.
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetNamespaceRequest) Reset()         { *m = GetNamespaceRequest{} }
+func (m *GetNamespaceRequest) String() string { return proto.CompactTextString(m) }
+func (*GetNamespaceRequest) ProtoMessage()    {}
+func (*GetNamespaceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{3}
+}
+
+func (m *GetNamespaceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetNamespaceRequest.Unmarshal(m, b)
+}
+func (m *GetNamespaceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetNamespaceRequest.Marshal(b, m, deterministic)
+}
+func (m *GetNamespaceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetNamespaceRequest.Merge(m, src)
+}
+func (m *GetNamespaceRequest) XXX_Size() int {
+	return xxx_messageInfo_GetNamespaceRequest.Size(m)
+}
+func (m *GetNamespaceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetNamespaceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetNamespaceRequest proto.InternalMessageInfo
+
+func (m *GetNamespaceRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// The request message for [RegistrationService.UpdateNamespace][google.cloud.servicedirectory.v1beta1.RegistrationService.UpdateNamespace].
+type UpdateNamespaceRequest struct {
+	// Required. The updated namespace.
+	Namespace *Namespace `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
+	// Required. List of fields to be updated in this request.
+	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UpdateNamespaceRequest) Reset()         { *m = UpdateNamespaceRequest{} }
+func (m *UpdateNamespaceRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateNamespaceRequest) ProtoMessage()    {}
+func (*UpdateNamespaceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{4}
+}
+
+func (m *UpdateNamespaceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateNamespaceRequest.Unmarshal(m, b)
+}
+func (m *UpdateNamespaceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateNamespaceRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateNamespaceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateNamespaceRequest.Merge(m, src)
+}
+func (m *UpdateNamespaceRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateNamespaceRequest.Size(m)
+}
+func (m *UpdateNamespaceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateNamespaceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateNamespaceRequest proto.InternalMessageInfo
+
+func (m *UpdateNamespaceRequest) GetNamespace() *Namespace {
+	if m != nil {
+		return m.Namespace
+	}
+	return nil
+}
+
+func (m *UpdateNamespaceRequest) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+// The request message for [RegistrationService.DeleteNamespace][google.cloud.servicedirectory.v1beta1.RegistrationService.DeleteNamespace].
+type DeleteNamespaceRequest struct {
+	// Required. The name of the namespace to delete.
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeleteNamespaceRequest) Reset()         { *m = DeleteNamespaceRequest{} }
+func (m *DeleteNamespaceRequest) String() string { return proto.CompactTextString(m) }
+func (*DeleteNamespaceRequest) ProtoMessage()    {}
+func (*DeleteNamespaceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{5}
+}
+
+func (m *DeleteNamespaceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeleteNamespaceRequest.Unmarshal(m, b)
+}
+func (m *DeleteNamespaceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeleteNamespaceRequest.Marshal(b, m, deterministic)
+}
+func (m *DeleteNamespaceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteNamespaceRequest.Merge(m, src)
+}
+func (m *DeleteNamespaceRequest) XXX_Size() int {
+	return xxx_messageInfo_DeleteNamespaceRequest.Size(m)
+}
+func (m *DeleteNamespaceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeleteNamespaceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeleteNamespaceRequest proto.InternalMessageInfo
+
+func (m *DeleteNamespaceRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// The request message for [RegistrationService.CreateService][google.cloud.servicedirectory.v1beta1.RegistrationService.CreateService].
+type CreateServiceRequest struct {
+	// Required. The resource name of the namespace this service will belong to.
+	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
+	// Required. The Resource ID must be 1-63 characters long, and comply with
+	// <a href="https://www.ietf.org/rfc/rfc1035.txt" target="_blank">RFC1035</a>.
+	// Specifically, the name must be 1-63 characters long and match the regular
+	// expression `[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?` which means the first
+	// character must be a lowercase letter, and all following characters must
+	// be a dash, lowercase letter, or digit, except the last character, which
+	// cannot be a dash.
+	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
+	// Required. A service  with initial fields set.
+	Service              *Service `protobuf:"bytes,3,opt,name=service,proto3" json:"service,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CreateServiceRequest) Reset()         { *m = CreateServiceRequest{} }
+func (m *CreateServiceRequest) String() string { return proto.CompactTextString(m) }
+func (*CreateServiceRequest) ProtoMessage()    {}
+func (*CreateServiceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{6}
+}
+
+func (m *CreateServiceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateServiceRequest.Unmarshal(m, b)
+}
+func (m *CreateServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateServiceRequest.Marshal(b, m, deterministic)
+}
+func (m *CreateServiceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateServiceRequest.Merge(m, src)
+}
+func (m *CreateServiceRequest) XXX_Size() int {
+	return xxx_messageInfo_CreateServiceRequest.Size(m)
+}
+func (m *CreateServiceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateServiceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateServiceRequest proto.InternalMessageInfo
+
+func (m *CreateServiceRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *CreateServiceRequest) GetServiceId() string {
+	if m != nil {
+		return m.ServiceId
+	}
+	return ""
+}
+
+func (m *CreateServiceRequest) GetService() *Service {
+	if m != nil {
+		return m.Service
+	}
+	return nil
+}
+
+// The request message for [RegistrationService.ListServices][google.cloud.servicedirectory.v1beta1.RegistrationService.ListServices].
+type ListServicesRequest struct {
+	// Required. The resource name of the namespace whose services we'd
+	// like to list.
+	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
+	// Optional. The maximum number of items to return.
+	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	// Optional. The next_page_token value returned from a previous List request,
+	// if any.
+	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// Optional. The filter to list result by.
+	//
+	// General filter string syntax:
+	// <field> <operator> <value> (<logical connector>)
+	// <field> can be "name", or "metadata.<key>" for map field.
+	// <operator> can be "<, >, <=, >=, !=, =, :". Of which ":" means HAS, and
+	// is roughly the same as "=".
+	// <value> must be the same data type as field.
+	// <logical connector> can be "AND, OR, NOT".
+	//
+	// Examples of valid filters:
+	// * "metadata.owner" returns Services that have a label with the key "owner"
+	//   this is the same as "metadata:owner".
+	// * "metadata.protocol=gRPC" returns Services that have key/value
+	//   "protocol=gRPC".
+	// * "name>projects/my-project/locations/us-east/namespaces/my-namespace/services/service-c"
+	//   returns Services that have name that is alphabetically later than the
+	//   string, so "service-e" will be returned but "service-a" will not be.
+	// * "metadata.owner!=sd AND metadata.foo=bar" returns Services that have
+	//   "owner" in label key but value is not "sd" AND have key/value foo=bar.
+	// * "doesnotexist.foo=bar" returns an empty list. Note that Service doesn't
+	//   have a field called "doesnotexist". Since the filter does not match any
+	//   Services, it returns no results.
+	Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"`
+	// Optional. The order to list result by.
+	OrderBy              string   `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListServicesRequest) Reset()         { *m = ListServicesRequest{} }
+func (m *ListServicesRequest) String() string { return proto.CompactTextString(m) }
+func (*ListServicesRequest) ProtoMessage()    {}
+func (*ListServicesRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{7}
+}
+
+func (m *ListServicesRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListServicesRequest.Unmarshal(m, b)
+}
+func (m *ListServicesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListServicesRequest.Marshal(b, m, deterministic)
+}
+func (m *ListServicesRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListServicesRequest.Merge(m, src)
+}
+func (m *ListServicesRequest) XXX_Size() int {
+	return xxx_messageInfo_ListServicesRequest.Size(m)
+}
+func (m *ListServicesRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListServicesRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListServicesRequest proto.InternalMessageInfo
+
+func (m *ListServicesRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *ListServicesRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *ListServicesRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *ListServicesRequest) GetFilter() string {
+	if m != nil {
+		return m.Filter
+	}
+	return ""
+}
+
+func (m *ListServicesRequest) GetOrderBy() string {
+	if m != nil {
+		return m.OrderBy
+	}
+	return ""
+}
+
+// The response message for [RegistrationService.ListServices][google.cloud.servicedirectory.v1beta1.RegistrationService.ListServices].
+type ListServicesResponse struct {
+	// The list of services.
+	Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"`
+	// Token to retrieve the next page of results, or empty if there are no
+	// more results in the list.
+	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListServicesResponse) Reset()         { *m = ListServicesResponse{} }
+func (m *ListServicesResponse) String() string { return proto.CompactTextString(m) }
+func (*ListServicesResponse) ProtoMessage()    {}
+func (*ListServicesResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{8}
+}
+
+func (m *ListServicesResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListServicesResponse.Unmarshal(m, b)
+}
+func (m *ListServicesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListServicesResponse.Marshal(b, m, deterministic)
+}
+func (m *ListServicesResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListServicesResponse.Merge(m, src)
+}
+func (m *ListServicesResponse) XXX_Size() int {
+	return xxx_messageInfo_ListServicesResponse.Size(m)
+}
+func (m *ListServicesResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListServicesResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListServicesResponse proto.InternalMessageInfo
+
+func (m *ListServicesResponse) GetServices() []*Service {
+	if m != nil {
+		return m.Services
+	}
+	return nil
+}
+
+func (m *ListServicesResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+// The request message for [RegistrationService.GetService][google.cloud.servicedirectory.v1beta1.RegistrationService.GetService].
+// This should not be used for looking up a service. Insead, use the `resolve`
+// method as it will contain all endpoints and associated metadata.
+type GetServiceRequest struct {
+	// Required. The name of the service to get.
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetServiceRequest) Reset()         { *m = GetServiceRequest{} }
+func (m *GetServiceRequest) String() string { return proto.CompactTextString(m) }
+func (*GetServiceRequest) ProtoMessage()    {}
+func (*GetServiceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{9}
+}
+
+func (m *GetServiceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetServiceRequest.Unmarshal(m, b)
+}
+func (m *GetServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetServiceRequest.Marshal(b, m, deterministic)
+}
+func (m *GetServiceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetServiceRequest.Merge(m, src)
+}
+func (m *GetServiceRequest) XXX_Size() int {
+	return xxx_messageInfo_GetServiceRequest.Size(m)
+}
+func (m *GetServiceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetServiceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetServiceRequest proto.InternalMessageInfo
+
+func (m *GetServiceRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// The request message for [RegistrationService.UpdateService][google.cloud.servicedirectory.v1beta1.RegistrationService.UpdateService].
+type UpdateServiceRequest struct {
+	// Required. The updated service.
+	Service *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"`
+	// Required. List of fields to be updated in this request.
+	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UpdateServiceRequest) Reset()         { *m = UpdateServiceRequest{} }
+func (m *UpdateServiceRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateServiceRequest) ProtoMessage()    {}
+func (*UpdateServiceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{10}
+}
+
+func (m *UpdateServiceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateServiceRequest.Unmarshal(m, b)
+}
+func (m *UpdateServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateServiceRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateServiceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateServiceRequest.Merge(m, src)
+}
+func (m *UpdateServiceRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateServiceRequest.Size(m)
+}
+func (m *UpdateServiceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateServiceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateServiceRequest proto.InternalMessageInfo
+
+func (m *UpdateServiceRequest) GetService() *Service {
+	if m != nil {
+		return m.Service
+	}
+	return nil
+}
+
+func (m *UpdateServiceRequest) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+// The request message for [RegistrationService.DeleteService][google.cloud.servicedirectory.v1beta1.RegistrationService.DeleteService].
+type DeleteServiceRequest struct {
+	// Required. The name of the service to delete.
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeleteServiceRequest) Reset()         { *m = DeleteServiceRequest{} }
+func (m *DeleteServiceRequest) String() string { return proto.CompactTextString(m) }
+func (*DeleteServiceRequest) ProtoMessage()    {}
+func (*DeleteServiceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{11}
+}
+
+func (m *DeleteServiceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeleteServiceRequest.Unmarshal(m, b)
+}
+func (m *DeleteServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeleteServiceRequest.Marshal(b, m, deterministic)
+}
+func (m *DeleteServiceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteServiceRequest.Merge(m, src)
+}
+func (m *DeleteServiceRequest) XXX_Size() int {
+	return xxx_messageInfo_DeleteServiceRequest.Size(m)
+}
+func (m *DeleteServiceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeleteServiceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeleteServiceRequest proto.InternalMessageInfo
+
+func (m *DeleteServiceRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// The request message for [RegistrationService.CreateEndpoint][google.cloud.servicedirectory.v1beta1.RegistrationService.CreateEndpoint].
+type CreateEndpointRequest struct {
+	// Required. The resource name of the service that this endpoint provides.
+	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
+	// Required. The Resource ID must be 1-63 characters long, and comply with
+	// <a href="https://www.ietf.org/rfc/rfc1035.txt" target="_blank">RFC1035</a>.
+	// Specifically, the name must be 1-63 characters long and match the regular
+	// expression `[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?` which means the first
+	// character must be a lowercase letter, and all following characters must
+	// be a dash, lowercase letter, or digit, except the last character, which
+	// cannot be a dash.
+	EndpointId string `protobuf:"bytes,2,opt,name=endpoint_id,json=endpointId,proto3" json:"endpoint_id,omitempty"`
+	// Required. A endpoint with initial fields set.
+	Endpoint             *Endpoint `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
+	XXX_unrecognized     []byte    `json:"-"`
+	XXX_sizecache        int32     `json:"-"`
+}
+
+func (m *CreateEndpointRequest) Reset()         { *m = CreateEndpointRequest{} }
+func (m *CreateEndpointRequest) String() string { return proto.CompactTextString(m) }
+func (*CreateEndpointRequest) ProtoMessage()    {}
+func (*CreateEndpointRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{12}
+}
+
+func (m *CreateEndpointRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateEndpointRequest.Unmarshal(m, b)
+}
+func (m *CreateEndpointRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateEndpointRequest.Marshal(b, m, deterministic)
+}
+func (m *CreateEndpointRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateEndpointRequest.Merge(m, src)
+}
+func (m *CreateEndpointRequest) XXX_Size() int {
+	return xxx_messageInfo_CreateEndpointRequest.Size(m)
+}
+func (m *CreateEndpointRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateEndpointRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateEndpointRequest proto.InternalMessageInfo
+
+func (m *CreateEndpointRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *CreateEndpointRequest) GetEndpointId() string {
+	if m != nil {
+		return m.EndpointId
+	}
+	return ""
+}
+
+func (m *CreateEndpointRequest) GetEndpoint() *Endpoint {
+	if m != nil {
+		return m.Endpoint
+	}
+	return nil
+}
+
+// The request message for [RegistrationService.ListEndpoints][google.cloud.servicedirectory.v1beta1.RegistrationService.ListEndpoints].
+type ListEndpointsRequest struct {
+	// Required. The resource name of the service whose endpoints we'd like to
+	// list.
+	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
+	// Optional. The maximum number of items to return.
+	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+	// Optional. The next_page_token value returned from a previous List request,
+	// if any.
+	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
+	// Optional. The filter to list result by.
+	//
+	// General filter string syntax:
+	// <field> <operator> <value> (<logical connector>)
+	// <field> can be "name", "address", "port" or "metadata.<key>" for map field.
+	// <operator> can be "<, >, <=, >=, !=, =, :". Of which ":" means HAS, and
+	// is roughly the same as "=".
+	// <value> must be the same data type as field.
+	// <logical connector> can be "AND, OR, NOT".
+	//
+	// Examples of valid filters:
+	// * "metadata.owner" returns Endpoints that have a label with the key "owner"
+	//   this is the same as "metadata:owner".
+	// * "metadata.protocol=gRPC" returns Endpoints that have key/value
+	//   "protocol=gRPC".
+	// * "address=192.108.1.105" returns Endpoints that have this address.
+	// * "port>8080" returns Endpoints that have port number larger than 8080.
+	// * "name>projects/my-project/locations/us-east/namespaces/my-namespace/services/my-service/endpoints/endpoint-c"
+	//   returns Endpoints that have name that is alphabetically later than the
+	//   string, so "endpoint-e" will be returned but "endpoint-a" will not be.
+	// * "metadata.owner!=sd AND metadata.foo=bar" returns Endpoints that have
+	//   "owner" in label key but value is not "sd" AND have key/value foo=bar.
+	// * "doesnotexist.foo=bar" returns an empty list. Note that Endpoint doesn't
+	//   have a field called "doesnotexist". Since the filter does not match any
+	//   Endpoints, it returns no results.
+	Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"`
+	// Optional. The order to list result by.
+	OrderBy              string   `protobuf:"bytes,5,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListEndpointsRequest) Reset()         { *m = ListEndpointsRequest{} }
+func (m *ListEndpointsRequest) String() string { return proto.CompactTextString(m) }
+func (*ListEndpointsRequest) ProtoMessage()    {}
+func (*ListEndpointsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{13}
+}
+
+func (m *ListEndpointsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListEndpointsRequest.Unmarshal(m, b)
+}
+func (m *ListEndpointsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListEndpointsRequest.Marshal(b, m, deterministic)
+}
+func (m *ListEndpointsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListEndpointsRequest.Merge(m, src)
+}
+func (m *ListEndpointsRequest) XXX_Size() int {
+	return xxx_messageInfo_ListEndpointsRequest.Size(m)
+}
+func (m *ListEndpointsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListEndpointsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListEndpointsRequest proto.InternalMessageInfo
+
+func (m *ListEndpointsRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *ListEndpointsRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *ListEndpointsRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *ListEndpointsRequest) GetFilter() string {
+	if m != nil {
+		return m.Filter
+	}
+	return ""
+}
+
+func (m *ListEndpointsRequest) GetOrderBy() string {
+	if m != nil {
+		return m.OrderBy
+	}
+	return ""
+}
+
+// The response message for [RegistrationService.ListEndpoints][google.cloud.servicedirectory.v1beta1.RegistrationService.ListEndpoints].
+type ListEndpointsResponse struct {
+	// The list of endpoints.
+	Endpoints []*Endpoint `protobuf:"bytes,1,rep,name=endpoints,proto3" json:"endpoints,omitempty"`
+	// Token to retrieve the next page of results, or empty if there are no
+	// more results in the list.
+	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ListEndpointsResponse) Reset()         { *m = ListEndpointsResponse{} }
+func (m *ListEndpointsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListEndpointsResponse) ProtoMessage()    {}
+func (*ListEndpointsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{14}
+}
+
+func (m *ListEndpointsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListEndpointsResponse.Unmarshal(m, b)
+}
+func (m *ListEndpointsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListEndpointsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListEndpointsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListEndpointsResponse.Merge(m, src)
+}
+func (m *ListEndpointsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListEndpointsResponse.Size(m)
+}
+func (m *ListEndpointsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListEndpointsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListEndpointsResponse proto.InternalMessageInfo
+
+func (m *ListEndpointsResponse) GetEndpoints() []*Endpoint {
+	if m != nil {
+		return m.Endpoints
+	}
+	return nil
+}
+
+func (m *ListEndpointsResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+// The request message for [RegistrationService.GetEndpoint][google.cloud.servicedirectory.v1beta1.RegistrationService.GetEndpoint].
+// This should not be used to lookup endpoints at runtime. Instead, use
+// the `resolve` method.
+type GetEndpointRequest struct {
+	// Required. The name of the endpoint to get.
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetEndpointRequest) Reset()         { *m = GetEndpointRequest{} }
+func (m *GetEndpointRequest) String() string { return proto.CompactTextString(m) }
+func (*GetEndpointRequest) ProtoMessage()    {}
+func (*GetEndpointRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{15}
+}
+
+func (m *GetEndpointRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetEndpointRequest.Unmarshal(m, b)
+}
+func (m *GetEndpointRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetEndpointRequest.Marshal(b, m, deterministic)
+}
+func (m *GetEndpointRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetEndpointRequest.Merge(m, src)
+}
+func (m *GetEndpointRequest) XXX_Size() int {
+	return xxx_messageInfo_GetEndpointRequest.Size(m)
+}
+func (m *GetEndpointRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetEndpointRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetEndpointRequest proto.InternalMessageInfo
+
+func (m *GetEndpointRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// The request message for [RegistrationService.UpdateEndpoint][google.cloud.servicedirectory.v1beta1.RegistrationService.UpdateEndpoint].
+type UpdateEndpointRequest struct {
+	// Required. The updated endpoint.
+	Endpoint *Endpoint `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"`
+	// Required. List of fields to be updated in this request.
+	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *UpdateEndpointRequest) Reset()         { *m = UpdateEndpointRequest{} }
+func (m *UpdateEndpointRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateEndpointRequest) ProtoMessage()    {}
+func (*UpdateEndpointRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{16}
+}
+
+func (m *UpdateEndpointRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateEndpointRequest.Unmarshal(m, b)
+}
+func (m *UpdateEndpointRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateEndpointRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateEndpointRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateEndpointRequest.Merge(m, src)
+}
+func (m *UpdateEndpointRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateEndpointRequest.Size(m)
+}
+func (m *UpdateEndpointRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateEndpointRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateEndpointRequest proto.InternalMessageInfo
+
+func (m *UpdateEndpointRequest) GetEndpoint() *Endpoint {
+	if m != nil {
+		return m.Endpoint
+	}
+	return nil
+}
+
+func (m *UpdateEndpointRequest) GetUpdateMask() *field_mask.FieldMask {
+	if m != nil {
+		return m.UpdateMask
+	}
+	return nil
+}
+
+// The request message for [RegistrationService.DeleteEndpoint][google.cloud.servicedirectory.v1beta1.RegistrationService.DeleteEndpoint].
+type DeleteEndpointRequest struct {
+	// Required. The name of the endpoint to delete.
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeleteEndpointRequest) Reset()         { *m = DeleteEndpointRequest{} }
+func (m *DeleteEndpointRequest) String() string { return proto.CompactTextString(m) }
+func (*DeleteEndpointRequest) ProtoMessage()    {}
+func (*DeleteEndpointRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_df30e8cd406c05e7, []int{17}
+}
+
+func (m *DeleteEndpointRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeleteEndpointRequest.Unmarshal(m, b)
+}
+func (m *DeleteEndpointRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeleteEndpointRequest.Marshal(b, m, deterministic)
+}
+func (m *DeleteEndpointRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteEndpointRequest.Merge(m, src)
+}
+func (m *DeleteEndpointRequest) XXX_Size() int {
+	return xxx_messageInfo_DeleteEndpointRequest.Size(m)
+}
+func (m *DeleteEndpointRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeleteEndpointRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeleteEndpointRequest proto.InternalMessageInfo
+
+func (m *DeleteEndpointRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*CreateNamespaceRequest)(nil), "google.cloud.servicedirectory.v1beta1.CreateNamespaceRequest")
+	proto.RegisterType((*ListNamespacesRequest)(nil), "google.cloud.servicedirectory.v1beta1.ListNamespacesRequest")
+	proto.RegisterType((*ListNamespacesResponse)(nil), "google.cloud.servicedirectory.v1beta1.ListNamespacesResponse")
+	proto.RegisterType((*GetNamespaceRequest)(nil), "google.cloud.servicedirectory.v1beta1.GetNamespaceRequest")
+	proto.RegisterType((*UpdateNamespaceRequest)(nil), "google.cloud.servicedirectory.v1beta1.UpdateNamespaceRequest")
+	proto.RegisterType((*DeleteNamespaceRequest)(nil), "google.cloud.servicedirectory.v1beta1.DeleteNamespaceRequest")
+	proto.RegisterType((*CreateServiceRequest)(nil), "google.cloud.servicedirectory.v1beta1.CreateServiceRequest")
+	proto.RegisterType((*ListServicesRequest)(nil), "google.cloud.servicedirectory.v1beta1.ListServicesRequest")
+	proto.RegisterType((*ListServicesResponse)(nil), "google.cloud.servicedirectory.v1beta1.ListServicesResponse")
+	proto.RegisterType((*GetServiceRequest)(nil), "google.cloud.servicedirectory.v1beta1.GetServiceRequest")
+	proto.RegisterType((*UpdateServiceRequest)(nil), "google.cloud.servicedirectory.v1beta1.UpdateServiceRequest")
+	proto.RegisterType((*DeleteServiceRequest)(nil), "google.cloud.servicedirectory.v1beta1.DeleteServiceRequest")
+	proto.RegisterType((*CreateEndpointRequest)(nil), "google.cloud.servicedirectory.v1beta1.CreateEndpointRequest")
+	proto.RegisterType((*ListEndpointsRequest)(nil), "google.cloud.servicedirectory.v1beta1.ListEndpointsRequest")
+	proto.RegisterType((*ListEndpointsResponse)(nil), "google.cloud.servicedirectory.v1beta1.ListEndpointsResponse")
+	proto.RegisterType((*GetEndpointRequest)(nil), "google.cloud.servicedirectory.v1beta1.GetEndpointRequest")
+	proto.RegisterType((*UpdateEndpointRequest)(nil), "google.cloud.servicedirectory.v1beta1.UpdateEndpointRequest")
+	proto.RegisterType((*DeleteEndpointRequest)(nil), "google.cloud.servicedirectory.v1beta1.DeleteEndpointRequest")
+}
+
+func init() {
+	proto.RegisterFile("google/cloud/servicedirectory/v1beta1/registration_service.proto", fileDescriptor_df30e8cd406c05e7)
+}
+
+var fileDescriptor_df30e8cd406c05e7 = []byte{
+	// 1595 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0xcb, 0x6f, 0x1b, 0x45,
+	0x18, 0xd7, 0xa4, 0xaf, 0xe4, 0x4b, 0x93, 0x88, 0xc9, 0x03, 0x77, 0x0b, 0x6d, 0x58, 0xa0, 0x24,
+	0x26, 0x78, 0x9b, 0x94, 0x4a, 0x90, 0x36, 0x28, 0x9b, 0xa6, 0x8d, 0x52, 0x35, 0x34, 0xd8, 0x2d,
+	0x82, 0x14, 0x64, 0x6d, 0xec, 0x89, 0xb3, 0xc4, 0xf6, 0x2e, 0xbb, 0x9b, 0x94, 0x14, 0x7a, 0xe1,
+	0xc8, 0x81, 0x03, 0xdc, 0x41, 0x5c, 0xe0, 0x50, 0x24, 0x24, 0xf8, 0x07, 0xe0, 0xc0, 0x85, 0x0b,
+	0x12, 0xed, 0xa1, 0xb2, 0x84, 0x54, 0x01, 0x12, 0xe2, 0x71, 0xe2, 0x84, 0x40, 0x48, 0x68, 0xe7,
+	0xb1, 0xaf, 0x6c, 0xc8, 0xd8, 0x71, 0x50, 0x4f, 0x91, 0xe7, 0x9b, 0xf9, 0xed, 0xfc, 0xbe, 0xf9,
+	0x7d, 0x5f, 0x7e, 0xb3, 0x0b, 0xd3, 0x15, 0xcb, 0xaa, 0x54, 0x89, 0x56, 0xaa, 0x5a, 0xeb, 0x65,
+	0xcd, 0x25, 0xce, 0x86, 0x59, 0x22, 0x65, 0xd3, 0x21, 0x25, 0xcf, 0x72, 0x36, 0xb5, 0x8d, 0xf1,
+	0x65, 0xe2, 0x19, 0xe3, 0x9a, 0x43, 0x2a, 0xa6, 0xeb, 0x39, 0x86, 0x67, 0x5a, 0xf5, 0x22, 0x9f,
+	0x95, 0xb3, 0x1d, 0xcb, 0xb3, 0xf0, 0xe3, 0x0c, 0x21, 0x47, 0x11, 0x72, 0x49, 0x84, 0x1c, 0x47,
+	0x50, 0x1e, 0xe2, 0x0f, 0x32, 0x6c, 0x53, 0x33, 0xea, 0x75, 0xcb, 0xa3, 0x58, 0x2e, 0x03, 0x51,
+	0x1e, 0x8c, 0x44, 0x4b, 0x55, 0x93, 0xd4, 0x3d, 0x1e, 0x38, 0x1e, 0x09, 0xac, 0x98, 0xa4, 0x5a,
+	0x2e, 0x2e, 0x93, 0x55, 0x63, 0xc3, 0xb4, 0x1c, 0x3e, 0xe1, 0x48, 0x64, 0x82, 0x43, 0x5c, 0x6b,
+	0xdd, 0x11, 0x3b, 0x53, 0x9e, 0x96, 0xe3, 0x46, 0xea, 0x65, 0xdb, 0x32, 0x83, 0x27, 0x9e, 0x96,
+	0x5b, 0x55, 0x37, 0x6a, 0xc4, 0xb5, 0x8d, 0xe0, 0x61, 0xa7, 0xe4, 0x96, 0xc5, 0x72, 0xa7, 0x1c,
+	0xe3, 0x8b, 0x4c, 0xa3, 0xa6, 0x6d, 0x8c, 0xfb, 0x7f, 0x8a, 0xb6, 0x55, 0x35, 0x4b, 0x9b, 0x3c,
+	0xae, 0xc4, 0xe3, 0xb1, 0xd8, 0x51, 0x1e, 0xa3, 0xbf, 0x96, 0xd7, 0x57, 0x34, 0x52, 0xb3, 0x3d,
+	0x11, 0x1c, 0x4e, 0x06, 0x59, 0xee, 0x6a, 0x86, 0xbb, 0xc6, 0x66, 0xa8, 0x77, 0x11, 0x0c, 0x9d,
+	0x73, 0x88, 0xe1, 0x91, 0xe7, 0x05, 0x93, 0x3c, 0x79, 0x7d, 0x9d, 0xb8, 0x1e, 0xd6, 0xe1, 0xa0,
+	0x6d, 0x38, 0xa4, 0xee, 0x65, 0xd0, 0x30, 0x1a, 0xe9, 0x9a, 0x19, 0xbd, 0xa7, 0x77, 0xfc, 0xa5,
+	0x3f, 0x0a, 0x8f, 0x54, 0xad, 0x12, 0x3f, 0x35, 0x06, 0x6f, 0xd8, 0xa6, 0x9b, 0x2b, 0x59, 0x35,
+	0xed, 0x12, 0x0f, 0xe4, 0xf9, 0x42, 0x7c, 0x02, 0x0e, 0x07, 0x09, 0x2a, 0x9a, 0xe5, 0x4c, 0x07,
+	0x05, 0xda, 0x77, 0x4f, 0xef, 0xc8, 0x77, 0x07, 0x81, 0xf9, 0x32, 0x2e, 0x40, 0x57, 0xf0, 0x33,
+	0xb3, 0x6f, 0x18, 0x8d, 0x74, 0x4f, 0x9c, 0xcc, 0x49, 0x09, 0x2a, 0x17, 0x6c, 0x9b, 0xc1, 0x86,
+	0x38, 0xea, 0xf7, 0x08, 0x06, 0x2f, 0x99, 0xae, 0x17, 0xcc, 0x70, 0xdb, 0xc8, 0x6c, 0x18, 0xba,
+	0x6c, 0xa3, 0x42, 0x8a, 0xae, 0x79, 0x83, 0x50, 0x5a, 0x07, 0xfc, 0xe7, 0xa3, 0x7c, 0xa7, 0x3f,
+	0x5a, 0x30, 0x6f, 0x10, 0xac, 0x02, 0xd0, 0x19, 0x9e, 0xb5, 0x46, 0xea, 0x94, 0x54, 0x17, 0x9b,
+	0x42, 0x17, 0x5e, 0xf1, 0x47, 0xf1, 0x51, 0x38, 0xb8, 0x62, 0x56, 0x3d, 0xe2, 0x64, 0xf6, 0x87,
+	0x71, 0x3e, 0x84, 0x8f, 0x41, 0xa7, 0xe5, 0x94, 0x89, 0x53, 0x5c, 0xde, 0xcc, 0x1c, 0x08, 0xc3,
+	0x87, 0xe8, 0xe0, 0xcc, 0xa6, 0xfa, 0x1e, 0x82, 0xa1, 0x24, 0x3f, 0xd7, 0xb6, 0xea, 0x2e, 0xc1,
+	0x8b, 0x00, 0x41, 0x1e, 0xdc, 0x0c, 0x1a, 0xde, 0xd7, 0x4a, 0x42, 0xf3, 0x11, 0x0c, 0x7c, 0x02,
+	0xfa, 0xea, 0xe4, 0x0d, 0xaf, 0x18, 0xa1, 0x44, 0x0f, 0x33, 0xdf, 0xe3, 0x0f, 0x2f, 0x0a, 0x46,
+	0xea, 0x2b, 0xd0, 0x3f, 0x47, 0xbc, 0x2d, 0x5a, 0x3a, 0x0f, 0xfb, 0x7d, 0x30, 0x9e, 0xef, 0x71,
+	0x9a, 0xef, 0x27, 0x61, 0x74, 0xcb, 0x26, 0x12, 0x69, 0x0f, 0x71, 0xe8, 0x72, 0xf5, 0x33, 0x04,
+	0x43, 0x57, 0xed, 0x72, 0x9a, 0x5a, 0x63, 0x12, 0x42, 0xed, 0x91, 0x10, 0x9e, 0x86, 0xee, 0x75,
+	0xfa, 0x38, 0x5a, 0x32, 0x94, 0x71, 0xf7, 0x84, 0x22, 0x60, 0x45, 0x55, 0xe5, 0x2e, 0xf8, 0x55,
+	0xb5, 0x60, 0xb8, 0x6b, 0x0c, 0x00, 0xd8, 0x1a, 0x7f, 0x40, 0x2d, 0xc2, 0xd0, 0x2c, 0xa9, 0x92,
+	0x94, 0x0d, 0xb7, 0x29, 0x25, 0x77, 0x10, 0x0c, 0xb0, 0x02, 0x2e, 0xb0, 0x95, 0x02, 0x7f, 0x3e,
+	0x21, 0xf2, 0x16, 0x9e, 0x20, 0xc4, 0xae, 0x02, 0xf0, 0x45, 0x89, 0x22, 0xee, 0xe2, 0xc3, 0xf3,
+	0x65, 0xbc, 0x00, 0x87, 0xf8, 0x0f, 0x5e, 0xc0, 0x39, 0xc9, 0xec, 0xf3, 0x6d, 0x33, 0x40, 0x81,
+	0xa1, 0xfe, 0x88, 0xa0, 0xdf, 0x17, 0x37, 0x8f, 0xba, 0x7b, 0xc0, 0xea, 0x3e, 0x28, 0xe1, 0x77,
+	0x10, 0x0c, 0xc4, 0x59, 0xf2, 0x02, 0xbe, 0x08, 0x9d, 0x9c, 0x90, 0x28, 0xdf, 0x26, 0xd3, 0x99,
+	0x0f, 0xd6, 0x4b, 0x97, 0xee, 0x4b, 0xf0, 0xc0, 0x1c, 0xf1, 0x12, 0x2a, 0x3a, 0x17, 0x53, 0xa9,
+	0x46, 0xb3, 0x3d, 0x0a, 0x4f, 0xec, 0x94, 0x6d, 0x81, 0xc2, 0x34, 0xfa, 0x09, 0x82, 0x01, 0x56,
+	0xb6, 0x09, 0xf4, 0x88, 0x68, 0xd0, 0xee, 0x45, 0xd3, 0x86, 0x72, 0xbd, 0x06, 0x03, 0xac, 0x5c,
+	0xf7, 0x22, 0x0d, 0x77, 0x11, 0x0c, 0xb2, 0x52, 0x3d, 0xcf, 0xbd, 0x86, 0x80, 0x9f, 0x4b, 0xa8,
+	0xba, 0xe9, 0x07, 0x08, 0x4d, 0x3f, 0x06, 0xdd, 0xc2, 0xc7, 0x24, 0x4a, 0x15, 0xc4, 0xf8, 0x7c,
+	0x19, 0x2f, 0x42, 0xa7, 0xf8, 0xc5, 0x8b, 0x55, 0x93, 0xcc, 0xbb, 0xd8, 0x38, 0xc3, 0x0c, 0x50,
+	0xd4, 0x1f, 0xb8, 0x90, 0x45, 0xdc, 0x6d, 0x3b, 0xb3, 0xfb, 0xa0, 0x5a, 0xdf, 0xe5, 0x86, 0x22,
+	0x42, 0x92, 0x97, 0xeb, 0x02, 0x74, 0x89, 0x54, 0x88, 0x7a, 0x6d, 0x36, 0xa3, 0xf9, 0x10, 0x41,
+	0xba, 0x62, 0x97, 0x00, 0xcf, 0x11, 0x2f, 0x29, 0xa6, 0xd9, 0x98, 0x56, 0x4f, 0xd2, 0x84, 0x67,
+	0x61, 0x64, 0xa7, 0x84, 0x07, 0x30, 0x4c, 0xac, 0xb7, 0x10, 0x0c, 0xb2, 0x9a, 0x4d, 0xe2, 0x47,
+	0xd5, 0x83, 0xda, 0xa1, 0x9e, 0x36, 0xd4, 0xed, 0xab, 0x30, 0xc8, 0xea, 0x76, 0x4f, 0x92, 0x31,
+	0xf1, 0xed, 0x30, 0xf4, 0xe7, 0x23, 0x77, 0x1f, 0x2e, 0x4e, 0xfc, 0x2b, 0x82, 0xbe, 0x84, 0x7b,
+	0xc6, 0x53, 0x92, 0xc9, 0x48, 0x77, 0xdd, 0x4a, 0xd3, 0xa6, 0x45, 0x5d, 0x69, 0xe8, 0x0f, 0xb3,
+	0x22, 0x19, 0x0b, 0x9c, 0xcb, 0x58, 0xd4, 0x76, 0xbf, 0x7d, 0xfb, 0xa7, 0xf7, 0x3b, 0xa6, 0xd5,
+	0x53, 0xc1, 0xed, 0xe3, 0x4d, 0x36, 0x7d, 0xca, 0x76, 0xac, 0xd7, 0x48, 0xc9, 0x73, 0xb5, 0xac,
+	0x16, 0x38, 0x5f, 0x2d, 0x7b, 0x33, 0xbc, 0xd4, 0xb8, 0x93, 0x11, 0x33, 0x74, 0x1b, 0x41, 0x6f,
+	0xdc, 0x6f, 0xe2, 0xb3, 0x92, 0x9b, 0x4d, 0xb5, 0xe1, 0xca, 0x54, 0x8b, 0xab, 0x59, 0xd1, 0xa9,
+	0xb3, 0x0d, 0x9d, 0x37, 0x07, 0x4a, 0xf0, 0x34, 0x6e, 0x85, 0x20, 0xfe, 0x12, 0xc1, 0xe1, 0xa8,
+	0x63, 0xc5, 0x93, 0x92, 0xbb, 0x4a, 0xb1, 0xb9, 0x2d, 0x1c, 0xde, 0x4c, 0x43, 0xa7, 0x12, 0xdb,
+	0x4a, 0xc1, 0x1f, 0xdd, 0x86, 0x40, 0x64, 0xff, 0x5a, 0xf6, 0x26, 0xfe, 0x1d, 0x41, 0x5f, 0xc2,
+	0x15, 0x4b, 0xab, 0x30, 0xdd, 0x4d, 0xb7, 0x40, 0x64, 0xb5, 0xa1, 0x0f, 0x86, 0xf2, 0x8b, 0x94,
+	0x33, 0x65, 0x76, 0x71, 0x62, 0x2a, 0xce, 0x8c, 0xdd, 0x99, 0xa5, 0x39, 0x46, 0x75, 0xf8, 0x29,
+	0x82, 0xbe, 0x84, 0xa7, 0x96, 0xa6, 0x9b, 0xee, 0xc5, 0x95, 0xa1, 0x2d, 0xbd, 0xe6, 0xbc, 0x7f,
+	0x8b, 0x4e, 0x9c, 0x4e, 0xb6, 0xa5, 0xd3, 0xf9, 0x05, 0x41, 0x4f, 0xcc, 0xa0, 0xe3, 0x33, 0x4d,
+	0x75, 0x88, 0xb8, 0x13, 0x51, 0x9a, 0x74, 0x48, 0xea, 0x5a, 0x43, 0x3f, 0xc2, 0xbb, 0x03, 0x9f,
+	0x3b, 0x16, 0x7a, 0x79, 0xca, 0x6b, 0x5e, 0x7d, 0x4e, 0xb2, 0x70, 0xe2, 0xcc, 0xc4, 0x4b, 0x0c,
+	0x77, 0x32, 0x30, 0x60, 0x77, 0x11, 0x1c, 0x8e, 0xfa, 0x59, 0xe9, 0x62, 0x4a, 0xb1, 0xfa, 0xca,
+	0x99, 0x96, 0xd6, 0xf2, 0xe6, 0x70, 0x39, 0xde, 0x1c, 0xa6, 0xf1, 0x2e, 0x39, 0xe2, 0xaf, 0x11,
+	0x40, 0x68, 0x8f, 0xf1, 0x33, 0xf2, 0x5d, 0x62, 0x97, 0x07, 0xb8, 0x10, 0xd5, 0x60, 0x8c, 0x87,
+	0xac, 0x06, 0x03, 0x12, 0xbe, 0x1c, 0x7f, 0x43, 0xd0, 0x13, 0xf3, 0xe2, 0xd2, 0x72, 0x4c, 0x73,
+	0xf0, 0x4d, 0xb3, 0xa9, 0x35, 0xf4, 0x7e, 0xa1, 0xc3, 0x64, 0x93, 0x78, 0x61, 0xe2, 0x42, 0x48,
+	0x4e, 0xbc, 0x21, 0x6b, 0x85, 0x64, 0x28, 0xc8, 0x2f, 0x10, 0xf4, 0xc4, 0x0c, 0xbd, 0x34, 0xdb,
+	0xb4, 0x6b, 0xc0, 0xb6, 0x7d, 0x22, 0x7e, 0x46, 0xd9, 0xdd, 0x9e, 0xd1, 0xdf, 0x08, 0x7a, 0xe3,
+	0x17, 0x05, 0xe9, 0xff, 0xb4, 0xa9, 0xf7, 0x0b, 0xa5, 0x59, 0x83, 0xa6, 0xde, 0x68, 0xe8, 0x47,
+	0x79, 0xd7, 0x10, 0x2e, 0x6d, 0x2c, 0x72, 0xb1, 0xa0, 0x3c, 0x5f, 0x54, 0x2f, 0xb6, 0x52, 0x53,
+	0x51, 0xa6, 0xc1, 0x4b, 0x57, 0x77, 0x32, 0x74, 0x83, 0x3f, 0x23, 0xe8, 0x89, 0xd9, 0x6c, 0xdc,
+	0x4c, 0x27, 0x48, 0xde, 0x40, 0x94, 0xb3, 0xad, 0x2d, 0xe6, 0x7d, 0xe4, 0x5a, 0xbc, 0x8f, 0x5c,
+	0xc2, 0x6d, 0xe4, 0x8c, 0xef, 0x20, 0xe8, 0x8e, 0x18, 0x78, 0xfc, 0xac, 0x7c, 0x53, 0xd9, 0xf5,
+	0x09, 0xbf, 0x1c, 0x95, 0x6c, 0x8c, 0x56, 0x0b, 0x92, 0x0d, 0x39, 0xf9, 0xf2, 0xfd, 0x07, 0x41,
+	0x6f, 0xfc, 0xea, 0x20, 0x2d, 0xdf, 0xd4, 0x1b, 0x47, 0xf3, 0xe4, 0xde, 0x6a, 0xe8, 0x03, 0x81,
+	0x6e, 0x93, 0x6d, 0xa6, 0x38, 0x51, 0x08, 0xc9, 0x06, 0x6f, 0xfd, 0x77, 0xcb, 0x3a, 0x22, 0xe0,
+	0xaf, 0x10, 0xf4, 0xc6, 0x6f, 0x23, 0xd2, 0xfc, 0x53, 0x2f, 0x31, 0xdb, 0xb6, 0x9d, 0xf8, 0x19,
+	0x66, 0xdb, 0x79, 0x86, 0x7f, 0x30, 0x5b, 0x3c, 0x6f, 0xd4, 0x16, 0xe9, 0xd7, 0x06, 0xac, 0x8a,
+	0x3d, 0x98, 0x46, 0x2d, 0xb7, 0x41, 0x35, 0x18, 0x04, 0xc5, 0x3e, 0x07, 0x13, 0x73, 0x58, 0x54,
+	0xfd, 0x18, 0xd1, 0x0d, 0x7e, 0x88, 0xd4, 0xd9, 0x70, 0x87, 0xe2, 0x23, 0x8d, 0x9c, 0xfd, 0xab,
+	0x44, 0x9e, 0x36, 0x89, 0xb2, 0x4b, 0x57, 0xd4, 0xcb, 0xad, 0x41, 0xc5, 0xfe, 0x4d, 0x24, 0x50,
+	0x29, 0xe9, 0xc2, 0x7f, 0x91, 0x2e, 0xfc, 0xaf, 0xa4, 0xdd, 0x3d, 0x21, 0x9d, 0x40, 0xc5, 0x1f,
+	0x74, 0x00, 0xbe, 0x42, 0x5c, 0x3a, 0x48, 0x9c, 0x9a, 0xe9, 0xba, 0x3e, 0x02, 0x1e, 0x49, 0xd0,
+	0xda, 0x3a, 0x45, 0x24, 0x60, 0x54, 0x62, 0x26, 0xef, 0xa6, 0x9f, 0xb3, 0xa4, 0xdc, 0x42, 0xd1,
+	0x7f, 0x1d, 0xcd, 0x25, 0xc5, 0xdb, 0x82, 0xee, 0xa7, 0x66, 0x49, 0xbd, 0xda, 0x86, 0xd4, 0xa4,
+	0x62, 0x2b, 0x85, 0x6f, 0xf4, 0xe3, 0x3b, 0xbc, 0x2f, 0xf8, 0x4e, 0xcf, 0xad, 0x7a, 0x9e, 0xed,
+	0x4e, 0x6a, 0xda, 0xf5, 0xeb, 0xd7, 0x93, 0x2f, 0x13, 0x8c, 0x75, 0x6f, 0x95, 0x7d, 0x10, 0x7c,
+	0xca, 0xae, 0x1a, 0xde, 0x8a, 0xe5, 0xd4, 0x66, 0x3e, 0x42, 0x30, 0x5a, 0xb2, 0x6a, 0x72, 0x6d,
+	0x61, 0x26, 0x93, 0xf2, 0xf2, 0x61, 0xd1, 0xef, 0x05, 0x8b, 0x68, 0xe9, 0x2a, 0x87, 0xa8, 0x58,
+	0x55, 0xa3, 0x5e, 0xc9, 0x59, 0x4e, 0x45, 0xab, 0x90, 0x3a, 0xed, 0x14, 0x5a, 0xb8, 0x91, 0x1d,
+	0x3e, 0x48, 0x9e, 0x49, 0x06, 0xfe, 0x44, 0x68, 0xf9, 0x20, 0x05, 0x39, 0xf5, 0x6f, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0xb4, 0x44, 0x53, 0xca, 0x1d, 0x1e, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// RegistrationServiceClient is the client API for RegistrationService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type RegistrationServiceClient interface {
+	// Creates a namespace, and returns the new Namespace.
+	CreateNamespace(ctx context.Context, in *CreateNamespaceRequest, opts ...grpc.CallOption) (*Namespace, error)
+	// Lists all namespaces.
+	ListNamespaces(ctx context.Context, in *ListNamespacesRequest, opts ...grpc.CallOption) (*ListNamespacesResponse, error)
+	// Gets a namespace.
+	GetNamespace(ctx context.Context, in *GetNamespaceRequest, opts ...grpc.CallOption) (*Namespace, error)
+	// Updates a namespace.
+	UpdateNamespace(ctx context.Context, in *UpdateNamespaceRequest, opts ...grpc.CallOption) (*Namespace, error)
+	// Deletes a namespace. This also deletes all services and endpoints in
+	// the namespace.
+	DeleteNamespace(ctx context.Context, in *DeleteNamespaceRequest, opts ...grpc.CallOption) (*empty.Empty, error)
+	// Creates a service, and returns the new Service.
+	CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error)
+	// Lists all services belonging to a namespace.
+	ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error)
+	// Gets a service.
+	GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error)
+	// Updates a service.
+	UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error)
+	// Deletes a service. This also deletes all endpoints associated with
+	// the service.
+	DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*empty.Empty, error)
+	// Creates a endpoint, and returns the new Endpoint.
+	CreateEndpoint(ctx context.Context, in *CreateEndpointRequest, opts ...grpc.CallOption) (*Endpoint, error)
+	// Lists all endpoints.
+	ListEndpoints(ctx context.Context, in *ListEndpointsRequest, opts ...grpc.CallOption) (*ListEndpointsResponse, error)
+	// Gets a endpoint.
+	GetEndpoint(ctx context.Context, in *GetEndpointRequest, opts ...grpc.CallOption) (*Endpoint, error)
+	// Updates a endpoint.
+	UpdateEndpoint(ctx context.Context, in *UpdateEndpointRequest, opts ...grpc.CallOption) (*Endpoint, error)
+	// Deletes a endpoint.
+	DeleteEndpoint(ctx context.Context, in *DeleteEndpointRequest, opts ...grpc.CallOption) (*empty.Empty, error)
+	// Gets the IAM Policy for a resource (namespace or service only).
+	GetIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error)
+	// Sets the IAM Policy for a resource (namespace or service only).
+	SetIamPolicy(ctx context.Context, in *v1.SetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error)
+	// Tests IAM permissions for a resource (namespace or service only).
+	TestIamPermissions(ctx context.Context, in *v1.TestIamPermissionsRequest, opts ...grpc.CallOption) (*v1.TestIamPermissionsResponse, error)
+}
+
+type registrationServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewRegistrationServiceClient(cc grpc.ClientConnInterface) RegistrationServiceClient {
+	return &registrationServiceClient{cc}
+}
+
+func (c *registrationServiceClient) CreateNamespace(ctx context.Context, in *CreateNamespaceRequest, opts ...grpc.CallOption) (*Namespace, error) {
+	out := new(Namespace)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/CreateNamespace", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) ListNamespaces(ctx context.Context, in *ListNamespacesRequest, opts ...grpc.CallOption) (*ListNamespacesResponse, error) {
+	out := new(ListNamespacesResponse)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/ListNamespaces", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) GetNamespace(ctx context.Context, in *GetNamespaceRequest, opts ...grpc.CallOption) (*Namespace, error) {
+	out := new(Namespace)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/GetNamespace", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) UpdateNamespace(ctx context.Context, in *UpdateNamespaceRequest, opts ...grpc.CallOption) (*Namespace, error) {
+	out := new(Namespace)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/UpdateNamespace", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) DeleteNamespace(ctx context.Context, in *DeleteNamespaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
+	out := new(empty.Empty)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/DeleteNamespace", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) {
+	out := new(Service)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/CreateService", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) {
+	out := new(ListServicesResponse)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/ListServices", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) {
+	out := new(Service)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/GetService", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) {
+	out := new(Service)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/UpdateService", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
+	out := new(empty.Empty)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/DeleteService", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) CreateEndpoint(ctx context.Context, in *CreateEndpointRequest, opts ...grpc.CallOption) (*Endpoint, error) {
+	out := new(Endpoint)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/CreateEndpoint", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) ListEndpoints(ctx context.Context, in *ListEndpointsRequest, opts ...grpc.CallOption) (*ListEndpointsResponse, error) {
+	out := new(ListEndpointsResponse)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/ListEndpoints", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) GetEndpoint(ctx context.Context, in *GetEndpointRequest, opts ...grpc.CallOption) (*Endpoint, error) {
+	out := new(Endpoint)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/GetEndpoint", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) UpdateEndpoint(ctx context.Context, in *UpdateEndpointRequest, opts ...grpc.CallOption) (*Endpoint, error) {
+	out := new(Endpoint)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/UpdateEndpoint", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) DeleteEndpoint(ctx context.Context, in *DeleteEndpointRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
+	out := new(empty.Empty)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/DeleteEndpoint", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) GetIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) {
+	out := new(v1.Policy)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/GetIamPolicy", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) SetIamPolicy(ctx context.Context, in *v1.SetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) {
+	out := new(v1.Policy)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/SetIamPolicy", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *registrationServiceClient) TestIamPermissions(ctx context.Context, in *v1.TestIamPermissionsRequest, opts ...grpc.CallOption) (*v1.TestIamPermissionsResponse, error) {
+	out := new(v1.TestIamPermissionsResponse)
+	err := c.cc.Invoke(ctx, "/google.cloud.servicedirectory.v1beta1.RegistrationService/TestIamPermissions", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// RegistrationServiceServer is the server API for RegistrationService service.
+type RegistrationServiceServer interface {
+	// Creates a namespace, and returns the new Namespace.
+	CreateNamespace(context.Context, *CreateNamespaceRequest) (*Namespace, error)
+	// Lists all namespaces.
+	ListNamespaces(context.Context, *ListNamespacesRequest) (*ListNamespacesResponse, error)
+	// Gets a namespace.
+	GetNamespace(context.Context, *GetNamespaceRequest) (*Namespace, error)
+	// Updates a namespace.
+	UpdateNamespace(context.Context, *UpdateNamespaceRequest) (*Namespace, error)
+	// Deletes a namespace. This also deletes all services and endpoints in
+	// the namespace.
+	DeleteNamespace(context.Context, *DeleteNamespaceRequest) (*empty.Empty, error)
+	// Creates a service, and returns the new Service.
+	CreateService(context.Context, *CreateServiceRequest) (*Service, error)
+	// Lists all services belonging to a namespace.
+	ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error)
+	// Gets a service.
+	GetService(context.Context, *GetServiceRequest) (*Service, error)
+	// Updates a service.
+	UpdateService(context.Context, *UpdateServiceRequest) (*Service, error)
+	// Deletes a service. This also deletes all endpoints associated with
+	// the service.
+	DeleteService(context.Context, *DeleteServiceRequest) (*empty.Empty, error)
+	// Creates a endpoint, and returns the new Endpoint.
+	CreateEndpoint(context.Context, *CreateEndpointRequest) (*Endpoint, error)
+	// Lists all endpoints.
+	ListEndpoints(context.Context, *ListEndpointsRequest) (*ListEndpointsResponse, error)
+	// Gets a endpoint.
+	GetEndpoint(context.Context, *GetEndpointRequest) (*Endpoint, error)
+	// Updates a endpoint.
+	UpdateEndpoint(context.Context, *UpdateEndpointRequest) (*Endpoint, error)
+	// Deletes a endpoint.
+	DeleteEndpoint(context.Context, *DeleteEndpointRequest) (*empty.Empty, error)
+	// Gets the IAM Policy for a resource (namespace or service only).
+	GetIamPolicy(context.Context, *v1.GetIamPolicyRequest) (*v1.Policy, error)
+	// Sets the IAM Policy for a resource (namespace or service only).
+	SetIamPolicy(context.Context, *v1.SetIamPolicyRequest) (*v1.Policy, error)
+	// Tests IAM permissions for a resource (namespace or service only).
+	TestIamPermissions(context.Context, *v1.TestIamPermissionsRequest) (*v1.TestIamPermissionsResponse, error)
+}
+
+// UnimplementedRegistrationServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedRegistrationServiceServer struct {
+}
+
+func (*UnimplementedRegistrationServiceServer) CreateNamespace(ctx context.Context, req *CreateNamespaceRequest) (*Namespace, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreateNamespace not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) ListNamespaces(ctx context.Context, req *ListNamespacesRequest) (*ListNamespacesResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListNamespaces not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) GetNamespace(ctx context.Context, req *GetNamespaceRequest) (*Namespace, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetNamespace not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) UpdateNamespace(ctx context.Context, req *UpdateNamespaceRequest) (*Namespace, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateNamespace not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) DeleteNamespace(ctx context.Context, req *DeleteNamespaceRequest) (*empty.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteNamespace not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) CreateService(ctx context.Context, req *CreateServiceRequest) (*Service, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreateService not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) ListServices(ctx context.Context, req *ListServicesRequest) (*ListServicesResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListServices not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) GetService(ctx context.Context, req *GetServiceRequest) (*Service, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetService not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) UpdateService(ctx context.Context, req *UpdateServiceRequest) (*Service, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateService not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) DeleteService(ctx context.Context, req *DeleteServiceRequest) (*empty.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteService not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) CreateEndpoint(ctx context.Context, req *CreateEndpointRequest) (*Endpoint, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreateEndpoint not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) ListEndpoints(ctx context.Context, req *ListEndpointsRequest) (*ListEndpointsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListEndpoints not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) GetEndpoint(ctx context.Context, req *GetEndpointRequest) (*Endpoint, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetEndpoint not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) UpdateEndpoint(ctx context.Context, req *UpdateEndpointRequest) (*Endpoint, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateEndpoint not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) DeleteEndpoint(ctx context.Context, req *DeleteEndpointRequest) (*empty.Empty, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteEndpoint not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) GetIamPolicy(ctx context.Context, req *v1.GetIamPolicyRequest) (*v1.Policy, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) SetIamPolicy(ctx context.Context, req *v1.SetIamPolicyRequest) (*v1.Policy, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented")
+}
+func (*UnimplementedRegistrationServiceServer) TestIamPermissions(ctx context.Context, req *v1.TestIamPermissionsRequest) (*v1.TestIamPermissionsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented")
+}
+
+func RegisterRegistrationServiceServer(s *grpc.Server, srv RegistrationServiceServer) {
+	s.RegisterService(&_RegistrationService_serviceDesc, srv)
+}
+
+func _RegistrationService_CreateNamespace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateNamespaceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).CreateNamespace(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/CreateNamespace",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).CreateNamespace(ctx, req.(*CreateNamespaceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_ListNamespaces_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListNamespacesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).ListNamespaces(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/ListNamespaces",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).ListNamespaces(ctx, req.(*ListNamespacesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_GetNamespace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetNamespaceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).GetNamespace(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/GetNamespace",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).GetNamespace(ctx, req.(*GetNamespaceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_UpdateNamespace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UpdateNamespaceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).UpdateNamespace(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/UpdateNamespace",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).UpdateNamespace(ctx, req.(*UpdateNamespaceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_DeleteNamespace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteNamespaceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).DeleteNamespace(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/DeleteNamespace",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).DeleteNamespace(ctx, req.(*DeleteNamespaceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_CreateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateServiceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).CreateService(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/CreateService",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).CreateService(ctx, req.(*CreateServiceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_ListServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListServicesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).ListServices(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/ListServices",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).ListServices(ctx, req.(*ListServicesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_GetService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetServiceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).GetService(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/GetService",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).GetService(ctx, req.(*GetServiceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_UpdateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UpdateServiceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).UpdateService(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/UpdateService",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).UpdateService(ctx, req.(*UpdateServiceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_DeleteService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteServiceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).DeleteService(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/DeleteService",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).DeleteService(ctx, req.(*DeleteServiceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_CreateEndpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateEndpointRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).CreateEndpoint(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/CreateEndpoint",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).CreateEndpoint(ctx, req.(*CreateEndpointRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_ListEndpoints_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListEndpointsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).ListEndpoints(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/ListEndpoints",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).ListEndpoints(ctx, req.(*ListEndpointsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_GetEndpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetEndpointRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).GetEndpoint(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/GetEndpoint",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).GetEndpoint(ctx, req.(*GetEndpointRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_UpdateEndpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UpdateEndpointRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).UpdateEndpoint(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/UpdateEndpoint",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).UpdateEndpoint(ctx, req.(*UpdateEndpointRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_DeleteEndpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteEndpointRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).DeleteEndpoint(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/DeleteEndpoint",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).DeleteEndpoint(ctx, req.(*DeleteEndpointRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.GetIamPolicyRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).GetIamPolicy(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/GetIamPolicy",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).GetIamPolicy(ctx, req.(*v1.GetIamPolicyRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.SetIamPolicyRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).SetIamPolicy(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/SetIamPolicy",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).SetIamPolicy(ctx, req.(*v1.SetIamPolicyRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RegistrationService_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.TestIamPermissionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServiceServer).TestIamPermissions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.servicedirectory.v1beta1.RegistrationService/TestIamPermissions",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServiceServer).TestIamPermissions(ctx, req.(*v1.TestIamPermissionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _RegistrationService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.cloud.servicedirectory.v1beta1.RegistrationService",
+	HandlerType: (*RegistrationServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "CreateNamespace",
+			Handler:    _RegistrationService_CreateNamespace_Handler,
+		},
+		{
+			MethodName: "ListNamespaces",
+			Handler:    _RegistrationService_ListNamespaces_Handler,
+		},
+		{
+			MethodName: "GetNamespace",
+			Handler:    _RegistrationService_GetNamespace_Handler,
+		},
+		{
+			MethodName: "UpdateNamespace",
+			Handler:    _RegistrationService_UpdateNamespace_Handler,
+		},
+		{
+			MethodName: "DeleteNamespace",
+			Handler:    _RegistrationService_DeleteNamespace_Handler,
+		},
+		{
+			MethodName: "CreateService",
+			Handler:    _RegistrationService_CreateService_Handler,
+		},
+		{
+			MethodName: "ListServices",
+			Handler:    _RegistrationService_ListServices_Handler,
+		},
+		{
+			MethodName: "GetService",
+			Handler:    _RegistrationService_GetService_Handler,
+		},
+		{
+			MethodName: "UpdateService",
+			Handler:    _RegistrationService_UpdateService_Handler,
+		},
+		{
+			MethodName: "DeleteService",
+			Handler:    _RegistrationService_DeleteService_Handler,
+		},
+		{
+			MethodName: "CreateEndpoint",
+			Handler:    _RegistrationService_CreateEndpoint_Handler,
+		},
+		{
+			MethodName: "ListEndpoints",
+			Handler:    _RegistrationService_ListEndpoints_Handler,
+		},
+		{
+			MethodName: "GetEndpoint",
+			Handler:    _RegistrationService_GetEndpoint_Handler,
+		},
+		{
+			MethodName: "UpdateEndpoint",
+			Handler:    _RegistrationService_UpdateEndpoint_Handler,
+		},
+		{
+			MethodName: "DeleteEndpoint",
+			Handler:    _RegistrationService_DeleteEndpoint_Handler,
+		},
+		{
+			MethodName: "GetIamPolicy",
+			Handler:    _RegistrationService_GetIamPolicy_Handler,
+		},
+		{
+			MethodName: "SetIamPolicy",
+			Handler:    _RegistrationService_SetIamPolicy_Handler,
+		},
+		{
+			MethodName: "TestIamPermissions",
+			Handler:    _RegistrationService_TestIamPermissions_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/cloud/servicedirectory/v1beta1/registration_service.proto",
+}
diff --git a/googleapis/cloud/servicedirectory/v1beta1/service.pb.go b/googleapis/cloud/servicedirectory/v1beta1/service.pb.go
new file mode 100644
index 0000000..bcd5a93
--- /dev/null
+++ b/googleapis/cloud/servicedirectory/v1beta1/service.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/cloud/servicedirectory/v1beta1/service.proto
+
+package servicedirectory
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// An individual service. A service contains a name and optional metadata.
+// A service must exist before
+// [endpoints][google.cloud.servicedirectory.v1beta1.Endpoint] can be
+// added to it.
+type Service struct {
+	// Immutable. The resource name for the service in the format
+	// 'projects/*/locations/*/namespaces/*/services/*'.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Optional. Metadata for the service. This data can be consumed by service
+	// clients.  The entire metadata dictionary may contain up to 2000 characters,
+	// spread across all key-value pairs. Metadata that goes beyond any these
+	// limits will be rejected.
+	Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	// Output only. Endpoints associated with this service. Returned on LookupService.Resolve.
+	// Control plane clients should use RegistrationService.ListEndpoints.
+	Endpoints            []*Endpoint `protobuf:"bytes,3,rep,name=endpoints,proto3" json:"endpoints,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *Service) Reset()         { *m = Service{} }
+func (m *Service) String() string { return proto.CompactTextString(m) }
+func (*Service) ProtoMessage()    {}
+func (*Service) Descriptor() ([]byte, []int) {
+	return fileDescriptor_2464dc41fdae2e63, []int{0}
+}
+
+func (m *Service) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Service.Unmarshal(m, b)
+}
+func (m *Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Service.Marshal(b, m, deterministic)
+}
+func (m *Service) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Service.Merge(m, src)
+}
+func (m *Service) XXX_Size() int {
+	return xxx_messageInfo_Service.Size(m)
+}
+func (m *Service) XXX_DiscardUnknown() {
+	xxx_messageInfo_Service.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Service proto.InternalMessageInfo
+
+func (m *Service) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Service) GetMetadata() map[string]string {
+	if m != nil {
+		return m.Metadata
+	}
+	return nil
+}
+
+func (m *Service) GetEndpoints() []*Endpoint {
+	if m != nil {
+		return m.Endpoints
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Service)(nil), "google.cloud.servicedirectory.v1beta1.Service")
+	proto.RegisterMapType((map[string]string)(nil), "google.cloud.servicedirectory.v1beta1.Service.MetadataEntry")
+}
+
+func init() {
+	proto.RegisterFile("google/cloud/servicedirectory/v1beta1/service.proto", fileDescriptor_2464dc41fdae2e63)
+}
+
+var fileDescriptor_2464dc41fdae2e63 = []byte{
+	// 395 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcf, 0x8b, 0xd4, 0x30,
+	0x14, 0xc7, 0xc9, 0xd4, 0x55, 0x37, 0x2a, 0x48, 0x11, 0xac, 0x45, 0x70, 0x11, 0xc4, 0xf5, 0x92,
+	0xb0, 0xae, 0x07, 0xd9, 0xf5, 0xb2, 0x03, 0x7b, 0x14, 0xc6, 0x8a, 0x17, 0x41, 0x24, 0x93, 0x3e,
+	0x6b, 0xb4, 0xcd, 0x2b, 0x49, 0xa6, 0x30, 0xd4, 0xe2, 0x1f, 0x21, 0xfe, 0x7f, 0x9e, 0xfd, 0x0b,
+	0x3c, 0x4a, 0x9b, 0x74, 0x66, 0x1c, 0x0f, 0xdb, 0xdb, 0xb7, 0xef, 0xf5, 0xfb, 0x79, 0xbf, 0x42,
+	0x4f, 0x0b, 0xc4, 0xa2, 0x04, 0x2e, 0x4b, 0x5c, 0xe5, 0xdc, 0x82, 0x69, 0x94, 0x84, 0x5c, 0x19,
+	0x90, 0x0e, 0xcd, 0x9a, 0x37, 0x27, 0x4b, 0x70, 0xe2, 0x64, 0x4c, 0xb0, 0xda, 0xa0, 0xc3, 0xf8,
+	0x89, 0x37, 0xb1, 0xc1, 0xc4, 0xf6, 0x4d, 0x2c, 0x98, 0xd2, 0x47, 0x81, 0x2d, 0x6a, 0xc5, 0x3f,
+	0x29, 0x28, 0xf3, 0x8f, 0x4b, 0xf8, 0x2c, 0x1a, 0x85, 0xc6, 0x73, 0xd2, 0x07, 0x3b, 0x3f, 0x18,
+	0xb0, 0xb8, 0x32, 0x63, 0x89, 0xf4, 0xc5, 0xb4, 0xbe, 0x40, 0xe7, 0x35, 0x2a, 0xed, 0x82, 0xeb,
+	0xe1, 0x0e, 0x50, 0x68, 0x8d, 0x4e, 0x38, 0x85, 0xda, 0xfa, 0xec, 0xe3, 0x1f, 0x11, 0xbd, 0xf1,
+	0xd6, 0x93, 0xe2, 0xfb, 0xf4, 0x9a, 0x16, 0x15, 0x24, 0xe4, 0x88, 0x1c, 0x1f, 0xce, 0xa3, 0x5f,
+	0x17, 0x07, 0xd9, 0x10, 0x88, 0x3f, 0xd0, 0x9b, 0x15, 0x38, 0x91, 0x0b, 0x27, 0x92, 0xd9, 0x51,
+	0x74, 0x7c, 0xeb, 0xf9, 0x2b, 0x36, 0x69, 0x5c, 0x16, 0xd0, 0xec, 0x75, 0xb0, 0x5f, 0x6a, 0x67,
+	0xd6, 0x3d, 0x9a, 0x64, 0x1b, 0x64, 0x9c, 0xd1, 0xc3, 0xb1, 0x67, 0x9b, 0x44, 0x03, 0x9f, 0x4f,
+	0xe4, 0x5f, 0x06, 0x5f, 0x8f, 0x8c, 0xb2, 0x2d, 0x26, 0x3d, 0xa7, 0x77, 0xfe, 0xa9, 0x19, 0xdf,
+	0xa5, 0xd1, 0x57, 0x58, 0xfb, 0xd9, 0xb2, 0x5e, 0xc6, 0xf7, 0xe8, 0x41, 0x23, 0xca, 0x15, 0x24,
+	0xb3, 0x21, 0xe6, 0x3f, 0xce, 0x66, 0x2f, 0xc9, 0xd9, 0xf7, 0xdf, 0x17, 0xdf, 0xe8, 0xd3, 0xff,
+	0x8a, 0xfa, 0x96, 0x44, 0xad, 0x2c, 0x93, 0x58, 0xf1, 0x71, 0x6d, 0x6f, 0x6a, 0x83, 0x5f, 0x40,
+	0x3a, 0xcb, 0xdb, 0xa0, 0x3a, 0x5e, 0xa2, 0xf4, 0x6b, 0xe6, 0xed, 0x28, 0x3b, 0xde, 0xef, 0xd2,
+	0xd6, 0x42, 0x82, 0xe5, 0xed, 0x46, 0x77, 0xe3, 0x21, 0x2d, 0x6f, 0x83, 0xea, 0xe6, 0x3f, 0x09,
+	0x7d, 0x26, 0xb1, 0x9a, 0xb6, 0x84, 0xf9, 0xed, 0xd0, 0xc9, 0xa2, 0xbf, 0xe8, 0x82, 0xbc, 0x7f,
+	0x17, 0x6c, 0x05, 0x96, 0x42, 0x17, 0x0c, 0x4d, 0xc1, 0x0b, 0xd0, 0xc3, 0xbd, 0xf9, 0x76, 0x86,
+	0x2b, 0x9e, 0xd1, 0xf9, 0x7e, 0xe2, 0x0f, 0x21, 0xcb, 0xeb, 0x03, 0xe4, 0xf4, 0x6f, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0xe5, 0xbb, 0x8d, 0x0d, 0x22, 0x03, 0x00, 0x00,
+}
